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 <paul-emile.element@windriver.com>
This commit is contained in:
parent
be557c1f4b
commit
663b24b0b5
26
src/MIDI.hpp
26
src/MIDI.hpp
|
|
@ -124,22 +124,25 @@ MidiInterface<Transport, Settings, Platform>& MidiInterface<Transport, Settings,
|
||||||
|
|
||||||
if (mTransport.beginTransmission(inMessage.type))
|
if (mTransport.beginTransmission(inMessage.type))
|
||||||
{
|
{
|
||||||
const StatusByte status = getStatus(inMessage.type, inMessage.channel);
|
if (inMessage.isSystemRealTime())
|
||||||
mTransport.write(status);
|
|
||||||
|
|
||||||
if (inMessage.type != MidiType::SystemExclusive)
|
|
||||||
{
|
{
|
||||||
|
mTransport.write(inMessage.type);
|
||||||
|
} else if (inMessage.isChannelMessage())
|
||||||
|
{
|
||||||
|
const StatusByte status = getStatus(inMessage.type, inMessage.channel);
|
||||||
|
mTransport.write(status);
|
||||||
if (inMessage.length > 1) mTransport.write(inMessage.data1);
|
if (inMessage.length > 1) mTransport.write(inMessage.data1);
|
||||||
if (inMessage.length > 2) mTransport.write(inMessage.data2);
|
if (inMessage.length > 2) mTransport.write(inMessage.data2);
|
||||||
} else
|
} else if (inMessage.type == MidiType::SystemExclusive)
|
||||||
{
|
{
|
||||||
// sysexArray does not contain the start and end tags
|
const unsigned size = inMessage.getSysExSize();
|
||||||
mTransport.write(MidiType::SystemExclusiveStart);
|
for (size_t i = 0; i < size; i++)
|
||||||
|
|
||||||
for (size_t i = 0; i < inMessage.getSysExSize(); i++)
|
|
||||||
mTransport.write(inMessage.sysexArray[i]);
|
mTransport.write(inMessage.sysexArray[i]);
|
||||||
|
} else // at this point, it it assumed to be a system common message
|
||||||
mTransport.write(MidiType::SystemExclusiveEnd);
|
{
|
||||||
|
mTransport.write(inMessage.type);
|
||||||
|
if (inMessage.length > 1) mTransport.write(inMessage.data1);
|
||||||
|
if (inMessage.length > 2) mTransport.write(inMessage.data2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mTransport.endTransmission();
|
mTransport.endTransmission();
|
||||||
|
|
@ -1083,6 +1086,7 @@ bool MidiInterface<Transport, Settings, Platform>::parse()
|
||||||
mMessage.data1 = mPendingMessage[1];
|
mMessage.data1 = mPendingMessage[1];
|
||||||
// Save data2 only if applicable
|
// Save data2 only if applicable
|
||||||
mMessage.data2 = mPendingMessageExpectedLength == 3 ? mPendingMessage[2] : 0;
|
mMessage.data2 = mPendingMessageExpectedLength == 3 ? mPendingMessage[2] : 0;
|
||||||
|
mMessage.length = mPendingMessageExpectedLength;
|
||||||
|
|
||||||
// Reset local variables
|
// Reset local variables
|
||||||
mPendingMessageIndex = 0;
|
mPendingMessageIndex = 0;
|
||||||
|
|
|
||||||
|
|
@ -114,6 +114,18 @@ struct Message
|
||||||
const unsigned size = unsigned(data2) << 8 | data1;
|
const unsigned size = unsigned(data2) << 8 | data1;
|
||||||
return size > sSysExMaxSize ? sSysExMaxSize : size;
|
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
|
END_MIDI_NAMESPACE
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue