From e2f0ca754e10d61e947fecf7ab56b6559e1d2c22 Mon Sep 17 00:00:00 2001 From: Paul Ferrand Date: Sun, 29 Mar 2020 13:59:48 +0200 Subject: [PATCH] Sorted elements in ccEvents --- src/sfizz/MidiState.cpp | 12 ++++++------ src/sfizz/MidiState.h | 1 - src/sfizz/SfzHelpers.h | 41 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 7 deletions(-) diff --git a/src/sfizz/MidiState.cpp b/src/sfizz/MidiState.cpp index b835063c..5917d839 100644 --- a/src/sfizz/MidiState.cpp +++ b/src/sfizz/MidiState.cpp @@ -53,8 +53,8 @@ void sfz::MidiState::advanceTime(int numSamples) noexcept internalClock += numSamples; for (auto& ccEvents: cc) { ASSERT(!ccEvents.empty()); // CC event vectors should never be empty - ccEvents.front().second = ccEvents.back().second; - ccEvents.front().first = 0; + ccEvents.front().value = ccEvents.back().value; + ccEvents.front().delay = 0; ccEvents.resize(1); } } @@ -104,15 +104,15 @@ int sfz::MidiState::getPitchBend() const noexcept void sfz::MidiState::ccEvent(int delay, int ccNumber, float ccValue) noexcept { ASSERT(ccValue >= 0.0 && ccValue <= 1.0); - - cc[ccNumber].emplace_back(delay, ccValue); + const auto insertionPoint = absl::c_upper_bound(cc[ccNumber], delay, MidiEventComparator{}); + cc[ccNumber].insert(insertionPoint, { delay, ccValue }); } float sfz::MidiState::getCCValue(int ccNumber) const noexcept { ASSERT(ccNumber >= 0 && ccNumber < config::numCCs); - return cc[ccNumber].back().second; + return cc[ccNumber].back().value; } void sfz::MidiState::reset() noexcept @@ -122,7 +122,7 @@ void sfz::MidiState::reset() noexcept for (auto& ccEvents: cc) { ccEvents.clear(); - ccEvents.emplace_back(0, 0.0f); + ccEvents.push_back({ 0, 0.0f }); } pitchBend = 0; diff --git a/src/sfizz/MidiState.h b/src/sfizz/MidiState.h index 22df7242..e1183dda 100644 --- a/src/sfizz/MidiState.h +++ b/src/sfizz/MidiState.h @@ -144,7 +144,6 @@ public: private: template using MidiNoteArray = std::array; - using MidiEvent = std::pair; using EventVector = std::vector; int activeNotes { 0 }; diff --git a/src/sfizz/SfzHelpers.h b/src/sfizz/SfzHelpers.h index 2e904a5e..5d552670 100644 --- a/src/sfizz/SfzHelpers.h +++ b/src/sfizz/SfzHelpers.h @@ -62,6 +62,47 @@ struct CCValuePairComparator { } }; +struct MidiEvent { + int delay; + float value; +}; + +template +struct MidiEventComparator { + bool operator()(const MidiEvent& event, const int& delay) + { + return (event.delay < delay); + } + + bool operator()(const int& delay, const MidiEvent& event) + { + return (delay < event.delay); + } + + bool operator()(const MidiEvent& lhs, const MidiEvent& rhs) + { + return (lhs.delay < rhs.delay); + } +}; + +template<> +struct MidiEventComparator { + bool operator()(const MidiEvent& event, const float& value) + { + return (event.value < value); + } + + bool operator()(const float& value, const MidiEvent& event) + { + return (value < event.value); + } + + bool operator()(const MidiEvent& lhs, const MidiEvent& rhs) + { + return (lhs.value < rhs.value); + } +}; + /** * @brief Converts cents to a pitch ratio *