Skip to content

Commit 663b24b

Browse files
paul-emile-elementElement
and
Element
authored
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 <[email protected]>
1 parent be557c1 commit 663b24b

File tree

2 files changed

+27
-11
lines changed

2 files changed

+27
-11
lines changed

src/MIDI.hpp

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -124,22 +124,25 @@ MidiInterface<Transport, Settings, Platform>& MidiInterface<Transport, Settings,
124124

125125
if (mTransport.beginTransmission(inMessage.type))
126126
{
127-
const StatusByte status = getStatus(inMessage.type, inMessage.channel);
128-
mTransport.write(status);
129-
130-
if (inMessage.type != MidiType::SystemExclusive)
127+
if (inMessage.isSystemRealTime())
128+
{
129+
mTransport.write(inMessage.type);
130+
} else if (inMessage.isChannelMessage())
131131
{
132+
const StatusByte status = getStatus(inMessage.type, inMessage.channel);
133+
mTransport.write(status);
132134
if (inMessage.length > 1) mTransport.write(inMessage.data1);
133135
if (inMessage.length > 2) mTransport.write(inMessage.data2);
134-
} else
136+
} else if (inMessage.type == MidiType::SystemExclusive)
135137
{
136-
// sysexArray does not contain the start and end tags
137-
mTransport.write(MidiType::SystemExclusiveStart);
138-
139-
for (size_t i = 0; i < inMessage.getSysExSize(); i++)
138+
const unsigned size = inMessage.getSysExSize();
139+
for (size_t i = 0; i < size; i++)
140140
mTransport.write(inMessage.sysexArray[i]);
141-
142-
mTransport.write(MidiType::SystemExclusiveEnd);
141+
} else // at this point, it it assumed to be a system common message
142+
{
143+
mTransport.write(inMessage.type);
144+
if (inMessage.length > 1) mTransport.write(inMessage.data1);
145+
if (inMessage.length > 2) mTransport.write(inMessage.data2);
143146
}
144147
}
145148
mTransport.endTransmission();
@@ -1083,6 +1086,7 @@ bool MidiInterface<Transport, Settings, Platform>::parse()
10831086
mMessage.data1 = mPendingMessage[1];
10841087
// Save data2 only if applicable
10851088
mMessage.data2 = mPendingMessageExpectedLength == 3 ? mPendingMessage[2] : 0;
1089+
mMessage.length = mPendingMessageExpectedLength;
10861090

10871091
// Reset local variables
10881092
mPendingMessageIndex = 0;

src/midi_Message.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,18 @@ struct Message
114114
const unsigned size = unsigned(data2) << 8 | data1;
115115
return size > sSysExMaxSize ? sSysExMaxSize : size;
116116
}
117+
inline bool isSystemRealTime () const
118+
{
119+
return (type & 0xf8) == 0xf8;
120+
}
121+
inline bool isSystemCommon () const
122+
{
123+
return (type & 0xf8) == 0xf0;
124+
}
125+
inline bool isChannelMessage () const
126+
{
127+
return (type & 0xf0) != 0xf0;
128+
}
117129
};
118130

119131
END_MIDI_NAMESPACE

0 commit comments

Comments
 (0)