This is a simple tutorial on how to calculate the Roland checksum. I'm making a few assumptions here, if you are unfamiliar with the following terms then please get to grips with them before continuing. - You should have a basic understanding of a "hexadecimal" value. - You should know what a "byte" is. Firstly let's have a look at the construct of a complete system exclusive message (SysEx): Header Address Data Checksum Eox The Header always starts with F0h which is the MIDI SysEx identifier. Next is the Manufacturers id. (e.g. Roland = 41h) Next is the Device id. (e.g. Unit#17 = 10h) Next is the Model id. (e.g. SCC-1 = 42h) Lastly is the command id for sending (12h) (or receiving (11h)). The Address is always a three byte value which tells the device where the data is to be written. The Data is the string of bytes which will be written starting from the address you specified. The checksum is a value derived from the address and the data. The device will also calculate it from the address and data it receives and check its checksum against the one you supply. If they match then it has received the SysEx message correctly. The Eox (end of exclusive) is always F7h according to the latest MIDI spec. Okay, now for the checksum calculation. Remember it only uses the address and the data. The first example we will use is the example at the bottom of page 39 of the SCC-1 manual, for adjusting the master volume. The address is 40h 00h 04h and the data 64h. Here's how the checksum is derived: Add each of the values, one by one. Each time the value exceeds 127 (7Fh) subtract 128 (80h) from it. Finally subtract the resultant value from 128 and you have your checksum! In hexadecimal: (I won't put h after each value for clarity) 40 + 00 = 40 (Surprise!) 40 + 04 = 44 44 + 64 = A8 ( A8 > 7F so...) A8 - 80 = 28 80 - 28 = 58 (The checksum is 58h) In decimal: 64 + 0 = 0 64 + 4 = 68 68 + 100 = 168 ( 168 > 127 so...) 168 - 128 = 40 128 - 40 = 88 (The checksum is 88) To show what is actually happening I'll show you the last line in binary: 10000000 - 00101000 = 01011000 According to the manual "The error checking process uses a checksum that provides a bit pattern where the least significant 7 bits are zero when values for an address, [data], and that checksum are summed." The low bits in binary are on the right. In the binary calculation above, add the address, data and checksum and you get back to 128, which has all seven lower bits clear: address & data + checksum = 128 00101000 + 01011000 = 10000000 Note that in this example, while summing the values we exceeded 127 and had to subtract 128. This is not always necessary, as long as the summed values do not exceed 127. If the sum of the values comes to 128 then I'm sure it is clear that the checksum is 128! Look at the arithmetic: x + y = 128 ( 128 > 127 so...) 128 - 128 = 0 128 - 0 = 128 (The checksum is 128) If anything in this document is ambiguous or unclear, please let me know so that I can improve it for everyone's benefit. Eddie lotter@cc.und.ac.za