OSC and MIDI bridge for Yamaha MTX3 and MTX5-D, with a web-based mapping GUI.
This project converts the Yamaha MTX remote control protocol into:
- OSC for bridge-to-bridge communication
- MIDI for controller input and feedback
- HTTP / WebSocket for a browser-based mapping UI
Current stack:
- Go: MTX <-> OSC bridge
- Node.js / TypeScript: MIDI <-> OSC bridge, HTTP API, WebSocket
- Vue 3: mapping GUI
This implementation is designed against the Yamaha remote control protocol specification:
MTX3 MTX5-D MRX7-D XMV Series EXi8 EXo8 Remote Control Protocol Specifications V4.0.0- Yamaha PDF (Japanese)
Yamaha MTX3 / MTX5-D
<-> TCP 49280
mtx-osc-bridge (Go)
<-> OSC UDP 9000 / 9001
midi-osc-bridge (Node.js / TypeScript)
<-> HTTP 3000 / WebSocket
gui (Vue 3 / Vite)
sequenceDiagram
participant GUI as "Vue GUI"
participant Node as "midi-osc-bridge"
participant Go as "mtx-osc-bridge"
participant MTX as "Yamaha MTX"
participant MIDI as "MIDI Controller"
Note over Go,MTX: Session startup
Go->>MTX: TCP connect :49280
loop until ready
Go->>MTX: devstatus runmode
MTX-->>Go: OK / NOTIFY devstatus runmode "normal"
end
Go->>MTX: scpmode encoding utf8
Go->>MTX: scpmode valuetype normalized
Go->>MTX: scpmode resolution 1000
Go->>MTX: scpmode keepalive 30000
Go->>MTX: getn for known parameters
MTX-->>Go: OK getn / NOTIFY setn
Go-->>Node: OSC state updates
Node-->>GUI: WebSocket status / parameter snapshot
Note over MIDI,MTX: Normal control path
MIDI->>Node: CC / NOTE input
Node->>Node: resolve mapping
Node->>Go: OSC message
Go->>MTX: setn
MTX-->>Go: OK setn / NOTIFY setn
Go-->>Node: OSC update
Node-->>GUI: WebSocket parameter update
Note over GUI,MTX: Resync path
GUI->>Node: POST /api/osc/resync
Node->>Go: /mtx/system/resync
Go->>MTX: getn for known parameters
MTX-->>Go: OK getn
Go-->>Node: OSC updates
Node-->>GUI: settled parameter snapshot
- MTX startup handshake and keepalive
setn/getnnormalized parameter control- Input and zone
ON/FADERmapping STINandFX RTNmapping support- MIDI learn workflow in the browser
toggle / latchmode for binary controlsinvertsupport- Real-time MTX parameter display in the mapping UI
- Device mode switch for
MTX3/MTX5-D
- A reachable Yamaha MTX device
- MTX remote control available on TCP port
49280 - Go
- Node.js
- pnpm
- A working native build environment if you want real MIDI I/O through
@julusian/midi
The Go bridge reads a local mtx-osc-bridge/config.json file.
An example file is included here:
Example:
{
"mtx_host": "127.0.0.1",
"mtx_port": 49280,
"device_mode": "mtx3",
"keepalive_interval": "25s",
"ready_timeout": "30s",
"osc_listen_addr": ":9000",
"osc_target_host": "127.0.0.1",
"osc_target_port": 9001
}Node runtime settings are stored locally in:
These local runtime files are intentionally ignored by git.
Start everything:
cd /Users/funama/development/MTX3_OSC
pnpm devStart each part separately:
cd /Users/funama/development/MTX3_OSC
pnpm dev:go
pnpm dev:node
pnpm dev:guiEndpoints:
- GUI:
http://localhost:5173 - Node API:
http://localhost:3000
Go:
cd /Users/funama/development/MTX3_OSC/mtx-osc-bridge
go build ./cmd/mtx-osc-bridge
go test ./...Node:
cd /Users/funama/development/MTX3_OSC/midi-osc-bridge
pnpm install
pnpm build
pnpm devGUI:
cd /Users/funama/development/MTX3_OSC/gui
pnpm install
pnpm dev
pnpm buildMain address patterns:
/mtx/input/ch/{1-16}/fader/mtx/input/ch/{1-16}/on/mtx/input/stin/{1l|1r|2l|2r|3l|3r}/fader/mtx/input/stin/{1l|1r|2l|2r|3l|3r}/on/mtx/input/fxrtn/{1l|1r|2l|2r}/fader/mtx/input/fxrtn/{1l|1r|2l|2r}/on/mtx/zone/out/{1-16}/fader/mtx/zone/out/{1-16}/on/mtx/preset/recall/mtx/system/resync
- Open
Mappings - Select MIDI input and output ports
- Turn
Mapping Modeon - Click a target cell
- Move the MIDI control you want to assign
MIDI ports connect automatically when selected. Mappings are saved immediately after capture.
Additional options:
Latch/Togglefor binary controlsto 0dB/to +10dBfor fadersInvert
- MTX normalized range:
0-1000 - GUI / OSC fader range:
0.0-1.0 - Current
to 0dBbehavior uses127 -> 0.805 to +10dBuses127 -> 1.0
Main endpoints:
GET /api/statusGET /api/midi/portsPOST /api/midi/connectGET /api/mappingsPOST /api/mappingsGET /api/osc/addressesGET /api/osc/paramsPOST /api/osc/resyncPOST /api/osc/sendPOST /api/settings
CH17-24for MTX5-D is still a TODO in the GUI- Fader MIDI feedback is currently disabled
- MTX returned values do not always exactly match the sent value
- Yamaha MTX protocol documentation is not included in this repository