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;