24class AbsValueFollower {
26 AbsValueFollower() =
default;
27 void setup(q31_t attack, q31_t release);
38 inline q31_t getAttack() {
return attackKnobPos; }
39 inline int32_t getAttackMS() {
return attackMS; }
40 int32_t setAttack(q31_t attack) {
42 attackMS = 0.5 + (std::exp(2 *
float(attack) / ONE_Q31f) - 1) * 10;
43 a_ = (-1000.0 / kSampleRate) / attackMS;
44 attackKnobPos = attack;
48 inline q31_t getRelease() {
return releaseKnobPos; }
49 inline int32_t getReleaseMS() {
return releaseMS; }
50 int32_t setRelease(q31_t release) {
52 releaseMS = 50 + (std::exp(2 *
float(release) / ONE_Q31f) - 1) * 50;
53 r_ = (-1000.0 / kSampleRate) / releaseMS;
54 releaseKnobPos = release;
58 StereoFloatSample calcApproxRMS(std::span<StereoSample> buffer);
61 float runEnvelope(
float current,
float desired,
float numSamples);
66 float a_ = (-1000.0f / kSampleRate) / attackMS;
68 float r_ = (-1000.0f / kSampleRate) / releaseMS;
79 q31_t attackKnobPos{0};
80 q31_t releaseKnobPos{0};