Skip to content

Instantly share code, notes, and snippets.

@DylanMeeus
Created September 5, 2020 20:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DylanMeeus/83f3ae5d628d11533b8fbd47298d8434 to your computer and use it in GitHub Desktop.
Save DylanMeeus/83f3ae5d628d11533b8fbd47298d8434 to your computer and use it in GitHub Desktop.
Create a tune with GoAudio
package main
import (
"fmt"
synth "github.com/DylanMeeus/GoAudio/synthesizer"
wave "github.com/DylanMeeus/GoAudio/wave"
)
func main() {
fmt.Println("generating sound")
wfmt := wave.NewWaveFmt(1, 1, 44100, 16, nil)
output := []float64{}
output = append(output, F(440, 0.12, wfmt.SampleRate)...)
output = append(output, F(440, 0.12, wfmt.SampleRate)...)
output = append(output, F(440, 0.12, wfmt.SampleRate)...)
output = append(output, F(440, 0.12, wfmt.SampleRate)...)
output = append(output, F(440, 0.35, wfmt.SampleRate)...)
output = append(output, F(440, 0.12, wfmt.SampleRate)...)
output = append(output, F(440, 0.12, wfmt.SampleRate)...)
output = append(output, F(440, 0.12, wfmt.SampleRate)...)
output = append(output, F(440, 0.12, wfmt.SampleRate)...)
output = append(output, F(440, 0.35, wfmt.SampleRate)...)
output = append(output, F(554.37, 0.35, wfmt.SampleRate)...)
output = append(output, F(554.37, 0.12, wfmt.SampleRate)...)
output = append(output, F(554.37, 0.12, wfmt.SampleRate)...)
output = append(output, F(554.37, 0.12, wfmt.SampleRate)...)
output = append(output, F(554.37, 0.12, wfmt.SampleRate)...)
output = append(output, F(554.37, 0.12, wfmt.SampleRate)...)
output = append(output, F(554.37, 0.12, wfmt.SampleRate)...)
output = append(output, F(587.33, 0.12, wfmt.SampleRate)...)
output = append(output, F(587.33, 0.12, wfmt.SampleRate)...)
output = append(output, F(587.33, 0.12, wfmt.SampleRate)...)
output = append(output, F(587.33, 0.12, wfmt.SampleRate)...)
output = append(output, F(587.33, 0.12, wfmt.SampleRate)...)
output = append(output, F(587.33, 0.12, wfmt.SampleRate)...)
output = append(output, F(587.33, 0.36, wfmt.SampleRate)...)
output = append(output, F(440, 0.36, wfmt.SampleRate)...)
output = append(output, F(440, 0.12, wfmt.SampleRate)...)
output = append(output, F(440, 0.12, wfmt.SampleRate)...)
output = append(output, F(440, 0.12, wfmt.SampleRate)...)
output = append(output, F(440, 0.12, wfmt.SampleRate)...)
output = append(output, F(440, 0.12, wfmt.SampleRate)...)
output = append(output, F(440, 0.12, wfmt.SampleRate)...)
output = append(output, F(440, 0.12, wfmt.SampleRate)...)
output = append(output, F(440, 0.12, wfmt.SampleRate)...)
output = append(output, F(440, 0.40, wfmt.SampleRate)...)
frames := wave.FloatsToFrames(output)
wave.WriteFrames(frames, wfmt, "adsr.wav")
fmt.Println("done")
}
func F(freq, duration float64, sr int) []float64 {
st := synth.NewSineTable(8 * 1024)
losc, err := synth.NewLookupOscillator(sr, st, 0)
if err != nil {
panic(err)
}
ticks := int(duration * float64(sr))
output := make([]float64, ticks)
var adsrtime int
for i := 0; i < ticks; i++ {
value := synth.ADSR(0.9, duration, duration/10, duration/10, 0.5, duration, float64(sr), adsrtime)
adsrtime++
output[i] = value * losc.InterpolateTick(freq)
}
return output
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment