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