Translating MIDI input into computer keystrokes on Linux?

This cannot be done without some programming.

First, test how to detect MIDI events. Go to a terminal, and run aseqdump -l to list the MIDI ports; this outputs something like this:

$ aseqdump -l
 Port    Client name                      Port name
  0:0    System                           Timer
  0:1    System                           Announce
 14:0    Midi Through                     Midi Through Port-0
 24:0    Xonar D2                         Xonar D2 MIDI
 32:0    Yamaha DS-1E (YMF754)            Yamaha DS-1E (YMF754) MIDI

Then run it with the client name to check whether events arrive:

$ aseqdump -p "Xonar D2"
Waiting for data. Press Ctrl+C to end.
Source  Event                  Ch  Data
 24:0   Note on                 0, note 64, velocity 86
 24:0   Note on                 0, note 48, velocity 80
 24:0   Note off                0, note 48
 24:0   Note on                 0, note 68, velocity 84
 24:0   Note on                 0, note 52, velocity 88
 24:0   Note off                0, note 64
 24:0   Note off                0, note 52
 24:0   Note off                0, note 68
...

Second, to simulate key strokes, you need xdotool. If you do not yet have it installed, run sudo apt-get install xdotool. You can use type to type text, or key to simulate special keys:

xdotool type Hello, World!
xdotool key ctrl+p

Please note that not all special keys are handled correctly by xdotool. And Ctrl+Alt+Del is handled very specially by the kernel and probably does not work when simulated; try running sudo reset instead of xdotool.

Finally, tie everything together with a script. Put this into a text file, for example, ~/bin/midi-to-keys:

#!/bin/bash
aseqdump -p "Xonar D2" | \
while IFS=" ," read src ev1 ev2 ch label1 data1 label2 data2 rest; do
    case "$ev1 $ev2 $data1" in
        "Note on 64" ) xdotool type hello ;;
        "Note on 48" ) xdotool key ctrl+j ;;
    esac
done

Make it executable (chmod +x ~/bin/midi-to-keys), and run it (~/bin/midi-to-keys). Now, pressing E-5 or C-4 should have some effect.

Change or add lines of the form "Note on x" ) command ;; to do whatever you want.


I had a similar problem so I programmed up something that suits my requirements.

https://gitlab.com/enetheru/midi2input

Runs in linux and uses the x windows system for keyboard and mouse input events.

It uses lua for configuration and mapping, can perform any action as your user. has detection on what window is active using the X_CLASS attribute so you can make different mappings for whatever application is currently running.

Automatically reloads the configuration so you don't have to close and re-open it all the time.

i've written a simple udev rule to create the midi connections when i plug in my controller.

There is even an archlinux PKGBUILD for archlinux, i just havent added it to the aur.

The idea was to remove all of the pain points in making mappings from the mid controller to anything I want.

It's been a few years since I built it out, and I use it every day, I pay attention to the repo, but there has only been one or two people ever email me about it.