mPendingMessageExpectedLength as before
mMessage.length is reset to 0 before the callback, so bring back mPendingMessageExpectedLength as before, and set mMessage.length (and not reset it)
This commit is contained in:
parent
e7588b906d
commit
2734894485
|
|
@ -243,6 +243,7 @@ private:
|
||||||
StatusByte mRunningStatus_RX;
|
StatusByte mRunningStatus_RX;
|
||||||
StatusByte mRunningStatus_TX;
|
StatusByte mRunningStatus_TX;
|
||||||
byte mPendingMessage[3];
|
byte mPendingMessage[3];
|
||||||
|
unsigned mPendingMessageExpectedLength;
|
||||||
unsigned mPendingMessageIndex;
|
unsigned mPendingMessageIndex;
|
||||||
unsigned mCurrentRpnNumber;
|
unsigned mCurrentRpnNumber;
|
||||||
unsigned mCurrentNrpnNumber;
|
unsigned mCurrentNrpnNumber;
|
||||||
|
|
|
||||||
38
src/MIDI.hpp
38
src/MIDI.hpp
|
|
@ -36,6 +36,7 @@ inline MidiInterface<Transport, Settings, Platform>::MidiInterface(Transport& in
|
||||||
, mInputChannel(0)
|
, mInputChannel(0)
|
||||||
, mRunningStatus_RX(InvalidType)
|
, mRunningStatus_RX(InvalidType)
|
||||||
, mRunningStatus_TX(InvalidType)
|
, mRunningStatus_TX(InvalidType)
|
||||||
|
, mPendingMessageExpectedLength(0)
|
||||||
, mPendingMessageIndex(0)
|
, mPendingMessageIndex(0)
|
||||||
, mCurrentRpnNumber(0xffff)
|
, mCurrentRpnNumber(0xffff)
|
||||||
, mCurrentNrpnNumber(0xffff)
|
, mCurrentNrpnNumber(0xffff)
|
||||||
|
|
@ -93,6 +94,7 @@ void MidiInterface<Transport, Settings, Platform>::begin(Channel inChannel)
|
||||||
mRunningStatus_RX = InvalidType;
|
mRunningStatus_RX = InvalidType;
|
||||||
|
|
||||||
mPendingMessageIndex = 0;
|
mPendingMessageIndex = 0;
|
||||||
|
mPendingMessageExpectedLength = 0;
|
||||||
|
|
||||||
mCurrentRpnNumber = 0xffff;
|
mCurrentRpnNumber = 0xffff;
|
||||||
mCurrentNrpnNumber = 0xffff;
|
mCurrentNrpnNumber = 0xffff;
|
||||||
|
|
@ -802,39 +804,39 @@ bool MidiInterface<Transport, Settings, Platform>::parse()
|
||||||
mMessage.channel = 0;
|
mMessage.channel = 0;
|
||||||
mMessage.data1 = 0;
|
mMessage.data1 = 0;
|
||||||
mMessage.data2 = 0;
|
mMessage.data2 = 0;
|
||||||
mMessage.length = 0;
|
|
||||||
mMessage.valid = true;
|
mMessage.valid = true;
|
||||||
|
|
||||||
// Do not reset all input attributes, Running Status must remain unchanged.
|
// Do not reset all input attributes, Running Status must remain unchanged.
|
||||||
// We still need to reset these
|
// We still need to reset these
|
||||||
mPendingMessageIndex = 0;
|
mPendingMessageIndex = 0;
|
||||||
|
mPendingMessageExpectedLength = 0;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// 2 bytes messages
|
// 2 bytes messages
|
||||||
case ProgramChange:
|
case ProgramChange:
|
||||||
case AfterTouchChannel:
|
case AfterTouchChannel:
|
||||||
case TimeCodeQuarterFrame:
|
case TimeCodeQuarterFrame:
|
||||||
case SongSelect:
|
case SongSelect:
|
||||||
mMessage.length = 2;
|
mPendingMessageExpectedLength = 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// 3 bytes messages
|
// 3 bytes messages
|
||||||
case NoteOn:
|
case NoteOn:
|
||||||
case NoteOff:
|
case NoteOff:
|
||||||
case ControlChange:
|
case ControlChange:
|
||||||
case PitchBend:
|
case PitchBend:
|
||||||
case AfterTouchPoly:
|
case AfterTouchPoly:
|
||||||
case SongPosition:
|
case SongPosition:
|
||||||
mMessage.length = 3;
|
mPendingMessageExpectedLength = 3;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SystemExclusiveStart:
|
case SystemExclusiveStart:
|
||||||
case SystemExclusiveEnd:
|
case SystemExclusiveEnd:
|
||||||
// The message can be any lenght
|
// The message can be any lenght
|
||||||
// between 3 and MidiMessage::sSysExMaxSize bytes
|
// between 3 and MidiMessage::sSysExMaxSize bytes
|
||||||
mMessage.length = MidiMessage::sSysExMaxSize;
|
mPendingMessageExpectedLength = MidiMessage::sSysExMaxSize;
|
||||||
mRunningStatus_RX = InvalidType;
|
mRunningStatus_RX = InvalidType;
|
||||||
mMessage.sysexArray[0] = pendingType;
|
mMessage.sysexArray[0] = pendingType;
|
||||||
break;
|
break;
|
||||||
|
|
@ -847,17 +849,19 @@ bool MidiInterface<Transport, Settings, Platform>::parse()
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mPendingMessageIndex >= (mMessage.length - 1))
|
if (mPendingMessageIndex >= (mPendingMessageExpectedLength - 1))
|
||||||
{
|
{
|
||||||
// Reception complete
|
// Reception complete
|
||||||
mMessage.type = pendingType;
|
mMessage.type = pendingType;
|
||||||
mMessage.channel = getChannelFromStatusByte(mPendingMessage[0]);
|
mMessage.channel = getChannelFromStatusByte(mPendingMessage[0]);
|
||||||
mMessage.data1 = mPendingMessage[1];
|
mMessage.data1 = mPendingMessage[1];
|
||||||
mMessage.data2 = 0; // Completed new message has 1 data byte
|
mMessage.data2 = 0; // Completed new message has 1 data byte
|
||||||
|
mMessage.length = 1;
|
||||||
|
|
||||||
mPendingMessageIndex = 0;
|
mPendingMessageIndex = 0;
|
||||||
mMessage.length = 0;
|
mPendingMessageExpectedLength = 0;
|
||||||
mMessage.valid = true;
|
mMessage.valid = true;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -905,7 +909,9 @@ bool MidiInterface<Transport, Settings, Platform>::parse()
|
||||||
mMessage.data1 = 0;
|
mMessage.data1 = 0;
|
||||||
mMessage.data2 = 0;
|
mMessage.data2 = 0;
|
||||||
mMessage.channel = 0;
|
mMessage.channel = 0;
|
||||||
|
mMessage.length = 1;
|
||||||
mMessage.valid = true;
|
mMessage.valid = true;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// Exclusive
|
// Exclusive
|
||||||
|
|
@ -922,9 +928,11 @@ bool MidiInterface<Transport, Settings, Platform>::parse()
|
||||||
mMessage.data1 = mPendingMessageIndex & 0xff; // LSB
|
mMessage.data1 = mPendingMessageIndex & 0xff; // LSB
|
||||||
mMessage.data2 = byte(mPendingMessageIndex >> 8); // MSB
|
mMessage.data2 = byte(mPendingMessageIndex >> 8); // MSB
|
||||||
mMessage.channel = 0;
|
mMessage.channel = 0;
|
||||||
|
mMessage.length = mPendingMessageIndex;
|
||||||
mMessage.valid = true;
|
mMessage.valid = true;
|
||||||
|
|
||||||
resetInput();
|
resetInput();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -947,7 +955,7 @@ bool MidiInterface<Transport, Settings, Platform>::parse()
|
||||||
mPendingMessage[mPendingMessageIndex] = extracted;
|
mPendingMessage[mPendingMessageIndex] = extracted;
|
||||||
|
|
||||||
// Now we are going to check if we have reached the end of the message
|
// Now we are going to check if we have reached the end of the message
|
||||||
if (mPendingMessageIndex >= (mMessage.length - 1))
|
if (mPendingMessageIndex >= (mPendingMessageExpectedLength - 1))
|
||||||
{
|
{
|
||||||
// "FML" case: fall down here with an overflown SysEx..
|
// "FML" case: fall down here with an overflown SysEx..
|
||||||
// This means we received the last possible data byte that can fit
|
// This means we received the last possible data byte that can fit
|
||||||
|
|
@ -968,11 +976,13 @@ bool MidiInterface<Transport, Settings, Platform>::parse()
|
||||||
mMessage.data1 = mPendingMessage[1];
|
mMessage.data1 = mPendingMessage[1];
|
||||||
|
|
||||||
// Save data2 only if applicable
|
// Save data2 only if applicable
|
||||||
mMessage.data2 = mMessage.length == 3 ? mPendingMessage[2] : 0;
|
mMessage.data2 = mPendingMessageExpectedLength == 3 ? mPendingMessage[2] : 0;
|
||||||
|
|
||||||
|
mMessage.length = mPendingMessageExpectedLength;
|
||||||
|
|
||||||
// Reset local variables
|
// Reset local variables
|
||||||
mPendingMessageIndex = 0;
|
mPendingMessageIndex = 0;
|
||||||
mMessage.length = 0;
|
mPendingMessageExpectedLength = 0;
|
||||||
|
|
||||||
mMessage.valid = true;
|
mMessage.valid = true;
|
||||||
|
|
||||||
|
|
@ -1052,7 +1062,7 @@ template<class Transport, class Settings, class Platform>
|
||||||
inline void MidiInterface<Transport, Settings, Platform>::resetInput()
|
inline void MidiInterface<Transport, Settings, Platform>::resetInput()
|
||||||
{
|
{
|
||||||
mPendingMessageIndex = 0;
|
mPendingMessageIndex = 0;
|
||||||
mMessage.length = 0;
|
mPendingMessageExpectedLength = 0;
|
||||||
mRunningStatus_RX = InvalidType;
|
mRunningStatus_RX = InvalidType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue