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 -> |1456/256|=5 
      • Byte bajo: el valor menos el byte alto por 256 -> 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

No hay comentarios:

Publicar un comentario