1 // Licensed GNU LGPL v3 or later: http://www.gnu.org/licenses/lgpl.html
2 
3 #ifndef SPECTMORPH_ADSR_ENVELOPE_HH
4 #define SPECTMORPH_ADSR_ENVELOPE_HH
5 
6 #include <stddef.h>
7 
8 namespace SpectMorph {
9 
10 class ADSREnvelope
11 {
12   enum class State { ATTACK, DECAY, SUSTAIN, RELEASE, DONE };
13 
14   State state;
15   double level;
16   int attack_len;
17   int decay_len;
18   int release_len;
19   float sustain_level;
20 
21   struct SlopeParams {
22     int len;
23 
24     double factor;     // exponential slope only
25     double delta;      // exponential slope & linear slope
26     double end;
27 
28     bool linear;
29   } params;
30 
31   size_t process_params (size_t len, float *values);
32   void compute_slope_params (int len, float start_x, float end_x, State param_state);
33 public:
34   void set_config (float attack, float decay, float sustain, float release, float mix_freq);
35   void retrigger();
36   void release();
37   bool done() const;
38   void process (size_t n_values, float *values);
39 
40   // test only
41   void test_decay (int len, float start_x, float end_x);
42 };
43 
44 }
45 
46 #endif
47