O sea, ¿que variando la frecuencia del "keyclick" ha ido obteniendo las diferentes notas?
Si es así, menudo faenón. Ahora ya me queda claro y puedo valorarlo como toca.
Esa forma está de tocar notas puras y claras como el cristal está en un snippet de este foro.
Finalmente decidí hacerlo con samples, parecido a la forma de Edu. Quería un sonido ... no muy simple. Hago una copia de los valores del puerto $aa (y lo roto para utilizarlo después) para modificar sólo el bit 7:
in a,($aa)
and $ef
out ($aa),a
nop
nop
rla
ld ($c000),a
Después desfragmento los ocho bits del byte a tocar (los 1s y 0s a enviar están empaquetados en grupos de 8; byte) y lo envío cada 159/161 t-states. Normalmente hago una pausa y envío el bit. Pero a veces, dentro de esos 159/161 t-states tengo que hacer algo más. Por ejemplo, qué tecla está pulsada? Si es la tecla que pulsé al comienzo, para tocar el sample, haz un loop. Si no sal de la rutina y no toques más el sample. Obviamente, no puedo chequear las 24 teclas que corresponden a las dos octavas en tan sólo 159/161 t-states, así que utilizo código síncrono automodificable. Leo la tecla pulsada, actualizo variables para posible loop, sample a tocar, etc ... y parcheo la rutina síncrona para que lea si aún estoy pulsando esa tecla (fila en D y columna en variable parcheada) y siga tocando el sample a modo de loop (hay varios NOPs cuya función es simplemente de pausa):
nop ;(5)
nop ;(5)
in a,($aa) ;(12)
and $f0 ;(8)
or d ;(5) qué fila
out ($aa),a ;(12)
nop ;(5)
nop ;(5)
nop ;(5)
in a,($a9) ;(12)
nop ;(5)
nop ;(5)
key_patch_read:
db $cb,$00 ;bit X,a ;(9) parche para tecla pulsada (columna)
jp nz,sampl_lp_xt ;(10)
nop ;(5)
nop ;(5)
ld a,e ;(5)
rlca ;(5)
ld e,a ;(5)
ld a,($c000) ;(14) copia del puerto ($aa) rotado un bit a izquierda
rra ;(5)
out ($AA),a ;(12) - 159 t-states
(key_patch_read) será siempre $CB, que es la instrucción BIT X,a
(key_patch_read+1) puede tener 8 valores, claro está, correspondiente a los 8 diferentes bits de A a leer:
0 ($47),1 ($4f),2 ($57),3 ($5f),4 ($67),5 ($6f),6 ($77),7 ($7f). Los valores hexadecimales serían los posibles valores de la variable (key_patch_read+1)