music - string.go
1 package music
2
3 import "math/rand"
4
5 // https://uk.mathworks.com/help/signal/examples/generating-guitar-chords-using-the-karplus-strong-algorithm.html
6 // http://www.cs.princeton.edu/courses/archive/fall07/cos126/assignments/guitar.html
7
8 type String struct {
9 data []float64
10 pos int
11 decay float64
12 }
13
14 const StringDecay = 0.4998
15
16 func NewString(n Note, rate, decay float64) *String {
17 return &String{
18 data: make([]float64, int(rate/float64(n))),
19 decay: decay,
20 }
21 }
22
23 func (s *String) Pluck() {
24 for i := range s.data {
25 s.data[i] = rand.Float64()*2 - 1
26 }
27 s.pos = 0
28 }
29
30 func (s *String) Next(_ float64) float64 {
31 p := s.pos
32 f := s.data[p]
33 s.pos++
34 if s.pos == len(s.data) {
35 s.pos = 0
36 }
37 s.data[p] = s.decay * (f + s.data[s.pos])
38 return f
39 }