// // You can find the Dittytoy API Reference here: https://Dittytoy.net/syntax // Example ditties can be found here: https://dittytoy.net/user/Dittytoy // // Most of your ditty will run 44100 times per second using javascript in the browser. // Make sure you optimize your ditty to work well on as many devices as possible. To do that, try to limit // the number of simultaneously active synths: make sure they don't last longer than necessary, or you can // hear them, and spread them over different loops (each loop runs in a separate worker). // class Imprint { constructor(frequancy, absorbsion, weight=1) { this.x = 0; this.v = 0; this.a = 0; this.weight= weight; this.frequancy = frequancy; this.absorbsion = absorbsion; } sample(s) { this.v *= this.absorbsion; this.v += s+Math.random()-0.5;//Math.max(Math.min(s*50, 1), -1); this.v -= this.x; this.x += this.v*this.frequancy; return this.x*this.weight; } } let reverb = filter.def(class { constructor(options) { this.mem = []; this.max =0; for (let i = 0; i < 512; i++) { let res = Math.random()*options.frequancy/44000; let weight = Math.random(); this.max += weight; this.mem.push(new Imprint(res,1-options.decay, weight)); } } process(input) { let s = input[0] // actual sound let out = 0; for (let i of this.mem) { out += i.sample(s); } out /= this.max; return [out, out]; } }) ditty.bpm = 120; const wave = synth.def( //synthisizer used in all notes class { constructor(options) { this.phase = 0; this.k = 1.0; } process(note, env, tick, options) { this.phase += midi_to_hz(note) * ditty.dt+(Math.random()*0.000001)*this.phase; return ((this.phase)%2) * env.value; } } ); let combos = [[() => { wave.play(c4, { attack: 0.01, release: 0.75, duration: 0.25 }); sleep(0.5); wave.play(ds4, { attack: 0.01, release: 0.75, duration: 0.25 }); sleep(0.5); wave.play(f4, { attack: 0.01, release: 0.75, duration: 0.25 }); sleep(0.5); wave.play(gs4, { attack: 0.01, release: 0.75, duration: 0.25 }); sleep(0.5) wave.play(c4, { attack: 0.01, release: 0.75, duration: 0.25 }); sleep(0.5); wave.play(ds4, { attack: 0.01, release: 0.75, duration: 0.25 }); sleep(0.5); wave.play(gs4, { attack: 0.01, release: 0.75, duration: 0.25 }); sleep(0.5); wave.play(g4, { attack: 0.01, release: 1, duration: 0.25 }); sleep(0.5); }, [1]], [() => { wave.play(c4, { attack: 0.01, release: 0.75, duration: 0.25 }); sleep(0.5); wave.play(ds4, { attack: 0.01, release: 0.75, duration: 0.25 }); sleep(0.5); }, [1, 2, 3]], [() => { wave.play(gs4, { attack: 0.01, release: 0.75, duration: 0.25 }); sleep(0.5); wave.play(g4, { attack: 0.01, release: 0.75, duration: 0.25 }); sleep(0.5); wave.play(ds4, { attack: 0.01, release: 2, duration: 0.25 }); sleep(2); wave.play(fs4, { attack: 0.01, release: 1, duration: 0.25 }); sleep(0.5); wave.play(f4, { attack: 0.01, release: 1, duration: 0.25 }); sleep(0.5); wave.play(cs4, { attack: 0.01, release: 3, duration: 0.25 }); sleep(2); }, [2, 0]], [() => { wave.play(c3, { attack: 0.01, release: 0.5, duration: 0.25 }); sleep(0.5); wave.play(c3, { attack: 0.01, release: 1, duration: 0.25 }); sleep(1); wave.play(d3, { attack: 0.01, release: 0.5, duration: 0.25 }); sleep(0.5); wave.play(d3, { attack: 0.01, release: 1, duration: 0.25 }); sleep(1); wave.play(e3, { attack: 0.01, release: 0.75, duration: 0.25 }); sleep(0.5); wave.play(e3, { attack: 0.01, release: 0.75, duration: 0.25 }); sleep(1); wave.play(g3, { attack: 0.01, release: 0.75, duration: 0.25 }); sleep(0.5); wave.play(g3, { attack: 0.01, release: 0.75, duration: 0.25 }); sleep(1); }, [3, 0]] ] function pickRandom(ar) { return ar[parseInt(Math.floor(Math.random()*ar.length))] } let state = 0; loop( () => { combos[state][0](); state = pickRandom(combos[state][1]) }, { name: 'my first loop' }).connect(reverb.create({frequancy: 1000, decay: 0.0001})); loop( () => { combos[3][0](); }, { name: 'my seccond loop' }).connect(reverb.create({frequancy: 1000, decay: 0.001}));