Correctly set current value at exit of the release stage

This commit is contained in:
Jean Pierre Cimalando 2021-03-23 00:08:10 +01:00
parent cf7bbdd565
commit 844aa1a6c2

View file

@ -79,6 +79,8 @@ void ADSREnvelope::getBlock(absl::Span<Float> output) noexcept
size = std::min<size_t>(size, releaseDelay); size = std::min<size_t>(size, releaseDelay);
} }
Float previousValue;
switch (currentState) { switch (currentState) {
case State::Delay: case State::Delay:
while (count < size && delay-- > 0) { while (count < size && delay-- > 0) {
@ -122,10 +124,12 @@ void ADSREnvelope::getBlock(absl::Span<Float> output) noexcept
} }
break; break;
case State::Release: case State::Release:
previousValue = currentValue;
while (count < size && (currentValue *= releaseRate) > config::egReleaseThreshold) while (count < size && (currentValue *= releaseRate) > config::egReleaseThreshold)
output[count++] = currentValue; output[count++] = previousValue = currentValue;
if (currentValue <= config::egReleaseThreshold) { if (currentValue <= config::egReleaseThreshold) {
currentState = State::Fadeout; currentState = State::Fadeout;
currentValue = previousValue;
transitionDelta = -currentValue / (sampleRate * config::egTransitionTime); transitionDelta = -currentValue / (sampleRate * config::egTransitionTime);
} }
break; break;