aboutsummaryrefslogtreecommitdiff
path: root/src/midi_sequencer_impl.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/midi_sequencer_impl.hpp')
-rw-r--r--src/midi_sequencer_impl.hpp53
1 files changed, 44 insertions, 9 deletions
diff --git a/src/midi_sequencer_impl.hpp b/src/midi_sequencer_impl.hpp
index b3bfefa..0e71c2a 100644
--- a/src/midi_sequencer_impl.hpp
+++ b/src/midi_sequencer_impl.hpp
@@ -26,6 +26,8 @@
#include <stdio.h>
#include <memory>
#include <cstring>
+#include <iterator> // std::back_inserter
+#include <algorithm> // std::copy
#include <set>
#include <assert.h>
@@ -158,31 +160,48 @@ void BW_MidiSequencer::MidiTrackRow::clear()
void BW_MidiSequencer::MidiTrackRow::sortEvents(bool *noteStates)
{
typedef std::vector<MidiEvent> EvtArr;
+ EvtArr sysEx;
EvtArr metas;
EvtArr noteOffs;
EvtArr controllers;
EvtArr anyOther;
- metas.reserve(events.size());
- noteOffs.reserve(events.size());
- controllers.reserve(events.size());
- anyOther.reserve(events.size());
-
for(size_t i = 0; i < events.size(); i++)
{
if(events[i].type == MidiEvent::T_NOTEOFF)
+ {
+ if(noteOffs.capacity() == 0)
+ noteOffs.reserve(events.size());
noteOffs.push_back(events[i]);
+ }
+ else if(events[i].type == MidiEvent::T_SYSEX ||
+ events[i].type == MidiEvent::T_SYSEX2)
+ {
+ if(sysEx.capacity() == 0)
+ sysEx.reserve(events.size());
+ sysEx.push_back(events[i]);
+ }
else if((events[i].type == MidiEvent::T_CTRLCHANGE)
|| (events[i].type == MidiEvent::T_PATCHCHANGE)
|| (events[i].type == MidiEvent::T_WHEEL)
|| (events[i].type == MidiEvent::T_CHANAFTTOUCH))
{
+ if(controllers.capacity() == 0)
+ controllers.reserve(events.size());
controllers.push_back(events[i]);
}
else if((events[i].type == MidiEvent::T_SPECIAL) && (events[i].subtype == MidiEvent::ST_MARKER))
+ {
+ if(metas.capacity() == 0)
+ metas.reserve(events.size());
metas.push_back(events[i]);
+ }
else
+ {
+ if(anyOther.capacity() == 0)
+ anyOther.reserve(events.size());
anyOther.push_back(events[i]);
+ }
}
/*
@@ -244,10 +263,16 @@ void BW_MidiSequencer::MidiTrackRow::sortEvents(bool *noteStates)
/***********************************************************************************/
events.clear();
- events.insert(events.end(), noteOffs.begin(), noteOffs.end());
- events.insert(events.end(), metas.begin(), metas.end());
- events.insert(events.end(), controllers.begin(), controllers.end());
- events.insert(events.end(), anyOther.begin(), anyOther.end());
+ if(!sysEx.empty())
+ events.insert(events.end(), sysEx.begin(), sysEx.end());
+ if(!noteOffs.empty())
+ events.insert(events.end(), noteOffs.begin(), noteOffs.end());
+ if(!metas.empty())
+ events.insert(events.end(), metas.begin(), metas.end());
+ if(!controllers.empty())
+ events.insert(events.end(), controllers.begin(), controllers.end());
+ if(!anyOther.empty())
+ events.insert(events.end(), anyOther.begin(), anyOther.end());
}
BW_MidiSequencer::BW_MidiSequencer() :
@@ -919,6 +944,10 @@ BW_MidiSequencer::MidiEvent BW_MidiSequencer::parseEvent(const uint8_t **pptr, c
evt.isValid = 0;
return evt;
}
+ evt.type = MidiEvent::T_SYSEX;
+ evt.data.clear();
+ evt.data.push_back(byte);
+ std::copy(ptr, ptr + length, std::back_inserter(evt.data));
ptr += (size_t)length;
return evt;
}
@@ -1120,6 +1149,12 @@ void BW_MidiSequencer::handleEvent(size_t tk, const BW_MidiSequencer::MidiEvent
{
//std::string data( length?(const char*) &TrackData[tk][CurrentPosition.track[tk].ptr]:0, length );
//UI.PrintLn("SysEx %02X: %u bytes", byte, length/*, data.c_str()*/);
+#if 0
+ std::fputs("SysEx:", stderr);
+ for(size_t i = 0; i < evt.data.size(); ++i)
+ std::fprintf(stderr, " %02X", evt.data[i]);
+ std::fputc('\n', stderr);
+#endif
m_interface->rt_systemExclusive(m_interface->rtUserData, evt.data.data(), evt.data.size());
return;
}