-
Notifications
You must be signed in to change notification settings - Fork 2
/
ADSR.go
43 lines (37 loc) · 1.07 KB
/
ADSR.go
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
package signals
import "encoding/gob"
func init() {
gob.Register(ADSREnvelope{})
}
// Attack Decay Sustain Release (ADSR) envelope. see https://en.wikipedia.org/wiki/Synthesizer#Attack_Decay_Sustain_Release_.28ADSR.29_envelope
type ADSREnvelope struct {
attackEnd x
attackSlope y
decaySlope y
sustainStart x
sustain y
sustainEnd x
releaseSlope y
end x
}
func NewADSREnvelope(attack, decay, sustain x, sustainy y, release x) ADSREnvelope {
// TODO release attack or decay of zero!
return ADSREnvelope{attack, unitY / y(attack), (unitY - sustainy) / y(decay), attack + decay, sustainy, attack + decay + sustain, sustainy / y(release), attack + decay + sustain + release}
}
func (s ADSREnvelope) property(p x) y {
if p > s.end {
return 0
} else if p > s.sustainEnd {
return y(s.end-p) * s.releaseSlope
} else if p > s.sustainStart {
return s.sustain
} else if p > s.attackEnd {
return y(s.sustainStart-p)*s.decaySlope + s.sustain
} else if p > 0 {
return y(p) * s.attackSlope
}
return 0
}
func (s ADSREnvelope) MaxX() x {
return s.end
}