Description
I had some issues with the decode and encode sysex functions on a Korg Electribe (and other Korg devices). In the encode/decodesysEx funcs, MSB bits are encoded on the 8th byte from bit 6 to bit 0 corresponding respectively to bytes 1 to 7 in the set. I got somes stranges values when decoding dumps from an Korg Electribe ES1, and saw that the logic of encoding bits was inverted, i.e. from bit 0 to bit 6.
For example, the following message received from the an ES1
(02) 07 7F 00 00 00 00 00
is corresponding to the decoded msg
07 FF 00 00 00 00 00
but encoded with encodeSysEx, I get
(20) 07 7F 00 00 00 00 00
That is clear in the code of encodeSysEx when moving bits in outSysEx[0].
outSysEx[0] |= (msb << (6 - count));
This match with the way to encode sample and file dumps in the midi standard but however I suggest to add an optional parameter to cover that case from such manufacturer, and making these sysex utility funcs a "bit" more universal.
/////////////////////////////////////////////////
// ENCODE 8BITS TO 7BITS SYSEX
/////////////////////////////////////////////////
unsigned encodeSysEx(const byte* inData, byte* outSysEx, unsigned inLength,bool fromHighbit)
{
unsigned outLength = 0; // Num bytes in output array.
byte count = 0; // Num 7bytes in a block.
outSysEx[0] = 0;
for (unsigned i = 0; i < inLength; ++i)
{
const byte data = inData[i];
const byte msb = data >> 7;
const byte body = data & 0x7f;
outSysEx[0] |= (msb << (fromHighbit ? 6-count : count ));
outSysEx[1 + count] = body;
if (count++ == 6)
{
outSysEx += 8;
outLength += 8;
outSysEx[0] = 0;
count = 0;
}
}
return outLength + count + (count != 0 ? 1 : 0);
}
/////////////////////////////////////////////////
// DECODE 7BITS SYSEX TO 8BITS
/////////////////////////////////////////////////
unsigned decodeSysEx(const byte* inSysEx, byte* outData, unsigned inLength,bool fromHighbit)
{
unsigned count = 0;
byte msbStorage = 0;
byte byteIndex = 0;
for (unsigned i = 0; i < inLength; ++i)
{
if ((i % 8) == 0)
{
msbStorage = inSysEx[i];
byteIndex = 6;
}
else
{
const byte body = inSysEx[i];
const byte msb = ((msbStorage >> (fromHighbit ? byteIndex : 6 - byteIndex) ) & 1) << 7;
byteIndex--;
outData[count++] = msb | body;
}
}
return count;
}