diff --git a/src/sfizz/Voice.cpp b/src/sfizz/Voice.cpp index 365c862b..3330b567 100644 --- a/src/sfizz/Voice.cpp +++ b/src/sfizz/Voice.cpp @@ -101,6 +101,7 @@ void sfz::Voice::startVoice(Region* region, int delay, int number, uint8_t value pitchBendEnvelope.reset(midiState.getPitchBend()); sourcePosition = region->getOffset(); + triggerDelay = delay; initialDelay = delay + static_cast(region->getDelay() * sampleRate); baseFrequency = midiNoteFrequency(number); bendStepFactor = centsFactor(region->bendStep); @@ -267,6 +268,7 @@ void sfz::Voice::renderBlock(AudioSpan buffer) noexcept reset(); powerHistory.push(buffer.meanSquared()); + this->triggerDelay = absl::nullopt; } void sfz::Voice::processMono(AudioSpan buffer) noexcept @@ -489,6 +491,9 @@ bool sfz::Voice::checkOffGroup(int delay, uint32_t group) noexcept if (region == nullptr) return false; + if (delay == this->triggerDelay) + return false; + if (triggerType == TriggerType::NoteOn && region->offBy && *region->offBy == group) { release(delay, region->offMode == SfzOffMode::fast); return true; diff --git a/src/sfizz/Voice.h b/src/sfizz/Voice.h index 407c08c9..9cd5e1ed 100644 --- a/src/sfizz/Voice.h +++ b/src/sfizz/Voice.h @@ -267,6 +267,7 @@ private: TriggerType triggerType; int triggerNumber; uint8_t triggerValue; + absl::optional triggerDelay; float speedRatio { 1.0 }; float pitchRatio { 1.0 };