From 844aa1a6c29e23bdc49d60793b261e340b7e20b4 Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Tue, 23 Mar 2021 00:08:10 +0100 Subject: [PATCH] Correctly set current value at exit of the release stage --- src/sfizz/ADSREnvelope.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/sfizz/ADSREnvelope.cpp b/src/sfizz/ADSREnvelope.cpp index 063563ea..e8fa12b9 100644 --- a/src/sfizz/ADSREnvelope.cpp +++ b/src/sfizz/ADSREnvelope.cpp @@ -79,6 +79,8 @@ void ADSREnvelope::getBlock(absl::Span output) noexcept size = std::min(size, releaseDelay); } + Float previousValue; + switch (currentState) { case State::Delay: while (count < size && delay-- > 0) { @@ -122,10 +124,12 @@ void ADSREnvelope::getBlock(absl::Span output) noexcept } break; case State::Release: + previousValue = currentValue; while (count < size && (currentValue *= releaseRate) > config::egReleaseThreshold) - output[count++] = currentValue; + output[count++] = previousValue = currentValue; if (currentValue <= config::egReleaseThreshold) { currentState = State::Fadeout; + currentValue = previousValue; transitionDelta = -currentValue / (sampleRate * config::egTransitionTime); } break;