MTC (MIDI timecode)

MIDI time code (MTC), or MIDI time division, embeds the same timing information as standard SMPTE time code as a series of small 'quarter-frame' MIDI messages. There is no provision for the user bits in the standard MIDI time code messages, and SysEx messages are used to carry this information instead. The quarter-frame messages are transmitted in a sequence of eight messages, thus a complete timecode value is specified every two frames. If the MIDI data stream is running close to capacity, the MTC data may arrive a little behind schedule which has the effect of introducing a small amount of jitter. In order to avoid this it is ideal to use a completely separate MIDI port for MTC data. Larger full-frame messages, which encapsulate a frame worth of timecode in a single message, are used to locate to a time while timecode is not running.

Unlike standard SMPTE timecode, MIDI timecode's quarter-frame and full-frame messages carry a two-bit flag value that identifies the rate of the timecode, specifying it as either:


 * 24 frame/s (standard rate for film work)
 * 25 frame/s (standard rate for PAL video)
 * 29.97 frame/s (drop-frame timecode for NTSC video)
 * 30 frame/s (non-drop timecode for NTSC video)

MTC distinguishes between film speed and video speed only by the rate at which timecode advances, not by the information contained in the timecode messages; thus, 29.97 frame/s dropframe is represented as 30 frame/s dropframe at 0.1% pulldown. MTC allows the synchronisation of a sequencer or DAW with other devices that can synchronise to MTC or for these devices to 'slave' to a tape machine that is striped with SMPTE. For this to happen a SMPTE to MTC converter needs to be employed. Please note that it is possible for a tape machine to synchronise to an MTC signal (if converted to SMPTE), if the tape machine is able to 'slave' to incoming timecode via motor control, which is a rare feature.

Time code format
Byte 0

0rrhhhhh: Rate (0–3) and hour (0–23).

Byte 1  Byte 2 Byte 3
 * rr = 00: 24 frames/s*rr = 01: 25 frames/s
 * rr = 10: 29.97 frames/s (SMTPE drop-frame timecode)
 * rr = 11: 30 frames/s
 * 00mmmmmm: Minute (0–59)
 * 00ssssss: Second (0–59)
 * 000fffff: Frame (0–29, or less at lower frame rates)

Full time code
When there is a jump in the time code, a single full time code is sent to synchronize attached equipment. This takes the form of a special global system exclusive message:

F0 7F 7F 01 01 hh mm ss ff F7

The manufacturer ID of 7F indicates a real-time universal message, the channel of 7F indicates it is a global broadcast. The following ID of 01 identifies this is a time code type message, and the second 01 indicates it's a full time code message. The 4 bytes of time code follow. Although MIDI is generally little-endian, the 4 time code bytes follow in big-endian order, followed by a F7 "end of exclusive" byte. After a jump, the time clock stops until the first following quarter-frame message is received.

Quarter-frame messages
When the time is running continuously, the 32-bit time code is broken into 8 4-bit pieces, and one piece is transmitted each quarter frame. I.e. 96—120 times per second, depending on the frame rate. A quarter-frame messages consists of a status byte of 0xF1, followed by a single 7-bit data value: 3 bits to identify the piece, and 4 bits of partial time code. When time is running forward, the piece numbers increment from 0–7; with the time that piece 0 is transmitted is the coded instant, and the remaining pieces are transmitted later. If the MIDI data stream is being rewound, the time codes count backward. Again, piece 0 is transmitted at the coded moment. The time code is divided little-endian as follows: