From b2259a0ad2da07729eb285eda4a833e5b0f1f7eb Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Thu, 21 Jun 2018 14:11:48 +0300 Subject: Attempt to fix MSVC 2015 build --- src/midi_sequencer_impl.hpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/midi_sequencer_impl.hpp') diff --git a/src/midi_sequencer_impl.hpp b/src/midi_sequencer_impl.hpp index 7ecefa2..92be133 100644 --- a/src/midi_sequencer_impl.hpp +++ b/src/midi_sequencer_impl.hpp @@ -26,6 +26,8 @@ #include #include #include +#include // std::back_inserter +#include // std::copy #include #include -- cgit v1.2.3 From be1cd07a227783553406e144e9235901e792c5b1 Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Fri, 22 Jun 2018 22:31:18 +0300 Subject: Sequencer: give SysEx events have highest priority while re-ordering --- src/midi_sequencer_impl.hpp | 41 ++++++++++++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 9 deletions(-) (limited to 'src/midi_sequencer_impl.hpp') 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 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() : -- cgit v1.2.3