A Rust-based bridge that translates Yamaha RCP (Remote Control Protocol) commands into OSC (Open Sound Control) messages, enabling integration between Yamaha mixing consoles and OSC-compatible systems.
Overview • Getting started • Usage • GUI • Development • References
Yamaha does not provide a real-time interface to their consoles. The only way to get real-time data is through RCP, a proprietary and largely undocumented protocol. This project bridges RCP to OSC, making it possible to control and monitor Yamaha mixing consoles (DM3, DM7, QL, CL, and similar) from any OSC-compatible software or hardware.
┌─────────────────┐ RCP (TCP) ┌────────────────────┐ OSC (UDP) ┌─────────────────┐
│ Yamaha console │ ◄───────────► │ yamaha-rcp-to-osc │ ◄───────────► │ OSC application │
└─────────────────┘ └────────────────────┘ └─────────────────┘
Features:
- Bidirectional bridging — RCP notifications are converted to OSC messages, and incoming OSC messages are passed back to the console as RCP commands.
- Scene detail workaround — RCP's
sscurrent_exnotification carries no detail, so the bridge automatically issues anssinfo_exquery to fetch full current-scene information. - CLI and GUI — run it headless from the command line, or use the Tauri-based desktop app.
- Fast restarts — sockets are configured with
SO_REUSEADDR/SO_REUSEPORTso the bridge can be restarted immediately.
Download a prebuilt CLI binary from the releases page, or build from source:
cargo build --release
# binary at target/release/yamaha-rcp-to-oscyamaha-rcp-to-osc --console-ip 192.168.69.165| Flag | Description | Default |
|---|---|---|
--console-ip |
Console IP address (required) | — |
--rcp-port |
Console RCP port | 49280 |
--udp-osc-out-addr |
Address to send OSC messages to | 127.0.0.1 |
--udp-osc-out-port |
Port to send OSC messages to | 3999 |
--udp-osc-in-addr |
Local address to listen for OSC on | 0.0.0.0 |
--udp-osc-in-port |
Local port to listen for OSC on | 4000 |
To display the current scene of a DM3 in Vor:
- Create a Custom OSC connection.
- Set
Address 1to/ssinfo_ex/scene_a. - Create a layout from Custom OSC with the label set to
Console: %1:2 %1:3.
yamaha-rcp-to-osc --console-ip 192.168.69.165 --udp-osc-out-port 5003A Tauri v2 + React desktop app wraps the same bridge core with a configuration form, start/stop controls, and a live status indicator.
npm install
npm run tauri dev # development with hot reload
npm run tauri build # production build in src-tauri/target/release/bundle/Note
The GUI and the CLI share the same Rust library (src/lib.rs), so bridge behavior is identical in both.
A Makefile wraps the commands below — run make help to see all targets (make dev, make build, make gui-build, make check, etc.).
cargo run -- --console-ip 192.168.1.100 # run the CLI from source
cargo test # run the test suite
cargo clippy -- -D warnings # lint
cargo fmt # format
npm run lint # lint the GUI frontendTo test without a physical console, npm run nc starts a netcat listener on the RCP port (49280).
├── src/
│ ├── lib.rs # Core bridge logic (shared by CLI and GUI)
│ ├── main.rs # CLI entry point
│ ├── App.tsx # GUI frontend (React)
│ └── main.tsx # React entry point
├── src-tauri/ # Tauri backend (start/stop bridge commands)
├── tests/ # Integration tests (RCP <-> OSC conversion)
└── .github/workflows/ # CI: tests on Linux/macOS/Windows, tagged releases
- Companion Module Implementation — examples of RCP protocol usage
- QL Series SCP Commands Documentation — protocol discussion
- Yamaha Remote Control Protocol Specifications — official DME7 RCP spec
- yamaha-rcp-docs — community protocol documentation
