I modified slightly the sound generation of Ollerich's snare to improve the click and the body, and add distortion and a slight "fake compression" effect for increased tension.
Log in to post a comment.
// Forked from "Wide snare" by Ollerich
// https://dittytoy.net/ditty/3358aafcb7
const TAU = Math.PI * 2;
const sin = Math.sin;
ditty.bpm = 120;
input.note = 53; // min=35, max=80, step=0.5
input.wide = 0; // min=0, max=1, step=1
const rand = () => 2*Math.random()-1;
function smoothstep(a,b,x) {
let y = (x-a)/(b-a);
if(y < 0) { return 0; }
if(y > 1) { return 1; }
return 2*y*y*(1.5-y);
}
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
// I changed this to a white noise impulse
sig += rand() * 0.3 * Math.exp(-300*t);
// body
// I like to use a rather small iom for snares
// and a modulator frequency of 2*fb so that we hear the third harmonic
// (in fact, since we use distortion later on, we could simply use a sine or triangle wave)
const df = -f*1.5 * t;
const fb = f+df;
const iom = 1.0*Math.exp(-10*t); // iom goes from 1.0 to 0.0
sig += this.fm(fb, fb*2, iom, t) * 0.5 * Math.exp(-35*t);
// noise
// This could be changed to a "colored noise" (bandlimited noise)
// for more character ; but we can also simply stick with white noise
sig += rand() * 0.3 * Math.exp(-20*t);
// distortion
// I like to add some distortion to the snare drum, to make the different elements interact.
// This has the effect of enriching the body spectrum, and modulating the noise a bit,
// but it can also kill the click if overused.
let sig2 = 0.5 * sig; // larger number = more distortion
sig2 = clamp(sig2, -1, 1);
sig *= 1 - sig2*sig2;
// envelope
// Use a fake compression effect: in modern music drum sounds are often compressed,
// here we achieve this simply by adding an envelope which turns down the middle part of the sound
// while letting the click and final resonance through.
// Counter-intuitively, although it turns *down* the sound, it makes the drum sound *more* present and energic.
let env = smoothstep(0.01, 0.0, t) /* let some attack through */ + smoothstep(0.0, 0.2, t); /*and some body at the end */
env = lerp(env, 1.0, 0.4); // larger mix value = less compression
sig *= env;
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' });