OpenWareLaboratory
ExponentialDecayEnvelope.h
Go to the documentation of this file.
1 #ifndef EXPONENTIAL_DECAY_ENVELOPE_H
2 #define EXPONENTIAL_DECAY_ENVELOPE_H
3 
4 #include "Envelope.h"
5 
7 protected:
8  float sr;
9  float value;
10  float incr;
11  float calculateMultiplier(float startLevel, float endLevel, size_t lengthInSamples) {
12  // Ref: Christian Schoenebeck http://www.musicdsp.org/showone.php?id=189
13  return 1.0 + (logf(endLevel) - logf(startLevel)) / (lengthInSamples+20);
14  }
15 public:
16  ExponentialDecayEnvelope(float sr=48000): sr(sr), value(0), incr(0){}
17  using Envelope::gate;
18  using Envelope::trigger;
19  using Envelope::process;
21  void setSampleRate(float sampleRate){
22  sr = sampleRate;
23  }
24  void setDecaySamples(float samples){ // set decay time in samples
25  incr = calculateMultiplier(1, 0.0001, samples);
26  }
27  void setDecay(float sec){ // set decay time in seconds to reach -80dB
28  incr = calculateMultiplier(1, 0.0001, sec*sr);
29  }
30  void trigger(bool state, int triggerDelay){
31  if(state)
32  value = 1;
33  }
34  void gate(bool state, int triggerDelay){
35  value = state;
36  }
40  float generate(){
41  float sample = value;
42  value *= incr;
43  return sample;
44  }
45  float getLevel(){
46  return value;
47  }
48  void setLevel(float level){
49  value = level;
50  }
51  [[deprecated("use generate() instead.")]]
52  float getNextSample(){
53  return generate(); // increments envelope one step
54  }
56  return new ExponentialDecayEnvelope(sr);
57  }
58  static void destroy(ExponentialDecayEnvelope* env){
59  delete env;
60  }
61 };
62 
63 #endif /* EXPONENTIAL_DECAY_ENVELOPE_H */
virtual void trigger()
Definition: Envelope.h:11
virtual void gate(bool state)
Definition: Envelope.h:18
virtual float process(float input)
Definition: Envelope.h:22
float calculateMultiplier(float startLevel, float endLevel, size_t lengthInSamples)
void setDecaySamples(float samples)
static ExponentialDecayEnvelope * create(float sr)
void trigger(bool state, int triggerDelay)
void gate(bool state, int triggerDelay)
void setSampleRate(float sampleRate)
float generate()
Produce the next envelope sample.
static void destroy(ExponentialDecayEnvelope *env)
virtual float generate()
Produce the next consecutive sample.