ADSR goes crazy if you use times of 0s. If you use a time of 0 the rate is set to -1
.
attackRate = (parameters.attack > 0.0f ? static_cast<float> (1.0f / (parameters.attack * sr)) : -1.0f);
decayRate = (parameters.decay > 0.0f ? static_cast<float> ((1.0f - sustainLevel) / (parameters.decay * sr)) : -1.0f);
releaseRate = (parameters.release > 0.0f ? static_cast<float> (sustainLevel / (parameters.release * sr)) : -1.0f);
But in getNextSample
it is assumed the rate is set properly.
if (currentState == State::attack)
{
envelopeVal += attackRate;
if (envelopeVal >= 1.0f)
{
envelopeVal = 1.0f;
if (decayRate > 0.0f)
currentState = State::decay;
else
currentState = State::sustain;
}
}
So my envelope value goes flying off to -∞!