MIDI Bridge
Back in March I built MIDI Bridge: a terminal UI for routing and transforming MIDI messages between devices. Glue software that exists because two pieces of hardware I own refuse to speak the same dialect.
The problem
I have a Behringer FCB-1010 foot controller and a Boss RC-505 mkII loop station. I want to stomp a pedal and have a loop track start or stop, hands-free, like a civilized person.
The FCB-1010 mostly sends Program Change messages. The RC-505 wants Control Change messages, and for play/stop it wants a momentary press: a CC at value 127 followed shortly by the same CC at value 0, like a button pushed and released. Neither device can be talked out of its position. The eternal condition of MIDI hardware: everything is technically compatible and nothing actually works together.
So: a translator in the middle. Catch “Program Change 5 on channel 1”, emit “CC 64, value 127”, wait 100 milliseconds, emit “CC 64, value 0”. Multiply by every track’s play and stop, and you have my config file.
What it is
MIDI Bridge is a Python TUI built on Textual, with mido and rtmidi underneath. Three panes: your devices, your mappings, and a live MIDI monitor showing every message in and out, color-coded, with matched mappings flagged.

Mappings are defined in a form with a trick that saves squinting at manuals: a “Listen for MIDI” button arms the input side and auto-fills it from the next message it hears. Stomp the pedal, and the mapping already knows what that pedal says.

Output values can be fixed or passed through from the input, momentary is a per-mapping toggle with a configurable delay, and everything persists to a human-readable TOML file you can edit by hand. Ports open live as you add devices, changes take effect instantly, and the monitor can show the raw stream or just the mappings doing their work.
The engine is a background thread per input port, feeding both the router and the monitor. 79 tests, including TUI interaction tests: overkill for a glue utility, and the reason it hasn’t broken since March.
If you want to play with it without hardware, the macOS IAC Driver gives you virtual MIDI buses so you can route your DAW into it and back.
Why it exists at all
Commercial tools do this. But this took about an hour with Claude doing the typing while I tested against the actual pedals, the config is a text file in a git repo instead of someone’s licensing server, and it does exactly the thing I need and nothing else.
This one took about an hour. I still use it because it turns the pedal into the control I wanted and then gets out of the way.
Links
- MIDI Bridge on GitHub
- Textual, the Python TUI framework it’s built on