martes, 8 de octubre de 2013

El sonido en 8 bits (V): El C64


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).

Formas de onda

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

1 comentario:

  1. Con los sprites he trasteado mucho mucho, pero con el tema sonido no pasé de hacer pitidos :D :D

    ResponderEliminar