From b3f8df17838cabb2a0c78bff529a2bdf03421341 Mon Sep 17 00:00:00 2001 From: Jade Rowland Date: Sat, 4 Nov 2023 20:20:25 -0400 Subject: [PATCH 01/17] initial commit --- packages/core/controls.mjs | 11 ++++ packages/superdough/phaser.mjs | 88 ++++++++++++++++++++++++++++++ packages/superdough/superdough.mjs | 10 ++++ packages/superdough/worklets.mjs | 33 +++++++++++ 4 files changed, 142 insertions(+) create mode 100644 packages/superdough/phaser.mjs diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 8841b4bc..a616ce06 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -380,6 +380,17 @@ const generic_params = [ * */ ['coarse'], + + /** + * fake-resampling for lowering the sample rate. Caution: This effect seems to only work in chromium based browsers + * + * @name phaser + * @param {number | Pattern} factor 1 for original 2 for half, 3 for a third and so on. + * @example + * s("bd sd,hh*4").coarse("<1 4 8 16 32>") + * + */ + ['phaser'], /** * choose the channel the pattern is sent to in superdirt * diff --git a/packages/superdough/phaser.mjs b/packages/superdough/phaser.mjs new file mode 100644 index 00000000..62771df3 --- /dev/null +++ b/packages/superdough/phaser.mjs @@ -0,0 +1,88 @@ +// credits to webdirt: https://github.com/dktr0/WebDirt/blob/41342e81d6ad694a2310d491fef7b7e8b0929efe/js-src/Graph.js#L597 +export var vowelFormant = { + 0: { freqs: [660, 1120, 2750, 3000, 3350], gains: [1, 0.5012, 0.0708, 0.0631, 0.0126], qs: [80, 90, 120, 130, 140] }, + 1: { freqs: [440, 1800, 2700, 3000, 3300], gains: [1, 0.1995, 0.1259, 0.1, 0.1], qs: [70, 80, 100, 120, 120] }, + 2: { freqs: [270, 1850, 2900, 3350, 3590], gains: [1, 0.0631, 0.0631, 0.0158, 0.0158], qs: [40, 90, 100, 120, 120] }, + 3: { freqs: [430, 820, 2700, 3000, 3300], gains: [1, 0.3162, 0.0501, 0.0794, 0.01995], qs: [40, 80, 100, 120, 120] }, + 4: { freqs: [370, 630, 2750, 3000, 3400], gains: [1, 0.1, 0.0708, 0.0316, 0.01995], qs: [40, 60, 100, 120, 120] }, +}; + +var createFilter = function (ctx, cutoff, Q) { + var lowpassFilter = ctx.createBiquadFilter(); + lowpassFilter.type = 'notch'; + lowpassFilter.gain.value = 1; + lowpassFilter.frequency.value = cutoff; + lowpassFilter.Q.value = Q; + return lowpassFilter; +}; + +// var createTriOscillator = function (freq) { +// var osc = ctx.createOscillator(); +// osc.type = 'triangle'; +// osc.frequency.value = freq * 1.0; +// osc.detune.value = 0; +// return osc; +// }; + +var createLFO = function (ctx, freq) { + var osc = ctx.createOscillator(); + osc.frequency.value = freq; + osc.type = 'sine'; + osc.start(); + return osc; +}; +var createLFOGain = function (ctx, gain) { + var gainNode = ctx.createGain(); + gainNode.gain.value = gain; + return gainNode; +}; +let lfo, lfoGain; +if (typeof GainNode !== 'undefined') { + class PhaserNode extends GainNode { + constructor(ac, speed) { + super(ac); + console.log('speed', speed); + + if (!vowelFormant[speed]) { + throw new Error('phaser: unknown phaser ' + speed); + } + const { gains, qs, freqs } = vowelFormant[speed]; + const makeupGain = ac.createGain(); + + // var sine = ac.createOscillator(), + // sineGain = ac.createGain(); + + // //set up our oscillator types + // sine.type = sine.SINE; + + // //set the amplitude of the modulation + // sineGain.gain.value = 100; + + // //connect the dots + // sine.connect(sineGain); + if (lfo == null) { + lfo = createLFO(ac, 0.25); + lfoGain = createLFOGain(ac, 4000); + + lfo.connect(lfoGain); + } + // sineGain.connect(saw.frequency); + for (let i = 0; i < 6; i++) { + const gain = ac.createGain(); + gain.gain.value = 0.5; + const filter = createFilter(ac, 1000 + i * 20, 1); + this.connect(filter); + lfoGain.connect(filter.detune); + filter.connect(gain); + gain.connect(makeupGain); + } + makeupGain.gain.value = 1; // how much makeup gain to add? + this.connect = (target) => makeupGain.connect(target); + return this; + } + } + + AudioContext.prototype.createPhaser = function (speed) { + return new PhaserNode(this, speed); + }; +} diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index e3033afe..3a215604 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -7,6 +7,7 @@ This program is free software: you can redistribute it and/or modify it under th import './feedbackdelay.mjs'; import './reverb.mjs'; import './vowel.mjs'; +import './phaser.mjs'; import { clamp } from './util.mjs'; import workletsUrl from './worklets.mjs?url'; import { createFilter, gainNode, getCompressor } from './helpers.mjs'; @@ -226,6 +227,9 @@ export const superdough = async (value, deadline, hapDuration) => { bpsustain = 1, bprelease = 0.01, bandq = 1, + + //phaser + phaser, // coarse, crush, @@ -361,10 +365,16 @@ export const superdough = async (value, deadline, hapDuration) => { chain.push(vowelFilter); } + if (phaser !== undefined) { + const phaserFX = ac.createPhaser(phaser); + chain.push(phaserFX); + } + // effects coarse !== undefined && chain.push(getWorklet(ac, 'coarse-processor', { coarse })); crush !== undefined && chain.push(getWorklet(ac, 'crush-processor', { crush })); shape !== undefined && chain.push(getWorklet(ac, 'shape-processor', { shape })); + // phaser !== undefined && chain.push(getWorklet(ac, 'phaser-processor', { phaser })); compressorThreshold !== undefined && chain.push( diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index 7bb43f87..cce52453 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -106,3 +106,36 @@ class ShapeProcessor extends AudioWorkletProcessor { } registerProcessor('shape-processor', ShapeProcessor); + +// class PhaseProcessor extends AudioWorkletProcessor { +// static get parameterDescriptors() { +// return [{ name: 'phaser', defaultValue: 0 }]; +// } + +// constructor() { +// super(); +// this.notStarted = true; +// } + +// process(inputs, outputs, parameters) { +// const input = inputs[0]; +// const output = outputs[0]; +// const phaser0 = parameters.phaser[0]; +// const phaser1 = phaser0 < 1 ? phaser0 : 1.0 - 4e-10; +// const phaser = (2.0 * phaser1) / (1.0 - phaser1); +// const blockSize = 128; +// const hasInput = !(input[0] === undefined); +// if (hasInput) { +// this.notStarted = false; +// for (let n = 0; n < blockSize; n++) { +// const value = ((1 + phaser) * input[0][n]) / (1 + phaser * Math.abs(input[0][n])); +// for (let o = 0; o < output.length; o++) { +// output[o][n] = value; +// } +// } +// } +// return this.notStarted || hasInput; +// } +// } + +// registerProcessor('phaser-processor', PhaseProcessor); From a9efda3bc36619ec005aab5f9a7bb02b2f33e4f9 Mon Sep 17 00:00:00 2001 From: Jade Rowland Date: Sun, 5 Nov 2023 15:40:02 -0500 Subject: [PATCH 02/17] tweaking to make it sound good --- packages/superdough/phaser.mjs | 78 ++++++++++-------------------- packages/superdough/superdough.mjs | 2 +- 2 files changed, 27 insertions(+), 53 deletions(-) diff --git a/packages/superdough/phaser.mjs b/packages/superdough/phaser.mjs index 62771df3..bdb64c40 100644 --- a/packages/superdough/phaser.mjs +++ b/packages/superdough/phaser.mjs @@ -1,14 +1,5 @@ -// credits to webdirt: https://github.com/dktr0/WebDirt/blob/41342e81d6ad694a2310d491fef7b7e8b0929efe/js-src/Graph.js#L597 -export var vowelFormant = { - 0: { freqs: [660, 1120, 2750, 3000, 3350], gains: [1, 0.5012, 0.0708, 0.0631, 0.0126], qs: [80, 90, 120, 130, 140] }, - 1: { freqs: [440, 1800, 2700, 3000, 3300], gains: [1, 0.1995, 0.1259, 0.1, 0.1], qs: [70, 80, 100, 120, 120] }, - 2: { freqs: [270, 1850, 2900, 3350, 3590], gains: [1, 0.0631, 0.0631, 0.0158, 0.0158], qs: [40, 90, 100, 120, 120] }, - 3: { freqs: [430, 820, 2700, 3000, 3300], gains: [1, 0.3162, 0.0501, 0.0794, 0.01995], qs: [40, 80, 100, 120, 120] }, - 4: { freqs: [370, 630, 2750, 3000, 3400], gains: [1, 0.1, 0.0708, 0.0316, 0.01995], qs: [40, 60, 100, 120, 120] }, -}; - -var createFilter = function (ctx, cutoff, Q) { - var lowpassFilter = ctx.createBiquadFilter(); +const createFilter = (ctx, cutoff, Q) => { + const lowpassFilter = ctx.createBiquadFilter(); lowpassFilter.type = 'notch'; lowpassFilter.gain.value = 1; lowpassFilter.frequency.value = cutoff; @@ -16,65 +7,48 @@ var createFilter = function (ctx, cutoff, Q) { return lowpassFilter; }; -// var createTriOscillator = function (freq) { -// var osc = ctx.createOscillator(); -// osc.type = 'triangle'; -// osc.frequency.value = freq * 1.0; -// osc.detune.value = 0; -// return osc; -// }; - -var createLFO = function (ctx, freq) { - var osc = ctx.createOscillator(); +const createOscillator = (ctx, freq) => { + const osc = ctx.createOscillator(); osc.frequency.value = freq; osc.type = 'sine'; - osc.start(); return osc; }; -var createLFOGain = function (ctx, gain) { - var gainNode = ctx.createGain(); +const createGain = (ctx, gain) => { + const gainNode = ctx.createGain(); gainNode.gain.value = gain; return gainNode; }; -let lfo, lfoGain; + +const createLFO = (ctx, freq, gain) => { + const osc = createOscillator(ctx, freq); + const gainNode = createGain(ctx, gain); + osc.start(); + osc.connect(gainNode); + return gainNode; +}; if (typeof GainNode !== 'undefined') { class PhaserNode extends GainNode { - constructor(ac, speed) { + constructor(ac, speed, cps) { super(ac); - console.log('speed', speed); + this.lfo; + console.log(cps); - if (!vowelFormant[speed]) { - throw new Error('phaser: unknown phaser ' + speed); - } - const { gains, qs, freqs } = vowelFormant[speed]; const makeupGain = ac.createGain(); - // var sine = ac.createOscillator(), - // sineGain = ac.createGain(); - - // //set up our oscillator types - // sine.type = sine.SINE; - - // //set the amplitude of the modulation - // sineGain.gain.value = 100; - - // //connect the dots - // sine.connect(sineGain); - if (lfo == null) { - lfo = createLFO(ac, 0.25); - lfoGain = createLFOGain(ac, 4000); - - lfo.connect(lfoGain); + if (this.lfo == null) { + this.lfo = createLFO(ac, speed, 2000); } - // sineGain.connect(saw.frequency); - for (let i = 0; i < 6; i++) { + const numStages = 2; + let fOffset = 0; + for (let i = 0; i < numStages; i++) { const gain = ac.createGain(); - gain.gain.value = 0.5; - const filter = createFilter(ac, 1000 + i * 20, 1); + gain.gain.value = 1 / numStages; + const filter = createFilter(ac, 1000 + fOffset, 0.5); this.connect(filter); - lfoGain.connect(filter.detune); + this.lfo.connect(filter.detune); filter.connect(gain); gain.connect(makeupGain); + fOffset += 200 + Math.pow(i, 2); } makeupGain.gain.value = 1; // how much makeup gain to add? this.connect = (target) => makeupGain.connect(target); diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 3a215604..5473cc12 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -366,7 +366,7 @@ export const superdough = async (value, deadline, hapDuration) => { } if (phaser !== undefined) { - const phaserFX = ac.createPhaser(phaser); + const phaserFX = ac.createPhaser(phaser, hapDuration); chain.push(phaserFX); } From 9cbf3079f3bca2bc7cb2ee2192d86c883514a369 Mon Sep 17 00:00:00 2001 From: Jade Rowland Date: Mon, 6 Nov 2023 19:02:09 -0500 Subject: [PATCH 03/17] change to bus effect experiment --- packages/core/controls.mjs | 16 ++++-- packages/superdough/phaser.mjs | 21 ++++---- packages/superdough/superdough.mjs | 82 ++++++++++++++++++++++++++++-- 3 files changed, 102 insertions(+), 17 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index a616ce06..e3fa8be1 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -382,15 +382,25 @@ const generic_params = [ ['coarse'], /** - * fake-resampling for lowering the sample rate. Caution: This effect seems to only work in chromium based browsers + * Phaser audio effect that approximates popular guitar pedals. * * @name phaser - * @param {number | Pattern} factor 1 for original 2 for half, 3 for a third and so on. + * @param {number | Pattern} speed speed of modulation * @example - * s("bd sd,hh*4").coarse("<1 4 8 16 32>") + * run(8).scale("D:pentatonic").note().sound("sawtooth").phaser("2 8").release(0.5) * */ ['phaser'], + /** + * + * + * @name phaserDepth + * @param {number | Pattern} depth number between 0 and 1 + * @example + * run(8).scale("D:pentatonic").note().sound("sawtooth").phaser("2 8").phaserDepth(0.5).release(0.5) + * + */ + ['phaserDepth'], /** * choose the channel the pattern is sent to in superdirt * diff --git a/packages/superdough/phaser.mjs b/packages/superdough/phaser.mjs index bdb64c40..9aadc532 100644 --- a/packages/superdough/phaser.mjs +++ b/packages/superdough/phaser.mjs @@ -1,10 +1,10 @@ const createFilter = (ctx, cutoff, Q) => { - const lowpassFilter = ctx.createBiquadFilter(); - lowpassFilter.type = 'notch'; - lowpassFilter.gain.value = 1; - lowpassFilter.frequency.value = cutoff; - lowpassFilter.Q.value = Q; - return lowpassFilter; + const filter = ctx.createBiquadFilter(); + filter.type = 'notch'; + filter.gain.value = 1; + filter.frequency.value = cutoff; + filter.Q.value = Q; + return filter; }; const createOscillator = (ctx, freq) => { @@ -26,12 +26,15 @@ const createLFO = (ctx, freq, gain) => { osc.connect(gainNode); return gainNode; }; + if (typeof GainNode !== 'undefined') { class PhaserNode extends GainNode { - constructor(ac, speed, cps) { + constructor(ac, input) { super(ac); this.lfo; - console.log(cps); + + const { speed, depth = 0.5 } = input; + console.log(depth); const makeupGain = ac.createGain(); @@ -43,7 +46,7 @@ if (typeof GainNode !== 'undefined') { for (let i = 0; i < numStages; i++) { const gain = ac.createGain(); gain.gain.value = 1 / numStages; - const filter = createFilter(ac, 1000 + fOffset, 0.5); + const filter = createFilter(ac, 1000 + fOffset, 2 - Math.min(Math.max(depth * 2, 0), 1.9)); this.connect(filter); this.lfo.connect(filter.detune); filter.connect(gain); diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 5473cc12..8ea28340 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -113,6 +113,71 @@ function getDelay(orbit, delaytime, delayfeedback, t) { return delays[orbit]; } +const createFilter2 = (ctx, cutoff, Q) => { + const filter = ctx.createBiquadFilter(); + filter.type = 'notch'; + filter.gain.value = 1; + filter.frequency.value = cutoff; + filter.Q.value = Q; + return filter; +}; + +const createOscillator = (ctx, freq) => { + const osc = ctx.createOscillator(); + osc.frequency.value = freq; + osc.type = 'sine'; + return osc; +}; +const createGain = (ctx, gain) => { + const gainNode = ctx.createGain(); + gainNode.gain.value = gain; + return gainNode; +}; + +const createLFO = (ctx, freq, gain) => { + const osc = createOscillator(ctx, freq); + const gainNode = createGain(ctx, gain); + osc.start(); + osc.connect(gainNode); + return gainNode; +}; + +let phasers = {}; + +function getPhaser(orbit, speed = 1, depth = 0.5) { + if (!delays[orbit]) { + const ac = getAudioContext(); + + let lfo; + + const makeupGain = ac.createGain(); + + if (lfo == null) { + lfo = createLFO(ac, speed, 2000); + } + const numStages = 2; + let fOffset = 0; + for (let i = 0; i < numStages; i++) { + const gain = ac.createGain(); + gain.gain.value = 1 / numStages; + const filter = createFilter2(ac, 1000 + fOffset, 2 - Math.min(Math.max(depth * 2, 0), 1.9)); + makeupGain.connect(filter); + lfo.connect(filter.detune); + filter.connect(gain); + gain.connect(makeupGain); + fOffset += 200 + Math.pow(i, 2); + } + makeupGain.gain.value = 1; // how much makeup gain to add? + + makeupGain.connect(getDestination()); + phasers[orbit] = makeupGain; + } + console.log(phasers); + // delays[orbit].delayTime.value !== delaytime && delays[orbit].delayTime.setValueAtTime(delaytime, t); + // delays[orbit].feedback.value !== delayfeedback && delays[orbit].feedback.setValueAtTime(delayfeedback, t); + return phasers[orbit]; +} + let reverbs = {}; let hasChanged = (now, before) => now !== undefined && now !== before; @@ -230,6 +295,7 @@ export const superdough = async (value, deadline, hapDuration) => { //phaser phaser, + phaserDepth, // coarse, crush, @@ -365,10 +431,10 @@ export const superdough = async (value, deadline, hapDuration) => { chain.push(vowelFilter); } - if (phaser !== undefined) { - const phaserFX = ac.createPhaser(phaser, hapDuration); - chain.push(phaserFX); - } + // if (phaser !== undefined) { + // const phaserFX = ac.createPhaser({ speed: phaser, depth: phaserDepth }); + // chain.push(phaserFX); + // } // effects coarse !== undefined && chain.push(getWorklet(ac, 'coarse-processor', { coarse })); @@ -393,6 +459,12 @@ export const superdough = async (value, deadline, hapDuration) => { chain.push(post); post.connect(getDestination()); + let phaserSend; + if (phaser != null) { + const phaserFX = getPhaser(orbit, phaser, phaserDepth); + + phaserSend = effectSend(post, phaserFX, 0.99); + } // delay let delaySend; if (delay > 0 && delaytime > 0 && delayfeedback > 0) { @@ -429,7 +501,7 @@ export const superdough = async (value, deadline, hapDuration) => { // toDisconnect = all the node that should be disconnected in onended callback // this is crucial for performance - toDisconnect = chain.concat([delaySend, reverbSend, analyserSend]); + toDisconnect = chain.concat([phaserSend, delaySend, reverbSend, analyserSend]); }; export const superdoughTrigger = (t, hap, ct, cps) => superdough(hap, t - ct, hap.duration / cps, cps); From 0edd54dee331f12d80d6fa98b12222330e732558 Mon Sep 17 00:00:00 2001 From: Jade Rowland Date: Tue, 7 Nov 2023 20:23:45 -0500 Subject: [PATCH 04/17] cleaning up --- packages/superdough/superdough.mjs | 110 +++++++++++------------------ 1 file changed, 43 insertions(+), 67 deletions(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 8ea28340..2dc560d9 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -113,69 +113,46 @@ function getDelay(orbit, delaytime, delayfeedback, t) { return delays[orbit]; } -const createFilter2 = (ctx, cutoff, Q) => { - const filter = ctx.createBiquadFilter(); - filter.type = 'notch'; - filter.gain.value = 1; - filter.frequency.value = cutoff; - filter.Q.value = Q; - return filter; -}; +let phaserLFOs = {}; -const createOscillator = (ctx, freq) => { - const osc = ctx.createOscillator(); - osc.frequency.value = freq; - osc.type = 'sine'; - return osc; -}; -const createGain = (ctx, gain) => { - const gainNode = ctx.createGain(); - gainNode.gain.value = gain; - return gainNode; -}; +function getPhaser(orbit, speed = 1, depth = 0.5, t) { + //gain + const ac = getAudioContext(); + const lfoGain = ac.createGain(); + lfoGain.gain.value = 2000; -const createLFO = (ctx, freq, gain) => { - const osc = createOscillator(ctx, freq); - const gainNode = createGain(ctx, gain); - osc.start(); - osc.connect(gainNode); - return gainNode; -}; - -let phasers = {}; - -function getPhaser(orbit, speed = 1, depth = 0.5) { - if (!delays[orbit]) { - const ac = getAudioContext(); - - let lfo; - - const makeupGain = ac.createGain(); - - if (lfo == null) { - lfo = createLFO(ac, speed, 2000); - } - const numStages = 2; - let fOffset = 0; - for (let i = 0; i < numStages; i++) { - const gain = ac.createGain(); - gain.gain.value = 1 / numStages; - const filter = createFilter2(ac, 1000 + fOffset, 2 - Math.min(Math.max(depth * 2, 0), 1.9)); - makeupGain.connect(filter); - lfo.connect(filter.detune); - filter.connect(gain); - gain.connect(makeupGain); - fOffset += 200 + Math.pow(i, 2); - } - makeupGain.gain.value = 1; // how much makeup gain to add? - - makeupGain.connect(getDestination()); - phasers[orbit] = makeupGain; + //lfo + if (phaserLFOs[orbit] == null) { + const lfo = ac.createOscillator(); + lfo.frequency.value = speed; + lfo.type = 'sine'; + lfo.start(); + phaserLFOs[orbit] = lfo; } - console.log(phasers); - // delays[orbit].delayTime.value !== delaytime && delays[orbit].delayTime.setValueAtTime(delaytime, t); - // delays[orbit].feedback.value !== delayfeedback && delays[orbit].feedback.setValueAtTime(delayfeedback, t); - return phasers[orbit]; + if (phaserLFOs[orbit].frequency.value !== speed) { + phaserLFOs[orbit].frequency.setValueAtTime(speed, t); + } + phaserLFOs[orbit].connect(lfoGain); + + //filters + const numStages = 2; //num of filters in series + let fOffset = 0; + const filterChain = []; + for (let i = 0; i < numStages; i++) { + const filter = ac.createBiquadFilter(); + filter.type = 'notch'; + filter.gain.value = 1; + filter.frequency.value = 1000 + fOffset; + filter.Q.value = 2 - Math.min(Math.max(depth * 2, 0), 1.9); + + lfoGain.connect(filter.detune); + fOffset += 282; + if (i > 0) { + filterChain[i - 1].connect(filter); + } + filterChain.push(filter); + } + return filterChain[filterChain.length - 1]; } let reverbs = {}; @@ -453,18 +430,17 @@ export const superdough = async (value, deadline, hapDuration) => { panner.pan.value = 2 * pan - 1; chain.push(panner); } + // phaser + if (phaser !== undefined) { + const phaserFX = getPhaser(orbit, phaser, phaserDepth, t); + chain.push(phaserFX); + } // last gain const post = gainNode(postgain); chain.push(post); post.connect(getDestination()); - let phaserSend; - if (phaser != null) { - const phaserFX = getPhaser(orbit, phaser, phaserDepth); - - phaserSend = effectSend(post, phaserFX, 0.99); - } // delay let delaySend; if (delay > 0 && delaytime > 0 && delayfeedback > 0) { @@ -501,7 +477,7 @@ export const superdough = async (value, deadline, hapDuration) => { // toDisconnect = all the node that should be disconnected in onended callback // this is crucial for performance - toDisconnect = chain.concat([phaserSend, delaySend, reverbSend, analyserSend]); + toDisconnect = chain.concat([delaySend, reverbSend, analyserSend]); }; export const superdoughTrigger = (t, hap, ct, cps) => superdough(hap, t - ct, hap.duration / cps, cps); From bee36a7a4f89b3e8fd873fabaf7d0fbe82880887 Mon Sep 17 00:00:00 2001 From: Jade Rowland Date: Tue, 7 Nov 2023 20:25:31 -0500 Subject: [PATCH 05/17] cleaning up --- packages/superdough/phaser.mjs | 65 ------------------------------ packages/superdough/superdough.mjs | 1 - 2 files changed, 66 deletions(-) delete mode 100644 packages/superdough/phaser.mjs diff --git a/packages/superdough/phaser.mjs b/packages/superdough/phaser.mjs deleted file mode 100644 index 9aadc532..00000000 --- a/packages/superdough/phaser.mjs +++ /dev/null @@ -1,65 +0,0 @@ -const createFilter = (ctx, cutoff, Q) => { - const filter = ctx.createBiquadFilter(); - filter.type = 'notch'; - filter.gain.value = 1; - filter.frequency.value = cutoff; - filter.Q.value = Q; - return filter; -}; - -const createOscillator = (ctx, freq) => { - const osc = ctx.createOscillator(); - osc.frequency.value = freq; - osc.type = 'sine'; - return osc; -}; -const createGain = (ctx, gain) => { - const gainNode = ctx.createGain(); - gainNode.gain.value = gain; - return gainNode; -}; - -const createLFO = (ctx, freq, gain) => { - const osc = createOscillator(ctx, freq); - const gainNode = createGain(ctx, gain); - osc.start(); - osc.connect(gainNode); - return gainNode; -}; - -if (typeof GainNode !== 'undefined') { - class PhaserNode extends GainNode { - constructor(ac, input) { - super(ac); - this.lfo; - - const { speed, depth = 0.5 } = input; - console.log(depth); - - const makeupGain = ac.createGain(); - - if (this.lfo == null) { - this.lfo = createLFO(ac, speed, 2000); - } - const numStages = 2; - let fOffset = 0; - for (let i = 0; i < numStages; i++) { - const gain = ac.createGain(); - gain.gain.value = 1 / numStages; - const filter = createFilter(ac, 1000 + fOffset, 2 - Math.min(Math.max(depth * 2, 0), 1.9)); - this.connect(filter); - this.lfo.connect(filter.detune); - filter.connect(gain); - gain.connect(makeupGain); - fOffset += 200 + Math.pow(i, 2); - } - makeupGain.gain.value = 1; // how much makeup gain to add? - this.connect = (target) => makeupGain.connect(target); - return this; - } - } - - AudioContext.prototype.createPhaser = function (speed) { - return new PhaserNode(this, speed); - }; -} diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 2dc560d9..9721c5c8 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -7,7 +7,6 @@ This program is free software: you can redistribute it and/or modify it under th import './feedbackdelay.mjs'; import './reverb.mjs'; import './vowel.mjs'; -import './phaser.mjs'; import { clamp } from './util.mjs'; import workletsUrl from './worklets.mjs?url'; import { createFilter, gainNode, getCompressor } from './helpers.mjs'; From f0a582dc926d91bec904ea71a4060d3d177a8158 Mon Sep 17 00:00:00 2001 From: Jade Rowland Date: Tue, 7 Nov 2023 21:10:12 -0500 Subject: [PATCH 06/17] cleaning up --- packages/core/controls.mjs | 13 ++++++------ packages/superdough/README.md | 2 ++ packages/superdough/superdough.mjs | 32 +++++++++-------------------- packages/superdough/worklets.mjs | 33 ------------------------------ 4 files changed, 19 insertions(+), 61 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index e3fa8be1..ab1bea69 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -387,20 +387,21 @@ const generic_params = [ * @name phaser * @param {number | Pattern} speed speed of modulation * @example - * run(8).scale("D:pentatonic").note().sound("sawtooth").phaser("2 8").release(0.5) + * run(8).scale("D:pentatonic").note().sound("sawtooth").release(0.5).phaser("2 8") * */ ['phaser'], /** + * The depth of modulation for phaser * - * - * @name phaserDepth + * @name phaserdepth * @param {number | Pattern} depth number between 0 and 1 * @example - * run(8).scale("D:pentatonic").note().sound("sawtooth").phaser("2 8").phaserDepth(0.5).release(0.5) + * run(8).scale("D:pentatonic").note().sound("sawtooth").release(0.5).phaser("2 8").phaserdepth(0.5) * */ - ['phaserDepth'], + ['phaserdepth'], + /** * choose the channel the pattern is sent to in superdirt * @@ -1191,7 +1192,7 @@ const generic_params = [ ['tremolodepth', 'tremdp'], ['tremolorate', 'tremr'], // TODO: doesn't seem to do anything - ['phaserdepth', 'phasdp'], + ['phasdp'], ['phaserrate', 'phasr'], ['fshift'], diff --git a/packages/superdough/README.md b/packages/superdough/README.md index c5950dbf..7c199deb 100644 --- a/packages/superdough/README.md +++ b/packages/superdough/README.md @@ -67,6 +67,8 @@ superdough({ s: 'bd', delay: 0.5 }, 0, 1); - `crush`: amplitude bit crusher using given number of bits - `shape`: distortion effect from 0 (none) to 1 (full). might get loud! - `pan`: stereo panning from 0 (left) to 1 (right) + - `phaser`: sets the speed of the modulation + - `phaserdepth` - `vowel`: vowel filter. possible values: "a", "e", "i", "o", "u" - `delay`: delay mix - `delayfeedback`: delay feedback diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 9721c5c8..31537642 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -112,26 +112,18 @@ function getDelay(orbit, delaytime, delayfeedback, t) { return delays[orbit]; } -let phaserLFOs = {}; - -function getPhaser(orbit, speed = 1, depth = 0.5, t) { +function getPhaser(speed = 1, depth = 0.5) { //gain const ac = getAudioContext(); const lfoGain = ac.createGain(); lfoGain.gain.value = 2000; - //lfo - if (phaserLFOs[orbit] == null) { - const lfo = ac.createOscillator(); - lfo.frequency.value = speed; - lfo.type = 'sine'; - lfo.start(); - phaserLFOs[orbit] = lfo; - } - if (phaserLFOs[orbit].frequency.value !== speed) { - phaserLFOs[orbit].frequency.setValueAtTime(speed, t); - } - phaserLFOs[orbit].connect(lfoGain); + //lfo TODO: set the lfo phase relative to current cycle to create "free running" effect + const lfo = ac.createOscillator(); + lfo.frequency.value = speed; + lfo.type = 'sine'; + lfo.start(); + lfo.connect(lfoGain); //filters const numStages = 2; //num of filters in series @@ -271,7 +263,7 @@ export const superdough = async (value, deadline, hapDuration) => { //phaser phaser, - phaserDepth, + phaserdepth, // coarse, crush, @@ -306,6 +298,7 @@ export const superdough = async (value, deadline, hapDuration) => { if (bank && s) { s = `${bank}_${s}`; } + // get source AudioNode let sourceNode; if (source) { @@ -407,11 +400,6 @@ export const superdough = async (value, deadline, hapDuration) => { chain.push(vowelFilter); } - // if (phaser !== undefined) { - // const phaserFX = ac.createPhaser({ speed: phaser, depth: phaserDepth }); - // chain.push(phaserFX); - // } - // effects coarse !== undefined && chain.push(getWorklet(ac, 'coarse-processor', { coarse })); crush !== undefined && chain.push(getWorklet(ac, 'crush-processor', { crush })); @@ -431,7 +419,7 @@ export const superdough = async (value, deadline, hapDuration) => { } // phaser if (phaser !== undefined) { - const phaserFX = getPhaser(orbit, phaser, phaserDepth, t); + const phaserFX = getPhaser(phaser, phaserdepth); chain.push(phaserFX); } diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index cce52453..7bb43f87 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -106,36 +106,3 @@ class ShapeProcessor extends AudioWorkletProcessor { } registerProcessor('shape-processor', ShapeProcessor); - -// class PhaseProcessor extends AudioWorkletProcessor { -// static get parameterDescriptors() { -// return [{ name: 'phaser', defaultValue: 0 }]; -// } - -// constructor() { -// super(); -// this.notStarted = true; -// } - -// process(inputs, outputs, parameters) { -// const input = inputs[0]; -// const output = outputs[0]; -// const phaser0 = parameters.phaser[0]; -// const phaser1 = phaser0 < 1 ? phaser0 : 1.0 - 4e-10; -// const phaser = (2.0 * phaser1) / (1.0 - phaser1); -// const blockSize = 128; -// const hasInput = !(input[0] === undefined); -// if (hasInput) { -// this.notStarted = false; -// for (let n = 0; n < blockSize; n++) { -// const value = ((1 + phaser) * input[0][n]) / (1 + phaser * Math.abs(input[0][n])); -// for (let o = 0; o < output.length; o++) { -// output[o][n] = value; -// } -// } -// } -// return this.notStarted || hasInput; -// } -// } - -// registerProcessor('phaser-processor', PhaseProcessor); From 51c63fa996f63991e0136fe922f6f21d37ea6197 Mon Sep 17 00:00:00 2001 From: Jade Rowland Date: Tue, 7 Nov 2023 21:44:57 -0500 Subject: [PATCH 07/17] turn off of depth is 0 --- packages/superdough/superdough.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 31537642..4d0f2e23 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -263,7 +263,7 @@ export const superdough = async (value, deadline, hapDuration) => { //phaser phaser, - phaserdepth, + phaserdepth = 0.75, // coarse, crush, @@ -418,7 +418,7 @@ export const superdough = async (value, deadline, hapDuration) => { chain.push(panner); } // phaser - if (phaser !== undefined) { + if (phaser !== undefined && phaserdepth > 0) { const phaserFX = getPhaser(phaser, phaserdepth); chain.push(phaserFX); } From 2e4d28b9100e460c3c9c6787417dc5f3bb7b1053 Mon Sep 17 00:00:00 2001 From: Jade Rowland Date: Tue, 7 Nov 2023 21:49:56 -0500 Subject: [PATCH 08/17] update doc --- packages/core/controls.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index ab1bea69..1374f25c 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -392,7 +392,7 @@ const generic_params = [ */ ['phaser'], /** - * The depth of modulation for phaser + * The amount the signal is affected by the phaser effect * * @name phaserdepth * @param {number | Pattern} depth number between 0 and 1 From 65d07dbff22eaf35511af1b6b457a19e75832756 Mon Sep 17 00:00:00 2001 From: Jade Rowland Date: Tue, 7 Nov 2023 22:09:53 -0500 Subject: [PATCH 09/17] create free running lfos for different orbits --- packages/superdough/superdough.mjs | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 4d0f2e23..3e63a55a 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -112,18 +112,25 @@ function getDelay(orbit, delaytime, delayfeedback, t) { return delays[orbit]; } -function getPhaser(speed = 1, depth = 0.5) { +const phaserLFOs = {}; +function getPhaser(orbit, t, speed = 1, depth = 0.5) { //gain const ac = getAudioContext(); const lfoGain = ac.createGain(); lfoGain.gain.value = 2000; - //lfo TODO: set the lfo phase relative to current cycle to create "free running" effect - const lfo = ac.createOscillator(); - lfo.frequency.value = speed; - lfo.type = 'sine'; - lfo.start(); - lfo.connect(lfoGain); + //LFO + if (phaserLFOs[orbit] == null) { + phaserLFOs[orbit] = ac.createOscillator(); + phaserLFOs[orbit].frequency.value = speed; + phaserLFOs[orbit].type = 'sine'; + phaserLFOs[orbit].start(); + } + + phaserLFOs[orbit].connect(lfoGain); + if (phaserLFOs[orbit].frequency.value != speed) { + phaserLFOs[orbit].frequency.setValueAtTime(speed, t); + } //filters const numStages = 2; //num of filters in series @@ -419,7 +426,7 @@ export const superdough = async (value, deadline, hapDuration) => { } // phaser if (phaser !== undefined && phaserdepth > 0) { - const phaserFX = getPhaser(phaser, phaserdepth); + const phaserFX = getPhaser(orbit, t, phaser, phaserdepth); chain.push(phaserFX); } From 4b4290e0871eab7f83828d26644dc9c1d47c7f92 Mon Sep 17 00:00:00 2001 From: Jade Rowland Date: Tue, 7 Nov 2023 22:52:39 -0500 Subject: [PATCH 10/17] add more parameters --- packages/core/controls.mjs | 26 +++++++++++++++++++++++++- packages/superdough/superdough.mjs | 12 +++++++----- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 58b027ba..4414219e 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -391,13 +391,37 @@ const generic_params = [ * */ ['phaser'], + + /** + * The frequency sweep range of the lfo for the phaser effect + * + * @name phasersweep + * @param {number | Pattern} phasersweep most useful values are between 0 and 4000 + * @example + * run(8).scale("D:pentatonic").note().sound("sawtooth").release(0.5).phaser("2 8").phasersweep(800) + * + */ + ['phasersweep'], + + /** + * The center frequency of the phaser in HZ + * + * @name phasercenter + * @param {number | Pattern} centerfrequency most useful values are between 0 and 1 + * @example + * run(8).scale("D:pentatonic").note().sound("sawtooth").release(0.5).phaser("2 8").phasercenter(2000) + * + */ + + ['phasercenter'], + /** * The amount the signal is affected by the phaser effect * * @name phaserdepth * @param {number | Pattern} depth number between 0 and 1 * @example - * run(8).scale("D:pentatonic").note().sound("sawtooth").release(0.5).phaser("2 8").phaserdepth(0.5) + * run(8).scale("D:pentatonic").note().sound("sawtooth").release(0.5).phaser("2 8").phasercenter(200) * */ ['phaserdepth'], diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 3e63a55a..00e2f42c 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -112,12 +112,13 @@ function getDelay(orbit, delaytime, delayfeedback, t) { return delays[orbit]; } +// each orbit will have its own lfo const phaserLFOs = {}; -function getPhaser(orbit, t, speed = 1, depth = 0.5) { +function getPhaser(orbit, t, speed = 1, depth = 0.5, centerFrequency = 1000, sweep = 2000) { //gain const ac = getAudioContext(); const lfoGain = ac.createGain(); - lfoGain.gain.value = 2000; + lfoGain.gain.value = sweep; //LFO if (phaserLFOs[orbit] == null) { @@ -140,7 +141,7 @@ function getPhaser(orbit, t, speed = 1, depth = 0.5) { const filter = ac.createBiquadFilter(); filter.type = 'notch'; filter.gain.value = 1; - filter.frequency.value = 1000 + fOffset; + filter.frequency.value = centerFrequency + fOffset; filter.Q.value = 2 - Math.min(Math.max(depth * 2, 0), 1.9); lfoGain.connect(filter.detune); @@ -271,6 +272,8 @@ export const superdough = async (value, deadline, hapDuration) => { //phaser phaser, phaserdepth = 0.75, + phasersweep, + phasercenter, // coarse, crush, @@ -411,7 +414,6 @@ export const superdough = async (value, deadline, hapDuration) => { coarse !== undefined && chain.push(getWorklet(ac, 'coarse-processor', { coarse })); crush !== undefined && chain.push(getWorklet(ac, 'crush-processor', { crush })); shape !== undefined && chain.push(getWorklet(ac, 'shape-processor', { shape })); - // phaser !== undefined && chain.push(getWorklet(ac, 'phaser-processor', { phaser })); compressorThreshold !== undefined && chain.push( @@ -426,7 +428,7 @@ export const superdough = async (value, deadline, hapDuration) => { } // phaser if (phaser !== undefined && phaserdepth > 0) { - const phaserFX = getPhaser(orbit, t, phaser, phaserdepth); + const phaserFX = getPhaser(orbit, t, phaser, phaserdepth, phasercenter, phasersweep); chain.push(phaserFX); } From 06eb8b5be814139f5c3087e8a9f40b568ab3467b Mon Sep 17 00:00:00 2001 From: Jade Rowland Date: Tue, 7 Nov 2023 22:57:00 -0500 Subject: [PATCH 11/17] fixed doc --- packages/core/controls.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 4414219e..cdd1b4db 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -407,7 +407,7 @@ const generic_params = [ * The center frequency of the phaser in HZ * * @name phasercenter - * @param {number | Pattern} centerfrequency most useful values are between 0 and 1 + * @param {number | Pattern} centerfrequency in HZ * @example * run(8).scale("D:pentatonic").note().sound("sawtooth").release(0.5).phaser("2 8").phasercenter(2000) * From 791a363694f598dac01429e349a4d5da229730e2 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Wed, 8 Nov 2023 23:33:46 +0100 Subject: [PATCH 12/17] snapshots --- test/__snapshots__/examples.test.mjs.snap | 148 ++++++++++++++++++++++ 1 file changed, 148 insertions(+) diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 39b9456f..9b59e78e 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -3306,6 +3306,154 @@ exports[`runs examples > example "perlin" example index 0 1`] = ` ] `; +exports[`runs examples > example "phaser" example index 0 1`] = ` +[ + "[ 0/1 → 1/8 | note:D3 s:sawtooth release:0.5 phaser:2 ]", + "[ 1/8 → 1/4 | note:E3 s:sawtooth release:0.5 phaser:2 ]", + "[ 1/4 → 3/8 | note:F#3 s:sawtooth release:0.5 phaser:2 ]", + "[ 3/8 → 1/2 | note:A3 s:sawtooth release:0.5 phaser:2 ]", + "[ 1/2 → 5/8 | note:B3 s:sawtooth release:0.5 phaser:8 ]", + "[ 5/8 → 3/4 | note:D4 s:sawtooth release:0.5 phaser:8 ]", + "[ 3/4 → 7/8 | note:E4 s:sawtooth release:0.5 phaser:8 ]", + "[ 7/8 → 1/1 | note:F#4 s:sawtooth release:0.5 phaser:8 ]", + "[ 1/1 → 9/8 | note:D3 s:sawtooth release:0.5 phaser:2 ]", + "[ 9/8 → 5/4 | note:E3 s:sawtooth release:0.5 phaser:2 ]", + "[ 5/4 → 11/8 | note:F#3 s:sawtooth release:0.5 phaser:2 ]", + "[ 11/8 → 3/2 | note:A3 s:sawtooth release:0.5 phaser:2 ]", + "[ 3/2 → 13/8 | note:B3 s:sawtooth release:0.5 phaser:8 ]", + "[ 13/8 → 7/4 | note:D4 s:sawtooth release:0.5 phaser:8 ]", + "[ 7/4 → 15/8 | note:E4 s:sawtooth release:0.5 phaser:8 ]", + "[ 15/8 → 2/1 | note:F#4 s:sawtooth release:0.5 phaser:8 ]", + "[ 2/1 → 17/8 | note:D3 s:sawtooth release:0.5 phaser:2 ]", + "[ 17/8 → 9/4 | note:E3 s:sawtooth release:0.5 phaser:2 ]", + "[ 9/4 → 19/8 | note:F#3 s:sawtooth release:0.5 phaser:2 ]", + "[ 19/8 → 5/2 | note:A3 s:sawtooth release:0.5 phaser:2 ]", + "[ 5/2 → 21/8 | note:B3 s:sawtooth release:0.5 phaser:8 ]", + "[ 21/8 → 11/4 | note:D4 s:sawtooth release:0.5 phaser:8 ]", + "[ 11/4 → 23/8 | note:E4 s:sawtooth release:0.5 phaser:8 ]", + "[ 23/8 → 3/1 | note:F#4 s:sawtooth release:0.5 phaser:8 ]", + "[ 3/1 → 25/8 | note:D3 s:sawtooth release:0.5 phaser:2 ]", + "[ 25/8 → 13/4 | note:E3 s:sawtooth release:0.5 phaser:2 ]", + "[ 13/4 → 27/8 | note:F#3 s:sawtooth release:0.5 phaser:2 ]", + "[ 27/8 → 7/2 | note:A3 s:sawtooth release:0.5 phaser:2 ]", + "[ 7/2 → 29/8 | note:B3 s:sawtooth release:0.5 phaser:8 ]", + "[ 29/8 → 15/4 | note:D4 s:sawtooth release:0.5 phaser:8 ]", + "[ 15/4 → 31/8 | note:E4 s:sawtooth release:0.5 phaser:8 ]", + "[ 31/8 → 4/1 | note:F#4 s:sawtooth release:0.5 phaser:8 ]", +] +`; + +exports[`runs examples > example "phasercenter" example index 0 1`] = ` +[ + "[ 0/1 → 1/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", + "[ 1/8 → 1/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", + "[ 1/4 → 3/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", + "[ 3/8 → 1/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", + "[ 1/2 → 5/8 | note:B3 s:sawtooth release:0.5 phaser:8 phasercenter:2000 ]", + "[ 5/8 → 3/4 | note:D4 s:sawtooth release:0.5 phaser:8 phasercenter:2000 ]", + "[ 3/4 → 7/8 | note:E4 s:sawtooth release:0.5 phaser:8 phasercenter:2000 ]", + "[ 7/8 → 1/1 | note:F#4 s:sawtooth release:0.5 phaser:8 phasercenter:2000 ]", + "[ 1/1 → 9/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", + "[ 9/8 → 5/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", + "[ 5/4 → 11/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", + "[ 11/8 → 3/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", + "[ 3/2 → 13/8 | note:B3 s:sawtooth release:0.5 phaser:8 phasercenter:2000 ]", + "[ 13/8 → 7/4 | note:D4 s:sawtooth release:0.5 phaser:8 phasercenter:2000 ]", + "[ 7/4 → 15/8 | note:E4 s:sawtooth release:0.5 phaser:8 phasercenter:2000 ]", + "[ 15/8 → 2/1 | note:F#4 s:sawtooth release:0.5 phaser:8 phasercenter:2000 ]", + "[ 2/1 → 17/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", + "[ 17/8 → 9/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", + "[ 9/4 → 19/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", + "[ 19/8 → 5/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", + "[ 5/2 → 21/8 | note:B3 s:sawtooth release:0.5 phaser:8 phasercenter:2000 ]", + "[ 21/8 → 11/4 | note:D4 s:sawtooth release:0.5 phaser:8 phasercenter:2000 ]", + "[ 11/4 → 23/8 | note:E4 s:sawtooth release:0.5 phaser:8 phasercenter:2000 ]", + "[ 23/8 → 3/1 | note:F#4 s:sawtooth release:0.5 phaser:8 phasercenter:2000 ]", + "[ 3/1 → 25/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", + "[ 25/8 → 13/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", + "[ 13/4 → 27/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", + "[ 27/8 → 7/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", + "[ 7/2 → 29/8 | note:B3 s:sawtooth release:0.5 phaser:8 phasercenter:2000 ]", + "[ 29/8 → 15/4 | note:D4 s:sawtooth release:0.5 phaser:8 phasercenter:2000 ]", + "[ 15/4 → 31/8 | note:E4 s:sawtooth release:0.5 phaser:8 phasercenter:2000 ]", + "[ 31/8 → 4/1 | note:F#4 s:sawtooth release:0.5 phaser:8 phasercenter:2000 ]", +] +`; + +exports[`runs examples > example "phaserdepth" example index 0 1`] = ` +[ + "[ 0/1 → 1/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasercenter:200 ]", + "[ 1/8 → 1/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasercenter:200 ]", + "[ 1/4 → 3/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasercenter:200 ]", + "[ 3/8 → 1/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasercenter:200 ]", + "[ 1/2 → 5/8 | note:B3 s:sawtooth release:0.5 phaser:8 phasercenter:200 ]", + "[ 5/8 → 3/4 | note:D4 s:sawtooth release:0.5 phaser:8 phasercenter:200 ]", + "[ 3/4 → 7/8 | note:E4 s:sawtooth release:0.5 phaser:8 phasercenter:200 ]", + "[ 7/8 → 1/1 | note:F#4 s:sawtooth release:0.5 phaser:8 phasercenter:200 ]", + "[ 1/1 → 9/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasercenter:200 ]", + "[ 9/8 → 5/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasercenter:200 ]", + "[ 5/4 → 11/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasercenter:200 ]", + "[ 11/8 → 3/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasercenter:200 ]", + "[ 3/2 → 13/8 | note:B3 s:sawtooth release:0.5 phaser:8 phasercenter:200 ]", + "[ 13/8 → 7/4 | note:D4 s:sawtooth release:0.5 phaser:8 phasercenter:200 ]", + "[ 7/4 → 15/8 | note:E4 s:sawtooth release:0.5 phaser:8 phasercenter:200 ]", + "[ 15/8 → 2/1 | note:F#4 s:sawtooth release:0.5 phaser:8 phasercenter:200 ]", + "[ 2/1 → 17/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasercenter:200 ]", + "[ 17/8 → 9/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasercenter:200 ]", + "[ 9/4 → 19/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasercenter:200 ]", + "[ 19/8 → 5/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasercenter:200 ]", + "[ 5/2 → 21/8 | note:B3 s:sawtooth release:0.5 phaser:8 phasercenter:200 ]", + "[ 21/8 → 11/4 | note:D4 s:sawtooth release:0.5 phaser:8 phasercenter:200 ]", + "[ 11/4 → 23/8 | note:E4 s:sawtooth release:0.5 phaser:8 phasercenter:200 ]", + "[ 23/8 → 3/1 | note:F#4 s:sawtooth release:0.5 phaser:8 phasercenter:200 ]", + "[ 3/1 → 25/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasercenter:200 ]", + "[ 25/8 → 13/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasercenter:200 ]", + "[ 13/4 → 27/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasercenter:200 ]", + "[ 27/8 → 7/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasercenter:200 ]", + "[ 7/2 → 29/8 | note:B3 s:sawtooth release:0.5 phaser:8 phasercenter:200 ]", + "[ 29/8 → 15/4 | note:D4 s:sawtooth release:0.5 phaser:8 phasercenter:200 ]", + "[ 15/4 → 31/8 | note:E4 s:sawtooth release:0.5 phaser:8 phasercenter:200 ]", + "[ 31/8 → 4/1 | note:F#4 s:sawtooth release:0.5 phaser:8 phasercenter:200 ]", +] +`; + +exports[`runs examples > example "phasersweep" example index 0 1`] = ` +[ + "[ 0/1 → 1/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", + "[ 1/8 → 1/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", + "[ 1/4 → 3/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", + "[ 3/8 → 1/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", + "[ 1/2 → 5/8 | note:B3 s:sawtooth release:0.5 phaser:8 phasersweep:800 ]", + "[ 5/8 → 3/4 | note:D4 s:sawtooth release:0.5 phaser:8 phasersweep:800 ]", + "[ 3/4 → 7/8 | note:E4 s:sawtooth release:0.5 phaser:8 phasersweep:800 ]", + "[ 7/8 → 1/1 | note:F#4 s:sawtooth release:0.5 phaser:8 phasersweep:800 ]", + "[ 1/1 → 9/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", + "[ 9/8 → 5/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", + "[ 5/4 → 11/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", + "[ 11/8 → 3/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", + "[ 3/2 → 13/8 | note:B3 s:sawtooth release:0.5 phaser:8 phasersweep:800 ]", + "[ 13/8 → 7/4 | note:D4 s:sawtooth release:0.5 phaser:8 phasersweep:800 ]", + "[ 7/4 → 15/8 | note:E4 s:sawtooth release:0.5 phaser:8 phasersweep:800 ]", + "[ 15/8 → 2/1 | note:F#4 s:sawtooth release:0.5 phaser:8 phasersweep:800 ]", + "[ 2/1 → 17/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", + "[ 17/8 → 9/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", + "[ 9/4 → 19/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", + "[ 19/8 → 5/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", + "[ 5/2 → 21/8 | note:B3 s:sawtooth release:0.5 phaser:8 phasersweep:800 ]", + "[ 21/8 → 11/4 | note:D4 s:sawtooth release:0.5 phaser:8 phasersweep:800 ]", + "[ 11/4 → 23/8 | note:E4 s:sawtooth release:0.5 phaser:8 phasersweep:800 ]", + "[ 23/8 → 3/1 | note:F#4 s:sawtooth release:0.5 phaser:8 phasersweep:800 ]", + "[ 3/1 → 25/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", + "[ 25/8 → 13/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", + "[ 13/4 → 27/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", + "[ 27/8 → 7/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", + "[ 7/2 → 29/8 | note:B3 s:sawtooth release:0.5 phaser:8 phasersweep:800 ]", + "[ 29/8 → 15/4 | note:D4 s:sawtooth release:0.5 phaser:8 phasersweep:800 ]", + "[ 15/4 → 31/8 | note:E4 s:sawtooth release:0.5 phaser:8 phasersweep:800 ]", + "[ 31/8 → 4/1 | note:F#4 s:sawtooth release:0.5 phaser:8 phasersweep:800 ]", +] +`; + exports[`runs examples > example "pick" example index 0 1`] = ` [ "[ 0/1 → 1/2 | note:g ]", From df636cf4f699512a0e19b7dfc37dee31ac0d5ae6 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Thu, 9 Nov 2023 08:16:17 +0100 Subject: [PATCH 13/17] phaser shortcuts --- packages/core/controls.mjs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index cdd1b4db..871ec18d 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -390,10 +390,10 @@ const generic_params = [ * run(8).scale("D:pentatonic").note().sound("sawtooth").release(0.5).phaser("2 8") * */ - ['phaser'], + [['phaser', 'phaserdepth', 'phasercenter', 'phasersweep'], 'ph'], /** - * The frequency sweep range of the lfo for the phaser effect + * The frequency sweep range of the lfo for the phaser effect. Defaults to 2000 * * @name phasersweep * @param {number | Pattern} phasersweep most useful values are between 0 and 4000 @@ -401,10 +401,10 @@ const generic_params = [ * run(8).scale("D:pentatonic").note().sound("sawtooth").release(0.5).phaser("2 8").phasersweep(800) * */ - ['phasersweep'], + ['phasersweep', 'phs'], /** - * The center frequency of the phaser in HZ + * The center frequency of the phaser in HZ. Defaults to 1000 * * @name phasercenter * @param {number | Pattern} centerfrequency in HZ @@ -413,10 +413,10 @@ const generic_params = [ * */ - ['phasercenter'], + ['phasercenter', 'phc'], /** - * The amount the signal is affected by the phaser effect + * The amount the signal is affected by the phaser effect. Defaults to 0.75 * * @name phaserdepth * @param {number | Pattern} depth number between 0 and 1 @@ -424,7 +424,7 @@ const generic_params = [ * run(8).scale("D:pentatonic").note().sound("sawtooth").release(0.5).phaser("2 8").phasercenter(200) * */ - ['phaserdepth'], + ['phaserdepth', 'phd'], /** * choose the channel the pattern is sent to in superdirt From ac359a0e9e66b872a8bde93220351fe9d4248148 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Thu, 9 Nov 2023 08:17:16 +0100 Subject: [PATCH 14/17] doc: phaser synonyms --- packages/core/controls.mjs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 871ec18d..6bba4131 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -385,6 +385,7 @@ const generic_params = [ * Phaser audio effect that approximates popular guitar pedals. * * @name phaser + * @synonyms ph * @param {number | Pattern} speed speed of modulation * @example * run(8).scale("D:pentatonic").note().sound("sawtooth").release(0.5).phaser("2 8") @@ -396,6 +397,7 @@ const generic_params = [ * The frequency sweep range of the lfo for the phaser effect. Defaults to 2000 * * @name phasersweep + * @synonyms phs * @param {number | Pattern} phasersweep most useful values are between 0 and 4000 * @example * run(8).scale("D:pentatonic").note().sound("sawtooth").release(0.5).phaser("2 8").phasersweep(800) @@ -407,6 +409,7 @@ const generic_params = [ * The center frequency of the phaser in HZ. Defaults to 1000 * * @name phasercenter + * @synonyms phc * @param {number | Pattern} centerfrequency in HZ * @example * run(8).scale("D:pentatonic").note().sound("sawtooth").release(0.5).phaser("2 8").phasercenter(2000) @@ -419,6 +422,7 @@ const generic_params = [ * The amount the signal is affected by the phaser effect. Defaults to 0.75 * * @name phaserdepth + * @synonyms phd * @param {number | Pattern} depth number between 0 and 1 * @example * run(8).scale("D:pentatonic").note().sound("sawtooth").release(0.5).phaser("2 8").phasercenter(200) From 3ecb701504c662f67f8f2d3048cec7c30733d7bc Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Thu, 9 Nov 2023 08:19:04 +0100 Subject: [PATCH 15/17] add params to superdough readme --- packages/superdough/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/superdough/README.md b/packages/superdough/README.md index 7c199deb..f32aa32d 100644 --- a/packages/superdough/README.md +++ b/packages/superdough/README.md @@ -68,7 +68,9 @@ superdough({ s: 'bd', delay: 0.5 }, 0, 1); - `shape`: distortion effect from 0 (none) to 1 (full). might get loud! - `pan`: stereo panning from 0 (left) to 1 (right) - `phaser`: sets the speed of the modulation - - `phaserdepth` + - `phaserdepth`: the amount the signal is affected by the phaser effect. + - `phasersweep`: the frequency sweep range of the lfo for the phaser effect. + - `phasercenter`: the amount the signal is affected by the phaser effect. - `vowel`: vowel filter. possible values: "a", "e", "i", "o", "u" - `delay`: delay mix - `delayfeedback`: delay feedback From 2682fd38f8e3fa21531927f424db4a72dd7c3e7d Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Thu, 9 Nov 2023 08:29:21 +0100 Subject: [PATCH 16/17] add to doc page --- packages/core/controls.mjs | 15 +- test/__snapshots__/examples.test.mjs.snap | 229 ++++++++++++---------- website/src/pages/learn/effects.mdx | 18 ++ 3 files changed, 149 insertions(+), 113 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 6bba4131..d69b4484 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -388,7 +388,8 @@ const generic_params = [ * @synonyms ph * @param {number | Pattern} speed speed of modulation * @example - * run(8).scale("D:pentatonic").note().sound("sawtooth").release(0.5).phaser("2 8") + * n(run(8)).scale("D:pentatonic").s("sawtooth").release(0.5) + * .phaser("<1 2 4 8>") * */ [['phaser', 'phaserdepth', 'phasercenter', 'phasersweep'], 'ph'], @@ -400,7 +401,8 @@ const generic_params = [ * @synonyms phs * @param {number | Pattern} phasersweep most useful values are between 0 and 4000 * @example - * run(8).scale("D:pentatonic").note().sound("sawtooth").release(0.5).phaser("2 8").phasersweep(800) + * n(run(8)).scale("D:pentatonic").s("sawtooth").release(0.5) + * .phaser(2).phasersweep("<800 2000 4000>") * */ ['phasersweep', 'phs'], @@ -412,7 +414,8 @@ const generic_params = [ * @synonyms phc * @param {number | Pattern} centerfrequency in HZ * @example - * run(8).scale("D:pentatonic").note().sound("sawtooth").release(0.5).phaser("2 8").phasercenter(2000) + * n(run(8)).scale("D:pentatonic").s("sawtooth").release(0.5) + * .phaser(2).phasercenter("<800 2000 4000>") * */ @@ -425,7 +428,8 @@ const generic_params = [ * @synonyms phd * @param {number | Pattern} depth number between 0 and 1 * @example - * run(8).scale("D:pentatonic").note().sound("sawtooth").release(0.5).phaser("2 8").phasercenter(200) + * n(run(8)).scale("D:pentatonic").s("sawtooth").release(0.5) + * .phaser(2).phaserdepth("<0 .5 .75 1>") * */ ['phaserdepth', 'phd'], @@ -1081,7 +1085,8 @@ const generic_params = [ */ ['roomfade', 'rfade'], /** - * Sets the sample to use as an impulse response for the reverb. * * @name iresponse + * 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 diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 9b59e78e..8c49000a 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -2439,6 +2439,19 @@ exports[`runs examples > example "irand" example index 0 1`] = ` ] `; +exports[`runs examples > example "iresponse" example index 0 1`] = ` +[ + "[ 0/1 → 1/2 | s:bd room:0.8 ir:shaker_large i:0 ]", + "[ 1/2 → 1/1 | s:sd room:0.8 ir:shaker_large i:0 ]", + "[ 1/1 → 3/2 | s:bd room:0.8 ir:shaker_large i:2 ]", + "[ 3/2 → 2/1 | s:sd room:0.8 ir:shaker_large i:2 ]", + "[ 2/1 → 5/2 | s:bd room:0.8 ir:shaker_large i:0 ]", + "[ 5/2 → 3/1 | s:sd room:0.8 ir:shaker_large i:0 ]", + "[ 3/1 → 7/2 | s:bd room:0.8 ir:shaker_large i:2 ]", + "[ 7/2 → 4/1 | s:sd room:0.8 ir:shaker_large i:2 ]", +] +`; + exports[`runs examples > example "iter" example index 0 1`] = ` [ "[ 0/1 → 1/4 | note:A3 ]", @@ -3308,34 +3321,34 @@ exports[`runs examples > example "perlin" example index 0 1`] = ` exports[`runs examples > example "phaser" example index 0 1`] = ` [ - "[ 0/1 → 1/8 | note:D3 s:sawtooth release:0.5 phaser:2 ]", - "[ 1/8 → 1/4 | note:E3 s:sawtooth release:0.5 phaser:2 ]", - "[ 1/4 → 3/8 | note:F#3 s:sawtooth release:0.5 phaser:2 ]", - "[ 3/8 → 1/2 | note:A3 s:sawtooth release:0.5 phaser:2 ]", - "[ 1/2 → 5/8 | note:B3 s:sawtooth release:0.5 phaser:8 ]", - "[ 5/8 → 3/4 | note:D4 s:sawtooth release:0.5 phaser:8 ]", - "[ 3/4 → 7/8 | note:E4 s:sawtooth release:0.5 phaser:8 ]", - "[ 7/8 → 1/1 | note:F#4 s:sawtooth release:0.5 phaser:8 ]", + "[ 0/1 → 1/8 | note:D3 s:sawtooth release:0.5 phaser:1 ]", + "[ 1/8 → 1/4 | note:E3 s:sawtooth release:0.5 phaser:1 ]", + "[ 1/4 → 3/8 | note:F#3 s:sawtooth release:0.5 phaser:1 ]", + "[ 3/8 → 1/2 | note:A3 s:sawtooth release:0.5 phaser:1 ]", + "[ 1/2 → 5/8 | note:B3 s:sawtooth release:0.5 phaser:1 ]", + "[ 5/8 → 3/4 | note:D4 s:sawtooth release:0.5 phaser:1 ]", + "[ 3/4 → 7/8 | note:E4 s:sawtooth release:0.5 phaser:1 ]", + "[ 7/8 → 1/1 | note:F#4 s:sawtooth release:0.5 phaser:1 ]", "[ 1/1 → 9/8 | note:D3 s:sawtooth release:0.5 phaser:2 ]", "[ 9/8 → 5/4 | note:E3 s:sawtooth release:0.5 phaser:2 ]", "[ 5/4 → 11/8 | note:F#3 s:sawtooth release:0.5 phaser:2 ]", "[ 11/8 → 3/2 | note:A3 s:sawtooth release:0.5 phaser:2 ]", - "[ 3/2 → 13/8 | note:B3 s:sawtooth release:0.5 phaser:8 ]", - "[ 13/8 → 7/4 | note:D4 s:sawtooth release:0.5 phaser:8 ]", - "[ 7/4 → 15/8 | note:E4 s:sawtooth release:0.5 phaser:8 ]", - "[ 15/8 → 2/1 | note:F#4 s:sawtooth release:0.5 phaser:8 ]", - "[ 2/1 → 17/8 | note:D3 s:sawtooth release:0.5 phaser:2 ]", - "[ 17/8 → 9/4 | note:E3 s:sawtooth release:0.5 phaser:2 ]", - "[ 9/4 → 19/8 | note:F#3 s:sawtooth release:0.5 phaser:2 ]", - "[ 19/8 → 5/2 | note:A3 s:sawtooth release:0.5 phaser:2 ]", - "[ 5/2 → 21/8 | note:B3 s:sawtooth release:0.5 phaser:8 ]", - "[ 21/8 → 11/4 | note:D4 s:sawtooth release:0.5 phaser:8 ]", - "[ 11/4 → 23/8 | note:E4 s:sawtooth release:0.5 phaser:8 ]", - "[ 23/8 → 3/1 | note:F#4 s:sawtooth release:0.5 phaser:8 ]", - "[ 3/1 → 25/8 | note:D3 s:sawtooth release:0.5 phaser:2 ]", - "[ 25/8 → 13/4 | note:E3 s:sawtooth release:0.5 phaser:2 ]", - "[ 13/4 → 27/8 | note:F#3 s:sawtooth release:0.5 phaser:2 ]", - "[ 27/8 → 7/2 | note:A3 s:sawtooth release:0.5 phaser:2 ]", + "[ 3/2 → 13/8 | note:B3 s:sawtooth release:0.5 phaser:2 ]", + "[ 13/8 → 7/4 | note:D4 s:sawtooth release:0.5 phaser:2 ]", + "[ 7/4 → 15/8 | note:E4 s:sawtooth release:0.5 phaser:2 ]", + "[ 15/8 → 2/1 | note:F#4 s:sawtooth release:0.5 phaser:2 ]", + "[ 2/1 → 17/8 | note:D3 s:sawtooth release:0.5 phaser:4 ]", + "[ 17/8 → 9/4 | note:E3 s:sawtooth release:0.5 phaser:4 ]", + "[ 9/4 → 19/8 | note:F#3 s:sawtooth release:0.5 phaser:4 ]", + "[ 19/8 → 5/2 | note:A3 s:sawtooth release:0.5 phaser:4 ]", + "[ 5/2 → 21/8 | note:B3 s:sawtooth release:0.5 phaser:4 ]", + "[ 21/8 → 11/4 | note:D4 s:sawtooth release:0.5 phaser:4 ]", + "[ 11/4 → 23/8 | note:E4 s:sawtooth release:0.5 phaser:4 ]", + "[ 23/8 → 3/1 | note:F#4 s:sawtooth release:0.5 phaser:4 ]", + "[ 3/1 → 25/8 | note:D3 s:sawtooth release:0.5 phaser:8 ]", + "[ 25/8 → 13/4 | note:E3 s:sawtooth release:0.5 phaser:8 ]", + "[ 13/4 → 27/8 | note:F#3 s:sawtooth release:0.5 phaser:8 ]", + "[ 27/8 → 7/2 | note:A3 s:sawtooth release:0.5 phaser:8 ]", "[ 7/2 → 29/8 | note:B3 s:sawtooth release:0.5 phaser:8 ]", "[ 29/8 → 15/4 | note:D4 s:sawtooth release:0.5 phaser:8 ]", "[ 15/4 → 31/8 | note:E4 s:sawtooth release:0.5 phaser:8 ]", @@ -3345,75 +3358,75 @@ exports[`runs examples > example "phaser" example index 0 1`] = ` exports[`runs examples > example "phasercenter" example index 0 1`] = ` [ - "[ 0/1 → 1/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", - "[ 1/8 → 1/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", - "[ 1/4 → 3/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", - "[ 3/8 → 1/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", - "[ 1/2 → 5/8 | note:B3 s:sawtooth release:0.5 phaser:8 phasercenter:2000 ]", - "[ 5/8 → 3/4 | note:D4 s:sawtooth release:0.5 phaser:8 phasercenter:2000 ]", - "[ 3/4 → 7/8 | note:E4 s:sawtooth release:0.5 phaser:8 phasercenter:2000 ]", - "[ 7/8 → 1/1 | note:F#4 s:sawtooth release:0.5 phaser:8 phasercenter:2000 ]", + "[ 0/1 → 1/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasercenter:800 ]", + "[ 1/8 → 1/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasercenter:800 ]", + "[ 1/4 → 3/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasercenter:800 ]", + "[ 3/8 → 1/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasercenter:800 ]", + "[ 1/2 → 5/8 | note:B3 s:sawtooth release:0.5 phaser:2 phasercenter:800 ]", + "[ 5/8 → 3/4 | note:D4 s:sawtooth release:0.5 phaser:2 phasercenter:800 ]", + "[ 3/4 → 7/8 | note:E4 s:sawtooth release:0.5 phaser:2 phasercenter:800 ]", + "[ 7/8 → 1/1 | note:F#4 s:sawtooth release:0.5 phaser:2 phasercenter:800 ]", "[ 1/1 → 9/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", "[ 9/8 → 5/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", "[ 5/4 → 11/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", "[ 11/8 → 3/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", - "[ 3/2 → 13/8 | note:B3 s:sawtooth release:0.5 phaser:8 phasercenter:2000 ]", - "[ 13/8 → 7/4 | note:D4 s:sawtooth release:0.5 phaser:8 phasercenter:2000 ]", - "[ 7/4 → 15/8 | note:E4 s:sawtooth release:0.5 phaser:8 phasercenter:2000 ]", - "[ 15/8 → 2/1 | note:F#4 s:sawtooth release:0.5 phaser:8 phasercenter:2000 ]", - "[ 2/1 → 17/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", - "[ 17/8 → 9/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", - "[ 9/4 → 19/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", - "[ 19/8 → 5/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", - "[ 5/2 → 21/8 | note:B3 s:sawtooth release:0.5 phaser:8 phasercenter:2000 ]", - "[ 21/8 → 11/4 | note:D4 s:sawtooth release:0.5 phaser:8 phasercenter:2000 ]", - "[ 11/4 → 23/8 | note:E4 s:sawtooth release:0.5 phaser:8 phasercenter:2000 ]", - "[ 23/8 → 3/1 | note:F#4 s:sawtooth release:0.5 phaser:8 phasercenter:2000 ]", - "[ 3/1 → 25/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", - "[ 25/8 → 13/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", - "[ 13/4 → 27/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", - "[ 27/8 → 7/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", - "[ 7/2 → 29/8 | note:B3 s:sawtooth release:0.5 phaser:8 phasercenter:2000 ]", - "[ 29/8 → 15/4 | note:D4 s:sawtooth release:0.5 phaser:8 phasercenter:2000 ]", - "[ 15/4 → 31/8 | note:E4 s:sawtooth release:0.5 phaser:8 phasercenter:2000 ]", - "[ 31/8 → 4/1 | note:F#4 s:sawtooth release:0.5 phaser:8 phasercenter:2000 ]", + "[ 3/2 → 13/8 | note:B3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", + "[ 13/8 → 7/4 | note:D4 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", + "[ 7/4 → 15/8 | note:E4 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", + "[ 15/8 → 2/1 | note:F#4 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]", + "[ 2/1 → 17/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasercenter:4000 ]", + "[ 17/8 → 9/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasercenter:4000 ]", + "[ 9/4 → 19/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasercenter:4000 ]", + "[ 19/8 → 5/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasercenter:4000 ]", + "[ 5/2 → 21/8 | note:B3 s:sawtooth release:0.5 phaser:2 phasercenter:4000 ]", + "[ 21/8 → 11/4 | note:D4 s:sawtooth release:0.5 phaser:2 phasercenter:4000 ]", + "[ 11/4 → 23/8 | note:E4 s:sawtooth release:0.5 phaser:2 phasercenter:4000 ]", + "[ 23/8 → 3/1 | note:F#4 s:sawtooth release:0.5 phaser:2 phasercenter:4000 ]", + "[ 3/1 → 25/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasercenter:800 ]", + "[ 25/8 → 13/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasercenter:800 ]", + "[ 13/4 → 27/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasercenter:800 ]", + "[ 27/8 → 7/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasercenter:800 ]", + "[ 7/2 → 29/8 | note:B3 s:sawtooth release:0.5 phaser:2 phasercenter:800 ]", + "[ 29/8 → 15/4 | note:D4 s:sawtooth release:0.5 phaser:2 phasercenter:800 ]", + "[ 15/4 → 31/8 | note:E4 s:sawtooth release:0.5 phaser:2 phasercenter:800 ]", + "[ 31/8 → 4/1 | note:F#4 s:sawtooth release:0.5 phaser:2 phasercenter:800 ]", ] `; exports[`runs examples > example "phaserdepth" example index 0 1`] = ` [ - "[ 0/1 → 1/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasercenter:200 ]", - "[ 1/8 → 1/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasercenter:200 ]", - "[ 1/4 → 3/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasercenter:200 ]", - "[ 3/8 → 1/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasercenter:200 ]", - "[ 1/2 → 5/8 | note:B3 s:sawtooth release:0.5 phaser:8 phasercenter:200 ]", - "[ 5/8 → 3/4 | note:D4 s:sawtooth release:0.5 phaser:8 phasercenter:200 ]", - "[ 3/4 → 7/8 | note:E4 s:sawtooth release:0.5 phaser:8 phasercenter:200 ]", - "[ 7/8 → 1/1 | note:F#4 s:sawtooth release:0.5 phaser:8 phasercenter:200 ]", - "[ 1/1 → 9/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasercenter:200 ]", - "[ 9/8 → 5/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasercenter:200 ]", - "[ 5/4 → 11/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasercenter:200 ]", - "[ 11/8 → 3/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasercenter:200 ]", - "[ 3/2 → 13/8 | note:B3 s:sawtooth release:0.5 phaser:8 phasercenter:200 ]", - "[ 13/8 → 7/4 | note:D4 s:sawtooth release:0.5 phaser:8 phasercenter:200 ]", - "[ 7/4 → 15/8 | note:E4 s:sawtooth release:0.5 phaser:8 phasercenter:200 ]", - "[ 15/8 → 2/1 | note:F#4 s:sawtooth release:0.5 phaser:8 phasercenter:200 ]", - "[ 2/1 → 17/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasercenter:200 ]", - "[ 17/8 → 9/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasercenter:200 ]", - "[ 9/4 → 19/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasercenter:200 ]", - "[ 19/8 → 5/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasercenter:200 ]", - "[ 5/2 → 21/8 | note:B3 s:sawtooth release:0.5 phaser:8 phasercenter:200 ]", - "[ 21/8 → 11/4 | note:D4 s:sawtooth release:0.5 phaser:8 phasercenter:200 ]", - "[ 11/4 → 23/8 | note:E4 s:sawtooth release:0.5 phaser:8 phasercenter:200 ]", - "[ 23/8 → 3/1 | note:F#4 s:sawtooth release:0.5 phaser:8 phasercenter:200 ]", - "[ 3/1 → 25/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasercenter:200 ]", - "[ 25/8 → 13/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasercenter:200 ]", - "[ 13/4 → 27/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasercenter:200 ]", - "[ 27/8 → 7/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasercenter:200 ]", - "[ 7/2 → 29/8 | note:B3 s:sawtooth release:0.5 phaser:8 phasercenter:200 ]", - "[ 29/8 → 15/4 | note:D4 s:sawtooth release:0.5 phaser:8 phasercenter:200 ]", - "[ 15/4 → 31/8 | note:E4 s:sawtooth release:0.5 phaser:8 phasercenter:200 ]", - "[ 31/8 → 4/1 | note:F#4 s:sawtooth release:0.5 phaser:8 phasercenter:200 ]", + "[ 0/1 → 1/8 | note:D3 s:sawtooth release:0.5 phaser:2 phaserdepth:0 ]", + "[ 1/8 → 1/4 | note:E3 s:sawtooth release:0.5 phaser:2 phaserdepth:0 ]", + "[ 1/4 → 3/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phaserdepth:0 ]", + "[ 3/8 → 1/2 | note:A3 s:sawtooth release:0.5 phaser:2 phaserdepth:0 ]", + "[ 1/2 → 5/8 | note:B3 s:sawtooth release:0.5 phaser:2 phaserdepth:0 ]", + "[ 5/8 → 3/4 | note:D4 s:sawtooth release:0.5 phaser:2 phaserdepth:0 ]", + "[ 3/4 → 7/8 | note:E4 s:sawtooth release:0.5 phaser:2 phaserdepth:0 ]", + "[ 7/8 → 1/1 | note:F#4 s:sawtooth release:0.5 phaser:2 phaserdepth:0 ]", + "[ 1/1 → 9/8 | note:D3 s:sawtooth release:0.5 phaser:2 phaserdepth:0.5 ]", + "[ 9/8 → 5/4 | note:E3 s:sawtooth release:0.5 phaser:2 phaserdepth:0.5 ]", + "[ 5/4 → 11/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phaserdepth:0.5 ]", + "[ 11/8 → 3/2 | note:A3 s:sawtooth release:0.5 phaser:2 phaserdepth:0.5 ]", + "[ 3/2 → 13/8 | note:B3 s:sawtooth release:0.5 phaser:2 phaserdepth:0.5 ]", + "[ 13/8 → 7/4 | note:D4 s:sawtooth release:0.5 phaser:2 phaserdepth:0.5 ]", + "[ 7/4 → 15/8 | note:E4 s:sawtooth release:0.5 phaser:2 phaserdepth:0.5 ]", + "[ 15/8 → 2/1 | note:F#4 s:sawtooth release:0.5 phaser:2 phaserdepth:0.5 ]", + "[ 2/1 → 17/8 | note:D3 s:sawtooth release:0.5 phaser:2 phaserdepth:0.75 ]", + "[ 17/8 → 9/4 | note:E3 s:sawtooth release:0.5 phaser:2 phaserdepth:0.75 ]", + "[ 9/4 → 19/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phaserdepth:0.75 ]", + "[ 19/8 → 5/2 | note:A3 s:sawtooth release:0.5 phaser:2 phaserdepth:0.75 ]", + "[ 5/2 → 21/8 | note:B3 s:sawtooth release:0.5 phaser:2 phaserdepth:0.75 ]", + "[ 21/8 → 11/4 | note:D4 s:sawtooth release:0.5 phaser:2 phaserdepth:0.75 ]", + "[ 11/4 → 23/8 | note:E4 s:sawtooth release:0.5 phaser:2 phaserdepth:0.75 ]", + "[ 23/8 → 3/1 | note:F#4 s:sawtooth release:0.5 phaser:2 phaserdepth:0.75 ]", + "[ 3/1 → 25/8 | note:D3 s:sawtooth release:0.5 phaser:2 phaserdepth:1 ]", + "[ 25/8 → 13/4 | note:E3 s:sawtooth release:0.5 phaser:2 phaserdepth:1 ]", + "[ 13/4 → 27/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phaserdepth:1 ]", + "[ 27/8 → 7/2 | note:A3 s:sawtooth release:0.5 phaser:2 phaserdepth:1 ]", + "[ 7/2 → 29/8 | note:B3 s:sawtooth release:0.5 phaser:2 phaserdepth:1 ]", + "[ 29/8 → 15/4 | note:D4 s:sawtooth release:0.5 phaser:2 phaserdepth:1 ]", + "[ 15/4 → 31/8 | note:E4 s:sawtooth release:0.5 phaser:2 phaserdepth:1 ]", + "[ 31/8 → 4/1 | note:F#4 s:sawtooth release:0.5 phaser:2 phaserdepth:1 ]", ] `; @@ -3423,34 +3436,34 @@ exports[`runs examples > example "phasersweep" example index 0 1`] = ` "[ 1/8 → 1/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", "[ 1/4 → 3/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", "[ 3/8 → 1/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", - "[ 1/2 → 5/8 | note:B3 s:sawtooth release:0.5 phaser:8 phasersweep:800 ]", - "[ 5/8 → 3/4 | note:D4 s:sawtooth release:0.5 phaser:8 phasersweep:800 ]", - "[ 3/4 → 7/8 | note:E4 s:sawtooth release:0.5 phaser:8 phasersweep:800 ]", - "[ 7/8 → 1/1 | note:F#4 s:sawtooth release:0.5 phaser:8 phasersweep:800 ]", - "[ 1/1 → 9/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", - "[ 9/8 → 5/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", - "[ 5/4 → 11/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", - "[ 11/8 → 3/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", - "[ 3/2 → 13/8 | note:B3 s:sawtooth release:0.5 phaser:8 phasersweep:800 ]", - "[ 13/8 → 7/4 | note:D4 s:sawtooth release:0.5 phaser:8 phasersweep:800 ]", - "[ 7/4 → 15/8 | note:E4 s:sawtooth release:0.5 phaser:8 phasersweep:800 ]", - "[ 15/8 → 2/1 | note:F#4 s:sawtooth release:0.5 phaser:8 phasersweep:800 ]", - "[ 2/1 → 17/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", - "[ 17/8 → 9/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", - "[ 9/4 → 19/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", - "[ 19/8 → 5/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", - "[ 5/2 → 21/8 | note:B3 s:sawtooth release:0.5 phaser:8 phasersweep:800 ]", - "[ 21/8 → 11/4 | note:D4 s:sawtooth release:0.5 phaser:8 phasersweep:800 ]", - "[ 11/4 → 23/8 | note:E4 s:sawtooth release:0.5 phaser:8 phasersweep:800 ]", - "[ 23/8 → 3/1 | note:F#4 s:sawtooth release:0.5 phaser:8 phasersweep:800 ]", + "[ 1/2 → 5/8 | note:B3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", + "[ 5/8 → 3/4 | note:D4 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", + "[ 3/4 → 7/8 | note:E4 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", + "[ 7/8 → 1/1 | note:F#4 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", + "[ 1/1 → 9/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasersweep:2000 ]", + "[ 9/8 → 5/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasersweep:2000 ]", + "[ 5/4 → 11/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasersweep:2000 ]", + "[ 11/8 → 3/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasersweep:2000 ]", + "[ 3/2 → 13/8 | note:B3 s:sawtooth release:0.5 phaser:2 phasersweep:2000 ]", + "[ 13/8 → 7/4 | note:D4 s:sawtooth release:0.5 phaser:2 phasersweep:2000 ]", + "[ 7/4 → 15/8 | note:E4 s:sawtooth release:0.5 phaser:2 phasersweep:2000 ]", + "[ 15/8 → 2/1 | note:F#4 s:sawtooth release:0.5 phaser:2 phasersweep:2000 ]", + "[ 2/1 → 17/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasersweep:4000 ]", + "[ 17/8 → 9/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasersweep:4000 ]", + "[ 9/4 → 19/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasersweep:4000 ]", + "[ 19/8 → 5/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasersweep:4000 ]", + "[ 5/2 → 21/8 | note:B3 s:sawtooth release:0.5 phaser:2 phasersweep:4000 ]", + "[ 21/8 → 11/4 | note:D4 s:sawtooth release:0.5 phaser:2 phasersweep:4000 ]", + "[ 11/4 → 23/8 | note:E4 s:sawtooth release:0.5 phaser:2 phasersweep:4000 ]", + "[ 23/8 → 3/1 | note:F#4 s:sawtooth release:0.5 phaser:2 phasersweep:4000 ]", "[ 3/1 → 25/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", "[ 25/8 → 13/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", "[ 13/4 → 27/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", "[ 27/8 → 7/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", - "[ 7/2 → 29/8 | note:B3 s:sawtooth release:0.5 phaser:8 phasersweep:800 ]", - "[ 29/8 → 15/4 | note:D4 s:sawtooth release:0.5 phaser:8 phasersweep:800 ]", - "[ 15/4 → 31/8 | note:E4 s:sawtooth release:0.5 phaser:8 phasersweep:800 ]", - "[ 31/8 → 4/1 | note:F#4 s:sawtooth release:0.5 phaser:8 phasersweep:800 ]", + "[ 7/2 → 29/8 | note:B3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", + "[ 29/8 → 15/4 | note:D4 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", + "[ 15/4 → 31/8 | note:E4 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", + "[ 31/8 → 4/1 | note:F#4 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]", ] `; diff --git a/website/src/pages/learn/effects.mdx b/website/src/pages/learn/effects.mdx index b1323a8e..a3ae91d7 100644 --- a/website/src/pages/learn/effects.mdx +++ b/website/src/pages/learn/effects.mdx @@ -240,3 +240,21 @@ global effects use the same chain for all events of the same orbit: Next, we'll look at strudel's support for [Csound](/learn/csound). + +## Phaser + +### phaser + + + +### phaserdepth + + + +### phasercenter + + + +### phasersweep + + From 858a02634e29e72ef35905c50dfeccc85e43d9ee Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Thu, 9 Nov 2023 08:40:21 +0100 Subject: [PATCH 17/17] dedupe / move supertdirt phaser controls --- packages/core/controls.mjs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index d69b4484..8779c4a9 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -381,6 +381,8 @@ const generic_params = [ */ ['coarse'], + ['phaserrate', 'phasr'], // superdirt only + /** * Phaser audio effect that approximates popular guitar pedals. * @@ -432,7 +434,7 @@ const generic_params = [ * .phaser(2).phaserdepth("<0 .5 .75 1>") * */ - ['phaserdepth', 'phd'], + ['phaserdepth', 'phd', 'phasdp'], // also a superdirt control /** * choose the channel the pattern is sent to in superdirt @@ -1224,9 +1226,6 @@ const generic_params = [ */ ['tremolodepth', 'tremdp'], ['tremolorate', 'tremr'], - // TODO: doesn't seem to do anything - ['phasdp'], - ['phaserrate', 'phasr'], ['fshift'], ['fshiftnote'],