MIDI Implementation
■ Examples of actual MIDI message |
| ● Example of an Exclusive message |
|
| ||||||||||||
|
|
| ||||||||||||||
<Example1> 92 3E 5F |
|
|
| and calculating a Checksum |
|
|
| |||||||||
9n is the | Roland Exclusive messages (RQ1, DT1) are transmitted with a checksum at the end | |||||||||||||||
and 5FH = 95, this is a | (before F7) to make sure that the message was correctly received. The value of the | |||||||||||||||
name is D4), and velocity 95. |
| checksum is determined by the address and data (or size) of the transmitted | ||||||||||||||
<Example2> C9 20 |
| exclusive message. |
|
|
|
|
|
| ||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
| |||
CnH is the Program Change status, and n is the MIDI channel number. Since 9H = | ❍ How to calculate the checksum |
|
|
|
| |||||||||||
9 and 20H = 32, this is a Program Change message with MIDI CH = 10, program | (hexadecimal numbers are indicated by "H") |
|
|
|
| |||||||||||
number 33 (Drum Kit No.33). |
| The checksum is a value derived by adding the address, size and checksum itself | ||||||||||||||
<Example3> E3 00 28 |
| and inverting the lower 7 bits. |
|
|
|
| ||||||||||
| Heres an example of how the checksum is calculated. We will assume that in the | |||||||||||||||
EnH is the Pitch Bend Change status, and n is the MIDI channel number. The 2nd | ||||||||||||||||
exclusive message we are transmitting, the address is aa bb cc ddH and the data or | ||||||||||||||||
byte (00H=0) is the LSB and the 3rd byte (28H=40) is the MSB, but Pitch Bend Value | ||||||||||||||||
size is ee ff gg hhH. |
|
|
|
|
|
| ||||||||||
is a signed number in which 40 00H ( = 64 x 128 + 0 = 8192) is 0, so this Pitch Bend |
|
|
|
|
|
| ||||||||||
aa + bb + cc + dd + ee + ff + gg + hh = sum |
|
|
|
| ||||||||||||
Value is |
|
|
|
|
|
| ||||||||||
|
| sum / 128 = quotient ... remainder |
|
|
|
| ||||||||||
28 00H - 40 00H = 40 x 128 + 0 - (64 x 128 + 0) = 5120 - 8192 = |
|
|
|
|
| |||||||||||
| 128 - remainder = checksum |
|
|
|
|
| ||||||||||
|
|
|
|
|
|
|
| |||||||||
<Example4> B3 64 00 65 00 06 0C 26 00 64 7F 65 7F |
| (However, the checksum will be 0 if the remainder is 0.) |
|
| ||||||||||||
BnH is the Control Change status, and n is the MIDI channel number. For Control | <Example1> Setting pan of snare drum (Trigger 2) in drum kit 1 to | |||||||||||||||
Changes, the 2nd byte is the control number, and the 3rd byte is the value. In a case |
|
|
|
|
| "ALTERNATE". |
|
|
|
| ||||||
in which two or more messages consecutive messages have the same status, MIDI |
|
|
|
|
|
|
|
|
| |||||||
According to the "Parameter address map", the drum kit No.1 has an address of 01 | ||||||||||||||||
has a provision called "running status" which allows the status byte of the second | ||||||||||||||||
00 00 00H, drum kit pad parameter of Trigger 2 has a offset address of 03 00H and | ||||||||||||||||
and following messages to be omitted. Thus, the above messages have the |
| |||||||||||||||
| pan has a offset address of 26H. Thus, |
|
|
|
| |||||||||||
following meaning. |
|
|
|
|
| |||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
| |||
B3 64 00 | MIDI ch.4, lower byte of RPN parameter number: | 00H |
|
| 01 | 00 00 | 00 |
|
|
|
|
|
|
| ||
|
|
|
| 03 | 00 |
|
|
|
|
|
|
| ||||
(B3) 65 00 | (MIDI ch.4) upper byte of RPN parameter number: | 00H |
|
|
|
|
|
|
|
|
|
|
| |||
+) |
|
|
| 26 |
|
|
|
|
|
|
| |||||
(B3) 06 0C | (MIDI ch.4) upper byte of parameter value: | 0CH |
|
| 01 | 00 03 | 26 |
|
|
|
|
|
|
| ||
|
|
|
|
|
|
|
|
|
|
|
|
| ||||
(B3) 26 00 | (MIDI ch.4) lower byte of parameter value: | 00H | and "ALTERNATE" is a value of 20H, |
|
|
|
| |||||||||
(B3) 64 7F | (MIDI ch.4) lower byte of RPN parameter number: | 7FH | F0 | 41 | 10 | 00 3F | 12 | 01 00 03 26 | 20 | ?? | F7 |
| ||||
(B3) 65 7F | (MIDI ch.4) upper byte of RPN parameter number: | 7FH |
| |||||||||||||
(1) | (2) | (3) | (4) | (5) | address | data checksum | (6) |
| ||||||||
|
|
|
| |||||||||||||
In other words, the above messages specify a value of 0C 00H for RPN parameter | (1) Exclusive status, (2) ID number (Roland), (3) Device ID (17) |
|
| |||||||||||||
number 00 00H on MIDI channel 4, and then set the RPN parameter number to 7F | (4) Model ID |
|
|
| ||||||||||||
7FH. |
|
| Next we calculate the checksum. |
|
|
|
| |||||||||
|
|
|
|
|
|
| ||||||||||
RPN parameter number 00 00H is Pitch Bend Sensitivity, and the MSB of the value | 01H + 00H + 03H + 26H + 20H = 1 + 0 + 3 + 38 + 32 = 74 (sum) |
|
| |||||||||||||
indicates semitone units, so a value of 0CH = 12 sets the maximum pitch bend |
|
| ||||||||||||||
74 (sum)/ 128 = 0 (quotient) ... 74 (remainder) |
|
|
| |||||||||||||
range to +- 12 semitones (1 octave). (On GS sound sources the LSB of Pitch Bend |
|
|
| |||||||||||||
checksum = 128 - 74 (remainder) = 54 = 36H |
|
|
|
| ||||||||||||
Sensitivity is ignored, but the LSB should be transmitted anyway (with a value of 0) |
|
|
|
| ||||||||||||
This means that F0 41 10 00 3F 12 01 00 03 26 20 36 F7 is the message we transmit. | ||||||||||||||||
so that operation will be correct on any device.) |
| |||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
| |||
Once the parameter number has been specified for RPN or NRPN, all Data Entry | <Example2> Requesting transmission of master volume of drum | |||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
| ||||
messages transmitted on that same channel will be valid, so after the desired value |
|
|
|
|
| kit 1. |
|
|
|
|
| |||||
has been transmitted, it is a good idea to set the parameter number to 7F 7FH to | According to the "Parameter address map",the drum kit No.1 has an address of 01 | |||||||||||||||
prevent accidents. This is the reason for the (B3) 64 7F (B3) 65 7F at the end. | ||||||||||||||||
00 00 00H, drum kit common parameter has a offset address of 00 00H |
| |||||||||||||||
|
|
|
| |||||||||||||
It is not desirable for performance data (such as Standard MIDI File data) to contain | and master volume has a offset address of 15H. Thus, |
|
|
| ||||||||||||
many events with running status as given in <Example 4>. This is because if |
|
| 01 | 00 00 | 00 |
|
|
|
|
|
|
| ||||
playback is halted during the song and then rewound or |
|
|
|
|
|
|
|
|
| |||||||
|
|
|
| 00 00 |
|
|
|
|
|
|
| |||||
sequencer may not be able to transmit the correct status, and the sound source will | +) |
|
|
| 15 |
|
|
|
|
|
|
| ||||
|
| 01 | 00 00 | 15 |
|
|
|
|
|
|
| |||||
then misinterpret the data. Take care to give each event its own status. |
|
|
|
|
|
|
|
|
|
| ||||||
| Since Size = 00 00 00 01H, |
|
|
|
|
| ||||||||||
|
|
|
|
|
|
|
| |||||||||
It is also necessary that the RPN or NRPN parameter number setting and the value | F0 | 41 | 10 | 00 3F | 11 | 01 00 00 15 | 00 00 00 01 | ?? | F7 | |||||||
setting be done in the proper order. On some sequencers, events occurring in the | ||||||||||||||||
(1) | (2) | (3) | (4) | (5) | address | size | checksum | (6) | ||||||||
same (or consecutive) clock may be transmitted in an order different than the order | ||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
| ||||
in which they were received. For this reason it is a good idea to slightly skew the | (1) Exclusive status, (2) ID number (Roland), (3) Device ID (17) |
|
| |||||||||||||
time of each event (about 1 tick for TPQN =96, and about 5 ticks for TPQN =480). | (4) Model ID |
|
|
| ||||||||||||
* TPQN : Ticks Per Quarter Note |
| Next we calculate the checksum. |
|
|
|
| ||||||||||
|
|
| 01H + 00H + 00H + 15H + 00H + 00H +00H + 01H = 1 + 0 + 0 + 21 + 0 + 0 + 0 + 1 = | |||||||||||||
|
|
| 23 (sum) |
|
|
|
|
|
|
|
|
| ||||
|
|
| 23 (sum) / 128 = 0(quotient) ... 23 (remainder) |
|
|
| ||||||||||
|
|
| checksum = 128 - 23 (remainder) = 105 = 69H |
|
|
| ||||||||||
|
|
| This means that F0 41 10 00 3F 11 01 00 00 15 00 00 00 01 69 F7 is the message we | |||||||||||||
|
|
| transmit. |
|
|
|
|
|
|
|
|
| ||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|