func addNote() { size := audio.SampleRate() / 60 notes := []float64{freqC, freqD, freqE, freqF, freqG, freqA * 2, freqB * 2} defer func() { scoreIndex++ scoreIndex %= len(score) }() l := make([]int16, size*30) r := make([]int16, size*30) note := score[scoreIndex] for note == ' ' { scoreIndex++ scoreIndex %= len(score) note = score[scoreIndex] } freq := 0.0 switch { case note == 'R': freq = 0 case note <= 'B': freq = notes[int(note)+len(notes)-int('C')] default: freq = notes[note-'C'] } vol := 1.0 / 16.0 square(l, vol, freq, 0.25) square(r, vol, freq, 0.25) audio.Play(0, toBytes(l, r)) }
func addNote(freq float64, vol float64) { f := int(freq) if n, ok := noteCache[f]; ok { audio.Play(-1, n) return } length := len(pcm) * baseFreq / f l := make([]int16, length) r := make([]int16, length) j := 0 jj := 0 for i := 0; i < len(l); i++ { p := pcm[j] l[i] = int16(p * vol * math.MaxInt16) r[i] = l[i] jj += f j = jj / baseFreq } n := toBytes(l, r) noteCache[f] = n audio.Play(-1, n) }