Use vectors of events in the midi state

This commit is contained in:
Paul Ferrand 2020-03-29 13:13:19 +02:00
parent 27ceeb8e1a
commit 1215067dcf
2 changed files with 13 additions and 7 deletions

View file

@ -95,14 +95,14 @@ void sfz::MidiState::ccEvent(int delay, int ccNumber, float ccValue) noexcept
{ {
ASSERT(ccValue >= 0.0 && ccValue <= 1.0); ASSERT(ccValue >= 0.0 && ccValue <= 1.0);
cc[ccNumber] = ccValue; cc[ccNumber].emplace_back(delay, ccValue);
} }
float sfz::MidiState::getCCValue(int ccNumber) const noexcept float sfz::MidiState::getCCValue(int ccNumber) const noexcept
{ {
ASSERT(ccNumber >= 0 && ccNumber < config::numCCs); ASSERT(ccNumber >= 0 && ccNumber < config::numCCs);
return cc[ccNumber]; return cc[ccNumber].back().second;
} }
void sfz::MidiState::reset(int delay) noexcept void sfz::MidiState::reset(int delay) noexcept
@ -110,8 +110,10 @@ void sfz::MidiState::reset(int delay) noexcept
for (auto& velocity: lastNoteVelocities) for (auto& velocity: lastNoteVelocities)
velocity = 0; velocity = 0;
for (auto& ccValue: cc) for (auto& ccEvents: cc) {
ccValue = 0; ccEvents.clear();
ccEvents.emplace_back(0, 0.0f);
}
pitchBend = 0; pitchBend = 0;
activeNotes = 0; activeNotes = 0;
@ -122,8 +124,10 @@ void sfz::MidiState::reset(int delay) noexcept
void sfz::MidiState::resetAllControllers(int delay) noexcept void sfz::MidiState::resetAllControllers(int delay) noexcept
{ {
for (unsigned idx = 0; idx < config::numCCs; idx++) for (auto& ccEvents: cc) {
cc[idx] = 0; ccEvents.clear();
ccEvents.emplace_back(0, 0.0f);
}
pitchBend = 0; pitchBend = 0;
} }

View file

@ -143,6 +143,8 @@ public:
private: private:
template<class T> template<class T>
using MidiNoteArray = std::array<T, 128>; using MidiNoteArray = std::array<T, 128>;
using MidiEvent = std::pair<int, float>;
using EventVector = std::vector<MidiEvent>;
int activeNotes { 0 }; int activeNotes { 0 };
/** /**
@ -165,7 +167,7 @@ private:
* @brief Current known values for the CCs. * @brief Current known values for the CCs.
* *
*/ */
std::array<float, config::numCCs> cc; std::array<EventVector, config::numCCs> cc;
/** /**
* Pitch bend status * Pitch bend status
*/ */