I want to bring to your attention that you could face some issues with the decode and encode sysex functions from the standard Arduino MIDI library with 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. The Korg encoding bits logic is inverted, i.e. from bit 0 to bit 6 : it is at least what I found out from my Electribe ES1 dump but it is probably true for other Korg devices...
For example, the following message received from my 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
The code of the 2 functions must be modified as below if you need to encode / decode Sysex to/from Korg devices (then you must set the optional parameter "fromMsbToLsb" to false).
I have opened an issue on the Midi library GitHub, but this is not really a bug however... !
the sorrows of sysex....
// prototypes are :
unsigned encodeSysEx(const byte* inData, byte* outSysEx, unsigned inLength,bool fromMsbToLsb=true);
unsigned decodeSysEx(const byte* inSysEx, byte* outData, unsigned inLength,bool fromMsbToLsb=true);
/////////////////////////////////////////////////
// ENCODE 8BITS TO 7BITS SYSEX
/////////////////////////////////////////////////
prototypes are :
unsigned encodeSysEx(const byte* inData, byte* outSysEx, unsigned inLength,bool fromMsbToLsb)
{
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 << (fromMsbToLsb ? 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 fromMsbToLsb)
{
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 >> (fromMsbToLsb ? byteIndex : 6 - byteIndex) ) & 1) << 7;
byteIndex--;
outData[count++] = msb | body;
}
}
return count;
}