aboutsummaryrefslogtreecommitdiff
path: root/src/midi_sequencer_impl.hpp
diff options
context:
space:
mode:
authorVitaly Novichkov <admin@wohlnet.ru>2018-06-22 22:31:18 +0300
committerVitaly Novichkov <admin@wohlnet.ru>2018-06-22 22:31:18 +0300
commitbe1cd07a227783553406e144e9235901e792c5b1 (patch)
tree616a50b0fb92ae41353126ee8c66b6874b708cab /src/midi_sequencer_impl.hpp
parenta8fa66e8444da96b39699489bf75587a0ae94721 (diff)
downloadlibADLMIDI-be1cd07a227783553406e144e9235901e792c5b1.tar.gz
libADLMIDI-be1cd07a227783553406e144e9235901e792c5b1.tar.bz2
libADLMIDI-be1cd07a227783553406e144e9235901e792c5b1.zip
Sequencer: give SysEx events have highest priority while re-ordering
Diffstat (limited to 'src/midi_sequencer_impl.hpp')
-rw-r--r--src/midi_sequencer_impl.hpp41
1 files changed, 32 insertions, 9 deletions
diff --git a/src/midi_sequencer_impl.hpp b/src/midi_sequencer_impl.hpp
index 92be133..0e71c2a 100644
--- a/src/midi_sequencer_impl.hpp
+++ b/src/midi_sequencer_impl.hpp
@@ -160,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]);
+ }
}
/*
@@ -246,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() :