func NewWobbleKey(idx int) Key { osc := snd.NewOscil(sine, notes[idx], snd.NewOscil(triangle, 2, nil)) adsr := snd.NewADSR(50*ms, 100*ms, 200*ms, 400*ms, 0.6, 0.9, osc) key := &WobbleKey{snd.NewInstrument(adsr), adsr} key.Off() return key }
func NewPianoKey(idx int) Key { const phasefac float64 = 0.5063999999999971 k := &PianoKey{} k.freq = notes[idx] k.mod = snd.NewOscil(sqsine, k.freq/2, nil) k.osc = snd.NewOscil(sawtooth, k.freq, k.mod) k.phs = snd.NewOscil(square, k.freq*phasefac, nil) k.osc.SetPhase(k.phs) freql := k.freq * math.Pow(2, -10.0/1200) k.modl = snd.NewOscil(sqsine, freql/2, nil) k.oscl = snd.NewOscil(sawtooth, freql, k.modl) k.phsl = snd.NewOscil(square, freql*phasefac, nil) k.oscl.SetPhase(k.phsl) freqr := k.freq * math.Pow(2, 10.0/1200) k.modr = snd.NewOscil(sqsine, freqr/2, nil) k.oscr = snd.NewOscil(sawtooth, freqr, k.modr) k.phsr = snd.NewOscil(square, freqr*phasefac, nil) k.oscr.SetPhase(k.phsr) oscmix := snd.NewMixer(k.osc, k.oscl, k.oscr) k.reldur = 1050 * ms k.dur = 280*ms + k.reldur k.adsr0 = snd.NewADSR(30*ms, 50*ms, 200*ms, k.reldur, 0.4, 1, oscmix) k.adsr1 = snd.NewADSR(1*ms, 278*ms, 1*ms, k.reldur, 0.4, 1, oscmix) adsrmix := snd.NewMixer(k.adsr0, k.adsr1) k.gain = snd.NewGain(snd.Decibel(-10).Amp(), adsrmix) k.Instrument = snd.NewInstrument(k.gain) k.Off() return k }
func NewBeatsKey(idx int) Key { osc := snd.NewOscil(sawsine, notes[idx], snd.NewOscil(triangle, 4, nil)) dmp := snd.NewDamp(bpm.Dur(), osc) d := snd.BPM(float64(bpm) * 1.25).Dur() dmp1 := snd.NewDamp(d, osc) drv := snd.NewDrive(d, osc) mix := snd.NewMixer(dmp, dmp1, drv) frz := snd.NewFreeze(bpm.Dur()*4, mix) adsr := snd.NewADSR(250*ms, 500*ms, 300*ms, 400*ms, 0.85, 1.0, frz) key := &BeatsKey{snd.NewInstrument(adsr), adsr} key.Off() return key }