From 2734894485716d334ce11f7bc199f309a2c672f0 Mon Sep 17 00:00:00 2001 From: lathoub Date: Sun, 15 Mar 2020 16:57:01 +0100 Subject: [PATCH] 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) --- src/MIDI.h | 1 + src/MIDI.hpp | 38 ++++++++++++++++++++++++-------------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/MIDI.h b/src/MIDI.h index 8a3c4b5..a84b957 100644 --- a/src/MIDI.h +++ b/src/MIDI.h @@ -243,6 +243,7 @@ private: StatusByte mRunningStatus_RX; StatusByte mRunningStatus_TX; byte mPendingMessage[3]; + unsigned mPendingMessageExpectedLength; unsigned mPendingMessageIndex; unsigned mCurrentRpnNumber; unsigned mCurrentNrpnNumber; diff --git a/src/MIDI.hpp b/src/MIDI.hpp index c8b2be0..c29dd3a 100644 --- a/src/MIDI.hpp +++ b/src/MIDI.hpp @@ -36,6 +36,7 @@ inline MidiInterface::MidiInterface(Transport& in , mInputChannel(0) , mRunningStatus_RX(InvalidType) , mRunningStatus_TX(InvalidType) + , mPendingMessageExpectedLength(0) , mPendingMessageIndex(0) , mCurrentRpnNumber(0xffff) , mCurrentNrpnNumber(0xffff) @@ -93,6 +94,7 @@ void MidiInterface::begin(Channel inChannel) mRunningStatus_RX = InvalidType; mPendingMessageIndex = 0; + mPendingMessageExpectedLength = 0; mCurrentRpnNumber = 0xffff; mCurrentNrpnNumber = 0xffff; @@ -802,39 +804,39 @@ bool MidiInterface::parse() mMessage.channel = 0; mMessage.data1 = 0; mMessage.data2 = 0; - mMessage.length = 0; mMessage.valid = true; // Do not reset all input attributes, Running Status must remain unchanged. // We still need to reset these mPendingMessageIndex = 0; + mPendingMessageExpectedLength = 0; return true; break; - // 2 bytes messages + // 2 bytes messages case ProgramChange: case AfterTouchChannel: case TimeCodeQuarterFrame: case SongSelect: - mMessage.length = 2; + mPendingMessageExpectedLength = 2; break; - // 3 bytes messages + // 3 bytes messages case NoteOn: case NoteOff: case ControlChange: case PitchBend: case AfterTouchPoly: case SongPosition: - mMessage.length = 3; + mPendingMessageExpectedLength = 3; break; case SystemExclusiveStart: case SystemExclusiveEnd: // The message can be any lenght // between 3 and MidiMessage::sSysExMaxSize bytes - mMessage.length = MidiMessage::sSysExMaxSize; + mPendingMessageExpectedLength = MidiMessage::sSysExMaxSize; mRunningStatus_RX = InvalidType; mMessage.sysexArray[0] = pendingType; break; @@ -847,17 +849,19 @@ bool MidiInterface::parse() break; } - if (mPendingMessageIndex >= (mMessage.length - 1)) + if (mPendingMessageIndex >= (mPendingMessageExpectedLength - 1)) { // Reception complete mMessage.type = pendingType; mMessage.channel = getChannelFromStatusByte(mPendingMessage[0]); mMessage.data1 = mPendingMessage[1]; mMessage.data2 = 0; // Completed new message has 1 data byte - + mMessage.length = 1; + mPendingMessageIndex = 0; - mMessage.length = 0; + mPendingMessageExpectedLength = 0; mMessage.valid = true; + return true; } else @@ -905,7 +909,9 @@ bool MidiInterface::parse() mMessage.data1 = 0; mMessage.data2 = 0; mMessage.channel = 0; + mMessage.length = 1; mMessage.valid = true; + return true; // Exclusive @@ -922,9 +928,11 @@ bool MidiInterface::parse() mMessage.data1 = mPendingMessageIndex & 0xff; // LSB mMessage.data2 = byte(mPendingMessageIndex >> 8); // MSB mMessage.channel = 0; + mMessage.length = mPendingMessageIndex; mMessage.valid = true; resetInput(); + return true; } else @@ -947,7 +955,7 @@ bool MidiInterface::parse() mPendingMessage[mPendingMessageIndex] = extracted; // 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.. // This means we received the last possible data byte that can fit @@ -968,11 +976,13 @@ bool MidiInterface::parse() mMessage.data1 = mPendingMessage[1]; // 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 mPendingMessageIndex = 0; - mMessage.length = 0; + mPendingMessageExpectedLength = 0; mMessage.valid = true; @@ -1052,7 +1062,7 @@ template inline void MidiInterface::resetInput() { mPendingMessageIndex = 0; - mMessage.length = 0; + mPendingMessageExpectedLength = 0; mRunningStatus_RX = InvalidType; }