Your MIDI controller,
now a command center.

Map notes, chords, sequences, knobs, faders, pedals, and pitch bend to keyboard shortcuts or shell commands across Linux, Windows, and macOS.

Download latest binaries
bash
$ midi-hook setup MIDI inputs: 0: Midi Through:Midi Through Port-0 14:0 1: RockJam BT MIDI:RockJam BT MIDI Bluetooth 128:0 Select MIDI input: 1 MIDI outputs for LED feedback: 0: Midi Through:Midi Through Port-0 14:0 1: RockJam BT MIDI:RockJam BT MIDI Bluetooth 128:0 Select MIDI output, or press Enter to disable: 1 Keyboards: 0: Logitech USB Keyboard (/dev/input/event20) 1: MOSART Semi. 2.4G Keyboard Mouse (/dev/input/event5) 2: AT Translated Set 2 keyboard (/dev/input/event4) Select keyboard: 1 Setup ready. Press Ctrl+C while waiting for MIDI input to quit. Use a MIDI control, or hold MIDI notes and release them all... MIDI trigger [c=unordered chord, o=ordered sequence]: o Learned MIDI trigger 52>50 Action [s=press shortcut, t=type shortcut, c=command, g=toggle command]: t Shortcut (example: ctrl+space+f4+c): ctrl+alt+f3 Captured: shortcut ctrl+alt+f3 Saved commands.conf.
$ cat commands.conf # Controller and LED feedback routing device = RockJam BT MIDI:RockJam BT MIDI Bluetooth 128:0 output = RockJam BT MIDI:RockJam BT MIDI Bluetooth 128:0 # Note & Sequence Mappings 60 = shortcut ctrl+alt+t 52>50 = shortcut ctrl+alt+f3 60+64+67 = command notify-send "C major" # Toggle Process (Start on 1st trigger, stop on 2nd) 64 = toggle spotify # Knobs, Faders & Continuous Controls cc 76 = command wpctl set-volume @DEFAULT_SINK@ {percent}% cc 75 = command brightnessctl set {percent}% pitch = command echo "pitch {value}" # Velocity Ranges 43 [vel=1..49] = command notify-send "Soft press" 43 [vel=50..127] = command notify-send "Hard press"
$ midi-hook commands.conf Using MIDI output: RockJam BT MIDI:RockJam BT MIDI Bluetooth 128:0 Using MIDI input 1: RockJam BT MIDI:RockJam BT MIDI Bluetooth 128:0 Listening on RockJam BT MIDI:RockJam BT MIDI Bluetooth 128:0. Press Enter to quit. note 67: unmapped started toggle: spotify stopped toggle: spotify
$ midi-hook setup MIDI inputs: 0: Midi Through:Midi Through Port-0 14:0 1: RockJam BT MIDI:RockJam BT MIDI Bluetooth 128:0 Select MIDI input: 1 MIDI outputs for LED feedback: 0: Midi Through:Midi Through Port-0 14:0 1: RockJam BT MIDI:RockJam BT MIDI Bluetooth 128:0 Select MIDI output, or press Enter to disable: 1 Keyboards: 0: Logitech USB Keyboard (/dev/input/event20) 1: MOSART Semi. 2.4G Keyboard Mouse (/dev/input/event5) 2: AT Translated Set 2 keyboard (/dev/input/event4) Select keyboard: 1 Setup ready. Press Ctrl+C while waiting for MIDI input to quit. Use a MIDI control, or hold MIDI notes and release them all... MIDI trigger [c=unordered chord, o=ordered sequence]: o Learned MIDI trigger 52>50 Action [s=press shortcut, t=type shortcut, c=command, g=toggle command]: t Shortcut (example: ctrl+space+f4+c): ctrl+alt+f3 Captured: shortcut ctrl+alt+f3 Saved commands.conf. $ cat commands.conf device = RockJam BT MIDI:RockJam BT MIDI Bluetooth 128:0 output = RockJam BT MIDI:RockJam BT MIDI Bluetooth 128:0 52>50 = shortcut ctrl+alt+f3 60 = shortcut ctrl+alt+t 64 = toggle spotify cc 76 = command wpctl set-volume @DEFAULT_SINK@ {percent}% $ midi-hook commands.conf Using MIDI output: RockJam BT MIDI:RockJam BT MIDI Bluetooth 128:0 Using MIDI input 1: RockJam BT MIDI:RockJam BT MIDI Bluetooth 128:0 Listening on RockJam BT MIDI:RockJam BT MIDI Bluetooth 128:0. Press Enter to quit. note 67: unmapped started toggle: spotify stopped toggle: spotify

Capabilities

Chords & Sequences

Trigger actions from single notes, unordered simultaneous chords (60+64+67), or ordered sequences (48>50>52).

Knobs, Faders & Pedals

Map CC and pitch bend controls with continuous {value} and {percent} placeholders for live volume or brightness.

Process Toggles

Start a process on the first trigger and cleanly terminate its entire process tree on the next with toggle <cmd>.

Velocity Ranges

Route soft, medium, and hard key strikes to different actions with inclusive ranges like 65 [vel=100..127].

LED Feedback

Active note mappings transmit NoteOn/NoteOff back to illuminated MIDI controllers automatically.

Held Keys & Shortcuts

Hold physical keys (like Push-to-Talk) for the exact duration of a held MIDI note, or replay complex shortcuts.

Perfect for...

Streamers & Podcasters

Turn an old MIDI keyboard or launchpad into a powerful macro board for OBS, scene switching, and soundboards.

Developers

Trigger complex build scripts, window management, or terminal commands with physical knobs and faders.

Digital Artists

Map brushes, opacity, and zoom to MIDI faders for a more tactile and fluid creative workflow in any app.

Automation

Control your smart home or system volume using pitch bend and expression pedals via shell scripts.

Platform Support

Linux

Captures via /dev/input and emits keys via kernel uinput. Includes optional systemd user service.

Windows

Direct keyboard synthesis via native Win32 SendInput API without third-party drivers.

macOS

Uses Accessibility APIs for low-latency keystroke injection and Input Monitoring for capture.