Mostrando entradas con la etiqueta Sonido. Mostrar todas las entradas
Mostrando entradas con la etiqueta Sonido. Mostrar todas las entradas

martes, 19 de noviembre de 2013

El sonido en 8 bits (VI): Sonido en el C64 (II)

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

El sonido en un Commodore 64 (II)

Seguimos con el sonido en los Commodore 64, las envolventes de sonido nos permiten modificar el volumen del sonido

El generador de envolvente

Cuando una nota musical sube de volumen, a la velocidad con que lo hace se le denomina ataque (ATTACK). Cuando baja de volumen a la velocidad se le denomina caída (DECAY), si la nota baja hasta cero se le denomina liberación (RELEASE). Si la nota se mantiene durante el tiempo se le denomina sostenido (SUSTAIN). Esto lo ejemplarizamos en esta gráfica, y se les denomina como conjunto por sus siglas en inglés ADSR.

Para cada una de las tres voces se utilizan dos registros de 8 bits para controlar los parámetros ADSR , 5 y 6 para la voz 1 , 12 y 13 para la voz 2 y 19 y 20 para la voz 3. El primer registro de cada pareja controla ataque y caída, y el segundo liberación y sostenido, cada parámetro por tanto usa 4 bits, y puede usar valores por tanto entre cero y 15. A los primeros cuatro bits se les denominan Altos, y a los segundos Bajos, y hay que combinarlos para obtener el parámetro a usar, siendo los altos para caída y liberación y los bajos para ataque y sostenido. La forma más sencilla es sumar los valores del (valor Alto * 16) + (Valor Bajo), así por ejemplo si el valor del Ataque es 4 y el de caída 8, el valor a usar sería 8*16 + 4 = 132.

10 FOR L=54272 TO 54296:POKE L,0:NEXT Limpia el SID
20 POKE 54296,15 Ajusta volumen máximo
30 POKE 54277,64 Establece ataque/caida
40 POKE 54273,162:POKE 54272,37 Nota en la voz 1
50 PRINT "PUSA UNA TECLA" Mensaje en pantalla
60 GET K$:IF K$="" THEN 60 Mira el teclado
70 POKE 54276,17:FOR T=1 TO 200:NEXT Forma de onda triangular
80 POKE 54276,16:FOR T=1 TO 50:NEXT Para la nota
90 GOTO 50 Repite la ejecución


En la línea 30 se establece la tasa de ATTACK/DECAY, ponemos ataque a cuatro y caída a cero, por tanto 4*16+0=64. Podemos jugar con los valores de la línea 30 para ver cómo afecta al volumen de la nota que está sonando. Lo mismo se puede hacer con el sostenido y liberación, por ejemplo añadiendo esta línea al programa:

35 POKE 54278,128

Esta tabla puede servirnos para establecer los valores de los 4 parámetros en cuatro niveles sin necesidad de calcular, solo suma el valor de Ataque y Caída deseado para el primer parámetro, y sumar los valores de Sostenido y liberado deseados para el segundo parámetro.

Alto Medio Bajo Muy bajo Alto Medio Bajo Muy bajo
Ataque Ataque Ataque Ataque Caída Caída Caída Caída
Sostenido Sostenido Sostenido Sostenido Liberado Liberado Liberado Liberado
128 64 32 16 8 4 2 1

FILTRADO

Para ajustar el timbre de las notas se utilizan los filtros, son los más difíciles de ajustar, pero se puede hacer que nuestro C64 suene como cualquier instrumento musical ajustando los filtros. Existen tres filtros a usar, ajustan un nivel de señal para cortar las otras:

  • Filtro de paso alto. Este filtro reduce el nivel de las frecuencias inferiores a la frecuencia de corte especificada. Pasan todas las frecuencias iguales o superiores al punto de corte, mientras que reduce las frecuencias por debajo del corte.
  • Filtro de paso bajo. Al contrario, este filtro deja pasar las frecuencias por debajo del corte y reduce las superiores al corte.
  • Filtro paso banda. Este filtro deja pasar una banda estrecha de frecuencias en torno al corte y reduce el nivel de todas las demás.
  • Un filtro adicional llamado filtro de rechazo, que es el contrario al de paso banda, puede sintetizarse combinando los filtros de paso alto y bajo.
El registro 24 permite indicar el uso de los filtros, y también se usa en el control de volumen, por lo que hay que sumar ambos valores. Los bits a usar son:

      BIT Uso
      4 Selecciona el uso del filtro de paso bajo (valor 8)
      5 Selecciona el uso del filtro de paso banda (valor 16)
      6 Selecciona el uso del filtro de paso alto (valor 32)

Para activar los filtros se usa el registro 24 del SID, solo se puede activar un filtro a la vez, usando un valor  de 0 a 15 para cada uno, para usarlo se usan estos bits:

      BIT Uso
      7-4 Valor de resonancia del filtro (valor 0 a 15 multiplicado por 16)
      3 Entrada externa del valor del filtro (valor 8)
      2 Activar el filtro para la voz 3 (valor 4)
      1 Activar el filtro para la voz 2 (valor 2)
      0 Activar el filtro para la voz 1 (valor 1)


La frecuencia de corte es un número de once bits, por lo que su valro oscilará entre 0 y 2047. Los ocho bits superiores (11 al 3) se almacenan en el registro 22, mientras que los tres bits más bajos (2 al 0) se almacenan en el registro 21. Añadiremos al programa anterior líneas que nos permite probar los valores de los filtros:

10 FOR L=54272 TO 54296:POKE L,0:NEXT      Limpia el SID
20 POKE 54296,15 Ajusta volumen máximo
30 POKE S+24,31 volumen total + filtro paso bajo
35 POKE S+23,1 filtro de voz 1
37 POKE S+22,128:POKE S+21,7 frecuencia de corte
40 POKE 54273,162:POKE 54272,37 Nota en la voz 1
50 PRINT"PUSA UNA TECLA" Mensaje en pantalla
60 GET K$:IF K$="" THEN 60 Mira el teclado
70 POKE 54276,17:FOR T=1 TO 200:NEXT Forma de onda triangular
80 POKE 54276,16:FOR T=1 TO 50:NEXT Para la nota
90 GOTO 50 Repite la ejecución


Hasta aquí el manejo del sonido de nuestros C64 desde su Basic, con esto completamos el repaso de la forma de sacar el sonido de los principales sistemas de 8 bits, Spectrum, Amstrad, MSX y C64.

 Jose Antonio Vaqué Urbaneja, podéis
contactar conmigo en mi mail

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

domingo, 30 de diciembre de 2012

El sonido en 8 bits (IV): En los MSX

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


El estándar MSX1 definía una máquina con el típico chip de sonido de General Instrument, el AY-3-8910, lo que se mejoró mínimamente en el MSX2, se aumentó en los  MSX2, llegando al máximo en los Tubo-R. En su versión del Microsoft Basic incluyeron una forma muy sencilla de usar para hacer música. En su versión del Basic para los MSX1, Microsoft incluyó tres instrucciones de manejo del sonido, que daban todo el control del chip al usuario. 

El sonido en los MSX
El estándar original de los MSX definía el uso de un chip generador de sonido programable (PSG) de General Instrument, el AY-3-8910, que proporciona tres canales configurables de sonido para generar ondas cuadradas y ruido blanco, con dos puertos de entrada/salida para su gestión. Como cada fabricante podía implementar sus máquinas con muchas opciones, la mayoría de los MSX1 solo disponían de salida de sonido mono a través del televisor, solo algunos permitían salida estéreo desde un conector trasero. 

En los MSX2 no se mejoró mucho la capacidad de generar sonido, ya que usaba el chip de Yamaha YM2149 que es compatible con el AY-3-8910, pero todas las implementaciones ya tenían mono o estéreo por la tele, y siempre estéreo por un conector de salida. El MSX2+ mantenía el sistema, añadiendo opcionalmente un segundo chip de sonido Yamaha YM2413, que proporcionaba síntesis musical de 1 instrumento entre 15 posibles, que también fue muy usado en cartuchos de ampliación.  El TURBO-R cambiaba todo el sistema, mejorando los chips usados y añadiendo MIDI, pero muy pocas máquinas lo usaron.

Sonido desde BASIC

Para producir sonido desde el BASIC hay tres formas, usando BEEP, SOUND o PLAY, cada una tiene una forma diferente de enviar los comandos.

La forma mas sencilla es usar BEEP, que hace un sonido fijo de duración establecida, es un pitido sencillo en el altavoz, y se usa mucho antes de una interacción con el usuario para avisarle:

10 BEEP
20 INPUT “Introduzca un valor: “;A$


La orden SOUND permite enviar a los registros internos del chip los valores que se deseen, por lo que hay completo control del sonido, a costa de necesitar conocer perfectamente como trabaja el chip. La sintaxis es: SOUND registro, valor
  • Registro: indica el registro que se desea modificar. Los AY-3-8910 disponían de 16 registros de 8 bits, algunos usados de dos en dos para conseguir valores de 16 bits, pero no todos admitían cualquier valor: 
    • 0 y 1: En los 12 bits se establece la frecuencia para el canal A, el 0 es el byte bajo (0-255) y el 1 el medio byte alto (0-15), pudiendo manejar 4096 tonos. Para enviar un sonido, por ejemplo de 1456, hay que calcular:
      • Byte alto: parte entera del valor dividido entre 256 -&gt; |1456/256|=5 
      • Byte bajo: el valor menos el byte alto por 256 -&gt; 1456-(5*256)=176
    • 2 y 3: Lo mismo para el canal B. 
    • 4 y 5: Lo mismo para el canal C .
    • 6: En 5 bits el tono del canal de sonido blanco. 
    • 7: En 6 bits que canales se activan a la vez, será la suma de los valores deseados entre los siguiente, así si queremos que suenen a la vez A y C, y por el A añadir ruido blanco, sería 1+4+8=13:
      •    1: Canal A
      •    2: Canal B
      •    4: Canal C-Sonido Blanco)
      •    8: Ruido blanco en el canal A
      •  16: Ruido blanco en el canal B
      •  32: Ruido blanco en el canal C
    • 8, 9 y 10: Volumen del canal A, B o C respectivamente, entre 0 (mínimo) y 15 (máximo), pero siempre hay que sumarle 16 para activar el registro.
    • 11, 12: Frecuencia del patrón de envolvente del sonido, 11 byte bajo y 12 byte alto.
    • 13: Modo del patrón del envolvente de volumen, con valores que se sumen entre:  1 para activar Hold, 2 para activar Alternate, 4 para activar Attack, 8 para activar Continue (ver el artículo sobre los Amtrad para entender mejor los envolventes).
    • 14 y 15: No se usan para el sonido, son los valores de los puertos de entrada/salida del chip
  • Valor: es el valor a guardar en el registro, dependiendo de los bits que pueda recoger cada uno.
Esta forma de ejecutar sonido nos da todo el control sobre el chip generador de sonido, pero es más compleja de manejar. Un ejemplo con el canal de sonido blanco:

10 SOUND 6,0
20 SOUND 7,55
30 SOUND 8,16
40 SOUND 11,23
50 SOUND 12,2
60 SOUND 13,9

Como esta forma de manejarlo es mas compleja, hay una segunda forma de hacerlo mucho mas sencilla, que nos permite hacerlo incluso a los que no sabemos casi nada de música, con la orden PLAY, que tiene esa sintaxis: PLAY [EA] [,EB][,EC] en donde EA, EB y EC son tres cadenas de caracteres con las notas que se desea hacer sonar en los canales A, B y C respectivamente. Solo es obligatorio indicar una de las tres cadenas, y se componen de notas y variaciones de sonido, pudiendo usar cualquiera de estos comandos sin separaciones entre ellos (lo que dificulta un tanto la lectura):
  • Notas Musicales: Se indican mediante una letra o una “N” seguida de un número de una o dos cifras, y al igual que en un piano de una octava, se usa la escala cromática en lugar de la natural, con los semitonos usando sostenidos (añadiendo “#” o “+”) y bemoles (añadiendo “-“), y al igual que en un piano de una sola octava no están permitidos B# (Do de la siguiente octava), C- (Si de la anterior octava), E# (Fa), F- (Mi):
    •     Do        N36, C
    •     Do#      N37, C#, C+, D-
    •     Re        N38, D
    •     Re#      N39, D#, D+, E-
    •     Mi        N40, E
    •     Fa        N41, F
    •     Fa#      N42, F#, F+,G-
    •     Sol       N43, G
    •     Sol#     N44, G#, G+, A-
    •     La        N45, A
    •     La#      N46, A, A+, B-
    •     Si         N47, B   
  • Octava: Si no se indica nada se entiende la octava natural (la cuarta), si se desea usar otra octava se indica con al expresión “On” antes de la nota, donde n es el número de la octava de 1 a 8. Así O2B es el Si de la segunda octava. Si se usa la notación numérica, no es necesario, solo hay que usar el número mas o menos 12 veces la octava a usar, así el Do en las 8 octavas sería O1C=1,  O2C=12, O3C=24, O4C=36, O5C=48, O6C=60, O7C=72, O8C=84
  • Duración de la nota: Se indica usando “L” mas la duración entre 1 y 64, siendo L1=redonda y el resto la fracción 1/n del tiempo, así L2=blanca (1/2), L4=negra (1/4), L8=corchea (1/8), etc. Si solo queremos que afecte a una nota, lo pondremos justo después de su símbolo, Así A16 es una La semicorchea, y E4F es Mi negra Fa redonda, mientras que L4EF es Mi negra Fa negra.
  • Silencios: Se indican mediante “R” seguido de la duración, igual que la de una nota, así R1 es silencio de redonda y R8 silencio de corchea.
  • Puntillo: El símbolo “.” extiende la nota o silencio por 3/2 de su valor.
  • Tempo: Se usa “T” seguida de un número entre 32 y 255, indicando la duración base de una blanca. Si no se indica nada se asume T120.
  • Volumen: Se usa “V” seguida de un número entre 0 y 15 para indicar el volumen del canal.
  • Envolvente: Para manejarlo se usan “S” seguida de un número entre 0 y 15, para indicar la forma de la envolvente, y “M” seguida de un número entre 0 y 65535 para el periodo de la envolvente.
  • Uso de variables: Si se desea usar el contenido de una variable numérica en lugar de cualquier argumento numérico (no para notas), se puede usar en lugar de un número la expresión “=” mas el nombre de la variable mas “;”, así si disponemos de una variable llamada A y otra llamada B, podemos usar “BBO=A;T=B;”.

Un ejemplo sacado de un manual, en el que se presenta una melodía en tono de rock, o eso ponen en el libro:

10 A$=”T230O3EG#BO4C#DC#O3BG#”
20 B$=”T230O3AO4C#EF#GF#EC#”
30 C$=”T230O3BO4D#F#G#AG#F#D#”
40 PLAY A$ : PLAY A$ : PLAY B$
50 PLAY A$ : PLAY C$ : PLAY B$
60 GOTO 40

Este sistema de producir sonido es muy sencillo para que cualquiera pueda transcribir una partitura en su MSX.


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

jueves, 30 de agosto de 2012

El sonido en 8 bits (III): En el Amstrad CPC

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”,“”
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

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

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

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.



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

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

miércoles, 21 de marzo de 2012

El Sonido en 8 bits

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

El sonido

Para nosotros el sonido consiste en ondas que producen oscilaciones de la presión del aire, que son convertidas en oscilaciones mecánicas en el oído humano y percibidas por el cerebro.

Como cualquier onda, el sonido tiene varios parámetros que lo definen, los dos principales son la longitud de onda (ancho de un ciclo completo) y la amplitud (altura de la onda), estos parámetros se aprecian bien en la imagen adjunta. Normalmente en lugar de hablar de longitud de onda, se habla de frecuencia, que es el número de ciclos por segundo, lo que depende directamente de la longitud de onda. La frecuencia indica el tono del sonido (agudo, bajo, medio), mientras que la amplitud indica el nivel sonoro (susurro, suave, fuerte). Además de estos parámetros, consideraremos la Potencia acústica, que es la cantidad de energía radiada, y es la que nos da sensación de volumen.

Un sonido complejo es la mezcla de varios sonidos simples, y aquí interviene la fase que es la posición de una onda con respecto a otra, dos ondas están en fase cuando comienzan y acaban en el mismo punto, y están desfasadas cuando una está en el valle y la otra en la cresta. Cada una de las ondas se mezcla en el oído, sumándose su efecto, por lo que un sonido complejo tiene una forma de onda muy desigual, lo que posibilita su reproducción por un generador, que puede reproducir un sonido complejo.


Música y armónicos

La música es una forma de escribir en un papel los sonidos, para lo que cada frecuencia se asocia a una nota musical. Esto se fijó a finales de la edad media, para poder fijar las voces del canto gregoriano principalmente, e inicialmente se definieron 7 notas, lo que produce 8 intervalos de frecuencia desde el DO-RE-MI-FA-SOL-LA-SI hasta el siguiente DO. Esto se denomina octava. La distancia entre dos notas era suficientemente amplia para que el oído las aprecie como sonidos diferentes (y no sean difíciles de cantar), pero posteriormente se añadieron notas intermedias (los sostenidos y bemoles), para mejorar el sonido con la evolución de los instrumentos.

Como el oído humano tiene un rango más amplio de apreciación sonora que una sola escala, hay 11 octavas posibles, no todos pueden oír las primeras y últimas, especialmente los de más edad, por lo que se usan normalmente solo 8 octavas. La octava central se suele nombrar como la tercera octava, o la cuarta para los anglosajones.

La nota base del sistema musical moderno es el LA3, el LA de la tercera octava, para la que se fijó una frecuencia de 440Hz. El LA4 tiene el doble de frecuencia, y el LA2 tiene la mitad, y así en todas las notas y todas las octavas. La frecuencia del DO3 es de 261’626Hz, y el SI3 es de 493’883Hz.
Cuando en un instrumento musical genera una nota, sea cual sea esta, genera siempre la misma frecuencia, por lo que no se distinguiría el sonido de uno a otro intrumento. Pero cuando se genera el sonido, a su vez se generan una serie de ondas complementarias, con frecuencias mitad, cuarto, octavo, etc. Estas ondas complementarias se denominan armónicos. Cada instrumento musical genera diferentes armónicos, cada uno con una intensidad, que se suman a la nota generada, y eso es lo que diferencia realmente el sonido de un instrumento de otro.

El sonido en la música tiene 4 parámetros que lo definen, altura (frecuencia o tono), intensidad (amplitud o intensidad), duración (tiempo que permanece la nota en el aire), timbre (instrumento con que se toca, relacionado con sus armónicos). A esto se añade una quinta que se denomina textura, que solo una apreciación de la calidez del sonido (aterciopelado, áspero, metálico, etc.).

Generadores de sonido

Un generador de sonido puede funcionar de tres maneras principalmente, digital, analógica o sampler.
Un generador digital es el más sencillo de todos, calcula la frecuencia que desea emitir, y mediante un conversor analógico a digital, genera una señal. Esta señal no puede ser fiel al 100% a la que desea generarse, ya que la conversión solo puede generar ciertos valores escalonados, pero si los escalones son muy pequeños, la calidad sonora es muy buena, comparable a la de los otros medios de generación. La ventaja es que la conversión es muy rápida, instantáneamente se puede adaptar a cualquier nivel.
El generador analógico es el más usado, mediante un transistor se puede generar una frecuencia cualquiera, con la ventaja de que puede ser variada por una señal externa. Esto permite generar una señal sonora de igual frecuencia que la que desea reproducir. El problema de los generadores es que tienen un rango limitado de frecuencias que pueden variar, antes de empezar a distorsionar, por lo que se suelen montar varios generadores de frecuencias juntos, cada uno encargado de un rango. El otro problema es que tienen algo de inercia en el cambio, no es instantáneo, pero esto realmente no es un problema, ya que los instrumentos musicales también tienen dicha inercia.
El tercer sistema más usado es del de los sampler. Lo que hacen es almacenar el sonido que desea reproducir, cuantos más mejor, y se limitan a reproducir el sonido grabado. La gran ventaja es que producen el sonido más realista del instrumento que desean reproducir, el inconveniente es que el rango de sonidos queda limitado a los que puede almacenar.

Voces y ruido blanco

Los generadores de sonido pueden producir un solo sonido, o generar varios simultáneamente, cada canal de generación de sonido se denomina una voz. Cuantas más voces o canales tengan, mejor será el resultado del sonido generado. Los generadores de los ordenadores de 8 bits más habituales generan 3 voces simultáneas.
El ruido blanco es una señal completamente aleatoria, se puede aplicar a un sonido completamente aleatorio, o a la distorsión que se genera en una imagen visual al aplicar ciertos filtros. Los generadores suelen incluir un generador de ruido blanco, ya que con ellos se sintetizan muy bien los sonidos de percusión.
Otros componentes habituales en los generadores son los filtros, que permiten eliminar partes del sonido generado, y también son necesarios los amplificadores de la señal, que permiten aumentar el volumen sonoro, los mejores usan amplificadores separados para cada canal, lo que permite un control preciso del sonido generado.

MIDI

El MIDI (Musical Instruments Digital Interface, o Interfaz Digital de Instrumentos Musicales), no es un generador real de sonido, sino un sistema que permite a los ordenadores y los dispositivos musicales electrónicos comunicarse y compartir información, para controlar la generación de sonidos. Generalmente el ordenador envía a los periféricos la nota que desea que generen, y estos la producen. La ventaja del sistema es que la información que se intercambia es muy liviana, e independiente de la fuente y el destino. Un sistema puede controlar hasta 16 canales MIDI, cada uno generando uno o varios sonidos, por lo que un ordenador con interface MIDI puede llegar a general muchos canales de sonido.

Evolución del sonido

Los primeros ordenadores personales como el Altair o el Imsai (y las primeras consolas como la Odisey) no tenían posibilidad de generar sonido, aunque mediante el bus S-100 se les podría dotar. El Apple II aportó la novedad de incorporar un altavoz interno, y como estaba conectado al procesador, este podía generar algunas señales sonoras, lo que se conoce habitualmente como pitidos.
Pero el sonido donde más se necesitaba era en las consolas, un juego sin sonidos pierde mucho, los primeros usaban el mismo sistema de conectar el altavoz al procesador, hasta que Atari incluyó en su exitosa consola 2600 un chip específico, la TIA, que controlaba la generación de video y de sonido, con dos canales mono de salida. De este desarrollo surgió el que está considerado el primer chip de sonido, el POKEY de Atari.

Posteriormente surgieron el General Instrument AY-3-8910, y desarrollados por Commodore y MOS el VIC (nombre usado en el famoso VIC-20), el SID y el TED. Otros chips muy difundidos fueron el 2A03 de Nintendo, el Philips SAA1099, los de Texas Intruments de la serie SN764, y los Yamaha de la serie YM.

Los primeros basados en Sampler fueron el "Paula" de MOS, usado en los Amiga, el Sony SPC700, o el National LMC 1992.

Pequeña cronología




1972
  • Magnavox Odyssey, imagen en blanco y negro y sin sonido.

1973
  • Atari Pong, con efectos de sonido en forma de pitidos del altavoz

1977
  • Apple II. Solo pitidos del altavoz, aunque apareció una tarjeta de sonido.


  • Tandy Radio Shack TRS-80. Solo pitidos del altavoz, pero como curiosidad, el modelo III emitía tanta interferencia radioeléctrica, que algunos juegos se diseñaron para aprovecharla y sacaban sonido en una radio que estuviera cerca del aparato.


  • Atari VCS 2600, primer chip específico para gráficos y sonido, la TIA.

1979
  • Mattel Intellivision, con un GI AY-3-8914 Años 80


  • Atari 400/800. Esta gama incluía el POKEY.




1980
  • Commodore VIC-20, el  "VIC" (Video Interface Chip) también generaba el sonido.


  • CoCo (TRS-80 Color) el hardware de sonido era un DAC bajo control del procesador. Algunos cartuchos incorporaban un procesador de sonido.

1981
  • TI-99/4A, primero ordenador con sprites gráficos, incorporaba el TI TMS9919,


  • PC de IBM, solo pitidos por el altavoz interno, pero surgieron muchas tarjetas de sonido.


  • BBC Micro, incorporaba el chip de sonido Texas Instruments SN76489

1982
  • Sinclair ZX Spectrum, sonido por el altavoz interno controlado por la CPU a través de la ULA. Timex incluyó en el 1984 el chip de sonido AY-3-8912 en algunos modelos, el mismo chip que se incluyó de serie en 1985 en el Spectrum-128 lanzado por Investrónica, y en los modelos lanzados por Amstrad posteriormente +3 y +2.


  • Commodore 64 - El modelo más vendido de todos los tiempos, con el MOS SID


  • Vectrex con gráficos vectoriales, usaba un General Instruments AY-3-8912


  • Colecovision, con un Texas Instruments SN76489A

1983
  • Coleco Adam, con un chip TI SN76489AN de 3 voces y ruido blanco


  • MSX con un General Instrument AY-3-8910. El MSX-2 usó el Yamaha YM2149. El MSX 2+ usaba el  Yamaha YM2149 y el  YM2413 (MSX-Music). El MSX Turbo-R usaba el  Yamaha YM2149 (PSG), el Yamaha YM2413 (OPLL) (MSX-Music) y un chip PCM. Algún modelo incluyó MIDI.


  • Acorn Electron, aunque internamente dispone de 3 canales virtuales independientes, están mapeados por el único canal físico de sonido y otro de ruido blanco mediante la ULA, para mantener la compatibilidad con el BBC B.

1984
  • Apple Macintosh, sonido de un solo bit usando un PWM.


  • Amstrad CPC usando un General Instrument AY-3-8912, podían generar sonido estéreo usando los canales de sonido por separado.


  • Oric Atmos, usando un General Instrument AY-3-8912

1985
  • Atari ST, los primeros solo el YM2149F pero incorporaban dos conectores MIDI con posibilidad de manejar 16 canales. Posteriormente usaron un National LMC 1992.


  • Commodore Amiga, con el chip Paula.


  • La NES con el chip de sonido de Nintendo 2A03, un gran generador de sonido

1986
  • Sega Master System, con un  Yamaha YM2413.

1988
  • Sega Mega Drive, Yamaha YM2612 y Texas Instruments SN76489
En la segunda entrega repasaré las características de los principales chips generadores de sonido.
Jose Antonio Vaqué Urbaneja, podéis contactar conmigo en javu61@gmail.com o ver más cosas en old8bits.blogspot.com