Correctly set current value at exit of the release stage
This commit is contained in:
parent
cf7bbdd565
commit
844aa1a6c2
1 changed files with 5 additions and 1 deletions
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue