From 1b6a755c58da26bf24ca0e63df7fed52e8ec24e6 Mon Sep 17 00:00:00 2001 From: lathoub Date: Sat, 7 Mar 2020 08:25:16 +0100 Subject: [PATCH] add MidiType to beginTransmission Avoids reparsing of the stream in the transport layer, in order to get the MidiType --- src/MIDI.hpp | 49 ++++++++++++++++++--------------------------- src/midi_Settings.h | 2 +- 2 files changed, 21 insertions(+), 30 deletions(-) diff --git a/src/MIDI.hpp b/src/MIDI.hpp index 02e2580..cbd03db 100644 --- a/src/MIDI.hpp +++ b/src/MIDI.hpp @@ -152,7 +152,7 @@ void MidiInterface::send(MidiType inType, const StatusByte status = getStatus(inType, inChannel); - if (mEncoder.beginTransmission()) + if (mEncoder.beginTransmission(inType)) { if (Settings::UseRunningStatus) { @@ -337,24 +337,22 @@ void MidiInterface::sendSysEx(unsigned inLength, { const bool writeBeginEndBytes = !inArrayContainsBoundaries; - if (mEncoder.beginTransmission()) + if (mEncoder.beginTransmission(MidiType::SystemExclusiveStart)) { if (writeBeginEndBytes) - mEncoder.write(0xf0); + mEncoder.write(MidiType::SystemExclusiveStart); for (unsigned i = 0; i < inLength; ++i) mEncoder.write(inArray[i]); if (writeBeginEndBytes) - mEncoder.write(0xf7); + mEncoder.write(MidiType::SystemExclusiveEnd); mEncoder.endTransmission(); } if (Settings::UseRunningStatus) - { mRunningStatus_TX = InvalidType; - } } /*! \brief Send a Tune Request message. @@ -365,16 +363,14 @@ void MidiInterface::sendSysEx(unsigned inLength, template void MidiInterface::sendTuneRequest() { - if (mEncoder.beginTransmission()) + if (mEncoder.beginTransmission(MidiType::TuneRequest)) { mEncoder.write(TuneRequest); mEncoder.endTransmission(); } if (Settings::UseRunningStatus) - { mRunningStatus_TX = InvalidType; - } } /*! \brief Send a MIDI Time Code Quarter Frame. @@ -400,7 +396,7 @@ void MidiInterface::sendTimeCodeQuarterFrame(DataBy template void MidiInterface::sendTimeCodeQuarterFrame(DataByte inData) { - if (mEncoder.beginTransmission()) + if (mEncoder.beginTransmission(MidiType::TimeCodeQuarterFrame)) { mEncoder.write((byte)TimeCodeQuarterFrame); mEncoder.write(inData); @@ -408,9 +404,7 @@ void MidiInterface::sendTimeCodeQuarterFrame(DataBy } if (Settings::UseRunningStatus) - { mRunningStatus_TX = InvalidType; - } } /*! \brief Send a Song Position Pointer message. @@ -419,7 +413,7 @@ void MidiInterface::sendTimeCodeQuarterFrame(DataBy template void MidiInterface::sendSongPosition(unsigned inBeats) { - if (mEncoder.beginTransmission()) + if (mEncoder.beginTransmission(MidiType::SongPosition)) { mEncoder.write((byte)SongPosition); mEncoder.write(inBeats & 0x7f); @@ -428,26 +422,22 @@ void MidiInterface::sendSongPosition(unsigned inBea } if (Settings::UseRunningStatus) - { mRunningStatus_TX = InvalidType; - } } /*! \brief Send a Song Select message */ template void MidiInterface::sendSongSelect(DataByte inSongNumber) { - if (mEncoder.beginTransmission()) + if (mEncoder.beginTransmission(MidiType::SongSelect)) { - mEncoder.write((byte)SongSelect); + mEncoder.write((byte)MidiType::SongSelect); mEncoder.write(inSongNumber & 0x7f); mEncoder.endTransmission(); } if (Settings::UseRunningStatus) - { mRunningStatus_TX = InvalidType; - } } /*! \brief Send a Real Time (one byte) message. @@ -470,7 +460,7 @@ void MidiInterface::sendRealTime(MidiType inType) case Continue: case ActiveSensing: case SystemReset: - if (mEncoder.beginTransmission()) + if (mEncoder.beginTransmission(inType)) { mEncoder.write((byte)inType); mEncoder.endTransmission(); @@ -702,9 +692,7 @@ inline bool MidiInterface::read(Channel inChannel) const bool channelMatch = inputFilter(inChannel); if (channelMatch) - { launchCallback(); - } thruFilter(inChannel); @@ -737,6 +725,8 @@ bool MidiInterface::parse() // Ignore Undefined if (extracted == 0xf9 || extracted == 0xfd) { + return (Settings::Use1ByteParsing) ? false : parse(); +/* if (Settings::Use1ByteParsing) { return false; @@ -745,6 +735,7 @@ bool MidiInterface::parse() { return parse(); } + */ } if (mPendingMessageIndex == 0) @@ -987,7 +978,10 @@ bool MidiInterface::parse() // Then update the index of the pending message. mPendingMessageIndex++; - if (Settings::Use1ByteParsing) + + return (Settings::Use1ByteParsing) ? false : parse(); + + /* if (Settings::Use1ByteParsing) { // Message is not complete. return false; @@ -997,6 +991,7 @@ bool MidiInterface::parse() // Call the parser recursively to parse the rest of the message. return parse(); } + */ } } } @@ -1148,15 +1143,11 @@ MidiType MidiInterface::getTypeFromStatusByte(byte (inStatus == 0xf5) || (inStatus == 0xf9) || (inStatus == 0xfD)) - { - // Data bytes and undefined. - return InvalidType; - } + return InvalidType; // Data bytes and undefined. + if (inStatus < 0xf0) - { // Channel message, remove channel nibble. return MidiType(inStatus & 0xf0); - } return MidiType(inStatus); } diff --git a/src/midi_Settings.h b/src/midi_Settings.h index 84716c4..af1d972 100644 --- a/src/midi_Settings.h +++ b/src/midi_Settings.h @@ -70,7 +70,7 @@ struct DefaultSettings termination, the receiver will turn off all voices and return to normal (non- active sensing) operation.. */ - static const bool UseSenderActiveSensing = false; + static const bool UseSenderActiveSensing = true; /*! Setting this to true will make MIDI.read parse only one byte of data for each call when data is available. This can speed up your application if receiving