Usando controlador midi AKAI MPK mini mk3 en OpenBSD

2022/07/05

Se intenta utilizar un controlador midi AKAI MPK mini mk3 en OpenBSD 7.1 (-current).

Detección

Se busca verificar que el teclado funciona con OpenBSD, o sea, que es detectado por el kernel.

Para ello se enchufa el teclado y se usa dmesg para ver si el kernel generó algún evento:

$ dmesg
...
uhidev0 at uhub0 port 1 configuration 1 interface 0 "AKAI MPK mini 3" rev 2.00/2.00 addr 5
uhidev0: iclass 3/0
uhid0 at uhidev0: input=32, output=32, feature=0
umidi0 at uhub0 port 1 configuration 1 interface 2 "AKAI MPK mini 3" rev 2.00/2.00 addr 5
umidi0: (genuine USB-MIDI)
umidi0: out=1, in=1
midi0 at umidi0: <USB MIDI I/F>
ugen2 at uhub0 port 1 configuration 1 "AKAI MPK mini 3" rev 2.00/2.00 addr

De la salida anterior vemos que reconoce una interfaz umidi y midi.

Buscando en las páginas del manual se encuentra:

Para leer información del controlador midi revisamos primero los permisos del dispositivo, que por la salida de dmesg sabemos que es umidi0:

$ ls -lh /dev/rmidi0
crw-rw----  1 root  _sndiop   52,   0 Jun 28 08:41 /dev/rmidi0

Verificando los permisos con groups se encuentra que el usuario no tiene permisos para acceder al dispositivo. Esto se soluciona agregando al usuario al grupo _sndiop:

$ doas usermod -G _sndiop jmpc

Aquí hay que abrir una nueva sesión, por ejemplo, haciendo login en una terminal y verificar que en la lista de grupos esta _sndiop.

Una vez que tenemos los permisos probamos leer el dispositivo y presionar algunas teclas del controlador:

$ cat -u /dev/rmidi0 | hexdump -v -e '/1 "%02X\n"'
90
30
50
80
30
00
99
2A
69
89
2A
00
B0
4A
07
B0
4A
08

También se puede utilizar midicat(1):

$ midicat -d -i /dev/rmidi0
96 3e 37
86 3e 00
96 3e 32
86 3e 00
96 3e 30
86 3e 00

con lo que ya comprobamos que OpenBSD recibe información del controlador.

Uso - fluidsynth

Una característica de un controlador midi es que este solo genera eventos, los que luego deben ser procesados por otro sistema para que se genere el sonido.

Se elegirá fluidsynth para que sintetice el sonido y un conjunto de soundfonts disponibles en el sistema:

$ doas pkg_add fluidsynth generaluser-gs-soundfont

Siguiendo las indicaciones en la wiki de fluidsynth, probamos usar una soundfont con un archivo midi. Por suerte podemos encontrar todo esto en el contenido del paquete generaluser-gs-soundfont:

$ fluidsynth /usr/local/share/generaluser-gs/GeneralUser_GS.sf2 /usr/local/share/examples/generaluser-gs/GUTest.mid

Ahora nos queda “enganchar” el teclado midi a fluidsynth. Esto lo hacemos siguiendo en la FAQ Multimedia de OpenBSD la indicación del uso de instrumentos midi.

Se ejecuta en una consola fluidsynth:

$ fluidsynth /usr/local/share/generaluser-gs/GeneralUser_GS.sf2

y en otra consola se utiliza midicat(1) para enviar los eventos desde midi/0 (el controlador) hacia midithru/0 (ver sndio(7)):

$ midicat -q midi/0 -q midithru/0

Con esto al presionar las teclas del controlador midi ya podemos escuchar notas.

Para utilizar directamente midi/0 en lugar de midithru/0 creada por defecto por sndio:

$ fluidsynth -o midi.sndio.device=midi/0 /usr/local/share/generaluser-gs/GeneralUser_GS.sf2

Uso - qsynth

Una alternativa a usar fluidsynth es utilizar la interfaz gráfica qsynth:

$ doas pkg_add qsynth

Al ejecutar la aplicación ir a Setup y:

Uso - lmms

Ya envalentonados vamos por todas… lmms.

Para instalar:

$ doas pkg_add lmms zynaddsubfx

Al ejecutar lmms por primera vez se elige sndio MIDI en MIDI Settings y se vuelve a reiniciar el programa para que se tomen los settings.

Para probar que funcionara el teclado seguí el video software - LMMS - recording your MIDI device (im using a MIDI keyboard) que pude reproducir y obtener los sonidos del teclado.

Nota: hay que ejecutar en otra consola

$ midicat -q midi/0 -q midithru/0

para que lmms reciba los eventos midi.

Conclusiones