class Delayline { constructor(n) { this.n = n; this.p = 0; this.lastOut = 0; this.data = new Float32Array(n); } clock(input) { this.lastOut = this.data[this.p]; this.data[this.p] = input; if(++this.p >= this.n) { this.p = 0; } } } const ISQRT2 = Math.sqrt(0.5); const reverb = filter.def(class { constructor(options) { let rt60 = 1; let meandelay = 2513 * ditty.dt; this.loopgain = 10 ** (-3*meandelay / rt60); this.outgain = 0.3; this.d1 = new Delayline(1897); this.d2 = new Delayline(2513); this.d3 = new Delayline(3329); } process(input, options) { let v1 = this.d1.lastOut, v2 = this.d2.lastOut, v3 = this.d3.lastOut; let x1 = ISQRT2 * (v1 + v3), w3 = ISQRT2 * (v1 - v3); let x2 = ISQRT2 * (v2 + w3), x3 = ISQRT2 * (v2 - w3); let out0 = x1*this.outgain, out1 = x2*this.outgain; x1 += input[0]; x2 += input[1]; x1 *= this.loopgain; x2 *= this.loopgain; x3 *= this.loopgain; this.d1.clock(x1); this.d2.clock(x2); this.d3.clock(x3); return [out0, out1]; } }); const impulse = synth.def( (phase, env, tick, options) => (tick <= 1.5 * ditty.dt) ? 1.0 : 0.0); const noise = synth.def( () => Math.random() - 0.5, {env:one, duration:0.01}); ditty.bpm = 60; loop( () => { noise.play(); sleep(1); }).connect(reverb.create());