-
Notifications
You must be signed in to change notification settings - Fork 0
/
coupler.go
91 lines (80 loc) · 1.91 KB
/
coupler.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
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
package module
import "buddin.us/eolian/dsp"
func init() {
Register("Coupler", func(c Config) (Patcher, error) { return newCoupler() })
}
const (
couplerOpen int = iota
couplerClosed
couplerFadeOut
couplerFadeIn
couplerRatio = 0.01
)
type coupler struct {
IO
in, duration, toggle *In
level dsp.Float64
state int
lastToggle dsp.Float64
}
func newCoupler() (*coupler, error) {
m := &coupler{
in: NewInBuffer("input", dsp.Float64(0)),
duration: NewInBuffer("duration", dsp.Duration(300)),
toggle: NewInBuffer("toggle", dsp.Float64(0)),
state: couplerOpen,
lastToggle: -1,
}
return m, m.Expose(
"Coupler",
[]*In{m.in, m.duration, m.toggle},
[]*Out{{Name: "output", Provider: dsp.Provide(m)}})
}
func (h *coupler) Process(out dsp.Frame) {
toggle := h.toggle.ProcessFrame()
switch h.state {
case couplerOpen:
in := h.in.ProcessFrame()
for i := range out {
if h.lastToggle < 0 && toggle[i] > 0 {
h.state = couplerFadeOut
}
out[i] = in[i]
h.lastToggle = toggle[i]
}
case couplerClosed:
for i := range out {
if h.lastToggle < 0 && toggle[i] > 0 {
h.state = couplerFadeIn
}
out[i] = 0
h.lastToggle = toggle[i]
}
case couplerFadeOut:
in := h.in.ProcessFrame()
duration := h.duration.ProcessFrame()
for i := range out {
base, multiplier := shapeCoeffs(couplerRatio, duration[i], 0, expCurve)
h.level = base + h.level*multiplier
if h.level < 0 {
h.level = 0
h.state = couplerClosed
}
out[i] = in[i] * h.level
h.lastToggle = toggle[i]
}
case couplerFadeIn:
in := h.in.ProcessFrame()
duration := h.duration.ProcessFrame()
for i := range out {
base, multiplier := shapeCoeffs(couplerRatio, duration[i], 1, logCurve)
h.level = base + h.level*multiplier
if h.level > 1 {
h.level = 1
h.state = couplerOpen
}
out[i] = in[i] * h.level
h.lastToggle = toggle[i]
}
}
}