Liber VII · Capitulum IX

El sonido

Un chip AY de tres voces imitado con un registro de volumen.

AUDV0 como conversor de 4 bits

Con AUDC0 = 0 el canal del TIA queda fijo y AUDV0 funciona como un conversor de 4 bits. El juego escribe una muestra en cada línea: 15 700 muestras por segundo. En las 199 líneas del kernel la escritura es un evento más del planificador; en las 63 del overblank las escribe el programa que el 6507 ejecuta desde la RAM del RIOT, leyendo unos nibbles que se suben en dos líneas del kernel (la ROM parchea un byte de ese programa para que escriba en AUDV0). El silencio es el valor 7, el centro, para que no haya golpe al empezar.

El sintetizador

Una vez por frame, en el overblank, el ARM calcula las muestras a partir de los 14 registros del AY del Spectrum: tres ondas cuadradas con su fase en 16 bits, la amplitud con la tabla logarítmica del AY y un ruido de 17 bits que avanza como mucho una vez por línea. Cada voz se suma alrededor del centro del conversor: si se sumara desde cero, el nivel medio subiría y bajaría con cada nota y, por el acoplamiento en alterna de la tele, sonaría como un volumen que va y viene. El ruido demasiado agudo para 15,7 kHz se sustituye por su valor medio, que es lo que oye el oído. La música va a 50 Hz y el frame a 60: el sintetizador parte el frame en la muestra donde cae cada paso del reproductor (lleva la cuenta en trescientosavos de segundo) y lo llama entre los dos tramos, así que cada nota cambia en su instante y no al principio del frame, como antes, con hasta 1/60 s de desfase. En PAL 50 el paso cae siempre al principio. La fase de cada canal se guarda entera entre frames.

Cada onda cuadrada no se muestrea en un solo punto: se suma la fracción de la línea en la que está arriba. Es un filtro de caja que impide que los armónicos por encima de 7,85 kHz se plieguen en tonos que no son de la nota; con el vibrato de la música de fondo de la partida sonaban como un eco ruidoso. Si la suma de los tres canales no cabe en los 4 bits de AUDV0, ese tramo baja de ganancia en vez de recortarse, como un limitador. Y como cada parte del frame escribe AUDV0 en un ciclo distinto, el sintetizador ajusta las fases en cada cambio de tramo para que cada muestra corresponda a su instante.

Partituras y grabaciones

Las 11 melodías y efectos de la partida usan el reproductor de partituras del original, traducido a C y comprobado byte a byte: 506 bytes de partituras y envolventes y 1,4 KB de código. La intro y el final usan otro reproductor cuyas partituras no se han descifrado, así que van como la secuencia de cambios de los registros del AY de frame en frame, comprimida con un LZ77 hecho a medida que se descomprime sobre la marcha, sin ventana en RAM y con un límite de lecturas por frame: la intro pasa de 2,9 a 1,5 KB y el final, de 11,6 a 3 KB.

En la página de la música se pueden escuchar las piezas en el AY y en la imitación del sintetizador de la 2600.