-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathenvelope.cpp
More file actions
54 lines (45 loc) · 1.55 KB
/
envelope.cpp
File metadata and controls
54 lines (45 loc) · 1.55 KB
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
#include "envelope.h"
Envelope::Envelope(double attack, double decay, double sustain,
double release) {
this->attack = attack;
this->decay = decay;
this->sustain = sustain;
this->release = release;
}
double Envelope::adsFactor(int samplesElapsed) {
if (samplesElapsed < (attack * SAMPLE_RATE))
return ((double)samplesElapsed) / (attack * SAMPLE_RATE);
if (samplesElapsed < ((decay + attack) * SAMPLE_RATE)) {
return sustain +
(1 - sustain) *
(pow(1 - ((double)(samplesElapsed - (attack * SAMPLE_RATE)) /
(decay * SAMPLE_RATE)),
2));
}
return sustain;
}
double Envelope::getFactor(int samplesElapsed) {
double factor;
factor = adsFactor(samplesElapsed);
return factor;
}
double Envelope::getFactor(int samplesElapsed, int releaseSample) {
double factor, releaseLevel;
if ((samplesElapsed - releaseSample) >= (release * SAMPLE_RATE))
return 0;
releaseLevel = adsFactor(samplesElapsed);
factor = releaseLevel *
(1 - (samplesElapsed - releaseSample) / (release * SAMPLE_RATE));
if (factor < 0)
factor = 0;
if (factor > 1)
factor = 1;
return factor;
}
void Envelope::setAttack(double value) { attack = value; }
void Envelope::setDecay(double value) { decay = value; }
void Envelope::setSustain(double value) { sustain = value; }
void Envelope::setRelease(double value) { release = value; }
bool Envelope::isDead(int samplesElapsed, int releaseSample) {
return ((samplesElapsed - releaseSample) > (release * SAMPLE_RATE));
}