1 #pragma once
2 #include <cmath>
3 
4 class ARFollower {
5 private:
6     float fConst0;
7     float fRec1[2];
8     float fRec0[2];
9     float fControl[2];
10 
11 public:
init(float sample_rate)12     void init(float sample_rate)
13     {
14         fConst0 = (1.0f / sample_rate);
15         clear();
16         setAttackTime(0.1);
17         setReleaseTime(0.1);
18     }
19 
clear()20     void clear()
21     {
22         for (int l0 = 0; (l0 < 2); l0 = (l0 + 1)) {
23             fRec1[l0] = 0.0f;
24         }
25         for (int l1 = 0; (l1 < 2); l1 = (l1 + 1)) {
26             fRec0[l1] = 0.0f;
27         }
28     }
29 
setAttackTime(float at)30     void setAttackTime(float at)
31     {
32         fControl[0] = std::exp((0.0f - (fConst0 / float(at))));
33     }
34 
setReleaseTime(float rt)35     void setReleaseTime(float rt)
36     {
37         fControl[1] = std::exp((0.0f - (fConst0 / float(rt))));
38     }
39 
configureLike(const ARFollower & other)40     void configureLike(const ARFollower &other) {
41         fConst0 = other.fConst0;
42         fControl[0] = other.fControl[0];
43         fControl[1] = other.fControl[1];
44     }
45 
compute(float x)46     float compute(float x)
47     {
48         float fTemp0 = float(x);
49         float fTemp1 = ((fRec0[1] > fTemp0) ? fControl[1] : fControl[0]);
50         fRec1[0] = ((fRec1[1] * fTemp1) + (fTemp0 * (1.0f - fTemp1)));
51         fRec0[0] = fRec1[0];
52         float y = float(fRec0[0]);
53         fRec1[1] = fRec1[0];
54         fRec0[1] = fRec0[0];
55         return y;
56     }
57 };
58 
59 /**
60 import("stdfaust.lib");
61 
62 process = si.lag_ud(up, dn) with {
63   up = hslider("Attack time", 0.1, 0, 1, 0.001);
64   dn = hslider("Release time", 0.1, 0, 1, 0.001);
65 };
66 */
67 
68 /**
69 m->declare("basics.lib/name", "Faust Basic Element Library");
70 m->declare("basics.lib/version", "0.1");
71 m->declare("filename", "lag.dsp");
72 m->declare("maths.lib/author", "GRAME");
73 m->declare("maths.lib/copyright", "GRAME");
74 m->declare("maths.lib/license", "LGPL with exception");
75 m->declare("maths.lib/name", "Faust Math Library");
76 m->declare("maths.lib/version", "2.1");
77 m->declare("name", "lag");
78 m->declare("signals.lib/name", "Faust Signal Routing Library");
79 m->declare("signals.lib/version", "0.0");
80 */
81