Declarative OSC bridge for music hardware and software
@roomi-fields
Declarative OSC bridge for music hardware and software โ and an MCP server to drive it from an LLM.
849 hardware synthesizers over MIDI / SysEx, plus DAWs and live-coding environments over OSC (Ableton, Bitwig, Reaper, Sonic Pi, SuperCollider, Pure Data, TouchDesigner, VCV Rack). Every device gets a clean, named OSC surface described by one JSON file. Drive it from a live-coding client, a DAW, a script, the CLI โ or from Claude via the built-in MCP server (a MIDI MCP and OSC MCP).
Why a bridge? Modern synths โ hardware and software alike โ expose themselves over MIDI, SysEx, and OSC with proprietary, scattered protocols. Using them from live-coding environments, a DAW, a script, or an LLM is painful:
CC / NRPN addresses are cryptic SysEx byte formats are hand-rolled per device Bidirectional state (what the device CURRENTLY knows) is hard to track osc-bridge gives every supported synth a clean, named OSC surface:
~mb = NetAddr("127.0.0.1", 7777); ~mb.sendMsg("/minilab3/knob/3/cc_number", 64); // reconfigure knob 3 ~mb.sendMsg("/minilab3/pad/0/color", 127, 0, 0); // pad 1 red ~mb.sendMsg("/minilab3/display/text", "Hello", "World"); Each synth is described by one JSON file. No Rust recompile required to add a device.
What makes it different One JSON = one driver. Adding a synth is ~30 lines of declarative JSON โ CC numbers, SysEx frame templates, optional parameter tables. No Rust, no bindings, no build step. Ship a PR, osc-bridge run picks it up. 849 devices out of the box. Every Prophet, every Oberheim, every Yamaha DX-family, MatrixBrute, Hydrasynth, Virus TI, Digitone, Matrix-1000โฆ most of the catalogue is usable today. Fully searchable at roomi-fields.github.io/osc-bridge. Hardware and software. The same named OSC surface drives a hardware synth over MIDI/SysEx or a DAW / live-coding environment over OSC โ Ableton, Bitwig, Reaper, Sonic Pi, SuperCollider, Pure Data, TouchDesigner, VCV Rack. See ยง Software targets. An MCP server built in. osc-bridge mcp exposes the whole catalogue to Claude (or any MCP client) โ a MIDI MCP and OSC MCP. Discover devices, read a device's OSC surface, send OSC to synths and DAWs. See docs/MCP.md. Honest provenance. Each device declares its source in _sources[]: โ hardware-verified, โ software-verified, ๐ vendor-doc, ๐ก vendor-osc-api / ๐ก third-party-osc, ๐๏ธ electra-preset, ๐ฆ pencilresearch. You always know whether a mapping was tested on the device or lifted from a spec sheet. Bidirectional out of the box. Incoming MIDI (knob turns, SysEx replies, NRPN) is decoded and re-emitted as OSC. Multi-client fan-out is a --osc-client flag. N-to-N orchestration. One process can drive several synths at once (osc-bridge orchestrate --config bridge.toml), each reachable under its own OSC prefix โ so two MatrixBrutes live side-by-side as /matrixbrute-1 and /matrixbrute-2. First-class reconfigurable controllers (Electra One MK2). Upload a generated preset as one OSC call; the bridge parses the JSON, reconfigures the device over SysEx, and dynamically rewires its own CCโOSC routing so each knob on the new layout is reachable by name. Self-describing over OSC: /bridge/docs returns the integration guide, /electra1/routes/list returns the authoritative address table, so clients (or LLM-driven integrators) never hardcode slugification or protocol details. See ยง Reconfigurable controllers below. Escape hatch when JSON isn't enough. For devices with checksums, quirky scaling, or stateful protocols, an optional per-parameter transform / per-command script runs Lua 5.4 sandboxed (1 MiB / 10 ms caps, no os/io/loaders). Used sparingly โ osc-bridge lint warns on every script use โ but it lets the declarative core stay small without giving up on edge cases. See docs/scripting.md. Runtime you can trust. Rate-limiting per device, backpressure-aware, zero-alloc hot path, no GC. Single static binary on Windows / Linux / macOS.
Server Config
{
"mcpServers": {
"osc-bridge": {
"command": "npx",
"args": [
"-y",
"@roomi-fields/osc-bridge",
"mcp"
]
}
}
}