-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathADSR.cpp
80 lines (65 loc) · 1.68 KB
/
ADSR.cpp
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
//
// ADSR.cpp
//
// Created by Nigel Redmon on 12/18/12.
// EarLevel Engineering: earlevel.com
// Copyright 2012 Nigel Redmon
//
// For a complete explanation of the ADSR envelope generator and code,
// read the series of articles by the author, starting here:
// http://www.earlevel.com/main/2013/06/01/envelope-generators/
//
// License:
//
// This source code is provided as is, without warranty.
// You may copy and distribute verbatim copies of this document.
// You may modify and use this source code to create binary code for your own purposes, free or commercial.
//
// 1.01 2016-01-02 njr added calcCoef to SetTargetRatio functions that were in the ADSR widget but missing in this code
// 1.02 2017-01-04 njr in calcCoef, checked for rate 0, to support non-IEEE compliant compilers
//
#include "ADSR.h"
ADSR::ADSR(void) {
Reset();
SetADSR(1, 1, 1.0, 1);
}
ADSR::~ADSR(void) {
}
void ADSR::SetADSR(Num attack, Num decay, Num sustain, Num release)
{
SetSustain(sustain);
SetAttack(attack);
SetDecay(decay);
SetRelease(release);
}
void ADSR::SetAttack(Num attack) {
this->attack = attack;
if (attack < Num(1.0))
{
attack = Num(1.0);
}
attackCoef = Num(1.0)/attack;
attackBase = Num(0);
}
void ADSR::SetDecay(Num decay) {
this->decay = decay;
if (decay < Num(1))
{
decay = Num(1);
}
decayCoef = (Num(1.0) - this->sustainLevel) / this->decay;
}
void ADSR::SetSustain(Num level) {
sustainLevel = level;
decayBase = sustainLevel;
}
void ADSR::SetRelease(Num releaseval)
{
release = releaseval;
if (release < Num(1))
{
release = Num(1);
}
releaseCoef = (this->sustainLevel / this->release);
releaseBase = this->sustainLevel;
}