Moved encode/decode sysex out of MidiInterface.

This commit is contained in:
Francois Best 2012-09-27 21:23:15 +02:00
parent 2c4f926de7
commit d8b0d6f838
3 changed files with 67 additions and 76 deletions

View File

@ -52,5 +52,67 @@
BEGIN_MIDI_NAMESPACE BEGIN_MIDI_NAMESPACE
/*! \brief Encode System Exclusive messages.
SysEx messages are encoded to guarantee transmission of data bytes higher than
127 without breaking the MIDI protocol. Use this static method to convert the
data you want to send.
\param inData The data to encode.
\param outSysEx The output buffer where to store the encoded message.
\param inLength The lenght of the input buffer.
\return The lenght of the encoded output buffer.
@see decodeSysEx
*/
byte encodeSysEx(const byte* inData, byte* outSysEx, byte inLength)
{
byte retlen = 0;
byte compteur;
byte count7 = 0;
outSysEx[0] = 0;
for (compteur = 0; compteur < inLength; compteur++) {
byte c = inData[compteur] & 0x7F;
byte msb = inData[compteur] >> 7;
outSysEx[0] |= msb << count7;
outSysEx[1 + count7] = c;
if (count7++ == 6) {
outSysEx += 8;
retlen += 8;
outSysEx[0] = 0;
count7 = 0;
}
}
return retlen + count7 + ((count7 != 0)?1:0);
}
/*! \brief Decode System Exclusive messages.
SysEx messages are encoded to guarantee transmission of data bytes higher than
127 without breaking the MIDI protocol. Use this static method to reassemble
your received message.
\param inSysEx The SysEx data received from MIDI in.
\param outData The output buffer where to store the decrypted message.
\param inLength The lenght of the input buffer.
\return The lenght of the output buffer.
@see encodeSysEx @see getSysExArrayLength
*/
byte decodeSysEx(const byte* inSysEx, byte* outData, byte inLength)
{
byte cnt;
byte cnt2 = 0;
byte bits = 0;
for (cnt = 0; cnt < inLength; ++cnt) {
if ((cnt % 8) == 0) {
bits = inSysEx[cnt];
}
else {
outData[cnt2++] = inSysEx[cnt] | ((bits & 1) << 7);
bits >>= 1;
}
}
return cnt2;
}
END_MIDI_NAMESPACE END_MIDI_NAMESPACE

View File

@ -79,9 +79,6 @@ public:
DataByte inData2, DataByte inData2,
Channel inChannel); Channel inChannel);
public:
static byte decodeSysEx(const byte* inSysEx, byte* outData, byte inLenght);
private: private:
inline StatusByte getStatus(MidiType inType, inline StatusByte getStatus(MidiType inType,
Channel inChannel) const; Channel inChannel) const;
@ -113,7 +110,6 @@ public:
public: public:
static inline MidiType getTypeFromStatusByte(const byte inStatus); static inline MidiType getTypeFromStatusByte(const byte inStatus);
static byte encodeSysEx(const byte* inData, byte* outSysEx, byte inLenght);
private: private:
bool inputFilter(Channel inChannel); bool inputFilter(Channel inChannel);
@ -220,6 +216,11 @@ private:
SerialPort& mSerial; SerialPort& mSerial;
}; };
// -----------------------------------------------------------------------------
byte encodeSysEx(const byte* inData, byte* outSysEx, byte inLenght);
byte decodeSysEx(const byte* inSysEx, byte* outData, byte inLenght);
END_MIDI_NAMESPACE END_MIDI_NAMESPACE
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------

View File

@ -164,42 +164,6 @@ void MidiInterface<SerialPort>::send(MidiType inType,
sendRealTime(inType); // System Real-time and 1 byte. sendRealTime(inType); // System Real-time and 1 byte.
} }
/*! \brief Encode System Exclusive messages.
SysEx messages are encoded to guarantee transmission of data bytes higher than
127 without breaking the MIDI protocol. Use this static method to convert the
data you want to send.
\param inData The data to encode.
\param outSysEx The output buffer where to store the encoded message.
\param inLength The lenght of the input buffer.
\return The lenght of the encoded output buffer.
@see decodeSysEx
*/
template<class SerialPort>
byte MidiInterface<SerialPort>::encodeSysEx(const byte* inData,
byte* outSysEx,
byte inLength)
{
byte retlen = 0;
byte compteur;
byte count7 = 0;
outSysEx[0] = 0;
for (compteur = 0; compteur < inLength; compteur++) {
byte c = inData[compteur] & 0x7F;
byte msb = inData[compteur] >> 7;
outSysEx[0] |= msb << count7;
outSysEx[1 + count7] = c;
if (count7++ == 6) {
outSysEx += 8;
retlen += 8;
outSysEx[0] = 0;
count7 = 0;
}
}
return retlen + count7 + ((count7 != 0)?1:0);
}
#endif // MIDI_BUILD_OUTPUT #endif // MIDI_BUILD_OUTPUT
@ -628,42 +592,6 @@ void MidiInterface<SerialPort>::launchCallback()
#endif // MIDI_USE_CALLBACKS #endif // MIDI_USE_CALLBACKS
// -----------------------------------------------------------------------------
/*! \brief Decode System Exclusive messages.
SysEx messages are encoded to guarantee transmission of data bytes higher than
127 without breaking the MIDI protocol. Use this static method to reassemble
your received message.
\param inSysEx The SysEx data received from MIDI in.
\param outData The output buffer where to store the decrypted message.
\param inLength The lenght of the input buffer.
\return The lenght of the output buffer.
@see encodeSysEx @see getSysExArrayLength
*/
template<class SerialPort>
byte MidiInterface<SerialPort>::decodeSysEx(const byte* inSysEx,
byte* outData,
byte inLength)
{
byte cnt;
byte cnt2 = 0;
byte bits = 0;
for (cnt = 0; cnt < inLength; ++cnt) {
if ((cnt % 8) == 0) {
bits = inSysEx[cnt];
}
else {
outData[cnt2++] = inSysEx[cnt] | ((bits & 1) << 7);
bits >>= 1;
}
}
return cnt2;
}
#endif // MIDI_BUILD_INPUT #endif // MIDI_BUILD_INPUT