💾 Archived View for texto-plano.xyz › peron › articulos › sbpro.gmi captured on 2023-06-16 at 16:54:38. Gemini links have been rewritten to link to archived content

View Raw

More Information

⬅️ Previous capture (2023-01-29)

-=-=-=-=-=-=-

Programando los chips de síntesis FM de la AdLib/Sound Blaster

A mediados de 1992 me compré una placa de sonido Creative Labs Sound Blaster Pro 2 (bus ISA). Esta placa se transformó en un clásico por ser la primera para PC capaz de dar rienda suelta a sonido digitalizado en la PC (por entonces, a dos canales 44.100Khz y 8 bits).

La realidad es que a mí, mas que el sonido digitalizado (que era interesante), me movía más la síntesis aditiva de frecuencia modulada de los chips Yamaha OPL3 que traía. Gracias al chip de sonido SID de mi Commodore 64 anterior había aprendido algo de programación "dura" como para jugar con la síntesis aditiva, y haciéndolo "a lo vikingo", esto es: escribiendo en memoria directamente los parámetros de envolvente de un sintetizador con instrucciones POKE de BASIC. Un embole, pero era lo que había en los 80s (mal documentado).

La síntesis aditiva lo que hace es ir generando el sonido por medio del apilado o bucles de la señal sonora "sumada" (a diferencia de la técnica de los sintetizadores analógicos anteriores, que funcionan al revés: generás un sonido puro con un banco de uno o varios osciladores y lo ibas "restando" con etapas "filtrando", como en un sinte Moog).

Los chips Yamaha OPL de estas placas de expansión supuestamente te permitían programarlo, y si bien eran una versión mas "pobre" que los chips profesionales de los pianos Yamaha DX ochentosos, la verdad es que el hecho que "los pudieses programar en la PC" fue una de las que me hizo romper el chancho por la SoundBlaster... En esa época estaba aprendiendo algo (mas que nada, tiraba valores al puerto de comunicaciones y hacía cosas con controladores), se me ocurrió investigar la SB-Pro2.

Lo que sucedió fue mas o menos decepcionante. Habiendo "atravesado el desierto" con la experiencia con el poquísimo documentado SID, ni se imaginan lo que eran los OPL de Yamaha, los chips de FM de la SoundBlaster: menos documentación aún (hoy todos los manuales de los chips están en internet, por entonces nadie sabía cómo se "manejaba" el bicho).

Pero la fui "desculando". El milagro es el siguiente: revolviendo diskettes viejos, encontré el texto de apunte que hice sobre los REGISTROS DE LA PLACA SOUNDBLASTER (también sirven para Adlib), con notas sobre lo que en ese momento era el Creative Labs SDK, para DOS.

(naturalmente nunca escribí ningún driver ni hice ninguna aplicación, pero si pude hacer secuencias de notas y pavear con el sonido. Poder controlar la SB con ensamblador A86 me gustó!).

Introducción

Este documento está pensado para servir como una fuente LIBRE de información para programadores sobre cómo controlar estas placas de sonido usando control pelado por bus ISA.

La información contenida en este documento es una combinación de información encontrada en el Kit de Desarrollo de Software de Sound Blaster, y la que fui sacando por ingeniería inversa. Como tengo una SBPro2, algunas cosas podrían no ser válidas para las placas AdLib.

Los números sufijados con h están en hexadecimal a no ser que se lo indique. Si el número está escrito, es decimal.

CAPITULO 1: Entrada/Salida de la Placa de Sonido

La placa de sonido se programa enviando datos a sus registros internos a través de sus dos puertos de E/S del Bus ISA de la PC. Normalmente estos datos hacen a notas cruzadas con dos timers que tienen los chips Yamaha OPL, pero hay muchos registros de control para dar forma al sonido.

Las direcciones de Bus ISA que se usan por defecto son:

0388h - Dirección/puerto de status (R/W)

0389h - Puerto de datos (W/O)

La SoundBlaster Pro es capaz de producir música FM en estéreo, la cual se accede exactamente de esta misma manera: los puertos 0220h y 0221h son las direcciones/puerto de datos para el parlante izquierdo, y los puertos 0222h y 0223h lo son para el parlante derecho. Los puertos 0388h y 0389h en tanto, hacen que emitan los dos (considerado defecto para la AdLib, que es mono).

(opcionalmente se pueden usar puerto 0240h para evitar conflicto en el bus).

La placa de sonido dispone de un array de control de doscientos cuarenta y cuatro registros; para escribir en un registro particular, se envía el número de registro (01-F1) al puerto de dirección que queremos escribir, y a continuación el valor que queremos escribir al puerto de datos.

RETRASO PARA PROGRAMARLA:

La placa de sonido NO RESPONDE INSTANTÁNEAMENTE. Para que "tome" el cambio, luego de ESCRIBIR en el puerto de registro debemos aguardar 12 ciclos de reloj antes de enviarle los datos al puerto de datos; una vez escrito el valor de datos, debemos dejar pasar 84 ciclos antes de la siguiente operación. De lo contrario el bus del chip Yamaha "se embota" y hace ruido.

El manual de la AdLib informa este tiempo de espera en microsegundos: 3,3 microsegundos para la dirección, y 23 microsegundos para los datos.

El método más preciso para producir este retraso reqauerido es producir la lectura del puerto de registro 6 veces (cada operación de lectura son 2 ciclos de reloj), y luego producir la escritura en el puerto de registro, y luego de ello leer el puerto de registro 35 veces (cada una lleva 2.4 ciclos de reloj)

Los registros de la placa de sonido son de SOLO ESCRITURA.

La Dirección de puerto ISA de la placa de sonido tiene función DOBLE: también opera como un bytes de status de la placa de sonido. Para leer la dirección en modo "Status de la placa de sonido", LEEMOS el puerto 388h. El byte de status cuenta con la siguiente estructura:

              7      6      5      4      3      2      1      0
          +------+------+------+------+------+------+------+------+
          | ambos| timer| timer|             sin usar             |
          |timers|  1   |  2   |                                  |
          +------+------+------+------+------+------+------+------+

Bit 7 - Es 1 si cualquiera de los timers ha expirado.

6 - Es 1 si el timer1 ha expirado.

5 - Es 1 si el timer2 ha expirado.

CAPITULO 2: LOS REGISTROS

La siguiente tabla indica la función de cada registro de la placa de sonido. Los registros se explican luego de la tabla. Los registros no listados no tienen uso.

 Dirección      Función
 ---------      ----------------------------------------------------
     01         Test LSI / Activa control de forma de onda
     02         Datos de Timer1
     03         Datos de Timer2
     04         Flags de control del Timer
     08         Modo de síntesis de habla / Selección de nota de división de teclado
   20..35       Modulación del amplificador / Vibrato / Tipo de EG / Escala de tecla / Multiple
   40..55       Nivel de escala de nota / Nivel de salida del Operador
   60..75       Nivel de Ataque / Nivel de Decaimiento
   80..95       Nivel de Sustain / Velocidad del Release
   A0..A8       Frequencia (8 bits inferiores)
   B0..B8       Key On / Octava / Frequencia (2 bits superiores)
     BD         Intensidad de amplitud modulada / Intensidad de vibrato / Control de ritmo
   C0..C8       Fuerza de la retroalimentaciñón / Tipo de conexión
   E0..F5       Selecciona la forma de onda

En la terminología del chip sintetizador Yamaha, sus osciladores programables reciben el nombre de "Operadores", y las voces reciben el nombre de "Canal". El OPL2 de la AdLib y la SoundBlaster tiene 4 osciladores programables.

El agrupamiento de los veintidós registros (20-35, 40-55, etc.) tienen un orden raro porque usan dos operadores para cada voz de Frecuencia Modulada. Las diferencias en cada agrupamiento de registros para cada operador se indican en hexadecimal en la siguiente tabla:

   Canal          1   2   3   4   5   6   7   8   9
   Operador1     00  01  02  08  09  0A  10  11  12
   Operador2     03  04  05  0B  0C  0D  13  14  15

Por ejemplo, las direcciones de los bytes de ataque/decaimiento para el Canal 3 es 62 para el Operador1, y 65 para el Operador2. (la dirección del Operador2 siempre es la dirección del Operador1 mas tres).

Para ilustrar esta relación, tomando como ejemplo el canal 5, sus direcciones de control serían:

    29 - Operador 1  AM/VIB/EG/IET/Múltiplo
    2C - Operador 2  AM/VIB/EG/IET/Múltiplo
    49 - Operador 1  KSL/Nivel de salida
    4C - Operador 2  KSL/Nivel de salida
    69 - Operador 1  Ataque/Decaimiento
    6C - Operador 2  Ataque/Decaimiento
    89 - Operador 1  Sustain/Release
    8C - Operador 2  Sustain/Release
    A4 -             Frequencia (8 bits inferiores)
    B4 -             Tecla On/Octava/Frequencia (2 bits superiores)
    C4 -             Retroalimentación/Tipo de Conexión
    E9 - Operador 1  Forma de onda
    EC - Operador 2  Forma de onda

Capítulo 3: Explicación de Registros

Byte 01 - Test LSI/Inicializador

Este byte se utiliza normalmente para TESTEAR el dispositivo LSI. Todos sus bits normalmente deberían ser 0. Si pongo en 1 el bit 5, puedo activar el modo CONTROL para la forma de onda de cada operador de los chips de FM.

             7     6     5     4     3     2     1     0
          +-----+-----+-----+-----+-----+-----+-----+-----+
          | sin usar  | WS  |          sin usar           |
          +-----+-----+-----+-----+-----+-----+-----+-----+

Byte 02 - Datos de Timer1.

Si el timer1 está activo, el valor de este registro se incrementará hasta desbordar. Cuando desborde, la placa de sonido enviará una señar INT 08 ("Interrupción de TIMER"), y pondrá en 1 los bits 8 y 6 correspondientes a su byte de status. El valor para este timer se incrementa cada 88 microsegundos.

Byte 03 - Datos del Timer2.

Si el timer2 está activo, el valor de este registro se incrementará hasta desbordar. Cuando desborde, la placa de sonido enviará una señar INT 08 ("Interrupción de TIMER"), y pondrá en 1 los bits 7 y 5 correspondientes a su byte de status. El valor para este timer se incrementa cada 320 microsegundos.

Nota: Los 2 timers son útiles para registrar eventos musicales. Timer1 es más rápido y viene bien para controlar los parámetros de síntesis a nivel eventos, mientras que el timer2 es más lento y viene bien para las notas.

Byte 04 - Byte de Control del Timer

        7     6     5     4     3     2     1     0
     +-----+-----+-----+-----+-----+-----+-----+-----+
     | IRQ | T1  | T2  |    sin usar     | CTL | CTL |
     | RST | MSK | MSK |                 | T2  | T1  |
     +-----+-----+-----+-----+-----+-----+-----+-----+

bit 7 - Resetea los flags para timer1 y 2. Si está en 1, los demás bits se ignoran.

bit 6 - Enmascara Timer1. Si está en 1, se ignora el bit 0.

bit 5 - Enmascara Timer2. Si está en 1, se ignora el bit 1.

bit 1 - Cuando está en 0, el Timer2 no opera.

Cuando está en 1, el valor del byte 03 se carga en el timer2, y comienza el incremento.

bit 0 - Cuando está en 0, el Timer1 no operae.

Cuando está en 1, el valor del byte 02 se carga en el timer1, y comienza el incremento.

Byte 08 - Modo CSM / División de Teclado.

El modo sintesis de voz compuesto CSM desacopla los osciladores y permite hacer síntesis del habla (texto a voz) a través del chip sintetizador. La división del teclado divide entre una voz y otra a lo largo de las escalas, en un punto dado (como los teclados yamaha).

        7     6     5     4     3     2     1     0
     +-----+-----+-----+-----+-----+-----+-----+-----+
     | Sel | Div |              Sin uso              |
     | CSM | Tecl|                                   |
     +-----+-----+-----+-----+-----+-----+-----+-----+

bit 7 - Si está en 1, selecciona el modo Síntesis de Voz Compuesto de onda sinusoidal (todos los bits TECLA-ON deben estar en 0). Cuando está en 0, selecciona el modo Música FM.

bit 6 - Selecciona el punto de división de teclado (en conjunto con los datos del Número F). La documentación en el manual Sound Blaster es incomprensible en esto.

Bytes 20-35 - Modulación de Amplitud / Vibrato / Tipo de Generador de Envolvente / Indice de Escala del Teclado ("IET") / Múltiplo de frecuencia del Modulador

        7     6     5     4     3     2     1     0
     +-----+-----+-----+-----+-----+-----+-----+-----+
     | Mod | Vib | Tipo| IET |       Múltiplo de     |
     | Amp |     | GE  |     | Frecuencia Modulador  |
     +-----+-----+-----+-----+-----+-----+-----+-----+

bit 7 - Cuando está en 1 aplica modulación de amplitud; La profundidad de la AM se controla por el flag AM-Depth en la dirección BD.

bit 6 - Con 1 aplica vibrato; la intensidad del vibrato se controla con el flag Vib-Depth en la dirección BD.

bit 5 - Con 1, se mantiene el nivel de sustain de la voz hasta que se suelta la tecla; en 0, el sonido comienza a decaer inmediatamente luego de alcanzar la fase de SUSTAIN.

bit 4 - Indice de Escala de Teclado (IET). Este es otro bit incomprensible del manual SoundBlaster. Por experiencia, si está en 1, la envolvente del sonido se acorta, como si subiera en tono.

bits 3-0 - Estos bits indican a qué "octavador", o armónico producirá el Operador con respecto al tono en ejecución (o modulación de él), en relación con la frecuencia específicada de la voz:

                      0 - una octava por debajo
                      1 - En la misma freciencia de la voz
                      2 - Una octava por encima
                      3 - Una octava y una quinta por encima
                      4 - Dos octavas por encima
                      5 - dos octavas y una tercera mayor por encima
                      6 - dos octavas y una quinta por encima
                      7 - dos octavas un una séptima menor por encima
                      8 - Tres octavas por encima
                      9 - Tres octavas y una segunda mayor por encima
                      A - Tres octavas y una tercera mayor por encima
                      B -  "       "     "  "   "     "     "
                      C - Tres octavas y una quinta por encima
                      D -   "      "     "  "   "     "
                      E - Tres octavas y una séptima mayor por encima
                      F -   "      "     "  "   "      "      "

Bytes 40-55 - Escalado de Nivel de Nota / Nivel total

        7     6     5     4     3     2     1     0
     +-----+-----+-----+-----+-----+-----+-----+-----+
     |  Nivel de |             Nivel Total           |
     |   Escala  | 24    12     6     3    1.5   .75 | <-- dB
     +-----+-----+-----+-----+-----+-----+-----+-----+

bits 7-6 - Hace que los niveles de salida disminuyan en la medida que la frecuencia aumenta:

00 - Sin cambio

10 - 1.5 dB/8va

01 - 3 dB/8va

11 - 6 dB/8va

bits 5-0 - Controla el nivel de salida total del operador. Si todos los bits están en 9 es el más fuerte; si todos los bits están en 1 es el más bajo. No se entiende porqué (es un filtro?).

CONTROLES DE ENVOLVENTE:

Bytes 60-75 - Velocidad de Ataque / Velocidad de Decaimiento

Ataque es la velocidad en la cual la nota pulsada se peralta para llegar a su máxima intensidad sonora. El decaimiento es la velocidad en la cual la intensidad de la nota pulsada decae a cero (inaudible).

        7     6     5     4     3     2     1     0
     +-----+-----+-----+-----+-----+-----+-----+-----+
     |         Velocida      |      Velocidad        |
     |          Ataque       |         Decay         |
     +-----+-----+-----+-----+-----+-----+-----+-----+

bits 7-4 - Velocidad de ataque. 0 es la más lenta, F la más rápida.

bits 3-0 - Velocidad de decaimiento. 0 es la más lenta, F la más rápida.

Bytes 80-95 - Nivel de Sustain / Velocidad de Release

El sustain es la duración del sonido. La velocidad de Release describe el tiempo que lleva a la nota disminuir a cero tras soltar la tecla ("amortiguación del sonido").

        7     6     5     4     3     2     1     0
     +-----+-----+-----+-----+-----+-----+-----+-----+
     |     Nivel de Sustain  |       Velocidad       |
     | 24    12     6     3  |        Release        |
     +-----+-----+-----+-----+-----+-----+-----+-----+

bits 7-4 - Nivel de Sustain. 0 es el más fuerte, F es el más bajo.

bits 3-0 - Velocidad de Release. 0 es la más lenta, F la más rápida.

CONTROL TONAL:

Bytes A0-B8 - Octava / Número F / Tecla-On

La información de la nota cuenta con un indicador llamado "Número F", un hexadecimal que hace a la frecuencia de la nota, y a un registro Tecla-ON que indica si la nota definida está pulsada o no, y en qué octava del piano.

        7     6     5     4     3     2     1     0
     +-----+-----+-----+-----+-----+-----+-----+-----+
     |       Número F (byte menos significativo)     |  (A0-A8)
     |                                               |
     +-----+-----+-----+-----+-----+-----+-----+-----+

        7     6     5     4     3     2     1     0
     +-----+-----+-----+-----+-----+-----+-----+-----+
     | Sin uso   |Tecla|    Octava       | Número F  |  (B0-B8)
     |           | On  |                 |   MSB.    |
     +-----+-----+-----+-----+-----+-----+-----+-----+

bit 5 - Cuando está en 1 el canal suena, y en 0 está muteado.

bits 4-2 - Octava (0-7). 0 es la más baja, 7 a más alta.

bits 1-0 - MSB del Número F.

Tomando la 4ta. octava, los valores de Número F correspondientes a su escala cromática serían los siguientes:

        Número F     Frequencia     Nota
           16B          277.2       C#
           181          293.7       D
           198          311.1       D#
           1B0          329.6       E
           1CA          349.2       F
           1E5          370.0       F#
           202          392.0       G
           220          415.3       G#
           241          440.0       A
           263          466.2       A#
           287          493.9       B
           2AE          523.3       C

Bytes C0-C8 - Retroalimentación / Algoritmo

El Yamaha OPL puede retroalimentar su señal mono de forma variable, para hacer un sonido mas dulzarrón o recalcitrante. Tiene dos algoritmos para hacerlo.

        7     6     5     4     3     2     1     0
     +-----+-----+-----+-----+-----+-----+-----+-----+
     |        sin usar       |Retroalimentación| Alg |
     |                       |                 |     |
     +-----+-----+-----+-----+-----+-----+-----+-----+

bits 3-1 - Fuerza de la retroalimentación (sonido recalcitrante). Si los tres bits están en 0, no hay retroalimientación. Si los valores valores van de 1-7 el Operador1 se buclea, retroalimentándose con un porcentaje de su salida. 1 es la cantidad de retroalimentación mínima, 7 la máxima.

bit 0 - Si es 1, el Operador1 modulará al Operador2. En tal caso, sólo el Operador2 producirá sonido. Si se deja en 0, ambos operadores producen sonido directamente (sonido dulzarrón). Se pueden crear sonidos complejos más fácil si el algoritmo se deja en 0.

Byte BD - Cantidad de la Modulación de Amplitud / Cantidad de Vibrato / Ritmo

La modulación permite alterar el sonido de la portadora (la señal del Oscilador programable u operador). El vibrato permite hacer un sonido vibratorio. En el Yamaha OPL ambos valores sólo son programables en dos configuraciones de velocidad generales. En tanto, el modo rítmico utiliza 6 sonidos percusivos sintetizados, a expensas de utilizar tres de los nueve canales del operador.

        7     6     5     4     3     2     1     0
     +-----+-----+-----+-----+-----+-----+-----+-----+
     | AM  | Vib | Rit | BMB | RDB | TOM | Plat| HH  |
     | Prof| Prof| Ena |     |     |     | Cimb|     |
     +-----+-----+-----+-----+-----+-----+-----+-----+

bit 7 - En 0: Cantidad de AM a 1 dB

En 1: Cantidad de AM a 4.8dB

bit 6 - En 0: Cantidad de Vibrato a 7 céntimos

En 1: Cantidad de Vibrato a 14 céntimos

bit 5 - En 0: Modo Ritmo inactivo (deja 9 voces melódicas)

En 1: Modo Ritmo activo (deja 6 voces melódicas)

bit 4 - Bombo on/off

bit 3 - Redoblante on/off

bit 2 - Toms on/off

bit 1 - Platillo on/off

bit 0 - Hi-hat on/off

Nota: Los registros NOTA-ON para los canales 06, 07, y 08 deben estar en OFF para poder usar la sección rítmica. Otros parámetros tales como Ataque/Decaimiento/Sustain/Release también deben configurarse apropiadamente en 0.

Bytes E0-F5 - Selección de forma de onda

        7     6     5     4     3     2     1     0
     +-----+-----+-----+-----+-----+-----+-----+-----+
     |               sin uso             |  Selector |
     |                                   |FormaDeOnda|
     +-----+-----+-----+-----+-----+-----+-----+-----+

bits 1-0 - El bit 5 de la Dirección 01 permite seleccionar la forma de onda del operador. Esta se modulará de acuerdo a una gráfica de forma de onda definida por estos dos bits.

        Sinusoide         Cuadrada      Triangular       Diente de Sierra

         ___              ___            ___    ___       _      _
        /   \            /   \          /   \  /   \     / |    / |
       /_____\_______   /_____\_____   /_____\/_____\   /__|___/__|___
              \     /
               \___/

            00              01               10               11

Como Detectar presencia de la placa de sonido en el bus ISA:

De acuerdo al manual de la AdLib, la forma "oficial" de revisar la existencia de una placa de sonido son los siguientes 9 pasos:

1) Escribir 60h en el registro 4 para resetear ambos timers.

2) Escribir 80h en el registro 4 para activar los interruptores (en un paso separado al paso 1).

3) Leer el registro de status (puerto 388h). Almacenar el resultado.

4) Escribir FFh en el registro 2 (timer1).

5) Escribir 21h en el registro 4 para disparar el timer1.

6) Esperar por al menos 80 microsegundos.

7) Leer el registro de status (puerto 388h). Almacenar el resultado.

8) Resetear ambos timers e interruptores (ver paso 1 y 2).

9) Testear los resultados almacenados en los pasos 3 y 7 sumándolos con E0h. Si resultado en el paso 3 es 00h, y el resultado en el paso 7 es C0h son correctos, se determina que en la computadora existe una placa de sonido compatible con AdLib.

Hacer un sonido

Primero, reseteamos todos los registros poniendolos a todos en 0 (este es el método no oficial, para resetear el estado de la placa de sonido, pero funciona). Si queremos usar formas de onda diferentes, ponemos en 1 el bit 5 del registro 1 (este reseteo se hace solo una vez, al iniciar el programa, y opcionalmente al salir del programa, para asegurarnos que el programa no deje "notas trabadas" al salir).

Ponemos los siguientes registros con los valores indicados:

     REGISTRO     VALOR     DESCRIPCION
        20          01      Pone el múltiplo del modulador en 1
        40          10      Pone el nivel del modulador en aprox. 40 dB
        60          F0      Ataque del modulador: rápido;  decaimiento: largo
        80          77      Sustain del modulador: medio;  release: medio
        A0          98      Pone el LSB de frecuencia de voz (nota D#)
        23          01      Pone el múltiplo de portadora en 1
        43          00      Pone la portadora al máximo volúmen (47 dB aprox)
        63          F0      Ataque de portadora: rápido;  decaimiento: largo
        83          77      Sostenimiento de la portadora: medio;  release: medio
        B0          31      Enciende la voz; pone el MSB de la octava y frecuencia

Para apagar el canal, se pone el registro B0h en 11h (o en cualquier otro valor que ponga en 0 al bit 5). Generalmente es preferible inducir un retraso antes de hacerlo.