En éste post vamos a hacer un pequeño reportaje (informal) sobre cómo podemos trabajar con MIDI en nuestra máquina GNU/Linux. Además de tener interés para el proyecto, también servirá de utilidad para aclarar muchas dudas que suele tener la gente respecto al MIDI.
Trabajo con un portátil, en el que tengo instalado Ubuntu Dapper 6.06 LTS.
Breve introducción al tema
En primer lugar, ¿por qué no podemos reproducir MIDI en GNU/Linux? Seguro que más de uno ha intentado abrir un archivo midi con el xmms, el totem, gxine o cualquier otro reproductor multimedia, con resultado negativo.
La respuesta es sencilla. En los archivos ogg, mp3, wav el sonido está codificado directamente. Por el contrario, los archivos MIDI no contienen sonido, sino información sobre cómo habría que tocar ese sonido.
Podemos pensar en una partitura. ¿Hay sonido en una partitura? Estrictamente hablando, no lo hay. Sin embargo, si tenemos un músico con su respectivo instrumento, podemos obtener sonido a partir de una partitura.
En otras palabras, necesitamos software que sea capaz de interpretar el archivo midi y obtener los sonidos correspondientes. En la práctica, se traduce en que necesitamos dos programas:
- Un secuenciador software.
- Un sintetizador software.
Quienes hayan seguido los post anteriores, ya estarán familiarizados con éstos conceptos.
El sistema de sonido utilizado actualmente en el Kernel es ALSA, el cual entre los elementos de su arquitectura, ya dispone de un secuenciador. Cito textualmente: ” La única función del secuenciador de ALSA es gestionar la entrega de eventos musicales al destino apropiado en el momento apropiado” [1]. Ni más ni menos.
El secuenciador es un subsistema de ALSA que ofrece la posibilidad de interconectar otros elementos hardware y software. Dichos elementos son emisores y/o receptores de los eventos MIDI utilizados por el secuenciador, y se denominan de forma genérica clientes.
Cada cliente posee uno o varios puertos (que pueden ser de entrada y/o salida), por los que viaja la información. Según el dispositivo, es posible que los puertos sean de sólo lectura, sólo escritura, o ambas a la vez.
Más de uno estará pensando en la arquitectura cliente / servidor. Efectivamente, esa es la idea. Existe un elemento software que centraliza la gestión de los recursos MIDI, y que posibilita su interconexión e interoperabilidad con otros recursos.
Comando pmidi
Una de las múltiples opciones existentes para reproducir un archivo midi es utilizar el comando pmidi, que lo que hace básicamente es (1) enviar los datos al secuenciador de ALSA, y (2) hacer que el secuenciador de ALSA envíe dichos datos a través del puerto especificado (página de manual).
Por ejemplo, si tenemos un sintetizador midi en el puerto 65:0, escribiríamos:
$ pmidi -p 65:0 test.mid
Como ya habíamos comentado, existe un límite de 16 canales (instrumentos) por cada puerto. Si el archivo midi en cuestión utiliza más de 16 canales, la solución es utilizar más de un puerto para poder reproducirlo íntegramente (utilizando todos los instrumentos).
Ejemplo anterior, con dos puertos.
$ pmidi -p 65:0, 65:1 test.mid
El comando pmidi nos informa de los clientes a los que nos podemos conectar en un determinado momento:
$ pmidi -l
Port Client name Port name
64:0 Rawmidi 0 - EMU10K1 MPU-401 (U EMU10K1 MPU-401 (UART)
65:0 Emu10k1 WaveTable Emu10k1 Port 0 65:1 Emu10k1 WaveTable Emu10k1 Port 1 65:2 Emu10k1 WaveTable Emu10k1 Port 2 65:3 Emu10k1 WaveTable Emu10k1 Port 3 72:0 Virtual Raw MIDI 1-0 VirMIDI 1-0 73:0 Virtual Raw MIDI 1-1 VirMIDI 1-1 74:0 Virtual Raw MIDI 1-2 VirMIDI 1-2 75:0 Virtual Raw MIDI 1-3 VirMIDI 1-3
La salida anterior ha sido obtenida de un PC con una SoundBlaster Live! El puerto 64:0 es el de una UART (Transmisor-Receptor Universal Asíncrono, mencionada en otro post), es decir, una salida externa situada en la propia tarjeta de sonido. Los puertos 65:0, 65:1, 65:2 y 65:3 se corresponden con los 64 canales de entrada (16 canales / puerto x 4 puertos) del sintetizador hardware que tiene incorporada la tarjeta (wavetable significa tabla de ondas, es un tipo de síntesis del que espero hablar en un post posterior). Los restantes puertos son puertos virtuales, de los que por el momento desconozco su utilidad.
La salida que obtengo yo (una tarjeta de sonido normalita, sin sintetizador hardware) es la siguiente:
frodo@hobbiton:~/Desktop$ pmidi -l
Port Client name Port name 62:0 Midi Through Midi Through Port-0 128:0 TiMidity TiMidity port 0 128:1 TiMidity TiMidity port 1 128:2 TiMidity TiMidity port 2 128:3 TiMidity TiMidity port 3
Aquí quiero centrar mi atención en los puertos 128:0, 128:1, 128:2 y 128:3, que se corresponden con los puertos de entrada de un sintetizador software llamado timidity. Ahora mismo se está ejecutando como demonio (programa en segundo plano), convirtiendo en sonido todos los mensajes MIDI que le lleguen por cualquiera de los puertos anteriormente mencionados (vía ALSA, por supuesto).
Por lo tanto, con el siguiente comando ya puedo escuchar un archivo MIDI:
frodo@hobbiton:~$ pmidi -p 128:0 coolin.mid
(nótese que podría haber utilizado cualquiera de los cuatro puertos anteriores, o más, si el archivo MIDI en cuestión utiliza más de 16 canales).
Incluso podría obviar el puerto:
frodo@hobbiton:~$ pmidi coolin.mid
Puesto que tengo definida la variable de entorno $ALSA_OUTPUT_PORTS:
frodo@hobbiton:~/Desktop$ echo $ALSA_OUTPUT_PORTS 128:0
En el siguiente post os hablaré sobre timidity.
Página de interés especial:
[1] Modelo Arquitectónico de Alsa, por David García Garzón

2 comentarios
Octubre 17, 2007 a las 17:09
Excelente, despues de configurar mi puerto midi, e instalar pmidi y TiMidity ya tengo funcionando mi vkeybd.
Super buen tutorial, gracias
Agosto 23, 2009 a las 15:48
muy bueno el tutorial·!·!· felicitaciones·!·!·