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