3
3
4
4
package internal
5
5
6
- import "math"
6
+ import (
7
+ "math"
8
+ "math/rand"
9
+ )
7
10
8
11
type Oscillator struct {
9
12
Func func (pos float64 ) float64
@@ -19,13 +22,15 @@ func (o *Oscillator) NextSample() (v float64) {
19
22
}
20
23
21
24
func Triangle (pos float64 ) float64 {
25
+ // Based on https://github.com/picolove
22
26
phase := math .Mod (pos , 1 )
23
27
value := math .Abs (phase * 2 - 1 )* 2 - 1
24
28
25
29
return value * 0.45
26
30
}
27
31
28
32
func TiltedSaw (pos float64 ) float64 {
33
+ // Based on https://github.com/picolove
29
34
phase := math .Mod (pos , 1 )
30
35
var v float64
31
36
if phase < 0.875 {
@@ -37,11 +42,13 @@ func TiltedSaw(pos float64) float64 {
37
42
}
38
43
39
44
func Saw (pos float64 ) float64 {
45
+ // Based on https://github.com/picolove
40
46
phase := math .Mod (pos , 1 )
41
47
return (phase - 0.5 ) * 0.65
42
48
}
43
49
44
50
func Square (pos float64 ) float64 {
51
+ // Based on https://github.com/picolove
45
52
phase := math .Mod (pos , 1 )
46
53
v := - 1.0
47
54
if phase < 0.5 {
@@ -51,6 +58,7 @@ func Square(pos float64) float64 {
51
58
}
52
59
53
60
func Pulse (pos float64 ) float64 {
61
+ // Based on https://github.com/picolove
54
62
phase := math .Mod (pos , 1 )
55
63
v := - 1.0
56
64
if phase < 0.3125 {
@@ -61,10 +69,38 @@ func Pulse(pos float64) float64 {
61
69
62
70
// Organ is triangle / 2
63
71
func Organ (pos float64 ) float64 {
72
+ // Based on https://github.com/picolove
64
73
pos = pos * 4
65
74
66
75
v := math .Abs (math .Mod (pos , 2 )- 1 ) - 0.5 +
67
76
(math .Abs ((math .Mod (pos * 0.5 , 2 ))- 1 )- 0.5 )/ 2 - 0.1
68
77
69
78
return v * 0.55
70
79
}
80
+
81
+ func Noise () func (pos float64 ) float64 {
82
+ // Based on https://github.com/picolove
83
+ lastPos := 0.0
84
+ sample := 0.0
85
+ lsample := 0.0
86
+ const tscale = 2489.0158697766 / SampleRate // 2489.0158697766 is freq for D#5
87
+
88
+ return func (pos float64 ) float64 {
89
+ scale := (pos - lastPos ) / tscale
90
+ lsample = sample
91
+ sample = (lsample + scale * (rand .Float64 ()* 2 - 1 )) / (1 + scale )
92
+ lastPos = pos
93
+ v := math .Min (math .Max ((lsample + sample )* 4 / 3 * (1.75 - scale ), - 1 ), 1 )
94
+ return v * 0.5
95
+ }
96
+ }
97
+
98
+ func Phaser (pos float64 ) float64 {
99
+ // Based on https://github.com/picolove
100
+ pos = pos * 2
101
+
102
+ v := math .Abs (math .Mod (pos , 2 )- 1 ) - 0.5 +
103
+ (math .Abs (math .Mod (pos * 127 / 128 , 2 )- 1 )- 0.5 )/ 2 - 0.25
104
+
105
+ return v * 0.7
106
+ }
0 commit comments