mirror of
https://github.com/eliasstepanik/strudel.git
synced 2026-01-11 13:48:40 +00:00
Merge branch 'main' into reverb
This commit is contained in:
commit
e59f06ff92
@ -86,6 +86,16 @@ const generic_params = [
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
['gain'],
|
['gain'],
|
||||||
|
/**
|
||||||
|
* Gain applied after all effects have been processed.
|
||||||
|
*
|
||||||
|
* @name postgain
|
||||||
|
* @example
|
||||||
|
* s("bd sd,hh*4")
|
||||||
|
* .compressor("-20:20:10:.002:.02").postgain(1.5)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
['postgain'],
|
||||||
/**
|
/**
|
||||||
* Like {@link gain}, but linear.
|
* Like {@link gain}, but linear.
|
||||||
*
|
*
|
||||||
@ -1060,6 +1070,21 @@ const generic_params = [
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
['shape'],
|
['shape'],
|
||||||
|
/**
|
||||||
|
* Dynamics Compressor. The params are `compressor("threshold:ratio:knee:attack:release")`
|
||||||
|
* More info [here](https://developer.mozilla.org/en-US/docs/Web/API/DynamicsCompressorNode?retiredLocale=de#instance_properties)
|
||||||
|
*
|
||||||
|
* @name compressor
|
||||||
|
* @example
|
||||||
|
* s("bd sd,hh*4")
|
||||||
|
* .compressor("-20:20:10:.002:.02")
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
[['compressor', 'compressorRatio', 'compressorKnee', 'compressorAttack', 'compressorRelease']],
|
||||||
|
['compressorKnee'],
|
||||||
|
['compressorRatio'],
|
||||||
|
['compressorAttack'],
|
||||||
|
['compressorRelease'],
|
||||||
/**
|
/**
|
||||||
* Changes the speed of sample playback, i.e. a cheap way of changing pitch.
|
* Changes the speed of sample playback, i.e. a cheap way of changing pitch.
|
||||||
*
|
*
|
||||||
|
|||||||
@ -78,6 +78,17 @@ export const getParamADSR = (param, attack, decay, sustain, release, min, max, b
|
|||||||
param.linearRampToValueAtTime(min, end + Math.max(release, 0.1));
|
param.linearRampToValueAtTime(min, end + Math.max(release, 0.1));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export function getCompressor(ac, threshold, ratio, knee, attack, release) {
|
||||||
|
const options = {
|
||||||
|
threshold: threshold ?? -3,
|
||||||
|
ratio: ratio ?? 10,
|
||||||
|
knee: knee ?? 10,
|
||||||
|
attack: attack ?? 0.005,
|
||||||
|
release: release ?? 0.05,
|
||||||
|
};
|
||||||
|
return new DynamicsCompressorNode(ac, options);
|
||||||
|
}
|
||||||
|
|
||||||
export function createFilter(
|
export function createFilter(
|
||||||
context,
|
context,
|
||||||
type,
|
type,
|
||||||
|
|||||||
@ -1,8 +1,6 @@
|
|||||||
import reverbGen from './reverbGen.mjs';
|
import reverbGen from './reverbGen.mjs';
|
||||||
|
|
||||||
if (typeof AudioContext !== 'undefined') {
|
if (typeof AudioContext !== 'undefined') {
|
||||||
AudioContext.prototype.generateReverb = reverbGen.generateReverb;
|
|
||||||
|
|
||||||
AudioContext.prototype.adjustLength = function (duration, buffer) {
|
AudioContext.prototype.adjustLength = function (duration, buffer) {
|
||||||
const newLength = buffer.sampleRate * duration;
|
const newLength = buffer.sampleRate * duration;
|
||||||
const newBuffer = this.createBuffer(buffer.numberOfChannels, buffer.length, buffer.sampleRate);
|
const newBuffer = this.createBuffer(buffer.numberOfChannels, buffer.length, buffer.sampleRate);
|
||||||
@ -19,14 +17,18 @@ if (typeof AudioContext !== 'undefined') {
|
|||||||
|
|
||||||
AudioContext.prototype.createReverb = function (duration, fade, lp, dim, ir) {
|
AudioContext.prototype.createReverb = function (duration, fade, lp, dim, ir) {
|
||||||
const convolver = this.createConvolver();
|
const convolver = this.createConvolver();
|
||||||
convolver.generate = (d = 2, fade = 0.1, lp = 15000, dim = 1000, buf) => {
|
convolver.generate = (d = 2, fade = 0.1, lp = 15000, dim = 1000, ir) => {
|
||||||
if (buf) {
|
convolver.duration = d;
|
||||||
convolver.buffer = this.adjustLength(d, buf);
|
convolver.fade = fade;
|
||||||
|
convolver.lp = lp;
|
||||||
|
convolver.dim = dim;
|
||||||
|
convolver.ir = ir;
|
||||||
|
if (ir) {
|
||||||
|
convolver.buffer = this.adjustLength(d, ir);
|
||||||
} else {
|
} else {
|
||||||
this.generateReverb(
|
reverbGen.generateReverb(
|
||||||
{
|
{
|
||||||
audioContext: this,
|
audioContext: this,
|
||||||
sampleRate: 44100,
|
|
||||||
numChannels: 2,
|
numChannels: 2,
|
||||||
decayTime: d,
|
decayTime: d,
|
||||||
fadeInTime: fade,
|
fadeInTime: fade,
|
||||||
@ -37,20 +39,8 @@ if (typeof AudioContext !== 'undefined') {
|
|||||||
convolver.buffer = buffer;
|
convolver.buffer = buffer;
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
convolver.duration = d;
|
|
||||||
convolver.fade = fade;
|
|
||||||
convolver.lp = lp;
|
|
||||||
convolver.dim = dim;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
convolver.setIR = (d, fade, lp, dim, buf) => {
|
|
||||||
if (buf) {
|
|
||||||
convolver.buffer = this.adjustLength(d, buf);
|
|
||||||
} else {
|
|
||||||
convolver.generate(d, fade, lp, dim, buf);
|
|
||||||
}
|
|
||||||
return convolver;
|
|
||||||
};
|
|
||||||
convolver.generate(duration, fade, lp, dim, ir);
|
convolver.generate(duration, fade, lp, dim, ir);
|
||||||
return convolver;
|
return convolver;
|
||||||
};
|
};
|
||||||
|
|||||||
@ -23,7 +23,7 @@ var reverbGen = {};
|
|||||||
immediately within the current execution context, or later. */
|
immediately within the current execution context, or later. */
|
||||||
reverbGen.generateReverb = function (params, callback) {
|
reverbGen.generateReverb = function (params, callback) {
|
||||||
var audioContext = params.audioContext || new AudioContext();
|
var audioContext = params.audioContext || new AudioContext();
|
||||||
var sampleRate = params.sampleRate || 44100;
|
var sampleRate = audioContext.sampleRate;
|
||||||
var numChannels = params.numChannels || 2;
|
var numChannels = params.numChannels || 2;
|
||||||
// params.decayTime is the -60dB fade time. We let it go 50% longer to get to -90dB.
|
// params.decayTime is the -60dB fade time. We let it go 50% longer to get to -90dB.
|
||||||
var totalTime = params.decayTime * 1.5;
|
var totalTime = params.decayTime * 1.5;
|
||||||
|
|||||||
@ -64,6 +64,7 @@ export const getSampleBufferSource = async (s, n, note, speed, freq, bank, resol
|
|||||||
|
|
||||||
export const loadBuffer = (url, ac, s, n = 0) => {
|
export const loadBuffer = (url, ac, s, n = 0) => {
|
||||||
const label = s ? `sound "${s}:${n}"` : 'sample';
|
const label = s ? `sound "${s}:${n}"` : 'sample';
|
||||||
|
url = url.replace('#', '%23');
|
||||||
if (!loadCache[url]) {
|
if (!loadCache[url]) {
|
||||||
logger(`[sampler] load ${label}..`, 'load-sample', { url });
|
logger(`[sampler] load ${label}..`, 'load-sample', { url });
|
||||||
const timestamp = Date.now();
|
const timestamp = Date.now();
|
||||||
|
|||||||
@ -9,7 +9,7 @@ import './reverb.mjs';
|
|||||||
import './vowel.mjs';
|
import './vowel.mjs';
|
||||||
import { clamp } from './util.mjs';
|
import { clamp } from './util.mjs';
|
||||||
import workletsUrl from './worklets.mjs?url';
|
import workletsUrl from './worklets.mjs?url';
|
||||||
import { createFilter, gainNode } from './helpers.mjs';
|
import { createFilter, gainNode, getCompressor } from './helpers.mjs';
|
||||||
import { map } from 'nanostores';
|
import { map } from 'nanostores';
|
||||||
import { logger } from './logger.mjs';
|
import { logger } from './logger.mjs';
|
||||||
import { loadBuffer } from './sampler.mjs';
|
import { loadBuffer } from './sampler.mjs';
|
||||||
@ -124,26 +124,20 @@ function getReverb(orbit, duration, fade, lp, dim, ir) {
|
|||||||
reverb.connect(getDestination());
|
reverb.connect(getDestination());
|
||||||
reverbs[orbit] = reverb;
|
reverbs[orbit] = reverb;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
hasChanged(duration, reverbs[orbit].duration) ||
|
hasChanged(duration, reverbs[orbit].duration) ||
|
||||||
hasChanged(fade, reverbs[orbit].fade) ||
|
hasChanged(fade, reverbs[orbit].fade) ||
|
||||||
hasChanged(lp, reverbs[orbit].lp) ||
|
hasChanged(lp, reverbs[orbit].lp) ||
|
||||||
hasChanged(dim, reverbs[orbit].dim)
|
hasChanged(dim, reverbs[orbit].dim) ||
|
||||||
|
reverbs[orbit].ir !== ir
|
||||||
) {
|
) {
|
||||||
// only regenerate when something has changed
|
// only regenerate when something has changed
|
||||||
// avoids endless regeneration on things like
|
// avoids endless regeneration on things like
|
||||||
// stack(s("a"), s("b").rsize(8)).room(.5)
|
// stack(s("a"), s("b").rsize(8)).room(.5)
|
||||||
// this only works when args may stay undefined until here
|
// this only works when args may stay undefined until here
|
||||||
// setting default values breaks this
|
// setting default values breaks this
|
||||||
reverbs[orbit].generate(duration, fade, lp, dim);
|
reverbs[orbit].generate(duration, fade, lp, dim, ir);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (reverbs[orbit].ir !== ir) {
|
|
||||||
reverbs[orbit] = reverbs[orbit].setIR(duration, fade, lp, dim, ir);
|
|
||||||
reverbs[orbit].ir = ir;
|
|
||||||
}
|
|
||||||
|
|
||||||
return reverbs[orbit];
|
return reverbs[orbit];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -204,6 +198,7 @@ export const superdough = async (value, deadline, hapDuration) => {
|
|||||||
bank,
|
bank,
|
||||||
source,
|
source,
|
||||||
gain = 0.8,
|
gain = 0.8,
|
||||||
|
postgain = 1,
|
||||||
// filters
|
// filters
|
||||||
ftype = '12db',
|
ftype = '12db',
|
||||||
fanchor = 0.5,
|
fanchor = 0.5,
|
||||||
@ -251,6 +246,11 @@ export const superdough = async (value, deadline, hapDuration) => {
|
|||||||
velocity = 1,
|
velocity = 1,
|
||||||
analyze, // analyser wet
|
analyze, // analyser wet
|
||||||
fft = 8, // fftSize 0 - 10
|
fft = 8, // fftSize 0 - 10
|
||||||
|
compressor: compressorThreshold,
|
||||||
|
compressorRatio,
|
||||||
|
compressorKnee,
|
||||||
|
compressorAttack,
|
||||||
|
compressorRelease,
|
||||||
} = value;
|
} = value;
|
||||||
gain *= velocity; // legacy fix for velocity
|
gain *= velocity; // legacy fix for velocity
|
||||||
let toDisconnect = []; // audio nodes that will be disconnected when the source has ended
|
let toDisconnect = []; // audio nodes that will be disconnected when the source has ended
|
||||||
@ -366,6 +366,11 @@ export const superdough = async (value, deadline, hapDuration) => {
|
|||||||
crush !== undefined && chain.push(getWorklet(ac, 'crush-processor', { crush }));
|
crush !== undefined && chain.push(getWorklet(ac, 'crush-processor', { crush }));
|
||||||
shape !== undefined && chain.push(getWorklet(ac, 'shape-processor', { shape }));
|
shape !== undefined && chain.push(getWorklet(ac, 'shape-processor', { shape }));
|
||||||
|
|
||||||
|
compressorThreshold !== undefined &&
|
||||||
|
chain.push(
|
||||||
|
getCompressor(ac, compressorThreshold, compressorRatio, compressorKnee, compressorAttack, compressorRelease),
|
||||||
|
);
|
||||||
|
|
||||||
// panning
|
// panning
|
||||||
if (pan !== undefined) {
|
if (pan !== undefined) {
|
||||||
const panner = ac.createStereoPanner();
|
const panner = ac.createStereoPanner();
|
||||||
@ -374,7 +379,7 @@ export const superdough = async (value, deadline, hapDuration) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// last gain
|
// last gain
|
||||||
const post = gainNode(1);
|
const post = gainNode(postgain);
|
||||||
chain.push(post);
|
chain.push(post);
|
||||||
post.connect(getDestination());
|
post.connect(getDestination());
|
||||||
|
|
||||||
@ -385,20 +390,20 @@ export const superdough = async (value, deadline, hapDuration) => {
|
|||||||
delaySend = effectSend(post, delyNode, delay);
|
delaySend = effectSend(post, delyNode, delay);
|
||||||
}
|
}
|
||||||
// reverb
|
// reverb
|
||||||
let buffer;
|
|
||||||
let url;
|
|
||||||
if (ir !== undefined) {
|
|
||||||
let sample = getSound(ir);
|
|
||||||
if (Array.isArray(sample)) {
|
|
||||||
url = sample.data.samples[i % sample.data.samples.length];
|
|
||||||
} else if (typeof sample === 'object') {
|
|
||||||
url = Object.values(sample.data.samples)[i & Object.values(sample.data.samples).length];
|
|
||||||
}
|
|
||||||
buffer = await loadBuffer(url, ac, ir, 0);
|
|
||||||
}
|
|
||||||
let reverbSend;
|
let reverbSend;
|
||||||
if (room > 0 && roomsize > 0) {
|
if (room > 0) {
|
||||||
const reverbNode = getReverb(orbit, roomsize, roomfade, roomlp, roomdim, buffer);
|
let roomIR;
|
||||||
|
if (ir !== undefined) {
|
||||||
|
let url;
|
||||||
|
let sample = getSound(ir);
|
||||||
|
if (Array.isArray(sample)) {
|
||||||
|
url = sample.data.samples[i % sample.data.samples.length];
|
||||||
|
} else if (typeof sample === 'object') {
|
||||||
|
url = Object.values(sample.data.samples)[i & Object.values(sample.data.samples).length];
|
||||||
|
}
|
||||||
|
roomIR = await loadBuffer(url, ac, ir, 0);
|
||||||
|
}
|
||||||
|
const reverbNode = getReverb(orbit, roomsize, roomfade, roomlp, roomdim, roomIR);
|
||||||
reverbSend = effectSend(post, reverbNode, room);
|
reverbSend = effectSend(post, reverbNode, room);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1185,6 +1185,35 @@ exports[`runs examples > example "compress" example index 0 1`] = `
|
|||||||
]
|
]
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
exports[`runs examples > example "compressor" example index 0 1`] = `
|
||||||
|
[
|
||||||
|
"[ 0/1 → 1/4 | s:hh compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 ]",
|
||||||
|
"[ 0/1 → 1/2 | s:bd compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 ]",
|
||||||
|
"[ 1/4 → 1/2 | s:hh compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 ]",
|
||||||
|
"[ 1/2 → 3/4 | s:hh compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 ]",
|
||||||
|
"[ 1/2 → 1/1 | s:sd compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 ]",
|
||||||
|
"[ 3/4 → 1/1 | s:hh compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 ]",
|
||||||
|
"[ 1/1 → 5/4 | s:hh compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 ]",
|
||||||
|
"[ 1/1 → 3/2 | s:bd compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 ]",
|
||||||
|
"[ 5/4 → 3/2 | s:hh compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 ]",
|
||||||
|
"[ 3/2 → 7/4 | s:hh compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 ]",
|
||||||
|
"[ 3/2 → 2/1 | s:sd compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 ]",
|
||||||
|
"[ 7/4 → 2/1 | s:hh compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 ]",
|
||||||
|
"[ 2/1 → 9/4 | s:hh compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 ]",
|
||||||
|
"[ 2/1 → 5/2 | s:bd compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 ]",
|
||||||
|
"[ 9/4 → 5/2 | s:hh compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 ]",
|
||||||
|
"[ 5/2 → 11/4 | s:hh compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 ]",
|
||||||
|
"[ 5/2 → 3/1 | s:sd compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 ]",
|
||||||
|
"[ 11/4 → 3/1 | s:hh compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 ]",
|
||||||
|
"[ 3/1 → 13/4 | s:hh compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 ]",
|
||||||
|
"[ 3/1 → 7/2 | s:bd compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 ]",
|
||||||
|
"[ 13/4 → 7/2 | s:hh compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 ]",
|
||||||
|
"[ 7/2 → 15/4 | s:hh compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 ]",
|
||||||
|
"[ 7/2 → 4/1 | s:sd compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 ]",
|
||||||
|
"[ 15/4 → 4/1 | s:hh compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 ]",
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
exports[`runs examples > example "cosine" example index 0 1`] = `
|
exports[`runs examples > example "cosine" example index 0 1`] = `
|
||||||
[
|
[
|
||||||
"[ 0/1 → 1/8 | note:Eb4 ]",
|
"[ 0/1 → 1/8 | note:Eb4 ]",
|
||||||
@ -3293,6 +3322,35 @@ exports[`runs examples > example "polymeterSteps" example index 0 1`] = `
|
|||||||
]
|
]
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
exports[`runs examples > example "postgain" example index 0 1`] = `
|
||||||
|
[
|
||||||
|
"[ 0/1 → 1/4 | s:hh compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 postgain:1.5 ]",
|
||||||
|
"[ 0/1 → 1/2 | s:bd compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 postgain:1.5 ]",
|
||||||
|
"[ 1/4 → 1/2 | s:hh compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 postgain:1.5 ]",
|
||||||
|
"[ 1/2 → 3/4 | s:hh compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 postgain:1.5 ]",
|
||||||
|
"[ 1/2 → 1/1 | s:sd compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 postgain:1.5 ]",
|
||||||
|
"[ 3/4 → 1/1 | s:hh compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 postgain:1.5 ]",
|
||||||
|
"[ 1/1 → 5/4 | s:hh compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 postgain:1.5 ]",
|
||||||
|
"[ 1/1 → 3/2 | s:bd compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 postgain:1.5 ]",
|
||||||
|
"[ 5/4 → 3/2 | s:hh compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 postgain:1.5 ]",
|
||||||
|
"[ 3/2 → 7/4 | s:hh compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 postgain:1.5 ]",
|
||||||
|
"[ 3/2 → 2/1 | s:sd compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 postgain:1.5 ]",
|
||||||
|
"[ 7/4 → 2/1 | s:hh compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 postgain:1.5 ]",
|
||||||
|
"[ 2/1 → 9/4 | s:hh compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 postgain:1.5 ]",
|
||||||
|
"[ 2/1 → 5/2 | s:bd compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 postgain:1.5 ]",
|
||||||
|
"[ 9/4 → 5/2 | s:hh compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 postgain:1.5 ]",
|
||||||
|
"[ 5/2 → 11/4 | s:hh compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 postgain:1.5 ]",
|
||||||
|
"[ 5/2 → 3/1 | s:sd compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 postgain:1.5 ]",
|
||||||
|
"[ 11/4 → 3/1 | s:hh compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 postgain:1.5 ]",
|
||||||
|
"[ 3/1 → 13/4 | s:hh compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 postgain:1.5 ]",
|
||||||
|
"[ 3/1 → 7/2 | s:bd compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 postgain:1.5 ]",
|
||||||
|
"[ 13/4 → 7/2 | s:hh compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 postgain:1.5 ]",
|
||||||
|
"[ 7/2 → 15/4 | s:hh compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 postgain:1.5 ]",
|
||||||
|
"[ 7/2 → 4/1 | s:sd compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 postgain:1.5 ]",
|
||||||
|
"[ 15/4 → 4/1 | s:hh compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 postgain:1.5 ]",
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
exports[`runs examples > example "press" example index 0 1`] = `
|
exports[`runs examples > example "press" example index 0 1`] = `
|
||||||
[
|
[
|
||||||
"[ 0/1 → 1/2 | s:hh ]",
|
"[ 0/1 → 1/2 | s:hh ]",
|
||||||
|
|||||||
@ -144,6 +144,14 @@ There is one filter envelope for each filter type and thus one set of envelope f
|
|||||||
|
|
||||||
<JsDoc client:idle name="velocity" h={0} />
|
<JsDoc client:idle name="velocity" h={0} />
|
||||||
|
|
||||||
|
## compressor
|
||||||
|
|
||||||
|
<JsDoc client:idle name="compressor" h={0} />
|
||||||
|
|
||||||
|
## postgain
|
||||||
|
|
||||||
|
<JsDoc client:idle name="postgain" h={0} />
|
||||||
|
|
||||||
# Panning
|
# Panning
|
||||||
|
|
||||||
## jux
|
## jux
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user