viernes, 27 de abril de 2012

El sonido en 8 bits (II): El sonido en el Spectrum

Artículo publicado en el número 3 de RetroWiki Magazine

Ya hemos visto en el artículo anterior cómo se genera el sonido, ahora experimentemos con el sonido en ordenadores que usaban un Z80. Para ello pondré ejemplos de cómo hacer sonar en Basic y en Código Máquina algunos de los ordenadores de 8 bits más vendidos en España, comenzaremos con

El sonido en el Spectrum

El Spectrum usa la ULA como generador de sonido, controlado desde el procesador. Al no disponer de un chip específico y usar el altavoz interno para el sonido, no disponía de grandes prestaciones en el tema, pero aun así todos recordamos la música del Manic Miner taladrando nuestros oídos.

Desde el BASIC es sencillo acceder al sonido, mediante el comando BEEP (en un gomas Modo Extendido y Z). La sintaxis del comando es BEEP duración, nota

Como duración podemos poner cualquier cantidad expresada en segundos, y como nota debemos hacer referencia a cuantos semitonos deseamos sobre el DO central, siendo por ejemplo DO = 0, DO# = 1, RE = 2, hasta que el DO de la siguiente octava es 12. Igualmente por debajo usando negativos, -12 sería el DO de la anterior octava. Como ejemplo podemos escribir:

BEEP 1,0: BEEP 2,2: BEEP 1,0

Para hacer sonar una escala completa, podemos usar el siguiente programa que hace sonar a nuestra máquina:
10 PRINT “Octava: “, : INPUT  o
20 FOR n = 0 TO 11
30 BEEP 1,n+(o*12)
40 NEXT n

Esta es la tabla de frecuencias de los sonidos que puede reproducir bien el Spectrum, aunque puedes probar otros valores, pero no se oirán correctamente:

Do Do#
Reᴃ
Re Re#
Miᴃ
Mi Fa FA#
Solᴃ
Sol Sol#
Laᴃ
La La#
Siᴃ
Si
-12
130’6
-11
138’4
-10
146,80
-9
155,7
-8
165,1
-9
174,6
-6
186,2
-5
196,2
-4
207’8
-3
220’9
-2
232,7
-1
247,2
0
262,6
1
277,2
2
293,7
3
311,1
4
329,6
5
349,2
6
367,0
7
392,0
8
415,3
9
440,0
10
466,2
11
493,9
12
523,9
13
553,7
14
587,1
15
624,9
16
660,8
17
698,7
18
735,1
19
781,0
20
833,1
21
881,9
22
934,6
23
989,5
24
1046,3
25
1107,2
26
1175,7
27
1242,5
28
1317,3
29
1388,3
30
1482,4
31
1561,8
32
1662,7
33
1763,2
34
1852,8
35
1969,6
36
2082,1
37
2219,4
38
2350,6
39
2484,0
40
2633,6








Desde código máquina, la forma más sencilla de hacer sonar a nuestro Spectrum es llamar a la misma rutina de la ROM que se llama desde el intérprete de BASIC. La rutina que se llama desde el Basic se llama BEEP, y está ubicada en la dirección 03F8 (1016 decimal), toma los parámetros de entrada y llama con ellos a la rutina que hace sonar realmente a la ULA, la rutina se llama habitualmente BEEPER, y está ubicada a partir de la dirección 03B5h (949 decimal).

Esta rutina es sencilla de usar, se la debe pasar dos valores en los registros DE y HL que indican frecuencia (valor en Hz) y duración (valor en segundos), el resultado de las operaciones se debe convertir en un entero:

DE = INT (frecuencia * duración)
HL = INT ((437500 / frecuencia) - 30,125)

Pueden parecer extraños estos valores, pero realmente el sonido lo produce activando y desactivando el altavoz repetidamente, para lo que necesita usar unos contadores, y así se los damos ya calculados. Pongamos un ejemplo, queremos hacer sonar el DO (frecuencia 262’60Hz) durante 2 segundos:

LD HL, 1642D       ; Parte entera de (437500 / 261,60) - 30,125
LD DE, 523D         ; Parte entera de (261,60 * 2)
CALL 03B5           ; Llamamos a la rutina del BEEPER

La rutina BEEPER modifica el valor de todos los registros, por lo que antes de llamarla debemos guardar los registros que necesitemos y luego recuperarlos (típico PUSH/POP).

El altavoz se activa poniendo D4 a nivel bajo y llamando a OUT por el puerto 254. Cuando D4 pasa a alto, el altavoz se desactiva. Un “bip” por el altavoz se obtiene modificando repetidamente D4 durante el tiempo necesario.

Así una nota cualquiera de frecuencia F se obtiene activando y desactivado cada 1/2F de segundo el altavoz. Como el reloj del sistema es de 3,5 mhz, será necesario que la instrucción OUT se ejecute durante unos cuantos tics del reloj, que es lo que se está calculando con la fórmula anterior.


Jose Antonio Vaqué Urbaneja, podéis contactar conmigo en mi mail o ver más cosas en mi blog

No hay comentarios:

Publicar un comentario