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