Habe gerade mal in meinen alten Sourcecode geguckt, damit es mal kurz richtig nerdig wird?
Also wenn sich ein Paramter für meine Hüllkurve ändern, dann werden die Koeffizienten neu bereichnet für den exponentiellen Kurvenverlauf.
Code:
void calcAttackTime()
{
double samples = samplerate_ * (attack_time_ / 1000.0);
attack_coeff_ = exp(-log((1.0 + attack_tco_) / attack_tco_) / samples);
attack_offset_ = (1.0 + attack_tco_) * (1.0 - attack_coeff_);
}
Pro Sample muss dann nicht mehr viel gemacht werden. Hier mal aus der Attack Phase.
Code:
case State::ATTACK:
output_ = attack_offset_ + output_ * attack_coeff_;
// Wenn ENV bei 1 oder keine Attackphase dann in Decay Modus
if (output_ >= 1.0 || attack_time_ <= 0.0) {
output_ = 1.0;
state_ = State::DECAY;
}
break;