PARTE 3: TAL COMO UN RELOJ

El Atari tiene muy poca similitud con los monstruos análogos en los que normalmente pensamos cuando hablamos de generación de sonido electrónico. En lo que respecta al sonido, Atari hizo lo que se podría esperar que hicieran un grupo de ingenieros informáticos: lo hicieron digitalmente.


¿Dividir Por Quién? Si pensamos en el sonido como una serie de pulsos provenientes del altavoz del televisor, la frecuencia o tono de ese sonido dependerá de qué tan rápido lleguen esos pulsos: la frecuencia de su aparición. Por esta razón, medimos el tono en términos de Hercios (abreviado como Hz). Un Hercio equivale a un pulso cada segundo. El «pop-pop-pop» de 1 Hz es un sonido de muy baja frecuencia y normalmente tratamos con tonos mucho más altos. La media, por ejemplo (en BASIC, sound 0,144,10,4), es 440 Hz. Cuando los pulsos llegan tan rápido, ya no los escuchamos individualmente, sino mezclados en una «nota» que podemos tararear. Para trabajar con frecuencias más altas, a menudo se utilizan los términos Kilohercios (1.000 pulsos por segundo) y Megahercios (1 millón de pulsos por segundo). Kilohercios y Megahercios se abrevian como kHz y MHz, respectivamente.


Para controlar la frecuencia de un sonido, se necesita un contador o reloj para cronometrar estos pulsos. Cada uno de los cuatro canales del Atari se puede vincular a una de tres velocidades de reloj diferentes: 1,79 MHz, 64 kHz y 15 kHz. Estos relojes maestros se utilizan para cronometrar los pulsos al altavoz del televisor y, al hacerlo, controlan el rango de frecuencias que se pueden obtener de ese canal.


Un generador de sonido con tres tonos diferentes para elegir no supone un gran avance para la humanidad. Evidentemente, se necesita algo más para extraer una mayor riqueza de frecuencias de estos tres relojes maestros. Este algo extra se llama circuito «dividir por N» y, aunque su concepto es simple, es un truco realmente genial. Este circuito espera hasta que hayan entrado N pulsos y luego emite un solo pulso. Si, por ejemplo, N es 7, entonces el circuito generará un pulso por cada siete pulsos que reciba.


Cuando el circuito dividir por N se coloca en línea con uno de los relojes seleccionables, el circuito enmascarará algunos de los pulsos provenientes del puerto maestro. Cambiar el tamaño de N cambiará el número de pulsos que se eliminan y, por tanto, cambiará la salida de tono del altavoz del televisor. ¡Voilá! Una fuente de tono.


A partir de esto se puede ver que hay dos variables que afectan el tono final enviado al mundo real: la frecuencia de sincronización maestra que se ingresa al circuito dividir por N y el divisor N. El comando SOUND del BASIC usa solo la frecuencia de sincronización «normal» de 64 kHz, lo que limita al usuario a manipular sólo el tamaño de N.


Hay otro factor que afecta el rango de frecuencias disponibles en Pokey: el tamaño de N. Si N es un número de un solo byte, la nota más baja posible será el reloj maestro dividido por 255. Si N es un número de dos bytes, la nota más baja posible será el reloj maestro dividido por 65.535. El tamaño de N se denomina «resolución de frecuencia» del canal. En funcionamiento normal, cada uno de los cuatro canales tiene una resolución de frecuencia de 8 bits. El Atari, sin embargo, permite unir dos canales para obtener una resolución de frecuencia de 16 bits.


Algunos Pokablos. Para jugar con los modos de sonido ocultos tenemos que hacer una incursión en el interior del Atari. El comando SOUND no nos llevará mucho más lejos, por lo que tendremos que hurgar en los registros del hardware nosotros mismos. Las siguientes ubicaciones de memoria son pertinentes para la generación de sonido:


AUDF1=53760AUDC3=53765
AUDC1=53761AUDF4=53766
AUDF2=53762AUDC4=53767
AUDC2=53763
AUDF3=53764 AUDCTL= 53768

AUDF1 a AUDF4 son los registros de frecuencia para cada canal. Aquí es donde se obtiene el divisor N. Para encontrar la frecuencia del sonido seleccionado por AUDF1–4, use la siguiente fórmula (FIN es la frecuencia de entrada al circuito dividir por N y corresponde a la frecuencia del reloj maestro. FOUT es la frecuencia de salida al mundo real):


FOUT=FIN/(2*(AUDF+M))

M tendrá un valor de 1, a menos que FIN = 1,79. En este caso, M será igual a 4 si AUDF es un contador de ocho bits, o 7 si AUDF es un contador de dieciséis bits.


Los valores reales para cada una de las tres frecuencias del reloj maestro (FIN) son:


1,79 MHz = 1.789–789 Hz
64 kHz = 63.921 Hz
15 kHz = 15.699 Hz

AUDC1 a AUDC4 son los registros de control de audio para cada canal. Estos registros contienen los parámetros de volumen y distorsión para cada canal empaquetados en un byte. El nibble alto contiene el parámetro de distorsión y el nibble más bajo contiene el volumen.


AUDCTL es el registro de control del modo de audio y es el «interruptor maestro» de cómo se comportarán todos los canales de sonido. Cada bit en AUDCTL tiene su propio significado, por lo que AUDCTL es en realidad una colección de ocho conmutadores. Las acciones asociadas con cada bit se detallan a continuación. Para usar esta tabla con BASIC, simplemente seleccione las opciones que desee y sume los números POKE: correspondientes, luego introduzca el resultado en AUDCTL usando el comando POKE.


POKE: 128. Cambia el contador aleatorio polinómico de 17 bits a un contador de 9 bits.


POKE: 64. Registra el canal 1 con 1,79 MHz, en lugar de 64 kHz.


POKE: 32. Registra el canal 3 con 1,79 MHz, en lugar de 64 kHz.


POKE: 16. Registra el canal 2 con el canal 1, en lugar del reloj maestro. Esto une los canales 1 y 2 para formar un registro AUDF de 16 bits. AUDF1 se convierte en el byte de orden inferior y AUDF2 se convierte en el byte de orden superior. El sonido controlado por estos canales «sale» por el canal 2.


POKE: 8. Sincroniza el canal 4 con el canal 3, en lugar del reloj maestro. Esto une los canales 3 y 4 en un registro AUDF de dieciséis bits de la misma manera que POKE:16 une los canales 1 y 2.


POKE: 4. Inserta un «filtro paso alto» en la salida del canal l. La frecuencia de corte del filtro está controlada por AUDF3.


POKE: 2. Inserta un «filtro paso alto» en la salida del canal 2. La frecuencia de corte del filtro está controlada por AUDF4.


POKE: 1. Cambia la frecuencia de reloj normal de 64 kHz a un reloj de 15 kHz.


¿Cómo Uso Todo Esto? Primero, inicialice Pokey. Pokey también maneja todas las cosas de E/S, por lo que debe configurarse para la generación de sonido después de cada operación de E/S (como, por ejemplo, leer su programa). Ejecutar sound 0,0,0,0 al comienzo de su programa se encargará de esto.


A continuación, seleccione las opciones de modo de sonido que desee e introduzca el valor correspondiente en AUDCTL. Después de eso, simplemente introduzca los parámetros de distorsión y volumen en AUDC1–4, y sus parámetros de frecuencia en AUDF1–4. Sin embargo, si vuelve a utilizar el comando SOUND, borrará cualquier modo AUDCTL especial que haya seleccionado, por lo que tendrá que volver a escribir su valor después de cada comando SOUND de BASIC.


Para comenzar, el programa de muestra 1 muestra el procedimiento para configurar 2 canales de sonido con resolución de alta frecuencia sincronizados desde 1,79 MHz. Luego, el programa reproduce una breve secuencia musical a partir de las declaraciones de datos al final.


Para tocar notas musicales en estos modos de sonido especiales, por supuesto, necesita una tabla que muestre los valores correctos para cada nota igualmente templada en la escala occidental. El cuadro de notas incluido en el manual BASIC ya no funcionará: es para una resolución de frecuencia de ocho bits y una frecuencia de reloj de 64 kHz. Ahí es donde entra en juego el programa de muestra 2.


El programa de muestra 2, cuando se ejecute, imprimirá una lista de notas musicales y sus valores de 2 bytes correspondientes para cada una de las 3 frecuencias de sincronización. Simplemente busque la nota que desea e introduzca el primer número en el byte AUDF de orden superior y el segundo número en el byte AUDF de orden inferior.


El rango de las tablas va más allá de lo práctico: el Do más bajo es de 8,17 Hz, lo que apenas suena musical, y el Do más alto es de 134 kHz, lo que supera considerablemente la respuesta de frecuencia de su estéreo. También notará que a medida que cada gráfico se acerca al tope de su rango, comienzan a suceder cosas extrañas: el valor de 0,1 aparece para cada nota entre Sol# y Re#. Esto se debe a que no se permiten números decimales en los registros AUDF.


Con esto concluye nuestra discusión sobre el cronometraje. Los más perspicaces pueden haber notado que los modos de distorsión fueron pasados por alto; debido a su naturaleza, es importante comprender primero el sistema de cronometraje de Pokey. La próxima vez profundizaremos en los temas de ruido y cancelación de formas de onda.


20 AUDCTL=53768
30 AUDF1=53760:AUDC1=53761
40 AUDF2=AUDF1+2
50 AUDC2=AUDC1+2:AUDC3=AUDC2+2:AUDC4=AUDC3+2
60 REM INITIALIZE EVERYTHING
70 SOUND 0,0,0,0
80 REM POKE POKEY
90 POKE AUDCTL,120
100 REM SHUT OFF UNUSED OUTPUTS
110 POKE AUDC1,0:POKE AUDC3,0
120 REM TURN ON CHANNELS 2 AND 4
130 POKE AUDC2,168:POKE AUDC4,168
140 RESTORE 
150 FOR TONE=1 TO 12
160 FOR VOICE=0 TO 4 STEP 4
170 READ HIBYTE,LOBYTE
180 POKE AUDF1+VOICE,LOBYTE
190 POKE AUDF2+VOICE,HIBYTE
200 NEXT VOICE
210 FOR WAIT=1 TO 50
220 NEXT WAIT
230 NEXT TONE
240 GOTO 140
400 DATA 0,88,0,120,0,78,0,106,0,94,0,128,0,88,0,120,15,221
420 DATA 47,150,14,33,42,100,13,85,40,3,14,33,42,100,11,224
440 DATA 28,73,10,148,31,192,10,148,127,22,10,148,63,136	

Programa de Muestra 1.


90 DIM CLOCK(2),M(2),NAME$(5)
110 CLOCK(0)=15699
120 CLOCK(1)=63921
130 CLOCK(2)=1789789
150 M(0)=1
160 M(1)=1
170 M(2)=7
190 FOR FREQ=0 TO 2
200 LPRINT :LPRINT 
210 LPRINT "CLOCK: ";CLOCK(FREQ)
220 LPRINT 
240 FOUT=8.1759375
260 SKEY=0
280 AUDF=INT((CLOCK(FREQ)/FOUT)-M(FREQ)+0.5)
290 REM BREAK INTO HIGH AND LOW
300 HIBYTE=INT(AUDF/256)
310 LOBYTE=AUDF-(HIBYTE*256)
330 IF HIBYTE>255 THEN 370
340 RESTORE 500+SKEY
350 READ NAME$
360 LPRINT NAME$;"= ",HIBYTE;".";LOBYTE,INT(FOUT*100)/100;"  HZ."
370 SKEY=SKEY+1
380 IF SKEY=11 THEN SKEY=0
390 FOUT=FOUT*1.05946309
410 IF HIBYTE>0 OR LOBYTE>0 THEN 280
420 NEXT FREQ
430 END 
500 DATA C,C#/Db,D,D#/Eb,E,F,F#/Gb
510 DATA G,G#/Ab,A,A#/Bb,B	

Programa de Muestra 2.


Leer la siguiente columna que es un tono de ruido diferente.



Publicado en revista Softline Volumen 2 de Noviembre del 1982, páginas 13 al 14.