22 noviembre, 2008

Teclado MIDI en Linux

Hace unos años compré este teclado MIDI (MK-3701) en ebay. Es un teclado puramente MIDI, no tiene altavoz ni genera sonido alguno. Para utilizarlo es imprescindible conectarlo a un puerto MIDI como el que tenían las tarjetas de sonido antiguas.
Por otro lado tengo un PC viejo con una tarjeta de sonido Avance Logic ALS120 (semi-compatible con Sound Blaster 16).


  • La primera opción era conectar directamente el teclado al sintetizador OPL3 de la tarjeta (mediante rosegarden). Pero por alguna razón no me funciona.
  • La segunda opción era usar un sintetizador software (timidity) y utilizar la salida PCM. El problema es el uso de CPU (es un PC que tiene bus ISA...) y la calidad de sonido (esta tarjeta parece funcionar en 8 bits).
  • La opción que me da mejor resultado es usar mi flamante portátil para sintetizar el sonido. Para ello tengo que enviar el protocolo MIDI por la red (al principio probé con rosegarden y multimidicast).
La forma más sencilla y eficiente de enviar los eventos MIDI por la red es usar las herramientas de ALSA:

Primero ejecuto esto en el PC antiguo que tiene el teclado:
aseqnet &       # Lanzar el servidor MIDI en red
aseqdump -l # Listar los dispositivos disponibles (16:0 Avance Logic, 128:0 Net Client)
aconnect 16:0 128:0 # Conectar la entrada del teclado al servidor MIDI.

A continuación ejecuto esto en el portátil:
aseqnet 192.168.1.10 &      # Conectar a la IP del servidor MIDI
timidity -iA -Os1 -B 2,3 & # Lanzar el sintetizador software (Fijarse que le asigna el nº 128:0)
aseqdump -l # Listar los dispositivos disponibles (129:0 Net Client)
aconnect 128:0 129:0 # Conectar el cliente MIDI con el sintetizador

Tras esto ya puedo tocar el piano con baja latencia y alta calidad de sonido.

Si algo falla lo primero es comprobar que el sonido se esté enviando por la red: ejecutar ambos comandos aseqnet y medir el tráfico en la red al pusar las teclas (debe subir a ~1 KB/s).