From d6c8838fe26db2bf3b5db75c59145952e544f1ad Mon Sep 17 00:00:00 2001 From: Vasilii Milovidov Date: Thu, 5 Oct 2023 03:49:50 +0400 Subject: [PATCH] Integrate with the new impulse generation functionality --- packages/core/controls.mjs | 71 +++++++++++++++-------------- packages/superdough/reverb.mjs | 34 ++++++-------- packages/superdough/superdough.mjs | 37 +++++++-------- website/src/pages/learn/effects.mdx | 28 +++++++----- 4 files changed, 86 insertions(+), 84 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index d909423f..e23114ca 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -655,6 +655,15 @@ const generic_params = [ * .vib("<.5 1 2 4 8 16>:12") */ [['vib', 'vibmod'], 'vibrato', 'v'], + /** + * Adds pink noise to the mix + * + * @name noise + * @param {number | Pattern} wet wet amount + * @example + * sound("/2") + */ + ['noise'], /** * Sets the vibrato depth in semitones. Only has an effect if `vibrato` | `vib` | `v` is is also set * @@ -970,56 +979,50 @@ const generic_params = [ * */ [['room', 'size']], - /** - * Sets the room size of the reverb, see {@link room}. - * - * @name roomsize - * @param {number | Pattern} size between 0 and 10 - * @synonyms size, sz - * @example - * s("bd sd").room(.8).roomsize("<0 1 2 4 8>") - * - */ /** * Reverb lowpass starting frequency (in hertz). + * When this property is changed, the reverb will be recaculated, so only change this sparsely.. * - * @name revlp - * @param {number} level between 0 and 20000hz + * @name roomlp + * @synonyms rlp + * @param {number} frequency between 0 and 20000hz * @example - * s("bd sd").room(0.5).revlp(10000) + * s("bd sd").room(0.5).rlp(10000) * @example - * s("bd sd").room(0.5).revlp(5000) + * s("bd sd").room(0.5).rlp(5000) */ - ['revlp'], + ['roomlp', 'rlp'], /** * Reverb lowpass frequency at -60dB (in hertz). + * When this property is changed, the reverb will be recaculated, so only change this sparsely.. * - * @name revdim - * @param {number} level between 0 and 20000hz + * @name roomdim + * @synonyms rdim + * @param {number} frequency between 0 and 20000hz * @example - * s("bd sd").room(0.5).revlp(10000).revdim(8000) + * s("bd sd").room(0.5).rlp(10000).rdim(8000) * @example - * s("bd sd").room(0.5).revlp(5000).revdim(400) + * s("bd sd").room(0.5).rlp(5000).rdim(400) * */ - ['revdim'], + ['roomdim', 'rdim'], /** * Reverb fade time (in seconds). + * When this property is changed, the reverb will be recaculated, so only change this sparsely.. * - * @name fade + * @name roomfade + * @synonyms rfade * @param {number} seconds for the reverb to fade * @example - * s("bd sd").room(0.5).revlp(10000).fade(0.5) + * s("bd sd").room(0.5).rlp(10000).rfade(0.5) * @example - * s("bd sd").room(0.5).revlp(5000).fade(4) + * s("bd sd").room(0.5).rlp(5000).rfade(4) * */ - ['fade'], + ['roomfade', 'rfade'], /** - * Sets the sample to use as an impulse response for the reverb. - * - * @name iresponse - * @param {string | Pattern} sample sample to pick as an impulse response + * Sets the sample to use as an impulse response for the reverb. * * @name iresponse + * @param {string | Pattern} sample to use as an impulse response * @synonyms ir * @example * s("bd sd").room(.8).ir("") @@ -1028,23 +1031,25 @@ const generic_params = [ [['ir', 'i'], 'iresponse'], /** * Sets the room size of the reverb, see {@link room}. + * When this property is changed, the reverb will be recaculated, so only change this sparsely.. * * @name roomsize * @param {number | Pattern} size between 0 and 10 - * @synonyms size, sz + * @synonyms rsize, sz, size * @example - * s("bd sd").room(.8).roomsize("<0 1 2 4 8>") + * s("bd sd").room(.8).rsize(1) + * @example + * s("bd sd").room(.8).rsize(4) * */ // TODO: find out why : // s("bd sd").room(.8).roomsize("<0 .2 .4 .6 .8 [1,0]>").osc() // .. does not work. Is it because room is only one effect? - ['size', 'sz', 'roomsize'], + ['roomsize', 'size', 'sz', 'rsize'], // ['sagogo'], // ['sclap'], // ['sclaves'], // ['scrash'], - /** * Wave shaping distortion. CAUTION: it might get loud * @@ -1210,7 +1215,7 @@ const generic_params = [ ['pitchJump'], ['pitchJumpTime'], ['lfo', 'repeatTime'], - ['noise'], + ['znoise'], // noise on the frequency or as bubo calls it "frequency fog" :) ['zmod'], ['zcrush'], // like crush but scaled differently ['zdelay'], diff --git a/packages/superdough/reverb.mjs b/packages/superdough/reverb.mjs index 5e4ce8f1..85be19ae 100644 --- a/packages/superdough/reverb.mjs +++ b/packages/superdough/reverb.mjs @@ -17,47 +17,43 @@ if (typeof AudioContext !== 'undefined') { return newBuffer; }; - AudioContext.prototype.createReverb = function (audioContext, duration, fade, revlp, revdim, imp) { + AudioContext.prototype.createReverb = function (duration, fade, lp, dim, ir) { const convolver = this.createConvolver(); - - convolver.setDuration = (d, fade, revlp, revdim, imp) => { - if (imp) { - convolver.buffer = this.adjustLength(d, imp); + convolver.generate = (d, fade, lp, dim, buf) => { + if (buf) { + convolver.buffer = this.adjustLength(d, buf); return convolver; } else { this.generateReverb( { - audioContext, + audioContext: this, sampleRate: 44100, numChannels: 2, decayTime: d, fadeInTime: fade, - lpFreqStart: revlp, - lpFreqEnd: revdim, + lpFreqStart: lp, + lpFreqEnd: dim, }, (buffer) => { convolver.buffer = buffer; }, ); - convolver.duration = duration; + convolver.duration = d; convolver.fade = fade; - convolver.revlp = revlp; - convolver.revdim = revdim; + convolver.lp = lp; + convolver.dim = dim; return convolver; } }; - convolver.setIR = (d, fade, revlp, revdim, imp) => { - if (imp) { - convolver.buffer = this.adjustLength(d, imp); + convolver.setIR = (d, fade, lp, dim, buf) => { + if (buf) { + convolver.buffer = this.adjustLength(d, buf); } else { - convolver.setDuration(d, fade, revlp, revdim, imp); + convolver.generate(d, fade, lp, dim, buf); } return convolver; }; - convolver.setDuration(duration, fade, revlp, revdim, imp); + convolver.generate(duration, fade, lp, dim, ir); return convolver; }; } - -// TODO: make the reverb more exciting -// check out https://blog.gskinner.com/archives/2019/02/reverb-web-audio-api.html diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index ec3b981e..d7f0b14b 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -114,32 +114,29 @@ function getDelay(orbit, delaytime, delayfeedback, t) { let reverbs = {}; -function getReverb(orbit, duration = 2, fade, revlp, revdim, imp) { +function getReverb(orbit, duration = 2, fade, lp, dim, ir) { if (!reverbs[orbit]) { const ac = getAudioContext(); - const reverb = ac.createReverb(getAudioContext(), duration, fade, revlp, revdim, imp); + const reverb = ac.createReverb(duration, fade, lp, dim, ir); reverb.connect(getDestination()); reverbs[orbit] = reverb; } - const reverbOrbit = reverbs[orbit]; - if ( reverbs[orbit].duration !== duration || reverbs[orbit].fade !== fade || - reverbs[orbit].revlp !== revlp || - reverbs[orbit].revdim !== revdim + reverbs[orbit].ir !== lp || + reverbs[orbit].dim !== dim || + reverbs[orbit].ir !== ir ) { - reverbs[orbit].setDuration(duration, fade, revlp, revdim); - reverbs[orbit].duration = duration; - reverbs[orbit].fade = fade; - reverbs[orbit].revlp = revlp; - reverbs[orbit].revdim = revdim; + reverbs[orbit].generate(duration, fade, lp, dim, ir); } - if (reverbs[orbit].ir !== imp) { - reverbs[orbit] = reverbs[orbit].setIR(duration, fade, revlp, revdim, imp); - reverbs[orbit].ir = imp; + + if (reverbs[orbit].ir !== ir) { + reverbs[orbit] = reverbs[orbit].setIR(duration, fade, lp, dim, ir); + reverbs[orbit].ir = ir; } + return reverbs[orbit]; } @@ -238,10 +235,10 @@ export const superdough = async (value, deadline, hapDuration) => { delaytime = 0.25, orbit = 1, room, - fade = 0.1, - revlp = 15000, - revdim = 1000, - size = 2, + roomfade = 0.1, + roomlp = 15000, + roomdim = 1000, + roomsize = 2, ir, i = 0, velocity = 1, @@ -393,8 +390,8 @@ export const superdough = async (value, deadline, hapDuration) => { buffer = await loadBuffer(url, ac, ir, 0); } let reverbSend; - if (room > 0 && size > 0) { - const reverbNode = getReverb(orbit, size, fade, revlp, revdim, buffer); + if (room > 0 && roomsize > 0) { + const reverbNode = getReverb(orbit, roomsize, roomfade, roomlp, roomdim, buffer); reverbSend = effectSend(post, reverbNode, room); } diff --git a/website/src/pages/learn/effects.mdx b/website/src/pages/learn/effects.mdx index 3ca43f69..35052788 100644 --- a/website/src/pages/learn/effects.mdx +++ b/website/src/pages/learn/effects.mdx @@ -183,39 +183,43 @@ global effects use the same chain for all events of the same orbit: -## delay +## Delay + +### delay -## delaytime +### delaytime -## delayfeedback +### delayfeedback -## room +## Reverb + +### room -## roomsize +### roomsize -## fade +### roomfade - + -## revlp +### roomlp - + -## revdim +### roomdim - + -## iresponse +### iresponse