I was experimenting with synthesised drum sounds, snare in particular. Still some way to go.
Log in to post a comment.
// Play around with the sliders to create different types of snare sounds // Enjoy! const sin = Math.sin; const TAU = 2*Math.PI; ditty.bpm = 120; input.note = 38.0; // min=1, max=100, step=0.5 input.add = 1.6; // min=0, max=10, step=0.1 input.spd = 8.4; // min=1, max=20, step=0.1 input.mul = 3.0; // min=0, max=100, step=0.50 input.iom = 2.5; // min=0, max=100, step=0.50 input.limit = 100; // min=1, max=400, step=1 input.mix = 0.5; // min=0, max=1, step=0.05 const SnareTest = synth.def(class { // use sustain: 0 constructor(opt) { this.t = 0; this.noise_decay = 8; // higher values will make the noise-part decay faster // how to mix partials this.fm_gain = input.mix; this.noise_gain = 1 - this.fm_gain; } add_fm(carrier) { // modulator frequency const fm = carrier * input.mul; let mod = sin(TAU*this.t*fm); return sin(TAU*this.t*carrier + input.iom*mod); } add_noise() { return 1 - 2*Math.random(); } clamp(x) { return (x <= -1) ? -1 : (x >= 1) ? 1 : x; } process(note, env, tick, opt) { this.t += ditty.dt; const freq = midi_to_hz(note); // frequency to start from const f2 = freq*input.add; // scale time, lower values in the 2nd arg decrease drum pitch const t = lerp(0, 4, this.t); // add decreasing offset to the fm carrier const offset = t * input.spd * f2; // limit how much offset it applied, lower values make it less "drummy" const f = (offset < input.limit) ? (freq + f2) - offset : 0; // add body let x = this.add_fm(f) * this.fm_gain * Math.exp(-1, t); // add noise //x += this.add_noise() * lerp(this.noise_gain, 0, this.noise_decay * this.t); x += this.add_noise() * this.noise_gain * Math.exp(-1.8, t); let i = x * env.value; debug.probe("Waveform", i, 1, 1 ); return i; } }); loop( () => { // attack and release in seconds, duration in ticks SnareTest.play(input.note, { attack: 0, release: 0.3, duration: 0.2, curve: -7, //mul: 51.5, iom: 48.0 }); sleep(1); // sleep in ticks }, { name: 'Snare' });