Miditech keyboard with linux

Got a “Garagekey mini” usb midi keyboard of miditech for ~300 nis. It doesn’t google well, but surprisingly alsa wise worked out of the box. My only complaint is that occasionally it will stop producing output (aseqdump -p 20 will produce nothing), solvable by disconnecting and reconnecting the device.

Next I wanted to get a working keyboard automatically after connecting it to my laptop. This turned out to be more complex then I thought. Problems included:

1. (not a problem, just a not very optimal thing) have to edit udev as root to respond to insertion events:

$ cat /etc/udev/rules.d/99-miditech-garagekey.rules
ACTION==”add”, ATTR{idVendor}==”1acc”, ATTR{idProduct}==”1a0f”, RUN+=”/home/alon/bin/miditech”

2. jackd is not actually a daemon, and my feeble understanding of dbus resulted in having to run it with DISPLAY set

3. (not absolutely neccessary) had to setup jackd to run as alon, reading /usr/share/doc/jack-audio-connection-kit-1.9.9.5/README.Fedora and following the instructions to add myself to jackusr group. Edited /etc/security/limits anyway. Currently jackd complains it cannot lock enough memory but it doesn’t seem to bother it (no hickups). It does get realtime scheduling (doesn’t complain).

4. Ran everything under tmux as my daemnizer. Lame. But works, and also got a gnome-terminal for debugging:

(ugly sleeps for debugging)
$ cat ~/bin/miditech

#!/bin/bash

INSTRUMENT=”/usr/share/zynaddsubfx/banks/SynthPiano/0033-Analog Piano 1.xiz”
export DISPLAY=:0.0

if [ $UID == 0 ]; then
su alon -c “tmux new-session -d -s miditech ~alon/bin/miditech”
su alon -c “gnome-terminal -e ‘tmux attach -t miditech'”
exit 0
fi

tries=1
while [ “x`pgrep jackd`” == “x” ]; do
if [ $tries -gt 5 ]; then
echo failed to launch jackd
sleep 10000
exit
fi
jackd -T -ndefault -dalsa -dhw:0 -r48000 -p1024 -n2 &
sleep 2
tries=$((tries+1))
done
sleep 4
if [ x`pgrep zynaddsubfx` == x ]; then
zynaddsubfx -L “$INSTRUMENT” -e $0.zynaddsubfx.init &
else
aconnect 20 128
fi
sleep 1000

#

$ cat ~/bin/miditech.zynaddsubfx.init
#!/bin/bash
jack_connect zynaddsubfx:out_1 system:playback_1
jack_connect zynaddsubfx:out_2 system:playback_2
# aconnect numbers are constant? seem to be
aconnect 20 128

5. (note) to attach from within tmux: (unset TMUX; tmux attach-session -t miditech)

6. determining when jack is ready is annoying. no systemd file either (tried – failed with a dbus error, need to look at that / bug some devel). could use systemd approach of checking for a socket (how would I check for a socket being available? need to lookup what systemd actually does. netstat polling is ugly).

Leave a Reply