Artículo publicado en el número 4 de RetroWiki Magazine
El sonido desde el BASIC en un Amstrad CPC
El sucesor del Spectrum en el mercado fue claramente el Amstrad CPC, sobre todo desde el momento en que Amstrad adquirió a la empresa de Sinclair, en este artículo hablaré de como hacer sonar a este aparato desde BASIC.
El sonido en el Amstrad CPC
La gama CPC utiliza el chip de sonido General Instrument AY-3-8912, que proporciona tres canales configurables de sonido para generar ondas cuadradas y ruido blanco. El aparato integra un pequeño altavoz de 4 centímetros mono interno, con un potenciómetro de control de volumen. Si deseamos salida estéreo hay que usar una salida de sonido mediante una jack de 3,5 mm para auriculares.
Por la forma de trabajar del equipo, la salida estéreo y la mono estaban separadas, ya que la implementación de este chip es que usaba el canal 1 como la izquierda, el 2 como el centro y el 3 como la derecha, por lo que en todos los juegos se escucha por el altavoz la música de fondo y los efectos sencillos, y en algunos se sacaba por la toma de auriculares música o efectos de sonido mas elaborados.
Es posible reproducir muestras de sonido digital en una resolución aproximada de 5 bits enviando una trama de valores al chip de sonido, pero como esta técnica consume muchos recursos de procesador, no se puede usar durante los juegos, por eso se usó principalmente en las pantallas del menú del juego, o en escenas no jugables, en juegos como Chase H.Q., Meltdown, y RoboCop.
Sonido desde BASIC
Desde el BASIC se usa la instrucción SOUND, que permite emitir sonidos con bastante control desde el programa. La sintaxis es (entre corchetes la parte opcional):
SOUND canal, nota[,duración][,volumen][,envolvente volumen][,envolvente tono][,ruido]
- Canal indica por que canal deseamos emitir el sonido, lo que permite producir varios sonidos a la vez, uno por cada canal. Los canales se denominan 1, 2 y 4, Si queremos emitir el mismo sonido por dos canales, solo debemos sumarlos, así indicamos 5 (1+4) para los dos canales izquierdo y derecho, o 7 (1+2+4) para todos los canales.
- Nota es la frecuencia de la nota que queremos ejecutar, disponemos de 8 octavas desde la -3 hasta la 4. Las notas de la octava cero, la octava central, son DO=478, RE=426, MI=379, FA=358, SOL=319, LA=284, SI=253
- Duración es el tiempo en centésimas de segundo que queremos que suene la nota, si no indicamos nada durará 20 centésimas de segundo. Si queremos que suene un segundo indicaremos el valor 100
- Volumen al que queremos que suene la nota, que puede ir desde 0 (silencio) a 7 (máximo).
Como primer ejemplo pondré este que ejecuta teóricamente un silbido de Goku de Dragon Ball
100 REM Las notas a usar
110 DO=478: RE=426: MI=379: FA=358: SOL=319: LA=284: SI=253
120 REM Bucle de lectura
130 READ a$
140 IF a$=”” THEN STOP
150 IF a$=”Do” THEN SOUND 1, DO
160 IF a$=”Re” THEN SOUND 1, RE
170 IF a$=”Mi” THEN SOUND 1, MI
180 IF a$=”Fa” THEN SOUND 1, FA
190 IF a$=”Sol” THEN SOUND 1, SOL
200 IF a$=”La” THEN SOUND 1, LA
210 IF a$=”Si” THEN SOUND 1, SI
220 GOTO 130
230 REM La melodía
240 DATA “Re”,“Si”,“La”,“Sol”,“La”,“Si”,“Re”,“Si”,“La”,“Sol”
250 DATA “Re”,“Si”,“La”,“Sol”,“La”,“Si”,“Mi”,
260 DATA “Re”,“Si”,“La”,“Sol”,“La”,“Si”,“Re”,“Si”,“La”,“Sol”
270 DATA “Mi”,“Si”,“La”,“Sol”,“La”,“Si”,“Mi”
280 DATA “La”,“Mi”,“Re”,“Mi”,“Re”,“Mi”,“Re”,“Si”
290 DATA “La”,“Si”,“Re”,“”
110 DO=478: RE=426: MI=379: FA=358: SOL=319: LA=284: SI=253
120 REM Bucle de lectura
130 READ a$
140 IF a$=”” THEN STOP
150 IF a$=”Do” THEN SOUND 1, DO
160 IF a$=”Re” THEN SOUND 1, RE
170 IF a$=”Mi” THEN SOUND 1, MI
180 IF a$=”Fa” THEN SOUND 1, FA
190 IF a$=”Sol” THEN SOUND 1, SOL
200 IF a$=”La” THEN SOUND 1, LA
210 IF a$=”Si” THEN SOUND 1, SI
220 GOTO 130
230 REM La melodía
240 DATA “Re”,“Si”,“La”,“Sol”,“La”,“Si”,“Re”,“Si”,“La”,“Sol”
250 DATA “Re”,“Si”,“La”,“Sol”,“La”,“Si”,“Mi”,
260 DATA “Re”,“Si”,“La”,“Sol”,“La”,“Si”,“Re”,“Si”,“La”,“Sol”
270 DATA “Mi”,“Si”,“La”,“Sol”,“La”,“Si”,“Mi”
280 DATA “La”,“Mi”,“Re”,“Mi”,“Re”,“Mi”,“Re”,“Si”
290 DATA “La”,“Si”,“Re”,“”
Errata corregida: en el artículo publicado pone en las líneas 150 a 210 siempre DO
Las envolventes
Una característica de los CPC es que permiten hacer variaciones sobre un sonido mientras se emite, pudiendo variar el volumen o el tono del sonido, para lo que se usan las envolventes, que se especifican usando el comando ENV y ENT respectivamente.
Para indicar que el volumen debe variar mientras se reproduce el sonido deberemos crear una "envolvente de volumen", usando:
ENV nro,etapa, cambio,duración[etapa, cambio,duración][etapa, cambio,duración]
- Nro es el número que identifica la envolvente, de esta manera podemos tener varias preparadas a la vez, podemos tener hasta 15 diferentes.
- Etapa es la cantidad de etapas que queremos tener
- Cambio es la cantidad en que aumentamos el volumen, puede ser positivo para subir, negativo para bajar, o cero para mantener
- Duración es cuanto dura cada una de las etapas
Cada envolvente puede tener hasta tres tramos, ejecutándose uno tras otro, de forma que podemos subir y bajar el volumen en una sola envolvente. Un ejemplo de una etapa sería este:
ENV 1,5,3,20
SOUND 1,478,0,0,1
ENV 2,12,1,5,1,0,20,6,-2,20
SOUND 1,426,0,0,2
SOUND 1,478,0,0,1
ENV 2,12,1,5,1,0,20,6,-2,20
SOUND 1,426,0,0,2
La primera envolvente define que tenemos 5 etapas de aumento, en cada etapa subiremos tres unidades el volumen, y cada etapa durará 20 centésimas de segundo. Luego se emite un DO, que parte del volumen cero, y mediante la envolvente 1 irá subiendo de 3 en 3 unidades hasta que llegue a 15, y la duración total del sonido será la del al envolvente, por lo que no indicamos duración, que será en este caso sería de 5x20, 1 segundo.
La segunda envolvente tiene tres tramos, el primero tiene 12 tramos de 5 centésimas cada uno, subiendo una unidad de volumen en cada tramo a partir de lo indicado en el SOUND, luego tiene una etapa en la que no toca el nivel del sonido durante 20 centésimas, y termina con 6 etapas de bajada de 2 unidades cada una, que duran 20 centésimas.
De igual manera se puede cambiar el tono de la nota con la envolvente de tono por tramos y etapas, usando la sentencia:
ENT nro,etapa,cambio,duración[etapa, cambio,duración][etapa, cambio,duración]
- Nro es el número que identifica la envolvente de tono, de esta manera podemos tener varias preparadas a la vez, podemos tener hasta 15 diferentes.
- Etapa es la cantidad de etapas que queremos tener
- Cambio es la cantidad en que cambiamos el tono de la nota, puede ser positivo para subir, negativo para bajar, o cero para mantener
- Duración es cuanto dura cada una de las etapas
Cada envolvente puede tener hasta tres tramos, ejecutándose uno tras otro, de forma que podemos subir y bajar el tono de la nota en una sola envolvente. Un ejemplo de una etapa sería este:
ENT 1 ,80 ,-4 ,1
SOUND 1,478,50,15 ,0 ,1
SOUND 1,478,50,15 ,0 ,1
El sonido comienza con una frecuencia de 478 (DO), la modificamos en 80 pasos, bajando 4 unidades de tono en cada paso, y estos pasos tienen una duración de una centésima de segundo. Como usamos un cero en la orden SOUND para envolvente de volumen no se usa ninguna, pero se pueden combinar ambos efectos.
Ruido blanco
Podemos añadir un último parámetro a la orden SOUND, que solo puede ser un uno, para indicar que emita ruido a la vez que el sonido, alterando el mismo. Este tipo de ruido se denomina ruido blanco por ser una señal completamente aleatoria
10 FOR i=0 TO 10
20 f=INT(RND*20)
30 SOUND 1,f,25,10,0,0,1
40 NEXT
20 f=INT(RND*20)
30 SOUND 1,f,25,10,0,0,1
40 NEXT
Para la programación en código máquina del AY-3-891x dedicaré otra entrada, ya que la serie AY-3-8910/AY-3-8912/ AY-3-8913 son iguales internamente, solo cambia el número de puertos de entrada de que disponen, y han sido usados en aparatos como, Amstrad CPC, MSX, Atari ST, Oric 1 y Atmos, Timex, Spectrum 128/+2/+3 o Spectravideo entre otros, en la tarjeta de sonido Mockingboard para el Apple II, o en videoconsolas como la Intellivision o la Vectrex.
No hay comentarios:
Publicar un comentario