arduino-audio-tools
Loading...
Searching...
No Matches
AudioParameters.h
Go to the documentation of this file.
1#pragma once
2#include "AudioToolsConfig.h"
5
6namespace audio_tools {
7
12 public:
13 virtual ~AbstractParameter() = default;
14
15 virtual float value() {
16 return act_value;
17 };
18
19 // triggers an update of the value
20 virtual float tick() {
21 act_value = update();
22 return act_value;
23 }
24
25 // to manage keyboard related parameters
26 virtual void keyOn(float tgt=0){}
27
28 // to manage keyboard related parameters
29 virtual void keyOff(){}
30
31 protected:
32 float act_value = 0;
33 friend class ScaledParameter;
34
35 virtual float update() = 0;
36};
37
43 public:
46 }
47 virtual float update(){ return act_value;}
48};
49
53class ADSR : public AbstractParameter {
54 public:
55
56 ADSR(float attack=0.001, float decay=0.001, float sustainLevel=0.5, float release= 0.005){
61 }
62
63 ADSR(ADSR &copy) = default;
64
65 void setAttackRate(float a){
66 attack = a;
67#if PREFER_FIXEDPOINT
68 attack_q = q1_14_t(a);
69#endif
70 }
71
72 float attackRate(){
73 return attack;
74 }
75
76 void setDecayRate(float d){
77 decay = d;
78#if PREFER_FIXEDPOINT
79 decay_q = q1_14_t(d);
80#endif
81 }
82
83 float decayRate() {
84 return decay;
85 }
86
87 void setSustainLevel(float s){
88 sustain = s;
89#if PREFER_FIXEDPOINT
90 sustain_q = q1_14_t(s);
91#endif
92 }
93
94 float sustainLevel(){
95 return sustain;
96 }
97
98 void setReleaseRate(float r){
99 release = r;
100#if PREFER_FIXEDPOINT
101 release_q = q1_14_t(r);
102#endif
103 }
104
105 float releaseRate() {
106 return release;
107 }
108
109 void keyOn(float tgt=0){
110 LOGI("%s: %f", LOG_METHOD, tgt);
111 state = Attack;
112 this->target = tgt>0.0f && tgt<=1.0f ? tgt : sustain;
113 this->act_value = 0;
114#if PREFER_FIXEDPOINT
115 target_q = q1_14_t(this->target);
116 act_value_q = q1_14_t(0.0f);
117#endif
118 }
119
120 void keyOff(){
121 TRACEI();
122 if (state!=Idle){
123 state = Release;
124 target = 0;
125#if PREFER_FIXEDPOINT
126 target_q = q1_14_t(0.0f);
127#endif
128 }
129 }
130
131 bool isActive(){
132 return state!=Idle;
133 }
134
135#if PREFER_FIXEDPOINT
140 q1_14_t tickFixed() {
141 act_value_q = updateFixed();
142 act_value = (float)act_value_q;
143 return act_value_q;
144 }
145#endif
146
147 protected:
150 const char* adsrNames[5] = {"Idle", "Attack", "Decay", "Sustain", "Release"};
152 float target = 0;
153 int zeroCount = 0;
154
155#if PREFER_FIXEDPOINT
156 q1_14_t attack_q{0.001f}, decay_q{0.001f}, sustain_q{0.5f}, release_q{0.005f};
157 q1_14_t target_q{0.0f}, act_value_q{0.0f};
158
159 q1_14_t updateFixed() {
160 switch ( state ) {
161 case Attack:
162 act_value_q += attack_q;
163 if ( act_value_q >= target_q ) {
164 act_value_q = target_q;
165 target_q = sustain_q;
166 target = sustain;
167 state = Decay;
168 }
169 break;
170
171 case Decay:
172 if ( act_value_q > sustain_q ) {
173 act_value_q -= decay_q;
174 if ( act_value_q <= sustain_q ) {
175 act_value_q = sustain_q;
176 state = Sustain;
177 }
178 }
179 else {
180 act_value_q += decay_q; // attack target < sustainLevel level
181 if ( act_value_q >= sustain_q ) {
182 act_value_q = sustain_q;
183 state = Sustain;
184 }
185 }
186 break;
187
188 case Release:
189 act_value_q -= release_q;
190 if ( act_value_q <= q1_14_t(0.0f) ) {
191 act_value_q = q1_14_t(0.0f);
192 state = Idle;
193 }
194 break;
195
196 default:
197 // nothing to be done
198 break;
199 }
200 return act_value_q;
201 }
202#endif
203
204 inline float update( ) {
205#if PREFER_FIXEDPOINT
206 return (float)updateFixed();
207#else
208 switch ( state ) {
209 case Attack:
210 act_value += attack;
211 if ( act_value >= target ) {
213 target = sustain;
214 state = Decay;
215 }
216 break;
217
218 case Decay:
219 if ( act_value > sustain ) {
220 act_value -= decay;
221 if ( act_value <= sustain ) {
223 state = Sustain;
224 }
225 }
226 else {
227 act_value += decay; // attack target < sustainLevel level
228 if ( act_value >= sustain ) {
230 state = Sustain;
231 }
232 }
233 break;
234
235 case Release:
237 if ( act_value <= 0.0f ) {
238 act_value = 0.0;
239 state = Idle;
240 }
241 break;
242
243 default:
244 // nothing to be done
245 break;
246 }
247 return act_value;
248#endif
249 }
250
251};
252
253
259 public:
260 ScaledParameter(AbstractParameter *parameter, float min, float max){
261 this->min = min;
262 this->max = max;
263 this->p_parameter = parameter;
264 }
265
266 float update() {
267 return p_parameter->update() + min * (max-min);
268 }
269
270 protected:
271 float min=0, max=0;
273
274};
275
276
277}
#define TRACEI()
Definition AudioLoggerIDF.h:32
#define LOGI(...)
Definition AudioLoggerIDF.h:28
#define LOG_METHOD
Definition AudioToolsConfig.h:69
Generates ADSR values between 0.0 and 1.0.
Definition AudioParameters.h:53
ADSR(ADSR &copy)=default
void setDecayRate(float d)
Definition AudioParameters.h:76
int zeroCount
Definition AudioParameters.h:153
float decayRate()
Definition AudioParameters.h:83
const char * adsrNames[5]
Definition AudioParameters.h:150
void keyOn(float tgt=0)
Definition AudioParameters.h:109
AdsrPhase state
Definition AudioParameters.h:151
AdsrPhase
Definition AudioParameters.h:149
@ Attack
Definition AudioParameters.h:149
@ Release
Definition AudioParameters.h:149
@ Decay
Definition AudioParameters.h:149
@ Sustain
Definition AudioParameters.h:149
@ Idle
Definition AudioParameters.h:149
void setSustainLevel(float s)
Definition AudioParameters.h:87
float release
Definition AudioParameters.h:148
float attackRate()
Definition AudioParameters.h:72
float attack
Definition AudioParameters.h:148
ADSR(float attack=0.001, float decay=0.001, float sustainLevel=0.5, float release=0.005)
Definition AudioParameters.h:56
float decay
Definition AudioParameters.h:148
float sustain
Definition AudioParameters.h:148
bool isActive()
Definition AudioParameters.h:131
void setReleaseRate(float r)
Definition AudioParameters.h:98
void setAttackRate(float a)
Definition AudioParameters.h:65
float update()
Definition AudioParameters.h:204
float releaseRate()
Definition AudioParameters.h:105
float sustainLevel()
Definition AudioParameters.h:94
void keyOff()
Definition AudioParameters.h:120
float target
Definition AudioParameters.h:152
Base class for all parameters.
Definition AudioParameters.h:11
virtual float tick()
Definition AudioParameters.h:20
virtual void keyOff()
Definition AudioParameters.h:29
float act_value
Definition AudioParameters.h:32
virtual void keyOn(float tgt=0)
Definition AudioParameters.h:26
virtual ~AbstractParameter()=default
virtual float value()
Definition AudioParameters.h:15
A constant value.
Definition AudioParameters.h:42
virtual float update()
Definition AudioParameters.h:47
Parameter(float value)
Definition AudioParameters.h:44
Scales a dynamic parameter to the indicated range.
Definition AudioParameters.h:258
ScaledParameter(AbstractParameter *parameter, float min, float max)
Definition AudioParameters.h:260
float max
Definition AudioParameters.h:271
float update()
Definition AudioParameters.h:266
float min
Definition AudioParameters.h:271
AbstractParameter * p_parameter
Definition AudioParameters.h:272
Fixed-point Q1.14 number: a plain 16-bit signed integer holding 1 integer bit and 14 fractional bits ...
Definition q1_14_t.h:16
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition LMSEchoCancellationStream.h:6