updated send(midiMessage&) to better handle system real time,

sysex and other system common messages
This commit is contained in:
Element 2021-11-02 07:56:12 -04:00
parent be557c1f4b
commit 299cd97cd1
2 changed files with 27 additions and 11 deletions

View File

@ -123,23 +123,26 @@ MidiInterface<Transport, Settings, Platform>& MidiInterface<Transport, Settings,
return *this;
if (mTransport.beginTransmission(inMessage.type))
{
if (inMessage.isSysRT())
{
mTransport.write(inMessage.type);
} else if (inMessage.isChannelMessage())
{
const StatusByte status = getStatus(inMessage.type, inMessage.channel);
mTransport.write(status);
if (inMessage.type != MidiType::SystemExclusive)
{
if (inMessage.length > 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<Transport, Settings, Platform>::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;

View File

@ -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