From 9cab74f2c43aeb40100e986aad4a97a875f317c8 Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Mon, 28 Sep 2020 21:49:20 +0200 Subject: [PATCH] flexEG: allow release to bypass the pre-sustain stages It makes the EG equivalent to ARIA in case of early release. --- src/sfizz/FlexEnvelope.cpp | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/sfizz/FlexEnvelope.cpp b/src/sfizz/FlexEnvelope.cpp index c58d3ae5..6fd67ac1 100644 --- a/src/sfizz/FlexEnvelope.cpp +++ b/src/sfizz/FlexEnvelope.cpp @@ -141,12 +141,24 @@ void FlexEnvelope::Impl::process(absl::Span out) } // Perform stage transitions - const bool isReleased = isReleased_; - while ((!stageSustained_ && currentTime_ >= stageTime_) || - (stageSustained_ && isReleased)) { - // If stage is of zero duration, immediate transition to level - if (!stageSustained_ && stageTime_ == 0) + if (isReleased_) { + // on release, fast forward past the sustain stage + const unsigned sustainStage = desc.sustain; + while (currentStageNumber_ <= sustainStage) { + if (!advanceToNextStage()) { + out.remove_prefix(frameIndex); + fill(out, 0.0f); + return; + } + } + } + while (!stageSustained_ && currentTime_ >= stageTime_) { + // advance through completed timed stages + ASSERT(isReleased_ || !stageSustained_); + if (stageTime_ == 0) { + // if stage is of zero duration, immediate transition to level currentLevel_ = stageTargetLevel_; + } if (!advanceToNextStage()) { out.remove_prefix(frameIndex); fill(out, 0.0f);