I experimented a bit more with artificial snare drums, partly inspired by athibaul's "Making music in shadertoy" series.
Log in to post a comment.
const TAU = Math.PI * 2;
const sin = Math.sin;
ditty.bpm = 120;
input.note = 35; // min=1, max=50, step=0.5
input.wide = 0; // min=0, max=1, step=1
const Snare = synth.def(class {
constructor(options) {
this.t = 0; Math.random();
}
fm(fc, fm, iom, t) {
return sin(fc*TAU*t + iom*sin(fm*TAU*t));
}
snare(f, t) {
let sig = 0;
// click
sig += this.fm(f*10, 0, 0, t) * 0.05 * Math.exp(-400*t);
// body
const df = -f*1.5 * t;
const fb = f+df;
sig += this.fm(fb, fb*3, 2.5, t) * 0.3 * Math.exp(-60*t);
// noise
sig += Math.random(1) * 0.4 * Math.exp(-22*t);
return sig;
}
process(note, env, tick, options) {
const f = midi_to_hz(input.note);
this.t += ditty.dt;
let l,r = 0;
if (input.wide) {
l = this.snare(f, this.t*1.01);
r = this.snare(f, this.t*0.99);
} else {
l = this.snare(f, this.t);
r = l;
}
//sig += this.snare(f, this.t);
return [l,r];
}
});
loop( () => {
Snare.play();
sleep(2);
}, { name: 'Snare' });