Artículo publicado en el número 6 de RetroWiki Magazine
El sonido en un Commodore 64
El Commodore 64 disponía de un chip gráfico denominado VIC-II, y un chip de
sonido denominado SID (Sound Interface Device),que le permitía generar un sonido
de alta calidad, disponiendo de 3 generadores de sonido independientes, este
chip además era rápido procesando sonidos, por lo que a pesar de una CPU relativamente
lenta, la capacidad sonora del C64 siempre ha sido muy elogiada, permitiendo
por ejemplo ejecutar sonido durante la lenta carga de los juegos.
El sonido en el Commodore 64
El chip SID proporciona tres canales configurables de sonido para generar no
solo las típicas ondas cuadradas, sino que podía generar también triangulares,
de diente de sierra y ruido blanco por cualquiera de sus canales, potenciado
por filtros de paso y resonancia configurables, por lo que podía generar una
variedad de sonidos mucho mayor que los AY, disponía de una serie de registros
de entrada, en los que se introducían los valores a reproducir, por lo que era
sencillo cargarlos y mientras el chip ejecutaba los comandos, el procesador
principal podía seguir haciendo otras cosas. El chip se desarrolló en un tiempo
record, con muchas prisas, por lo que tenía algunos fallos, y en los últimos
modelos se cambió el chip de sonido por el nuevo 8580, incluido en los Commodore
C64-C, C64-G, ALDI y la Consola Commodore 64, este chip producía un sonido más
limpio, pero no era capaz de reproducir igual de bien los sonidos digitalizados
del SID.
"Sonido desde BASIC
Desde el BASIC no existían instrucciones específicas para manejar el sonido,
pero como el C64 utiliza la técnica de periféricos mapeados en memoria, mediante
la llamada a la instrucción POKE, que pone en la posición de memoria
indicada un valor, se pueden introducir los comandos que activan el sonido.
Podemos controlar así 5 grupos de datos relacionados con el sonido, Frecuencia,
Volumen, Múltiples voces, Formas de onda y elGenerador de envolvente (ataque,
caída, sostenido, liberado).
El chip SID dispone de 29 registros de 8 bits numerados del 0 al 28, cada uno
es responsable de un determinado componente de la generación del sonido, aunque
principalmente se usan solo 25. En el mapa de memoria están ubicados a partir
de la posición 54272. Esta tabla nos indica para que se utiliza cada registro:
Nro. | Posición | Uso |
0 a 6 | 54272 a 54278 | Control del primer canal de sonido |
7 a 13 | 54279 a 54285 | Control del segundo canal de sonido |
14 a 20 | 54286 a 54292 | Control del tercer canal de sonido |
21 | 54293 | Frecuencia baja |
22 | 54294 | Frecuencia alta |
23 | 54295 | |
24 | 54296 | Control de volumen y filtros |
25 | 54297 | |
26 | 54298 | |
27 | 54299 | |
28 | 54300 |
Este ejemplo está sacado del manual de usuario del C64, y nos permite probar
como generar sonidos diversos en el aparato:
100 S=54272 110 FOR L=S TO S+24:POKE L,0:NEXT: REM INICIALIZA EL CHIP 120 POKE S+5,9:POKE S+6,0 130 POKE S+24,15: REM AJUSTA EL VOLUMEN 140 READ HF,LF,DR 150 IF HF<0 THEN END 160 POKE S+1,HF:POKE S,LF 170 POKE S+4,33 180 FOR T=1 TO DR:NEXT 190 POKE S+4,32:FOR T=1 TO 50:NEXT 200 GOTO 140 210 DATA 25,177,250,28,214,250 220 DATA 25,177,250,25,177,250 230 DATA 25,177,125,28,214,125 240 DATA 32,94,750,25,177,250 250 DATA 28,214,250,19,63,250 260 DATA 19,63,250,19,63,250 270 DATA 21,154,63,24,63,63 280 DATA 25,177,250,24,63,125 290 DATA 19,63,250,-1,-1,-1 |
La línea 100 guarda en S la dirección base del SID, para acceder a los registros
solo hay que sumarle el número del registro a S. La línea 110 inicializa el
chip, poniendo todos los registros a cero. Las líneas 120 a 130 inicializan
el volumen. Las líneas 140 a 170 leen un grupo de 3 valores hasta que sean -1
en cuyo momento paran, y lo establecen en el canal 1 para ajustar el sonido
a emitir. La línea 180 es una pausa, la 190 activa otra vez el sonido, y en
la 200 volvemos al bucle de lectura.
Control de Volumen
Para controlar el volumen hay que escribir en el registro 24.El C64 dispone16
niveles de volumen, entre 0 (apagado) y 15 (máximo), afectando siempre a los
3 canales a la vez. La línea 30 del programa de ejemplo establece el nivel de
volumen al máximo (15).
Voces
El C64 dispone de tres canales de sonido separados, pudiendo atacarse cada uno
de forma independiente, el sonido resultante es la suma de los tres canales.
Por cada canal, la nota se especifica por su frecuencia y la duración en milisegundos,
usando 16bits para ello, por tanto hay que dividirlos en dos registros de 8
bits para enviarlas al chip. Se usan 7 registros para cada canal:
Canal 1 | Canal 2 | Canal 3 | Descripción |
0 | 7 | 14 | Parte baja de la frecuencia a generar |
1 | 8 | 15 | Parte alta de la frecuencia a generar |
2 | 9 | 16 | Parte baja del ancho del pulso |
3 | 10 | 17 | Parte alta del ancho del pulso |
4 | 11 | 18 | Registro de control de forma de onda |
5 | 12 | 19 | Control de ataque y caída |
6 | 13 | 20 | Control de sostenido y retenido |
Frecuencias
Para hacer sonar una nota, se pasa el valor de 16 bits de su frecuencia a dos
registros de 8 bits, y se envían al chip. Cada canal puede usar una frecuencia
diferente a la vez. La línea 160 del ejemplo establece la nota del canal 1.
Para calcular los valores usaremos estos tres comandos:
F = FRECUENCIA / .06097 : HI = INT ( F / 256 ) : LO = F - (256 * HI)
Le pasamos en la variable FRECUENCIA le valor a generar, y disponemos el valor
a introducir en los dos registros en las variables HI (parte alta) LO (parte
baja).
El tipo determina el timbre del sonido a producir, siendo el primer chip que
permitía su control. Existen cuatro formas de onda posibles a generar:
- Triángular. Esta forma de onda contiene pocos armónicos y un suave sonido de flauta.
- En diente de sierra: Esta forma de onda contiene todos los armónicos. Tiene una calidad brillante y directa.
- Cuadrada: Es una onda de pulso variable. Cambiar el ancho del pulso produce sonidos que van desde un sonido brillante, uno hueco o uno nasal
- Ruido Blanco: Esta forma de onda se utiliza principalmente para efectos de sonido como explosiones o disparos, y oscila entre un retumbar bajo a un silbido.
Para establecer la forma de onda se usa el registro de control, cada bit del mismo tiene un uso diferente:
BIT | DESCRIPTION |
0 | Disparo |
1-3 | No se usa |
4 | Onda triangular |
5 | Onda en diente de sierra |
6 | Onda cuadrada |
7 | Ruido blanco |
El bit de disparo controla el generador de envolvente, cuando está a 1 se activa.
Los bits 4 a 7 establecen la forma de onda del canal, y se pueden activar varios
a la vez. La línea 170 del programa de ejemplo establece la forma de onda a
diente de sierra.
Seguiremos en el próximo artículo con el resto de controles, pero por ahora
ya podéis probar a generar sonidos en vuestro C64.
Jose Antonio Vaqué Urbaneja, podéis contactar
conmigo en mi mail para cualquier duda
que tengais
Con los sprites he trasteado mucho mucho, pero con el tema sonido no pasé de hacer pitidos :D :D
ResponderEliminar