// Forked from "Bell Tower" by Mattijs // https://dittytoy.net/ditty/2718a6f633 var modFactor = 2.01; var modAmount = 5; var lfoFreq = 3.32; var lfoAmount = 0.0236; const fmBell = synth.def( class { constructor(options) { this.phase = 0; this.modPhase = 0; this.lfoPhase = Math.random(); } process(note, env) { var modFreq = midi_to_hz(note) * modFactor; this.modPhase += modFreq * ditty.dt; var modOsc = Math.sin(this.modPhase * Math.PI * 2); this.lfoPhase += lfoFreq * ditty.dt; var lfo = Math.sin(this.lfoPhase * Math.PI * 2); var carrierFreq = (midi_to_hz(note) + modOsc * modFreq * modAmount) * (1 + lfo * lfoAmount); this.phase += carrierFreq * ditty.dt; var carrierOsc = [Math.sin(this.phase * Math.PI * 2) * env.value, Math.sin(this.phase * Math.PI * 2 + 2.39996322972865332) * env.value]; return carrierOsc; } } ); loop( (loopCount) => { fmBell.play(c2, { attack: 0.01, release: 2, pan: (Math.random() * 2 - 1) * 0.25, amp: loopCount % 8 == 0 ? .5 : 0 }); sleep( 0.55 + Math.random() / 20 ); }); loop( (loopCount) => { fmBell.play(e2, { attack: 0.01, release: 2, pan: (Math.random() * 2 - 1) * 0.25, amp: loopCount % 8 == 3 ? .5 : 0 }); sleep( 0.5 + Math.random() / 20 ); }); loop( (loopCount) => { fmBell.play(g2, { attack: 0.01, release: 2, pan: (Math.random() * 2 - 1) * 0.25, amp: loopCount % 8 == 3 ? .5 : 0 }); sleep( 0.54 + Math.random() / 20 ); });