Integrate with the new impulse generation functionality

This commit is contained in:
Vasilii Milovidov 2023-10-05 03:49:50 +04:00
parent 13cb32903a
commit d6c8838fe2
4 changed files with 86 additions and 84 deletions

View file

@ -655,6 +655,15 @@ const generic_params = [
* .vib("<.5 1 2 4 8 16>:12") * .vib("<.5 1 2 4 8 16>:12")
*/ */
[['vib', 'vibmod'], 'vibrato', 'v'], [['vib', 'vibmod'], 'vibrato', 'v'],
/**
* Adds pink noise to the mix
*
* @name noise
* @param {number | Pattern} wet wet amount
* @example
* sound("<white pink brown>/2")
*/
['noise'],
/** /**
* Sets the vibrato depth in semitones. Only has an effect if `vibrato` | `vib` | `v` is is also set * 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']], [['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). * Reverb lowpass starting frequency (in hertz).
* When this property is changed, the reverb will be recaculated, so only change this sparsely..
* *
* @name revlp * @name roomlp
* @param {number} level between 0 and 20000hz * @synonyms rlp
* @param {number} frequency between 0 and 20000hz
* @example * @example
* s("bd sd").room(0.5).revlp(10000) * s("bd sd").room(0.5).rlp(10000)
* @example * @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). * Reverb lowpass frequency at -60dB (in hertz).
* When this property is changed, the reverb will be recaculated, so only change this sparsely..
* *
* @name revdim * @name roomdim
* @param {number} level between 0 and 20000hz * @synonyms rdim
* @param {number} frequency between 0 and 20000hz
* @example * @example
* s("bd sd").room(0.5).revlp(10000).revdim(8000) * s("bd sd").room(0.5).rlp(10000).rdim(8000)
* @example * @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). * 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 * @param {number} seconds for the reverb to fade
* @example * @example
* s("bd sd").room(0.5).revlp(10000).fade(0.5) * s("bd sd").room(0.5).rlp(10000).rfade(0.5)
* @example * @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. * Sets the sample to use as an impulse response for the reverb. * * @name iresponse
* * @param {string | Pattern} sample to use as an impulse response
* @name iresponse
* @param {string | Pattern} sample sample to pick as an impulse response
* @synonyms ir * @synonyms ir
* @example * @example
* s("bd sd").room(.8).ir("<shaker_large:0 shaker_large:2>") * s("bd sd").room(.8).ir("<shaker_large:0 shaker_large:2>")
@ -1028,23 +1031,25 @@ const generic_params = [
[['ir', 'i'], 'iresponse'], [['ir', 'i'], 'iresponse'],
/** /**
* Sets the room size of the reverb, see {@link room}. * 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 * @name roomsize
* @param {number | Pattern} size between 0 and 10 * @param {number | Pattern} size between 0 and 10
* @synonyms size, sz * @synonyms rsize, sz, size
* @example * @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 : // TODO: find out why :
// s("bd sd").room(.8).roomsize("<0 .2 .4 .6 .8 [1,0]>").osc() // 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? // .. does not work. Is it because room is only one effect?
['size', 'sz', 'roomsize'], ['roomsize', 'size', 'sz', 'rsize'],
// ['sagogo'], // ['sagogo'],
// ['sclap'], // ['sclap'],
// ['sclaves'], // ['sclaves'],
// ['scrash'], // ['scrash'],
/** /**
* Wave shaping distortion. CAUTION: it might get loud * Wave shaping distortion. CAUTION: it might get loud
* *
@ -1210,7 +1215,7 @@ const generic_params = [
['pitchJump'], ['pitchJump'],
['pitchJumpTime'], ['pitchJumpTime'],
['lfo', 'repeatTime'], ['lfo', 'repeatTime'],
['noise'], ['znoise'], // noise on the frequency or as bubo calls it "frequency fog" :)
['zmod'], ['zmod'],
['zcrush'], // like crush but scaled differently ['zcrush'], // like crush but scaled differently
['zdelay'], ['zdelay'],

View file

@ -17,47 +17,43 @@ if (typeof AudioContext !== 'undefined') {
return newBuffer; 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(); const convolver = this.createConvolver();
convolver.generate = (d, fade, lp, dim, buf) => {
convolver.setDuration = (d, fade, revlp, revdim, imp) => { if (buf) {
if (imp) { convolver.buffer = this.adjustLength(d, buf);
convolver.buffer = this.adjustLength(d, imp);
return convolver; return convolver;
} else { } else {
this.generateReverb( this.generateReverb(
{ {
audioContext, audioContext: this,
sampleRate: 44100, sampleRate: 44100,
numChannels: 2, numChannels: 2,
decayTime: d, decayTime: d,
fadeInTime: fade, fadeInTime: fade,
lpFreqStart: revlp, lpFreqStart: lp,
lpFreqEnd: revdim, lpFreqEnd: dim,
}, },
(buffer) => { (buffer) => {
convolver.buffer = buffer; convolver.buffer = buffer;
}, },
); );
convolver.duration = duration; convolver.duration = d;
convolver.fade = fade; convolver.fade = fade;
convolver.revlp = revlp; convolver.lp = lp;
convolver.revdim = revdim; convolver.dim = dim;
return convolver; return convolver;
} }
}; };
convolver.setIR = (d, fade, revlp, revdim, imp) => { convolver.setIR = (d, fade, lp, dim, buf) => {
if (imp) { if (buf) {
convolver.buffer = this.adjustLength(d, imp); convolver.buffer = this.adjustLength(d, buf);
} else { } else {
convolver.setDuration(d, fade, revlp, revdim, imp); convolver.generate(d, fade, lp, dim, buf);
} }
return convolver; return convolver;
}; };
convolver.setDuration(duration, fade, revlp, revdim, imp); convolver.generate(duration, fade, lp, dim, ir);
return convolver; return convolver;
}; };
} }
// TODO: make the reverb more exciting
// check out https://blog.gskinner.com/archives/2019/02/reverb-web-audio-api.html

View file

@ -114,32 +114,29 @@ function getDelay(orbit, delaytime, delayfeedback, t) {
let reverbs = {}; let reverbs = {};
function getReverb(orbit, duration = 2, fade, revlp, revdim, imp) { function getReverb(orbit, duration = 2, fade, lp, dim, ir) {
if (!reverbs[orbit]) { if (!reverbs[orbit]) {
const ac = getAudioContext(); 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()); reverb.connect(getDestination());
reverbs[orbit] = reverb; reverbs[orbit] = reverb;
} }
const reverbOrbit = reverbs[orbit];
if ( if (
reverbs[orbit].duration !== duration || reverbs[orbit].duration !== duration ||
reverbs[orbit].fade !== fade || reverbs[orbit].fade !== fade ||
reverbs[orbit].revlp !== revlp || reverbs[orbit].ir !== lp ||
reverbs[orbit].revdim !== revdim reverbs[orbit].dim !== dim ||
reverbs[orbit].ir !== ir
) { ) {
reverbs[orbit].setDuration(duration, fade, revlp, revdim); reverbs[orbit].generate(duration, fade, lp, dim, ir);
reverbs[orbit].duration = duration;
reverbs[orbit].fade = fade;
reverbs[orbit].revlp = revlp;
reverbs[orbit].revdim = revdim;
} }
if (reverbs[orbit].ir !== imp) {
reverbs[orbit] = reverbs[orbit].setIR(duration, fade, revlp, revdim, imp); if (reverbs[orbit].ir !== ir) {
reverbs[orbit].ir = imp; reverbs[orbit] = reverbs[orbit].setIR(duration, fade, lp, dim, ir);
reverbs[orbit].ir = ir;
} }
return reverbs[orbit]; return reverbs[orbit];
} }
@ -238,10 +235,10 @@ export const superdough = async (value, deadline, hapDuration) => {
delaytime = 0.25, delaytime = 0.25,
orbit = 1, orbit = 1,
room, room,
fade = 0.1, roomfade = 0.1,
revlp = 15000, roomlp = 15000,
revdim = 1000, roomdim = 1000,
size = 2, roomsize = 2,
ir, ir,
i = 0, i = 0,
velocity = 1, velocity = 1,
@ -393,8 +390,8 @@ export const superdough = async (value, deadline, hapDuration) => {
buffer = await loadBuffer(url, ac, ir, 0); buffer = await loadBuffer(url, ac, ir, 0);
} }
let reverbSend; let reverbSend;
if (room > 0 && size > 0) { if (room > 0 && roomsize > 0) {
const reverbNode = getReverb(orbit, size, fade, revlp, revdim, buffer); const reverbNode = getReverb(orbit, roomsize, roomfade, roomlp, roomdim, buffer);
reverbSend = effectSend(post, reverbNode, room); reverbSend = effectSend(post, reverbNode, room);
} }

View file

@ -183,39 +183,43 @@ global effects use the same chain for all events of the same orbit:
<JsDoc client:idle name="orbit" h={0} /> <JsDoc client:idle name="orbit" h={0} />
## delay ## Delay
### delay
<JsDoc client:idle name="delay" h={0} /> <JsDoc client:idle name="delay" h={0} />
## delaytime ### delaytime
<JsDoc client:idle name="delaytime" h={0} /> <JsDoc client:idle name="delaytime" h={0} />
## delayfeedback ### delayfeedback
<JsDoc client:idle name="delayfeedback" h={0} /> <JsDoc client:idle name="delayfeedback" h={0} />
## room ## Reverb
### room
<JsDoc client:idle name="room" h={0} /> <JsDoc client:idle name="room" h={0} />
## roomsize ### roomsize
<JsDoc client:idle name="roomsize" h={0} /> <JsDoc client:idle name="roomsize" h={0} />
## fade ### roomfade
<JsDoc client:idle name="fade" h={0} /> <JsDoc client:idle name="roomfade" h={0} />
## revlp ### roomlp
<JsDoc client:idle name="revlp" h={0} /> <JsDoc client:idle name="roomlp" h={0} />
## revdim ### roomdim
<JsDoc client:idle name="revdim" h={0} /> <JsDoc client:idle name="roomdim" h={0} />
## iresponse ### iresponse
<JsDoc client:idle name="iresponse" h={0} /> <JsDoc client:idle name="iresponse" h={0} />