diff --git a/src/sfizz/MidiState.cpp b/src/sfizz/MidiState.cpp index a5b40576..7b505ca3 100644 --- a/src/sfizz/MidiState.cpp +++ b/src/sfizz/MidiState.cpp @@ -33,6 +33,7 @@ void sfz::MidiState::noteOffEvent(int delay, int noteNumber, float velocity) noe ASSERT(velocity >= 0.0 && velocity <= 1.0); UNUSED(velocity); if (noteNumber >= 0 && noteNumber < 128) { + noteOffTimes[noteNumber] = internalClock + static_cast(delay); if (activeNotes > 0) activeNotes--; } @@ -44,6 +45,7 @@ void sfz::MidiState::setSampleRate(float sampleRate) noexcept this->sampleRate = sampleRate; internalClock = 0; absl::c_fill(noteOnTimes, 0); + absl::c_fill(noteOffTimes, 0); } void sfz::MidiState::advanceTime(int numSamples) noexcept @@ -59,13 +61,14 @@ void sfz::MidiState::setSamplesPerBlock(int samplesPerBlock) noexcept float sfz::MidiState::getNoteDuration(int noteNumber, int delay) const { ASSERT(noteNumber >= 0 && noteNumber < 128); + if (noteNumber < 0 || noteNumber >= 128) + return 0.0f; - if (noteNumber >= 0 && noteNumber < 128) { - const unsigned timeInSamples = internalClock + static_cast(delay) - noteOnTimes[noteNumber]; - return static_cast(timeInSamples) / sampleRate; - } + if (noteOnTimes[noteNumber] != 0 && noteOffTimes[noteNumber] != 0 && noteOnTimes[noteNumber] > noteOffTimes[noteNumber]) + return 0.0f; - return 0.0f; + const unsigned timeInSamples = internalClock + static_cast(delay) - noteOnTimes[noteNumber]; + return static_cast(timeInSamples) / sampleRate; } float sfz::MidiState::getNoteVelocity(int noteNumber) const noexcept @@ -114,6 +117,7 @@ void sfz::MidiState::reset(int delay) noexcept activeNotes = 0; internalClock = 0; absl::c_fill(noteOnTimes, 0); + absl::c_fill(noteOffTimes, 0); } void sfz::MidiState::resetAllControllers(int delay) noexcept diff --git a/src/sfizz/MidiState.h b/src/sfizz/MidiState.h index d127d1de..c5ac1dba 100644 --- a/src/sfizz/MidiState.h +++ b/src/sfizz/MidiState.h @@ -150,6 +150,11 @@ private: * */ MidiNoteArray noteOnTimes {}; + /** + * @brief Stores the note off times. + * + */ + MidiNoteArray noteOffTimes {}; /** * @brief Stores the velocity of the note ons for currently * depressed notes.