The MIDI Tuning Standard

The MIDI Tuning Standard was ratified by the MIDI Manufacturers' Association in January 1992. Credit should be given to Robert Rich and Carter Scholz who wrote and lobbied for this addition to the MIDI specification. Manufacturers have the option of supporting the tuning standard partially or in full. It is featured on some Emu and Ensoniq instruments. Currently they implement only the non-realtime features of the standard.

Non-realtime messages

Request a bulk tuning dump from your synthesizer by sending the following codes:

F0 7E id 08 00 tt F7

where

F0 7E  = universal non-realtime SysEx header
id     = target device ID
08     = sub-ID #1 (MIDI tuning standard)
00     = sub-ID #2 (bulk dump request)
tt     = tuning program number 0 to 127 in hexadecimal
F7     = end of SysEx message

for example, request a bulk dump of tuning program 16 from device 1 with the following message:

F0 7E 01 08 00 10 F7

The synthesizer sends the bulk tuning dump in the following format:

F0 7E id 08 01 tt <tn>x16 <xx yy zz>x128 ck F7

where

F0 7E = universal non-realtime SysEx header
id    = target device ID
08    = sub-ID #1 (MIDI tuning standard)
01    = sub-ID #2 (Bulk dump reply)
tt    = tuning program number 0 to 127 in hexadecimal
tn    = tuning name (16 ASCII characters)
xx yy zz    = frequency data for one note (repeated 128 times)
              see below for format
ck    = checksum
F7    = end of SysEx message

Realtime messages

The following message changes the tuning of one or more notes in realtime. The "preferred" method according to the specification is to change the tuning immediately for any notes currently sounding. The optional method is to change the tuning only for new notes that follow the tuning message. In reality, the preferred method depends on what the composer is trying to accomplish and this author recommends a global parameter on the synthesizer to select between immediate and new note only retuning.

F0 7F id 08 02 tt ll [kk xx yy zz]x(ll) F7

where

F0 7F = universal realtime SysEx header
id    = target device ID
08    = sub-id #1 (MIDI tuning standard)
02    = sub-id #2 (note change)
tt    = tuning program number from 0 to 127
ll    = number of notes to be changed (sets of [kk xx yy zz])
[kk xx yy zz] = MIDI note number, followed by frequency data for note
F7    = end of SysEx message

Tuning program and bank changes

Tuning  programs and banks are changed using registered parameter number controller messages.

Tuning program change

Bn 64 00 65 03 06 tt (data entry)
Bn 64 00 65 03 60 7F (data increment)
Bn 64 00 65 03 61 7F (data decrement)
                     
n = basic channel number
tt = tuning program number from 1 to 128

Tuning bank change

Bn 64 00 65 04 06 tt (data entry)
Bn 64 00 65 04 60 7F (data increment)
Bn 64 00 65 04 61 7F (data decrement)

n = basic channel number
tt = tuning bank number from 1 to 128

Frequency data format (all bytes in hex)

xx = semitone (MIDI note number to retune to, unit is 100 cents)
yy = MSB of fractional part (1/128 semitone = 100/128 cents = .78125 cent units)
zz = LSB of fractional part (1/16384 semitone = 100/16384 cents = .0061 cent units)

7F 7F 7F is reserved for no change to the existing note tuning