💾 Archived View for texto-plano.xyz › peron › articulos › sbpro.gmi captured on 2023-09-08 at 16:24:06. Gemini links have been rewritten to link to archived content
⬅️ Previous capture (2023-01-29)
-=-=-=-=-=-=-
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ó!).
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.
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.
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.
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
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 | +-----+-----+-----+-----+-----+-----+-----+-----+
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.
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.
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.
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.
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 - " " " " " " "
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?).
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.
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:
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.
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
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.
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.