Efectos de sonido – mini teoría

Para darle un cierre al tutorial, hoy vamos a abordar el tema de los efectos sonoros. Personalmente es un tema que me costó bastante de entender, por lo que decidí simplificar lo mas posible el apartado sonoro.
Primero, vamos a ver que es lo que logramos:

Un poco de teoría

El sonido en la C64 es gestionado por un chip, el famoso SID 6581. Este cuenta con 3 canales independientes, cada uno de ellos posee 4 tipos de ondas diferentes (triangular, diente de sierra, cuadrada/pulsos, ruido blanco), generador de envolvente ADSR, filtros, y unas cuantas cosas mas que no entendí. Para los efectos que vamos a hacer, con esto tenemos mas que suficiente, si queremos profundizar podemos ver los todos los registros en https://www.c64-wiki.com/wiki/SID, o algo mas avanzado en http://codebase64.org/doku.php?id=base:sid_programming.

Los osciladores

Cada canal puede generar 4 ‘tipos’ de sonidos básicos (no se me ocurre como decirlo – si alguien sabe por favor comenten):

  • Triangular, con un sonido suave, como si fuese una flauta
  • Diente de sierra: mas agresivo, mucho mas timbrado… quizá como un violín?
  • Cuadrada/pulsos: Mucho mas agresivo?? no lo sé, no logré hacerlo sonar con esta forma de onda
  • Ruido Blanco: Básicamente ruido, ideal para explosiones, etc

Todos estos sonidos básicos puede luego modificarse en frecuencia, envolvente, filtros…

Envolventes

Los generadores de envolventes modelan la amplitud del sonido desde el momento en que se le da la orden de tocar una nota hasta que le damos la orden de apagarla. ADSR son las iniciales de Attack, Decay, Sustain y Release, y lo que especificamos es el tiempo que tarda la nota en llegar a máximo volumen desde que la disparamos (attack), el tiempo que tarda desde ese máximo hasta el volumen Sustain (Decay), el volumen que queremos que suene (sustain) y el tiempo que queremos que dure desde que damos la orden de apagar la nota hasta el volumen cero. Más claro en el siguiente grafico:

Y… esto como funciona?

Para generar un sonido primero tenemos que configurar algunos registros del SID. Antes que nada no está de más ponerlos todos en 0, desde la posición 54272 hasta 54296 (por las dudas que tengan basura seteada). Luego tenemos que poner el volumen general al máximo, utilizando la posición de memoria 54296, configurar el ADSR (en este caso para el canal 1), con las posiciones de memoria 54277 (Attack/Decay) y 54278 (Release/Sustain), establecer la frecuencia con las posiciones 54272 y 54273, para RECIÉN ahí poder disparar la nota, con la posición 54276… Ufff!, mejor un código de ejemplo en BASIC, que dispara un sonido sencillo:

10 for l = 54272 to 54296 : poke l,0 : next
20 poke 54296, 15 : rem volumen maximo
30 poke 54273, 100 : rem frecuencia MSB
40 poke 54272, 0 : rem frecuencia LSB
50 poke 54277,  8*16 + 10 : rem atack 8 - decay 10
60 poke 54278,  2*16 + 12 : rem sustain 2 -  release 12
70 poke 54276, 32 + 1 : rem onda triangular, comienza
71 print"comienza sonido"
75 for pause = 0 to 2500: next : rem pausa 4 segundos aprox
80 poke 54276, 32 : rem apaga sonido
81 print"finaliza sonido"

si ejecutamos este programita veremos que inicia un sonido desde un volumen 0, sube rápidamente al máximo, luego baja a un volumen mínimo, y se queda en ese volumen por aproximadamente 4 segundos, hasta que comienza a desvanecerse hasta desaparecer (noten que aparece el cartel “FINALIZA SONIDO”, pero es en ese momento en que comienza a desvanecerse, aquí esta el tiempo del parámetro Release).
El ejemplo está comentado para que se comprenda fácilmente, pero quisiera dedicarle un par de lineas a explicar como se establece la frecuencia (el tono), como configuramos el ADSR, y como disparamos/apagamos el sonido.
El Attack/Sustain se especifica en la dirección de memoria 54277, utilizandose los 4 bits superiores para el Attack y los 4 bits inferiores para el Sustain, por eso en el ejemplo lo escribo de esa forma, para que se entienda mejor que es lo que estoy configurando (8*16 seteo los 4 bits superiores, y adicionando un valor de 0 a 15 especifico los 4 inferiores). Todo esto aplica también para Sustain/Release.
La frecuencia se programa con 2 bytes, ya que no nos alcanzaría una sola posición de memoria para cubrir todo el rango audible. El cálculo no lo tengo correctamente aquí, pero para lo que necesitamos en este tutorial vamos a dejar el LSB (54272) en cero, y vamos a toquetear el HSB (54273) para cambiar el tono. Si queremos profundizar en este tema recomiendo ir a http://codebase64.org/doku.php?id=base:how_to_calculate_your_own_sid_frequency_table, si clickean en el enlace comprobarán que es realmente complicado especificar correctamente una frecuencia.
Finalmente queda ver como establecemos la forma de onda y comenzamos el sonido. La posicion 54276 establece con los 4 bits superiores que forma de onda queremos utilizar, y con el bit 0 si queremos que suene o se apague. Por eso comenzamos un sonido con POKE 54276,32 + 1, y lo apagamos con POKE 54276,32.

Por ahora suficiente de teoría, con el material aquí proporcionado podemos generar los sonidos de los lasers cuando disparan, las explosiones de los jetpacs y los Fuels, y un sonido simple para cuando agarramos combustible… pero eso para el próximo post. ̉̉Nos vemos!

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s