-
Notifications
You must be signed in to change notification settings - Fork 0
/
env.c
105 lines (92 loc) · 1.8 KB
/
env.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include "env.h"
#include "stdlib.h"
#include "math.h"
void
env_init ( struct env_t * env, float peak, float hold, float decay, float target, float slope )
{
env_set_peak(env, peak);
env_set_hold(env, hold);
env_set_decay(env, decay);
env_set_target(env, target);
env_set_slope(env, slope);
env->run = 0;
env->cur = 0;
env->state = ENV_STOPPED;
}
void
env_trigger ( struct env_t *env )
{
env->cur = env->peak;
env->state = ENV_HOLD;
env->run = 0;
}
static float
nonlinearize ( float val, float start, float end, float slope )
{
float fx = (val*(1+slope))/(1+(slope*val));
float sx = start+((end-start)*fx);
return sx;
}
float
env_update ( struct env_t *env )
{
switch (env->state)
{
case ENV_HOLD:
if (env->run >= env->hold) {
env->state = ENV_DECAY;
env->run = 0;
break;
}
else {
env->run += 1 / (SAMPLERATE / 1000);
break;
}
case ENV_DECAY:
env->run += 1/( SAMPLERATE/1000 );
if ((env->run/env->decay)>=1.f) {
env->state = ENV_STOPPED;
break;
}
else {
env->cur = nonlinearize(env->run/env->decay, env->peak, env->target, env->slope);
break;
}
case ENV_STOPPED:
return 0;
}
return env->cur;
}
void
env_set_peak ( struct env_t *env, float peak )
{
if(peak >= -1.0 && peak <= 1.0) {
env->peak = peak;
}
}
void
env_set_hold ( struct env_t *env, float hold )
{
env->hold = hold;
}
void
env_set_decay ( struct env_t *env, float decay )
{
if(decay>0) {
env->decay = decay;
}
}
void
env_set_target ( struct env_t *env, float target )
{
if(target >= -1.0 && target <= 1.0) {
env->target = target;
}
}
void
env_set_slope ( struct env_t *env, float slope )
{
if(slope > -1.0 && slope <= 10.0) {
env->slope = slope;
}
}