Reference

MIDI Machine Control from a Stream Deck

MMC is how you tell a recorder, a DAW or a tape machine to play, stop, rewind or punch in— the tape-transport buttons, over MIDI. MIDIRover has no MMC action, and does not need one:every MMC command is a SysEx message, and the Advanced MIDI action already sends SysEx.Copy a row from the table below onto a key and it works.

Why there is no "MMC action"

MMC is not a message type of its own. It is Universal Real Time System Exclusive — a SysEx frame with a reserved manufacturer id — so a plugin that can send arbitrary SysEx can already send all of it. Adding a dedicated action would mean a second way to do the same thing, a thirteenth tile in your action list, and another panel to keep in step with this one. The honest answer is a table you can paste from, which is this page.

The commands

Each row is a complete message. The 7F in the third position is the device id, and 7F there means every device listening — which is what you want unless your gear has been given an id of its own, in which case put that id in instead.

CommandPaste thisWhat it does
StopF0 7F 7F 06 01 F7Stops the transport where it is, like the Stop key on a tape deck.
PlayF0 7F 7F 06 02 F7Starts playback from wherever the transport is parked.
Deferred PlayF0 7F 7F 06 03 F7Plays as soon as the machine is ready — the one to use after a Locate.
Fast ForwardF0 7F 7F 06 04 F7Winds forward at speed.
RewindF0 7F 7F 06 05 F7Winds back at speed.
Record StrobeF0 7F 7F 06 06 F7Drops into record on the armed tracks — a punch-in.
Record ExitF0 7F 7F 06 07 F7Punches out of record but keeps playing.
Record PauseF0 7F 7F 06 08 F7Pauses recording with the record arm still held.
PauseF0 7F 7F 06 09 F7Pauses playback or recording where it is.
ChaseF0 7F 7F 06 0B F7Tells the machine to slave its transport to incoming timecode.
Command Error ResetF0 7F 7F 06 0C F7Clears an error flag on a machine that has refused a command.
MMC ResetF0 7F 7F 06 0D F7Returns the machine to its power-on MMC state.

Eject (0A) is left out on purpose. It appears in most published MMC lists, but it is for machines with removable media and we could not corroborate it to the standard we held the rest of this table to. If your machine's own manual lists it, F0 7F 7F 06 0A F7 is the frame it describes.

Putting one on a key

There are two routes, and they store exactly the same thing:

  1. Paste hex. Drop an Advanced MIDI action on a key, setType to SysEx, leave SysEx entry onPaste hex, and paste a whole row — F0 7F 7F 06 02 F7 for Play.
  2. Build message. Switch SysEx entry to Build message, pick 7F — Universal Real Time from the Manufacturer list (it is in theUniversal group at the bottom, below the registered companies), and type the rest —7F 06 02 — into Command bytes. The F0 and F7 are added for you.

Give the key a Name — "Play", "Punch in" — and you have a transport row on your deck.

Two things that will bite you

Separate the bytes. F0 7F 7F 06 02 F7 works; f07f7f0602f7 does not, and the field goes red. Spaces, commas, periods, colons, semicolons and dashes all count as separators, so a string copied from a manual in any of those styles pastes straight in. The run-together form is refused on purpose: a parser that guessed where the bytes divide could send a message you did not write.

Leave off both frame bytes or neither. 7F 7F 06 02 works — MIDIRover adds theF0 and F7 for you. F0 7F 7F 06 02 F7 works. But7F 7F 06 02 F7 — the terminator kept and the opener dropped, which is what you get by deleting the first byte of a pasted string — is refused, because with no opening F0 the whole line is read as raw data and F7 is not a data byte.

Locate — jumping to a timecode position

Locate is the one MMC command that carries a payload, and it is the one most summaries get wrong by listing it as a bare 44. The full form is:

F0 7F 7F 06 44 06 01 hh mm ss fr ff F7

— where 44 is Locate, 06 is the length of what follows, 01 says "a timecode target", and hh mm ss fr ff are hours, minutes, seconds, frames and subframes. So to park at one minute exactly:

F0 7F 7F 06 44 06 01 00 01 00 00 00 F7

Keep the hours byte under 24 and you are safe. In MIDI Time Code the top bits of that byte carry a frame-rate code, and it is widely assumed MMC does the same — but we could not corroborate that MMC receivers honour it, and two independent implementations ignore it. So this guide gives plain hours only, and leaves the frame rate to the machine's own setting. If your gear documents the rate bits, follow its manual rather than this page.

Locate parks the transport; it does not start it. Follow it with Deferred Play(F0 7F 7F 06 03 F7) rather than Play, because that is the command that means "start as soon as you have got there".

Checking it actually went out

If a command does nothing, find out which half is at fault before changing anything. Runnpm run monitor from the plugin's folder with a loopback port selected, press the key, and you will see the frame — or you will not, which tells you the problem is on this side rather than in the machine.

Every string on this page was checked that way before it was published: sent on a real port and read back byte for byte.

Related

MMC or Transport? They are different protocols for the same idea. Transport(Start / Continue / Stop) is three single bytes for anything slaved to MIDI clock — sequencers, grooveboxes, drum machines. MMC is for machines that think of themselves as recorders, and it can do things clock transport cannot: punch in, locate, chase. If both work on your gear, Transport is the simpler key.