990 lines
33 KiB
Plaintext
990 lines
33 KiB
Plaintext
MIDI Time Code and Cueing
|
|
|
|
Detailed Specification
|
|
|
|
(Supplement to MIDI 1.0)
|
|
|
|
12 February 1987
|
|
|
|
Justification For MIDI Time Code and Cueing
|
|
|
|
|
|
|
|
The merit of implementing the MIDI Time Code proposal within the current
|
|
MIDI specification is as follows:
|
|
|
|
SMPTE has become the de facto timing reference standard in the
|
|
professional audio world and in almost the entire video world. SMPTE is also
|
|
seeing more and more use in the semi-professional audio area. We hope to
|
|
combine this universal timing reference, SMPTE, with the de facto standard
|
|
for controlling musical equipment, MIDI.
|
|
|
|
Encoding SMPTE over MIDI allows a person to work with one timing
|
|
reference throughout the entire system. For example, studio engineers are
|
|
more familiar with the idea of telling a multitrack recorder to punch in and
|
|
out of record mode at specific SMPTE times, as opposed to a specific beat in a
|
|
specific bar. To force a musician or studio engineer to convert back and
|
|
forth between a SMPTE time and a specific bar number is tedious and should not
|
|
be necessary (one would have to take into account tempo and tempo changes,
|
|
etc.).
|
|
|
|
Also, some operations are referenced only as SMPTE times, as opposed to
|
|
beats in a bar. For example, creating audio and sound effects for video
|
|
requires that certain sounds and sequences be played at specific SMPTE times.
|
|
There is no other easy way to do this with Song Position Pointers, etc., and
|
|
even if there was, it would be an unnatural way for a video or recording
|
|
engineer to work.
|
|
|
|
MIDI Time Code is an absolute timing reference, whereas MIDI Clock and
|
|
Song Position Pointer are relative timing references. In virtually all audio
|
|
for film/video work, SMPTE is already being used as the main time base, and
|
|
any musical passages which need to be recorded are usually done by getting a
|
|
MIDI-based sequencer to start at a pre-determined SMPTE time code. In most
|
|
cases, though, it is SMPTE which is the Master timing reference being used.
|
|
In order for MIDI-based devices to operate on an absolute time code which is
|
|
independent of tempo, MIDI Time Code must be used. Existing devices merely
|
|
translate SMPTE into MIDI Clocks and Song Position Pointers based upon a given
|
|
tempo. This is not absolute time, but relative time, and all of the SMPTE cue
|
|
points will change if the tempo changes. The majority of sound effects work
|
|
for film and video does not involve musical passages with tempos, rather it
|
|
involves individual sound effect "events" which must occur at specific,
|
|
absolute times, not relative to any "tempo".
|
|
|
|
|
|
|
|
MIDI Time Code System Components
|
|
|
|
|
|
|
|
SMPTE to MTC Converter
|
|
|
|
This box would either convert longitudinal (audio-type) or vertical
|
|
(video-type) SMPTE time code from a master timing device into MTC. The
|
|
function could be integrated into video tape recorders (VTRs) or
|
|
syncronization units that control audio tape recorders (ATRs). Alternately, a
|
|
stand-alone box would do the conversion, or simply generate MTC directly.
|
|
Note that conversion from MTC to SMPTE time code is not envisioned, as it is
|
|
of little practical value.
|
|
|
|
|
|
|
|
Cue List Manager
|
|
|
|
This would be a device or computer program that would maintain a cue list
|
|
of desired events, and send the list to the slaves. For performance, the
|
|
manager might pass the Time Code from the SMPTE-MTC converter through to the
|
|
slaves, or, in a stand-alone system it might generate Time Code itself. This
|
|
"central controller" would presumably also contain all library functions for
|
|
downloading sound programs, samples, sequences, patterns, and so on, to the
|
|
slaves. A Cue List Manager would pre-load intelligent MTC peripherals (see
|
|
below) with this data.
|
|
|
|
|
|
|
|
MTC Sequencer
|
|
|
|
To control existing equipment or any device which does not recognize MTC
|
|
in an MTC system, this device would be needed. It would receive the cue list
|
|
from the manager, and convert the cues into normal MIDI commands. At the
|
|
specified SMPTE times, the sequencer would then send the MIDI commands to the
|
|
specific devices. For example, for existing MIDI equipment it might provide
|
|
MIDI messages such as Note On, Note Off, Song Select, Start, Stop, Program
|
|
Changes, etc. Non-MIDI equipment (such as CD players, mixing consoles,
|
|
lighting, sound effects cartridge units and ATRs) may also be controlled if
|
|
such a device had relay controls.
|
|
|
|
|
|
|
|
Intelligent MTC Peripheral
|
|
|
|
In this category belong devices capable of receiving an MTC Cue List from
|
|
the manager, and triggering themselves appropriately when the correct Time
|
|
Code (SMPTE or MIDI) has been received. Above this minimum, the device might
|
|
be able to change its programming in response to the Cue List, or prepare
|
|
itself for ensuing events.
|
|
|
|
For example, an intelligent MTC-equipped analog multitrack tape machine
|
|
might read in a list of punch in/punch out cues from the Cue List Manager, and
|
|
then alter then to internally compensate for its bias current rise and fall
|
|
times. A sampling-based sound effects device might preload samples from its
|
|
own disk drive into a RAM buffer, in anticipation of needing them for cues
|
|
later on in the cue list.
|
|
|
|
It should be mentioned that while these functions are separately
|
|
described, actual devices may incorporate a mixture of these functions, suited
|
|
to specific applications in their market.
|
|
|
|
|
|
A MIDI Time Code System
|
|
|
|
The MIDI Time Code format contains two parts: Time Code and Set Up. Time
|
|
Code is relatively straightforward: hours, minutes, seconds and frame numbers
|
|
(approximately 1/30 of a second) are encoded and distributed throughout the
|
|
MIDI system so that all the units know exactly what time it is.
|
|
|
|
Set Up, however, is where MTC gains its power. It is a format for
|
|
informing MIDI devices of events to be performed at specific times.
|
|
Ultimately, this aspect of MTC will lead to the creation of an entirely new
|
|
class of production equipment. Before getting into the nuts and bolts of the
|
|
spec itself, let's talk about some of the uses and features of forthcoming
|
|
devices that have been envisioned.
|
|
|
|
Set Up begins with the concept of a cue list. In video editing, for
|
|
example, it is customary to transfer the video master source tapes, which may
|
|
be on expensive, two-inch recorders, to less-expensive recorders. The editing
|
|
team then works over this copy, making a list of all the segments that they
|
|
want to piece together as they are defined by their SMPTE times.
|
|
|
|
For example, the first scene starts at time A and ends at time B, the
|
|
next scene starts at time C and ends at time D. A third scene may even lie
|
|
between the first two. When done, they feed this cue list time information
|
|
into the editing system of the master recorder(s) or just give the cue list to
|
|
an editor who does the work manually. The editing system or editor then
|
|
locates the desired segments and assembles them in the proper sequence.
|
|
|
|
|
|
|
|
Now suppose that instead of one or two video recorders, we have twenty
|
|
devices that will play a part in our audio/video or film production: special
|
|
effects generators for fades and superimpositions, additional decks with
|
|
background scenery, live cameras, MIDI sequencers, drum machines,
|
|
synthesizers, samplers, DDLs, soundtrack decks, CDs, effects devices, and so
|
|
on. As it stands now, each of these devices must be handled more or less
|
|
separately, with painstaking and time-consuming assembly editing or multitrack
|
|
overdubs. And when a change in the program occurs (which always happens),
|
|
anywhere from just a few items to the whole system may need to be reprogrammed
|
|
by hand.
|
|
|
|
|
|
|
|
This is where MIDI Time Code comes in. It can potentially control all of
|
|
these individual production elements so that they function together from a
|
|
single cue list. The master controller which would handle this function is
|
|
described as a Cue List Manager. On such a console, you would list what you
|
|
want each device to do, and when to do it. The manager would then send the cue
|
|
list to the various machines via the MTC Set Up protocol. Each unit would then
|
|
react as programmed when the designated MIDI Time Code (or conventional SMPTE
|
|
Time Code) appears. Changes? No problem. Simply edit the cue list using simple
|
|
word-processing functions, then run the tape again.
|
|
|
|
|
|
MTC thus integrates into a manageable system all of the diverse tools at
|
|
our disposal. It would drastically reduce the time, money and frustration
|
|
needed to produce a film or video.
|
|
|
|
|
|
Having covered the basic aspects of a MIDI Time Code system, as well as
|
|
examples of how an overall system might function, we will now take a look at
|
|
the actual MIDI specification itself.
|
|
|
|
|
|
MIDI Time Code
|
|
|
|
|
|
|
|
For device synchronization, MIDI Time Code uses two basic types of
|
|
messages, described as Quarter Frame and Full. There is also a third, optional
|
|
message for encoding SMPTE user bits.
|
|
|
|
|
|
Quarter Frame Messages
|
|
|
|
|
|
|
|
Quarter Frame messages are used only while the system is running. They
|
|
are rather like the PPQN or MIDI clocks to which we are accustomed. But there
|
|
are several important ways in which Quarter Frame messages differ from the
|
|
other systems.
|
|
|
|
|
|
As their name implies, they have fine resolution. If we assume 30 frames
|
|
per second, there will be 120 Quarter Frame messages per second. This
|
|
corresponds to a maximum latency of 8.3 milliseconds (at 30 frames per
|
|
second), with accuracy greater than this possible within the specific device
|
|
(which may interpolate inbetween quarter frames to "bit" resolution). Quarter
|
|
Frame messages serve a dual purpose: besides providing the basic timing pulse
|
|
for the system, each message contains a unique nibble (four bits) defining a
|
|
digit of a specific field of the current SMPTE time.
|
|
|
|
|
|
|
|
Quarter frames messages should be thought of as groups of eight messages.
|
|
One of these groups encodes the SMPTE time in hours, minutes, seconds, and
|
|
frames. Since it takes eight quarter frames for a complete time code message,
|
|
the complete SMPTE time is updated every two frames. Each quarter frame
|
|
message contains two bytes. The first byte is F1, the Quarter Frame System
|
|
Common byte. The second byte contains a nibble that represents the message
|
|
number (0 through 7), and a nibble for one of the digits of a time field
|
|
(hours, minutes, seconds or frames).
|
|
|
|
|
|
|
|
|
|
|
|
Quarter Frame Messages (2 bytes):
|
|
|
|
|
|
|
|
F1 <message>
|
|
|
|
|
|
|
|
F1 = Currently unused and undefined System Common status byte
|
|
|
|
<message> = 0nnn dddd
|
|
|
|
|
|
|
|
dddd = 4 bits of binary data for this Message Type
|
|
|
|
nnn = Message Type:
|
|
|
|
0 = Frame count LS nibble
|
|
|
|
1 = Frame count MS nibble
|
|
|
|
2 = Seconds count LS nibble
|
|
|
|
3 = Seconds count MS nibble
|
|
|
|
4 = Minutes count LS nibble
|
|
|
|
5 = Minutes count MS nibble
|
|
|
|
6 = Hours count LS nibble
|
|
|
|
7 = Hours count MS nibble and SMPTE Type
|
|
|
|
|
|
|
|
After both the MS nibble and the LS nibble of the above counts are
|
|
assembled, their bit fields are assigned as follows:
|
|
|
|
|
|
|
|
FRAME COUNT: xxx yyyyy
|
|
|
|
|
|
|
|
xxx = undefined and reserved for future use. Transmitter
|
|
|
|
must set these bits to 0 and receiver should ignore!
|
|
|
|
yyyyy = Frame number (0-29)
|
|
|
|
|
|
|
|
SECONDS COUNT: xx yyyyyy
|
|
|
|
|
|
|
|
xx = undefined and reserved for future use. Transmitter
|
|
|
|
must set these bits to 0 and receiver should ignore!
|
|
|
|
yyyyyy = Seconds Count (0-59)
|
|
|
|
|
|
|
|
MINUTES COUNT: xx yyyyyy
|
|
|
|
|
|
|
|
xx = undefined and reserved for future use. Transmitter
|
|
|
|
must set these bits to 0 and receiver should ignore!
|
|
|
|
yyyyyy = Minutes Count (0-59)
|
|
|
|
|
|
|
|
HOURS COUNT: x yy zzzzz
|
|
|
|
|
|
|
|
x = undefined and reserved for future use. Transmitter
|
|
|
|
must set this bit to 0 and receiver should ignore!
|
|
|
|
|
|
|
|
yy = Time Code Type:
|
|
|
|
0 = 24 Frames/Second
|
|
|
|
1 = 25 Frames/Second
|
|
|
|
2 = 30 Frames/Second (Drop-Frame)
|
|
|
|
3 = 30 Frames/Second (Non-Drop)
|
|
|
|
|
|
|
|
zzzzz = Hours Count (0-23)
|
|
|
|
|
|
Quarter Frame Message Implementation
|
|
|
|
|
|
|
|
When time code is running in the forward direction, the device producing
|
|
the MIDI Time Code will send Quarter Frame messages at quarter frame intervals
|
|
in the following order:
|
|
|
|
|
|
|
|
F1 0X
|
|
|
|
F1 1X
|
|
|
|
F1 2X
|
|
|
|
F1 3X
|
|
|
|
F1 4X
|
|
|
|
F1 5X
|
|
|
|
F1 6X
|
|
|
|
F1 7X
|
|
|
|
|
|
|
|
after which the sequence repeats itself, at a rate of one complete 8-message
|
|
sequence every 2 frames (8 quarter frames). When time code is running in
|
|
reverse, the quarter frame messages are sent in reverse order, starting with
|
|
F1 7X and ending with F1 0X. Again, at least 8 quarter frame messages must be
|
|
sent. The arrival of the F1 0X and F1 4X messages always denote frame
|
|
boundaries.
|
|
|
|
|
|
|
|
Since 8 quarter frame messages are required to definitely establish the
|
|
actual SMPTE time, timing lock cannot be achieved until the reader has read a
|
|
full sequence of 8 messages, from first message to last. This will take from
|
|
2 to 4 frames to do, depending on when the reader comes on line.
|
|
|
|
|
|
During fast forward, rewind or shuttle modes, the time code generator
|
|
should stop sending quarter frame messages, and just send a Full Message once
|
|
the final destination has been reached. The generator can then pause for any
|
|
devices to shuttle to that point, and resume by sending quarter frame messages
|
|
when play mode is resumed. Time is considered to be "running" upon receipt of
|
|
the first quarter frame message after a Full Message.
|
|
|
|
|
|
Do not send quarter frame messages continuously in a shuttle mode at high
|
|
speed, since this unnecessarily clogs the MIDI data lines. If you must
|
|
periodically update a device's time code during a long shuttle, then send a
|
|
Full Message every so often.
|
|
|
|
|
|
The quarter frame message F1 0X (Frame Count LS nibble) must be sent on a
|
|
frame boundary. The frame number indicated by the frame count is the number
|
|
of the frame which starts on that boundary. This follows the same convention
|
|
as normal SMPTE longitudinal time code, where bit 00 of the 80-bit message
|
|
arrives at the precise time that the frame it represents is actually starting.
|
|
The SMPTE time will be incremented by 2 frames for each 8-message sequence,
|
|
since an 8-message sequence will take 2 frames to send.
|
|
|
|
|
|
|
|
Another way to look at it is: When the last quarter frame message (F1
|
|
7X) arrives and the time can be fully assembled, the information is now
|
|
actually 2 frames old. A receiver of this time must keep an internal offset
|
|
of +2 frames for displaying. This may seem unusual, but it is the way normal
|
|
SMPTE is received and also makes backing up (running time code backwards) less
|
|
confusing - when receiving the 8 quarter frame messages backwards, the F1 0X
|
|
message still falls on the boundary of the frame it represents.
|
|
|
|
|
|
|
|
|
|
|
|
Each quarter frame message number (0->7) indicates which of the 8 quarter
|
|
frames of the 2-frame sequence we are on. For example, message 0 (F1 0X)
|
|
indicates quarter frame 0 of frame #1 in the sequence, and message 4 (F1 4X)
|
|
indicates quarter frame 1 of frame #2 in the sequence. If a reader receives
|
|
these message numbers in descending sequence, then it knows that time code is
|
|
being sent in the reverse direction. Also, a reader can come on line at any
|
|
time and know exactly where it is in relation to the 2-frame sequence, down to
|
|
a quarter frame accuracy.
|
|
|
|
|
|
|
|
It is the responsibility of the time code reader to insure that MTC is
|
|
being properly interpreted. This requires waiting a sufficient amount of time
|
|
in order to achieve time code lock, and maintaining that lock until
|
|
synchronization is dropped. Although each passing quarter frame message could
|
|
be interpreted as a relative quarter frame count, the time code reader should
|
|
always verify the actual complete time code after every 8-message sequence (2
|
|
frames) in order to guarantee a proper lock.
|
|
|
|
|
|
|
|
For example, let's assume the time is 01:37:52:16 (30 frames per second,
|
|
non-drop). Since the time is sent from least to most significant digit, the
|
|
first two Quarter Frame messages will contain the data 16 (frames), the second
|
|
two will contain the data 52 (seconds), the third two will represent 37
|
|
(minutes), and the final two encode the 1 (hours and SMPTE Type). The Quarter
|
|
Frame Messages description defines how the binary data for each time field is
|
|
spread across two nibbles. This scheme (as opposed to simple BCD) leaves some
|
|
extra bits for encoding the SMPTE type (and for future use).
|
|
|
|
|
|
|
|
Now, let's convert our example time of 01:37:52:16 into Quarter Frame
|
|
format, putting in the correct hexadecimal conversions:
|
|
|
|
|
|
|
|
F1 00
|
|
|
|
F1 11 10H = 16 decimal
|
|
|
|
|
|
|
|
F1 24
|
|
|
|
F1 33 34H = 52 decimal
|
|
|
|
|
|
|
|
F1 45
|
|
|
|
F1 52 25H = 37 decimal
|
|
|
|
|
|
|
|
F1 61
|
|
|
|
F1 76 01H = 01 decimal (SMPTE Type is 30 frames/non-drop)
|
|
|
|
|
|
|
|
(note: the value transmitted is "6" because the SMPTE Type (11 binary) is
|
|
encoded in bits 5 and 6)
|
|
|
|
|
|
|
|
For SMPTE Types of 24, 30 drop frame, and 30 non-drop frame, the frame
|
|
number will always be even. For SMPTE Type of 25, the frame number may be
|
|
even or odd, depending on which frame number the 8-message sequence had
|
|
started. In this case, you can see where the MIDI Time Code frame number
|
|
would alternate between even and odd every second.
|
|
|
|
|
|
|
|
MIDI Time Code will take a very small percentage of the MIDI bandwidth.
|
|
The fastest SMPTE time rate is 30 frames per second. The specification is to
|
|
send 4 messages per frame - in other words, a 2-byte message (640
|
|
microseconds) every 8.333 milliseconds. This takes 7.68 % of the MIDI
|
|
bandwidth - a reasonably small amount. Also, in the typical MIDI Time Code
|
|
systems we have imagined, it would be rare that normal MIDI and MIDI Time Code
|
|
would share the same MIDI bus at the same time.
|
|
|
|
|
|
Full Message
|
|
|
|
|
|
|
|
Quarter Frame messages handle the basic running work of the system. But
|
|
they are not suitable for use when equipment needs to be fast-forwarded or
|
|
rewound, located or cued to a specific time, as sending them continuously at
|
|
accelerated speeds would unnecessarily clog up or outrun the MIDI data lines.
|
|
For these cases, Full Messages are used, which encode the complete time into a
|
|
single message. After sending a Full Message, the time code generator can
|
|
pause for any mechanical devices to shuttle (or "autolocate") to that point,
|
|
and then resume running by sending quarter frame messages.
|
|
|
|
|
|
|
|
Full Message - (10 bytes)
|
|
|
|
|
|
|
|
F0 7F <chan> 01 <sub-ID 2> hr mn sc fr F7
|
|
|
|
|
|
|
|
F0 7F = Real Time Universal System Exclusive Header
|
|
|
|
<chan> = 7F (message intended for entire system)
|
|
|
|
01 = <sub-ID 1>, 'MIDI Time Code'
|
|
|
|
<sub-ID 2> = 01, Full Time Code Message
|
|
|
|
hr = hours and type: 0 yy zzzzz
|
|
|
|
yy = type:
|
|
|
|
00 = 24 Frames/Second
|
|
|
|
01 = 25 Frames/Second
|
|
|
|
10 = 30 Frames/Second (drop frame)
|
|
|
|
11 = 30 Frames/Second (non-drop frame)
|
|
|
|
zzzzz = Hours (00->23)
|
|
|
|
mn = Minutes (00->59)
|
|
|
|
sc = Seconds (00->59)
|
|
|
|
fr = Frames (00->29)
|
|
|
|
F7 = EOX
|
|
|
|
|
|
|
|
|
|
|
|
Time is considered to be "running" upon receipt of the first Quarter
|
|
Frame message after a Full Message.
|
|
|
|
|
|
User Bits
|
|
|
|
|
|
|
|
"User Bits" are 32 bits provided by SMPTE for special functions which
|
|
vary with the application, and which can be programmed only from equipment
|
|
especially designed for this purpose. Up to four characters or eight digits
|
|
can be written. Examples of use are adding a date code or reel number to the
|
|
tape. The User Bits tend not to change throughout a run of time code.
|
|
|
|
|
|
|
|
User Bits Message - (15 bytes)
|
|
|
|
|
|
|
|
F0 7F <chan> 01 <sub-ID 2> u1 u2 u3 u4 u5 u6 u7 u8 u9 F7
|
|
|
|
|
|
|
|
F0 7F = Real Time Universal System Exclusive Header
|
|
|
|
<chan> = 7F (message intended for entire system)
|
|
|
|
01 = <sub-ID 1>, MIDI TIme Code
|
|
|
|
<sub-id 2> = 02, User Bits Message
|
|
|
|
u1 = 0000aaaa
|
|
|
|
u2 = 0000bbbb
|
|
|
|
u3 = 0000cccc
|
|
|
|
u4 = 0000dddd
|
|
|
|
u5 = 0000eeee
|
|
|
|
u6 = 0000ffff
|
|
|
|
u7 = 0000gggg
|
|
|
|
u8 = 0000hhhh
|
|
|
|
u9 = 000000ii
|
|
|
|
F7 = EOX
|
|
|
|
|
|
|
|
These nibble fields decode in an 8-bit format: aaaabbbb ccccdddd
|
|
eeeeffff gggghhhh ii. It forms 4 8-bit characters, and a 2 bit Format Code.
|
|
u1 through u8 correspond to SMPTE Binary Groups 1 through 8. u9 are the two
|
|
Binary Group Flag Bits, as defined by SMPTE.
|
|
|
|
|
|
|
|
This message can be sent whenever the User Bits values must be
|
|
transferred to any devices down the line. Note that the User Bits Message may
|
|
be sent by the MIDI Time Code Converter at any time. It is not sensitive to
|
|
any mode.
|
|
|
|
|
|
|
|
|
|
|
|
MIDI Cueing
|
|
|
|
|
|
|
|
MIDI Cueing uses Set-Up Messages to address individual units in a system.
|
|
(A "unit" can be be a multitrack tape deck, a VTR, a special effects
|
|
generator, MIDI sequencer, etc.)
|
|
|
|
|
|
|
|
Of 128 possible event types, 19 are currently defined.
|
|
|
|
|
|
|
|
|
|
|
|
Set-Up Messages (13 bytes plus any additional information):
|
|
|
|
|
|
|
|
F0 7E <chan> 04 <sub-ID 2> hr mn sc fr ff sl sm <add. info> F7
|
|
|
|
|
|
|
|
F0 7E = Non-Real Time Universal System Exclusive Header
|
|
|
|
<chan> = Channel number
|
|
04 = <sub-ID 1>, MIDI Time Code
|
|
|
|
<sub-ID 2> = Set-Up Type
|
|
00 = Special
|
|
01 = Punch In points
|
|
02 = Punch Out points
|
|
03 = Delete Punch In point
|
|
04 = Delete Punch Out point
|
|
05 = Event Start points
|
|
06 = Event Stop points
|
|
07 = Event Start points with additional info.
|
|
08 = Event Stop points with additional info.
|
|
09 = Delete Event Start point
|
|
0A = Delete Event Stop point
|
|
0B = Cue points
|
|
0C = Cue points with additional info
|
|
0D = Delete Cue point
|
|
0E = Event Name in additional info
|
|
|
|
hr = hours and type: 0 yy zzzzz
|
|
|
|
yy = type:
|
|
00 = 24 Frames/Second
|
|
01 = 25 Frames/Second
|
|
10 = 30 Frames/Second drop frame
|
|
11 = 30 Frames/Second non-drop frame
|
|
zzzzz = Hours (00-23)
|
|
|
|
mn = Minutes (00-59)
|
|
|
|
sc = Seconds (00-59)
|
|
|
|
fr = Frames (00-29)
|
|
|
|
ff = Fractional Frames (00-99)
|
|
|
|
sl, sm = Event Number (LSB first)
|
|
|
|
<add. info.>
|
|
|
|
F7 = EOX
|
|
|
|
|
|
Description of Set-Up Types:
|
|
|
|
|
|
|
|
|
|
|
|
00 Special refers to the set-up information that affects a unit
|
|
globally (as opposed to individual tracks, sounds, programs,
|
|
sequences, etc.). In this case, the Special Type takes the
|
|
place of the Event Number. Five are defined. Note that types
|
|
01 00 through 04 00 ignore the event time field.
|
|
|
|
|
|
|
|
00 00 Time Code Offset refers to a relative Time Code offset for
|
|
each unit. For example, a piece of video and a piece of music that are
|
|
supposed to go together may be created at different times, and more than
|
|
likely have different absolute time code positions - therefore, one must be
|
|
offset from the other so that they will match up. Just like there is one
|
|
master time code for an entire system, each unit only
|
|
needs one offset value per unit.
|
|
|
|
|
|
|
|
01 00 Enable Event List means for a unit to enable execution of
|
|
events in its list if the appropriate MTC or SMPTE time occurs.
|
|
|
|
|
|
|
|
02 00 Disable Event List means for a unit to disable execution
|
|
of its event list but not to erase it. This facilitates an MTC Event Manager
|
|
in muting particular devices in order to concentrate on others in a complex
|
|
system where many events occur simultaneously.
|
|
|
|
|
|
|
|
03 00 Clear Event List means for a unit to erase its entire
|
|
event list.
|
|
|
|
|
|
|
|
04 00 System Stop refers to a time when the unit may shut down.
|
|
This serves as a protection against Event Starts without matching Event Stops,
|
|
tape machines running past the end of the reel, and so on.
|
|
|
|
|
|
05 00 Event List Request is sent by a master to an MTC
|
|
peripheral. If the device ID (Channel Number) matches that of the peripheral,
|
|
the peripheral responds by transmitting its entire cue list as a sequence of
|
|
Set Up Messages, starting from the SMPTE time indicated in the Event List
|
|
Request message.
|
|
|
|
|
|
|
|
01/02 Punch In and Punch Out refer to the enabling and disabling of
|
|
record mode on a unit. The Event Number refers to the track to be recorded.
|
|
Multiple punch in/punch out points (and any of the other event types below)
|
|
may be specified by sending multiple Set-Up messages with different times.
|
|
|
|
|
|
|
|
03/04 Delete Punch In or Out deletes the matching point (time and
|
|
event number) from the Cue List.
|
|
|
|
|
|
|
|
05/06 Event Start and Stop refer to the running or playback of an
|
|
event, and imply that a large sequence of events or a continuous event is to
|
|
be started or stopped. The event number refers to which event on the targeted
|
|
slave is to be played. A single event (ie. playback of a specific sample, a
|
|
fader movement on an automated console, etc.) may occur several times
|
|
throughout a given list of cues. These events will be represented by the same
|
|
event number, with different Start and Stop times.
|
|
|
|
|
|
|
|
07/08 Event Start and Stop with Additional Information refer to an
|
|
event (as above) with additional parameters transmitted in the Set Up message
|
|
between the Time and EOX. The additional parameters may take the form of an
|
|
effects unit's internal parameters, the volume level of a sound effect, etc.
|
|
See below for a description of additional information.
|
|
|
|
|
|
09/0A Delete Event Start/Stop means to delete the matching (event
|
|
number and time) event (with or without additional information) from the Cue
|
|
List.
|
|
|
|
|
|
|
|
0B Cue Point refers to individual event occurences, such as
|
|
marking "hit" points for sound effects, reference points for editing, and so
|
|
on. Each Cue number may be assigned to a specific reaction, such as a
|
|
specific one-shot sound event (as opposed to a continuous event, which is
|
|
handled by Start/Stop). A single cue may occur several times throughout a
|
|
given list of cues. These events will be represented by the same event
|
|
number, with different Start and Stop times.
|
|
|
|
|
|
|
|
0C Cue Point with Additional Information is exactly like Event
|
|
Start/Stop with Additional Information, except that the event represents a Cue
|
|
Point rather than a Start/Stop Point.
|
|
|
|
|
|
|
|
0D Delete Cue Point means to Delete the matching (event number
|
|
and time) Cue Event with or without additional information from the Cue List.
|
|
|
|
|
|
|
|
0E Event Name in Additional Information. This merely assigns a
|
|
name to a given event number. It is for human logging purposes. See
|
|
Additional Information description.
|
|
|
|
|
|
|
|
|
|
|
|
Event Time
|
|
|
|
|
|
|
|
This is the SMPTE/MIDI Time Code time at which the given event is
|
|
supposed to occur. Actual time is in 1/100th frame resoultion, for those
|
|
units capable of handling bits or some other form of sub-frame resolution, and
|
|
should otherwise be self-explanatory.
|
|
|
|
|
|
|
|
Event Number
|
|
|
|
|
|
|
|
This is a fourteen-bit value, enabling 16,384 of each of the above types
|
|
to be individually addressed. "sl" is the 7 LS bits, and "sm" is the 7 MS
|
|
bits.
|
|
|
|
|
|
|
|
Additional Information description
|
|
|
|
|
|
|
|
Additional information consists of a nibblized MIDI data stream, LS
|
|
nibble first. The exception is Set-Up Type OE, where the additional
|
|
information is nibblized ASCII, LS nibble first. An ASCII newline is
|
|
accomplished by sending CR and LF in the ASCII. CR alone functions solely as a
|
|
carriage return, and LF alone functions solely as a Line-Feed.
|
|
|
|
|
|
|
|
For example, a MIDI Note On message such as 91 46 7F would be nibblized
|
|
and sent as 01 09 06 04 0F 07. In this way, any device can decode any
|
|
message regardless of who it was intended for. Device-specific messages
|
|
should be sent as nibblized MIDI System Exclusive messages.
|
|
|
|
|
|
Potential Problems
|
|
|
|
|
|
|
|
There is a possible problem with MIDI merger boxes improperly handling
|
|
the F1 message, since they do not currently know how many bytes are
|
|
following. However, in typical MIDI Time Code systems, we do not anticipate
|
|
applications where the MIDI Time Code must be merged with other MIDI signals
|
|
occuring at the same time.
|
|
|
|
|
|
|
|
Please note that there is plenty of room for additional set-up types,
|
|
etc., to cover unanticipated situations and configurations.
|
|
|
|
|
|
|
|
It is recommended that each MTC peripheral power up with its MIDI
|
|
Manufacturer's System Exclusive ID number as its default channel/device ID.
|
|
Obviously, it would be preferable to allow the user to change this number from
|
|
the device's front panel, so that several peripherals from the same
|
|
manufacturer may have unique IDs within the same MTC system.
|
|
|
|
|
|
|
|
|
|
|
|
Signal Path Summary
|
|
|
|
|
|
|
|
Data sent between the Master Time Code Source (which may be, for example,
|
|
a Multitrack Tape Deck with a SMPTE Synchronizer) and the MIDI Time Code
|
|
Converter is always SMPTE Time Code.
|
|
|
|
|
|
|
|
Data sent from the MIDI Time Code Converter to the Master Control/Cue
|
|
Sheet (note that this may be a MTC-equipped tape deck or mixing console as
|
|
well as a cue-sheet) is always MIDI Time Code. The specific MIDI Time Code
|
|
messages which are used depend on the current operating mode, as explained
|
|
below:
|
|
|
|
|
|
Play Mode: The Master Time Code Source (tape deck) is in normal PLAY
|
|
MODE at normal or vari-speed rates. The MIDI Time Code
|
|
Converter is transmitting Quarter Frame ("F1") messages to
|
|
the Master Control/Cue Sheet. The frame messages are in
|
|
ASCENDING order, starting with "F1 0X" and ending with "F1
|
|
7X". If the tape machine is capable of play mode in REVERSE,
|
|
then the frame messages will be transmitted in REVERSE
|
|
sequence, starting with "F1 7X" and ending with "F1 0X".
|
|
|
|
|
|
|
|
Cue Mode: The Master Time Code Source is being "rocked", or "cued" by
|
|
hand. The tape is still contacting the playback head so
|
|
that the listener can cue, or preview the contents of the
|
|
tape slowly. The MIDI Time Code Converter is transmitting
|
|
FRAME ("F1") messages to the Master Control/Cue Sheet. If
|
|
the tape is being played in the FORWARD direction, the frame
|
|
messages are sent in ASCENDING order, starting with "F1 0X"
|
|
and ending with "F1 7X". If the tape machine is played in
|
|
the REVERSE direction, then the frame messages will be
|
|
transmitted in REVERSE sequence, starting with "F1 7X" and
|
|
ending with "F1 0X".
|
|
|
|
|
|
|
|
Because the tape is being moved by hand in Cue Mode, the
|
|
tape direction can change quickly and often. The order of
|
|
the Frame Message sequence must change along with the tape
|
|
direction.
|
|
|
|
|
|
|
|
Fast-Forward/Rewind Mode: In this mode, the tape is in a
|
|
high-speed wind or rewind, and is not touching the playback
|
|
head. No "cueing" of the taped material is going on. Since
|
|
this is a "search" mode, synchronization of the Master
|
|
Control/Cue Sheet is not as important as in the Play or Cue
|
|
Mode. Thus, in this mode, the MIDI Time Code Converter only
|
|
needs to send a "Full Message" every so often to the Cue
|
|
Sheet. This acts as a rough indicator of the Master's
|
|
position. The SMPTE time indicated by the "Full Message"
|
|
actually takes effect upon the reception of the next "F1"
|
|
quarter frame message (when "Play Mode" has resumed).
|
|
|
|
|
|
|
|
Shuttle Mode: This is just another expression for "Fast-Forward/Rewind
|
|
Mode".
|
|
|
|
|
|
|
|
|
|
|
|
|
|
References and Credits
|
|
|
|
|
|
|
|
SMPTE 12M (ANSI V98.12M-1981).
|
|
|
|
|
|
|
|
MIDI Time Code specification created by Chris Meyer and Evan Brooks of
|
|
Digidesign. Thanks to Stanley Jungleib of Sequential for additional text.
|
|
Also many thanks to all of the MMA and JMSC members for their suggestions and
|
|
contributions to the spec.
|
|
|
|
|
|
|
|
*********** Addition: MIDI bar numbers ********************
|
|
|
|
|
|
F0 7F <dev-id> ni 01 aa aa F7
|
|
|
|
FO 7F Universal real-time sys-ex header
|
|
<dev-id> ID of target device (default=7f=all)
|
|
ni sub ID #1 = Notation information (03)
|
|
01 sub ID #2 = Bar Marker Message
|
|
aa aa bar number; LSB first
|
|
[00 40] = not running
|
|
[01 40] .. [00 00] = count in
|
|
[01 00] .. [7E 3F] = bar number in song
|
|
F7 End of sys-ex
|
|
|
|
A maximum neg number indicates not running
|
|
A maximum positive value indicates running (but no idea about bar number)
|
|
|
|
|
|
|
|
F0 7F <dev-id> ni ts ln nn dd cc bb [nn dd ...] F7
|
|
|
|
F0 7F Universal real-time sys-ex header
|
|
<dev-id> ID of target machine (see above)
|
|
ni SUB ID #1 = Notation info (03)
|
|
ts SUB ID #2 = Time signature message
|
|
02=change now; 42=change next bar
|
|
ln Number of data bytes following
|
|
nn Numerator of time signature
|
|
dd Denumiroator (neg. power of 2)
|
|
cc Number of notated 32 notes in a MIDI quarter note
|
|
[nn cc..] Additional pairs of num/denom (to define a
|
|
compound time signature within the same bar)
|
|
F7 End of sys-ex
|
|
|