MIDI Show Control from a Stream Deck
MSC is how a lighting desk, a sound rig or a stage machine takes cues over MIDI — GO, STOP, RESUME, by cue number. MIDIRover has no MSC action and does not need one:every MSC message is a SysEx message, and the Advanced MIDI action already sends SysEx.Put a frame from this page on a key and it works.
The frame
Every MSC message has the same seven parts:
F0 7F <device id> 02 <command format> <command> <data> F7F0 opens, 7F says Universal Real Time, 02 says "this is Show Control", and F7 closes. The two in the middle are yours to choose, and choosing them wrongly is the single commonest reason nothing happens.
Device ID — who is being addressed
| Value | Means |
|---|---|
00–6F | One specific device. 01 is "device 1". |
70–7E | Group IDs 1–15, where a desk supports them. |
7F | All call — every MSC device on the line listens. |
Command format — what kind of device
| Value | Means |
|---|---|
01 | General lighting. What a lighting desk listens on. |
02 | Moving lights. |
10 | Sound, general. |
7F | All types — every receiver should respond. |
If nothing happens, check the device ID first
This filter fails closed and in silence, which is what makes it so confusing. A desk acts only on frames carrying its own device ID or the all-call 7F. Send device 01to a desk set to receive on 2 and there is no error, no warning and no log line — the cue simply does not run, exactly as if the cable were unplugged.
So when a frame does nothing: send the all-call form first — put 7F in the device-ID slot. If the all-call works and your addressed frame does not, the device ID is the problem and not the cue. Then set the slot to whatever your desk's own MSC receive setting says.
The commands
Shown addressed to device 1, lighting. Change the third byte to 7F to broadcast, and the fifth to suit the receiver.
| Command | Paste this | What it does |
|---|---|---|
| GO | F0 7F 01 02 01 01 F7 | Runs the next cue, or the cue you name. Add a cue number before the F7 — see below. |
| STOP | F0 7F 01 02 01 02 F7 | Halts whatever is running, where it is. |
| RESUME | F0 7F 01 02 01 03 F7 | Carries on from where STOP left it. |
| RESET | F0 7F 01 02 01 0A F7 | Returns the receiver to its power-on state. |
The specification defines a good many more — TIMED_GO, LOAD, SET, FIRE, GO_OFF, the clock commands and the standby pair. They are deliberately not listed above: we could not corroborate complete frames for them against two independent sources, and this page's rule is that a missing row beats a wrong one. FIRE appears in the console table below, because ETC documents a complete frame for it.
Cue numbers are text, not numbers
This is where most second-hand summaries go wrong. A cue number is sent as ASCII digits — cue 5 is 35, not 05 — and a decimal point is a literal 2E. A single00 separates the cue number from the cue list, and another separates list from path.
| You want | Paste this |
|---|---|
| GO, next cue | F0 7F 01 02 01 01 F7 |
| GO cue 5 | F0 7F 01 02 01 01 35 F7 |
| GO cue 12.5 in list 2 | F0 7F 01 02 01 01 31 32 2E 35 00 32 F7 |
| GO cue 12.5 in list 2, every device | F0 7F 7F 02 7F 01 31 32 2E 35 00 32 F7 |
Reading the third one: 31 32 is "12", 2E is the point, 35 is "5",00 ends the cue number, and 32 is list "2".
What real consoles document
Taken from each manufacturer's own MIDI documentation, as complete frames:
| Console | Frame | What it does |
|---|---|---|
| ETC Eos | F0 7F 01 02 01 01 35 34 00 31 F7 | GO cue 54 in list 1, device 1 — Eos shows this as Cue 1/54; the bytes are cue-then-list, its display is list/cue. |
| ETC Eos | F0 7F 01 02 01 01 35 36 2E 37 00 31 32 F7 | GO cue 56.7 in list 12, device 1 — the decimal point is a literal 2E. |
| ETC Eos | F0 7F 05 02 01 07 11 F7 | FIRE macro 17 on a desk set to device 5. |
| High End Hog 4 | F0 7F 01 02 01 01 33 34 2E 34 00 31 F7 | GO cue 34.4 on cuelist 1, device 1. |
| MA grandMA2 | F0 7F 7F 02 7F 01 32 31 2E 35 30 30 F7 | GO cue 21.5 on the default executor, broadcast to every device and format. |
| MA grandMA2 | F0 7F 7F 02 7F 02 F7 | STOP, broadcast, no cue data. |
| ChamSys MagicQ | F0 7F 7F 02 01 01 32 30 F7 | GO cue 20 in the Cue Store. |
| ChamSys MagicQ | F0 7F 7F 02 01 01 32 00 31 30 F7 | GO cue 2 on Cue Stack 10. |
| Avolites Titan | F0 7F 7F 02 01 01 F7 | GO with no cue number — advance to the next cue. |
Note how the desks differ: ETC and Hog document addressed frames with a device ID and lighting format, while grandMA2's own examples broadcast with 7F 02 7F. Both are correct — that is the point of those two fields being yours.
The trap: a frame that ends 7F instead of F7
Check the last byte of anything you copy. F7 and 7F are easy to transpose, and transposed frames do appear in published examples — we found three while checking the sources for this page.
What makes it nasty is that MIDIRover will not reject one. A frame that opens F0 and never closes gets its F7 added for you, which is the right thing when you simply left it off — but if you typed 7F by mistake, that stray byte stays in the message as data. The key sends a valid frame carrying one junk byte, and the desk either ignores the cue or runs the wrong one. It looks like a cue-numbering problem and it is a typing problem.
Both the Bytes line under Sends in the panel and npm run monitor show you the message as it will go out, which is where a stray trailing 7F is obvious.
Putting one on a key
- Paste hex. Drop an Advanced MIDI action on a key, setType to SysEx, leave SysEx entry onPaste hex, and paste a whole frame.
- Build message. Switch SysEx entry to Build message, pick 7F — Universal Real Time from the Manufacturer list (in theUniversal group, below the registered companies), and type the rest — for GO cue 5 to device 1 that is
01 02 01 01 35. TheF0andF7are added for you.
Name the key after the cue, not the number — "Blackout", "Act 2" — and you have a cue row on your deck. Separate the bytes with spaces, commas or dashes; a run-together string is refused rather than guessed at.
Related
- MIDI Machine Control — the same trick for recorders and DAWs: play, stop, rewind, punch in, locate.
- Pitch Bend, Aftertouch, NRPN & SysEx — how the SysEx field itself works.