Cursillo de introducción a la informàtica musical: Windows Sound System
Windows Sound System

Autor: David García Garzón

Algunos conocimientos sobre como funciona el subsistema de áudio digital y MIDI en la plataforma Windows. Muy útiles para exprimir al máximo tus aplicaciones y tu hardware.

Indice

%(toc)s

1. Subsistema de audio

1.1. Controladores WAVE IN/OUT

Un driver o controlador WAVE es un programa residente que ofrece, al resto del sistema, acceso uniforme a un dispositivo de entrada o salida de audio digital. Puesto que la interficie que ofrecen dichos drivers es uniforme, los programas que accedan a ella funcionaran con cualquier hardware que exista por debajo de el.

Un driver ofrece al sistema tantos puertos de entrada o salida WAVE como pueda tener el dispositivo asociado.

Limitación: Existen dispositivos half-duplex en los que utilizar un puerto de entrada implica inutilizar el de salida y al contrario. Los dispositivos full-duplex son los que no tienen esta limitacion. Ojo, con algunos disposistivos que son full-duplex a costa de dividir la calidad (profundidad, canales o frecuencia) del sonido en cada dirección.

1.2. Mezcladores

Los mezcladores controlan la contribución de distintas fuentes o lineas de sonido a una linia de sonido compuesta. Entre estas linias de sonido se incluyen dispositivos WAVE IN/OUT pero no se limita a ellos como veremos ahora. Para no confundir conceptos diferenciaremos los casos de los mezcladores de entrada y los mezcladores de salida.

Mezclador de entrada: Determina la forma en que diversas fuentes de sonido contribuyen a un puerto WAVE-IN. Los sonidos de cada puerto WAVE-IN son que finalmente puede capturar la aplicación.

En el ejemplo de la derecha tenemos dos mezcladores de entrada. Cada uno controla la contribución de las línias de entrada (en amarillo) a un puerto WAVE-IN (en azul).

Nota: En la ilustración no se refleja pero una misma linia de entrada (p.e. 'Mic') podria contribuir a dos mezcladores a la vez.

Ejemplos de mezcla de entrada

Ejemplos de mezcla de salida Mezclador de salida: Determina la forma en que las fuentes de sonido contribuyen a una salida física de audio la tarjeta. Estas salidas físicas podrian ser una salida de línia, auriculares, altavoces, monitorización...

Las lineas de sonido que entran en el mezclador de salida son las cosas que querriamos poder escuchar. Algunas son generadas por las aplicaciones, como los puertos WAVE-OUT, y otras podrian ser las mismas que entraban en el mezclador de entrada.

Los mezcladores han sido durante mucho tiempo la respuesta economica para ofrecer mas fuentes de sonido sin encarecer demasiado el hardware. También han ayudado a mantener un solo modelo de programación a lo largo de sucesivas versiones de cada targeta puesto que para cualquier dispositivo de entrada siempre se leia en el mismo sitio simplemente variando los valores del mezclador.

Ahora, con los sistemas operativos basados en controladores, el problema del modelo de programación està mejor solventado. La abstracción que un controlador de un mezclador ofrece a una aplicación de audio es una série de controles (Sliders, potenciometros, monitores...) que puede ofrecer al usuario para que los modifique.

Esta abstracción permite que los mezcladores también controlen los paràmetros de los efectos analògicos o digitales que el hardware puede aplicar a las linias de sonido hasta formar la salida de éste.

Como ejemplo típico consideremos el estandard SoundBlaster 16 de Creative Labs. Las targetas SB16 tienen por lo general dos mezcladores:

El mezclador de entrada de SB16 coge las linias MIC, LINE-IN y CD, (que son los tres conectores fisicos de entrada) y la linia SINTH (que genera el sintetizador MIDI interno) y compone con ellas una linia WAVE-IN que es la que nos ofrece el driver para grabar. De esta forma podemos acceder a 4 linias mediante una sola.

El mezclador de salida de SB16, que es el mas utilizado, mezcla en la linea de salida (LINE-OUT, la que escuchamos por los altavoces) una combinacion de las linias MIC, LINE-IN, CD y SINTH de antes, y, ademas, de la linia WAVE-OUT.

1.3. Controladores 'WAVE-THRU'

Para obtener configuraciones más complejas existen en el mercado, controladores que ofrecen puertos de entrada y salida WAVE no asociados a ningun hardware. Nos permiten redireccionar el flujo WAVE OUT de un programa a un flujo WAVE IN de otro asociandolos a puertos del controlador. Bifurcarlo, mezclarlo... tanta complejidad como podamos imaginar. Eso si, tienen el coste de el incremento de la laténcia (retardo) que introduce cada THRU. Esa latencia limita mucho en aplicaciones a tiempo real.

Dos aplicaciones comunicandose con un driver Wave THRU

1.4. ACM's

No todas las fuentes de datos de audio digital estan en el mismo formato original ni todas los dispositivos de datos entienden el mismo formato. Para hacer que el sistema sea lo maximo transparente posible a este hecho, Windows utiliza el Audio Compression Manager (ACM) y los drivers ACM.

El ACM es un gestor de controladores que se instalan en el sistema que ofrecen los siguientes servicios:

Se usan en los siguientes contextos:

Se trata de unir los dos lados para que los formatos sean compatibles. Para ello:

1.5. Buffering

En salida de audio, el flujo de datos ha de ser constante con una candencia determinada por la frecuencia de muestreo. En los ordenadores actuales, la CPU se dedica simultaneamente a varias tareas, a parte de generar audio. Si el audio necesita ser mezclado por software o es fruto de algun tipo de procesado que consuma CPU, este proceso tendra que competir con el resto de tareas.

A veces al proceso generador de audio se le da mas tiempo del que necesita, y, a veces, se le da a otros procesos. Esto provoca que no siempre estemos alli para darle datos a la targeta y se puedan producir saltos y cortes. Los buffers son unas memorias que utilizamos para compensar estos picos de tiempo. Cuando tenemos la CPU, aprovechamos y llenamos el buffer generando datos de audio, mientras que no la tenemos, la targeta los va cogiendo del buffer.

Si hay mucha competencia por la CPU, puede ser que la targeta vacie todos los datos que hay en el buffer con lo que volvemos a tener saltos y cortes. Estos problemas se pueden resolver muchas veces agrandando el buffer para que quepan mas datos. Esto, a parte del consumo de memoria, tiene un problema con las aplicaciones en tiempo real, y es que un buffer introduce una latencia. Esto quiere decir que si cambiamos el valor de un parametro de un sintetizador virtual y tenemos un buffer demasiado grande en la salida, ese cambio no se oira en el momento, pues, en el buffer, ya hay datos que se calcularon sin tener en cuenta ese cambio.

El uso de Buffering en entrada tiene otro motivo similar. Se nos dan datos con candencia continua pero nuestro programa no puede estar siempre pendiente de coger los datos que se le ofrecen. Asi que esos datos se escriben en un buffer de entrada y, despues, cuando el programa tenga la CPU, processarlos.

Tambien son utiles cuando hay dos procesos en cascada que se calculan a velocidades distintas. Y van muy bien pero hay que ajustar la dimension pues cada buffer añade su latencia y los procesos en si tambien.

Otra utilidad de los buffers es el Internet Streaming, que consiste en oir audio que llega por Internet. Suele llegar a rafagas y un buffer enorme hace que las oigamos de forma continua.

2. Subsistema MIDI

2.1. Controladores MIDI

El ordenador solo ve n INs i n OUTs. Los puertos THRU que no llegan a entrar al ordenador, no se ven, no hace falta al menos que se quiera dejar al ordenador alguna capacidad de proceso sobre el MIDI THRU, y, en dicho caso, no se implementa como puerto THRU sino como uno IN y otro OUT que podemos conectar con un programa de procesado.

Cada MIDI IN representa un generador HW de MIDI. Cada MIDI OUT representa un consumidor HW de MIDI. Los generadores y consumidores SW se conectan complementariamente a estos.

Para otro tipo de interconexiones también se utilizan los drivers Thru o entradas/salidas virtuales. Es más fácil procesar puertos THRU MIDI que los 'THRU WAVE' pues la cantidad de informacion es menor y da menos latencia.

2.2. Mapes MIDI

Es la forma que tiene Windows de no complicarse la vida. Solo gestiona 16 canales MIDI que mapea a cada uno a un canal de los dispositivos MIDI disponibles. Aunque tengas 4 dispositivos con 16 canales cada uno, (total 64 canales MIDI) nada mas puedes usar 16.

El mapeador MIDI se ve como un dispositivo MIDI OUT adicional.

Mapeo en 3 niveles:

Mapa de Canal: Es una tabla con 16 entradas una para cada canal donde se indica:
- Dispositivo de destino
- Canal de destino
- Mapa de Programa (Opcional)

Mapa de Programa: Existen tantas tablas de mapeo de programa como entradas del Mapa de canales. Cada tabla tiene 128 entradas, una por programa de entrada. Cada entrada indica:
- Programa de salida
- Volumen de salida (Para compensar)
- Mapa de Voz (Opcional)

Mapa de Voz: Existen tantas tablas de mapeo de voz como entradas de los diferentes mapas de programa (16x128). Cada una tiene 128 entradas, una por voz, que indica:
- Voz de salida.
Se usan sobretodo para los Programas de percusion.

Que exista un Mapa de programa por entrada de Mapa de Canal no quiere decir que no se puedan asociar diferentes entradas del mapa de canal al mismo Mapa de Programa; lo mismo con los Mapas de Voz.

Puede haber varias configuraciones de Mapeador pero solo una activa simultàneamente.

3. DirectX

3.1. El sistema Direct X

El sistema DirectX és un añadido de Microsoft a su Windows 4.X que permite crear aplicaciones de altas prestaciones en tiempo real, saltandose algunas capas y ganando control sobre el hardware, sin perder por ello abstraccion sobre él. Se subdivide en varias areas: graficos 2D, graficos 3D, perifericos de entrada, red... y, entre ellas, las àreas que nos interesan desde el punto de vista musical: el subsistema WAVE y el subsistema MIDI llamados respectivament Direct Sound y Direct Music.

Quizas uno de los aspectos que mas marcan a este sistema és que està muy orientado a las aplicaciones de entretenimiento (Juegos) y las ventajas que se le ofrecen a los programas de música con este sistema son indirectas, pero algunas aplicaciones musicales, como el Cubase, el ModPlug Tracker... lo utilizan. Por eso nos puede interesar conocerlo un poco, sobretodo algunas caracteristicas.

3.2. Direct Sound

Objeto DirectSound

Representa un dispositivo de sonido. Encapsula lo que hay por debajo.

Buffers Primarios: Representan el audio que realmente escuchara el usuario. Es la mezcla de varios Buffers Secundarios.
- Formato de salida
- Volumen de salida

Buffers Secundarios: Representan una fuente de sonido
- Permiten controlar independientemente diversas fuente de sonido sonidos
- Estaticos o con flujo continuo
- Se intenta utilizar buffers HW como los de la AWE y la GUS (Segun el Bus)

Modos de funcionamiento
- Normal: Baja calidad.
- Prioritario: Alta calidad
- Exclusivo: Uso exclusivo cuando la aplicacion coge el focus.
- Directo a Primario: Peligroso pues el buffer es muy pequeño.

3.3. Direct Music

Controla información musical, no solo reproducción de samples.

Direct Music: Controla el reloj maestro. Crea puertos y buffers.

Cargadores: - Loaders: Cargan ficheros - Objects: Ficheros

Instruments: DM ayuda a determinar los instrumentos mediante el protocolo DLS
- Colecciones: Varios instrumentos
- Instrumentos: Un DLS simple.

Tools: Procesador MIDI.
- Tool: Un procesador simple que recibe una entrada y da una salida (el proceso lo implementa la aplicación)
- Graf: Conjunto de Tools interconectadas, participan en un Segmento o en una Performance.

Playback: Secuencian la musica.
- Performance: Controla toda la secuenciación
- Segment: Trozo de representación que se puede ciclar.
- Track: Sequencia independiente de eventos (no solo MIDI) temporizados
- Port: Representa el dispositivo MIDI (Dispositivo HW, Sintetizador SW o un extremo de un filtro)
- Buffer: Buffer de entrada o salida al puerto

Interactive Music: Genera música
- Composer: Integra todos los elementos de composición.
- Styles: Conjuntos de patterns y info de tiempo y banda (sequenciador como el Seq303).
- Motifs: Linia melodica añadida que se lanza en un momento dado.
- Personalities: Un arpegiador como el Arp808. Progresion de acordes.
- Segment: Como en Reproduccion
- Template: Segment que se reproduce con variaciones
- Transitions: Trozos que se ponene entre cambios

Synthesizer: Lo que hay detras de un puerto que no es HW
- Synthesizer: Pasa de MIDI a Wave (Soft Synth)
- Wave sink: Representa un Direct Sound a donde va a parar la salida del anterior

Grupos de canales: Extensión de MIDI, consistente en considerar hasta 65.536 grupos de 16 canales. A cada grupo de canales se le asigna un puerto. Los mensajes que no son de canal, se envian a todo el grupo de 16 canales pero solo a ese grupo. Un puerto puede tener tantos grupos de canales asignados como acepte su controlador.

DownLoadable Sounds (DLS): es un protocolo estandard de la MMA para permitir a los sintetizadores basados en Wavetable (sampling) cargar colecciones de samples. Admite regiones y envolventes de volumen ADSR.

3.4. Arquitectura de drivers de DirectX

Aun cuando Directx esta instalado en el sistema, el usuario y los programas pueden aun acceder a los drivers antiguos.

DirectX, en teoria, accede de forma mas directa y rapida al hardware. El problema es que para ello necesita que el fabricante del hardware ofrezca drivers DirectX para tu hardware. Los drivers de DirectX se llaman Hardware Abstraction Layer (HAL), ofrecen una interficie fina (pues atravesarla tiene un minimo coste en CPU) y amplia (Pues abarca muchas caracteristicas posibles en el hardware). Si dicho driver HAL no esta disponible en el sistema, lo que se hace es redireccionar las llamadas a DirectSound y DirectMusic hacia los drivers antiguos con un emulador de HAL.

Como resultado de todo esto, cuando usamos DirectX sin tener drivers DirectX para nuestra targeta, nuestros mensajes tienen que passar por un filtro mas y en vez de ir mas rapido, iremos mas lentos. La siguiente ilustración deja intuir el porque.

Relaciones internas entre DirectX y el antiguo WSS

Si no disponemos del driver HAL se utiliza el emulador de HAL que, en ultima instancia, hace el lo que haria una aplicacion que no utilizara DirectX.

El mismo problema surge con otros sistemas de drivers alternativos. Por ejemplo, Cubase utiliza un sistema propio de drivers que siguen una interficie llamada ASIO. Si el fabricante no ofrece el correspondiente driver ASIO, existe un par de drivers ASIO que utilizan los drivers DirectX o los drivers Multimedia. Con esto el diagrama anterior se complicaria con otra caja que tambien podria atacar directamente al hardware con el correspondiente driver ASIO pero que, mediante un driver ASIO especial podria atacar a la capa de DirectX o a la de DDI. Si no tenemos ni drivers ASIO ni DirectX, y utilizamos Cubase con el driver ASIO para DirectX, el sistema acaba perdiendo eficiencia pues, al final, hemos de atravesar las tres interficies.

Bibliografia, Links y Referencias

Manual realizado por Vokimon