From 299cd97cd1042f398a04c12d1f571defdab5be17 Mon Sep 17 00:00:00 2001 From: Element Date: Tue, 2 Nov 2021 07:56:12 -0400 Subject: [PATCH] updated send(midiMessage&) to better handle system real time, sysex and other system common messages --- src/MIDI.hpp | 26 +++++++++++++++----------- src/midi_Message.h | 12 ++++++++++++ 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/MIDI.hpp b/src/MIDI.hpp index bb9ffc1..d03eab1 100644 --- a/src/MIDI.hpp +++ b/src/MIDI.hpp @@ -124,22 +124,25 @@ MidiInterface& MidiInterface 1) mTransport.write(inMessage.data1); if (inMessage.length > 2) mTransport.write(inMessage.data2); - } else + } else if (inMessage.type == MidiType::SystemExclusive) { - // sysexArray does not contain the start and end tags - mTransport.write(MidiType::SystemExclusiveStart); - - for (size_t i = 0; i < inMessage.getSysExSize(); i++) + const unsigned size = inMessage.getSysExSize(); + for (size_t i = 0; i < size; i++) mTransport.write(inMessage.sysexArray[i]); - - mTransport.write(MidiType::SystemExclusiveEnd); + } else // at this point, it it assumed to be a system common message + { + mTransport.write(inMessage.type); + if (inMessage.length > 1) mTransport.write(inMessage.data1); + if (inMessage.length > 2) mTransport.write(inMessage.data2); } } mTransport.endTransmission(); @@ -1083,6 +1086,7 @@ bool MidiInterface::parse() mMessage.data1 = mPendingMessage[1]; // Save data2 only if applicable mMessage.data2 = mPendingMessageExpectedLength == 3 ? mPendingMessage[2] : 0; + mMessage.length = mPendingMessageExpectedLength; // Reset local variables mPendingMessageIndex = 0; diff --git a/src/midi_Message.h b/src/midi_Message.h index bbd8d6a..0b6422e 100644 --- a/src/midi_Message.h +++ b/src/midi_Message.h @@ -114,6 +114,18 @@ struct Message const unsigned size = unsigned(data2) << 8 | data1; return size > sSysExMaxSize ? sSysExMaxSize : size; } + inline bool isSysRT () const + { + return (type & 0xf8) == 0xf8; + } + inline bool isSysCommon () const + { + return (type & 0xf8) == 0xf0; + } + inline bool isChannelMessage () const + { + return (type & 0xf0) != 0xf0; + } }; END_MIDI_NAMESPACE