From 663b24b0b56085ad07697a5f4e18ed3fe89bf7a2 Mon Sep 17 00:00:00 2001 From: Paul <43148870+paul-emile-element@users.noreply.github.com> Date: Wed, 3 Nov 2021 10:04:52 -0400 Subject: [PATCH] fix: Updated send(midiMessage&) to better handle system real time (#250) * updated send(midiMessage&) to better handle system real time, sysex and other system common messages * use fully qualified function names as requested Co-authored-by: Element --- 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..be7c28a 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..0879fa3 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 isSystemRealTime () const + { + return (type & 0xf8) == 0xf8; + } + inline bool isSystemCommon () const + { + return (type & 0xf8) == 0xf0; + } + inline bool isChannelMessage () const + { + return (type & 0xf0) != 0xf0; + } }; END_MIDI_NAMESPACE