Guide to the MIDI Software Specification

Contents

Overview

MIDI data is a serial stream of bytes (31,250 baud, asynchronous, 1 start bit, 1 stop bit) representing MIDI commands. A MIDI command comprises a status byte followed by a variable number of data bytes (possibly none).

Status bytes are identified due to their top bit being set. Consequently data bytes contain 7-bit values (0-127).

There are two main types of status bytes : Channel messages and System messages.

Channel messages use the lower 4 bits of the status byte to address 1 of 16 MIDI channels and the upper 4 bits to encode the specific message. A device can receive messages on more than one channel (known as voice channels), dependant on its mode of operation. However, there is a particular channel referred to as its base channel upon which it receives commands about which mode it should operate in and which voice (sound) it should use. Channel messages are sub-divided into two types :

  • Channel Voice messages (&80 - &EF) allow control of devices dependant on what MIDI channel they are set to (ie their base channel). That is, they allow control of individual voices.

  • Channel Mode messages (a subset of &Bn) are sent on a device's base channel, and are used to specify how a device should respond to Voice messages.

The System messages are not (generally) targeted for specific MIDI channels and are hence global messages. They are further divided into three types :

  • System Exclusive messages (&F0) are variable length messages. There is possibly more complexity in the various messages provided by this single status byte than by the rest of the MIDI specification.
    It has become the main route for expansion of the standard. It provides for manufacturer defined, device-specific messages, and any other messages involving larger amounts of data (ie blocks of data rather than the odd byte or two) than allowed for in all other messages.

  • System Common messages (&F1 - &F7) are involved with various system setup type operations, including sequencer (song) control and timing, and an instruction for a sound generator to ensure that it is in tune.

  • System Real Time messages (&F8 - &FF) are all single byte commands involved primarily with the control and timing of sequencer (song) playback.

The main difference between System Common and System Real Time messages is that the latter can interleave other MIDI data. That is, Real Time messages can occur in the middle of any other message. This is due to their use in sequence synchronisation, and aids timing accuracy.

Summary of Status Bytes

Status byte Number of
data bytes
Description
Hex Binary
Channel Voice Messages
8n 1000nnnn 2 Note Off
9n 1001nnnn 2 Note On   (a velocity of zero = Note Off)
An 1010nnnn 2 Polyphonic Key Pressure (Aftertouch)
Bn 1011nnnn 2 Controller   First data byte = 0-119
Cn 1100nnnn 1 Program Change   (ie instrument/voice selection)
Dn 1101nnnn 1 Channel Pressure (Aftertouch)
En 1110nnnn 2 Pitch Bend
Channel Mode Messages
Bn 1011nnnn 2 Select Channel Mode   First data byte = 120-127
System Messages
F0 11110000 <variable> System Exclusive
F1-F7 11110xxx 0 to 2 System Common   (xxx = 1-7)
F8-FF 11111xxx 0 System Real Time   (xxx = 0-7)
Notes :
nnnn0-15 = MIDI channel 1-16.

Running Status

Running Status is a data-thinning technique. It allows for the omision of status bytes if the current message to be transmitted has the same status byte (ie the same command and MIDI channel) as the previous message. It thus only applies to Channel (Voice and Mode) messages (0x8n - 0xEn).

System Real Time messages (0xF8 - 0xFF) are all single byte messages, and so running status is not applicable. Also, they can be interleaved within other messages without affecting running status in any way.

System Common and System Exclusive messages (0xF0 - 0xF7), on the other hand, cancel any running status, so any message following one of these messages must contain a status byte. As with System Real Time messages, running status is not applicable to System Common and System Exclusive messages, so these messages must always contain a status byte.

Eg. to play the C Major chord based on middle C :

Without running status :

0x90 0x3C 0x7FNote On for C4, max velocity
0x90 0x40 0x7FNote On for E4, max velocity
0x90 0x43 0x7FNote On for G4, max velocity

With running status, the second and third status bytes are omitted :

0x90 0x3C 0x7FNote On for C4, max velocity
0x40 0x7FNote On for E4, max velocity
0x43 0x7FNote On for G4, max velocity

Both approaches are valid, and so either may be used.


To be able to cope with running status, a receiving device should always remember the last status byte that it received (except for System messages), and if it doesn't receive a status byte when expected (on subsequent messages), it should assume that it's dealing with a running status situation. Apart from System Real Time messages, new status bytes will always force a receiver to adopt that new status, even if the previous message was incomplete.

A device that generates MIDI messages should always remember the last status byte that it sent (except for System Real Time messages), and if it needs to send another message with the same status (Channel messages only, not System messages), the status byte may be omitted.


Running status is the reasoning behind the velocity = 0 variant of the Note On message (which acts as a Note Off).

Eg. to play the same C Major chord as above (though also turning it off this time) :

Without running status :

0x90 0x3C 0x7FNote On for C4, max velocity
0x90 0x40 0x7FNote On for E4, max velocity
0x90 0x43 0x7FNote On for G4, max velocity
. . . . . . .Wait for duration of the chord ...
0x80 0x3C 0x3FNote Off for C4, middle release velocity
0x80 0x40 0x3FNote Off for E4, middle release velocity
0x80 0x43 0x3FNote Off for G4, middle release velocity

With running status, and using Note On with velocity = 0, to act as Note Offs :

0x90 0x3C 0x7FNote On for C4, max velocity
0x40 0x7FNote On for E4, max velocity
0x43 0x7FNote On for G4, max velocity
. . . . . . .Wait for duration of the chord ...
0x3C 0x00Note Off for C4, no release velocity information
0x40 0x00Note Off for E4, no release velocity information
0x43 0x00Note Off for G4, no release velocity information

Channel Voice Messages

The status byte of all Channel Voice messages is nibblised, with the top nibble (ie the top 4 bits) indicating the command (0x8 to 0xE), and the lower nibble indicating the MIDI channel.

The first three of these messages specify a MIDI note number : 0 - 127 (C-2 - G8), with middle C (C3) being note number 60. The standard 5 octave synthesizer keyboard range is 36 - 96, whereas the 88-note piano keyboard range is 21 - 108. Refer to this ready reckoner table of MIDI note numbers for the complete mapping.

8n : Note Off

3 bytes 1000nnnn , 0kkkkkkk , 0vvvvvvv
1000nnnn Note Off status byte;   nnnn (0-15) = MIDI channel 1-16
kkkkkkk Note number (0-127)
vvvvvvv Key Off (release) velocity (0-127);   Defaults to 64 in the absence of velocity sensors

9n : Note On

3 bytes 1001nnnn , 0kkkkkkk , 0vvvvvvv
1001nnnn Note On status byte;   nnnn (0-15) = MIDI channel 1-16
kkkkkkk Note number (0-127)
vvvvvvv Key On (attack) velocity (1-127, soft-loud);   0 = Note Off;
Defaults to 64 in the absence of velocity sensors

An : Polyphonic Key Pressure (Aftertouch)

3 bytes 1010nnnn , 0kkkkkkk , 0vvvvvvv
1010nnnn Polyphonic Key Pressure status byte;   nnnn (0-15) = MIDI channel 1-16
kkkkkkk Note number (0-127)
vvvvvvv Pressure value (0-127)

Bn : Controller

3 bytes 1011nnnn , 0ccccccc , 0vvvvvvv
1011nnnn Controller change status byte;   nnnn (0-15) = MIDI channel 1-16
ccccccc Controller number (0-119)
Values 120-127 are reserved for Channel Mode messages
vvvvvvv Controller value (0-127);   For switch controllers : 0 = Off, 127 = On

Cn : Program Change

2 bytes 1100nnnn , 0ppppppp
1100nnnn Program Change status byte;   nnnn (0-15) = MIDI channel 1-16
ppppppp Program number (0-127)

Dn : Channel Pressure (Aftertouch)

2 bytes 1101nnnn , 0vvvvvvv
1101nnnn Channel Pressure status byte;   nnnn (0-15) = MIDI channel 1-16
vvvvvvv Pressure value (0-127)

En : Pitch Bend

3 bytes 1110nnnn , 0vvvvvvv , 0hhhhhhh
1110nnnn Pitch Bend change status byte;   nnnn (0-15) = MIDI channel 1-16
vvvvvvv Pitch Bend LSB value (0-127) 00 40 is the central (no bend) setting.
00 00 is the maximum downwards bend, and
7F 7F the maximum upwards bend.
hhhhhhh Pitch Bend MSB value (0-127)
Notes :
1The use of a 14-bit value for pitch bend control has the double advantage of allowing fine adjustment and providing a useful range.
2Pitch Bend sensitivity is set manually at the receiving device, or by use of the Registered Parameter Number (RPN) 00 00 controller message.

Controller Numbers

The controller number is the first data byte (0ccccccc) following a Controller Change status byte (Bn). The 128 available controller numbers are split into four groups :

0-63High resolution continuous controllers (0-31 = MSB; 32-63 = LSB)
64-69Switches
70-119Low resolution continuous controllers
120-127Channel Mode messages

Note that for switches, the second data byte (0vvvvvvv) is either 0 (Off) or 127 (On), and that for high and low resolution continuous controllers, the second data byte takes the range 0-127.

The high resolution continuous controllers are divided into MSB and LSB values, providing a maximum of 14-bit resolution. If only 7-bit resolution is needed for a specific controller, only the MSB is used - it is not necessary to send the LSB. If the full resolution is required, then the MSB should be sent first, followed by the LSB. If only the LSB has changed in value, the LSB may be sent without re-sending the MSB.

The controller numbers missing from the following list (3, 9, 14, 15, 20-31, 35, 41, 46, 47, 52-63, 85-87, 89, 90 and 102-119) are currently undefined.

High resolution continuous controllers (MSB)
0Bank Select   (Detail)
1Modulation Wheel
2Breath Controller
4Foot Controller
5Portamento Time
6Data Entry   (used with RPNs/NRPNs)
7Channel Volume
8Balance
10Pan
11Expression Controller
12Effect Control 1
13Effect Control 2
16Gen Purpose Controller 1
17Gen Purpose Controller 2
18Gen Purpose Controller 3
19Gen Purpose Controller 4
High resolution continuous controllers (LSB)
32Bank Select
33Modulation Wheel
34Breath Controller
36Foot Controller
37Portamento Time
38Data Entry
39Channel Volume
40Balance
42Pan
43Expression Controller
44Effect Control 1
45Effect Control 2
48General Purpose Controller 1
49General Purpose Controller 2
50General Purpose Controller 3
51General Purpose Controller 4
Switches
64Sustain On/Off
65Portamento On/Off
66Sostenuto On/Off
67Soft Pedal On/Off
68Legato On/Off
69Hold 2 On/Off
Low resolution continuous controllers
70Sound Controller 1   (TG: Sound Variation;   FX: Exciter On/Off)
71Sound Controller 2   (TG: Harmonic Content;   FX: Compressor On/Off)
72Sound Controller 3   (TG: Release Time;   FX: Distortion On/Off)
73Sound Controller 4   (TG: Attack Time;   FX: EQ On/Off)
74Sound Controller 5   (TG: Brightness;   FX: Expander On/Off)
75Sound Controller 6   (TG: Decay Time;   FX: Reverb On/Off)
76Sound Controller 7   (TG: Vibrato Rate;   FX: Delay On/Off)
77Sound Controller 8   (TG: Vibrato Depth;   FX: Pitch Transpose On/Off)
78Sound Controller 9   (TG: Vibrato Delay;   FX: Flange/Chorus On/Off)
79Sound Controller 10   (TG: Undefined;   FX: Special Effects On/Off)
80General Purpose Controller 5
81General Purpose Controller 6
82General Purpose Controller 7
83General Purpose Controller 8
84Portamento Control (PTC)   (0vvvvvvv is the source Note number)   (Detail)
88High Resolution Velocity Prefix
91Effects 1 Depth (Reverb Send Level)
92Effects 2 Depth (Tremelo Depth)
93Effects 3 Depth (Chorus Send Level)
94Effects 4 Depth (Celeste Depth)
95Effects 5 Depth (Phaser Depth)
RPNs / NRPNs - (Detail)
96Data Increment
97Data Decrement
98Non Registered Parameter Number (LSB)
99Non Registered Parameter Number (MSB)
100Registered Parameter Number (LSB)
101Registered Parameter Number (MSB)
Channel Mode messages - (Detail)
120All Sound Off
121Reset All Controllers
122Local Control On/Off
123All Notes Off
124Omni Mode Off (also causes ANO)
125Omni Mode On (also causes ANO)
126Mono Mode On (Poly Off; also causes ANO)
127Poly Mode On (Mono Off; also causes ANO)

Bank Select

Controller numbers 0 (MSB) and 32 (LSB) are used for Bank selection.

The concept of instrument banks was introduced to get around the 128 voice limit of the Program Change message. The bank number is a 14-bit value, hence 16384 different banks are theoretically possible. The Program Change message gives access to up to 128 voices, from within the currently selected bank. There is, however, no requirement for a bank to contain the full set of 128 voices.

The Bank Select message should be transmitted as a pair, and then followed by a Program Change message :

HexBinaryDescription
Bn , 00 , msb1011nnnn , 00000000 , 0vvvvvvvBank Select, MSB
Bn , 20 , lsb1011nnnn , 00100000 , 0vvvvvvvBank Select, LSB
Cn , pc1100nnnn , 0pppppppProgram Change

The 14-bit Bank Select value gives access to 16,384 banks using the formula :

(MSB * 128) + LSB + 1

Ie :

MSBLSBBank number
00001
007F128
0100129
7F7F16,384

Portamento Control (PTC)

Controller number 84 is used for Portamento Control.

When a Note On message is received after a PTC message, the voice's pitch glides from the key number specified in the PTC message to the new Note On's pitch at the rate set by Controller 5 (Portamento Time), ignoring the current status of Controller 65 (Portamento On/Off).

A PTC message only affects the next Note On received on the relevant MIDI channel.

When in Poly mode, receiving a PTC message does not affect the pitch of any currently playing notes (whether in their sustain or release phase).

When in Mono mode, or if Controller 68 (Legato footswitch) is On, a new overlapping note event results in an immediate pitch jump to the note number specified in the PTC message, and then a glide at the current portamento rate to the note number specified in the new Note On.

For an explanation of Mono and Poly modes see the MIDI Modes sub-section under Channel Mode Messages.

The note is turned off by a Note Off which matches the Note On key number, not the key number specified in the PTC message, irrespective of mode.

Example usage :

To perform a glide from C4 to E4 :

MIDI data Description Result
90 3C 40Note On, C4C4 On
B0 54 3CPTC from C4No audible change
90 40 40Note On, E4Glide from C4 to E4
80 3C 40Note Off, C4No audible change
80 40 40Note Off, E4E4 Off

RPNs and NRPNs

Controller numbers 98 & 99 (Non-Registered Parameter Number, LSB & MSB), and 100 & 101 (Registered Parameter Number, LSB & MSB), in conjunction with Controller numbers 6 & 38 (Data Entry, MSB & LSB), 96 (Data Increment), and 97 (Data Decrement) extend the number of controllers available via MIDI.

Their use involves selecting the parameter number to be edited using Controllers 98 & 99 or 100 & 101, and then adjusting the value for that parameter using Controller number 6/38, 96, or 97. Controllers 6/38 would be used to set a specific value, whereas Controllers 96 and 97 would be used to nudge the current value up or down, respectively (with the Data2 byte specifying the step size, 1-127).

Note that two 7-bit values are used both to specify the RPN/NRPN itself, and its value. Ie there are 16,384 possible RPNs (and 16,384 NRPNs) each of which can be set with 14-bit precision. The MSB and LSB data values need not represent a single 0-16,383 range, and can be used to represent different quantities, as in the case of RPN 00,00 (Pitch Bend Sensitivity) where the MSB represents 'semitones' and the LSB represents 'cents'.

To calculate the full number from its LSB and MSB : N = MSB * 128 + LSB

Once the required RPN/NRPN has been specified (using CC98 & CC99, or CC100 & CC101) the value needs to be specified. There are several options :

  • High resolution values (ie ranging 0-16,383) require two messages :
    • A CC6 Data Entry message, where the Data2 byte contains the MSB of the value.
    • A CC38 Data Entry message, where the Data2 byte contains the LSB of the value.
  • Low resolution values (ie 0-127) can be sent in one message. It could be either a CC6 or a CC38 Data Entry message.
  • A CC96 Data Increment message can be sent. Its Data2 byte holds a value (0-127) to be added to the current parameter value.
  • A CC97 Data Decrement message can be sent. Its Data2 byte holds a value (0-127) to be subtracted from the current parameter value.

None of the Non-Registered Parameter Numbers have been assigned specific functions. They may be used for different functions by different manufacturers, and are thus manufacturer-specific.

Registered Parameter Numbers are those which have been assigned some particular function by the MIDI Manufacturers Association (MMA) and the Japan MIDI Standards Committee (JMSC). The following RPNs are currently defined :

RPNDescription
MSBLSB
0000Pitch Bend Sensitivity
The coarse adjustment (Controller 6) sets the number of semitones.
The fine adjustment (Controller 38) sets the number of cents.
0001Channel Fine Tuning
Use controllers 6 and 38 to set MSB and LSB :
00 00 = -100 cents; 40 00 = A440; 7F 7F = +100 cents.
See also the Real Time Universal System Exclusive Master Tuning messages.
0002Channel Coarse Tuning
Coarse adjustment only, using controller 6 :
00 = -64 semitones; 40 = A440; 7F = +63 semitones.
0003Select Tuning Program See also the Real Time Universal System Exclusive MIDI Tuning Standard messages.
0004Select Tuning Bank
0005Modulation Depth Range
Used to scale the effective range of Controller 1 (Modulation Wheel).
7F7FNull Function
Used to cancel a RPN or NRPN. After it is received, any additional value updates received should no longer be applied to the previously selected RPN or NRPN.

It is recommended that the Null Function (RPN 7F,7F) should be sent immediately after a RPN or NRPN and its value are sent.


Example usage :

To set the Pitch Bend Sensitivity on channel 'n' to +/- 7 semitones (ie +/- a fifth) :

11 bytes Bn 64 00 65 00 06 07 64 7F 65 7F
Bn 64 00RPN LSB = 00 Select RPN : Pitch Bend Sensitivity
65 00RPN MSB = 00 (running status in effect)
06 07Data Entry MSB = 07 (running status in effect) Coarse adjustment (semitones)
64 7FRPN LSB = 7F (running status in effect) Null Function (Cancel RPN)
65 7FRPN MSB = 7F (running status in effect)

Or, to set Tuning Program 'tt' on channel 'n' :

11 bytes Bn 64 03 65 00 06 tt 64 7F 65 7F
Bn 64 03RPN LSB = 03 Select RPN : Select Tuning Program
65 00RPN MSB = 00 (running status in effect)
06 ttData Entry MSB = tt (running status in effect) Coarse adjustment
64 7FRPN LSB = 7F (running status in effect) Null Function (Cancel RPN)
65 7FRPN MSB = 7F (running status in effect)

Or, to increment (by 1) the current Tuning Bank on channel 'n' :

11 bytes Bn 64 04 65 00 60 01 64 7F 65 7F
Bn 64 04RPN LSB = 04 Select RPN : Select Tuning Bank
65 00RPN MSB = 00 (running status in effect)
60 01Data Increment (running status in effect) Increment (by 1)
64 7FRPN LSB = 7F (running status in effect) Null Function (Cancel RPN)
65 7FRPN MSB = 7F (running status in effect)

When sending successive RPN (or NRPN) messages, the standard allows the ommision of CC100 & CC101 (or CC98 & CC99) if their value is unchanged.

For example, to send a pair of Channel Coarse Tuning and Channel Fine Tuning RPN messages (with a low-res and high-res data value, respectively) :

17 bytes Bn 64 02 65 00 06 TM 64 01 06 tM 26 tL 64 7F 65 7F
Bn 64 02RPN LSB = 02 Select RPN : Channel Coarse Tuning
65 00RPN MSB = 00 (running status in effect)
06 TMData Entry, MSB (running status in effect) Coarse adjustment (of 'coarse tuning')
64 01RPN LSB = 01 (running status in effect) Select RPN : Channel Fine Tuning (RPN MSB = 00 is still in effect)
06 tMData Entry, MSB (running status in effect) Coarse adjustment (of 'fine tuning')
26 tLData Entry, LSB (running status in effect) Fine adjustment (of 'fine tuning')
64 7FRPN LSB = 7F (running status in effect) Null Function (Cancel RPN)
65 7FRPN MSB = 7F (running status in effect)

Channel Mode Messages

These are a subset of the Controller messages, specifically controller numbers 120 - 127.

3 bytes 1011nnnn , 0ccccccc , 0vvvvvvv

cccccccvvvvvvvDescription
1200All Sound Off
Causes sound generators to immediately cease all sound (no release phase involved).
1210Reset All Controllers
Resets all controllers to their default values.
1220 (Off)
or
127 (On)
Local Control On/Off
When Local Control is Off, MIDI data from a MIDI keyboard is not communicated to the keyboard's sound generators, though it is still sent out via the MIDI OUT port. MIDI data arriving at the MIDI IN port will reach the sound generators, regardless.
1230All Notes Off (ANO)
Causes sound generators to enter the release stage of their volume envelope, and hence gently cease making sound.
1240Omni Mode Off  (also causes ANO)
1250Omni Mode On  (also causes ANO)
1260-16Mono Mode On (Poly Off)  (also causes ANO)
vvvvvvv > 0 : Number of channels to use (Omni Off).
vvvvvvv = 0 : Use all available channels (Omni On)
1270Poly Mode On (Mono Off)  (also causes ANO)

MIDI Modes

The MIDI specification allows for four basic modes of operation, selected using any two from the last four Channel Mode messages from the above list.

When Omni Mode is on, a device will respond to Channel messages on any MIDI channel, whereas when Omni Mode is off, a device will only respond to Channel messages which are on that device's base channel.

When Mono Mode is on, a device will only be able to play a single note at any time on a given MIDI channel, whereas when Poly Mode is on, a device will be able to play chords on a given channel (within that device's polyphony capability).

Note that any of these Channel Mode messages will only be responded to if they are on the receiving device's base channel. So, even when in Omni mode, a device still has a base channel as such (for the purposes of these Channel Mode messages).

Omni Mode On is a failsafe approach when connecting two devices together, as it ensures that the receiving device will respond to messages sent by the transmitting device. It is, however, totally useless in a sequencer based setup.

Multitimbral devices operate in a slightly special way. Basically each part (which has its own MIDI channel) is considered as a separate device, with each part being set to Omni Mode Off and Poly Mode On (ie independant polyphonic channels), which is ideal for use in a sequencer setup.

1 : Omni On, Poly On

Bn, 7D, 00Omni Mode On
Bn, 7F, 00Poly Mode On

Voice messages are received from all voice channels and assigned to voices polyphonically.

All voices are transmitted on the base channel.

2 : Omni On, Mono On

Bn, 7D, 00Omni Mode On
Bn, 7E, 00Mono Mode On

Voice messages are received from all voice channels, and control only one voice, monophonically.

Voice messages for one voice are transmitted on the base channel.

3 : Omni Off, Poly On

Bn, 7C, 00Omni Mode Off
Bn, 7F, 00Poly Mode On

Voice messages are received on the base channel only, and assigned to voices polyphonically.

Voice messages for all voices are transmitted on the base channel.

4 : Omni Off, Mono On

Bn, 7C, 00Omni Mode Off
Bn, 7E, nnMono Mode On   (nn = number of channels to use)

Voice messages are received on voice channels <base channel> to <base channel> + nn - 1, and assigned monophonically to voices 1 to nn, respectively. The number of voices 'nn' is specified by the third byte of the Mono Mode message.

Voice messages for voices 1 to nn are transmitted on voice channels <base channel> to <base channel> + nn - 1, respectively (a single voice per channel).

System Common Messages

System Common information is intended for all channels in a system.

Status byte Data bytes Description
Hex Binary
F1 11110001 0nnndddd MIDI Time Code Quarter Frame
nnn = Message Type; dddd = values.
See also the Real Time Universal System Exclusive MTC and Bar Marker (Notation) messages.
F2 11110010 0lllllll 0hhhhhhh Song Position Pointer
lllllll = LSB (0-127);   hhhhhhh = MSB (0-127)
The 14-bit value is the number of MIDI beats since the start of the song (1 beat = 6 MIDI clocks).
F3 11110011 0sssssss Song Select
sssssss = Song number (0-127)
Select current sequence.
F4 11110100    Undefined
F5 11110101    Undefined
F6 11110110 Tune Request
Upon receiving this all analogue synthesizers should initiate a self tuning operation.
F7 11110111 End of System Exclusive (EOX)
Used to terminate a System Exclusive message.

MTC Quarter Frame

These are the MTC (ie SMPTE based) equivalent of the F8 Timing Clock messages, though offer much higher resolution, as they are sent at a rate of 96 to 120 times a second (depending on the SMPTE frame rate). Each Quarter Frame message provides partial timecode information, 8 sequential messages being required to fully describe a timecode instant. The reconstituted timecode refers to when the first partial was received. The most significant nibble of the data byte indicates the partial (aka Message Type).

PartialData byteUsage
10000 bcdeFrame number LSBs abcde = Frame number (0 to frameRate-1)
20001 000aFrame number MSB
30010 cdefSeconds LSBs abcdef = Seconds (0-59)
40011 00abSeconds MSBs
50100 cdefMinutes LSBs abcdef = Minutes (0-59)
60101 00abMinutes MSBs
70110 defgHours LSBs ab = Frame Rate (00 = 24, 01 = 25, 10 = 30drop, 11 = 30nondrop)
cdefg = Hours (0-23)
80111 0abcFrame Rate, and Hours MSB

System Real Time Messages

The System Real Time messages control the entire system (all devices, irrespective of channel setting) in real time. They are used for synchronising clock-based devices (eg sequencers and rhythm units). They are each single byte messages, with no following data bytes. If the functions specified are not implemented, they are simply ignored.

To maintain timing precision, these messages can be sent at any time, even between bytes of another message. In such a situation the Real Time message is either acted upon or ignored, after which the receiving process resumes under the previous status.

Status byte Description
Hex Binary
F8 11111000 Timing Clock
Whilst a transmitter is playing, this message is sent 24 times per quarter note.
F9 11111001 Undefined
FA 11111010 Start
Start the current sequence playing, from the beginning. (This message should be followed with Timing Clocks).
FB 11111011 Continue
Continue playing the current sequence from the point at which it was stopped.
FC 11111100 Stop
Stop the current sequence.
FD 11111101 Undefined
FE 11111110 Active Sensing
When initially sent, the receiver will expect to receive another Active Sensing message each 300ms (max), or it will assume that the connection has been terminated. At termination, the receiver will turn off all voices and return to normal (non- active sensing) operation.
Use of this message is optional.
FF 11111111 System Reset
Reset all receivers to their power-up status. It should be used sparingly, preferably only under manual control. In particular, it should not be sent automatically on power up, as this could lead to a situation where two devices endlessly reset each other.

System Exclusive Messages

Status byte Data bytes Description
Hex Binary
F0 11110000   Start of System Exclusive (SOX)
  0iiiiiii Identification code (0-127)   [ see notes 1 & 5 ]
0ddddddd
...
...
0ddddddd
Any number of data bytes (each 0-127) having manufacturer specific functionality
F7 11110111   End of System Exclusive (EOX)
Notes :
1iiiiiii = identification ID (0-127). If the ID is 0, the following 2 bytes are used as extensions to the manufacturer ID.
2All bytes between the System Exclusive status byte and EOX, or the next status byte, must have zero in the top bit, ie values 0-127.
3Status or Data bytes (except System Real Time) should not be interleaved with System Exclusive data.
4EOX, or any other status byte (except System Real Time) will terminate a System Exclusive message. However, an EOX should always be sent to specifically mark the end of a System Exclusive message.
53 System Exclusive ID numbers have been set aside for special purposes : 7D is reserved for non-commercial use (eg schools, research, etc.) and is not to be used on any product released to the public; 7E (Non Real Time) and 7F (Real Time) are used for extensions to the MIDI specification, and are known as Universal System Exclusive ID numbers.

System Exclusive Manufacturer's ID Numbers

This is by no means a complete list, though it does include the major companies.

See note 1 above for how to distinguish single and multi byte IDs.

Single byte IDs - American
01Sequential Circuits
04Moog
05Passport Designs
06Lexicon
07Kurzweil
0AAKG Acoustics
0FEnsoniq
10Oberheim
11Apple
13Digidesign
18Emu
1AART
1CEventide
Single byte IDs - European
22Synthaxe
24Hohner
29PPG
2BSSL
2FElka / General Music
30Dynacord
33Clavia (Nord)
36Cheetah
3EWaldorf Electronics Gmbh
Single byte IDs - Japanese
40Kawai
41Roland
42Korg
43Yamaha
44Casio
47Akai
48Japan Victor (JVC)
4CSony
4ETeac Corporation
51Fostex
52Zoom
Multi byte IDs - American
00 00 07Digital Music Corporation
00 00 0EAlesis
00 00 15KAT
00 00 16Opcode
00 00 1AAllen & Heath Brenell
00 00 1BPeavey Electronics
00 00 1C360 Systems
00 00 20Axxes
Multi byte IDs - European
00 20 11Forefront Technology
00 20 13Kenton Electronics
00 20 1FTC Electronic
00 20 27Acorn Computer
00 20 29Novation
00 20 32Behringer
00 20 33Access Music Electronics
00 20 3CElektron

Universal System Exclusive ID Numbers

This includes the Non Real Time (7E) and Real Time (7F) ID extensions mentioned above in note 5.

The generalised format for both is as follows :

F0 <ID number> <Device ID> <Sub ID#1> <Sub ID#2> . . . . F7

The Device ID (also referred to as the channel number) is generally used to specify a discrete physical device, however complex devices (eg computers with a number of different MIDI expansion cards) may have more than one Device ID. A value of 7F is used to specify all devices.

From one to sixteen virtual devices may be accessed at each Device ID by use of the normal MIDI channel numbers, within the capabilities of the device.

The Non-Commercial Universal System Exclusive ID (7D) is not detailed here.

Sub ID#1Sub ID#2Description
Non Real Time Universal Sys Ex   (Sys Ex ID number = 7E)
00Unused
01(not used)Sample Dump Header - (Detail)
02(not used)Sample Dump Data Packet - (Detail)
03(not used)Sample Dump Request - (Detail)
04nnMTC Cueing - (Detail)
00Special
01Punch In Points
02Punch Out Points
03Delete Punch In Point
04Delete Punch Out Point
05Event Start Point
06Event Stop Point
07Event Start Points with additional info
08Event Stop Points with additional info
09Delete Event Start Point
0ADelete Event Stop Point
0BCue Points
0CCue Points with additional info
0DDelete Cue Point
0EEvent name in additional info
05nnSample Dump Extensions
01Loop Point Transmission - (Detail)
02Loop Point Request - (Detail)
03Sample Name Transmission - (Detail)
04Sample Name Request - (Detail)
05Extended Dump Header - (Detail)
06Extended Loop Point Transmission - (Detail)
07Extended Loop Point Request - (Detail)
06nnGeneral System Information
01Device Identity Request - (Detail)
02Device Identity Reply - (Detail)
07nnFile Dump
01Header - (Detail)
02Data Packet - (Detail)
03Request - (Detail)
08nnMIDI Tuning Standard
00Bulk Tuning Dump Request - (Detail)
01Bulk Tuning Dump Reply - (Detail)
09nnGeneral MIDI (GM) System
01Enable - (Detail)
02Disable - (Detail)
0AnnDown-Loadable Sounds (DLS) System
01Enable - (Detail)
02Disable - (Detail)
7B(not used)End of File - (Detail)
7C(not used)Wait - (Detail)
7D(not used)Cancel - (Detail)
7E(not used)NAK - (Detail)
7F(not used)ACK - (Detail)
Real Time Universal Sys Ex   (Sys Ex ID number = 7F)
00Unused
01nnMIDI Time Code (MTC)
01Full Message - (Detail)
02User Bits - (Detail)
03nnNotation Information
01Bar Marker - (Detail)
02Time Signature (immediate) - (Detail)
42Time Signature (delayed) - (Detail)
04nnDevice Control
01Master Volume - (Detail)
02Master Balance - (Detail)
03Master Fine Tuning - (Detail)
04Master Coarse Tuning - (Detail)
05nnMTC Cueing - (Detail)
00Special
01Punch In Points
02Punch Out Points
05Event Start Point
06Event Stop Point
07Event Start Points with additional info
08Event Stop Points with additional info
0BCue Points
0CCue Points with additional info
0EEvent name in additional info
06nnMIDI Machine Control (MMC) Commands - (Detail)
01Stop
02Play
03Deferred Play
04Fast Forward
05Rewind
06Record Strobe (Punch In)
07Record Exit (Punch Out)
08Record Pause
09Pause
0AEject
0BChase
0CCommand Error Reset
0DMMC Reset
44Locate / Go To - (Detail)
47Shuttle - (Detail)
08nnMIDI Tuning Standard
02Single Note Tuning Change - (Detail)

Non Real Time Universal System Exclusive Messages

Sample Dump Standard (SDS)

This standard enables the transfer of samples over MIDI. It has been designed to work either as an open or closed loop system. The closed loop system involves handshaking procedures which allows for error recovery, and also accomodates devices which need time to process the data as it is received.

The three SDS messages (Dump Request, Dump Header and Data Packet) are used in combination with the five Handshaking messages (EOF, ACK, NAK, Wait and Cancel) in accordance with the Dump Procedure.

See also the Sample Dump Extensions messages.

There is also a corresponding set of File Dump messages.

Sample Dump Header

F0 7E id 01 ss ss ee ff ff ff gg gg gg hh hh hh ii ii ii jj F7
F0 7EUniversal Non Real Time Sys Ex header
idID of target device   (7F = All devices)
01Sub ID#1 = Sample Dump Header
ss ssSample number (LSB first)
eeSample format (number of significant bits : 8-28)
ff ff ffSample period (1/sample rate) in nanoseconds (LSB first)
gg gg ggSample length in words (LSB first)
hh hh hhSustain loop start point (word number, LSB first)
ii ii iiSustain loop end point (word number, LSB first)
jjLoop type (00 = forward only, 01 = backward/forward, 7F = Off)
F7EOX

Sample Dump Data Packet

F0 7E id 02 nn <120 bytes> kk F7
F0 7EUniversal Non Real Time Sys Ex header
idID of target device   (7F = All devices)
02Sub ID#1 = Sample Dump Data Packet
nnRunning packet count (0-127, with wrap-around)
<120 bytes>Sample data (each byte contains 7-bit data)
kkChecksum (XOR of : 7E cc 02 nn <120 bytes>)
F7EOX

The packet number (nn) is used by the receiver to distinguish between a re-send and a new packet, when operating in handshaking mode. Note that for sample sizes that require more than 128 data packets, the packet number wraps around (from 127 to 0).

The data is in the usual 7-bit format, ie with the msb = 0. The number of MIDI bytes used to encode each sample depends on the sample format :

  • 8-14 bit samples : 2 bytes per sample (60 samples per packet).
  • 15-21 bit samples : 3 bytes per sample (40 samples per packet).
  • 22-28 bit samples : 4 bytes per sample (30 samples per packet).

Data is encoded left justified within the 7-bit bytes, with any unused (rightmost) bits being set to zero.

An example to clarify that :

The 16-bit sample : 5B3E (0101 1011 0011 1110)

would be encoded as : 00101101 01001111 01000000

Sample Dump Request

Upon receiving this message, a sampler should check to see if the requested sample number is valid (ie that it is within range). If so, then the requested sample is dumped, a packet at a time to the requesting device (using the handshaking messages as described in the Dump Procedure).

F0 7E id 03 ss ss F7
F0 7EUniversal Non Real Time Sys Ex header
idID of target device   (7F = All devices)
03Sub ID#1 = Sample Dump Request
ss ssSample number (LSB first)
F7EOX

Handshaking

There are five handshaking messages (EOF, ACK, NAK, Wait and Cancel), used in association with the Sample Dump Standard or File Dump messages. Their use is described in the Dump Procedure.

End of File (EOF)

This message signifies that the end of the file has been reached and that the data transfer has been completed successfully.

F0 7E id 7B pp F7
F0 7EUniversal Non Real Time Sys Ex header
idID of target device   (7F = All devices)
7BSub ID#1 = End of File (EOF)
ppPacket number
F7EOX

Wait

The use of this message implies 'Do not send any more packets until told to do so'. This is important for systems where the receiver needs time to perform other processing before receiving the remainder of the sample dump. An ACK will resume the dump, whereas a Cancel will abort it.

F0 7E id 7C pp F7
F0 7EUniversal Non Real Time Sys Ex header
idID of target device   (7F = All devices)
7CSub ID#1 = Wait
ppPacket number
F7EOX

Cancel

The use of this message implies 'Abort dump'. The packet number refers to the packet on which the abort takes place.

F0 7E id 7D pp F7
F0 7EUniversal Non Real Time Sys Ex header
idID of target device   (7F = All devices)
7DSub ID#1 = Cancel
ppPacket number
F7EOX

NAK

The use of this message implies 'The last data packet was received incorrectly - Please re-send'. The packet number refers to the packet being rejected.

F0 7E id 7E pp F7
F0 7EUniversal Non Real Time Sys Ex header
idID of target device   (7F = All devices)
7ESub ID#1 = NAK
ppPacket number
F7EOX

ACK

The use of this message implies 'The last data packet was received correctly - Start sending the next one'. The packet number refers to the packet being acknowledged as correct.

F0 7E id 7F pp F7
F0 7EUniversal Non Real Time Sys Ex header
idID of target device   (7F = All devices)
7FSub ID#1 = ACK
ppPacket number
F7EOX

Dump Procedure

This applies to the Sample Dump and File Dump standards and involves the transfer of data from sender to receiver. The transfer process can be initiated by either device.

The receiver can initiate the process by sending the appropriate (Sample or File) Dump Request message to the sender, whereas the sender can initiate the process by sending the appropriate (Sample or File) Dump Header message.

Sender

Either upon reception of a Dump Request, or in response to user input on the device's front panel, a Dump Header message is sent.

A timeout scheme is used to determine whether the open loop (no handshaking) or closed loop (with handshaking) protocol is to be used. The sender will wait for up to 2 seconds for a response, after which it will time out. Within this timeout period :

  • If it receives a Cancel, it will immediately abort the dump process.
  • If it receives an ACK, it will begin transfer by sending the first Data Packet.
  • If it receives a Wait, it will suspend transfer indefinitely until another message (ACK or Cancel) is received, which will then be processed as above.
  • If nothing is received within the timeout period (2s), the open loop protocol is assumed, and the dump starts with the first packet.

After sending each packet, the sender will wait at least 20ms for a response, after which it will time out. Within this timeout period :

  • If it receives an ACK, it will send the next Data Packet.
  • If it receives an NAK, and the packet number matches the number of the last packet sent, it will re-send that packet. If the packet numbers do not match, and the device is incapable of sending packets out of sequence, the NAK will be ignored, and the transfer process will continue.
  • If it receives a Wait, it will suspend transfer indefinately until one of ACK, NAK, or Cancel is received, whereupon it will continue.
  • If no messages are received within the timeout period (20ms), the sender will assume that the open loop protocol is in effect, and the next packet will be sent.

This process continues until there are less than 121 data bytes remaining to be sent. The final packet will still consist of 120 bytes, regardless, with the excess bytes all being 0.

Receiver

Whilst receiving a Sample or File Data Packet, a device should keep a running checksum. This calculated checksum can be compared with the checksum within the Data Packet to ascertain whether or not the data was received correctly :

  • If the checksums match, the receiver will send an ACK and await the next packet.
  • If the checksums do not match, it will send a NAK containing the number of the packet that caused the error, and await the next packet. If, after sending a NAK, the packet number of the next packet doesn't match the previous packet number (the one that was NAK'd), and the unit is not capable of accepting packets out of sequence, the error is ignored and the dump continues as if the checksums had matched.

If a receiver runs out of memory before the dump is completed, it will send a Cancel to stop the dump.

MTC Cueing

These messages allow timecode based event lists to be set up.

There is a corresponding set of Real Time MIDI Cueing messages, which take effect immediately.

Cueing Setup

F0 7E id 04 tt hr mn sc fr ff ee ee <info> F7
F0 7EUniversal Non Real Time Sys Ex header
idID of target device   (default = 7F = All devices)
04Sub ID#1 = MTC Cueing messages
ttSub ID#2 = Setup Type (see the following table)
hrHours and Type : 0yyzzzzz
yy = Type; 00 = 24 fps, 01 = 25 fps, 10 = 30 fps (drop frame), 11 = 30 fps (non-drop frame).
zzzzz = Hours (0-23).
mnMinutes (0-59)
scSeconds (0-59)
frFrames (0-29)
ffFractional frames (0-99)
ee eeEvent number (LSB first)
<info>Only present for Setup Types (tt) : 07, 08, 0C and 0E (see note 1 below)
F7EOX


ttDescription
00Special is used to setup a unit as a whole (as opposed to individual sequences, sounds, etc.) Note that each of the following event types, except Event List Request ignore the event time field.
ee eeDescription
00 00Time Code Offset specifies a relative offset for the receiving device.
01 00Enable Event List instructs the receiving device to execute events in its event list at the appropriate time.
02 00Disable Event List instructs the receiving device to not execute events in its event list. Essentially it acts as a mute control.
03 00Clear Event List instructs the receiving device to erase its entire event list.
04 00System Stop specifies the time at which a unit should shut down. Used to (eg) prevent a tape recorder running past the end of the reel.
05 00Event List Request is used to request a list of Cueing Setup messages which describe the receiving device's event list, starting from the SMPTE time specified in the request message.
01Punch In These enable / disable record mode for the receiving device. The Event Number (ee ee) specifies the track number. Multiple points may be specified by sending a series of Cueing Setup messages with different times.
02Punch Out
03Delete Punch In These delete the matching point, ie Time and Track (Event Number), from the cue list.
04Delete Punch Out
05Event Start These refer to the running or playback of an event, and are used when a long sequence of events or a continuous event is to be started / stopped. Hence an event is a macro. The Event Number (ee ee) specifies which event is being refered to. A single event (eg mixer fader movement, playback of a sample, etc) may occur several times throughout a Cue List. These events will be refered to by the same event number, with different Start and Stop times.
06Event Stop
07Event Start + Info As above, though with additional information (see note 1, below).
08Event Stop + Info
09Delete Event Start These delete the matching event (Time and Event Number) whether with or without additional information, from the Cue List.
0ADelete Event Stop
0BCue Point This is a marker for a particular occurance, eg an editing reference, or sound effects point. Each Cue Number is assigned to such an occurance. (Use Event Start/Stop for continuous events.)
0CCue Point + Info This is like Event Start/Stop with additional Info, except that the event represents a Cue Point rather than a Start/Stop Point. See note 1 below.
0DDelete Cue Point Deletes the matching Cue Event (Time and Event Number) whether with or without additional information, from the Cue List.
0EEvent Name in Info This is used to label an Event Number. See note 1 below.
Notes :
1 Additional Information is a stream of nibblised MIDI data, LS nibble first, except when Setup Type = 0E, where it is nibblised ASCII data, again LS nibble first. An ASCII newline comprises a CR followed by a LF.

Sample Dump Extensions

With the passage of time since the original Sample Dump Standard, a number of shortcomings had become apparent :

  • Only a single loop could be specified.
  • An inability to name samples.
  • A 2MB sample limit.
  • Limited precision for describing the sample rate.

The following messages were added as an extension to the Sample Dump Standard, to address these limitations.


The first two messages overcome the 'single loop' shortcoming by allowing up to 16,383 pairs of loop points to be defined for each sample. They also allow loop points to be modified without having to re-send the entire sample.

Loop Point Transmission

F0 7E id 05 01 ss ss nn nn dd bb bb bb ee ee ee F7
F0 7EUniversal Non Real Time Sys Ex header
idID of target device   (default = 7F = All devices)
05Sub ID#1 = Sample Dump Extensions
01Sub ID#2 = Loop Point Transmission
ss ssSample number (LSB first)
nn nnLoop number (LSB first):  00 00 = the Sustain loop;  7F 7F = Delete all loops
ddLoop type: 00 = Forwards only (unidirectional); 01 = Backwards/Forwards (bi-directional); 7F = Off
bb bb bbLoop start address (in samples; LSB first)
ee ee eeLoop end address (in samples; LSB first)
F7EOX

Loop Point Request

F0 7E id 05 02 ss ss nn nn F7
F0 7EUniversal Non Real Time Sys Ex header
idID of target device   (default = 7F = All devices)
05Sub ID#1 = Sample Dump Extensions
02Sub ID#2 = Loop Point Request
ss ssSample number (LSB first)
nn nnLoop number (LSB first):  7F 7F = Request all loops
F7EOX

With the exception of the Request all loops and Delete all loops commands (when Loop Number = 7F 7F), the Loop Point Request and Loop Point Transmission messages affect a single loop point (start and end points).

Loop number 00 00 is the same as the sustain loop as defined in the SDS.


The following two messages provide support for sample names.

Sample Name Transmission

F0 7E id 05 03 ss ss tt <tag> nn <name> F7
F0 7EUniversal Non Real Time Sys Ex header
idID of target device   (default = 7F = All devices)
05Sub ID#1 = Sample Dump Extensions
03Sub ID#2 = Sample Name Transmission
ss ssSample number (LSB first)
ttSample Name Language Tag Length (default = 00)
<tag>Sample Language Tag Data (data comprising tt bytes)
nnSample Name Length (up to 127 characters)
<name>Sample Name Data (string of length nn bytes)
F7EOX

Note

The Sample Name Language Tag allows for future expansion regarding support for other languages. The default setting is zero, which defaults to English, and in this case the Name Data field is encoded using standard ASCII.


Sample Name Request

F0 7E id 05 04 ss ss F7
F0 7EUniversal Non Real Time Sys Ex header
idID of target device   (default = 7F = All devices)
05Sub ID#1 = Sample Dump Extensions
04Sub ID#2 = Sample Name Request
ss ssSample number (LSB first)
F7EOX

Extended Dump Header

This message gets around the 2MB sample size limit imposed by the SDS, whilst also providing extended precision and range for specifying the sample rate.

F0 7E id 05 05 ss ss ff <ratei> <ratef> <len> <start> <end> tt nn F7
F0 7EUniversal Non Real Time Sys Ex header
idID of target device   (default = 7F = All devices)
05Sub ID#1 = Sample Dump Extensions
05Sub ID#2 = Extended Dump Header
ss ssSample number (LSB first)
ffSample Format (number of significant bits : 8-28)
<ratei>Sample rate integer portion in Hertz (4 bytes, LSB first)
<ratef>Sample rate fractional portion in Hertz (4 bytes, LSB first)
<len>Sample length in words (0-32 GB) (5 bytes, LSB first)
<start>Sustain Loop start point word number (5 bytes, LSB first)
<end>Sustain Loop end point word number (5 bytes, LSB first)
ttLoop type (see following table)
nnNumber of channels
F7EOX
Notes :
<ratei>
<ratef>
Allows fixed point eight byte representation of the sample rate.
Specified as 28 bits for the integer part and 28 bits for the fractional part, which allow sampling rates up to ((2^28)-1) + ((2^28)-1)/2^28, or 268435455.9999999962747 Hz to be represented. This is a change from the original Sample Dump Header, which specified the sample period.
<end> The Sustain Loop End Point is the last sample played.
<nn> The number of audio channels (0-127) of the current sample. The total number of samples within the Sample Dump is the number of channels times the sample size. If the number of audio channels within the header is defined as 0 (nn = 0) this should be considered an error condition. Commonly expected values are nn = 1 and nn = 2. Samples for audio channels are interleaved. For stereo samples, ch1=left and ch2=right. If there are 3 audio channels (nn = 3), then the samples are interleaved as follows (where c1 = channel 1, c2 = channel 2, and c3 = channel 3): c1c2c3 c1c2c3.

Loop types

In the descriptions below, 'forward' refers to playing samples in order from lower memory addresses to higher memory addresses, whilst 'backward' playback refers to playing samples in order from higher memory addresses to lower memory addresses.

Sample pointers appear in the order : Sample start, Loop start, Loop end, Sample end.

ttDescription
00Forward playback with a uni-directional loop. The sample plays from sample start to loop end, jumps to loop start, and continues in this fashion until voice playback stops.
01Forward playback with a bi-directional loop. The sample plays from sample start to loop end, plays backwards to loop start, plays forwards to loop end, and continues in this fashion until voice playback stops.
02Forward playback with a uni-directional loop and release. The sample plays from sample start to loop end, jumps to loop start, plays forwards to loop end, and continues in this fashion until key up. When the key is released, continue playing the sample to the end of the programmed loop, and then play the remaining portion of the sample after the programmed loop.
03Forward playback with a bi-directional loop and release. The sample plays from sample start to loop end, plays backwards to loop start, plays forwards to loop end, and continues in this fashion until key up. When the key is released, continue playing the sample to the end of the programmed loop, and then play the remaining portion of the sample after the programmed loop.
40Backward playback with a uni-directional loop. The sample plays from sample end to loop start, jumps to loop end, and continues in this fashion until voice playback stops.
41Backward playback with a bi-directional loop. The sample plays from sample end to loop start, plays backwards to loop end, plays forwards to loop start, and continues in this fashion until voice playback stops.
42Backward playback with a uni-directional loop and release. The sample plays backwards from sample end to loop start, jumps to loop end, plays backwards to loop start, and continues in this fashion until key up. When the key is released, continue playing the sample to the end of the programmed loop, and then play the remaining portion of the sample, after the programmed loop, backwards.
43Backward playback with a bi-directional loop and release. The sample plays backwards from sample end to loop start, plays forwards to loop end, plays backwards to loop start, and continues in this fashion until key up. When the key is released, continue playing the sample to the end of the programmed loop, and then play the remaining portion of the sample, after the programmed loop, backwards.
7EBackward one-shot playback, no looping.
7FForward one-shot playback, no looping.


As with the above Loop Point Transmission and Loop Point Request messages, the following two messages overcome the single loop shortcoming of SDS, whilst additionally allowing longer loops to be specified. Here also, loop points can be modified without having to re-send the entire sample.

Extended Loop Point Transmission

F0 7E id 05 06 ss ss nn nn tt <start> <end> F7
F0 7EUniversal Non Real Time Sys Ex header
idID of target device   (default = 7F = All devices)
05Sub ID#1 = Sample Dump Extensions
06Sub ID#2 = Extended Loop Point Transmission
ss ssSample number (LSB first)
nn nnLoop number (LSB first):  7F 7F = Delete all loops
ttLoop type (same as in Extended Dump Header, see previous table)
<start>Loop start address (in samples; 5 bytes, LSB first)
<end>Loop end address (in samples; 5 bytes, LSB first)
F7EOX

Extended Loop Point Request

F0 7E id 05 07 ss ss nn nn F7
F0 7EUniversal Non Real Time Sys Ex header
idID of target device   (default = 7F = All devices)
05Sub ID#1 = Sample Dump Extensions
07Sub ID#2 = Extended Loop Point Request
ss ssSample number (LSB first)
nn nnLoop number (LSB first):  7F 7F = Request all loops
F7EOX

General System Information

Device Identity Request

This message is sent to request the identity of the receiving device.

F0 7E id 06 01 F7
F0 7EUniversal Non Real Time Sys Ex header
idID of target device   (default = 7F = All devices)
06Sub ID#1 = General System Information
01Sub ID#2 = Device Identity Request
F7EOX

Device Identity Reply

F0 7E id 06 02 mm ff ff dd dd ss ss ss ss F7
F0 7EUniversal Non Real Time Sys Ex header
idID of target device   (default = 7F = All devices)
06Sub ID#1 = General System Information
02Sub ID#2 = Device Identity message
mmManufacturers System Exclusive ID code.
If mm = 00, then the message is extended by 2 bytes to accomodate the additional manufacturers ID code.
ff ffDevice family code (14 bits, LSB first)
dd ddDevice family member code (14 bits, LSB first)
ss ss ss ssSoftware revision level (the format is device specific)
F7EOX

File Dump

This standard is similar to the Sample Dump Standard (SDS) but applies to file data rather than to sample data.

It comprises three similarly named messages (Dump Request, Dump Header and Data Packet), which as with the SDS are used in combination with the five Handshaking messages (EOF, ACK, NAK, Wait and Cancel) in accordance with the Dump Procedure.

File Dump Header

F0 7E id 07 01 ss <type> <length> <name> F7
F0 7EUniversal Non Real Time Sys Ex header
idDevice ID of requester / receiver
07Sub ID#1 = File Dump
01Sub ID#2 = Header
ssDevice ID of sender
<type>Type of file (4 7-bit ASCII bytes) :
TypeDOS extensionDescription
'MIDI'.MIDMIDI File
'MIEX'.MEXMIDIEX File
'ESEQ'.ESQESEQ File
'TEXT'.TXT7-bit ASCII Text File
'BIN '.BINBinary File (eg MS-DOS)
'MAC '.MACMacintosh File (MacBinary header)
<length>File length (4 7-bit bytes, LSB first)
<name>Filename (7-bit ASCII bytes; as many as needed)
F7EOX

File Dump Data Packet

F0 7E id 07 02 pp bb <data> <checksum> F7
F0 7EUniversal Non Real Time Sys Ex header
idDevice ID of receiver
07Sub ID#1 = File Dump
02Sub ID#2 = Data Packet
ppPacket count
bbPacket size (number of encoded data bytes - 1)
<data>Data (encoded as below)
<checksum>XOR of all bytes following the SOX up to the checksum byte
F7EOX

Encoding of data :

The 8-bit file data needs to be converted to 7-bit form, with the result that every 7 bytes of file data translates to 8 bytes in the MIDI stream.

For each group of 7 bytes (of file data) the top bit from each is used to construct an eigth byte, which is sent first. So :

AAAAaaaa BBBBbbbb CCCCcccc DDDDdddd EEEEeeee FFFFffff GGGGgggg

becomes :

0ABCDEFG 0AAAaaaa 0BBBbbbb 0CCCcccc 0DDDdddd 0EEEeeee 0FFFffff 0GGGgggg

The final group may have less than 7 bytes, and is coded as follows (eg with 3 bytes in the final group) :

0ABC0000 0AAAaaaa 0BBBbbbb 0CCCcccc

File Dump Request

F0 7E id 07 03 ss <type> <name> F7
F0 7EUniversal Non Real Time Sys Ex header
idDevice ID of request destination (file sender)
07Sub ID#1 = File Dump
03Sub ID#2 = Request
ssDevice ID of requester (file receiver)
<type>Type of file (4 7-bit ASCII bytes) :
TypeDOS extensionDescription
'MIDI'.MIDMIDI File
'MIEX'.MEXMIDIEX File
'ESEQ'.ESQESEQ File
'TEXT'.TXT7-bit ASCII Text File
'BIN '.BINBinary File (eg MS-DOS)
'MAC '.MACMacintosh File (MacBinary header)
<name>Filename (7-bit ASCII bytes; as many as needed)
F7EOX

MIDI Tuning Standard

This standard requires that each of the 128 MIDI note numbers can be tunable to any frequency within the instrument's range. Additionally it allows provision for up to 128 tuning programs.

An instrument which supports MIDI Tuning may have less than the full complement of tuning programs.

The specification provides a frequency resolution somewhat finer than one-hundredth of a cent, which should be fine enough for most needs. Instruments supporting MIDI Tuning need not necessarily provide this fine a resolution – the specification merely permits the transfer of tuning data at any resolution up to this limit.

See also the Real Time MIDI Tuning messages and Registered Parameter Numbers 3 (Select Tuning Program) and 4 (Select Tuning Bank).

Bulk Tuning Dump Request

F0 7E id 08 00 tt F7
F0 7EUniversal Non Real Time Sys Ex header
idID of target device   (default = 7F = All devices)
08Sub ID#1 = MIDI Tuning Standard
00Sub ID#2 = Bulk Tuning Dump Request
ttTuning Program number (0-127)
F7EOX

Bulk Tuning Dump Reply

This message comprises frequency data in the 3-byte format outlined below, for all 128 MIDI note numbers, in sequence from note 0 (sent first) to note 127 (sent last).

F0 7E id 08 01 tt <name> [ xx yy zz ] ... <checksum> F7
F0 7EUniversal Non Real Time Sys Ex header
idID of target device   (default = 7F = All devices)
08Sub ID#1 = MIDI Tuning Standard
01Sub ID#2 = Bulk Tuning Dump Reply
ttTuning Program number (0-127)
<name>Name (16 7-bit ASCII bytes)
[ xx yy zz ]Frequency data for one note (repeated 128 times).   See below.
<checksum>Checksum
F7EOX

Frequency data :

The 3-byte frequency data has the following format :

0xxxxxxx 0abcdefg 0hijklmn

Where :

xxxxxxx = semitone (MIDI note number);
abcdefghijklmn = fraction of a semitone, in 0.0061 cent units.

The frequency range starts at MIDI note 0, C = 8.1758 Hz, and extends above MIDI note 127, G = 12543.875 Hz. The first byte of the frequency data word specifies the nearest equal-tempered semitone below the required frequency. The remaining two bytes specify the fraction of 100 cents above the semitone at which the required frequency lies.

The frequency data of 7F 7F 7F has special significance, and indicates a no change situation. Ie when an instrument receives these 3 bytes as frequency data, it should make no change to its stored frequency data for that MIDI key number.

General MIDI (GM)

Enable

F0 7E id 09 01 F7
F0 7EUniversal Non Real Time Sys Ex header
idID of target device   (default = 7F = All devices)
09Sub ID#1 = General MIDI (GM)
01Sub ID#2 = Enable
F7EOX

Disable

F0 7E id 09 02 F7
F0 7EUniversal Non Real Time Sys Ex header
idID of target device   (default = 7F = All devices)
09Sub ID#1 = General MIDI (GM)
02Sub ID#2 = Disable
F7EOX

Down-Loadable Sounds (DLS)

The Down-Loadable Sounds specification allows for the downloading of specific voice definitions (generally in the form of instrument wavetables), for situations which require certain voices to be available in specific locations which differ from other voice allocation modes (GM, GS, XG, etc.).

Enable

F0 7E id 0A 01 F7
F0 7EUniversal Non Real Time Sys Ex header
idID of target device   (default = 7F = All devices)
0ASub ID#1 = Down-Loadable Sounds (DLS)
01Sub ID#2 = Enable
F7EOX

Disable

F0 7E id 0A 02 F7
F0 7EUniversal Non Real Time Sys Ex header
idID of target device   (default = 7F = All devices)
0ASub ID#1 = Down-Loadable Sounds (DLS)
02Sub ID#2 = Disable
F7EOX

Real Time Universal System Exclusive Messages

MIDI Time Code (MTC)

Full Message

System Common Quarter Frame messages handle the basic running of the system, though are inadequate when needing to fast-forward, rewind, or locating a specific point in a sequence. For these cases, the Full Message should be used. This encodes the full time within a single message.

After sending this message, the sender may pause to allow the receiving devices to locate to the specified point, and then resume sending Quarter Frame messages.

Time is considered to be running upon receipt of the first Quarter Frame message following a Full Message.

F0 7F id 01 01 hr mn sc fr F7
F0 7FUniversal Real Time Sys Ex header
idID of target device   (default = 7F = All devices)
01Sub ID#1 = MTC
01Sub ID#2 = Full Time Code message
hrHours and Type : 0yyzzzzz
yy = Type: 00 = 24 fps, 01 = 25 fps, 10 = 30 fps (drop frame), 11 = 30 fps (non-drop frame).
zzzzz = Hours (0-23).
mnMinutes (0-59)
scSeconds (0-59)
frFrames (0-29)
F7EOX

User Bits

The MTC User Bits message is defined to be similar to the format used by SMPTE. Message bytes u1 to u8 correspond to the 32 bits provided by SMPTE/EBU binary groups 1 to 8 respectively. These nibble fields decode to four 8-bit bytes : aaaabbbb ccccdddd eeeeffff gggghhhh.

Byte u9 contains the two SMPTE/EBU Binary Group Flag bits, where 'j' corresponds to SMPTE time code bit 59 (EBU bit 43), and 'i' corresponds to SMPTE time code bit 43 (EBU bit 27).

F0 7F id 01 02 u1 u2 u3 u4 u5 u6 u7 u8 u9 F7
F0 7FUniversal Real Time Sys Ex header
idID of target device   (default = 7F = All devices)
01Sub ID#1 = MTC
02Sub ID#2 = User Bits message
u10000aaaa
u20000bbbb
u30000cccc
u40000dddd
u50000eeee
u60000ffff
u70000gggg
u80000hhhh
u9000000ji
F7EOX

Notation Information

Bar Marker

If MIDI Clocks (F8) are also being sent, the bar number takes effect at the next received F8. If MTC but no MIDI Clocks are being sent, the bar number takes effect at the next received F1 (MTC Quarter Frame, System Common message).

F0 7F id 03 01 aa aa F7
F0 7FUniversal Real Time Sys Ex header
idID of target device   (default = 7F = All devices)
03Sub ID#1 = Notation Information
01Sub ID#2 = Bar Marker message
aa aaBar number (LSB first) :
[00 40]Not running
[01 40] -> [00 00]Count in
[01 00] -> [7E 3F]Bar number in song
[7F 3F]Running; Bar number unknown
F7EOX

Time Signature (immediate)

This and the following message each use the same data format as the Standard MIDI File Time Signature Meta Event (FF 58) with extra bytes on the end to handle compound time signatures.

F0 7F id 03 02 ln nn dd cc bb [nn dd ...] F7
F0 7FUniversal Real Time Sys Ex header
idID of target device   (default = 7F = All devices)
03Sub ID#1 = Notation Information
02Sub ID#2 = Time Signature message; Immediate Change
lnNumber of data bytes following
nnNumerator of time signature
ddDenominator of time signature (negative power of 2)
ccNumber of MIDI clocks in a metronome click
bbNumber of notated 32nd notes in a MIDI quarter note
[nn dd ...]Additional pairs of numerators/denominators to define a compound time signature within the same bar
F7EOX

Time Signature (delayed)

F0 7F id 03 42 ln nn dd cc bb [nn dd ...] F7
F0 7FUniversal Real Time Sys Ex header
idID of target device   (default = 7F = All devices)
03Sub ID#1 = Notation Information
42Sub ID#2 = Time Signature message; Change Next Bar
lnNumber of data bytes following
nnNumerator of time signature
ddDenominator of time signature (negative power of 2)
ccNumber of MIDI clocks in a metronome click
bbNumber of notated 32nd notes in a MIDI quarter note
[nn dd ...]Additional pairs of numerators/denominators to define a compound time signature within the same bar
F7EOX

Device Control

These four messages each have a channel-based equivalent.

Device controlChannel-based
Master VolumeChannel Volume (CC 7)
Master BalanceChannel Balance (CC 8)
Master Fine TuningChannel Fine Tuning (RPN 1)
Master Coarse TuningChannel Coarse Tuning (RPN 2)

Master Volume

F0 7F id 04 01 vv vv F7
F0 7FUniversal Real Time Sys Ex header
idID of target device   (default = 7F = All devices)
04Sub ID#1 = Device Control message
01Sub ID#2 = Master Volume
vv vvVolume (LSB first) : 00 00 = volume off
F7EOX

Master Balance

F0 7F id 04 02 bb bb F7
F0 7FUniversal Real Time Sys Ex header
idID of target device   (default = 7F = All devices)
04Sub ID#1 = Device Control message
02Sub ID#2 = Master Balance
bb bbBalance (LSB first) : 00 00 = hard left, 7F 7F = hard right
F7EOX

Master Fine Tuning

F0 7F id 04 03 tt tt F7
F0 7FUniversal Real Time Sys Ex header
idID of target device   (default = 7F = All devices)
04Sub ID#1 = Device Control message
03Sub ID#2 = Master Fine Tuning
tt ttFine Tuning (LSB first). Displacement in cents from A440
LSBMSBDisplacement (cents)
0000100 / 8192 * (-8192)
0040100 / 8192 * 0
7F7F100 / 8192 * (+8191)
F7EOX

The total fine tuning displacement in cents from A440 for each MIDI channel is the summation of the displacement of this Master Fine Tuning and the displacement of the Channel Fine Tuning RPN.


Master Coarse Tuning

F0 7F id 04 04 00 tt F7
F0 7FUniversal Real Time Sys Ex header
idID of target device   (default = 7F = All devices)
04Sub ID#1 = Device Control message
04Sub ID#2 = Master Coarse Tuning
00 ttCoarse Tuning (LSB first, though the LSB is always zero)
LSBMSBDisplacement (cents)
0000100 * (-64)
0040100 * 0
007F100 * (+63)
F7EOX

The total coarse tuning displacement in cents from A440 for each MIDI channel is the summation of the displacement of this Master Coarse Tuning and the displacement of the Channel Coarse Tuning RPN.

MTC Cueing

This essentially duplicates some of the Non Real Time MIDI Cueing messages, though without the time field, as the messages described here are intended to take effect immediately.

Cueing

F0 7F id 05 tt ee ee <info> F7
F0 7FUniversal Real Time Sys Ex header
idID of target device
05Sub ID#1 = MTC Cueing messages
ttSub ID#2 = Setup Type (see the following table)
ee eeEvent number (LSB first)
<info>Only present for Setup Types (tt) : 07, 08, 0C and 0E (see note 1 below)
F7EOX


ttDescription
00Special is used to control a unit as a whole (as opposed to individual sequences, sounds, etc.)
ee eeDescription
04 00System Stop causes a unit to immediately shut down. Used to (eg) prevent a tape recorder running past the end of the reel.
01Punch In These enable / disable record mode for the receiving device. The Event Number (ee ee) specifies the track number.
02Punch Out
05Event Start These refer to the running or playback of an event, and are used when a long sequence of events or a continuous event is to be started / stopped. Hence an event is a macro. The Event Number (ee ee) specifies which event is being refered to.
06Event Stop
07Event Start + Info As above, though with additional information (see note 1, below).
08Event Stop + Info
0BCue Point This is a marker for a particular occurance, eg an editing reference, or sound effects point. Each Cue Number is assigned to such an occurance. (Use Event Start/Stop for continuous events.)
0CCue Point + Info This is like Event Start/Stop with additional Info, except that the event represents a Cue Point rather than a Start/Stop Point. See note 1 below.
0EEvent Name in InfoThis is used to label an Event Number. See note 1 below.
Notes :
1 Additional Information is a stream of nibblised MIDI data, LS nibble first, except when Setup Type = 0E, where it is nibblised ASCII data, again LS nibble first. An ASCII newline comprises a CR followed by a LF.

MIDI Machine Control (MMC) Commands

'Single-byte' MMC Commands

These messages require no additional data beyond the command code (Sub ID#2) itself.

F0 7F id 06 cc F7
F0 7FUniversal Real Time Sys Ex header
idID of target device
06Sub ID#1 = MMC Command
ccSub ID#2 = Command (see the following table)
F7EOX


ccDescription
01Stop Instructs the receiving device to immediately cease playback.
02Play Instructs the receiving device to immediately begin playback.
03Deferred Play Instructs the receiving device to begin playback. If the device is busy (eg it has been instructed to locate the playhead to a specific position, but hasn't yet got there) then playback will begin when the device is ready.
04Fast Forward Instructs the receiving device to immediately enter fast forward mode.
05Rewind Instructs the receiving device to immediately enter rewind mode.
06Record Strobe Instructs the receiving device to immediately start recording (Punch In).
07Record Exit Instructs the receiving device to immediately stop recording (Punch Out).
08Record Pause Instructs the receiving device to immediately enter record ready mode.
09Pause Instructs the receiving device to immediately enter paused mode.
0AEject
0BChase
0CCommand Error Reset
0DMMC Reset Resets the receiving device to its default / start-up state.

Locate / Go To

This message moves the receiving device's playhead to the specified SMPTE location.

F0 7F id 06 44 06 01 hr mn sc fr sf F7
F0 7FUniversal Real Time Sys Ex header
idID of target device
06Sub ID#1 = MMC Command
44Sub ID#2 = Locate / Go To
06number of data bytes that follow
01
hrHours and Type : 0yyzzzzz
yy = Type: 00 = 24 fps, 01 = 25 fps, 10 = 30 fps (drop frame), 11 = 30 fps (non-drop frame)
zzzzz = Hours (0-23)
mnMinutes (0-59)
scSeconds (0-59)
frSMPTE frame number (0-29)
sfSMPTE sub-frame number (0-99)
F7EOX

Shuttle

This message provides bi-directional shuttling of the receiving device's playhead position.

F0 7F id 06 47 03 sh sm sl F7
F0 7FUniversal Real Time Sys Ex header
idID of target device
06Sub ID#1 = MMC Command
47Sub ID#2 = Shuttle
03number of data bytes that follow
sh sm slShuttle direction and speed. Bit 6 of sh gives direction (0 = forward, 1 = backward)
F7EOX

MIDI Tuning Standard

See also the Non Real Time MIDI Tuning messages.

Single Note Tuning Change

This message enables retuning of individual MIDI note numbers to new frequencies in real time as a performance control. It also allows multiple changes to be made using a single message.

Note that if the note being retuned is currently sounding (within a tone generator), the note should be immediately retuned as it continues to sound with no glitching, re-triggering or other audible artifacts.

See also Registered Parameter Numbers 3 (Select Tuning Program) and 4 (Select Tuning Bank), which allow the selection of predefined tunings.

F0 7F id 08 02 tt nn [ kk xx yy zz ] ... F7
F0 7FUniversal Real Time Sys Ex header
idID of target device
08Sub ID#1 = MIDI Tuning Standard
02Sub ID#2 = Single Note Tuning Change
ttTuning Program number (0-127)
nnNumber of changes; 1 change = 1 set of [ kk xx yy zz ]
[ kkMIDI Key number
xx yy zz ]Frequency data for key 'kk' (repeated 'nn' times).   See below.
F7EOX

Frequency data :

The 3-byte frequency data has the following format :

0xxxxxxx 0abcdefg 0hijklmn

Where :

xxxxxxx = semitone (MIDI note number);
abcdefghijklmn = fraction of a semitone, in 0.0061 cent units.

The frequency range starts at MIDI note 0, C = 8.1758 Hz, and extends above MIDI note 127, G = 12543.875 Hz. The first byte of the frequency data word specifies the nearest equal-tempered semitone below the required frequency. The remaining two bytes specify the fraction of 100 cents above the semitone at which the required frequency lies.