Reference

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> F7

F0 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

ValueMeans
00–6FOne specific device. 01 is "device 1".
70–7EGroup IDs 1–15, where a desk supports them.
7FAll call — every MSC device on the line listens.

Command format — what kind of device

ValueMeans
01General lighting. What a lighting desk listens on.
02Moving lights.
10Sound, general.
7FAll 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.

CommandPaste thisWhat it does
GOF0 7F 01 02 01 01 F7Runs the next cue, or the cue you name. Add a cue number before the F7 — see below.
STOPF0 7F 01 02 01 02 F7Halts whatever is running, where it is.
RESUMEF0 7F 01 02 01 03 F7Carries on from where STOP left it.
RESETF0 7F 01 02 01 0A F7Returns 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 wantPaste this
GO, next cueF0 7F 01 02 01 01 F7
GO cue 5F0 7F 01 02 01 01 35 F7
GO cue 12.5 in list 2F0 7F 01 02 01 01 31 32 2E 35 00 32 F7
GO cue 12.5 in list 2, every deviceF0 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:

ConsoleFrameWhat it does
ETC EosF0 7F 01 02 01 01 35 34 00 31 F7GO 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 EosF0 7F 01 02 01 01 35 36 2E 37 00 31 32 F7GO cue 56.7 in list 12, device 1 — the decimal point is a literal 2E.
ETC EosF0 7F 05 02 01 07 11 F7FIRE macro 17 on a desk set to device 5.
High End Hog 4F0 7F 01 02 01 01 33 34 2E 34 00 31 F7GO cue 34.4 on cuelist 1, device 1.
MA grandMA2F0 7F 7F 02 7F 01 32 31 2E 35 30 30 F7GO cue 21.5 on the default executor, broadcast to every device and format.
MA grandMA2F0 7F 7F 02 7F 02 F7STOP, broadcast, no cue data.
ChamSys MagicQF0 7F 7F 02 01 01 32 30 F7GO cue 20 in the Cue Store.
ChamSys MagicQF0 7F 7F 02 01 01 32 00 31 30 F7GO cue 2 on Cue Stack 10.
Avolites TitanF0 7F 7F 02 01 01 F7GO 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

  1. Paste hex. Drop an Advanced MIDI action on a key, setType to SysEx, leave SysEx entry onPaste hex, and paste a whole frame.
  2. 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. The F0 and F7 are 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