Skip to content

Instantly share code, notes, and snippets.

@DylanMeeus
Created October 9, 2020 17:02
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DylanMeeus/ee6c3eb4acebedd5682a1e2989ccd0fa to your computer and use it in GitHub Desktop.
Save DylanMeeus/ee6c3eb4acebedd5682a1e2989ccd0fa to your computer and use it in GitHub Desktop.
package main
import (
"fmt"
synth "github.com/DylanMeeus/GoAudio/synthesizer"
"github.com/DylanMeeus/GoAudio/wave"
)
const (
sr = 44100.
noteDuration = 0.5
)
func main() {
st, err := synth.NewTriangleTable(8*1024, 11)
if err != nil {
panic(err)
}
osc, err := synth.NewLookupOscillator(sr, st, 0)
if err != nil {
panic(err)
}
waitdur := .1
cdecdur := 0.6
efgdur := 0.6
gagfecdur := 0.5
cgcdur := 0.5
// notes: https://www.true-piano-lessons.com/frere-jacques.html
output := []wave.Frame{}
// frere jacues
output = append(output, play(osc, "C5", cdecdur)...)
output = append(output, play(osc, "D5", cdecdur)...)
output = append(output, play(osc, "E5", cdecdur)...)
output = append(output, play(osc, "C5", cdecdur)...)
output = append(output, play(osc, "C5", cdecdur)...)
output = append(output, play(osc, "D5", cdecdur)...)
output = append(output, play(osc, "E5", cdecdur)...)
output = append(output, play(osc, "C5", cdecdur)...)
output = append(output, play(osc, "WAIT", waitdur)...)
// dormez-vous
output = append(output, play(osc, "E5", efgdur)...)
output = append(output, play(osc, "F5", efgdur)...)
output = append(output, play(osc, "G5", efgdur)...)
output = append(output, play(osc, "WAIT", 0.2)...)
output = append(output, play(osc, "E5", efgdur)...)
output = append(output, play(osc, "F5", efgdur)...)
output = append(output, play(osc, "G5", efgdur)...)
// sonnez les matines
output = append(output, play(osc, "G5", gagfecdur)...)
output = append(output, play(osc, "A5", gagfecdur)...)
output = append(output, play(osc, "G5", gagfecdur)...)
output = append(output, play(osc, "F5", gagfecdur)...)
output = append(output, play(osc, "E5", gagfecdur)...)
output = append(output, play(osc, "C5", gagfecdur)...)
output = append(output, play(osc, "WAIT", 0.2)...)
output = append(output, play(osc, "G5", gagfecdur)...)
output = append(output, play(osc, "A5", gagfecdur)...)
output = append(output, play(osc, "G5", gagfecdur)...)
output = append(output, play(osc, "F5", gagfecdur)...)
output = append(output, play(osc, "E5", gagfecdur)...)
output = append(output, play(osc, "C5", gagfecdur)...)
output = append(output, play(osc, "WAIT", gagfecdur)...)
// dindindon
output = append(output, play(osc, "C5", cgcdur)...)
output = append(output, play(osc, "G5", cgcdur)...)
output = append(output, play(osc, "C5", cgcdur)...)
output = append(output, play(osc, "WAIT", 0.1)...)
output = append(output, play(osc, "C5", cgcdur)...)
output = append(output, play(osc, "G5", cgcdur)...)
output = append(output, play(osc, "C5", cgcdur)...)
wfmt := wave.NewWaveFmt(1, 1, sr, 16, nil)
wave.WriteFrames(output, wfmt, "frerejacques.wav")
fmt.Println("done")
}
func play(l *synth.LookupOscillator, note string, duration float64) []wave.Frame {
var freq float64
var err error
if note != "WAIT" {
freq, err = synth.ParseNoteToFrequency(note)
if err != nil {
panic(err)
}
} else {
freq = 0
}
frames := make([]wave.Frame, int(duration*sr))
var adsrtime int
for i := range frames {
value := synth.ADSR(0.8, duration, 0.2, 0.1, 0.5, duration-0.05, sr, adsrtime)
adsrtime++
frames[i] = wave.Frame(value * l.InterpolateTick(freq))
}
return frames
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment