const piano = filter.def(class { //transofms warp sound into piano sound with rainy background constructor(options) { this.p = 0.0; this.v = 0.0; } process(input, options) { this.v -= (this.v - input[0])*0.1 + 0.25*Math.random()*(Math.sin(Date.now()*0.000325*Math.PI*2)*0.5+0.5 + Math.sin(Date.now()*0.0001*Math.PI*2)*0.5+0.5)*0.5; this.p -= (this.p - this.v)*0.1; return [this.p, -this.p]; } }); const ambiance = filter.def(class { //makes a rainy sound // somehow started to sound good after few minits of messing around constructor(options) { this.t = 0; this.k = 0.0; this.l = 0.0; } process(input, options) { this.t += this.t*0.0001 + Math.random()*0.01; if (this.t > 2000.) this.t = 0.0; let v = (this.t)%1; this.k -= (this.k-v)*0.1 + Math.random()*2.0; this.l = this.k*0.01+this.l*0.9; v = Math.sin(this.l*10.0) * (Math.sin(Date.now()*0.000723523)*0.5+0.5); return [-v*0.4, v*0.4]; } }); const smoothen = filter.def(class { constructor(options) { this.p = 0.0; this.v = 0.0; } process(input, options) { this.v -= (this.v - input[0])*0.1; this.p -= (this.p - this.v)*0.1; var atten = Math.sin(Date.now()*0.000025*Math.PI*2)*0.5+0.5; return [this.p*atten, -this.p*atten]; } }); const warp = 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; return ((this.phase)%2 - 1) * env.value; } } ); function playSequance(type, notes) { //play list of notes //notes are defined by [frequancy, durration, release] //if release is set, durration will be zero, but will be delayed by durration for (let note of notes) { let duration = note[1]; let release = note[2]; if (!release) { release = Math.random()*duration*0.1+0.1; duration -= release; } type.play(note[0], {duration: note[2]?0:duration, release: release, attack: 0.005}); sleep(duration); } } function setEnding() { playSequance(warp, [ [a3, 1.0], [b3, 1.0], [c4, 1.0], [e4, 1.0] ]); playSequance(warp, [ [a3, 1.1], [b3, 1.0], [c4, 1.0], [e4, 0.9] ]); } loop( () => { setEnding(); // preper to end sequance playSequance(warp, [ [ds4, 0.4], [e4, 0.5], [ds4, 0.6], [c4, 1], ]); }, { name: 'background' }) .connect(smoothen.create()) //smoothns the background to make low frequancys more common function alertComing() { playSequance(warp, [ [c6, 0.45, 2.0], [b5, 0.65, 2.0], [g5, 2.1, 2.0], ]) } loop(() => { alertComing(); //sepporates parts playSequance(warp, [ [d5, 2, 2], [e5, 8, 8], ]); alertComing(); playSequance(warp, [ [d5, 2, 2], [c5, 8, 8], ]); }, {name: 'main'}) .connect(piano.create()); //connect main to piano filter loop(()=>sleep(10000000),{name:"ambiance"}).connect(ambiance.create()); //ambiant rain sounds