commit
a4fc40875b
5 changed files with 115 additions and 2 deletions
|
|
@ -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.
|
||||||
*
|
*
|
||||||
|
|
@ -1051,6 +1061,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,
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
||||||
|
|
@ -192,6 +192,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,
|
||||||
|
|
@ -237,6 +238,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
|
||||||
|
|
@ -351,6 +357,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();
|
||||||
|
|
@ -359,7 +370,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());
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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…
Add table
Add a link
Reference in a new issue