diff --git a/modules/juce_audio_basics/utilities/juce_ADSR.h b/modules/juce_audio_basics/utilities/juce_ADSR.h index 3821333f06..481782edda 100644 --- a/modules/juce_audio_basics/utilities/juce_ADSR.h +++ b/modules/juce_audio_basics/utilities/juce_ADSR.h @@ -71,6 +71,9 @@ public: sustainLevel = newParameters.sustain; calculateRates (newParameters); + + if (currentState != State::idle) + checkCurrentState(); } /** Returns the parameters currently being used by an ADSR object. @@ -115,9 +118,16 @@ public: if (currentState != State::idle) { if (releaseRate > 0.0f) + { + if (currentState != State::sustain) + releaseRate = static_cast (envelopeVal / (currentParameters.release * sr)); + currentState = State::release; + } else + { reset(); + } } } @@ -205,6 +215,13 @@ private: releaseRate = (parameters.release > 0.0f ? static_cast (sustainLevel / (parameters.release * sr)) : -1.0f); } + void checkCurrentState() + { + if (currentState == State::attack && attackRate <= 0.0f) currentState = decayRate > 0.0f ? State::decay : State::sustain; + else if (currentState == State::decay && decayRate <= 0.0f) currentState = State::sustain; + else if (currentState == State::release && releaseRate <= 0.0f) reset(); + } + //============================================================================== enum class State { idle, attack, decay, sustain, release };