From ec8616a51513229f06f77216d2c4bd771091980d Mon Sep 17 00:00:00 2001 From: Raphael Forment Date: Mon, 4 Sep 2023 04:56:45 +0200 Subject: [PATCH 01/39] Envelope filter and filter order --- packages/superdough/helpers.mjs | 14 ++++++++-- packages/superdough/superdough.mjs | 44 ++++++++++++++++++++++++++---- 2 files changed, 49 insertions(+), 9 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 07e2b121..9ce197e1 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -66,10 +66,18 @@ export const getADSR = (attack, decay, sustain, release, velocity, begin, end) = return gainNode; }; -export const getFilter = (type, frequency, Q) => { - const filter = getAudioContext().createBiquadFilter(); +export function createFilter(context, type, frequency, Q, curve, to, over, t) { + const filter = context.createBiquadFilter(); filter.type = type; filter.frequency.value = frequency; filter.Q.value = Q; + + if (to !== null && over !== null) { + if (curve === 'lin') { + filter.frequency.linearRampToValueAtTime(to, t + over); + } else { + filter.frequency.exponentialRampToValueAtTime(to, t + over); + } + } return filter; -}; +} diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index af22355f..cf3c231e 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -9,7 +9,7 @@ import './reverb.mjs'; import './vowel.mjs'; import { clamp } from './util.mjs'; import workletsUrl from './worklets.mjs?url'; -import { getFilter, gainNode } from './helpers.mjs'; +import { createFilter, gainNode } from './helpers.mjs'; import { map } from 'nanostores'; import { logger } from './logger.mjs'; @@ -177,6 +177,11 @@ export const superdough = async (value, deadline, hapDuration) => { bank, source, gain = 0.8, + // filters + order = 12, + to, + filtenv = 'lin', + over, // low pass cutoff, resonance = 1, @@ -239,11 +244,37 @@ export const superdough = async (value, deadline, hapDuration) => { // gain stage chain.push(gainNode(gain)); - // filters - cutoff !== undefined && chain.push(getFilter('lowpass', cutoff, resonance)); - hcutoff !== undefined && chain.push(getFilter('highpass', hcutoff, hresonance)); - bandf !== undefined && chain.push(getFilter('bandpass', bandf, bandq)); - vowel !== undefined && chain.push(ac.createVowelFilter(vowel)); + if (cutoff !== undefined) { + const filter1 = createFilter(ac, 'lowpass', cutoff, resonance, filtenv, to || cutoff, over || hapDuration, t); + chain.push(filter1); + if (order === 24) { + const filter2 = createFilter(ac, 'lowpass', cutoff, resonance, filtenv, to || cutoff, over || hapDuration, t); + chain.push(filter2); + } + } + + if (hcutoff !== undefined) { + const filter1 = createFilter(ac, 'highpass', hcutoff, hresonance, filtenv, to || hcutoff, over || hapDuration, t); + chain.push(filter1); + if (order === 24) { + const filter2 = createFilter(ac, 'highpass', hcutoff, hresonance, filtenv, to || hcutoff, over || hapDuration, t); + chain.push(filter2); + } + } + + if (bandf !== undefined) { + const filter1 = createFilter(ac, 'bandpass', bandf, bandq, filtenv, to || bandf, over || hapDuration, t); + chain.push(filter1); + if (order === 24) { + const filter2 = createFilter(ac, 'bandpass', bandf, bandq, filtenv, to || bandf, over || hapDuration, t); + chain.push(filter2); + } + } + + if (vowel !== undefined) { + const vowelFilter = ac.createVowelFilter(vowel); + chain.push(vowelFilter); + } // effects coarse !== undefined && chain.push(getWorklet(ac, 'coarse-processor', { coarse })); @@ -282,6 +313,7 @@ export const superdough = async (value, deadline, hapDuration) => { analyserSend = effectSend(post, analyserNode, analyze); } + console.log(chain); // connect chain elements together chain.slice(1).reduce((last, current) => last.connect(current), chain[0]); From 5be78985227ede43217fd848f44c3ea2e19e5e88 Mon Sep 17 00:00:00 2001 From: Raphael Forment Date: Mon, 4 Sep 2023 21:17:16 +0200 Subject: [PATCH 02/39] New technique using ADSR envelope --- packages/superdough/helpers.mjs | 16 ++++--- packages/superdough/superdough.mjs | 76 +++++++++++++++++++++++++----- 2 files changed, 72 insertions(+), 20 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 9ce197e1..4fda54eb 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -66,18 +66,20 @@ export const getADSR = (attack, decay, sustain, release, velocity, begin, end) = return gainNode; }; -export function createFilter(context, type, frequency, Q, curve, to, over, t) { +export function createFilter(context, type, frequency, Q, attack, decay, sustain, release, fenvmod, t) { const filter = context.createBiquadFilter(); filter.type = type; filter.frequency.value = frequency; filter.Q.value = Q; - if (to !== null && over !== null) { - if (curve === 'lin') { - filter.frequency.linearRampToValueAtTime(to, t + over); - } else { - filter.frequency.exponentialRampToValueAtTime(to, t + over); - } + // Apply ADSR to filter frequency + if (fenvmod > 0) { + const sustainFreq = sustain * frequency; + filter.frequency.linearRampToValueAtTime(frequency * fenvmod, t + attack); + filter.frequency.linearRampToValueAtTime(sustainFreq, t + attack + decay); + filter.frequency.setValueAtTime(sustainFreq, end); + filter.frequency.linearRampToValueAtTime(frequency, end + release); } + return filter; } diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index cf3c231e..6605662a 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -178,18 +178,32 @@ export const superdough = async (value, deadline, hapDuration) => { source, gain = 0.8, // filters - order = 12, - to, - filtenv = 'lin', - over, + order = '12db', + fenvmod = 2, // low pass + lpattack, + lpdecay, + lpsustain, + lprelease, cutoff, resonance = 1, // high pass + hpattack, + hpdecay, + hpsustain, + hprelease, hcutoff, hresonance = 1, + // full adsr for filter + lpadsr, + hpadsr, + bpadsr, // band pass bandf, + bpattack, + bpdecay, + bpsustain, + bprelease, bandq = 1, // coarse, @@ -215,6 +229,9 @@ export const superdough = async (value, deadline, hapDuration) => { if (bank && s) { s = `${bank}_${s}`; } + lpadsr && (lpattack = lpadsr[0]) && (lpdecay = lpadsr[1]) && (lpsustain = lpadsr[2]) && (lprelease = lpadsr[3]); + bpadsr && (bpattack = bpadsr[0]) && (bpdecay = bpadsr[1]) && (bpsustain = bpadsr[2]) && (bprelease = bpadsr[3]); + hpadsr && (hpattack = hpadsr[0]) && (hpdecay = hpadsr[1]) && (hpsustain = hpadsr[2]) && (hprelease = hpadsr[3]); // get source AudioNode let sourceNode; if (source) { @@ -245,28 +262,61 @@ export const superdough = async (value, deadline, hapDuration) => { chain.push(gainNode(gain)); if (cutoff !== undefined) { - const filter1 = createFilter(ac, 'lowpass', cutoff, resonance, filtenv, to || cutoff, over || hapDuration, t); + const filter1 = createFilter(ac, 'lowpass', cutoff, resonance, lpattack, lpdecay, lpsustain, lprelease, fmodenv, t); chain.push(filter1); - if (order === 24) { - const filter2 = createFilter(ac, 'lowpass', cutoff, resonance, filtenv, to || cutoff, over || hapDuration, t); + if (order === '24db') { + const filter2 = createFilter( + ac, + 'lowpass', + cutoff, + resonance, + lpattack, + lpdecay, + lpsustain, + lprelease, + fmodenv, + t, + ); chain.push(filter2); } } if (hcutoff !== undefined) { - const filter1 = createFilter(ac, 'highpass', hcutoff, hresonance, filtenv, to || hcutoff, over || hapDuration, t); + const filter1 = createFilter( + ac, + 'highpass', + hcutoff, + hresonance, + hpattack, + hpdecay, + hpsustain, + hprelease, + fenvmod, + t, + ); chain.push(filter1); - if (order === 24) { - const filter2 = createFilter(ac, 'highpass', hcutoff, hresonance, filtenv, to || hcutoff, over || hapDuration, t); + if (order === '24db') { + const filter2 = createFilter( + ac, + 'highpass', + hcutoff, + hresonance, + hpattack, + hpdecay, + hpsustain, + hprelease, + fenvmod, + t, + ); chain.push(filter2); } } if (bandf !== undefined) { - const filter1 = createFilter(ac, 'bandpass', bandf, bandq, filtenv, to || bandf, over || hapDuration, t); + const filter1 = createFilter(ac, 'bandpass', bandf, bandq, bpattack, bpdecay, bpsustain, bprelease, fenvmod, t); chain.push(filter1); - if (order === 24) { - const filter2 = createFilter(ac, 'bandpass', bandf, bandq, filtenv, to || bandf, over || hapDuration, t); + if (order === '24db') { + const filter2 = createFilter(ac, 'bandpass', bandf, bandq, bpattack, bpdecay, bpsustain, bprelease, fenvmod, t); chain.push(filter2); } } From 4319df0cb62b8ac3964a5dcfcf612b00532247c7 Mon Sep 17 00:00:00 2001 From: Raphael Forment Date: Mon, 4 Sep 2023 21:24:42 +0200 Subject: [PATCH 03/39] replace odd envelope --- packages/superdough/helpers.mjs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 4fda54eb..22f84048 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -74,11 +74,8 @@ export function createFilter(context, type, frequency, Q, attack, decay, sustain // Apply ADSR to filter frequency if (fenvmod > 0) { - const sustainFreq = sustain * frequency; - filter.frequency.linearRampToValueAtTime(frequency * fenvmod, t + attack); - filter.frequency.linearRampToValueAtTime(sustainFreq, t + attack + decay); - filter.frequency.setValueAtTime(sustainFreq, end); - filter.frequency.linearRampToValueAtTime(frequency, end + release); + const gainNode = getADSR(attack, decay, sustain, release, fenvmod, t, t + attack + decay + release); + gainNode.connect(filter.frequency); } return filter; From 37842d4fbde955bbf9f4c3594da6e12351f51938 Mon Sep 17 00:00:00 2001 From: Raphael Forment Date: Tue, 5 Sep 2023 09:01:04 +0200 Subject: [PATCH 04/39] Revert "replace odd envelope" This reverts commit 4319df0cb62b8ac3964a5dcfcf612b00532247c7. --- packages/superdough/helpers.mjs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 22f84048..4fda54eb 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -74,8 +74,11 @@ export function createFilter(context, type, frequency, Q, attack, decay, sustain // Apply ADSR to filter frequency if (fenvmod > 0) { - const gainNode = getADSR(attack, decay, sustain, release, fenvmod, t, t + attack + decay + release); - gainNode.connect(filter.frequency); + const sustainFreq = sustain * frequency; + filter.frequency.linearRampToValueAtTime(frequency * fenvmod, t + attack); + filter.frequency.linearRampToValueAtTime(sustainFreq, t + attack + decay); + filter.frequency.setValueAtTime(sustainFreq, end); + filter.frequency.linearRampToValueAtTime(frequency, end + release); } return filter; From 16c8dcf788dc18246e276937926208808e6cd1b3 Mon Sep 17 00:00:00 2001 From: Raphael Forment Date: Tue, 5 Sep 2023 09:56:49 +0200 Subject: [PATCH 05/39] stable version --- packages/superdough/helpers.mjs | 28 +++++++++--- packages/superdough/superdough.mjs | 68 ++++++++++-------------------- 2 files changed, 44 insertions(+), 52 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 4fda54eb..f28fcfae 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -66,19 +66,33 @@ export const getADSR = (attack, decay, sustain, release, velocity, begin, end) = return gainNode; }; -export function createFilter(context, type, frequency, Q, attack, decay, sustain, release, fenvmod, t) { +export const getParamADSR = (param, attack, decay, sustain, release, velocity, begin, end) => { + param.setValueAtTime(0, begin); + param.linearRampToValueAtTime(velocity, begin + attack); + param.linearRampToValueAtTime(sustain * velocity, begin + attack + decay); + param.setValueAtTime(sustain * velocity, end); + param.linearRampToValueAtTime(0, end + release - 0.1); +}; + +export function createFilter(context, type, frequency, Q, attack, decay, sustain, release, fenv, t) { const filter = context.createBiquadFilter(); filter.type = type; filter.frequency.value = frequency; filter.Q.value = Q; // Apply ADSR to filter frequency - if (fenvmod > 0) { - const sustainFreq = sustain * frequency; - filter.frequency.linearRampToValueAtTime(frequency * fenvmod, t + attack); - filter.frequency.linearRampToValueAtTime(sustainFreq, t + attack + decay); - filter.frequency.setValueAtTime(sustainFreq, end); - filter.frequency.linearRampToValueAtTime(frequency, end + release); + if (fenv > 0) { + const envelope = getParamADSR( + filter.frequency, + attack, + decay, + sustain, + release, + frequency * fenv > 22000 ? 22000 : frequency * fenv, + t, + t + attack + decay + release, + ); + return filter; } return filter; diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 6605662a..b5c55b0a 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -179,32 +179,32 @@ export const superdough = async (value, deadline, hapDuration) => { gain = 0.8, // filters order = '12db', - fenvmod = 2, + fenv, // low pass - lpattack, - lpdecay, - lpsustain, - lprelease, cutoff, + lpattack = 0.01, + lpdecay = 0.5, + lpsustain = 0.6, + lprelease = 0.01, resonance = 1, // high pass - hpattack, - hpdecay, - hpsustain, - hprelease, hcutoff, + hpattack = 0.01, + hpdecay = 0.5, + hpsustain = 0.6, + hprelease = 0.01, hresonance = 1, + // band pass + bandf, + bpattack = 0.01, + bpdecay = 0.5, + bpsustain = 0.6, + bprelease = 0.01, + bandq = 1, // full adsr for filter lpadsr, hpadsr, bpadsr, - // band pass - bandf, - bpattack, - bpdecay, - bpsustain, - bprelease, - bandq = 1, // coarse, crush, @@ -230,8 +230,8 @@ export const superdough = async (value, deadline, hapDuration) => { s = `${bank}_${s}`; } lpadsr && (lpattack = lpadsr[0]) && (lpdecay = lpadsr[1]) && (lpsustain = lpadsr[2]) && (lprelease = lpadsr[3]); - bpadsr && (bpattack = bpadsr[0]) && (bpdecay = bpadsr[1]) && (bpsustain = bpadsr[2]) && (bprelease = bpadsr[3]); hpadsr && (hpattack = hpadsr[0]) && (hpdecay = hpadsr[1]) && (hpsustain = hpadsr[2]) && (hprelease = hpadsr[3]); + bpadsr && (bpattack = bpadsr[0]) && (bpdecay = bpadsr[1]) && (bpsustain = bpadsr[2]) && (bprelease = bpadsr[3]); // get source AudioNode let sourceNode; if (source) { @@ -262,38 +262,16 @@ export const superdough = async (value, deadline, hapDuration) => { chain.push(gainNode(gain)); if (cutoff !== undefined) { - const filter1 = createFilter(ac, 'lowpass', cutoff, resonance, lpattack, lpdecay, lpsustain, lprelease, fmodenv, t); + const filter1 = createFilter(ac, 'lowpass', cutoff, resonance, lpattack, lpdecay, lpsustain, lprelease, fenv, t); chain.push(filter1); if (order === '24db') { - const filter2 = createFilter( - ac, - 'lowpass', - cutoff, - resonance, - lpattack, - lpdecay, - lpsustain, - lprelease, - fmodenv, - t, - ); + const filter2 = createFilter(ac, 'lowpass', cutoff, resonance, lpattack, lpdecay, lpsustain, lprelease, fenv, t); chain.push(filter2); } } if (hcutoff !== undefined) { - const filter1 = createFilter( - ac, - 'highpass', - hcutoff, - hresonance, - hpattack, - hpdecay, - hpsustain, - hprelease, - fenvmod, - t, - ); + const filter1 = createFilter(ac, 'highpass', hcutoff, hresonance, hpattack, hpdecay, hpsustain, hprelease, fenv, t); chain.push(filter1); if (order === '24db') { const filter2 = createFilter( @@ -305,7 +283,7 @@ export const superdough = async (value, deadline, hapDuration) => { hpdecay, hpsustain, hprelease, - fenvmod, + fenv, t, ); chain.push(filter2); @@ -313,10 +291,10 @@ export const superdough = async (value, deadline, hapDuration) => { } if (bandf !== undefined) { - const filter1 = createFilter(ac, 'bandpass', bandf, bandq, bpattack, bpdecay, bpsustain, bprelease, fenvmod, t); + const filter1 = createFilter(ac, 'bandpass', bandf, bandq, bpattack, bpdecay, bpsustain, bprelease, fenv, t); chain.push(filter1); if (order === '24db') { - const filter2 = createFilter(ac, 'bandpass', bandf, bandq, bpattack, bpdecay, bpsustain, bprelease, fenvmod, t); + const filter2 = createFilter(ac, 'bandpass', bandf, bandq, bpattack, bpdecay, bpsustain, bprelease, fenv, t); chain.push(filter2); } } From e597b6473d47c3914964b66097c0367b1eda4536 Mon Sep 17 00:00:00 2001 From: Raphael Forment Date: Tue, 5 Sep 2023 10:44:41 +0200 Subject: [PATCH 06/39] remove test console log statement --- packages/superdough/superdough.mjs | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index b5c55b0a..8e4a0148 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -341,7 +341,6 @@ export const superdough = async (value, deadline, hapDuration) => { analyserSend = effectSend(post, analyserNode, analyze); } - console.log(chain); // connect chain elements together chain.slice(1).reduce((last, current) => last.connect(current), chain[0]); From e2711ba911c2faffc70d04527b8c69134db813f3 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Fri, 8 Sep 2023 01:40:10 +0200 Subject: [PATCH 07/39] fix: filter envelopes + simplify --- packages/superdough/helpers.mjs | 16 +++++++------- packages/superdough/superdough.mjs | 35 +++++++++++++----------------- 2 files changed, 23 insertions(+), 28 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index f28fcfae..15c81522 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -66,15 +66,15 @@ export const getADSR = (attack, decay, sustain, release, velocity, begin, end) = return gainNode; }; -export const getParamADSR = (param, attack, decay, sustain, release, velocity, begin, end) => { +export const getParamADSR = (param, attack, decay, sustain, release, max, begin, end) => { param.setValueAtTime(0, begin); - param.linearRampToValueAtTime(velocity, begin + attack); - param.linearRampToValueAtTime(sustain * velocity, begin + attack + decay); - param.setValueAtTime(sustain * velocity, end); - param.linearRampToValueAtTime(0, end + release - 0.1); + param.linearRampToValueAtTime(max, begin + attack); + param.linearRampToValueAtTime(sustain * max, begin + attack + decay); + param.setValueAtTime(sustain * max, end); + param.linearRampToValueAtTime(0, end + release); }; -export function createFilter(context, type, frequency, Q, attack, decay, sustain, release, fenv, t) { +export function createFilter(context, type, frequency, Q, attack, decay, sustain, release, fenv, start, end) { const filter = context.createBiquadFilter(); filter.type = type; filter.frequency.value = frequency; @@ -89,8 +89,8 @@ export function createFilter(context, type, frequency, Q, attack, decay, sustain sustain, release, frequency * fenv > 22000 ? 22000 : frequency * fenv, - t, - t + attack + decay + release, + start, + end + release, ); return filter; } diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 8e4a0148..cddddbb4 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -201,10 +201,6 @@ export const superdough = async (value, deadline, hapDuration) => { bpsustain = 0.6, bprelease = 0.01, bandq = 1, - // full adsr for filter - lpadsr, - hpadsr, - bpadsr, // coarse, crush, @@ -229,9 +225,6 @@ export const superdough = async (value, deadline, hapDuration) => { if (bank && s) { s = `${bank}_${s}`; } - lpadsr && (lpattack = lpadsr[0]) && (lpdecay = lpadsr[1]) && (lpsustain = lpadsr[2]) && (lprelease = lpadsr[3]); - hpadsr && (hpattack = hpadsr[0]) && (hpdecay = hpadsr[1]) && (hpsustain = hpadsr[2]) && (hprelease = hpadsr[3]); - bpadsr && (bpattack = bpadsr[0]) && (bpdecay = bpadsr[1]) && (bpsustain = bpadsr[2]) && (bprelease = bpadsr[3]); // get source AudioNode let sourceNode; if (source) { @@ -262,19 +255,18 @@ export const superdough = async (value, deadline, hapDuration) => { chain.push(gainNode(gain)); if (cutoff !== undefined) { - const filter1 = createFilter(ac, 'lowpass', cutoff, resonance, lpattack, lpdecay, lpsustain, lprelease, fenv, t); - chain.push(filter1); + console.log('lpattack', lpattack); + let lp = () => + createFilter(ac, 'lowpass', cutoff, resonance, lpattack, lpdecay, lpsustain, lprelease, fenv, t, t + hapDuration); + chain.push(lp()); if (order === '24db') { - const filter2 = createFilter(ac, 'lowpass', cutoff, resonance, lpattack, lpdecay, lpsustain, lprelease, fenv, t); - chain.push(filter2); + chain.push(lp()); } } if (hcutoff !== undefined) { - const filter1 = createFilter(ac, 'highpass', hcutoff, hresonance, hpattack, hpdecay, hpsustain, hprelease, fenv, t); - chain.push(filter1); - if (order === '24db') { - const filter2 = createFilter( + let hp = () => + createFilter( ac, 'highpass', hcutoff, @@ -285,17 +277,20 @@ export const superdough = async (value, deadline, hapDuration) => { hprelease, fenv, t, + t + hapDuration, ); - chain.push(filter2); + chain.push(hp()); + if (order === '24db') { + chain.push(hp()); } } if (bandf !== undefined) { - const filter1 = createFilter(ac, 'bandpass', bandf, bandq, bpattack, bpdecay, bpsustain, bprelease, fenv, t); - chain.push(filter1); + let bp = () => + createFilter(ac, 'bandpass', bandf, bandq, bpattack, bpdecay, bpsustain, bprelease, fenv, t, t + hapDuration); + chain.push(bp()); if (order === '24db') { - const filter2 = createFilter(ac, 'bandpass', bandf, bandq, bpattack, bpdecay, bpsustain, bprelease, fenv, t); - chain.push(filter2); + chain.push(bp()); } } From 75a974643b16cb37541a577a3263b8038da70de4 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Fri, 8 Sep 2023 01:41:11 +0200 Subject: [PATCH 08/39] add missing controls --- packages/core/controls.mjs | 13 +++++++++++++ packages/superdough/superdough.mjs | 1 - 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 71f58427..ce08fc68 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -377,6 +377,19 @@ const generic_params = [ * */ [['cutoff', 'resonance'], 'ctf', 'lpf', 'lp'], + ['fenv'], + ['lpattack', 'lpa'], + ['lpdecay', 'lpd'], + ['lpsustain', 'lps'], + ['lprelease', 'lpr'], + ['hpattack', 'hpa'], + ['hpdecay', 'hpd'], + ['hpsustain', 'hps'], + ['hprelease', 'hpr'], + ['bpattack', 'bpa'], + ['bpdecay', 'bpd'], + ['bpsustain', 'bps'], + ['bprelease', 'bpr'], /** * Applies the cutoff frequency of the **h**igh-**p**ass **f**ilter. * diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index cddddbb4..f17c277e 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -255,7 +255,6 @@ export const superdough = async (value, deadline, hapDuration) => { chain.push(gainNode(gain)); if (cutoff !== undefined) { - console.log('lpattack', lpattack); let lp = () => createFilter(ac, 'lowpass', cutoff, resonance, lpattack, lpdecay, lpsustain, lprelease, fenv, t, t + hapDuration); chain.push(lp()); From 9e4c548c694d0f6e7cb564bd93916549e2f4df21 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Fri, 8 Sep 2023 02:06:03 +0200 Subject: [PATCH 09/39] fix: filter clicks --- packages/superdough/helpers.mjs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 15c81522..a1a0f708 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -77,7 +77,6 @@ export const getParamADSR = (param, attack, decay, sustain, release, max, begin, export function createFilter(context, type, frequency, Q, attack, decay, sustain, release, fenv, start, end) { const filter = context.createBiquadFilter(); filter.type = type; - filter.frequency.value = frequency; filter.Q.value = Q; // Apply ADSR to filter frequency @@ -88,11 +87,13 @@ export function createFilter(context, type, frequency, Q, attack, decay, sustain decay, sustain, release, - frequency * fenv > 22000 ? 22000 : frequency * fenv, + Math.min(frequency * fenv, 20000), start, end + release, ); return filter; + } else { + filter.frequency.value = frequency; } return filter; From 606dcc8cc3c952812ba1783f757ceccf6c73334c Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Fri, 8 Sep 2023 02:27:28 +0200 Subject: [PATCH 10/39] use fenv to scale above base cutoff? --- packages/superdough/helpers.mjs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index a1a0f708..12c6f08c 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -66,12 +66,13 @@ export const getADSR = (attack, decay, sustain, release, velocity, begin, end) = return gainNode; }; -export const getParamADSR = (param, attack, decay, sustain, release, max, begin, end) => { - param.setValueAtTime(0, begin); - param.linearRampToValueAtTime(max, begin + attack); - param.linearRampToValueAtTime(sustain * max, begin + attack + decay); - param.setValueAtTime(sustain * max, end); - param.linearRampToValueAtTime(0, end + release); +export const getParamADSR = (param, attack, decay, sustain, release, min, max, begin, end) => { + const range = max - min; + param.setValueAtTime(min, begin); + param.linearRampToValueAtTime(min + range, begin + attack); + param.linearRampToValueAtTime(min + sustain * range, begin + attack + decay); + param.setValueAtTime(min + sustain * range, end); + param.linearRampToValueAtTime(min, end + release); }; export function createFilter(context, type, frequency, Q, attack, decay, sustain, release, fenv, start, end) { @@ -87,7 +88,8 @@ export function createFilter(context, type, frequency, Q, attack, decay, sustain decay, sustain, release, - Math.min(frequency * fenv, 20000), + frequency, + Math.min(frequency + 200 * 2 ** fenv, 20000), start, end + release, ); From 48753b2539bb756a51ca43221ffa02954cd69cd9 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Fri, 8 Sep 2023 02:53:08 +0200 Subject: [PATCH 11/39] fix last crack? --- packages/superdough/helpers.mjs | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 12c6f08c..d58f2355 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -68,10 +68,12 @@ export const getADSR = (attack, decay, sustain, release, velocity, begin, end) = export const getParamADSR = (param, attack, decay, sustain, release, min, max, begin, end) => { const range = max - min; + const peak = min + range; + const sustainLevel = min + sustain * range; param.setValueAtTime(min, begin); - param.linearRampToValueAtTime(min + range, begin + attack); - param.linearRampToValueAtTime(min + sustain * range, begin + attack + decay); - param.setValueAtTime(min + sustain * range, end); + param.linearRampToValueAtTime(peak, begin + attack); + param.linearRampToValueAtTime(sustainLevel, begin + attack + decay); + param.setValueAtTime(sustainLevel, end); param.linearRampToValueAtTime(min, end + release); }; @@ -79,23 +81,15 @@ export function createFilter(context, type, frequency, Q, attack, decay, sustain const filter = context.createBiquadFilter(); filter.type = type; filter.Q.value = Q; + frequency = Math.max(frequency, 20); + filter.frequency.value = frequency; // Apply ADSR to filter frequency if (fenv > 0) { - const envelope = getParamADSR( - filter.frequency, - attack, - decay, - sustain, - release, - frequency, - Math.min(frequency + 200 * 2 ** fenv, 20000), - start, - end + release, - ); + const min = frequency; + const max = Math.min(frequency + 200 * 2 ** fenv, 20000); + getParamADSR(filter.frequency, attack, decay, sustain, release, min, max, start, end); return filter; - } else { - filter.frequency.value = frequency; } return filter; From 18640d59daca002cc8260f46cffcb9915bcc40aa Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Fri, 8 Sep 2023 03:00:49 +0200 Subject: [PATCH 12/39] acid party --- packages/core/controls.mjs | 1 + packages/superdough/helpers.mjs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index ce08fc68..268638cb 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -390,6 +390,7 @@ const generic_params = [ ['bpdecay', 'bpd'], ['bpsustain', 'bps'], ['bprelease', 'bpr'], + ['order'], /** * Applies the cutoff frequency of the **h**igh-**p**ass **f**ilter. * diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index d58f2355..45162a36 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -74,7 +74,7 @@ export const getParamADSR = (param, attack, decay, sustain, release, min, max, b param.linearRampToValueAtTime(peak, begin + attack); param.linearRampToValueAtTime(sustainLevel, begin + attack + decay); param.setValueAtTime(sustainLevel, end); - param.linearRampToValueAtTime(min, end + release); + param.linearRampToValueAtTime(min, end + Math.max(release, 0.1)); }; export function createFilter(context, type, frequency, Q, attack, decay, sustain, release, fenv, start, end) { From c5fb247de6dd7440fea1cfbf00922c5598040d97 Mon Sep 17 00:00:00 2001 From: Raphael Forment Date: Fri, 8 Sep 2023 12:38:39 +0200 Subject: [PATCH 13/39] Documentation for filter envelope --- packages/core/controls.mjs | 51 +++++++++++++++++++++++++++++ website/src/pages/learn/effects.mdx | 41 +++++++++++++++++++++++ 2 files changed, 92 insertions(+) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 268638cb..84b7526d 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -377,10 +377,61 @@ const generic_params = [ * */ [['cutoff', 'resonance'], 'ctf', 'lpf', 'lp'], + + /** + * Sets the filter envelope modulation depth. + * @name fenv + * @param {number | Pattern} modulation depth of the filter envelope between 0 and _n_ + * @example + * note("c2 c3").fast(2).sound("sawtooth") + * .cutoff(500).fenv("<1 2 3 4 5 6 7 8>") + */ ['fenv'], + /** + * Sets the attack duration for the lowpass filter envelope. + * @name lpattack + * @param {number | Pattern} attack time of the filter envelope + * @synonyms lpa + * @example + * note("c3 e3 f3 g3 ab3 bb3") + * .sound('square').cutoff(1000) + * .lpattack("<0.05 0.1 0.25 0.5>/2").fenv(1) + * .release(0.2).attack(0) + */ ['lpattack', 'lpa'], + /** + * Sets the decay duration for the lowpass filter envelope. + * @name lpdecay + * @param {number | Pattern} decay time of the filter envelope + * @synonyms lpd + * @example + * "baba" + * note("c3 e3 f3 g3 ab3 bb3") + * .sound('square').cutoff(1000) + * .lpdecay("<0.05 0.1 0.125>/2") + * .fenv("4").lps(0).lpr(0) + */ ['lpdecay', 'lpd'], + /** + * Sets the sustain amplitude for the lowpass filter envelope. + * @name lpsustain + * @param {number | Pattern} sustain amplitude of the filter envelope + * @synonyms lps + * @example + * note("c3 e3 f3 g3 ab3 bb3") + * .sound('square').cutoff(200) + * .lpd(0.1).lpsustain("<0.1 0.5 0.75 1>") + * .fenv("2") + */ ['lpsustain', 'lps'], + /** + * Sets the release time for the lowpass filter envelope. + * @name lprelease + * @param {number | Pattern} release time of the filter envelope + * @synonyms lpr + * @example + * note("c3 e3 g3 c4").lpr("<0.1 0.25 0.5>").fenv(0.5) + */ ['lprelease', 'lpr'], ['hpattack', 'hpa'], ['hpdecay', 'hpd'], diff --git a/website/src/pages/learn/effects.mdx b/website/src/pages/learn/effects.mdx index 12e57846..31562f98 100644 --- a/website/src/pages/learn/effects.mdx +++ b/website/src/pages/learn/effects.mdx @@ -78,6 +78,47 @@ Strudel uses ADSR envelopes, which are probably the most common way to describe +# Filter Envelope + +Each filter can receive an additional filter envelope controlling the cutoff value dynamically. It uses an ADSR envelope similar to the one used for amplitude. There is an additional parameter to control the depth of the filter modulation: `fenv`. This allows you to play subtle or huge filter modulations just the same by only increasing or decreasing the depth. + +There is one filter envelope for each filter type and thus one set of envelope filter parameters preceded either by `lp`, `hp` or `bp`: + +- `lpattack`, `lpdecay`, `lpsustain`, `lprelease`: filter envelope for the lowpass filter. + - alternatively: `lpa`, `lpd`, `lps` and `lpr`. +- `hpattack`, `hpdecay`, `hpsustain`, `hprelease`: filter envelope for the highpass filter. + - alternatively: `hpa`, `hpd`, `hps` and `hpr`. +- `bpattack`, `bpdecay`, `bpsustain`, `bprelease`: filter envelope for the bandpass filter. + - alternatively: `bpa`, `bpd`, `bps` and `bpr`. + +## lpattack + +- Also `hpattack` and `bpattack`. + + + +## lpdecay + +- Also `hpdecay` and `bpdecay`. + + + +## lpsustain + +- Also `hpsustain` and `bpsustain`. + + + +## lprelease + +- Also `hprelease` and `bprelease`. + + + +## fenv + + + # Dynamics ## gain From 534e3f7f81394de9b168e95b68ecfab94337f89d Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sun, 10 Sep 2023 00:48:04 +0200 Subject: [PATCH 14/39] add snapshots --- test/__snapshots__/examples.test.mjs.snap | 129 ++++++++++++++++++++++ 1 file changed, 129 insertions(+) diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 60b39c53..8fc41df1 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -1762,6 +1762,27 @@ exports[`runs examples > example "fastGap" example index 0 1`] = ` ] `; +exports[`runs examples > example "fenv" example index 0 1`] = ` +[ + "[ 0/1 → 1/4 | note:c2 s:sawtooth cutoff:500 fenv:1 ]", + "[ 1/4 → 1/2 | note:c3 s:sawtooth cutoff:500 fenv:1 ]", + "[ 1/2 → 3/4 | note:c2 s:sawtooth cutoff:500 fenv:1 ]", + "[ 3/4 → 1/1 | note:c3 s:sawtooth cutoff:500 fenv:1 ]", + "[ 1/1 → 5/4 | note:c2 s:sawtooth cutoff:500 fenv:2 ]", + "[ 5/4 → 3/2 | note:c3 s:sawtooth cutoff:500 fenv:2 ]", + "[ 3/2 → 7/4 | note:c2 s:sawtooth cutoff:500 fenv:2 ]", + "[ 7/4 → 2/1 | note:c3 s:sawtooth cutoff:500 fenv:2 ]", + "[ 2/1 → 9/4 | note:c2 s:sawtooth cutoff:500 fenv:3 ]", + "[ 9/4 → 5/2 | note:c3 s:sawtooth cutoff:500 fenv:3 ]", + "[ 5/2 → 11/4 | note:c2 s:sawtooth cutoff:500 fenv:3 ]", + "[ 11/4 → 3/1 | note:c3 s:sawtooth cutoff:500 fenv:3 ]", + "[ 3/1 → 13/4 | note:c2 s:sawtooth cutoff:500 fenv:4 ]", + "[ 13/4 → 7/2 | note:c3 s:sawtooth cutoff:500 fenv:4 ]", + "[ 7/2 → 15/4 | note:c2 s:sawtooth cutoff:500 fenv:4 ]", + "[ 15/4 → 4/1 | note:c3 s:sawtooth cutoff:500 fenv:4 ]", +] +`; + exports[`runs examples > example "firstOf" example index 0 1`] = ` [ "[ 0/1 → 1/4 | note:g3 ]", @@ -2566,6 +2587,64 @@ exports[`runs examples > example "loopAtCps" example index 0 1`] = ` ] `; +exports[`runs examples > example "lpattack" example index 0 1`] = ` +[ + "[ 0/1 → 1/6 | note:c3 s:square cutoff:1000 lpattack:0.05 fenv:1 release:0.2 attack:0 ]", + "[ 1/6 → 1/3 | note:e3 s:square cutoff:1000 lpattack:0.05 fenv:1 release:0.2 attack:0 ]", + "[ 1/3 → 1/2 | note:f3 s:square cutoff:1000 lpattack:0.05 fenv:1 release:0.2 attack:0 ]", + "[ 1/2 → 2/3 | note:g3 s:square cutoff:1000 lpattack:0.05 fenv:1 release:0.2 attack:0 ]", + "[ 2/3 → 5/6 | note:ab3 s:square cutoff:1000 lpattack:0.05 fenv:1 release:0.2 attack:0 ]", + "[ 5/6 → 1/1 | note:bb3 s:square cutoff:1000 lpattack:0.05 fenv:1 release:0.2 attack:0 ]", + "[ 1/1 → 7/6 | note:c3 s:square cutoff:1000 lpattack:0.05 fenv:1 release:0.2 attack:0 ]", + "[ 7/6 → 4/3 | note:e3 s:square cutoff:1000 lpattack:0.05 fenv:1 release:0.2 attack:0 ]", + "[ 4/3 → 3/2 | note:f3 s:square cutoff:1000 lpattack:0.05 fenv:1 release:0.2 attack:0 ]", + "[ 3/2 → 5/3 | note:g3 s:square cutoff:1000 lpattack:0.05 fenv:1 release:0.2 attack:0 ]", + "[ 5/3 → 11/6 | note:ab3 s:square cutoff:1000 lpattack:0.05 fenv:1 release:0.2 attack:0 ]", + "[ 11/6 → 2/1 | note:bb3 s:square cutoff:1000 lpattack:0.05 fenv:1 release:0.2 attack:0 ]", + "[ 2/1 → 13/6 | note:c3 s:square cutoff:1000 lpattack:0.1 fenv:1 release:0.2 attack:0 ]", + "[ 13/6 → 7/3 | note:e3 s:square cutoff:1000 lpattack:0.1 fenv:1 release:0.2 attack:0 ]", + "[ 7/3 → 5/2 | note:f3 s:square cutoff:1000 lpattack:0.1 fenv:1 release:0.2 attack:0 ]", + "[ 5/2 → 8/3 | note:g3 s:square cutoff:1000 lpattack:0.1 fenv:1 release:0.2 attack:0 ]", + "[ 8/3 → 17/6 | note:ab3 s:square cutoff:1000 lpattack:0.1 fenv:1 release:0.2 attack:0 ]", + "[ 17/6 → 3/1 | note:bb3 s:square cutoff:1000 lpattack:0.1 fenv:1 release:0.2 attack:0 ]", + "[ 3/1 → 19/6 | note:c3 s:square cutoff:1000 lpattack:0.1 fenv:1 release:0.2 attack:0 ]", + "[ 19/6 → 10/3 | note:e3 s:square cutoff:1000 lpattack:0.1 fenv:1 release:0.2 attack:0 ]", + "[ 10/3 → 7/2 | note:f3 s:square cutoff:1000 lpattack:0.1 fenv:1 release:0.2 attack:0 ]", + "[ 7/2 → 11/3 | note:g3 s:square cutoff:1000 lpattack:0.1 fenv:1 release:0.2 attack:0 ]", + "[ 11/3 → 23/6 | note:ab3 s:square cutoff:1000 lpattack:0.1 fenv:1 release:0.2 attack:0 ]", + "[ 23/6 → 4/1 | note:bb3 s:square cutoff:1000 lpattack:0.1 fenv:1 release:0.2 attack:0 ]", +] +`; + +exports[`runs examples > example "lpdecay" example index 0 1`] = ` +[ + "[ 0/1 → 1/6 | note:c3 s:square cutoff:1000 lpdecay:0.05 fenv:4 lpsustain:0 lprelease:0 ]", + "[ 1/6 → 1/3 | note:e3 s:square cutoff:1000 lpdecay:0.05 fenv:4 lpsustain:0 lprelease:0 ]", + "[ 1/3 → 1/2 | note:f3 s:square cutoff:1000 lpdecay:0.05 fenv:4 lpsustain:0 lprelease:0 ]", + "[ 1/2 → 2/3 | note:g3 s:square cutoff:1000 lpdecay:0.05 fenv:4 lpsustain:0 lprelease:0 ]", + "[ 2/3 → 5/6 | note:ab3 s:square cutoff:1000 lpdecay:0.05 fenv:4 lpsustain:0 lprelease:0 ]", + "[ 5/6 → 1/1 | note:bb3 s:square cutoff:1000 lpdecay:0.05 fenv:4 lpsustain:0 lprelease:0 ]", + "[ 1/1 → 7/6 | note:c3 s:square cutoff:1000 lpdecay:0.05 fenv:4 lpsustain:0 lprelease:0 ]", + "[ 7/6 → 4/3 | note:e3 s:square cutoff:1000 lpdecay:0.05 fenv:4 lpsustain:0 lprelease:0 ]", + "[ 4/3 → 3/2 | note:f3 s:square cutoff:1000 lpdecay:0.05 fenv:4 lpsustain:0 lprelease:0 ]", + "[ 3/2 → 5/3 | note:g3 s:square cutoff:1000 lpdecay:0.05 fenv:4 lpsustain:0 lprelease:0 ]", + "[ 5/3 → 11/6 | note:ab3 s:square cutoff:1000 lpdecay:0.05 fenv:4 lpsustain:0 lprelease:0 ]", + "[ 11/6 → 2/1 | note:bb3 s:square cutoff:1000 lpdecay:0.05 fenv:4 lpsustain:0 lprelease:0 ]", + "[ 2/1 → 13/6 | note:c3 s:square cutoff:1000 lpdecay:0.1 fenv:4 lpsustain:0 lprelease:0 ]", + "[ 13/6 → 7/3 | note:e3 s:square cutoff:1000 lpdecay:0.1 fenv:4 lpsustain:0 lprelease:0 ]", + "[ 7/3 → 5/2 | note:f3 s:square cutoff:1000 lpdecay:0.1 fenv:4 lpsustain:0 lprelease:0 ]", + "[ 5/2 → 8/3 | note:g3 s:square cutoff:1000 lpdecay:0.1 fenv:4 lpsustain:0 lprelease:0 ]", + "[ 8/3 → 17/6 | note:ab3 s:square cutoff:1000 lpdecay:0.1 fenv:4 lpsustain:0 lprelease:0 ]", + "[ 17/6 → 3/1 | note:bb3 s:square cutoff:1000 lpdecay:0.1 fenv:4 lpsustain:0 lprelease:0 ]", + "[ 3/1 → 19/6 | note:c3 s:square cutoff:1000 lpdecay:0.1 fenv:4 lpsustain:0 lprelease:0 ]", + "[ 19/6 → 10/3 | note:e3 s:square cutoff:1000 lpdecay:0.1 fenv:4 lpsustain:0 lprelease:0 ]", + "[ 10/3 → 7/2 | note:f3 s:square cutoff:1000 lpdecay:0.1 fenv:4 lpsustain:0 lprelease:0 ]", + "[ 7/2 → 11/3 | note:g3 s:square cutoff:1000 lpdecay:0.1 fenv:4 lpsustain:0 lprelease:0 ]", + "[ 11/3 → 23/6 | note:ab3 s:square cutoff:1000 lpdecay:0.1 fenv:4 lpsustain:0 lprelease:0 ]", + "[ 23/6 → 4/1 | note:bb3 s:square cutoff:1000 lpdecay:0.1 fenv:4 lpsustain:0 lprelease:0 ]", +] +`; + exports[`runs examples > example "lpf" example index 0 1`] = ` [ "[ 0/1 → 1/3 | s:hh cutoff:4000 ]", @@ -2657,6 +2736,56 @@ exports[`runs examples > example "lpq" example index 0 1`] = ` ] `; +exports[`runs examples > example "lprelease" example index 0 1`] = ` +[ + "[ 0/1 → 1/4 | note:c3 lprelease:0.1 fenv:0.5 ]", + "[ 1/4 → 1/2 | note:e3 lprelease:0.1 fenv:0.5 ]", + "[ 1/2 → 3/4 | note:g3 lprelease:0.1 fenv:0.5 ]", + "[ 3/4 → 1/1 | note:c4 lprelease:0.1 fenv:0.5 ]", + "[ 1/1 → 5/4 | note:c3 lprelease:0.25 fenv:0.5 ]", + "[ 5/4 → 3/2 | note:e3 lprelease:0.25 fenv:0.5 ]", + "[ 3/2 → 7/4 | note:g3 lprelease:0.25 fenv:0.5 ]", + "[ 7/4 → 2/1 | note:c4 lprelease:0.25 fenv:0.5 ]", + "[ 2/1 → 9/4 | note:c3 lprelease:0.5 fenv:0.5 ]", + "[ 9/4 → 5/2 | note:e3 lprelease:0.5 fenv:0.5 ]", + "[ 5/2 → 11/4 | note:g3 lprelease:0.5 fenv:0.5 ]", + "[ 11/4 → 3/1 | note:c4 lprelease:0.5 fenv:0.5 ]", + "[ 3/1 → 13/4 | note:c3 lprelease:0.1 fenv:0.5 ]", + "[ 13/4 → 7/2 | note:e3 lprelease:0.1 fenv:0.5 ]", + "[ 7/2 → 15/4 | note:g3 lprelease:0.1 fenv:0.5 ]", + "[ 15/4 → 4/1 | note:c4 lprelease:0.1 fenv:0.5 ]", +] +`; + +exports[`runs examples > example "lpsustain" example index 0 1`] = ` +[ + "[ 0/1 → 1/6 | note:c3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.1 fenv:2 ]", + "[ 1/6 → 1/3 | note:e3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.1 fenv:2 ]", + "[ 1/3 → 1/2 | note:f3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.1 fenv:2 ]", + "[ 1/2 → 2/3 | note:g3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.1 fenv:2 ]", + "[ 2/3 → 5/6 | note:ab3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.1 fenv:2 ]", + "[ 5/6 → 1/1 | note:bb3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.1 fenv:2 ]", + "[ 1/1 → 7/6 | note:c3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.5 fenv:2 ]", + "[ 7/6 → 4/3 | note:e3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.5 fenv:2 ]", + "[ 4/3 → 3/2 | note:f3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.5 fenv:2 ]", + "[ 3/2 → 5/3 | note:g3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.5 fenv:2 ]", + "[ 5/3 → 11/6 | note:ab3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.5 fenv:2 ]", + "[ 11/6 → 2/1 | note:bb3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.5 fenv:2 ]", + "[ 2/1 → 13/6 | note:c3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.75 fenv:2 ]", + "[ 13/6 → 7/3 | note:e3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.75 fenv:2 ]", + "[ 7/3 → 5/2 | note:f3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.75 fenv:2 ]", + "[ 5/2 → 8/3 | note:g3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.75 fenv:2 ]", + "[ 8/3 → 17/6 | note:ab3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.75 fenv:2 ]", + "[ 17/6 → 3/1 | note:bb3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.75 fenv:2 ]", + "[ 3/1 → 19/6 | note:c3 s:square cutoff:200 lpdecay:0.1 lpsustain:1 fenv:2 ]", + "[ 19/6 → 10/3 | note:e3 s:square cutoff:200 lpdecay:0.1 lpsustain:1 fenv:2 ]", + "[ 10/3 → 7/2 | note:f3 s:square cutoff:200 lpdecay:0.1 lpsustain:1 fenv:2 ]", + "[ 7/2 → 11/3 | note:g3 s:square cutoff:200 lpdecay:0.1 lpsustain:1 fenv:2 ]", + "[ 11/3 → 23/6 | note:ab3 s:square cutoff:200 lpdecay:0.1 lpsustain:1 fenv:2 ]", + "[ 23/6 → 4/1 | note:bb3 s:square cutoff:200 lpdecay:0.1 lpsustain:1 fenv:2 ]", +] +`; + exports[`runs examples > example "lrate" example index 0 1`] = ` [ "[ 0/1 → 1/1 | n:0 s:supersquare leslie:1 lrate:1 ]", From bea9a3c2dc31483e1bf5956e5fe0f5d11de2ae7a Mon Sep 17 00:00:00 2001 From: Raphael Forment Date: Sun, 10 Sep 2023 09:28:07 +0200 Subject: [PATCH 15/39] replacing fenv by lpenv, hpenv, bpenv --- packages/superdough/superdough.mjs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index f17c277e..fda26277 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -179,15 +179,16 @@ export const superdough = async (value, deadline, hapDuration) => { gain = 0.8, // filters order = '12db', - fenv, // low pass cutoff, + lpenv, lpattack = 0.01, lpdecay = 0.5, lpsustain = 0.6, lprelease = 0.01, resonance = 1, // high pass + hpenv, hcutoff, hpattack = 0.01, hpdecay = 0.5, @@ -195,6 +196,7 @@ export const superdough = async (value, deadline, hapDuration) => { hprelease = 0.01, hresonance = 1, // band pass + bpenv, bandf, bpattack = 0.01, bpdecay = 0.5, @@ -256,7 +258,7 @@ export const superdough = async (value, deadline, hapDuration) => { if (cutoff !== undefined) { let lp = () => - createFilter(ac, 'lowpass', cutoff, resonance, lpattack, lpdecay, lpsustain, lprelease, fenv, t, t + hapDuration); + createFilter(ac, 'lowpass', cutoff, resonance, lpattack, lpdecay, lpsustain, lprelease, lpenv, t, t + hapDuration); chain.push(lp()); if (order === '24db') { chain.push(lp()); @@ -274,7 +276,7 @@ export const superdough = async (value, deadline, hapDuration) => { hpdecay, hpsustain, hprelease, - fenv, + hpenv, t, t + hapDuration, ); @@ -286,7 +288,7 @@ export const superdough = async (value, deadline, hapDuration) => { if (bandf !== undefined) { let bp = () => - createFilter(ac, 'bandpass', bandf, bandq, bpattack, bpdecay, bpsustain, bprelease, fenv, t, t + hapDuration); + createFilter(ac, 'bandpass', bandf, bandq, bpattack, bpdecay, bpsustain, bprelease, bpenv, t, t + hapDuration); chain.push(bp()); if (order === '24db') { chain.push(bp()); From 1383af62083b280e3c1c9642dc8333ac5cd0d3fb Mon Sep 17 00:00:00 2001 From: Raphael Forment Date: Sun, 10 Sep 2023 09:42:29 +0200 Subject: [PATCH 16/39] documenting filters more + tests --- packages/core/controls.mjs | 139 +++++++- packages/superdough/superdough.mjs | 22 +- test/__snapshots__/examples.test.mjs.snap | 387 ++++++++++++++++++++++ 3 files changed, 526 insertions(+), 22 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 84b7526d..86ec5869 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -379,14 +379,35 @@ const generic_params = [ [['cutoff', 'resonance'], 'ctf', 'lpf', 'lp'], /** - * Sets the filter envelope modulation depth. - * @name fenv - * @param {number | Pattern} modulation depth of the filter envelope between 0 and _n_ + * Sets the lowpass filter envelope modulation depth. + * @name lpenv + * @param {number | Pattern} modulation depth of the lowpass filter envelope between 0 and _n_ + * @synonyms lpe * @example * note("c2 c3").fast(2).sound("sawtooth") - * .cutoff(500).fenv("<1 2 3 4 5 6 7 8>") + * .cutoff(500).lpenv("<1 2 3 4 5 6 7 8>") */ - ['fenv'], + ['lpenv', 'lpe'], + /** + * Sets the highpass filter envelope modulation depth. + * @name hpenv + * @param {number | Pattern} modulation depth of the highpass filter envelope between 0 and _n_ + * @synonyms hpe + * @example + * note("c2 c3").fast(2).sound("sawtooth") + * .hcutoff(500).hpenv("<1 2 3 4 5 6 7 8>") + */ + ['hpenv', 'hpe'], + /** + * Sets the bandpass filter envelope modulation depth. + * @name bpenv + * @param {number | Pattern} modulation depth of the bandpass filter envelope between 0 and _n_ + * @synonyms bpe + * @example + * note("c2 c3").fast(2).sound("sawtooth") + * .bandf(500).bpenv("<1 2 3 4 5 6 7 8>") + */ + ['bpenv', 'bpe'], /** * Sets the attack duration for the lowpass filter envelope. * @name lpattack @@ -395,10 +416,34 @@ const generic_params = [ * @example * note("c3 e3 f3 g3 ab3 bb3") * .sound('square').cutoff(1000) - * .lpattack("<0.05 0.1 0.25 0.5>/2").fenv(1) + * .lpattack("<0.05 0.1 0.25 0.5>/2").ftype('12db') * .release(0.2).attack(0) */ ['lpattack', 'lpa'], + /** + * Sets the attack duration for the highpass filter envelope. + * @name hpattack + * @param {number | Pattern} attack time of the highpass filter envelope + * @synonyms hpa + * @example + * note("c3 e3 f3 g3 ab3 bb3") + * .sound('square').hcutoff(1000) + * .hpattack("<0.05 0.1 0.25 0.5>/2").ftype('12db') + * .release(0.2).attack(0) + */ + ['hpattack', 'hpa'], + /** + * Sets the attack duration for the bandpass filter envelope. + * @name hpattack + * @param {number | Pattern} attack time of the bandpass filter envelope + * @synonyms bpa + * @example + * note("c3 e3 f3 g3 ab3 bb3") + * .sound('square').bandf(1000) + * .bpattack("<0.05 0.1 0.25 0.5>/2").ftype('12db') + * .release(0.2).attack(0) + */ + ['bpattack', 'bpa'], /** * Sets the decay duration for the lowpass filter envelope. * @name lpdecay @@ -409,39 +454,99 @@ const generic_params = [ * note("c3 e3 f3 g3 ab3 bb3") * .sound('square').cutoff(1000) * .lpdecay("<0.05 0.1 0.125>/2") - * .fenv("4").lps(0).lpr(0) + * .ftype("12db").lps(0).lpr(0) */ ['lpdecay', 'lpd'], + /** + * Sets the decay duration for the highpass filter envelope. + * @name hpdecay + * @param {number | Pattern} decay time of the highpass filter envelope + * @synonyms hpd + * @example + * "baba" + * note("c3 e3 f3 g3 ab3 bb3") + * .sound('square').hcutoff(1000) + * .hpdecay("<0.05 0.1 0.125>/2") + * .ftype("12db").hps(0).hpr(0) + */ + ['hpdecay', 'hpd'], + /** + * Sets the decay duration for the bandpass filter envelope. + * @name bpdecay + * @param {number | Pattern} decay time of the bandpass filter envelope + * @synonyms bpd + * @example + * "baba" + * note("c3 e3 f3 g3 ab3 bb3") + * .sound('square').bandf(1000) + * .bpdecay("<0.05 0.1 0.125>/2") + * .ftype("12db").bps(0).bpr(0) + */ + ['bpdecay', 'bpd'], /** * Sets the sustain amplitude for the lowpass filter envelope. * @name lpsustain - * @param {number | Pattern} sustain amplitude of the filter envelope + * @param {number | Pattern} sustain amplitude of the lowpass filter envelope * @synonyms lps * @example * note("c3 e3 f3 g3 ab3 bb3") * .sound('square').cutoff(200) * .lpd(0.1).lpsustain("<0.1 0.5 0.75 1>") - * .fenv("2") + * .ftype("12db") */ ['lpsustain', 'lps'], + /** + * Sets the sustain amplitude for the highpass filter envelope. + * @name lpsustain + * @param {number | Pattern} sustain amplitude of the highpass filter envelope + * @synonyms hps + * @example + * note("c3 e3 f3 g3 ab3 bb3") + * .sound('square').hcutoff(200) + * .hpd(0.1).hpsustain("<0.1 0.5 0.75 1>") + * .ftype("12db") + */ + ['hpsustain', 'hps'], + /** + * Sets the sustain amplitude for the bandpass filter envelope. + * @name lpsustain + * @param {number | Pattern} sustain amplitude of the bandpass filter envelope + * @synonyms bps + * @example + * note("c3 e3 f3 g3 ab3 bb3") + * .sound('square').bandf(200) + * .bpd(0.1).bpsustain("<0.1 0.5 0.75 1>") + * .ftype("12db") + */ + ['bpsustain', 'bps'], /** * Sets the release time for the lowpass filter envelope. * @name lprelease * @param {number | Pattern} release time of the filter envelope * @synonyms lpr * @example - * note("c3 e3 g3 c4").lpr("<0.1 0.25 0.5>").fenv(0.5) + * note("c3 e3 g3 c4").lpr("<0.1 0.25 0.5>").ftype('12db') */ ['lprelease', 'lpr'], - ['hpattack', 'hpa'], - ['hpdecay', 'hpd'], - ['hpsustain', 'hps'], + /** + * Sets the release time for the highpass filter envelope. + * @name lprelease + * @param {number | Pattern} release time of the highpass filter envelope + * @synonyms hpr + * @example + * note("c3 e3 g3 c4").hpr("<0.1 0.25 0.5>").ftype('12db') + */ ['hprelease', 'hpr'], - ['bpattack', 'bpa'], - ['bpdecay', 'bpd'], - ['bpsustain', 'bps'], + /** + * Sets the release time for the bandpass filter envelope. + * @name lprelease + * @param {number | Pattern} release time of the bandpass filter envelope + * @synonyms bpr + * @example + * note("c3 e3 g3 c4").bpr("<0.1 0.25 0.5>").ftype('12db') + */ ['bprelease', 'bpr'], - ['order'], + ['ftype'], /** * Applies the cutoff frequency of the **h**igh-**p**ass **f**ilter. * diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index fda26277..3afe470e 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -178,7 +178,7 @@ export const superdough = async (value, deadline, hapDuration) => { source, gain = 0.8, // filters - order = '12db', + ftype = '12db', // low pass cutoff, lpenv, @@ -258,9 +258,21 @@ export const superdough = async (value, deadline, hapDuration) => { if (cutoff !== undefined) { let lp = () => - createFilter(ac, 'lowpass', cutoff, resonance, lpattack, lpdecay, lpsustain, lprelease, lpenv, t, t + hapDuration); + createFilter( + ac, + 'lowpass', + cutoff, + resonance, + lpattack, + lpdecay, + lpsustain, + lprelease, + lpenv, + t, + t + hapDuration, + ); chain.push(lp()); - if (order === '24db') { + if (ftype === '24db') { chain.push(lp()); } } @@ -281,7 +293,7 @@ export const superdough = async (value, deadline, hapDuration) => { t + hapDuration, ); chain.push(hp()); - if (order === '24db') { + if (ftype === '24db') { chain.push(hp()); } } @@ -290,7 +302,7 @@ export const superdough = async (value, deadline, hapDuration) => { let bp = () => createFilter(ac, 'bandpass', bandf, bandq, bpattack, bpdecay, bpsustain, bprelease, bpenv, t, t + hapDuration); chain.push(bp()); - if (order === '24db') { + if (ftype === '24db') { chain.push(bp()); } } diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 60b39c53..4cb261ae 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -900,6 +900,56 @@ exports[`runs examples > example "begin" example index 0 1`] = ` ] `; +exports[`runs examples > example "bpdecay" example index 0 1`] = ` +[ + "[ 0/1 → 1/6 | note:c3 s:square bandf:1000 bpdecay:0.05 ftype:12db bpsustain:0 bprelease:0 ]", + "[ 1/6 → 1/3 | note:e3 s:square bandf:1000 bpdecay:0.05 ftype:12db bpsustain:0 bprelease:0 ]", + "[ 1/3 → 1/2 | note:f3 s:square bandf:1000 bpdecay:0.05 ftype:12db bpsustain:0 bprelease:0 ]", + "[ 1/2 → 2/3 | note:g3 s:square bandf:1000 bpdecay:0.05 ftype:12db bpsustain:0 bprelease:0 ]", + "[ 2/3 → 5/6 | note:ab3 s:square bandf:1000 bpdecay:0.05 ftype:12db bpsustain:0 bprelease:0 ]", + "[ 5/6 → 1/1 | note:bb3 s:square bandf:1000 bpdecay:0.05 ftype:12db bpsustain:0 bprelease:0 ]", + "[ 1/1 → 7/6 | note:c3 s:square bandf:1000 bpdecay:0.05 ftype:12db bpsustain:0 bprelease:0 ]", + "[ 7/6 → 4/3 | note:e3 s:square bandf:1000 bpdecay:0.05 ftype:12db bpsustain:0 bprelease:0 ]", + "[ 4/3 → 3/2 | note:f3 s:square bandf:1000 bpdecay:0.05 ftype:12db bpsustain:0 bprelease:0 ]", + "[ 3/2 → 5/3 | note:g3 s:square bandf:1000 bpdecay:0.05 ftype:12db bpsustain:0 bprelease:0 ]", + "[ 5/3 → 11/6 | note:ab3 s:square bandf:1000 bpdecay:0.05 ftype:12db bpsustain:0 bprelease:0 ]", + "[ 11/6 → 2/1 | note:bb3 s:square bandf:1000 bpdecay:0.05 ftype:12db bpsustain:0 bprelease:0 ]", + "[ 2/1 → 13/6 | note:c3 s:square bandf:1000 bpdecay:0.1 ftype:12db bpsustain:0 bprelease:0 ]", + "[ 13/6 → 7/3 | note:e3 s:square bandf:1000 bpdecay:0.1 ftype:12db bpsustain:0 bprelease:0 ]", + "[ 7/3 → 5/2 | note:f3 s:square bandf:1000 bpdecay:0.1 ftype:12db bpsustain:0 bprelease:0 ]", + "[ 5/2 → 8/3 | note:g3 s:square bandf:1000 bpdecay:0.1 ftype:12db bpsustain:0 bprelease:0 ]", + "[ 8/3 → 17/6 | note:ab3 s:square bandf:1000 bpdecay:0.1 ftype:12db bpsustain:0 bprelease:0 ]", + "[ 17/6 → 3/1 | note:bb3 s:square bandf:1000 bpdecay:0.1 ftype:12db bpsustain:0 bprelease:0 ]", + "[ 3/1 → 19/6 | note:c3 s:square bandf:1000 bpdecay:0.1 ftype:12db bpsustain:0 bprelease:0 ]", + "[ 19/6 → 10/3 | note:e3 s:square bandf:1000 bpdecay:0.1 ftype:12db bpsustain:0 bprelease:0 ]", + "[ 10/3 → 7/2 | note:f3 s:square bandf:1000 bpdecay:0.1 ftype:12db bpsustain:0 bprelease:0 ]", + "[ 7/2 → 11/3 | note:g3 s:square bandf:1000 bpdecay:0.1 ftype:12db bpsustain:0 bprelease:0 ]", + "[ 11/3 → 23/6 | note:ab3 s:square bandf:1000 bpdecay:0.1 ftype:12db bpsustain:0 bprelease:0 ]", + "[ 23/6 → 4/1 | note:bb3 s:square bandf:1000 bpdecay:0.1 ftype:12db bpsustain:0 bprelease:0 ]", +] +`; + +exports[`runs examples > example "bpenv" example index 0 1`] = ` +[ + "[ 0/1 → 1/4 | note:c2 s:sawtooth bandf:500 bpenv:1 ]", + "[ 1/4 → 1/2 | note:c3 s:sawtooth bandf:500 bpenv:1 ]", + "[ 1/2 → 3/4 | note:c2 s:sawtooth bandf:500 bpenv:1 ]", + "[ 3/4 → 1/1 | note:c3 s:sawtooth bandf:500 bpenv:1 ]", + "[ 1/1 → 5/4 | note:c2 s:sawtooth bandf:500 bpenv:2 ]", + "[ 5/4 → 3/2 | note:c3 s:sawtooth bandf:500 bpenv:2 ]", + "[ 3/2 → 7/4 | note:c2 s:sawtooth bandf:500 bpenv:2 ]", + "[ 7/4 → 2/1 | note:c3 s:sawtooth bandf:500 bpenv:2 ]", + "[ 2/1 → 9/4 | note:c2 s:sawtooth bandf:500 bpenv:3 ]", + "[ 9/4 → 5/2 | note:c3 s:sawtooth bandf:500 bpenv:3 ]", + "[ 5/2 → 11/4 | note:c2 s:sawtooth bandf:500 bpenv:3 ]", + "[ 11/4 → 3/1 | note:c3 s:sawtooth bandf:500 bpenv:3 ]", + "[ 3/1 → 13/4 | note:c2 s:sawtooth bandf:500 bpenv:4 ]", + "[ 13/4 → 7/2 | note:c3 s:sawtooth bandf:500 bpenv:4 ]", + "[ 7/2 → 15/4 | note:c2 s:sawtooth bandf:500 bpenv:4 ]", + "[ 15/4 → 4/1 | note:c3 s:sawtooth bandf:500 bpenv:4 ]", +] +`; + exports[`runs examples > example "bpf" example index 0 1`] = ` [ "[ 0/1 → 1/3 | s:hh bandf:1000 ]", @@ -2050,6 +2100,114 @@ exports[`runs examples > example "gain" example index 0 1`] = ` ] `; +exports[`runs examples > example "hpattack" example index 0 1`] = ` +[ + "[ 0/1 → 1/6 | note:c3 s:square hcutoff:1000 hpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 1/6 → 1/3 | note:e3 s:square hcutoff:1000 hpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 1/3 → 1/2 | note:f3 s:square hcutoff:1000 hpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 1/2 → 2/3 | note:g3 s:square hcutoff:1000 hpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 2/3 → 5/6 | note:ab3 s:square hcutoff:1000 hpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 5/6 → 1/1 | note:bb3 s:square hcutoff:1000 hpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 1/1 → 7/6 | note:c3 s:square hcutoff:1000 hpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 7/6 → 4/3 | note:e3 s:square hcutoff:1000 hpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 4/3 → 3/2 | note:f3 s:square hcutoff:1000 hpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 3/2 → 5/3 | note:g3 s:square hcutoff:1000 hpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 5/3 → 11/6 | note:ab3 s:square hcutoff:1000 hpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 11/6 → 2/1 | note:bb3 s:square hcutoff:1000 hpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 2/1 → 13/6 | note:c3 s:square hcutoff:1000 hpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 13/6 → 7/3 | note:e3 s:square hcutoff:1000 hpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 7/3 → 5/2 | note:f3 s:square hcutoff:1000 hpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 5/2 → 8/3 | note:g3 s:square hcutoff:1000 hpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 8/3 → 17/6 | note:ab3 s:square hcutoff:1000 hpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 17/6 → 3/1 | note:bb3 s:square hcutoff:1000 hpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 3/1 → 19/6 | note:c3 s:square hcutoff:1000 hpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 19/6 → 10/3 | note:e3 s:square hcutoff:1000 hpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 10/3 → 7/2 | note:f3 s:square hcutoff:1000 hpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 7/2 → 11/3 | note:g3 s:square hcutoff:1000 hpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 11/3 → 23/6 | note:ab3 s:square hcutoff:1000 hpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 23/6 → 4/1 | note:bb3 s:square hcutoff:1000 hpattack:0.1 ftype:12db release:0.2 attack:0 ]", +] +`; + +exports[`runs examples > example "hpattack" example index 0 2`] = ` +[ + "[ 0/1 → 1/6 | note:c3 s:square bandf:1000 bpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 1/6 → 1/3 | note:e3 s:square bandf:1000 bpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 1/3 → 1/2 | note:f3 s:square bandf:1000 bpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 1/2 → 2/3 | note:g3 s:square bandf:1000 bpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 2/3 → 5/6 | note:ab3 s:square bandf:1000 bpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 5/6 → 1/1 | note:bb3 s:square bandf:1000 bpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 1/1 → 7/6 | note:c3 s:square bandf:1000 bpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 7/6 → 4/3 | note:e3 s:square bandf:1000 bpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 4/3 → 3/2 | note:f3 s:square bandf:1000 bpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 3/2 → 5/3 | note:g3 s:square bandf:1000 bpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 5/3 → 11/6 | note:ab3 s:square bandf:1000 bpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 11/6 → 2/1 | note:bb3 s:square bandf:1000 bpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 2/1 → 13/6 | note:c3 s:square bandf:1000 bpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 13/6 → 7/3 | note:e3 s:square bandf:1000 bpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 7/3 → 5/2 | note:f3 s:square bandf:1000 bpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 5/2 → 8/3 | note:g3 s:square bandf:1000 bpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 8/3 → 17/6 | note:ab3 s:square bandf:1000 bpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 17/6 → 3/1 | note:bb3 s:square bandf:1000 bpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 3/1 → 19/6 | note:c3 s:square bandf:1000 bpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 19/6 → 10/3 | note:e3 s:square bandf:1000 bpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 10/3 → 7/2 | note:f3 s:square bandf:1000 bpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 7/2 → 11/3 | note:g3 s:square bandf:1000 bpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 11/3 → 23/6 | note:ab3 s:square bandf:1000 bpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 23/6 → 4/1 | note:bb3 s:square bandf:1000 bpattack:0.1 ftype:12db release:0.2 attack:0 ]", +] +`; + +exports[`runs examples > example "hpdecay" example index 0 1`] = ` +[ + "[ 0/1 → 1/6 | note:c3 s:square hcutoff:1000 hpdecay:0.05 ftype:12db hpsustain:0 hprelease:0 ]", + "[ 1/6 → 1/3 | note:e3 s:square hcutoff:1000 hpdecay:0.05 ftype:12db hpsustain:0 hprelease:0 ]", + "[ 1/3 → 1/2 | note:f3 s:square hcutoff:1000 hpdecay:0.05 ftype:12db hpsustain:0 hprelease:0 ]", + "[ 1/2 → 2/3 | note:g3 s:square hcutoff:1000 hpdecay:0.05 ftype:12db hpsustain:0 hprelease:0 ]", + "[ 2/3 → 5/6 | note:ab3 s:square hcutoff:1000 hpdecay:0.05 ftype:12db hpsustain:0 hprelease:0 ]", + "[ 5/6 → 1/1 | note:bb3 s:square hcutoff:1000 hpdecay:0.05 ftype:12db hpsustain:0 hprelease:0 ]", + "[ 1/1 → 7/6 | note:c3 s:square hcutoff:1000 hpdecay:0.05 ftype:12db hpsustain:0 hprelease:0 ]", + "[ 7/6 → 4/3 | note:e3 s:square hcutoff:1000 hpdecay:0.05 ftype:12db hpsustain:0 hprelease:0 ]", + "[ 4/3 → 3/2 | note:f3 s:square hcutoff:1000 hpdecay:0.05 ftype:12db hpsustain:0 hprelease:0 ]", + "[ 3/2 → 5/3 | note:g3 s:square hcutoff:1000 hpdecay:0.05 ftype:12db hpsustain:0 hprelease:0 ]", + "[ 5/3 → 11/6 | note:ab3 s:square hcutoff:1000 hpdecay:0.05 ftype:12db hpsustain:0 hprelease:0 ]", + "[ 11/6 → 2/1 | note:bb3 s:square hcutoff:1000 hpdecay:0.05 ftype:12db hpsustain:0 hprelease:0 ]", + "[ 2/1 → 13/6 | note:c3 s:square hcutoff:1000 hpdecay:0.1 ftype:12db hpsustain:0 hprelease:0 ]", + "[ 13/6 → 7/3 | note:e3 s:square hcutoff:1000 hpdecay:0.1 ftype:12db hpsustain:0 hprelease:0 ]", + "[ 7/3 → 5/2 | note:f3 s:square hcutoff:1000 hpdecay:0.1 ftype:12db hpsustain:0 hprelease:0 ]", + "[ 5/2 → 8/3 | note:g3 s:square hcutoff:1000 hpdecay:0.1 ftype:12db hpsustain:0 hprelease:0 ]", + "[ 8/3 → 17/6 | note:ab3 s:square hcutoff:1000 hpdecay:0.1 ftype:12db hpsustain:0 hprelease:0 ]", + "[ 17/6 → 3/1 | note:bb3 s:square hcutoff:1000 hpdecay:0.1 ftype:12db hpsustain:0 hprelease:0 ]", + "[ 3/1 → 19/6 | note:c3 s:square hcutoff:1000 hpdecay:0.1 ftype:12db hpsustain:0 hprelease:0 ]", + "[ 19/6 → 10/3 | note:e3 s:square hcutoff:1000 hpdecay:0.1 ftype:12db hpsustain:0 hprelease:0 ]", + "[ 10/3 → 7/2 | note:f3 s:square hcutoff:1000 hpdecay:0.1 ftype:12db hpsustain:0 hprelease:0 ]", + "[ 7/2 → 11/3 | note:g3 s:square hcutoff:1000 hpdecay:0.1 ftype:12db hpsustain:0 hprelease:0 ]", + "[ 11/3 → 23/6 | note:ab3 s:square hcutoff:1000 hpdecay:0.1 ftype:12db hpsustain:0 hprelease:0 ]", + "[ 23/6 → 4/1 | note:bb3 s:square hcutoff:1000 hpdecay:0.1 ftype:12db hpsustain:0 hprelease:0 ]", +] +`; + +exports[`runs examples > example "hpenv" example index 0 1`] = ` +[ + "[ 0/1 → 1/4 | note:c2 s:sawtooth hcutoff:500 hpenv:1 ]", + "[ 1/4 → 1/2 | note:c3 s:sawtooth hcutoff:500 hpenv:1 ]", + "[ 1/2 → 3/4 | note:c2 s:sawtooth hcutoff:500 hpenv:1 ]", + "[ 3/4 → 1/1 | note:c3 s:sawtooth hcutoff:500 hpenv:1 ]", + "[ 1/1 → 5/4 | note:c2 s:sawtooth hcutoff:500 hpenv:2 ]", + "[ 5/4 → 3/2 | note:c3 s:sawtooth hcutoff:500 hpenv:2 ]", + "[ 3/2 → 7/4 | note:c2 s:sawtooth hcutoff:500 hpenv:2 ]", + "[ 7/4 → 2/1 | note:c3 s:sawtooth hcutoff:500 hpenv:2 ]", + "[ 2/1 → 9/4 | note:c2 s:sawtooth hcutoff:500 hpenv:3 ]", + "[ 9/4 → 5/2 | note:c3 s:sawtooth hcutoff:500 hpenv:3 ]", + "[ 5/2 → 11/4 | note:c2 s:sawtooth hcutoff:500 hpenv:3 ]", + "[ 11/4 → 3/1 | note:c3 s:sawtooth hcutoff:500 hpenv:3 ]", + "[ 3/1 → 13/4 | note:c2 s:sawtooth hcutoff:500 hpenv:4 ]", + "[ 13/4 → 7/2 | note:c3 s:sawtooth hcutoff:500 hpenv:4 ]", + "[ 7/2 → 15/4 | note:c2 s:sawtooth hcutoff:500 hpenv:4 ]", + "[ 15/4 → 4/1 | note:c3 s:sawtooth hcutoff:500 hpenv:4 ]", +] +`; + exports[`runs examples > example "hpf" example index 0 1`] = ` [ "[ 0/1 → 1/4 | s:hh hcutoff:4000 ]", @@ -2566,6 +2724,85 @@ exports[`runs examples > example "loopAtCps" example index 0 1`] = ` ] `; +exports[`runs examples > example "lpattack" example index 0 1`] = ` +[ + "[ 0/1 → 1/6 | note:c3 s:square cutoff:1000 lpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 1/6 → 1/3 | note:e3 s:square cutoff:1000 lpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 1/3 → 1/2 | note:f3 s:square cutoff:1000 lpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 1/2 → 2/3 | note:g3 s:square cutoff:1000 lpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 2/3 → 5/6 | note:ab3 s:square cutoff:1000 lpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 5/6 → 1/1 | note:bb3 s:square cutoff:1000 lpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 1/1 → 7/6 | note:c3 s:square cutoff:1000 lpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 7/6 → 4/3 | note:e3 s:square cutoff:1000 lpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 4/3 → 3/2 | note:f3 s:square cutoff:1000 lpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 3/2 → 5/3 | note:g3 s:square cutoff:1000 lpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 5/3 → 11/6 | note:ab3 s:square cutoff:1000 lpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 11/6 → 2/1 | note:bb3 s:square cutoff:1000 lpattack:0.05 ftype:12db release:0.2 attack:0 ]", + "[ 2/1 → 13/6 | note:c3 s:square cutoff:1000 lpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 13/6 → 7/3 | note:e3 s:square cutoff:1000 lpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 7/3 → 5/2 | note:f3 s:square cutoff:1000 lpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 5/2 → 8/3 | note:g3 s:square cutoff:1000 lpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 8/3 → 17/6 | note:ab3 s:square cutoff:1000 lpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 17/6 → 3/1 | note:bb3 s:square cutoff:1000 lpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 3/1 → 19/6 | note:c3 s:square cutoff:1000 lpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 19/6 → 10/3 | note:e3 s:square cutoff:1000 lpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 10/3 → 7/2 | note:f3 s:square cutoff:1000 lpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 7/2 → 11/3 | note:g3 s:square cutoff:1000 lpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 11/3 → 23/6 | note:ab3 s:square cutoff:1000 lpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 23/6 → 4/1 | note:bb3 s:square cutoff:1000 lpattack:0.1 ftype:12db release:0.2 attack:0 ]", +] +`; + +exports[`runs examples > example "lpdecay" example index 0 1`] = ` +[ + "[ 0/1 → 1/6 | note:c3 s:square cutoff:1000 lpdecay:0.05 ftype:12db lpsustain:0 lprelease:0 ]", + "[ 1/6 → 1/3 | note:e3 s:square cutoff:1000 lpdecay:0.05 ftype:12db lpsustain:0 lprelease:0 ]", + "[ 1/3 → 1/2 | note:f3 s:square cutoff:1000 lpdecay:0.05 ftype:12db lpsustain:0 lprelease:0 ]", + "[ 1/2 → 2/3 | note:g3 s:square cutoff:1000 lpdecay:0.05 ftype:12db lpsustain:0 lprelease:0 ]", + "[ 2/3 → 5/6 | note:ab3 s:square cutoff:1000 lpdecay:0.05 ftype:12db lpsustain:0 lprelease:0 ]", + "[ 5/6 → 1/1 | note:bb3 s:square cutoff:1000 lpdecay:0.05 ftype:12db lpsustain:0 lprelease:0 ]", + "[ 1/1 → 7/6 | note:c3 s:square cutoff:1000 lpdecay:0.05 ftype:12db lpsustain:0 lprelease:0 ]", + "[ 7/6 → 4/3 | note:e3 s:square cutoff:1000 lpdecay:0.05 ftype:12db lpsustain:0 lprelease:0 ]", + "[ 4/3 → 3/2 | note:f3 s:square cutoff:1000 lpdecay:0.05 ftype:12db lpsustain:0 lprelease:0 ]", + "[ 3/2 → 5/3 | note:g3 s:square cutoff:1000 lpdecay:0.05 ftype:12db lpsustain:0 lprelease:0 ]", + "[ 5/3 → 11/6 | note:ab3 s:square cutoff:1000 lpdecay:0.05 ftype:12db lpsustain:0 lprelease:0 ]", + "[ 11/6 → 2/1 | note:bb3 s:square cutoff:1000 lpdecay:0.05 ftype:12db lpsustain:0 lprelease:0 ]", + "[ 2/1 → 13/6 | note:c3 s:square cutoff:1000 lpdecay:0.1 ftype:12db lpsustain:0 lprelease:0 ]", + "[ 13/6 → 7/3 | note:e3 s:square cutoff:1000 lpdecay:0.1 ftype:12db lpsustain:0 lprelease:0 ]", + "[ 7/3 → 5/2 | note:f3 s:square cutoff:1000 lpdecay:0.1 ftype:12db lpsustain:0 lprelease:0 ]", + "[ 5/2 → 8/3 | note:g3 s:square cutoff:1000 lpdecay:0.1 ftype:12db lpsustain:0 lprelease:0 ]", + "[ 8/3 → 17/6 | note:ab3 s:square cutoff:1000 lpdecay:0.1 ftype:12db lpsustain:0 lprelease:0 ]", + "[ 17/6 → 3/1 | note:bb3 s:square cutoff:1000 lpdecay:0.1 ftype:12db lpsustain:0 lprelease:0 ]", + "[ 3/1 → 19/6 | note:c3 s:square cutoff:1000 lpdecay:0.1 ftype:12db lpsustain:0 lprelease:0 ]", + "[ 19/6 → 10/3 | note:e3 s:square cutoff:1000 lpdecay:0.1 ftype:12db lpsustain:0 lprelease:0 ]", + "[ 10/3 → 7/2 | note:f3 s:square cutoff:1000 lpdecay:0.1 ftype:12db lpsustain:0 lprelease:0 ]", + "[ 7/2 → 11/3 | note:g3 s:square cutoff:1000 lpdecay:0.1 ftype:12db lpsustain:0 lprelease:0 ]", + "[ 11/3 → 23/6 | note:ab3 s:square cutoff:1000 lpdecay:0.1 ftype:12db lpsustain:0 lprelease:0 ]", + "[ 23/6 → 4/1 | note:bb3 s:square cutoff:1000 lpdecay:0.1 ftype:12db lpsustain:0 lprelease:0 ]", +] +`; + +exports[`runs examples > example "lpenv" example index 0 1`] = ` +[ + "[ 0/1 → 1/4 | note:c2 s:sawtooth cutoff:500 lpenv:1 ]", + "[ 1/4 → 1/2 | note:c3 s:sawtooth cutoff:500 lpenv:1 ]", + "[ 1/2 → 3/4 | note:c2 s:sawtooth cutoff:500 lpenv:1 ]", + "[ 3/4 → 1/1 | note:c3 s:sawtooth cutoff:500 lpenv:1 ]", + "[ 1/1 → 5/4 | note:c2 s:sawtooth cutoff:500 lpenv:2 ]", + "[ 5/4 → 3/2 | note:c3 s:sawtooth cutoff:500 lpenv:2 ]", + "[ 3/2 → 7/4 | note:c2 s:sawtooth cutoff:500 lpenv:2 ]", + "[ 7/4 → 2/1 | note:c3 s:sawtooth cutoff:500 lpenv:2 ]", + "[ 2/1 → 9/4 | note:c2 s:sawtooth cutoff:500 lpenv:3 ]", + "[ 9/4 → 5/2 | note:c3 s:sawtooth cutoff:500 lpenv:3 ]", + "[ 5/2 → 11/4 | note:c2 s:sawtooth cutoff:500 lpenv:3 ]", + "[ 11/4 → 3/1 | note:c3 s:sawtooth cutoff:500 lpenv:3 ]", + "[ 3/1 → 13/4 | note:c2 s:sawtooth cutoff:500 lpenv:4 ]", + "[ 13/4 → 7/2 | note:c3 s:sawtooth cutoff:500 lpenv:4 ]", + "[ 7/2 → 15/4 | note:c2 s:sawtooth cutoff:500 lpenv:4 ]", + "[ 15/4 → 4/1 | note:c3 s:sawtooth cutoff:500 lpenv:4 ]", +] +`; + exports[`runs examples > example "lpf" example index 0 1`] = ` [ "[ 0/1 → 1/3 | s:hh cutoff:4000 ]", @@ -2657,6 +2894,156 @@ exports[`runs examples > example "lpq" example index 0 1`] = ` ] `; +exports[`runs examples > example "lprelease" example index 0 1`] = ` +[ + "[ 0/1 → 1/4 | note:c3 lprelease:0.1 ftype:12db ]", + "[ 1/4 → 1/2 | note:e3 lprelease:0.1 ftype:12db ]", + "[ 1/2 → 3/4 | note:g3 lprelease:0.1 ftype:12db ]", + "[ 3/4 → 1/1 | note:c4 lprelease:0.1 ftype:12db ]", + "[ 1/1 → 5/4 | note:c3 lprelease:0.25 ftype:12db ]", + "[ 5/4 → 3/2 | note:e3 lprelease:0.25 ftype:12db ]", + "[ 3/2 → 7/4 | note:g3 lprelease:0.25 ftype:12db ]", + "[ 7/4 → 2/1 | note:c4 lprelease:0.25 ftype:12db ]", + "[ 2/1 → 9/4 | note:c3 lprelease:0.5 ftype:12db ]", + "[ 9/4 → 5/2 | note:e3 lprelease:0.5 ftype:12db ]", + "[ 5/2 → 11/4 | note:g3 lprelease:0.5 ftype:12db ]", + "[ 11/4 → 3/1 | note:c4 lprelease:0.5 ftype:12db ]", + "[ 3/1 → 13/4 | note:c3 lprelease:0.1 ftype:12db ]", + "[ 13/4 → 7/2 | note:e3 lprelease:0.1 ftype:12db ]", + "[ 7/2 → 15/4 | note:g3 lprelease:0.1 ftype:12db ]", + "[ 15/4 → 4/1 | note:c4 lprelease:0.1 ftype:12db ]", +] +`; + +exports[`runs examples > example "lprelease" example index 0 2`] = ` +[ + "[ 0/1 → 1/4 | note:c3 hprelease:0.1 ftype:12db ]", + "[ 1/4 → 1/2 | note:e3 hprelease:0.1 ftype:12db ]", + "[ 1/2 → 3/4 | note:g3 hprelease:0.1 ftype:12db ]", + "[ 3/4 → 1/1 | note:c4 hprelease:0.1 ftype:12db ]", + "[ 1/1 → 5/4 | note:c3 hprelease:0.25 ftype:12db ]", + "[ 5/4 → 3/2 | note:e3 hprelease:0.25 ftype:12db ]", + "[ 3/2 → 7/4 | note:g3 hprelease:0.25 ftype:12db ]", + "[ 7/4 → 2/1 | note:c4 hprelease:0.25 ftype:12db ]", + "[ 2/1 → 9/4 | note:c3 hprelease:0.5 ftype:12db ]", + "[ 9/4 → 5/2 | note:e3 hprelease:0.5 ftype:12db ]", + "[ 5/2 → 11/4 | note:g3 hprelease:0.5 ftype:12db ]", + "[ 11/4 → 3/1 | note:c4 hprelease:0.5 ftype:12db ]", + "[ 3/1 → 13/4 | note:c3 hprelease:0.1 ftype:12db ]", + "[ 13/4 → 7/2 | note:e3 hprelease:0.1 ftype:12db ]", + "[ 7/2 → 15/4 | note:g3 hprelease:0.1 ftype:12db ]", + "[ 15/4 → 4/1 | note:c4 hprelease:0.1 ftype:12db ]", +] +`; + +exports[`runs examples > example "lprelease" example index 0 3`] = ` +[ + "[ 0/1 → 1/4 | note:c3 bprelease:0.1 ftype:12db ]", + "[ 1/4 → 1/2 | note:e3 bprelease:0.1 ftype:12db ]", + "[ 1/2 → 3/4 | note:g3 bprelease:0.1 ftype:12db ]", + "[ 3/4 → 1/1 | note:c4 bprelease:0.1 ftype:12db ]", + "[ 1/1 → 5/4 | note:c3 bprelease:0.25 ftype:12db ]", + "[ 5/4 → 3/2 | note:e3 bprelease:0.25 ftype:12db ]", + "[ 3/2 → 7/4 | note:g3 bprelease:0.25 ftype:12db ]", + "[ 7/4 → 2/1 | note:c4 bprelease:0.25 ftype:12db ]", + "[ 2/1 → 9/4 | note:c3 bprelease:0.5 ftype:12db ]", + "[ 9/4 → 5/2 | note:e3 bprelease:0.5 ftype:12db ]", + "[ 5/2 → 11/4 | note:g3 bprelease:0.5 ftype:12db ]", + "[ 11/4 → 3/1 | note:c4 bprelease:0.5 ftype:12db ]", + "[ 3/1 → 13/4 | note:c3 bprelease:0.1 ftype:12db ]", + "[ 13/4 → 7/2 | note:e3 bprelease:0.1 ftype:12db ]", + "[ 7/2 → 15/4 | note:g3 bprelease:0.1 ftype:12db ]", + "[ 15/4 → 4/1 | note:c4 bprelease:0.1 ftype:12db ]", +] +`; + +exports[`runs examples > example "lpsustain" example index 0 1`] = ` +[ + "[ 0/1 → 1/6 | note:c3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.1 ftype:12db ]", + "[ 1/6 → 1/3 | note:e3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.1 ftype:12db ]", + "[ 1/3 → 1/2 | note:f3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.1 ftype:12db ]", + "[ 1/2 → 2/3 | note:g3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.1 ftype:12db ]", + "[ 2/3 → 5/6 | note:ab3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.1 ftype:12db ]", + "[ 5/6 → 1/1 | note:bb3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.1 ftype:12db ]", + "[ 1/1 → 7/6 | note:c3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.5 ftype:12db ]", + "[ 7/6 → 4/3 | note:e3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.5 ftype:12db ]", + "[ 4/3 → 3/2 | note:f3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.5 ftype:12db ]", + "[ 3/2 → 5/3 | note:g3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.5 ftype:12db ]", + "[ 5/3 → 11/6 | note:ab3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.5 ftype:12db ]", + "[ 11/6 → 2/1 | note:bb3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.5 ftype:12db ]", + "[ 2/1 → 13/6 | note:c3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.75 ftype:12db ]", + "[ 13/6 → 7/3 | note:e3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.75 ftype:12db ]", + "[ 7/3 → 5/2 | note:f3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.75 ftype:12db ]", + "[ 5/2 → 8/3 | note:g3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.75 ftype:12db ]", + "[ 8/3 → 17/6 | note:ab3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.75 ftype:12db ]", + "[ 17/6 → 3/1 | note:bb3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.75 ftype:12db ]", + "[ 3/1 → 19/6 | note:c3 s:square cutoff:200 lpdecay:0.1 lpsustain:1 ftype:12db ]", + "[ 19/6 → 10/3 | note:e3 s:square cutoff:200 lpdecay:0.1 lpsustain:1 ftype:12db ]", + "[ 10/3 → 7/2 | note:f3 s:square cutoff:200 lpdecay:0.1 lpsustain:1 ftype:12db ]", + "[ 7/2 → 11/3 | note:g3 s:square cutoff:200 lpdecay:0.1 lpsustain:1 ftype:12db ]", + "[ 11/3 → 23/6 | note:ab3 s:square cutoff:200 lpdecay:0.1 lpsustain:1 ftype:12db ]", + "[ 23/6 → 4/1 | note:bb3 s:square cutoff:200 lpdecay:0.1 lpsustain:1 ftype:12db ]", +] +`; + +exports[`runs examples > example "lpsustain" example index 0 2`] = ` +[ + "[ 0/1 → 1/6 | note:c3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.1 ftype:12db ]", + "[ 1/6 → 1/3 | note:e3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.1 ftype:12db ]", + "[ 1/3 → 1/2 | note:f3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.1 ftype:12db ]", + "[ 1/2 → 2/3 | note:g3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.1 ftype:12db ]", + "[ 2/3 → 5/6 | note:ab3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.1 ftype:12db ]", + "[ 5/6 → 1/1 | note:bb3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.1 ftype:12db ]", + "[ 1/1 → 7/6 | note:c3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.5 ftype:12db ]", + "[ 7/6 → 4/3 | note:e3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.5 ftype:12db ]", + "[ 4/3 → 3/2 | note:f3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.5 ftype:12db ]", + "[ 3/2 → 5/3 | note:g3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.5 ftype:12db ]", + "[ 5/3 → 11/6 | note:ab3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.5 ftype:12db ]", + "[ 11/6 → 2/1 | note:bb3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.5 ftype:12db ]", + "[ 2/1 → 13/6 | note:c3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.75 ftype:12db ]", + "[ 13/6 → 7/3 | note:e3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.75 ftype:12db ]", + "[ 7/3 → 5/2 | note:f3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.75 ftype:12db ]", + "[ 5/2 → 8/3 | note:g3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.75 ftype:12db ]", + "[ 8/3 → 17/6 | note:ab3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.75 ftype:12db ]", + "[ 17/6 → 3/1 | note:bb3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.75 ftype:12db ]", + "[ 3/1 → 19/6 | note:c3 s:square hcutoff:200 hpdecay:0.1 hpsustain:1 ftype:12db ]", + "[ 19/6 → 10/3 | note:e3 s:square hcutoff:200 hpdecay:0.1 hpsustain:1 ftype:12db ]", + "[ 10/3 → 7/2 | note:f3 s:square hcutoff:200 hpdecay:0.1 hpsustain:1 ftype:12db ]", + "[ 7/2 → 11/3 | note:g3 s:square hcutoff:200 hpdecay:0.1 hpsustain:1 ftype:12db ]", + "[ 11/3 → 23/6 | note:ab3 s:square hcutoff:200 hpdecay:0.1 hpsustain:1 ftype:12db ]", + "[ 23/6 → 4/1 | note:bb3 s:square hcutoff:200 hpdecay:0.1 hpsustain:1 ftype:12db ]", +] +`; + +exports[`runs examples > example "lpsustain" example index 0 3`] = ` +[ + "[ 0/1 → 1/6 | note:c3 s:square bandf:200 bpdecay:0.1 bpsustain:0.1 ftype:12db ]", + "[ 1/6 → 1/3 | note:e3 s:square bandf:200 bpdecay:0.1 bpsustain:0.1 ftype:12db ]", + "[ 1/3 → 1/2 | note:f3 s:square bandf:200 bpdecay:0.1 bpsustain:0.1 ftype:12db ]", + "[ 1/2 → 2/3 | note:g3 s:square bandf:200 bpdecay:0.1 bpsustain:0.1 ftype:12db ]", + "[ 2/3 → 5/6 | note:ab3 s:square bandf:200 bpdecay:0.1 bpsustain:0.1 ftype:12db ]", + "[ 5/6 → 1/1 | note:bb3 s:square bandf:200 bpdecay:0.1 bpsustain:0.1 ftype:12db ]", + "[ 1/1 → 7/6 | note:c3 s:square bandf:200 bpdecay:0.1 bpsustain:0.5 ftype:12db ]", + "[ 7/6 → 4/3 | note:e3 s:square bandf:200 bpdecay:0.1 bpsustain:0.5 ftype:12db ]", + "[ 4/3 → 3/2 | note:f3 s:square bandf:200 bpdecay:0.1 bpsustain:0.5 ftype:12db ]", + "[ 3/2 → 5/3 | note:g3 s:square bandf:200 bpdecay:0.1 bpsustain:0.5 ftype:12db ]", + "[ 5/3 → 11/6 | note:ab3 s:square bandf:200 bpdecay:0.1 bpsustain:0.5 ftype:12db ]", + "[ 11/6 → 2/1 | note:bb3 s:square bandf:200 bpdecay:0.1 bpsustain:0.5 ftype:12db ]", + "[ 2/1 → 13/6 | note:c3 s:square bandf:200 bpdecay:0.1 bpsustain:0.75 ftype:12db ]", + "[ 13/6 → 7/3 | note:e3 s:square bandf:200 bpdecay:0.1 bpsustain:0.75 ftype:12db ]", + "[ 7/3 → 5/2 | note:f3 s:square bandf:200 bpdecay:0.1 bpsustain:0.75 ftype:12db ]", + "[ 5/2 → 8/3 | note:g3 s:square bandf:200 bpdecay:0.1 bpsustain:0.75 ftype:12db ]", + "[ 8/3 → 17/6 | note:ab3 s:square bandf:200 bpdecay:0.1 bpsustain:0.75 ftype:12db ]", + "[ 17/6 → 3/1 | note:bb3 s:square bandf:200 bpdecay:0.1 bpsustain:0.75 ftype:12db ]", + "[ 3/1 → 19/6 | note:c3 s:square bandf:200 bpdecay:0.1 bpsustain:1 ftype:12db ]", + "[ 19/6 → 10/3 | note:e3 s:square bandf:200 bpdecay:0.1 bpsustain:1 ftype:12db ]", + "[ 10/3 → 7/2 | note:f3 s:square bandf:200 bpdecay:0.1 bpsustain:1 ftype:12db ]", + "[ 7/2 → 11/3 | note:g3 s:square bandf:200 bpdecay:0.1 bpsustain:1 ftype:12db ]", + "[ 11/3 → 23/6 | note:ab3 s:square bandf:200 bpdecay:0.1 bpsustain:1 ftype:12db ]", + "[ 23/6 → 4/1 | note:bb3 s:square bandf:200 bpdecay:0.1 bpsustain:1 ftype:12db ]", +] +`; + exports[`runs examples > example "lrate" example index 0 1`] = ` [ "[ 0/1 → 1/1 | n:0 s:supersquare leslie:1 lrate:1 ]", From 445881992ed15962482ab61b5270c64ef666ea23 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Fri, 15 Sep 2023 21:43:03 +0200 Subject: [PATCH 17/39] slow down examples + simplify --- packages/core/controls.mjs | 55 +++++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 21 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 3bdb885b..c31c68aa 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -384,8 +384,11 @@ const generic_params = [ * @param {number | Pattern} modulation depth of the lowpass filter envelope between 0 and _n_ * @synonyms lpe * @example - * note("c2 c3").fast(2).sound("sawtooth") - * .cutoff(500).lpenv("<1 2 3 4 5 6 7 8>") + * note("") + * .sound('sawtooth') + * .lpf(500) + * .lpa(.1).lpd(.1).lps(.5) + * .lpenv("<8 4 2 0>/4") */ ['lpenv', 'lpe'], /** @@ -414,10 +417,11 @@ const generic_params = [ * @param {number | Pattern} attack time of the filter envelope * @synonyms lpa * @example - * note("c3 e3 f3 g3 ab3 bb3") - * .sound('square').cutoff(1000) - * .lpattack("<0.05 0.1 0.25 0.5>/2").ftype("12db") - * .release(0.2).attack(0) + * note("") + * .sound('sawtooth') + * .lpf(500) + * .lpa("<.5 .25 .1 .01>/4") + * .lpenv(4) */ ['lpattack', 'lpa'], /** @@ -428,7 +432,7 @@ const generic_params = [ * @example * note("c3 e3 f3 g3 ab3 bb3") * .sound('square').hcutoff(1000) - * .hpattack("<0.05 0.1 0.25 0.5>/2").ftype("12db") + * .hpattack("<0.5 0.25 0.1 0.01>/2").ftype("12db") * .release(0.2).attack(0) */ ['hpattack', 'hpa'], @@ -450,11 +454,12 @@ const generic_params = [ * @param {number | Pattern} decay time of the filter envelope * @synonyms lpd * @example - * "baba" - * note("c3 e3 f3 g3 ab3 bb3") - * .sound('square').cutoff(1000) - * .lpdecay("<0.05 0.1 0.125>/2") - * .ftype("12db").lps(0).lpr(0) + * note("") + * .sound('sawtooth') + * .lpf(500) + * .lpd("<.5 .25 .1 0>/4") + * .lps(0.2) + * .lpenv(4) */ ['lpdecay', 'lpd'], /** @@ -489,15 +494,17 @@ const generic_params = [ * @param {number | Pattern} sustain amplitude of the lowpass filter envelope * @synonyms lps * @example - * note("c3 e3 f3 g3 ab3 bb3") - * .sound('square').cutoff(200) - * .lpd(0.1).lpsustain("<0.1 0.5 0.75 1>") - * .ftype("12db") + * note("") + * .sound('sawtooth') + * .lpf(0) + * .lpd(.5) + * .lps("<0 .25 .5 1>/4") + * .lpenv(4) */ ['lpsustain', 'lps'], /** * Sets the sustain amplitude for the highpass filter envelope. - * @name lpsustain + * @name hpsustain * @param {number | Pattern} sustain amplitude of the highpass filter envelope * @synonyms hps * @example @@ -509,7 +516,7 @@ const generic_params = [ ['hpsustain', 'hps'], /** * Sets the sustain amplitude for the bandpass filter envelope. - * @name lpsustain + * @name hpsustain * @param {number | Pattern} sustain amplitude of the bandpass filter envelope * @synonyms bps * @example @@ -525,12 +532,18 @@ const generic_params = [ * @param {number | Pattern} release time of the filter envelope * @synonyms lpr * @example - * note("c3 e3 g3 c4").lpr("<0.1 0.25 0.5>").ftype("12db") + * note("") + * .sound('sawtooth') + * .clip(.5) + * .lpf(0) + * .lpenv(4) + * .lpr("<.5 .25 .1 0>/4") + * .release(.5) */ ['lprelease', 'lpr'], /** * Sets the release time for the highpass filter envelope. - * @name lprelease + * @name hprelease * @param {number | Pattern} release time of the highpass filter envelope * @synonyms hpr * @example @@ -539,7 +552,7 @@ const generic_params = [ ['hprelease', 'hpr'], /** * Sets the release time for the bandpass filter envelope. - * @name lprelease + * @name bprelease * @param {number | Pattern} release time of the bandpass filter envelope * @synonyms bpr * @example From b8932390f7c0f40a9a4f258844d662b10f3e2805 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Fri, 15 Sep 2023 21:44:24 +0200 Subject: [PATCH 18/39] update snapshot --- test/__snapshots__/examples.test.mjs.snap | 372 +++++++++------------- 1 file changed, 144 insertions(+), 228 deletions(-) diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 4cb261ae..7f9dd6f9 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -988,6 +988,27 @@ exports[`runs examples > example "bpq" example index 0 1`] = ` ] `; +exports[`runs examples > example "bprelease" example index 0 1`] = ` +[ + "[ 0/1 → 1/4 | note:c3 bprelease:0.1 ftype:12db ]", + "[ 1/4 → 1/2 | note:e3 bprelease:0.1 ftype:12db ]", + "[ 1/2 → 3/4 | note:g3 bprelease:0.1 ftype:12db ]", + "[ 3/4 → 1/1 | note:c4 bprelease:0.1 ftype:12db ]", + "[ 1/1 → 5/4 | note:c3 bprelease:0.25 ftype:12db ]", + "[ 5/4 → 3/2 | note:e3 bprelease:0.25 ftype:12db ]", + "[ 3/2 → 7/4 | note:g3 bprelease:0.25 ftype:12db ]", + "[ 7/4 → 2/1 | note:c4 bprelease:0.25 ftype:12db ]", + "[ 2/1 → 9/4 | note:c3 bprelease:0.5 ftype:12db ]", + "[ 9/4 → 5/2 | note:e3 bprelease:0.5 ftype:12db ]", + "[ 5/2 → 11/4 | note:g3 bprelease:0.5 ftype:12db ]", + "[ 11/4 → 3/1 | note:c4 bprelease:0.5 ftype:12db ]", + "[ 3/1 → 13/4 | note:c3 bprelease:0.1 ftype:12db ]", + "[ 13/4 → 7/2 | note:e3 bprelease:0.1 ftype:12db ]", + "[ 7/2 → 15/4 | note:g3 bprelease:0.1 ftype:12db ]", + "[ 15/4 → 4/1 | note:c4 bprelease:0.1 ftype:12db ]", +] +`; + exports[`runs examples > example "cat" example index 0 1`] = ` [ "[ 0/1 → 1/2 | s:hh ]", @@ -2102,30 +2123,30 @@ exports[`runs examples > example "gain" example index 0 1`] = ` exports[`runs examples > example "hpattack" example index 0 1`] = ` [ - "[ 0/1 → 1/6 | note:c3 s:square hcutoff:1000 hpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 1/6 → 1/3 | note:e3 s:square hcutoff:1000 hpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 1/3 → 1/2 | note:f3 s:square hcutoff:1000 hpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 1/2 → 2/3 | note:g3 s:square hcutoff:1000 hpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 2/3 → 5/6 | note:ab3 s:square hcutoff:1000 hpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 5/6 → 1/1 | note:bb3 s:square hcutoff:1000 hpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 1/1 → 7/6 | note:c3 s:square hcutoff:1000 hpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 7/6 → 4/3 | note:e3 s:square hcutoff:1000 hpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 4/3 → 3/2 | note:f3 s:square hcutoff:1000 hpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 3/2 → 5/3 | note:g3 s:square hcutoff:1000 hpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 5/3 → 11/6 | note:ab3 s:square hcutoff:1000 hpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 11/6 → 2/1 | note:bb3 s:square hcutoff:1000 hpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 2/1 → 13/6 | note:c3 s:square hcutoff:1000 hpattack:0.1 ftype:12db release:0.2 attack:0 ]", - "[ 13/6 → 7/3 | note:e3 s:square hcutoff:1000 hpattack:0.1 ftype:12db release:0.2 attack:0 ]", - "[ 7/3 → 5/2 | note:f3 s:square hcutoff:1000 hpattack:0.1 ftype:12db release:0.2 attack:0 ]", - "[ 5/2 → 8/3 | note:g3 s:square hcutoff:1000 hpattack:0.1 ftype:12db release:0.2 attack:0 ]", - "[ 8/3 → 17/6 | note:ab3 s:square hcutoff:1000 hpattack:0.1 ftype:12db release:0.2 attack:0 ]", - "[ 17/6 → 3/1 | note:bb3 s:square hcutoff:1000 hpattack:0.1 ftype:12db release:0.2 attack:0 ]", - "[ 3/1 → 19/6 | note:c3 s:square hcutoff:1000 hpattack:0.1 ftype:12db release:0.2 attack:0 ]", - "[ 19/6 → 10/3 | note:e3 s:square hcutoff:1000 hpattack:0.1 ftype:12db release:0.2 attack:0 ]", - "[ 10/3 → 7/2 | note:f3 s:square hcutoff:1000 hpattack:0.1 ftype:12db release:0.2 attack:0 ]", - "[ 7/2 → 11/3 | note:g3 s:square hcutoff:1000 hpattack:0.1 ftype:12db release:0.2 attack:0 ]", - "[ 11/3 → 23/6 | note:ab3 s:square hcutoff:1000 hpattack:0.1 ftype:12db release:0.2 attack:0 ]", - "[ 23/6 → 4/1 | note:bb3 s:square hcutoff:1000 hpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 0/1 → 1/6 | note:c3 s:square hcutoff:1000 hpattack:0.5 ftype:12db release:0.2 attack:0 ]", + "[ 1/6 → 1/3 | note:e3 s:square hcutoff:1000 hpattack:0.5 ftype:12db release:0.2 attack:0 ]", + "[ 1/3 → 1/2 | note:f3 s:square hcutoff:1000 hpattack:0.5 ftype:12db release:0.2 attack:0 ]", + "[ 1/2 → 2/3 | note:g3 s:square hcutoff:1000 hpattack:0.5 ftype:12db release:0.2 attack:0 ]", + "[ 2/3 → 5/6 | note:ab3 s:square hcutoff:1000 hpattack:0.5 ftype:12db release:0.2 attack:0 ]", + "[ 5/6 → 1/1 | note:bb3 s:square hcutoff:1000 hpattack:0.5 ftype:12db release:0.2 attack:0 ]", + "[ 1/1 → 7/6 | note:c3 s:square hcutoff:1000 hpattack:0.5 ftype:12db release:0.2 attack:0 ]", + "[ 7/6 → 4/3 | note:e3 s:square hcutoff:1000 hpattack:0.5 ftype:12db release:0.2 attack:0 ]", + "[ 4/3 → 3/2 | note:f3 s:square hcutoff:1000 hpattack:0.5 ftype:12db release:0.2 attack:0 ]", + "[ 3/2 → 5/3 | note:g3 s:square hcutoff:1000 hpattack:0.5 ftype:12db release:0.2 attack:0 ]", + "[ 5/3 → 11/6 | note:ab3 s:square hcutoff:1000 hpattack:0.5 ftype:12db release:0.2 attack:0 ]", + "[ 11/6 → 2/1 | note:bb3 s:square hcutoff:1000 hpattack:0.5 ftype:12db release:0.2 attack:0 ]", + "[ 2/1 → 13/6 | note:c3 s:square hcutoff:1000 hpattack:0.25 ftype:12db release:0.2 attack:0 ]", + "[ 13/6 → 7/3 | note:e3 s:square hcutoff:1000 hpattack:0.25 ftype:12db release:0.2 attack:0 ]", + "[ 7/3 → 5/2 | note:f3 s:square hcutoff:1000 hpattack:0.25 ftype:12db release:0.2 attack:0 ]", + "[ 5/2 → 8/3 | note:g3 s:square hcutoff:1000 hpattack:0.25 ftype:12db release:0.2 attack:0 ]", + "[ 8/3 → 17/6 | note:ab3 s:square hcutoff:1000 hpattack:0.25 ftype:12db release:0.2 attack:0 ]", + "[ 17/6 → 3/1 | note:bb3 s:square hcutoff:1000 hpattack:0.25 ftype:12db release:0.2 attack:0 ]", + "[ 3/1 → 19/6 | note:c3 s:square hcutoff:1000 hpattack:0.25 ftype:12db release:0.2 attack:0 ]", + "[ 19/6 → 10/3 | note:e3 s:square hcutoff:1000 hpattack:0.25 ftype:12db release:0.2 attack:0 ]", + "[ 10/3 → 7/2 | note:f3 s:square hcutoff:1000 hpattack:0.25 ftype:12db release:0.2 attack:0 ]", + "[ 7/2 → 11/3 | note:g3 s:square hcutoff:1000 hpattack:0.25 ftype:12db release:0.2 attack:0 ]", + "[ 11/3 → 23/6 | note:ab3 s:square hcutoff:1000 hpattack:0.25 ftype:12db release:0.2 attack:0 ]", + "[ 23/6 → 4/1 | note:bb3 s:square hcutoff:1000 hpattack:0.25 ftype:12db release:0.2 attack:0 ]", ] `; @@ -2295,6 +2316,85 @@ exports[`runs examples > example "hpq" example index 0 1`] = ` ] `; +exports[`runs examples > example "hprelease" example index 0 1`] = ` +[ + "[ 0/1 → 1/4 | note:c3 hprelease:0.1 ftype:12db ]", + "[ 1/4 → 1/2 | note:e3 hprelease:0.1 ftype:12db ]", + "[ 1/2 → 3/4 | note:g3 hprelease:0.1 ftype:12db ]", + "[ 3/4 → 1/1 | note:c4 hprelease:0.1 ftype:12db ]", + "[ 1/1 → 5/4 | note:c3 hprelease:0.25 ftype:12db ]", + "[ 5/4 → 3/2 | note:e3 hprelease:0.25 ftype:12db ]", + "[ 3/2 → 7/4 | note:g3 hprelease:0.25 ftype:12db ]", + "[ 7/4 → 2/1 | note:c4 hprelease:0.25 ftype:12db ]", + "[ 2/1 → 9/4 | note:c3 hprelease:0.5 ftype:12db ]", + "[ 9/4 → 5/2 | note:e3 hprelease:0.5 ftype:12db ]", + "[ 5/2 → 11/4 | note:g3 hprelease:0.5 ftype:12db ]", + "[ 11/4 → 3/1 | note:c4 hprelease:0.5 ftype:12db ]", + "[ 3/1 → 13/4 | note:c3 hprelease:0.1 ftype:12db ]", + "[ 13/4 → 7/2 | note:e3 hprelease:0.1 ftype:12db ]", + "[ 7/2 → 15/4 | note:g3 hprelease:0.1 ftype:12db ]", + "[ 15/4 → 4/1 | note:c4 hprelease:0.1 ftype:12db ]", +] +`; + +exports[`runs examples > example "hpsustain" example index 0 1`] = ` +[ + "[ 0/1 → 1/6 | note:c3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.1 ftype:12db ]", + "[ 1/6 → 1/3 | note:e3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.1 ftype:12db ]", + "[ 1/3 → 1/2 | note:f3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.1 ftype:12db ]", + "[ 1/2 → 2/3 | note:g3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.1 ftype:12db ]", + "[ 2/3 → 5/6 | note:ab3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.1 ftype:12db ]", + "[ 5/6 → 1/1 | note:bb3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.1 ftype:12db ]", + "[ 1/1 → 7/6 | note:c3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.5 ftype:12db ]", + "[ 7/6 → 4/3 | note:e3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.5 ftype:12db ]", + "[ 4/3 → 3/2 | note:f3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.5 ftype:12db ]", + "[ 3/2 → 5/3 | note:g3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.5 ftype:12db ]", + "[ 5/3 → 11/6 | note:ab3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.5 ftype:12db ]", + "[ 11/6 → 2/1 | note:bb3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.5 ftype:12db ]", + "[ 2/1 → 13/6 | note:c3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.75 ftype:12db ]", + "[ 13/6 → 7/3 | note:e3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.75 ftype:12db ]", + "[ 7/3 → 5/2 | note:f3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.75 ftype:12db ]", + "[ 5/2 → 8/3 | note:g3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.75 ftype:12db ]", + "[ 8/3 → 17/6 | note:ab3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.75 ftype:12db ]", + "[ 17/6 → 3/1 | note:bb3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.75 ftype:12db ]", + "[ 3/1 → 19/6 | note:c3 s:square hcutoff:200 hpdecay:0.1 hpsustain:1 ftype:12db ]", + "[ 19/6 → 10/3 | note:e3 s:square hcutoff:200 hpdecay:0.1 hpsustain:1 ftype:12db ]", + "[ 10/3 → 7/2 | note:f3 s:square hcutoff:200 hpdecay:0.1 hpsustain:1 ftype:12db ]", + "[ 7/2 → 11/3 | note:g3 s:square hcutoff:200 hpdecay:0.1 hpsustain:1 ftype:12db ]", + "[ 11/3 → 23/6 | note:ab3 s:square hcutoff:200 hpdecay:0.1 hpsustain:1 ftype:12db ]", + "[ 23/6 → 4/1 | note:bb3 s:square hcutoff:200 hpdecay:0.1 hpsustain:1 ftype:12db ]", +] +`; + +exports[`runs examples > example "hpsustain" example index 0 2`] = ` +[ + "[ 0/1 → 1/6 | note:c3 s:square bandf:200 bpdecay:0.1 bpsustain:0.1 ftype:12db ]", + "[ 1/6 → 1/3 | note:e3 s:square bandf:200 bpdecay:0.1 bpsustain:0.1 ftype:12db ]", + "[ 1/3 → 1/2 | note:f3 s:square bandf:200 bpdecay:0.1 bpsustain:0.1 ftype:12db ]", + "[ 1/2 → 2/3 | note:g3 s:square bandf:200 bpdecay:0.1 bpsustain:0.1 ftype:12db ]", + "[ 2/3 → 5/6 | note:ab3 s:square bandf:200 bpdecay:0.1 bpsustain:0.1 ftype:12db ]", + "[ 5/6 → 1/1 | note:bb3 s:square bandf:200 bpdecay:0.1 bpsustain:0.1 ftype:12db ]", + "[ 1/1 → 7/6 | note:c3 s:square bandf:200 bpdecay:0.1 bpsustain:0.5 ftype:12db ]", + "[ 7/6 → 4/3 | note:e3 s:square bandf:200 bpdecay:0.1 bpsustain:0.5 ftype:12db ]", + "[ 4/3 → 3/2 | note:f3 s:square bandf:200 bpdecay:0.1 bpsustain:0.5 ftype:12db ]", + "[ 3/2 → 5/3 | note:g3 s:square bandf:200 bpdecay:0.1 bpsustain:0.5 ftype:12db ]", + "[ 5/3 → 11/6 | note:ab3 s:square bandf:200 bpdecay:0.1 bpsustain:0.5 ftype:12db ]", + "[ 11/6 → 2/1 | note:bb3 s:square bandf:200 bpdecay:0.1 bpsustain:0.5 ftype:12db ]", + "[ 2/1 → 13/6 | note:c3 s:square bandf:200 bpdecay:0.1 bpsustain:0.75 ftype:12db ]", + "[ 13/6 → 7/3 | note:e3 s:square bandf:200 bpdecay:0.1 bpsustain:0.75 ftype:12db ]", + "[ 7/3 → 5/2 | note:f3 s:square bandf:200 bpdecay:0.1 bpsustain:0.75 ftype:12db ]", + "[ 5/2 → 8/3 | note:g3 s:square bandf:200 bpdecay:0.1 bpsustain:0.75 ftype:12db ]", + "[ 8/3 → 17/6 | note:ab3 s:square bandf:200 bpdecay:0.1 bpsustain:0.75 ftype:12db ]", + "[ 17/6 → 3/1 | note:bb3 s:square bandf:200 bpdecay:0.1 bpsustain:0.75 ftype:12db ]", + "[ 3/1 → 19/6 | note:c3 s:square bandf:200 bpdecay:0.1 bpsustain:1 ftype:12db ]", + "[ 19/6 → 10/3 | note:e3 s:square bandf:200 bpdecay:0.1 bpsustain:1 ftype:12db ]", + "[ 10/3 → 7/2 | note:f3 s:square bandf:200 bpdecay:0.1 bpsustain:1 ftype:12db ]", + "[ 7/2 → 11/3 | note:g3 s:square bandf:200 bpdecay:0.1 bpsustain:1 ftype:12db ]", + "[ 11/3 → 23/6 | note:ab3 s:square bandf:200 bpdecay:0.1 bpsustain:1 ftype:12db ]", + "[ 23/6 → 4/1 | note:bb3 s:square bandf:200 bpdecay:0.1 bpsustain:1 ftype:12db ]", +] +`; + exports[`runs examples > example "hurry" example index 0 1`] = ` [ "[ 0/1 → 3/4 | s:bd speed:1 ]", @@ -2726,80 +2826,28 @@ exports[`runs examples > example "loopAtCps" example index 0 1`] = ` exports[`runs examples > example "lpattack" example index 0 1`] = ` [ - "[ 0/1 → 1/6 | note:c3 s:square cutoff:1000 lpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 1/6 → 1/3 | note:e3 s:square cutoff:1000 lpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 1/3 → 1/2 | note:f3 s:square cutoff:1000 lpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 1/2 → 2/3 | note:g3 s:square cutoff:1000 lpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 2/3 → 5/6 | note:ab3 s:square cutoff:1000 lpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 5/6 → 1/1 | note:bb3 s:square cutoff:1000 lpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 1/1 → 7/6 | note:c3 s:square cutoff:1000 lpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 7/6 → 4/3 | note:e3 s:square cutoff:1000 lpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 4/3 → 3/2 | note:f3 s:square cutoff:1000 lpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 3/2 → 5/3 | note:g3 s:square cutoff:1000 lpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 5/3 → 11/6 | note:ab3 s:square cutoff:1000 lpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 11/6 → 2/1 | note:bb3 s:square cutoff:1000 lpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 2/1 → 13/6 | note:c3 s:square cutoff:1000 lpattack:0.1 ftype:12db release:0.2 attack:0 ]", - "[ 13/6 → 7/3 | note:e3 s:square cutoff:1000 lpattack:0.1 ftype:12db release:0.2 attack:0 ]", - "[ 7/3 → 5/2 | note:f3 s:square cutoff:1000 lpattack:0.1 ftype:12db release:0.2 attack:0 ]", - "[ 5/2 → 8/3 | note:g3 s:square cutoff:1000 lpattack:0.1 ftype:12db release:0.2 attack:0 ]", - "[ 8/3 → 17/6 | note:ab3 s:square cutoff:1000 lpattack:0.1 ftype:12db release:0.2 attack:0 ]", - "[ 17/6 → 3/1 | note:bb3 s:square cutoff:1000 lpattack:0.1 ftype:12db release:0.2 attack:0 ]", - "[ 3/1 → 19/6 | note:c3 s:square cutoff:1000 lpattack:0.1 ftype:12db release:0.2 attack:0 ]", - "[ 19/6 → 10/3 | note:e3 s:square cutoff:1000 lpattack:0.1 ftype:12db release:0.2 attack:0 ]", - "[ 10/3 → 7/2 | note:f3 s:square cutoff:1000 lpattack:0.1 ftype:12db release:0.2 attack:0 ]", - "[ 7/2 → 11/3 | note:g3 s:square cutoff:1000 lpattack:0.1 ftype:12db release:0.2 attack:0 ]", - "[ 11/3 → 23/6 | note:ab3 s:square cutoff:1000 lpattack:0.1 ftype:12db release:0.2 attack:0 ]", - "[ 23/6 → 4/1 | note:bb3 s:square cutoff:1000 lpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 0/1 → 1/1 | note:c2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]", + "[ 1/1 → 2/1 | note:e2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]", + "[ 2/1 → 3/1 | note:f2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]", + "[ 3/1 → 4/1 | note:g2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]", ] `; exports[`runs examples > example "lpdecay" example index 0 1`] = ` [ - "[ 0/1 → 1/6 | note:c3 s:square cutoff:1000 lpdecay:0.05 ftype:12db lpsustain:0 lprelease:0 ]", - "[ 1/6 → 1/3 | note:e3 s:square cutoff:1000 lpdecay:0.05 ftype:12db lpsustain:0 lprelease:0 ]", - "[ 1/3 → 1/2 | note:f3 s:square cutoff:1000 lpdecay:0.05 ftype:12db lpsustain:0 lprelease:0 ]", - "[ 1/2 → 2/3 | note:g3 s:square cutoff:1000 lpdecay:0.05 ftype:12db lpsustain:0 lprelease:0 ]", - "[ 2/3 → 5/6 | note:ab3 s:square cutoff:1000 lpdecay:0.05 ftype:12db lpsustain:0 lprelease:0 ]", - "[ 5/6 → 1/1 | note:bb3 s:square cutoff:1000 lpdecay:0.05 ftype:12db lpsustain:0 lprelease:0 ]", - "[ 1/1 → 7/6 | note:c3 s:square cutoff:1000 lpdecay:0.05 ftype:12db lpsustain:0 lprelease:0 ]", - "[ 7/6 → 4/3 | note:e3 s:square cutoff:1000 lpdecay:0.05 ftype:12db lpsustain:0 lprelease:0 ]", - "[ 4/3 → 3/2 | note:f3 s:square cutoff:1000 lpdecay:0.05 ftype:12db lpsustain:0 lprelease:0 ]", - "[ 3/2 → 5/3 | note:g3 s:square cutoff:1000 lpdecay:0.05 ftype:12db lpsustain:0 lprelease:0 ]", - "[ 5/3 → 11/6 | note:ab3 s:square cutoff:1000 lpdecay:0.05 ftype:12db lpsustain:0 lprelease:0 ]", - "[ 11/6 → 2/1 | note:bb3 s:square cutoff:1000 lpdecay:0.05 ftype:12db lpsustain:0 lprelease:0 ]", - "[ 2/1 → 13/6 | note:c3 s:square cutoff:1000 lpdecay:0.1 ftype:12db lpsustain:0 lprelease:0 ]", - "[ 13/6 → 7/3 | note:e3 s:square cutoff:1000 lpdecay:0.1 ftype:12db lpsustain:0 lprelease:0 ]", - "[ 7/3 → 5/2 | note:f3 s:square cutoff:1000 lpdecay:0.1 ftype:12db lpsustain:0 lprelease:0 ]", - "[ 5/2 → 8/3 | note:g3 s:square cutoff:1000 lpdecay:0.1 ftype:12db lpsustain:0 lprelease:0 ]", - "[ 8/3 → 17/6 | note:ab3 s:square cutoff:1000 lpdecay:0.1 ftype:12db lpsustain:0 lprelease:0 ]", - "[ 17/6 → 3/1 | note:bb3 s:square cutoff:1000 lpdecay:0.1 ftype:12db lpsustain:0 lprelease:0 ]", - "[ 3/1 → 19/6 | note:c3 s:square cutoff:1000 lpdecay:0.1 ftype:12db lpsustain:0 lprelease:0 ]", - "[ 19/6 → 10/3 | note:e3 s:square cutoff:1000 lpdecay:0.1 ftype:12db lpsustain:0 lprelease:0 ]", - "[ 10/3 → 7/2 | note:f3 s:square cutoff:1000 lpdecay:0.1 ftype:12db lpsustain:0 lprelease:0 ]", - "[ 7/2 → 11/3 | note:g3 s:square cutoff:1000 lpdecay:0.1 ftype:12db lpsustain:0 lprelease:0 ]", - "[ 11/3 → 23/6 | note:ab3 s:square cutoff:1000 lpdecay:0.1 ftype:12db lpsustain:0 lprelease:0 ]", - "[ 23/6 → 4/1 | note:bb3 s:square cutoff:1000 lpdecay:0.1 ftype:12db lpsustain:0 lprelease:0 ]", + "[ 0/1 → 1/1 | note:c2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0.2 lpenv:4 ]", + "[ 1/1 → 2/1 | note:e2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0.2 lpenv:4 ]", + "[ 2/1 → 3/1 | note:f2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0.2 lpenv:4 ]", + "[ 3/1 → 4/1 | note:g2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0.2 lpenv:4 ]", ] `; exports[`runs examples > example "lpenv" example index 0 1`] = ` [ - "[ 0/1 → 1/4 | note:c2 s:sawtooth cutoff:500 lpenv:1 ]", - "[ 1/4 → 1/2 | note:c3 s:sawtooth cutoff:500 lpenv:1 ]", - "[ 1/2 → 3/4 | note:c2 s:sawtooth cutoff:500 lpenv:1 ]", - "[ 3/4 → 1/1 | note:c3 s:sawtooth cutoff:500 lpenv:1 ]", - "[ 1/1 → 5/4 | note:c2 s:sawtooth cutoff:500 lpenv:2 ]", - "[ 5/4 → 3/2 | note:c3 s:sawtooth cutoff:500 lpenv:2 ]", - "[ 3/2 → 7/4 | note:c2 s:sawtooth cutoff:500 lpenv:2 ]", - "[ 7/4 → 2/1 | note:c3 s:sawtooth cutoff:500 lpenv:2 ]", - "[ 2/1 → 9/4 | note:c2 s:sawtooth cutoff:500 lpenv:3 ]", - "[ 9/4 → 5/2 | note:c3 s:sawtooth cutoff:500 lpenv:3 ]", - "[ 5/2 → 11/4 | note:c2 s:sawtooth cutoff:500 lpenv:3 ]", - "[ 11/4 → 3/1 | note:c3 s:sawtooth cutoff:500 lpenv:3 ]", - "[ 3/1 → 13/4 | note:c2 s:sawtooth cutoff:500 lpenv:4 ]", - "[ 13/4 → 7/2 | note:c3 s:sawtooth cutoff:500 lpenv:4 ]", - "[ 7/2 → 15/4 | note:c2 s:sawtooth cutoff:500 lpenv:4 ]", - "[ 15/4 → 4/1 | note:c3 s:sawtooth cutoff:500 lpenv:4 ]", + "[ 0/1 → 1/1 | note:c2 s:sawtooth cutoff:500 lpattack:0.1 lpdecay:0.1 lpsustain:0.5 lpenv:8 ]", + "[ 1/1 → 2/1 | note:e2 s:sawtooth cutoff:500 lpattack:0.1 lpdecay:0.1 lpsustain:0.5 lpenv:8 ]", + "[ 2/1 → 3/1 | note:f2 s:sawtooth cutoff:500 lpattack:0.1 lpdecay:0.1 lpsustain:0.5 lpenv:8 ]", + "[ 3/1 → 4/1 | note:g2 s:sawtooth cutoff:500 lpattack:0.1 lpdecay:0.1 lpsustain:0.5 lpenv:8 ]", ] `; @@ -2896,151 +2944,19 @@ exports[`runs examples > example "lpq" example index 0 1`] = ` exports[`runs examples > example "lprelease" example index 0 1`] = ` [ - "[ 0/1 → 1/4 | note:c3 lprelease:0.1 ftype:12db ]", - "[ 1/4 → 1/2 | note:e3 lprelease:0.1 ftype:12db ]", - "[ 1/2 → 3/4 | note:g3 lprelease:0.1 ftype:12db ]", - "[ 3/4 → 1/1 | note:c4 lprelease:0.1 ftype:12db ]", - "[ 1/1 → 5/4 | note:c3 lprelease:0.25 ftype:12db ]", - "[ 5/4 → 3/2 | note:e3 lprelease:0.25 ftype:12db ]", - "[ 3/2 → 7/4 | note:g3 lprelease:0.25 ftype:12db ]", - "[ 7/4 → 2/1 | note:c4 lprelease:0.25 ftype:12db ]", - "[ 2/1 → 9/4 | note:c3 lprelease:0.5 ftype:12db ]", - "[ 9/4 → 5/2 | note:e3 lprelease:0.5 ftype:12db ]", - "[ 5/2 → 11/4 | note:g3 lprelease:0.5 ftype:12db ]", - "[ 11/4 → 3/1 | note:c4 lprelease:0.5 ftype:12db ]", - "[ 3/1 → 13/4 | note:c3 lprelease:0.1 ftype:12db ]", - "[ 13/4 → 7/2 | note:e3 lprelease:0.1 ftype:12db ]", - "[ 7/2 → 15/4 | note:g3 lprelease:0.1 ftype:12db ]", - "[ 15/4 → 4/1 | note:c4 lprelease:0.1 ftype:12db ]", -] -`; - -exports[`runs examples > example "lprelease" example index 0 2`] = ` -[ - "[ 0/1 → 1/4 | note:c3 hprelease:0.1 ftype:12db ]", - "[ 1/4 → 1/2 | note:e3 hprelease:0.1 ftype:12db ]", - "[ 1/2 → 3/4 | note:g3 hprelease:0.1 ftype:12db ]", - "[ 3/4 → 1/1 | note:c4 hprelease:0.1 ftype:12db ]", - "[ 1/1 → 5/4 | note:c3 hprelease:0.25 ftype:12db ]", - "[ 5/4 → 3/2 | note:e3 hprelease:0.25 ftype:12db ]", - "[ 3/2 → 7/4 | note:g3 hprelease:0.25 ftype:12db ]", - "[ 7/4 → 2/1 | note:c4 hprelease:0.25 ftype:12db ]", - "[ 2/1 → 9/4 | note:c3 hprelease:0.5 ftype:12db ]", - "[ 9/4 → 5/2 | note:e3 hprelease:0.5 ftype:12db ]", - "[ 5/2 → 11/4 | note:g3 hprelease:0.5 ftype:12db ]", - "[ 11/4 → 3/1 | note:c4 hprelease:0.5 ftype:12db ]", - "[ 3/1 → 13/4 | note:c3 hprelease:0.1 ftype:12db ]", - "[ 13/4 → 7/2 | note:e3 hprelease:0.1 ftype:12db ]", - "[ 7/2 → 15/4 | note:g3 hprelease:0.1 ftype:12db ]", - "[ 15/4 → 4/1 | note:c4 hprelease:0.1 ftype:12db ]", -] -`; - -exports[`runs examples > example "lprelease" example index 0 3`] = ` -[ - "[ 0/1 → 1/4 | note:c3 bprelease:0.1 ftype:12db ]", - "[ 1/4 → 1/2 | note:e3 bprelease:0.1 ftype:12db ]", - "[ 1/2 → 3/4 | note:g3 bprelease:0.1 ftype:12db ]", - "[ 3/4 → 1/1 | note:c4 bprelease:0.1 ftype:12db ]", - "[ 1/1 → 5/4 | note:c3 bprelease:0.25 ftype:12db ]", - "[ 5/4 → 3/2 | note:e3 bprelease:0.25 ftype:12db ]", - "[ 3/2 → 7/4 | note:g3 bprelease:0.25 ftype:12db ]", - "[ 7/4 → 2/1 | note:c4 bprelease:0.25 ftype:12db ]", - "[ 2/1 → 9/4 | note:c3 bprelease:0.5 ftype:12db ]", - "[ 9/4 → 5/2 | note:e3 bprelease:0.5 ftype:12db ]", - "[ 5/2 → 11/4 | note:g3 bprelease:0.5 ftype:12db ]", - "[ 11/4 → 3/1 | note:c4 bprelease:0.5 ftype:12db ]", - "[ 3/1 → 13/4 | note:c3 bprelease:0.1 ftype:12db ]", - "[ 13/4 → 7/2 | note:e3 bprelease:0.1 ftype:12db ]", - "[ 7/2 → 15/4 | note:g3 bprelease:0.1 ftype:12db ]", - "[ 15/4 → 4/1 | note:c4 bprelease:0.1 ftype:12db ]", + "[ 0/1 → 1/1 | note:c2 s:sawtooth clip:0.5 cutoff:0 lpenv:4 lprelease:0.5 release:0.5 ]", + "[ 1/1 → 2/1 | note:e2 s:sawtooth clip:0.5 cutoff:0 lpenv:4 lprelease:0.5 release:0.5 ]", + "[ 2/1 → 3/1 | note:f2 s:sawtooth clip:0.5 cutoff:0 lpenv:4 lprelease:0.5 release:0.5 ]", + "[ 3/1 → 4/1 | note:g2 s:sawtooth clip:0.5 cutoff:0 lpenv:4 lprelease:0.5 release:0.5 ]", ] `; exports[`runs examples > example "lpsustain" example index 0 1`] = ` [ - "[ 0/1 → 1/6 | note:c3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.1 ftype:12db ]", - "[ 1/6 → 1/3 | note:e3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.1 ftype:12db ]", - "[ 1/3 → 1/2 | note:f3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.1 ftype:12db ]", - "[ 1/2 → 2/3 | note:g3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.1 ftype:12db ]", - "[ 2/3 → 5/6 | note:ab3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.1 ftype:12db ]", - "[ 5/6 → 1/1 | note:bb3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.1 ftype:12db ]", - "[ 1/1 → 7/6 | note:c3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.5 ftype:12db ]", - "[ 7/6 → 4/3 | note:e3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.5 ftype:12db ]", - "[ 4/3 → 3/2 | note:f3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.5 ftype:12db ]", - "[ 3/2 → 5/3 | note:g3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.5 ftype:12db ]", - "[ 5/3 → 11/6 | note:ab3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.5 ftype:12db ]", - "[ 11/6 → 2/1 | note:bb3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.5 ftype:12db ]", - "[ 2/1 → 13/6 | note:c3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.75 ftype:12db ]", - "[ 13/6 → 7/3 | note:e3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.75 ftype:12db ]", - "[ 7/3 → 5/2 | note:f3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.75 ftype:12db ]", - "[ 5/2 → 8/3 | note:g3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.75 ftype:12db ]", - "[ 8/3 → 17/6 | note:ab3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.75 ftype:12db ]", - "[ 17/6 → 3/1 | note:bb3 s:square cutoff:200 lpdecay:0.1 lpsustain:0.75 ftype:12db ]", - "[ 3/1 → 19/6 | note:c3 s:square cutoff:200 lpdecay:0.1 lpsustain:1 ftype:12db ]", - "[ 19/6 → 10/3 | note:e3 s:square cutoff:200 lpdecay:0.1 lpsustain:1 ftype:12db ]", - "[ 10/3 → 7/2 | note:f3 s:square cutoff:200 lpdecay:0.1 lpsustain:1 ftype:12db ]", - "[ 7/2 → 11/3 | note:g3 s:square cutoff:200 lpdecay:0.1 lpsustain:1 ftype:12db ]", - "[ 11/3 → 23/6 | note:ab3 s:square cutoff:200 lpdecay:0.1 lpsustain:1 ftype:12db ]", - "[ 23/6 → 4/1 | note:bb3 s:square cutoff:200 lpdecay:0.1 lpsustain:1 ftype:12db ]", -] -`; - -exports[`runs examples > example "lpsustain" example index 0 2`] = ` -[ - "[ 0/1 → 1/6 | note:c3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.1 ftype:12db ]", - "[ 1/6 → 1/3 | note:e3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.1 ftype:12db ]", - "[ 1/3 → 1/2 | note:f3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.1 ftype:12db ]", - "[ 1/2 → 2/3 | note:g3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.1 ftype:12db ]", - "[ 2/3 → 5/6 | note:ab3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.1 ftype:12db ]", - "[ 5/6 → 1/1 | note:bb3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.1 ftype:12db ]", - "[ 1/1 → 7/6 | note:c3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.5 ftype:12db ]", - "[ 7/6 → 4/3 | note:e3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.5 ftype:12db ]", - "[ 4/3 → 3/2 | note:f3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.5 ftype:12db ]", - "[ 3/2 → 5/3 | note:g3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.5 ftype:12db ]", - "[ 5/3 → 11/6 | note:ab3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.5 ftype:12db ]", - "[ 11/6 → 2/1 | note:bb3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.5 ftype:12db ]", - "[ 2/1 → 13/6 | note:c3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.75 ftype:12db ]", - "[ 13/6 → 7/3 | note:e3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.75 ftype:12db ]", - "[ 7/3 → 5/2 | note:f3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.75 ftype:12db ]", - "[ 5/2 → 8/3 | note:g3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.75 ftype:12db ]", - "[ 8/3 → 17/6 | note:ab3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.75 ftype:12db ]", - "[ 17/6 → 3/1 | note:bb3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.75 ftype:12db ]", - "[ 3/1 → 19/6 | note:c3 s:square hcutoff:200 hpdecay:0.1 hpsustain:1 ftype:12db ]", - "[ 19/6 → 10/3 | note:e3 s:square hcutoff:200 hpdecay:0.1 hpsustain:1 ftype:12db ]", - "[ 10/3 → 7/2 | note:f3 s:square hcutoff:200 hpdecay:0.1 hpsustain:1 ftype:12db ]", - "[ 7/2 → 11/3 | note:g3 s:square hcutoff:200 hpdecay:0.1 hpsustain:1 ftype:12db ]", - "[ 11/3 → 23/6 | note:ab3 s:square hcutoff:200 hpdecay:0.1 hpsustain:1 ftype:12db ]", - "[ 23/6 → 4/1 | note:bb3 s:square hcutoff:200 hpdecay:0.1 hpsustain:1 ftype:12db ]", -] -`; - -exports[`runs examples > example "lpsustain" example index 0 3`] = ` -[ - "[ 0/1 → 1/6 | note:c3 s:square bandf:200 bpdecay:0.1 bpsustain:0.1 ftype:12db ]", - "[ 1/6 → 1/3 | note:e3 s:square bandf:200 bpdecay:0.1 bpsustain:0.1 ftype:12db ]", - "[ 1/3 → 1/2 | note:f3 s:square bandf:200 bpdecay:0.1 bpsustain:0.1 ftype:12db ]", - "[ 1/2 → 2/3 | note:g3 s:square bandf:200 bpdecay:0.1 bpsustain:0.1 ftype:12db ]", - "[ 2/3 → 5/6 | note:ab3 s:square bandf:200 bpdecay:0.1 bpsustain:0.1 ftype:12db ]", - "[ 5/6 → 1/1 | note:bb3 s:square bandf:200 bpdecay:0.1 bpsustain:0.1 ftype:12db ]", - "[ 1/1 → 7/6 | note:c3 s:square bandf:200 bpdecay:0.1 bpsustain:0.5 ftype:12db ]", - "[ 7/6 → 4/3 | note:e3 s:square bandf:200 bpdecay:0.1 bpsustain:0.5 ftype:12db ]", - "[ 4/3 → 3/2 | note:f3 s:square bandf:200 bpdecay:0.1 bpsustain:0.5 ftype:12db ]", - "[ 3/2 → 5/3 | note:g3 s:square bandf:200 bpdecay:0.1 bpsustain:0.5 ftype:12db ]", - "[ 5/3 → 11/6 | note:ab3 s:square bandf:200 bpdecay:0.1 bpsustain:0.5 ftype:12db ]", - "[ 11/6 → 2/1 | note:bb3 s:square bandf:200 bpdecay:0.1 bpsustain:0.5 ftype:12db ]", - "[ 2/1 → 13/6 | note:c3 s:square bandf:200 bpdecay:0.1 bpsustain:0.75 ftype:12db ]", - "[ 13/6 → 7/3 | note:e3 s:square bandf:200 bpdecay:0.1 bpsustain:0.75 ftype:12db ]", - "[ 7/3 → 5/2 | note:f3 s:square bandf:200 bpdecay:0.1 bpsustain:0.75 ftype:12db ]", - "[ 5/2 → 8/3 | note:g3 s:square bandf:200 bpdecay:0.1 bpsustain:0.75 ftype:12db ]", - "[ 8/3 → 17/6 | note:ab3 s:square bandf:200 bpdecay:0.1 bpsustain:0.75 ftype:12db ]", - "[ 17/6 → 3/1 | note:bb3 s:square bandf:200 bpdecay:0.1 bpsustain:0.75 ftype:12db ]", - "[ 3/1 → 19/6 | note:c3 s:square bandf:200 bpdecay:0.1 bpsustain:1 ftype:12db ]", - "[ 19/6 → 10/3 | note:e3 s:square bandf:200 bpdecay:0.1 bpsustain:1 ftype:12db ]", - "[ 10/3 → 7/2 | note:f3 s:square bandf:200 bpdecay:0.1 bpsustain:1 ftype:12db ]", - "[ 7/2 → 11/3 | note:g3 s:square bandf:200 bpdecay:0.1 bpsustain:1 ftype:12db ]", - "[ 11/3 → 23/6 | note:ab3 s:square bandf:200 bpdecay:0.1 bpsustain:1 ftype:12db ]", - "[ 23/6 → 4/1 | note:bb3 s:square bandf:200 bpdecay:0.1 bpsustain:1 ftype:12db ]", + "[ 0/1 → 1/1 | note:c2 s:sawtooth cutoff:0 lpdecay:0.5 lpsustain:0 lpenv:4 ]", + "[ 1/1 → 2/1 | note:e2 s:sawtooth cutoff:0 lpdecay:0.5 lpsustain:0 lpenv:4 ]", + "[ 2/1 → 3/1 | note:f2 s:sawtooth cutoff:0 lpdecay:0.5 lpsustain:0 lpenv:4 ]", + "[ 3/1 → 4/1 | note:g2 s:sawtooth cutoff:0 lpdecay:0.5 lpsustain:0 lpenv:4 ]", ] `; From 9d5f9190234becd327b800384b30b1960063c1fb Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Fri, 15 Sep 2023 23:12:39 +0200 Subject: [PATCH 19/39] add all filter envelope examples to doc --- packages/core/controls.mjs | 100 ++++++++++++++++++---------- website/src/pages/learn/effects.mdx | 69 ++++++++++++++++--- 2 files changed, 127 insertions(+), 42 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index c31c68aa..dd865df5 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -397,8 +397,17 @@ const generic_params = [ * @param {number | Pattern} modulation depth of the highpass filter envelope between 0 and _n_ * @synonyms hpe * @example - * note("c2 c3").fast(2).sound("sawtooth") - * .hcutoff(500).hpenv("<1 2 3 4 5 6 7 8>") + * note("") + * .sound('sawtooth') + * .hpf(500) + * .hpa(.1).hpd(.1).hps(.5) + * .hpenv("<8 4 2 0>/4") + * @example + * note("") + * .sound('sawtooth') + * .hpf(500) + * .hpa(.5) + * .hpenv("<2 -2>/4") */ ['hpenv', 'hpe'], /** @@ -407,8 +416,11 @@ const generic_params = [ * @param {number | Pattern} modulation depth of the bandpass filter envelope between 0 and _n_ * @synonyms bpe * @example - * note("c2 c3").fast(2).sound("sawtooth") - * .bandf(500).bpenv("<1 2 3 4 5 6 7 8>") + * note("") + * .sound('sawtooth') + * .bpf(500) + * .bpa(.1).bpd(.1).bps(.5) + * .bpenv("<8 4 2 0>/4") */ ['bpenv', 'bpe'], /** @@ -430,22 +442,24 @@ const generic_params = [ * @param {number | Pattern} attack time of the highpass filter envelope * @synonyms hpa * @example - * note("c3 e3 f3 g3 ab3 bb3") - * .sound('square').hcutoff(1000) - * .hpattack("<0.5 0.25 0.1 0.01>/2").ftype("12db") - * .release(0.2).attack(0) + * note("") + * .sound('sawtooth') + * .hpf(500) + * .hpa("<.5 .25 .1 .01>/4") + * .hpenv(4) */ ['hpattack', 'hpa'], /** * Sets the attack duration for the bandpass filter envelope. - * @name hpattack + * @name bpattack * @param {number | Pattern} attack time of the bandpass filter envelope * @synonyms bpa * @example - * note("c3 e3 f3 g3 ab3 bb3") - * .sound('square').bandf(1000) - * .bpattack("<0.05 0.1 0.25 0.5>/2").ftype("12db") - * .release(0.2).attack(0) + * note("") + * .sound('sawtooth') + * .bpf(500) + * .bpa("<.5 .25 .1 .01>/4") + * .bpenv(4) */ ['bpattack', 'bpa'], /** @@ -468,11 +482,12 @@ const generic_params = [ * @param {number | Pattern} decay time of the highpass filter envelope * @synonyms hpd * @example - * "baba" - * note("c3 e3 f3 g3 ab3 bb3") - * .sound('square').hcutoff(1000) - * .hpdecay("<0.05 0.1 0.125>/2") - * .ftype("12db").hps(0).hpr(0) + * note("") + * .sound('sawtooth') + * .hpf(500) + * .hpd("<.5 .25 .1 0>/4") + * .hps(0.2) + * .hpenv(4) */ ['hpdecay', 'hpd'], /** @@ -481,11 +496,12 @@ const generic_params = [ * @param {number | Pattern} decay time of the bandpass filter envelope * @synonyms bpd * @example - * "baba" - * note("c3 e3 f3 g3 ab3 bb3") - * .sound('square').bandf(1000) - * .bpdecay("<0.05 0.1 0.125>/2") - * .ftype("12db").bps(0).bpr(0) + * note("") + * .sound('sawtooth') + * .bpf(500) + * .bpd("<.5 .25 .1 0>/4") + * .bps(0.2) + * .bpenv(4) */ ['bpdecay', 'bpd'], /** @@ -508,22 +524,26 @@ const generic_params = [ * @param {number | Pattern} sustain amplitude of the highpass filter envelope * @synonyms hps * @example - * note("c3 e3 f3 g3 ab3 bb3") - * .sound('square').hcutoff(200) - * .hpd(0.1).hpsustain("<0.1 0.5 0.75 1>") - * .ftype("12db") + * note("") + * .sound('sawtooth') + * .hpf(0) + * .hpd(.5) + * .hps("<0 .25 .5 1>/4") + * .hpenv(4) */ ['hpsustain', 'hps'], /** * Sets the sustain amplitude for the bandpass filter envelope. - * @name hpsustain + * @name bpsustain * @param {number | Pattern} sustain amplitude of the bandpass filter envelope * @synonyms bps * @example - * note("c3 e3 f3 g3 ab3 bb3") - * .sound('square').bandf(200) - * .bpd(0.1).bpsustain("<0.1 0.5 0.75 1>") - * .ftype("12db") + * note("") + * .sound('sawtooth') + * .bpf(0) + * .bpd(.5) + * .bps("<0 .25 .5 1>/4") + * .bpenv(4) */ ['bpsustain', 'bps'], /** @@ -547,7 +567,13 @@ const generic_params = [ * @param {number | Pattern} release time of the highpass filter envelope * @synonyms hpr * @example - * note("c3 e3 g3 c4").hpr("<0.1 0.25 0.5>").ftype("12db") + * note("") + * .sound('sawtooth') + * .clip(.5) + * .hpf(0) + * .hpenv(4) + * .hpr("<.5 .25 .1 0>/4") + * .release(.5) */ ['hprelease', 'hpr'], /** @@ -556,7 +582,13 @@ const generic_params = [ * @param {number | Pattern} release time of the bandpass filter envelope * @synonyms bpr * @example - * note("c3 e3 g3 c4").bpr("<0.1 0.25 0.5>").ftype("12db") + * note("") + * .sound('sawtooth') + * .clip(.5) + * .bpf(0) + * .bpenv(4) + * .bpr("<.5 .25 .1 0>/4") + * .release(.5) */ ['bprelease', 'bpr'], ['ftype'], diff --git a/website/src/pages/learn/effects.mdx b/website/src/pages/learn/effects.mdx index 90f9510e..62e3a52d 100644 --- a/website/src/pages/learn/effects.mdx +++ b/website/src/pages/learn/effects.mdx @@ -93,32 +93,85 @@ There is one filter envelope for each filter type and thus one set of envelope f ## lpattack -- Also `hpattack` and `bpattack`. - ## lpdecay -- Also `hpdecay` and `bpdecay`. - ## lpsustain -- Also `hpsustain` and `bpsustain`. - ## lprelease -- Also `hprelease` and `bprelease`. - ## lpenv +## hpattack + + + +## hpdecay + + + +## hpsustain + + + +## hprelease + + + +## hpenv + + + +## hpattack + + + +## hpdecay + + + +## hpsustain + + + +## hprelease + + + +## hpenv + + + +## bpattack + + + +## bpdecay + + + +## bpsustain + + + +## bprelease + + + +## bpenv + + + + # Dynamics ## gain From 828e4759219b49ec3d403856e6f0502cb72f5aa9 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Fri, 15 Sep 2023 23:12:51 +0200 Subject: [PATCH 20/39] support negative fenv --- packages/superdough/helpers.mjs | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 45162a36..b6530343 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -1,4 +1,5 @@ import { getAudioContext } from './superdough.mjs'; +import { clamp } from './util.mjs'; export function gainNode(value) { const node = getAudioContext().createGain(); @@ -85,9 +86,19 @@ export function createFilter(context, type, frequency, Q, attack, decay, sustain filter.frequency.value = frequency; // Apply ADSR to filter frequency - if (fenv > 0) { - const min = frequency; - const max = Math.min(frequency + 200 * 2 ** fenv, 20000); + if (fenv !== 0) { + let min = 0; + let max = Math.sign(fenv) * 200 * 2 ** Math.abs(fenv); + if (max < min) { + // offset by max: keep range when *penv sign is flipped + // comment those lines out to center around cutoff instead peak + min += Math.abs(max); + max += Math.abs(max); + } + + min = clamp(min + frequency, 0, 20000); + max = clamp(max + frequency, 0, 20000); + // console.log('min', min, 'max', max); getParamADSR(filter.frequency, attack, decay, sustain, release, min, max, start, end); return filter; } From 7e55258bbf63c91756007254f62dd39e152ff5a6 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Fri, 15 Sep 2023 23:13:30 +0200 Subject: [PATCH 21/39] update snapshots --- test/__snapshots__/examples.test.mjs.snap | 277 +++++----------------- 1 file changed, 59 insertions(+), 218 deletions(-) diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 7f9dd6f9..ed05a561 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -900,53 +900,30 @@ exports[`runs examples > example "begin" example index 0 1`] = ` ] `; +exports[`runs examples > example "bpattack" example index 0 1`] = ` +[ + "[ 0/1 → 1/1 | note:c2 s:sawtooth bandf:500 bpattack:0.5 bpenv:4 ]", + "[ 1/1 → 2/1 | note:e2 s:sawtooth bandf:500 bpattack:0.5 bpenv:4 ]", + "[ 2/1 → 3/1 | note:f2 s:sawtooth bandf:500 bpattack:0.5 bpenv:4 ]", + "[ 3/1 → 4/1 | note:g2 s:sawtooth bandf:500 bpattack:0.5 bpenv:4 ]", +] +`; + exports[`runs examples > example "bpdecay" example index 0 1`] = ` [ - "[ 0/1 → 1/6 | note:c3 s:square bandf:1000 bpdecay:0.05 ftype:12db bpsustain:0 bprelease:0 ]", - "[ 1/6 → 1/3 | note:e3 s:square bandf:1000 bpdecay:0.05 ftype:12db bpsustain:0 bprelease:0 ]", - "[ 1/3 → 1/2 | note:f3 s:square bandf:1000 bpdecay:0.05 ftype:12db bpsustain:0 bprelease:0 ]", - "[ 1/2 → 2/3 | note:g3 s:square bandf:1000 bpdecay:0.05 ftype:12db bpsustain:0 bprelease:0 ]", - "[ 2/3 → 5/6 | note:ab3 s:square bandf:1000 bpdecay:0.05 ftype:12db bpsustain:0 bprelease:0 ]", - "[ 5/6 → 1/1 | note:bb3 s:square bandf:1000 bpdecay:0.05 ftype:12db bpsustain:0 bprelease:0 ]", - "[ 1/1 → 7/6 | note:c3 s:square bandf:1000 bpdecay:0.05 ftype:12db bpsustain:0 bprelease:0 ]", - "[ 7/6 → 4/3 | note:e3 s:square bandf:1000 bpdecay:0.05 ftype:12db bpsustain:0 bprelease:0 ]", - "[ 4/3 → 3/2 | note:f3 s:square bandf:1000 bpdecay:0.05 ftype:12db bpsustain:0 bprelease:0 ]", - "[ 3/2 → 5/3 | note:g3 s:square bandf:1000 bpdecay:0.05 ftype:12db bpsustain:0 bprelease:0 ]", - "[ 5/3 → 11/6 | note:ab3 s:square bandf:1000 bpdecay:0.05 ftype:12db bpsustain:0 bprelease:0 ]", - "[ 11/6 → 2/1 | note:bb3 s:square bandf:1000 bpdecay:0.05 ftype:12db bpsustain:0 bprelease:0 ]", - "[ 2/1 → 13/6 | note:c3 s:square bandf:1000 bpdecay:0.1 ftype:12db bpsustain:0 bprelease:0 ]", - "[ 13/6 → 7/3 | note:e3 s:square bandf:1000 bpdecay:0.1 ftype:12db bpsustain:0 bprelease:0 ]", - "[ 7/3 → 5/2 | note:f3 s:square bandf:1000 bpdecay:0.1 ftype:12db bpsustain:0 bprelease:0 ]", - "[ 5/2 → 8/3 | note:g3 s:square bandf:1000 bpdecay:0.1 ftype:12db bpsustain:0 bprelease:0 ]", - "[ 8/3 → 17/6 | note:ab3 s:square bandf:1000 bpdecay:0.1 ftype:12db bpsustain:0 bprelease:0 ]", - "[ 17/6 → 3/1 | note:bb3 s:square bandf:1000 bpdecay:0.1 ftype:12db bpsustain:0 bprelease:0 ]", - "[ 3/1 → 19/6 | note:c3 s:square bandf:1000 bpdecay:0.1 ftype:12db bpsustain:0 bprelease:0 ]", - "[ 19/6 → 10/3 | note:e3 s:square bandf:1000 bpdecay:0.1 ftype:12db bpsustain:0 bprelease:0 ]", - "[ 10/3 → 7/2 | note:f3 s:square bandf:1000 bpdecay:0.1 ftype:12db bpsustain:0 bprelease:0 ]", - "[ 7/2 → 11/3 | note:g3 s:square bandf:1000 bpdecay:0.1 ftype:12db bpsustain:0 bprelease:0 ]", - "[ 11/3 → 23/6 | note:ab3 s:square bandf:1000 bpdecay:0.1 ftype:12db bpsustain:0 bprelease:0 ]", - "[ 23/6 → 4/1 | note:bb3 s:square bandf:1000 bpdecay:0.1 ftype:12db bpsustain:0 bprelease:0 ]", + "[ 0/1 → 1/1 | note:c2 s:sawtooth bandf:500 bpdecay:0.5 bpsustain:0.2 bpenv:4 ]", + "[ 1/1 → 2/1 | note:e2 s:sawtooth bandf:500 bpdecay:0.5 bpsustain:0.2 bpenv:4 ]", + "[ 2/1 → 3/1 | note:f2 s:sawtooth bandf:500 bpdecay:0.5 bpsustain:0.2 bpenv:4 ]", + "[ 3/1 → 4/1 | note:g2 s:sawtooth bandf:500 bpdecay:0.5 bpsustain:0.2 bpenv:4 ]", ] `; exports[`runs examples > example "bpenv" example index 0 1`] = ` [ - "[ 0/1 → 1/4 | note:c2 s:sawtooth bandf:500 bpenv:1 ]", - "[ 1/4 → 1/2 | note:c3 s:sawtooth bandf:500 bpenv:1 ]", - "[ 1/2 → 3/4 | note:c2 s:sawtooth bandf:500 bpenv:1 ]", - "[ 3/4 → 1/1 | note:c3 s:sawtooth bandf:500 bpenv:1 ]", - "[ 1/1 → 5/4 | note:c2 s:sawtooth bandf:500 bpenv:2 ]", - "[ 5/4 → 3/2 | note:c3 s:sawtooth bandf:500 bpenv:2 ]", - "[ 3/2 → 7/4 | note:c2 s:sawtooth bandf:500 bpenv:2 ]", - "[ 7/4 → 2/1 | note:c3 s:sawtooth bandf:500 bpenv:2 ]", - "[ 2/1 → 9/4 | note:c2 s:sawtooth bandf:500 bpenv:3 ]", - "[ 9/4 → 5/2 | note:c3 s:sawtooth bandf:500 bpenv:3 ]", - "[ 5/2 → 11/4 | note:c2 s:sawtooth bandf:500 bpenv:3 ]", - "[ 11/4 → 3/1 | note:c3 s:sawtooth bandf:500 bpenv:3 ]", - "[ 3/1 → 13/4 | note:c2 s:sawtooth bandf:500 bpenv:4 ]", - "[ 13/4 → 7/2 | note:c3 s:sawtooth bandf:500 bpenv:4 ]", - "[ 7/2 → 15/4 | note:c2 s:sawtooth bandf:500 bpenv:4 ]", - "[ 15/4 → 4/1 | note:c3 s:sawtooth bandf:500 bpenv:4 ]", + "[ 0/1 → 1/1 | note:c2 s:sawtooth bandf:500 bpattack:0.1 bpdecay:0.1 bpsustain:0.5 bpenv:8 ]", + "[ 1/1 → 2/1 | note:e2 s:sawtooth bandf:500 bpattack:0.1 bpdecay:0.1 bpsustain:0.5 bpenv:8 ]", + "[ 2/1 → 3/1 | note:f2 s:sawtooth bandf:500 bpattack:0.1 bpdecay:0.1 bpsustain:0.5 bpenv:8 ]", + "[ 3/1 → 4/1 | note:g2 s:sawtooth bandf:500 bpattack:0.1 bpdecay:0.1 bpsustain:0.5 bpenv:8 ]", ] `; @@ -990,22 +967,19 @@ exports[`runs examples > example "bpq" example index 0 1`] = ` exports[`runs examples > example "bprelease" example index 0 1`] = ` [ - "[ 0/1 → 1/4 | note:c3 bprelease:0.1 ftype:12db ]", - "[ 1/4 → 1/2 | note:e3 bprelease:0.1 ftype:12db ]", - "[ 1/2 → 3/4 | note:g3 bprelease:0.1 ftype:12db ]", - "[ 3/4 → 1/1 | note:c4 bprelease:0.1 ftype:12db ]", - "[ 1/1 → 5/4 | note:c3 bprelease:0.25 ftype:12db ]", - "[ 5/4 → 3/2 | note:e3 bprelease:0.25 ftype:12db ]", - "[ 3/2 → 7/4 | note:g3 bprelease:0.25 ftype:12db ]", - "[ 7/4 → 2/1 | note:c4 bprelease:0.25 ftype:12db ]", - "[ 2/1 → 9/4 | note:c3 bprelease:0.5 ftype:12db ]", - "[ 9/4 → 5/2 | note:e3 bprelease:0.5 ftype:12db ]", - "[ 5/2 → 11/4 | note:g3 bprelease:0.5 ftype:12db ]", - "[ 11/4 → 3/1 | note:c4 bprelease:0.5 ftype:12db ]", - "[ 3/1 → 13/4 | note:c3 bprelease:0.1 ftype:12db ]", - "[ 13/4 → 7/2 | note:e3 bprelease:0.1 ftype:12db ]", - "[ 7/2 → 15/4 | note:g3 bprelease:0.1 ftype:12db ]", - "[ 15/4 → 4/1 | note:c4 bprelease:0.1 ftype:12db ]", + "[ 0/1 → 1/1 | note:c2 s:sawtooth clip:0.5 bandf:0 bpenv:4 bprelease:0.5 release:0.5 ]", + "[ 1/1 → 2/1 | note:e2 s:sawtooth clip:0.5 bandf:0 bpenv:4 bprelease:0.5 release:0.5 ]", + "[ 2/1 → 3/1 | note:f2 s:sawtooth clip:0.5 bandf:0 bpenv:4 bprelease:0.5 release:0.5 ]", + "[ 3/1 → 4/1 | note:g2 s:sawtooth clip:0.5 bandf:0 bpenv:4 bprelease:0.5 release:0.5 ]", +] +`; + +exports[`runs examples > example "bpsustain" example index 0 1`] = ` +[ + "[ 0/1 → 1/1 | note:c2 s:sawtooth bandf:0 bpdecay:0.5 bpsustain:0 bpenv:4 ]", + "[ 1/1 → 2/1 | note:e2 s:sawtooth bandf:0 bpdecay:0.5 bpsustain:0 bpenv:4 ]", + "[ 2/1 → 3/1 | note:f2 s:sawtooth bandf:0 bpdecay:0.5 bpsustain:0 bpenv:4 ]", + "[ 3/1 → 4/1 | note:g2 s:sawtooth bandf:0 bpdecay:0.5 bpsustain:0 bpenv:4 ]", ] `; @@ -2123,109 +2097,37 @@ exports[`runs examples > example "gain" example index 0 1`] = ` exports[`runs examples > example "hpattack" example index 0 1`] = ` [ - "[ 0/1 → 1/6 | note:c3 s:square hcutoff:1000 hpattack:0.5 ftype:12db release:0.2 attack:0 ]", - "[ 1/6 → 1/3 | note:e3 s:square hcutoff:1000 hpattack:0.5 ftype:12db release:0.2 attack:0 ]", - "[ 1/3 → 1/2 | note:f3 s:square hcutoff:1000 hpattack:0.5 ftype:12db release:0.2 attack:0 ]", - "[ 1/2 → 2/3 | note:g3 s:square hcutoff:1000 hpattack:0.5 ftype:12db release:0.2 attack:0 ]", - "[ 2/3 → 5/6 | note:ab3 s:square hcutoff:1000 hpattack:0.5 ftype:12db release:0.2 attack:0 ]", - "[ 5/6 → 1/1 | note:bb3 s:square hcutoff:1000 hpattack:0.5 ftype:12db release:0.2 attack:0 ]", - "[ 1/1 → 7/6 | note:c3 s:square hcutoff:1000 hpattack:0.5 ftype:12db release:0.2 attack:0 ]", - "[ 7/6 → 4/3 | note:e3 s:square hcutoff:1000 hpattack:0.5 ftype:12db release:0.2 attack:0 ]", - "[ 4/3 → 3/2 | note:f3 s:square hcutoff:1000 hpattack:0.5 ftype:12db release:0.2 attack:0 ]", - "[ 3/2 → 5/3 | note:g3 s:square hcutoff:1000 hpattack:0.5 ftype:12db release:0.2 attack:0 ]", - "[ 5/3 → 11/6 | note:ab3 s:square hcutoff:1000 hpattack:0.5 ftype:12db release:0.2 attack:0 ]", - "[ 11/6 → 2/1 | note:bb3 s:square hcutoff:1000 hpattack:0.5 ftype:12db release:0.2 attack:0 ]", - "[ 2/1 → 13/6 | note:c3 s:square hcutoff:1000 hpattack:0.25 ftype:12db release:0.2 attack:0 ]", - "[ 13/6 → 7/3 | note:e3 s:square hcutoff:1000 hpattack:0.25 ftype:12db release:0.2 attack:0 ]", - "[ 7/3 → 5/2 | note:f3 s:square hcutoff:1000 hpattack:0.25 ftype:12db release:0.2 attack:0 ]", - "[ 5/2 → 8/3 | note:g3 s:square hcutoff:1000 hpattack:0.25 ftype:12db release:0.2 attack:0 ]", - "[ 8/3 → 17/6 | note:ab3 s:square hcutoff:1000 hpattack:0.25 ftype:12db release:0.2 attack:0 ]", - "[ 17/6 → 3/1 | note:bb3 s:square hcutoff:1000 hpattack:0.25 ftype:12db release:0.2 attack:0 ]", - "[ 3/1 → 19/6 | note:c3 s:square hcutoff:1000 hpattack:0.25 ftype:12db release:0.2 attack:0 ]", - "[ 19/6 → 10/3 | note:e3 s:square hcutoff:1000 hpattack:0.25 ftype:12db release:0.2 attack:0 ]", - "[ 10/3 → 7/2 | note:f3 s:square hcutoff:1000 hpattack:0.25 ftype:12db release:0.2 attack:0 ]", - "[ 7/2 → 11/3 | note:g3 s:square hcutoff:1000 hpattack:0.25 ftype:12db release:0.2 attack:0 ]", - "[ 11/3 → 23/6 | note:ab3 s:square hcutoff:1000 hpattack:0.25 ftype:12db release:0.2 attack:0 ]", - "[ 23/6 → 4/1 | note:bb3 s:square hcutoff:1000 hpattack:0.25 ftype:12db release:0.2 attack:0 ]", -] -`; - -exports[`runs examples > example "hpattack" example index 0 2`] = ` -[ - "[ 0/1 → 1/6 | note:c3 s:square bandf:1000 bpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 1/6 → 1/3 | note:e3 s:square bandf:1000 bpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 1/3 → 1/2 | note:f3 s:square bandf:1000 bpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 1/2 → 2/3 | note:g3 s:square bandf:1000 bpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 2/3 → 5/6 | note:ab3 s:square bandf:1000 bpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 5/6 → 1/1 | note:bb3 s:square bandf:1000 bpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 1/1 → 7/6 | note:c3 s:square bandf:1000 bpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 7/6 → 4/3 | note:e3 s:square bandf:1000 bpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 4/3 → 3/2 | note:f3 s:square bandf:1000 bpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 3/2 → 5/3 | note:g3 s:square bandf:1000 bpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 5/3 → 11/6 | note:ab3 s:square bandf:1000 bpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 11/6 → 2/1 | note:bb3 s:square bandf:1000 bpattack:0.05 ftype:12db release:0.2 attack:0 ]", - "[ 2/1 → 13/6 | note:c3 s:square bandf:1000 bpattack:0.1 ftype:12db release:0.2 attack:0 ]", - "[ 13/6 → 7/3 | note:e3 s:square bandf:1000 bpattack:0.1 ftype:12db release:0.2 attack:0 ]", - "[ 7/3 → 5/2 | note:f3 s:square bandf:1000 bpattack:0.1 ftype:12db release:0.2 attack:0 ]", - "[ 5/2 → 8/3 | note:g3 s:square bandf:1000 bpattack:0.1 ftype:12db release:0.2 attack:0 ]", - "[ 8/3 → 17/6 | note:ab3 s:square bandf:1000 bpattack:0.1 ftype:12db release:0.2 attack:0 ]", - "[ 17/6 → 3/1 | note:bb3 s:square bandf:1000 bpattack:0.1 ftype:12db release:0.2 attack:0 ]", - "[ 3/1 → 19/6 | note:c3 s:square bandf:1000 bpattack:0.1 ftype:12db release:0.2 attack:0 ]", - "[ 19/6 → 10/3 | note:e3 s:square bandf:1000 bpattack:0.1 ftype:12db release:0.2 attack:0 ]", - "[ 10/3 → 7/2 | note:f3 s:square bandf:1000 bpattack:0.1 ftype:12db release:0.2 attack:0 ]", - "[ 7/2 → 11/3 | note:g3 s:square bandf:1000 bpattack:0.1 ftype:12db release:0.2 attack:0 ]", - "[ 11/3 → 23/6 | note:ab3 s:square bandf:1000 bpattack:0.1 ftype:12db release:0.2 attack:0 ]", - "[ 23/6 → 4/1 | note:bb3 s:square bandf:1000 bpattack:0.1 ftype:12db release:0.2 attack:0 ]", + "[ 0/1 → 1/1 | note:c2 s:sawtooth hcutoff:500 hpattack:0.5 hpenv:4 ]", + "[ 1/1 → 2/1 | note:e2 s:sawtooth hcutoff:500 hpattack:0.5 hpenv:4 ]", + "[ 2/1 → 3/1 | note:f2 s:sawtooth hcutoff:500 hpattack:0.5 hpenv:4 ]", + "[ 3/1 → 4/1 | note:g2 s:sawtooth hcutoff:500 hpattack:0.5 hpenv:4 ]", ] `; exports[`runs examples > example "hpdecay" example index 0 1`] = ` [ - "[ 0/1 → 1/6 | note:c3 s:square hcutoff:1000 hpdecay:0.05 ftype:12db hpsustain:0 hprelease:0 ]", - "[ 1/6 → 1/3 | note:e3 s:square hcutoff:1000 hpdecay:0.05 ftype:12db hpsustain:0 hprelease:0 ]", - "[ 1/3 → 1/2 | note:f3 s:square hcutoff:1000 hpdecay:0.05 ftype:12db hpsustain:0 hprelease:0 ]", - "[ 1/2 → 2/3 | note:g3 s:square hcutoff:1000 hpdecay:0.05 ftype:12db hpsustain:0 hprelease:0 ]", - "[ 2/3 → 5/6 | note:ab3 s:square hcutoff:1000 hpdecay:0.05 ftype:12db hpsustain:0 hprelease:0 ]", - "[ 5/6 → 1/1 | note:bb3 s:square hcutoff:1000 hpdecay:0.05 ftype:12db hpsustain:0 hprelease:0 ]", - "[ 1/1 → 7/6 | note:c3 s:square hcutoff:1000 hpdecay:0.05 ftype:12db hpsustain:0 hprelease:0 ]", - "[ 7/6 → 4/3 | note:e3 s:square hcutoff:1000 hpdecay:0.05 ftype:12db hpsustain:0 hprelease:0 ]", - "[ 4/3 → 3/2 | note:f3 s:square hcutoff:1000 hpdecay:0.05 ftype:12db hpsustain:0 hprelease:0 ]", - "[ 3/2 → 5/3 | note:g3 s:square hcutoff:1000 hpdecay:0.05 ftype:12db hpsustain:0 hprelease:0 ]", - "[ 5/3 → 11/6 | note:ab3 s:square hcutoff:1000 hpdecay:0.05 ftype:12db hpsustain:0 hprelease:0 ]", - "[ 11/6 → 2/1 | note:bb3 s:square hcutoff:1000 hpdecay:0.05 ftype:12db hpsustain:0 hprelease:0 ]", - "[ 2/1 → 13/6 | note:c3 s:square hcutoff:1000 hpdecay:0.1 ftype:12db hpsustain:0 hprelease:0 ]", - "[ 13/6 → 7/3 | note:e3 s:square hcutoff:1000 hpdecay:0.1 ftype:12db hpsustain:0 hprelease:0 ]", - "[ 7/3 → 5/2 | note:f3 s:square hcutoff:1000 hpdecay:0.1 ftype:12db hpsustain:0 hprelease:0 ]", - "[ 5/2 → 8/3 | note:g3 s:square hcutoff:1000 hpdecay:0.1 ftype:12db hpsustain:0 hprelease:0 ]", - "[ 8/3 → 17/6 | note:ab3 s:square hcutoff:1000 hpdecay:0.1 ftype:12db hpsustain:0 hprelease:0 ]", - "[ 17/6 → 3/1 | note:bb3 s:square hcutoff:1000 hpdecay:0.1 ftype:12db hpsustain:0 hprelease:0 ]", - "[ 3/1 → 19/6 | note:c3 s:square hcutoff:1000 hpdecay:0.1 ftype:12db hpsustain:0 hprelease:0 ]", - "[ 19/6 → 10/3 | note:e3 s:square hcutoff:1000 hpdecay:0.1 ftype:12db hpsustain:0 hprelease:0 ]", - "[ 10/3 → 7/2 | note:f3 s:square hcutoff:1000 hpdecay:0.1 ftype:12db hpsustain:0 hprelease:0 ]", - "[ 7/2 → 11/3 | note:g3 s:square hcutoff:1000 hpdecay:0.1 ftype:12db hpsustain:0 hprelease:0 ]", - "[ 11/3 → 23/6 | note:ab3 s:square hcutoff:1000 hpdecay:0.1 ftype:12db hpsustain:0 hprelease:0 ]", - "[ 23/6 → 4/1 | note:bb3 s:square hcutoff:1000 hpdecay:0.1 ftype:12db hpsustain:0 hprelease:0 ]", + "[ 0/1 → 1/1 | note:c2 s:sawtooth hcutoff:500 hpdecay:0.5 hpsustain:0.2 hpenv:4 ]", + "[ 1/1 → 2/1 | note:e2 s:sawtooth hcutoff:500 hpdecay:0.5 hpsustain:0.2 hpenv:4 ]", + "[ 2/1 → 3/1 | note:f2 s:sawtooth hcutoff:500 hpdecay:0.5 hpsustain:0.2 hpenv:4 ]", + "[ 3/1 → 4/1 | note:g2 s:sawtooth hcutoff:500 hpdecay:0.5 hpsustain:0.2 hpenv:4 ]", ] `; exports[`runs examples > example "hpenv" example index 0 1`] = ` [ - "[ 0/1 → 1/4 | note:c2 s:sawtooth hcutoff:500 hpenv:1 ]", - "[ 1/4 → 1/2 | note:c3 s:sawtooth hcutoff:500 hpenv:1 ]", - "[ 1/2 → 3/4 | note:c2 s:sawtooth hcutoff:500 hpenv:1 ]", - "[ 3/4 → 1/1 | note:c3 s:sawtooth hcutoff:500 hpenv:1 ]", - "[ 1/1 → 5/4 | note:c2 s:sawtooth hcutoff:500 hpenv:2 ]", - "[ 5/4 → 3/2 | note:c3 s:sawtooth hcutoff:500 hpenv:2 ]", - "[ 3/2 → 7/4 | note:c2 s:sawtooth hcutoff:500 hpenv:2 ]", - "[ 7/4 → 2/1 | note:c3 s:sawtooth hcutoff:500 hpenv:2 ]", - "[ 2/1 → 9/4 | note:c2 s:sawtooth hcutoff:500 hpenv:3 ]", - "[ 9/4 → 5/2 | note:c3 s:sawtooth hcutoff:500 hpenv:3 ]", - "[ 5/2 → 11/4 | note:c2 s:sawtooth hcutoff:500 hpenv:3 ]", - "[ 11/4 → 3/1 | note:c3 s:sawtooth hcutoff:500 hpenv:3 ]", - "[ 3/1 → 13/4 | note:c2 s:sawtooth hcutoff:500 hpenv:4 ]", - "[ 13/4 → 7/2 | note:c3 s:sawtooth hcutoff:500 hpenv:4 ]", - "[ 7/2 → 15/4 | note:c2 s:sawtooth hcutoff:500 hpenv:4 ]", - "[ 15/4 → 4/1 | note:c3 s:sawtooth hcutoff:500 hpenv:4 ]", + "[ 0/1 → 1/1 | note:c2 s:sawtooth hcutoff:500 hpattack:0.1 hpdecay:0.1 hpsustain:0.5 hpenv:8 ]", + "[ 1/1 → 2/1 | note:e2 s:sawtooth hcutoff:500 hpattack:0.1 hpdecay:0.1 hpsustain:0.5 hpenv:8 ]", + "[ 2/1 → 3/1 | note:f2 s:sawtooth hcutoff:500 hpattack:0.1 hpdecay:0.1 hpsustain:0.5 hpenv:8 ]", + "[ 3/1 → 4/1 | note:g2 s:sawtooth hcutoff:500 hpattack:0.1 hpdecay:0.1 hpsustain:0.5 hpenv:8 ]", +] +`; + +exports[`runs examples > example "hpenv" example index 1 1`] = ` +[ + "[ 0/1 → 1/1 | note:c2 s:sawtooth hcutoff:500 hpattack:0.5 hpenv:2 ]", + "[ 1/1 → 2/1 | note:e2 s:sawtooth hcutoff:500 hpattack:0.5 hpenv:2 ]", + "[ 2/1 → 3/1 | note:f2 s:sawtooth hcutoff:500 hpattack:0.5 hpenv:2 ]", + "[ 3/1 → 4/1 | note:g2 s:sawtooth hcutoff:500 hpattack:0.5 hpenv:2 ]", ] `; @@ -2318,80 +2220,19 @@ exports[`runs examples > example "hpq" example index 0 1`] = ` exports[`runs examples > example "hprelease" example index 0 1`] = ` [ - "[ 0/1 → 1/4 | note:c3 hprelease:0.1 ftype:12db ]", - "[ 1/4 → 1/2 | note:e3 hprelease:0.1 ftype:12db ]", - "[ 1/2 → 3/4 | note:g3 hprelease:0.1 ftype:12db ]", - "[ 3/4 → 1/1 | note:c4 hprelease:0.1 ftype:12db ]", - "[ 1/1 → 5/4 | note:c3 hprelease:0.25 ftype:12db ]", - "[ 5/4 → 3/2 | note:e3 hprelease:0.25 ftype:12db ]", - "[ 3/2 → 7/4 | note:g3 hprelease:0.25 ftype:12db ]", - "[ 7/4 → 2/1 | note:c4 hprelease:0.25 ftype:12db ]", - "[ 2/1 → 9/4 | note:c3 hprelease:0.5 ftype:12db ]", - "[ 9/4 → 5/2 | note:e3 hprelease:0.5 ftype:12db ]", - "[ 5/2 → 11/4 | note:g3 hprelease:0.5 ftype:12db ]", - "[ 11/4 → 3/1 | note:c4 hprelease:0.5 ftype:12db ]", - "[ 3/1 → 13/4 | note:c3 hprelease:0.1 ftype:12db ]", - "[ 13/4 → 7/2 | note:e3 hprelease:0.1 ftype:12db ]", - "[ 7/2 → 15/4 | note:g3 hprelease:0.1 ftype:12db ]", - "[ 15/4 → 4/1 | note:c4 hprelease:0.1 ftype:12db ]", + "[ 0/1 → 1/1 | note:c2 s:sawtooth clip:0.5 hcutoff:0 hpenv:4 hprelease:0.5 release:0.5 ]", + "[ 1/1 → 2/1 | note:e2 s:sawtooth clip:0.5 hcutoff:0 hpenv:4 hprelease:0.5 release:0.5 ]", + "[ 2/1 → 3/1 | note:f2 s:sawtooth clip:0.5 hcutoff:0 hpenv:4 hprelease:0.5 release:0.5 ]", + "[ 3/1 → 4/1 | note:g2 s:sawtooth clip:0.5 hcutoff:0 hpenv:4 hprelease:0.5 release:0.5 ]", ] `; exports[`runs examples > example "hpsustain" example index 0 1`] = ` [ - "[ 0/1 → 1/6 | note:c3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.1 ftype:12db ]", - "[ 1/6 → 1/3 | note:e3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.1 ftype:12db ]", - "[ 1/3 → 1/2 | note:f3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.1 ftype:12db ]", - "[ 1/2 → 2/3 | note:g3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.1 ftype:12db ]", - "[ 2/3 → 5/6 | note:ab3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.1 ftype:12db ]", - "[ 5/6 → 1/1 | note:bb3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.1 ftype:12db ]", - "[ 1/1 → 7/6 | note:c3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.5 ftype:12db ]", - "[ 7/6 → 4/3 | note:e3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.5 ftype:12db ]", - "[ 4/3 → 3/2 | note:f3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.5 ftype:12db ]", - "[ 3/2 → 5/3 | note:g3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.5 ftype:12db ]", - "[ 5/3 → 11/6 | note:ab3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.5 ftype:12db ]", - "[ 11/6 → 2/1 | note:bb3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.5 ftype:12db ]", - "[ 2/1 → 13/6 | note:c3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.75 ftype:12db ]", - "[ 13/6 → 7/3 | note:e3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.75 ftype:12db ]", - "[ 7/3 → 5/2 | note:f3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.75 ftype:12db ]", - "[ 5/2 → 8/3 | note:g3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.75 ftype:12db ]", - "[ 8/3 → 17/6 | note:ab3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.75 ftype:12db ]", - "[ 17/6 → 3/1 | note:bb3 s:square hcutoff:200 hpdecay:0.1 hpsustain:0.75 ftype:12db ]", - "[ 3/1 → 19/6 | note:c3 s:square hcutoff:200 hpdecay:0.1 hpsustain:1 ftype:12db ]", - "[ 19/6 → 10/3 | note:e3 s:square hcutoff:200 hpdecay:0.1 hpsustain:1 ftype:12db ]", - "[ 10/3 → 7/2 | note:f3 s:square hcutoff:200 hpdecay:0.1 hpsustain:1 ftype:12db ]", - "[ 7/2 → 11/3 | note:g3 s:square hcutoff:200 hpdecay:0.1 hpsustain:1 ftype:12db ]", - "[ 11/3 → 23/6 | note:ab3 s:square hcutoff:200 hpdecay:0.1 hpsustain:1 ftype:12db ]", - "[ 23/6 → 4/1 | note:bb3 s:square hcutoff:200 hpdecay:0.1 hpsustain:1 ftype:12db ]", -] -`; - -exports[`runs examples > example "hpsustain" example index 0 2`] = ` -[ - "[ 0/1 → 1/6 | note:c3 s:square bandf:200 bpdecay:0.1 bpsustain:0.1 ftype:12db ]", - "[ 1/6 → 1/3 | note:e3 s:square bandf:200 bpdecay:0.1 bpsustain:0.1 ftype:12db ]", - "[ 1/3 → 1/2 | note:f3 s:square bandf:200 bpdecay:0.1 bpsustain:0.1 ftype:12db ]", - "[ 1/2 → 2/3 | note:g3 s:square bandf:200 bpdecay:0.1 bpsustain:0.1 ftype:12db ]", - "[ 2/3 → 5/6 | note:ab3 s:square bandf:200 bpdecay:0.1 bpsustain:0.1 ftype:12db ]", - "[ 5/6 → 1/1 | note:bb3 s:square bandf:200 bpdecay:0.1 bpsustain:0.1 ftype:12db ]", - "[ 1/1 → 7/6 | note:c3 s:square bandf:200 bpdecay:0.1 bpsustain:0.5 ftype:12db ]", - "[ 7/6 → 4/3 | note:e3 s:square bandf:200 bpdecay:0.1 bpsustain:0.5 ftype:12db ]", - "[ 4/3 → 3/2 | note:f3 s:square bandf:200 bpdecay:0.1 bpsustain:0.5 ftype:12db ]", - "[ 3/2 → 5/3 | note:g3 s:square bandf:200 bpdecay:0.1 bpsustain:0.5 ftype:12db ]", - "[ 5/3 → 11/6 | note:ab3 s:square bandf:200 bpdecay:0.1 bpsustain:0.5 ftype:12db ]", - "[ 11/6 → 2/1 | note:bb3 s:square bandf:200 bpdecay:0.1 bpsustain:0.5 ftype:12db ]", - "[ 2/1 → 13/6 | note:c3 s:square bandf:200 bpdecay:0.1 bpsustain:0.75 ftype:12db ]", - "[ 13/6 → 7/3 | note:e3 s:square bandf:200 bpdecay:0.1 bpsustain:0.75 ftype:12db ]", - "[ 7/3 → 5/2 | note:f3 s:square bandf:200 bpdecay:0.1 bpsustain:0.75 ftype:12db ]", - "[ 5/2 → 8/3 | note:g3 s:square bandf:200 bpdecay:0.1 bpsustain:0.75 ftype:12db ]", - "[ 8/3 → 17/6 | note:ab3 s:square bandf:200 bpdecay:0.1 bpsustain:0.75 ftype:12db ]", - "[ 17/6 → 3/1 | note:bb3 s:square bandf:200 bpdecay:0.1 bpsustain:0.75 ftype:12db ]", - "[ 3/1 → 19/6 | note:c3 s:square bandf:200 bpdecay:0.1 bpsustain:1 ftype:12db ]", - "[ 19/6 → 10/3 | note:e3 s:square bandf:200 bpdecay:0.1 bpsustain:1 ftype:12db ]", - "[ 10/3 → 7/2 | note:f3 s:square bandf:200 bpdecay:0.1 bpsustain:1 ftype:12db ]", - "[ 7/2 → 11/3 | note:g3 s:square bandf:200 bpdecay:0.1 bpsustain:1 ftype:12db ]", - "[ 11/3 → 23/6 | note:ab3 s:square bandf:200 bpdecay:0.1 bpsustain:1 ftype:12db ]", - "[ 23/6 → 4/1 | note:bb3 s:square bandf:200 bpdecay:0.1 bpsustain:1 ftype:12db ]", + "[ 0/1 → 1/1 | note:c2 s:sawtooth hcutoff:0 hpdecay:0.5 hpsustain:0 hpenv:4 ]", + "[ 1/1 → 2/1 | note:e2 s:sawtooth hcutoff:0 hpdecay:0.5 hpsustain:0 hpenv:4 ]", + "[ 2/1 → 3/1 | note:f2 s:sawtooth hcutoff:0 hpdecay:0.5 hpsustain:0 hpenv:4 ]", + "[ 3/1 → 4/1 | note:g2 s:sawtooth hcutoff:0 hpdecay:0.5 hpsustain:0 hpenv:4 ]", ] `; From 4688c0bf103b5157ae91d8c3de375abbf709f69d Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Fri, 15 Sep 2023 23:13:49 +0200 Subject: [PATCH 22/39] format --- website/src/pages/learn/effects.mdx | 1 - 1 file changed, 1 deletion(-) diff --git a/website/src/pages/learn/effects.mdx b/website/src/pages/learn/effects.mdx index 62e3a52d..f5ee12ab 100644 --- a/website/src/pages/learn/effects.mdx +++ b/website/src/pages/learn/effects.mdx @@ -171,7 +171,6 @@ There is one filter envelope for each filter type and thus one set of envelope f - # Dynamics ## gain From 9142fb753a143e3c5bf641d534cec624a8e14c37 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Fri, 15 Sep 2023 23:36:55 +0200 Subject: [PATCH 23/39] cleaner default filter envelope - fixes some unexpected envelope glitches --- packages/superdough/superdough.mjs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 3afe470e..601ab9e0 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -183,24 +183,24 @@ export const superdough = async (value, deadline, hapDuration) => { cutoff, lpenv, lpattack = 0.01, - lpdecay = 0.5, - lpsustain = 0.6, + lpdecay = 0.01, + lpsustain = 1, lprelease = 0.01, resonance = 1, // high pass hpenv, hcutoff, hpattack = 0.01, - hpdecay = 0.5, - hpsustain = 0.6, + hpdecay = 0.01, + hpsustain = 1, hprelease = 0.01, hresonance = 1, // band pass bpenv, bandf, bpattack = 0.01, - bpdecay = 0.5, - bpsustain = 0.6, + bpdecay = 0.01, + bpsustain = 1, bprelease = 0.01, bandq = 1, // From 88c029202cd24bf3e2457b4c61307e7e94461837 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Fri, 15 Sep 2023 23:37:27 +0200 Subject: [PATCH 24/39] simplify fenv examples --- packages/core/controls.mjs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index dd865df5..36742755 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -387,8 +387,8 @@ const generic_params = [ * note("") * .sound('sawtooth') * .lpf(500) - * .lpa(.1).lpd(.1).lps(.5) - * .lpenv("<8 4 2 0>/4") + * .lpa(.5) + * .lpenv("<4 2 1 0>/4") */ ['lpenv', 'lpe'], /** @@ -400,8 +400,8 @@ const generic_params = [ * note("") * .sound('sawtooth') * .hpf(500) - * .hpa(.1).hpd(.1).hps(.5) - * .hpenv("<8 4 2 0>/4") + * .hpa(.5) + * .hpenv("<4 2 1 0>/4") * @example * note("") * .sound('sawtooth') @@ -419,8 +419,8 @@ const generic_params = [ * note("") * .sound('sawtooth') * .bpf(500) - * .bpa(.1).bpd(.1).bps(.5) - * .bpenv("<8 4 2 0>/4") + * .bpa(.5) + * .bpenv("<4 2 1 0>/4") */ ['bpenv', 'bpe'], /** From 9049a8b964d277d60071667a247ed37e77d42736 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Fri, 15 Sep 2023 23:37:36 +0200 Subject: [PATCH 25/39] simplify fenv --- packages/superdough/helpers.mjs | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index b6530343..45371500 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -87,18 +87,16 @@ export function createFilter(context, type, frequency, Q, attack, decay, sustain // Apply ADSR to filter frequency if (fenv !== 0) { - let min = 0; - let max = Math.sign(fenv) * 200 * 2 ** Math.abs(fenv); - if (max < min) { - // offset by max: keep range when *penv sign is flipped - // comment those lines out to center around cutoff instead peak - min += Math.abs(max); - max += Math.abs(max); + let min = frequency; + let max = frequency * 2 ** Math.abs(fenv); + if (fenv < 0) { + // flip min max to keep range the same for negative envelope + // comment this out to flip the range as well... + [min, max] = [max, min]; } - + // console.log('min', min, 'max', max); min = clamp(min + frequency, 0, 20000); max = clamp(max + frequency, 0, 20000); - // console.log('min', min, 'max', max); getParamADSR(filter.frequency, attack, decay, sustain, release, min, max, start, end); return filter; } From ee314e9b03538c0ccd25296e281dd58aefcea15f Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Fri, 15 Sep 2023 23:38:37 +0200 Subject: [PATCH 26/39] snapshot --- test/__snapshots__/examples.test.mjs.snap | 24 +++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index ed05a561..a40ede3b 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -920,10 +920,10 @@ exports[`runs examples > example "bpdecay" example index 0 1`] = ` exports[`runs examples > example "bpenv" example index 0 1`] = ` [ - "[ 0/1 → 1/1 | note:c2 s:sawtooth bandf:500 bpattack:0.1 bpdecay:0.1 bpsustain:0.5 bpenv:8 ]", - "[ 1/1 → 2/1 | note:e2 s:sawtooth bandf:500 bpattack:0.1 bpdecay:0.1 bpsustain:0.5 bpenv:8 ]", - "[ 2/1 → 3/1 | note:f2 s:sawtooth bandf:500 bpattack:0.1 bpdecay:0.1 bpsustain:0.5 bpenv:8 ]", - "[ 3/1 → 4/1 | note:g2 s:sawtooth bandf:500 bpattack:0.1 bpdecay:0.1 bpsustain:0.5 bpenv:8 ]", + "[ 0/1 → 1/1 | note:c2 s:sawtooth bandf:500 bpattack:0.5 bpenv:4 ]", + "[ 1/1 → 2/1 | note:e2 s:sawtooth bandf:500 bpattack:0.5 bpenv:4 ]", + "[ 2/1 → 3/1 | note:f2 s:sawtooth bandf:500 bpattack:0.5 bpenv:4 ]", + "[ 3/1 → 4/1 | note:g2 s:sawtooth bandf:500 bpattack:0.5 bpenv:4 ]", ] `; @@ -2115,10 +2115,10 @@ exports[`runs examples > example "hpdecay" example index 0 1`] = ` exports[`runs examples > example "hpenv" example index 0 1`] = ` [ - "[ 0/1 → 1/1 | note:c2 s:sawtooth hcutoff:500 hpattack:0.1 hpdecay:0.1 hpsustain:0.5 hpenv:8 ]", - "[ 1/1 → 2/1 | note:e2 s:sawtooth hcutoff:500 hpattack:0.1 hpdecay:0.1 hpsustain:0.5 hpenv:8 ]", - "[ 2/1 → 3/1 | note:f2 s:sawtooth hcutoff:500 hpattack:0.1 hpdecay:0.1 hpsustain:0.5 hpenv:8 ]", - "[ 3/1 → 4/1 | note:g2 s:sawtooth hcutoff:500 hpattack:0.1 hpdecay:0.1 hpsustain:0.5 hpenv:8 ]", + "[ 0/1 → 1/1 | note:c2 s:sawtooth hcutoff:500 hpattack:0.5 hpenv:4 ]", + "[ 1/1 → 2/1 | note:e2 s:sawtooth hcutoff:500 hpattack:0.5 hpenv:4 ]", + "[ 2/1 → 3/1 | note:f2 s:sawtooth hcutoff:500 hpattack:0.5 hpenv:4 ]", + "[ 3/1 → 4/1 | note:g2 s:sawtooth hcutoff:500 hpattack:0.5 hpenv:4 ]", ] `; @@ -2685,10 +2685,10 @@ exports[`runs examples > example "lpdecay" example index 0 1`] = ` exports[`runs examples > example "lpenv" example index 0 1`] = ` [ - "[ 0/1 → 1/1 | note:c2 s:sawtooth cutoff:500 lpattack:0.1 lpdecay:0.1 lpsustain:0.5 lpenv:8 ]", - "[ 1/1 → 2/1 | note:e2 s:sawtooth cutoff:500 lpattack:0.1 lpdecay:0.1 lpsustain:0.5 lpenv:8 ]", - "[ 2/1 → 3/1 | note:f2 s:sawtooth cutoff:500 lpattack:0.1 lpdecay:0.1 lpsustain:0.5 lpenv:8 ]", - "[ 3/1 → 4/1 | note:g2 s:sawtooth cutoff:500 lpattack:0.1 lpdecay:0.1 lpsustain:0.5 lpenv:8 ]", + "[ 0/1 → 1/1 | note:c2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]", + "[ 1/1 → 2/1 | note:e2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]", + "[ 2/1 → 3/1 | note:f2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]", + "[ 3/1 → 4/1 | note:g2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]", ] `; From df211c994d2ed795036da9e8a1d831a60df55095 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sat, 16 Sep 2023 00:44:03 +0200 Subject: [PATCH 27/39] anchored fenv, more logical with negative values - defaulting to .5 for now... --- packages/superdough/helpers.mjs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 45371500..0f50a527 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -87,14 +87,15 @@ export function createFilter(context, type, frequency, Q, attack, decay, sustain // Apply ADSR to filter frequency if (fenv !== 0) { - let min = frequency; - let max = frequency * 2 ** Math.abs(fenv); - if (fenv < 0) { - // flip min max to keep range the same for negative envelope - // comment this out to flip the range as well... - [min, max] = [max, min]; - } - // console.log('min', min, 'max', max); + let anchor = 0.5; + let offset = fenv * anchor; + let min = 2 ** -offset; + let max = 2 ** (fenv - offset); + min *= frequency; + max *= frequency; + + //console.log('min', min, 'max', max); + min = clamp(min + frequency, 0, 20000); max = clamp(max + frequency, 0, 20000); getParamADSR(filter.frequency, attack, decay, sustain, release, min, max, start, end); From 40de717cc90f410115069ee34792cc1a55a90be4 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sat, 16 Sep 2023 00:46:50 +0200 Subject: [PATCH 28/39] fix: don't add frequency --- packages/superdough/helpers.mjs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 0f50a527..92a5584f 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -94,10 +94,11 @@ export function createFilter(context, type, frequency, Q, attack, decay, sustain min *= frequency; max *= frequency; - //console.log('min', min, 'max', max); + min = clamp(min, 0, 20000); + max = clamp(max, 0, 20000); + + console.log('min', min, 'max', max); - min = clamp(min + frequency, 0, 20000); - max = clamp(max + frequency, 0, 20000); getParamADSR(filter.frequency, attack, decay, sustain, release, min, max, start, end); return filter; } From 7f86eac8f1b611b77484e8db3c5d28a20b2762b2 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sat, 16 Sep 2023 00:51:36 +0200 Subject: [PATCH 29/39] simplify --- packages/superdough/helpers.mjs | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 92a5584f..c15bdb83 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -82,22 +82,17 @@ export function createFilter(context, type, frequency, Q, attack, decay, sustain const filter = context.createBiquadFilter(); filter.type = type; filter.Q.value = Q; - frequency = Math.max(frequency, 20); filter.frequency.value = frequency; // Apply ADSR to filter frequency if (fenv !== 0) { - let anchor = 0.5; - let offset = fenv * anchor; - let min = 2 ** -offset; - let max = 2 ** (fenv - offset); - min *= frequency; - max *= frequency; + const anchor = 0.5; + const offset = fenv * anchor; - min = clamp(min, 0, 20000); - max = clamp(max, 0, 20000); + const min = clamp(2 ** -offset * frequency, 0, 20000); + const max = clamp(2 ** (fenv - offset) * frequency, 0, 20000); - console.log('min', min, 'max', max); + // console.log('min', min, 'max', max); getParamADSR(filter.frequency, attack, decay, sustain, release, min, max, start, end); return filter; From 7dbcc90450d032a63e8feaf9c75053b1b0cedbe6 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sat, 16 Sep 2023 01:07:10 +0200 Subject: [PATCH 30/39] fix: docs after fenv change --- packages/core/controls.mjs | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 36742755..ce52d670 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -388,7 +388,7 @@ const generic_params = [ * .sound('sawtooth') * .lpf(500) * .lpa(.5) - * .lpenv("<4 2 1 0>/4") + * .lpenv("<4 2 1 0 -1 -2 -4>/4") */ ['lpenv', 'lpe'], /** @@ -401,13 +401,7 @@ const generic_params = [ * .sound('sawtooth') * .hpf(500) * .hpa(.5) - * .hpenv("<4 2 1 0>/4") - * @example - * note("") - * .sound('sawtooth') - * .hpf(500) - * .hpa(.5) - * .hpenv("<2 -2>/4") + * .hpenv("<4 2 1 0 -1 -2 -4>/4") */ ['hpenv', 'hpe'], /** @@ -420,7 +414,7 @@ const generic_params = [ * .sound('sawtooth') * .bpf(500) * .bpa(.5) - * .bpenv("<4 2 1 0>/4") + * .bpenv("<4 2 1 0 -1 -2 -4>/4") */ ['bpenv', 'bpe'], /** @@ -512,7 +506,7 @@ const generic_params = [ * @example * note("") * .sound('sawtooth') - * .lpf(0) + * .lpf(500) * .lpd(.5) * .lps("<0 .25 .5 1>/4") * .lpenv(4) @@ -526,7 +520,7 @@ const generic_params = [ * @example * note("") * .sound('sawtooth') - * .hpf(0) + * .hpf(500) * .hpd(.5) * .hps("<0 .25 .5 1>/4") * .hpenv(4) @@ -540,7 +534,7 @@ const generic_params = [ * @example * note("") * .sound('sawtooth') - * .bpf(0) + * .bpf(500) * .bpd(.5) * .bps("<0 .25 .5 1>/4") * .bpenv(4) @@ -555,7 +549,7 @@ const generic_params = [ * note("") * .sound('sawtooth') * .clip(.5) - * .lpf(0) + * .lpf(500) * .lpenv(4) * .lpr("<.5 .25 .1 0>/4") * .release(.5) @@ -570,7 +564,7 @@ const generic_params = [ * note("") * .sound('sawtooth') * .clip(.5) - * .hpf(0) + * .hpf(500) * .hpenv(4) * .hpr("<.5 .25 .1 0>/4") * .release(.5) @@ -585,7 +579,7 @@ const generic_params = [ * note("") * .sound('sawtooth') * .clip(.5) - * .bpf(0) + * .bpf(500) * .bpenv(4) * .bpr("<.5 .25 .1 0>/4") * .release(.5) From e959c275fd6915b9562801e2f04de4143b08cd1a Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sat, 16 Sep 2023 01:14:14 +0200 Subject: [PATCH 31/39] add fanchor --- packages/core/controls.mjs | 1 + packages/superdough/helpers.mjs | 18 +++++++++++++++--- packages/superdough/superdough.mjs | 18 +++++++++++++++++- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index ce52d670..58c4efa1 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -586,6 +586,7 @@ const generic_params = [ */ ['bprelease', 'bpr'], ['ftype'], + ['fanchor'], /** * Applies the cutoff frequency of the **h**igh-**p**ass **f**ilter. * diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index c15bdb83..92f670d9 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -78,7 +78,20 @@ export const getParamADSR = (param, attack, decay, sustain, release, min, max, b param.linearRampToValueAtTime(min, end + Math.max(release, 0.1)); }; -export function createFilter(context, type, frequency, Q, attack, decay, sustain, release, fenv, start, end) { +export function createFilter( + context, + type, + frequency, + Q, + attack, + decay, + sustain, + release, + fenv, + start, + end, + fanchor = 0.5, +) { const filter = context.createBiquadFilter(); filter.type = type; filter.Q.value = Q; @@ -86,8 +99,7 @@ export function createFilter(context, type, frequency, Q, attack, decay, sustain // Apply ADSR to filter frequency if (fenv !== 0) { - const anchor = 0.5; - const offset = fenv * anchor; + const offset = fenv * fanchor; const min = clamp(2 ** -offset * frequency, 0, 20000); const max = clamp(2 ** (fenv - offset) * frequency, 0, 20000); diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 601ab9e0..289e8d97 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -179,6 +179,7 @@ export const superdough = async (value, deadline, hapDuration) => { gain = 0.8, // filters ftype = '12db', + fanchor = 0.5, // low pass cutoff, lpenv, @@ -270,6 +271,7 @@ export const superdough = async (value, deadline, hapDuration) => { lpenv, t, t + hapDuration, + fanchor, ); chain.push(lp()); if (ftype === '24db') { @@ -291,6 +293,7 @@ export const superdough = async (value, deadline, hapDuration) => { hpenv, t, t + hapDuration, + fanchor, ); chain.push(hp()); if (ftype === '24db') { @@ -300,7 +303,20 @@ export const superdough = async (value, deadline, hapDuration) => { if (bandf !== undefined) { let bp = () => - createFilter(ac, 'bandpass', bandf, bandq, bpattack, bpdecay, bpsustain, bprelease, bpenv, t, t + hapDuration); + createFilter( + ac, + 'bandpass', + bandf, + bandq, + bpattack, + bpdecay, + bpsustain, + bprelease, + bpenv, + t, + t + hapDuration, + fanchor, + ); chain.push(bp()); if (ftype === '24db') { chain.push(bp()); From 735f892a087ce949dfb482e605eb4947b7dfb469 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sat, 16 Sep 2023 01:14:53 +0200 Subject: [PATCH 32/39] fix: snapshots --- test/__snapshots__/examples.test.mjs.snap | 57 ++++++++++------------- 1 file changed, 24 insertions(+), 33 deletions(-) diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index a40ede3b..c46ca717 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -967,19 +967,19 @@ exports[`runs examples > example "bpq" example index 0 1`] = ` exports[`runs examples > example "bprelease" example index 0 1`] = ` [ - "[ 0/1 → 1/1 | note:c2 s:sawtooth clip:0.5 bandf:0 bpenv:4 bprelease:0.5 release:0.5 ]", - "[ 1/1 → 2/1 | note:e2 s:sawtooth clip:0.5 bandf:0 bpenv:4 bprelease:0.5 release:0.5 ]", - "[ 2/1 → 3/1 | note:f2 s:sawtooth clip:0.5 bandf:0 bpenv:4 bprelease:0.5 release:0.5 ]", - "[ 3/1 → 4/1 | note:g2 s:sawtooth clip:0.5 bandf:0 bpenv:4 bprelease:0.5 release:0.5 ]", + "[ 0/1 → 1/1 | note:c2 s:sawtooth clip:0.5 bandf:500 bpenv:4 bprelease:0.5 release:0.5 ]", + "[ 1/1 → 2/1 | note:e2 s:sawtooth clip:0.5 bandf:500 bpenv:4 bprelease:0.5 release:0.5 ]", + "[ 2/1 → 3/1 | note:f2 s:sawtooth clip:0.5 bandf:500 bpenv:4 bprelease:0.5 release:0.5 ]", + "[ 3/1 → 4/1 | note:g2 s:sawtooth clip:0.5 bandf:500 bpenv:4 bprelease:0.5 release:0.5 ]", ] `; exports[`runs examples > example "bpsustain" example index 0 1`] = ` [ - "[ 0/1 → 1/1 | note:c2 s:sawtooth bandf:0 bpdecay:0.5 bpsustain:0 bpenv:4 ]", - "[ 1/1 → 2/1 | note:e2 s:sawtooth bandf:0 bpdecay:0.5 bpsustain:0 bpenv:4 ]", - "[ 2/1 → 3/1 | note:f2 s:sawtooth bandf:0 bpdecay:0.5 bpsustain:0 bpenv:4 ]", - "[ 3/1 → 4/1 | note:g2 s:sawtooth bandf:0 bpdecay:0.5 bpsustain:0 bpenv:4 ]", + "[ 0/1 → 1/1 | note:c2 s:sawtooth bandf:500 bpdecay:0.5 bpsustain:0 bpenv:4 ]", + "[ 1/1 → 2/1 | note:e2 s:sawtooth bandf:500 bpdecay:0.5 bpsustain:0 bpenv:4 ]", + "[ 2/1 → 3/1 | note:f2 s:sawtooth bandf:500 bpdecay:0.5 bpsustain:0 bpenv:4 ]", + "[ 3/1 → 4/1 | note:g2 s:sawtooth bandf:500 bpdecay:0.5 bpsustain:0 bpenv:4 ]", ] `; @@ -2122,15 +2122,6 @@ exports[`runs examples > example "hpenv" example index 0 1`] = ` ] `; -exports[`runs examples > example "hpenv" example index 1 1`] = ` -[ - "[ 0/1 → 1/1 | note:c2 s:sawtooth hcutoff:500 hpattack:0.5 hpenv:2 ]", - "[ 1/1 → 2/1 | note:e2 s:sawtooth hcutoff:500 hpattack:0.5 hpenv:2 ]", - "[ 2/1 → 3/1 | note:f2 s:sawtooth hcutoff:500 hpattack:0.5 hpenv:2 ]", - "[ 3/1 → 4/1 | note:g2 s:sawtooth hcutoff:500 hpattack:0.5 hpenv:2 ]", -] -`; - exports[`runs examples > example "hpf" example index 0 1`] = ` [ "[ 0/1 → 1/4 | s:hh hcutoff:4000 ]", @@ -2220,19 +2211,19 @@ exports[`runs examples > example "hpq" example index 0 1`] = ` exports[`runs examples > example "hprelease" example index 0 1`] = ` [ - "[ 0/1 → 1/1 | note:c2 s:sawtooth clip:0.5 hcutoff:0 hpenv:4 hprelease:0.5 release:0.5 ]", - "[ 1/1 → 2/1 | note:e2 s:sawtooth clip:0.5 hcutoff:0 hpenv:4 hprelease:0.5 release:0.5 ]", - "[ 2/1 → 3/1 | note:f2 s:sawtooth clip:0.5 hcutoff:0 hpenv:4 hprelease:0.5 release:0.5 ]", - "[ 3/1 → 4/1 | note:g2 s:sawtooth clip:0.5 hcutoff:0 hpenv:4 hprelease:0.5 release:0.5 ]", + "[ 0/1 → 1/1 | note:c2 s:sawtooth clip:0.5 hcutoff:500 hpenv:4 hprelease:0.5 release:0.5 ]", + "[ 1/1 → 2/1 | note:e2 s:sawtooth clip:0.5 hcutoff:500 hpenv:4 hprelease:0.5 release:0.5 ]", + "[ 2/1 → 3/1 | note:f2 s:sawtooth clip:0.5 hcutoff:500 hpenv:4 hprelease:0.5 release:0.5 ]", + "[ 3/1 → 4/1 | note:g2 s:sawtooth clip:0.5 hcutoff:500 hpenv:4 hprelease:0.5 release:0.5 ]", ] `; exports[`runs examples > example "hpsustain" example index 0 1`] = ` [ - "[ 0/1 → 1/1 | note:c2 s:sawtooth hcutoff:0 hpdecay:0.5 hpsustain:0 hpenv:4 ]", - "[ 1/1 → 2/1 | note:e2 s:sawtooth hcutoff:0 hpdecay:0.5 hpsustain:0 hpenv:4 ]", - "[ 2/1 → 3/1 | note:f2 s:sawtooth hcutoff:0 hpdecay:0.5 hpsustain:0 hpenv:4 ]", - "[ 3/1 → 4/1 | note:g2 s:sawtooth hcutoff:0 hpdecay:0.5 hpsustain:0 hpenv:4 ]", + "[ 0/1 → 1/1 | note:c2 s:sawtooth hcutoff:500 hpdecay:0.5 hpsustain:0 hpenv:4 ]", + "[ 1/1 → 2/1 | note:e2 s:sawtooth hcutoff:500 hpdecay:0.5 hpsustain:0 hpenv:4 ]", + "[ 2/1 → 3/1 | note:f2 s:sawtooth hcutoff:500 hpdecay:0.5 hpsustain:0 hpenv:4 ]", + "[ 3/1 → 4/1 | note:g2 s:sawtooth hcutoff:500 hpdecay:0.5 hpsustain:0 hpenv:4 ]", ] `; @@ -2785,19 +2776,19 @@ exports[`runs examples > example "lpq" example index 0 1`] = ` exports[`runs examples > example "lprelease" example index 0 1`] = ` [ - "[ 0/1 → 1/1 | note:c2 s:sawtooth clip:0.5 cutoff:0 lpenv:4 lprelease:0.5 release:0.5 ]", - "[ 1/1 → 2/1 | note:e2 s:sawtooth clip:0.5 cutoff:0 lpenv:4 lprelease:0.5 release:0.5 ]", - "[ 2/1 → 3/1 | note:f2 s:sawtooth clip:0.5 cutoff:0 lpenv:4 lprelease:0.5 release:0.5 ]", - "[ 3/1 → 4/1 | note:g2 s:sawtooth clip:0.5 cutoff:0 lpenv:4 lprelease:0.5 release:0.5 ]", + "[ 0/1 → 1/1 | note:c2 s:sawtooth clip:0.5 cutoff:500 lpenv:4 lprelease:0.5 release:0.5 ]", + "[ 1/1 → 2/1 | note:e2 s:sawtooth clip:0.5 cutoff:500 lpenv:4 lprelease:0.5 release:0.5 ]", + "[ 2/1 → 3/1 | note:f2 s:sawtooth clip:0.5 cutoff:500 lpenv:4 lprelease:0.5 release:0.5 ]", + "[ 3/1 → 4/1 | note:g2 s:sawtooth clip:0.5 cutoff:500 lpenv:4 lprelease:0.5 release:0.5 ]", ] `; exports[`runs examples > example "lpsustain" example index 0 1`] = ` [ - "[ 0/1 → 1/1 | note:c2 s:sawtooth cutoff:0 lpdecay:0.5 lpsustain:0 lpenv:4 ]", - "[ 1/1 → 2/1 | note:e2 s:sawtooth cutoff:0 lpdecay:0.5 lpsustain:0 lpenv:4 ]", - "[ 2/1 → 3/1 | note:f2 s:sawtooth cutoff:0 lpdecay:0.5 lpsustain:0 lpenv:4 ]", - "[ 3/1 → 4/1 | note:g2 s:sawtooth cutoff:0 lpdecay:0.5 lpsustain:0 lpenv:4 ]", + "[ 0/1 → 1/1 | note:c2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0 lpenv:4 ]", + "[ 1/1 → 2/1 | note:e2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0 lpenv:4 ]", + "[ 2/1 → 3/1 | note:f2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0 lpenv:4 ]", + "[ 3/1 → 4/1 | note:g2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0 lpenv:4 ]", ] `; From 989dc0aabe4111891049fa5fadf4c857dfde8d6c Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sat, 16 Sep 2023 01:33:09 +0200 Subject: [PATCH 33/39] fix: filters without envelopes --- packages/superdough/helpers.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 92f670d9..32ca0bb2 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -98,7 +98,7 @@ export function createFilter( filter.frequency.value = frequency; // Apply ADSR to filter frequency - if (fenv !== 0) { + if (!isNaN(fenv) && fenv !== 0) { const offset = fenv * fanchor; const min = clamp(2 ** -offset * frequency, 0, 20000); From b96e8093a02c8f824c25267b0dc23552ed2b58c7 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sat, 16 Sep 2023 01:33:17 +0200 Subject: [PATCH 34/39] doc: fenv --- packages/core/controls.mjs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 58c4efa1..780b4a44 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -585,6 +585,17 @@ const generic_params = [ * .release(.5) */ ['bprelease', 'bpr'], + /** + * Sets the filter type. The 24db filter is more aggressive. More types might be added in the future. + * @name ftype + * @param {number | Pattern} type 12db (default) or 24db + * @example + * note("") + * .sound('sawtooth') + * .lpf(500) + * .bpenv(4) + * .ftype("<12db 24db>") + */ ['ftype'], ['fanchor'], /** From af6a5b85f55eef2527639df6b632c0619d581c83 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sat, 16 Sep 2023 01:33:34 +0200 Subject: [PATCH 35/39] keep only lp envelopes as examples --- website/src/pages/learn/effects.mdx | 64 ++--------------------------- 1 file changed, 4 insertions(+), 60 deletions(-) diff --git a/website/src/pages/learn/effects.mdx b/website/src/pages/learn/effects.mdx index f5ee12ab..4982f4cd 100644 --- a/website/src/pages/learn/effects.mdx +++ b/website/src/pages/learn/effects.mdx @@ -49,6 +49,10 @@ Each filter has 2 parameters: +## ftype + + + ## vowel @@ -111,66 +115,6 @@ There is one filter envelope for each filter type and thus one set of envelope f -## hpattack - - - -## hpdecay - - - -## hpsustain - - - -## hprelease - - - -## hpenv - - - -## hpattack - - - -## hpdecay - - - -## hpsustain - - - -## hprelease - - - -## hpenv - - - -## bpattack - - - -## bpdecay - - - -## bpsustain - - - -## bprelease - - - -## bpenv - - - # Dynamics ## gain From a7eb0bb04af0d83283d3407999990fac9967ac2a Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sat, 16 Sep 2023 01:34:00 +0200 Subject: [PATCH 36/39] snapshot --- test/__snapshots__/examples.test.mjs.snap | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index c46ca717..cd7595b5 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -2058,6 +2058,15 @@ exports[`runs examples > example "freq" example index 1 1`] = ` ] `; +exports[`runs examples > example "ftype" example index 0 1`] = ` +[ + "[ 0/1 → 1/1 | note:c2 s:sawtooth cutoff:500 bpenv:4 ftype:12db ]", + "[ 1/1 → 2/1 | note:e2 s:sawtooth cutoff:500 bpenv:4 ftype:24db ]", + "[ 2/1 → 3/1 | note:f2 s:sawtooth cutoff:500 bpenv:4 ftype:12db ]", + "[ 3/1 → 4/1 | note:g2 s:sawtooth cutoff:500 bpenv:4 ftype:24db ]", +] +`; + exports[`runs examples > example "gain" example index 0 1`] = ` [ "[ 0/1 → 1/8 | s:hh gain:0.4 ]", From 536427310d4f3f551429a446a81b928ef07ddc19 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sat, 16 Sep 2023 01:50:23 +0200 Subject: [PATCH 37/39] add some filter envelopes here and there --- website/src/repl/tunes.mjs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/website/src/repl/tunes.mjs b/website/src/repl/tunes.mjs index dd524283..2ab546b7 100644 --- a/website/src/repl/tunes.mjs +++ b/website/src/repl/tunes.mjs @@ -229,7 +229,9 @@ stack( .add("0,.02") .note().gain(.3) .clip("<1@3 [.3 1]>/2") - .s('sawtooth').cutoff(600).color('#F8E71C'), + .cutoff(600) + .lpa(.2).lpenv(-4) + .s('sawtooth').color('#F8E71C'), ).fast(3/2) //.pianoroll({fold:1})`; @@ -468,7 +470,9 @@ stack( .note() .s("sawtooth,square") .gain(.3).attack(0.01).decay(0.1).sustain(.5) - .apply(filter1), + .apply(filter1) + .lpa(.1).lpenv(2).ftype('24db') + , "~@3 [<2 3>,<4 5>]" .echo(4,1/16,.7) .scale(scales) @@ -803,14 +807,14 @@ stack( sine.add(saw.slow(4)).range(0,7).segment(8) .superimpose(x=>x.add(.1)) .scale('G0 minor').note() - .s("sawtooth").decay(.1).sustain(0) + .s("sawtooth").decay(.1).sustain(0).lpa(.1).lpenv(4) .gain(.4).cutoff(perlin.range(300,3000).slow(8)).resonance(10) .degradeBy("0 0.1 .5 .1") .rarely(add(note("12"))) , // chord note("Bb3,D4".superimpose(x=>x.add(.2))) - .s('sawtooth').cutoff(1000).struct("<~@3 [~ x]>") + .s('sawtooth').lpf(1000).struct("<~@3 [~ x]>") .decay(.05).sustain(.0).delay(.8).delaytime(.125).room(.8) , // alien From e0c424eb9262a331f31cbcae4e5a0c2369dd2c10 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sat, 16 Sep 2023 01:50:45 +0200 Subject: [PATCH 38/39] update snapshots --- test/__snapshots__/tunes.test.mjs.snap | 232 ++++++++++++------------- 1 file changed, 116 insertions(+), 116 deletions(-) diff --git a/test/__snapshots__/tunes.test.mjs.snap b/test/__snapshots__/tunes.test.mjs.snap index 3c072ca2..484c1380 100644 --- a/test/__snapshots__/tunes.test.mjs.snap +++ b/test/__snapshots__/tunes.test.mjs.snap @@ -3,23 +3,23 @@ exports[`renders tunes > tune: amensister 1`] = ` [ "[ 0/1 → 1/16 | s:breath room:1 shape:0.6 begin:0.9375 end:1 ]", - "[ 0/1 → 1/8 | note:Eb1 s:sawtooth decay:0.1 sustain:0 gain:0.4 cutoff:300.0066107586751 resonance:10 ]", - "[ 0/1 → 1/8 | note:F1 s:sawtooth decay:0.1 sustain:0 gain:0.4 cutoff:300.0066107586751 resonance:10 ]", + "[ 0/1 → 1/8 | note:Eb1 s:sawtooth decay:0.1 sustain:0 lpattack:0.1 lpenv:4 gain:0.4 cutoff:300.0066107586751 resonance:10 ]", + "[ 0/1 → 1/8 | note:F1 s:sawtooth decay:0.1 sustain:0 lpattack:0.1 lpenv:4 gain:0.4 cutoff:300.0066107586751 resonance:10 ]", "[ 0/1 → 1/4 | n:0 s:amencutup room:0.5 ]", "[ 1/16 → 1/8 | s:breath room:1 shape:0.6 begin:0.875 end:0.9375 ]", "[ 1/8 → 3/16 | s:breath room:1 shape:0.6 begin:0.8125 end:0.875 ]", - "[ 1/8 → 1/4 | note:45 s:sawtooth decay:0.1 sustain:0 gain:0.4 cutoff:300.174310575404 resonance:10 ]", - "[ 1/8 → 1/4 | note:45 s:sawtooth decay:0.1 sustain:0 gain:0.4 cutoff:300.174310575404 resonance:10 ]", + "[ 1/8 → 1/4 | note:45 s:sawtooth decay:0.1 sustain:0 lpattack:0.1 lpenv:4 gain:0.4 cutoff:300.174310575404 resonance:10 ]", + "[ 1/8 → 1/4 | note:45 s:sawtooth decay:0.1 sustain:0 lpattack:0.1 lpenv:4 gain:0.4 cutoff:300.174310575404 resonance:10 ]", "[ 3/16 → 1/4 | s:breath room:1 shape:0.6 begin:0.75 end:0.8125 ]", "[ 1/4 → 5/16 | s:breath room:1 shape:0.6 begin:0.6875 end:0.75 ]", "[ 1/4 → 3/8 | n:1 speed:2 delay:0.5 s:amencutup room:0.5 ]", - "[ 1/4 → 3/8 | note:A1 s:sawtooth decay:0.1 sustain:0 gain:0.4 cutoff:300.7878869297153 resonance:10 ]", - "[ 1/4 → 3/8 | note:A1 s:sawtooth decay:0.1 sustain:0 gain:0.4 cutoff:300.7878869297153 resonance:10 ]", + "[ 1/4 → 3/8 | note:A1 s:sawtooth decay:0.1 sustain:0 lpattack:0.1 lpenv:4 gain:0.4 cutoff:300.7878869297153 resonance:10 ]", + "[ 1/4 → 3/8 | note:A1 s:sawtooth decay:0.1 sustain:0 lpattack:0.1 lpenv:4 gain:0.4 cutoff:300.7878869297153 resonance:10 ]", "[ 5/16 → 3/8 | s:breath room:1 shape:0.6 begin:0.625 end:0.6875 ]", "[ 3/8 → 7/16 | s:breath room:1 shape:0.6 begin:0.5625 end:0.625 ]", "[ 3/8 → 1/2 | n:1 s:amencutup room:0.5 ]", - "[ 3/8 → 1/2 | note:F1 s:sawtooth decay:0.1 sustain:0 gain:0.4 cutoff:302.11020572391345 resonance:10 ]", - "[ 3/8 → 1/2 | note:F1 s:sawtooth decay:0.1 sustain:0 gain:0.4 cutoff:302.11020572391345 resonance:10 ]", + "[ 3/8 → 1/2 | note:F1 s:sawtooth decay:0.1 sustain:0 lpattack:0.1 lpenv:4 gain:0.4 cutoff:302.11020572391345 resonance:10 ]", + "[ 3/8 → 1/2 | note:F1 s:sawtooth decay:0.1 sustain:0 lpattack:0.1 lpenv:4 gain:0.4 cutoff:302.11020572391345 resonance:10 ]", "[ 7/16 → 1/2 | s:breath room:1 shape:0.6 begin:0.5 end:0.5625 ]", "[ 1/2 → 9/16 | s:breath room:1 shape:0.6 begin:0.4375 end:0.5 ]", "[ 1/2 → 3/4 | n:2 s:amencutup room:0.5 ]", @@ -28,13 +28,13 @@ exports[`renders tunes > tune: amensister 1`] = ` "[ 11/16 → 3/4 | s:breath room:1 shape:0.6 begin:0.25 end:0.3125 ]", "[ 3/4 → 13/16 | s:breath room:1 shape:0.6 begin:0.1875 end:0.25 ]", "[ 3/4 → 7/8 | n:3 s:amencutup room:0.5 ]", - "[ 3/4 → 7/8 | note:Bb0 s:sawtooth decay:0.1 sustain:0 gain:0.4 cutoff:312.54769231985796 resonance:10 ]", - "[ 3/4 → 7/8 | note:Bb0 s:sawtooth decay:0.1 sustain:0 gain:0.4 cutoff:312.54769231985796 resonance:10 ]", + "[ 3/4 → 7/8 | note:Bb0 s:sawtooth decay:0.1 sustain:0 lpattack:0.1 lpenv:4 gain:0.4 cutoff:312.54769231985796 resonance:10 ]", + "[ 3/4 → 7/8 | note:Bb0 s:sawtooth decay:0.1 sustain:0 lpattack:0.1 lpenv:4 gain:0.4 cutoff:312.54769231985796 resonance:10 ]", "[ 13/16 → 7/8 | s:breath room:1 shape:0.6 begin:0.125 end:0.1875 ]", "[ 7/8 → 15/16 | s:breath room:1 shape:0.6 begin:0.0625 end:0.125 ]", "[ 7/8 → 1/1 | n:3 s:amencutup room:0.5 ]", - "[ 7/8 → 1/1 | note:D1 s:sawtooth decay:0.1 sustain:0 gain:0.4 cutoff:318.7927796831686 resonance:10 ]", - "[ 7/8 → 1/1 | note:D1 s:sawtooth decay:0.1 sustain:0 gain:0.4 cutoff:318.7927796831686 resonance:10 ]", + "[ 7/8 → 1/1 | note:D1 s:sawtooth decay:0.1 sustain:0 lpattack:0.1 lpenv:4 gain:0.4 cutoff:318.7927796831686 resonance:10 ]", + "[ 7/8 → 1/1 | note:D1 s:sawtooth decay:0.1 sustain:0 lpattack:0.1 lpenv:4 gain:0.4 cutoff:318.7927796831686 resonance:10 ]", "[ 15/16 → 1/1 | s:breath room:1 shape:0.6 begin:0 end:0.0625 ]", ] `; @@ -323,8 +323,8 @@ exports[`renders tunes > tune: blippyRhodes 1`] = ` [ "[ 0/1 → 1/6 | note:G4 clip:0.3 s:rhodes room:0.5 delay:0.3 delayfeedback:0.4 delaytime:0.08333333333333333 gain:0.5 ]", "[ 0/1 → 1/3 | s:bd ]", - "[ (0/1 → 2/3) ⇝ 4/3 | note:36 gain:0.3 clip:1 s:sawtooth cutoff:600 ]", - "[ (0/1 → 2/3) ⇝ 4/3 | note:36.02 gain:0.3 clip:1 s:sawtooth cutoff:600 ]", + "[ (0/1 → 2/3) ⇝ 4/3 | note:36 gain:0.3 clip:1 cutoff:600 lpattack:0.2 lpenv:-4 s:sawtooth ]", + "[ (0/1 → 2/3) ⇝ 4/3 | note:36.02 gain:0.3 clip:1 cutoff:600 lpattack:0.2 lpenv:-4 s:sawtooth ]", "[ 1/6 → 1/3 | note:G4 clip:0.3 s:rhodes room:0.5 delay:0.3 delayfeedback:0.4 delaytime:0.08333333333333333 gain:0.5 ]", "[ 1/3 → 1/2 | note:B3 clip:0.3 s:rhodes room:0.5 delay:0.3 delayfeedback:0.4 delaytime:0.08333333333333333 gain:0.5 ]", "[ 1/3 → 1/2 | note:E4 clip:0.3 s:rhodes room:0.5 delay:0.3 delayfeedback:0.4 delaytime:0.08333333333333333 gain:0.5 ]", @@ -332,8 +332,8 @@ exports[`renders tunes > tune: blippyRhodes 1`] = ` "[ 1/2 → 2/3 | note:B3 clip:0.3 s:rhodes room:0.5 delay:0.3 delayfeedback:0.4 delaytime:0.08333333333333333 gain:0.5 ]", "[ 1/2 → 2/3 | note:E4 clip:0.3 s:rhodes room:0.5 delay:0.3 delayfeedback:0.4 delaytime:0.08333333333333333 gain:0.5 ]", "[ 2/3 → 5/6 | note:G3 clip:0.3 s:rhodes room:0.5 delay:0.3 delayfeedback:0.4 delaytime:0.08333333333333333 gain:0.5 ]", - "[ 0/1 ⇜ (2/3 → 1/1) ⇝ 4/3 | note:36 gain:0.3 clip:1 s:sawtooth cutoff:600 ]", - "[ 0/1 ⇜ (2/3 → 1/1) ⇝ 4/3 | note:36.02 gain:0.3 clip:1 s:sawtooth cutoff:600 ]", + "[ 0/1 ⇜ (2/3 → 1/1) ⇝ 4/3 | note:36 gain:0.3 clip:1 cutoff:600 lpattack:0.2 lpenv:-4 s:sawtooth ]", + "[ 0/1 ⇜ (2/3 → 1/1) ⇝ 4/3 | note:36.02 gain:0.3 clip:1 cutoff:600 lpattack:0.2 lpenv:-4 s:sawtooth ]", "[ 2/3 → 1/1 | s:sn ]", "[ 5/6 → 1/1 | note:G3 clip:0.3 s:rhodes room:0.5 delay:0.3 delayfeedback:0.4 delaytime:0.08333333333333333 gain:0.5 ]", ] @@ -7722,8 +7722,8 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ -1/8 ⇜ (0/1 → 3/8) | note:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:1699.6897509708342 ]", "[ -1/4 ⇜ (1/12 → 1/8) | note:A5 s:sawtooth gain:0.2536811842784369 attack:0.001 decay:0.2 sustain:0 hcutoff:5999.785818935017 cutoff:4000 ]", "[ -1/4 ⇜ (1/12 → 1/8) | note:C#5 s:sawtooth gain:0.2536811842784369 attack:0.001 decay:0.2 sustain:0 hcutoff:5999.785818935017 cutoff:4000 ]", - "[ 1/8 → 1/4 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1699.6897509708342 ]", - "[ 1/8 → 1/4 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1699.6897509708342 ]", + "[ 1/8 → 1/4 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1699.6897509708342 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 1/8 → 1/4 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1699.6897509708342 lpattack:0.1 lpenv:2 ftype:24db ]", "[ (1/8 → 5/12) ⇝ 1/2 | note:A5 s:sawtooth gain:0.26836160127988246 attack:0.001 decay:0.2 sustain:0 hcutoff:5994.647308096509 cutoff:4000 ]", "[ (1/8 → 5/12) ⇝ 1/2 | note:C#5 s:sawtooth gain:0.26836160127988246 attack:0.001 decay:0.2 sustain:0 hcutoff:5994.647308096509 cutoff:4000 ]", "[ -1/8 ⇜ (1/6 → 1/4) | note:F#5 s:sawtooth gain:0.2573601511491127 attack:0.001 decay:0.2 sustain:0 hcutoff:5999.143312438893 cutoff:4000 ]", @@ -7735,14 +7735,14 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (1/4 → 7/12) ⇝ 5/8 | note:E5 s:sawtooth gain:0.2756442833140452 attack:0.001 decay:0.2 sustain:0 hcutoff:5989.512318936654 cutoff:4000 ]", "[ 0/1 ⇜ (1/3 → 3/8) | note:A5 s:sawtooth gain:0.26103468453995016 attack:0.001 decay:0.2 sustain:0 hcutoff:5998.072590601808 cutoff:4000 ]", "[ 0/1 ⇜ (1/3 → 3/8) | note:C#5 s:sawtooth gain:0.26103468453995016 attack:0.001 decay:0.2 sustain:0 hcutoff:5998.072590601808 cutoff:4000 ]", - "[ 3/8 → 1/2 | note:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1765.826371664994 ]", - "[ 3/8 → 1/2 | note:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1765.826371664994 ]", + "[ 3/8 → 1/2 | note:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1765.826371664994 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 3/8 → 1/2 | note:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1765.826371664994 lpattack:0.1 lpenv:2 ftype:24db ]", "[ (3/8 → 2/3) ⇝ 3/4 | note:A5 s:sawtooth gain:0.2828651860235305 attack:0.001 decay:0.2 sustain:0 hcutoff:5982.671142387316 cutoff:4000 ]", "[ (3/8 → 2/3) ⇝ 3/4 | note:C#5 s:sawtooth gain:0.2828651860235305 attack:0.001 decay:0.2 sustain:0 hcutoff:5982.671142387316 cutoff:4000 ]", "[ 1/8 ⇜ (5/12 → 1/2) | note:F#5 s:sawtooth gain:0.26836160127988246 attack:0.001 decay:0.2 sustain:0 hcutoff:5994.647308096509 cutoff:4000 ]", "[ 1/8 ⇜ (5/12 → 1/2) | note:A4 s:sawtooth gain:0.26836160127988246 attack:0.001 decay:0.2 sustain:0 hcutoff:5994.647308096509 cutoff:4000 ]", - "[ 1/2 → 5/8 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1798.799979846742 ]", - "[ 1/2 → 5/8 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1798.799979846742 ]", + "[ 1/2 → 5/8 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1798.799979846742 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 1/2 → 5/8 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1798.799979846742 lpattack:0.1 lpenv:2 ftype:24db ]", "[ 1/2 → 3/4 | note:F#5 s:sawtooth gain:0.28644702698548963 attack:0.001 decay:0.2 sustain:0 hcutoff:5978.612153434527 cutoff:4000 ]", "[ 1/2 → 3/4 | note:A4 s:sawtooth gain:0.28644702698548963 attack:0.001 decay:0.2 sustain:0 hcutoff:5978.612153434527 cutoff:4000 ]", "[ 1/2 → 3/4 | s:bd gain:0.7 ]", @@ -7755,8 +7755,8 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (5/8 → 11/12) ⇝ 1/1 | note:C#5 s:sawtooth gain:0.29705226105983373 attack:0.001 decay:0.2 sustain:0 hcutoff:5963.890147645195 cutoff:4000 ]", "[ 3/8 ⇜ (2/3 → 3/4) | note:F#5 s:sawtooth gain:0.2828651860235305 attack:0.001 decay:0.2 sustain:0 hcutoff:5982.671142387316 cutoff:4000 ]", "[ 3/8 ⇜ (2/3 → 3/4) | note:A4 s:sawtooth gain:0.2828651860235305 attack:0.001 decay:0.2 sustain:0 hcutoff:5982.671142387316 cutoff:4000 ]", - "[ 3/4 → 7/8 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1864.4584935007128 ]", - "[ 3/4 → 7/8 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1864.4584935007128 ]", + "[ 3/4 → 7/8 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1864.4584935007128 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 3/4 → 7/8 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1864.4584935007128 lpattack:0.1 lpenv:2 ftype:24db ]", "[ 3/4 → 1/1 | note:F#5 s:sawtooth gain:0.300533478008833 attack:0.001 decay:0.2 sustain:0 hcutoff:5958.137268909887 cutoff:4000 ]", "[ 3/4 → 1/1 | note:A4 s:sawtooth gain:0.300533478008833 attack:0.001 decay:0.2 sustain:0 hcutoff:5958.137268909887 cutoff:4000 ]", "[ 3/4 → 1/1 | s:hh3 gain:0.7 ]", @@ -7764,8 +7764,8 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (3/4 → 1/1) ⇝ 9/8 | note:E5 s:sawtooth gain:0.30398425548024827 attack:0.001 decay:0.2 sustain:0 hcutoff:5951.963201008076 cutoff:4000 ]", "[ 1/2 ⇜ (5/6 → 7/8) | note:A5 s:sawtooth gain:0.29000691362123476 attack:0.001 decay:0.2 sustain:0 hcutoff:5974.128467049176 cutoff:4000 ]", "[ 1/2 ⇜ (5/6 → 7/8) | note:C#5 s:sawtooth gain:0.29000691362123476 attack:0.001 decay:0.2 sustain:0 hcutoff:5974.128467049176 cutoff:4000 ]", - "[ 7/8 → 1/1 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1897.1038487394403 ]", - "[ 7/8 → 1/1 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1897.1038487394403 ]", + "[ 7/8 → 1/1 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1897.1038487394403 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 7/8 → 1/1 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1897.1038487394403 lpattack:0.1 lpenv:2 ftype:24db ]", "[ (7/8 → 1/1) ⇝ 5/4 | note:A5 s:sawtooth gain:0.3107861971007485 attack:0.001 decay:0.2 sustain:0 hcutoff:5938.355801271282 cutoff:4000 ]", "[ (7/8 → 1/1) ⇝ 5/4 | note:C#5 s:sawtooth gain:0.3107861971007485 attack:0.001 decay:0.2 sustain:0 hcutoff:5938.355801271282 cutoff:4000 ]", "[ 5/8 ⇜ (11/12 → 1/1) | note:F#5 s:sawtooth gain:0.29705226105983373 attack:0.001 decay:0.2 sustain:0 hcutoff:5963.890147645195 cutoff:4000 ]", @@ -7781,8 +7781,8 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (1/1 → 4/3) ⇝ 11/8 | note:E5 s:sawtooth gain:0.317441699448191 attack:0.001 decay:0.2 sustain:0 hcutoff:5923.077274266886 cutoff:4000 ]", "[ 3/4 ⇜ (13/12 → 9/8) | note:A5 s:sawtooth gain:0.30398425548024827 attack:0.001 decay:0.2 sustain:0 hcutoff:5951.963201008076 cutoff:4000 ]", "[ 3/4 ⇜ (13/12 → 9/8) | note:C#5 s:sawtooth gain:0.30398425548024827 attack:0.001 decay:0.2 sustain:0 hcutoff:5951.963201008076 cutoff:4000 ]", - "[ 9/8 → 5/4 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1961.928446178906 ]", - "[ 9/8 → 5/4 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1961.928446178906 ]", + "[ 9/8 → 5/4 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1961.928446178906 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 9/8 → 5/4 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1961.928446178906 lpattack:0.1 lpenv:2 ftype:24db ]", "[ (9/8 → 17/12) ⇝ 3/2 | note:A5 s:sawtooth gain:0.3239347288344676 attack:0.001 decay:0.2 sustain:0 hcutoff:5906.1380911341175 cutoff:4000 ]", "[ (9/8 → 17/12) ⇝ 3/2 | note:C#5 s:sawtooth gain:0.3239347288344676 attack:0.001 decay:0.2 sustain:0 hcutoff:5906.1380911341175 cutoff:4000 ]", "[ 7/8 ⇜ (7/6 → 5/4) | note:F#5 s:sawtooth gain:0.3107861971007485 attack:0.001 decay:0.2 sustain:0 hcutoff:5938.355801271282 cutoff:4000 ]", @@ -7794,14 +7794,14 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (5/4 → 19/12) ⇝ 13/8 | note:E5 s:sawtooth gain:0.3302496429830646 attack:0.001 decay:0.2 sustain:0 hcutoff:5887.549861142967 cutoff:4000 ]", "[ 1/1 ⇜ (4/3 → 11/8) | note:A5 s:sawtooth gain:0.317441699448191 attack:0.001 decay:0.2 sustain:0 hcutoff:5923.077274266886 cutoff:4000 ]", "[ 1/1 ⇜ (4/3 → 11/8) | note:C#5 s:sawtooth gain:0.317441699448191 attack:0.001 decay:0.2 sustain:0 hcutoff:5923.077274266886 cutoff:4000 ]", - "[ 11/8 → 3/2 | note:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2026.0015806698216 ]", - "[ 11/8 → 3/2 | note:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2026.0015806698216 ]", + "[ 11/8 → 3/2 | note:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2026.0015806698216 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 11/8 → 3/2 | note:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2026.0015806698216 lpattack:0.1 lpenv:2 ftype:24db ]", "[ (11/8 → 5/3) ⇝ 7/4 | note:A5 s:sawtooth gain:0.3363712287126769 attack:0.001 decay:0.2 sustain:0 hcutoff:5867.325323737765 cutoff:4000 ]", "[ (11/8 → 5/3) ⇝ 7/4 | note:C#5 s:sawtooth gain:0.3363712287126769 attack:0.001 decay:0.2 sustain:0 hcutoff:5867.325323737765 cutoff:4000 ]", "[ 9/8 ⇜ (17/12 → 3/2) | note:F#5 s:sawtooth gain:0.3239347288344676 attack:0.001 decay:0.2 sustain:0 hcutoff:5906.1380911341175 cutoff:4000 ]", "[ 9/8 ⇜ (17/12 → 3/2) | note:A4 s:sawtooth gain:0.3239347288344676 attack:0.001 decay:0.2 sustain:0 hcutoff:5906.1380911341175 cutoff:4000 ]", - "[ 3/2 → 13/8 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2057.708031580958 ]", - "[ 3/2 → 13/8 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2057.708031580958 ]", + "[ 3/2 → 13/8 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2057.708031580958 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 3/2 → 13/8 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2057.708031580958 lpattack:0.1 lpenv:2 ftype:24db ]", "[ 3/2 → 7/4 | note:F#5 s:sawtooth gain:0.339354895673865 attack:0.001 decay:0.2 sustain:0 hcutoff:5856.603727730447 cutoff:4000 ]", "[ 3/2 → 7/4 | note:A4 s:sawtooth gain:0.339354895673865 attack:0.001 decay:0.2 sustain:0 hcutoff:5856.603727730447 cutoff:4000 ]", "[ 3/2 → 7/4 | s:bd gain:0.7 ]", @@ -7818,8 +7818,8 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (13/8 → 2/1) ⇝ 17/8 | note:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2120.3652183367367 ]", "[ 11/8 ⇜ (5/3 → 7/4) | note:F#5 s:sawtooth gain:0.3363712287126769 attack:0.001 decay:0.2 sustain:0 hcutoff:5867.325323737765 cutoff:4000 ]", "[ 11/8 ⇜ (5/3 → 7/4) | note:A4 s:sawtooth gain:0.3363712287126769 attack:0.001 decay:0.2 sustain:0 hcutoff:5867.325323737765 cutoff:4000 ]", - "[ 7/4 → 15/8 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2120.3652183367367 ]", - "[ 7/4 → 15/8 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2120.3652183367367 ]", + "[ 7/4 → 15/8 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2120.3652183367367 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 7/4 → 15/8 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2120.3652183367367 lpattack:0.1 lpenv:2 ftype:24db ]", "[ 7/4 → 2/1 | note:F#5 s:sawtooth gain:0.3507338432270528 attack:0.001 decay:0.2 sustain:0 hcutoff:5809.698831278217 cutoff:4000 ]", "[ 7/4 → 2/1 | note:A4 s:sawtooth gain:0.3507338432270528 attack:0.001 decay:0.2 sustain:0 hcutoff:5809.698831278217 cutoff:4000 ]", "[ 7/4 → 2/1 | s:hh3 gain:0.7 ]", @@ -7829,8 +7829,8 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (7/4 → 2/1) ⇝ 9/4 | note:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2135.8582993222344 ]", "[ 3/2 ⇜ (11/6 → 15/8) | note:A5 s:sawtooth gain:0.3422847385870941 attack:0.001 decay:0.2 sustain:0 hcutoff:5845.47833980621 cutoff:4000 ]", "[ 3/2 ⇜ (11/6 → 15/8) | note:C#5 s:sawtooth gain:0.3422847385870941 attack:0.001 decay:0.2 sustain:0 hcutoff:5845.47833980621 cutoff:4000 ]", - "[ 15/8 → 2/1 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2151.2782118349805 ]", - "[ 15/8 → 2/1 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2151.2782118349805 ]", + "[ 15/8 → 2/1 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2151.2782118349805 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 15/8 → 2/1 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2151.2782118349805 lpattack:0.1 lpenv:2 ftype:24db ]", "[ (15/8 → 2/1) ⇝ 9/4 | note:A5 s:sawtooth gain:0.35343108171056004 attack:0.001 decay:0.2 sustain:0 hcutoff:5796.978025372246 cutoff:4000 ]", "[ (15/8 → 2/1) ⇝ 9/4 | note:C#5 s:sawtooth gain:0.35343108171056004 attack:0.001 decay:0.2 sustain:0 hcutoff:5796.978025372246 cutoff:4000 ]", "[ (15/8 → 2/1) ⇝ 19/8 | note:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2151.2782118349805 ]", @@ -7854,8 +7854,8 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ 15/8 ⇜ (2/1 → 19/8) | note:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2212.17990613181 ]", "[ 7/4 ⇜ (25/12 → 17/8) | note:A5 s:sawtooth gain:0.3586370624427201 attack:0.001 decay:0.2 sustain:0 hcutoff:5770.357934562703 cutoff:4000 ]", "[ 7/4 ⇜ (25/12 → 17/8) | note:C#5 s:sawtooth gain:0.3586370624427201 attack:0.001 decay:0.2 sustain:0 hcutoff:5770.357934562703 cutoff:4000 ]", - "[ 17/8 → 9/4 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2212.17990613181 ]", - "[ 17/8 → 9/4 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2212.17990613181 ]", + "[ 17/8 → 9/4 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2212.17990613181 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 17/8 → 9/4 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2212.17990613181 lpattack:0.1 lpenv:2 ftype:24db ]", "[ (17/8 → 29/12) ⇝ 5/2 | note:A5 s:sawtooth gain:0.368251964143991 attack:0.001 decay:0.2 sustain:0 hcutoff:5712.469093657604 cutoff:4000 ]", "[ (17/8 → 29/12) ⇝ 5/2 | note:C#5 s:sawtooth gain:0.368251964143991 attack:0.001 decay:0.2 sustain:0 hcutoff:5712.469093657604 cutoff:4000 ]", "[ 15/8 ⇜ (13/6 → 9/4) | note:F#5 s:sawtooth gain:0.36114266880324397 attack:0.001 decay:0.2 sustain:0 hcutoff:5756.463210874651 cutoff:4000 ]", @@ -7867,14 +7867,14 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (9/4 → 31/12) ⇝ 21/8 | note:E5 s:sawtooth gain:0.3726377219727376 attack:0.001 decay:0.2 sustain:0 hcutoff:5681.240017681994 cutoff:4000 ]", "[ 2/1 ⇜ (7/3 → 19/8) | note:A5 s:sawtooth gain:0.3635813269759728 attack:0.001 decay:0.2 sustain:0 hcutoff:5742.18185383172 cutoff:4000 ]", "[ 2/1 ⇜ (7/3 → 19/8) | note:C#5 s:sawtooth gain:0.3635813269759728 attack:0.001 decay:0.2 sustain:0 hcutoff:5742.18185383172 cutoff:4000 ]", - "[ 19/8 → 5/2 | note:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2271.727259793624 ]", - "[ 19/8 → 5/2 | note:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2271.727259793624 ]", + "[ 19/8 → 5/2 | note:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2271.727259793624 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 19/8 → 5/2 | note:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2271.727259793624 lpattack:0.1 lpenv:2 ftype:24db ]", "[ (19/8 → 8/3) ⇝ 11/4 | note:A5 s:sawtooth gain:0.3767280347874561 attack:0.001 decay:0.2 sustain:0 hcutoff:5648.516028753632 cutoff:4000 ]", "[ (19/8 → 8/3) ⇝ 11/4 | note:C#5 s:sawtooth gain:0.3767280347874561 attack:0.001 decay:0.2 sustain:0 hcutoff:5648.516028753632 cutoff:4000 ]", "[ 17/8 ⇜ (29/12 → 5/2) | note:F#5 s:sawtooth gain:0.368251964143991 attack:0.001 decay:0.2 sustain:0 hcutoff:5712.469093657604 cutoff:4000 ]", "[ 17/8 ⇜ (29/12 → 5/2) | note:A4 s:sawtooth gain:0.368251964143991 attack:0.001 decay:0.2 sustain:0 hcutoff:5712.469093657604 cutoff:4000 ]", - "[ 5/2 → 21/8 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2300.948092306816 ]", - "[ 5/2 → 21/8 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2300.948092306816 ]", + "[ 5/2 → 21/8 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2300.948092306816 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 5/2 → 21/8 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2300.948092306816 lpattack:0.1 lpenv:2 ftype:24db ]", "[ 5/2 → 11/4 | note:F#5 s:sawtooth gain:0.37865929150004085 attack:0.001 decay:0.2 sustain:0 hcutoff:5631.60041088523 cutoff:4000 ]", "[ 5/2 → 11/4 | note:A4 s:sawtooth gain:0.37865929150004085 attack:0.001 decay:0.2 sustain:0 hcutoff:5631.60041088523 cutoff:4000 ]", "[ 5/2 → 11/4 | s:bd gain:0.7 ]", @@ -7887,8 +7887,8 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (21/8 → 35/12) ⇝ 3/1 | note:C#5 s:sawtooth gain:0.38398364517932737 attack:0.001 decay:0.2 sustain:0 hcutoff:5578.674030756363 cutoff:4000 ]", "[ 19/8 ⇜ (8/3 → 11/4) | note:F#5 s:sawtooth gain:0.3767280347874561 attack:0.001 decay:0.2 sustain:0 hcutoff:5648.516028753632 cutoff:4000 ]", "[ 19/8 ⇜ (8/3 → 11/4) | note:A4 s:sawtooth gain:0.3767280347874561 attack:0.001 decay:0.2 sustain:0 hcutoff:5648.516028753632 cutoff:4000 ]", - "[ 11/4 → 23/8 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2358.1960716159333 ]", - "[ 11/4 → 23/8 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2358.1960716159333 ]", + "[ 11/4 → 23/8 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2358.1960716159333 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 11/4 → 23/8 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2358.1960716159333 lpattack:0.1 lpenv:2 ftype:24db ]", "[ 11/4 → 3/1 | note:F#5 s:sawtooth gain:0.3855983939685166 attack:0.001 decay:0.2 sustain:0 hcutoff:5560.31547155504 cutoff:4000 ]", "[ 11/4 → 3/1 | note:A4 s:sawtooth gain:0.3855983939685166 attack:0.001 decay:0.2 sustain:0 hcutoff:5560.31547155504 cutoff:4000 ]", "[ 11/4 → 3/1 | s:hh3 gain:0.7 ]", @@ -7896,8 +7896,8 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (11/4 → 3/1) ⇝ 25/8 | note:E5 s:sawtooth gain:0.3871314633555296 attack:0.001 decay:0.2 sustain:0 hcutoff:5541.603887904197 cutoff:4000 ]", "[ 5/2 ⇜ (17/6 → 23/8) | note:A5 s:sawtooth gain:0.38051304866630675 attack:0.001 decay:0.2 sustain:0 hcutoff:5614.319554259933 cutoff:4000 ]", "[ 5/2 ⇜ (17/6 → 23/8) | note:C#5 s:sawtooth gain:0.38051304866630675 attack:0.001 decay:0.2 sustain:0 hcutoff:5614.319554259933 cutoff:4000 ]", - "[ 23/8 → 3/1 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2386.1887343697626 ]", - "[ 23/8 → 3/1 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2386.1887343697626 ]", + "[ 23/8 → 3/1 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2386.1887343697626 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 23/8 → 3/1 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2386.1887343697626 lpattack:0.1 lpenv:2 ftype:24db ]", "[ (23/8 → 3/1) ⇝ 13/4 | note:A5 s:sawtooth gain:0.38994891982521085 attack:0.001 decay:0.2 sustain:0 hcutoff:5503.134531727652 cutoff:4000 ]", "[ (23/8 → 3/1) ⇝ 13/4 | note:C#5 s:sawtooth gain:0.38994891982521085 attack:0.001 decay:0.2 sustain:0 hcutoff:5503.134531727652 cutoff:4000 ]", "[ 21/8 ⇜ (35/12 → 3/1) | note:F#5 s:sawtooth gain:0.38398364517932737 attack:0.001 decay:0.2 sustain:0 hcutoff:5578.674030756363 cutoff:4000 ]", @@ -7913,8 +7913,8 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (3/1 → 10/3) ⇝ 27/8 | note:E5 s:sawtooth gain:0.39242922708895556 attack:0.001 decay:0.2 sustain:0 hcutoff:5463.2923272018625 cutoff:4000 ]", "[ 11/4 ⇜ (37/12 → 25/8) | note:A5 s:sawtooth gain:0.3871314633555296 attack:0.001 decay:0.2 sustain:0 hcutoff:5541.603887904197 cutoff:4000 ]", "[ 11/4 ⇜ (37/12 → 25/8) | note:C#5 s:sawtooth gain:0.3871314633555296 attack:0.001 decay:0.2 sustain:0 hcutoff:5541.603887904197 cutoff:4000 ]", - "[ 25/8 → 13/4 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2440.8271075661924 ]", - "[ 25/8 → 13/4 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2440.8271075661924 ]", + "[ 25/8 → 13/4 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2440.8271075661924 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 25/8 → 13/4 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2440.8271075661924 lpattack:0.1 lpenv:2 ftype:24db ]", "[ (25/8 → 41/12) ⇝ 7/2 | note:A5 s:sawtooth gain:0.394566409869316 attack:0.001 decay:0.2 sustain:0 hcutoff:5422.104580183649 cutoff:4000 ]", "[ (25/8 → 41/12) ⇝ 7/2 | note:C#5 s:sawtooth gain:0.394566409869316 attack:0.001 decay:0.2 sustain:0 hcutoff:5422.104580183649 cutoff:4000 ]", "[ 23/8 ⇜ (19/6 → 13/4) | note:F#5 s:sawtooth gain:0.38994891982521085 attack:0.001 decay:0.2 sustain:0 hcutoff:5503.134531727652 cutoff:4000 ]", @@ -7926,14 +7926,14 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (13/4 → 43/12) ⇝ 29/8 | note:E5 s:sawtooth gain:0.3963553195057793 attack:0.001 decay:0.2 sustain:0 hcutoff:5379.599518697443 cutoff:4000 ]", "[ 3/1 ⇜ (10/3 → 27/8) | note:A5 s:sawtooth gain:0.39242922708895556 attack:0.001 decay:0.2 sustain:0 hcutoff:5463.2923272018625 cutoff:4000 ]", "[ 3/1 ⇜ (10/3 → 27/8) | note:C#5 s:sawtooth gain:0.39242922708895556 attack:0.001 decay:0.2 sustain:0 hcutoff:5463.2923272018625 cutoff:4000 ]", - "[ 27/8 → 7/2 | note:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2493.5603089922215 ]", - "[ 27/8 → 7/2 | note:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2493.5603089922215 ]", + "[ 27/8 → 7/2 | note:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2493.5603089922215 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 27/8 → 7/2 | note:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2493.5603089922215 lpattack:0.1 lpenv:2 ftype:24db ]", "[ (27/8 → 11/3) ⇝ 15/4 | note:A5 s:sawtooth gain:0.3977916463583412 attack:0.001 decay:0.2 sustain:0 hcutoff:5335.806273589214 cutoff:4000 ]", "[ (27/8 → 11/3) ⇝ 15/4 | note:C#5 s:sawtooth gain:0.3977916463583412 attack:0.001 decay:0.2 sustain:0 hcutoff:5335.806273589214 cutoff:4000 ]", "[ 25/8 ⇜ (41/12 → 7/2) | note:F#5 s:sawtooth gain:0.394566409869316 attack:0.001 decay:0.2 sustain:0 hcutoff:5422.104580183649 cutoff:4000 ]", "[ 25/8 ⇜ (41/12 → 7/2) | note:A4 s:sawtooth gain:0.394566409869316 attack:0.001 decay:0.2 sustain:0 hcutoff:5422.104580183649 cutoff:4000 ]", - "[ 7/2 → 29/8 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2519.1725829012184 ]", - "[ 7/2 → 29/8 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2519.1725829012184 ]", + "[ 7/2 → 29/8 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2519.1725829012184 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 7/2 → 29/8 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2519.1725829012184 lpattack:0.1 lpenv:2 ftype:24db ]", "[ 7/2 → 15/4 | note:F#5 s:sawtooth gain:0.3983764764947172 attack:0.001 decay:0.2 sustain:0 hcutoff:5313.435927530719 cutoff:4000 ]", "[ 7/2 → 15/4 | note:A4 s:sawtooth gain:0.3983764764947172 attack:0.001 decay:0.2 sustain:0 hcutoff:5313.435927530719 cutoff:4000 ]", "[ 7/2 → 15/4 | s:bd gain:0.7 ]", @@ -7950,8 +7950,8 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (29/8 → 4/1) ⇝ 33/8 | note:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2568.811347023862 ]", "[ 27/8 ⇜ (11/3 → 15/4) | note:F#5 s:sawtooth gain:0.3977916463583412 attack:0.001 decay:0.2 sustain:0 hcutoff:5335.806273589214 cutoff:4000 ]", "[ 27/8 ⇜ (11/3 → 15/4) | note:A4 s:sawtooth gain:0.3977916463583412 attack:0.001 decay:0.2 sustain:0 hcutoff:5335.806273589214 cutoff:4000 ]", - "[ 15/4 → 31/8 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2568.811347023862 ]", - "[ 15/4 → 31/8 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2568.811347023862 ]", + "[ 15/4 → 31/8 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2568.811347023862 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 15/4 → 31/8 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2568.811347023862 lpattack:0.1 lpenv:2 ftype:24db ]", "[ 15/4 → 4/1 | note:F#5 s:sawtooth gain:0.3998193184307759 attack:0.001 decay:0.2 sustain:0 hcutoff:5220.886439234386 cutoff:4000 ]", "[ 15/4 → 4/1 | note:A4 s:sawtooth gain:0.3998193184307759 attack:0.001 decay:0.2 sustain:0 hcutoff:5220.886439234386 cutoff:4000 ]", "[ 15/4 → 4/1 | s:hh3 gain:0.7 ]", @@ -7961,8 +7961,8 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (15/4 → 4/1) ⇝ 17/4 | note:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2580.8797353950404 ]", "[ 7/2 ⇜ (23/6 → 31/8) | note:A5 s:sawtooth gain:0.3988719301898066 attack:0.001 decay:0.2 sustain:0 hcutoff:5290.754858561636 cutoff:4000 ]", "[ 7/2 ⇜ (23/6 → 31/8) | note:C#5 s:sawtooth gain:0.3988719301898066 attack:0.001 decay:0.2 sustain:0 hcutoff:5290.754858561636 cutoff:4000 ]", - "[ 31/8 → 4/1 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2592.8079367021132 ]", - "[ 31/8 → 4/1 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2592.8079367021132 ]", + "[ 31/8 → 4/1 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2592.8079367021132 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 31/8 → 4/1 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2592.8079367021132 lpattack:0.1 lpenv:2 ftype:24db ]", "[ 31/8 → 4/1 | s:bd gain:0.7 ]", "[ (31/8 → 4/1) ⇝ 17/4 | note:A5 s:sawtooth gain:0.3999548228044306 attack:0.001 decay:0.2 sustain:0 hcutoff:5197.0018638323545 cutoff:4000 ]", "[ (31/8 → 4/1) ⇝ 17/4 | note:C#5 s:sawtooth gain:0.3999548228044306 attack:0.001 decay:0.2 sustain:0 hcutoff:5197.0018638323545 cutoff:4000 ]", @@ -7987,8 +7987,8 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ 31/8 ⇜ (4/1 → 35/8) | note:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2639.083266757757 ]", "[ 15/4 ⇜ (49/12 → 33/8) | note:A5 s:sawtooth gain:0.3999548228044306 attack:0.001 decay:0.2 sustain:0 hcutoff:5148.3645377501725 cutoff:4000 ]", "[ 15/4 ⇜ (49/12 → 33/8) | note:C#5 s:sawtooth gain:0.3999548228044306 attack:0.001 decay:0.2 sustain:0 hcutoff:5148.3645377501725 cutoff:4000 ]", - "[ 33/8 → 17/4 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2639.083266757757 ]", - "[ 33/8 → 17/4 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2639.083266757757 ]", + "[ 33/8 → 17/4 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2639.083266757757 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 33/8 → 17/4 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2639.083266757757 lpattack:0.1 lpenv:2 ftype:24db ]", "[ (33/8 → 53/12) ⇝ 9/2 | note:A5 s:sawtooth gain:0.3988719301898066 attack:0.001 decay:0.2 sustain:0 hcutoff:5047.734873274585 cutoff:4000 ]", "[ (33/8 → 53/12) ⇝ 9/2 | note:C#5 s:sawtooth gain:0.3988719301898066 attack:0.001 decay:0.2 sustain:0 hcutoff:5047.734873274585 cutoff:4000 ]", "[ 31/8 ⇜ (25/6 → 17/4) | note:F#5 s:sawtooth gain:0.3998193184307759 attack:0.001 decay:0.2 sustain:0 hcutoff:5123.62012082546 cutoff:4000 ]", @@ -8000,14 +8000,14 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (17/4 → 55/12) ⇝ 37/8 | note:E5 s:sawtooth gain:0.3977916463583412 attack:0.001 decay:0.2 sustain:0 hcutoff:4995.811501426648 cutoff:4000 ]", "[ 4/1 ⇜ (13/3 → 35/8) | note:A5 s:sawtooth gain:0.3995935685018036 attack:0.001 decay:0.2 sustain:0 hcutoff:5098.597504951462 cutoff:4000 ]", "[ 4/1 ⇜ (13/3 → 35/8) | note:C#5 s:sawtooth gain:0.3995935685018036 attack:0.001 decay:0.2 sustain:0 hcutoff:5098.597504951462 cutoff:4000 ]", - "[ 35/8 → 9/2 | note:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2682.97580859032 ]", - "[ 35/8 → 9/2 | note:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2682.97580859032 ]", + "[ 35/8 → 9/2 | note:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2682.97580859032 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 35/8 → 9/2 | note:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2682.97580859032 lpattack:0.1 lpenv:2 ftype:24db ]", "[ (35/8 → 14/3) ⇝ 19/4 | note:A5 s:sawtooth gain:0.3963553195057793 attack:0.001 decay:0.2 sustain:0 hcutoff:4942.862975093085 cutoff:4000 ]", "[ (35/8 → 14/3) ⇝ 19/4 | note:C#5 s:sawtooth gain:0.3963553195057793 attack:0.001 decay:0.2 sustain:0 hcutoff:4942.862975093085 cutoff:4000 ]", "[ 33/8 ⇜ (53/12 → 9/2) | note:F#5 s:sawtooth gain:0.3988719301898066 attack:0.001 decay:0.2 sustain:0 hcutoff:5047.734873274585 cutoff:4000 ]", "[ 33/8 ⇜ (53/12 → 9/2) | note:A4 s:sawtooth gain:0.3988719301898066 attack:0.001 decay:0.2 sustain:0 hcutoff:5047.734873274585 cutoff:4000 ]", - "[ 9/2 → 37/8 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2703.995258572327 ]", - "[ 9/2 → 37/8 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2703.995258572327 ]", + "[ 9/2 → 37/8 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2703.995258572327 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 9/2 → 37/8 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2703.995258572327 lpattack:0.1 lpenv:2 ftype:24db ]", "[ 9/2 → 19/4 | note:F#5 s:sawtooth gain:0.3955046879791817 attack:0.001 decay:0.2 sustain:0 hcutoff:4916.015592312082 cutoff:4000 ]", "[ 9/2 → 19/4 | note:A4 s:sawtooth gain:0.3955046879791817 attack:0.001 decay:0.2 sustain:0 hcutoff:4916.015592312082 cutoff:4000 ]", "[ 9/2 → 19/4 | s:bd gain:0.7 ]", @@ -8020,8 +8020,8 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (37/8 → 59/12) ⇝ 5/1 | note:C#5 s:sawtooth gain:0.39242922708895556 attack:0.001 decay:0.2 sustain:0 hcutoff:4834.036289789029 cutoff:4000 ]", "[ 35/8 ⇜ (14/3 → 19/4) | note:F#5 s:sawtooth gain:0.3963553195057793 attack:0.001 decay:0.2 sustain:0 hcutoff:4942.862975093085 cutoff:4000 ]", "[ 35/8 ⇜ (14/3 → 19/4) | note:A4 s:sawtooth gain:0.3963553195057793 attack:0.001 decay:0.2 sustain:0 hcutoff:4942.862975093085 cutoff:4000 ]", - "[ 19/4 → 39/8 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2744.1172176410028 ]", - "[ 19/4 → 39/8 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2744.1172176410028 ]", + "[ 19/4 → 39/8 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2744.1172176410028 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 19/4 → 39/8 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2744.1172176410028 lpattack:0.1 lpenv:2 ftype:24db ]", "[ 19/4 → 5/1 | note:F#5 s:sawtooth gain:0.3912316097774532 attack:0.001 decay:0.2 sustain:0 hcutoff:4806.246411789873 cutoff:4000 ]", "[ 19/4 → 5/1 | note:A4 s:sawtooth gain:0.3912316097774532 attack:0.001 decay:0.2 sustain:0 hcutoff:4806.246411789873 cutoff:4000 ]", "[ 19/4 → 5/1 | s:hh3 gain:0.7 ]", @@ -8029,8 +8029,8 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (19/4 → 5/1) ⇝ 41/8 | note:E5 s:sawtooth gain:0.38994891982521085 attack:0.001 decay:0.2 sustain:0 hcutoff:4778.23271519263 cutoff:4000 ]", "[ 9/2 ⇜ (29/6 → 39/8) | note:A5 s:sawtooth gain:0.394566409869316 attack:0.001 decay:0.2 sustain:0 hcutoff:4888.925582549005 cutoff:4000 ]", "[ 9/2 ⇜ (29/6 → 39/8) | note:C#5 s:sawtooth gain:0.394566409869316 attack:0.001 decay:0.2 sustain:0 hcutoff:4888.925582549005 cutoff:4000 ]", - "[ 39/8 → 5/1 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2763.195558759784 ]", - "[ 39/8 → 5/1 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2763.195558759784 ]", + "[ 39/8 → 5/1 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2763.195558759784 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 39/8 → 5/1 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2763.195558759784 lpattack:0.1 lpenv:2 ftype:24db ]", "[ (39/8 → 5/1) ⇝ 21/4 | note:A5 s:sawtooth gain:0.3871314633555296 attack:0.001 decay:0.2 sustain:0 hcutoff:4721.553103742387 cutoff:4000 ]", "[ (39/8 → 5/1) ⇝ 21/4 | note:C#5 s:sawtooth gain:0.3871314633555296 attack:0.001 decay:0.2 sustain:0 hcutoff:4721.553103742387 cutoff:4000 ]", "[ 37/8 ⇜ (59/12 → 5/1) | note:F#5 s:sawtooth gain:0.39242922708895556 attack:0.001 decay:0.2 sustain:0 hcutoff:4834.036289789029 cutoff:4000 ]", @@ -8046,8 +8046,8 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (5/1 → 16/3) ⇝ 43/8 | note:E5 s:sawtooth gain:0.38398364517932737 attack:0.001 decay:0.2 sustain:0 hcutoff:4664.036300812779 cutoff:4000 ]", "[ 19/4 ⇜ (61/12 → 41/8) | note:A5 s:sawtooth gain:0.38994891982521085 attack:0.001 decay:0.2 sustain:0 hcutoff:4778.23271519263 cutoff:4000 ]", "[ 19/4 ⇜ (61/12 → 41/8) | note:C#5 s:sawtooth gain:0.38994891982521085 attack:0.001 decay:0.2 sustain:0 hcutoff:4778.23271519263 cutoff:4000 ]", - "[ 41/8 → 21/4 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2799.329510692108 ]", - "[ 41/8 → 21/4 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2799.329510692108 ]", + "[ 41/8 → 21/4 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2799.329510692108 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 41/8 → 21/4 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2799.329510692108 lpattack:0.1 lpenv:2 ftype:24db ]", "[ (41/8 → 65/12) ⇝ 11/2 | note:A5 s:sawtooth gain:0.38051304866630675 attack:0.001 decay:0.2 sustain:0 hcutoff:4605.721725547503 cutoff:4000 ]", "[ (41/8 → 65/12) ⇝ 11/2 | note:C#5 s:sawtooth gain:0.38051304866630675 attack:0.001 decay:0.2 sustain:0 hcutoff:4605.721725547503 cutoff:4000 ]", "[ 39/8 ⇜ (31/6 → 21/4) | note:F#5 s:sawtooth gain:0.3871314633555296 attack:0.001 decay:0.2 sustain:0 hcutoff:4721.553103742387 cutoff:4000 ]", @@ -8059,14 +8059,14 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (21/4 → 67/12) ⇝ 45/8 | note:E5 s:sawtooth gain:0.3767280347874561 attack:0.001 decay:0.2 sustain:0 hcutoff:4546.64934384357 cutoff:4000 ]", "[ 5/1 ⇜ (16/3 → 43/8) | note:A5 s:sawtooth gain:0.38398364517932737 attack:0.001 decay:0.2 sustain:0 hcutoff:4664.036300812779 cutoff:4000 ]", "[ 5/1 ⇜ (16/3 → 43/8) | note:C#5 s:sawtooth gain:0.38398364517932737 attack:0.001 decay:0.2 sustain:0 hcutoff:4664.036300812779 cutoff:4000 ]", - "[ 43/8 → 11/2 | note:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2832.694627163799 ]", - "[ 43/8 → 11/2 | note:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2832.694627163799 ]", + "[ 43/8 → 11/2 | note:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2832.694627163799 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 43/8 → 11/2 | note:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2832.694627163799 lpattack:0.1 lpenv:2 ftype:24db ]", "[ (43/8 → 17/3) ⇝ 23/4 | note:A5 s:sawtooth gain:0.3726377219727376 attack:0.001 decay:0.2 sustain:0 hcutoff:4486.859640960669 cutoff:4000 ]", "[ (43/8 → 17/3) ⇝ 23/4 | note:C#5 s:sawtooth gain:0.3726377219727376 attack:0.001 decay:0.2 sustain:0 hcutoff:4486.859640960669 cutoff:4000 ]", "[ 41/8 ⇜ (65/12 → 11/2) | note:F#5 s:sawtooth gain:0.38051304866630675 attack:0.001 decay:0.2 sustain:0 hcutoff:4605.721725547503 cutoff:4000 ]", "[ 41/8 ⇜ (65/12 → 11/2) | note:A4 s:sawtooth gain:0.38051304866630675 attack:0.001 decay:0.2 sustain:0 hcutoff:4605.721725547503 cutoff:4000 ]", - "[ 11/2 → 45/8 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2848.313487543853 ]", - "[ 11/2 → 45/8 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2848.313487543853 ]", + "[ 11/2 → 45/8 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2848.313487543853 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 11/2 → 45/8 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2848.313487543853 lpattack:0.1 lpenv:2 ftype:24db ]", "[ 11/2 → 23/4 | note:F#5 s:sawtooth gain:0.3704811297220968 attack:0.001 decay:0.2 sustain:0 hcutoff:4456.708580912725 cutoff:4000 ]", "[ 11/2 → 23/4 | note:A4 s:sawtooth gain:0.3704811297220968 attack:0.001 decay:0.2 sustain:0 hcutoff:4456.708580912725 cutoff:4000 ]", "[ 11/2 → 23/4 | s:bd gain:0.7 ]", @@ -8083,8 +8083,8 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (45/8 → 6/1) ⇝ 49/8 | note:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2877.376777172205 ]", "[ 43/8 ⇜ (17/3 → 23/4) | note:F#5 s:sawtooth gain:0.3726377219727376 attack:0.001 decay:0.2 sustain:0 hcutoff:4486.859640960669 cutoff:4000 ]", "[ 43/8 ⇜ (17/3 → 23/4) | note:A4 s:sawtooth gain:0.3726377219727376 attack:0.001 decay:0.2 sustain:0 hcutoff:4486.859640960669 cutoff:4000 ]", - "[ 23/4 → 47/8 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2877.376777172205 ]", - "[ 23/4 → 47/8 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2877.376777172205 ]", + "[ 23/4 → 47/8 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2877.376777172205 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 23/4 → 47/8 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2877.376777172205 lpattack:0.1 lpenv:2 ftype:24db ]", "[ 23/4 → 6/1 | note:F#5 s:sawtooth gain:0.36114266880324386 attack:0.001 decay:0.2 sustain:0 hcutoff:4334.517148084427 cutoff:4000 ]", "[ 23/4 → 6/1 | note:A4 s:sawtooth gain:0.36114266880324386 attack:0.001 decay:0.2 sustain:0 hcutoff:4334.517148084427 cutoff:4000 ]", "[ 23/4 → 6/1 | s:hh3 gain:0.7 ]", @@ -8094,8 +8094,8 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (23/4 → 6/1) ⇝ 25/4 | note:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2884.183170199766 ]", "[ 11/2 ⇜ (35/6 → 47/8) | note:A5 s:sawtooth gain:0.368251964143991 attack:0.001 decay:0.2 sustain:0 hcutoff:4426.39359377459 cutoff:4000 ]", "[ 11/2 ⇜ (35/6 → 47/8) | note:C#5 s:sawtooth gain:0.368251964143991 attack:0.001 decay:0.2 sustain:0 hcutoff:4426.39359377459 cutoff:4000 ]", - "[ 47/8 → 6/1 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2890.803699781578 ]", - "[ 47/8 → 6/1 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2890.803699781578 ]", + "[ 47/8 → 6/1 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2890.803699781578 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 47/8 → 6/1 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2890.803699781578 lpattack:0.1 lpenv:2 ftype:24db ]", "[ (47/8 → 6/1) ⇝ 25/4 | note:A5 s:sawtooth gain:0.3586370624427201 attack:0.001 decay:0.2 sustain:0 hcutoff:4303.598663257904 cutoff:4000 ]", "[ (47/8 → 6/1) ⇝ 25/4 | note:C#5 s:sawtooth gain:0.3586370624427201 attack:0.001 decay:0.2 sustain:0 hcutoff:4303.598663257904 cutoff:4000 ]", "[ (47/8 → 6/1) ⇝ 51/8 | note:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2890.803699781578 ]", @@ -8119,8 +8119,8 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ 47/8 ⇜ (6/1 → 51/8) | note:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2915.4076660819765 ]", "[ 23/4 ⇜ (73/12 → 49/8) | note:A5 s:sawtooth gain:0.35343108171056015 attack:0.001 decay:0.2 sustain:0 hcutoff:4241.3539374389275 cutoff:4000 ]", "[ 23/4 ⇜ (73/12 → 49/8) | note:C#5 s:sawtooth gain:0.35343108171056015 attack:0.001 decay:0.2 sustain:0 hcutoff:4241.3539374389275 cutoff:4000 ]", - "[ 49/8 → 25/4 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2915.4076660819765 ]", - "[ 49/8 → 25/4 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2915.4076660819765 ]", + "[ 49/8 → 25/4 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2915.4076660819765 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 49/8 → 25/4 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2915.4076660819765 lpattack:0.1 lpenv:2 ftype:24db ]", "[ (49/8 → 77/12) ⇝ 13/2 | note:A5 s:sawtooth gain:0.3422847385870941 attack:0.001 decay:0.2 sustain:0 hcutoff:4115.383232572483 cutoff:4000 ]", "[ (49/8 → 77/12) ⇝ 13/2 | note:C#5 s:sawtooth gain:0.3422847385870941 attack:0.001 decay:0.2 sustain:0 hcutoff:4115.383232572483 cutoff:4000 ]", "[ 47/8 ⇜ (37/6 → 25/4) | note:F#5 s:sawtooth gain:0.3507338432270528 attack:0.001 decay:0.2 sustain:0 hcutoff:4210.038361759807 cutoff:4000 ]", @@ -8132,14 +8132,14 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (25/4 → 79/12) ⇝ 53/8 | note:E5 s:sawtooth gain:0.3363712287126769 attack:0.001 decay:0.2 sustain:0 hcutoff:4051.743587553753 cutoff:4000 ]", "[ 6/1 ⇜ (19/3 → 51/8) | note:A5 s:sawtooth gain:0.3479759264430665 attack:0.001 decay:0.2 sustain:0 hcutoff:4178.601124662687 cutoff:4000 ]", "[ 6/1 ⇜ (19/3 → 51/8) | note:C#5 s:sawtooth gain:0.3479759264430665 attack:0.001 decay:0.2 sustain:0 hcutoff:4178.601124662687 cutoff:4000 ]", - "[ 51/8 → 13/2 | note:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2936.9631544781614 ]", - "[ 51/8 → 13/2 | note:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2936.9631544781614 ]", + "[ 51/8 → 13/2 | note:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2936.9631544781614 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 51/8 → 13/2 | note:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2936.9631544781614 lpattack:0.1 lpenv:2 ftype:24db ]", "[ (51/8 → 20/3) ⇝ 27/4 | note:A5 s:sawtooth gain:0.3302496429830646 attack:0.001 decay:0.2 sustain:0 hcutoff:3987.7258050403216 cutoff:4000 ]", "[ (51/8 → 20/3) ⇝ 27/4 | note:C#5 s:sawtooth gain:0.3302496429830646 attack:0.001 decay:0.2 sustain:0 hcutoff:3987.7258050403216 cutoff:4000 ]", "[ 49/8 ⇜ (77/12 → 13/2) | note:F#5 s:sawtooth gain:0.3422847385870941 attack:0.001 decay:0.2 sustain:0 hcutoff:4115.383232572483 cutoff:4000 ]", "[ 49/8 ⇜ (77/12 → 13/2) | note:A4 s:sawtooth gain:0.3422847385870941 attack:0.001 decay:0.2 sustain:0 hcutoff:4115.383232572483 cutoff:4000 ]", - "[ 13/2 → 53/8 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2946.5812012110136 ]", - "[ 13/2 → 53/8 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2946.5812012110136 ]", + "[ 13/2 → 53/8 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2946.5812012110136 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 13/2 → 53/8 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2946.5812012110136 lpattack:0.1 lpenv:2 ftype:24db ]", "[ 13/2 → 27/4 | note:F#5 s:sawtooth gain:0.3271154116289833 attack:0.001 decay:0.2 sustain:0 hcutoff:3955.588813730369 cutoff:4000 ]", "[ 13/2 → 27/4 | note:A4 s:sawtooth gain:0.3271154116289833 attack:0.001 decay:0.2 sustain:0 hcutoff:3955.588813730369 cutoff:4000 ]", "[ 13/2 → 27/4 | s:bd gain:0.7 ]", @@ -8152,8 +8152,8 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (53/8 → 83/12) ⇝ 7/1 | note:C#5 s:sawtooth gain:0.3174416994481911 attack:0.001 decay:0.2 sustain:0 hcutoff:3858.7315549779487 cutoff:4000 ]", "[ 51/8 ⇜ (20/3 → 27/4) | note:F#5 s:sawtooth gain:0.3302496429830646 attack:0.001 decay:0.2 sustain:0 hcutoff:3987.7258050403216 cutoff:4000 ]", "[ 51/8 ⇜ (20/3 → 27/4) | note:A4 s:sawtooth gain:0.3302496429830646 attack:0.001 decay:0.2 sustain:0 hcutoff:3987.7258050403216 cutoff:4000 ]", - "[ 27/4 → 55/8 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2963.468935477506 ]", - "[ 27/4 → 55/8 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2963.468935477506 ]", + "[ 27/4 → 55/8 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2963.468935477506 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 27/4 → 55/8 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2963.468935477506 lpattack:0.1 lpenv:2 ftype:24db ]", "[ 27/4 → 7/1 | note:F#5 s:sawtooth gain:0.31413326401454233 attack:0.001 decay:0.2 sustain:0 hcutoff:3826.315480550129 cutoff:4000 ]", "[ 27/4 → 7/1 | note:A4 s:sawtooth gain:0.31413326401454233 attack:0.001 decay:0.2 sustain:0 hcutoff:3826.315480550129 cutoff:4000 ]", "[ 27/4 → 7/1 | s:hh3 gain:0.7 ]", @@ -8161,8 +8161,8 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (27/4 → 7/1) ⇝ 57/8 | note:E5 s:sawtooth gain:0.3107861971007485 attack:0.001 decay:0.2 sustain:0 hcutoff:3793.8434936445938 cutoff:4000 ]", "[ 13/2 ⇜ (41/6 → 55/8) | note:A5 s:sawtooth gain:0.32393472883446767 attack:0.001 decay:0.2 sustain:0 hcutoff:3923.373759622562 cutoff:4000 ]", "[ 13/2 ⇜ (41/6 → 55/8) | note:C#5 s:sawtooth gain:0.32393472883446767 attack:0.001 decay:0.2 sustain:0 hcutoff:3923.373759622562 cutoff:4000 ]", - "[ 55/8 → 7/1 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2970.728450471497 ]", - "[ 55/8 → 7/1 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2970.728450471497 ]", + "[ 55/8 → 7/1 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2970.728450471497 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 55/8 → 7/1 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2970.728450471497 lpattack:0.1 lpenv:2 ftype:24db ]", "[ (55/8 → 7/1) ⇝ 29/4 | note:A5 s:sawtooth gain:0.30398425548024827 attack:0.001 decay:0.2 sustain:0 hcutoff:3728.7540466585065 cutoff:4000 ]", "[ (55/8 → 7/1) ⇝ 29/4 | note:C#5 s:sawtooth gain:0.30398425548024827 attack:0.001 decay:0.2 sustain:0 hcutoff:3728.7540466585065 cutoff:4000 ]", "[ 53/8 ⇜ (83/12 → 7/1) | note:F#5 s:sawtooth gain:0.3174416994481911 attack:0.001 decay:0.2 sustain:0 hcutoff:3858.7315549779487 cutoff:4000 ]", @@ -8178,8 +8178,8 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (7/1 → 22/3) ⇝ 59/8 | note:E5 s:sawtooth gain:0.29705226105983373 attack:0.001 decay:0.2 sustain:0 hcutoff:3663.507823075358 cutoff:4000 ]", "[ 27/4 ⇜ (85/12 → 57/8) | note:A5 s:sawtooth gain:0.3107861971007485 attack:0.001 decay:0.2 sustain:0 hcutoff:3793.8434936445938 cutoff:4000 ]", "[ 27/4 ⇜ (85/12 → 57/8) | note:C#5 s:sawtooth gain:0.3107861971007485 attack:0.001 decay:0.2 sustain:0 hcutoff:3793.8434936445938 cutoff:4000 ]", - "[ 57/8 → 29/4 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2982.856914513109 ]", - "[ 57/8 → 29/4 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2982.856914513109 ]", + "[ 57/8 → 29/4 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2982.856914513109 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 57/8 → 29/4 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2982.856914513109 lpattack:0.1 lpenv:2 ftype:24db ]", "[ (57/8 → 89/12) ⇝ 15/2 | note:A5 s:sawtooth gain:0.29000691362123476 attack:0.001 decay:0.2 sustain:0 hcutoff:3598.149539397671 cutoff:4000 ]", "[ (57/8 → 89/12) ⇝ 15/2 | note:C#5 s:sawtooth gain:0.29000691362123476 attack:0.001 decay:0.2 sustain:0 hcutoff:3598.149539397671 cutoff:4000 ]", "[ 55/8 ⇜ (43/6 → 29/4) | note:F#5 s:sawtooth gain:0.30398425548024827 attack:0.001 decay:0.2 sustain:0 hcutoff:3728.7540466585065 cutoff:4000 ]", @@ -8191,14 +8191,14 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (29/4 → 91/12) ⇝ 61/8 | note:E5 s:sawtooth gain:0.28286518602353056 attack:0.001 decay:0.2 sustain:0 hcutoff:3532.7239889283615 cutoff:4000 ]", "[ 7/1 ⇜ (22/3 → 59/8) | note:A5 s:sawtooth gain:0.29705226105983373 attack:0.001 decay:0.2 sustain:0 hcutoff:3663.507823075358 cutoff:4000 ]", "[ 7/1 ⇜ (22/3 → 59/8) | note:C#5 s:sawtooth gain:0.29705226105983373 attack:0.001 decay:0.2 sustain:0 hcutoff:3663.507823075358 cutoff:4000 ]", - "[ 59/8 → 15/2 | note:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2991.774409503181 ]", - "[ 59/8 → 15/2 | note:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2991.774409503181 ]", + "[ 59/8 → 15/2 | note:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2991.774409503181 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 59/8 → 15/2 | note:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2991.774409503181 lpattack:0.1 lpenv:2 ftype:24db ]", "[ (59/8 → 23/3) ⇝ 31/4 | note:A5 s:sawtooth gain:0.2756442833140452 attack:0.001 decay:0.2 sustain:0 hcutoff:3467.276011071639 cutoff:4000 ]", "[ (59/8 → 23/3) ⇝ 31/4 | note:C#5 s:sawtooth gain:0.2756442833140452 attack:0.001 decay:0.2 sustain:0 hcutoff:3467.276011071639 cutoff:4000 ]", "[ 57/8 ⇜ (89/12 → 15/2) | note:F#5 s:sawtooth gain:0.29000691362123476 attack:0.001 decay:0.2 sustain:0 hcutoff:3598.149539397671 cutoff:4000 ]", "[ 57/8 ⇜ (89/12 → 15/2) | note:A4 s:sawtooth gain:0.29000691362123476 attack:0.001 decay:0.2 sustain:0 hcutoff:3598.149539397671 cutoff:4000 ]", - "[ 15/2 → 61/8 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2995.0220264467503 ]", - "[ 15/2 → 61/8 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2995.0220264467503 ]", + "[ 15/2 → 61/8 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2995.0220264467503 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 15/2 → 61/8 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2995.0220264467503 lpattack:0.1 lpenv:2 ftype:24db ]", "[ 15/2 → 31/4 | note:F#5 s:sawtooth gain:0.2720095711683043 attack:0.001 decay:0.2 sustain:0 hcutoff:3434.557629230318 cutoff:4000 ]", "[ 15/2 → 31/4 | note:A4 s:sawtooth gain:0.2720095711683043 attack:0.001 decay:0.2 sustain:0 hcutoff:3434.557629230318 cutoff:4000 ]", "[ 15/2 → 31/4 | s:bd gain:0.7 ]", @@ -8215,8 +8215,8 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (61/8 → 8/1) ⇝ 65/8 | note:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2999.0852191942718 ]", "[ 59/8 ⇜ (23/3 → 31/4) | note:F#5 s:sawtooth gain:0.2756442833140452 attack:0.001 decay:0.2 sustain:0 hcutoff:3467.276011071639 cutoff:4000 ]", "[ 59/8 ⇜ (23/3 → 31/4) | note:A4 s:sawtooth gain:0.2756442833140452 attack:0.001 decay:0.2 sustain:0 hcutoff:3467.276011071639 cutoff:4000 ]", - "[ 31/4 → 63/8 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2999.0852191942718 ]", - "[ 31/4 → 63/8 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2999.0852191942718 ]", + "[ 31/4 → 63/8 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2999.0852191942718 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 31/4 → 63/8 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2999.0852191942718 lpattack:0.1 lpenv:2 ftype:24db ]", "[ 31/4 → 8/1 | note:F#5 s:sawtooth gain:0.2573601511491127 attack:0.001 decay:0.2 sustain:0 hcutoff:3303.852260680389 cutoff:4000 ]", "[ 31/4 → 8/1 | note:A4 s:sawtooth gain:0.2573601511491127 attack:0.001 decay:0.2 sustain:0 hcutoff:3303.852260680389 cutoff:4000 ]", "[ 31/4 → 8/1 | s:hh3 gain:0.7 ]", @@ -8226,8 +8226,8 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (31/4 → 8/1) ⇝ 33/4 | note:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2999.5934052398757 ]", "[ 15/2 ⇜ (47/6 → 63/8) | note:A5 s:sawtooth gain:0.2683616012798825 attack:0.001 decay:0.2 sustain:0 hcutoff:3401.8504606023293 cutoff:4000 ]", "[ 15/2 ⇜ (47/6 → 63/8) | note:C#5 s:sawtooth gain:0.2683616012798825 attack:0.001 decay:0.2 sustain:0 hcutoff:3401.8504606023293 cutoff:4000 ]", - "[ 63/8 → 8/1 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2999.898347482845 ]", - "[ 63/8 → 8/1 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2999.898347482845 ]", + "[ 63/8 → 8/1 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2999.898347482845 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 63/8 → 8/1 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2999.898347482845 lpattack:0.1 lpenv:2 ftype:24db ]", "[ 63/8 → 8/1 | s:bd gain:0.7 ]", "[ (63/8 → 8/1) ⇝ 33/4 | note:A5 s:sawtooth gain:0.2536811842784369 attack:0.001 decay:0.2 sustain:0 hcutoff:3271.2459533414954 cutoff:4000 ]", "[ (63/8 → 8/1) ⇝ 33/4 | note:C#5 s:sawtooth gain:0.2536811842784369 attack:0.001 decay:0.2 sustain:0 hcutoff:3271.2459533414954 cutoff:4000 ]", @@ -8252,8 +8252,8 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ 63/8 ⇜ (8/1 → 67/8) | note:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2999.0852191942718 ]", "[ 31/4 ⇜ (97/12 → 65/8) | note:A5 s:sawtooth gain:0.24631881572156322 attack:0.001 decay:0.2 sustain:0 hcutoff:3206.156506355406 cutoff:4000 ]", "[ 31/4 ⇜ (97/12 → 65/8) | note:C#5 s:sawtooth gain:0.24631881572156322 attack:0.001 decay:0.2 sustain:0 hcutoff:3206.156506355406 cutoff:4000 ]", - "[ 65/8 → 33/4 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2999.0852191942718 ]", - "[ 65/8 → 33/4 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2999.0852191942718 ]", + "[ 65/8 → 33/4 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2999.0852191942718 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 65/8 → 33/4 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2999.0852191942718 lpattack:0.1 lpenv:2 ftype:24db ]", "[ (65/8 → 101/12) ⇝ 17/2 | note:A5 s:sawtooth gain:0.2316383987201176 attack:0.001 decay:0.2 sustain:0 hcutoff:3076.6262403774385 cutoff:4000 ]", "[ (65/8 → 101/12) ⇝ 17/2 | note:C#5 s:sawtooth gain:0.2316383987201176 attack:0.001 decay:0.2 sustain:0 hcutoff:3076.6262403774385 cutoff:4000 ]", "[ 63/8 ⇜ (49/6 → 33/4) | note:F#5 s:sawtooth gain:0.24263984885088735 attack:0.001 decay:0.2 sustain:0 hcutoff:3173.6845194498705 cutoff:4000 ]", @@ -8265,14 +8265,14 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (33/4 → 103/12) ⇝ 69/8 | note:E5 s:sawtooth gain:0.2243557166859549 attack:0.001 decay:0.2 sustain:0 hcutoff:3012.274194959679 cutoff:4000 ]", "[ 8/1 ⇜ (25/3 → 67/8) | note:A5 s:sawtooth gain:0.2389653154600499 attack:0.001 decay:0.2 sustain:0 hcutoff:3141.2684450220513 cutoff:4000 ]", "[ 8/1 ⇜ (25/3 → 67/8) | note:C#5 s:sawtooth gain:0.2389653154600499 attack:0.001 decay:0.2 sustain:0 hcutoff:3141.2684450220513 cutoff:4000 ]", - "[ 67/8 → 17/2 | note:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2995.0220264467503 ]", - "[ 67/8 → 17/2 | note:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2995.0220264467503 ]", + "[ 67/8 → 17/2 | note:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2995.0220264467503 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 67/8 → 17/2 | note:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2995.0220264467503 lpattack:0.1 lpenv:2 ftype:24db ]", "[ (67/8 → 26/3) ⇝ 35/4 | note:A5 s:sawtooth gain:0.21713481397646955 attack:0.001 decay:0.2 sustain:0 hcutoff:2948.256412446248 cutoff:4000 ]", "[ (67/8 → 26/3) ⇝ 35/4 | note:C#5 s:sawtooth gain:0.21713481397646955 attack:0.001 decay:0.2 sustain:0 hcutoff:2948.256412446248 cutoff:4000 ]", "[ 65/8 ⇜ (101/12 → 17/2) | note:F#5 s:sawtooth gain:0.2316383987201176 attack:0.001 decay:0.2 sustain:0 hcutoff:3076.6262403774385 cutoff:4000 ]", "[ 65/8 ⇜ (101/12 → 17/2) | note:A4 s:sawtooth gain:0.2316383987201176 attack:0.001 decay:0.2 sustain:0 hcutoff:3076.6262403774385 cutoff:4000 ]", - "[ 17/2 → 69/8 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2991.774409503181 ]", - "[ 17/2 → 69/8 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2991.774409503181 ]", + "[ 17/2 → 69/8 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2991.774409503181 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 17/2 → 69/8 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2991.774409503181 lpattack:0.1 lpenv:2 ftype:24db ]", "[ 17/2 → 35/4 | note:F#5 s:sawtooth gain:0.21355297301451046 attack:0.001 decay:0.2 sustain:0 hcutoff:2916.386590360237 cutoff:4000 ]", "[ 17/2 → 35/4 | note:A4 s:sawtooth gain:0.21355297301451046 attack:0.001 decay:0.2 sustain:0 hcutoff:2916.386590360237 cutoff:4000 ]", "[ 17/2 → 35/4 | s:bd gain:0.7 ]", @@ -8285,8 +8285,8 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (69/8 → 107/12) ⇝ 9/1 | note:C#5 s:sawtooth gain:0.20294773894016632 attack:0.001 decay:0.2 sustain:0 hcutoff:2821.398875337315 cutoff:4000 ]", "[ 67/8 ⇜ (26/3 → 35/4) | note:F#5 s:sawtooth gain:0.21713481397646955 attack:0.001 decay:0.2 sustain:0 hcutoff:2948.256412446248 cutoff:4000 ]", "[ 67/8 ⇜ (26/3 → 35/4) | note:A4 s:sawtooth gain:0.21713481397646955 attack:0.001 decay:0.2 sustain:0 hcutoff:2948.256412446248 cutoff:4000 ]", - "[ 35/4 → 71/8 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2982.856914513109 ]", - "[ 35/4 → 71/8 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2982.856914513109 ]", + "[ 35/4 → 71/8 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2982.856914513109 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 35/4 → 71/8 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2982.856914513109 lpattack:0.1 lpenv:2 ftype:24db ]", "[ 35/4 → 9/1 | note:F#5 s:sawtooth gain:0.19946652199116702 attack:0.001 decay:0.2 sustain:0 hcutoff:2789.9616382401937 cutoff:4000 ]", "[ 35/4 → 9/1 | note:A4 s:sawtooth gain:0.19946652199116702 attack:0.001 decay:0.2 sustain:0 hcutoff:2789.9616382401937 cutoff:4000 ]", "[ 35/4 → 9/1 | s:hh3 gain:0.7 ]", @@ -8294,8 +8294,8 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (35/4 → 9/1) ⇝ 73/8 | note:E5 s:sawtooth gain:0.1960157445197518 attack:0.001 decay:0.2 sustain:0 hcutoff:2758.6460625610725 cutoff:4000 ]", "[ 17/2 ⇜ (53/6 → 71/8) | note:A5 s:sawtooth gain:0.2099930863787653 attack:0.001 decay:0.2 sustain:0 hcutoff:2884.6167674275184 cutoff:4000 ]", "[ 17/2 ⇜ (53/6 → 71/8) | note:C#5 s:sawtooth gain:0.2099930863787653 attack:0.001 decay:0.2 sustain:0 hcutoff:2884.6167674275184 cutoff:4000 ]", - "[ 71/8 → 9/1 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2977.1924080321423 ]", - "[ 71/8 → 9/1 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2977.1924080321423 ]", + "[ 71/8 → 9/1 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2977.1924080321423 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 71/8 → 9/1 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2977.1924080321423 lpattack:0.1 lpenv:2 ftype:24db ]", "[ (71/8 → 9/1) ⇝ 37/4 | note:A5 s:sawtooth gain:0.18921380289925155 attack:0.001 decay:0.2 sustain:0 hcutoff:2696.4013367420957 cutoff:4000 ]", "[ (71/8 → 9/1) ⇝ 37/4 | note:C#5 s:sawtooth gain:0.18921380289925155 attack:0.001 decay:0.2 sustain:0 hcutoff:2696.4013367420957 cutoff:4000 ]", "[ 69/8 ⇜ (107/12 → 9/1) | note:F#5 s:sawtooth gain:0.20294773894016632 attack:0.001 decay:0.2 sustain:0 hcutoff:2821.398875337315 cutoff:4000 ]", @@ -8311,8 +8311,8 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (9/1 → 28/3) ⇝ 75/8 | note:E5 s:sawtooth gain:0.182558300551809 attack:0.001 decay:0.2 sustain:0 hcutoff:2634.707357306267 cutoff:4000 ]", "[ 35/4 ⇜ (109/12 → 73/8) | note:A5 s:sawtooth gain:0.1960157445197518 attack:0.001 decay:0.2 sustain:0 hcutoff:2758.6460625610725 cutoff:4000 ]", "[ 35/4 ⇜ (109/12 → 73/8) | note:C#5 s:sawtooth gain:0.1960157445197518 attack:0.001 decay:0.2 sustain:0 hcutoff:2758.6460625610725 cutoff:4000 ]", - "[ 73/8 → 37/4 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2963.4689354775064 ]", - "[ 73/8 → 37/4 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2963.4689354775064 ]", + "[ 73/8 → 37/4 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2963.4689354775064 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 73/8 → 37/4 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2963.4689354775064 lpattack:0.1 lpenv:2 ftype:24db ]", "[ (73/8 → 113/12) ⇝ 19/2 | note:A5 s:sawtooth gain:0.17606527116553244 attack:0.001 decay:0.2 sustain:0 hcutoff:2573.60640622541 cutoff:4000 ]", "[ (73/8 → 113/12) ⇝ 19/2 | note:C#5 s:sawtooth gain:0.17606527116553244 attack:0.001 decay:0.2 sustain:0 hcutoff:2573.60640622541 cutoff:4000 ]", "[ 71/8 ⇜ (55/6 → 37/4) | note:F#5 s:sawtooth gain:0.18921380289925155 attack:0.001 decay:0.2 sustain:0 hcutoff:2696.4013367420957 cutoff:4000 ]", @@ -8324,14 +8324,14 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (37/4 → 115/12) ⇝ 77/8 | note:E5 s:sawtooth gain:0.16975035701693547 attack:0.001 decay:0.2 sustain:0 hcutoff:2513.140359039332 cutoff:4000 ]", "[ 9/1 ⇜ (28/3 → 75/8) | note:A5 s:sawtooth gain:0.182558300551809 attack:0.001 decay:0.2 sustain:0 hcutoff:2634.707357306267 cutoff:4000 ]", "[ 9/1 ⇜ (28/3 → 75/8) | note:C#5 s:sawtooth gain:0.182558300551809 attack:0.001 decay:0.2 sustain:0 hcutoff:2634.707357306267 cutoff:4000 ]", - "[ 75/8 → 19/2 | note:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2946.5812012110136 ]", - "[ 75/8 → 19/2 | note:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2946.5812012110136 ]", + "[ 75/8 → 19/2 | note:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2946.5812012110136 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 75/8 → 19/2 | note:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2946.5812012110136 lpattack:0.1 lpenv:2 ftype:24db ]", "[ (75/8 → 29/3) ⇝ 39/4 | note:A5 s:sawtooth gain:0.16362877128732323 attack:0.001 decay:0.2 sustain:0 hcutoff:2453.350656156431 cutoff:4000 ]", "[ (75/8 → 29/3) ⇝ 39/4 | note:C#5 s:sawtooth gain:0.16362877128732323 attack:0.001 decay:0.2 sustain:0 hcutoff:2453.350656156431 cutoff:4000 ]", "[ 73/8 ⇜ (113/12 → 19/2) | note:F#5 s:sawtooth gain:0.17606527116553244 attack:0.001 decay:0.2 sustain:0 hcutoff:2573.60640622541 cutoff:4000 ]", "[ 73/8 ⇜ (113/12 → 19/2) | note:A4 s:sawtooth gain:0.17606527116553244 attack:0.001 decay:0.2 sustain:0 hcutoff:2573.60640622541 cutoff:4000 ]", - "[ 19/2 → 77/8 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2936.9631544781614 ]", - "[ 19/2 → 77/8 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2936.9631544781614 ]", + "[ 19/2 → 77/8 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2936.9631544781614 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 19/2 → 77/8 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2936.9631544781614 lpattack:0.1 lpenv:2 ftype:24db ]", "[ 19/2 → 39/4 | note:F#5 s:sawtooth gain:0.16064510432613502 attack:0.001 decay:0.2 sustain:0 hcutoff:2423.7222579792624 cutoff:4000 ]", "[ 19/2 → 39/4 | note:A4 s:sawtooth gain:0.16064510432613502 attack:0.001 decay:0.2 sustain:0 hcutoff:2423.7222579792624 cutoff:4000 ]", "[ 19/2 → 39/4 | s:bd gain:0.7 ]", @@ -8348,8 +8348,8 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (77/8 → 10/1) ⇝ 81/8 | note:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2915.4076660819765 ]", "[ 75/8 ⇜ (29/3 → 39/4) | note:F#5 s:sawtooth gain:0.16362877128732323 attack:0.001 decay:0.2 sustain:0 hcutoff:2453.350656156431 cutoff:4000 ]", "[ 75/8 ⇜ (29/3 → 39/4) | note:A4 s:sawtooth gain:0.16362877128732323 attack:0.001 decay:0.2 sustain:0 hcutoff:2453.350656156431 cutoff:4000 ]", - "[ 39/4 → 79/8 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2915.4076660819765 ]", - "[ 39/4 → 79/8 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2915.4076660819765 ]", + "[ 39/4 → 79/8 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2915.4076660819765 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 39/4 → 79/8 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2915.4076660819765 lpattack:0.1 lpenv:2 ftype:24db ]", "[ 39/4 → 10/1 | note:F#5 s:sawtooth gain:0.14926615677294724 attack:0.001 decay:0.2 sustain:0 hcutoff:2307.1030993509794 cutoff:4000 ]", "[ 39/4 → 10/1 | note:A4 s:sawtooth gain:0.14926615677294724 attack:0.001 decay:0.2 sustain:0 hcutoff:2307.1030993509794 cutoff:4000 ]", "[ 39/4 → 10/1 | s:hh3 gain:0.7 ]", @@ -8359,8 +8359,8 @@ exports[`renders tunes > tune: hyperpop 1`] = ` "[ (39/4 → 10/1) ⇝ 41/4 | note:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2909.5402784268977 ]", "[ 19/2 ⇜ (59/6 → 79/8) | note:A5 s:sawtooth gain:0.157715261412906 attack:0.001 decay:0.2 sustain:0 hcutoff:2394.2782744524975 cutoff:4000 ]", "[ 19/2 ⇜ (59/6 → 79/8) | note:C#5 s:sawtooth gain:0.157715261412906 attack:0.001 decay:0.2 sustain:0 hcutoff:2394.2782744524975 cutoff:4000 ]", - "[ 79/8 → 10/1 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2903.483208638841 ]", - "[ 79/8 → 10/1 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2903.483208638841 ]", + "[ 79/8 → 10/1 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2903.483208638841 lpattack:0.1 lpenv:2 ftype:24db ]", + "[ 79/8 → 10/1 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2903.483208638841 lpattack:0.1 lpenv:2 ftype:24db ]", "[ (79/8 → 10/1) ⇝ 41/4 | note:A5 s:sawtooth gain:0.14656891828944 attack:0.001 decay:0.2 sustain:0 hcutoff:2278.446896257612 cutoff:4000 ]", "[ (79/8 → 10/1) ⇝ 41/4 | note:C#5 s:sawtooth gain:0.14656891828944 attack:0.001 decay:0.2 sustain:0 hcutoff:2278.446896257612 cutoff:4000 ]", "[ (79/8 → 10/1) ⇝ 83/8 | note:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2903.483208638841 ]", From e3b7d0f84df946d868cf0cfa8694aa2341f50beb Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sat, 16 Sep 2023 02:01:46 +0200 Subject: [PATCH 39/39] drop some acid in there --- website/src/pages/learn/effects.mdx | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/website/src/pages/learn/effects.mdx b/website/src/pages/learn/effects.mdx index 4982f4cd..f77ab4c4 100644 --- a/website/src/pages/learn/effects.mdx +++ b/website/src/pages/learn/effects.mdx @@ -86,6 +86,25 @@ Strudel uses ADSR envelopes, which are probably the most common way to describe Each filter can receive an additional filter envelope controlling the cutoff value dynamically. It uses an ADSR envelope similar to the one used for amplitude. There is an additional parameter to control the depth of the filter modulation: `lpenv`|`hpenv`|`bpenv`. This allows you to play subtle or huge filter modulations just the same by only increasing or decreasing the depth. +](3,8,<0 1>)".sub(12)) + .s("/64") + .lpf(sine.range(500,3000).slow(16)) + .lpa(0.005) + .lpd(perlin.range(.02,.2)) + .lps(perlin.range(0,.5).slow(3)) + .lpq(sine.range(2,10).slow(32)) + .release(.5) + .lpenv(perlin.range(1,8).slow(2)) + .ftype('24db') + .room(1) + .juxBy(.5,rev) + .sometimes(add(note(12))) + .stack(s("bd*2").bank('RolandTR909')) + .gain(.5)`} +/> + There is one filter envelope for each filter type and thus one set of envelope filter parameters preceded either by `lp`, `hp` or `bp`: - `lpattack`, `lpdecay`, `lpsustain`, `lprelease`, `lpenv`: filter envelope for the lowpass filter.