From 058d950121d8ae89656cf21dfd9568a0275585f9 Mon Sep 17 00:00:00 2001 From: Aria Date: Fri, 15 Aug 2025 22:57:59 -0500 Subject: [PATCH 01/49] Working version of updated randomness --- packages/core/signal.mjs | 62 +++++++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 26 deletions(-) diff --git a/packages/core/signal.mjs b/packages/core/signal.mjs index 6bd6fde67..2d3385ef0 100644 --- a/packages/core/signal.mjs +++ b/packages/core/signal.mjs @@ -188,36 +188,46 @@ export const mouseX = signal(() => _mouseX); // random signals -const xorwise = (x) => { - const a = (x << 13) ^ x; - const b = (a >> 17) ^ a; - return (b << 5) ^ b; -}; +// Produce "Avalanche effect" where flipping a single bit of x +// results in all output bits flipping with probability 0.5 +// See e.g. https://github.com/aappleby/smhasher/blob/0ff96f7835817a27d0487325b6c16033e2992eb5/src/MurmurHash3.cpp#L68-L77 +function _murmurHashFinalizer(x) { + x |= 0; + x ^= x >>> 16; + x = Math.imul(x, 0x85ebca6b); + x ^= x >>> 13; + x = Math.imul(x, 0xc2b2ae35); + x ^= x >>> 16; + return x >>> 0; // unsigned +} -// stretch 300 cycles over the range of [0,2**29 == 536870912) then apply the xorshift algorithm -const _frac = (x) => x - Math.trunc(x); +// Used to decorrelate nearby t and i prior to hashing +function _decorrelate(t, i = 0) { + // const T = Math.floor(t * 4096); // set 2^12 resolution + const T = Math.floor(t * 536870912); // set 2^29 resolution + const lowBits = (T >>> 0) >>> 0; + const highBits = Math.floor(T / 4294967296) >>> 0; // 2^32 + let key = lowBits ^ Math.imul(highBits ^ 0x85ebca6b, 0xc2b2ae35); + key ^= Math.imul(i ^ 0x7f4a7c15, 0x9e3779b9); + return key >>> 0; + // return (T ^ Math.imul(i ^ 0x7f4a7c15, 0x9e3779b9)) >>> 0; +} -const timeToIntSeed = (x) => xorwise(Math.trunc(_frac(x / 300) * 536870912)); +function randAt(t, i = 0) { + return _murmurHashFinalizer(_decorrelate(t, i)) / 4294967296; // 2^32 +} -const intSeedToRand = (x) => (x % 536870912) / 536870912; +// N samples at time t +function timeToRands(t, n) { + const out = new Array(n); + for (let i = 0; i < n; i++) out[i] = randAt(t, i); + return out; +} -const timeToRand = (x) => Math.abs(intSeedToRand(timeToIntSeed(x))); - -const timeToRandsPrime = (seed, n) => { - const result = []; - // eslint-disable-next-line - for (let i = 0; i < n; ++i) { - result.push(intSeedToRand(seed)); - seed = xorwise(seed); - } - return result; -}; - -const timeToRands = (t, n) => timeToRandsPrime(timeToIntSeed(t), n); - -/** - * - */ +// Single sample at time t +function timeToRand(t) { + return randAt(t, 0); +} /** * A discrete pattern of numbers from 0 to n-1 From 03271ec5fb10e37e09c11751bfeafe3b28401f20 Mon Sep 17 00:00:00 2001 From: Aria Date: Tue, 19 Aug 2025 18:15:24 -0500 Subject: [PATCH 02/49] Remove stray comments --- packages/core/signal.mjs | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/core/signal.mjs b/packages/core/signal.mjs index 2d3385ef0..1c3ae464b 100644 --- a/packages/core/signal.mjs +++ b/packages/core/signal.mjs @@ -203,14 +203,12 @@ function _murmurHashFinalizer(x) { // Used to decorrelate nearby t and i prior to hashing function _decorrelate(t, i = 0) { - // const T = Math.floor(t * 4096); // set 2^12 resolution const T = Math.floor(t * 536870912); // set 2^29 resolution const lowBits = (T >>> 0) >>> 0; const highBits = Math.floor(T / 4294967296) >>> 0; // 2^32 let key = lowBits ^ Math.imul(highBits ^ 0x85ebca6b, 0xc2b2ae35); key ^= Math.imul(i ^ 0x7f4a7c15, 0x9e3779b9); return key >>> 0; - // return (T ^ Math.imul(i ^ 0x7f4a7c15, 0x9e3779b9)) >>> 0; } function randAt(t, i = 0) { From 5d5159a08f62c171ab4477ff4aeca87caa5f6ba9 Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 24 Aug 2025 11:56:11 -0500 Subject: [PATCH 03/49] Add option to use old random and a benchmark --- packages/core/bench/signal.bench.mjs | 46 ++++++++++++++++++++++++++++ packages/core/signal.mjs | 35 ++++++++++++++++++++- website/src/repl/tunes.mjs | 19 ++++++++++++ 3 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 packages/core/bench/signal.bench.mjs diff --git a/packages/core/bench/signal.bench.mjs b/packages/core/bench/signal.bench.mjs new file mode 100644 index 000000000..c79cedc05 --- /dev/null +++ b/packages/core/bench/signal.bench.mjs @@ -0,0 +1,46 @@ +import { describe, bench } from 'vitest'; + +import { calculateSteps, rand, useOldRandom } from '../index.mjs'; + +const testingResolution = 1024; + +const _generateRandomPattern = () => rand.iter(testingResolution).fast(testingResolution).firstCycle(); + +describe('random', () => { + calculateSteps(true); + bench( + '+tactus', + _generateRandomPattern, + { time: 1000 }, + ); + + calculateSteps(false); + bench( + '-tactus', + _generateRandomPattern, + { time: 1000 }, + ); +}); + +describe('old random', () => { + calculateSteps(true); + bench( + '+tactus', + () => { + useOldRandom(); + _generateRandomPattern(); + }, + { time: 1000 }, + ); + + calculateSteps(false); + bench( + '-tactus', + () => { + useOldRandom(); + _generateRandomPattern(); + }, + { time: 1000 }, + ); +}); +calculateSteps(true); diff --git a/packages/core/signal.mjs b/packages/core/signal.mjs index 1c3ae464b..91901f86c 100644 --- a/packages/core/signal.mjs +++ b/packages/core/signal.mjs @@ -186,7 +186,7 @@ export const mouseY = signal(() => _mouseY); export const mousex = signal(() => _mouseX); export const mouseX = signal(() => _mouseX); -// random signals +// Random number generators // Produce "Avalanche effect" where flipping a single bit of x // results in all output bits flipping with probability 0.5 @@ -215,8 +215,38 @@ function randAt(t, i = 0) { return _murmurHashFinalizer(_decorrelate(t, i)) / 4294967296; // 2^32 } +// Deprecated: Old random signals. Configuration `useOldRandom` may be used for legacy songs + +// stretch 300 cycles over the range of [0,2**29 == 536870912) then apply the xorshift algorithm +const __xorwise = (x) => { + const a = (x << 13) ^ x; + const b = (a >> 17) ^ a; + return (b << 5) ^ b; +}; +const __frac = (x) => x - Math.trunc(x); +const __timeToIntSeed = (x) => __xorwise(Math.trunc(__frac(x / 300) * 536870912)); +const __intSeedToRand = (x) => (x % 536870912) / 536870912; +const __timeToRand = (x) => Math.abs(__intSeedToRand(__timeToIntSeed(x))); +const __timeToRandsPrime = (seed, n) => { + const result = []; + for (let i = 0; i < n; i++) { + result.push(__intSeedToRand(seed)); + seed = __xorwise(seed); + } + return result; +}; +const __timeToRands = (t, n) => __timeToRandsPrime(__timeToIntSeed(t), n); + +// End old random + +let useOldRandomBool = false; +export const useOldRandom = (b = true) => useOldRandomBool = b; + // N samples at time t function timeToRands(t, n) { + if (useOldRandomBool) { + return __timeToRands(t, n); + } const out = new Array(n); for (let i = 0; i < n; i++) out[i] = randAt(t, i); return out; @@ -224,6 +254,9 @@ function timeToRands(t, n) { // Single sample at time t function timeToRand(t) { + if (useOldRandomBool) { + return __timeToRand(t); + } return randAt(t, 0); } diff --git a/website/src/repl/tunes.mjs b/website/src/repl/tunes.mjs index f1c72b12d..23efb6062 100644 --- a/website/src/repl/tunes.mjs +++ b/website/src/repl/tunes.mjs @@ -393,6 +393,8 @@ samples({ bass: { d2: 'https://cdn.freesound.org/previews/608/608286_13074022-lq.mp3' } }) +useOldRandom(true) + stack( // bells n("0").euclidLegato(3,8) @@ -430,6 +432,7 @@ export const festivalOfFingers3 = `// "Festival of fingers 3" // @by Felix Roos setcps(1) +useOldRandom(true) n("[-7*3],0,2,6,[8 7]") .echoWith( @@ -454,6 +457,8 @@ export const meltingsubmarine = `// "Melting submarine" // @by Felix Roos samples('github:tidalcycles/dirt-samples') +useOldRandom(true) + stack( s("bd:5,[~ ],hh27(3,4,1)") // drums .speed(perlin.range(.7,.9)) // random sample speed variation @@ -602,6 +607,9 @@ export const belldub = `// "Belldub" samples({ bell: {b4:'https://cdn.freesound.org/previews/339/339809_5121236-lq.mp3'}}) // "Hand Bells, B, Single.wav" by InspectorJ (www.jshaw.co.uk) of Freesound.org + +useOldRandom(true) + stack( // bass note("[0 ~] [2 [0 2]] [4 4*2] [[4 ~] [2 ~] 0@2]".scale('g1 dorian').superimpose(x=>x.add(.02))) @@ -638,6 +646,7 @@ export const dinofunk = `// "Dinofunk" // @by Felix Roos setcps(1) +useOldRandom(true) samples({bass:'https://cdn.freesound.org/previews/614/614637_2434927-hq.mp3', dino:{b4:'https://cdn.freesound.org/previews/316/316403_5123851-hq.mp3'}}) @@ -666,6 +675,8 @@ export const sampleDemo = `// "Sample demo" // @license CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ // @by Felix Roos +useOldRandom(true) + stack( // percussion s("[woodblock:1 woodblock:2*2] snare_rim:0,gong/8,brakedrum:1(3,8),~@3 cowbell:3") @@ -684,6 +695,8 @@ export const holyflute = `// "Holy flute" // @license CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ // @by Felix Roos +useOldRandom(true) + "c3 eb3(3,8) c4/2 g3*2" .superimpose( x=>x.slow(2).add(12), @@ -699,6 +712,8 @@ export const flatrave = `// "Flatrave" // @license CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ // @by Felix Roos +useOldRandom(true) + stack( s("bd*2,~ [cp,sd]").bank('RolandTR909'), @@ -727,6 +742,8 @@ export const amensister = `// "Amensister" samples('github:tidalcycles/dirt-samples') +useOldRandom(true) + stack( // amen n("0 1 2 3 4 5 6 7") @@ -834,6 +851,8 @@ export const arpoon = `// "Arpoon" // @license CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ // @by Felix Roos +useOldRandom(true) + samples('github:tidalcycles/dirt-samples') n("[0,3] 2 [1,3] 2".fast(3).lastOf(4, fast(2))).clip(2) From b8423f0ed1a96891a2380d2436f6d929ea37c504 Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 24 Aug 2025 12:01:12 -0500 Subject: [PATCH 04/49] Add docstring --- packages/core/signal.mjs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/core/signal.mjs b/packages/core/signal.mjs index 91901f86c..78755bd98 100644 --- a/packages/core/signal.mjs +++ b/packages/core/signal.mjs @@ -240,6 +240,17 @@ const __timeToRands = (t, n) => __timeToRandsPrime(__timeToIntSeed(t), n); // End old random let useOldRandomBool = false; +/** + * Whether to use the old random number generator or not. Can be used to support legacy projects + * + * @name useOldRandom + * @param {boolean} b - Whether to use old RNG + * @example + * useOldRandom(true) + * // Repeats every 300 cycles + * $: n(irand(50)).seg(16).scale("C:minor").ribbon(88, 32)._punchcard() + * $: n(irand(50)).seg(16).scale("C:minor").ribbon(388, 32)._punchcard() + */ export const useOldRandom = (b = true) => useOldRandomBool = b; // N samples at time t From 5e4e678800315da210d75645a8e37c3d62b43d3e Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 24 Aug 2025 21:14:57 -0500 Subject: [PATCH 05/49] Test bleed, some docstrings --- packages/core/bench/signal.bench.mjs | 49 ++++++++++---------- packages/core/signal.mjs | 67 +++++++++++++++------------- packages/superdough/superdough.mjs | 22 +++++++++ vitest.config.mjs | 3 +- vitest.setup.mjs | 7 +++ 5 files changed, 92 insertions(+), 56 deletions(-) create mode 100644 vitest.setup.mjs diff --git a/packages/core/bench/signal.bench.mjs b/packages/core/bench/signal.bench.mjs index c79cedc05..d92840ef6 100644 --- a/packages/core/bench/signal.bench.mjs +++ b/packages/core/bench/signal.bench.mjs @@ -2,45 +2,48 @@ import { describe, bench } from 'vitest'; import { calculateSteps, rand, useOldRandom } from '../index.mjs'; -const testingResolution = 1024; +const testingResolution = 128; const _generateRandomPattern = () => rand.iter(testingResolution).fast(testingResolution).firstCycle(); -describe('random', () => { - calculateSteps(true); - bench( - '+tactus', - _generateRandomPattern, - { time: 1000 }, - ); - - calculateSteps(false); - bench( - '-tactus', - _generateRandomPattern, - { time: 1000 }, - ); -}); - describe('old random', () => { calculateSteps(true); bench( '+tactus', () => { - useOldRandom(); - _generateRandomPattern(); + useOldRandom(); + _generateRandomPattern(); + }, + { + time: 1000, + teardown() { + useOldRandom(false); + }, }, - { time: 1000 }, ); calculateSteps(false); bench( '-tactus', () => { - useOldRandom(); - _generateRandomPattern(); + useOldRandom(); + _generateRandomPattern(); + }, + { + time: 1000, + teardown() { + useOldRandom(false); + }, }, - { time: 1000 }, ); }); + +describe('random', () => { + calculateSteps(true); + bench('+tactus', _generateRandomPattern, { time: 1000 }); + + calculateSteps(false); + bench('-tactus', _generateRandomPattern, { time: 1000 }); +}); + calculateSteps(true); diff --git a/packages/core/signal.mjs b/packages/core/signal.mjs index 78755bd98..492f6a7f0 100644 --- a/packages/core/signal.mjs +++ b/packages/core/signal.mjs @@ -201,9 +201,13 @@ function _murmurHashFinalizer(x) { return x >>> 0; // unsigned } -// Used to decorrelate nearby t and i prior to hashing -function _decorrelate(t, i = 0) { - const T = Math.floor(t * 536870912); // set 2^29 resolution +// Convert t to a 32 bit integer, preserving temporal resolution down to 1/2^29 +function _tToT(t) { + return Math.floor(t * 536870912); +} + +// Used to decorrelate nearby T and i prior to hashing +function _decorrelate(T, i = 0) { const lowBits = (T >>> 0) >>> 0; const highBits = Math.floor(T / 4294967296) >>> 0; // 2^32 let key = lowBits ^ Math.imul(highBits ^ 0x85ebca6b, 0xc2b2ae35); @@ -211,8 +215,19 @@ function _decorrelate(t, i = 0) { return key >>> 0; } -function randAt(t, i = 0) { - return _murmurHashFinalizer(_decorrelate(t, i)) / 4294967296; // 2^32 +function randAt(T, i = 0) { + return _murmurHashFinalizer(_decorrelate(T, i)) / 4294967296; // 2^32 +} + +// n samples at time t +function timeToRands(t, n) { + const T = _tToT(t); + if (n === 1) { + return randAt(T, 0); + } + const out = new Array(n); + for (let i = 0; i < n; i++) out[i] = randAt(T, i); + return out; } // Deprecated: Old random signals. Configuration `useOldRandom` may be used for legacy songs @@ -226,8 +241,10 @@ const __xorwise = (x) => { const __frac = (x) => x - Math.trunc(x); const __timeToIntSeed = (x) => __xorwise(Math.trunc(__frac(x / 300) * 536870912)); const __intSeedToRand = (x) => (x % 536870912) / 536870912; -const __timeToRand = (x) => Math.abs(__intSeedToRand(__timeToIntSeed(x))); const __timeToRandsPrime = (seed, n) => { + if (n === 1) { + return Math.abs(__intSeedToRand(seed)); + } const result = []; for (let i = 0; i < n; i++) { result.push(__intSeedToRand(seed)); @@ -240,6 +257,10 @@ const __timeToRands = (t, n) => __timeToRandsPrime(__timeToIntSeed(t), n); // End old random let useOldRandomBool = false; +const getRandsAtTime = (t, n = 1) => { + return useOldRandomBool ? __timeToRands(t, n) : timeToRands(t, n); +}; + /** * Whether to use the old random number generator or not. Can be used to support legacy projects * @@ -248,28 +269,10 @@ let useOldRandomBool = false; * @example * useOldRandom(true) * // Repeats every 300 cycles - * $: n(irand(50)).seg(16).scale("C:minor").ribbon(88, 32)._punchcard() - * $: n(irand(50)).seg(16).scale("C:minor").ribbon(388, 32)._punchcard() + * $: n(irand(50)).seg(16).scale("C:minor").ribbon(88, 32) + * $: n(irand(50)).seg(16).scale("C:minor").ribbon(388, 32) */ -export const useOldRandom = (b = true) => useOldRandomBool = b; - -// N samples at time t -function timeToRands(t, n) { - if (useOldRandomBool) { - return __timeToRands(t, n); - } - const out = new Array(n); - for (let i = 0; i < n; i++) out[i] = randAt(t, i); - return out; -} - -// Single sample at time t -function timeToRand(t) { - if (useOldRandomBool) { - return __timeToRand(t); - } - return randAt(t, 0); -} +export const useOldRandom = (b = true) => (useOldRandomBool = b); /** * A discrete pattern of numbers from 0 to n-1 @@ -313,7 +316,7 @@ export const binaryN = (n, nBits = 16) => { export const randrun = (n) => { return signal((t) => { // Without adding 0.5, the first cycle is always 0,1,2,3,... - const rands = timeToRands(t.floor().add(0.5), n); + const rands = getRandsAtTime(t.floor().add(0.5), n); const nums = rands .map((n, i) => [n, i]) .sort((a, b) => (a[0] > b[0]) - (a[0] < b[0])) @@ -363,7 +366,7 @@ export const scramble = register('scramble', (n, pat) => { * s("bd*4,hh*8").cutoff(rand.range(500,8000)) * */ -export const rand = signal(timeToRand); +export const rand = signal(getRandsAtTime); /** * A continuous pattern of random numbers, between -1 and 1 */ @@ -545,7 +548,7 @@ function _perlin(t) { let tb = ta + 1; const smootherStep = (x) => 6.0 * x ** 5 - 15.0 * x ** 4 + 10.0 * x ** 3; const interp = (x) => (a) => (b) => a + smootherStep(x) * (b - a); - const v = interp(t - ta)(timeToRand(ta))(timeToRand(tb)); + const v = interp(t - ta)(getRandsAtTime(ta))(getRandsAtTime(tb)); return v; } export const perlinWith = (tpat) => { @@ -556,8 +559,8 @@ function _berlin(t) { const prevRidgeStartIndex = Math.floor(t); const nextRidgeStartIndex = prevRidgeStartIndex + 1; - const prevRidgeBottomPoint = timeToRand(prevRidgeStartIndex); - const nextRidgeTopPoint = timeToRand(nextRidgeStartIndex) + prevRidgeBottomPoint; + const prevRidgeBottomPoint = getRandsAtTime(prevRidgeStartIndex); + const nextRidgeTopPoint = getRandsAtTime(nextRidgeStartIndex) + prevRidgeBottomPoint; const currentPercent = (t - prevRidgeStartIndex) / (nextRidgeStartIndex - prevRidgeStartIndex); const interp = (a, b, t) => { diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index eb1466d91..9b6b20746 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -19,6 +19,17 @@ const DEFAULT_AUDIO_DEVICE_NAME = 'System Standard'; let maxPolyphony = DEFAULT_MAX_POLYPHONY; +/** + * Set the max polyphony. If notes are ringing out via `release` then they will + * start to die out in first-in-first-out order once the max polyphony has been hit + * + * @name setMaxPolyphony + * @param {number} Max polyphony. Defaults to 128 + * @example + * setMaxPolyphony(4) + * n(irand(24).seg(8)).scale("C#3:minor").room(1).release(4).gain(0.5) + * + */ export function setMaxPolyphony(polyphony) { maxPolyphony = parseInt(polyphony) ?? DEFAULT_MAX_POLYPHONY; } @@ -48,6 +59,17 @@ export function applyGainCurve(val) { return gainCurveFunc(val); } +/** + * Apply a function to all gains provided in patterns. Can be used to rescale gain to be + * quadratic, exponential, etc. rather than linear + * + * @name setGainCurve + * @param {Function} function to apply to all gain values + * @example + * setGainCurve((x) => x * x) // quadratic gain + * s("bd*4").gain(0.5) // equivalent to 0.25 gain normally + * + */ export function setGainCurve(newGainCurveFunc) { gainCurveFunc = newGainCurveFunc; } diff --git a/vitest.config.mjs b/vitest.config.mjs index dcdde1133..392b17310 100644 --- a/vitest.config.mjs +++ b/vitest.config.mjs @@ -7,7 +7,7 @@ export default defineConfig({ test: { reporters: 'verbose', isolate: false, - silent: true, + silent: false, exclude: [ '**/node_modules/**', '**/dist/**', @@ -16,5 +16,6 @@ export default defineConfig({ '**/{karma,rollup,webpack,vite,vitest,jest,ava,babel,nyc,cypress}.config.*', '**/shared.test.mjs', ], + setupFiles: './vitest.setup.mjs', }, }); diff --git a/vitest.setup.mjs b/vitest.setup.mjs new file mode 100644 index 000000000..bb9d24b07 --- /dev/null +++ b/vitest.setup.mjs @@ -0,0 +1,7 @@ +import { afterEach } from 'vitest'; +import { useOldRandom } from './packages/core/signal.mjs'; + +afterEach(() => { + // Avoid bleed between tests + useOldRandom(false); +}); From 969c9663ef4f3e661c1df8a01541c4ad258e4756 Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 24 Aug 2025 21:15:11 -0500 Subject: [PATCH 06/49] Update tests for new randomness --- test/__snapshots__/examples.test.mjs.snap | 1421 +++++++++++---------- 1 file changed, 771 insertions(+), 650 deletions(-) diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 398749359..77154de90 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -686,20 +686,20 @@ exports[`runs examples > example "almostAlways" example index 0 1`] = ` "[ 13/8 → 7/4 | s:hh speed:0.5 ]", "[ 7/4 → 15/8 | s:hh speed:0.5 ]", "[ 15/8 → 2/1 | s:hh speed:0.5 ]", - "[ 2/1 → 17/8 | s:hh ]", - "[ 17/8 → 9/4 | s:hh ]", + "[ 2/1 → 17/8 | s:hh speed:0.5 ]", + "[ 17/8 → 9/4 | s:hh speed:0.5 ]", "[ 9/4 → 19/8 | s:hh speed:0.5 ]", "[ 19/8 → 5/2 | s:hh speed:0.5 ]", "[ 5/2 → 21/8 | s:hh speed:0.5 ]", "[ 21/8 → 11/4 | s:hh speed:0.5 ]", "[ 11/4 → 23/8 | s:hh speed:0.5 ]", - "[ 23/8 → 3/1 | s:hh speed:0.5 ]", + "[ 23/8 → 3/1 | s:hh ]", "[ 3/1 → 25/8 | s:hh speed:0.5 ]", "[ 25/8 → 13/4 | s:hh speed:0.5 ]", - "[ 13/4 → 27/8 | s:hh ]", + "[ 13/4 → 27/8 | s:hh speed:0.5 ]", "[ 27/8 → 7/2 | s:hh speed:0.5 ]", "[ 7/2 → 29/8 | s:hh speed:0.5 ]", - "[ 29/8 → 15/4 | s:hh ]", + "[ 29/8 → 15/4 | s:hh speed:0.5 ]", "[ 15/4 → 31/8 | s:hh speed:0.5 ]", "[ 31/8 → 4/1 | s:hh speed:0.5 ]", ] @@ -707,7 +707,7 @@ exports[`runs examples > example "almostAlways" example index 0 1`] = ` exports[`runs examples > example "almostNever" example index 0 1`] = ` [ - "[ 0/1 → 1/8 | s:hh speed:0.5 ]", + "[ 0/1 → 1/8 | s:hh ]", "[ 1/8 → 1/4 | s:hh ]", "[ 1/4 → 3/8 | s:hh ]", "[ 3/8 → 1/2 | s:hh ]", @@ -715,7 +715,7 @@ exports[`runs examples > example "almostNever" example index 0 1`] = ` "[ 5/8 → 3/4 | s:hh ]", "[ 3/4 → 7/8 | s:hh ]", "[ 7/8 → 1/1 | s:hh ]", - "[ 1/1 → 9/8 | s:hh ]", + "[ 1/1 → 9/8 | s:hh speed:0.5 ]", "[ 9/8 → 5/4 | s:hh ]", "[ 5/4 → 11/8 | s:hh ]", "[ 11/8 → 3/2 | s:hh ]", @@ -728,17 +728,17 @@ exports[`runs examples > example "almostNever" example index 0 1`] = ` "[ 9/4 → 19/8 | s:hh ]", "[ 19/8 → 5/2 | s:hh ]", "[ 5/2 → 21/8 | s:hh ]", - "[ 21/8 → 11/4 | s:hh ]", + "[ 21/8 → 11/4 | s:hh speed:0.5 ]", "[ 11/4 → 23/8 | s:hh ]", - "[ 23/8 → 3/1 | s:hh speed:0.5 ]", + "[ 23/8 → 3/1 | s:hh ]", "[ 3/1 → 25/8 | s:hh ]", "[ 25/8 → 13/4 | s:hh ]", "[ 13/4 → 27/8 | s:hh ]", "[ 27/8 → 7/2 | s:hh ]", "[ 7/2 → 29/8 | s:hh ]", "[ 29/8 → 15/4 | s:hh ]", - "[ 15/4 → 31/8 | s:hh ]", - "[ 31/8 → 4/1 | s:hh ]", + "[ 15/4 → 31/8 | s:hh speed:0.5 ]", + "[ 31/8 → 4/1 | s:hh speed:0.5 ]", ] `; @@ -1053,70 +1053,70 @@ exports[`runs examples > example "begin" example index 0 1`] = ` exports[`runs examples > example "berlin" example index 0 1`] = ` [ - "[ 0/1 → 1/16 | note:D3 ]", - "[ 1/16 → 1/8 | note:E3 ]", - "[ 1/8 → 3/16 | note:F3 ]", - "[ 3/16 → 1/4 | note:G3 ]", - "[ 1/4 → 5/16 | note:A3 ]", - "[ 5/16 → 3/8 | note:C4 ]", - "[ 3/8 → 7/16 | note:D4 ]", - "[ 7/16 → 1/2 | note:F4 ]", - "[ 1/2 → 9/16 | note:D4 ]", - "[ 9/16 → 5/8 | note:E4 ]", - "[ 5/8 → 11/16 | note:E4 ]", - "[ 11/16 → 3/4 | note:E4 ]", - "[ 3/4 → 13/16 | note:F3 ]", - "[ 13/16 → 7/8 | note:F3 ]", - "[ 7/8 → 15/16 | note:F3 ]", - "[ 15/16 → 1/1 | note:F3 ]", - "[ 1/1 → 17/16 | note:E3 ]", - "[ 17/16 → 9/8 | note:E3 ]", - "[ 9/8 → 19/16 | note:E3 ]", - "[ 19/16 → 5/4 | note:F3 ]", - "[ 5/4 → 21/16 | note:E3 ]", - "[ 21/16 → 11/8 | note:F3 ]", - "[ 11/8 → 23/16 | note:G3 ]", - "[ 23/16 → 3/2 | note:A3 ]", - "[ 3/2 → 25/16 | note:A3 ]", - "[ 25/16 → 13/8 | note:Bb3 ]", - "[ 13/8 → 27/16 | note:Bb3 ]", - "[ 27/16 → 7/4 | note:Bb3 ]", + "[ 0/1 → 1/16 | note:A3 ]", + "[ 1/16 → 1/8 | note:A3 ]", + "[ 1/8 → 3/16 | note:A3 ]", + "[ 3/16 → 1/4 | note:A3 ]", + "[ 1/4 → 5/16 | note:E3 ]", + "[ 5/16 → 3/8 | note:F3 ]", + "[ 3/8 → 7/16 | note:F3 ]", + "[ 7/16 → 1/2 | note:G3 ]", + "[ 1/2 → 9/16 | note:A3 ]", + "[ 9/16 → 5/8 | note:Bb3 ]", + "[ 5/8 → 11/16 | note:Bb3 ]", + "[ 11/16 → 3/4 | note:C4 ]", + "[ 3/4 → 13/16 | note:G3 ]", + "[ 13/16 → 7/8 | note:A3 ]", + "[ 7/8 → 15/16 | note:A3 ]", + "[ 15/16 → 1/1 | note:Bb3 ]", + "[ 1/1 → 17/16 | note:F3 ]", + "[ 17/16 → 9/8 | note:G3 ]", + "[ 9/8 → 19/16 | note:G3 ]", + "[ 19/16 → 5/4 | note:A3 ]", + "[ 5/4 → 21/16 | note:G3 ]", + "[ 21/16 → 11/8 | note:Bb3 ]", + "[ 11/8 → 23/16 | note:D4 ]", + "[ 23/16 → 3/2 | note:E4 ]", + "[ 3/2 → 25/16 | note:D4 ]", + "[ 25/16 → 13/8 | note:E4 ]", + "[ 13/8 → 27/16 | note:E4 ]", + "[ 27/16 → 7/4 | note:E4 ]", "[ 7/4 → 29/16 | note:F3 ]", - "[ 29/16 → 15/8 | note:G3 ]", + "[ 29/16 → 15/8 | note:A3 ]", "[ 15/8 → 31/16 | note:Bb3 ]", "[ 31/16 → 2/1 | note:C4 ]", "[ 2/1 → 33/16 | note:C4 ]", - "[ 33/16 → 17/8 | note:D4 ]", - "[ 17/8 → 35/16 | note:F4 ]", - "[ 35/16 → 9/4 | note:G4 ]", - "[ 9/4 → 37/16 | note:Bb3 ]", - "[ 37/16 → 19/8 | note:Bb3 ]", - "[ 19/8 → 39/16 | note:Bb3 ]", - "[ 39/16 → 5/2 | note:C4 ]", - "[ 5/2 → 41/16 | note:F3 ]", - "[ 41/16 → 21/8 | note:F3 ]", - "[ 21/8 → 43/16 | note:G3 ]", - "[ 43/16 → 11/4 | note:A3 ]", - "[ 11/4 → 45/16 | note:A3 ]", - "[ 45/16 → 23/8 | note:A3 ]", - "[ 23/8 → 47/16 | note:A3 ]", + "[ 33/16 → 17/8 | note:E4 ]", + "[ 17/8 → 35/16 | note:G4 ]", + "[ 35/16 → 9/4 | note:A4 ]", + "[ 9/4 → 37/16 | note:D4 ]", + "[ 37/16 → 19/8 | note:F4 ]", + "[ 19/8 → 39/16 | note:G4 ]", + "[ 39/16 → 5/2 | note:A4 ]", + "[ 5/2 → 41/16 | note:Bb3 ]", + "[ 41/16 → 21/8 | note:C4 ]", + "[ 21/8 → 43/16 | note:C4 ]", + "[ 43/16 → 11/4 | note:C4 ]", + "[ 11/4 → 45/16 | note:F3 ]", + "[ 45/16 → 23/8 | note:G3 ]", + "[ 23/8 → 47/16 | note:G3 ]", "[ 47/16 → 3/1 | note:A3 ]", - "[ 3/1 → 49/16 | note:E3 ]", + "[ 3/1 → 49/16 | note:F3 ]", "[ 49/16 → 25/8 | note:G3 ]", - "[ 25/8 → 51/16 | note:Bb3 ]", - "[ 51/16 → 13/4 | note:C4 ]", - "[ 13/4 → 53/16 | note:D4 ]", - "[ 53/16 → 27/8 | note:E4 ]", - "[ 27/8 → 55/16 | note:G4 ]", - "[ 55/16 → 7/2 | note:A4 ]", - "[ 7/2 → 57/16 | note:Bb3 ]", - "[ 57/16 → 29/8 | note:Bb3 ]", - "[ 29/8 → 59/16 | note:C4 ]", - "[ 59/16 → 15/4 | note:C4 ]", - "[ 15/4 → 61/16 | note:F3 ]", - "[ 61/16 → 31/8 | note:G3 ]", - "[ 31/8 → 63/16 | note:G3 ]", - "[ 63/16 → 4/1 | note:A3 ]", + "[ 25/8 → 51/16 | note:G3 ]", + "[ 51/16 → 13/4 | note:A3 ]", + "[ 13/4 → 53/16 | note:G3 ]", + "[ 53/16 → 27/8 | note:A3 ]", + "[ 27/8 → 55/16 | note:C4 ]", + "[ 55/16 → 7/2 | note:E4 ]", + "[ 7/2 → 57/16 | note:D4 ]", + "[ 57/16 → 29/8 | note:E4 ]", + "[ 29/8 → 59/16 | note:F4 ]", + "[ 59/16 → 15/4 | note:G4 ]", + "[ 15/4 → 61/16 | note:Bb3 ]", + "[ 61/16 → 31/8 | note:C4 ]", + "[ 31/8 → 63/16 | note:D4 ]", + "[ 63/16 → 4/1 | note:E4 ]", ] `; @@ -1499,51 +1499,51 @@ exports[`runs examples > example "brand" example index 0 1`] = ` [ "[ 0/1 → 1/10 | s:hh pan:true ]", "[ 1/10 → 1/5 | s:hh pan:true ]", - "[ 1/5 → 3/10 | s:hh pan:false ]", + "[ 1/5 → 3/10 | s:hh pan:true ]", "[ 3/10 → 2/5 | s:hh pan:false ]", - "[ 2/5 → 1/2 | s:hh pan:false ]", + "[ 2/5 → 1/2 | s:hh pan:true ]", "[ 1/2 → 3/5 | s:hh pan:true ]", "[ 3/5 → 7/10 | s:hh pan:false ]", "[ 7/10 → 4/5 | s:hh pan:false ]", - "[ 4/5 → 9/10 | s:hh pan:true ]", - "[ 9/10 → 1/1 | s:hh pan:false ]", - "[ 1/1 → 11/10 | s:hh pan:false ]", + "[ 4/5 → 9/10 | s:hh pan:false ]", + "[ 9/10 → 1/1 | s:hh pan:true ]", + "[ 1/1 → 11/10 | s:hh pan:true ]", "[ 11/10 → 6/5 | s:hh pan:false ]", - "[ 6/5 → 13/10 | s:hh pan:true ]", + "[ 6/5 → 13/10 | s:hh pan:false ]", "[ 13/10 → 7/5 | s:hh pan:true ]", "[ 7/5 → 3/2 | s:hh pan:true ]", - "[ 3/2 → 8/5 | s:hh pan:false ]", - "[ 8/5 → 17/10 | s:hh pan:true ]", - "[ 17/10 → 9/5 | s:hh pan:true ]", + "[ 3/2 → 8/5 | s:hh pan:true ]", + "[ 8/5 → 17/10 | s:hh pan:false ]", + "[ 17/10 → 9/5 | s:hh pan:false ]", "[ 9/5 → 19/10 | s:hh pan:true ]", "[ 19/10 → 2/1 | s:hh pan:true ]", "[ 2/1 → 21/10 | s:hh pan:false ]", "[ 21/10 → 11/5 | s:hh pan:true ]", "[ 11/5 → 23/10 | s:hh pan:false ]", - "[ 23/10 → 12/5 | s:hh pan:false ]", - "[ 12/5 → 5/2 | s:hh pan:false ]", + "[ 23/10 → 12/5 | s:hh pan:true ]", + "[ 12/5 → 5/2 | s:hh pan:true ]", "[ 5/2 → 13/5 | s:hh pan:true ]", - "[ 13/5 → 27/10 | s:hh pan:true ]", + "[ 13/5 → 27/10 | s:hh pan:false ]", "[ 27/10 → 14/5 | s:hh pan:true ]", - "[ 14/5 → 29/10 | s:hh pan:false ]", + "[ 14/5 → 29/10 | s:hh pan:true ]", "[ 29/10 → 3/1 | s:hh pan:true ]", "[ 3/1 → 31/10 | s:hh pan:true ]", - "[ 31/10 → 16/5 | s:hh pan:true ]", + "[ 31/10 → 16/5 | s:hh pan:false ]", "[ 16/5 → 33/10 | s:hh pan:true ]", "[ 33/10 → 17/5 | s:hh pan:false ]", "[ 17/5 → 7/2 | s:hh pan:false ]", "[ 7/2 → 18/5 | s:hh pan:true ]", "[ 18/5 → 37/10 | s:hh pan:false ]", - "[ 37/10 → 19/5 | s:hh pan:false ]", - "[ 19/5 → 39/10 | s:hh pan:true ]", - "[ 39/10 → 4/1 | s:hh pan:true ]", + "[ 37/10 → 19/5 | s:hh pan:true ]", + "[ 19/5 → 39/10 | s:hh pan:false ]", + "[ 39/10 → 4/1 | s:hh pan:false ]", ] `; exports[`runs examples > example "brandBy" example index 0 1`] = ` [ - "[ 0/1 → 1/10 | s:hh pan:true ]", - "[ 1/10 → 1/5 | s:hh pan:true ]", + "[ 0/1 → 1/10 | s:hh pan:false ]", + "[ 1/10 → 1/5 | s:hh pan:false ]", "[ 1/5 → 3/10 | s:hh pan:false ]", "[ 3/10 → 2/5 | s:hh pan:false ]", "[ 2/5 → 1/2 | s:hh pan:false ]", @@ -1552,35 +1552,35 @@ exports[`runs examples > example "brandBy" example index 0 1`] = ` "[ 7/10 → 4/5 | s:hh pan:false ]", "[ 4/5 → 9/10 | s:hh pan:false ]", "[ 9/10 → 1/1 | s:hh pan:false ]", - "[ 1/1 → 11/10 | s:hh pan:false ]", + "[ 1/1 → 11/10 | s:hh pan:true ]", "[ 11/10 → 6/5 | s:hh pan:false ]", "[ 6/5 → 13/10 | s:hh pan:false ]", - "[ 13/10 → 7/5 | s:hh pan:false ]", - "[ 7/5 → 3/2 | s:hh pan:false ]", + "[ 13/10 → 7/5 | s:hh pan:true ]", + "[ 7/5 → 3/2 | s:hh pan:true ]", "[ 3/2 → 8/5 | s:hh pan:false ]", "[ 8/5 → 17/10 | s:hh pan:false ]", "[ 17/10 → 9/5 | s:hh pan:false ]", "[ 9/5 → 19/10 | s:hh pan:false ]", "[ 19/10 → 2/1 | s:hh pan:true ]", "[ 2/1 → 21/10 | s:hh pan:false ]", - "[ 21/10 → 11/5 | s:hh pan:false ]", + "[ 21/10 → 11/5 | s:hh pan:true ]", "[ 11/5 → 23/10 | s:hh pan:false ]", - "[ 23/10 → 12/5 | s:hh pan:false ]", + "[ 23/10 → 12/5 | s:hh pan:true ]", "[ 12/5 → 5/2 | s:hh pan:false ]", "[ 5/2 → 13/5 | s:hh pan:false ]", "[ 13/5 → 27/10 | s:hh pan:false ]", - "[ 27/10 → 14/5 | s:hh pan:false ]", - "[ 14/5 → 29/10 | s:hh pan:false ]", + "[ 27/10 → 14/5 | s:hh pan:true ]", + "[ 14/5 → 29/10 | s:hh pan:true ]", "[ 29/10 → 3/1 | s:hh pan:false ]", "[ 3/1 → 31/10 | s:hh pan:false ]", - "[ 31/10 → 16/5 | s:hh pan:true ]", + "[ 31/10 → 16/5 | s:hh pan:false ]", "[ 16/5 → 33/10 | s:hh pan:true ]", "[ 33/10 → 17/5 | s:hh pan:false ]", "[ 17/5 → 7/2 | s:hh pan:false ]", "[ 7/2 → 18/5 | s:hh pan:false ]", "[ 18/5 → 37/10 | s:hh pan:false ]", - "[ 37/10 → 19/5 | s:hh pan:false ]", - "[ 19/5 → 39/10 | s:hh pan:true ]", + "[ 37/10 → 19/5 | s:hh pan:true ]", + "[ 19/5 → 39/10 | s:hh pan:false ]", "[ 39/10 → 4/1 | s:hh pan:false ]", ] `; @@ -1712,99 +1712,99 @@ exports[`runs examples > example "channels" example index 0 1`] = ` exports[`runs examples > example "choose" example index 0 1`] = ` [ - "[ 0/1 → 1/5 | note:c2 s:sine ]", - "[ 1/5 → 2/5 | note:g2 s:bd n:6 ]", + "[ 0/1 → 1/5 | note:c2 s:triangle ]", + "[ 1/5 → 2/5 | note:g2 s:sine ]", "[ 2/5 → 3/5 | note:g2 s:triangle ]", "[ 3/5 → 4/5 | note:d2 s:bd n:6 ]", - "[ 4/5 → 1/1 | note:f1 s:sine ]", - "[ 1/1 → 6/5 | note:c2 s:triangle ]", - "[ 6/5 → 7/5 | note:g2 s:triangle ]", + "[ 4/5 → 1/1 | note:f1 s:bd n:6 ]", + "[ 1/1 → 6/5 | note:c2 s:sine ]", + "[ 6/5 → 7/5 | note:g2 s:bd n:6 ]", "[ 7/5 → 8/5 | note:g2 s:sine ]", - "[ 8/5 → 9/5 | note:d2 s:triangle ]", + "[ 8/5 → 9/5 | note:d2 s:bd n:6 ]", "[ 9/5 → 2/1 | note:f1 s:sine ]", - "[ 2/1 → 11/5 | note:c2 s:bd n:6 ]", + "[ 2/1 → 11/5 | note:c2 s:triangle ]", "[ 11/5 → 12/5 | note:g2 s:bd n:6 ]", - "[ 12/5 → 13/5 | note:g2 s:bd n:6 ]", - "[ 13/5 → 14/5 | note:d2 s:sine ]", - "[ 14/5 → 3/1 | note:f1 s:triangle ]", - "[ 3/1 → 16/5 | note:c2 s:sine ]", + "[ 12/5 → 13/5 | note:g2 s:sine ]", + "[ 13/5 → 14/5 | note:d2 s:bd n:6 ]", + "[ 14/5 → 3/1 | note:f1 s:sine ]", + "[ 3/1 → 16/5 | note:c2 s:triangle ]", "[ 16/5 → 17/5 | note:g2 s:sine ]", - "[ 17/5 → 18/5 | note:g2 s:triangle ]", + "[ 17/5 → 18/5 | note:g2 s:bd n:6 ]", "[ 18/5 → 19/5 | note:d2 s:triangle ]", - "[ 19/5 → 4/1 | note:f1 s:sine ]", + "[ 19/5 → 4/1 | note:f1 s:bd n:6 ]", ] `; exports[`runs examples > example "chooseCycles" example index 0 1`] = ` [ - "[ 0/1 → 1/8 | s:bd ]", - "[ 1/8 → 1/4 | s:hh ]", - "[ 1/4 → 3/8 | s:sd ]", - "[ 3/8 → 1/2 | s:bd ]", + "[ 0/1 → 1/8 | s:hh ]", + "[ 1/8 → 1/4 | s:bd ]", + "[ 1/4 → 3/8 | s:hh ]", + "[ 3/8 → 1/2 | s:hh ]", "[ 1/2 → 5/8 | s:bd ]", - "[ 5/8 → 3/4 | s:bd ]", - "[ 3/4 → 7/8 | s:hh ]", + "[ 5/8 → 3/4 | s:hh ]", + "[ 3/4 → 7/8 | s:sd ]", "[ 7/8 → 1/1 | s:bd ]", "[ 1/1 → 9/8 | s:sd ]", - "[ 9/8 → 5/4 | s:hh ]", - "[ 5/4 → 11/8 | s:bd ]", - "[ 11/8 → 3/2 | s:hh ]", + "[ 9/8 → 5/4 | s:sd ]", + "[ 5/4 → 11/8 | s:hh ]", + "[ 11/8 → 3/2 | s:bd ]", "[ 3/2 → 13/8 | s:bd ]", - "[ 13/8 → 7/4 | s:sd ]", - "[ 7/4 → 15/8 | s:hh ]", - "[ 15/8 → 2/1 | s:bd ]", - "[ 2/1 → 17/8 | s:bd ]", + "[ 13/8 → 7/4 | s:bd ]", + "[ 7/4 → 15/8 | s:sd ]", + "[ 15/8 → 2/1 | s:hh ]", + "[ 2/1 → 17/8 | s:sd ]", "[ 17/8 → 9/4 | s:sd ]", - "[ 9/4 → 19/8 | s:sd ]", - "[ 19/8 → 5/2 | s:bd ]", - "[ 5/2 → 21/8 | s:hh ]", - "[ 21/8 → 11/4 | s:bd ]", - "[ 11/4 → 23/8 | s:sd ]", + "[ 9/4 → 19/8 | s:bd ]", + "[ 19/8 → 5/2 | s:hh ]", + "[ 5/2 → 21/8 | s:bd ]", + "[ 21/8 → 11/4 | s:sd ]", + "[ 11/4 → 23/8 | s:hh ]", "[ 23/8 → 3/1 | s:bd ]", "[ 3/1 → 25/8 | s:sd ]", "[ 25/8 → 13/4 | s:sd ]", - "[ 13/4 → 27/8 | s:bd ]", + "[ 13/4 → 27/8 | s:sd ]", "[ 27/8 → 7/2 | s:bd ]", - "[ 7/2 → 29/8 | s:bd ]", - "[ 29/8 → 15/4 | s:hh ]", - "[ 15/4 → 31/8 | s:hh ]", + "[ 7/2 → 29/8 | s:sd ]", + "[ 29/8 → 15/4 | s:bd ]", + "[ 15/4 → 31/8 | s:bd ]", "[ 31/8 → 4/1 | s:bd ]", ] `; exports[`runs examples > example "chooseCycles" example index 1 1`] = ` [ - "[ 0/1 → 1/8 | s:bd ]", - "[ 1/8 → 1/4 | s:hh ]", - "[ 1/4 → 3/8 | s:sd ]", - "[ 3/8 → 1/2 | s:bd ]", + "[ 0/1 → 1/8 | s:hh ]", + "[ 1/8 → 1/4 | s:bd ]", + "[ 1/4 → 3/8 | s:hh ]", + "[ 3/8 → 1/2 | s:hh ]", "[ 1/2 → 5/8 | s:bd ]", - "[ 5/8 → 3/4 | s:bd ]", - "[ 3/4 → 7/8 | s:hh ]", + "[ 5/8 → 3/4 | s:hh ]", + "[ 3/4 → 7/8 | s:sd ]", "[ 7/8 → 1/1 | s:bd ]", "[ 1/1 → 9/8 | s:sd ]", - "[ 9/8 → 5/4 | s:hh ]", - "[ 5/4 → 11/8 | s:bd ]", - "[ 11/8 → 3/2 | s:hh ]", + "[ 9/8 → 5/4 | s:sd ]", + "[ 5/4 → 11/8 | s:hh ]", + "[ 11/8 → 3/2 | s:bd ]", "[ 3/2 → 13/8 | s:bd ]", - "[ 13/8 → 7/4 | s:sd ]", - "[ 7/4 → 15/8 | s:hh ]", - "[ 15/8 → 2/1 | s:bd ]", - "[ 2/1 → 17/8 | s:bd ]", + "[ 13/8 → 7/4 | s:bd ]", + "[ 7/4 → 15/8 | s:sd ]", + "[ 15/8 → 2/1 | s:hh ]", + "[ 2/1 → 17/8 | s:sd ]", "[ 17/8 → 9/4 | s:sd ]", - "[ 9/4 → 19/8 | s:sd ]", - "[ 19/8 → 5/2 | s:bd ]", - "[ 5/2 → 21/8 | s:hh ]", - "[ 21/8 → 11/4 | s:bd ]", - "[ 11/4 → 23/8 | s:sd ]", + "[ 9/4 → 19/8 | s:bd ]", + "[ 19/8 → 5/2 | s:hh ]", + "[ 5/2 → 21/8 | s:bd ]", + "[ 21/8 → 11/4 | s:sd ]", + "[ 11/4 → 23/8 | s:hh ]", "[ 23/8 → 3/1 | s:bd ]", "[ 3/1 → 25/8 | s:sd ]", "[ 25/8 → 13/4 | s:sd ]", - "[ 13/4 → 27/8 | s:bd ]", + "[ 13/4 → 27/8 | s:sd ]", "[ 27/8 → 7/2 | s:bd ]", - "[ 7/2 → 29/8 | s:bd ]", - "[ 29/8 → 15/4 | s:hh ]", - "[ 15/4 → 31/8 | s:hh ]", + "[ 7/2 → 29/8 | s:sd ]", + "[ 29/8 → 15/4 | s:bd ]", + "[ 15/4 → 31/8 | s:bd ]", "[ 31/8 → 4/1 | s:bd ]", ] `; @@ -2423,51 +2423,61 @@ exports[`runs examples > example "decay" example index 0 1`] = ` exports[`runs examples > example "degrade" example index 0 1`] = ` [ "[ 1/8 → 1/4 | s:hh ]", - "[ 1/1 → 9/8 | s:hh ]", + "[ 1/4 → 3/8 | s:hh ]", + "[ 3/8 → 1/2 | s:hh ]", + "[ 5/8 → 3/4 | s:hh ]", + "[ 3/4 → 7/8 | s:hh ]", + "[ 7/8 → 1/1 | s:hh ]", "[ 9/8 → 5/4 | s:hh ]", "[ 5/4 → 11/8 | s:hh ]", - "[ 3/2 → 13/8 | s:hh ]", + "[ 11/8 → 3/2 | s:hh ]", + "[ 7/4 → 15/8 | s:hh ]", "[ 15/8 → 2/1 | s:hh ]", "[ 2/1 → 17/8 | s:hh ]", "[ 17/8 → 9/4 | s:hh ]", + "[ 9/4 → 19/8 | s:hh ]", "[ 19/8 → 5/2 | s:hh ]", "[ 11/4 → 23/8 | s:hh ]", - "[ 13/4 → 27/8 | s:hh ]", + "[ 23/8 → 3/1 | s:hh ]", + "[ 25/8 → 13/4 | s:hh ]", + "[ 27/8 → 7/2 | s:hh ]", "[ 29/8 → 15/4 | s:hh ]", - "[ 15/4 → 31/8 | s:hh ]", - "[ 31/8 → 4/1 | s:hh ]", ] `; exports[`runs examples > example "degrade" example index 1 1`] = ` [ - "[ 1/8 → 1/4 | s:hh ]", "[ 1/4 → 3/8 | s:hh ]", "[ 3/4 → 7/8 | s:hh ]", "[ 1/1 → 9/8 | s:hh ]", "[ 9/8 → 5/4 | s:hh ]", - "[ 13/8 → 7/4 | s:hh ]", + "[ 5/4 → 11/8 | s:hh ]", "[ 7/4 → 15/8 | s:hh ]", + "[ 15/8 → 2/1 | s:hh ]", + "[ 2/1 → 17/8 | s:hh ]", "[ 17/8 → 9/4 | s:hh ]", - "[ 9/4 → 19/8 | s:hh ]", - "[ 5/2 → 21/8 | s:hh ]", - "[ 11/4 → 23/8 | s:hh ]", + "[ 19/8 → 5/2 | s:hh ]", + "[ 21/8 → 11/4 | s:hh ]", "[ 3/1 → 25/8 | s:hh ]", "[ 25/8 → 13/4 | s:hh ]", - "[ 15/4 → 31/8 | s:hh ]", + "[ 13/4 → 27/8 | s:hh ]", + "[ 7/2 → 29/8 | s:hh ]", ] `; exports[`runs examples > example "degradeBy" example index 0 1`] = ` [ + "[ 0/1 → 1/8 | s:hh ]", "[ 1/8 → 1/4 | s:hh ]", "[ 1/4 → 3/8 | s:hh ]", "[ 3/8 → 1/2 | s:hh ]", "[ 1/2 → 5/8 | s:hh ]", + "[ 5/8 → 3/4 | s:hh ]", + "[ 3/4 → 7/8 | s:hh ]", "[ 7/8 → 1/1 | s:hh ]", - "[ 1/1 → 9/8 | s:hh ]", "[ 9/8 → 5/4 | s:hh ]", "[ 5/4 → 11/8 | s:hh ]", + "[ 11/8 → 3/2 | s:hh ]", "[ 3/2 → 13/8 | s:hh ]", "[ 13/8 → 7/4 | s:hh ]", "[ 7/4 → 15/8 | s:hh ]", @@ -2478,74 +2488,89 @@ exports[`runs examples > example "degradeBy" example index 0 1`] = ` "[ 19/8 → 5/2 | s:hh ]", "[ 5/2 → 21/8 | s:hh ]", "[ 11/4 → 23/8 | s:hh ]", + "[ 23/8 → 3/1 | s:hh ]", "[ 3/1 → 25/8 | s:hh ]", "[ 25/8 → 13/4 | s:hh ]", "[ 13/4 → 27/8 | s:hh ]", "[ 27/8 → 7/2 | s:hh ]", "[ 7/2 → 29/8 | s:hh ]", "[ 29/8 → 15/4 | s:hh ]", - "[ 15/4 → 31/8 | s:hh ]", - "[ 31/8 → 4/1 | s:hh ]", ] `; exports[`runs examples > example "degradeBy" example index 1 1`] = ` [ - "[ 1/8 → 1/4 | s:hh ]", + "[ 0/1 → 1/8 | s:hh ]", "[ 1/4 → 3/8 | s:hh ]", "[ 3/8 → 1/2 | s:hh ]", + "[ 1/2 → 5/8 | s:hh ]", + "[ 5/8 → 3/4 | s:hh ]", "[ 3/4 → 7/8 | s:hh ]", + "[ 7/8 → 1/1 | s:hh ]", "[ 1/1 → 9/8 | s:hh ]", "[ 9/8 → 5/4 | s:hh ]", + "[ 5/4 → 11/8 | s:hh ]", "[ 11/8 → 3/2 | s:hh ]", + "[ 3/2 → 13/8 | s:hh ]", "[ 13/8 → 7/4 | s:hh ]", "[ 7/4 → 15/8 | s:hh ]", "[ 15/8 → 2/1 | s:hh ]", "[ 2/1 → 17/8 | s:hh ]", "[ 17/8 → 9/4 | s:hh ]", - "[ 9/4 → 19/8 | s:hh ]", "[ 19/8 → 5/2 | s:hh ]", "[ 5/2 → 21/8 | s:hh ]", "[ 21/8 → 11/4 | s:hh ]", "[ 11/4 → 23/8 | s:hh ]", + "[ 23/8 → 3/1 | s:hh ]", "[ 3/1 → 25/8 | s:hh ]", "[ 25/8 → 13/4 | s:hh ]", + "[ 13/4 → 27/8 | s:hh ]", "[ 27/8 → 7/2 | s:hh ]", "[ 7/2 → 29/8 | s:hh ]", - "[ 29/8 → 15/4 | s:hh ]", - "[ 15/4 → 31/8 | s:hh ]", ] `; exports[`runs examples > example "degradeBy" example index 2 1`] = ` [ + "[ 0/1 → 1/16 | s:bd ]", + "[ 1/16 → 1/8 | s:bd ]", "[ 1/8 → 3/16 | s:bd ]", - "[ 1/4 → 5/16 | s:bd ]", - "[ 5/16 → 3/8 | s:bd ]", + "[ 3/8 → 7/16 | s:bd ]", "[ 1/2 → 9/16 | s:bd ]", "[ 9/16 → 5/8 | s:bd ]", + "[ 5/8 → 11/16 | s:bd ]", "[ 11/16 → 3/4 | s:bd ]", + "[ 3/4 → 13/16 | s:bd ]", "[ 15/16 → 1/1 | s:bd ]", + "[ 1/1 → 17/16 | s:bd ]", + "[ 17/16 → 9/8 | s:bd ]", "[ 9/8 → 19/16 | s:bd ]", - "[ 5/4 → 21/16 | s:bd ]", - "[ 21/16 → 11/8 | s:bd ]", + "[ 11/8 → 23/16 | s:bd ]", "[ 3/2 → 25/16 | s:bd ]", "[ 25/16 → 13/8 | s:bd ]", + "[ 13/8 → 27/16 | s:bd ]", "[ 27/16 → 7/4 | s:bd ]", + "[ 7/4 → 29/16 | s:bd ]", "[ 31/16 → 2/1 | s:bd ]", + "[ 2/1 → 33/16 | s:bd ]", + "[ 33/16 → 17/8 | s:bd ]", "[ 17/8 → 35/16 | s:bd ]", - "[ 9/4 → 37/16 | s:bd ]", - "[ 37/16 → 19/8 | s:bd ]", + "[ 19/8 → 39/16 | s:bd ]", "[ 5/2 → 41/16 | s:bd ]", "[ 41/16 → 21/8 | s:bd ]", + "[ 21/8 → 43/16 | s:bd ]", "[ 43/16 → 11/4 | s:bd ]", + "[ 11/4 → 45/16 | s:bd ]", "[ 47/16 → 3/1 | s:bd ]", + "[ 3/1 → 49/16 | s:bd ]", + "[ 49/16 → 25/8 | s:bd ]", "[ 25/8 → 51/16 | s:bd ]", - "[ 13/4 → 53/16 | s:bd ]", - "[ 53/16 → 27/8 | s:bd ]", + "[ 27/8 → 55/16 | s:bd ]", "[ 7/2 → 57/16 | s:bd ]", "[ 57/16 → 29/8 | s:bd ]", + "[ 29/8 → 59/16 | s:bd ]", "[ 59/16 → 15/4 | s:bd ]", + "[ 15/4 → 61/16 | s:bd ]", "[ 63/16 → 4/1 | s:bd ]", ] `; @@ -4844,34 +4869,34 @@ exports[`runs examples > example "invert" example index 0 1`] = ` exports[`runs examples > example "irand" example index 0 1`] = ` [ - "[ 0/1 → 1/4 | note:C3 ]", - "[ 1/4 → 3/8 | note:Eb3 ]", - "[ 3/8 → 1/2 | note:F3 ]", - "[ 1/2 → 3/4 | note:Eb3 ]", - "[ 3/4 → 5/6 | note:D3 ]", - "[ 5/6 → 11/12 | note:C3 ]", + "[ 0/1 → 1/4 | note:F3 ]", + "[ 1/4 → 3/8 | note:G3 ]", + "[ 3/8 → 1/2 | note:G3 ]", + "[ 1/2 → 3/4 | note:F3 ]", + "[ 3/4 → 5/6 | note:Ab3 ]", + "[ 5/6 → 11/12 | note:Bb3 ]", "[ 11/12 → 1/1 | note:C4 ]", - "[ 1/1 → 5/4 | note:G3 ]", + "[ 1/1 → 5/4 | note:C3 ]", "[ 5/4 → 11/8 | note:Ab3 ]", - "[ 11/8 → 3/2 | note:D3 ]", - "[ 3/2 → 7/4 | note:G3 ]", - "[ 7/4 → 11/6 | note:D3 ]", + "[ 11/8 → 3/2 | note:Bb3 ]", + "[ 3/2 → 7/4 | note:D3 ]", + "[ 7/4 → 11/6 | note:Ab3 ]", "[ 11/6 → 23/12 | note:Bb3 ]", - "[ 23/12 → 2/1 | note:Eb3 ]", - "[ 2/1 → 9/4 | note:C4 ]", - "[ 9/4 → 19/8 | note:Eb3 ]", - "[ 19/8 → 5/2 | note:Bb3 ]", - "[ 5/2 → 11/4 | note:F3 ]", + "[ 23/12 → 2/1 | note:C3 ]", + "[ 2/1 → 9/4 | note:G3 ]", + "[ 9/4 → 19/8 | note:Ab3 ]", + "[ 19/8 → 5/2 | note:Ab3 ]", + "[ 5/2 → 11/4 | note:Eb3 ]", "[ 11/4 → 17/6 | note:Ab3 ]", - "[ 17/6 → 35/12 | note:D3 ]", - "[ 35/12 → 3/1 | note:F3 ]", - "[ 3/1 → 13/4 | note:D3 ]", - "[ 13/4 → 27/8 | note:C4 ]", - "[ 27/8 → 7/2 | note:F3 ]", - "[ 7/2 → 15/4 | note:F3 ]", - "[ 15/4 → 23/6 | note:Bb3 ]", + "[ 17/6 → 35/12 | note:Bb3 ]", + "[ 35/12 → 3/1 | note:Ab3 ]", + "[ 3/1 → 13/4 | note:F3 ]", + "[ 13/4 → 27/8 | note:Eb3 ]", + "[ 27/8 → 7/2 | note:Ab3 ]", + "[ 7/2 → 15/4 | note:Eb3 ]", + "[ 15/4 → 23/6 | note:C3 ]", "[ 23/6 → 47/12 | note:Ab3 ]", - "[ 47/12 → 4/1 | note:C3 ]", + "[ 47/12 → 4/1 | note:Ab3 ]", ] `; @@ -6503,36 +6528,36 @@ exports[`runs examples > example "off" example index 0 1`] = ` exports[`runs examples > example "often" example index 0 1`] = ` [ "[ 0/1 → 1/8 | s:hh speed:0.5 ]", - "[ 1/8 → 1/4 | s:hh speed:0.5 ]", + "[ 1/8 → 1/4 | s:hh ]", "[ 1/4 → 3/8 | s:hh speed:0.5 ]", "[ 3/8 → 1/2 | s:hh speed:0.5 ]", "[ 1/2 → 5/8 | s:hh speed:0.5 ]", - "[ 5/8 → 3/4 | s:hh speed:0.5 ]", + "[ 5/8 → 3/4 | s:hh ]", "[ 3/4 → 7/8 | s:hh speed:0.5 ]", - "[ 7/8 → 1/1 | s:hh speed:0.5 ]", + "[ 7/8 → 1/1 | s:hh ]", "[ 1/1 → 9/8 | s:hh speed:0.5 ]", - "[ 9/8 → 5/4 | s:hh speed:0.5 ]", + "[ 9/8 → 5/4 | s:hh ]", "[ 5/4 → 11/8 | s:hh speed:0.5 ]", - "[ 11/8 → 3/2 | s:hh speed:0.5 ]", + "[ 11/8 → 3/2 | s:hh ]", "[ 3/2 → 13/8 | s:hh speed:0.5 ]", "[ 13/8 → 7/4 | s:hh speed:0.5 ]", "[ 7/4 → 15/8 | s:hh speed:0.5 ]", - "[ 15/8 → 2/1 | s:hh speed:0.5 ]", - "[ 2/1 → 17/8 | s:hh ]", + "[ 15/8 → 2/1 | s:hh ]", + "[ 2/1 → 17/8 | s:hh speed:0.5 ]", "[ 17/8 → 9/4 | s:hh ]", "[ 9/4 → 19/8 | s:hh speed:0.5 ]", - "[ 19/8 → 5/2 | s:hh ]", + "[ 19/8 → 5/2 | s:hh speed:0.5 ]", "[ 5/2 → 21/8 | s:hh speed:0.5 ]", "[ 21/8 → 11/4 | s:hh speed:0.5 ]", "[ 11/4 → 23/8 | s:hh speed:0.5 ]", - "[ 23/8 → 3/1 | s:hh speed:0.5 ]", + "[ 23/8 → 3/1 | s:hh ]", "[ 3/1 → 25/8 | s:hh speed:0.5 ]", "[ 25/8 → 13/4 | s:hh speed:0.5 ]", - "[ 13/4 → 27/8 | s:hh ]", + "[ 13/4 → 27/8 | s:hh speed:0.5 ]", "[ 27/8 → 7/2 | s:hh speed:0.5 ]", "[ 7/2 → 29/8 | s:hh speed:0.5 ]", "[ 29/8 → 15/4 | s:hh ]", - "[ 15/4 → 31/8 | s:hh ]", + "[ 15/4 → 31/8 | s:hh speed:0.5 ]", "[ 31/8 → 4/1 | s:hh speed:0.5 ]", ] `; @@ -6785,54 +6810,54 @@ exports[`runs examples > example "penv" example index 0 1`] = ` exports[`runs examples > example "perlin" example index 0 1`] = ` [ - "[ 0/1 → 1/8 | s:hh cutoff:500 ]", - "[ 0/1 → 1/4 | s:bd cutoff:500 ]", - "[ 1/8 → 1/4 | s:hh cutoff:562.5486401770559 ]", - "[ 1/4 → 3/8 | s:hh cutoff:903.3554895067937 ]", - "[ 1/4 → 1/2 | s:bd cutoff:903.3554895067937 ]", - "[ 3/8 → 1/2 | s:hh cutoff:1572.364329119182 ]", - "[ 1/2 → 5/8 | s:hh cutoff:2448.2831191271544 ]", - "[ 1/2 → 3/4 | s:bd cutoff:2448.2831191271544 ]", - "[ 5/8 → 3/4 | s:hh cutoff:3324.2019091351267 ]", - "[ 3/4 → 7/8 | s:hh cutoff:3993.210748747515 ]", - "[ 3/4 → 1/1 | s:bd cutoff:3993.210748747515 ]", - "[ 7/8 → 1/1 | s:hh cutoff:4334.017598077253 ]", - "[ 1/1 → 9/8 | s:hh cutoff:4396.566238254309 ]", - "[ 1/1 → 5/4 | s:bd cutoff:4396.566238254309 ]", - "[ 9/8 → 5/4 | s:hh cutoff:4449.536839055554 ]", - "[ 5/4 → 11/8 | s:hh cutoff:4738.156120227359 ]", - "[ 5/4 → 3/2 | s:bd cutoff:4738.156120227359 ]", - "[ 11/8 → 3/2 | s:hh cutoff:5304.71999875931 ]", - "[ 3/2 → 13/8 | s:hh cutoff:6046.5098191052675 ]", - "[ 3/2 → 7/4 | s:bd cutoff:6046.5098191052675 ]", - "[ 13/8 → 7/4 | s:hh cutoff:6788.299639451225 ]", - "[ 7/4 → 15/8 | s:hh cutoff:7354.863517983176 ]", - "[ 7/4 → 2/1 | s:bd cutoff:7354.863517983176 ]", - "[ 15/8 → 2/1 | s:hh cutoff:7643.482799154981 ]", - "[ 2/1 → 17/8 | s:hh cutoff:7696.453399956226 ]", - "[ 2/1 → 9/4 | s:bd cutoff:7696.453399956226 ]", - "[ 17/8 → 9/4 | s:hh cutoff:7607.093996059746 ]", - "[ 9/4 → 19/8 | s:hh cutoff:7120.204164182724 ]", - "[ 9/4 → 5/2 | s:bd cutoff:7120.204164182724 ]", - "[ 19/8 → 5/2 | s:hh cutoff:6164.432289046601 ]", - "[ 5/2 → 21/8 | s:hh cutoff:4913.0608648993075 ]", - "[ 5/2 → 11/4 | s:bd cutoff:4913.0608648993075 ]", - "[ 21/8 → 11/4 | s:hh cutoff:3661.6894407520135 ]", - "[ 11/4 → 23/8 | s:hh cutoff:2705.9175656158914 ]", - "[ 11/4 → 3/1 | s:bd cutoff:2705.9175656158914 ]", - "[ 23/8 → 3/1 | s:hh cutoff:2219.0277337388693 ]", - "[ 3/1 → 25/8 | s:hh cutoff:2129.6683298423886 ]", - "[ 3/1 → 13/4 | s:bd cutoff:2129.6683298423886 ]", - "[ 25/8 → 13/4 | s:hh cutoff:2113.2537022102156 ]", - "[ 13/4 → 27/8 | s:hh cutoff:2023.8158261763601 ]", - "[ 13/4 → 7/2 | s:bd cutoff:2023.8158261763601 ]", - "[ 27/8 → 7/2 | s:hh cutoff:1848.2479648482126 ]", - "[ 7/2 → 29/8 | s:hh cutoff:1618.380764964968 ]", - "[ 7/2 → 15/4 | s:bd cutoff:1618.380764964968 ]", - "[ 29/8 → 15/4 | s:hh cutoff:1388.5135650817233 ]", - "[ 15/4 → 31/8 | s:hh cutoff:1212.9457037535758 ]", - "[ 15/4 → 4/1 | s:bd cutoff:1212.9457037535758 ]", - "[ 31/8 → 4/1 | s:hh cutoff:1123.5078277197204 ]", + "[ 0/1 → 1/8 | s:hh cutoff:3801.944299018942 ]", + "[ 0/1 → 1/4 | s:bd cutoff:3801.944299018942 ]", + "[ 1/8 → 1/4 | s:hh cutoff:3752.180364182138 ]", + "[ 1/4 → 3/8 | s:hh cutoff:3481.0331450903504 ]", + "[ 1/4 → 1/2 | s:bd cutoff:3481.0331450903504 ]", + "[ 3/8 → 1/2 | s:hh cutoff:2948.767180467044 ]", + "[ 1/2 → 5/8 | s:hh cutoff:2251.8828762695193 ]", + "[ 1/2 → 3/4 | s:bd cutoff:2251.8828762695193 ]", + "[ 5/8 → 3/4 | s:hh cutoff:1554.9985720719947 ]", + "[ 3/4 → 7/8 | s:hh cutoff:1022.7326074486882 ]", + "[ 3/4 → 1/1 | s:bd cutoff:1022.7326074486882 ]", + "[ 7/8 → 1/1 | s:hh cutoff:751.5853883569008 ]", + "[ 1/1 → 9/8 | s:hh cutoff:701.8214535200968 ]", + "[ 1/1 → 5/4 | s:bd cutoff:701.8214535200968 ]", + "[ 9/8 → 5/4 | s:hh cutoff:758.9508705680288 ]", + "[ 5/4 → 11/8 | s:hh cutoff:1070.2301657379394 ]", + "[ 5/4 → 3/2 | s:bd cutoff:1070.2301657379394 ]", + "[ 11/8 → 3/2 | s:hh cutoff:1681.2759838209531 ]", + "[ 3/2 → 13/8 | s:hh cutoff:2481.3050446100533 ]", + "[ 3/2 → 7/4 | s:bd cutoff:2481.3050446100533 ]", + "[ 13/8 → 7/4 | s:hh cutoff:3281.3341053991535 ]", + "[ 7/4 → 15/8 | s:hh cutoff:3892.379923482167 ]", + "[ 7/4 → 2/1 | s:bd cutoff:3892.379923482167 ]", + "[ 15/8 → 2/1 | s:hh cutoff:4203.6592186520775 ]", + "[ 2/1 → 17/8 | s:hh cutoff:4260.78863570001 ]", + "[ 2/1 → 9/4 | s:bd cutoff:4260.78863570001 ]", + "[ 17/8 → 9/4 | s:hh cutoff:4250.943561981614 ]", + "[ 9/4 → 19/8 | s:hh cutoff:4197.301012025491 ]", + "[ 9/4 → 5/2 | s:bd cutoff:4197.301012025491 ]", + "[ 19/8 → 5/2 | s:hh cutoff:4091.9999003530734 ]", + "[ 5/2 → 21/8 | s:hh cutoff:3954.1314345551655 ]", + "[ 5/2 → 11/4 | s:bd cutoff:3954.1314345551655 ]", + "[ 21/8 → 11/4 | s:hh cutoff:3816.2629687572576 ]", + "[ 11/4 → 23/8 | s:hh cutoff:3710.9618570848397 ]", + "[ 11/4 → 3/1 | s:bd cutoff:3710.9618570848397 ]", + "[ 23/8 → 3/1 | s:hh cutoff:3657.3193071287164 ]", + "[ 3/1 → 25/8 | s:hh cutoff:3647.474233410321 ]", + "[ 3/1 → 13/4 | s:bd cutoff:3647.474233410321 ]", + "[ 25/8 → 13/4 | s:hh cutoff:3623.927675406968 ]", + "[ 13/4 → 27/8 | s:hh cutoff:3495.6302700122706 ]", + "[ 13/4 → 7/2 | s:bd cutoff:3495.6302700122706 ]", + "[ 27/8 → 7/2 | s:hh cutoff:3243.7805830790653 ]", + "[ 7/2 → 29/8 | s:hh cutoff:2914.039240393322 ]", + "[ 7/2 → 15/4 | s:bd cutoff:2914.039240393322 ]", + "[ 29/8 → 15/4 | s:hh cutoff:2584.2978977075786 ]", + "[ 15/4 → 31/8 | s:hh cutoff:2332.4482107743734 ]", + "[ 15/4 → 4/1 | s:bd cutoff:2332.4482107743734 ]", + "[ 31/8 → 4/1 | s:hh cutoff:2204.150805379676 ]", ] `; @@ -7596,54 +7621,54 @@ exports[`runs examples > example "queryArc" example index 0 1`] = `[]`; exports[`runs examples > example "rand" example index 0 1`] = ` [ - "[ 0/1 → 1/8 | s:hh cutoff:500 ]", - "[ 0/1 → 1/4 | s:bd cutoff:500 ]", - "[ 1/8 → 1/4 | s:hh cutoff:5639.116775244474 ]", - "[ 1/4 → 3/8 | s:hh cutoff:3273.1976890936494 ]", - "[ 1/4 → 1/2 | s:bd cutoff:3273.1976890936494 ]", - "[ 3/8 → 1/2 | s:hh cutoff:3510.4438681155443 ]", - "[ 1/2 → 5/8 | s:hh cutoff:2453.604621812701 ]", - "[ 1/2 → 3/4 | s:bd cutoff:2453.604621812701 ]", - "[ 5/8 → 3/4 | s:hh cutoff:1517.2690078616142 ]", - "[ 3/4 → 7/8 | s:hh cutoff:1968.6986012384295 ]", - "[ 3/4 → 1/1 | s:bd cutoff:1968.6986012384295 ]", - "[ 7/8 → 1/1 | s:hh cutoff:3482.2331061586738 ]", - "[ 1/1 → 9/8 | s:hh cutoff:4396.566238254309 ]", - "[ 1/1 → 5/4 | s:bd cutoff:4396.566238254309 ]", - "[ 9/8 → 5/4 | s:hh cutoff:5543.671359308064 ]", - "[ 5/4 → 11/8 | s:hh cutoff:5965.461523272097 ]", - "[ 5/4 → 3/2 | s:bd cutoff:5965.461523272097 ]", - "[ 11/8 → 3/2 | s:hh cutoff:1871.028139255941 ]", - "[ 3/2 → 13/8 | s:hh cutoff:5063.060561195016 ]", - "[ 3/2 → 7/4 | s:bd cutoff:5063.060561195016 ]", - "[ 13/8 → 7/4 | s:hh cutoff:4225.660336203873 ]", - "[ 7/4 → 15/8 | s:hh cutoff:2035.5342207476497 ]", - "[ 7/4 → 2/1 | s:bd cutoff:2035.5342207476497 ]", - "[ 15/8 → 2/1 | s:hh cutoff:4959.178843535483 ]", - "[ 2/1 → 17/8 | s:hh cutoff:7696.453399956226 ]", - "[ 2/1 → 9/4 | s:bd cutoff:7696.453399956226 ]", - "[ 17/8 → 9/4 | s:hh cutoff:7275.427204556763 ]", - "[ 9/4 → 19/8 | s:hh cutoff:3091.1188358440995 ]", - "[ 9/4 → 5/2 | s:bd cutoff:3091.1188358440995 ]", - "[ 19/8 → 5/2 | s:hh cutoff:6773.7998040392995 ]", - "[ 5/2 → 21/8 | s:hh cutoff:3939.620556309819 ]", - "[ 5/2 → 11/4 | s:bd cutoff:3939.620556309819 ]", - "[ 21/8 → 11/4 | s:hh cutoff:1701.4511320739985 ]", - "[ 11/4 → 23/8 | s:hh cutoff:5249.245778657496 ]", - "[ 11/4 → 3/1 | s:bd cutoff:5249.245778657496 ]", - "[ 23/8 → 3/1 | s:hh cutoff:621.9062879681587 ]", - "[ 3/1 → 25/8 | s:hh cutoff:2129.6683298423886 ]", - "[ 3/1 → 13/4 | s:bd cutoff:2129.6683298423886 ]", - "[ 25/8 → 13/4 | s:hh cutoff:3074.329087510705 ]", - "[ 13/4 → 27/8 | s:hh cutoff:7942.738036625087 ]", - "[ 13/4 → 7/2 | s:bd cutoff:7942.738036625087 ]", - "[ 27/8 → 7/2 | s:hh cutoff:3565.1885084807873 ]", - "[ 7/2 → 29/8 | s:hh cutoff:3574.6161099523306 ]", - "[ 7/2 → 15/4 | s:bd cutoff:3574.6161099523306 ]", - "[ 29/8 → 15/4 | s:hh cutoff:7543.614340946078 ]", - "[ 15/4 → 31/8 | s:hh cutoff:6591.254916973412 ]", - "[ 15/4 → 4/1 | s:bd cutoff:6591.254916973412 ]", - "[ 31/8 → 4/1 | s:hh cutoff:6021.249040029943 ]", + "[ 0/1 → 1/8 | s:hh cutoff:3801.944299018942 ]", + "[ 0/1 → 1/4 | s:bd cutoff:3801.944299018942 ]", + "[ 1/8 → 1/4 | s:hh cutoff:6647.100417292677 ]", + "[ 1/4 → 3/8 | s:hh cutoff:4935.184325557202 ]", + "[ 1/4 → 1/2 | s:bd cutoff:4935.184325557202 ]", + "[ 3/8 → 1/2 | s:hh cutoff:4274.936107802205 ]", + "[ 1/2 → 5/8 | s:hh cutoff:3599.519268143922 ]", + "[ 1/2 → 3/4 | s:bd cutoff:3599.519268143922 ]", + "[ 5/8 → 3/4 | s:hh cutoff:7203.329019364901 ]", + "[ 3/4 → 7/8 | s:hh cutoff:5311.3214410841465 ]", + "[ 3/4 → 1/1 | s:bd cutoff:5311.3214410841465 ]", + "[ 7/8 → 1/1 | s:hh cutoff:7230.677842278965 ]", + "[ 1/1 → 9/8 | s:hh cutoff:701.8214535200968 ]", + "[ 1/1 → 5/4 | s:bd cutoff:701.8214535200968 ]", + "[ 9/8 → 5/4 | s:hh cutoff:6626.493136398494 ]", + "[ 5/4 → 11/8 | s:hh cutoff:5536.982340388931 ]", + "[ 5/4 → 3/2 | s:bd cutoff:5536.982340388931 ]", + "[ 11/8 → 3/2 | s:hh cutoff:6926.114265923388 ]", + "[ 3/2 → 13/8 | s:hh cutoff:2300.4843831295148 ]", + "[ 3/2 → 7/4 | s:bd cutoff:2300.4843831295148 ]", + "[ 13/8 → 7/4 | s:hh cutoff:2510.1786771556363 ]", + "[ 7/4 → 15/8 | s:hh cutoff:5990.686780540273 ]", + "[ 7/4 → 2/1 | s:bd cutoff:5990.686780540273 ]", + "[ 15/8 → 2/1 | s:hh cutoff:6187.015319708735 ]", + "[ 2/1 → 17/8 | s:hh cutoff:4260.78863570001 ]", + "[ 2/1 → 9/4 | s:bd cutoff:4260.78863570001 ]", + "[ 17/8 → 9/4 | s:hh cutoff:6301.981445983984 ]", + "[ 9/4 → 19/8 | s:hh cutoff:5212.422806769609 ]", + "[ 9/4 → 5/2 | s:bd cutoff:5212.422806769609 ]", + "[ 19/8 → 5/2 | s:hh cutoff:5561.523957410827 ]", + "[ 5/2 → 21/8 | s:hh cutoff:3020.9835229907185 ]", + "[ 5/2 → 11/4 | s:bd cutoff:3020.9835229907185 ]", + "[ 21/8 → 11/4 | s:hh cutoff:576.5502714784816 ]", + "[ 11/4 → 23/8 | s:hh cutoff:5743.939216597937 ]", + "[ 11/4 → 3/1 | s:bd cutoff:5743.939216597937 ]", + "[ 23/8 → 3/1 | s:hh cutoff:7271.8438868178055 ]", + "[ 3/1 → 25/8 | s:hh cutoff:3647.474233410321 ]", + "[ 3/1 → 13/4 | s:bd cutoff:3647.474233410321 ]", + "[ 25/8 → 13/4 | s:hh cutoff:5633.619675179943 ]", + "[ 13/4 → 27/8 | s:hh cutoff:2873.2354695675895 ]", + "[ 13/4 → 7/2 | s:bd cutoff:2873.2354695675895 ]", + "[ 27/8 → 7/2 | s:hh cutoff:5596.839588950388 ]", + "[ 7/2 → 29/8 | s:hh cutoff:2628.3173956908286 ]", + "[ 7/2 → 15/4 | s:bd cutoff:2628.3173956908286 ]", + "[ 29/8 → 15/4 | s:hh cutoff:7124.103914946318 ]", + "[ 15/4 → 31/8 | s:hh cutoff:814.1072567086667 ]", + "[ 15/4 → 4/1 | s:bd cutoff:814.1072567086667 ]", + "[ 31/8 → 4/1 | s:hh cutoff:518.1868247454986 ]", ] `; @@ -7808,21 +7833,21 @@ exports[`runs examples > example "rangex" example index 0 1`] = ` exports[`runs examples > example "rarely" example index 0 1`] = ` [ - "[ 0/1 → 1/8 | s:hh speed:0.5 ]", + "[ 0/1 → 1/8 | s:hh ]", "[ 1/8 → 1/4 | s:hh ]", "[ 1/4 → 3/8 | s:hh ]", "[ 3/8 → 1/2 | s:hh ]", "[ 1/2 → 5/8 | s:hh ]", - "[ 5/8 → 3/4 | s:hh speed:0.5 ]", - "[ 3/4 → 7/8 | s:hh speed:0.5 ]", + "[ 5/8 → 3/4 | s:hh ]", + "[ 3/4 → 7/8 | s:hh ]", "[ 7/8 → 1/1 | s:hh ]", - "[ 1/1 → 9/8 | s:hh ]", + "[ 1/1 → 9/8 | s:hh speed:0.5 ]", "[ 9/8 → 5/4 | s:hh ]", "[ 5/4 → 11/8 | s:hh ]", - "[ 11/8 → 3/2 | s:hh speed:0.5 ]", - "[ 3/2 → 13/8 | s:hh ]", + "[ 11/8 → 3/2 | s:hh ]", + "[ 3/2 → 13/8 | s:hh speed:0.5 ]", "[ 13/8 → 7/4 | s:hh ]", - "[ 7/4 → 15/8 | s:hh speed:0.5 ]", + "[ 7/4 → 15/8 | s:hh ]", "[ 15/8 → 2/1 | s:hh ]", "[ 2/1 → 17/8 | s:hh ]", "[ 17/8 → 9/4 | s:hh ]", @@ -7831,15 +7856,15 @@ exports[`runs examples > example "rarely" example index 0 1`] = ` "[ 5/2 → 21/8 | s:hh ]", "[ 21/8 → 11/4 | s:hh speed:0.5 ]", "[ 11/4 → 23/8 | s:hh ]", - "[ 23/8 → 3/1 | s:hh speed:0.5 ]", - "[ 3/1 → 25/8 | s:hh speed:0.5 ]", + "[ 23/8 → 3/1 | s:hh ]", + "[ 3/1 → 25/8 | s:hh ]", "[ 25/8 → 13/4 | s:hh ]", "[ 13/4 → 27/8 | s:hh ]", "[ 27/8 → 7/2 | s:hh ]", "[ 7/2 → 29/8 | s:hh ]", "[ 29/8 → 15/4 | s:hh ]", - "[ 15/4 → 31/8 | s:hh ]", - "[ 31/8 → 4/1 | s:hh ]", + "[ 15/4 → 31/8 | s:hh speed:0.5 ]", + "[ 31/8 → 4/1 | s:hh speed:0.5 ]", ] `; @@ -7883,22 +7908,22 @@ exports[`runs examples > example "release" example index 0 1`] = ` exports[`runs examples > example "repeatCycles" example index 0 1`] = ` [ - "[ 0/1 → 1/4 | note:34 s:gm_acoustic_guitar_nylon ]", - "[ 1/4 → 1/2 | note:38 s:gm_acoustic_guitar_nylon ]", - "[ 1/2 → 3/4 | note:37 s:gm_acoustic_guitar_nylon ]", - "[ 3/4 → 1/1 | note:36 s:gm_acoustic_guitar_nylon ]", - "[ 1/1 → 5/4 | note:34 s:gm_acoustic_guitar_nylon ]", - "[ 5/4 → 3/2 | note:38 s:gm_acoustic_guitar_nylon ]", - "[ 3/2 → 7/4 | note:37 s:gm_acoustic_guitar_nylon ]", - "[ 7/4 → 2/1 | note:36 s:gm_acoustic_guitar_nylon ]", - "[ 2/1 → 9/4 | note:40 s:gm_acoustic_guitar_nylon ]", + "[ 0/1 → 1/4 | note:39 s:gm_acoustic_guitar_nylon ]", + "[ 1/4 → 1/2 | note:41 s:gm_acoustic_guitar_nylon ]", + "[ 1/2 → 3/4 | note:38 s:gm_acoustic_guitar_nylon ]", + "[ 3/4 → 1/1 | note:41 s:gm_acoustic_guitar_nylon ]", + "[ 1/1 → 5/4 | note:39 s:gm_acoustic_guitar_nylon ]", + "[ 5/4 → 3/2 | note:41 s:gm_acoustic_guitar_nylon ]", + "[ 3/2 → 7/4 | note:38 s:gm_acoustic_guitar_nylon ]", + "[ 7/4 → 2/1 | note:41 s:gm_acoustic_guitar_nylon ]", + "[ 2/1 → 9/4 | note:34 s:gm_acoustic_guitar_nylon ]", "[ 9/4 → 5/2 | note:42 s:gm_acoustic_guitar_nylon ]", - "[ 5/2 → 11/4 | note:41 s:gm_acoustic_guitar_nylon ]", - "[ 11/4 → 3/1 | note:36 s:gm_acoustic_guitar_nylon ]", - "[ 3/1 → 13/4 | note:40 s:gm_acoustic_guitar_nylon ]", + "[ 5/2 → 11/4 | note:36 s:gm_acoustic_guitar_nylon ]", + "[ 11/4 → 3/1 | note:42 s:gm_acoustic_guitar_nylon ]", + "[ 3/1 → 13/4 | note:34 s:gm_acoustic_guitar_nylon ]", "[ 13/4 → 7/2 | note:42 s:gm_acoustic_guitar_nylon ]", - "[ 7/2 → 15/4 | note:41 s:gm_acoustic_guitar_nylon ]", - "[ 15/4 → 4/1 | note:36 s:gm_acoustic_guitar_nylon ]", + "[ 7/2 → 15/4 | note:36 s:gm_acoustic_guitar_nylon ]", + "[ 15/4 → 4/1 | note:42 s:gm_acoustic_guitar_nylon ]", ] `; @@ -8036,67 +8061,43 @@ exports[`runs examples > example "ribbon" example index 0 1`] = ` exports[`runs examples > example "ribbon" example index 1 1`] = ` [ - "[ 0/1 → 1/4 | note:A3 ]", - "[ 1/4 → 1/2 | note:C3 ]", - "[ 1/2 → 3/4 | note:D3 ]", - "[ 3/4 → 1/1 | note:G3 ]", - "[ 1/1 → 5/4 | note:E3 ]", - "[ 5/4 → 3/2 | note:C4 ]", + "[ 0/1 → 1/4 | note:E4 ]", + "[ 1/4 → 1/2 | note:G3 ]", + "[ 1/2 → 3/4 | note:C3 ]", + "[ 3/4 → 1/1 | note:E4 ]", + "[ 1/1 → 5/4 | note:A3 ]", + "[ 5/4 → 3/2 | note:D3 ]", "[ 3/2 → 7/4 | note:A3 ]", - "[ 7/4 → 2/1 | note:E4 ]", - "[ 2/1 → 9/4 | note:A3 ]", - "[ 9/4 → 5/2 | note:C3 ]", - "[ 5/2 → 11/4 | note:D3 ]", - "[ 11/4 → 3/1 | note:G3 ]", - "[ 3/1 → 13/4 | note:E3 ]", - "[ 13/4 → 7/2 | note:C4 ]", + "[ 7/4 → 2/1 | note:G3 ]", + "[ 2/1 → 9/4 | note:E4 ]", + "[ 9/4 → 5/2 | note:G3 ]", + "[ 5/2 → 11/4 | note:C3 ]", + "[ 11/4 → 3/1 | note:E4 ]", + "[ 3/1 → 13/4 | note:A3 ]", + "[ 13/4 → 7/2 | note:D3 ]", "[ 7/2 → 15/4 | note:A3 ]", - "[ 15/4 → 4/1 | note:E4 ]", + "[ 15/4 → 4/1 | note:G3 ]", ] `; exports[`runs examples > example "ribbon" example index 2 1`] = ` [ - "[ 1/16 → 1/8 | s:bd ]", "[ 1/8 → 3/16 | s:bd ]", - "[ 3/16 → 1/4 | s:bd ]", - "[ 1/4 → 5/16 | s:bd ]", - "[ 3/8 → 7/16 | s:bd ]", - "[ 9/16 → 5/8 | s:bd ]", + "[ 7/16 → 1/2 | s:bd ]", "[ 5/8 → 11/16 | s:bd ]", - "[ 11/16 → 3/4 | s:bd ]", - "[ 3/4 → 13/16 | s:bd ]", - "[ 7/8 → 15/16 | s:bd ]", - "[ 17/16 → 9/8 | s:bd ]", + "[ 15/16 → 1/1 | s:bd ]", "[ 9/8 → 19/16 | s:bd ]", - "[ 19/16 → 5/4 | s:bd ]", - "[ 5/4 → 21/16 | s:bd ]", - "[ 11/8 → 23/16 | s:bd ]", - "[ 25/16 → 13/8 | s:bd ]", + "[ 23/16 → 3/2 | s:bd ]", "[ 13/8 → 27/16 | s:bd ]", - "[ 27/16 → 7/4 | s:bd ]", - "[ 7/4 → 29/16 | s:bd ]", - "[ 15/8 → 31/16 | s:bd ]", - "[ 33/16 → 17/8 | s:bd ]", + "[ 31/16 → 2/1 | s:bd ]", "[ 17/8 → 35/16 | s:bd ]", - "[ 35/16 → 9/4 | s:bd ]", - "[ 9/4 → 37/16 | s:bd ]", - "[ 19/8 → 39/16 | s:bd ]", - "[ 41/16 → 21/8 | s:bd ]", + "[ 39/16 → 5/2 | s:bd ]", "[ 21/8 → 43/16 | s:bd ]", - "[ 43/16 → 11/4 | s:bd ]", - "[ 11/4 → 45/16 | s:bd ]", - "[ 23/8 → 47/16 | s:bd ]", - "[ 49/16 → 25/8 | s:bd ]", + "[ 47/16 → 3/1 | s:bd ]", "[ 25/8 → 51/16 | s:bd ]", - "[ 51/16 → 13/4 | s:bd ]", - "[ 13/4 → 53/16 | s:bd ]", - "[ 27/8 → 55/16 | s:bd ]", - "[ 57/16 → 29/8 | s:bd ]", + "[ 55/16 → 7/2 | s:bd ]", "[ 29/8 → 59/16 | s:bd ]", - "[ 59/16 → 15/4 | s:bd ]", - "[ 15/4 → 61/16 | s:bd ]", - "[ 31/8 → 63/16 | s:bd ]", + "[ 63/16 → 4/1 | s:bd ]", ] `; @@ -8627,38 +8628,38 @@ exports[`runs examples > example "scale" example index 1 1`] = ` exports[`runs examples > example "scale" example index 2 1`] = ` [ - "[ 0/1 → 1/8 | note:C3 s:piano ]", - "[ 1/8 → 1/4 | note:A4 s:piano ]", - "[ 1/4 → 3/8 | note:C4 s:piano ]", - "[ 3/8 → 1/2 | note:C4 s:piano ]", - "[ 1/2 → 5/8 | note:A3 s:piano ]", - "[ 5/8 → 3/4 | note:F3 s:piano ]", - "[ 3/4 → 7/8 | note:G3 s:piano ]", - "[ 7/8 → 1/1 | note:C4 s:piano ]", - "[ 1/1 → 9/8 | note:F4 s:piano ]", - "[ 9/8 → 5/4 | note:A4 s:piano ]", + "[ 0/1 → 1/8 | note:D4 s:piano ]", + "[ 1/8 → 1/4 | note:C5 s:piano ]", + "[ 1/4 → 3/8 | note:G4 s:piano ]", + "[ 3/8 → 1/2 | note:F4 s:piano ]", + "[ 1/2 → 5/8 | note:C4 s:piano ]", + "[ 5/8 → 3/4 | note:D5 s:piano ]", + "[ 3/4 → 7/8 | note:G4 s:piano ]", + "[ 7/8 → 1/1 | note:D5 s:piano ]", + "[ 1/1 → 9/8 | note:D3 s:piano ]", + "[ 9/8 → 5/4 | note:C5 s:piano ]", "[ 5/4 → 11/8 | note:A4 s:piano ]", - "[ 11/8 → 3/2 | note:G3 s:piano ]", - "[ 3/2 → 13/8 | note:G4 s:piano ]", - "[ 13/8 → 7/4 | note:D4 s:piano ]", - "[ 7/4 → 15/8 | note:G3 s:piano ]", - "[ 15/8 → 2/1 | note:G4 s:piano ]", - "[ 2/1 → 17/8 | note:F5 s:piano ]", - "[ 17/8 → 9/4 | note:D5 s:piano ]", - "[ 9/4 → 19/8 | note:C4 s:piano ]", - "[ 19/8 → 5/2 | note:D5 s:piano ]", - "[ 5/2 → 21/8 | note:D4 s:piano ]", - "[ 21/8 → 11/4 | note:F3 s:piano ]", - "[ 11/4 → 23/8 | note:G4 s:piano ]", - "[ 23/8 → 3/1 | note:D3 s:piano ]", - "[ 3/1 → 25/8 | note:G3 s:piano ]", - "[ 25/8 → 13/4 | note:C4 s:piano ]", - "[ 13/4 → 27/8 | note:F5 s:piano ]", - "[ 27/8 → 7/2 | note:C4 s:piano ]", - "[ 7/2 → 29/8 | note:C4 s:piano ]", - "[ 29/8 → 15/4 | note:F5 s:piano ]", - "[ 15/4 → 31/8 | note:C5 s:piano ]", - "[ 31/8 → 4/1 | note:A4 s:piano ]", + "[ 11/8 → 3/2 | note:D5 s:piano ]", + "[ 3/2 → 13/8 | note:G3 s:piano ]", + "[ 13/8 → 7/4 | note:A3 s:piano ]", + "[ 7/4 → 15/8 | note:A4 s:piano ]", + "[ 15/8 → 2/1 | note:C5 s:piano ]", + "[ 2/1 → 17/8 | note:F4 s:piano ]", + "[ 17/8 → 9/4 | note:C5 s:piano ]", + "[ 9/4 → 19/8 | note:G4 s:piano ]", + "[ 19/8 → 5/2 | note:A4 s:piano ]", + "[ 5/2 → 21/8 | note:C4 s:piano ]", + "[ 21/8 → 11/4 | note:D3 s:piano ]", + "[ 11/4 → 23/8 | note:A4 s:piano ]", + "[ 23/8 → 3/1 | note:D5 s:piano ]", + "[ 3/1 → 25/8 | note:D4 s:piano ]", + "[ 25/8 → 13/4 | note:A4 s:piano ]", + "[ 13/4 → 27/8 | note:A3 s:piano ]", + "[ 27/8 → 7/2 | note:A4 s:piano ]", + "[ 7/2 → 29/8 | note:A3 s:piano ]", + "[ 29/8 → 15/4 | note:D5 s:piano ]", + "[ 15/4 → 31/8 | note:D3 s:piano ]", + "[ 31/8 → 4/1 | note:D3 s:piano ]", ] `; @@ -8694,46 +8695,46 @@ exports[`runs examples > example "scope" example index 0 1`] = ` exports[`runs examples > example "scramble" example index 0 1`] = ` [ - "[ 0/1 → 1/4 | note:c s:piano ]", - "[ 1/4 → 1/2 | note:d s:piano ]", + "[ 0/1 → 1/4 | note:d s:piano ]", + "[ 1/4 → 1/2 | note:e s:piano ]", "[ 1/2 → 3/4 | note:d s:piano ]", - "[ 3/4 → 1/1 | note:c s:piano ]", - "[ 1/1 → 5/4 | note:e s:piano ]", + "[ 3/4 → 1/1 | note:e s:piano ]", + "[ 1/1 → 5/4 | note:c s:piano ]", "[ 5/4 → 3/2 | note:e s:piano ]", - "[ 3/2 → 7/4 | note:e s:piano ]", - "[ 7/4 → 2/1 | note:c s:piano ]", - "[ 2/1 → 9/4 | note:f s:piano ]", - "[ 9/4 → 5/2 | note:d s:piano ]", + "[ 3/2 → 7/4 | note:c s:piano ]", + "[ 7/4 → 2/1 | note:e s:piano ]", + "[ 2/1 → 9/4 | note:e s:piano ]", + "[ 9/4 → 5/2 | note:e s:piano ]", "[ 5/2 → 11/4 | note:d s:piano ]", "[ 11/4 → 3/1 | note:e s:piano ]", - "[ 3/1 → 13/4 | note:c s:piano ]", - "[ 13/4 → 7/2 | note:f s:piano ]", + "[ 3/1 → 13/4 | note:d s:piano ]", + "[ 13/4 → 7/2 | note:d s:piano ]", "[ 7/2 → 15/4 | note:d s:piano ]", - "[ 15/4 → 4/1 | note:f s:piano ]", + "[ 15/4 → 4/1 | note:c s:piano ]", ] `; exports[`runs examples > example "scramble" example index 1 1`] = ` [ - "[ 0/1 → 1/8 | note:c s:piano ]", - "[ 1/8 → 1/4 | note:d s:piano ]", + "[ 0/1 → 1/8 | note:d s:piano ]", + "[ 1/8 → 1/4 | note:e s:piano ]", "[ 1/4 → 3/8 | note:d s:piano ]", - "[ 3/8 → 1/2 | note:c s:piano ]", + "[ 3/8 → 1/2 | note:e s:piano ]", "[ 1/2 → 1/1 | note:g s:piano ]", - "[ 1/1 → 9/8 | note:e s:piano ]", + "[ 1/1 → 9/8 | note:c s:piano ]", "[ 9/8 → 5/4 | note:e s:piano ]", - "[ 5/4 → 11/8 | note:e s:piano ]", - "[ 11/8 → 3/2 | note:c s:piano ]", + "[ 5/4 → 11/8 | note:c s:piano ]", + "[ 11/8 → 3/2 | note:e s:piano ]", "[ 3/2 → 2/1 | note:g s:piano ]", - "[ 2/1 → 17/8 | note:f s:piano ]", - "[ 17/8 → 9/4 | note:d s:piano ]", + "[ 2/1 → 17/8 | note:e s:piano ]", + "[ 17/8 → 9/4 | note:e s:piano ]", "[ 9/4 → 19/8 | note:d s:piano ]", "[ 19/8 → 5/2 | note:e s:piano ]", "[ 5/2 → 3/1 | note:g s:piano ]", - "[ 3/1 → 25/8 | note:c s:piano ]", - "[ 25/8 → 13/4 | note:f s:piano ]", + "[ 3/1 → 25/8 | note:d s:piano ]", + "[ 25/8 → 13/4 | note:d s:piano ]", "[ 13/4 → 27/8 | note:d s:piano ]", - "[ 27/8 → 7/2 | note:f s:piano ]", + "[ 27/8 → 7/2 | note:c s:piano ]", "[ 7/2 → 4/1 | note:g s:piano ]", ] `; @@ -8967,6 +8968,64 @@ exports[`runs examples > example "seqPLoop" example index 0 1`] = ` ] `; +exports[`runs examples > example "setGainCurve" example index 0 1`] = ` +[ + "[ 0/1 → 1/4 | s:bd gain:0.5 ]", + "[ 1/4 → 1/2 | s:bd gain:0.5 ]", + "[ 1/2 → 3/4 | s:bd gain:0.5 ]", + "[ 3/4 → 1/1 | s:bd gain:0.5 ]", + "[ 1/1 → 5/4 | s:bd gain:0.5 ]", + "[ 5/4 → 3/2 | s:bd gain:0.5 ]", + "[ 3/2 → 7/4 | s:bd gain:0.5 ]", + "[ 7/4 → 2/1 | s:bd gain:0.5 ]", + "[ 2/1 → 9/4 | s:bd gain:0.5 ]", + "[ 9/4 → 5/2 | s:bd gain:0.5 ]", + "[ 5/2 → 11/4 | s:bd gain:0.5 ]", + "[ 11/4 → 3/1 | s:bd gain:0.5 ]", + "[ 3/1 → 13/4 | s:bd gain:0.5 ]", + "[ 13/4 → 7/2 | s:bd gain:0.5 ]", + "[ 7/2 → 15/4 | s:bd gain:0.5 ]", + "[ 15/4 → 4/1 | s:bd gain:0.5 ]", +] +`; + +exports[`runs examples > example "setMaxPolyphony" example index 0 1`] = ` +[ + "[ 0/1 → 1/8 | note:F#4 room:1 release:4 gain:0.5 ]", + "[ 1/8 → 1/4 | note:A5 room:1 release:4 gain:0.5 ]", + "[ 1/4 → 3/8 | note:C#5 room:1 release:4 gain:0.5 ]", + "[ 3/8 → 1/2 | note:A4 room:1 release:4 gain:0.5 ]", + "[ 1/2 → 5/8 | note:E4 room:1 release:4 gain:0.5 ]", + "[ 5/8 → 3/4 | note:C#6 room:1 release:4 gain:0.5 ]", + "[ 3/4 → 7/8 | note:D#5 room:1 release:4 gain:0.5 ]", + "[ 7/8 → 1/1 | note:C#6 room:1 release:4 gain:0.5 ]", + "[ 1/1 → 9/8 | note:C#3 room:1 release:4 gain:0.5 ]", + "[ 9/8 → 5/4 | note:A5 room:1 release:4 gain:0.5 ]", + "[ 5/4 → 11/8 | note:E5 room:1 release:4 gain:0.5 ]", + "[ 11/8 → 3/2 | note:B5 room:1 release:4 gain:0.5 ]", + "[ 3/2 → 13/8 | note:A3 room:1 release:4 gain:0.5 ]", + "[ 13/8 → 7/4 | note:B3 room:1 release:4 gain:0.5 ]", + "[ 7/4 → 15/8 | note:F#5 room:1 release:4 gain:0.5 ]", + "[ 15/8 → 2/1 | note:G#5 room:1 release:4 gain:0.5 ]", + "[ 2/1 → 17/8 | note:A4 room:1 release:4 gain:0.5 ]", + "[ 17/8 → 9/4 | note:G#5 room:1 release:4 gain:0.5 ]", + "[ 9/4 → 19/8 | note:D#5 room:1 release:4 gain:0.5 ]", + "[ 19/8 → 5/2 | note:E5 room:1 release:4 gain:0.5 ]", + "[ 5/2 → 21/8 | note:D#4 room:1 release:4 gain:0.5 ]", + "[ 21/8 → 11/4 | note:C#3 room:1 release:4 gain:0.5 ]", + "[ 11/4 → 23/8 | note:E5 room:1 release:4 gain:0.5 ]", + "[ 23/8 → 3/1 | note:C#6 room:1 release:4 gain:0.5 ]", + "[ 3/1 → 25/8 | note:F#4 room:1 release:4 gain:0.5 ]", + "[ 25/8 → 13/4 | note:E5 room:1 release:4 gain:0.5 ]", + "[ 13/4 → 27/8 | note:C#4 room:1 release:4 gain:0.5 ]", + "[ 27/8 → 7/2 | note:E5 room:1 release:4 gain:0.5 ]", + "[ 7/2 → 29/8 | note:B3 room:1 release:4 gain:0.5 ]", + "[ 29/8 → 15/4 | note:C#6 room:1 release:4 gain:0.5 ]", + "[ 15/4 → 31/8 | note:D#3 room:1 release:4 gain:0.5 ]", + "[ 31/8 → 4/1 | note:C#3 room:1 release:4 gain:0.5 ]", +] +`; + exports[`runs examples > example "setcpm" example index 0 1`] = ` [ "[ 0/1 → 1/4 | s:bd bank:tr707 ]", @@ -9200,45 +9259,45 @@ exports[`runs examples > example "shrink" example index 3 1`] = ` exports[`runs examples > example "shuffle" example index 0 1`] = ` [ "[ 0/1 → 1/4 | note:e s:piano ]", - "[ 1/4 → 1/2 | note:d s:piano ]", + "[ 1/4 → 1/2 | note:c s:piano ]", "[ 1/2 → 3/4 | note:f s:piano ]", - "[ 3/4 → 1/1 | note:c s:piano ]", - "[ 1/1 → 5/4 | note:e s:piano ]", + "[ 3/4 → 1/1 | note:d s:piano ]", + "[ 1/1 → 5/4 | note:f s:piano ]", "[ 5/4 → 3/2 | note:c s:piano ]", - "[ 3/2 → 7/4 | note:f s:piano ]", + "[ 3/2 → 7/4 | note:e s:piano ]", "[ 7/4 → 2/1 | note:d s:piano ]", - "[ 2/1 → 9/4 | note:d s:piano ]", - "[ 9/4 → 5/2 | note:c s:piano ]", - "[ 5/2 → 11/4 | note:e s:piano ]", - "[ 11/4 → 3/1 | note:f s:piano ]", + "[ 2/1 → 9/4 | note:c s:piano ]", + "[ 9/4 → 5/2 | note:f s:piano ]", + "[ 5/2 → 11/4 | note:d s:piano ]", + "[ 11/4 → 3/1 | note:e s:piano ]", "[ 3/1 → 13/4 | note:c s:piano ]", - "[ 13/4 → 7/2 | note:e s:piano ]", + "[ 13/4 → 7/2 | note:d s:piano ]", "[ 7/2 → 15/4 | note:f s:piano ]", - "[ 15/4 → 4/1 | note:d s:piano ]", + "[ 15/4 → 4/1 | note:e s:piano ]", ] `; exports[`runs examples > example "shuffle" example index 1 1`] = ` [ "[ 0/1 → 1/8 | note:e s:piano ]", - "[ 1/8 → 1/4 | note:d s:piano ]", + "[ 1/8 → 1/4 | note:c s:piano ]", "[ 1/4 → 3/8 | note:f s:piano ]", - "[ 3/8 → 1/2 | note:c s:piano ]", + "[ 3/8 → 1/2 | note:d s:piano ]", "[ 1/2 → 1/1 | note:g s:piano ]", - "[ 1/1 → 9/8 | note:e s:piano ]", + "[ 1/1 → 9/8 | note:f s:piano ]", "[ 9/8 → 5/4 | note:c s:piano ]", - "[ 5/4 → 11/8 | note:f s:piano ]", + "[ 5/4 → 11/8 | note:e s:piano ]", "[ 11/8 → 3/2 | note:d s:piano ]", "[ 3/2 → 2/1 | note:g s:piano ]", - "[ 2/1 → 17/8 | note:d s:piano ]", - "[ 17/8 → 9/4 | note:c s:piano ]", - "[ 9/4 → 19/8 | note:e s:piano ]", - "[ 19/8 → 5/2 | note:f s:piano ]", + "[ 2/1 → 17/8 | note:c s:piano ]", + "[ 17/8 → 9/4 | note:f s:piano ]", + "[ 9/4 → 19/8 | note:d s:piano ]", + "[ 19/8 → 5/2 | note:e s:piano ]", "[ 5/2 → 3/1 | note:g s:piano ]", "[ 3/1 → 25/8 | note:c s:piano ]", - "[ 25/8 → 13/4 | note:e s:piano ]", + "[ 25/8 → 13/4 | note:d s:piano ]", "[ 13/4 → 27/8 | note:f s:piano ]", - "[ 27/8 → 7/2 | note:d s:piano ]", + "[ 27/8 → 7/2 | note:e s:piano ]", "[ 7/2 → 4/1 | note:g s:piano ]", ] `; @@ -9425,15 +9484,15 @@ exports[`runs examples > example "someCycles" example index 0 1`] = ` "[ 5/8 → 3/4 | s:hh speed:0.5 ]", "[ 3/4 → 7/8 | s:hh speed:0.5 ]", "[ 7/8 → 1/1 | s:hh speed:0.5 ]", - "[ 1/1 → 9/8 | s:hh ]", - "[ 1/1 → 2/1 | s:bd ]", - "[ 9/8 → 5/4 | s:hh ]", - "[ 5/4 → 11/8 | s:hh ]", - "[ 11/8 → 3/2 | s:hh ]", - "[ 3/2 → 13/8 | s:hh ]", - "[ 13/8 → 7/4 | s:hh ]", - "[ 7/4 → 15/8 | s:hh ]", - "[ 15/8 → 2/1 | s:hh ]", + "[ 1/1 → 9/8 | s:hh speed:0.5 ]", + "[ 1/1 → 2/1 | s:bd speed:0.5 ]", + "[ 9/8 → 5/4 | s:hh speed:0.5 ]", + "[ 5/4 → 11/8 | s:hh speed:0.5 ]", + "[ 11/8 → 3/2 | s:hh speed:0.5 ]", + "[ 3/2 → 13/8 | s:hh speed:0.5 ]", + "[ 13/8 → 7/4 | s:hh speed:0.5 ]", + "[ 7/4 → 15/8 | s:hh speed:0.5 ]", + "[ 15/8 → 2/1 | s:hh speed:0.5 ]", "[ 2/1 → 17/8 | s:hh ]", "[ 2/1 → 3/1 | s:bd ]", "[ 17/8 → 9/4 | s:hh ]", @@ -9457,24 +9516,24 @@ exports[`runs examples > example "someCycles" example index 0 1`] = ` exports[`runs examples > example "someCyclesBy" example index 0 1`] = ` [ - "[ 0/1 → 1/8 | s:hh speed:0.5 ]", - "[ 0/1 → 1/1 | s:bd speed:0.5 ]", - "[ 1/8 → 1/4 | s:hh speed:0.5 ]", - "[ 1/4 → 3/8 | s:hh speed:0.5 ]", - "[ 3/8 → 1/2 | s:hh speed:0.5 ]", - "[ 1/2 → 5/8 | s:hh speed:0.5 ]", - "[ 5/8 → 3/4 | s:hh speed:0.5 ]", - "[ 3/4 → 7/8 | s:hh speed:0.5 ]", - "[ 7/8 → 1/1 | s:hh speed:0.5 ]", - "[ 1/1 → 9/8 | s:hh ]", - "[ 1/1 → 2/1 | s:bd ]", - "[ 9/8 → 5/4 | s:hh ]", - "[ 5/4 → 11/8 | s:hh ]", - "[ 11/8 → 3/2 | s:hh ]", - "[ 3/2 → 13/8 | s:hh ]", - "[ 13/8 → 7/4 | s:hh ]", - "[ 7/4 → 15/8 | s:hh ]", - "[ 15/8 → 2/1 | s:hh ]", + "[ 0/1 → 1/8 | s:hh ]", + "[ 0/1 → 1/1 | s:bd ]", + "[ 1/8 → 1/4 | s:hh ]", + "[ 1/4 → 3/8 | s:hh ]", + "[ 3/8 → 1/2 | s:hh ]", + "[ 1/2 → 5/8 | s:hh ]", + "[ 5/8 → 3/4 | s:hh ]", + "[ 3/4 → 7/8 | s:hh ]", + "[ 7/8 → 1/1 | s:hh ]", + "[ 1/1 → 9/8 | s:hh speed:0.5 ]", + "[ 1/1 → 2/1 | s:bd speed:0.5 ]", + "[ 9/8 → 5/4 | s:hh speed:0.5 ]", + "[ 5/4 → 11/8 | s:hh speed:0.5 ]", + "[ 11/8 → 3/2 | s:hh speed:0.5 ]", + "[ 3/2 → 13/8 | s:hh speed:0.5 ]", + "[ 13/8 → 7/4 | s:hh speed:0.5 ]", + "[ 7/4 → 15/8 | s:hh speed:0.5 ]", + "[ 15/8 → 2/1 | s:hh speed:0.5 ]", "[ 2/1 → 17/8 | s:hh ]", "[ 2/1 → 3/1 | s:bd ]", "[ 17/8 → 9/4 | s:hh ]", @@ -9484,15 +9543,15 @@ exports[`runs examples > example "someCyclesBy" example index 0 1`] = ` "[ 21/8 → 11/4 | s:hh ]", "[ 11/4 → 23/8 | s:hh ]", "[ 23/8 → 3/1 | s:hh ]", - "[ 3/1 → 25/8 | s:hh speed:0.5 ]", - "[ 3/1 → 4/1 | s:bd speed:0.5 ]", - "[ 25/8 → 13/4 | s:hh speed:0.5 ]", - "[ 13/4 → 27/8 | s:hh speed:0.5 ]", - "[ 27/8 → 7/2 | s:hh speed:0.5 ]", - "[ 7/2 → 29/8 | s:hh speed:0.5 ]", - "[ 29/8 → 15/4 | s:hh speed:0.5 ]", - "[ 15/4 → 31/8 | s:hh speed:0.5 ]", - "[ 31/8 → 4/1 | s:hh speed:0.5 ]", + "[ 3/1 → 25/8 | s:hh ]", + "[ 3/1 → 4/1 | s:bd ]", + "[ 25/8 → 13/4 | s:hh ]", + "[ 13/4 → 27/8 | s:hh ]", + "[ 27/8 → 7/2 | s:hh ]", + "[ 7/2 → 29/8 | s:hh ]", + "[ 29/8 → 15/4 | s:hh ]", + "[ 15/4 → 31/8 | s:hh ]", + "[ 31/8 → 4/1 | s:hh ]", ] `; @@ -9500,73 +9559,73 @@ exports[`runs examples > example "sometimes" example index 0 1`] = ` [ "[ 0/1 → 1/8 | s:hh speed:0.5 ]", "[ 1/8 → 1/4 | s:hh ]", - "[ 1/4 → 3/8 | s:hh speed:0.5 ]", - "[ 3/8 → 1/2 | s:hh speed:0.5 ]", + "[ 1/4 → 3/8 | s:hh ]", + "[ 3/8 → 1/2 | s:hh ]", "[ 1/2 → 5/8 | s:hh speed:0.5 ]", - "[ 5/8 → 3/4 | s:hh speed:0.5 ]", - "[ 3/4 → 7/8 | s:hh speed:0.5 ]", - "[ 7/8 → 1/1 | s:hh speed:0.5 ]", - "[ 1/1 → 9/8 | s:hh ]", + "[ 5/8 → 3/4 | s:hh ]", + "[ 3/4 → 7/8 | s:hh ]", + "[ 7/8 → 1/1 | s:hh ]", + "[ 1/1 → 9/8 | s:hh speed:0.5 ]", "[ 9/8 → 5/4 | s:hh ]", "[ 5/4 → 11/8 | s:hh ]", - "[ 11/8 → 3/2 | s:hh speed:0.5 ]", - "[ 3/2 → 13/8 | s:hh ]", + "[ 11/8 → 3/2 | s:hh ]", + "[ 3/2 → 13/8 | s:hh speed:0.5 ]", "[ 13/8 → 7/4 | s:hh speed:0.5 ]", - "[ 7/4 → 15/8 | s:hh speed:0.5 ]", + "[ 7/4 → 15/8 | s:hh ]", "[ 15/8 → 2/1 | s:hh ]", "[ 2/1 → 17/8 | s:hh ]", "[ 17/8 → 9/4 | s:hh ]", - "[ 9/4 → 19/8 | s:hh speed:0.5 ]", + "[ 9/4 → 19/8 | s:hh ]", "[ 19/8 → 5/2 | s:hh ]", "[ 5/2 → 21/8 | s:hh speed:0.5 ]", "[ 21/8 → 11/4 | s:hh speed:0.5 ]", "[ 11/4 → 23/8 | s:hh ]", - "[ 23/8 → 3/1 | s:hh speed:0.5 ]", + "[ 23/8 → 3/1 | s:hh ]", "[ 3/1 → 25/8 | s:hh speed:0.5 ]", - "[ 25/8 → 13/4 | s:hh speed:0.5 ]", - "[ 13/4 → 27/8 | s:hh ]", - "[ 27/8 → 7/2 | s:hh speed:0.5 ]", + "[ 25/8 → 13/4 | s:hh ]", + "[ 13/4 → 27/8 | s:hh speed:0.5 ]", + "[ 27/8 → 7/2 | s:hh ]", "[ 7/2 → 29/8 | s:hh speed:0.5 ]", "[ 29/8 → 15/4 | s:hh ]", - "[ 15/4 → 31/8 | s:hh ]", - "[ 31/8 → 4/1 | s:hh ]", + "[ 15/4 → 31/8 | s:hh speed:0.5 ]", + "[ 31/8 → 4/1 | s:hh speed:0.5 ]", ] `; exports[`runs examples > example "sometimesBy" example index 0 1`] = ` [ - "[ 0/1 → 1/8 | s:hh speed:0.5 ]", + "[ 0/1 → 1/8 | s:hh ]", "[ 1/8 → 1/4 | s:hh ]", - "[ 1/4 → 3/8 | s:hh speed:0.5 ]", + "[ 1/4 → 3/8 | s:hh ]", "[ 3/8 → 1/2 | s:hh ]", - "[ 1/2 → 5/8 | s:hh speed:0.5 ]", - "[ 5/8 → 3/4 | s:hh speed:0.5 ]", - "[ 3/4 → 7/8 | s:hh speed:0.5 ]", - "[ 7/8 → 1/1 | s:hh speed:0.5 ]", - "[ 1/1 → 9/8 | s:hh ]", + "[ 1/2 → 5/8 | s:hh ]", + "[ 5/8 → 3/4 | s:hh ]", + "[ 3/4 → 7/8 | s:hh ]", + "[ 7/8 → 1/1 | s:hh ]", + "[ 1/1 → 9/8 | s:hh speed:0.5 ]", "[ 9/8 → 5/4 | s:hh ]", "[ 5/4 → 11/8 | s:hh ]", - "[ 11/8 → 3/2 | s:hh speed:0.5 ]", - "[ 3/2 → 13/8 | s:hh ]", - "[ 13/8 → 7/4 | s:hh ]", - "[ 7/4 → 15/8 | s:hh speed:0.5 ]", + "[ 11/8 → 3/2 | s:hh ]", + "[ 3/2 → 13/8 | s:hh speed:0.5 ]", + "[ 13/8 → 7/4 | s:hh speed:0.5 ]", + "[ 7/4 → 15/8 | s:hh ]", "[ 15/8 → 2/1 | s:hh ]", "[ 2/1 → 17/8 | s:hh ]", "[ 17/8 → 9/4 | s:hh ]", - "[ 9/4 → 19/8 | s:hh speed:0.5 ]", + "[ 9/4 → 19/8 | s:hh ]", "[ 19/8 → 5/2 | s:hh ]", - "[ 5/2 → 21/8 | s:hh ]", + "[ 5/2 → 21/8 | s:hh speed:0.5 ]", "[ 21/8 → 11/4 | s:hh speed:0.5 ]", "[ 11/4 → 23/8 | s:hh ]", - "[ 23/8 → 3/1 | s:hh speed:0.5 ]", - "[ 3/1 → 25/8 | s:hh speed:0.5 ]", - "[ 25/8 → 13/4 | s:hh speed:0.5 ]", - "[ 13/4 → 27/8 | s:hh ]", + "[ 23/8 → 3/1 | s:hh ]", + "[ 3/1 → 25/8 | s:hh ]", + "[ 25/8 → 13/4 | s:hh ]", + "[ 13/4 → 27/8 | s:hh speed:0.5 ]", "[ 27/8 → 7/2 | s:hh ]", - "[ 7/2 → 29/8 | s:hh ]", + "[ 7/2 → 29/8 | s:hh speed:0.5 ]", "[ 29/8 → 15/4 | s:hh ]", - "[ 15/4 → 31/8 | s:hh ]", - "[ 31/8 → 4/1 | s:hh ]", + "[ 15/4 → 31/8 | s:hh speed:0.5 ]", + "[ 31/8 → 4/1 | s:hh speed:0.5 ]", ] `; @@ -10950,23 +11009,17 @@ exports[`runs examples > example "tri" example index 0 1`] = ` exports[`runs examples > example "undegrade" example index 0 1`] = ` [ "[ 0/1 → 1/8 | s:hh ]", - "[ 1/4 → 3/8 | s:hh ]", - "[ 3/8 → 1/2 | s:hh ]", "[ 1/2 → 5/8 | s:hh ]", - "[ 5/8 → 3/4 | s:hh ]", - "[ 3/4 → 7/8 | s:hh ]", - "[ 7/8 → 1/1 | s:hh ]", - "[ 11/8 → 3/2 | s:hh ]", + "[ 1/1 → 9/8 | s:hh ]", + "[ 3/2 → 13/8 | s:hh ]", "[ 13/8 → 7/4 | s:hh ]", - "[ 7/4 → 15/8 | s:hh ]", - "[ 9/4 → 19/8 | s:hh ]", "[ 5/2 → 21/8 | s:hh ]", "[ 21/8 → 11/4 | s:hh ]", - "[ 23/8 → 3/1 | s:hh ]", "[ 3/1 → 25/8 | s:hh ]", - "[ 25/8 → 13/4 | s:hh ]", - "[ 27/8 → 7/2 | s:hh ]", + "[ 13/4 → 27/8 | s:hh ]", "[ 7/2 → 29/8 | s:hh ]", + "[ 15/4 → 31/8 | s:hh ]", + "[ 31/8 → 4/1 | s:hh ]", ] `; @@ -10974,82 +11027,81 @@ exports[`runs examples > example "undegrade" example index 1 1`] = ` [ "[ 0/1 → 1/10 | s:hh pan:1 ]", "[ 1/10 → 1/5 | s:hh pan:1 ]", - "[ 1/5 → 3/10 | s:hh pan:0 ]", + "[ 1/5 → 3/10 | s:hh pan:1 ]", "[ 3/10 → 2/5 | s:hh pan:0 ]", - "[ 2/5 → 1/2 | s:hh pan:0 ]", + "[ 2/5 → 1/2 | s:hh pan:1 ]", "[ 1/2 → 3/5 | s:hh pan:1 ]", "[ 3/5 → 7/10 | s:hh pan:0 ]", "[ 7/10 → 4/5 | s:hh pan:0 ]", - "[ 4/5 → 9/10 | s:hh pan:1 ]", - "[ 9/10 → 1/1 | s:hh pan:0 ]", - "[ 1/1 → 11/10 | s:hh pan:0 ]", + "[ 4/5 → 9/10 | s:hh pan:0 ]", + "[ 9/10 → 1/1 | s:hh pan:1 ]", + "[ 1/1 → 11/10 | s:hh pan:1 ]", "[ 11/10 → 6/5 | s:hh pan:0 ]", - "[ 6/5 → 13/10 | s:hh pan:1 ]", + "[ 6/5 → 13/10 | s:hh pan:0 ]", "[ 13/10 → 7/5 | s:hh pan:1 ]", "[ 7/5 → 3/2 | s:hh pan:1 ]", - "[ 3/2 → 8/5 | s:hh pan:0 ]", - "[ 8/5 → 17/10 | s:hh pan:1 ]", - "[ 17/10 → 9/5 | s:hh pan:1 ]", + "[ 3/2 → 8/5 | s:hh pan:1 ]", + "[ 8/5 → 17/10 | s:hh pan:0 ]", + "[ 17/10 → 9/5 | s:hh pan:0 ]", "[ 9/5 → 19/10 | s:hh pan:1 ]", "[ 19/10 → 2/1 | s:hh pan:1 ]", "[ 2/1 → 21/10 | s:hh pan:0 ]", "[ 21/10 → 11/5 | s:hh pan:1 ]", "[ 11/5 → 23/10 | s:hh pan:0 ]", - "[ 23/10 → 12/5 | s:hh pan:0 ]", - "[ 12/5 → 5/2 | s:hh pan:0 ]", + "[ 23/10 → 12/5 | s:hh pan:1 ]", + "[ 12/5 → 5/2 | s:hh pan:1 ]", "[ 5/2 → 13/5 | s:hh pan:1 ]", - "[ 13/5 → 27/10 | s:hh pan:1 ]", + "[ 13/5 → 27/10 | s:hh pan:0 ]", "[ 27/10 → 14/5 | s:hh pan:1 ]", - "[ 14/5 → 29/10 | s:hh pan:0 ]", + "[ 14/5 → 29/10 | s:hh pan:1 ]", "[ 29/10 → 3/1 | s:hh pan:1 ]", "[ 3/1 → 31/10 | s:hh pan:1 ]", - "[ 31/10 → 16/5 | s:hh pan:1 ]", + "[ 31/10 → 16/5 | s:hh pan:0 ]", "[ 16/5 → 33/10 | s:hh pan:1 ]", "[ 33/10 → 17/5 | s:hh pan:0 ]", "[ 17/5 → 7/2 | s:hh pan:0 ]", "[ 7/2 → 18/5 | s:hh pan:1 ]", "[ 18/5 → 37/10 | s:hh pan:0 ]", - "[ 37/10 → 19/5 | s:hh pan:0 ]", - "[ 19/5 → 39/10 | s:hh pan:1 ]", - "[ 39/10 → 4/1 | s:hh pan:1 ]", + "[ 37/10 → 19/5 | s:hh pan:1 ]", + "[ 19/5 → 39/10 | s:hh pan:0 ]", + "[ 39/10 → 4/1 | s:hh pan:0 ]", ] `; exports[`runs examples > example "undegradeBy" example index 0 1`] = ` [ "[ 0/1 → 1/8 | s:hh ]", - "[ 1/8 → 1/4 | s:hh ]", "[ 1/4 → 3/8 | s:hh ]", "[ 3/8 → 1/2 | s:hh ]", "[ 1/2 → 5/8 | s:hh ]", - "[ 5/8 → 3/4 | s:hh ]", "[ 3/4 → 7/8 | s:hh ]", - "[ 7/8 → 1/1 | s:hh ]", "[ 1/1 → 9/8 | s:hh ]", - "[ 9/8 → 5/4 | s:hh ]", "[ 5/4 → 11/8 | s:hh ]", - "[ 11/8 → 3/2 | s:hh ]", "[ 3/2 → 13/8 | s:hh ]", "[ 13/8 → 7/4 | s:hh ]", "[ 7/4 → 15/8 | s:hh ]", "[ 15/8 → 2/1 | s:hh ]", + "[ 2/1 → 17/8 | s:hh ]", + "[ 17/8 → 9/4 | s:hh ]", "[ 9/4 → 19/8 | s:hh ]", + "[ 19/8 → 5/2 | s:hh ]", "[ 5/2 → 21/8 | s:hh ]", "[ 21/8 → 11/4 | s:hh ]", "[ 11/4 → 23/8 | s:hh ]", - "[ 23/8 → 3/1 | s:hh ]", "[ 3/1 → 25/8 | s:hh ]", "[ 25/8 → 13/4 | s:hh ]", + "[ 13/4 → 27/8 | s:hh ]", "[ 27/8 → 7/2 | s:hh ]", "[ 7/2 → 29/8 | s:hh ]", + "[ 15/4 → 31/8 | s:hh ]", "[ 31/8 → 4/1 | s:hh ]", ] `; exports[`runs examples > example "undegradeBy" example index 1 1`] = ` [ - "[ 0/1 → 1/10 | s:hh pan:1 ]", - "[ 1/10 → 1/5 | s:hh pan:1 ]", + "[ 0/1 → 1/10 | s:hh pan:0 ]", + "[ 1/10 → 1/5 | s:hh pan:0 ]", "[ 1/5 → 3/10 | s:hh pan:0 ]", "[ 3/10 → 2/5 | s:hh pan:0 ]", "[ 2/5 → 1/2 | s:hh pan:0 ]", @@ -11058,35 +11110,35 @@ exports[`runs examples > example "undegradeBy" example index 1 1`] = ` "[ 7/10 → 4/5 | s:hh pan:0 ]", "[ 4/5 → 9/10 | s:hh pan:0 ]", "[ 9/10 → 1/1 | s:hh pan:0 ]", - "[ 1/1 → 11/10 | s:hh pan:0 ]", + "[ 1/1 → 11/10 | s:hh pan:1 ]", "[ 11/10 → 6/5 | s:hh pan:0 ]", "[ 6/5 → 13/10 | s:hh pan:0 ]", - "[ 13/10 → 7/5 | s:hh pan:0 ]", - "[ 7/5 → 3/2 | s:hh pan:0 ]", + "[ 13/10 → 7/5 | s:hh pan:1 ]", + "[ 7/5 → 3/2 | s:hh pan:1 ]", "[ 3/2 → 8/5 | s:hh pan:0 ]", "[ 8/5 → 17/10 | s:hh pan:0 ]", "[ 17/10 → 9/5 | s:hh pan:0 ]", "[ 9/5 → 19/10 | s:hh pan:0 ]", "[ 19/10 → 2/1 | s:hh pan:1 ]", "[ 2/1 → 21/10 | s:hh pan:0 ]", - "[ 21/10 → 11/5 | s:hh pan:0 ]", + "[ 21/10 → 11/5 | s:hh pan:1 ]", "[ 11/5 → 23/10 | s:hh pan:0 ]", - "[ 23/10 → 12/5 | s:hh pan:0 ]", + "[ 23/10 → 12/5 | s:hh pan:1 ]", "[ 12/5 → 5/2 | s:hh pan:0 ]", "[ 5/2 → 13/5 | s:hh pan:0 ]", "[ 13/5 → 27/10 | s:hh pan:0 ]", - "[ 27/10 → 14/5 | s:hh pan:0 ]", - "[ 14/5 → 29/10 | s:hh pan:0 ]", + "[ 27/10 → 14/5 | s:hh pan:1 ]", + "[ 14/5 → 29/10 | s:hh pan:1 ]", "[ 29/10 → 3/1 | s:hh pan:0 ]", "[ 3/1 → 31/10 | s:hh pan:0 ]", - "[ 31/10 → 16/5 | s:hh pan:1 ]", + "[ 31/10 → 16/5 | s:hh pan:0 ]", "[ 16/5 → 33/10 | s:hh pan:1 ]", "[ 33/10 → 17/5 | s:hh pan:0 ]", "[ 17/5 → 7/2 | s:hh pan:0 ]", "[ 7/2 → 18/5 | s:hh pan:0 ]", "[ 18/5 → 37/10 | s:hh pan:0 ]", - "[ 37/10 → 19/5 | s:hh pan:0 ]", - "[ 19/5 → 39/10 | s:hh pan:1 ]", + "[ 37/10 → 19/5 | s:hh pan:1 ]", + "[ 19/5 → 39/10 | s:hh pan:0 ]", "[ 39/10 → 4/1 | s:hh pan:0 ]", ] `; @@ -11165,6 +11217,75 @@ exports[`runs examples > example "unit" example index 0 1`] = ` ] `; +exports[`runs examples > example "useOldRandom" example index 0 1`] = ` +[ + "[ 0/1 → 1/16 | note:D8 ]", + "[ 1/16 → 1/8 | note:Bb7 ]", + "[ 1/8 → 3/16 | note:Ab6 ]", + "[ 3/16 → 1/4 | note:D5 ]", + "[ 1/4 → 5/16 | note:Ab9 ]", + "[ 5/16 → 3/8 | note:D3 ]", + "[ 3/8 → 7/16 | note:G5 ]", + "[ 7/16 → 1/2 | note:G3 ]", + "[ 1/2 → 9/16 | note:Ab3 ]", + "[ 9/16 → 5/8 | note:Eb6 ]", + "[ 5/8 → 11/16 | note:Eb6 ]", + "[ 11/16 → 3/4 | note:Eb5 ]", + "[ 3/4 → 13/16 | note:G7 ]", + "[ 13/16 → 7/8 | note:Bb5 ]", + "[ 7/8 → 15/16 | note:D3 ]", + "[ 15/16 → 1/1 | note:Eb7 ]", + "[ 1/1 → 17/16 | note:Eb9 ]", + "[ 17/16 → 9/8 | note:G8 ]", + "[ 9/8 → 19/16 | note:Ab3 ]", + "[ 19/16 → 5/4 | note:Ab5 ]", + "[ 5/4 → 21/16 | note:C10 ]", + "[ 21/16 → 11/8 | note:C7 ]", + "[ 11/8 → 23/16 | note:G5 ]", + "[ 23/16 → 3/2 | note:Ab7 ]", + "[ 3/2 → 25/16 | note:G6 ]", + "[ 25/16 → 13/8 | note:Bb6 ]", + "[ 13/8 → 27/16 | note:Eb9 ]", + "[ 27/16 → 7/4 | note:G9 ]", + "[ 7/4 → 29/16 | note:G7 ]", + "[ 29/16 → 15/8 | note:C10 ]", + "[ 15/8 → 31/16 | note:Eb3 ]", + "[ 31/16 → 2/1 | note:Ab7 ]", + "[ 2/1 → 33/16 | note:F6 ]", + "[ 33/16 → 17/8 | note:C5 ]", + "[ 17/8 → 35/16 | note:Ab4 ]", + "[ 35/16 → 9/4 | note:G5 ]", + "[ 9/4 → 37/16 | note:C9 ]", + "[ 37/16 → 19/8 | note:Eb6 ]", + "[ 19/8 → 39/16 | note:C9 ]", + "[ 39/16 → 5/2 | note:Eb9 ]", + "[ 5/2 → 41/16 | note:D5 ]", + "[ 41/16 → 21/8 | note:F5 ]", + "[ 21/8 → 43/16 | note:F9 ]", + "[ 43/16 → 11/4 | note:Bb7 ]", + "[ 11/4 → 45/16 | note:Ab6 ]", + "[ 45/16 → 23/8 | note:Bb9 ]", + "[ 23/8 → 47/16 | note:C8 ]", + "[ 47/16 → 3/1 | note:Eb5 ]", + "[ 3/1 → 49/16 | note:F3 ]", + "[ 49/16 → 25/8 | note:G4 ]", + "[ 25/8 → 51/16 | note:D7 ]", + "[ 51/16 → 13/4 | note:D4 ]", + "[ 13/4 → 53/16 | note:F8 ]", + "[ 53/16 → 27/8 | note:C7 ]", + "[ 27/8 → 55/16 | note:Ab5 ]", + "[ 55/16 → 7/2 | note:Ab3 ]", + "[ 7/2 → 57/16 | note:F9 ]", + "[ 57/16 → 29/8 | note:D8 ]", + "[ 29/8 → 59/16 | note:F5 ]", + "[ 59/16 → 15/4 | note:Eb9 ]", + "[ 15/4 → 61/16 | note:Bb4 ]", + "[ 61/16 → 31/8 | note:C6 ]", + "[ 31/8 → 63/16 | note:C4 ]", + "[ 63/16 → 4/1 | note:G8 ]", +] +`; + exports[`runs examples > example "velocity" example index 0 1`] = ` [ "[ 0/1 → 1/8 | s:hh gain:0.4 velocity:0.4 ]", @@ -11323,38 +11444,38 @@ exports[`runs examples > example "vowel" example index 0 1`] = ` exports[`runs examples > example "vowel" example index 1 1`] = ` [ - "[ 0/1 → 1/8 | s:bd vowel:a ]", - "[ 1/8 → 1/4 | s:sd vowel:a ]", - "[ 1/4 → 3/8 | s:mt vowel:a ]", - "[ 3/8 → 1/2 | s:ht vowel:a ]", - "[ 1/2 → 5/8 | s:bd vowel:a ]", - "[ 11/16 → 3/4 | s:cp vowel:a ]", - "[ 3/4 → 7/8 | s:ht vowel:a ]", - "[ 7/8 → 1/1 | s:lt vowel:a ]", - "[ 1/1 → 9/8 | s:bd vowel:i ]", - "[ 9/8 → 5/4 | s:sd vowel:i ]", - "[ 5/4 → 11/8 | s:mt vowel:i ]", - "[ 11/8 → 3/2 | s:ht vowel:i ]", - "[ 3/2 → 13/8 | s:bd vowel:i ]", - "[ 27/16 → 7/4 | s:cp vowel:i ]", - "[ 7/4 → 15/8 | s:ht vowel:i ]", - "[ 15/8 → 2/1 | s:lt vowel:i ]", - "[ 2/1 → 17/8 | s:bd vowel:u ]", - "[ 17/8 → 9/4 | s:sd vowel:u ]", - "[ 9/4 → 19/8 | s:mt vowel:u ]", - "[ 19/8 → 5/2 | s:ht vowel:u ]", - "[ 5/2 → 21/8 | s:bd vowel:u ]", - "[ 43/16 → 11/4 | s:cp vowel:u ]", - "[ 11/4 → 23/8 | s:ht vowel:u ]", - "[ 23/8 → 3/1 | s:lt vowel:u ]", - "[ 3/1 → 25/8 | s:bd vowel:e ]", - "[ 25/8 → 13/4 | s:sd vowel:e ]", - "[ 13/4 → 27/8 | s:mt vowel:e ]", - "[ 27/8 → 7/2 | s:ht vowel:e ]", - "[ 7/2 → 29/8 | s:bd vowel:e ]", - "[ 59/16 → 15/4 | s:cp vowel:e ]", - "[ 15/4 → 31/8 | s:ht vowel:e ]", - "[ 31/8 → 4/1 | s:lt vowel:e ]", + "[ 0/1 → 1/8 | s:bd vowel:i ]", + "[ 1/8 → 1/4 | s:sd vowel:i ]", + "[ 1/4 → 3/8 | s:mt vowel:i ]", + "[ 3/8 → 1/2 | s:ht vowel:i ]", + "[ 1/2 → 5/8 | s:bd vowel:i ]", + "[ 11/16 → 3/4 | s:cp vowel:i ]", + "[ 3/4 → 7/8 | s:ht vowel:i ]", + "[ 7/8 → 1/1 | s:lt vowel:i ]", + "[ 1/1 → 9/8 | s:bd vowel:a ]", + "[ 9/8 → 5/4 | s:sd vowel:a ]", + "[ 5/4 → 11/8 | s:mt vowel:a ]", + "[ 11/8 → 3/2 | s:ht vowel:a ]", + "[ 3/2 → 13/8 | s:bd vowel:a ]", + "[ 27/16 → 7/4 | s:cp vowel:a ]", + "[ 7/4 → 15/8 | s:ht vowel:a ]", + "[ 15/8 → 2/1 | s:lt vowel:a ]", + "[ 2/1 → 17/8 | s:bd vowel:i ]", + "[ 17/8 → 9/4 | s:sd vowel:i ]", + "[ 9/4 → 19/8 | s:mt vowel:i ]", + "[ 19/8 → 5/2 | s:ht vowel:i ]", + "[ 5/2 → 21/8 | s:bd vowel:i ]", + "[ 43/16 → 11/4 | s:cp vowel:i ]", + "[ 11/4 → 23/8 | s:ht vowel:i ]", + "[ 23/8 → 3/1 | s:lt vowel:i ]", + "[ 3/1 → 25/8 | s:bd vowel:i ]", + "[ 25/8 → 13/4 | s:sd vowel:i ]", + "[ 13/4 → 27/8 | s:mt vowel:i ]", + "[ 27/8 → 7/2 | s:ht vowel:i ]", + "[ 7/2 → 29/8 | s:bd vowel:i ]", + "[ 59/16 → 15/4 | s:cp vowel:i ]", + "[ 15/4 → 31/8 | s:ht vowel:i ]", + "[ 31/8 → 4/1 | s:lt vowel:i ]", ] `; @@ -11363,21 +11484,21 @@ exports[`runs examples > example "wchoose" example index 0 1`] = ` "[ 0/1 → 1/5 | note:c2 s:sine ]", "[ 1/5 → 2/5 | note:g2 s:sine ]", "[ 2/5 → 3/5 | note:g2 s:sine ]", - "[ 3/5 → 4/5 | note:d2 s:sine ]", - "[ 4/5 → 1/1 | note:f1 s:sine ]", + "[ 3/5 → 4/5 | note:d2 s:bd n:6 ]", + "[ 4/5 → 1/1 | note:f1 s:bd n:6 ]", "[ 1/1 → 6/5 | note:c2 s:sine ]", "[ 6/5 → 7/5 | note:g2 s:sine ]", "[ 7/5 → 8/5 | note:g2 s:sine ]", "[ 8/5 → 9/5 | note:d2 s:sine ]", "[ 9/5 → 2/1 | note:f1 s:sine ]", - "[ 2/1 → 11/5 | note:c2 s:bd n:6 ]", - "[ 11/5 → 12/5 | note:g2 s:sine ]", - "[ 12/5 → 13/5 | note:g2 s:bd n:6 ]", + "[ 2/1 → 11/5 | note:c2 s:sine ]", + "[ 11/5 → 12/5 | note:g2 s:triangle ]", + "[ 12/5 → 13/5 | note:g2 s:sine ]", "[ 13/5 → 14/5 | note:d2 s:sine ]", "[ 14/5 → 3/1 | note:f1 s:sine ]", "[ 3/1 → 16/5 | note:c2 s:sine ]", "[ 16/5 → 17/5 | note:g2 s:sine ]", - "[ 17/5 → 18/5 | note:g2 s:sine ]", + "[ 17/5 → 18/5 | note:g2 s:triangle ]", "[ 18/5 → 19/5 | note:d2 s:sine ]", "[ 19/5 → 4/1 | note:f1 s:sine ]", ] @@ -11387,29 +11508,29 @@ exports[`runs examples > example "wchooseCycles" example index 0 1`] = ` [ "[ 0/1 → 1/8 | s:bd ]", "[ 1/8 → 1/4 | s:bd ]", - "[ 1/4 → 3/8 | s:sd ]", + "[ 1/4 → 3/8 | s:bd ]", "[ 3/8 → 1/2 | s:bd ]", "[ 1/2 → 5/8 | s:bd ]", "[ 5/8 → 3/4 | s:bd ]", - "[ 3/4 → 7/8 | s:bd ]", + "[ 3/4 → 7/8 | s:sd ]", "[ 7/8 → 1/1 | s:bd ]", - "[ 1/1 → 9/8 | s:hh ]", - "[ 9/8 → 5/4 | s:bd ]", + "[ 1/1 → 9/8 | s:bd ]", + "[ 9/8 → 5/4 | s:sd ]", "[ 5/4 → 11/8 | s:bd ]", "[ 11/8 → 3/2 | s:bd ]", "[ 3/2 → 13/8 | s:bd ]", - "[ 13/8 → 7/4 | s:sd ]", - "[ 7/4 → 15/8 | s:bd ]", + "[ 13/8 → 7/4 | s:bd ]", + "[ 7/4 → 15/8 | s:sd ]", "[ 15/8 → 2/1 | s:bd ]", "[ 2/1 → 17/8 | s:bd ]", - "[ 17/8 → 9/4 | s:bd ]", + "[ 17/8 → 9/4 | s:sd ]", "[ 9/4 → 19/8 | s:bd ]", "[ 19/8 → 5/2 | s:bd ]", "[ 5/2 → 21/8 | s:bd ]", "[ 21/8 → 11/4 | s:bd ]", - "[ 11/4 → 23/8 | s:sd ]", + "[ 11/4 → 23/8 | s:bd ]", "[ 23/8 → 3/1 | s:bd ]", - "[ 3/1 → 25/8 | s:bd ]", + "[ 3/1 → 25/8 | s:hh ]", "[ 25/8 → 13/4 | s:bd ]", "[ 13/4 → 27/8 | s:bd ]", "[ 27/8 → 7/2 | s:bd ]", @@ -11428,9 +11549,9 @@ exports[`runs examples > example "wchooseCycles" example index 1 1`] = ` "[ 1/4 → 1/3 | s:bd ]", "[ 1/3 → 5/12 | s:bd ]", "[ 5/12 → 1/2 | s:bd ]", - "[ 1/2 → 7/12 | s:sd ]", - "[ 7/12 → 2/3 | s:sd ]", - "[ 2/3 → 3/4 | s:sd ]", + "[ 1/2 → 7/12 | s:bd ]", + "[ 7/12 → 2/3 | s:bd ]", + "[ 2/3 → 3/4 | s:bd ]", "[ 3/4 → 5/6 | s:bd ]", "[ 5/6 → 11/12 | s:bd ]", "[ 11/12 → 1/1 | s:bd ]", @@ -11440,36 +11561,36 @@ exports[`runs examples > example "wchooseCycles" example index 1 1`] = ` "[ 5/4 → 4/3 | s:bd ]", "[ 4/3 → 17/12 | s:bd ]", "[ 17/12 → 3/2 | s:bd ]", - "[ 3/2 → 19/12 | s:hh ]", - "[ 19/12 → 5/3 | s:hh ]", - "[ 5/3 → 7/4 | s:hh ]", + "[ 3/2 → 19/12 | s:sd ]", + "[ 19/12 → 5/3 | s:sd ]", + "[ 5/3 → 7/4 | s:sd ]", "[ 7/4 → 11/6 | s:bd ]", "[ 11/6 → 23/12 | s:bd ]", "[ 23/12 → 2/1 | s:bd ]", "[ 2/1 → 25/12 | s:hh ]", "[ 25/12 → 13/6 | s:hh ]", "[ 13/6 → 9/4 | s:hh ]", - "[ 9/4 → 7/3 | s:hh ]", - "[ 7/3 → 29/12 | s:hh ]", - "[ 29/12 → 5/2 | s:hh ]", - "[ 5/2 → 31/12 | s:bd ]", - "[ 31/12 → 8/3 | s:bd ]", - "[ 8/3 → 11/4 | s:bd ]", + "[ 9/4 → 7/3 | s:sd ]", + "[ 7/3 → 29/12 | s:sd ]", + "[ 29/12 → 5/2 | s:sd ]", + "[ 5/2 → 31/12 | s:hh ]", + "[ 31/12 → 8/3 | s:hh ]", + "[ 8/3 → 11/4 | s:hh ]", "[ 11/4 → 17/6 | s:bd ]", "[ 17/6 → 35/12 | s:bd ]", "[ 35/12 → 3/1 | s:bd ]", "[ 3/1 → 37/12 | s:bd ]", "[ 37/12 → 19/6 | s:bd ]", "[ 19/6 → 13/4 | s:bd ]", - "[ 13/4 → 10/3 | s:sd ]", - "[ 10/3 → 41/12 | s:sd ]", - "[ 41/12 → 7/2 | s:sd ]", - "[ 7/2 → 43/12 | s:hh ]", - "[ 43/12 → 11/3 | s:hh ]", - "[ 11/3 → 15/4 | s:hh ]", - "[ 15/4 → 23/6 | s:bd ]", - "[ 23/6 → 47/12 | s:bd ]", - "[ 47/12 → 4/1 | s:bd ]", + "[ 13/4 → 10/3 | s:bd ]", + "[ 10/3 → 41/12 | s:bd ]", + "[ 41/12 → 7/2 | s:bd ]", + "[ 7/2 → 43/12 | s:sd ]", + "[ 43/12 → 11/3 | s:sd ]", + "[ 11/3 → 15/4 | s:sd ]", + "[ 15/4 → 23/6 | s:hh ]", + "[ 23/6 → 47/12 | s:hh ]", + "[ 47/12 → 4/1 | s:hh ]", ] `; @@ -11481,9 +11602,9 @@ exports[`runs examples > example "wchooseCycles" example index 2 1`] = ` "[ 1/4 → 1/3 | s:hh ]", "[ 1/3 → 5/12 | s:hh ]", "[ 5/12 → 1/2 | s:hh ]", - "[ 1/2 → 7/12 | s:hh ]", - "[ 7/12 → 2/3 | s:hh ]", - "[ 2/3 → 3/4 | s:hh ]", + "[ 1/2 → 17/32 | s:bd ]", + "[ 19/32 → 5/8 | s:bd ]", + "[ 11/16 → 23/32 | s:bd ]", "[ 3/4 → 5/6 | s:hh ]", "[ 5/6 → 11/12 | s:hh ]", "[ 11/12 → 1/1 | s:hh ]", @@ -11493,9 +11614,9 @@ exports[`runs examples > example "wchooseCycles" example index 2 1`] = ` "[ 5/4 → 4/3 | s:hh ]", "[ 4/3 → 17/12 | s:hh ]", "[ 17/12 → 3/2 | s:hh ]", - "[ 3/2 → 49/32 | s:bd ]", - "[ 51/32 → 13/8 | s:bd ]", - "[ 27/16 → 55/32 | s:bd ]", + "[ 3/2 → 19/12 | s:hh ]", + "[ 19/12 → 5/3 | s:hh ]", + "[ 5/3 → 7/4 | s:hh ]", "[ 7/4 → 11/6 | s:hh ]", "[ 11/6 → 23/12 | s:hh ]", "[ 23/12 → 2/1 | s:hh ]", @@ -11505,9 +11626,9 @@ exports[`runs examples > example "wchooseCycles" example index 2 1`] = ` "[ 9/4 → 7/3 | s:hh ]", "[ 7/3 → 29/12 | s:hh ]", "[ 29/12 → 5/2 | s:hh ]", - "[ 5/2 → 81/32 | s:bd ]", - "[ 83/32 → 21/8 | s:bd ]", - "[ 43/16 → 87/32 | s:bd ]", + "[ 5/2 → 31/12 | s:hh ]", + "[ 31/12 → 8/3 | s:hh ]", + "[ 8/3 → 11/4 | s:hh ]", "[ 11/4 → 17/6 | s:hh ]", "[ 17/6 → 35/12 | s:hh ]", "[ 35/12 → 3/1 | s:hh ]", From b3e433291cb911542f5e3e3b48fb4d42222d5b7d Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 24 Aug 2025 21:15:47 -0500 Subject: [PATCH 07/49] Turn back on silent --- vitest.config.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vitest.config.mjs b/vitest.config.mjs index 392b17310..47f624771 100644 --- a/vitest.config.mjs +++ b/vitest.config.mjs @@ -7,7 +7,7 @@ export default defineConfig({ test: { reporters: 'verbose', isolate: false, - silent: false, + silent: true, exclude: [ '**/node_modules/**', '**/dist/**', From 1be9f40574aa213d3ef501024e5a0e18cb04fef9 Mon Sep 17 00:00:00 2001 From: alex Date: Sat, 18 Oct 2025 10:42:35 +0100 Subject: [PATCH 08/49] timeline feature --- packages/core/impure.mjs | 60 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 packages/core/impure.mjs diff --git a/packages/core/impure.mjs b/packages/core/impure.mjs new file mode 100644 index 000000000..66fc1dd5f --- /dev/null +++ b/packages/core/impure.mjs @@ -0,0 +1,60 @@ +/* +stateful.mjs - File of shame for stateful, impure and otherwise illegal pattern methods +Copyright (C) 2025 Strudel contributors - see +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ + +import { register, reify } from './pattern.mjs'; + +let timelines = {}; + +export const reset_timelines = function () { + timelines = {}; +}; + +export const timeline = register( + 'timeline', + function (tpat, pat) { + tpat = reify(tpat); + const f = function (state) { + let scheduler = !!state.controls._cps; + + const timehaps = tpat.query(state); + const result = []; + for (const timehap of timehaps) { + const tlid = timehap.value; + const ignore = false; + let offset; + if (tlid in timelines) { + offset = timelines[tlid]; + } else { + const timearc = timehap.wholeOrPart(); + if (!scheduler || state.span.begin.lt(timearc.midpoint())) { + offset = timearc.begin; + } else { + // Sync to end of timearc if we first see it over halfway into its + // timespan. Allows 'cuing up' next timeline when live coding. + offset = timearc.end; + } + } + if (scheduler) { + // update state + timelines[tlid] = offset; + const negative = 0 - tlid; + if (negative in timelines) { + delete timelines[negative]; + } + } + + const pathaps = pat + .late(offset) + .query(state.setSpan(timehap.part)) + .map((h) => h.setContext(h.combineContext(timehap))); + result.push(...pathaps); + } + return result; + }; + return new Pattern(f, pat._steps); + }, + false, +); From b2ce4591d9bd4260511bb08a06f791f515452456 Mon Sep 17 00:00:00 2001 From: alex Date: Sat, 18 Oct 2025 10:42:55 +0100 Subject: [PATCH 09/49] sort exports and add impure.mjs --- packages/core/index.mjs | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/packages/core/index.mjs b/packages/core/index.mjs index e4daf445a..9260e3671 100644 --- a/packages/core/index.mjs +++ b/packages/core/index.mjs @@ -1,6 +1,6 @@ /* index.mjs - -Copyright (C) 2022 Strudel contributors - see +Copyright (C) 2025 Strudel contributors - see This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ @@ -11,20 +11,21 @@ import createClock from './zyklus.mjs'; import { logger } from './logger.mjs'; export { Fraction, controls, createClock }; export * from './controls.mjs'; -export * from './hap.mjs'; -export * from './pattern.mjs'; -export * from './signal.mjs'; -export * from './pick.mjs'; -export * from './state.mjs'; -export * from './timespan.mjs'; -export * from './util.mjs'; -export * from './speak.mjs'; -export * from './evaluate.mjs'; -export * from './repl.mjs'; export * from './cyclist.mjs'; +export * from './evaluate.mjs'; +export * from './hap.mjs'; +export * from './impure.mjs'; export * from './logger.mjs'; +export * from './pattern.mjs'; +export * from './pick.mjs'; +export * from './repl.mjs'; +export * from './signal.mjs'; +export * from './speak.mjs'; +export * from './state.mjs'; export * from './time.mjs'; +export * from './timespan.mjs'; export * from './ui.mjs'; +export * from './util.mjs'; export { default as drawLine } from './drawLine.mjs'; // below won't work with runtime.mjs (json import fails) /* import * as p from './package.json'; From 92a82ce4bdf951ae80a34c0e609aa3515951fa6f Mon Sep 17 00:00:00 2001 From: alex Date: Sat, 18 Oct 2025 10:49:15 +0100 Subject: [PATCH 10/49] delint --- packages/core/impure.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/impure.mjs b/packages/core/impure.mjs index 66fc1dd5f..e16cfbe45 100644 --- a/packages/core/impure.mjs +++ b/packages/core/impure.mjs @@ -4,7 +4,7 @@ Copyright (C) 2025 Strudel contributors - see . */ -import { register, reify } from './pattern.mjs'; +import { register, reify, Pattern } from './pattern.mjs'; let timelines = {}; From fb7f686519130ed07fe66f561e6ab46cbc609a27 Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 16 Nov 2025 15:22:34 -0600 Subject: [PATCH 11/49] Add seeding --- packages/core/signal.mjs | 111 +- test/__snapshots__/examples.test.mjs.snap | 1627 +++++++++++---------- 2 files changed, 893 insertions(+), 845 deletions(-) diff --git a/packages/core/signal.mjs b/packages/core/signal.mjs index 492f6a7f0..9f3a264f4 100644 --- a/packages/core/signal.mjs +++ b/packages/core/signal.mjs @@ -16,7 +16,7 @@ export function steady(value) { } export const signal = (func) => { - const query = (state) => [new Hap(undefined, state.span, func(state.span.begin))]; + const query = (state) => [new Hap(undefined, state.span, func(state.span.begin, state.controls))]; return new Pattern(query); }; @@ -191,7 +191,7 @@ export const mouseX = signal(() => _mouseX); // Produce "Avalanche effect" where flipping a single bit of x // results in all output bits flipping with probability 0.5 // See e.g. https://github.com/aappleby/smhasher/blob/0ff96f7835817a27d0487325b6c16033e2992eb5/src/MurmurHash3.cpp#L68-L77 -function _murmurHashFinalizer(x) { +const _murmurHashFinalizer = (x) => { x |= 0; x ^= x >>> 16; x = Math.imul(x, 0x85ebca6b); @@ -199,36 +199,37 @@ function _murmurHashFinalizer(x) { x = Math.imul(x, 0xc2b2ae35); x ^= x >>> 16; return x >>> 0; // unsigned -} +}; // Convert t to a 32 bit integer, preserving temporal resolution down to 1/2^29 -function _tToT(t) { +const _tToT = (t) => { return Math.floor(t * 536870912); -} +}; -// Used to decorrelate nearby T and i prior to hashing -function _decorrelate(T, i = 0) { +// Used to decorrelate nearby T, i, and seed prior to hashing +const _decorrelate = (T, i = 0, seed = 0) => { const lowBits = (T >>> 0) >>> 0; const highBits = Math.floor(T / 4294967296) >>> 0; // 2^32 let key = lowBits ^ Math.imul(highBits ^ 0x85ebca6b, 0xc2b2ae35); key ^= Math.imul(i ^ 0x7f4a7c15, 0x9e3779b9); + key ^= Math.imul(seed ^ 0x165667b1, 0x27d4eb2d); return key >>> 0; -} +}; -function randAt(T, i = 0) { - return _murmurHashFinalizer(_decorrelate(T, i)) / 4294967296; // 2^32 -} +const randAt = (T, i = 0, seed = 0) => { + return _murmurHashFinalizer(_decorrelate(T, i, seed)) / 4294967296; // 2^32 +}; // n samples at time t -function timeToRands(t, n) { +const timeToRands = (t, n, seed = 0) => { const T = _tToT(t); if (n === 1) { - return randAt(T, 0); + return randAt(T, 0, seed); } const out = new Array(n); - for (let i = 0; i < n; i++) out[i] = randAt(T, i); + for (let i = 0; i < n; i++) out[i] = randAt(T, i, seed); return out; -} +}; // Deprecated: Old random signals. Configuration `useOldRandom` may be used for legacy songs @@ -257,8 +258,8 @@ const __timeToRands = (t, n) => __timeToRandsPrime(__timeToIntSeed(t), n); // End old random let useOldRandomBool = false; -const getRandsAtTime = (t, n = 1) => { - return useOldRandomBool ? __timeToRands(t, n) : timeToRands(t, n); +export const getRandsAtTime = (t, n = 1, seed = 0) => { + return useOldRandomBool ? __timeToRands(t + seed, n) : timeToRands(t, n, seed); }; /** @@ -314,9 +315,9 @@ export const binaryN = (n, nBits = 16) => { }; export const randrun = (n) => { - return signal((t) => { + return signal((t, controls) => { // Without adding 0.5, the first cycle is always 0,1,2,3,... - const rands = getRandsAtTime(t.floor().add(0.5), n); + const rands = getRandsAtTime(t.floor().add(0.5), n, controls.randSeed); const nums = rands .map((n, i) => [n, i]) .sort((a, b) => (a[0] > b[0]) - (a[0] < b[0])) @@ -357,6 +358,50 @@ export const scramble = register('scramble', (n, pat) => { return _rearrangeWith(_irand(n)._segment(n), n, pat); }); +/** + * Modify a pattern by applying a function to the `randomSeed` control if present + * + * @param {Function} func Function from seed (or undefined) to seed (or undefined) + * @param {Pattern} pat Pattern to update + * @returns Pattern + */ +function withSeed(func, pat) { + return new Pattern((state) => { + let { randSeed, ...controls } = state.controls; + randSeed = func(randSeed); + return pat.query(state.setControls({ ...controls, randSeed })); + }, pat._steps); +} + +/** + * Change the seed for random signals. Normally, random signals depend on time, + * so two patterns at the same time will have the same random values. Specifying + * a new seed changes the signal output by `rand`. This also affects other functions + * that use randomness, like `shuffle` and `sometimes`. + * + * @name seed + * @param {number} n A new seed. Can be any number. + * @example + * $: s("hh*4").degrade(); + * $: s("bd*4").degrade().seed(1); // Will degrade different events from the hi-hat + */ +export const seed = register('seed', (n, pat) => { + return withSeed((prev) => (prev !== undefined ? randAt(prev, n) * Number.MAX_SAFE_INTEGER : n), pat); +}); + +/** + * Set the seed for random signals. Differs from `seed` in that `seed` can be used + * multiple times with the final signal depending on all seeds. `setSeed` on the + * other hand overwrites the previous calls to `seed`. + * + * @name setSeed + * @param {number} n An arbitrary number to be used as the new seed. 0 is the same + * as the default random behavior. + */ +export const setSeed = register('setSeed', (n, pat) => { + return withSeed(() => n, pat); +}); + /** * A continuous pattern of random numbers, between 0 and 1. * @@ -366,7 +411,7 @@ export const scramble = register('scramble', (n, pat) => { * s("bd*4,hh*8").cutoff(rand.range(500,8000)) * */ -export const rand = signal(getRandsAtTime); +export const rand = signal((t, controls) => getRandsAtTime(t, 1, controls.randSeed)); /** * A continuous pattern of random numbers, between -1 and 1 */ @@ -543,36 +588,32 @@ export const wchooseCycles = (...pairs) => _wchooseWith(rand.segment(1), ...pair export const wrandcat = wchooseCycles; -function _perlin(t) { +function _perlin(t, seed = 0) { let ta = Math.floor(t); let tb = ta + 1; const smootherStep = (x) => 6.0 * x ** 5 - 15.0 * x ** 4 + 10.0 * x ** 3; const interp = (x) => (a) => (b) => a + smootherStep(x) * (b - a); - const v = interp(t - ta)(getRandsAtTime(ta))(getRandsAtTime(tb)); + const ra = getRandsAtTime(ta, 1, seed); + const rb = getRandsAtTime(tb, 1, seed); + const v = interp(t - ta)(ra)(rb); return v; } -export const perlinWith = (tpat) => { - return tpat.fmap(_perlin); -}; -function _berlin(t) { +function _berlin(t, seed = 0) { const prevRidgeStartIndex = Math.floor(t); const nextRidgeStartIndex = prevRidgeStartIndex + 1; - const prevRidgeBottomPoint = getRandsAtTime(prevRidgeStartIndex); - const nextRidgeTopPoint = getRandsAtTime(nextRidgeStartIndex) + prevRidgeBottomPoint; + const prevRidgeBottomPoint = getRandsAtTime(prevRidgeStartIndex, 1, seed); + const height = getRandsAtTime(nextRidgeStartIndex, 1, seed); + const nextRidgeTopPoint = prevRidgeBottomPoint + height; const currentPercent = (t - prevRidgeStartIndex) / (nextRidgeStartIndex - prevRidgeStartIndex); const interp = (a, b, t) => { - return a + (b - a) * t; + return a + t * (b - a); }; return interp(prevRidgeBottomPoint, nextRidgeTopPoint, currentPercent) / 2; } -export const berlinWith = (tpat) => { - return tpat.fmap(_berlin); -}; - /** * Generates a continuous pattern of [perlin noise](https://en.wikipedia.org/wiki/Perlin_noise), in the range 0..1. * @@ -582,7 +623,7 @@ export const berlinWith = (tpat) => { * s("bd*4,hh*8").cutoff(perlin.range(500,8000)) * */ -export const perlin = perlinWith(time.fmap((v) => Number(v))); +export const perlin = signal((t, controls) => _perlin(t, controls.randSeed)); /** * Generates a continuous pattern of [berlin noise](conceived by Jame Coyne and Jade Rowland as a joke but turned out to be surprisingly cool and useful, @@ -594,7 +635,7 @@ export const perlin = perlinWith(time.fmap((v) => Number(v))); * n("0!16".add(berlin.fast(4).mul(14))).scale("d:minor") * */ -export const berlin = berlinWith(time.fmap((v) => Number(v))); +export const berlin = signal((t, controls) => _berlin(t, controls.randSeed)); export const degradeByWith = register( 'degradeByWith', diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index c045133ff..b26823a9b 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -677,10 +677,10 @@ exports[`runs examples > example "almostAlways" example index 0 1`] = ` "[ 1/2 → 5/8 | s:hh speed:0.5 ]", "[ 5/8 → 3/4 | s:hh speed:0.5 ]", "[ 3/4 → 7/8 | s:hh speed:0.5 ]", - "[ 7/8 → 1/1 | s:hh speed:0.5 ]", + "[ 7/8 → 1/1 | s:hh ]", "[ 1/1 → 9/8 | s:hh speed:0.5 ]", "[ 9/8 → 5/4 | s:hh speed:0.5 ]", - "[ 5/4 → 11/8 | s:hh speed:0.5 ]", + "[ 5/4 → 11/8 | s:hh ]", "[ 11/8 → 3/2 | s:hh speed:0.5 ]", "[ 3/2 → 13/8 | s:hh speed:0.5 ]", "[ 13/8 → 7/4 | s:hh speed:0.5 ]", @@ -693,10 +693,10 @@ exports[`runs examples > example "almostAlways" example index 0 1`] = ` "[ 5/2 → 21/8 | s:hh speed:0.5 ]", "[ 21/8 → 11/4 | s:hh speed:0.5 ]", "[ 11/4 → 23/8 | s:hh speed:0.5 ]", - "[ 23/8 → 3/1 | s:hh ]", + "[ 23/8 → 3/1 | s:hh speed:0.5 ]", "[ 3/1 → 25/8 | s:hh speed:0.5 ]", "[ 25/8 → 13/4 | s:hh speed:0.5 ]", - "[ 13/4 → 27/8 | s:hh speed:0.5 ]", + "[ 13/4 → 27/8 | s:hh ]", "[ 27/8 → 7/2 | s:hh speed:0.5 ]", "[ 7/2 → 29/8 | s:hh speed:0.5 ]", "[ 29/8 → 15/4 | s:hh speed:0.5 ]", @@ -715,10 +715,10 @@ exports[`runs examples > example "almostNever" example index 0 1`] = ` "[ 5/8 → 3/4 | s:hh ]", "[ 3/4 → 7/8 | s:hh ]", "[ 7/8 → 1/1 | s:hh ]", - "[ 1/1 → 9/8 | s:hh speed:0.5 ]", - "[ 9/8 → 5/4 | s:hh ]", + "[ 1/1 → 9/8 | s:hh ]", + "[ 9/8 → 5/4 | s:hh speed:0.5 ]", "[ 5/4 → 11/8 | s:hh ]", - "[ 11/8 → 3/2 | s:hh ]", + "[ 11/8 → 3/2 | s:hh speed:0.5 ]", "[ 3/2 → 13/8 | s:hh ]", "[ 13/8 → 7/4 | s:hh ]", "[ 7/4 → 15/8 | s:hh ]", @@ -728,17 +728,17 @@ exports[`runs examples > example "almostNever" example index 0 1`] = ` "[ 9/4 → 19/8 | s:hh ]", "[ 19/8 → 5/2 | s:hh ]", "[ 5/2 → 21/8 | s:hh ]", - "[ 21/8 → 11/4 | s:hh speed:0.5 ]", + "[ 21/8 → 11/4 | s:hh ]", "[ 11/4 → 23/8 | s:hh ]", "[ 23/8 → 3/1 | s:hh ]", "[ 3/1 → 25/8 | s:hh ]", "[ 25/8 → 13/4 | s:hh ]", "[ 13/4 → 27/8 | s:hh ]", - "[ 27/8 → 7/2 | s:hh ]", + "[ 27/8 → 7/2 | s:hh speed:0.5 ]", "[ 7/2 → 29/8 | s:hh ]", "[ 29/8 → 15/4 | s:hh ]", - "[ 15/4 → 31/8 | s:hh speed:0.5 ]", - "[ 31/8 → 4/1 | s:hh speed:0.5 ]", + "[ 15/4 → 31/8 | s:hh ]", + "[ 31/8 → 4/1 | s:hh ]", ] `; @@ -1078,70 +1078,70 @@ exports[`runs examples > example "begin" example index 0 1`] = ` exports[`runs examples > example "berlin" example index 0 1`] = ` [ - "[ 0/1 → 1/16 | note:A3 ]", - "[ 1/16 → 1/8 | note:A3 ]", + "[ 0/1 → 1/16 | note:G3 ]", + "[ 1/16 → 1/8 | note:G3 ]", "[ 1/8 → 3/16 | note:A3 ]", "[ 3/16 → 1/4 | note:A3 ]", "[ 1/4 → 5/16 | note:E3 ]", "[ 5/16 → 3/8 | note:F3 ]", - "[ 3/8 → 7/16 | note:F3 ]", - "[ 7/16 → 1/2 | note:G3 ]", - "[ 1/2 → 9/16 | note:A3 ]", - "[ 9/16 → 5/8 | note:Bb3 ]", - "[ 5/8 → 11/16 | note:Bb3 ]", - "[ 11/16 → 3/4 | note:C4 ]", - "[ 3/4 → 13/16 | note:G3 ]", - "[ 13/16 → 7/8 | note:A3 ]", - "[ 7/8 → 15/16 | note:A3 ]", - "[ 15/16 → 1/1 | note:Bb3 ]", - "[ 1/1 → 17/16 | note:F3 ]", + "[ 3/8 → 7/16 | note:G3 ]", + "[ 7/16 → 1/2 | note:A3 ]", + "[ 1/2 → 9/16 | note:Bb3 ]", + "[ 9/16 → 5/8 | note:C4 ]", + "[ 5/8 → 11/16 | note:D4 ]", + "[ 11/16 → 3/4 | note:E4 ]", + "[ 3/4 → 13/16 | note:Bb3 ]", + "[ 13/16 → 7/8 | note:Bb3 ]", + "[ 7/8 → 15/16 | note:Bb3 ]", + "[ 15/16 → 1/1 | note:C4 ]", + "[ 1/1 → 17/16 | note:E3 ]", "[ 17/16 → 9/8 | note:G3 ]", - "[ 9/8 → 19/16 | note:G3 ]", - "[ 19/16 → 5/4 | note:A3 ]", - "[ 5/4 → 21/16 | note:G3 ]", - "[ 21/16 → 11/8 | note:Bb3 ]", + "[ 9/8 → 19/16 | note:A3 ]", + "[ 19/16 → 5/4 | note:C4 ]", + "[ 5/4 → 21/16 | note:C4 ]", + "[ 21/16 → 11/8 | note:D4 ]", "[ 11/8 → 23/16 | note:D4 ]", "[ 23/16 → 3/2 | note:E4 ]", - "[ 3/2 → 25/16 | note:D4 ]", - "[ 25/16 → 13/8 | note:E4 ]", - "[ 13/8 → 27/16 | note:E4 ]", - "[ 27/16 → 7/4 | note:E4 ]", - "[ 7/4 → 29/16 | note:F3 ]", - "[ 29/16 → 15/8 | note:A3 ]", - "[ 15/8 → 31/16 | note:Bb3 ]", - "[ 31/16 → 2/1 | note:C4 ]", - "[ 2/1 → 33/16 | note:C4 ]", - "[ 33/16 → 17/8 | note:E4 ]", - "[ 17/8 → 35/16 | note:G4 ]", - "[ 35/16 → 9/4 | note:A4 ]", - "[ 9/4 → 37/16 | note:D4 ]", - "[ 37/16 → 19/8 | note:F4 ]", - "[ 19/8 → 39/16 | note:G4 ]", - "[ 39/16 → 5/2 | note:A4 ]", - "[ 5/2 → 41/16 | note:Bb3 ]", - "[ 41/16 → 21/8 | note:C4 ]", - "[ 21/8 → 43/16 | note:C4 ]", - "[ 43/16 → 11/4 | note:C4 ]", - "[ 11/4 → 45/16 | note:F3 ]", - "[ 45/16 → 23/8 | note:G3 ]", - "[ 23/8 → 47/16 | note:G3 ]", - "[ 47/16 → 3/1 | note:A3 ]", - "[ 3/1 → 49/16 | note:F3 ]", - "[ 49/16 → 25/8 | note:G3 ]", - "[ 25/8 → 51/16 | note:G3 ]", - "[ 51/16 → 13/4 | note:A3 ]", - "[ 13/4 → 53/16 | note:G3 ]", - "[ 53/16 → 27/8 | note:A3 ]", - "[ 27/8 → 55/16 | note:C4 ]", - "[ 55/16 → 7/2 | note:E4 ]", - "[ 7/2 → 57/16 | note:D4 ]", - "[ 57/16 → 29/8 | note:E4 ]", - "[ 29/8 → 59/16 | note:F4 ]", - "[ 59/16 → 15/4 | note:G4 ]", - "[ 15/4 → 61/16 | note:Bb3 ]", - "[ 61/16 → 31/8 | note:C4 ]", - "[ 31/8 → 63/16 | note:D4 ]", - "[ 63/16 → 4/1 | note:E4 ]", + "[ 3/2 → 25/16 | note:F3 ]", + "[ 25/16 → 13/8 | note:A3 ]", + "[ 13/8 → 27/16 | note:Bb3 ]", + "[ 27/16 → 7/4 | note:D4 ]", + "[ 7/4 → 29/16 | note:C4 ]", + "[ 29/16 → 15/8 | note:D4 ]", + "[ 15/8 → 31/16 | note:E4 ]", + "[ 31/16 → 2/1 | note:F4 ]", + "[ 2/1 → 33/16 | note:Bb3 ]", + "[ 33/16 → 17/8 | note:C4 ]", + "[ 17/8 → 35/16 | note:D4 ]", + "[ 35/16 → 9/4 | note:E4 ]", + "[ 9/4 → 37/16 | note:Bb3 ]", + "[ 37/16 → 19/8 | note:C4 ]", + "[ 19/8 → 39/16 | note:D4 ]", + "[ 39/16 → 5/2 | note:F4 ]", + "[ 5/2 → 41/16 | note:C4 ]", + "[ 41/16 → 21/8 | note:D4 ]", + "[ 21/8 → 43/16 | note:F4 ]", + "[ 43/16 → 11/4 | note:A4 ]", + "[ 11/4 → 45/16 | note:D4 ]", + "[ 45/16 → 23/8 | note:F4 ]", + "[ 23/8 → 47/16 | note:G4 ]", + "[ 47/16 → 3/1 | note:A4 ]", + "[ 3/1 → 49/16 | note:C4 ]", + "[ 49/16 → 25/8 | note:C4 ]", + "[ 25/8 → 51/16 | note:C4 ]", + "[ 51/16 → 13/4 | note:D4 ]", + "[ 13/4 → 53/16 | note:F3 ]", + "[ 53/16 → 27/8 | note:F3 ]", + "[ 27/8 → 55/16 | note:F3 ]", + "[ 55/16 → 7/2 | note:F3 ]", + "[ 7/2 → 57/16 | note:E3 ]", + "[ 57/16 → 29/8 | note:E3 ]", + "[ 29/8 → 59/16 | note:F3 ]", + "[ 59/16 → 15/4 | note:F3 ]", + "[ 15/4 → 61/16 | note:F3 ]", + "[ 61/16 → 31/8 | note:F3 ]", + "[ 31/8 → 63/16 | note:F3 ]", + "[ 63/16 → 4/1 | note:G3 ]", ] `; @@ -1524,44 +1524,44 @@ exports[`runs examples > example "brand" example index 0 1`] = ` [ "[ 0/1 → 1/10 | s:hh pan:true ]", "[ 1/10 → 1/5 | s:hh pan:true ]", - "[ 1/5 → 3/10 | s:hh pan:true ]", - "[ 3/10 → 2/5 | s:hh pan:false ]", - "[ 2/5 → 1/2 | s:hh pan:true ]", + "[ 1/5 → 3/10 | s:hh pan:false ]", + "[ 3/10 → 2/5 | s:hh pan:true ]", + "[ 2/5 → 1/2 | s:hh pan:false ]", "[ 1/2 → 3/5 | s:hh pan:true ]", - "[ 3/5 → 7/10 | s:hh pan:false ]", - "[ 7/10 → 4/5 | s:hh pan:false ]", - "[ 4/5 → 9/10 | s:hh pan:false ]", - "[ 9/10 → 1/1 | s:hh pan:true ]", + "[ 3/5 → 7/10 | s:hh pan:true ]", + "[ 7/10 → 4/5 | s:hh pan:true ]", + "[ 4/5 → 9/10 | s:hh pan:true ]", + "[ 9/10 → 1/1 | s:hh pan:false ]", "[ 1/1 → 11/10 | s:hh pan:true ]", - "[ 11/10 → 6/5 | s:hh pan:false ]", + "[ 11/10 → 6/5 | s:hh pan:true ]", "[ 6/5 → 13/10 | s:hh pan:false ]", "[ 13/10 → 7/5 | s:hh pan:true ]", - "[ 7/5 → 3/2 | s:hh pan:true ]", + "[ 7/5 → 3/2 | s:hh pan:false ]", "[ 3/2 → 8/5 | s:hh pan:true ]", "[ 8/5 → 17/10 | s:hh pan:false ]", - "[ 17/10 → 9/5 | s:hh pan:false ]", - "[ 9/5 → 19/10 | s:hh pan:true ]", + "[ 17/10 → 9/5 | s:hh pan:true ]", + "[ 9/5 → 19/10 | s:hh pan:false ]", "[ 19/10 → 2/1 | s:hh pan:true ]", "[ 2/1 → 21/10 | s:hh pan:false ]", "[ 21/10 → 11/5 | s:hh pan:true ]", "[ 11/5 → 23/10 | s:hh pan:false ]", "[ 23/10 → 12/5 | s:hh pan:true ]", - "[ 12/5 → 5/2 | s:hh pan:true ]", - "[ 5/2 → 13/5 | s:hh pan:true ]", + "[ 12/5 → 5/2 | s:hh pan:false ]", + "[ 5/2 → 13/5 | s:hh pan:false ]", "[ 13/5 → 27/10 | s:hh pan:false ]", "[ 27/10 → 14/5 | s:hh pan:true ]", - "[ 14/5 → 29/10 | s:hh pan:true ]", - "[ 29/10 → 3/1 | s:hh pan:true ]", - "[ 3/1 → 31/10 | s:hh pan:true ]", - "[ 31/10 → 16/5 | s:hh pan:false ]", + "[ 14/5 → 29/10 | s:hh pan:false ]", + "[ 29/10 → 3/1 | s:hh pan:false ]", + "[ 3/1 → 31/10 | s:hh pan:false ]", + "[ 31/10 → 16/5 | s:hh pan:true ]", "[ 16/5 → 33/10 | s:hh pan:true ]", "[ 33/10 → 17/5 | s:hh pan:false ]", - "[ 17/5 → 7/2 | s:hh pan:false ]", + "[ 17/5 → 7/2 | s:hh pan:true ]", "[ 7/2 → 18/5 | s:hh pan:true ]", - "[ 18/5 → 37/10 | s:hh pan:false ]", + "[ 18/5 → 37/10 | s:hh pan:true ]", "[ 37/10 → 19/5 | s:hh pan:true ]", "[ 19/5 → 39/10 | s:hh pan:false ]", - "[ 39/10 → 4/1 | s:hh pan:false ]", + "[ 39/10 → 4/1 | s:hh pan:true ]", ] `; @@ -1581,32 +1581,32 @@ exports[`runs examples > example "brandBy" example index 0 1`] = ` "[ 11/10 → 6/5 | s:hh pan:false ]", "[ 6/5 → 13/10 | s:hh pan:false ]", "[ 13/10 → 7/5 | s:hh pan:true ]", - "[ 7/5 → 3/2 | s:hh pan:true ]", - "[ 3/2 → 8/5 | s:hh pan:false ]", + "[ 7/5 → 3/2 | s:hh pan:false ]", + "[ 3/2 → 8/5 | s:hh pan:true ]", "[ 8/5 → 17/10 | s:hh pan:false ]", "[ 17/10 → 9/5 | s:hh pan:false ]", "[ 9/5 → 19/10 | s:hh pan:false ]", - "[ 19/10 → 2/1 | s:hh pan:true ]", + "[ 19/10 → 2/1 | s:hh pan:false ]", "[ 2/1 → 21/10 | s:hh pan:false ]", "[ 21/10 → 11/5 | s:hh pan:true ]", "[ 11/5 → 23/10 | s:hh pan:false ]", - "[ 23/10 → 12/5 | s:hh pan:true ]", + "[ 23/10 → 12/5 | s:hh pan:false ]", "[ 12/5 → 5/2 | s:hh pan:false ]", "[ 5/2 → 13/5 | s:hh pan:false ]", "[ 13/5 → 27/10 | s:hh pan:false ]", - "[ 27/10 → 14/5 | s:hh pan:true ]", - "[ 14/5 → 29/10 | s:hh pan:true ]", + "[ 27/10 → 14/5 | s:hh pan:false ]", + "[ 14/5 → 29/10 | s:hh pan:false ]", "[ 29/10 → 3/1 | s:hh pan:false ]", "[ 3/1 → 31/10 | s:hh pan:false ]", - "[ 31/10 → 16/5 | s:hh pan:false ]", - "[ 16/5 → 33/10 | s:hh pan:true ]", + "[ 31/10 → 16/5 | s:hh pan:true ]", + "[ 16/5 → 33/10 | s:hh pan:false ]", "[ 33/10 → 17/5 | s:hh pan:false ]", "[ 17/5 → 7/2 | s:hh pan:false ]", "[ 7/2 → 18/5 | s:hh pan:false ]", "[ 18/5 → 37/10 | s:hh pan:false ]", - "[ 37/10 → 19/5 | s:hh pan:true ]", + "[ 37/10 → 19/5 | s:hh pan:false ]", "[ 19/5 → 39/10 | s:hh pan:false ]", - "[ 39/10 → 4/1 | s:hh pan:false ]", + "[ 39/10 → 4/1 | s:hh pan:true ]", ] `; @@ -1738,23 +1738,23 @@ exports[`runs examples > example "channels" example index 0 1`] = ` exports[`runs examples > example "choose" example index 0 1`] = ` [ "[ 0/1 → 1/5 | note:c2 s:triangle ]", - "[ 1/5 → 2/5 | note:g2 s:sine ]", + "[ 1/5 → 2/5 | note:g2 s:triangle ]", "[ 2/5 → 3/5 | note:g2 s:triangle ]", - "[ 3/5 → 4/5 | note:d2 s:bd n:6 ]", - "[ 4/5 → 1/1 | note:f1 s:bd n:6 ]", + "[ 3/5 → 4/5 | note:d2 s:sine ]", + "[ 4/5 → 1/1 | note:f1 s:triangle ]", "[ 1/1 → 6/5 | note:c2 s:sine ]", - "[ 6/5 → 7/5 | note:g2 s:bd n:6 ]", - "[ 7/5 → 8/5 | note:g2 s:sine ]", - "[ 8/5 → 9/5 | note:d2 s:bd n:6 ]", - "[ 9/5 → 2/1 | note:f1 s:sine ]", + "[ 6/5 → 7/5 | note:g2 s:triangle ]", + "[ 7/5 → 8/5 | note:g2 s:bd n:6 ]", + "[ 8/5 → 9/5 | note:d2 s:triangle ]", + "[ 9/5 → 2/1 | note:f1 s:triangle ]", "[ 2/1 → 11/5 | note:c2 s:triangle ]", "[ 11/5 → 12/5 | note:g2 s:bd n:6 ]", - "[ 12/5 → 13/5 | note:g2 s:sine ]", + "[ 12/5 → 13/5 | note:g2 s:bd n:6 ]", "[ 13/5 → 14/5 | note:d2 s:bd n:6 ]", - "[ 14/5 → 3/1 | note:f1 s:sine ]", + "[ 14/5 → 3/1 | note:f1 s:bd n:6 ]", "[ 3/1 → 16/5 | note:c2 s:triangle ]", - "[ 16/5 → 17/5 | note:g2 s:sine ]", - "[ 17/5 → 18/5 | note:g2 s:bd n:6 ]", + "[ 16/5 → 17/5 | note:g2 s:triangle ]", + "[ 17/5 → 18/5 | note:g2 s:sine ]", "[ 18/5 → 19/5 | note:d2 s:triangle ]", "[ 19/5 → 4/1 | note:f1 s:bd n:6 ]", ] @@ -1767,33 +1767,33 @@ exports[`runs examples > example "chooseCycles" example index 0 1`] = ` "[ 1/4 → 3/8 | s:hh ]", "[ 3/8 → 1/2 | s:hh ]", "[ 1/2 → 5/8 | s:bd ]", - "[ 5/8 → 3/4 | s:hh ]", - "[ 3/4 → 7/8 | s:sd ]", - "[ 7/8 → 1/1 | s:bd ]", - "[ 1/1 → 9/8 | s:sd ]", - "[ 9/8 → 5/4 | s:sd ]", - "[ 5/4 → 11/8 | s:hh ]", - "[ 11/8 → 3/2 | s:bd ]", - "[ 3/2 → 13/8 | s:bd ]", + "[ 5/8 → 3/4 | s:sd ]", + "[ 3/4 → 7/8 | s:bd ]", + "[ 7/8 → 1/1 | s:sd ]", + "[ 1/1 → 9/8 | s:hh ]", + "[ 9/8 → 5/4 | s:hh ]", + "[ 5/4 → 11/8 | s:sd ]", + "[ 11/8 → 3/2 | s:sd ]", + "[ 3/2 → 13/8 | s:sd ]", "[ 13/8 → 7/4 | s:bd ]", - "[ 7/4 → 15/8 | s:sd ]", - "[ 15/8 → 2/1 | s:hh ]", - "[ 2/1 → 17/8 | s:sd ]", + "[ 7/4 → 15/8 | s:bd ]", + "[ 15/8 → 2/1 | s:bd ]", + "[ 2/1 → 17/8 | s:bd ]", "[ 17/8 → 9/4 | s:sd ]", - "[ 9/4 → 19/8 | s:bd ]", - "[ 19/8 → 5/2 | s:hh ]", + "[ 9/4 → 19/8 | s:sd ]", + "[ 19/8 → 5/2 | s:sd ]", "[ 5/2 → 21/8 | s:bd ]", - "[ 21/8 → 11/4 | s:sd ]", - "[ 11/4 → 23/8 | s:hh ]", - "[ 23/8 → 3/1 | s:bd ]", - "[ 3/1 → 25/8 | s:sd ]", + "[ 21/8 → 11/4 | s:hh ]", + "[ 11/4 → 23/8 | s:sd ]", + "[ 23/8 → 3/1 | s:sd ]", + "[ 3/1 → 25/8 | s:hh ]", "[ 25/8 → 13/4 | s:sd ]", - "[ 13/4 → 27/8 | s:sd ]", + "[ 13/4 → 27/8 | s:hh ]", "[ 27/8 → 7/2 | s:bd ]", "[ 7/2 → 29/8 | s:sd ]", - "[ 29/8 → 15/4 | s:bd ]", + "[ 29/8 → 15/4 | s:hh ]", "[ 15/4 → 31/8 | s:bd ]", - "[ 31/8 → 4/1 | s:bd ]", + "[ 31/8 → 4/1 | s:sd ]", ] `; @@ -1804,33 +1804,33 @@ exports[`runs examples > example "chooseCycles" example index 1 1`] = ` "[ 1/4 → 3/8 | s:hh ]", "[ 3/8 → 1/2 | s:hh ]", "[ 1/2 → 5/8 | s:bd ]", - "[ 5/8 → 3/4 | s:hh ]", - "[ 3/4 → 7/8 | s:sd ]", - "[ 7/8 → 1/1 | s:bd ]", - "[ 1/1 → 9/8 | s:sd ]", - "[ 9/8 → 5/4 | s:sd ]", - "[ 5/4 → 11/8 | s:hh ]", - "[ 11/8 → 3/2 | s:bd ]", - "[ 3/2 → 13/8 | s:bd ]", + "[ 5/8 → 3/4 | s:sd ]", + "[ 3/4 → 7/8 | s:bd ]", + "[ 7/8 → 1/1 | s:sd ]", + "[ 1/1 → 9/8 | s:hh ]", + "[ 9/8 → 5/4 | s:hh ]", + "[ 5/4 → 11/8 | s:sd ]", + "[ 11/8 → 3/2 | s:sd ]", + "[ 3/2 → 13/8 | s:sd ]", "[ 13/8 → 7/4 | s:bd ]", - "[ 7/4 → 15/8 | s:sd ]", - "[ 15/8 → 2/1 | s:hh ]", - "[ 2/1 → 17/8 | s:sd ]", + "[ 7/4 → 15/8 | s:bd ]", + "[ 15/8 → 2/1 | s:bd ]", + "[ 2/1 → 17/8 | s:bd ]", "[ 17/8 → 9/4 | s:sd ]", - "[ 9/4 → 19/8 | s:bd ]", - "[ 19/8 → 5/2 | s:hh ]", + "[ 9/4 → 19/8 | s:sd ]", + "[ 19/8 → 5/2 | s:sd ]", "[ 5/2 → 21/8 | s:bd ]", - "[ 21/8 → 11/4 | s:sd ]", - "[ 11/4 → 23/8 | s:hh ]", - "[ 23/8 → 3/1 | s:bd ]", - "[ 3/1 → 25/8 | s:sd ]", + "[ 21/8 → 11/4 | s:hh ]", + "[ 11/4 → 23/8 | s:sd ]", + "[ 23/8 → 3/1 | s:sd ]", + "[ 3/1 → 25/8 | s:hh ]", "[ 25/8 → 13/4 | s:sd ]", - "[ 13/4 → 27/8 | s:sd ]", + "[ 13/4 → 27/8 | s:hh ]", "[ 27/8 → 7/2 | s:bd ]", "[ 7/2 → 29/8 | s:sd ]", - "[ 29/8 → 15/4 | s:bd ]", + "[ 29/8 → 15/4 | s:hh ]", "[ 15/4 → 31/8 | s:bd ]", - "[ 31/8 → 4/1 | s:bd ]", + "[ 31/8 → 4/1 | s:sd ]", ] `; @@ -2494,45 +2494,44 @@ exports[`runs examples > example "decay" example index 0 1`] = ` exports[`runs examples > example "degrade" example index 0 1`] = ` [ "[ 1/8 → 1/4 | s:hh ]", - "[ 1/4 → 3/8 | s:hh ]", "[ 3/8 → 1/2 | s:hh ]", "[ 5/8 → 3/4 | s:hh ]", - "[ 3/4 → 7/8 | s:hh ]", "[ 7/8 → 1/1 | s:hh ]", - "[ 9/8 → 5/4 | s:hh ]", "[ 5/4 → 11/8 | s:hh ]", - "[ 11/8 → 3/2 | s:hh ]", - "[ 7/4 → 15/8 | s:hh ]", + "[ 13/8 → 7/4 | s:hh ]", "[ 15/8 → 2/1 | s:hh ]", "[ 2/1 → 17/8 | s:hh ]", - "[ 17/8 → 9/4 | s:hh ]", - "[ 9/4 → 19/8 | s:hh ]", "[ 19/8 → 5/2 | s:hh ]", - "[ 11/4 → 23/8 | s:hh ]", + "[ 5/2 → 21/8 | s:hh ]", "[ 23/8 → 3/1 | s:hh ]", + "[ 3/1 → 25/8 | s:hh ]", "[ 25/8 → 13/4 | s:hh ]", - "[ 27/8 → 7/2 | s:hh ]", + "[ 13/4 → 27/8 | s:hh ]", "[ 29/8 → 15/4 | s:hh ]", + "[ 15/4 → 31/8 | s:hh ]", ] `; exports[`runs examples > example "degrade" example index 1 1`] = ` [ "[ 1/4 → 3/8 | s:hh ]", - "[ 3/4 → 7/8 | s:hh ]", + "[ 3/8 → 1/2 | s:hh ]", + "[ 5/8 → 3/4 | s:hh ]", + "[ 7/8 → 1/1 | s:hh ]", "[ 1/1 → 9/8 | s:hh ]", "[ 9/8 → 5/4 | s:hh ]", "[ 5/4 → 11/8 | s:hh ]", - "[ 7/4 → 15/8 | s:hh ]", - "[ 15/8 → 2/1 | s:hh ]", - "[ 2/1 → 17/8 | s:hh ]", + "[ 11/8 → 3/2 | s:hh ]", + "[ 3/2 → 13/8 | s:hh ]", "[ 17/8 → 9/4 | s:hh ]", + "[ 9/4 → 19/8 | s:hh ]", "[ 19/8 → 5/2 | s:hh ]", - "[ 21/8 → 11/4 | s:hh ]", + "[ 11/4 → 23/8 | s:hh ]", + "[ 23/8 → 3/1 | s:hh ]", "[ 3/1 → 25/8 | s:hh ]", "[ 25/8 → 13/4 | s:hh ]", - "[ 13/4 → 27/8 | s:hh ]", "[ 7/2 → 29/8 | s:hh ]", + "[ 31/8 → 4/1 | s:hh ]", ] `; @@ -2540,16 +2539,12 @@ exports[`runs examples > example "degradeBy" example index 0 1`] = ` [ "[ 0/1 → 1/8 | s:hh ]", "[ 1/8 → 1/4 | s:hh ]", - "[ 1/4 → 3/8 | s:hh ]", "[ 3/8 → 1/2 | s:hh ]", "[ 1/2 → 5/8 | s:hh ]", "[ 5/8 → 3/4 | s:hh ]", "[ 3/4 → 7/8 | s:hh ]", "[ 7/8 → 1/1 | s:hh ]", - "[ 9/8 → 5/4 | s:hh ]", "[ 5/4 → 11/8 | s:hh ]", - "[ 11/8 → 3/2 | s:hh ]", - "[ 3/2 → 13/8 | s:hh ]", "[ 13/8 → 7/4 | s:hh ]", "[ 7/4 → 15/8 | s:hh ]", "[ 15/8 → 2/1 | s:hh ]", @@ -2558,14 +2553,15 @@ exports[`runs examples > example "degradeBy" example index 0 1`] = ` "[ 9/4 → 19/8 | s:hh ]", "[ 19/8 → 5/2 | s:hh ]", "[ 5/2 → 21/8 | s:hh ]", + "[ 21/8 → 11/4 | s:hh ]", "[ 11/4 → 23/8 | s:hh ]", "[ 23/8 → 3/1 | s:hh ]", "[ 3/1 → 25/8 | s:hh ]", "[ 25/8 → 13/4 | s:hh ]", "[ 13/4 → 27/8 | s:hh ]", - "[ 27/8 → 7/2 | s:hh ]", "[ 7/2 → 29/8 | s:hh ]", "[ 29/8 → 15/4 | s:hh ]", + "[ 15/4 → 31/8 | s:hh ]", ] `; @@ -2574,7 +2570,6 @@ exports[`runs examples > example "degradeBy" example index 1 1`] = ` "[ 0/1 → 1/8 | s:hh ]", "[ 1/4 → 3/8 | s:hh ]", "[ 3/8 → 1/2 | s:hh ]", - "[ 1/2 → 5/8 | s:hh ]", "[ 5/8 → 3/4 | s:hh ]", "[ 3/4 → 7/8 | s:hh ]", "[ 7/8 → 1/1 | s:hh ]", @@ -2583,66 +2578,56 @@ exports[`runs examples > example "degradeBy" example index 1 1`] = ` "[ 5/4 → 11/8 | s:hh ]", "[ 11/8 → 3/2 | s:hh ]", "[ 3/2 → 13/8 | s:hh ]", - "[ 13/8 → 7/4 | s:hh ]", - "[ 7/4 → 15/8 | s:hh ]", "[ 15/8 → 2/1 | s:hh ]", - "[ 2/1 → 17/8 | s:hh ]", "[ 17/8 → 9/4 | s:hh ]", + "[ 9/4 → 19/8 | s:hh ]", "[ 19/8 → 5/2 | s:hh ]", - "[ 5/2 → 21/8 | s:hh ]", "[ 21/8 → 11/4 | s:hh ]", "[ 11/4 → 23/8 | s:hh ]", "[ 23/8 → 3/1 | s:hh ]", "[ 3/1 → 25/8 | s:hh ]", "[ 25/8 → 13/4 | s:hh ]", "[ 13/4 → 27/8 | s:hh ]", - "[ 27/8 → 7/2 | s:hh ]", "[ 7/2 → 29/8 | s:hh ]", + "[ 29/8 → 15/4 | s:hh ]", + "[ 31/8 → 4/1 | s:hh ]", ] `; exports[`runs examples > example "degradeBy" example index 2 1`] = ` [ - "[ 0/1 → 1/16 | s:bd ]", "[ 1/16 → 1/8 | s:bd ]", "[ 1/8 → 3/16 | s:bd ]", + "[ 3/16 → 1/4 | s:bd ]", + "[ 5/16 → 3/8 | s:bd ]", "[ 3/8 → 7/16 | s:bd ]", "[ 1/2 → 9/16 | s:bd ]", - "[ 9/16 → 5/8 | s:bd ]", - "[ 5/8 → 11/16 | s:bd ]", - "[ 11/16 → 3/4 | s:bd ]", - "[ 3/4 → 13/16 | s:bd ]", - "[ 15/16 → 1/1 | s:bd ]", - "[ 1/1 → 17/16 | s:bd ]", + "[ 13/16 → 7/8 | s:bd ]", + "[ 7/8 → 15/16 | s:bd ]", "[ 17/16 → 9/8 | s:bd ]", "[ 9/8 → 19/16 | s:bd ]", + "[ 19/16 → 5/4 | s:bd ]", + "[ 21/16 → 11/8 | s:bd ]", "[ 11/8 → 23/16 | s:bd ]", "[ 3/2 → 25/16 | s:bd ]", - "[ 25/16 → 13/8 | s:bd ]", - "[ 13/8 → 27/16 | s:bd ]", - "[ 27/16 → 7/4 | s:bd ]", - "[ 7/4 → 29/16 | s:bd ]", - "[ 31/16 → 2/1 | s:bd ]", - "[ 2/1 → 33/16 | s:bd ]", + "[ 29/16 → 15/8 | s:bd ]", + "[ 15/8 → 31/16 | s:bd ]", "[ 33/16 → 17/8 | s:bd ]", "[ 17/8 → 35/16 | s:bd ]", + "[ 35/16 → 9/4 | s:bd ]", + "[ 37/16 → 19/8 | s:bd ]", "[ 19/8 → 39/16 | s:bd ]", "[ 5/2 → 41/16 | s:bd ]", - "[ 41/16 → 21/8 | s:bd ]", - "[ 21/8 → 43/16 | s:bd ]", - "[ 43/16 → 11/4 | s:bd ]", - "[ 11/4 → 45/16 | s:bd ]", - "[ 47/16 → 3/1 | s:bd ]", - "[ 3/1 → 49/16 | s:bd ]", + "[ 45/16 → 23/8 | s:bd ]", + "[ 23/8 → 47/16 | s:bd ]", "[ 49/16 → 25/8 | s:bd ]", "[ 25/8 → 51/16 | s:bd ]", + "[ 51/16 → 13/4 | s:bd ]", + "[ 53/16 → 27/8 | s:bd ]", "[ 27/8 → 55/16 | s:bd ]", "[ 7/2 → 57/16 | s:bd ]", - "[ 57/16 → 29/8 | s:bd ]", - "[ 29/8 → 59/16 | s:bd ]", - "[ 59/16 → 15/4 | s:bd ]", - "[ 15/4 → 61/16 | s:bd ]", - "[ 63/16 → 4/1 | s:bd ]", + "[ 61/16 → 31/8 | s:bd ]", + "[ 31/8 → 63/16 | s:bd ]", ] `; @@ -2965,14 +2950,14 @@ exports[`runs examples > example "distorttype" example index 0 1`] = ` exports[`runs examples > example "distorttype" example index 1 1`] = ` [ - "[ (0/1 → 1/2) ⇝ 1/1 | s:sine note:F1 release:1 penv:24 pdecay:0.05 distort:1 distorttype:fold ]", - "[ 0/1 ⇜ (1/2 → 1/1) | s:sine note:F1 release:1 penv:24 pdecay:0.05 distort:1 distorttype:fold ]", - "[ (1/1 → 3/2) ⇝ 2/1 | s:sine note:F1 release:1 penv:24 pdecay:0.05 distort:4.6367951557040215 distorttype:chebyshev ]", - "[ 1/1 ⇜ (3/2 → 2/1) | s:sine note:F1 release:1 penv:24 pdecay:0.05 distort:4.6367951557040215 distorttype:chebyshev ]", - "[ (2/1 → 5/2) ⇝ 3/1 | s:sine note:F1 release:1 penv:24 pdecay:0.05 distort:7.716689839959145 distorttype:scurve ]", - "[ 2/1 ⇜ (5/2 → 3/1) | s:sine note:F1 release:1 penv:24 pdecay:0.05 distort:7.716689839959145 distorttype:scurve ]", - "[ (3/1 → 7/2) ⇝ 4/1 | s:sine note:F1 release:1 penv:24 pdecay:0.05 distort:2.5210237745195627 distorttype:diode ]", - "[ 3/1 ⇜ (7/2 → 4/1) | s:sine note:F1 release:1 penv:24 pdecay:0.05 distort:2.5210237745195627 distorttype:diode ]", + "[ (0/1 → 1/2) ⇝ 1/1 | s:sine note:F1 release:1 penv:24 pdecay:0.05 distort:3.71662513515912 distorttype:fold ]", + "[ 0/1 ⇜ (1/2 → 1/1) | s:sine note:F1 release:1 penv:24 pdecay:0.05 distort:3.71662513515912 distorttype:fold ]", + "[ (1/1 → 3/2) ⇝ 2/1 | s:sine note:F1 release:1 penv:24 pdecay:0.05 distort:1.8276505067478865 distorttype:chebyshev ]", + "[ 1/1 ⇜ (3/2 → 2/1) | s:sine note:F1 release:1 penv:24 pdecay:0.05 distort:1.8276505067478865 distorttype:chebyshev ]", + "[ (2/1 → 5/2) ⇝ 3/1 | s:sine note:F1 release:1 penv:24 pdecay:0.05 distort:5.068953953683376 distorttype:scurve ]", + "[ 2/1 ⇜ (5/2 → 3/1) | s:sine note:F1 release:1 penv:24 pdecay:0.05 distort:5.068953953683376 distorttype:scurve ]", + "[ (3/1 → 7/2) ⇝ 4/1 | s:sine note:F1 release:1 penv:24 pdecay:0.05 distort:5.303743980126455 distorttype:diode ]", + "[ 3/1 ⇜ (7/2 → 4/1) | s:sine note:F1 release:1 penv:24 pdecay:0.05 distort:5.303743980126455 distorttype:diode ]", ] `; @@ -2999,38 +2984,38 @@ exports[`runs examples > example "distortvol" example index 0 1`] = ` exports[`runs examples > example "djf" example index 0 1`] = ` [ - "[ 0/1 → 1/8 | note:D3 s:supersaw djf:0.5 ]", + "[ 0/1 → 1/8 | note:C4 s:supersaw djf:0.5 ]", "[ 1/8 → 1/4 | note:G4 s:supersaw djf:0.5 ]", - "[ 1/4 → 3/8 | note:Bb3 s:supersaw djf:0.5 ]", - "[ 3/8 → 1/2 | note:C4 s:supersaw djf:0.5 ]", - "[ 1/2 → 5/8 | note:A3 s:supersaw djf:0.5 ]", - "[ 5/8 → 3/4 | note:F3 s:supersaw djf:0.5 ]", - "[ 3/4 → 7/8 | note:G3 s:supersaw djf:0.5 ]", - "[ 7/8 → 1/1 | note:C4 s:supersaw djf:0.5 ]", - "[ 1/1 → 9/8 | note:Eb4 s:supersaw djf:0.3 ]", - "[ 9/8 → 5/4 | note:G4 s:supersaw djf:0.3 ]", - "[ 5/4 → 11/8 | note:A4 s:supersaw djf:0.3 ]", - "[ 11/8 → 3/2 | note:F3 s:supersaw djf:0.3 ]", - "[ 3/2 → 13/8 | note:F4 s:supersaw djf:0.3 ]", - "[ 13/8 → 7/4 | note:D4 s:supersaw djf:0.3 ]", - "[ 7/4 → 15/8 | note:G3 s:supersaw djf:0.3 ]", - "[ 15/8 → 2/1 | note:F4 s:supersaw djf:0.3 ]", - "[ 2/1 → 17/8 | note:Eb5 s:supersaw djf:0.2 ]", - "[ 17/8 → 9/4 | note:D5 s:supersaw djf:0.2 ]", - "[ 9/4 → 19/8 | note:Bb3 s:supersaw djf:0.2 ]", + "[ 1/4 → 3/8 | note:F3 s:supersaw djf:0.5 ]", + "[ 3/8 → 1/2 | note:C5 s:supersaw djf:0.5 ]", + "[ 1/2 → 5/8 | note:Bb3 s:supersaw djf:0.5 ]", + "[ 5/8 → 3/4 | note:A4 s:supersaw djf:0.5 ]", + "[ 3/4 → 7/8 | note:A3 s:supersaw djf:0.5 ]", + "[ 7/8 → 1/1 | note:D5 s:supersaw djf:0.5 ]", + "[ 1/1 → 9/8 | note:Eb3 s:supersaw djf:0.3 ]", + "[ 9/8 → 5/4 | note:D3 s:supersaw djf:0.3 ]", + "[ 5/4 → 11/8 | note:Eb5 s:supersaw djf:0.3 ]", + "[ 11/8 → 3/2 | note:D3 s:supersaw djf:0.3 ]", + "[ 3/2 → 13/8 | note:F3 s:supersaw djf:0.3 ]", + "[ 13/8 → 7/4 | note:G4 s:supersaw djf:0.3 ]", + "[ 7/4 → 15/8 | note:Bb3 s:supersaw djf:0.3 ]", + "[ 15/8 → 2/1 | note:G4 s:supersaw djf:0.3 ]", + "[ 2/1 → 17/8 | note:F4 s:supersaw djf:0.2 ]", + "[ 17/8 → 9/4 | note:D4 s:supersaw djf:0.2 ]", + "[ 9/4 → 19/8 | note:G3 s:supersaw djf:0.2 ]", "[ 19/8 → 5/2 | note:C5 s:supersaw djf:0.2 ]", - "[ 5/2 → 21/8 | note:D4 s:supersaw djf:0.2 ]", - "[ 21/8 → 11/4 | note:F3 s:supersaw djf:0.2 ]", - "[ 11/4 → 23/8 | note:G4 s:supersaw djf:0.2 ]", - "[ 23/8 → 3/1 | note:D3 s:supersaw djf:0.2 ]", - "[ 3/1 → 25/8 | note:G3 s:supersaw djf:0.75 ]", - "[ 25/8 → 13/4 | note:Bb3 s:supersaw djf:0.75 ]", - "[ 13/4 → 27/8 | note:Eb5 s:supersaw djf:0.75 ]", - "[ 27/8 → 7/2 | note:C4 s:supersaw djf:0.75 ]", - "[ 7/2 → 29/8 | note:C4 s:supersaw djf:0.75 ]", - "[ 29/8 → 15/4 | note:Eb5 s:supersaw djf:0.75 ]", - "[ 15/4 → 31/8 | note:Bb4 s:supersaw djf:0.75 ]", - "[ 31/8 → 4/1 | note:A4 s:supersaw djf:0.75 ]", + "[ 5/2 → 21/8 | note:A4 s:supersaw djf:0.2 ]", + "[ 21/8 → 11/4 | note:Bb3 s:supersaw djf:0.2 ]", + "[ 11/4 → 23/8 | note:Bb3 s:supersaw djf:0.2 ]", + "[ 23/8 → 3/1 | note:C5 s:supersaw djf:0.2 ]", + "[ 3/1 → 25/8 | note:F4 s:supersaw djf:0.75 ]", + "[ 25/8 → 13/4 | note:F4 s:supersaw djf:0.75 ]", + "[ 13/4 → 27/8 | note:D5 s:supersaw djf:0.75 ]", + "[ 27/8 → 7/2 | note:D3 s:supersaw djf:0.75 ]", + "[ 7/2 → 29/8 | note:G3 s:supersaw djf:0.75 ]", + "[ 29/8 → 15/4 | note:F4 s:supersaw djf:0.75 ]", + "[ 15/4 → 31/8 | note:F4 s:supersaw djf:0.75 ]", + "[ 31/8 → 4/1 | note:F3 s:supersaw djf:0.75 ]", ] `; @@ -5189,31 +5174,31 @@ exports[`runs examples > example "invert" example index 0 1`] = ` exports[`runs examples > example "irand" example index 0 1`] = ` [ "[ 0/1 → 1/4 | note:F3 ]", - "[ 1/4 → 3/8 | note:G3 ]", - "[ 3/8 → 1/2 | note:G3 ]", - "[ 1/2 → 3/4 | note:F3 ]", - "[ 3/4 → 5/6 | note:Ab3 ]", - "[ 5/6 → 11/12 | note:Bb3 ]", - "[ 11/12 → 1/1 | note:C4 ]", + "[ 1/4 → 3/8 | note:D3 ]", + "[ 3/8 → 1/2 | note:Bb3 ]", + "[ 1/2 → 3/4 | note:Eb3 ]", + "[ 3/4 → 5/6 | note:Eb3 ]", + "[ 5/6 → 11/12 | note:Ab3 ]", + "[ 11/12 → 1/1 | note:D3 ]", "[ 1/1 → 5/4 | note:C3 ]", - "[ 5/4 → 11/8 | note:Ab3 ]", - "[ 11/8 → 3/2 | note:Bb3 ]", + "[ 5/4 → 11/8 | note:C4 ]", + "[ 11/8 → 3/2 | note:C3 ]", "[ 3/2 → 7/4 | note:D3 ]", - "[ 7/4 → 11/6 | note:Ab3 ]", - "[ 11/6 → 23/12 | note:Bb3 ]", - "[ 23/12 → 2/1 | note:C3 ]", + "[ 7/4 → 11/6 | note:Eb3 ]", + "[ 11/6 → 23/12 | note:C3 ]", + "[ 23/12 → 2/1 | note:Ab3 ]", "[ 2/1 → 9/4 | note:G3 ]", - "[ 9/4 → 19/8 | note:Ab3 ]", - "[ 19/8 → 5/2 | note:Ab3 ]", - "[ 5/2 → 11/4 | note:Eb3 ]", - "[ 11/4 → 17/6 | note:Ab3 ]", - "[ 17/6 → 35/12 | note:Bb3 ]", - "[ 35/12 → 3/1 | note:Ab3 ]", - "[ 3/1 → 13/4 | note:F3 ]", - "[ 13/4 → 27/8 | note:Eb3 ]", - "[ 27/8 → 7/2 | note:Ab3 ]", - "[ 7/2 → 15/4 | note:Eb3 ]", - "[ 15/4 → 23/6 | note:C3 ]", + "[ 9/4 → 19/8 | note:D3 ]", + "[ 19/8 → 5/2 | note:Bb3 ]", + "[ 5/2 → 11/4 | note:Ab3 ]", + "[ 11/4 → 17/6 | note:Eb3 ]", + "[ 17/6 → 35/12 | note:Ab3 ]", + "[ 35/12 → 3/1 | note:D3 ]", + "[ 3/1 → 13/4 | note:G3 ]", + "[ 13/4 → 27/8 | note:C4 ]", + "[ 27/8 → 7/2 | note:C3 ]", + "[ 7/2 → 15/4 | note:D3 ]", + "[ 15/4 → 23/6 | note:G3 ]", "[ 23/6 → 47/12 | note:Ab3 ]", "[ 47/12 → 4/1 | note:Ab3 ]", ] @@ -5221,38 +5206,38 @@ exports[`runs examples > example "irand" example index 0 1`] = ` exports[`runs examples > example "irbegin" example index 0 1`] = ` [ - "[ 0/1 → 1/8 | s:brk speed:0.5 unit:c begin:0 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", + "[ 0/1 → 1/8 | s:brk speed:0.5 unit:c begin:0.375 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", "[ 1/8 → 1/4 | s:brk speed:0.5 unit:c begin:0.625 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", - "[ 1/4 → 3/8 | s:brk speed:0.5 unit:c begin:0.3125 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", - "[ 3/8 → 1/2 | s:brk speed:0.5 unit:c begin:0.375 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", - "[ 1/2 → 5/8 | s:brk speed:0.5 unit:c begin:0.25 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", - "[ 5/8 → 3/4 | s:brk speed:0.5 unit:c begin:0.125 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", - "[ 3/4 → 7/8 | s:brk speed:0.5 unit:c begin:0.1875 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", - "[ 7/8 → 1/1 | s:brk speed:0.5 unit:c begin:0.375 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", - "[ 1/1 → 9/8 | s:brk speed:0.5 unit:c begin:0.5 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", - "[ 9/8 → 5/4 | s:brk speed:0.5 unit:c begin:0.625 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", - "[ 5/4 → 11/8 | s:brk speed:0.5 unit:c begin:0.6875 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", - "[ 11/8 → 3/2 | s:brk speed:0.5 unit:c begin:0.125 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", - "[ 3/2 → 13/8 | s:brk speed:0.5 unit:c begin:0.5625 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", - "[ 13/8 → 7/4 | s:brk speed:0.5 unit:c begin:0.4375 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", - "[ 7/4 → 15/8 | s:brk speed:0.5 unit:c begin:0.1875 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", - "[ 15/8 → 2/1 | s:brk speed:0.5 unit:c begin:0.5625 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", - "[ 2/1 → 17/8 | s:brk speed:0.5 unit:c begin:0.9375 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", - "[ 17/8 → 9/4 | s:brk speed:0.5 unit:c begin:0.875 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", - "[ 9/4 → 19/8 | s:brk speed:0.5 unit:c begin:0.3125 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", + "[ 1/4 → 3/8 | s:brk speed:0.5 unit:c begin:0.125 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", + "[ 3/8 → 1/2 | s:brk speed:0.5 unit:c begin:0.8125 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", + "[ 1/2 → 5/8 | s:brk speed:0.5 unit:c begin:0.3125 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", + "[ 5/8 → 3/4 | s:brk speed:0.5 unit:c begin:0.6875 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", + "[ 3/4 → 7/8 | s:brk speed:0.5 unit:c begin:0.25 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", + "[ 7/8 → 1/1 | s:brk speed:0.5 unit:c begin:0.875 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", + "[ 1/1 → 9/8 | s:brk speed:0.5 unit:c begin:0.0625 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", + "[ 9/8 → 5/4 | s:brk speed:0.5 unit:c begin:0 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", + "[ 5/4 → 11/8 | s:brk speed:0.5 unit:c begin:0.9375 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", + "[ 11/8 → 3/2 | s:brk speed:0.5 unit:c begin:0 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", + "[ 3/2 → 13/8 | s:brk speed:0.5 unit:c begin:0.125 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", + "[ 13/8 → 7/4 | s:brk speed:0.5 unit:c begin:0.625 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", + "[ 7/4 → 15/8 | s:brk speed:0.5 unit:c begin:0.3125 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", + "[ 15/8 → 2/1 | s:brk speed:0.5 unit:c begin:0.625 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", + "[ 2/1 → 17/8 | s:brk speed:0.5 unit:c begin:0.5625 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", + "[ 17/8 → 9/4 | s:brk speed:0.5 unit:c begin:0.4375 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", + "[ 9/4 → 19/8 | s:brk speed:0.5 unit:c begin:0.1875 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", "[ 19/8 → 5/2 | s:brk speed:0.5 unit:c begin:0.8125 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", - "[ 5/2 → 21/8 | s:brk speed:0.5 unit:c begin:0.4375 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", - "[ 21/8 → 11/4 | s:brk speed:0.5 unit:c begin:0.125 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", - "[ 11/4 → 23/8 | s:brk speed:0.5 unit:c begin:0.625 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", - "[ 23/8 → 3/1 | s:brk speed:0.5 unit:c begin:0 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", - "[ 3/1 → 25/8 | s:brk speed:0.5 unit:c begin:0.1875 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", - "[ 25/8 → 13/4 | s:brk speed:0.5 unit:c begin:0.3125 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", - "[ 13/4 → 27/8 | s:brk speed:0.5 unit:c begin:0.9375 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", - "[ 27/8 → 7/2 | s:brk speed:0.5 unit:c begin:0.375 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", - "[ 7/2 → 29/8 | s:brk speed:0.5 unit:c begin:0.375 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", - "[ 29/8 → 15/4 | s:brk speed:0.5 unit:c begin:0.9375 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", - "[ 15/4 → 31/8 | s:brk speed:0.5 unit:c begin:0.75 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", - "[ 31/8 → 4/1 | s:brk speed:0.5 unit:c begin:0.6875 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", + "[ 5/2 → 21/8 | s:brk speed:0.5 unit:c begin:0.6875 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", + "[ 21/8 → 11/4 | s:brk speed:0.5 unit:c begin:0.3125 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", + "[ 11/4 → 23/8 | s:brk speed:0.5 unit:c begin:0.3125 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", + "[ 23/8 → 3/1 | s:brk speed:0.5 unit:c begin:0.8125 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", + "[ 3/1 → 25/8 | s:brk speed:0.5 unit:c begin:0.5625 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", + "[ 25/8 → 13/4 | s:brk speed:0.5 unit:c begin:0.5625 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", + "[ 13/4 → 27/8 | s:brk speed:0.5 unit:c begin:0.875 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", + "[ 27/8 → 7/2 | s:brk speed:0.5 unit:c begin:0 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", + "[ 7/2 → 29/8 | s:brk speed:0.5 unit:c begin:0.1875 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", + "[ 29/8 → 15/4 | s:brk speed:0.5 unit:c begin:0.5625 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", + "[ 15/4 → 31/8 | s:brk speed:0.5 unit:c begin:0.5625 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", + "[ 31/8 → 4/1 | s:brk speed:0.5 unit:c begin:0.125 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", ] `; @@ -5279,38 +5264,38 @@ exports[`runs examples > example "iresponse" example index 0 1`] = ` exports[`runs examples > example "irspeed" example index 0 1`] = ` [ - "[ 0/1 → 1/8 | s:brk speed:0.5 unit:c begin:0 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", + "[ 0/1 → 1/8 | s:brk speed:0.5 unit:c begin:0.375 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", "[ 1/8 → 1/4 | s:brk speed:0.5 unit:c begin:0.625 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", - "[ 1/4 → 3/8 | s:brk speed:0.5 unit:c begin:0.3125 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", - "[ 3/8 → 1/2 | s:brk speed:0.5 unit:c begin:0.375 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", - "[ 1/2 → 5/8 | s:brk speed:0.5 unit:c begin:0.25 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", - "[ 5/8 → 3/4 | s:brk speed:0.5 unit:c begin:0.125 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", - "[ 3/4 → 7/8 | s:brk speed:0.5 unit:c begin:0.1875 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", - "[ 7/8 → 1/1 | s:brk speed:0.5 unit:c begin:0.375 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", - "[ 1/1 → 9/8 | s:brk speed:0.5 unit:c begin:0.5 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", - "[ 9/8 → 5/4 | s:brk speed:0.5 unit:c begin:0.625 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", - "[ 5/4 → 11/8 | s:brk speed:0.5 unit:c begin:0.6875 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", - "[ 11/8 → 3/2 | s:brk speed:0.5 unit:c begin:0.125 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", - "[ 3/2 → 13/8 | s:brk speed:0.5 unit:c begin:0.5625 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", - "[ 13/8 → 7/4 | s:brk speed:0.5 unit:c begin:0.4375 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", - "[ 7/4 → 15/8 | s:brk speed:0.5 unit:c begin:0.1875 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", - "[ 15/8 → 2/1 | s:brk speed:0.5 unit:c begin:0.5625 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", - "[ 2/1 → 17/8 | s:brk speed:0.5 unit:c begin:0.9375 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", - "[ 17/8 → 9/4 | s:brk speed:0.5 unit:c begin:0.875 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", - "[ 9/4 → 19/8 | s:brk speed:0.5 unit:c begin:0.3125 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", + "[ 1/4 → 3/8 | s:brk speed:0.5 unit:c begin:0.125 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", + "[ 3/8 → 1/2 | s:brk speed:0.5 unit:c begin:0.8125 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", + "[ 1/2 → 5/8 | s:brk speed:0.5 unit:c begin:0.3125 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", + "[ 5/8 → 3/4 | s:brk speed:0.5 unit:c begin:0.6875 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", + "[ 3/4 → 7/8 | s:brk speed:0.5 unit:c begin:0.25 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", + "[ 7/8 → 1/1 | s:brk speed:0.5 unit:c begin:0.875 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", + "[ 1/1 → 9/8 | s:brk speed:0.5 unit:c begin:0.0625 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", + "[ 9/8 → 5/4 | s:brk speed:0.5 unit:c begin:0 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", + "[ 5/4 → 11/8 | s:brk speed:0.5 unit:c begin:0.9375 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", + "[ 11/8 → 3/2 | s:brk speed:0.5 unit:c begin:0 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", + "[ 3/2 → 13/8 | s:brk speed:0.5 unit:c begin:0.125 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", + "[ 13/8 → 7/4 | s:brk speed:0.5 unit:c begin:0.625 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", + "[ 7/4 → 15/8 | s:brk speed:0.5 unit:c begin:0.3125 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", + "[ 15/8 → 2/1 | s:brk speed:0.5 unit:c begin:0.625 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", + "[ 2/1 → 17/8 | s:brk speed:0.5 unit:c begin:0.5625 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", + "[ 17/8 → 9/4 | s:brk speed:0.5 unit:c begin:0.4375 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", + "[ 9/4 → 19/8 | s:brk speed:0.5 unit:c begin:0.1875 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", "[ 19/8 → 5/2 | s:brk speed:0.5 unit:c begin:0.8125 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", - "[ 5/2 → 21/8 | s:brk speed:0.5 unit:c begin:0.4375 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", - "[ 21/8 → 11/4 | s:brk speed:0.5 unit:c begin:0.125 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", - "[ 11/4 → 23/8 | s:brk speed:0.5 unit:c begin:0.625 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", - "[ 23/8 → 3/1 | s:brk speed:0.5 unit:c begin:0 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", - "[ 3/1 → 25/8 | s:brk speed:0.5 unit:c begin:0.1875 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", - "[ 25/8 → 13/4 | s:brk speed:0.5 unit:c begin:0.3125 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", - "[ 13/4 → 27/8 | s:brk speed:0.5 unit:c begin:0.9375 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", - "[ 27/8 → 7/2 | s:brk speed:0.5 unit:c begin:0.375 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", - "[ 7/2 → 29/8 | s:brk speed:0.5 unit:c begin:0.375 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", - "[ 29/8 → 15/4 | s:brk speed:0.5 unit:c begin:0.9375 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", - "[ 15/4 → 31/8 | s:brk speed:0.5 unit:c begin:0.75 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", - "[ 31/8 → 4/1 | s:brk speed:0.5 unit:c begin:0.6875 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", + "[ 5/2 → 21/8 | s:brk speed:0.5 unit:c begin:0.6875 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", + "[ 21/8 → 11/4 | s:brk speed:0.5 unit:c begin:0.3125 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", + "[ 11/4 → 23/8 | s:brk speed:0.5 unit:c begin:0.3125 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", + "[ 23/8 → 3/1 | s:brk speed:0.5 unit:c begin:0.8125 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", + "[ 3/1 → 25/8 | s:brk speed:0.5 unit:c begin:0.5625 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", + "[ 25/8 → 13/4 | s:brk speed:0.5 unit:c begin:0.5625 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", + "[ 13/4 → 27/8 | s:brk speed:0.5 unit:c begin:0.875 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", + "[ 27/8 → 7/2 | s:brk speed:0.5 unit:c begin:0 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", + "[ 7/2 → 29/8 | s:brk speed:0.5 unit:c begin:0.1875 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", + "[ 29/8 → 15/4 | s:brk speed:0.5 unit:c begin:0.5625 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", + "[ 15/4 → 31/8 | s:brk speed:0.5 unit:c begin:0.5625 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", + "[ 31/8 → 4/1 | s:brk speed:0.5 unit:c begin:0.125 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", ] `; @@ -6998,35 +6983,35 @@ exports[`runs examples > example "offset" example index 0 1`] = ` exports[`runs examples > example "often" example index 0 1`] = ` [ "[ 0/1 → 1/8 | s:hh speed:0.5 ]", - "[ 1/8 → 1/4 | s:hh ]", + "[ 1/8 → 1/4 | s:hh speed:0.5 ]", "[ 1/4 → 3/8 | s:hh speed:0.5 ]", - "[ 3/8 → 1/2 | s:hh speed:0.5 ]", + "[ 3/8 → 1/2 | s:hh ]", "[ 1/2 → 5/8 | s:hh speed:0.5 ]", - "[ 5/8 → 3/4 | s:hh ]", + "[ 5/8 → 3/4 | s:hh speed:0.5 ]", "[ 3/4 → 7/8 | s:hh speed:0.5 ]", "[ 7/8 → 1/1 | s:hh ]", "[ 1/1 → 9/8 | s:hh speed:0.5 ]", - "[ 9/8 → 5/4 | s:hh ]", - "[ 5/4 → 11/8 | s:hh speed:0.5 ]", - "[ 11/8 → 3/2 | s:hh ]", + "[ 9/8 → 5/4 | s:hh speed:0.5 ]", + "[ 5/4 → 11/8 | s:hh ]", + "[ 11/8 → 3/2 | s:hh speed:0.5 ]", "[ 3/2 → 13/8 | s:hh speed:0.5 ]", "[ 13/8 → 7/4 | s:hh speed:0.5 ]", "[ 7/4 → 15/8 | s:hh speed:0.5 ]", - "[ 15/8 → 2/1 | s:hh ]", + "[ 15/8 → 2/1 | s:hh speed:0.5 ]", "[ 2/1 → 17/8 | s:hh speed:0.5 ]", - "[ 17/8 → 9/4 | s:hh ]", + "[ 17/8 → 9/4 | s:hh speed:0.5 ]", "[ 9/4 → 19/8 | s:hh speed:0.5 ]", - "[ 19/8 → 5/2 | s:hh speed:0.5 ]", + "[ 19/8 → 5/2 | s:hh ]", "[ 5/2 → 21/8 | s:hh speed:0.5 ]", "[ 21/8 → 11/4 | s:hh speed:0.5 ]", "[ 11/4 → 23/8 | s:hh speed:0.5 ]", "[ 23/8 → 3/1 | s:hh ]", "[ 3/1 → 25/8 | s:hh speed:0.5 ]", "[ 25/8 → 13/4 | s:hh speed:0.5 ]", - "[ 13/4 → 27/8 | s:hh speed:0.5 ]", + "[ 13/4 → 27/8 | s:hh ]", "[ 27/8 → 7/2 | s:hh speed:0.5 ]", "[ 7/2 → 29/8 | s:hh speed:0.5 ]", - "[ 29/8 → 15/4 | s:hh ]", + "[ 29/8 → 15/4 | s:hh speed:0.5 ]", "[ 15/4 → 31/8 | s:hh speed:0.5 ]", "[ 31/8 → 4/1 | s:hh speed:0.5 ]", ] @@ -7298,54 +7283,54 @@ exports[`runs examples > example "penv" example index 0 1`] = ` exports[`runs examples > example "perlin" example index 0 1`] = ` [ - "[ 0/1 → 1/8 | s:hh cutoff:3801.944299018942 ]", - "[ 0/1 → 1/4 | s:bd cutoff:3801.944299018942 ]", - "[ 1/8 → 1/4 | s:hh cutoff:3752.180364182138 ]", - "[ 1/4 → 3/8 | s:hh cutoff:3481.0331450903504 ]", - "[ 1/4 → 1/2 | s:bd cutoff:3481.0331450903504 ]", - "[ 3/8 → 1/2 | s:hh cutoff:2948.767180467044 ]", - "[ 1/2 → 5/8 | s:hh cutoff:2251.8828762695193 ]", - "[ 1/2 → 3/4 | s:bd cutoff:2251.8828762695193 ]", - "[ 5/8 → 3/4 | s:hh cutoff:1554.9985720719947 ]", - "[ 3/4 → 7/8 | s:hh cutoff:1022.7326074486882 ]", - "[ 3/4 → 1/1 | s:bd cutoff:1022.7326074486882 ]", - "[ 7/8 → 1/1 | s:hh cutoff:751.5853883569008 ]", - "[ 1/1 → 9/8 | s:hh cutoff:701.8214535200968 ]", - "[ 1/1 → 5/4 | s:bd cutoff:701.8214535200968 ]", - "[ 9/8 → 5/4 | s:hh cutoff:758.9508705680288 ]", - "[ 5/4 → 11/8 | s:hh cutoff:1070.2301657379394 ]", - "[ 5/4 → 3/2 | s:bd cutoff:1070.2301657379394 ]", - "[ 11/8 → 3/2 | s:hh cutoff:1681.2759838209531 ]", - "[ 3/2 → 13/8 | s:hh cutoff:2481.3050446100533 ]", - "[ 3/2 → 7/4 | s:bd cutoff:2481.3050446100533 ]", - "[ 13/8 → 7/4 | s:hh cutoff:3281.3341053991535 ]", - "[ 7/4 → 15/8 | s:hh cutoff:3892.379923482167 ]", - "[ 7/4 → 2/1 | s:bd cutoff:3892.379923482167 ]", - "[ 15/8 → 2/1 | s:hh cutoff:4203.6592186520775 ]", - "[ 2/1 → 17/8 | s:hh cutoff:4260.78863570001 ]", - "[ 2/1 → 9/4 | s:bd cutoff:4260.78863570001 ]", - "[ 17/8 → 9/4 | s:hh cutoff:4250.943561981614 ]", - "[ 9/4 → 19/8 | s:hh cutoff:4197.301012025491 ]", - "[ 9/4 → 5/2 | s:bd cutoff:4197.301012025491 ]", - "[ 19/8 → 5/2 | s:hh cutoff:4091.9999003530734 ]", - "[ 5/2 → 21/8 | s:hh cutoff:3954.1314345551655 ]", - "[ 5/2 → 11/4 | s:bd cutoff:3954.1314345551655 ]", - "[ 21/8 → 11/4 | s:hh cutoff:3816.2629687572576 ]", - "[ 11/4 → 23/8 | s:hh cutoff:3710.9618570848397 ]", - "[ 11/4 → 3/1 | s:bd cutoff:3710.9618570848397 ]", - "[ 23/8 → 3/1 | s:hh cutoff:3657.3193071287164 ]", - "[ 3/1 → 25/8 | s:hh cutoff:3647.474233410321 ]", - "[ 3/1 → 13/4 | s:bd cutoff:3647.474233410321 ]", - "[ 25/8 → 13/4 | s:hh cutoff:3623.927675406968 ]", - "[ 13/4 → 27/8 | s:hh cutoff:3495.6302700122706 ]", - "[ 13/4 → 7/2 | s:bd cutoff:3495.6302700122706 ]", - "[ 27/8 → 7/2 | s:hh cutoff:3243.7805830790653 ]", - "[ 7/2 → 29/8 | s:hh cutoff:2914.039240393322 ]", - "[ 7/2 → 15/4 | s:bd cutoff:2914.039240393322 ]", - "[ 29/8 → 15/4 | s:hh cutoff:2584.2978977075786 ]", - "[ 15/4 → 31/8 | s:hh cutoff:2332.4482107743734 ]", - "[ 15/4 → 4/1 | s:bd cutoff:2332.4482107743734 ]", - "[ 31/8 → 4/1 | s:hh cutoff:2204.150805379676 ]", + "[ 0/1 → 1/8 | s:hh cutoff:3410.6697876704857 ]", + "[ 0/1 → 1/4 | s:bd cutoff:3410.6697876704857 ]", + "[ 1/8 → 1/4 | s:hh cutoff:3378.181624527514 ]", + "[ 1/4 → 3/8 | s:hh cutoff:3201.164370596416 ]", + "[ 1/4 → 1/2 | s:bd cutoff:3201.164370596416 ]", + "[ 3/8 → 1/2 | s:hh cutoff:2853.676907017785 ]", + "[ 1/2 → 5/8 | s:hh cutoff:2398.7190938787535 ]", + "[ 1/2 → 3/4 | s:bd cutoff:2398.7190938787535 ]", + "[ 5/8 → 3/4 | s:hh cutoff:1943.7612807397215 ]", + "[ 3/4 → 7/8 | s:hh cutoff:1596.2738171610908 ]", + "[ 3/4 → 1/1 | s:bd cutoff:1596.2738171610908 ]", + "[ 7/8 → 1/1 | s:hh cutoff:1419.2565632299932 ]", + "[ 1/1 → 9/8 | s:hh cutoff:1386.7684000870213 ]", + "[ 1/1 → 5/4 | s:bd cutoff:1386.7684000870213 ]", + "[ 9/8 → 5/4 | s:hh cutoff:1442.5150435813734 ]", + "[ 5/4 → 11/8 | s:hh cutoff:1746.2600630772158 ]", + "[ 5/4 → 3/2 | s:bd cutoff:1746.2600630772158 ]", + "[ 11/8 → 3/2 | s:hh cutoff:2342.5159876004573 ]", + "[ 3/2 → 13/8 | s:hh cutoff:3123.1809609453194 ]", + "[ 3/2 → 7/4 | s:bd cutoff:3123.1809609453194 ]", + "[ 13/8 → 7/4 | s:hh cutoff:3903.8459342901815 ]", + "[ 7/4 → 15/8 | s:hh cutoff:4500.101858813423 ]", + "[ 7/4 → 2/1 | s:bd cutoff:4500.101858813423 ]", + "[ 15/8 → 2/1 | s:hh cutoff:4803.846878309266 ]", + "[ 2/1 → 17/8 | s:hh cutoff:4859.5935218036175 ]", + "[ 2/1 → 9/4 | s:bd cutoff:4859.5935218036175 ]", + "[ 17/8 → 9/4 | s:hh cutoff:4863.631636751641 ]", + "[ 9/4 → 19/8 | s:hh cutoff:4885.633989301141 ]", + "[ 9/4 → 5/2 | s:bd cutoff:4885.633989301141 ]", + "[ 19/8 → 5/2 | s:hh cutoff:4928.824929790842 ]", + "[ 5/2 → 21/8 | s:hh cutoff:4985.37389311241 ]", + "[ 5/2 → 11/4 | s:bd cutoff:4985.37389311241 ]", + "[ 21/8 → 11/4 | s:hh cutoff:5041.922856433977 ]", + "[ 11/4 → 23/8 | s:hh cutoff:5085.113796923679 ]", + "[ 11/4 → 3/1 | s:bd cutoff:5085.113796923679 ]", + "[ 23/8 → 3/1 | s:hh cutoff:5107.116149473179 ]", + "[ 3/1 → 25/8 | s:hh cutoff:5111.154264421202 ]", + "[ 3/1 → 13/4 | s:bd cutoff:5111.154264421202 ]", + "[ 25/8 → 13/4 | s:hh cutoff:5054.286698772394 ]", + "[ 13/4 → 27/8 | s:hh cutoff:4744.434145256264 ]", + "[ 13/4 → 7/2 | s:bd cutoff:4744.434145256264 ]", + "[ 27/8 → 7/2 | s:hh cutoff:4136.189041947908 ]", + "[ 7/2 → 29/8 | s:hh cutoff:3339.826896379236 ]", + "[ 7/2 → 15/4 | s:bd cutoff:3339.826896379236 ]", + "[ 29/8 → 15/4 | s:hh cutoff:2543.464750810564 ]", + "[ 15/4 → 31/8 | s:hh cutoff:1935.2196475022083 ]", + "[ 15/4 → 4/1 | s:bd cutoff:1935.2196475022083 ]", + "[ 31/8 → 4/1 | s:hh cutoff:1625.3670939860783 ]", ] `; @@ -8167,54 +8152,54 @@ exports[`runs examples > example "queryArc" example index 0 1`] = `[]`; exports[`runs examples > example "rand" example index 0 1`] = ` [ - "[ 0/1 → 1/8 | s:hh cutoff:3801.944299018942 ]", - "[ 0/1 → 1/4 | s:bd cutoff:3801.944299018942 ]", - "[ 1/8 → 1/4 | s:hh cutoff:6647.100417292677 ]", - "[ 1/4 → 3/8 | s:hh cutoff:4935.184325557202 ]", - "[ 1/4 → 1/2 | s:bd cutoff:4935.184325557202 ]", - "[ 3/8 → 1/2 | s:hh cutoff:4274.936107802205 ]", - "[ 1/2 → 5/8 | s:hh cutoff:3599.519268143922 ]", - "[ 1/2 → 3/4 | s:bd cutoff:3599.519268143922 ]", - "[ 5/8 → 3/4 | s:hh cutoff:7203.329019364901 ]", - "[ 3/4 → 7/8 | s:hh cutoff:5311.3214410841465 ]", - "[ 3/4 → 1/1 | s:bd cutoff:5311.3214410841465 ]", - "[ 7/8 → 1/1 | s:hh cutoff:7230.677842278965 ]", - "[ 1/1 → 9/8 | s:hh cutoff:701.8214535200968 ]", - "[ 1/1 → 5/4 | s:bd cutoff:701.8214535200968 ]", - "[ 9/8 → 5/4 | s:hh cutoff:6626.493136398494 ]", - "[ 5/4 → 11/8 | s:hh cutoff:5536.982340388931 ]", - "[ 5/4 → 3/2 | s:bd cutoff:5536.982340388931 ]", - "[ 11/8 → 3/2 | s:hh cutoff:6926.114265923388 ]", - "[ 3/2 → 13/8 | s:hh cutoff:2300.4843831295148 ]", - "[ 3/2 → 7/4 | s:bd cutoff:2300.4843831295148 ]", - "[ 13/8 → 7/4 | s:hh cutoff:2510.1786771556363 ]", - "[ 7/4 → 15/8 | s:hh cutoff:5990.686780540273 ]", - "[ 7/4 → 2/1 | s:bd cutoff:5990.686780540273 ]", - "[ 15/8 → 2/1 | s:hh cutoff:6187.015319708735 ]", - "[ 2/1 → 17/8 | s:hh cutoff:4260.78863570001 ]", - "[ 2/1 → 9/4 | s:bd cutoff:4260.78863570001 ]", - "[ 17/8 → 9/4 | s:hh cutoff:6301.981445983984 ]", - "[ 9/4 → 19/8 | s:hh cutoff:5212.422806769609 ]", - "[ 9/4 → 5/2 | s:bd cutoff:5212.422806769609 ]", - "[ 19/8 → 5/2 | s:hh cutoff:5561.523957410827 ]", - "[ 5/2 → 21/8 | s:hh cutoff:3020.9835229907185 ]", - "[ 5/2 → 11/4 | s:bd cutoff:3020.9835229907185 ]", - "[ 21/8 → 11/4 | s:hh cutoff:576.5502714784816 ]", - "[ 11/4 → 23/8 | s:hh cutoff:5743.939216597937 ]", - "[ 11/4 → 3/1 | s:bd cutoff:5743.939216597937 ]", - "[ 23/8 → 3/1 | s:hh cutoff:7271.8438868178055 ]", - "[ 3/1 → 25/8 | s:hh cutoff:3647.474233410321 ]", - "[ 3/1 → 13/4 | s:bd cutoff:3647.474233410321 ]", - "[ 25/8 → 13/4 | s:hh cutoff:5633.619675179943 ]", - "[ 13/4 → 27/8 | s:hh cutoff:2873.2354695675895 ]", - "[ 13/4 → 7/2 | s:bd cutoff:2873.2354695675895 ]", - "[ 27/8 → 7/2 | s:hh cutoff:5596.839588950388 ]", - "[ 7/2 → 29/8 | s:hh cutoff:2628.3173956908286 ]", - "[ 7/2 → 15/4 | s:bd cutoff:2628.3173956908286 ]", - "[ 29/8 → 15/4 | s:hh cutoff:7124.103914946318 ]", - "[ 15/4 → 31/8 | s:hh cutoff:814.1072567086667 ]", - "[ 15/4 → 4/1 | s:bd cutoff:814.1072567086667 ]", - "[ 31/8 → 4/1 | s:hh cutoff:518.1868247454986 ]", + "[ 0/1 → 1/8 | s:hh cutoff:3410.6697876704857 ]", + "[ 0/1 → 1/4 | s:bd cutoff:3410.6697876704857 ]", + "[ 1/8 → 1/4 | s:hh cutoff:5409.978067153133 ]", + "[ 1/4 → 3/8 | s:hh cutoff:1470.4432229045779 ]", + "[ 1/4 → 1/2 | s:bd cutoff:1470.4432229045779 ]", + "[ 3/8 → 1/2 | s:hh cutoff:6906.840303097852 ]", + "[ 1/2 → 5/8 | s:hh cutoff:2951.713348273188 ]", + "[ 1/2 → 3/4 | s:bd cutoff:2951.713348273188 ]", + "[ 5/8 → 3/4 | s:hh cutoff:5732.849565800279 ]", + "[ 3/4 → 7/8 | s:hh cutoff:2621.97931134142 ]", + "[ 3/4 → 1/1 | s:bd cutoff:2621.97931134142 ]", + "[ 7/8 → 1/1 | s:hh cutoff:7323.85477644857 ]", + "[ 1/1 → 9/8 | s:hh cutoff:1386.7684000870213 ]", + "[ 1/1 → 5/4 | s:bd cutoff:1386.7684000870213 ]", + "[ 9/8 → 5/4 | s:hh cutoff:968.4956459095702 ]", + "[ 5/4 → 11/8 | s:hh cutoff:7674.6532345423475 ]", + "[ 5/4 → 3/2 | s:bd cutoff:7674.6532345423475 ]", + "[ 11/8 → 3/2 | s:hh cutoff:863.651579245925 ]", + "[ 3/2 → 13/8 | s:hh cutoff:1476.3008129084483 ]", + "[ 3/2 → 7/4 | s:bd cutoff:1476.3008129084483 ]", + "[ 13/8 → 7/4 | s:hh cutoff:5232.728436938487 ]", + "[ 7/4 → 15/8 | s:hh cutoff:3057.402160600759 ]", + "[ 7/4 → 2/1 | s:bd cutoff:3057.402160600759 ]", + "[ 15/8 → 2/1 | s:hh cutoff:5307.644687825814 ]", + "[ 2/1 → 17/8 | s:hh cutoff:4859.5935218036175 ]", + "[ 2/1 → 9/4 | s:bd cutoff:4859.5935218036175 ]", + "[ 17/8 → 9/4 | s:hh cutoff:3798.551473999396 ]", + "[ 9/4 → 19/8 | s:hh cutoff:2020.6333762034774 ]", + "[ 9/4 → 5/2 | s:bd cutoff:2020.6333762034774 ]", + "[ 19/8 → 5/2 | s:hh cutoff:6903.368854080327 ]", + "[ 5/2 → 21/8 | s:hh cutoff:5992.341757635586 ]", + "[ 5/2 → 11/4 | s:bd cutoff:5992.341757635586 ]", + "[ 21/8 → 11/4 | s:hh cutoff:3192.4760919064283 ]", + "[ 11/4 → 23/8 | s:hh cutoff:3188.529685838148 ]", + "[ 11/4 → 3/1 | s:bd cutoff:3188.529685838148 ]", + "[ 23/8 → 3/1 | s:hh cutoff:6837.369324173778 ]", + "[ 3/1 → 25/8 | s:hh cutoff:5111.154264421202 ]", + "[ 3/1 → 13/4 | s:bd cutoff:5111.154264421202 ]", + "[ 25/8 → 13/4 | s:hh cutoff:4812.422384973615 ]", + "[ 13/4 → 27/8 | s:hh cutoff:7517.148802988231 ]", + "[ 13/4 → 7/2 | s:bd cutoff:7517.148802988231 ]", + "[ 27/8 → 7/2 | s:hh cutoff:821.3959728600457 ]", + "[ 7/2 → 29/8 | s:hh cutoff:2354.0139601100236 ]", + "[ 7/2 → 15/4 | s:bd cutoff:2354.0139601100236 ]", + "[ 29/8 → 15/4 | s:hh cutoff:4901.923676487058 ]", + "[ 15/4 → 31/8 | s:hh cutoff:4723.308931104839 ]", + "[ 15/4 → 4/1 | s:bd cutoff:4723.308931104839 ]", + "[ 31/8 → 4/1 | s:hh cutoff:1649.9183619162068 ]", ] `; @@ -8381,35 +8366,35 @@ exports[`runs examples > example "rarely" example index 0 1`] = ` [ "[ 0/1 → 1/8 | s:hh ]", "[ 1/8 → 1/4 | s:hh ]", - "[ 1/4 → 3/8 | s:hh ]", + "[ 1/4 → 3/8 | s:hh speed:0.5 ]", "[ 3/8 → 1/2 | s:hh ]", "[ 1/2 → 5/8 | s:hh ]", "[ 5/8 → 3/4 | s:hh ]", "[ 3/4 → 7/8 | s:hh ]", "[ 7/8 → 1/1 | s:hh ]", "[ 1/1 → 9/8 | s:hh speed:0.5 ]", - "[ 9/8 → 5/4 | s:hh ]", + "[ 9/8 → 5/4 | s:hh speed:0.5 ]", "[ 5/4 → 11/8 | s:hh ]", - "[ 11/8 → 3/2 | s:hh ]", + "[ 11/8 → 3/2 | s:hh speed:0.5 ]", "[ 3/2 → 13/8 | s:hh speed:0.5 ]", "[ 13/8 → 7/4 | s:hh ]", "[ 7/4 → 15/8 | s:hh ]", "[ 15/8 → 2/1 | s:hh ]", "[ 2/1 → 17/8 | s:hh ]", "[ 17/8 → 9/4 | s:hh ]", - "[ 9/4 → 19/8 | s:hh ]", + "[ 9/4 → 19/8 | s:hh speed:0.5 ]", "[ 19/8 → 5/2 | s:hh ]", "[ 5/2 → 21/8 | s:hh ]", - "[ 21/8 → 11/4 | s:hh speed:0.5 ]", + "[ 21/8 → 11/4 | s:hh ]", "[ 11/4 → 23/8 | s:hh ]", "[ 23/8 → 3/1 | s:hh ]", "[ 3/1 → 25/8 | s:hh ]", "[ 25/8 → 13/4 | s:hh ]", "[ 13/4 → 27/8 | s:hh ]", - "[ 27/8 → 7/2 | s:hh ]", - "[ 7/2 → 29/8 | s:hh ]", + "[ 27/8 → 7/2 | s:hh speed:0.5 ]", + "[ 7/2 → 29/8 | s:hh speed:0.5 ]", "[ 29/8 → 15/4 | s:hh ]", - "[ 15/4 → 31/8 | s:hh speed:0.5 ]", + "[ 15/4 → 31/8 | s:hh ]", "[ 31/8 → 4/1 | s:hh speed:0.5 ]", ] `; @@ -8454,22 +8439,22 @@ exports[`runs examples > example "release" example index 0 1`] = ` exports[`runs examples > example "repeatCycles" example index 0 1`] = ` [ - "[ 0/1 → 1/4 | note:39 s:gm_acoustic_guitar_nylon ]", - "[ 1/4 → 1/2 | note:41 s:gm_acoustic_guitar_nylon ]", - "[ 1/2 → 3/4 | note:38 s:gm_acoustic_guitar_nylon ]", - "[ 3/4 → 1/1 | note:41 s:gm_acoustic_guitar_nylon ]", - "[ 1/1 → 5/4 | note:39 s:gm_acoustic_guitar_nylon ]", - "[ 5/4 → 3/2 | note:41 s:gm_acoustic_guitar_nylon ]", - "[ 3/2 → 7/4 | note:38 s:gm_acoustic_guitar_nylon ]", - "[ 7/4 → 2/1 | note:41 s:gm_acoustic_guitar_nylon ]", - "[ 2/1 → 9/4 | note:34 s:gm_acoustic_guitar_nylon ]", - "[ 9/4 → 5/2 | note:42 s:gm_acoustic_guitar_nylon ]", - "[ 5/2 → 11/4 | note:36 s:gm_acoustic_guitar_nylon ]", - "[ 11/4 → 3/1 | note:42 s:gm_acoustic_guitar_nylon ]", - "[ 3/1 → 13/4 | note:34 s:gm_acoustic_guitar_nylon ]", - "[ 13/4 → 7/2 | note:42 s:gm_acoustic_guitar_nylon ]", - "[ 7/2 → 15/4 | note:36 s:gm_acoustic_guitar_nylon ]", - "[ 15/4 → 4/1 | note:42 s:gm_acoustic_guitar_nylon ]", + "[ 0/1 → 1/4 | note:38 s:gm_acoustic_guitar_nylon ]", + "[ 1/4 → 1/2 | note:35 s:gm_acoustic_guitar_nylon ]", + "[ 1/2 → 3/4 | note:37 s:gm_acoustic_guitar_nylon ]", + "[ 3/4 → 1/1 | note:37 s:gm_acoustic_guitar_nylon ]", + "[ 1/1 → 5/4 | note:38 s:gm_acoustic_guitar_nylon ]", + "[ 5/4 → 3/2 | note:35 s:gm_acoustic_guitar_nylon ]", + "[ 3/2 → 7/4 | note:37 s:gm_acoustic_guitar_nylon ]", + "[ 7/4 → 2/1 | note:37 s:gm_acoustic_guitar_nylon ]", + "[ 2/1 → 9/4 | note:35 s:gm_acoustic_guitar_nylon ]", + "[ 9/4 → 5/2 | note:45 s:gm_acoustic_guitar_nylon ]", + "[ 5/2 → 11/4 | note:35 s:gm_acoustic_guitar_nylon ]", + "[ 11/4 → 3/1 | note:38 s:gm_acoustic_guitar_nylon ]", + "[ 3/1 → 13/4 | note:35 s:gm_acoustic_guitar_nylon ]", + "[ 13/4 → 7/2 | note:45 s:gm_acoustic_guitar_nylon ]", + "[ 7/2 → 15/4 | note:35 s:gm_acoustic_guitar_nylon ]", + "[ 15/4 → 4/1 | note:38 s:gm_acoustic_guitar_nylon ]", ] `; @@ -8634,43 +8619,43 @@ exports[`runs examples > example "ribbon" example index 0 1`] = ` exports[`runs examples > example "ribbon" example index 1 1`] = ` [ - "[ 0/1 → 1/4 | note:E4 ]", - "[ 1/4 → 1/2 | note:G3 ]", - "[ 1/2 → 3/4 | note:C3 ]", - "[ 3/4 → 1/1 | note:E4 ]", - "[ 1/1 → 5/4 | note:A3 ]", + "[ 0/1 → 1/4 | note:D3 ]", + "[ 1/4 → 1/2 | note:A3 ]", + "[ 1/2 → 3/4 | note:D3 ]", + "[ 3/4 → 1/1 | note:E3 ]", + "[ 1/1 → 5/4 | note:C3 ]", "[ 5/4 → 3/2 | note:D3 ]", - "[ 3/2 → 7/4 | note:A3 ]", - "[ 7/4 → 2/1 | note:G3 ]", - "[ 2/1 → 9/4 | note:E4 ]", - "[ 9/4 → 5/2 | note:G3 ]", - "[ 5/2 → 11/4 | note:C3 ]", - "[ 11/4 → 3/1 | note:E4 ]", - "[ 3/1 → 13/4 | note:A3 ]", + "[ 3/2 → 7/4 | note:D3 ]", + "[ 7/4 → 2/1 | note:C4 ]", + "[ 2/1 → 9/4 | note:D3 ]", + "[ 9/4 → 5/2 | note:A3 ]", + "[ 5/2 → 11/4 | note:D3 ]", + "[ 11/4 → 3/1 | note:E3 ]", + "[ 3/1 → 13/4 | note:C3 ]", "[ 13/4 → 7/2 | note:D3 ]", - "[ 7/2 → 15/4 | note:A3 ]", - "[ 15/4 → 4/1 | note:G3 ]", + "[ 7/2 → 15/4 | note:D3 ]", + "[ 15/4 → 4/1 | note:C4 ]", ] `; exports[`runs examples > example "ribbon" example index 2 1`] = ` [ - "[ 1/8 → 3/16 | s:bd ]", - "[ 7/16 → 1/2 | s:bd ]", - "[ 5/8 → 11/16 | s:bd ]", - "[ 15/16 → 1/1 | s:bd ]", - "[ 9/8 → 19/16 | s:bd ]", - "[ 23/16 → 3/2 | s:bd ]", - "[ 13/8 → 27/16 | s:bd ]", - "[ 31/16 → 2/1 | s:bd ]", - "[ 17/8 → 35/16 | s:bd ]", - "[ 39/16 → 5/2 | s:bd ]", - "[ 21/8 → 43/16 | s:bd ]", - "[ 47/16 → 3/1 | s:bd ]", - "[ 25/8 → 51/16 | s:bd ]", - "[ 55/16 → 7/2 | s:bd ]", - "[ 29/8 → 59/16 | s:bd ]", - "[ 63/16 → 4/1 | s:bd ]", + "[ 1/16 → 1/8 | s:bd ]", + "[ 3/16 → 1/4 | s:bd ]", + "[ 9/16 → 5/8 | s:bd ]", + "[ 11/16 → 3/4 | s:bd ]", + "[ 17/16 → 9/8 | s:bd ]", + "[ 19/16 → 5/4 | s:bd ]", + "[ 25/16 → 13/8 | s:bd ]", + "[ 27/16 → 7/4 | s:bd ]", + "[ 33/16 → 17/8 | s:bd ]", + "[ 35/16 → 9/4 | s:bd ]", + "[ 41/16 → 21/8 | s:bd ]", + "[ 43/16 → 11/4 | s:bd ]", + "[ 49/16 → 25/8 | s:bd ]", + "[ 51/16 → 13/4 | s:bd ]", + "[ 57/16 → 29/8 | s:bd ]", + "[ 59/16 → 15/4 | s:bd ]", ] `; @@ -9201,38 +9186,38 @@ exports[`runs examples > example "scale" example index 1 1`] = ` exports[`runs examples > example "scale" example index 2 1`] = ` [ - "[ 0/1 → 1/8 | note:D4 s:piano ]", - "[ 1/8 → 1/4 | note:C5 s:piano ]", - "[ 1/4 → 3/8 | note:G4 s:piano ]", - "[ 3/8 → 1/2 | note:F4 s:piano ]", - "[ 1/2 → 5/8 | note:C4 s:piano ]", - "[ 5/8 → 3/4 | note:D5 s:piano ]", - "[ 3/4 → 7/8 | note:G4 s:piano ]", + "[ 0/1 → 1/8 | note:C4 s:piano ]", + "[ 1/8 → 1/4 | note:G4 s:piano ]", + "[ 1/4 → 3/8 | note:F3 s:piano ]", + "[ 3/8 → 1/2 | note:D5 s:piano ]", + "[ 1/2 → 5/8 | note:A3 s:piano ]", + "[ 5/8 → 3/4 | note:A4 s:piano ]", + "[ 3/4 → 7/8 | note:A3 s:piano ]", "[ 7/8 → 1/1 | note:D5 s:piano ]", - "[ 1/1 → 9/8 | note:D3 s:piano ]", - "[ 9/8 → 5/4 | note:C5 s:piano ]", - "[ 5/4 → 11/8 | note:A4 s:piano ]", - "[ 11/8 → 3/2 | note:D5 s:piano ]", - "[ 3/2 → 13/8 | note:G3 s:piano ]", - "[ 13/8 → 7/4 | note:A3 s:piano ]", - "[ 7/4 → 15/8 | note:A4 s:piano ]", - "[ 15/8 → 2/1 | note:C5 s:piano ]", + "[ 1/1 → 9/8 | note:F3 s:piano ]", + "[ 9/8 → 5/4 | note:D3 s:piano ]", + "[ 5/4 → 11/8 | note:F5 s:piano ]", + "[ 11/8 → 3/2 | note:D3 s:piano ]", + "[ 3/2 → 13/8 | note:F3 s:piano ]", + "[ 13/8 → 7/4 | note:G4 s:piano ]", + "[ 7/4 → 15/8 | note:C4 s:piano ]", + "[ 15/8 → 2/1 | note:G4 s:piano ]", "[ 2/1 → 17/8 | note:F4 s:piano ]", - "[ 17/8 → 9/4 | note:C5 s:piano ]", - "[ 9/4 → 19/8 | note:G4 s:piano ]", - "[ 19/8 → 5/2 | note:A4 s:piano ]", - "[ 5/2 → 21/8 | note:C4 s:piano ]", - "[ 21/8 → 11/4 | note:D3 s:piano ]", - "[ 11/4 → 23/8 | note:A4 s:piano ]", + "[ 17/8 → 9/4 | note:D4 s:piano ]", + "[ 9/4 → 19/8 | note:G3 s:piano ]", + "[ 19/8 → 5/2 | note:D5 s:piano ]", + "[ 5/2 → 21/8 | note:A4 s:piano ]", + "[ 21/8 → 11/4 | note:C4 s:piano ]", + "[ 11/4 → 23/8 | note:C4 s:piano ]", "[ 23/8 → 3/1 | note:D5 s:piano ]", - "[ 3/1 → 25/8 | note:D4 s:piano ]", - "[ 25/8 → 13/4 | note:A4 s:piano ]", - "[ 13/4 → 27/8 | note:A3 s:piano ]", - "[ 27/8 → 7/2 | note:A4 s:piano ]", - "[ 7/2 → 29/8 | note:A3 s:piano ]", - "[ 29/8 → 15/4 | note:D5 s:piano ]", - "[ 15/4 → 31/8 | note:D3 s:piano ]", - "[ 31/8 → 4/1 | note:D3 s:piano ]", + "[ 3/1 → 25/8 | note:G4 s:piano ]", + "[ 25/8 → 13/4 | note:F4 s:piano ]", + "[ 13/4 → 27/8 | note:F5 s:piano ]", + "[ 27/8 → 7/2 | note:D3 s:piano ]", + "[ 7/2 → 29/8 | note:G3 s:piano ]", + "[ 29/8 → 15/4 | note:G4 s:piano ]", + "[ 15/4 → 31/8 | note:F4 s:piano ]", + "[ 31/8 → 4/1 | note:F3 s:piano ]", ] `; @@ -9271,70 +9256,70 @@ exports[`runs examples > example "scale" example index 3 1`] = ` exports[`runs examples > example "scale" example index 4 1`] = ` [ - "[ 0/1 → 1/16 | note:Gb1 ]", - "[ 1/16 → 1/8 | note:Gb1 ]", - "[ 1/8 → 3/16 | note:Gb1 ]", - "[ 3/16 → 1/4 | note:Gb1 ]", - "[ 1/4 → 5/16 | note:Gb1 ]", - "[ 5/16 → 3/8 | note:Gb1 ]", - "[ 3/8 → 7/16 | note:Gb1 ]", - "[ 7/16 → 1/2 | note:Gb1 ]", - "[ 1/2 → 9/16 | note:Gb1 ]", - "[ 9/16 → 5/8 | note:Gb1 ]", - "[ 5/8 → 11/16 | note:Gb1 ]", - "[ 11/16 → 3/4 | note:Gb1 ]", - "[ 3/4 → 13/16 | note:Gb1 ]", - "[ 13/16 → 7/8 | note:Gb1 ]", - "[ 7/8 → 15/16 | note:Gb1 ]", - "[ 15/16 → 1/1 | note:Gb1 ]", - "[ 1/1 → 17/16 | note:Cb3 ]", - "[ 17/16 → 9/8 | note:Cb3 ]", - "[ 9/8 → 19/16 | note:Cb3 ]", - "[ 19/16 → 5/4 | note:Cb3 ]", - "[ 5/4 → 21/16 | note:Cb3 ]", - "[ 21/16 → 11/8 | note:Cb3 ]", - "[ 11/8 → 23/16 | note:Cb3 ]", - "[ 23/16 → 3/2 | note:Cb3 ]", - "[ 3/2 → 25/16 | note:Cb3 ]", - "[ 25/16 → 13/8 | note:Cb3 ]", - "[ 13/8 → 27/16 | note:Cb3 ]", - "[ 27/16 → 7/4 | note:Cb3 ]", - "[ 7/4 → 29/16 | note:Cb3 ]", - "[ 29/16 → 15/8 | note:Cb3 ]", - "[ 15/8 → 31/16 | note:Cb3 ]", - "[ 31/16 → 2/1 | note:Cb3 ]", - "[ 2/1 → 33/16 | note:Eb4 ]", - "[ 33/16 → 17/8 | note:Eb4 ]", - "[ 17/8 → 35/16 | note:Eb4 ]", - "[ 35/16 → 9/4 | note:Eb4 ]", - "[ 9/4 → 37/16 | note:Eb4 ]", - "[ 37/16 → 19/8 | note:Eb4 ]", - "[ 19/8 → 39/16 | note:Eb4 ]", - "[ 39/16 → 5/2 | note:Eb4 ]", - "[ 5/2 → 41/16 | note:Eb4 ]", - "[ 41/16 → 21/8 | note:Eb4 ]", - "[ 21/8 → 43/16 | note:Eb4 ]", - "[ 43/16 → 11/4 | note:Eb4 ]", - "[ 11/4 → 45/16 | note:Eb4 ]", - "[ 45/16 → 23/8 | note:Eb4 ]", - "[ 23/8 → 47/16 | note:Eb4 ]", - "[ 47/16 → 3/1 | note:Eb4 ]", - "[ 3/1 → 49/16 | note:Db2 ]", - "[ 49/16 → 25/8 | note:Db2 ]", - "[ 25/8 → 51/16 | note:Db2 ]", - "[ 51/16 → 13/4 | note:Db2 ]", - "[ 13/4 → 53/16 | note:Db2 ]", - "[ 53/16 → 27/8 | note:Db2 ]", - "[ 27/8 → 55/16 | note:Db2 ]", - "[ 55/16 → 7/2 | note:Db2 ]", - "[ 7/2 → 57/16 | note:Db2 ]", - "[ 57/16 → 29/8 | note:Db2 ]", - "[ 29/8 → 59/16 | note:Db2 ]", - "[ 59/16 → 15/4 | note:Db2 ]", - "[ 15/4 → 61/16 | note:Db2 ]", - "[ 61/16 → 31/8 | note:Db2 ]", - "[ 31/8 → 63/16 | note:Db2 ]", - "[ 63/16 → 4/1 | note:Db2 ]", + "[ 0/1 → 1/16 | note:Gb2 ]", + "[ 1/16 → 1/8 | note:Gb2 ]", + "[ 1/8 → 3/16 | note:Gb2 ]", + "[ 3/16 → 1/4 | note:Gb2 ]", + "[ 1/4 → 5/16 | note:Gb2 ]", + "[ 5/16 → 3/8 | note:Gb2 ]", + "[ 3/8 → 7/16 | note:Gb2 ]", + "[ 7/16 → 1/2 | note:Gb2 ]", + "[ 1/2 → 9/16 | note:Gb2 ]", + "[ 9/16 → 5/8 | note:Gb2 ]", + "[ 5/8 → 11/16 | note:Gb2 ]", + "[ 11/16 → 3/4 | note:Gb2 ]", + "[ 3/4 → 13/16 | note:Gb2 ]", + "[ 13/16 → 7/8 | note:Gb2 ]", + "[ 7/8 → 15/16 | note:Gb2 ]", + "[ 15/16 → 1/1 | note:Gb2 ]", + "[ 1/1 → 17/16 | note:Bb1 ]", + "[ 17/16 → 9/8 | note:Bb1 ]", + "[ 9/8 → 19/16 | note:Bb1 ]", + "[ 19/16 → 5/4 | note:Bb1 ]", + "[ 5/4 → 21/16 | note:Bb1 ]", + "[ 21/16 → 11/8 | note:Bb1 ]", + "[ 11/8 → 23/16 | note:Bb1 ]", + "[ 23/16 → 3/2 | note:Bb1 ]", + "[ 3/2 → 25/16 | note:Bb1 ]", + "[ 25/16 → 13/8 | note:Bb1 ]", + "[ 13/8 → 27/16 | note:Bb1 ]", + "[ 27/16 → 7/4 | note:Bb1 ]", + "[ 7/4 → 29/16 | note:Bb1 ]", + "[ 29/16 → 15/8 | note:Bb1 ]", + "[ 15/8 → 31/16 | note:Bb1 ]", + "[ 31/16 → 2/1 | note:Bb1 ]", + "[ 2/1 → 33/16 | note:Db3 ]", + "[ 33/16 → 17/8 | note:Db3 ]", + "[ 17/8 → 35/16 | note:Db3 ]", + "[ 35/16 → 9/4 | note:Db3 ]", + "[ 9/4 → 37/16 | note:Db3 ]", + "[ 37/16 → 19/8 | note:Db3 ]", + "[ 19/8 → 39/16 | note:Db3 ]", + "[ 39/16 → 5/2 | note:Db3 ]", + "[ 5/2 → 41/16 | note:Db3 ]", + "[ 41/16 → 21/8 | note:Db3 ]", + "[ 21/8 → 43/16 | note:Db3 ]", + "[ 43/16 → 11/4 | note:Db3 ]", + "[ 11/4 → 45/16 | note:Db3 ]", + "[ 45/16 → 23/8 | note:Db3 ]", + "[ 23/8 → 47/16 | note:Db3 ]", + "[ 47/16 → 3/1 | note:Db3 ]", + "[ 3/1 → 49/16 | note:Eb3 ]", + "[ 49/16 → 25/8 | note:Eb3 ]", + "[ 25/8 → 51/16 | note:Eb3 ]", + "[ 51/16 → 13/4 | note:Eb3 ]", + "[ 13/4 → 53/16 | note:Eb3 ]", + "[ 53/16 → 27/8 | note:Eb3 ]", + "[ 27/8 → 55/16 | note:Eb3 ]", + "[ 55/16 → 7/2 | note:Eb3 ]", + "[ 7/2 → 57/16 | note:Eb3 ]", + "[ 57/16 → 29/8 | note:Eb3 ]", + "[ 29/8 → 59/16 | note:Eb3 ]", + "[ 59/16 → 15/4 | note:Eb3 ]", + "[ 15/4 → 61/16 | note:Eb3 ]", + "[ 61/16 → 31/8 | note:Eb3 ]", + "[ 31/8 → 63/16 | note:Eb3 ]", + "[ 63/16 → 4/1 | note:Eb3 ]", ] `; @@ -9408,45 +9393,45 @@ exports[`runs examples > example "scope" example index 0 1`] = ` exports[`runs examples > example "scramble" example index 0 1`] = ` [ "[ 0/1 → 1/4 | note:d s:piano ]", - "[ 1/4 → 1/2 | note:e s:piano ]", + "[ 1/4 → 1/2 | note:c s:piano ]", "[ 1/2 → 3/4 | note:d s:piano ]", - "[ 3/4 → 1/1 | note:e s:piano ]", + "[ 3/4 → 1/1 | note:d s:piano ]", "[ 1/1 → 5/4 | note:c s:piano ]", - "[ 5/4 → 3/2 | note:e s:piano ]", + "[ 5/4 → 3/2 | note:f s:piano ]", "[ 3/2 → 7/4 | note:c s:piano ]", - "[ 7/4 → 2/1 | note:e s:piano ]", + "[ 7/4 → 2/1 | note:d s:piano ]", "[ 2/1 → 9/4 | note:e s:piano ]", - "[ 9/4 → 5/2 | note:e s:piano ]", - "[ 5/2 → 11/4 | note:d s:piano ]", - "[ 11/4 → 3/1 | note:e s:piano ]", - "[ 3/1 → 13/4 | note:d s:piano ]", - "[ 13/4 → 7/2 | note:d s:piano ]", - "[ 7/2 → 15/4 | note:d s:piano ]", - "[ 15/4 → 4/1 | note:c s:piano ]", + "[ 9/4 → 5/2 | note:c s:piano ]", + "[ 5/2 → 11/4 | note:e s:piano ]", + "[ 11/4 → 3/1 | note:d s:piano ]", + "[ 3/1 → 13/4 | note:e s:piano ]", + "[ 13/4 → 7/2 | note:f s:piano ]", + "[ 7/2 → 15/4 | note:c s:piano ]", + "[ 15/4 → 4/1 | note:e s:piano ]", ] `; exports[`runs examples > example "scramble" example index 1 1`] = ` [ "[ 0/1 → 1/8 | note:d s:piano ]", - "[ 1/8 → 1/4 | note:e s:piano ]", + "[ 1/8 → 1/4 | note:c s:piano ]", "[ 1/4 → 3/8 | note:d s:piano ]", - "[ 3/8 → 1/2 | note:e s:piano ]", + "[ 3/8 → 1/2 | note:d s:piano ]", "[ 1/2 → 1/1 | note:g s:piano ]", "[ 1/1 → 9/8 | note:c s:piano ]", - "[ 9/8 → 5/4 | note:e s:piano ]", + "[ 9/8 → 5/4 | note:f s:piano ]", "[ 5/4 → 11/8 | note:c s:piano ]", - "[ 11/8 → 3/2 | note:e s:piano ]", + "[ 11/8 → 3/2 | note:d s:piano ]", "[ 3/2 → 2/1 | note:g s:piano ]", "[ 2/1 → 17/8 | note:e s:piano ]", - "[ 17/8 → 9/4 | note:e s:piano ]", - "[ 9/4 → 19/8 | note:d s:piano ]", - "[ 19/8 → 5/2 | note:e s:piano ]", + "[ 17/8 → 9/4 | note:c s:piano ]", + "[ 9/4 → 19/8 | note:e s:piano ]", + "[ 19/8 → 5/2 | note:d s:piano ]", "[ 5/2 → 3/1 | note:g s:piano ]", - "[ 3/1 → 25/8 | note:d s:piano ]", - "[ 25/8 → 13/4 | note:d s:piano ]", - "[ 13/4 → 27/8 | note:d s:piano ]", - "[ 27/8 → 7/2 | note:c s:piano ]", + "[ 3/1 → 25/8 | note:e s:piano ]", + "[ 25/8 → 13/4 | note:f s:piano ]", + "[ 13/4 → 27/8 | note:c s:piano ]", + "[ 27/8 → 7/2 | note:e s:piano ]", "[ 7/2 → 4/1 | note:g s:piano ]", ] `; @@ -9497,6 +9482,23 @@ exports[`runs examples > example "scrub" example index 1 1`] = ` ] `; +exports[`runs examples > example "seed" example index 0 1`] = ` +[ + "[ 1/4 → 1/2 | s:bd ]", + "[ 1/2 → 3/4 | s:bd ]", + "[ 3/4 → 1/1 | s:bd ]", + "[ 1/1 → 5/4 | s:bd ]", + "[ 5/4 → 3/2 | s:bd ]", + "[ 3/2 → 7/4 | s:bd ]", + "[ 7/4 → 2/1 | s:bd ]", + "[ 2/1 → 9/4 | s:bd ]", + "[ 11/4 → 3/1 | s:bd ]", + "[ 3/1 → 13/4 | s:bd ]", + "[ 13/4 → 7/2 | s:bd ]", + "[ 7/2 → 15/4 | s:bd ]", +] +`; + exports[`runs examples > example "segment" example index 0 1`] = ` [ "[ 0/1 → 1/24 | note:40 ]", @@ -9703,38 +9705,38 @@ exports[`runs examples > example "setGainCurve" example index 0 1`] = ` exports[`runs examples > example "setMaxPolyphony" example index 0 1`] = ` [ - "[ 0/1 → 1/8 | note:F#4 room:1 release:4 gain:0.5 ]", - "[ 1/8 → 1/4 | note:A5 room:1 release:4 gain:0.5 ]", - "[ 1/4 → 3/8 | note:C#5 room:1 release:4 gain:0.5 ]", - "[ 3/8 → 1/2 | note:A4 room:1 release:4 gain:0.5 ]", - "[ 1/2 → 5/8 | note:E4 room:1 release:4 gain:0.5 ]", - "[ 5/8 → 3/4 | note:C#6 room:1 release:4 gain:0.5 ]", - "[ 3/4 → 7/8 | note:D#5 room:1 release:4 gain:0.5 ]", + "[ 0/1 → 1/8 | note:E4 room:1 release:4 gain:0.5 ]", + "[ 1/8 → 1/4 | note:D#5 room:1 release:4 gain:0.5 ]", + "[ 1/4 → 3/8 | note:F#3 room:1 release:4 gain:0.5 ]", + "[ 3/8 → 1/2 | note:B5 room:1 release:4 gain:0.5 ]", + "[ 1/2 → 5/8 | note:C#4 room:1 release:4 gain:0.5 ]", + "[ 5/8 → 3/4 | note:E5 room:1 release:4 gain:0.5 ]", + "[ 3/4 → 7/8 | note:B3 room:1 release:4 gain:0.5 ]", "[ 7/8 → 1/1 | note:C#6 room:1 release:4 gain:0.5 ]", - "[ 1/1 → 9/8 | note:C#3 room:1 release:4 gain:0.5 ]", - "[ 9/8 → 5/4 | note:A5 room:1 release:4 gain:0.5 ]", - "[ 5/4 → 11/8 | note:E5 room:1 release:4 gain:0.5 ]", - "[ 11/8 → 3/2 | note:B5 room:1 release:4 gain:0.5 ]", - "[ 3/2 → 13/8 | note:A3 room:1 release:4 gain:0.5 ]", - "[ 13/8 → 7/4 | note:B3 room:1 release:4 gain:0.5 ]", - "[ 7/4 → 15/8 | note:F#5 room:1 release:4 gain:0.5 ]", - "[ 15/8 → 2/1 | note:G#5 room:1 release:4 gain:0.5 ]", - "[ 2/1 → 17/8 | note:A4 room:1 release:4 gain:0.5 ]", - "[ 17/8 → 9/4 | note:G#5 room:1 release:4 gain:0.5 ]", - "[ 9/4 → 19/8 | note:D#5 room:1 release:4 gain:0.5 ]", - "[ 19/8 → 5/2 | note:E5 room:1 release:4 gain:0.5 ]", - "[ 5/2 → 21/8 | note:D#4 room:1 release:4 gain:0.5 ]", - "[ 21/8 → 11/4 | note:C#3 room:1 release:4 gain:0.5 ]", - "[ 11/4 → 23/8 | note:E5 room:1 release:4 gain:0.5 ]", - "[ 23/8 → 3/1 | note:C#6 room:1 release:4 gain:0.5 ]", - "[ 3/1 → 25/8 | note:F#4 room:1 release:4 gain:0.5 ]", - "[ 25/8 → 13/4 | note:E5 room:1 release:4 gain:0.5 ]", - "[ 13/4 → 27/8 | note:C#4 room:1 release:4 gain:0.5 ]", - "[ 27/8 → 7/2 | note:E5 room:1 release:4 gain:0.5 ]", - "[ 7/2 → 29/8 | note:B3 room:1 release:4 gain:0.5 ]", - "[ 29/8 → 15/4 | note:C#6 room:1 release:4 gain:0.5 ]", - "[ 15/4 → 31/8 | note:D#3 room:1 release:4 gain:0.5 ]", - "[ 31/8 → 4/1 | note:C#3 room:1 release:4 gain:0.5 ]", + "[ 1/1 → 9/8 | note:E3 room:1 release:4 gain:0.5 ]", + "[ 9/8 → 5/4 | note:D#3 room:1 release:4 gain:0.5 ]", + "[ 5/4 → 11/8 | note:D#6 room:1 release:4 gain:0.5 ]", + "[ 11/8 → 3/2 | note:D#3 room:1 release:4 gain:0.5 ]", + "[ 3/2 → 13/8 | note:F#3 room:1 release:4 gain:0.5 ]", + "[ 13/8 → 7/4 | note:D#5 room:1 release:4 gain:0.5 ]", + "[ 7/4 → 15/8 | note:D#4 room:1 release:4 gain:0.5 ]", + "[ 15/8 → 2/1 | note:D#5 room:1 release:4 gain:0.5 ]", + "[ 2/1 → 17/8 | note:B4 room:1 release:4 gain:0.5 ]", + "[ 17/8 → 9/4 | note:F#4 room:1 release:4 gain:0.5 ]", + "[ 9/4 → 19/8 | note:G#3 room:1 release:4 gain:0.5 ]", + "[ 19/8 → 5/2 | note:B5 room:1 release:4 gain:0.5 ]", + "[ 5/2 → 21/8 | note:F#5 room:1 release:4 gain:0.5 ]", + "[ 21/8 → 11/4 | note:D#4 room:1 release:4 gain:0.5 ]", + "[ 11/4 → 23/8 | note:D#4 room:1 release:4 gain:0.5 ]", + "[ 23/8 → 3/1 | note:B5 room:1 release:4 gain:0.5 ]", + "[ 3/1 → 25/8 | note:C#5 room:1 release:4 gain:0.5 ]", + "[ 25/8 → 13/4 | note:B4 room:1 release:4 gain:0.5 ]", + "[ 13/4 → 27/8 | note:D#6 room:1 release:4 gain:0.5 ]", + "[ 27/8 → 7/2 | note:D#3 room:1 release:4 gain:0.5 ]", + "[ 7/2 → 29/8 | note:A3 room:1 release:4 gain:0.5 ]", + "[ 29/8 → 15/4 | note:C#5 room:1 release:4 gain:0.5 ]", + "[ 15/4 → 31/8 | note:B4 room:1 release:4 gain:0.5 ]", + "[ 31/8 → 4/1 | note:F#3 room:1 release:4 gain:0.5 ]", ] `; @@ -9970,46 +9972,46 @@ exports[`runs examples > example "shrink" example index 3 1`] = ` exports[`runs examples > example "shuffle" example index 0 1`] = ` [ - "[ 0/1 → 1/4 | note:e s:piano ]", - "[ 1/4 → 1/2 | note:c s:piano ]", - "[ 1/2 → 3/4 | note:f s:piano ]", - "[ 3/4 → 1/1 | note:d s:piano ]", - "[ 1/1 → 5/4 | note:f s:piano ]", - "[ 5/4 → 3/2 | note:c s:piano ]", - "[ 3/2 → 7/4 | note:e s:piano ]", - "[ 7/4 → 2/1 | note:d s:piano ]", - "[ 2/1 → 9/4 | note:c s:piano ]", - "[ 9/4 → 5/2 | note:f s:piano ]", - "[ 5/2 → 11/4 | note:d s:piano ]", - "[ 11/4 → 3/1 | note:e s:piano ]", - "[ 3/1 → 13/4 | note:c s:piano ]", - "[ 13/4 → 7/2 | note:d s:piano ]", - "[ 7/2 → 15/4 | note:f s:piano ]", - "[ 15/4 → 4/1 | note:e s:piano ]", + "[ 0/1 → 1/4 | note:f s:piano ]", + "[ 1/4 → 1/2 | note:d s:piano ]", + "[ 1/2 → 3/4 | note:c s:piano ]", + "[ 3/4 → 1/1 | note:e s:piano ]", + "[ 1/1 → 5/4 | note:c s:piano ]", + "[ 5/4 → 3/2 | note:f s:piano ]", + "[ 3/2 → 7/4 | note:d s:piano ]", + "[ 7/4 → 2/1 | note:e s:piano ]", + "[ 2/1 → 9/4 | note:e s:piano ]", + "[ 9/4 → 5/2 | note:d s:piano ]", + "[ 5/2 → 11/4 | note:f s:piano ]", + "[ 11/4 → 3/1 | note:c s:piano ]", + "[ 3/1 → 13/4 | note:f s:piano ]", + "[ 13/4 → 7/2 | note:c s:piano ]", + "[ 7/2 → 15/4 | note:e s:piano ]", + "[ 15/4 → 4/1 | note:d s:piano ]", ] `; exports[`runs examples > example "shuffle" example index 1 1`] = ` [ - "[ 0/1 → 1/8 | note:e s:piano ]", - "[ 1/8 → 1/4 | note:c s:piano ]", - "[ 1/4 → 3/8 | note:f s:piano ]", - "[ 3/8 → 1/2 | note:d s:piano ]", + "[ 0/1 → 1/8 | note:f s:piano ]", + "[ 1/8 → 1/4 | note:d s:piano ]", + "[ 1/4 → 3/8 | note:c s:piano ]", + "[ 3/8 → 1/2 | note:e s:piano ]", "[ 1/2 → 1/1 | note:g s:piano ]", - "[ 1/1 → 9/8 | note:f s:piano ]", - "[ 9/8 → 5/4 | note:c s:piano ]", - "[ 5/4 → 11/8 | note:e s:piano ]", - "[ 11/8 → 3/2 | note:d s:piano ]", + "[ 1/1 → 9/8 | note:c s:piano ]", + "[ 9/8 → 5/4 | note:f s:piano ]", + "[ 5/4 → 11/8 | note:d s:piano ]", + "[ 11/8 → 3/2 | note:e s:piano ]", "[ 3/2 → 2/1 | note:g s:piano ]", - "[ 2/1 → 17/8 | note:c s:piano ]", - "[ 17/8 → 9/4 | note:f s:piano ]", - "[ 9/4 → 19/8 | note:d s:piano ]", - "[ 19/8 → 5/2 | note:e s:piano ]", + "[ 2/1 → 17/8 | note:e s:piano ]", + "[ 17/8 → 9/4 | note:d s:piano ]", + "[ 9/4 → 19/8 | note:f s:piano ]", + "[ 19/8 → 5/2 | note:c s:piano ]", "[ 5/2 → 3/1 | note:g s:piano ]", - "[ 3/1 → 25/8 | note:c s:piano ]", - "[ 25/8 → 13/4 | note:d s:piano ]", - "[ 13/4 → 27/8 | note:f s:piano ]", - "[ 27/8 → 7/2 | note:e s:piano ]", + "[ 3/1 → 25/8 | note:f s:piano ]", + "[ 25/8 → 13/4 | note:c s:piano ]", + "[ 13/4 → 27/8 | note:e s:piano ]", + "[ 27/8 → 7/2 | note:d s:piano ]", "[ 7/2 → 4/1 | note:g s:piano ]", ] `; @@ -10214,15 +10216,15 @@ exports[`runs examples > example "someCycles" example index 0 1`] = ` "[ 21/8 → 11/4 | s:hh ]", "[ 11/4 → 23/8 | s:hh ]", "[ 23/8 → 3/1 | s:hh ]", - "[ 3/1 → 25/8 | s:hh speed:0.5 ]", - "[ 3/1 → 4/1 | s:bd speed:0.5 ]", - "[ 25/8 → 13/4 | s:hh speed:0.5 ]", - "[ 13/4 → 27/8 | s:hh speed:0.5 ]", - "[ 27/8 → 7/2 | s:hh speed:0.5 ]", - "[ 7/2 → 29/8 | s:hh speed:0.5 ]", - "[ 29/8 → 15/4 | s:hh speed:0.5 ]", - "[ 15/4 → 31/8 | s:hh speed:0.5 ]", - "[ 31/8 → 4/1 | s:hh speed:0.5 ]", + "[ 3/1 → 25/8 | s:hh ]", + "[ 3/1 → 4/1 | s:bd ]", + "[ 25/8 → 13/4 | s:hh ]", + "[ 13/4 → 27/8 | s:hh ]", + "[ 27/8 → 7/2 | s:hh ]", + "[ 7/2 → 29/8 | s:hh ]", + "[ 29/8 → 15/4 | s:hh ]", + "[ 15/4 → 31/8 | s:hh ]", + "[ 31/8 → 4/1 | s:hh ]", ] `; @@ -10271,72 +10273,72 @@ exports[`runs examples > example "sometimes" example index 0 1`] = ` [ "[ 0/1 → 1/8 | s:hh speed:0.5 ]", "[ 1/8 → 1/4 | s:hh ]", - "[ 1/4 → 3/8 | s:hh ]", + "[ 1/4 → 3/8 | s:hh speed:0.5 ]", "[ 3/8 → 1/2 | s:hh ]", "[ 1/2 → 5/8 | s:hh speed:0.5 ]", "[ 5/8 → 3/4 | s:hh ]", - "[ 3/4 → 7/8 | s:hh ]", + "[ 3/4 → 7/8 | s:hh speed:0.5 ]", "[ 7/8 → 1/1 | s:hh ]", "[ 1/1 → 9/8 | s:hh speed:0.5 ]", - "[ 9/8 → 5/4 | s:hh ]", + "[ 9/8 → 5/4 | s:hh speed:0.5 ]", "[ 5/4 → 11/8 | s:hh ]", - "[ 11/8 → 3/2 | s:hh ]", + "[ 11/8 → 3/2 | s:hh speed:0.5 ]", "[ 3/2 → 13/8 | s:hh speed:0.5 ]", - "[ 13/8 → 7/4 | s:hh speed:0.5 ]", - "[ 7/4 → 15/8 | s:hh ]", + "[ 13/8 → 7/4 | s:hh ]", + "[ 7/4 → 15/8 | s:hh speed:0.5 ]", "[ 15/8 → 2/1 | s:hh ]", "[ 2/1 → 17/8 | s:hh ]", - "[ 17/8 → 9/4 | s:hh ]", - "[ 9/4 → 19/8 | s:hh ]", + "[ 17/8 → 9/4 | s:hh speed:0.5 ]", + "[ 9/4 → 19/8 | s:hh speed:0.5 ]", "[ 19/8 → 5/2 | s:hh ]", - "[ 5/2 → 21/8 | s:hh speed:0.5 ]", + "[ 5/2 → 21/8 | s:hh ]", "[ 21/8 → 11/4 | s:hh speed:0.5 ]", - "[ 11/4 → 23/8 | s:hh ]", + "[ 11/4 → 23/8 | s:hh speed:0.5 ]", "[ 23/8 → 3/1 | s:hh ]", - "[ 3/1 → 25/8 | s:hh speed:0.5 ]", + "[ 3/1 → 25/8 | s:hh ]", "[ 25/8 → 13/4 | s:hh ]", - "[ 13/4 → 27/8 | s:hh speed:0.5 ]", - "[ 27/8 → 7/2 | s:hh ]", + "[ 13/4 → 27/8 | s:hh ]", + "[ 27/8 → 7/2 | s:hh speed:0.5 ]", "[ 7/2 → 29/8 | s:hh speed:0.5 ]", "[ 29/8 → 15/4 | s:hh ]", - "[ 15/4 → 31/8 | s:hh speed:0.5 ]", + "[ 15/4 → 31/8 | s:hh ]", "[ 31/8 → 4/1 | s:hh speed:0.5 ]", ] `; exports[`runs examples > example "sometimesBy" example index 0 1`] = ` [ - "[ 0/1 → 1/8 | s:hh ]", + "[ 0/1 → 1/8 | s:hh speed:0.5 ]", "[ 1/8 → 1/4 | s:hh ]", - "[ 1/4 → 3/8 | s:hh ]", + "[ 1/4 → 3/8 | s:hh speed:0.5 ]", "[ 3/8 → 1/2 | s:hh ]", - "[ 1/2 → 5/8 | s:hh ]", + "[ 1/2 → 5/8 | s:hh speed:0.5 ]", "[ 5/8 → 3/4 | s:hh ]", - "[ 3/4 → 7/8 | s:hh ]", + "[ 3/4 → 7/8 | s:hh speed:0.5 ]", "[ 7/8 → 1/1 | s:hh ]", "[ 1/1 → 9/8 | s:hh speed:0.5 ]", - "[ 9/8 → 5/4 | s:hh ]", + "[ 9/8 → 5/4 | s:hh speed:0.5 ]", "[ 5/4 → 11/8 | s:hh ]", - "[ 11/8 → 3/2 | s:hh ]", + "[ 11/8 → 3/2 | s:hh speed:0.5 ]", "[ 3/2 → 13/8 | s:hh speed:0.5 ]", - "[ 13/8 → 7/4 | s:hh speed:0.5 ]", - "[ 7/4 → 15/8 | s:hh ]", + "[ 13/8 → 7/4 | s:hh ]", + "[ 7/4 → 15/8 | s:hh speed:0.5 ]", "[ 15/8 → 2/1 | s:hh ]", "[ 2/1 → 17/8 | s:hh ]", "[ 17/8 → 9/4 | s:hh ]", - "[ 9/4 → 19/8 | s:hh ]", + "[ 9/4 → 19/8 | s:hh speed:0.5 ]", "[ 19/8 → 5/2 | s:hh ]", - "[ 5/2 → 21/8 | s:hh speed:0.5 ]", + "[ 5/2 → 21/8 | s:hh ]", "[ 21/8 → 11/4 | s:hh speed:0.5 ]", - "[ 11/4 → 23/8 | s:hh ]", + "[ 11/4 → 23/8 | s:hh speed:0.5 ]", "[ 23/8 → 3/1 | s:hh ]", "[ 3/1 → 25/8 | s:hh ]", "[ 25/8 → 13/4 | s:hh ]", - "[ 13/4 → 27/8 | s:hh speed:0.5 ]", - "[ 27/8 → 7/2 | s:hh ]", + "[ 13/4 → 27/8 | s:hh ]", + "[ 27/8 → 7/2 | s:hh speed:0.5 ]", "[ 7/2 → 29/8 | s:hh speed:0.5 ]", "[ 29/8 → 15/4 | s:hh ]", - "[ 15/4 → 31/8 | s:hh speed:0.5 ]", + "[ 15/4 → 31/8 | s:hh ]", "[ 31/8 → 4/1 | s:hh speed:0.5 ]", ] `; @@ -11721,16 +11723,20 @@ exports[`runs examples > example "tri" example index 0 1`] = ` exports[`runs examples > example "undegrade" example index 0 1`] = ` [ "[ 0/1 → 1/8 | s:hh ]", + "[ 1/4 → 3/8 | s:hh ]", "[ 1/2 → 5/8 | s:hh ]", + "[ 3/4 → 7/8 | s:hh ]", "[ 1/1 → 9/8 | s:hh ]", + "[ 9/8 → 5/4 | s:hh ]", + "[ 11/8 → 3/2 | s:hh ]", "[ 3/2 → 13/8 | s:hh ]", - "[ 13/8 → 7/4 | s:hh ]", - "[ 5/2 → 21/8 | s:hh ]", + "[ 7/4 → 15/8 | s:hh ]", + "[ 17/8 → 9/4 | s:hh ]", + "[ 9/4 → 19/8 | s:hh ]", "[ 21/8 → 11/4 | s:hh ]", - "[ 3/1 → 25/8 | s:hh ]", - "[ 13/4 → 27/8 | s:hh ]", + "[ 11/4 → 23/8 | s:hh ]", + "[ 27/8 → 7/2 | s:hh ]", "[ 7/2 → 29/8 | s:hh ]", - "[ 15/4 → 31/8 | s:hh ]", "[ 31/8 → 4/1 | s:hh ]", ] `; @@ -11739,56 +11745,58 @@ exports[`runs examples > example "undegrade" example index 1 1`] = ` [ "[ 0/1 → 1/10 | s:hh pan:1 ]", "[ 1/10 → 1/5 | s:hh pan:1 ]", - "[ 1/5 → 3/10 | s:hh pan:1 ]", - "[ 3/10 → 2/5 | s:hh pan:0 ]", - "[ 2/5 → 1/2 | s:hh pan:1 ]", + "[ 1/5 → 3/10 | s:hh pan:0 ]", + "[ 3/10 → 2/5 | s:hh pan:1 ]", + "[ 2/5 → 1/2 | s:hh pan:0 ]", "[ 1/2 → 3/5 | s:hh pan:1 ]", - "[ 3/5 → 7/10 | s:hh pan:0 ]", - "[ 7/10 → 4/5 | s:hh pan:0 ]", - "[ 4/5 → 9/10 | s:hh pan:0 ]", - "[ 9/10 → 1/1 | s:hh pan:1 ]", + "[ 3/5 → 7/10 | s:hh pan:1 ]", + "[ 7/10 → 4/5 | s:hh pan:1 ]", + "[ 4/5 → 9/10 | s:hh pan:1 ]", + "[ 9/10 → 1/1 | s:hh pan:0 ]", "[ 1/1 → 11/10 | s:hh pan:1 ]", - "[ 11/10 → 6/5 | s:hh pan:0 ]", + "[ 11/10 → 6/5 | s:hh pan:1 ]", "[ 6/5 → 13/10 | s:hh pan:0 ]", "[ 13/10 → 7/5 | s:hh pan:1 ]", - "[ 7/5 → 3/2 | s:hh pan:1 ]", + "[ 7/5 → 3/2 | s:hh pan:0 ]", "[ 3/2 → 8/5 | s:hh pan:1 ]", "[ 8/5 → 17/10 | s:hh pan:0 ]", - "[ 17/10 → 9/5 | s:hh pan:0 ]", - "[ 9/5 → 19/10 | s:hh pan:1 ]", + "[ 17/10 → 9/5 | s:hh pan:1 ]", + "[ 9/5 → 19/10 | s:hh pan:0 ]", "[ 19/10 → 2/1 | s:hh pan:1 ]", "[ 2/1 → 21/10 | s:hh pan:0 ]", "[ 21/10 → 11/5 | s:hh pan:1 ]", "[ 11/5 → 23/10 | s:hh pan:0 ]", "[ 23/10 → 12/5 | s:hh pan:1 ]", - "[ 12/5 → 5/2 | s:hh pan:1 ]", - "[ 5/2 → 13/5 | s:hh pan:1 ]", + "[ 12/5 → 5/2 | s:hh pan:0 ]", + "[ 5/2 → 13/5 | s:hh pan:0 ]", "[ 13/5 → 27/10 | s:hh pan:0 ]", "[ 27/10 → 14/5 | s:hh pan:1 ]", - "[ 14/5 → 29/10 | s:hh pan:1 ]", - "[ 29/10 → 3/1 | s:hh pan:1 ]", - "[ 3/1 → 31/10 | s:hh pan:1 ]", - "[ 31/10 → 16/5 | s:hh pan:0 ]", + "[ 14/5 → 29/10 | s:hh pan:0 ]", + "[ 29/10 → 3/1 | s:hh pan:0 ]", + "[ 3/1 → 31/10 | s:hh pan:0 ]", + "[ 31/10 → 16/5 | s:hh pan:1 ]", "[ 16/5 → 33/10 | s:hh pan:1 ]", "[ 33/10 → 17/5 | s:hh pan:0 ]", - "[ 17/5 → 7/2 | s:hh pan:0 ]", + "[ 17/5 → 7/2 | s:hh pan:1 ]", "[ 7/2 → 18/5 | s:hh pan:1 ]", - "[ 18/5 → 37/10 | s:hh pan:0 ]", + "[ 18/5 → 37/10 | s:hh pan:1 ]", "[ 37/10 → 19/5 | s:hh pan:1 ]", "[ 19/5 → 39/10 | s:hh pan:0 ]", - "[ 39/10 → 4/1 | s:hh pan:0 ]", + "[ 39/10 → 4/1 | s:hh pan:1 ]", ] `; exports[`runs examples > example "undegradeBy" example index 0 1`] = ` [ "[ 0/1 → 1/8 | s:hh ]", + "[ 1/8 → 1/4 | s:hh ]", "[ 1/4 → 3/8 | s:hh ]", - "[ 3/8 → 1/2 | s:hh ]", "[ 1/2 → 5/8 | s:hh ]", + "[ 5/8 → 3/4 | s:hh ]", "[ 3/4 → 7/8 | s:hh ]", "[ 1/1 → 9/8 | s:hh ]", - "[ 5/4 → 11/8 | s:hh ]", + "[ 9/8 → 5/4 | s:hh ]", + "[ 11/8 → 3/2 | s:hh ]", "[ 3/2 → 13/8 | s:hh ]", "[ 13/8 → 7/4 | s:hh ]", "[ 7/4 → 15/8 | s:hh ]", @@ -11796,15 +11804,14 @@ exports[`runs examples > example "undegradeBy" example index 0 1`] = ` "[ 2/1 → 17/8 | s:hh ]", "[ 17/8 → 9/4 | s:hh ]", "[ 9/4 → 19/8 | s:hh ]", - "[ 19/8 → 5/2 | s:hh ]", "[ 5/2 → 21/8 | s:hh ]", "[ 21/8 → 11/4 | s:hh ]", "[ 11/4 → 23/8 | s:hh ]", "[ 3/1 → 25/8 | s:hh ]", "[ 25/8 → 13/4 | s:hh ]", - "[ 13/4 → 27/8 | s:hh ]", "[ 27/8 → 7/2 | s:hh ]", "[ 7/2 → 29/8 | s:hh ]", + "[ 29/8 → 15/4 | s:hh ]", "[ 15/4 → 31/8 | s:hh ]", "[ 31/8 → 4/1 | s:hh ]", ] @@ -11826,32 +11833,32 @@ exports[`runs examples > example "undegradeBy" example index 1 1`] = ` "[ 11/10 → 6/5 | s:hh pan:0 ]", "[ 6/5 → 13/10 | s:hh pan:0 ]", "[ 13/10 → 7/5 | s:hh pan:1 ]", - "[ 7/5 → 3/2 | s:hh pan:1 ]", - "[ 3/2 → 8/5 | s:hh pan:0 ]", + "[ 7/5 → 3/2 | s:hh pan:0 ]", + "[ 3/2 → 8/5 | s:hh pan:1 ]", "[ 8/5 → 17/10 | s:hh pan:0 ]", "[ 17/10 → 9/5 | s:hh pan:0 ]", "[ 9/5 → 19/10 | s:hh pan:0 ]", - "[ 19/10 → 2/1 | s:hh pan:1 ]", + "[ 19/10 → 2/1 | s:hh pan:0 ]", "[ 2/1 → 21/10 | s:hh pan:0 ]", "[ 21/10 → 11/5 | s:hh pan:1 ]", "[ 11/5 → 23/10 | s:hh pan:0 ]", - "[ 23/10 → 12/5 | s:hh pan:1 ]", + "[ 23/10 → 12/5 | s:hh pan:0 ]", "[ 12/5 → 5/2 | s:hh pan:0 ]", "[ 5/2 → 13/5 | s:hh pan:0 ]", "[ 13/5 → 27/10 | s:hh pan:0 ]", - "[ 27/10 → 14/5 | s:hh pan:1 ]", - "[ 14/5 → 29/10 | s:hh pan:1 ]", + "[ 27/10 → 14/5 | s:hh pan:0 ]", + "[ 14/5 → 29/10 | s:hh pan:0 ]", "[ 29/10 → 3/1 | s:hh pan:0 ]", "[ 3/1 → 31/10 | s:hh pan:0 ]", - "[ 31/10 → 16/5 | s:hh pan:0 ]", - "[ 16/5 → 33/10 | s:hh pan:1 ]", + "[ 31/10 → 16/5 | s:hh pan:1 ]", + "[ 16/5 → 33/10 | s:hh pan:0 ]", "[ 33/10 → 17/5 | s:hh pan:0 ]", "[ 17/5 → 7/2 | s:hh pan:0 ]", "[ 7/2 → 18/5 | s:hh pan:0 ]", "[ 18/5 → 37/10 | s:hh pan:0 ]", - "[ 37/10 → 19/5 | s:hh pan:1 ]", + "[ 37/10 → 19/5 | s:hh pan:0 ]", "[ 19/5 → 39/10 | s:hh pan:0 ]", - "[ 39/10 → 4/1 | s:hh pan:0 ]", + "[ 39/10 → 4/1 | s:hh pan:1 ]", ] `; @@ -12156,14 +12163,14 @@ exports[`runs examples > example "vowel" example index 0 1`] = ` exports[`runs examples > example "vowel" example index 1 1`] = ` [ - "[ 0/1 → 1/8 | s:bd vowel:i ]", - "[ 1/8 → 1/4 | s:sd vowel:i ]", - "[ 1/4 → 3/8 | s:mt vowel:i ]", - "[ 3/8 → 1/2 | s:ht vowel:i ]", - "[ 1/2 → 5/8 | s:bd vowel:i ]", - "[ 11/16 → 3/4 | s:cp vowel:i ]", - "[ 3/4 → 7/8 | s:ht vowel:i ]", - "[ 7/8 → 1/1 | s:lt vowel:i ]", + "[ 0/1 → 1/8 | s:bd vowel:e ]", + "[ 1/8 → 1/4 | s:sd vowel:e ]", + "[ 1/4 → 3/8 | s:mt vowel:e ]", + "[ 3/8 → 1/2 | s:ht vowel:e ]", + "[ 1/2 → 5/8 | s:bd vowel:e ]", + "[ 11/16 → 3/4 | s:cp vowel:e ]", + "[ 3/4 → 7/8 | s:ht vowel:e ]", + "[ 7/8 → 1/1 | s:lt vowel:e ]", "[ 1/1 → 9/8 | s:bd vowel:a ]", "[ 9/8 → 5/4 | s:sd vowel:a ]", "[ 5/4 → 11/8 | s:mt vowel:a ]", @@ -12180,14 +12187,14 @@ exports[`runs examples > example "vowel" example index 1 1`] = ` "[ 43/16 → 11/4 | s:cp vowel:i ]", "[ 11/4 → 23/8 | s:ht vowel:i ]", "[ 23/8 → 3/1 | s:lt vowel:i ]", - "[ 3/1 → 25/8 | s:bd vowel:i ]", - "[ 25/8 → 13/4 | s:sd vowel:i ]", - "[ 13/4 → 27/8 | s:mt vowel:i ]", - "[ 27/8 → 7/2 | s:ht vowel:i ]", - "[ 7/2 → 29/8 | s:bd vowel:i ]", - "[ 59/16 → 15/4 | s:cp vowel:i ]", - "[ 15/4 → 31/8 | s:ht vowel:i ]", - "[ 31/8 → 4/1 | s:lt vowel:i ]", + "[ 3/1 → 25/8 | s:bd vowel:o ]", + "[ 25/8 → 13/4 | s:sd vowel:o ]", + "[ 13/4 → 27/8 | s:mt vowel:o ]", + "[ 27/8 → 7/2 | s:ht vowel:o ]", + "[ 7/2 → 29/8 | s:bd vowel:o ]", + "[ 59/16 → 15/4 | s:cp vowel:o ]", + "[ 15/4 → 31/8 | s:ht vowel:o ]", + "[ 31/8 → 4/1 | s:lt vowel:o ]", ] `; @@ -12302,23 +12309,23 @@ exports[`runs examples > example "wchoose" example index 0 1`] = ` "[ 0/1 → 1/5 | note:c2 s:sine ]", "[ 1/5 → 2/5 | note:g2 s:sine ]", "[ 2/5 → 3/5 | note:g2 s:sine ]", - "[ 3/5 → 4/5 | note:d2 s:bd n:6 ]", - "[ 4/5 → 1/1 | note:f1 s:bd n:6 ]", + "[ 3/5 → 4/5 | note:d2 s:sine ]", + "[ 4/5 → 1/1 | note:f1 s:sine ]", "[ 1/1 → 6/5 | note:c2 s:sine ]", "[ 6/5 → 7/5 | note:g2 s:sine ]", "[ 7/5 → 8/5 | note:g2 s:sine ]", "[ 8/5 → 9/5 | note:d2 s:sine ]", "[ 9/5 → 2/1 | note:f1 s:sine ]", "[ 2/1 → 11/5 | note:c2 s:sine ]", - "[ 11/5 → 12/5 | note:g2 s:triangle ]", + "[ 11/5 → 12/5 | note:g2 s:bd n:6 ]", "[ 12/5 → 13/5 | note:g2 s:sine ]", "[ 13/5 → 14/5 | note:d2 s:sine ]", "[ 14/5 → 3/1 | note:f1 s:sine ]", "[ 3/1 → 16/5 | note:c2 s:sine ]", "[ 16/5 → 17/5 | note:g2 s:sine ]", - "[ 17/5 → 18/5 | note:g2 s:triangle ]", + "[ 17/5 → 18/5 | note:g2 s:sine ]", "[ 18/5 → 19/5 | note:d2 s:sine ]", - "[ 19/5 → 4/1 | note:f1 s:sine ]", + "[ 19/5 → 4/1 | note:f1 s:bd n:6 ]", ] `; @@ -12329,30 +12336,30 @@ exports[`runs examples > example "wchooseCycles" example index 0 1`] = ` "[ 1/4 → 3/8 | s:bd ]", "[ 3/8 → 1/2 | s:bd ]", "[ 1/2 → 5/8 | s:bd ]", - "[ 5/8 → 3/4 | s:bd ]", - "[ 3/4 → 7/8 | s:sd ]", + "[ 5/8 → 3/4 | s:hh ]", + "[ 3/4 → 7/8 | s:bd ]", "[ 7/8 → 1/1 | s:bd ]", "[ 1/1 → 9/8 | s:bd ]", - "[ 9/8 → 5/4 | s:sd ]", + "[ 9/8 → 5/4 | s:bd ]", "[ 5/4 → 11/8 | s:bd ]", - "[ 11/8 → 3/2 | s:bd ]", + "[ 11/8 → 3/2 | s:sd ]", "[ 3/2 → 13/8 | s:bd ]", "[ 13/8 → 7/4 | s:bd ]", - "[ 7/4 → 15/8 | s:sd ]", + "[ 7/4 → 15/8 | s:bd ]", "[ 15/8 → 2/1 | s:bd ]", "[ 2/1 → 17/8 | s:bd ]", - "[ 17/8 → 9/4 | s:sd ]", - "[ 9/4 → 19/8 | s:bd ]", - "[ 19/8 → 5/2 | s:bd ]", + "[ 17/8 → 9/4 | s:hh ]", + "[ 9/4 → 19/8 | s:hh ]", + "[ 19/8 → 5/2 | s:hh ]", "[ 5/2 → 21/8 | s:bd ]", "[ 21/8 → 11/4 | s:bd ]", - "[ 11/4 → 23/8 | s:bd ]", - "[ 23/8 → 3/1 | s:bd ]", - "[ 3/1 → 25/8 | s:hh ]", - "[ 25/8 → 13/4 | s:bd ]", + "[ 11/4 → 23/8 | s:hh ]", + "[ 23/8 → 3/1 | s:sd ]", + "[ 3/1 → 25/8 | s:bd ]", + "[ 25/8 → 13/4 | s:hh ]", "[ 13/4 → 27/8 | s:bd ]", "[ 27/8 → 7/2 | s:bd ]", - "[ 7/2 → 29/8 | s:bd ]", + "[ 7/2 → 29/8 | s:sd ]", "[ 29/8 → 15/4 | s:bd ]", "[ 15/4 → 31/8 | s:bd ]", "[ 31/8 → 4/1 | s:bd ]", @@ -12367,48 +12374,48 @@ exports[`runs examples > example "wchooseCycles" example index 1 1`] = ` "[ 1/4 → 1/3 | s:bd ]", "[ 1/3 → 5/12 | s:bd ]", "[ 5/12 → 1/2 | s:bd ]", - "[ 1/2 → 7/12 | s:bd ]", - "[ 7/12 → 2/3 | s:bd ]", - "[ 2/3 → 3/4 | s:bd ]", - "[ 3/4 → 5/6 | s:bd ]", - "[ 5/6 → 11/12 | s:bd ]", - "[ 11/12 → 1/1 | s:bd ]", + "[ 1/2 → 7/12 | s:hh ]", + "[ 7/12 → 2/3 | s:hh ]", + "[ 2/3 → 3/4 | s:hh ]", + "[ 3/4 → 5/6 | s:hh ]", + "[ 5/6 → 11/12 | s:hh ]", + "[ 11/12 → 1/1 | s:hh ]", "[ 1/1 → 13/12 | s:bd ]", "[ 13/12 → 7/6 | s:bd ]", "[ 7/6 → 5/4 | s:bd ]", - "[ 5/4 → 4/3 | s:bd ]", - "[ 4/3 → 17/12 | s:bd ]", - "[ 17/12 → 3/2 | s:bd ]", - "[ 3/2 → 19/12 | s:sd ]", - "[ 19/12 → 5/3 | s:sd ]", - "[ 5/3 → 7/4 | s:sd ]", - "[ 7/4 → 11/6 | s:bd ]", - "[ 11/6 → 23/12 | s:bd ]", - "[ 23/12 → 2/1 | s:bd ]", + "[ 5/4 → 4/3 | s:hh ]", + "[ 4/3 → 17/12 | s:hh ]", + "[ 17/12 → 3/2 | s:hh ]", + "[ 3/2 → 19/12 | s:bd ]", + "[ 19/12 → 5/3 | s:bd ]", + "[ 5/3 → 7/4 | s:bd ]", + "[ 7/4 → 11/6 | s:hh ]", + "[ 11/6 → 23/12 | s:hh ]", + "[ 23/12 → 2/1 | s:hh ]", "[ 2/1 → 25/12 | s:hh ]", "[ 25/12 → 13/6 | s:hh ]", "[ 13/6 → 9/4 | s:hh ]", - "[ 9/4 → 7/3 | s:sd ]", - "[ 7/3 → 29/12 | s:sd ]", - "[ 29/12 → 5/2 | s:sd ]", + "[ 9/4 → 7/3 | s:hh ]", + "[ 7/3 → 29/12 | s:hh ]", + "[ 29/12 → 5/2 | s:hh ]", "[ 5/2 → 31/12 | s:hh ]", "[ 31/12 → 8/3 | s:hh ]", "[ 8/3 → 11/4 | s:hh ]", - "[ 11/4 → 17/6 | s:bd ]", - "[ 17/6 → 35/12 | s:bd ]", - "[ 35/12 → 3/1 | s:bd ]", - "[ 3/1 → 37/12 | s:bd ]", - "[ 37/12 → 19/6 | s:bd ]", - "[ 19/6 → 13/4 | s:bd ]", + "[ 11/4 → 17/6 | s:sd ]", + "[ 17/6 → 35/12 | s:sd ]", + "[ 35/12 → 3/1 | s:sd ]", + "[ 3/1 → 37/12 | s:hh ]", + "[ 37/12 → 19/6 | s:hh ]", + "[ 19/6 → 13/4 | s:hh ]", "[ 13/4 → 10/3 | s:bd ]", "[ 10/3 → 41/12 | s:bd ]", "[ 41/12 → 7/2 | s:bd ]", - "[ 7/2 → 43/12 | s:sd ]", - "[ 43/12 → 11/3 | s:sd ]", - "[ 11/3 → 15/4 | s:sd ]", - "[ 15/4 → 23/6 | s:hh ]", - "[ 23/6 → 47/12 | s:hh ]", - "[ 47/12 → 4/1 | s:hh ]", + "[ 7/2 → 43/12 | s:bd ]", + "[ 43/12 → 11/3 | s:bd ]", + "[ 11/3 → 15/4 | s:bd ]", + "[ 15/4 → 23/6 | s:bd ]", + "[ 23/6 → 47/12 | s:bd ]", + "[ 47/12 → 4/1 | s:bd ]", ] `; @@ -12432,15 +12439,15 @@ exports[`runs examples > example "wchooseCycles" example index 2 1`] = ` "[ 5/4 → 4/3 | s:hh ]", "[ 4/3 → 17/12 | s:hh ]", "[ 17/12 → 3/2 | s:hh ]", - "[ 3/2 → 19/12 | s:hh ]", - "[ 19/12 → 5/3 | s:hh ]", - "[ 5/3 → 7/4 | s:hh ]", + "[ 3/2 → 49/32 | s:bd ]", + "[ 51/32 → 13/8 | s:bd ]", + "[ 27/16 → 55/32 | s:bd ]", "[ 7/4 → 11/6 | s:hh ]", "[ 11/6 → 23/12 | s:hh ]", "[ 23/12 → 2/1 | s:hh ]", - "[ 2/1 → 25/12 | s:hh ]", - "[ 25/12 → 13/6 | s:hh ]", - "[ 13/6 → 9/4 | s:hh ]", + "[ 2/1 → 65/32 | s:bd ]", + "[ 67/32 → 17/8 | s:bd ]", + "[ 35/16 → 71/32 | s:bd ]", "[ 9/4 → 7/3 | s:hh ]", "[ 7/3 → 29/12 | s:hh ]", "[ 29/12 → 5/2 | s:hh ]", @@ -12450,15 +12457,15 @@ exports[`runs examples > example "wchooseCycles" example index 2 1`] = ` "[ 11/4 → 17/6 | s:hh ]", "[ 17/6 → 35/12 | s:hh ]", "[ 35/12 → 3/1 | s:hh ]", - "[ 3/1 → 97/32 | s:bd ]", - "[ 99/32 → 25/8 | s:bd ]", - "[ 51/16 → 103/32 | s:bd ]", + "[ 3/1 → 37/12 | s:hh ]", + "[ 37/12 → 19/6 | s:hh ]", + "[ 19/6 → 13/4 | s:hh ]", "[ 13/4 → 10/3 | s:hh ]", "[ 10/3 → 41/12 | s:hh ]", "[ 41/12 → 7/2 | s:hh ]", - "[ 7/2 → 43/12 | s:hh ]", - "[ 43/12 → 11/3 | s:hh ]", - "[ 11/3 → 15/4 | s:hh ]", + "[ 7/2 → 113/32 | s:bd ]", + "[ 115/32 → 29/8 | s:bd ]", + "[ 59/16 → 119/32 | s:bd ]", "[ 15/4 → 23/6 | s:hh ]", "[ 23/6 → 47/12 | s:hh ]", "[ 47/12 → 4/1 | s:hh ]", From e90aa5202d5f4f0ee5ad8c161cd02907512f2bfa Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 16 Nov 2025 15:28:10 -0600 Subject: [PATCH 12/49] Export withseed --- packages/core/signal.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/signal.mjs b/packages/core/signal.mjs index 9f3a264f4..e50ba22db 100644 --- a/packages/core/signal.mjs +++ b/packages/core/signal.mjs @@ -365,13 +365,13 @@ export const scramble = register('scramble', (n, pat) => { * @param {Pattern} pat Pattern to update * @returns Pattern */ -function withSeed(func, pat) { +export const withSeed = (func, pat) => { return new Pattern((state) => { let { randSeed, ...controls } = state.controls; randSeed = func(randSeed); return pat.query(state.setControls({ ...controls, randSeed })); }, pat._steps); -} +}; /** * Change the seed for random signals. Normally, random signals depend on time, From 7bc6fcbf2a56a8b0f12aed9d9c386fbe43dbfa6c Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 23 Nov 2025 18:24:48 -0600 Subject: [PATCH 13/49] Add channel support to midi in --- packages/midi/midi.mjs | 34 +++++++++++++++++------ test/__snapshots__/examples.test.mjs.snap | 21 ++++++++++++++ 2 files changed, 46 insertions(+), 9 deletions(-) diff --git a/packages/midi/midi.mjs b/packages/midi/midi.mjs index 32f030125..0fee380c6 100644 --- a/packages/midi/midi.mjs +++ b/packages/midi/midi.mjs @@ -479,14 +479,23 @@ Pattern.prototype.midi = function (midiport, options = {}) { let listeners = {}; const refs = {}; +const refsByChan = {}; /** * MIDI input: Opens a MIDI input port to receive MIDI control change messages. + * + * The output is a function that accepts a midi cc value to query as well as (optionally) a midi channel * @param {string | number} input MIDI device name or index defaulting to 0 - * @returns {Function} + * @returns {function(number, number=): function(): number} A function from (cc, channel?) to + * the most recently received midi cc value through the input (normalized to 0 to 1) * @example - * let cc = await midin('IAC Driver Bus 1') + * const cc = await midin('IAC Driver Bus 1') * note("c a f e").lpf(cc(0).range(0, 1000)).lpq(cc(1).range(0, 10)).sound("sawtooth") + * @example + * const allCC = await midin('IAC Driver Bus 1') + * const cc = (ccNum) => allCC(ccNum, 2) // just channel 2 + * note("c a f e").s("saw") + * .when(cc(0).gt(0), x => x.postgain(0)) */ export async function midin(input) { if (isPattern(input)) { @@ -511,17 +520,24 @@ export async function midin(input) { }`, ); } - // ensure refs for this input are initialized - if (!refs[input]) { - refs[input] = {}; - } - const cc = (cc) => ref(() => refs[input][cc] || 0); + refs[input] ??= {}; + refsByChan[input] ??= {}; + const cc = (cc, chan) => { + if (chan !== undefined) { + return ref(() => refsByChan[input][cc]?.[chan] || 0); + } + return ref(() => refs[input][cc] || 0); + }; listeners[input] && device.removeListener('midimessage', listeners[input]); listeners[input] = (e) => { - const cc = e.dataBytes[0]; + const ccNum = e.dataBytes[0]; const v = e.dataBytes[1]; - refs[input] && (refs[input][cc] = v / 127); + const chan = e.message.channel; + const scaled = v / 127; + refsByChan[input][ccNum] ??= {}; + refsByChan[input][ccNum][chan] = scaled; + refs[input][ccNum] = scaled; }; device.addListener('midimessage', listeners[input]); return cc; diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 31e4bddd3..783fee998 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -6533,6 +6533,27 @@ exports[`runs examples > example "midin" example index 0 1`] = ` ] `; +exports[`runs examples > example "midin" example index 1 1`] = ` +[ + "[ 0/1 → 1/4 | note:c s:saw ]", + "[ 1/4 → 1/2 | note:a s:saw ]", + "[ 1/2 → 3/4 | note:f s:saw ]", + "[ 3/4 → 1/1 | note:e s:saw ]", + "[ 1/1 → 5/4 | note:c s:saw ]", + "[ 5/4 → 3/2 | note:a s:saw ]", + "[ 3/2 → 7/4 | note:f s:saw ]", + "[ 7/4 → 2/1 | note:e s:saw ]", + "[ 2/1 → 9/4 | note:c s:saw ]", + "[ 9/4 → 5/2 | note:a s:saw ]", + "[ 5/2 → 11/4 | note:f s:saw ]", + "[ 11/4 → 3/1 | note:e s:saw ]", + "[ 3/1 → 13/4 | note:c s:saw ]", + "[ 13/4 → 7/2 | note:a s:saw ]", + "[ 7/2 → 15/4 | note:f s:saw ]", + "[ 15/4 → 4/1 | note:e s:saw ]", +] +`; + exports[`runs examples > example "midiport" example index 0 1`] = ` [ "[ 0/1 → 1/4 | note:c midiport:0 ]", From 020a6bc75fb1467a518c32c2d132298747693d8a Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 23 Nov 2025 20:31:31 -0600 Subject: [PATCH 14/49] First pass at transient processor --- packages/core/controls.mjs | 2 + packages/superdough/worklets.mjs | 70 ++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 809a45ab2..80a244efc 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -2584,3 +2584,5 @@ export const scrub = register( }, false, ); + +export const { transient } = registerControl(['transient', 'transsustain', 'transattack']); diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index bf633a63b..334e2d829 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -11,6 +11,9 @@ const PI = Math.PI; const TWO_PI = 2 * PI; const INVSR = 1 / sampleRate; +const timeToCoeff = (t) => Math.exp(-INVSR / t); +const dbToLin = (db) => Math.pow(10, db / 20); + const clamp = (num, min, max) => Math.min(Math.max(num, min), max); const mod = (n, m) => ((n % m) + m) % m; const lerp = (a, b, n) => n * (b - a) + a; @@ -1383,3 +1386,70 @@ class WavetableOscillatorProcessor extends AudioWorkletProcessor { } registerProcessor('wavetable-oscillator-processor', WavetableOscillatorProcessor); + +class TransientProcessor extends AudioWorkletProcessor { + static get parameterDescriptors() { + return []; + } + + constructor(options) { + super(); + this.gainCoeff = timeToCoeff(0.2); + this.avgGain = 1; + let { + attackTime = 0.003, + sustainTime = 0.08, + attack = 0, + sustain = 0, + sensitivity = 0.1, + mix = 1, + } = options.processorOptions; + attackTime = clamp(attackTime, 0.0005, 0.05); + sustainTime = clamp(sustainTime, 0.01, 0.5); + this.attackCoeff = timeToCoeff(attackTime); + this.sustainCoeff = timeToCoeff(sustainTime); + this.attackAmt = clamp(attack, -1, 1); + this.sustainAmt = clamp(sustain, -1, 1); + this.scaling = 0.5 + 5 * clamp(sensitivity, 0, 1); + this.mix = clamp(mix, 0, 1); + } + + process(inputs, outputs, _params) { + const input = inputs[0]; + const output = outputs[0]; + if (!input || !output) { + return true; + } + const channels = output.length; + this.attackEnv ??= new Float32Array(channels); + this.sustainEnv ??= new Float32Array(channels); + let avgGain = this.avgGain; + for (let ch = 0; ch < channels; ch++) { + const inCh = input[ch]; + const outCh = output[ch]; + let attEnv = this.attackEnv[ch]; + let susEnv = this.sustainEnv[ch]; + for (let i = 0; i < blockSize; i++) { + const x = Math.abs(inCh[i]); + attEnv = lerp(attEnv, x, this.attackCoeff); + susEnv = lerp(susEnv, x, this.sustainCoeff); + const peakiness = clamp((this.scaling * (attEnv - susEnv)) / (susEnv + 1e-6), -1.5, 1.5); + const attScale = Math.max(0, peakiness); + const susScale = Math.max(0, -peakiness); + const attackGain = dbToLin(this.attackAmt * attScale * 18); // max 18db + const sustainGain = dbToLin(this.sustainAmt * susScale * 36); // max 36db + const gain = clamp(attackGain * sustainGain, 0, 8); + avgGain = lerp(avgGain, gain, this.gainCoeff); + const makeup = avgGain > 1e-3 ? 1 / avgGain : 1; + const wet = x * gain * makeup; + outCh[i] = lerp(x, wet, this.mix); + } + this.attackEnv[ch] = attEnv; + this.sustainEnv[ch] = susEnv; + } + this.avgGain = avgGain; + return true; + } +} + +registerProcessor('transient-processor', TransientProcessor); From 68840de188622e302276aa7dd31f8c895e6c6887 Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 23 Nov 2025 20:58:28 -0600 Subject: [PATCH 15/49] Working version --- packages/superdough/superdough.mjs | 19 +++++++++++++++++++ packages/superdough/worklets.mjs | 13 ++++++------- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 650f9c2ce..acf6edef2 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -451,6 +451,9 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) compressorKnee, compressorAttack, compressorRelease, + transient, + transsustain, + transattack, } = value; delaytime = delaytime ?? cycleToSeconds(delaysync, cps); @@ -532,6 +535,22 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) chain.push(sourceNode); stretch !== undefined && chain.push(getWorklet(ac, 'phase-vocoder-processor', { pitchFactor: stretch })); + transient !== undefined && + chain.push( + getWorklet( + ac, + 'transient-processor', + {}, + { + processorOptions: { + attack: transient, + sustain: transsustain, + attackTime: transattack, + }, + }, + ), + ); + // gain stage chain.push(gainNode(gain)); diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index 334e2d829..6af7dffc1 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -11,7 +11,7 @@ const PI = Math.PI; const TWO_PI = 2 * PI; const INVSR = 1 / sampleRate; -const timeToCoeff = (t) => Math.exp(-INVSR / t); +const timeToCoeff = (t) => 1 - Math.exp(-INVSR / t); const dbToLin = (db) => Math.pow(10, db / 20); const clamp = (num, min, max) => Math.min(Math.max(num, min), max); @@ -1420,17 +1420,16 @@ class TransientProcessor extends AudioWorkletProcessor { if (!input || !output) { return true; } - const channels = output.length; + const channels = input.length; this.attackEnv ??= new Float32Array(channels); this.sustainEnv ??= new Float32Array(channels); let avgGain = this.avgGain; for (let ch = 0; ch < channels; ch++) { - const inCh = input[ch]; - const outCh = output[ch]; let attEnv = this.attackEnv[ch]; let susEnv = this.sustainEnv[ch]; - for (let i = 0; i < blockSize; i++) { - const x = Math.abs(inCh[i]); + for (let n = 0; n < blockSize; n++) { + const sample = input[ch][n]; + const x = Math.abs(sample); attEnv = lerp(attEnv, x, this.attackCoeff); susEnv = lerp(susEnv, x, this.sustainCoeff); const peakiness = clamp((this.scaling * (attEnv - susEnv)) / (susEnv + 1e-6), -1.5, 1.5); @@ -1442,7 +1441,7 @@ class TransientProcessor extends AudioWorkletProcessor { avgGain = lerp(avgGain, gain, this.gainCoeff); const makeup = avgGain > 1e-3 ? 1 / avgGain : 1; const wet = x * gain * makeup; - outCh[i] = lerp(x, wet, this.mix); + output[ch][n] = lerp(sample, wet, this.mix); } this.attackEnv[ch] = attEnv; this.sustainEnv[ch] = susEnv; From df047fd48dbb4df27ca596f2ca085eeb2fb86c4d Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 23 Nov 2025 22:28:10 -0600 Subject: [PATCH 16/49] Optimizations --- packages/core/controls.mjs | 14 +++++++++++++- packages/superdough/superdough.mjs | 2 -- packages/superdough/worklets.mjs | 16 +++++++++++----- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 80a244efc..bca7036ad 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -2585,4 +2585,16 @@ export const scrub = register( false, ); -export const { transient } = registerControl(['transient', 'transsustain', 'transattack']); +/** + * Transient shaper. Gives independent control over the emphasis on transients + * and sustains + * + * @name transient + * @param {number | Pattern} attack Emphasis on transients; between -1 (deaccentuate) and 1 (accentuate) + * @param {number | Pattern} sustain Emphasis on the sustains; between -1 (deaccentuate) and 1 (accentuate) + * @example + * s("bd").transient("<-1 -0.5 0 0.5 1>") + * @example + * s("hh*16").bank("tr909").transient("<-1:1 1:-1>") + */ +export const { transient } = registerControl(['transient', 'transsustain']); diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index acf6edef2..ac6ca7322 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -453,7 +453,6 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) compressorRelease, transient, transsustain, - transattack, } = value; delaytime = delaytime ?? cycleToSeconds(delaysync, cps); @@ -545,7 +544,6 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) processorOptions: { attack: transient, sustain: transsustain, - attackTime: transattack, }, }, ), diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index 6af7dffc1..6b370166c 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -1412,6 +1412,10 @@ class TransientProcessor extends AudioWorkletProcessor { this.sustainAmt = clamp(sustain, -1, 1); this.scaling = 0.5 + 5 * clamp(sensitivity, 0, 1); this.mix = clamp(mix, 0, 1); + const maxAttackDb = this.attackAmt * 6; + const maxSustainDb = this.sustainAmt * 36; + this.attackMaxGain = dbToLin(maxAttackDb) - 1; // increasing from 1 + this.sustainMaxGain = dbToLin(maxSustainDb) - 1; } process(inputs, outputs, _params) { @@ -1433,15 +1437,17 @@ class TransientProcessor extends AudioWorkletProcessor { attEnv = lerp(attEnv, x, this.attackCoeff); susEnv = lerp(susEnv, x, this.sustainCoeff); const peakiness = clamp((this.scaling * (attEnv - susEnv)) / (susEnv + 1e-6), -1.5, 1.5); - const attScale = Math.max(0, peakiness); - const susScale = Math.max(0, -peakiness); - const attackGain = dbToLin(this.attackAmt * attScale * 18); // max 18db - const sustainGain = dbToLin(this.sustainAmt * susScale * 36); // max 36db + const attScale = peakiness > 0 ? peakiness : 0; + const susScale = peakiness < 0 ? -peakiness : 0; + const attackGain = 1 + attScale * this.attackMaxGain; + const sustainGain = 1 + susScale * this.sustainMaxGain; const gain = clamp(attackGain * sustainGain, 0, 8); avgGain = lerp(avgGain, gain, this.gainCoeff); const makeup = avgGain > 1e-3 ? 1 / avgGain : 1; const wet = x * gain * makeup; - output[ch][n] = lerp(sample, wet, this.mix); + let y = lerp(sample, wet, this.mix); + y /= (1 + Math.abs(y)); // soft clip + output[ch][n] = y; } this.attackEnv[ch] = attEnv; this.sustainEnv[ch] = susEnv; From be36898803a59f201d3d3db4e79bf35a2cc53edb Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 23 Nov 2025 22:29:33 -0600 Subject: [PATCH 17/49] Formatting and examples --- packages/superdough/worklets.mjs | 2 +- test/__snapshots__/examples.test.mjs.snap | 78 +++++++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index 6b370166c..e5dd0a0d7 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -1446,7 +1446,7 @@ class TransientProcessor extends AudioWorkletProcessor { const makeup = avgGain > 1e-3 ? 1 / avgGain : 1; const wet = x * gain * makeup; let y = lerp(sample, wet, this.mix); - y /= (1 + Math.abs(y)); // soft clip + y /= 1 + Math.abs(y); // soft clip output[ch][n] = y; } this.attackEnv[ch] = attEnv; diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 31e4bddd3..66777d5e1 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -11410,6 +11410,84 @@ exports[`runs examples > example "tour" example index 0 1`] = ` ] `; +exports[`runs examples > example "transient" example index 0 1`] = ` +[ + "[ 0/1 → 1/1 | s:bd transient:-1 ]", + "[ 1/1 → 2/1 | s:bd transient:-0.5 ]", + "[ 2/1 → 3/1 | s:bd transient:0 ]", + "[ 3/1 → 4/1 | s:bd transient:0.5 ]", +] +`; + +exports[`runs examples > example "transient" example index 1 1`] = ` +[ + "[ 0/1 → 1/16 | s:hh bank:tr909 transient:-1 transsustain:1 ]", + "[ 1/16 → 1/8 | s:hh bank:tr909 transient:-1 transsustain:1 ]", + "[ 1/8 → 3/16 | s:hh bank:tr909 transient:-1 transsustain:1 ]", + "[ 3/16 → 1/4 | s:hh bank:tr909 transient:-1 transsustain:1 ]", + "[ 1/4 → 5/16 | s:hh bank:tr909 transient:-1 transsustain:1 ]", + "[ 5/16 → 3/8 | s:hh bank:tr909 transient:-1 transsustain:1 ]", + "[ 3/8 → 7/16 | s:hh bank:tr909 transient:-1 transsustain:1 ]", + "[ 7/16 → 1/2 | s:hh bank:tr909 transient:-1 transsustain:1 ]", + "[ 1/2 → 9/16 | s:hh bank:tr909 transient:-1 transsustain:1 ]", + "[ 9/16 → 5/8 | s:hh bank:tr909 transient:-1 transsustain:1 ]", + "[ 5/8 → 11/16 | s:hh bank:tr909 transient:-1 transsustain:1 ]", + "[ 11/16 → 3/4 | s:hh bank:tr909 transient:-1 transsustain:1 ]", + "[ 3/4 → 13/16 | s:hh bank:tr909 transient:-1 transsustain:1 ]", + "[ 13/16 → 7/8 | s:hh bank:tr909 transient:-1 transsustain:1 ]", + "[ 7/8 → 15/16 | s:hh bank:tr909 transient:-1 transsustain:1 ]", + "[ 15/16 → 1/1 | s:hh bank:tr909 transient:-1 transsustain:1 ]", + "[ 1/1 → 17/16 | s:hh bank:tr909 transient:1 transsustain:-1 ]", + "[ 17/16 → 9/8 | s:hh bank:tr909 transient:1 transsustain:-1 ]", + "[ 9/8 → 19/16 | s:hh bank:tr909 transient:1 transsustain:-1 ]", + "[ 19/16 → 5/4 | s:hh bank:tr909 transient:1 transsustain:-1 ]", + "[ 5/4 → 21/16 | s:hh bank:tr909 transient:1 transsustain:-1 ]", + "[ 21/16 → 11/8 | s:hh bank:tr909 transient:1 transsustain:-1 ]", + "[ 11/8 → 23/16 | s:hh bank:tr909 transient:1 transsustain:-1 ]", + "[ 23/16 → 3/2 | s:hh bank:tr909 transient:1 transsustain:-1 ]", + "[ 3/2 → 25/16 | s:hh bank:tr909 transient:1 transsustain:-1 ]", + "[ 25/16 → 13/8 | s:hh bank:tr909 transient:1 transsustain:-1 ]", + "[ 13/8 → 27/16 | s:hh bank:tr909 transient:1 transsustain:-1 ]", + "[ 27/16 → 7/4 | s:hh bank:tr909 transient:1 transsustain:-1 ]", + "[ 7/4 → 29/16 | s:hh bank:tr909 transient:1 transsustain:-1 ]", + "[ 29/16 → 15/8 | s:hh bank:tr909 transient:1 transsustain:-1 ]", + "[ 15/8 → 31/16 | s:hh bank:tr909 transient:1 transsustain:-1 ]", + "[ 31/16 → 2/1 | s:hh bank:tr909 transient:1 transsustain:-1 ]", + "[ 2/1 → 33/16 | s:hh bank:tr909 transient:-1 transsustain:1 ]", + "[ 33/16 → 17/8 | s:hh bank:tr909 transient:-1 transsustain:1 ]", + "[ 17/8 → 35/16 | s:hh bank:tr909 transient:-1 transsustain:1 ]", + "[ 35/16 → 9/4 | s:hh bank:tr909 transient:-1 transsustain:1 ]", + "[ 9/4 → 37/16 | s:hh bank:tr909 transient:-1 transsustain:1 ]", + "[ 37/16 → 19/8 | s:hh bank:tr909 transient:-1 transsustain:1 ]", + "[ 19/8 → 39/16 | s:hh bank:tr909 transient:-1 transsustain:1 ]", + "[ 39/16 → 5/2 | s:hh bank:tr909 transient:-1 transsustain:1 ]", + "[ 5/2 → 41/16 | s:hh bank:tr909 transient:-1 transsustain:1 ]", + "[ 41/16 → 21/8 | s:hh bank:tr909 transient:-1 transsustain:1 ]", + "[ 21/8 → 43/16 | s:hh bank:tr909 transient:-1 transsustain:1 ]", + "[ 43/16 → 11/4 | s:hh bank:tr909 transient:-1 transsustain:1 ]", + "[ 11/4 → 45/16 | s:hh bank:tr909 transient:-1 transsustain:1 ]", + "[ 45/16 → 23/8 | s:hh bank:tr909 transient:-1 transsustain:1 ]", + "[ 23/8 → 47/16 | s:hh bank:tr909 transient:-1 transsustain:1 ]", + "[ 47/16 → 3/1 | s:hh bank:tr909 transient:-1 transsustain:1 ]", + "[ 3/1 → 49/16 | s:hh bank:tr909 transient:1 transsustain:-1 ]", + "[ 49/16 → 25/8 | s:hh bank:tr909 transient:1 transsustain:-1 ]", + "[ 25/8 → 51/16 | s:hh bank:tr909 transient:1 transsustain:-1 ]", + "[ 51/16 → 13/4 | s:hh bank:tr909 transient:1 transsustain:-1 ]", + "[ 13/4 → 53/16 | s:hh bank:tr909 transient:1 transsustain:-1 ]", + "[ 53/16 → 27/8 | s:hh bank:tr909 transient:1 transsustain:-1 ]", + "[ 27/8 → 55/16 | s:hh bank:tr909 transient:1 transsustain:-1 ]", + "[ 55/16 → 7/2 | s:hh bank:tr909 transient:1 transsustain:-1 ]", + "[ 7/2 → 57/16 | s:hh bank:tr909 transient:1 transsustain:-1 ]", + "[ 57/16 → 29/8 | s:hh bank:tr909 transient:1 transsustain:-1 ]", + "[ 29/8 → 59/16 | s:hh bank:tr909 transient:1 transsustain:-1 ]", + "[ 59/16 → 15/4 | s:hh bank:tr909 transient:1 transsustain:-1 ]", + "[ 15/4 → 61/16 | s:hh bank:tr909 transient:1 transsustain:-1 ]", + "[ 61/16 → 31/8 | s:hh bank:tr909 transient:1 transsustain:-1 ]", + "[ 31/8 → 63/16 | s:hh bank:tr909 transient:1 transsustain:-1 ]", + "[ 63/16 → 4/1 | s:hh bank:tr909 transient:1 transsustain:-1 ]", +] +`; + exports[`runs examples > example "transpose" example index 0 1`] = ` [ "[ 0/1 → 1/4 | note:C2 ]", From 6c01c16a0cbd4dda8f4fe6081746824d79972701 Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 23 Nov 2025 22:39:21 -0600 Subject: [PATCH 18/49] Fix typo --- packages/superdough/worklets.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index e5dd0a0d7..67d5e1641 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -1436,7 +1436,7 @@ class TransientProcessor extends AudioWorkletProcessor { const x = Math.abs(sample); attEnv = lerp(attEnv, x, this.attackCoeff); susEnv = lerp(susEnv, x, this.sustainCoeff); - const peakiness = clamp((this.scaling * (attEnv - susEnv)) / (susEnv + 1e-6), -1.5, 1.5); + const peakiness = clamp((this.scaling * (attEnv - susEnv)) / (susEnv + 1e-6), -1, 1); const attScale = peakiness > 0 ? peakiness : 0; const susScale = peakiness < 0 ? -peakiness : 0; const attackGain = 1 + attScale * this.attackMaxGain; @@ -1444,7 +1444,7 @@ class TransientProcessor extends AudioWorkletProcessor { const gain = clamp(attackGain * sustainGain, 0, 8); avgGain = lerp(avgGain, gain, this.gainCoeff); const makeup = avgGain > 1e-3 ? 1 / avgGain : 1; - const wet = x * gain * makeup; + const wet = sample * gain * makeup; let y = lerp(sample, wet, this.mix); y /= 1 + Math.abs(y); // soft clip output[ch][n] = y; From 36587ae74732fa69f58704b2a0f3a0ebfbf8e96a Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 23 Nov 2025 22:55:36 -0600 Subject: [PATCH 19/49] Switch back to original version --- packages/superdough/worklets.mjs | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index 67d5e1641..d88e9dea2 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -1412,10 +1412,6 @@ class TransientProcessor extends AudioWorkletProcessor { this.sustainAmt = clamp(sustain, -1, 1); this.scaling = 0.5 + 5 * clamp(sensitivity, 0, 1); this.mix = clamp(mix, 0, 1); - const maxAttackDb = this.attackAmt * 6; - const maxSustainDb = this.sustainAmt * 36; - this.attackMaxGain = dbToLin(maxAttackDb) - 1; // increasing from 1 - this.sustainMaxGain = dbToLin(maxSustainDb) - 1; } process(inputs, outputs, _params) { @@ -1436,11 +1432,11 @@ class TransientProcessor extends AudioWorkletProcessor { const x = Math.abs(sample); attEnv = lerp(attEnv, x, this.attackCoeff); susEnv = lerp(susEnv, x, this.sustainCoeff); - const peakiness = clamp((this.scaling * (attEnv - susEnv)) / (susEnv + 1e-6), -1, 1); + const peakiness = clamp((this.scaling * (attEnv - susEnv)) / (susEnv + 1e-6), -1.5, 1.5); const attScale = peakiness > 0 ? peakiness : 0; const susScale = peakiness < 0 ? -peakiness : 0; - const attackGain = 1 + attScale * this.attackMaxGain; - const sustainGain = 1 + susScale * this.sustainMaxGain; + const attackGain = dbToLin(this.attackAmt * attScale * 18); + const sustainGain = dbToLin(this.sustainAmt * susScale * 36); const gain = clamp(attackGain * sustainGain, 0, 8); avgGain = lerp(avgGain, gain, this.gainCoeff); const makeup = avgGain > 1e-3 ? 1 / avgGain : 1; From a278f21f1b0a8923d3d454c0e0f0b70de828845b Mon Sep 17 00:00:00 2001 From: Aria Date: Mon, 24 Nov 2025 17:52:00 -0600 Subject: [PATCH 20/49] Allow register in autocomplete, add vel as synonym for velocity, fix some controls --- packages/core/controls.mjs | 20 +++++++++----------- packages/core/pattern.mjs | 1 - 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index a9d7cc266..a59b30d1a 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -380,12 +380,13 @@ export const { accelerate } = registerControl('accelerate'); * Sets the velocity from 0 to 1. Is multiplied together with gain. * * @name velocity + * @synonyms vel * @example * s("hh*8") * .gain(".4!2 1 .4!2 1 .4 1") * .velocity(".4 1") */ -export const { velocity } = registerControl('velocity'); +export const { velocity, vel } = registerControl('velocity', 'vel'); /** * Controls the gain by an exponential amount. * @@ -1323,14 +1324,13 @@ export const { lpdepth } = registerControl('lpdepth'); * Depth of the LFO for the lowpass filter, in HZ * * @name lpdepthfrequency - * @synonyms - * lpdethfreq + * @synonyms lpdepthfreq * @param {number | Pattern} depth depth of modulation * @example * note("*16").s("sawtooth").lpf(600).lpdepthfrequency("<200 500 100 0>") */ -export const { lpdepthfrequency } = registerControl('lpdepthfrequency', 'lpdepthfreq'); +export const { lpdepthfrequency, lpdepthfreq } = registerControl('lpdepthfrequency', 'lpdepthfreq'); /** * Shape of the LFO for the lowpass filter @@ -1384,14 +1384,13 @@ export const { bpdepth } = registerControl('bpdepth'); * Depth of the LFO for the bandpass filter, in HZ * * @name bpdepthfrequency - * @synonyms - * bpdethfreq + * @synonyms bpdepthfreq * @param {number | Pattern} depth depth of modulation * @example * note("*16").s("sawtooth").lpf(600).bpdepthfrequency("<200 500 100 0>") */ -export const { bpdepthfrequency } = registerControl('bpdepthfrequency', 'bpdepthfreq'); +export const { bpdepthfrequency, bpdepthfreq } = registerControl('bpdepthfrequency', 'bpdepthfreq'); /** * Shape of the LFO for the bandpass filter @@ -1439,20 +1438,19 @@ export const { hpsync } = registerControl('hpsync'); * @name hpdepth * @param {number | Pattern} depth depth of modulation */ -export const { hpdepth, hpdepthfreq } = registerControl('hpdepth'); +export const { hpdepth } = registerControl('hpdepth'); /** * Depth of the LFO for the hipass filter, in hz * * @name hpdepthfrequency - * @synonyms - * hpdethfreq + * @synonyms hpdepthfreq * @param {number | Pattern} depth depth of modulation * @example * note("*16").s("sawtooth").lpf(600).hpdepthfrequency("<200 500 100 0>") */ -export const { hpdepthfrequency } = registerControl('hpdepthfrequency', 'hpdepthfreq'); +export const { hpdepthfrequency, hpdepthfreq } = registerControl('hpdepthfrequency', 'hpdepthfreq'); /** * Shape of the LFO for the highpass filter diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index 4737f0db0..01a7efbd1 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -1587,7 +1587,6 @@ export const func = curry((a, b) => reify(b).func(a)); * * @param {string | string[]} name name of the function, or an array of names to be used as synonyms * @param {function} func function with 1 or more params, where last is the current pattern - * @noAutocomplete * */ export function register(name, func, patternify = true, preserveSteps = false, join = (x) => x.innerJoin()) { From d7afb8a6c097de11a34fdde58a9f976e38a3ba18 Mon Sep 17 00:00:00 2001 From: Aria Date: Mon, 24 Nov 2025 18:01:20 -0600 Subject: [PATCH 21/49] Add register example --- packages/core/pattern.mjs | 7 +++++ test/__snapshots__/examples.test.mjs.snap | 37 +++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index 01a7efbd1..4753ebfd9 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -1587,6 +1587,13 @@ export const func = curry((a, b) => reify(b).func(a)); * * @param {string | string[]} name name of the function, or an array of names to be used as synonyms * @param {function} func function with 1 or more params, where last is the current pattern + * @param {bool} patternify defaults to true; if set to false, you will have more control over the arguments to `func` as they will be + * in their raw form and it will be up to you to patternify them and/or query them for values + * @example + * const vlpf = register('vlpf', (freq, pat) => { + * return pat.fmap((v) => ({...v, cutoff: freq * (v.velocity ?? 1) })); + * }) + * s("saw").seg(8).velocity(rand).vlpf(800) * */ export function register(name, func, patternify = true, preserveSteps = false, join = (x) => x.innerJoin()) { diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 8cbee39da..db1b62288 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -9064,6 +9064,43 @@ exports[`runs examples > example "ratio" example index 0 1`] = ` ] `; +exports[`runs examples > example "register" example index 0 1`] = ` +[ + "[ 0/1 → 1/8 | s:saw velocity:0 cutoff:0 ]", + "[ 1/8 → 1/4 | s:saw velocity:0.6852155700325966 cutoff:548.1724560260773 ]", + "[ 1/4 → 3/8 | s:saw velocity:0.36975969187915325 cutoff:295.8077535033226 ]", + "[ 3/8 → 1/2 | s:saw velocity:0.40139251574873924 cutoff:321.1140125989914 ]", + "[ 1/2 → 5/8 | s:saw velocity:0.2604806162416935 cutoff:208.3844929933548 ]", + "[ 5/8 → 3/4 | s:saw velocity:0.1356358677148819 cutoff:108.50869417190552 ]", + "[ 3/4 → 7/8 | s:saw velocity:0.19582648016512394 cutoff:156.66118413209915 ]", + "[ 7/8 → 1/1 | s:saw velocity:0.3976310808211565 cutoff:318.1048646569252 ]", + "[ 1/1 → 9/8 | s:saw velocity:0.5195421651005745 cutoff:415.6337320804596 ]", + "[ 9/8 → 5/4 | s:saw velocity:0.6724895145744085 cutoff:537.9916116595268 ]", + "[ 5/4 → 11/8 | s:saw velocity:0.7287282031029463 cutoff:582.982562482357 ]", + "[ 11/8 → 3/2 | s:saw velocity:0.18280375190079212 cutoff:146.2430015206337 ]", + "[ 3/2 → 13/8 | s:saw velocity:0.6084080748260021 cutoff:486.7264598608017 ]", + "[ 13/8 → 7/4 | s:saw velocity:0.49675471149384975 cutoff:397.4037691950798 ]", + "[ 7/4 → 15/8 | s:saw velocity:0.20473789609968662 cutoff:163.7903168797493 ]", + "[ 15/8 → 2/1 | s:saw velocity:0.5945571791380644 cutoff:475.6457433104515 ]", + "[ 2/1 → 17/8 | s:saw velocity:0.9595271199941635 cutoff:767.6216959953308 ]", + "[ 17/8 → 9/4 | s:saw velocity:0.9033902939409018 cutoff:722.7122351527214 ]", + "[ 9/4 → 19/8 | s:saw velocity:0.34548251144587994 cutoff:276.38600915670395 ]", + "[ 19/8 → 5/2 | s:saw velocity:0.8365066405385733 cutoff:669.2053124308586 ]", + "[ 5/2 → 21/8 | s:saw velocity:0.45861607417464256 cutoff:366.89285933971405 ]", + "[ 21/8 → 11/4 | s:saw velocity:0.16019348427653313 cutoff:128.1547874212265 ]", + "[ 11/4 → 23/8 | s:saw velocity:0.6332327704876661 cutoff:506.5862163901329 ]", + "[ 23/8 → 3/1 | s:saw velocity:0.01625417172908783 cutoff:13.003337383270264 ]", + "[ 3/1 → 25/8 | s:saw velocity:0.21728911064565182 cutoff:173.83128851652145 ]", + "[ 25/8 → 13/4 | s:saw velocity:0.34324387833476067 cutoff:274.59510266780853 ]", + "[ 13/4 → 27/8 | s:saw velocity:0.9923650715500116 cutoff:793.8920572400093 ]", + "[ 27/8 → 7/2 | s:saw velocity:0.40869180113077164 cutoff:326.9534409046173 ]", + "[ 7/2 → 29/8 | s:saw velocity:0.40994881466031075 cutoff:327.9590517282486 ]", + "[ 29/8 → 15/4 | s:saw velocity:0.9391485787928104 cutoff:751.3188630342484 ]", + "[ 15/4 → 31/8 | s:saw velocity:0.8121673222631216 cutoff:649.7338578104973 ]", + "[ 31/8 → 4/1 | s:saw velocity:0.7361665386706591 cutoff:588.9332309365273 ]", +] +`; + exports[`runs examples > example "release" example index 0 1`] = ` [ "[ 0/1 → 1/4 | note:c3 release:0 ]", From 7e5a907ce57210783375268e76b482b31835c1bb Mon Sep 17 00:00:00 2001 From: Aria Date: Mon, 24 Nov 2025 18:41:25 -0600 Subject: [PATCH 22/49] Add a few more functions to autocomplete --- packages/core/pattern.mjs | 27 ++++- test/__snapshots__/examples.test.mjs.snap | 133 ++++++++++++++++++++++ 2 files changed, 155 insertions(+), 5 deletions(-) diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index 4753ebfd9..14b2b11e6 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -574,7 +574,8 @@ export class Pattern { * Returns a new Pattern, which only returns haps that meet the given test. * @param {Function} hap_test - a function which returns false for haps to be removed from the pattern * @returns Pattern - * @noAutocomplete + * @example + * s("bd*8").velocity(rand).filterHaps((h) => (h.whole.begin % 1) < h.value.velocity) */ filterHaps(hap_test) { return new Pattern((state) => this.query(state).filter(hap_test)); @@ -585,12 +586,22 @@ export class Pattern { * inside haps. * @param {Function} value_test * @returns Pattern - * @noAutocomplete + * @synonyms filtval + * @example + * const drums = s("bd sd bd sd") + * kick: drums.filterValues((v) => v.s === 'bd').duck(2) + * snare: drums.filterValues((v) => v.s === 'sd') + * bass: s("saw!4").note("G#1").lpf(80).lpenv(4).orbit(2) */ filterValues(value_test) { return new Pattern((state) => this.query(state).filter((hap) => value_test(hap.value))).setSteps(this._steps); } + // synonym + filtval(value_test) { + this.filterValues(value_test); + } + /** * Returns a new pattern, with haps containing undefined values removed from * query results. @@ -2665,8 +2676,13 @@ export const hsl = register('hsl', (h, s, l, pat) => { /** * Tags each Hap with an identifier. Good for filtering. The function populates Hap.context.tags (Array). * @name tag - * @noAutocomplete * @param {string} tag anything unique + * @example + * s("saw!16").note("F1") + * .lpf(tri.range(40, 80).slow(4)).lpenv(5).lpq(4).lpd(0.15) + * .when(rand.late(0.1).gte(0.5), x => x.transpose("12").tag('altered')) + * .when(rand.late(0.2).gte(0.5), x => x.s("square").tag('altered')) + * .when("<0 1>", x => x.filter((hap) => hap.hasTag('altered'))) */ Pattern.prototype.tag = function (tag) { return this.withContext((ctx) => ({ ...ctx, tags: (ctx.tags || []).concat([tag]) })); @@ -2677,15 +2693,16 @@ Pattern.prototype.tag = function (tag) { * @name filter * @param {Function} test function to test Hap * @example - * s("hh!7 oh").filter(hap => hap.value.s==='hh') + * s("hh!7 oh").filter(hap => hap.value.s === 'hh') */ export const filter = register('filter', (test, pat) => pat.withHaps((haps) => haps.filter(test))); /** * Filters haps by their begin time * @name filterWhen - * @noAutocomplete * @param {Function} test function to test Hap.whole.begin + * @example + * oneCycle: s("bd*4").filterWhen((t) => t < 1) */ export const filterWhen = register('filterWhen', (test, pat) => pat.filter((h) => test(h.whole.begin))); diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index db1b62288..68eae8243 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -4043,6 +4043,70 @@ exports[`runs examples > example "filter" example index 0 1`] = ` ] `; +exports[`runs examples > example "filterHaps" example index 0 1`] = ` +[ + "[ 1/8 → 1/4 | s:bd velocity:0.6852155700325966 ]", + "[ 1/4 → 3/8 | s:bd velocity:0.36975969187915325 ]", + "[ 3/8 → 1/2 | s:bd velocity:0.40139251574873924 ]", + "[ 1/1 → 9/8 | s:bd velocity:0.5195421651005745 ]", + "[ 9/8 → 5/4 | s:bd velocity:0.6724895145744085 ]", + "[ 5/4 → 11/8 | s:bd velocity:0.7287282031029463 ]", + "[ 3/2 → 13/8 | s:bd velocity:0.6084080748260021 ]", + "[ 2/1 → 17/8 | s:bd velocity:0.9595271199941635 ]", + "[ 17/8 → 9/4 | s:bd velocity:0.9033902939409018 ]", + "[ 9/4 → 19/8 | s:bd velocity:0.34548251144587994 ]", + "[ 19/8 → 5/2 | s:bd velocity:0.8365066405385733 ]", + "[ 3/1 → 25/8 | s:bd velocity:0.21728911064565182 ]", + "[ 25/8 → 13/4 | s:bd velocity:0.34324387833476067 ]", + "[ 13/4 → 27/8 | s:bd velocity:0.9923650715500116 ]", + "[ 27/8 → 7/2 | s:bd velocity:0.40869180113077164 ]", + "[ 29/8 → 15/4 | s:bd velocity:0.9391485787928104 ]", + "[ 15/4 → 31/8 | s:bd velocity:0.8121673222631216 ]", +] +`; + +exports[`runs examples > example "filterValues" example index 0 1`] = ` +[ + "[ 0/1 → 1/4 | s:saw note:G#1 cutoff:80 lpenv:4 orbit:2 ]", + "[ 1/4 → 1/2 | s:saw note:G#1 cutoff:80 lpenv:4 orbit:2 ]", + "[ 1/2 → 3/4 | s:saw note:G#1 cutoff:80 lpenv:4 orbit:2 ]", + "[ 3/4 → 1/1 | s:saw note:G#1 cutoff:80 lpenv:4 orbit:2 ]", + "[ 1/1 → 5/4 | s:saw note:G#1 cutoff:80 lpenv:4 orbit:2 ]", + "[ 5/4 → 3/2 | s:saw note:G#1 cutoff:80 lpenv:4 orbit:2 ]", + "[ 3/2 → 7/4 | s:saw note:G#1 cutoff:80 lpenv:4 orbit:2 ]", + "[ 7/4 → 2/1 | s:saw note:G#1 cutoff:80 lpenv:4 orbit:2 ]", + "[ 2/1 → 9/4 | s:saw note:G#1 cutoff:80 lpenv:4 orbit:2 ]", + "[ 9/4 → 5/2 | s:saw note:G#1 cutoff:80 lpenv:4 orbit:2 ]", + "[ 5/2 → 11/4 | s:saw note:G#1 cutoff:80 lpenv:4 orbit:2 ]", + "[ 11/4 → 3/1 | s:saw note:G#1 cutoff:80 lpenv:4 orbit:2 ]", + "[ 3/1 → 13/4 | s:saw note:G#1 cutoff:80 lpenv:4 orbit:2 ]", + "[ 13/4 → 7/2 | s:saw note:G#1 cutoff:80 lpenv:4 orbit:2 ]", + "[ 7/2 → 15/4 | s:saw note:G#1 cutoff:80 lpenv:4 orbit:2 ]", + "[ 15/4 → 4/1 | s:saw note:G#1 cutoff:80 lpenv:4 orbit:2 ]", +] +`; + +exports[`runs examples > example "filterWhen" example index 0 1`] = ` +[ + "[ 0/1 → 1/4 | s:bd ]", + "[ 1/4 → 1/2 | s:bd ]", + "[ 1/2 → 3/4 | s:bd ]", + "[ 3/4 → 1/1 | s:bd ]", + "[ 1/1 → 5/4 | s:bd ]", + "[ 5/4 → 3/2 | s:bd ]", + "[ 3/2 → 7/4 | s:bd ]", + "[ 7/4 → 2/1 | s:bd ]", + "[ 2/1 → 9/4 | s:bd ]", + "[ 9/4 → 5/2 | s:bd ]", + "[ 5/2 → 11/4 | s:bd ]", + "[ 11/4 → 3/1 | s:bd ]", + "[ 3/1 → 13/4 | s:bd ]", + "[ 13/4 → 7/2 | s:bd ]", + "[ 7/2 → 15/4 | s:bd ]", + "[ 15/4 → 4/1 | s:bd ]", +] +`; + exports[`runs examples > example "firstOf" example index 0 1`] = ` [ "[ 0/1 → 1/4 | note:g3 ]", @@ -11749,6 +11813,75 @@ exports[`runs examples > example "sysexid" example index 0 1`] = ` ] `; +exports[`runs examples > example "tag" example index 0 1`] = ` +[ + "[ 0/1 → 1/16 | s:square note:F1 cutoff:40 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 1/16 → 1/8 | s:square note:F1 cutoff:41.25 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 1/8 → 3/16 | s:square note:F1 cutoff:42.5 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 3/16 → 1/4 | s:square note:F1 cutoff:43.75 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 1/4 → 5/16 | s:square note:F1 cutoff:45 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 5/16 → 3/8 | s:square note:F1 cutoff:46.25 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 3/8 → 7/16 | s:square note:F1 cutoff:47.5 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 7/16 → 1/2 | s:square note:F1 cutoff:48.75 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 1/2 → 9/16 | s:square note:F1 cutoff:50 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 9/16 → 5/8 | s:square note:F1 cutoff:51.25 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 5/8 → 11/16 | s:square note:F1 cutoff:52.5 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 11/16 → 3/4 | s:square note:F1 cutoff:53.75 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 3/4 → 13/16 | s:square note:F1 cutoff:55 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 13/16 → 7/8 | s:square note:F1 cutoff:56.25 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 7/8 → 15/16 | s:square note:F1 cutoff:57.5 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 15/16 → 1/1 | s:square note:F1 cutoff:58.75 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 1/1 → 17/16 | s:saw note:F2 cutoff:60 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 17/16 → 9/8 | s:saw note:F2 cutoff:61.25 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 9/8 → 19/16 | s:saw note:F2 cutoff:62.5 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 19/16 → 5/4 | s:saw note:F2 cutoff:63.75 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 5/4 → 21/16 | s:saw note:F2 cutoff:65 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 21/16 → 11/8 | s:saw note:F2 cutoff:66.25 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 11/8 → 23/16 | s:saw note:F2 cutoff:67.5 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 23/16 → 3/2 | s:saw note:F2 cutoff:68.75 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 3/2 → 25/16 | s:saw note:F2 cutoff:70 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 25/16 → 13/8 | s:saw note:F2 cutoff:71.25 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 13/8 → 27/16 | s:saw note:F2 cutoff:72.5 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 27/16 → 7/4 | s:saw note:F2 cutoff:73.75 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 7/4 → 29/16 | s:saw note:F2 cutoff:75 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 29/16 → 15/8 | s:saw note:F2 cutoff:76.25 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 15/8 → 31/16 | s:saw note:F2 cutoff:77.5 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 31/16 → 2/1 | s:saw note:F2 cutoff:78.75 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 2/1 → 33/16 | s:saw note:F1 cutoff:80 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 33/16 → 17/8 | s:saw note:F1 cutoff:78.75 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 17/8 → 35/16 | s:saw note:F1 cutoff:77.5 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 35/16 → 9/4 | s:saw note:F1 cutoff:76.25 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 9/4 → 37/16 | s:saw note:F1 cutoff:75 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 37/16 → 19/8 | s:saw note:F1 cutoff:73.75 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 19/8 → 39/16 | s:saw note:F1 cutoff:72.5 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 39/16 → 5/2 | s:saw note:F1 cutoff:71.25 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 5/2 → 41/16 | s:saw note:F1 cutoff:70 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 41/16 → 21/8 | s:saw note:F1 cutoff:68.75 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 21/8 → 43/16 | s:saw note:F1 cutoff:67.5 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 43/16 → 11/4 | s:saw note:F1 cutoff:66.25 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 11/4 → 45/16 | s:saw note:F1 cutoff:65 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 45/16 → 23/8 | s:saw note:F1 cutoff:63.75 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 23/8 → 47/16 | s:saw note:F1 cutoff:62.5 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 47/16 → 3/1 | s:saw note:F1 cutoff:61.25 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 3/1 → 49/16 | s:square note:F1 cutoff:60 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 49/16 → 25/8 | s:square note:F1 cutoff:58.75 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 25/8 → 51/16 | s:square note:F1 cutoff:57.5 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 51/16 → 13/4 | s:square note:F1 cutoff:56.25 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 13/4 → 53/16 | s:square note:F1 cutoff:55 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 53/16 → 27/8 | s:square note:F1 cutoff:53.75 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 27/8 → 55/16 | s:square note:F1 cutoff:52.5 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 55/16 → 7/2 | s:square note:F1 cutoff:51.25 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 7/2 → 57/16 | s:square note:F1 cutoff:50 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 57/16 → 29/8 | s:square note:F1 cutoff:48.75 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 29/8 → 59/16 | s:square note:F1 cutoff:47.5 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 59/16 → 15/4 | s:square note:F1 cutoff:46.25 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 15/4 → 61/16 | s:square note:F1 cutoff:45 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 61/16 → 31/8 | s:square note:F1 cutoff:43.75 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 31/8 → 63/16 | s:square note:F1 cutoff:42.5 lpenv:5 resonance:4 lpdecay:0.15 ]", + "[ 63/16 → 4/1 | s:square note:F1 cutoff:41.25 lpenv:5 resonance:4 lpdecay:0.15 ]", +] +`; + exports[`runs examples > example "take" example index 0 1`] = ` [ "[ 0/1 → 1/2 | s:bd ]", From 39e7f700791bc92b3949a1ca721e64d002f94842 Mon Sep 17 00:00:00 2001 From: Aria Date: Mon, 24 Nov 2025 18:43:47 -0600 Subject: [PATCH 23/49] Remove synonym --- packages/core/pattern.mjs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index 14b2b11e6..9f5929a6d 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -586,7 +586,6 @@ export class Pattern { * inside haps. * @param {Function} value_test * @returns Pattern - * @synonyms filtval * @example * const drums = s("bd sd bd sd") * kick: drums.filterValues((v) => v.s === 'bd').duck(2) @@ -597,11 +596,6 @@ export class Pattern { return new Pattern((state) => this.query(state).filter((hap) => value_test(hap.value))).setSteps(this._steps); } - // synonym - filtval(value_test) { - this.filterValues(value_test); - } - /** * Returns a new pattern, with haps containing undefined values removed from * query results. From d84db1e663b2d89867700b60788f3ca54ffc4081 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Fri, 28 Nov 2025 10:02:57 +0100 Subject: [PATCH 24/49] hotfix: auto deploy to warm.strudel.cc when main changes --- .forgejo/workflows/deploy-warm-beta.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.forgejo/workflows/deploy-warm-beta.yml b/.forgejo/workflows/deploy-warm-beta.yml index 2de6670c8..e6636a729 100644 --- a/.forgejo/workflows/deploy-warm-beta.yml +++ b/.forgejo/workflows/deploy-warm-beta.yml @@ -1,6 +1,9 @@ name: Build and Deploy to beta (warm.strudel.cc) -on: [workflow_dispatch] +on: + push: + branches: + - main # Allow one concurrent deployment concurrency: From b65cc2128feabf0a5909e652fe59058303aadbf1 Mon Sep 17 00:00:00 2001 From: jeromew Date: Sat, 29 Nov 2025 14:47:03 +0000 Subject: [PATCH 25/49] [perf] fix phaser leak of unused biquads --- packages/superdough/superdough.mjs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 6f610d514..514c492cf 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -290,7 +290,7 @@ function getPhaser(time, end, frequency = 1, depth = 0.5, centerFrequency = 1000 const lfo = getLfo(ac, time, end, { frequency, depth: sweep * 2 }); //filters - const numStages = 2; //num of filters in series + const numStages = 1; //num of filters in series let fOffset = 0; const filterChain = []; for (let i = 0; i < numStages; i++) { @@ -302,12 +302,9 @@ function getPhaser(time, end, frequency = 1, depth = 0.5, centerFrequency = 1000 lfo.connect(filter.detune); fOffset += 282; - if (i > 0) { - filterChain[i - 1].connect(filter); - } filterChain.push(filter); } - return { phaser: filterChain[filterChain.length - 1], lfo }; + return { phaser: filterChain, lfo }; } function getFilterType(ftype) { @@ -699,7 +696,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) if (phaserrate !== undefined && phaserdepth > 0) { const { phaser, lfo } = getPhaser(t, endWithRelease, phaserrate, phaserdepth, phasercenter, phasersweep); audioNodes.push(lfo); - chain.push(phaser); + Array.prototype.push.apply(chain, phaser); } // last gain From 0b711e879c767ab1c4bfba7af0c655d28da70f8c Mon Sep 17 00:00:00 2001 From: jeromew Date: Thu, 4 Dec 2025 08:23:36 +0000 Subject: [PATCH 26/49] Improve naming & backward compat --- packages/superdough/superdough.mjs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 514c492cf..191665498 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -291,7 +291,7 @@ function getPhaser(time, end, frequency = 1, depth = 0.5, centerFrequency = 1000 //filters const numStages = 1; //num of filters in series - let fOffset = 0; + let fOffset = 282; //for backward compat in #1800 const filterChain = []; for (let i = 0; i < numStages; i++) { const filter = ac.createBiquadFilter(); @@ -304,7 +304,7 @@ function getPhaser(time, end, frequency = 1, depth = 0.5, centerFrequency = 1000 fOffset += 282; filterChain.push(filter); } - return { phaser: filterChain, lfo }; + return { filterChain, lfo }; } function getFilterType(ftype) { @@ -694,9 +694,9 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) } // phaser if (phaserrate !== undefined && phaserdepth > 0) { - const { phaser, lfo } = getPhaser(t, endWithRelease, phaserrate, phaserdepth, phasercenter, phasersweep); + const { filterChain, lfo } = getPhaser(t, endWithRelease, phaserrate, phaserdepth, phasercenter, phasersweep); audioNodes.push(lfo); - Array.prototype.push.apply(chain, phaser); + chain.push(...filterChain); } // last gain From 46291bf85ca0cf583568266f02f7370c6eb67e82 Mon Sep 17 00:00:00 2001 From: jeromew Date: Thu, 4 Dec 2025 13:17:20 +0000 Subject: [PATCH 27/49] Difuse the `onceEnded` mechanism --- packages/superdough/helpers.mjs | 4 ++-- packages/superdough/noise.mjs | 4 ++-- packages/superdough/synth.mjs | 13 +++++++------ 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 0b696df9b..6fe1e5b72 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -324,10 +324,10 @@ export function getVibratoOscillator(param, value, t) { gain.gain.value = vibmod * 100; vibratoOscillator.connect(gain); gain.connect(param); - vibratoOscillator.onended = () => { + onceEnded(vibratoOscillator, () => { gain.disconnect(param); vibratoOscillator.disconnect(gain); - }; + }); vibratoOscillator.start(t); return vibratoOscillator; } diff --git a/packages/superdough/noise.mjs b/packages/superdough/noise.mjs index 3e41515df..da60e87a1 100644 --- a/packages/superdough/noise.mjs +++ b/packages/superdough/noise.mjs @@ -1,4 +1,4 @@ -import { drywet } from './helpers.mjs'; +import { drywet, onceEnded } from './helpers.mjs'; import { getAudioContext } from './audioContext.mjs'; let noiseCache = {}; @@ -65,7 +65,7 @@ export function getNoiseOscillator(type = 'white', t, density = 0.02) { export function getNoiseMix(inputNode, wet, t) { const noiseOscillator = getNoiseOscillator('pink', t); const noiseMix = drywet(inputNode, noiseOscillator.node, wet); - noiseOscillator.node.onended = () => noiseMix.onended(); + onceEnded(noiseOscillator.node, () => noiseMix.onended()); return { node: noiseMix.node, stop: (time) => noiseOscillator?.stop(time), diff --git a/packages/superdough/synth.mjs b/packages/superdough/synth.mjs index b02354465..a2d3aeca0 100644 --- a/packages/superdough/synth.mjs +++ b/packages/superdough/synth.mjs @@ -1,5 +1,6 @@ import { clamp } from './util.mjs'; import { registerSound, soundMap } from './superdough.mjs'; +import { onceEnded } from './helpers.mjs'; import { getAudioContext } from './audioContext.mjs'; import { applyFM, @@ -110,7 +111,7 @@ export function registerSynthSounds() { const mix = gainNode(mixGain); - o.onended = () => { + onceEnded(o, () => { o.disconnect(); g.disconnect(); sat.disconnect(); @@ -118,7 +119,7 @@ export function registerSynthSounds() { noiseGain.disconnect(); mix.disconnect(); onended(); - }; + }); const node = o.connect(sat).connect(g).connect(mix); noise.node.connect(noiseGain).connect(mix); @@ -384,11 +385,11 @@ export function registerSynthSounds() { const { duration } = value; - o.onended = () => { + onceEnded(o, () => { o.disconnect(); g.disconnect(); onended(); - }; + }); const envGain = gainNode(1); let node = o.connect(g).connect(envGain); @@ -489,11 +490,11 @@ export function getOscillator(s, t, value, onended) { noiseMix = getNoiseMix(o, noise, t); } - o.onended = () => { + onceEnded(o, () => { noiseMix || o.disconnect(); noiseMix?.node.disconnect(); onended(); - }; + }); o.start(t); return { From c7586e96ff8ff1bbeb7b8d6b965d4a8a6b8fce3b Mon Sep 17 00:00:00 2001 From: jeromew Date: Thu, 4 Dec 2025 13:20:17 +0000 Subject: [PATCH 28/49] Add comment on `end` worklet param --- packages/superdough/helpers.mjs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 6fe1e5b72..f000db63e 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -613,6 +613,8 @@ export const releaseAudioNode = (node) => { // returns true and either its active source flag is true or // any AudioNode connected to one of its inputs is actively processing. if (node instanceof AudioWorkletNode) { + // while `end` is not native to the web audio API, it is common practice in superdough + // to use that param in the worklets to trigger returning false from the processor node.parameters.get('end')?.setValueAtTime(0, 0); } }; From f6f507dd291ccdaca4ca5b2d32dc456fd48edbe2 Mon Sep 17 00:00:00 2001 From: jeromew Date: Thu, 4 Dec 2025 15:26:59 +0000 Subject: [PATCH 29/49] propagate `releaseAudioNode` in packages --- packages/soundfonts/fontloader.mjs | 6 +++--- packages/superdough/helpers.mjs | 6 +++--- packages/superdough/sampler.mjs | 8 ++++---- packages/superdough/superdough.mjs | 4 ++-- packages/superdough/synth.mjs | 24 ++++++++++++------------ packages/superdough/wavetable.mjs | 6 +++--- 6 files changed, 27 insertions(+), 27 deletions(-) diff --git a/packages/soundfonts/fontloader.mjs b/packages/soundfonts/fontloader.mjs index ca9e45d51..95e210890 100644 --- a/packages/soundfonts/fontloader.mjs +++ b/packages/soundfonts/fontloader.mjs @@ -7,6 +7,7 @@ import { getPitchEnvelope, getVibratoOscillator, onceEnded, + releaseAudioNode, } from '@strudel/webaudio'; import gm from './gm.mjs'; @@ -172,9 +173,8 @@ export function registerSoundfonts() { bufferSource.stop(envEnd); const stop = (releaseTime) => {}; onceEnded(bufferSource, () => { - bufferSource.disconnect(); - vibratoOscillator?.stop(); - node.disconnect(); + releaseAudioNode(bufferSource); + releaseAudioNode(vibratoOscillator); onended(); }); return { node, stop }; diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index f000db63e..5202dbdfe 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -189,7 +189,7 @@ export function applyParameterModulators(audioContext, param, start, end, envelo getParamADSR(param, attack, decay, sustain, release, min, max, start, holdEnd, curve); } const lfo = getParamLfo(audioContext, param, start, end, lfoValues); - return { lfo, disconnect: () => lfo?.disconnect() }; + return lfo } export function createFilter(context, start, end, params, cps, cycle) { let { @@ -325,8 +325,8 @@ export function getVibratoOscillator(param, value, t) { vibratoOscillator.connect(gain); gain.connect(param); onceEnded(vibratoOscillator, () => { - gain.disconnect(param); - vibratoOscillator.disconnect(gain); + releaseAudioNode(gain); + releaseAudioNode(vibratoOscillator); }); vibratoOscillator.start(t); return vibratoOscillator; diff --git a/packages/superdough/sampler.mjs b/packages/superdough/sampler.mjs index 1e8c786bf..0e1e291ff 100644 --- a/packages/superdough/sampler.mjs +++ b/packages/superdough/sampler.mjs @@ -329,10 +329,10 @@ export async function onTriggerSample(t, value, onended, bank, resolveUrl) { const out = ac.createGain(); // we need a separate gain for the cutgroups because firefox... node.connect(out); onceEnded(bufferSource, function () { - bufferSource.disconnect(); - vibratoOscillator?.stop(); - node.disconnect(); - out.disconnect(); + releaseAudioNode(bufferSource); + releaseAudioNode(vibratoOscillator); + releaseAudioNode(node); + releaseAudioNode(out); onended(); }); let envEnd = holdEnd + release + 0.01; diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 6f610d514..bfcf3ab5c 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -9,7 +9,7 @@ import './reverb.mjs'; import './vowel.mjs'; import { nanFallback, _mod, cycleToSeconds, pickAndRename } from './util.mjs'; import workletsUrl from './worklets.mjs?audioworklet'; -import { createFilter, gainNode, getCompressor, getDistortion, getLfo, getWorklet, effectSend } from './helpers.mjs'; +import { createFilter, gainNode, getCompressor, getDistortion, getLfo, getWorklet, effectSend, releaseAudioNode } from './helpers.mjs'; import { map } from 'nanostores'; import { logger } from './logger.mjs'; import { loadBuffer } from './sampler.mjs'; @@ -506,7 +506,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) } else if (getSound(s)) { const { onTrigger } = getSound(s); const onEnded = () => { - audioNodes.forEach((n) => n?.disconnect()); + audioNodes.forEach((n) => releaseAudioNode(n)); activeSoundSources.delete(chainID); }; const soundHandle = await onTrigger(t, value, onEnded, cps); diff --git a/packages/superdough/synth.mjs b/packages/superdough/synth.mjs index a2d3aeca0..e82c889ac 100644 --- a/packages/superdough/synth.mjs +++ b/packages/superdough/synth.mjs @@ -1,6 +1,5 @@ import { clamp } from './util.mjs'; import { registerSound, soundMap } from './superdough.mjs'; -import { onceEnded } from './helpers.mjs'; import { getAudioContext } from './audioContext.mjs'; import { applyFM, @@ -13,6 +12,7 @@ import { getVibratoOscillator, getWorklet, noises, + onceEnded, releaseAudioNode, webAudioTimeout, } from './helpers.mjs'; @@ -53,7 +53,7 @@ export function registerSynthSounds() { const g = gainNode(0.3); let sound = getOscillator(s, t, value, () => { - g.disconnect(); + releaseAudioNode(g); onended(); }); @@ -112,12 +112,12 @@ export function registerSynthSounds() { const mix = gainNode(mixGain); onceEnded(o, () => { - o.disconnect(); - g.disconnect(); - sat.disconnect(); - noise.node.disconnect(); - noiseGain.disconnect(); - mix.disconnect(); + releaseAudioNode(o); + releaseAudioNode(g); + releaseAudioNode(sat); + releaseAudioNode(noise.node); + releaseAudioNode(noiseGain); + releaseAudioNode(mix); onended(); }); @@ -386,8 +386,8 @@ export function registerSynthSounds() { const { duration } = value; onceEnded(o, () => { - o.disconnect(); - g.disconnect(); + releaseAudioNode(o); + releaseAudioNode(g); onended(); }); @@ -491,8 +491,8 @@ export function getOscillator(s, t, value, onended) { } onceEnded(o, () => { - noiseMix || o.disconnect(); - noiseMix?.node.disconnect(); + noiseMix || releaseAudioNode(o); + releaseAudioNode(noiseMix?.node); onended(); }); o.start(t); diff --git a/packages/superdough/wavetable.mjs b/packages/superdough/wavetable.mjs index e9d810414..4311c5cab 100644 --- a/packages/superdough/wavetable.mjs +++ b/packages/superdough/wavetable.mjs @@ -320,10 +320,10 @@ export async function onTriggerSynth(t, value, onended, tables, cps, frameLen) { ac, () => { releaseAudioNode(source); - vibratoOscillator?.stop(); + releaseAudioNode(vibratoOscillator); fm?.stop(); - wtPosModulators?.disconnect(); - wtWarpModulators?.disconnect(); + releaseAudioNode(wtPosModulators); + releaseAudioNode(wtWarpModulators); onended(); }, t, From 1225d0443748b04c1a84b077c71f88b5f66c7428 Mon Sep 17 00:00:00 2001 From: jeromew Date: Thu, 4 Dec 2025 15:29:21 +0000 Subject: [PATCH 30/49] codeformat --- packages/superdough/helpers.mjs | 2 +- packages/superdough/superdough.mjs | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 5202dbdfe..a5f199fb1 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -189,7 +189,7 @@ export function applyParameterModulators(audioContext, param, start, end, envelo getParamADSR(param, attack, decay, sustain, release, min, max, start, holdEnd, curve); } const lfo = getParamLfo(audioContext, param, start, end, lfoValues); - return lfo + return lfo; } export function createFilter(context, start, end, params, cps, cycle) { let { diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index bfcf3ab5c..98a875130 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -9,7 +9,16 @@ import './reverb.mjs'; import './vowel.mjs'; import { nanFallback, _mod, cycleToSeconds, pickAndRename } from './util.mjs'; import workletsUrl from './worklets.mjs?audioworklet'; -import { createFilter, gainNode, getCompressor, getDistortion, getLfo, getWorklet, effectSend, releaseAudioNode } from './helpers.mjs'; +import { + createFilter, + gainNode, + getCompressor, + getDistortion, + getLfo, + getWorklet, + effectSend, + releaseAudioNode, +} from './helpers.mjs'; import { map } from 'nanostores'; import { logger } from './logger.mjs'; import { loadBuffer } from './sampler.mjs'; From 16b5faf3331ce18a9a791059a7a71995815ecb54 Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 7 Dec 2025 11:23:55 -0600 Subject: [PATCH 31/49] Removing failing tests due to shabda removal --- packages/superdough/sampler.mjs | 6 ---- test/__snapshots__/examples.test.mjs.snap | 36 ----------------------- 2 files changed, 42 deletions(-) diff --git a/packages/superdough/sampler.mjs b/packages/superdough/sampler.mjs index 1e8c786bf..bdf524d10 100644 --- a/packages/superdough/sampler.mjs +++ b/packages/superdough/sampler.mjs @@ -243,12 +243,6 @@ export async function fetchSampleMap(url) { * sd: '808sd/SD0010.WAV' * }, 'https://raw.githubusercontent.com/tidalcycles/Dirt-Samples/master/'); * s("[bd ~]*2, [~ hh]*2, ~ sd") - * @example - * samples('shabda:noise,chimp:2') - * s("noise ") - * @example - * samples('shabda/speech/fr-FR/f:chocolat') - * s("chocolat*4") */ export const samples = async (sampleMap, baseUrl = sampleMap._base || '', options = {}) => { diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 5c76f4a89..7ecaf97ba 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -9722,42 +9722,6 @@ exports[`runs examples > example "samples" example index 1 1`] = ` ] `; -exports[`runs examples > example "samples" example index 2 1`] = ` -[ - "[ 0/1 → 1/2 | s:noise ]", - "[ 1/2 → 3/4 | s:chimp n:0 ]", - "[ 3/4 → 1/1 | s:chimp n:0 ]", - "[ 1/1 → 3/2 | s:noise ]", - "[ 3/2 → 2/1 | s:chimp n:1 ]", - "[ 2/1 → 5/2 | s:noise ]", - "[ 5/2 → 11/4 | s:chimp n:0 ]", - "[ 11/4 → 3/1 | s:chimp n:0 ]", - "[ 3/1 → 7/2 | s:noise ]", - "[ 7/2 → 4/1 | s:chimp n:1 ]", -] -`; - -exports[`runs examples > example "samples" example index 3 1`] = ` -[ - "[ 0/1 → 1/4 | s:chocolat ]", - "[ 1/4 → 1/2 | s:chocolat ]", - "[ 1/2 → 3/4 | s:chocolat ]", - "[ 3/4 → 1/1 | s:chocolat ]", - "[ 1/1 → 5/4 | s:chocolat ]", - "[ 5/4 → 3/2 | s:chocolat ]", - "[ 3/2 → 7/4 | s:chocolat ]", - "[ 7/4 → 2/1 | s:chocolat ]", - "[ 2/1 → 9/4 | s:chocolat ]", - "[ 9/4 → 5/2 | s:chocolat ]", - "[ 5/2 → 11/4 | s:chocolat ]", - "[ 11/4 → 3/1 | s:chocolat ]", - "[ 3/1 → 13/4 | s:chocolat ]", - "[ 13/4 → 7/2 | s:chocolat ]", - "[ 7/2 → 15/4 | s:chocolat ]", - "[ 15/4 → 4/1 | s:chocolat ]", -] -`; - exports[`runs examples > example "saw" example index 0 1`] = ` [ "[ 0/1 → 1/8 | note:c3 clip:0 ]", From fe7e8f7add4b45216416d1f65038a6bb65f4ec04 Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 7 Dec 2025 13:21:06 -0600 Subject: [PATCH 32/49] Clearer docstring --- packages/midi/midi.mjs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/midi/midi.mjs b/packages/midi/midi.mjs index 0fee380c6..cd38d3587 100644 --- a/packages/midi/midi.mjs +++ b/packages/midi/midi.mjs @@ -486,8 +486,9 @@ const refsByChan = {}; * * The output is a function that accepts a midi cc value to query as well as (optionally) a midi channel * @param {string | number} input MIDI device name or index defaulting to 0 - * @returns {function(number, number=): function(): number} A function from (cc, channel?) to - * the most recently received midi cc value through the input (normalized to 0 to 1) + * @returns {function(number, number=): Pattern} A function from (cc, channel?) to a pattern. + * When queried, the pattern will produces the most recently received midi value (normalized to 0 to 1) + * that came through that cc number (and channel, if provided) * @example * const cc = await midin('IAC Driver Bus 1') * note("c a f e").lpf(cc(0).range(0, 1000)).lpq(cc(1).range(0, 10)).sound("sawtooth") From 358b1e3f563ffe6bafd33689b1fec8e7c02c4ecc Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 7 Dec 2025 13:28:57 -0600 Subject: [PATCH 33/49] Make sure processor turns off; fix array sizes for JIT --- packages/superdough/superdough.mjs | 2 ++ packages/superdough/worklets.mjs | 17 ++++++++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 52bf332e3..b4df1f734 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -544,6 +544,8 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) processorOptions: { attack: transient, sustain: transsustain, + begin: t, + end: endWithRelease, }, }, ), diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index d190cf41f..a59aeb756 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -1404,6 +1404,8 @@ class TransientProcessor extends AudioWorkletProcessor { sustain = 0, sensitivity = 0.1, mix = 1, + begin = 0, + end = 0, } = options.processorOptions; attackTime = clamp(attackTime, 0.0005, 0.05); sustainTime = clamp(sustainTime, 0.01, 0.5); @@ -1413,17 +1415,26 @@ class TransientProcessor extends AudioWorkletProcessor { this.sustainAmt = clamp(sustain, -1, 1); this.scaling = 0.5 + 5 * clamp(sensitivity, 0, 1); this.mix = clamp(mix, 0, 1); + this.begin = begin; + this.end = end; + this.attackEnv = new Float32Array(2); // assume stereo + this.sustainEnv = new Float32Array(2); } process(inputs, outputs, _params) { const input = inputs[0]; const output = outputs[0]; - if (!input || !output) { + if (currentTime >= this.end) { + return false; + } + if (currentTime <= this.begin) { return true; } const channels = input.length; - this.attackEnv ??= new Float32Array(channels); - this.sustainEnv ??= new Float32Array(channels); + if (channels > this.attackEnv.length) { + this.attackEnv = new Float32Array(channels); + this.sustainEnv = new Float32Array(channels); + } let avgGain = this.avgGain; for (let ch = 0; ch < channels; ch++) { let attEnv = this.attackEnv[ch]; From 71d36b79edfdf85cb035764b418662210226d245 Mon Sep 17 00:00:00 2001 From: jeromew Date: Mon, 8 Dec 2025 17:31:34 +0000 Subject: [PATCH 34/49] Improve getOscillator/noiseMix release --- packages/superdough/helpers.mjs | 9 ++++++--- packages/superdough/noise.mjs | 7 +++++-- packages/superdough/synth.mjs | 3 ++- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index a5f199fb1..5abc2bad1 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -283,9 +283,12 @@ export function drywet(dry, wet, wetAmount = 0) { wet_gain.connect(mix); return { node: mix, - onended: () => { - dry_gain.disconnect(mix); - wet_gain.disconnect(mix); + teardown: () => { + releaseAudioNode(dry_gain); + releaseAudioNode(wet_gain); + // it is not the responsability of drywet + // to call `releaseAudioNode` on + // the 2 external args dry and wet dry.disconnect(dry_gain); wet.disconnect(wet_gain); }, diff --git a/packages/superdough/noise.mjs b/packages/superdough/noise.mjs index da60e87a1..52d9306a1 100644 --- a/packages/superdough/noise.mjs +++ b/packages/superdough/noise.mjs @@ -1,4 +1,4 @@ -import { drywet, onceEnded } from './helpers.mjs'; +import { drywet, onceEnded, releaseAudioNode } from './helpers.mjs'; import { getAudioContext } from './audioContext.mjs'; let noiseCache = {}; @@ -65,9 +65,12 @@ export function getNoiseOscillator(type = 'white', t, density = 0.02) { export function getNoiseMix(inputNode, wet, t) { const noiseOscillator = getNoiseOscillator('pink', t); const noiseMix = drywet(inputNode, noiseOscillator.node, wet); - onceEnded(noiseOscillator.node, () => noiseMix.onended()); + onceEnded(noiseOscillator.node, () => { + releaseAudioNode(noiseOscillator.node); + }); return { node: noiseMix.node, stop: (time) => noiseOscillator?.stop(time), + teardown: noiseMix.teardown, }; } diff --git a/packages/superdough/synth.mjs b/packages/superdough/synth.mjs index e82c889ac..d9ee0d936 100644 --- a/packages/superdough/synth.mjs +++ b/packages/superdough/synth.mjs @@ -491,7 +491,8 @@ export function getOscillator(s, t, value, onended) { } onceEnded(o, () => { - noiseMix || releaseAudioNode(o); + noiseMix?.teardown(); + releaseAudioNode(o); releaseAudioNode(noiseMix?.node); onended(); }); From e89414e400362ebe064858e4c0b1cc3441b56dca Mon Sep 17 00:00:00 2001 From: alex Date: Wed, 10 Dec 2025 09:19:12 +0000 Subject: [PATCH 35/49] fix .as so it doesn't set undefined values --- packages/core/controls.mjs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index c7edef74f..f28d13f62 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -2753,8 +2753,13 @@ export const as = register('as', (mapping, pat) => { mapping = Array.isArray(mapping) ? mapping : [mapping]; return pat.fmap((v) => { v = Array.isArray(v) ? v : [v]; - v = Object.fromEntries(mapping.map((prop, i) => [getControlName(prop), v[i]])); - return v; + const entries = []; + for (let i = 0; i < mapping.length; ++i) { + if (v[i] !== undefined) { + entries.push([getControlName(mapping[i]), v[i]]); + } + } + return Object.fromEntries(entries); }); }); From 12884cba3a0db216fa14a1c1c3d2521ab38fcccf Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 11 Dec 2025 12:09:26 +0000 Subject: [PATCH 36/49] Updates relating to LLM, github, etc --- CONTRIBUTING.md | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a7f65b5bf..a4cf5d9e0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,20 +4,13 @@ Thanks for wanting to contribute!!! There are many ways you can add value to thi ## Move to codeberg -We are currently in the process of moving from github to codeberg -- not everything is working, please bear with us. - -To update your local clone, you can run this command: - -``` -git remote set-url origin git@codeberg.org:uzu/strudel.git -``` - +Along with many other live coding projects, we have moved from Microsoft's Github platform to Codeberg for ethical reasons. Please don't fork the project back to github. ## Communication Channels -To get in touch with the contributors, either +To get in touch with the community, either -- [join the Tidal Discord Channel](https://discord.com/invite/HGEdXmRkzT) and go to the #strudel channel +- [join the Tidal Discord Channel](https://discord.com/invite/HGEdXmRkzT) and go to the #strudel channels - Find related discussions on the [tidal club forum](https://club.tidalcycles.org/) ## Ask a Question @@ -36,22 +29,33 @@ Use one of the Communication Channels listed above and drop us a line or two! ## Share Music If you made some music with strudel, you can give back some love and share what you've done! -Your creation could also be part of the random selection in the REPL if you want. Use one of the Communication Channels listed above. +(There used to be a random selection of contributed patterns in the REPL, but that is unfortunately disabled for now due to abuse) ## Improve the Docs -If you find some weak spots in the [docs](https://strudel.cc/workshop/getting-started/), -you can edit each file directly on codeburg. (we are currently fixing the "Edit this page" links in the right sidebar) +If you find some weak spots in the [docs](https://strudel.cc/workshop/getting-started/), you can edit each file directly on codeburg. There are "Edit this page" links in the right sidebar that take you to the right place. ## Propose a Feature -If you want a specific feature that is not part of strudel yet, feel free to use one of the communication channels above. -Maybe you even want to help with the implementation of that feature! +If you want a specific feature that is not part of strudel yet, feel free to use one of the communication channels above. Please bear in mind that this is a free/open source project, oriented around collaborative discussion. Maybe you even want to help with the implementation of that feature! + +## Contribute a feature + +It's generally best to start with discussion rather than do loads of work on something and then find it doesn't fit the collective goals of the project, or something like that. + +## AI/LLM policy + +Strudel is a project handmade by humans, with a lot of thought and nuance. We are still developing our response to the onslaught of LLM technology. + +If you have used LLMs (so called 'AI'), please make that clear in the pull request. If code is LLM-generated/isn't your own work, then the PR will not be merged, for practical and legal reasons. + +There are #llm-chat and #llm-share channels on our discord. Please do not discuss or share LLM-related things outside of those channels. ## Report a Bug If you've found a bug, or some behaviour that does not seem right, you are welcome to file an [issue](https://codeberg.org/uzu/strudel/issues). + Please check that it has not been reported before. ## Fix a Bug @@ -118,8 +122,7 @@ There are also eslint extensions / plugins for most editors. ## Running all CI Checks -When opening a PR, the CI runner will automatically check the code style and eslint, as well as run all tests. -You can run the same check with `pnpm check` +When opening a PR, the CI runner will (once approved by a human) check the code style and eslint, as well as run all tests. You can run the same check with `pnpm check`. ## Package Workflow From 960f1de9d2d125c95737b73abaf382fcfe4b5ab7 Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 11 Dec 2025 12:16:54 +0000 Subject: [PATCH 37/49] tweaks --- CONTRIBUTING.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a4cf5d9e0..10146bec2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -10,7 +10,7 @@ Along with many other live coding projects, we have moved from Microsoft's Githu To get in touch with the community, either -- [join the Tidal Discord Channel](https://discord.com/invite/HGEdXmRkzT) and go to the #strudel channels +- [join the Uzulang Discord Server](https://discord.com/invite/HGEdXmRkzT) and go to the strudel channels (Uzulangs are a family of live coding languages inspired by each other, including TidalCycles as well as Strudel) - Find related discussions on the [tidal club forum](https://club.tidalcycles.org/) ## Ask a Question @@ -42,9 +42,9 @@ If you want a specific feature that is not part of strudel yet, feel free to use ## Contribute a feature -It's generally best to start with discussion rather than do loads of work on something and then find it doesn't fit the collective goals of the project, or something like that. +Pull requests welcome! Consider starting with discussion or proof-of-concept first, rather than do loads of work on something and then find it doesn't fit the collective goals of the project, or something like that. -## AI/LLM policy +### AI/LLM policy Strudel is a project handmade by humans, with a lot of thought and nuance. We are still developing our response to the onslaught of LLM technology. From 96835be056e626020b6917ab8fad2cbcbcae1232 Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 11 Dec 2025 15:07:57 +0000 Subject: [PATCH 38/49] tweaks --- CONTRIBUTING.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 10146bec2..b8a941fc1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -34,7 +34,7 @@ Use one of the Communication Channels listed above. ## Improve the Docs -If you find some weak spots in the [docs](https://strudel.cc/workshop/getting-started/), you can edit each file directly on codeburg. There are "Edit this page" links in the right sidebar that take you to the right place. +If you find some weak spots in the [docs](https://strudel.cc/workshop/getting-started/), you can edit each file directly on codeberg. There are "Edit this page" links in the right sidebar that take you to the right place. ## Propose a Feature @@ -44,11 +44,13 @@ If you want a specific feature that is not part of strudel yet, feel free to use Pull requests welcome! Consider starting with discussion or proof-of-concept first, rather than do loads of work on something and then find it doesn't fit the collective goals of the project, or something like that. +At the time of writing we have a PR backlog, and generally prioritise bugfixes and contributions that have arisen through community discussion. + ### AI/LLM policy -Strudel is a project handmade by humans, with a lot of thought and nuance. We are still developing our response to the onslaught of LLM technology. +Strudel is a project handmade by humans, with thought and nuance. -If you have used LLMs (so called 'AI'), please make that clear in the pull request. If code is LLM-generated/isn't your own work, then the PR will not be merged, for practical and legal reasons. +If you have used LLMs (so called 'AI'), please detail that in the pull request. We are still developing our response to the onslaught of LLM technology, but for practical and legal reasons are currently not accepting wholly LLM-generated code. We are also not accepting PRs that add LLM features to strudel itself. There are #llm-chat and #llm-share channels on our discord. Please do not discuss or share LLM-related things outside of those channels. From 8cbe4b945cfbd050ddbd85755c459a65135a90f0 Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 11 Dec 2025 16:39:08 +0000 Subject: [PATCH 39/49] Respond to glossing's review --- packages/core/impure.mjs | 35 +++++++++++++++++++++++++++++------ packages/core/repl.mjs | 4 ++++ 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/packages/core/impure.mjs b/packages/core/impure.mjs index e16cfbe45..84886aa49 100644 --- a/packages/core/impure.mjs +++ b/packages/core/impure.mjs @@ -8,24 +8,48 @@ import { register, reify, Pattern } from './pattern.mjs'; let timelines = {}; +export const reset_state = function () { + reset_timelines(); +}; + export const reset_timelines = function () { timelines = {}; }; +/*** + * Allows you to switch a pattern between different 'timelines'. This is particularly useful when + * live coding, for example when you want to cue a pattern up to play from its start. + * + * Timelines are specified by number, so that if you had a pattern like + * `n("<0 1 2 3>").s("num").timeline(1)` playing, then changed the '1' + * to '2', it would always align '0' to the nearest cycle. You will likely want to trigger + * an evaluation a little bit before the cycle starts, to avoid missing events. + * + * If you change and evaluate a pattern without changing the timeline, it will stay on that timeline + * without resetting. + * + * Rather than incrementing a timeline to reset it, it's easier to negate it, e.g. by switching between `-2` + * and `2`. This is because when you negate a timeline it will always reset. + * + * You can also pattern the timeline if you want, to create strange resetting patterns. + */ + export const timeline = register( 'timeline', function (tpat, pat) { tpat = reify(tpat); const f = function (state) { - let scheduler = !!state.controls._cps; + // Is this called from the scheduler? (rather than from e.g. the visualiser) + const scheduler = !!state.controls._cyclist; const timehaps = tpat.query(state); const result = []; for (const timehap of timehaps) { const tlid = timehap.value; - const ignore = false; let offset; - if (tlid in timelines) { + if (tlid === 0) { + offset = 0; + } else if (tlid in timelines) { offset = timelines[tlid]; } else { const timearc = timehap.wholeOrPart(); @@ -40,9 +64,8 @@ export const timeline = register( if (scheduler) { // update state timelines[tlid] = offset; - const negative = 0 - tlid; - if (negative in timelines) { - delete timelines[negative]; + if (tlid !== 0) { + delete timelines[-tlid]; } } diff --git a/packages/core/repl.mjs b/packages/core/repl.mjs index 171697eb9..cd78cca48 100644 --- a/packages/core/repl.mjs +++ b/packages/core/repl.mjs @@ -5,6 +5,7 @@ import { errorLogger, logger } from './logger.mjs'; import { setTime } from './time.mjs'; import { evalScope } from './evaluate.mjs'; import { register, Pattern, isPattern, silence, stack } from './pattern.mjs'; +import { reset_state } from './impure.mjs'; export function repl({ defaultOutput, @@ -52,6 +53,9 @@ export function repl({ onToggle: (started) => { updateState({ started }); onToggle?.(started); + if (!started) { + reset_state(); + } }, setInterval, clearInterval, From 37990b459f3571d4b254ca99030e21d4cf836104 Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 11 Dec 2025 16:51:25 +0000 Subject: [PATCH 40/49] bugfix and tweak doc --- packages/core/impure.mjs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/packages/core/impure.mjs b/packages/core/impure.mjs index 84886aa49..304f801f5 100644 --- a/packages/core/impure.mjs +++ b/packages/core/impure.mjs @@ -25,13 +25,21 @@ export const reset_timelines = function () { * to '2', it would always align '0' to the nearest cycle. You will likely want to trigger * an evaluation a little bit before the cycle starts, to avoid missing events. * - * If you change and evaluate a pattern without changing the timeline, it will stay on that timeline - * without resetting. + * After the first use, a timeline will continue with the same 'offset'. That is, if you change + * a pattern without changing its timeline number, it will stay on that timeline without resetting. * * Rather than incrementing a timeline to reset it, it's easier to negate it, e.g. by switching between `-2` * and `2`. This is because when you negate a timeline it will always reset. * * You can also pattern the timeline if you want, to create strange resetting patterns. + * @param {number | Pattern} timeline The timeline that the pattern should play on. + * @example + * n("<0 1 2 3>(3,8)") + * .sound("num") + * // resets the timeline every two cycles, by negating the timeline. + * // in a lot of cases this will be edited by a human live coder + * // rather than patterned! + * .timeline("<2 -2>".slow(2)) */ export const timeline = register( @@ -40,8 +48,7 @@ export const timeline = register( tpat = reify(tpat); const f = function (state) { // Is this called from the scheduler? (rather than from e.g. the visualiser) - const scheduler = !!state.controls._cyclist; - + const scheduler = !!state.controls.cyclist; const timehaps = tpat.query(state); const result = []; for (const timehap of timehaps) { From c6e0f0533e927a878339a9828c32d21ac9115a7c Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 11 Dec 2025 23:32:10 +0000 Subject: [PATCH 41/49] add delta --- packages/core/signal.mjs | 9 ++++ test/__snapshots__/examples.test.mjs.snap | 53 +++++++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/packages/core/signal.mjs b/packages/core/signal.mjs index 62fc26ad8..9ac768951 100644 --- a/packages/core/signal.mjs +++ b/packages/core/signal.mjs @@ -882,3 +882,12 @@ export const whenKey = register('whenKey', function (input, func, pat) { export const keyDown = register('keyDown', function (pat) { return pat.fmap(_keyDown); }); + +/** + * A pattern that gives the duration of events that are combined with it. + * @example + * sound("bd sd [bd bd] sd*4 [- sd] [bd [bd bd]]").note(delta.withValue(x => 1/x + 20)) + */ +export const delta = new Pattern(function (state) { + return [new Hap(undefined, state.span, state.span.duration)]; +}); diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 09d285b5d..17dcb08ba 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -2784,6 +2784,59 @@ exports[`runs examples > example "delaysync" example index 0 1`] = ` ] `; +exports[`runs examples > example "delta" example index 0 1`] = ` +[ + "[ 0/1 → 1/6 | s:bd note:26 ]", + "[ 1/6 → 1/3 | s:sd note:26 ]", + "[ 1/3 → 5/12 | s:bd note:32 ]", + "[ 5/12 → 1/2 | s:bd note:32 ]", + "[ 1/2 → 13/24 | s:sd note:44 ]", + "[ 13/24 → 7/12 | s:sd note:44 ]", + "[ 7/12 → 5/8 | s:sd note:44 ]", + "[ 5/8 → 2/3 | s:sd note:44 ]", + "[ 3/4 → 5/6 | s:sd note:32 ]", + "[ 5/6 → 11/12 | s:bd note:32 ]", + "[ 11/12 → 23/24 | s:bd note:44 ]", + "[ 23/24 → 1/1 | s:bd note:44 ]", + "[ 1/1 → 7/6 | s:bd note:26 ]", + "[ 7/6 → 4/3 | s:sd note:26 ]", + "[ 4/3 → 17/12 | s:bd note:32 ]", + "[ 17/12 → 3/2 | s:bd note:32 ]", + "[ 3/2 → 37/24 | s:sd note:44 ]", + "[ 37/24 → 19/12 | s:sd note:44 ]", + "[ 19/12 → 13/8 | s:sd note:44 ]", + "[ 13/8 → 5/3 | s:sd note:44 ]", + "[ 7/4 → 11/6 | s:sd note:32 ]", + "[ 11/6 → 23/12 | s:bd note:32 ]", + "[ 23/12 → 47/24 | s:bd note:44 ]", + "[ 47/24 → 2/1 | s:bd note:44 ]", + "[ 2/1 → 13/6 | s:bd note:26 ]", + "[ 13/6 → 7/3 | s:sd note:26 ]", + "[ 7/3 → 29/12 | s:bd note:32 ]", + "[ 29/12 → 5/2 | s:bd note:32 ]", + "[ 5/2 → 61/24 | s:sd note:44 ]", + "[ 61/24 → 31/12 | s:sd note:44 ]", + "[ 31/12 → 21/8 | s:sd note:44 ]", + "[ 21/8 → 8/3 | s:sd note:44 ]", + "[ 11/4 → 17/6 | s:sd note:32 ]", + "[ 17/6 → 35/12 | s:bd note:32 ]", + "[ 35/12 → 71/24 | s:bd note:44 ]", + "[ 71/24 → 3/1 | s:bd note:44 ]", + "[ 3/1 → 19/6 | s:bd note:26 ]", + "[ 19/6 → 10/3 | s:sd note:26 ]", + "[ 10/3 → 41/12 | s:bd note:32 ]", + "[ 41/12 → 7/2 | s:bd note:32 ]", + "[ 7/2 → 85/24 | s:sd note:44 ]", + "[ 85/24 → 43/12 | s:sd note:44 ]", + "[ 43/12 → 29/8 | s:sd note:44 ]", + "[ 29/8 → 11/3 | s:sd note:44 ]", + "[ 15/4 → 23/6 | s:sd note:32 ]", + "[ 23/6 → 47/12 | s:bd note:32 ]", + "[ 47/12 → 95/24 | s:bd note:44 ]", + "[ 95/24 → 4/1 | s:bd note:44 ]", +] +`; + exports[`runs examples > example "density" example index 0 1`] = ` [ "[ 0/1 → 1/4 | s:crackle density:0.01 ]", From 8e1fba04363cdcf39c946c8fb10a21554ef42cb7 Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 12 Dec 2025 15:45:36 +0000 Subject: [PATCH 42/49] rename delta to loose, add inverse tight, and exponential tightx --- packages/core/signal.mjs | 41 ++++++++++++++++++++++++++--- packages/core/test/pattern.test.mjs | 14 ---------- 2 files changed, 38 insertions(+), 17 deletions(-) diff --git a/packages/core/signal.mjs b/packages/core/signal.mjs index 9ac768951..ff94c3b8b 100644 --- a/packages/core/signal.mjs +++ b/packages/core/signal.mjs @@ -884,10 +884,45 @@ export const keyDown = register('keyDown', function (pat) { }); /** - * A pattern that gives the duration of events that are combined with it. + * A pattern giving the 'looseness' of events, or in other words, the duration of pattern events, + * in cycles per event. `loose` doesn't have structure itself, but takes structure, and therefore + * event durations, from the pattern that it is combined with. + * For example `loose.struct("1 1 [1 1] 1")` would give the same as `"0.25 0.25 [0.125 0.125] 0.25"`. + * See also its inverse, `tight`. * @example - * sound("bd sd [bd bd] sd*4 [- sd] [bd [bd bd]]").note(delta.withValue(x => 1/x + 20)) + * // Shorter events are lower in pitch + * sound("saw saw [saw saw] saw") + * .note(loose.range(50, 100)) + * @example + * sound("bd sd [bd bd] sd*4 [- sd] [bd [bd bd]]") + * .note(tight.add(20)) */ -export const delta = new Pattern(function (state) { +export const loose = new Pattern(function (state) { return [new Hap(undefined, state.span, state.span.duration)]; }); + +/** + * A pattern giving the 'tightness' of events, or in other words, the duration of pattern events, + * in events per cycle. `tight` doesn't have structure itself, but takes structure, and therefore + * event durations, from the pattern that it is combined with. + * For example `tight.struct("1 1 [1 1] 1")` would give the same as `"4 4 [8 8] 4"`. + * See also its inverse, `loose`. + * @example + * // Shorter events are more distorted + * n("0 0*2 0 0*2 0 [0 0 0]@2").sound("bd") + * .distort(tight.div(2)) + */ +export const tight = new Pattern(function (state) { + return [new Hap(undefined, state.span, Fraction(1).div(state.span.duration))]; +}); + +/** + * Like `tight` but gives the tightness of events according to an exponential curve. In + * particular, where the event tightness doubles (i.e. where an event duration halves), the + * returned value increases by one. `tightx.struct("1 1 1 [1 [1 1]]")` would therefore be + * the same as `"3 3 3 [4 [5 5]]"`. + */ +export const tightx = new Pattern(function (state) { + const n = Fraction(1).div(state.span.duration); + return [new Hap(undefined, state.span, Math.log(n) / Math.log(2) + 1)]; +}); diff --git a/packages/core/test/pattern.test.mjs b/packages/core/test/pattern.test.mjs index 408ff274b..aaa14bd27 100644 --- a/packages/core/test/pattern.test.mjs +++ b/packages/core/test/pattern.test.mjs @@ -740,20 +740,6 @@ describe('Pattern', () => { ); }); }); - describe('signal()', () => { - it('Can make saw/saw2', () => { - expect(saw.struct(true, true, true, true).firstCycle()).toStrictEqual( - sequence(0, 1 / 4, 1 / 2, 3 / 4).firstCycle(), - ); - - expect(saw2.struct(true, true, true, true).firstCycle()).toStrictEqual(sequence(-1, -0.5, 0, 0.5).firstCycle()); - }); - it('Can make isaw/isaw2', () => { - expect(isaw.struct(true, true, true, true).firstCycle()).toStrictEqual(sequence(1, 0.75, 0.5, 0.25).firstCycle()); - - expect(isaw2.struct(true, true, true, true).firstCycle()).toStrictEqual(sequence(1, 0.5, 0, -0.5).firstCycle()); - }); - }); describe('_setContext()', () => { it('Can set the hap context', () => { expect( From cd071cb7c062909a850b2e60041f6c8057f47d5a Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 12 Dec 2025 15:46:04 +0000 Subject: [PATCH 43/49] separate out signal tests, add tests for tight, tightx, loose --- packages/core/test/signal.test.mjs | 61 ++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 packages/core/test/signal.test.mjs diff --git a/packages/core/test/signal.test.mjs b/packages/core/test/signal.test.mjs new file mode 100644 index 000000000..ee0ec9c7c --- /dev/null +++ b/packages/core/test/signal.test.mjs @@ -0,0 +1,61 @@ +/* +signal.test.mjs - +Copyright (C) 2022 Strudel contributors - see +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ + +import Fraction from 'fraction.js'; + +import { describe, it, expect, vi } from 'vitest'; + +import { saw, saw2, isaw, isaw2, tight, tightx, loose } from '../signal.mjs'; +import { fastcat, sequence } from '../pattern.mjs'; + +const st = (begin, end) => new State(ts(begin, end)); +const ts = (begin, end) => new TimeSpan(Fraction(begin), Fraction(end)); +const hap = (whole, part, value, context = {}) => new Hap(whole, part, value, context); + +const third = Fraction(1, 3); +const twothirds = Fraction(2, 3); + +const sameFirst = (a, b) => { + return expect(a.sortHapsByPart().firstCycle()).toStrictEqual(b.sortHapsByPart().firstCycle()); +}; + +describe('signal()', () => { + it('Can make saw/saw2', () => { + expect(saw.struct(true, true, true, true).firstCycle()).toStrictEqual( + sequence(0, 1 / 4, 1 / 2, 3 / 4).firstCycle(), + ); + + expect(saw2.struct(true, true, true, true).firstCycle()).toStrictEqual(sequence(-1, -0.5, 0, 0.5).firstCycle()); + }); + it('Can make isaw/isaw2', () => { + expect(isaw.struct(true, true, true, true).firstCycle()).toStrictEqual(sequence(1, 0.75, 0.5, 0.25).firstCycle()); + + expect(isaw2.struct(true, true, true, true).firstCycle()).toStrictEqual(sequence(1, 0.5, 0, -0.5).firstCycle()); + }); +}); + +describe('loose', () => { + it('gives cycles per hap', () => { + sameFirst( + loose.struct(true, true, true, fastcat(true, true)), + sequence(0.25, 0.25, 0.25, fastcat(0.125, 0.125)).fmap(Fraction), + ); + }); +}); +describe('tight', () => { + it('gives haps per cycle', () => { + sameFirst(tight.struct(true, true, true, fastcat(true, true)), sequence(4, 4, 4, fastcat(8, 8)).fmap(Fraction)); + }); +}); + +describe('tightx', () => { + it('gives exponential haps per cycle', () => { + sameFirst( + tightx.struct(true, true, true, fastcat(true, fastcat(true, true))), + sequence(3, 3, 3, fastcat(4, fastcat(5, 5))), + ); + }); +}); From 99e4999e6a7cd98979aa9bb93864c21b06a84cce Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 12 Dec 2025 15:46:19 +0000 Subject: [PATCH 44/49] snapshot --- test/__snapshots__/examples.test.mjs.snap | 176 +++++++++++++++------- 1 file changed, 123 insertions(+), 53 deletions(-) diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 17dcb08ba..29237fdcf 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -2784,59 +2784,6 @@ exports[`runs examples > example "delaysync" example index 0 1`] = ` ] `; -exports[`runs examples > example "delta" example index 0 1`] = ` -[ - "[ 0/1 → 1/6 | s:bd note:26 ]", - "[ 1/6 → 1/3 | s:sd note:26 ]", - "[ 1/3 → 5/12 | s:bd note:32 ]", - "[ 5/12 → 1/2 | s:bd note:32 ]", - "[ 1/2 → 13/24 | s:sd note:44 ]", - "[ 13/24 → 7/12 | s:sd note:44 ]", - "[ 7/12 → 5/8 | s:sd note:44 ]", - "[ 5/8 → 2/3 | s:sd note:44 ]", - "[ 3/4 → 5/6 | s:sd note:32 ]", - "[ 5/6 → 11/12 | s:bd note:32 ]", - "[ 11/12 → 23/24 | s:bd note:44 ]", - "[ 23/24 → 1/1 | s:bd note:44 ]", - "[ 1/1 → 7/6 | s:bd note:26 ]", - "[ 7/6 → 4/3 | s:sd note:26 ]", - "[ 4/3 → 17/12 | s:bd note:32 ]", - "[ 17/12 → 3/2 | s:bd note:32 ]", - "[ 3/2 → 37/24 | s:sd note:44 ]", - "[ 37/24 → 19/12 | s:sd note:44 ]", - "[ 19/12 → 13/8 | s:sd note:44 ]", - "[ 13/8 → 5/3 | s:sd note:44 ]", - "[ 7/4 → 11/6 | s:sd note:32 ]", - "[ 11/6 → 23/12 | s:bd note:32 ]", - "[ 23/12 → 47/24 | s:bd note:44 ]", - "[ 47/24 → 2/1 | s:bd note:44 ]", - "[ 2/1 → 13/6 | s:bd note:26 ]", - "[ 13/6 → 7/3 | s:sd note:26 ]", - "[ 7/3 → 29/12 | s:bd note:32 ]", - "[ 29/12 → 5/2 | s:bd note:32 ]", - "[ 5/2 → 61/24 | s:sd note:44 ]", - "[ 61/24 → 31/12 | s:sd note:44 ]", - "[ 31/12 → 21/8 | s:sd note:44 ]", - "[ 21/8 → 8/3 | s:sd note:44 ]", - "[ 11/4 → 17/6 | s:sd note:32 ]", - "[ 17/6 → 35/12 | s:bd note:32 ]", - "[ 35/12 → 71/24 | s:bd note:44 ]", - "[ 71/24 → 3/1 | s:bd note:44 ]", - "[ 3/1 → 19/6 | s:bd note:26 ]", - "[ 19/6 → 10/3 | s:sd note:26 ]", - "[ 10/3 → 41/12 | s:bd note:32 ]", - "[ 41/12 → 7/2 | s:bd note:32 ]", - "[ 7/2 → 85/24 | s:sd note:44 ]", - "[ 85/24 → 43/12 | s:sd note:44 ]", - "[ 43/12 → 29/8 | s:sd note:44 ]", - "[ 29/8 → 11/3 | s:sd note:44 ]", - "[ 15/4 → 23/6 | s:sd note:32 ]", - "[ 23/6 → 47/12 | s:bd note:32 ]", - "[ 47/12 → 95/24 | s:bd note:44 ]", - "[ 95/24 → 4/1 | s:bd note:44 ]", -] -`; - exports[`runs examples > example "density" example index 0 1`] = ` [ "[ 0/1 → 1/4 | s:crackle density:0.01 ]", @@ -6219,6 +6166,84 @@ exports[`runs examples > example "loopEnd" example index 0 1`] = ` ] `; +exports[`runs examples > example "loose" example index 0 1`] = ` +[ + "[ 0/1 → 1/4 | s:saw note:62.5 ]", + "[ 1/4 → 1/2 | s:saw note:62.5 ]", + "[ 1/2 → 5/8 | s:saw note:56.25 ]", + "[ 5/8 → 3/4 | s:saw note:56.25 ]", + "[ 3/4 → 1/1 | s:saw note:62.5 ]", + "[ 1/1 → 5/4 | s:saw note:62.5 ]", + "[ 5/4 → 3/2 | s:saw note:62.5 ]", + "[ 3/2 → 13/8 | s:saw note:56.25 ]", + "[ 13/8 → 7/4 | s:saw note:56.25 ]", + "[ 7/4 → 2/1 | s:saw note:62.5 ]", + "[ 2/1 → 9/4 | s:saw note:62.5 ]", + "[ 9/4 → 5/2 | s:saw note:62.5 ]", + "[ 5/2 → 21/8 | s:saw note:56.25 ]", + "[ 21/8 → 11/4 | s:saw note:56.25 ]", + "[ 11/4 → 3/1 | s:saw note:62.5 ]", + "[ 3/1 → 13/4 | s:saw note:62.5 ]", + "[ 13/4 → 7/2 | s:saw note:62.5 ]", + "[ 7/2 → 29/8 | s:saw note:56.25 ]", + "[ 29/8 → 15/4 | s:saw note:56.25 ]", + "[ 15/4 → 4/1 | s:saw note:62.5 ]", +] +`; + +exports[`runs examples > example "loose" example index 1 1`] = ` +[ + "[ 0/1 → 1/6 | s:bd note:26 ]", + "[ 1/6 → 1/3 | s:sd note:26 ]", + "[ 1/3 → 5/12 | s:bd note:32 ]", + "[ 5/12 → 1/2 | s:bd note:32 ]", + "[ 1/2 → 13/24 | s:sd note:44 ]", + "[ 13/24 → 7/12 | s:sd note:44 ]", + "[ 7/12 → 5/8 | s:sd note:44 ]", + "[ 5/8 → 2/3 | s:sd note:44 ]", + "[ 3/4 → 5/6 | s:sd note:32 ]", + "[ 5/6 → 11/12 | s:bd note:32 ]", + "[ 11/12 → 23/24 | s:bd note:44 ]", + "[ 23/24 → 1/1 | s:bd note:44 ]", + "[ 1/1 → 7/6 | s:bd note:26 ]", + "[ 7/6 → 4/3 | s:sd note:26 ]", + "[ 4/3 → 17/12 | s:bd note:32 ]", + "[ 17/12 → 3/2 | s:bd note:32 ]", + "[ 3/2 → 37/24 | s:sd note:44 ]", + "[ 37/24 → 19/12 | s:sd note:44 ]", + "[ 19/12 → 13/8 | s:sd note:44 ]", + "[ 13/8 → 5/3 | s:sd note:44 ]", + "[ 7/4 → 11/6 | s:sd note:32 ]", + "[ 11/6 → 23/12 | s:bd note:32 ]", + "[ 23/12 → 47/24 | s:bd note:44 ]", + "[ 47/24 → 2/1 | s:bd note:44 ]", + "[ 2/1 → 13/6 | s:bd note:26 ]", + "[ 13/6 → 7/3 | s:sd note:26 ]", + "[ 7/3 → 29/12 | s:bd note:32 ]", + "[ 29/12 → 5/2 | s:bd note:32 ]", + "[ 5/2 → 61/24 | s:sd note:44 ]", + "[ 61/24 → 31/12 | s:sd note:44 ]", + "[ 31/12 → 21/8 | s:sd note:44 ]", + "[ 21/8 → 8/3 | s:sd note:44 ]", + "[ 11/4 → 17/6 | s:sd note:32 ]", + "[ 17/6 → 35/12 | s:bd note:32 ]", + "[ 35/12 → 71/24 | s:bd note:44 ]", + "[ 71/24 → 3/1 | s:bd note:44 ]", + "[ 3/1 → 19/6 | s:bd note:26 ]", + "[ 19/6 → 10/3 | s:sd note:26 ]", + "[ 10/3 → 41/12 | s:bd note:32 ]", + "[ 41/12 → 7/2 | s:bd note:32 ]", + "[ 7/2 → 85/24 | s:sd note:44 ]", + "[ 85/24 → 43/12 | s:sd note:44 ]", + "[ 43/12 → 29/8 | s:sd note:44 ]", + "[ 29/8 → 11/3 | s:sd note:44 ]", + "[ 15/4 → 23/6 | s:sd note:32 ]", + "[ 23/6 → 47/12 | s:bd note:32 ]", + "[ 47/12 → 95/24 | s:bd note:44 ]", + "[ 95/24 → 4/1 | s:bd note:44 ]", +] +`; + exports[`runs examples > example "lpattack" example index 0 1`] = ` [ "[ 0/1 → 1/4 | note:c2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]", @@ -12041,6 +12066,51 @@ exports[`runs examples > example "take" example index 2 1`] = ` ] `; +exports[`runs examples > example "tight" example index 0 1`] = ` +[ + "[ 0/1 → 1/7 | n:0 s:bd distort:3.5 ]", + "[ 1/7 → 3/14 | n:0 s:bd distort:7 ]", + "[ 3/14 → 2/7 | n:0 s:bd distort:7 ]", + "[ 2/7 → 3/7 | n:0 s:bd distort:3.5 ]", + "[ 3/7 → 1/2 | n:0 s:bd distort:7 ]", + "[ 1/2 → 4/7 | n:0 s:bd distort:7 ]", + "[ 4/7 → 5/7 | n:0 s:bd distort:3.5 ]", + "[ 5/7 → 17/21 | n:0 s:bd distort:5.25 ]", + "[ 17/21 → 19/21 | n:0 s:bd distort:5.25 ]", + "[ 19/21 → 1/1 | n:0 s:bd distort:5.25 ]", + "[ 1/1 → 8/7 | n:0 s:bd distort:3.5 ]", + "[ 8/7 → 17/14 | n:0 s:bd distort:7 ]", + "[ 17/14 → 9/7 | n:0 s:bd distort:7 ]", + "[ 9/7 → 10/7 | n:0 s:bd distort:3.5 ]", + "[ 10/7 → 3/2 | n:0 s:bd distort:7 ]", + "[ 3/2 → 11/7 | n:0 s:bd distort:7 ]", + "[ 11/7 → 12/7 | n:0 s:bd distort:3.5 ]", + "[ 12/7 → 38/21 | n:0 s:bd distort:5.25 ]", + "[ 38/21 → 40/21 | n:0 s:bd distort:5.25 ]", + "[ 40/21 → 2/1 | n:0 s:bd distort:5.25 ]", + "[ 2/1 → 15/7 | n:0 s:bd distort:3.5 ]", + "[ 15/7 → 31/14 | n:0 s:bd distort:7 ]", + "[ 31/14 → 16/7 | n:0 s:bd distort:7 ]", + "[ 16/7 → 17/7 | n:0 s:bd distort:3.5 ]", + "[ 17/7 → 5/2 | n:0 s:bd distort:7 ]", + "[ 5/2 → 18/7 | n:0 s:bd distort:7 ]", + "[ 18/7 → 19/7 | n:0 s:bd distort:3.5 ]", + "[ 19/7 → 59/21 | n:0 s:bd distort:5.25 ]", + "[ 59/21 → 61/21 | n:0 s:bd distort:5.25 ]", + "[ 61/21 → 3/1 | n:0 s:bd distort:5.25 ]", + "[ 3/1 → 22/7 | n:0 s:bd distort:3.5 ]", + "[ 22/7 → 45/14 | n:0 s:bd distort:7 ]", + "[ 45/14 → 23/7 | n:0 s:bd distort:7 ]", + "[ 23/7 → 24/7 | n:0 s:bd distort:3.5 ]", + "[ 24/7 → 7/2 | n:0 s:bd distort:7 ]", + "[ 7/2 → 25/7 | n:0 s:bd distort:7 ]", + "[ 25/7 → 26/7 | n:0 s:bd distort:3.5 ]", + "[ 26/7 → 80/21 | n:0 s:bd distort:5.25 ]", + "[ 80/21 → 82/21 | n:0 s:bd distort:5.25 ]", + "[ 82/21 → 4/1 | n:0 s:bd distort:5.25 ]", +] +`; + exports[`runs examples > example "tour" example index 0 1`] = ` [ "[ 0/1 → 1/8 | note:e s:folkharp ]", From a53385aa116b5fedf03619acc78d43a61b24a483 Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 12 Dec 2025 16:50:24 +0000 Subject: [PATCH 45/49] delint --- packages/core/test/signal.test.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/test/signal.test.mjs b/packages/core/test/signal.test.mjs index ee0ec9c7c..6036b61dc 100644 --- a/packages/core/test/signal.test.mjs +++ b/packages/core/test/signal.test.mjs @@ -9,7 +9,7 @@ import Fraction from 'fraction.js'; import { describe, it, expect, vi } from 'vitest'; import { saw, saw2, isaw, isaw2, tight, tightx, loose } from '../signal.mjs'; -import { fastcat, sequence } from '../pattern.mjs'; +import { fastcat, sequence, State, TimeSpan, Hap } from '../index.mjs'; const st = (begin, end) => new State(ts(begin, end)); const ts = (begin, end) => new TimeSpan(Fraction(begin), Fraction(end)); From 8eeebf1e4f31be65508260d791aed0fbd21ccdd5 Mon Sep 17 00:00:00 2001 From: alex Date: Sat, 13 Dec 2025 16:30:51 +0000 Subject: [PATCH 46/49] try renaming to per / perx / cyclesPer --- packages/core/signal.mjs | 39 ++-- packages/core/test/signal.test.mjs | 14 +- test/__snapshots__/examples.test.mjs.snap | 246 +++++++++++----------- 3 files changed, 151 insertions(+), 148 deletions(-) diff --git a/packages/core/signal.mjs b/packages/core/signal.mjs index ff94c3b8b..fa450c670 100644 --- a/packages/core/signal.mjs +++ b/packages/core/signal.mjs @@ -884,45 +884,48 @@ export const keyDown = register('keyDown', function (pat) { }); /** - * A pattern giving the 'looseness' of events, or in other words, the duration of pattern events, - * in cycles per event. `loose` doesn't have structure itself, but takes structure, and therefore + * A pattern measuring the duration of events, + * in cycles per event. `cyclesPer` doesn't have structure itself, but takes structure, and therefore * event durations, from the pattern that it is combined with. - * For example `loose.struct("1 1 [1 1] 1")` would give the same as `"0.25 0.25 [0.125 0.125] 0.25"`. - * See also its inverse, `tight`. + * For example `cyclesPer.struct("1 1 [1 1] 1")` would give the same as `"0.25 0.25 [0.125 0.125] 0.25"`. + * See also its reciprocal, `per`, also known as `perCycle`. * @example * // Shorter events are lower in pitch * sound("saw saw [saw saw] saw") - * .note(loose.range(50, 100)) + * .note(cyclesPer.range(50, 100)) * @example * sound("bd sd [bd bd] sd*4 [- sd] [bd [bd bd]]") - * .note(tight.add(20)) + * .note(cyclesPer.add(20)) */ -export const loose = new Pattern(function (state) { +export const cyclesPer = new Pattern(function (state) { return [new Hap(undefined, state.span, state.span.duration)]; }); /** - * A pattern giving the 'tightness' of events, or in other words, the duration of pattern events, - * in events per cycle. `tight` doesn't have structure itself, but takes structure, and therefore + * A pattern measuring the 'shortness' of events, or in other words, the duration of pattern events, + * in events per cycle. `per` doesn't have structure itself, but takes structure, and therefore * event durations, from the pattern that it is combined with. - * For example `tight.struct("1 1 [1 1] 1")` would give the same as `"4 4 [8 8] 4"`. - * See also its inverse, `loose`. + * For example `per.struct("1 1 [1 1] 1")` would give the same as `"4 4 [8 8] 4"`. + * See also its reciprocal, `cyclesPer`. + * @synonyms perCycle * @example * // Shorter events are more distorted * n("0 0*2 0 0*2 0 [0 0 0]@2").sound("bd") - * .distort(tight.div(2)) + * .distort(per.div(2)) */ -export const tight = new Pattern(function (state) { +export const per = new Pattern(function (state) { return [new Hap(undefined, state.span, Fraction(1).div(state.span.duration))]; }); +export const perCycle = per; + /** - * Like `tight` but gives the tightness of events according to an exponential curve. In - * particular, where the event tightness doubles (i.e. where an event duration halves), the - * returned value increases by one. `tightx.struct("1 1 1 [1 [1 1]]")` would therefore be - * the same as `"3 3 3 [4 [5 5]]"`. + * Like `per` but measures the shortness of events according to an exponential curve. In + * particular, where the event duration halves, the + * returned value increases by one. `perx.struct("1 1 [1 [1 1]] 1")` would therefore be + * the same as `"3 3 [4 [5 5]] 3"`. */ -export const tightx = new Pattern(function (state) { +export const perx = new Pattern(function (state) { const n = Fraction(1).div(state.span.duration); return [new Hap(undefined, state.span, Math.log(n) / Math.log(2) + 1)]; }); diff --git a/packages/core/test/signal.test.mjs b/packages/core/test/signal.test.mjs index 6036b61dc..b02f8a08b 100644 --- a/packages/core/test/signal.test.mjs +++ b/packages/core/test/signal.test.mjs @@ -8,7 +8,7 @@ import Fraction from 'fraction.js'; import { describe, it, expect, vi } from 'vitest'; -import { saw, saw2, isaw, isaw2, tight, tightx, loose } from '../signal.mjs'; +import { saw, saw2, isaw, isaw2, per, perx, cyclesPer } from '../signal.mjs'; import { fastcat, sequence, State, TimeSpan, Hap } from '../index.mjs'; const st = (begin, end) => new State(ts(begin, end)); @@ -37,24 +37,24 @@ describe('signal()', () => { }); }); -describe('loose', () => { +describe('cyclesPer', () => { it('gives cycles per hap', () => { sameFirst( - loose.struct(true, true, true, fastcat(true, true)), + cyclesPer.struct(true, true, true, fastcat(true, true)), sequence(0.25, 0.25, 0.25, fastcat(0.125, 0.125)).fmap(Fraction), ); }); }); -describe('tight', () => { +describe('per', () => { it('gives haps per cycle', () => { - sameFirst(tight.struct(true, true, true, fastcat(true, true)), sequence(4, 4, 4, fastcat(8, 8)).fmap(Fraction)); + sameFirst(per.struct(true, true, true, fastcat(true, true)), sequence(4, 4, 4, fastcat(8, 8)).fmap(Fraction)); }); }); -describe('tightx', () => { +describe('perx', () => { it('gives exponential haps per cycle', () => { sameFirst( - tightx.struct(true, true, true, fastcat(true, fastcat(true, true))), + perx.struct(true, true, true, fastcat(true, fastcat(true, true))), sequence(3, 3, 3, fastcat(4, fastcat(5, 5))), ); }); diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 29237fdcf..c4b50d368 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -2539,6 +2539,84 @@ exports[`runs examples > example "cut" example index 0 1`] = ` ] `; +exports[`runs examples > example "cyclesPer" example index 0 1`] = ` +[ + "[ 0/1 → 1/4 | s:saw note:62.5 ]", + "[ 1/4 → 1/2 | s:saw note:62.5 ]", + "[ 1/2 → 5/8 | s:saw note:56.25 ]", + "[ 5/8 → 3/4 | s:saw note:56.25 ]", + "[ 3/4 → 1/1 | s:saw note:62.5 ]", + "[ 1/1 → 5/4 | s:saw note:62.5 ]", + "[ 5/4 → 3/2 | s:saw note:62.5 ]", + "[ 3/2 → 13/8 | s:saw note:56.25 ]", + "[ 13/8 → 7/4 | s:saw note:56.25 ]", + "[ 7/4 → 2/1 | s:saw note:62.5 ]", + "[ 2/1 → 9/4 | s:saw note:62.5 ]", + "[ 9/4 → 5/2 | s:saw note:62.5 ]", + "[ 5/2 → 21/8 | s:saw note:56.25 ]", + "[ 21/8 → 11/4 | s:saw note:56.25 ]", + "[ 11/4 → 3/1 | s:saw note:62.5 ]", + "[ 3/1 → 13/4 | s:saw note:62.5 ]", + "[ 13/4 → 7/2 | s:saw note:62.5 ]", + "[ 7/2 → 29/8 | s:saw note:56.25 ]", + "[ 29/8 → 15/4 | s:saw note:56.25 ]", + "[ 15/4 → 4/1 | s:saw note:62.5 ]", +] +`; + +exports[`runs examples > example "cyclesPer" example index 1 1`] = ` +[ + "[ 0/1 → 1/6 | s:bd note:20.166666666666668 ]", + "[ 1/6 → 1/3 | s:sd note:20.166666666666668 ]", + "[ 1/3 → 5/12 | s:bd note:20.083333333333332 ]", + "[ 5/12 → 1/2 | s:bd note:20.083333333333332 ]", + "[ 1/2 → 13/24 | s:sd note:20.041666666666668 ]", + "[ 13/24 → 7/12 | s:sd note:20.041666666666668 ]", + "[ 7/12 → 5/8 | s:sd note:20.041666666666668 ]", + "[ 5/8 → 2/3 | s:sd note:20.041666666666668 ]", + "[ 3/4 → 5/6 | s:sd note:20.083333333333332 ]", + "[ 5/6 → 11/12 | s:bd note:20.083333333333332 ]", + "[ 11/12 → 23/24 | s:bd note:20.041666666666668 ]", + "[ 23/24 → 1/1 | s:bd note:20.041666666666668 ]", + "[ 1/1 → 7/6 | s:bd note:20.166666666666668 ]", + "[ 7/6 → 4/3 | s:sd note:20.166666666666668 ]", + "[ 4/3 → 17/12 | s:bd note:20.083333333333332 ]", + "[ 17/12 → 3/2 | s:bd note:20.083333333333332 ]", + "[ 3/2 → 37/24 | s:sd note:20.041666666666668 ]", + "[ 37/24 → 19/12 | s:sd note:20.041666666666668 ]", + "[ 19/12 → 13/8 | s:sd note:20.041666666666668 ]", + "[ 13/8 → 5/3 | s:sd note:20.041666666666668 ]", + "[ 7/4 → 11/6 | s:sd note:20.083333333333332 ]", + "[ 11/6 → 23/12 | s:bd note:20.083333333333332 ]", + "[ 23/12 → 47/24 | s:bd note:20.041666666666668 ]", + "[ 47/24 → 2/1 | s:bd note:20.041666666666668 ]", + "[ 2/1 → 13/6 | s:bd note:20.166666666666668 ]", + "[ 13/6 → 7/3 | s:sd note:20.166666666666668 ]", + "[ 7/3 → 29/12 | s:bd note:20.083333333333332 ]", + "[ 29/12 → 5/2 | s:bd note:20.083333333333332 ]", + "[ 5/2 → 61/24 | s:sd note:20.041666666666668 ]", + "[ 61/24 → 31/12 | s:sd note:20.041666666666668 ]", + "[ 31/12 → 21/8 | s:sd note:20.041666666666668 ]", + "[ 21/8 → 8/3 | s:sd note:20.041666666666668 ]", + "[ 11/4 → 17/6 | s:sd note:20.083333333333332 ]", + "[ 17/6 → 35/12 | s:bd note:20.083333333333332 ]", + "[ 35/12 → 71/24 | s:bd note:20.041666666666668 ]", + "[ 71/24 → 3/1 | s:bd note:20.041666666666668 ]", + "[ 3/1 → 19/6 | s:bd note:20.166666666666668 ]", + "[ 19/6 → 10/3 | s:sd note:20.166666666666668 ]", + "[ 10/3 → 41/12 | s:bd note:20.083333333333332 ]", + "[ 41/12 → 7/2 | s:bd note:20.083333333333332 ]", + "[ 7/2 → 85/24 | s:sd note:20.041666666666668 ]", + "[ 85/24 → 43/12 | s:sd note:20.041666666666668 ]", + "[ 43/12 → 29/8 | s:sd note:20.041666666666668 ]", + "[ 29/8 → 11/3 | s:sd note:20.041666666666668 ]", + "[ 15/4 → 23/6 | s:sd note:20.083333333333332 ]", + "[ 23/6 → 47/12 | s:bd note:20.083333333333332 ]", + "[ 47/12 → 95/24 | s:bd note:20.041666666666668 ]", + "[ 95/24 → 4/1 | s:bd note:20.041666666666668 ]", +] +`; + exports[`runs examples > example "decay" example index 0 1`] = ` [ "[ 0/1 → 1/4 | note:c3 decay:0.1 sustain:0 ]", @@ -6166,84 +6244,6 @@ exports[`runs examples > example "loopEnd" example index 0 1`] = ` ] `; -exports[`runs examples > example "loose" example index 0 1`] = ` -[ - "[ 0/1 → 1/4 | s:saw note:62.5 ]", - "[ 1/4 → 1/2 | s:saw note:62.5 ]", - "[ 1/2 → 5/8 | s:saw note:56.25 ]", - "[ 5/8 → 3/4 | s:saw note:56.25 ]", - "[ 3/4 → 1/1 | s:saw note:62.5 ]", - "[ 1/1 → 5/4 | s:saw note:62.5 ]", - "[ 5/4 → 3/2 | s:saw note:62.5 ]", - "[ 3/2 → 13/8 | s:saw note:56.25 ]", - "[ 13/8 → 7/4 | s:saw note:56.25 ]", - "[ 7/4 → 2/1 | s:saw note:62.5 ]", - "[ 2/1 → 9/4 | s:saw note:62.5 ]", - "[ 9/4 → 5/2 | s:saw note:62.5 ]", - "[ 5/2 → 21/8 | s:saw note:56.25 ]", - "[ 21/8 → 11/4 | s:saw note:56.25 ]", - "[ 11/4 → 3/1 | s:saw note:62.5 ]", - "[ 3/1 → 13/4 | s:saw note:62.5 ]", - "[ 13/4 → 7/2 | s:saw note:62.5 ]", - "[ 7/2 → 29/8 | s:saw note:56.25 ]", - "[ 29/8 → 15/4 | s:saw note:56.25 ]", - "[ 15/4 → 4/1 | s:saw note:62.5 ]", -] -`; - -exports[`runs examples > example "loose" example index 1 1`] = ` -[ - "[ 0/1 → 1/6 | s:bd note:26 ]", - "[ 1/6 → 1/3 | s:sd note:26 ]", - "[ 1/3 → 5/12 | s:bd note:32 ]", - "[ 5/12 → 1/2 | s:bd note:32 ]", - "[ 1/2 → 13/24 | s:sd note:44 ]", - "[ 13/24 → 7/12 | s:sd note:44 ]", - "[ 7/12 → 5/8 | s:sd note:44 ]", - "[ 5/8 → 2/3 | s:sd note:44 ]", - "[ 3/4 → 5/6 | s:sd note:32 ]", - "[ 5/6 → 11/12 | s:bd note:32 ]", - "[ 11/12 → 23/24 | s:bd note:44 ]", - "[ 23/24 → 1/1 | s:bd note:44 ]", - "[ 1/1 → 7/6 | s:bd note:26 ]", - "[ 7/6 → 4/3 | s:sd note:26 ]", - "[ 4/3 → 17/12 | s:bd note:32 ]", - "[ 17/12 → 3/2 | s:bd note:32 ]", - "[ 3/2 → 37/24 | s:sd note:44 ]", - "[ 37/24 → 19/12 | s:sd note:44 ]", - "[ 19/12 → 13/8 | s:sd note:44 ]", - "[ 13/8 → 5/3 | s:sd note:44 ]", - "[ 7/4 → 11/6 | s:sd note:32 ]", - "[ 11/6 → 23/12 | s:bd note:32 ]", - "[ 23/12 → 47/24 | s:bd note:44 ]", - "[ 47/24 → 2/1 | s:bd note:44 ]", - "[ 2/1 → 13/6 | s:bd note:26 ]", - "[ 13/6 → 7/3 | s:sd note:26 ]", - "[ 7/3 → 29/12 | s:bd note:32 ]", - "[ 29/12 → 5/2 | s:bd note:32 ]", - "[ 5/2 → 61/24 | s:sd note:44 ]", - "[ 61/24 → 31/12 | s:sd note:44 ]", - "[ 31/12 → 21/8 | s:sd note:44 ]", - "[ 21/8 → 8/3 | s:sd note:44 ]", - "[ 11/4 → 17/6 | s:sd note:32 ]", - "[ 17/6 → 35/12 | s:bd note:32 ]", - "[ 35/12 → 71/24 | s:bd note:44 ]", - "[ 71/24 → 3/1 | s:bd note:44 ]", - "[ 3/1 → 19/6 | s:bd note:26 ]", - "[ 19/6 → 10/3 | s:sd note:26 ]", - "[ 10/3 → 41/12 | s:bd note:32 ]", - "[ 41/12 → 7/2 | s:bd note:32 ]", - "[ 7/2 → 85/24 | s:sd note:44 ]", - "[ 85/24 → 43/12 | s:sd note:44 ]", - "[ 43/12 → 29/8 | s:sd note:44 ]", - "[ 29/8 → 11/3 | s:sd note:44 ]", - "[ 15/4 → 23/6 | s:sd note:32 ]", - "[ 23/6 → 47/12 | s:bd note:32 ]", - "[ 47/12 → 95/24 | s:bd note:44 ]", - "[ 95/24 → 4/1 | s:bd note:44 ]", -] -`; - exports[`runs examples > example "lpattack" example index 0 1`] = ` [ "[ 0/1 → 1/4 | note:c2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]", @@ -7991,6 +7991,51 @@ exports[`runs examples > example "penv" example index 0 1`] = ` ] `; +exports[`runs examples > example "per" example index 0 1`] = ` +[ + "[ 0/1 → 1/7 | n:0 s:bd distort:3.5 ]", + "[ 1/7 → 3/14 | n:0 s:bd distort:7 ]", + "[ 3/14 → 2/7 | n:0 s:bd distort:7 ]", + "[ 2/7 → 3/7 | n:0 s:bd distort:3.5 ]", + "[ 3/7 → 1/2 | n:0 s:bd distort:7 ]", + "[ 1/2 → 4/7 | n:0 s:bd distort:7 ]", + "[ 4/7 → 5/7 | n:0 s:bd distort:3.5 ]", + "[ 5/7 → 17/21 | n:0 s:bd distort:5.25 ]", + "[ 17/21 → 19/21 | n:0 s:bd distort:5.25 ]", + "[ 19/21 → 1/1 | n:0 s:bd distort:5.25 ]", + "[ 1/1 → 8/7 | n:0 s:bd distort:3.5 ]", + "[ 8/7 → 17/14 | n:0 s:bd distort:7 ]", + "[ 17/14 → 9/7 | n:0 s:bd distort:7 ]", + "[ 9/7 → 10/7 | n:0 s:bd distort:3.5 ]", + "[ 10/7 → 3/2 | n:0 s:bd distort:7 ]", + "[ 3/2 → 11/7 | n:0 s:bd distort:7 ]", + "[ 11/7 → 12/7 | n:0 s:bd distort:3.5 ]", + "[ 12/7 → 38/21 | n:0 s:bd distort:5.25 ]", + "[ 38/21 → 40/21 | n:0 s:bd distort:5.25 ]", + "[ 40/21 → 2/1 | n:0 s:bd distort:5.25 ]", + "[ 2/1 → 15/7 | n:0 s:bd distort:3.5 ]", + "[ 15/7 → 31/14 | n:0 s:bd distort:7 ]", + "[ 31/14 → 16/7 | n:0 s:bd distort:7 ]", + "[ 16/7 → 17/7 | n:0 s:bd distort:3.5 ]", + "[ 17/7 → 5/2 | n:0 s:bd distort:7 ]", + "[ 5/2 → 18/7 | n:0 s:bd distort:7 ]", + "[ 18/7 → 19/7 | n:0 s:bd distort:3.5 ]", + "[ 19/7 → 59/21 | n:0 s:bd distort:5.25 ]", + "[ 59/21 → 61/21 | n:0 s:bd distort:5.25 ]", + "[ 61/21 → 3/1 | n:0 s:bd distort:5.25 ]", + "[ 3/1 → 22/7 | n:0 s:bd distort:3.5 ]", + "[ 22/7 → 45/14 | n:0 s:bd distort:7 ]", + "[ 45/14 → 23/7 | n:0 s:bd distort:7 ]", + "[ 23/7 → 24/7 | n:0 s:bd distort:3.5 ]", + "[ 24/7 → 7/2 | n:0 s:bd distort:7 ]", + "[ 7/2 → 25/7 | n:0 s:bd distort:7 ]", + "[ 25/7 → 26/7 | n:0 s:bd distort:3.5 ]", + "[ 26/7 → 80/21 | n:0 s:bd distort:5.25 ]", + "[ 80/21 → 82/21 | n:0 s:bd distort:5.25 ]", + "[ 82/21 → 4/1 | n:0 s:bd distort:5.25 ]", +] +`; + exports[`runs examples > example "perlin" example index 0 1`] = ` [ "[ 0/1 → 1/8 | s:hh cutoff:500 ]", @@ -12066,51 +12111,6 @@ exports[`runs examples > example "take" example index 2 1`] = ` ] `; -exports[`runs examples > example "tight" example index 0 1`] = ` -[ - "[ 0/1 → 1/7 | n:0 s:bd distort:3.5 ]", - "[ 1/7 → 3/14 | n:0 s:bd distort:7 ]", - "[ 3/14 → 2/7 | n:0 s:bd distort:7 ]", - "[ 2/7 → 3/7 | n:0 s:bd distort:3.5 ]", - "[ 3/7 → 1/2 | n:0 s:bd distort:7 ]", - "[ 1/2 → 4/7 | n:0 s:bd distort:7 ]", - "[ 4/7 → 5/7 | n:0 s:bd distort:3.5 ]", - "[ 5/7 → 17/21 | n:0 s:bd distort:5.25 ]", - "[ 17/21 → 19/21 | n:0 s:bd distort:5.25 ]", - "[ 19/21 → 1/1 | n:0 s:bd distort:5.25 ]", - "[ 1/1 → 8/7 | n:0 s:bd distort:3.5 ]", - "[ 8/7 → 17/14 | n:0 s:bd distort:7 ]", - "[ 17/14 → 9/7 | n:0 s:bd distort:7 ]", - "[ 9/7 → 10/7 | n:0 s:bd distort:3.5 ]", - "[ 10/7 → 3/2 | n:0 s:bd distort:7 ]", - "[ 3/2 → 11/7 | n:0 s:bd distort:7 ]", - "[ 11/7 → 12/7 | n:0 s:bd distort:3.5 ]", - "[ 12/7 → 38/21 | n:0 s:bd distort:5.25 ]", - "[ 38/21 → 40/21 | n:0 s:bd distort:5.25 ]", - "[ 40/21 → 2/1 | n:0 s:bd distort:5.25 ]", - "[ 2/1 → 15/7 | n:0 s:bd distort:3.5 ]", - "[ 15/7 → 31/14 | n:0 s:bd distort:7 ]", - "[ 31/14 → 16/7 | n:0 s:bd distort:7 ]", - "[ 16/7 → 17/7 | n:0 s:bd distort:3.5 ]", - "[ 17/7 → 5/2 | n:0 s:bd distort:7 ]", - "[ 5/2 → 18/7 | n:0 s:bd distort:7 ]", - "[ 18/7 → 19/7 | n:0 s:bd distort:3.5 ]", - "[ 19/7 → 59/21 | n:0 s:bd distort:5.25 ]", - "[ 59/21 → 61/21 | n:0 s:bd distort:5.25 ]", - "[ 61/21 → 3/1 | n:0 s:bd distort:5.25 ]", - "[ 3/1 → 22/7 | n:0 s:bd distort:3.5 ]", - "[ 22/7 → 45/14 | n:0 s:bd distort:7 ]", - "[ 45/14 → 23/7 | n:0 s:bd distort:7 ]", - "[ 23/7 → 24/7 | n:0 s:bd distort:3.5 ]", - "[ 24/7 → 7/2 | n:0 s:bd distort:7 ]", - "[ 7/2 → 25/7 | n:0 s:bd distort:7 ]", - "[ 25/7 → 26/7 | n:0 s:bd distort:3.5 ]", - "[ 26/7 → 80/21 | n:0 s:bd distort:5.25 ]", - "[ 80/21 → 82/21 | n:0 s:bd distort:5.25 ]", - "[ 82/21 → 4/1 | n:0 s:bd distort:5.25 ]", -] -`; - exports[`runs examples > example "tour" example index 0 1`] = ` [ "[ 0/1 → 1/8 | note:e s:folkharp ]", From 4a7344595d8e72c14acb1ace5c629a1aa81e4a00 Mon Sep 17 00:00:00 2001 From: Aria Date: Sat, 13 Dec 2025 17:28:42 -0600 Subject: [PATCH 47/49] Make legacy the default --- packages/core/bench/signal.bench.mjs | 10 +- packages/core/signal.mjs | 19 +- test/__snapshots__/examples.test.mjs.snap | 1785 +++++++++++---------- vitest.setup.mjs | 4 +- website/src/repl/tunes.mjs | 20 +- 5 files changed, 926 insertions(+), 912 deletions(-) diff --git a/packages/core/bench/signal.bench.mjs b/packages/core/bench/signal.bench.mjs index d92840ef6..bd651ccd3 100644 --- a/packages/core/bench/signal.bench.mjs +++ b/packages/core/bench/signal.bench.mjs @@ -1,6 +1,6 @@ import { describe, bench } from 'vitest'; -import { calculateSteps, rand, useOldRandom } from '../index.mjs'; +import { calculateSteps, rand, useRNG } from '../index.mjs'; const testingResolution = 128; @@ -11,13 +11,13 @@ describe('old random', () => { bench( '+tactus', () => { - useOldRandom(); + useRNG('legacy'); _generateRandomPattern(); }, { time: 1000, teardown() { - useOldRandom(false); + useRNG('legacy'); }, }, ); @@ -26,13 +26,13 @@ describe('old random', () => { bench( '-tactus', () => { - useOldRandom(); + useRNG('precise'); _generateRandomPattern(); }, { time: 1000, teardown() { - useOldRandom(false); + useRNG('legacy'); }, }, ); diff --git a/packages/core/signal.mjs b/packages/core/signal.mjs index e50ba22db..e497fb1b0 100644 --- a/packages/core/signal.mjs +++ b/packages/core/signal.mjs @@ -231,7 +231,8 @@ const timeToRands = (t, n, seed = 0) => { return out; }; -// Deprecated: Old random signals. Configuration `useOldRandom` may be used for legacy songs +// Old random signals. Currently the default, but can also be chosen via +// `useRNG('legacy')` // stretch 300 cycles over the range of [0,2**29 == 536870912) then apply the xorshift algorithm const __xorwise = (x) => { @@ -257,23 +258,25 @@ const __timeToRands = (t, n) => __timeToRandsPrime(__timeToIntSeed(t), n); // End old random -let useOldRandomBool = false; +let RNG_MODE = 'legacy'; export const getRandsAtTime = (t, n = 1, seed = 0) => { - return useOldRandomBool ? __timeToRands(t + seed, n) : timeToRands(t, n, seed); + return RNG_MODE === 'legacy' ? __timeToRands(t + seed, n) : timeToRands(t, n, seed); }; /** - * Whether to use the old random number generator or not. Can be used to support legacy projects + * Sets which random number generator to use. Historically Strudel would + * use `useRNG('legacy')`, which remains the default. To use a new more statistically + * precise RNG, try `useRNG('precise')`. * - * @name useOldRandom - * @param {boolean} b - Whether to use old RNG + * @name useRNG + * @param {string} mod - Mode. One of 'legacy', 'precise' * @example - * useOldRandom(true) + * useRNG('legacy') * // Repeats every 300 cycles * $: n(irand(50)).seg(16).scale("C:minor").ribbon(88, 32) * $: n(irand(50)).seg(16).scale("C:minor").ribbon(388, 32) */ -export const useOldRandom = (b = true) => (useOldRandomBool = b); +export const useRNG = (mode = 'legacy') => (RNG_MODE = mode); /** * A discrete pattern of numbers from 0 to n-1 diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index b26823a9b..481315873 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -677,17 +677,17 @@ exports[`runs examples > example "almostAlways" example index 0 1`] = ` "[ 1/2 → 5/8 | s:hh speed:0.5 ]", "[ 5/8 → 3/4 | s:hh speed:0.5 ]", "[ 3/4 → 7/8 | s:hh speed:0.5 ]", - "[ 7/8 → 1/1 | s:hh ]", + "[ 7/8 → 1/1 | s:hh speed:0.5 ]", "[ 1/1 → 9/8 | s:hh speed:0.5 ]", "[ 9/8 → 5/4 | s:hh speed:0.5 ]", - "[ 5/4 → 11/8 | s:hh ]", + "[ 5/4 → 11/8 | s:hh speed:0.5 ]", "[ 11/8 → 3/2 | s:hh speed:0.5 ]", "[ 3/2 → 13/8 | s:hh speed:0.5 ]", "[ 13/8 → 7/4 | s:hh speed:0.5 ]", "[ 7/4 → 15/8 | s:hh speed:0.5 ]", "[ 15/8 → 2/1 | s:hh speed:0.5 ]", - "[ 2/1 → 17/8 | s:hh speed:0.5 ]", - "[ 17/8 → 9/4 | s:hh speed:0.5 ]", + "[ 2/1 → 17/8 | s:hh ]", + "[ 17/8 → 9/4 | s:hh ]", "[ 9/4 → 19/8 | s:hh speed:0.5 ]", "[ 19/8 → 5/2 | s:hh speed:0.5 ]", "[ 5/2 → 21/8 | s:hh speed:0.5 ]", @@ -699,7 +699,7 @@ exports[`runs examples > example "almostAlways" example index 0 1`] = ` "[ 13/4 → 27/8 | s:hh ]", "[ 27/8 → 7/2 | s:hh speed:0.5 ]", "[ 7/2 → 29/8 | s:hh speed:0.5 ]", - "[ 29/8 → 15/4 | s:hh speed:0.5 ]", + "[ 29/8 → 15/4 | s:hh ]", "[ 15/4 → 31/8 | s:hh speed:0.5 ]", "[ 31/8 → 4/1 | s:hh speed:0.5 ]", ] @@ -707,7 +707,7 @@ exports[`runs examples > example "almostAlways" example index 0 1`] = ` exports[`runs examples > example "almostNever" example index 0 1`] = ` [ - "[ 0/1 → 1/8 | s:hh ]", + "[ 0/1 → 1/8 | s:hh speed:0.5 ]", "[ 1/8 → 1/4 | s:hh ]", "[ 1/4 → 3/8 | s:hh ]", "[ 3/8 → 1/2 | s:hh ]", @@ -716,9 +716,9 @@ exports[`runs examples > example "almostNever" example index 0 1`] = ` "[ 3/4 → 7/8 | s:hh ]", "[ 7/8 → 1/1 | s:hh ]", "[ 1/1 → 9/8 | s:hh ]", - "[ 9/8 → 5/4 | s:hh speed:0.5 ]", + "[ 9/8 → 5/4 | s:hh ]", "[ 5/4 → 11/8 | s:hh ]", - "[ 11/8 → 3/2 | s:hh speed:0.5 ]", + "[ 11/8 → 3/2 | s:hh ]", "[ 3/2 → 13/8 | s:hh ]", "[ 13/8 → 7/4 | s:hh ]", "[ 7/4 → 15/8 | s:hh ]", @@ -730,11 +730,11 @@ exports[`runs examples > example "almostNever" example index 0 1`] = ` "[ 5/2 → 21/8 | s:hh ]", "[ 21/8 → 11/4 | s:hh ]", "[ 11/4 → 23/8 | s:hh ]", - "[ 23/8 → 3/1 | s:hh ]", + "[ 23/8 → 3/1 | s:hh speed:0.5 ]", "[ 3/1 → 25/8 | s:hh ]", "[ 25/8 → 13/4 | s:hh ]", "[ 13/4 → 27/8 | s:hh ]", - "[ 27/8 → 7/2 | s:hh speed:0.5 ]", + "[ 27/8 → 7/2 | s:hh ]", "[ 7/2 → 29/8 | s:hh ]", "[ 29/8 → 15/4 | s:hh ]", "[ 15/4 → 31/8 | s:hh ]", @@ -1078,70 +1078,70 @@ exports[`runs examples > example "begin" example index 0 1`] = ` exports[`runs examples > example "berlin" example index 0 1`] = ` [ - "[ 0/1 → 1/16 | note:G3 ]", - "[ 1/16 → 1/8 | note:G3 ]", - "[ 1/8 → 3/16 | note:A3 ]", - "[ 3/16 → 1/4 | note:A3 ]", - "[ 1/4 → 5/16 | note:E3 ]", - "[ 5/16 → 3/8 | note:F3 ]", - "[ 3/8 → 7/16 | note:G3 ]", - "[ 7/16 → 1/2 | note:A3 ]", - "[ 1/2 → 9/16 | note:Bb3 ]", - "[ 9/16 → 5/8 | note:C4 ]", - "[ 5/8 → 11/16 | note:D4 ]", + "[ 0/1 → 1/16 | note:D3 ]", + "[ 1/16 → 1/8 | note:E3 ]", + "[ 1/8 → 3/16 | note:F3 ]", + "[ 3/16 → 1/4 | note:G3 ]", + "[ 1/4 → 5/16 | note:A3 ]", + "[ 5/16 → 3/8 | note:C4 ]", + "[ 3/8 → 7/16 | note:D4 ]", + "[ 7/16 → 1/2 | note:F4 ]", + "[ 1/2 → 9/16 | note:D4 ]", + "[ 9/16 → 5/8 | note:E4 ]", + "[ 5/8 → 11/16 | note:E4 ]", "[ 11/16 → 3/4 | note:E4 ]", - "[ 3/4 → 13/16 | note:Bb3 ]", - "[ 13/16 → 7/8 | note:Bb3 ]", - "[ 7/8 → 15/16 | note:Bb3 ]", - "[ 15/16 → 1/1 | note:C4 ]", + "[ 3/4 → 13/16 | note:F3 ]", + "[ 13/16 → 7/8 | note:F3 ]", + "[ 7/8 → 15/16 | note:F3 ]", + "[ 15/16 → 1/1 | note:F3 ]", "[ 1/1 → 17/16 | note:E3 ]", - "[ 17/16 → 9/8 | note:G3 ]", - "[ 9/8 → 19/16 | note:A3 ]", - "[ 19/16 → 5/4 | note:C4 ]", - "[ 5/4 → 21/16 | note:C4 ]", - "[ 21/16 → 11/8 | note:D4 ]", - "[ 11/8 → 23/16 | note:D4 ]", - "[ 23/16 → 3/2 | note:E4 ]", - "[ 3/2 → 25/16 | note:F3 ]", - "[ 25/16 → 13/8 | note:A3 ]", + "[ 17/16 → 9/8 | note:E3 ]", + "[ 9/8 → 19/16 | note:E3 ]", + "[ 19/16 → 5/4 | note:F3 ]", + "[ 5/4 → 21/16 | note:E3 ]", + "[ 21/16 → 11/8 | note:F3 ]", + "[ 11/8 → 23/16 | note:G3 ]", + "[ 23/16 → 3/2 | note:A3 ]", + "[ 3/2 → 25/16 | note:A3 ]", + "[ 25/16 → 13/8 | note:Bb3 ]", "[ 13/8 → 27/16 | note:Bb3 ]", - "[ 27/16 → 7/4 | note:D4 ]", - "[ 7/4 → 29/16 | note:C4 ]", - "[ 29/16 → 15/8 | note:D4 ]", - "[ 15/8 → 31/16 | note:E4 ]", - "[ 31/16 → 2/1 | note:F4 ]", - "[ 2/1 → 33/16 | note:Bb3 ]", - "[ 33/16 → 17/8 | note:C4 ]", - "[ 17/8 → 35/16 | note:D4 ]", - "[ 35/16 → 9/4 | note:E4 ]", + "[ 27/16 → 7/4 | note:Bb3 ]", + "[ 7/4 → 29/16 | note:F3 ]", + "[ 29/16 → 15/8 | note:G3 ]", + "[ 15/8 → 31/16 | note:Bb3 ]", + "[ 31/16 → 2/1 | note:C4 ]", + "[ 2/1 → 33/16 | note:C4 ]", + "[ 33/16 → 17/8 | note:D4 ]", + "[ 17/8 → 35/16 | note:F4 ]", + "[ 35/16 → 9/4 | note:G4 ]", "[ 9/4 → 37/16 | note:Bb3 ]", - "[ 37/16 → 19/8 | note:C4 ]", - "[ 19/8 → 39/16 | note:D4 ]", - "[ 39/16 → 5/2 | note:F4 ]", - "[ 5/2 → 41/16 | note:C4 ]", - "[ 41/16 → 21/8 | note:D4 ]", - "[ 21/8 → 43/16 | note:F4 ]", - "[ 43/16 → 11/4 | note:A4 ]", - "[ 11/4 → 45/16 | note:D4 ]", - "[ 45/16 → 23/8 | note:F4 ]", - "[ 23/8 → 47/16 | note:G4 ]", - "[ 47/16 → 3/1 | note:A4 ]", - "[ 3/1 → 49/16 | note:C4 ]", - "[ 49/16 → 25/8 | note:C4 ]", - "[ 25/8 → 51/16 | note:C4 ]", - "[ 51/16 → 13/4 | note:D4 ]", - "[ 13/4 → 53/16 | note:F3 ]", - "[ 53/16 → 27/8 | note:F3 ]", - "[ 27/8 → 55/16 | note:F3 ]", - "[ 55/16 → 7/2 | note:F3 ]", - "[ 7/2 → 57/16 | note:E3 ]", - "[ 57/16 → 29/8 | note:E3 ]", - "[ 29/8 → 59/16 | note:F3 ]", - "[ 59/16 → 15/4 | note:F3 ]", + "[ 37/16 → 19/8 | note:Bb3 ]", + "[ 19/8 → 39/16 | note:Bb3 ]", + "[ 39/16 → 5/2 | note:C4 ]", + "[ 5/2 → 41/16 | note:F3 ]", + "[ 41/16 → 21/8 | note:F3 ]", + "[ 21/8 → 43/16 | note:G3 ]", + "[ 43/16 → 11/4 | note:A3 ]", + "[ 11/4 → 45/16 | note:A3 ]", + "[ 45/16 → 23/8 | note:A3 ]", + "[ 23/8 → 47/16 | note:A3 ]", + "[ 47/16 → 3/1 | note:A3 ]", + "[ 3/1 → 49/16 | note:E3 ]", + "[ 49/16 → 25/8 | note:G3 ]", + "[ 25/8 → 51/16 | note:Bb3 ]", + "[ 51/16 → 13/4 | note:C4 ]", + "[ 13/4 → 53/16 | note:D4 ]", + "[ 53/16 → 27/8 | note:E4 ]", + "[ 27/8 → 55/16 | note:G4 ]", + "[ 55/16 → 7/2 | note:A4 ]", + "[ 7/2 → 57/16 | note:Bb3 ]", + "[ 57/16 → 29/8 | note:Bb3 ]", + "[ 29/8 → 59/16 | note:C4 ]", + "[ 59/16 → 15/4 | note:C4 ]", "[ 15/4 → 61/16 | note:F3 ]", - "[ 61/16 → 31/8 | note:F3 ]", - "[ 31/8 → 63/16 | note:F3 ]", - "[ 63/16 → 4/1 | note:G3 ]", + "[ 61/16 → 31/8 | note:G3 ]", + "[ 31/8 → 63/16 | note:G3 ]", + "[ 63/16 → 4/1 | note:A3 ]", ] `; @@ -1525,50 +1525,50 @@ exports[`runs examples > example "brand" example index 0 1`] = ` "[ 0/1 → 1/10 | s:hh pan:true ]", "[ 1/10 → 1/5 | s:hh pan:true ]", "[ 1/5 → 3/10 | s:hh pan:false ]", - "[ 3/10 → 2/5 | s:hh pan:true ]", + "[ 3/10 → 2/5 | s:hh pan:false ]", "[ 2/5 → 1/2 | s:hh pan:false ]", "[ 1/2 → 3/5 | s:hh pan:true ]", - "[ 3/5 → 7/10 | s:hh pan:true ]", - "[ 7/10 → 4/5 | s:hh pan:true ]", + "[ 3/5 → 7/10 | s:hh pan:false ]", + "[ 7/10 → 4/5 | s:hh pan:false ]", "[ 4/5 → 9/10 | s:hh pan:true ]", "[ 9/10 → 1/1 | s:hh pan:false ]", - "[ 1/1 → 11/10 | s:hh pan:true ]", - "[ 11/10 → 6/5 | s:hh pan:true ]", - "[ 6/5 → 13/10 | s:hh pan:false ]", + "[ 1/1 → 11/10 | s:hh pan:false ]", + "[ 11/10 → 6/5 | s:hh pan:false ]", + "[ 6/5 → 13/10 | s:hh pan:true ]", "[ 13/10 → 7/5 | s:hh pan:true ]", - "[ 7/5 → 3/2 | s:hh pan:false ]", - "[ 3/2 → 8/5 | s:hh pan:true ]", - "[ 8/5 → 17/10 | s:hh pan:false ]", + "[ 7/5 → 3/2 | s:hh pan:true ]", + "[ 3/2 → 8/5 | s:hh pan:false ]", + "[ 8/5 → 17/10 | s:hh pan:true ]", "[ 17/10 → 9/5 | s:hh pan:true ]", - "[ 9/5 → 19/10 | s:hh pan:false ]", + "[ 9/5 → 19/10 | s:hh pan:true ]", "[ 19/10 → 2/1 | s:hh pan:true ]", "[ 2/1 → 21/10 | s:hh pan:false ]", "[ 21/10 → 11/5 | s:hh pan:true ]", "[ 11/5 → 23/10 | s:hh pan:false ]", - "[ 23/10 → 12/5 | s:hh pan:true ]", + "[ 23/10 → 12/5 | s:hh pan:false ]", "[ 12/5 → 5/2 | s:hh pan:false ]", - "[ 5/2 → 13/5 | s:hh pan:false ]", - "[ 13/5 → 27/10 | s:hh pan:false ]", + "[ 5/2 → 13/5 | s:hh pan:true ]", + "[ 13/5 → 27/10 | s:hh pan:true ]", "[ 27/10 → 14/5 | s:hh pan:true ]", "[ 14/5 → 29/10 | s:hh pan:false ]", - "[ 29/10 → 3/1 | s:hh pan:false ]", - "[ 3/1 → 31/10 | s:hh pan:false ]", + "[ 29/10 → 3/1 | s:hh pan:true ]", + "[ 3/1 → 31/10 | s:hh pan:true ]", "[ 31/10 → 16/5 | s:hh pan:true ]", "[ 16/5 → 33/10 | s:hh pan:true ]", "[ 33/10 → 17/5 | s:hh pan:false ]", - "[ 17/5 → 7/2 | s:hh pan:true ]", + "[ 17/5 → 7/2 | s:hh pan:false ]", "[ 7/2 → 18/5 | s:hh pan:true ]", - "[ 18/5 → 37/10 | s:hh pan:true ]", - "[ 37/10 → 19/5 | s:hh pan:true ]", - "[ 19/5 → 39/10 | s:hh pan:false ]", + "[ 18/5 → 37/10 | s:hh pan:false ]", + "[ 37/10 → 19/5 | s:hh pan:false ]", + "[ 19/5 → 39/10 | s:hh pan:true ]", "[ 39/10 → 4/1 | s:hh pan:true ]", ] `; exports[`runs examples > example "brandBy" example index 0 1`] = ` [ - "[ 0/1 → 1/10 | s:hh pan:false ]", - "[ 1/10 → 1/5 | s:hh pan:false ]", + "[ 0/1 → 1/10 | s:hh pan:true ]", + "[ 1/10 → 1/5 | s:hh pan:true ]", "[ 1/5 → 3/10 | s:hh pan:false ]", "[ 3/10 → 2/5 | s:hh pan:false ]", "[ 2/5 → 1/2 | s:hh pan:false ]", @@ -1577,18 +1577,18 @@ exports[`runs examples > example "brandBy" example index 0 1`] = ` "[ 7/10 → 4/5 | s:hh pan:false ]", "[ 4/5 → 9/10 | s:hh pan:false ]", "[ 9/10 → 1/1 | s:hh pan:false ]", - "[ 1/1 → 11/10 | s:hh pan:true ]", + "[ 1/1 → 11/10 | s:hh pan:false ]", "[ 11/10 → 6/5 | s:hh pan:false ]", "[ 6/5 → 13/10 | s:hh pan:false ]", - "[ 13/10 → 7/5 | s:hh pan:true ]", + "[ 13/10 → 7/5 | s:hh pan:false ]", "[ 7/5 → 3/2 | s:hh pan:false ]", - "[ 3/2 → 8/5 | s:hh pan:true ]", + "[ 3/2 → 8/5 | s:hh pan:false ]", "[ 8/5 → 17/10 | s:hh pan:false ]", "[ 17/10 → 9/5 | s:hh pan:false ]", "[ 9/5 → 19/10 | s:hh pan:false ]", - "[ 19/10 → 2/1 | s:hh pan:false ]", + "[ 19/10 → 2/1 | s:hh pan:true ]", "[ 2/1 → 21/10 | s:hh pan:false ]", - "[ 21/10 → 11/5 | s:hh pan:true ]", + "[ 21/10 → 11/5 | s:hh pan:false ]", "[ 11/5 → 23/10 | s:hh pan:false ]", "[ 23/10 → 12/5 | s:hh pan:false ]", "[ 12/5 → 5/2 | s:hh pan:false ]", @@ -1599,14 +1599,14 @@ exports[`runs examples > example "brandBy" example index 0 1`] = ` "[ 29/10 → 3/1 | s:hh pan:false ]", "[ 3/1 → 31/10 | s:hh pan:false ]", "[ 31/10 → 16/5 | s:hh pan:true ]", - "[ 16/5 → 33/10 | s:hh pan:false ]", + "[ 16/5 → 33/10 | s:hh pan:true ]", "[ 33/10 → 17/5 | s:hh pan:false ]", "[ 17/5 → 7/2 | s:hh pan:false ]", "[ 7/2 → 18/5 | s:hh pan:false ]", "[ 18/5 → 37/10 | s:hh pan:false ]", "[ 37/10 → 19/5 | s:hh pan:false ]", - "[ 19/5 → 39/10 | s:hh pan:false ]", - "[ 39/10 → 4/1 | s:hh pan:true ]", + "[ 19/5 → 39/10 | s:hh pan:true ]", + "[ 39/10 → 4/1 | s:hh pan:false ]", ] `; @@ -1737,100 +1737,100 @@ exports[`runs examples > example "channels" example index 0 1`] = ` exports[`runs examples > example "choose" example index 0 1`] = ` [ - "[ 0/1 → 1/5 | note:c2 s:triangle ]", - "[ 1/5 → 2/5 | note:g2 s:triangle ]", + "[ 0/1 → 1/5 | note:c2 s:sine ]", + "[ 1/5 → 2/5 | note:g2 s:bd n:6 ]", "[ 2/5 → 3/5 | note:g2 s:triangle ]", - "[ 3/5 → 4/5 | note:d2 s:sine ]", - "[ 4/5 → 1/1 | note:f1 s:triangle ]", - "[ 1/1 → 6/5 | note:c2 s:sine ]", + "[ 3/5 → 4/5 | note:d2 s:bd n:6 ]", + "[ 4/5 → 1/1 | note:f1 s:sine ]", + "[ 1/1 → 6/5 | note:c2 s:triangle ]", "[ 6/5 → 7/5 | note:g2 s:triangle ]", - "[ 7/5 → 8/5 | note:g2 s:bd n:6 ]", + "[ 7/5 → 8/5 | note:g2 s:sine ]", "[ 8/5 → 9/5 | note:d2 s:triangle ]", - "[ 9/5 → 2/1 | note:f1 s:triangle ]", - "[ 2/1 → 11/5 | note:c2 s:triangle ]", + "[ 9/5 → 2/1 | note:f1 s:sine ]", + "[ 2/1 → 11/5 | note:c2 s:bd n:6 ]", "[ 11/5 → 12/5 | note:g2 s:bd n:6 ]", "[ 12/5 → 13/5 | note:g2 s:bd n:6 ]", - "[ 13/5 → 14/5 | note:d2 s:bd n:6 ]", - "[ 14/5 → 3/1 | note:f1 s:bd n:6 ]", - "[ 3/1 → 16/5 | note:c2 s:triangle ]", - "[ 16/5 → 17/5 | note:g2 s:triangle ]", - "[ 17/5 → 18/5 | note:g2 s:sine ]", + "[ 13/5 → 14/5 | note:d2 s:sine ]", + "[ 14/5 → 3/1 | note:f1 s:triangle ]", + "[ 3/1 → 16/5 | note:c2 s:sine ]", + "[ 16/5 → 17/5 | note:g2 s:sine ]", + "[ 17/5 → 18/5 | note:g2 s:triangle ]", "[ 18/5 → 19/5 | note:d2 s:triangle ]", - "[ 19/5 → 4/1 | note:f1 s:bd n:6 ]", + "[ 19/5 → 4/1 | note:f1 s:sine ]", ] `; exports[`runs examples > example "chooseCycles" example index 0 1`] = ` [ - "[ 0/1 → 1/8 | s:hh ]", - "[ 1/8 → 1/4 | s:bd ]", - "[ 1/4 → 3/8 | s:hh ]", - "[ 3/8 → 1/2 | s:hh ]", + "[ 0/1 → 1/8 | s:bd ]", + "[ 1/8 → 1/4 | s:hh ]", + "[ 1/4 → 3/8 | s:sd ]", + "[ 3/8 → 1/2 | s:bd ]", "[ 1/2 → 5/8 | s:bd ]", - "[ 5/8 → 3/4 | s:sd ]", - "[ 3/4 → 7/8 | s:bd ]", - "[ 7/8 → 1/1 | s:sd ]", - "[ 1/1 → 9/8 | s:hh ]", + "[ 5/8 → 3/4 | s:bd ]", + "[ 3/4 → 7/8 | s:hh ]", + "[ 7/8 → 1/1 | s:bd ]", + "[ 1/1 → 9/8 | s:sd ]", "[ 9/8 → 5/4 | s:hh ]", - "[ 5/4 → 11/8 | s:sd ]", - "[ 11/8 → 3/2 | s:sd ]", - "[ 3/2 → 13/8 | s:sd ]", - "[ 13/8 → 7/4 | s:bd ]", - "[ 7/4 → 15/8 | s:bd ]", + "[ 5/4 → 11/8 | s:bd ]", + "[ 11/8 → 3/2 | s:hh ]", + "[ 3/2 → 13/8 | s:bd ]", + "[ 13/8 → 7/4 | s:sd ]", + "[ 7/4 → 15/8 | s:hh ]", "[ 15/8 → 2/1 | s:bd ]", "[ 2/1 → 17/8 | s:bd ]", "[ 17/8 → 9/4 | s:sd ]", "[ 9/4 → 19/8 | s:sd ]", - "[ 19/8 → 5/2 | s:sd ]", - "[ 5/2 → 21/8 | s:bd ]", - "[ 21/8 → 11/4 | s:hh ]", + "[ 19/8 → 5/2 | s:bd ]", + "[ 5/2 → 21/8 | s:hh ]", + "[ 21/8 → 11/4 | s:bd ]", "[ 11/4 → 23/8 | s:sd ]", - "[ 23/8 → 3/1 | s:sd ]", - "[ 3/1 → 25/8 | s:hh ]", + "[ 23/8 → 3/1 | s:bd ]", + "[ 3/1 → 25/8 | s:sd ]", "[ 25/8 → 13/4 | s:sd ]", - "[ 13/4 → 27/8 | s:hh ]", + "[ 13/4 → 27/8 | s:bd ]", "[ 27/8 → 7/2 | s:bd ]", - "[ 7/2 → 29/8 | s:sd ]", + "[ 7/2 → 29/8 | s:bd ]", "[ 29/8 → 15/4 | s:hh ]", - "[ 15/4 → 31/8 | s:bd ]", - "[ 31/8 → 4/1 | s:sd ]", + "[ 15/4 → 31/8 | s:hh ]", + "[ 31/8 → 4/1 | s:bd ]", ] `; exports[`runs examples > example "chooseCycles" example index 1 1`] = ` [ - "[ 0/1 → 1/8 | s:hh ]", - "[ 1/8 → 1/4 | s:bd ]", - "[ 1/4 → 3/8 | s:hh ]", - "[ 3/8 → 1/2 | s:hh ]", + "[ 0/1 → 1/8 | s:bd ]", + "[ 1/8 → 1/4 | s:hh ]", + "[ 1/4 → 3/8 | s:sd ]", + "[ 3/8 → 1/2 | s:bd ]", "[ 1/2 → 5/8 | s:bd ]", - "[ 5/8 → 3/4 | s:sd ]", - "[ 3/4 → 7/8 | s:bd ]", - "[ 7/8 → 1/1 | s:sd ]", - "[ 1/1 → 9/8 | s:hh ]", + "[ 5/8 → 3/4 | s:bd ]", + "[ 3/4 → 7/8 | s:hh ]", + "[ 7/8 → 1/1 | s:bd ]", + "[ 1/1 → 9/8 | s:sd ]", "[ 9/8 → 5/4 | s:hh ]", - "[ 5/4 → 11/8 | s:sd ]", - "[ 11/8 → 3/2 | s:sd ]", - "[ 3/2 → 13/8 | s:sd ]", - "[ 13/8 → 7/4 | s:bd ]", - "[ 7/4 → 15/8 | s:bd ]", + "[ 5/4 → 11/8 | s:bd ]", + "[ 11/8 → 3/2 | s:hh ]", + "[ 3/2 → 13/8 | s:bd ]", + "[ 13/8 → 7/4 | s:sd ]", + "[ 7/4 → 15/8 | s:hh ]", "[ 15/8 → 2/1 | s:bd ]", "[ 2/1 → 17/8 | s:bd ]", "[ 17/8 → 9/4 | s:sd ]", "[ 9/4 → 19/8 | s:sd ]", - "[ 19/8 → 5/2 | s:sd ]", - "[ 5/2 → 21/8 | s:bd ]", - "[ 21/8 → 11/4 | s:hh ]", + "[ 19/8 → 5/2 | s:bd ]", + "[ 5/2 → 21/8 | s:hh ]", + "[ 21/8 → 11/4 | s:bd ]", "[ 11/4 → 23/8 | s:sd ]", - "[ 23/8 → 3/1 | s:sd ]", - "[ 3/1 → 25/8 | s:hh ]", + "[ 23/8 → 3/1 | s:bd ]", + "[ 3/1 → 25/8 | s:sd ]", "[ 25/8 → 13/4 | s:sd ]", - "[ 13/4 → 27/8 | s:hh ]", + "[ 13/4 → 27/8 | s:bd ]", "[ 27/8 → 7/2 | s:bd ]", - "[ 7/2 → 29/8 | s:sd ]", + "[ 7/2 → 29/8 | s:bd ]", "[ 29/8 → 15/4 | s:hh ]", - "[ 15/4 → 31/8 | s:bd ]", - "[ 31/8 → 4/1 | s:sd ]", + "[ 15/4 → 31/8 | s:hh ]", + "[ 31/8 → 4/1 | s:bd ]", ] `; @@ -2494,57 +2494,81 @@ exports[`runs examples > example "decay" example index 0 1`] = ` exports[`runs examples > example "degrade" example index 0 1`] = ` [ "[ 1/8 → 1/4 | s:hh ]", - "[ 3/8 → 1/2 | s:hh ]", - "[ 5/8 → 3/4 | s:hh ]", - "[ 7/8 → 1/1 | s:hh ]", + "[ 1/1 → 9/8 | s:hh ]", + "[ 9/8 → 5/4 | s:hh ]", "[ 5/4 → 11/8 | s:hh ]", - "[ 13/8 → 7/4 | s:hh ]", + "[ 3/2 → 13/8 | s:hh ]", "[ 15/8 → 2/1 | s:hh ]", "[ 2/1 → 17/8 | s:hh ]", + "[ 17/8 → 9/4 | s:hh ]", "[ 19/8 → 5/2 | s:hh ]", - "[ 5/2 → 21/8 | s:hh ]", - "[ 23/8 → 3/1 | s:hh ]", - "[ 3/1 → 25/8 | s:hh ]", - "[ 25/8 → 13/4 | s:hh ]", + "[ 11/4 → 23/8 | s:hh ]", "[ 13/4 → 27/8 | s:hh ]", "[ 29/8 → 15/4 | s:hh ]", "[ 15/4 → 31/8 | s:hh ]", + "[ 31/8 → 4/1 | s:hh ]", ] `; exports[`runs examples > example "degrade" example index 1 1`] = ` [ + "[ 1/8 → 1/4 | s:hh ]", "[ 1/4 → 3/8 | s:hh ]", - "[ 3/8 → 1/2 | s:hh ]", - "[ 5/8 → 3/4 | s:hh ]", - "[ 7/8 → 1/1 | s:hh ]", + "[ 3/4 → 7/8 | s:hh ]", "[ 1/1 → 9/8 | s:hh ]", "[ 9/8 → 5/4 | s:hh ]", - "[ 5/4 → 11/8 | s:hh ]", - "[ 11/8 → 3/2 | s:hh ]", - "[ 3/2 → 13/8 | s:hh ]", + "[ 13/8 → 7/4 | s:hh ]", + "[ 7/4 → 15/8 | s:hh ]", "[ 17/8 → 9/4 | s:hh ]", "[ 9/4 → 19/8 | s:hh ]", - "[ 19/8 → 5/2 | s:hh ]", + "[ 5/2 → 21/8 | s:hh ]", "[ 11/4 → 23/8 | s:hh ]", - "[ 23/8 → 3/1 | s:hh ]", "[ 3/1 → 25/8 | s:hh ]", "[ 25/8 → 13/4 | s:hh ]", - "[ 7/2 → 29/8 | s:hh ]", - "[ 31/8 → 4/1 | s:hh ]", + "[ 15/4 → 31/8 | s:hh ]", ] `; exports[`runs examples > example "degradeBy" example index 0 1`] = ` [ - "[ 0/1 → 1/8 | s:hh ]", "[ 1/8 → 1/4 | s:hh ]", + "[ 1/4 → 3/8 | s:hh ]", "[ 3/8 → 1/2 | s:hh ]", "[ 1/2 → 5/8 | s:hh ]", - "[ 5/8 → 3/4 | s:hh ]", - "[ 3/4 → 7/8 | s:hh ]", "[ 7/8 → 1/1 | s:hh ]", + "[ 1/1 → 9/8 | s:hh ]", + "[ 9/8 → 5/4 | s:hh ]", "[ 5/4 → 11/8 | s:hh ]", + "[ 3/2 → 13/8 | s:hh ]", + "[ 13/8 → 7/4 | s:hh ]", + "[ 7/4 → 15/8 | s:hh ]", + "[ 15/8 → 2/1 | s:hh ]", + "[ 2/1 → 17/8 | s:hh ]", + "[ 17/8 → 9/4 | s:hh ]", + "[ 9/4 → 19/8 | s:hh ]", + "[ 19/8 → 5/2 | s:hh ]", + "[ 5/2 → 21/8 | s:hh ]", + "[ 11/4 → 23/8 | s:hh ]", + "[ 3/1 → 25/8 | s:hh ]", + "[ 25/8 → 13/4 | s:hh ]", + "[ 13/4 → 27/8 | s:hh ]", + "[ 27/8 → 7/2 | s:hh ]", + "[ 7/2 → 29/8 | s:hh ]", + "[ 29/8 → 15/4 | s:hh ]", + "[ 15/4 → 31/8 | s:hh ]", + "[ 31/8 → 4/1 | s:hh ]", +] +`; + +exports[`runs examples > example "degradeBy" example index 1 1`] = ` +[ + "[ 1/8 → 1/4 | s:hh ]", + "[ 1/4 → 3/8 | s:hh ]", + "[ 3/8 → 1/2 | s:hh ]", + "[ 3/4 → 7/8 | s:hh ]", + "[ 1/1 → 9/8 | s:hh ]", + "[ 9/8 → 5/4 | s:hh ]", + "[ 11/8 → 3/2 | s:hh ]", "[ 13/8 → 7/4 | s:hh ]", "[ 7/4 → 15/8 | s:hh ]", "[ 15/8 → 2/1 | s:hh ]", @@ -2555,79 +2579,45 @@ exports[`runs examples > example "degradeBy" example index 0 1`] = ` "[ 5/2 → 21/8 | s:hh ]", "[ 21/8 → 11/4 | s:hh ]", "[ 11/4 → 23/8 | s:hh ]", - "[ 23/8 → 3/1 | s:hh ]", "[ 3/1 → 25/8 | s:hh ]", "[ 25/8 → 13/4 | s:hh ]", - "[ 13/4 → 27/8 | s:hh ]", + "[ 27/8 → 7/2 | s:hh ]", "[ 7/2 → 29/8 | s:hh ]", "[ 29/8 → 15/4 | s:hh ]", "[ 15/4 → 31/8 | s:hh ]", ] `; -exports[`runs examples > example "degradeBy" example index 1 1`] = ` -[ - "[ 0/1 → 1/8 | s:hh ]", - "[ 1/4 → 3/8 | s:hh ]", - "[ 3/8 → 1/2 | s:hh ]", - "[ 5/8 → 3/4 | s:hh ]", - "[ 3/4 → 7/8 | s:hh ]", - "[ 7/8 → 1/1 | s:hh ]", - "[ 1/1 → 9/8 | s:hh ]", - "[ 9/8 → 5/4 | s:hh ]", - "[ 5/4 → 11/8 | s:hh ]", - "[ 11/8 → 3/2 | s:hh ]", - "[ 3/2 → 13/8 | s:hh ]", - "[ 15/8 → 2/1 | s:hh ]", - "[ 17/8 → 9/4 | s:hh ]", - "[ 9/4 → 19/8 | s:hh ]", - "[ 19/8 → 5/2 | s:hh ]", - "[ 21/8 → 11/4 | s:hh ]", - "[ 11/4 → 23/8 | s:hh ]", - "[ 23/8 → 3/1 | s:hh ]", - "[ 3/1 → 25/8 | s:hh ]", - "[ 25/8 → 13/4 | s:hh ]", - "[ 13/4 → 27/8 | s:hh ]", - "[ 7/2 → 29/8 | s:hh ]", - "[ 29/8 → 15/4 | s:hh ]", - "[ 31/8 → 4/1 | s:hh ]", -] -`; - exports[`runs examples > example "degradeBy" example index 2 1`] = ` [ - "[ 1/16 → 1/8 | s:bd ]", "[ 1/8 → 3/16 | s:bd ]", - "[ 3/16 → 1/4 | s:bd ]", + "[ 1/4 → 5/16 | s:bd ]", "[ 5/16 → 3/8 | s:bd ]", - "[ 3/8 → 7/16 | s:bd ]", "[ 1/2 → 9/16 | s:bd ]", - "[ 13/16 → 7/8 | s:bd ]", - "[ 7/8 → 15/16 | s:bd ]", - "[ 17/16 → 9/8 | s:bd ]", + "[ 9/16 → 5/8 | s:bd ]", + "[ 11/16 → 3/4 | s:bd ]", + "[ 15/16 → 1/1 | s:bd ]", "[ 9/8 → 19/16 | s:bd ]", - "[ 19/16 → 5/4 | s:bd ]", + "[ 5/4 → 21/16 | s:bd ]", "[ 21/16 → 11/8 | s:bd ]", - "[ 11/8 → 23/16 | s:bd ]", "[ 3/2 → 25/16 | s:bd ]", - "[ 29/16 → 15/8 | s:bd ]", - "[ 15/8 → 31/16 | s:bd ]", - "[ 33/16 → 17/8 | s:bd ]", + "[ 25/16 → 13/8 | s:bd ]", + "[ 27/16 → 7/4 | s:bd ]", + "[ 31/16 → 2/1 | s:bd ]", "[ 17/8 → 35/16 | s:bd ]", - "[ 35/16 → 9/4 | s:bd ]", + "[ 9/4 → 37/16 | s:bd ]", "[ 37/16 → 19/8 | s:bd ]", - "[ 19/8 → 39/16 | s:bd ]", "[ 5/2 → 41/16 | s:bd ]", - "[ 45/16 → 23/8 | s:bd ]", - "[ 23/8 → 47/16 | s:bd ]", - "[ 49/16 → 25/8 | s:bd ]", + "[ 41/16 → 21/8 | s:bd ]", + "[ 43/16 → 11/4 | s:bd ]", + "[ 47/16 → 3/1 | s:bd ]", "[ 25/8 → 51/16 | s:bd ]", - "[ 51/16 → 13/4 | s:bd ]", + "[ 13/4 → 53/16 | s:bd ]", "[ 53/16 → 27/8 | s:bd ]", - "[ 27/8 → 55/16 | s:bd ]", "[ 7/2 → 57/16 | s:bd ]", - "[ 61/16 → 31/8 | s:bd ]", - "[ 31/8 → 63/16 | s:bd ]", + "[ 57/16 → 29/8 | s:bd ]", + "[ 59/16 → 15/4 | s:bd ]", + "[ 63/16 → 4/1 | s:bd ]", ] `; @@ -2950,14 +2940,14 @@ exports[`runs examples > example "distorttype" example index 0 1`] = ` exports[`runs examples > example "distorttype" example index 1 1`] = ` [ - "[ (0/1 → 1/2) ⇝ 1/1 | s:sine note:F1 release:1 penv:24 pdecay:0.05 distort:3.71662513515912 distorttype:fold ]", - "[ 0/1 ⇜ (1/2 → 1/1) | s:sine note:F1 release:1 penv:24 pdecay:0.05 distort:3.71662513515912 distorttype:fold ]", - "[ (1/1 → 3/2) ⇝ 2/1 | s:sine note:F1 release:1 penv:24 pdecay:0.05 distort:1.8276505067478865 distorttype:chebyshev ]", - "[ 1/1 ⇜ (3/2 → 2/1) | s:sine note:F1 release:1 penv:24 pdecay:0.05 distort:1.8276505067478865 distorttype:chebyshev ]", - "[ (2/1 → 5/2) ⇝ 3/1 | s:sine note:F1 release:1 penv:24 pdecay:0.05 distort:5.068953953683376 distorttype:scurve ]", - "[ 2/1 ⇜ (5/2 → 3/1) | s:sine note:F1 release:1 penv:24 pdecay:0.05 distort:5.068953953683376 distorttype:scurve ]", - "[ (3/1 → 7/2) ⇝ 4/1 | s:sine note:F1 release:1 penv:24 pdecay:0.05 distort:5.303743980126455 distorttype:diode ]", - "[ 3/1 ⇜ (7/2 → 4/1) | s:sine note:F1 release:1 penv:24 pdecay:0.05 distort:5.303743980126455 distorttype:diode ]", + "[ (0/1 → 1/2) ⇝ 1/1 | s:sine note:F1 release:1 penv:24 pdecay:0.05 distort:1 distorttype:fold ]", + "[ 0/1 ⇜ (1/2 → 1/1) | s:sine note:F1 release:1 penv:24 pdecay:0.05 distort:1 distorttype:fold ]", + "[ (1/1 → 3/2) ⇝ 2/1 | s:sine note:F1 release:1 penv:24 pdecay:0.05 distort:4.6367951557040215 distorttype:chebyshev ]", + "[ 1/1 ⇜ (3/2 → 2/1) | s:sine note:F1 release:1 penv:24 pdecay:0.05 distort:4.6367951557040215 distorttype:chebyshev ]", + "[ (2/1 → 5/2) ⇝ 3/1 | s:sine note:F1 release:1 penv:24 pdecay:0.05 distort:7.716689839959145 distorttype:scurve ]", + "[ 2/1 ⇜ (5/2 → 3/1) | s:sine note:F1 release:1 penv:24 pdecay:0.05 distort:7.716689839959145 distorttype:scurve ]", + "[ (3/1 → 7/2) ⇝ 4/1 | s:sine note:F1 release:1 penv:24 pdecay:0.05 distort:2.5210237745195627 distorttype:diode ]", + "[ 3/1 ⇜ (7/2 → 4/1) | s:sine note:F1 release:1 penv:24 pdecay:0.05 distort:2.5210237745195627 distorttype:diode ]", ] `; @@ -2984,38 +2974,38 @@ exports[`runs examples > example "distortvol" example index 0 1`] = ` exports[`runs examples > example "djf" example index 0 1`] = ` [ - "[ 0/1 → 1/8 | note:C4 s:supersaw djf:0.5 ]", + "[ 0/1 → 1/8 | note:D3 s:supersaw djf:0.5 ]", "[ 1/8 → 1/4 | note:G4 s:supersaw djf:0.5 ]", - "[ 1/4 → 3/8 | note:F3 s:supersaw djf:0.5 ]", - "[ 3/8 → 1/2 | note:C5 s:supersaw djf:0.5 ]", - "[ 1/2 → 5/8 | note:Bb3 s:supersaw djf:0.5 ]", - "[ 5/8 → 3/4 | note:A4 s:supersaw djf:0.5 ]", - "[ 3/4 → 7/8 | note:A3 s:supersaw djf:0.5 ]", - "[ 7/8 → 1/1 | note:D5 s:supersaw djf:0.5 ]", - "[ 1/1 → 9/8 | note:Eb3 s:supersaw djf:0.3 ]", - "[ 9/8 → 5/4 | note:D3 s:supersaw djf:0.3 ]", - "[ 5/4 → 11/8 | note:Eb5 s:supersaw djf:0.3 ]", - "[ 11/8 → 3/2 | note:D3 s:supersaw djf:0.3 ]", - "[ 3/2 → 13/8 | note:F3 s:supersaw djf:0.3 ]", - "[ 13/8 → 7/4 | note:G4 s:supersaw djf:0.3 ]", - "[ 7/4 → 15/8 | note:Bb3 s:supersaw djf:0.3 ]", - "[ 15/8 → 2/1 | note:G4 s:supersaw djf:0.3 ]", - "[ 2/1 → 17/8 | note:F4 s:supersaw djf:0.2 ]", - "[ 17/8 → 9/4 | note:D4 s:supersaw djf:0.2 ]", - "[ 9/4 → 19/8 | note:G3 s:supersaw djf:0.2 ]", + "[ 1/4 → 3/8 | note:Bb3 s:supersaw djf:0.5 ]", + "[ 3/8 → 1/2 | note:C4 s:supersaw djf:0.5 ]", + "[ 1/2 → 5/8 | note:A3 s:supersaw djf:0.5 ]", + "[ 5/8 → 3/4 | note:F3 s:supersaw djf:0.5 ]", + "[ 3/4 → 7/8 | note:G3 s:supersaw djf:0.5 ]", + "[ 7/8 → 1/1 | note:C4 s:supersaw djf:0.5 ]", + "[ 1/1 → 9/8 | note:Eb4 s:supersaw djf:0.3 ]", + "[ 9/8 → 5/4 | note:G4 s:supersaw djf:0.3 ]", + "[ 5/4 → 11/8 | note:A4 s:supersaw djf:0.3 ]", + "[ 11/8 → 3/2 | note:F3 s:supersaw djf:0.3 ]", + "[ 3/2 → 13/8 | note:F4 s:supersaw djf:0.3 ]", + "[ 13/8 → 7/4 | note:D4 s:supersaw djf:0.3 ]", + "[ 7/4 → 15/8 | note:G3 s:supersaw djf:0.3 ]", + "[ 15/8 → 2/1 | note:F4 s:supersaw djf:0.3 ]", + "[ 2/1 → 17/8 | note:Eb5 s:supersaw djf:0.2 ]", + "[ 17/8 → 9/4 | note:D5 s:supersaw djf:0.2 ]", + "[ 9/4 → 19/8 | note:Bb3 s:supersaw djf:0.2 ]", "[ 19/8 → 5/2 | note:C5 s:supersaw djf:0.2 ]", - "[ 5/2 → 21/8 | note:A4 s:supersaw djf:0.2 ]", - "[ 21/8 → 11/4 | note:Bb3 s:supersaw djf:0.2 ]", - "[ 11/4 → 23/8 | note:Bb3 s:supersaw djf:0.2 ]", - "[ 23/8 → 3/1 | note:C5 s:supersaw djf:0.2 ]", - "[ 3/1 → 25/8 | note:F4 s:supersaw djf:0.75 ]", - "[ 25/8 → 13/4 | note:F4 s:supersaw djf:0.75 ]", - "[ 13/4 → 27/8 | note:D5 s:supersaw djf:0.75 ]", - "[ 27/8 → 7/2 | note:D3 s:supersaw djf:0.75 ]", - "[ 7/2 → 29/8 | note:G3 s:supersaw djf:0.75 ]", - "[ 29/8 → 15/4 | note:F4 s:supersaw djf:0.75 ]", - "[ 15/4 → 31/8 | note:F4 s:supersaw djf:0.75 ]", - "[ 31/8 → 4/1 | note:F3 s:supersaw djf:0.75 ]", + "[ 5/2 → 21/8 | note:D4 s:supersaw djf:0.2 ]", + "[ 21/8 → 11/4 | note:F3 s:supersaw djf:0.2 ]", + "[ 11/4 → 23/8 | note:G4 s:supersaw djf:0.2 ]", + "[ 23/8 → 3/1 | note:D3 s:supersaw djf:0.2 ]", + "[ 3/1 → 25/8 | note:G3 s:supersaw djf:0.75 ]", + "[ 25/8 → 13/4 | note:Bb3 s:supersaw djf:0.75 ]", + "[ 13/4 → 27/8 | note:Eb5 s:supersaw djf:0.75 ]", + "[ 27/8 → 7/2 | note:C4 s:supersaw djf:0.75 ]", + "[ 7/2 → 29/8 | note:C4 s:supersaw djf:0.75 ]", + "[ 29/8 → 15/4 | note:Eb5 s:supersaw djf:0.75 ]", + "[ 15/4 → 31/8 | note:Bb4 s:supersaw djf:0.75 ]", + "[ 31/8 → 4/1 | note:A4 s:supersaw djf:0.75 ]", ] `; @@ -5173,71 +5163,71 @@ exports[`runs examples > example "invert" example index 0 1`] = ` exports[`runs examples > example "irand" example index 0 1`] = ` [ - "[ 0/1 → 1/4 | note:F3 ]", - "[ 1/4 → 3/8 | note:D3 ]", - "[ 3/8 → 1/2 | note:Bb3 ]", + "[ 0/1 → 1/4 | note:C3 ]", + "[ 1/4 → 3/8 | note:Eb3 ]", + "[ 3/8 → 1/2 | note:F3 ]", "[ 1/2 → 3/4 | note:Eb3 ]", - "[ 3/4 → 5/6 | note:Eb3 ]", - "[ 5/6 → 11/12 | note:Ab3 ]", - "[ 11/12 → 1/1 | note:D3 ]", - "[ 1/1 → 5/4 | note:C3 ]", - "[ 5/4 → 11/8 | note:C4 ]", - "[ 11/8 → 3/2 | note:C3 ]", - "[ 3/2 → 7/4 | note:D3 ]", - "[ 7/4 → 11/6 | note:Eb3 ]", - "[ 11/6 → 23/12 | note:C3 ]", - "[ 23/12 → 2/1 | note:Ab3 ]", - "[ 2/1 → 9/4 | note:G3 ]", - "[ 9/4 → 19/8 | note:D3 ]", + "[ 3/4 → 5/6 | note:D3 ]", + "[ 5/6 → 11/12 | note:C3 ]", + "[ 11/12 → 1/1 | note:C4 ]", + "[ 1/1 → 5/4 | note:G3 ]", + "[ 5/4 → 11/8 | note:Ab3 ]", + "[ 11/8 → 3/2 | note:D3 ]", + "[ 3/2 → 7/4 | note:G3 ]", + "[ 7/4 → 11/6 | note:D3 ]", + "[ 11/6 → 23/12 | note:Bb3 ]", + "[ 23/12 → 2/1 | note:Eb3 ]", + "[ 2/1 → 9/4 | note:C4 ]", + "[ 9/4 → 19/8 | note:Eb3 ]", "[ 19/8 → 5/2 | note:Bb3 ]", - "[ 5/2 → 11/4 | note:Ab3 ]", - "[ 11/4 → 17/6 | note:Eb3 ]", - "[ 17/6 → 35/12 | note:Ab3 ]", - "[ 35/12 → 3/1 | note:D3 ]", - "[ 3/1 → 13/4 | note:G3 ]", + "[ 5/2 → 11/4 | note:F3 ]", + "[ 11/4 → 17/6 | note:Ab3 ]", + "[ 17/6 → 35/12 | note:D3 ]", + "[ 35/12 → 3/1 | note:F3 ]", + "[ 3/1 → 13/4 | note:D3 ]", "[ 13/4 → 27/8 | note:C4 ]", - "[ 27/8 → 7/2 | note:C3 ]", - "[ 7/2 → 15/4 | note:D3 ]", - "[ 15/4 → 23/6 | note:G3 ]", + "[ 27/8 → 7/2 | note:F3 ]", + "[ 7/2 → 15/4 | note:F3 ]", + "[ 15/4 → 23/6 | note:Bb3 ]", "[ 23/6 → 47/12 | note:Ab3 ]", - "[ 47/12 → 4/1 | note:Ab3 ]", + "[ 47/12 → 4/1 | note:C3 ]", ] `; exports[`runs examples > example "irbegin" example index 0 1`] = ` [ - "[ 0/1 → 1/8 | s:brk speed:0.5 unit:c begin:0.375 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", + "[ 0/1 → 1/8 | s:brk speed:0.5 unit:c begin:0 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", "[ 1/8 → 1/4 | s:brk speed:0.5 unit:c begin:0.625 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", - "[ 1/4 → 3/8 | s:brk speed:0.5 unit:c begin:0.125 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", - "[ 3/8 → 1/2 | s:brk speed:0.5 unit:c begin:0.8125 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", - "[ 1/2 → 5/8 | s:brk speed:0.5 unit:c begin:0.3125 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", - "[ 5/8 → 3/4 | s:brk speed:0.5 unit:c begin:0.6875 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", - "[ 3/4 → 7/8 | s:brk speed:0.5 unit:c begin:0.25 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", - "[ 7/8 → 1/1 | s:brk speed:0.5 unit:c begin:0.875 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", - "[ 1/1 → 9/8 | s:brk speed:0.5 unit:c begin:0.0625 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", - "[ 9/8 → 5/4 | s:brk speed:0.5 unit:c begin:0 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", - "[ 5/4 → 11/8 | s:brk speed:0.5 unit:c begin:0.9375 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", - "[ 11/8 → 3/2 | s:brk speed:0.5 unit:c begin:0 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", - "[ 3/2 → 13/8 | s:brk speed:0.5 unit:c begin:0.125 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", - "[ 13/8 → 7/4 | s:brk speed:0.5 unit:c begin:0.625 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", - "[ 7/4 → 15/8 | s:brk speed:0.5 unit:c begin:0.3125 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", - "[ 15/8 → 2/1 | s:brk speed:0.5 unit:c begin:0.625 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", - "[ 2/1 → 17/8 | s:brk speed:0.5 unit:c begin:0.5625 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", - "[ 17/8 → 9/4 | s:brk speed:0.5 unit:c begin:0.4375 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", - "[ 9/4 → 19/8 | s:brk speed:0.5 unit:c begin:0.1875 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", + "[ 1/4 → 3/8 | s:brk speed:0.5 unit:c begin:0.3125 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", + "[ 3/8 → 1/2 | s:brk speed:0.5 unit:c begin:0.375 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", + "[ 1/2 → 5/8 | s:brk speed:0.5 unit:c begin:0.25 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", + "[ 5/8 → 3/4 | s:brk speed:0.5 unit:c begin:0.125 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", + "[ 3/4 → 7/8 | s:brk speed:0.5 unit:c begin:0.1875 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", + "[ 7/8 → 1/1 | s:brk speed:0.5 unit:c begin:0.375 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", + "[ 1/1 → 9/8 | s:brk speed:0.5 unit:c begin:0.5 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", + "[ 9/8 → 5/4 | s:brk speed:0.5 unit:c begin:0.625 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", + "[ 5/4 → 11/8 | s:brk speed:0.5 unit:c begin:0.6875 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", + "[ 11/8 → 3/2 | s:brk speed:0.5 unit:c begin:0.125 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", + "[ 3/2 → 13/8 | s:brk speed:0.5 unit:c begin:0.5625 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", + "[ 13/8 → 7/4 | s:brk speed:0.5 unit:c begin:0.4375 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", + "[ 7/4 → 15/8 | s:brk speed:0.5 unit:c begin:0.1875 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", + "[ 15/8 → 2/1 | s:brk speed:0.5 unit:c begin:0.5625 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0 roomsize:0.6 ]", + "[ 2/1 → 17/8 | s:brk speed:0.5 unit:c begin:0.9375 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", + "[ 17/8 → 9/4 | s:brk speed:0.5 unit:c begin:0.875 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", + "[ 9/4 → 19/8 | s:brk speed:0.5 unit:c begin:0.3125 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", "[ 19/8 → 5/2 | s:brk speed:0.5 unit:c begin:0.8125 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", - "[ 5/2 → 21/8 | s:brk speed:0.5 unit:c begin:0.6875 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", - "[ 21/8 → 11/4 | s:brk speed:0.5 unit:c begin:0.3125 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", - "[ 11/4 → 23/8 | s:brk speed:0.5 unit:c begin:0.3125 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", - "[ 23/8 → 3/1 | s:brk speed:0.5 unit:c begin:0.8125 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", - "[ 3/1 → 25/8 | s:brk speed:0.5 unit:c begin:0.5625 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", - "[ 25/8 → 13/4 | s:brk speed:0.5 unit:c begin:0.5625 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", - "[ 13/4 → 27/8 | s:brk speed:0.5 unit:c begin:0.875 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", - "[ 27/8 → 7/2 | s:brk speed:0.5 unit:c begin:0 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", - "[ 7/2 → 29/8 | s:brk speed:0.5 unit:c begin:0.1875 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", - "[ 29/8 → 15/4 | s:brk speed:0.5 unit:c begin:0.5625 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", - "[ 15/4 → 31/8 | s:brk speed:0.5 unit:c begin:0.5625 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", - "[ 31/8 → 4/1 | s:brk speed:0.5 unit:c begin:0.125 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", + "[ 5/2 → 21/8 | s:brk speed:0.5 unit:c begin:0.4375 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", + "[ 21/8 → 11/4 | s:brk speed:0.5 unit:c begin:0.125 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", + "[ 11/4 → 23/8 | s:brk speed:0.5 unit:c begin:0.625 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", + "[ 23/8 → 3/1 | s:brk speed:0.5 unit:c begin:0 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", + "[ 3/1 → 25/8 | s:brk speed:0.5 unit:c begin:0.1875 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", + "[ 25/8 → 13/4 | s:brk speed:0.5 unit:c begin:0.3125 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", + "[ 13/4 → 27/8 | s:brk speed:0.5 unit:c begin:0.9375 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", + "[ 27/8 → 7/2 | s:brk speed:0.5 unit:c begin:0.375 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", + "[ 7/2 → 29/8 | s:brk speed:0.5 unit:c begin:0.375 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", + "[ 29/8 → 15/4 | s:brk speed:0.5 unit:c begin:0.9375 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", + "[ 15/4 → 31/8 | s:brk speed:0.5 unit:c begin:0.75 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", + "[ 31/8 → 4/1 | s:brk speed:0.5 unit:c begin:0.6875 clip:1 ir:swpad i:4 room:0.65 irspeed:-2 irbegin:0.5 roomsize:0.6 ]", ] `; @@ -5264,38 +5254,38 @@ exports[`runs examples > example "iresponse" example index 0 1`] = ` exports[`runs examples > example "irspeed" example index 0 1`] = ` [ - "[ 0/1 → 1/8 | s:brk speed:0.5 unit:c begin:0.375 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", + "[ 0/1 → 1/8 | s:brk speed:0.5 unit:c begin:0 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", "[ 1/8 → 1/4 | s:brk speed:0.5 unit:c begin:0.625 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", - "[ 1/4 → 3/8 | s:brk speed:0.5 unit:c begin:0.125 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", - "[ 3/8 → 1/2 | s:brk speed:0.5 unit:c begin:0.8125 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", - "[ 1/2 → 5/8 | s:brk speed:0.5 unit:c begin:0.3125 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", - "[ 5/8 → 3/4 | s:brk speed:0.5 unit:c begin:0.6875 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", - "[ 3/4 → 7/8 | s:brk speed:0.5 unit:c begin:0.25 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", - "[ 7/8 → 1/1 | s:brk speed:0.5 unit:c begin:0.875 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", - "[ 1/1 → 9/8 | s:brk speed:0.5 unit:c begin:0.0625 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", - "[ 9/8 → 5/4 | s:brk speed:0.5 unit:c begin:0 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", - "[ 5/4 → 11/8 | s:brk speed:0.5 unit:c begin:0.9375 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", - "[ 11/8 → 3/2 | s:brk speed:0.5 unit:c begin:0 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", - "[ 3/2 → 13/8 | s:brk speed:0.5 unit:c begin:0.125 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", - "[ 13/8 → 7/4 | s:brk speed:0.5 unit:c begin:0.625 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", - "[ 7/4 → 15/8 | s:brk speed:0.5 unit:c begin:0.3125 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", - "[ 15/8 → 2/1 | s:brk speed:0.5 unit:c begin:0.625 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", - "[ 2/1 → 17/8 | s:brk speed:0.5 unit:c begin:0.5625 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", - "[ 17/8 → 9/4 | s:brk speed:0.5 unit:c begin:0.4375 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", - "[ 9/4 → 19/8 | s:brk speed:0.5 unit:c begin:0.1875 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", + "[ 1/4 → 3/8 | s:brk speed:0.5 unit:c begin:0.3125 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", + "[ 3/8 → 1/2 | s:brk speed:0.5 unit:c begin:0.375 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", + "[ 1/2 → 5/8 | s:brk speed:0.5 unit:c begin:0.25 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", + "[ 5/8 → 3/4 | s:brk speed:0.5 unit:c begin:0.125 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", + "[ 3/4 → 7/8 | s:brk speed:0.5 unit:c begin:0.1875 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", + "[ 7/8 → 1/1 | s:brk speed:0.5 unit:c begin:0.375 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", + "[ 1/1 → 9/8 | s:brk speed:0.5 unit:c begin:0.5 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", + "[ 9/8 → 5/4 | s:brk speed:0.5 unit:c begin:0.625 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", + "[ 5/4 → 11/8 | s:brk speed:0.5 unit:c begin:0.6875 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", + "[ 11/8 → 3/2 | s:brk speed:0.5 unit:c begin:0.125 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", + "[ 3/2 → 13/8 | s:brk speed:0.5 unit:c begin:0.5625 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", + "[ 13/8 → 7/4 | s:brk speed:0.5 unit:c begin:0.4375 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", + "[ 7/4 → 15/8 | s:brk speed:0.5 unit:c begin:0.1875 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", + "[ 15/8 → 2/1 | s:brk speed:0.5 unit:c begin:0.5625 clip:1 ir:swpad i:4 room:0.2 irspeed:2 irbegin:0.5 roomsize:0.5 ]", + "[ 2/1 → 17/8 | s:brk speed:0.5 unit:c begin:0.9375 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", + "[ 17/8 → 9/4 | s:brk speed:0.5 unit:c begin:0.875 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", + "[ 9/4 → 19/8 | s:brk speed:0.5 unit:c begin:0.3125 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", "[ 19/8 → 5/2 | s:brk speed:0.5 unit:c begin:0.8125 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", - "[ 5/2 → 21/8 | s:brk speed:0.5 unit:c begin:0.6875 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", - "[ 21/8 → 11/4 | s:brk speed:0.5 unit:c begin:0.3125 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", - "[ 11/4 → 23/8 | s:brk speed:0.5 unit:c begin:0.3125 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", - "[ 23/8 → 3/1 | s:brk speed:0.5 unit:c begin:0.8125 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", - "[ 3/1 → 25/8 | s:brk speed:0.5 unit:c begin:0.5625 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", - "[ 25/8 → 13/4 | s:brk speed:0.5 unit:c begin:0.5625 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", - "[ 13/4 → 27/8 | s:brk speed:0.5 unit:c begin:0.875 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", - "[ 27/8 → 7/2 | s:brk speed:0.5 unit:c begin:0 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", - "[ 7/2 → 29/8 | s:brk speed:0.5 unit:c begin:0.1875 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", - "[ 29/8 → 15/4 | s:brk speed:0.5 unit:c begin:0.5625 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", - "[ 15/4 → 31/8 | s:brk speed:0.5 unit:c begin:0.5625 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", - "[ 31/8 → 4/1 | s:brk speed:0.5 unit:c begin:0.125 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", + "[ 5/2 → 21/8 | s:brk speed:0.5 unit:c begin:0.4375 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", + "[ 21/8 → 11/4 | s:brk speed:0.5 unit:c begin:0.125 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", + "[ 11/4 → 23/8 | s:brk speed:0.5 unit:c begin:0.625 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", + "[ 23/8 → 3/1 | s:brk speed:0.5 unit:c begin:0 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", + "[ 3/1 → 25/8 | s:brk speed:0.5 unit:c begin:0.1875 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", + "[ 25/8 → 13/4 | s:brk speed:0.5 unit:c begin:0.3125 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", + "[ 13/4 → 27/8 | s:brk speed:0.5 unit:c begin:0.9375 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", + "[ 27/8 → 7/2 | s:brk speed:0.5 unit:c begin:0.375 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", + "[ 7/2 → 29/8 | s:brk speed:0.5 unit:c begin:0.375 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", + "[ 29/8 → 15/4 | s:brk speed:0.5 unit:c begin:0.9375 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", + "[ 15/4 → 31/8 | s:brk speed:0.5 unit:c begin:0.75 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", + "[ 31/8 → 4/1 | s:brk speed:0.5 unit:c begin:0.6875 clip:1 ir:swpad i:4 room:0.2 irspeed:1 irbegin:0.5 roomsize:0.5 ]", ] `; @@ -6985,34 +6975,34 @@ exports[`runs examples > example "often" example index 0 1`] = ` "[ 0/1 → 1/8 | s:hh speed:0.5 ]", "[ 1/8 → 1/4 | s:hh speed:0.5 ]", "[ 1/4 → 3/8 | s:hh speed:0.5 ]", - "[ 3/8 → 1/2 | s:hh ]", + "[ 3/8 → 1/2 | s:hh speed:0.5 ]", "[ 1/2 → 5/8 | s:hh speed:0.5 ]", "[ 5/8 → 3/4 | s:hh speed:0.5 ]", "[ 3/4 → 7/8 | s:hh speed:0.5 ]", - "[ 7/8 → 1/1 | s:hh ]", + "[ 7/8 → 1/1 | s:hh speed:0.5 ]", "[ 1/1 → 9/8 | s:hh speed:0.5 ]", "[ 9/8 → 5/4 | s:hh speed:0.5 ]", - "[ 5/4 → 11/8 | s:hh ]", + "[ 5/4 → 11/8 | s:hh speed:0.5 ]", "[ 11/8 → 3/2 | s:hh speed:0.5 ]", "[ 3/2 → 13/8 | s:hh speed:0.5 ]", "[ 13/8 → 7/4 | s:hh speed:0.5 ]", "[ 7/4 → 15/8 | s:hh speed:0.5 ]", "[ 15/8 → 2/1 | s:hh speed:0.5 ]", - "[ 2/1 → 17/8 | s:hh speed:0.5 ]", - "[ 17/8 → 9/4 | s:hh speed:0.5 ]", + "[ 2/1 → 17/8 | s:hh ]", + "[ 17/8 → 9/4 | s:hh ]", "[ 9/4 → 19/8 | s:hh speed:0.5 ]", "[ 19/8 → 5/2 | s:hh ]", "[ 5/2 → 21/8 | s:hh speed:0.5 ]", "[ 21/8 → 11/4 | s:hh speed:0.5 ]", "[ 11/4 → 23/8 | s:hh speed:0.5 ]", - "[ 23/8 → 3/1 | s:hh ]", + "[ 23/8 → 3/1 | s:hh speed:0.5 ]", "[ 3/1 → 25/8 | s:hh speed:0.5 ]", "[ 25/8 → 13/4 | s:hh speed:0.5 ]", "[ 13/4 → 27/8 | s:hh ]", "[ 27/8 → 7/2 | s:hh speed:0.5 ]", "[ 7/2 → 29/8 | s:hh speed:0.5 ]", - "[ 29/8 → 15/4 | s:hh speed:0.5 ]", - "[ 15/4 → 31/8 | s:hh speed:0.5 ]", + "[ 29/8 → 15/4 | s:hh ]", + "[ 15/4 → 31/8 | s:hh ]", "[ 31/8 → 4/1 | s:hh speed:0.5 ]", ] `; @@ -7283,54 +7273,54 @@ exports[`runs examples > example "penv" example index 0 1`] = ` exports[`runs examples > example "perlin" example index 0 1`] = ` [ - "[ 0/1 → 1/8 | s:hh cutoff:3410.6697876704857 ]", - "[ 0/1 → 1/4 | s:bd cutoff:3410.6697876704857 ]", - "[ 1/8 → 1/4 | s:hh cutoff:3378.181624527514 ]", - "[ 1/4 → 3/8 | s:hh cutoff:3201.164370596416 ]", - "[ 1/4 → 1/2 | s:bd cutoff:3201.164370596416 ]", - "[ 3/8 → 1/2 | s:hh cutoff:2853.676907017785 ]", - "[ 1/2 → 5/8 | s:hh cutoff:2398.7190938787535 ]", - "[ 1/2 → 3/4 | s:bd cutoff:2398.7190938787535 ]", - "[ 5/8 → 3/4 | s:hh cutoff:1943.7612807397215 ]", - "[ 3/4 → 7/8 | s:hh cutoff:1596.2738171610908 ]", - "[ 3/4 → 1/1 | s:bd cutoff:1596.2738171610908 ]", - "[ 7/8 → 1/1 | s:hh cutoff:1419.2565632299932 ]", - "[ 1/1 → 9/8 | s:hh cutoff:1386.7684000870213 ]", - "[ 1/1 → 5/4 | s:bd cutoff:1386.7684000870213 ]", - "[ 9/8 → 5/4 | s:hh cutoff:1442.5150435813734 ]", - "[ 5/4 → 11/8 | s:hh cutoff:1746.2600630772158 ]", - "[ 5/4 → 3/2 | s:bd cutoff:1746.2600630772158 ]", - "[ 11/8 → 3/2 | s:hh cutoff:2342.5159876004573 ]", - "[ 3/2 → 13/8 | s:hh cutoff:3123.1809609453194 ]", - "[ 3/2 → 7/4 | s:bd cutoff:3123.1809609453194 ]", - "[ 13/8 → 7/4 | s:hh cutoff:3903.8459342901815 ]", - "[ 7/4 → 15/8 | s:hh cutoff:4500.101858813423 ]", - "[ 7/4 → 2/1 | s:bd cutoff:4500.101858813423 ]", - "[ 15/8 → 2/1 | s:hh cutoff:4803.846878309266 ]", - "[ 2/1 → 17/8 | s:hh cutoff:4859.5935218036175 ]", - "[ 2/1 → 9/4 | s:bd cutoff:4859.5935218036175 ]", - "[ 17/8 → 9/4 | s:hh cutoff:4863.631636751641 ]", - "[ 9/4 → 19/8 | s:hh cutoff:4885.633989301141 ]", - "[ 9/4 → 5/2 | s:bd cutoff:4885.633989301141 ]", - "[ 19/8 → 5/2 | s:hh cutoff:4928.824929790842 ]", - "[ 5/2 → 21/8 | s:hh cutoff:4985.37389311241 ]", - "[ 5/2 → 11/4 | s:bd cutoff:4985.37389311241 ]", - "[ 21/8 → 11/4 | s:hh cutoff:5041.922856433977 ]", - "[ 11/4 → 23/8 | s:hh cutoff:5085.113796923679 ]", - "[ 11/4 → 3/1 | s:bd cutoff:5085.113796923679 ]", - "[ 23/8 → 3/1 | s:hh cutoff:5107.116149473179 ]", - "[ 3/1 → 25/8 | s:hh cutoff:5111.154264421202 ]", - "[ 3/1 → 13/4 | s:bd cutoff:5111.154264421202 ]", - "[ 25/8 → 13/4 | s:hh cutoff:5054.286698772394 ]", - "[ 13/4 → 27/8 | s:hh cutoff:4744.434145256264 ]", - "[ 13/4 → 7/2 | s:bd cutoff:4744.434145256264 ]", - "[ 27/8 → 7/2 | s:hh cutoff:4136.189041947908 ]", - "[ 7/2 → 29/8 | s:hh cutoff:3339.826896379236 ]", - "[ 7/2 → 15/4 | s:bd cutoff:3339.826896379236 ]", - "[ 29/8 → 15/4 | s:hh cutoff:2543.464750810564 ]", - "[ 15/4 → 31/8 | s:hh cutoff:1935.2196475022083 ]", - "[ 15/4 → 4/1 | s:bd cutoff:1935.2196475022083 ]", - "[ 31/8 → 4/1 | s:hh cutoff:1625.3670939860783 ]", + "[ 0/1 → 1/8 | s:hh cutoff:500 ]", + "[ 0/1 → 1/4 | s:bd cutoff:500 ]", + "[ 1/8 → 1/4 | s:hh cutoff:562.5486401770559 ]", + "[ 1/4 → 3/8 | s:hh cutoff:903.3554895067937 ]", + "[ 1/4 → 1/2 | s:bd cutoff:903.3554895067937 ]", + "[ 3/8 → 1/2 | s:hh cutoff:1572.364329119182 ]", + "[ 1/2 → 5/8 | s:hh cutoff:2448.2831191271544 ]", + "[ 1/2 → 3/4 | s:bd cutoff:2448.2831191271544 ]", + "[ 5/8 → 3/4 | s:hh cutoff:3324.2019091351267 ]", + "[ 3/4 → 7/8 | s:hh cutoff:3993.210748747515 ]", + "[ 3/4 → 1/1 | s:bd cutoff:3993.210748747515 ]", + "[ 7/8 → 1/1 | s:hh cutoff:4334.017598077253 ]", + "[ 1/1 → 9/8 | s:hh cutoff:4396.566238254309 ]", + "[ 1/1 → 5/4 | s:bd cutoff:4396.566238254309 ]", + "[ 9/8 → 5/4 | s:hh cutoff:4449.536839055554 ]", + "[ 5/4 → 11/8 | s:hh cutoff:4738.156120227359 ]", + "[ 5/4 → 3/2 | s:bd cutoff:4738.156120227359 ]", + "[ 11/8 → 3/2 | s:hh cutoff:5304.71999875931 ]", + "[ 3/2 → 13/8 | s:hh cutoff:6046.5098191052675 ]", + "[ 3/2 → 7/4 | s:bd cutoff:6046.5098191052675 ]", + "[ 13/8 → 7/4 | s:hh cutoff:6788.299639451225 ]", + "[ 7/4 → 15/8 | s:hh cutoff:7354.863517983176 ]", + "[ 7/4 → 2/1 | s:bd cutoff:7354.863517983176 ]", + "[ 15/8 → 2/1 | s:hh cutoff:7643.482799154981 ]", + "[ 2/1 → 17/8 | s:hh cutoff:7696.453399956226 ]", + "[ 2/1 → 9/4 | s:bd cutoff:7696.453399956226 ]", + "[ 17/8 → 9/4 | s:hh cutoff:7607.093996059746 ]", + "[ 9/4 → 19/8 | s:hh cutoff:7120.204164182724 ]", + "[ 9/4 → 5/2 | s:bd cutoff:7120.204164182724 ]", + "[ 19/8 → 5/2 | s:hh cutoff:6164.432289046601 ]", + "[ 5/2 → 21/8 | s:hh cutoff:4913.0608648993075 ]", + "[ 5/2 → 11/4 | s:bd cutoff:4913.0608648993075 ]", + "[ 21/8 → 11/4 | s:hh cutoff:3661.6894407520135 ]", + "[ 11/4 → 23/8 | s:hh cutoff:2705.9175656158914 ]", + "[ 11/4 → 3/1 | s:bd cutoff:2705.9175656158914 ]", + "[ 23/8 → 3/1 | s:hh cutoff:2219.0277337388693 ]", + "[ 3/1 → 25/8 | s:hh cutoff:2129.6683298423886 ]", + "[ 3/1 → 13/4 | s:bd cutoff:2129.6683298423886 ]", + "[ 25/8 → 13/4 | s:hh cutoff:2113.2537022102156 ]", + "[ 13/4 → 27/8 | s:hh cutoff:2023.8158261763601 ]", + "[ 13/4 → 7/2 | s:bd cutoff:2023.8158261763601 ]", + "[ 27/8 → 7/2 | s:hh cutoff:1848.2479648482126 ]", + "[ 7/2 → 29/8 | s:hh cutoff:1618.380764964968 ]", + "[ 7/2 → 15/4 | s:bd cutoff:1618.380764964968 ]", + "[ 29/8 → 15/4 | s:hh cutoff:1388.5135650817233 ]", + "[ 15/4 → 31/8 | s:hh cutoff:1212.9457037535758 ]", + "[ 15/4 → 4/1 | s:bd cutoff:1212.9457037535758 ]", + "[ 31/8 → 4/1 | s:hh cutoff:1123.5078277197204 ]", ] `; @@ -8152,54 +8142,54 @@ exports[`runs examples > example "queryArc" example index 0 1`] = `[]`; exports[`runs examples > example "rand" example index 0 1`] = ` [ - "[ 0/1 → 1/8 | s:hh cutoff:3410.6697876704857 ]", - "[ 0/1 → 1/4 | s:bd cutoff:3410.6697876704857 ]", - "[ 1/8 → 1/4 | s:hh cutoff:5409.978067153133 ]", - "[ 1/4 → 3/8 | s:hh cutoff:1470.4432229045779 ]", - "[ 1/4 → 1/2 | s:bd cutoff:1470.4432229045779 ]", - "[ 3/8 → 1/2 | s:hh cutoff:6906.840303097852 ]", - "[ 1/2 → 5/8 | s:hh cutoff:2951.713348273188 ]", - "[ 1/2 → 3/4 | s:bd cutoff:2951.713348273188 ]", - "[ 5/8 → 3/4 | s:hh cutoff:5732.849565800279 ]", - "[ 3/4 → 7/8 | s:hh cutoff:2621.97931134142 ]", - "[ 3/4 → 1/1 | s:bd cutoff:2621.97931134142 ]", - "[ 7/8 → 1/1 | s:hh cutoff:7323.85477644857 ]", - "[ 1/1 → 9/8 | s:hh cutoff:1386.7684000870213 ]", - "[ 1/1 → 5/4 | s:bd cutoff:1386.7684000870213 ]", - "[ 9/8 → 5/4 | s:hh cutoff:968.4956459095702 ]", - "[ 5/4 → 11/8 | s:hh cutoff:7674.6532345423475 ]", - "[ 5/4 → 3/2 | s:bd cutoff:7674.6532345423475 ]", - "[ 11/8 → 3/2 | s:hh cutoff:863.651579245925 ]", - "[ 3/2 → 13/8 | s:hh cutoff:1476.3008129084483 ]", - "[ 3/2 → 7/4 | s:bd cutoff:1476.3008129084483 ]", - "[ 13/8 → 7/4 | s:hh cutoff:5232.728436938487 ]", - "[ 7/4 → 15/8 | s:hh cutoff:3057.402160600759 ]", - "[ 7/4 → 2/1 | s:bd cutoff:3057.402160600759 ]", - "[ 15/8 → 2/1 | s:hh cutoff:5307.644687825814 ]", - "[ 2/1 → 17/8 | s:hh cutoff:4859.5935218036175 ]", - "[ 2/1 → 9/4 | s:bd cutoff:4859.5935218036175 ]", - "[ 17/8 → 9/4 | s:hh cutoff:3798.551473999396 ]", - "[ 9/4 → 19/8 | s:hh cutoff:2020.6333762034774 ]", - "[ 9/4 → 5/2 | s:bd cutoff:2020.6333762034774 ]", - "[ 19/8 → 5/2 | s:hh cutoff:6903.368854080327 ]", - "[ 5/2 → 21/8 | s:hh cutoff:5992.341757635586 ]", - "[ 5/2 → 11/4 | s:bd cutoff:5992.341757635586 ]", - "[ 21/8 → 11/4 | s:hh cutoff:3192.4760919064283 ]", - "[ 11/4 → 23/8 | s:hh cutoff:3188.529685838148 ]", - "[ 11/4 → 3/1 | s:bd cutoff:3188.529685838148 ]", - "[ 23/8 → 3/1 | s:hh cutoff:6837.369324173778 ]", - "[ 3/1 → 25/8 | s:hh cutoff:5111.154264421202 ]", - "[ 3/1 → 13/4 | s:bd cutoff:5111.154264421202 ]", - "[ 25/8 → 13/4 | s:hh cutoff:4812.422384973615 ]", - "[ 13/4 → 27/8 | s:hh cutoff:7517.148802988231 ]", - "[ 13/4 → 7/2 | s:bd cutoff:7517.148802988231 ]", - "[ 27/8 → 7/2 | s:hh cutoff:821.3959728600457 ]", - "[ 7/2 → 29/8 | s:hh cutoff:2354.0139601100236 ]", - "[ 7/2 → 15/4 | s:bd cutoff:2354.0139601100236 ]", - "[ 29/8 → 15/4 | s:hh cutoff:4901.923676487058 ]", - "[ 15/4 → 31/8 | s:hh cutoff:4723.308931104839 ]", - "[ 15/4 → 4/1 | s:bd cutoff:4723.308931104839 ]", - "[ 31/8 → 4/1 | s:hh cutoff:1649.9183619162068 ]", + "[ 0/1 → 1/8 | s:hh cutoff:500 ]", + "[ 0/1 → 1/4 | s:bd cutoff:500 ]", + "[ 1/8 → 1/4 | s:hh cutoff:5639.116775244474 ]", + "[ 1/4 → 3/8 | s:hh cutoff:3273.1976890936494 ]", + "[ 1/4 → 1/2 | s:bd cutoff:3273.1976890936494 ]", + "[ 3/8 → 1/2 | s:hh cutoff:3510.4438681155443 ]", + "[ 1/2 → 5/8 | s:hh cutoff:2453.604621812701 ]", + "[ 1/2 → 3/4 | s:bd cutoff:2453.604621812701 ]", + "[ 5/8 → 3/4 | s:hh cutoff:1517.2690078616142 ]", + "[ 3/4 → 7/8 | s:hh cutoff:1968.6986012384295 ]", + "[ 3/4 → 1/1 | s:bd cutoff:1968.6986012384295 ]", + "[ 7/8 → 1/1 | s:hh cutoff:3482.2331061586738 ]", + "[ 1/1 → 9/8 | s:hh cutoff:4396.566238254309 ]", + "[ 1/1 → 5/4 | s:bd cutoff:4396.566238254309 ]", + "[ 9/8 → 5/4 | s:hh cutoff:5543.671359308064 ]", + "[ 5/4 → 11/8 | s:hh cutoff:5965.461523272097 ]", + "[ 5/4 → 3/2 | s:bd cutoff:5965.461523272097 ]", + "[ 11/8 → 3/2 | s:hh cutoff:1871.028139255941 ]", + "[ 3/2 → 13/8 | s:hh cutoff:5063.060561195016 ]", + "[ 3/2 → 7/4 | s:bd cutoff:5063.060561195016 ]", + "[ 13/8 → 7/4 | s:hh cutoff:4225.660336203873 ]", + "[ 7/4 → 15/8 | s:hh cutoff:2035.5342207476497 ]", + "[ 7/4 → 2/1 | s:bd cutoff:2035.5342207476497 ]", + "[ 15/8 → 2/1 | s:hh cutoff:4959.178843535483 ]", + "[ 2/1 → 17/8 | s:hh cutoff:7696.453399956226 ]", + "[ 2/1 → 9/4 | s:bd cutoff:7696.453399956226 ]", + "[ 17/8 → 9/4 | s:hh cutoff:7275.427204556763 ]", + "[ 9/4 → 19/8 | s:hh cutoff:3091.1188358440995 ]", + "[ 9/4 → 5/2 | s:bd cutoff:3091.1188358440995 ]", + "[ 19/8 → 5/2 | s:hh cutoff:6773.7998040392995 ]", + "[ 5/2 → 21/8 | s:hh cutoff:3939.620556309819 ]", + "[ 5/2 → 11/4 | s:bd cutoff:3939.620556309819 ]", + "[ 21/8 → 11/4 | s:hh cutoff:1701.4511320739985 ]", + "[ 11/4 → 23/8 | s:hh cutoff:5249.245778657496 ]", + "[ 11/4 → 3/1 | s:bd cutoff:5249.245778657496 ]", + "[ 23/8 → 3/1 | s:hh cutoff:621.9062879681587 ]", + "[ 3/1 → 25/8 | s:hh cutoff:2129.6683298423886 ]", + "[ 3/1 → 13/4 | s:bd cutoff:2129.6683298423886 ]", + "[ 25/8 → 13/4 | s:hh cutoff:3074.329087510705 ]", + "[ 13/4 → 27/8 | s:hh cutoff:7942.738036625087 ]", + "[ 13/4 → 7/2 | s:bd cutoff:7942.738036625087 ]", + "[ 27/8 → 7/2 | s:hh cutoff:3565.1885084807873 ]", + "[ 7/2 → 29/8 | s:hh cutoff:3574.6161099523306 ]", + "[ 7/2 → 15/4 | s:bd cutoff:3574.6161099523306 ]", + "[ 29/8 → 15/4 | s:hh cutoff:7543.614340946078 ]", + "[ 15/4 → 31/8 | s:hh cutoff:6591.254916973412 ]", + "[ 15/4 → 4/1 | s:bd cutoff:6591.254916973412 ]", + "[ 31/8 → 4/1 | s:hh cutoff:6021.249040029943 ]", ] `; @@ -8364,38 +8354,38 @@ exports[`runs examples > example "rangex" example index 0 1`] = ` exports[`runs examples > example "rarely" example index 0 1`] = ` [ - "[ 0/1 → 1/8 | s:hh ]", + "[ 0/1 → 1/8 | s:hh speed:0.5 ]", "[ 1/8 → 1/4 | s:hh ]", - "[ 1/4 → 3/8 | s:hh speed:0.5 ]", + "[ 1/4 → 3/8 | s:hh ]", "[ 3/8 → 1/2 | s:hh ]", "[ 1/2 → 5/8 | s:hh ]", - "[ 5/8 → 3/4 | s:hh ]", - "[ 3/4 → 7/8 | s:hh ]", + "[ 5/8 → 3/4 | s:hh speed:0.5 ]", + "[ 3/4 → 7/8 | s:hh speed:0.5 ]", "[ 7/8 → 1/1 | s:hh ]", - "[ 1/1 → 9/8 | s:hh speed:0.5 ]", - "[ 9/8 → 5/4 | s:hh speed:0.5 ]", + "[ 1/1 → 9/8 | s:hh ]", + "[ 9/8 → 5/4 | s:hh ]", "[ 5/4 → 11/8 | s:hh ]", "[ 11/8 → 3/2 | s:hh speed:0.5 ]", - "[ 3/2 → 13/8 | s:hh speed:0.5 ]", + "[ 3/2 → 13/8 | s:hh ]", "[ 13/8 → 7/4 | s:hh ]", - "[ 7/4 → 15/8 | s:hh ]", + "[ 7/4 → 15/8 | s:hh speed:0.5 ]", "[ 15/8 → 2/1 | s:hh ]", "[ 2/1 → 17/8 | s:hh ]", "[ 17/8 → 9/4 | s:hh ]", - "[ 9/4 → 19/8 | s:hh speed:0.5 ]", + "[ 9/4 → 19/8 | s:hh ]", "[ 19/8 → 5/2 | s:hh ]", "[ 5/2 → 21/8 | s:hh ]", - "[ 21/8 → 11/4 | s:hh ]", + "[ 21/8 → 11/4 | s:hh speed:0.5 ]", "[ 11/4 → 23/8 | s:hh ]", - "[ 23/8 → 3/1 | s:hh ]", - "[ 3/1 → 25/8 | s:hh ]", + "[ 23/8 → 3/1 | s:hh speed:0.5 ]", + "[ 3/1 → 25/8 | s:hh speed:0.5 ]", "[ 25/8 → 13/4 | s:hh ]", "[ 13/4 → 27/8 | s:hh ]", - "[ 27/8 → 7/2 | s:hh speed:0.5 ]", - "[ 7/2 → 29/8 | s:hh speed:0.5 ]", + "[ 27/8 → 7/2 | s:hh ]", + "[ 7/2 → 29/8 | s:hh ]", "[ 29/8 → 15/4 | s:hh ]", "[ 15/4 → 31/8 | s:hh ]", - "[ 31/8 → 4/1 | s:hh speed:0.5 ]", + "[ 31/8 → 4/1 | s:hh ]", ] `; @@ -8439,22 +8429,22 @@ exports[`runs examples > example "release" example index 0 1`] = ` exports[`runs examples > example "repeatCycles" example index 0 1`] = ` [ - "[ 0/1 → 1/4 | note:38 s:gm_acoustic_guitar_nylon ]", - "[ 1/4 → 1/2 | note:35 s:gm_acoustic_guitar_nylon ]", + "[ 0/1 → 1/4 | note:34 s:gm_acoustic_guitar_nylon ]", + "[ 1/4 → 1/2 | note:38 s:gm_acoustic_guitar_nylon ]", "[ 1/2 → 3/4 | note:37 s:gm_acoustic_guitar_nylon ]", - "[ 3/4 → 1/1 | note:37 s:gm_acoustic_guitar_nylon ]", - "[ 1/1 → 5/4 | note:38 s:gm_acoustic_guitar_nylon ]", - "[ 5/4 → 3/2 | note:35 s:gm_acoustic_guitar_nylon ]", + "[ 3/4 → 1/1 | note:36 s:gm_acoustic_guitar_nylon ]", + "[ 1/1 → 5/4 | note:34 s:gm_acoustic_guitar_nylon ]", + "[ 5/4 → 3/2 | note:38 s:gm_acoustic_guitar_nylon ]", "[ 3/2 → 7/4 | note:37 s:gm_acoustic_guitar_nylon ]", - "[ 7/4 → 2/1 | note:37 s:gm_acoustic_guitar_nylon ]", - "[ 2/1 → 9/4 | note:35 s:gm_acoustic_guitar_nylon ]", - "[ 9/4 → 5/2 | note:45 s:gm_acoustic_guitar_nylon ]", - "[ 5/2 → 11/4 | note:35 s:gm_acoustic_guitar_nylon ]", - "[ 11/4 → 3/1 | note:38 s:gm_acoustic_guitar_nylon ]", - "[ 3/1 → 13/4 | note:35 s:gm_acoustic_guitar_nylon ]", - "[ 13/4 → 7/2 | note:45 s:gm_acoustic_guitar_nylon ]", - "[ 7/2 → 15/4 | note:35 s:gm_acoustic_guitar_nylon ]", - "[ 15/4 → 4/1 | note:38 s:gm_acoustic_guitar_nylon ]", + "[ 7/4 → 2/1 | note:36 s:gm_acoustic_guitar_nylon ]", + "[ 2/1 → 9/4 | note:40 s:gm_acoustic_guitar_nylon ]", + "[ 9/4 → 5/2 | note:42 s:gm_acoustic_guitar_nylon ]", + "[ 5/2 → 11/4 | note:41 s:gm_acoustic_guitar_nylon ]", + "[ 11/4 → 3/1 | note:36 s:gm_acoustic_guitar_nylon ]", + "[ 3/1 → 13/4 | note:40 s:gm_acoustic_guitar_nylon ]", + "[ 13/4 → 7/2 | note:42 s:gm_acoustic_guitar_nylon ]", + "[ 7/2 → 15/4 | note:41 s:gm_acoustic_guitar_nylon ]", + "[ 15/4 → 4/1 | note:36 s:gm_acoustic_guitar_nylon ]", ] `; @@ -8619,43 +8609,67 @@ exports[`runs examples > example "ribbon" example index 0 1`] = ` exports[`runs examples > example "ribbon" example index 1 1`] = ` [ - "[ 0/1 → 1/4 | note:D3 ]", - "[ 1/4 → 1/2 | note:A3 ]", + "[ 0/1 → 1/4 | note:A3 ]", + "[ 1/4 → 1/2 | note:C3 ]", "[ 1/2 → 3/4 | note:D3 ]", - "[ 3/4 → 1/1 | note:E3 ]", - "[ 1/1 → 5/4 | note:C3 ]", - "[ 5/4 → 3/2 | note:D3 ]", - "[ 3/2 → 7/4 | note:D3 ]", - "[ 7/4 → 2/1 | note:C4 ]", - "[ 2/1 → 9/4 | note:D3 ]", - "[ 9/4 → 5/2 | note:A3 ]", + "[ 3/4 → 1/1 | note:G3 ]", + "[ 1/1 → 5/4 | note:E3 ]", + "[ 5/4 → 3/2 | note:C4 ]", + "[ 3/2 → 7/4 | note:A3 ]", + "[ 7/4 → 2/1 | note:E4 ]", + "[ 2/1 → 9/4 | note:A3 ]", + "[ 9/4 → 5/2 | note:C3 ]", "[ 5/2 → 11/4 | note:D3 ]", - "[ 11/4 → 3/1 | note:E3 ]", - "[ 3/1 → 13/4 | note:C3 ]", - "[ 13/4 → 7/2 | note:D3 ]", - "[ 7/2 → 15/4 | note:D3 ]", - "[ 15/4 → 4/1 | note:C4 ]", + "[ 11/4 → 3/1 | note:G3 ]", + "[ 3/1 → 13/4 | note:E3 ]", + "[ 13/4 → 7/2 | note:C4 ]", + "[ 7/2 → 15/4 | note:A3 ]", + "[ 15/4 → 4/1 | note:E4 ]", ] `; exports[`runs examples > example "ribbon" example index 2 1`] = ` [ "[ 1/16 → 1/8 | s:bd ]", + "[ 1/8 → 3/16 | s:bd ]", "[ 3/16 → 1/4 | s:bd ]", + "[ 1/4 → 5/16 | s:bd ]", + "[ 3/8 → 7/16 | s:bd ]", "[ 9/16 → 5/8 | s:bd ]", + "[ 5/8 → 11/16 | s:bd ]", "[ 11/16 → 3/4 | s:bd ]", + "[ 3/4 → 13/16 | s:bd ]", + "[ 7/8 → 15/16 | s:bd ]", "[ 17/16 → 9/8 | s:bd ]", + "[ 9/8 → 19/16 | s:bd ]", "[ 19/16 → 5/4 | s:bd ]", + "[ 5/4 → 21/16 | s:bd ]", + "[ 11/8 → 23/16 | s:bd ]", "[ 25/16 → 13/8 | s:bd ]", + "[ 13/8 → 27/16 | s:bd ]", "[ 27/16 → 7/4 | s:bd ]", + "[ 7/4 → 29/16 | s:bd ]", + "[ 15/8 → 31/16 | s:bd ]", "[ 33/16 → 17/8 | s:bd ]", + "[ 17/8 → 35/16 | s:bd ]", "[ 35/16 → 9/4 | s:bd ]", + "[ 9/4 → 37/16 | s:bd ]", + "[ 19/8 → 39/16 | s:bd ]", "[ 41/16 → 21/8 | s:bd ]", + "[ 21/8 → 43/16 | s:bd ]", "[ 43/16 → 11/4 | s:bd ]", + "[ 11/4 → 45/16 | s:bd ]", + "[ 23/8 → 47/16 | s:bd ]", "[ 49/16 → 25/8 | s:bd ]", + "[ 25/8 → 51/16 | s:bd ]", "[ 51/16 → 13/4 | s:bd ]", + "[ 13/4 → 53/16 | s:bd ]", + "[ 27/8 → 55/16 | s:bd ]", "[ 57/16 → 29/8 | s:bd ]", + "[ 29/8 → 59/16 | s:bd ]", "[ 59/16 → 15/4 | s:bd ]", + "[ 15/4 → 61/16 | s:bd ]", + "[ 31/8 → 63/16 | s:bd ]", ] `; @@ -9186,38 +9200,38 @@ exports[`runs examples > example "scale" example index 1 1`] = ` exports[`runs examples > example "scale" example index 2 1`] = ` [ - "[ 0/1 → 1/8 | note:C4 s:piano ]", - "[ 1/8 → 1/4 | note:G4 s:piano ]", - "[ 1/4 → 3/8 | note:F3 s:piano ]", - "[ 3/8 → 1/2 | note:D5 s:piano ]", + "[ 0/1 → 1/8 | note:C3 s:piano ]", + "[ 1/8 → 1/4 | note:A4 s:piano ]", + "[ 1/4 → 3/8 | note:C4 s:piano ]", + "[ 3/8 → 1/2 | note:C4 s:piano ]", "[ 1/2 → 5/8 | note:A3 s:piano ]", - "[ 5/8 → 3/4 | note:A4 s:piano ]", - "[ 3/4 → 7/8 | note:A3 s:piano ]", - "[ 7/8 → 1/1 | note:D5 s:piano ]", - "[ 1/1 → 9/8 | note:F3 s:piano ]", - "[ 9/8 → 5/4 | note:D3 s:piano ]", - "[ 5/4 → 11/8 | note:F5 s:piano ]", - "[ 11/8 → 3/2 | note:D3 s:piano ]", - "[ 3/2 → 13/8 | note:F3 s:piano ]", - "[ 13/8 → 7/4 | note:G4 s:piano ]", - "[ 7/4 → 15/8 | note:C4 s:piano ]", + "[ 5/8 → 3/4 | note:F3 s:piano ]", + "[ 3/4 → 7/8 | note:G3 s:piano ]", + "[ 7/8 → 1/1 | note:C4 s:piano ]", + "[ 1/1 → 9/8 | note:F4 s:piano ]", + "[ 9/8 → 5/4 | note:A4 s:piano ]", + "[ 5/4 → 11/8 | note:A4 s:piano ]", + "[ 11/8 → 3/2 | note:G3 s:piano ]", + "[ 3/2 → 13/8 | note:G4 s:piano ]", + "[ 13/8 → 7/4 | note:D4 s:piano ]", + "[ 7/4 → 15/8 | note:G3 s:piano ]", "[ 15/8 → 2/1 | note:G4 s:piano ]", - "[ 2/1 → 17/8 | note:F4 s:piano ]", - "[ 17/8 → 9/4 | note:D4 s:piano ]", - "[ 9/4 → 19/8 | note:G3 s:piano ]", + "[ 2/1 → 17/8 | note:F5 s:piano ]", + "[ 17/8 → 9/4 | note:D5 s:piano ]", + "[ 9/4 → 19/8 | note:C4 s:piano ]", "[ 19/8 → 5/2 | note:D5 s:piano ]", - "[ 5/2 → 21/8 | note:A4 s:piano ]", - "[ 21/8 → 11/4 | note:C4 s:piano ]", - "[ 11/4 → 23/8 | note:C4 s:piano ]", - "[ 23/8 → 3/1 | note:D5 s:piano ]", - "[ 3/1 → 25/8 | note:G4 s:piano ]", - "[ 25/8 → 13/4 | note:F4 s:piano ]", + "[ 5/2 → 21/8 | note:D4 s:piano ]", + "[ 21/8 → 11/4 | note:F3 s:piano ]", + "[ 11/4 → 23/8 | note:G4 s:piano ]", + "[ 23/8 → 3/1 | note:D3 s:piano ]", + "[ 3/1 → 25/8 | note:G3 s:piano ]", + "[ 25/8 → 13/4 | note:C4 s:piano ]", "[ 13/4 → 27/8 | note:F5 s:piano ]", - "[ 27/8 → 7/2 | note:D3 s:piano ]", - "[ 7/2 → 29/8 | note:G3 s:piano ]", - "[ 29/8 → 15/4 | note:G4 s:piano ]", - "[ 15/4 → 31/8 | note:F4 s:piano ]", - "[ 31/8 → 4/1 | note:F3 s:piano ]", + "[ 27/8 → 7/2 | note:C4 s:piano ]", + "[ 7/2 → 29/8 | note:C4 s:piano ]", + "[ 29/8 → 15/4 | note:F5 s:piano ]", + "[ 15/4 → 31/8 | note:C5 s:piano ]", + "[ 31/8 → 4/1 | note:A4 s:piano ]", ] `; @@ -9256,70 +9270,70 @@ exports[`runs examples > example "scale" example index 3 1`] = ` exports[`runs examples > example "scale" example index 4 1`] = ` [ - "[ 0/1 → 1/16 | note:Gb2 ]", - "[ 1/16 → 1/8 | note:Gb2 ]", - "[ 1/8 → 3/16 | note:Gb2 ]", - "[ 3/16 → 1/4 | note:Gb2 ]", - "[ 1/4 → 5/16 | note:Gb2 ]", - "[ 5/16 → 3/8 | note:Gb2 ]", - "[ 3/8 → 7/16 | note:Gb2 ]", - "[ 7/16 → 1/2 | note:Gb2 ]", - "[ 1/2 → 9/16 | note:Gb2 ]", - "[ 9/16 → 5/8 | note:Gb2 ]", - "[ 5/8 → 11/16 | note:Gb2 ]", - "[ 11/16 → 3/4 | note:Gb2 ]", - "[ 3/4 → 13/16 | note:Gb2 ]", - "[ 13/16 → 7/8 | note:Gb2 ]", - "[ 7/8 → 15/16 | note:Gb2 ]", - "[ 15/16 → 1/1 | note:Gb2 ]", - "[ 1/1 → 17/16 | note:Bb1 ]", - "[ 17/16 → 9/8 | note:Bb1 ]", - "[ 9/8 → 19/16 | note:Bb1 ]", - "[ 19/16 → 5/4 | note:Bb1 ]", - "[ 5/4 → 21/16 | note:Bb1 ]", - "[ 21/16 → 11/8 | note:Bb1 ]", - "[ 11/8 → 23/16 | note:Bb1 ]", - "[ 23/16 → 3/2 | note:Bb1 ]", - "[ 3/2 → 25/16 | note:Bb1 ]", - "[ 25/16 → 13/8 | note:Bb1 ]", - "[ 13/8 → 27/16 | note:Bb1 ]", - "[ 27/16 → 7/4 | note:Bb1 ]", - "[ 7/4 → 29/16 | note:Bb1 ]", - "[ 29/16 → 15/8 | note:Bb1 ]", - "[ 15/8 → 31/16 | note:Bb1 ]", - "[ 31/16 → 2/1 | note:Bb1 ]", - "[ 2/1 → 33/16 | note:Db3 ]", - "[ 33/16 → 17/8 | note:Db3 ]", - "[ 17/8 → 35/16 | note:Db3 ]", - "[ 35/16 → 9/4 | note:Db3 ]", - "[ 9/4 → 37/16 | note:Db3 ]", - "[ 37/16 → 19/8 | note:Db3 ]", - "[ 19/8 → 39/16 | note:Db3 ]", - "[ 39/16 → 5/2 | note:Db3 ]", - "[ 5/2 → 41/16 | note:Db3 ]", - "[ 41/16 → 21/8 | note:Db3 ]", - "[ 21/8 → 43/16 | note:Db3 ]", - "[ 43/16 → 11/4 | note:Db3 ]", - "[ 11/4 → 45/16 | note:Db3 ]", - "[ 45/16 → 23/8 | note:Db3 ]", - "[ 23/8 → 47/16 | note:Db3 ]", - "[ 47/16 → 3/1 | note:Db3 ]", - "[ 3/1 → 49/16 | note:Eb3 ]", - "[ 49/16 → 25/8 | note:Eb3 ]", - "[ 25/8 → 51/16 | note:Eb3 ]", - "[ 51/16 → 13/4 | note:Eb3 ]", - "[ 13/4 → 53/16 | note:Eb3 ]", - "[ 53/16 → 27/8 | note:Eb3 ]", - "[ 27/8 → 55/16 | note:Eb3 ]", - "[ 55/16 → 7/2 | note:Eb3 ]", - "[ 7/2 → 57/16 | note:Eb3 ]", - "[ 57/16 → 29/8 | note:Eb3 ]", - "[ 29/8 → 59/16 | note:Eb3 ]", - "[ 59/16 → 15/4 | note:Eb3 ]", - "[ 15/4 → 61/16 | note:Eb3 ]", - "[ 61/16 → 31/8 | note:Eb3 ]", - "[ 31/8 → 63/16 | note:Eb3 ]", - "[ 63/16 → 4/1 | note:Eb3 ]", + "[ 0/1 → 1/16 | note:Gb1 ]", + "[ 1/16 → 1/8 | note:Gb1 ]", + "[ 1/8 → 3/16 | note:Gb1 ]", + "[ 3/16 → 1/4 | note:Gb1 ]", + "[ 1/4 → 5/16 | note:Gb1 ]", + "[ 5/16 → 3/8 | note:Gb1 ]", + "[ 3/8 → 7/16 | note:Gb1 ]", + "[ 7/16 → 1/2 | note:Gb1 ]", + "[ 1/2 → 9/16 | note:Gb1 ]", + "[ 9/16 → 5/8 | note:Gb1 ]", + "[ 5/8 → 11/16 | note:Gb1 ]", + "[ 11/16 → 3/4 | note:Gb1 ]", + "[ 3/4 → 13/16 | note:Gb1 ]", + "[ 13/16 → 7/8 | note:Gb1 ]", + "[ 7/8 → 15/16 | note:Gb1 ]", + "[ 15/16 → 1/1 | note:Gb1 ]", + "[ 1/1 → 17/16 | note:Cb3 ]", + "[ 17/16 → 9/8 | note:Cb3 ]", + "[ 9/8 → 19/16 | note:Cb3 ]", + "[ 19/16 → 5/4 | note:Cb3 ]", + "[ 5/4 → 21/16 | note:Cb3 ]", + "[ 21/16 → 11/8 | note:Cb3 ]", + "[ 11/8 → 23/16 | note:Cb3 ]", + "[ 23/16 → 3/2 | note:Cb3 ]", + "[ 3/2 → 25/16 | note:Cb3 ]", + "[ 25/16 → 13/8 | note:Cb3 ]", + "[ 13/8 → 27/16 | note:Cb3 ]", + "[ 27/16 → 7/4 | note:Cb3 ]", + "[ 7/4 → 29/16 | note:Cb3 ]", + "[ 29/16 → 15/8 | note:Cb3 ]", + "[ 15/8 → 31/16 | note:Cb3 ]", + "[ 31/16 → 2/1 | note:Cb3 ]", + "[ 2/1 → 33/16 | note:Eb4 ]", + "[ 33/16 → 17/8 | note:Eb4 ]", + "[ 17/8 → 35/16 | note:Eb4 ]", + "[ 35/16 → 9/4 | note:Eb4 ]", + "[ 9/4 → 37/16 | note:Eb4 ]", + "[ 37/16 → 19/8 | note:Eb4 ]", + "[ 19/8 → 39/16 | note:Eb4 ]", + "[ 39/16 → 5/2 | note:Eb4 ]", + "[ 5/2 → 41/16 | note:Eb4 ]", + "[ 41/16 → 21/8 | note:Eb4 ]", + "[ 21/8 → 43/16 | note:Eb4 ]", + "[ 43/16 → 11/4 | note:Eb4 ]", + "[ 11/4 → 45/16 | note:Eb4 ]", + "[ 45/16 → 23/8 | note:Eb4 ]", + "[ 23/8 → 47/16 | note:Eb4 ]", + "[ 47/16 → 3/1 | note:Eb4 ]", + "[ 3/1 → 49/16 | note:Db2 ]", + "[ 49/16 → 25/8 | note:Db2 ]", + "[ 25/8 → 51/16 | note:Db2 ]", + "[ 51/16 → 13/4 | note:Db2 ]", + "[ 13/4 → 53/16 | note:Db2 ]", + "[ 53/16 → 27/8 | note:Db2 ]", + "[ 27/8 → 55/16 | note:Db2 ]", + "[ 55/16 → 7/2 | note:Db2 ]", + "[ 7/2 → 57/16 | note:Db2 ]", + "[ 57/16 → 29/8 | note:Db2 ]", + "[ 29/8 → 59/16 | note:Db2 ]", + "[ 59/16 → 15/4 | note:Db2 ]", + "[ 15/4 → 61/16 | note:Db2 ]", + "[ 61/16 → 31/8 | note:Db2 ]", + "[ 31/8 → 63/16 | note:Db2 ]", + "[ 63/16 → 4/1 | note:Db2 ]", ] `; @@ -9392,46 +9406,46 @@ exports[`runs examples > example "scope" example index 0 1`] = ` exports[`runs examples > example "scramble" example index 0 1`] = ` [ - "[ 0/1 → 1/4 | note:d s:piano ]", - "[ 1/4 → 1/2 | note:c s:piano ]", + "[ 0/1 → 1/4 | note:c s:piano ]", + "[ 1/4 → 1/2 | note:d s:piano ]", "[ 1/2 → 3/4 | note:d s:piano ]", - "[ 3/4 → 1/1 | note:d s:piano ]", - "[ 1/1 → 5/4 | note:c s:piano ]", - "[ 5/4 → 3/2 | note:f s:piano ]", - "[ 3/2 → 7/4 | note:c s:piano ]", - "[ 7/4 → 2/1 | note:d s:piano ]", - "[ 2/1 → 9/4 | note:e s:piano ]", - "[ 9/4 → 5/2 | note:c s:piano ]", - "[ 5/2 → 11/4 | note:e s:piano ]", - "[ 11/4 → 3/1 | note:d s:piano ]", - "[ 3/1 → 13/4 | note:e s:piano ]", + "[ 3/4 → 1/1 | note:c s:piano ]", + "[ 1/1 → 5/4 | note:e s:piano ]", + "[ 5/4 → 3/2 | note:e s:piano ]", + "[ 3/2 → 7/4 | note:e s:piano ]", + "[ 7/4 → 2/1 | note:c s:piano ]", + "[ 2/1 → 9/4 | note:f s:piano ]", + "[ 9/4 → 5/2 | note:d s:piano ]", + "[ 5/2 → 11/4 | note:d s:piano ]", + "[ 11/4 → 3/1 | note:e s:piano ]", + "[ 3/1 → 13/4 | note:c s:piano ]", "[ 13/4 → 7/2 | note:f s:piano ]", - "[ 7/2 → 15/4 | note:c s:piano ]", - "[ 15/4 → 4/1 | note:e s:piano ]", + "[ 7/2 → 15/4 | note:d s:piano ]", + "[ 15/4 → 4/1 | note:f s:piano ]", ] `; exports[`runs examples > example "scramble" example index 1 1`] = ` [ - "[ 0/1 → 1/8 | note:d s:piano ]", - "[ 1/8 → 1/4 | note:c s:piano ]", + "[ 0/1 → 1/8 | note:c s:piano ]", + "[ 1/8 → 1/4 | note:d s:piano ]", "[ 1/4 → 3/8 | note:d s:piano ]", - "[ 3/8 → 1/2 | note:d s:piano ]", + "[ 3/8 → 1/2 | note:c s:piano ]", "[ 1/2 → 1/1 | note:g s:piano ]", - "[ 1/1 → 9/8 | note:c s:piano ]", - "[ 9/8 → 5/4 | note:f s:piano ]", - "[ 5/4 → 11/8 | note:c s:piano ]", - "[ 11/8 → 3/2 | note:d s:piano ]", + "[ 1/1 → 9/8 | note:e s:piano ]", + "[ 9/8 → 5/4 | note:e s:piano ]", + "[ 5/4 → 11/8 | note:e s:piano ]", + "[ 11/8 → 3/2 | note:c s:piano ]", "[ 3/2 → 2/1 | note:g s:piano ]", - "[ 2/1 → 17/8 | note:e s:piano ]", - "[ 17/8 → 9/4 | note:c s:piano ]", - "[ 9/4 → 19/8 | note:e s:piano ]", - "[ 19/8 → 5/2 | note:d s:piano ]", + "[ 2/1 → 17/8 | note:f s:piano ]", + "[ 17/8 → 9/4 | note:d s:piano ]", + "[ 9/4 → 19/8 | note:d s:piano ]", + "[ 19/8 → 5/2 | note:e s:piano ]", "[ 5/2 → 3/1 | note:g s:piano ]", - "[ 3/1 → 25/8 | note:e s:piano ]", + "[ 3/1 → 25/8 | note:c s:piano ]", "[ 25/8 → 13/4 | note:f s:piano ]", - "[ 13/4 → 27/8 | note:c s:piano ]", - "[ 27/8 → 7/2 | note:e s:piano ]", + "[ 13/4 → 27/8 | note:d s:piano ]", + "[ 27/8 → 7/2 | note:f s:piano ]", "[ 7/2 → 4/1 | note:g s:piano ]", ] `; @@ -9484,18 +9498,13 @@ exports[`runs examples > example "scrub" example index 1 1`] = ` exports[`runs examples > example "seed" example index 0 1`] = ` [ + "[ 0/1 → 1/4 | s:bd ]", "[ 1/4 → 1/2 | s:bd ]", "[ 1/2 → 3/4 | s:bd ]", - "[ 3/4 → 1/1 | s:bd ]", "[ 1/1 → 5/4 | s:bd ]", - "[ 5/4 → 3/2 | s:bd ]", - "[ 3/2 → 7/4 | s:bd ]", "[ 7/4 → 2/1 | s:bd ]", - "[ 2/1 → 9/4 | s:bd ]", + "[ 9/4 → 5/2 | s:bd ]", "[ 11/4 → 3/1 | s:bd ]", - "[ 3/1 → 13/4 | s:bd ]", - "[ 13/4 → 7/2 | s:bd ]", - "[ 7/2 → 15/4 | s:bd ]", ] `; @@ -9705,38 +9714,38 @@ exports[`runs examples > example "setGainCurve" example index 0 1`] = ` exports[`runs examples > example "setMaxPolyphony" example index 0 1`] = ` [ - "[ 0/1 → 1/8 | note:E4 room:1 release:4 gain:0.5 ]", - "[ 1/8 → 1/4 | note:D#5 room:1 release:4 gain:0.5 ]", - "[ 1/4 → 3/8 | note:F#3 room:1 release:4 gain:0.5 ]", - "[ 3/8 → 1/2 | note:B5 room:1 release:4 gain:0.5 ]", - "[ 1/2 → 5/8 | note:C#4 room:1 release:4 gain:0.5 ]", - "[ 5/8 → 3/4 | note:E5 room:1 release:4 gain:0.5 ]", - "[ 3/4 → 7/8 | note:B3 room:1 release:4 gain:0.5 ]", - "[ 7/8 → 1/1 | note:C#6 room:1 release:4 gain:0.5 ]", - "[ 1/1 → 9/8 | note:E3 room:1 release:4 gain:0.5 ]", - "[ 9/8 → 5/4 | note:D#3 room:1 release:4 gain:0.5 ]", - "[ 5/4 → 11/8 | note:D#6 room:1 release:4 gain:0.5 ]", - "[ 11/8 → 3/2 | note:D#3 room:1 release:4 gain:0.5 ]", - "[ 3/2 → 13/8 | note:F#3 room:1 release:4 gain:0.5 ]", - "[ 13/8 → 7/4 | note:D#5 room:1 release:4 gain:0.5 ]", - "[ 7/4 → 15/8 | note:D#4 room:1 release:4 gain:0.5 ]", - "[ 15/8 → 2/1 | note:D#5 room:1 release:4 gain:0.5 ]", - "[ 2/1 → 17/8 | note:B4 room:1 release:4 gain:0.5 ]", - "[ 17/8 → 9/4 | note:F#4 room:1 release:4 gain:0.5 ]", - "[ 9/4 → 19/8 | note:G#3 room:1 release:4 gain:0.5 ]", + "[ 0/1 → 1/8 | note:C#3 room:1 release:4 gain:0.5 ]", + "[ 1/8 → 1/4 | note:E5 room:1 release:4 gain:0.5 ]", + "[ 1/4 → 3/8 | note:D#4 room:1 release:4 gain:0.5 ]", + "[ 3/8 → 1/2 | note:E4 room:1 release:4 gain:0.5 ]", + "[ 1/2 → 5/8 | note:B3 room:1 release:4 gain:0.5 ]", + "[ 5/8 → 3/4 | note:F#3 room:1 release:4 gain:0.5 ]", + "[ 3/4 → 7/8 | note:G#3 room:1 release:4 gain:0.5 ]", + "[ 7/8 → 1/1 | note:E4 room:1 release:4 gain:0.5 ]", + "[ 1/1 → 9/8 | note:A4 room:1 release:4 gain:0.5 ]", + "[ 9/8 → 5/4 | note:E5 room:1 release:4 gain:0.5 ]", + "[ 5/4 → 11/8 | note:F#5 room:1 release:4 gain:0.5 ]", + "[ 11/8 → 3/2 | note:G#3 room:1 release:4 gain:0.5 ]", + "[ 3/2 → 13/8 | note:C#5 room:1 release:4 gain:0.5 ]", + "[ 13/8 → 7/4 | note:G#4 room:1 release:4 gain:0.5 ]", + "[ 7/4 → 15/8 | note:G#3 room:1 release:4 gain:0.5 ]", + "[ 15/8 → 2/1 | note:C#5 room:1 release:4 gain:0.5 ]", + "[ 2/1 → 17/8 | note:E6 room:1 release:4 gain:0.5 ]", + "[ 17/8 → 9/4 | note:C#6 room:1 release:4 gain:0.5 ]", + "[ 9/4 → 19/8 | note:D#4 room:1 release:4 gain:0.5 ]", "[ 19/8 → 5/2 | note:B5 room:1 release:4 gain:0.5 ]", - "[ 5/2 → 21/8 | note:F#5 room:1 release:4 gain:0.5 ]", - "[ 21/8 → 11/4 | note:D#4 room:1 release:4 gain:0.5 ]", - "[ 11/4 → 23/8 | note:D#4 room:1 release:4 gain:0.5 ]", - "[ 23/8 → 3/1 | note:B5 room:1 release:4 gain:0.5 ]", - "[ 3/1 → 25/8 | note:C#5 room:1 release:4 gain:0.5 ]", - "[ 25/8 → 13/4 | note:B4 room:1 release:4 gain:0.5 ]", - "[ 13/4 → 27/8 | note:D#6 room:1 release:4 gain:0.5 ]", - "[ 27/8 → 7/2 | note:D#3 room:1 release:4 gain:0.5 ]", - "[ 7/2 → 29/8 | note:A3 room:1 release:4 gain:0.5 ]", - "[ 29/8 → 15/4 | note:C#5 room:1 release:4 gain:0.5 ]", - "[ 15/4 → 31/8 | note:B4 room:1 release:4 gain:0.5 ]", - "[ 31/8 → 4/1 | note:F#3 room:1 release:4 gain:0.5 ]", + "[ 5/2 → 21/8 | note:G#4 room:1 release:4 gain:0.5 ]", + "[ 21/8 → 11/4 | note:F#3 room:1 release:4 gain:0.5 ]", + "[ 11/4 → 23/8 | note:D#5 room:1 release:4 gain:0.5 ]", + "[ 23/8 → 3/1 | note:C#3 room:1 release:4 gain:0.5 ]", + "[ 3/1 → 25/8 | note:A3 room:1 release:4 gain:0.5 ]", + "[ 25/8 → 13/4 | note:D#4 room:1 release:4 gain:0.5 ]", + "[ 13/4 → 27/8 | note:E6 room:1 release:4 gain:0.5 ]", + "[ 27/8 → 7/2 | note:E4 room:1 release:4 gain:0.5 ]", + "[ 7/2 → 29/8 | note:E4 room:1 release:4 gain:0.5 ]", + "[ 29/8 → 15/4 | note:D#6 room:1 release:4 gain:0.5 ]", + "[ 15/4 → 31/8 | note:A5 room:1 release:4 gain:0.5 ]", + "[ 31/8 → 4/1 | note:F#5 room:1 release:4 gain:0.5 ]", ] `; @@ -9972,45 +9981,45 @@ exports[`runs examples > example "shrink" example index 3 1`] = ` exports[`runs examples > example "shuffle" example index 0 1`] = ` [ - "[ 0/1 → 1/4 | note:f s:piano ]", + "[ 0/1 → 1/4 | note:e s:piano ]", "[ 1/4 → 1/2 | note:d s:piano ]", - "[ 1/2 → 3/4 | note:c s:piano ]", - "[ 3/4 → 1/1 | note:e s:piano ]", - "[ 1/1 → 5/4 | note:c s:piano ]", - "[ 5/4 → 3/2 | note:f s:piano ]", - "[ 3/2 → 7/4 | note:d s:piano ]", - "[ 7/4 → 2/1 | note:e s:piano ]", - "[ 2/1 → 9/4 | note:e s:piano ]", - "[ 9/4 → 5/2 | note:d s:piano ]", - "[ 5/2 → 11/4 | note:f s:piano ]", - "[ 11/4 → 3/1 | note:c s:piano ]", - "[ 3/1 → 13/4 | note:f s:piano ]", - "[ 13/4 → 7/2 | note:c s:piano ]", - "[ 7/2 → 15/4 | note:e s:piano ]", + "[ 1/2 → 3/4 | note:f s:piano ]", + "[ 3/4 → 1/1 | note:c s:piano ]", + "[ 1/1 → 5/4 | note:e s:piano ]", + "[ 5/4 → 3/2 | note:c s:piano ]", + "[ 3/2 → 7/4 | note:f s:piano ]", + "[ 7/4 → 2/1 | note:d s:piano ]", + "[ 2/1 → 9/4 | note:d s:piano ]", + "[ 9/4 → 5/2 | note:c s:piano ]", + "[ 5/2 → 11/4 | note:e s:piano ]", + "[ 11/4 → 3/1 | note:f s:piano ]", + "[ 3/1 → 13/4 | note:c s:piano ]", + "[ 13/4 → 7/2 | note:e s:piano ]", + "[ 7/2 → 15/4 | note:f s:piano ]", "[ 15/4 → 4/1 | note:d s:piano ]", ] `; exports[`runs examples > example "shuffle" example index 1 1`] = ` [ - "[ 0/1 → 1/8 | note:f s:piano ]", + "[ 0/1 → 1/8 | note:e s:piano ]", "[ 1/8 → 1/4 | note:d s:piano ]", - "[ 1/4 → 3/8 | note:c s:piano ]", - "[ 3/8 → 1/2 | note:e s:piano ]", + "[ 1/4 → 3/8 | note:f s:piano ]", + "[ 3/8 → 1/2 | note:c s:piano ]", "[ 1/2 → 1/1 | note:g s:piano ]", - "[ 1/1 → 9/8 | note:c s:piano ]", - "[ 9/8 → 5/4 | note:f s:piano ]", - "[ 5/4 → 11/8 | note:d s:piano ]", - "[ 11/8 → 3/2 | note:e s:piano ]", + "[ 1/1 → 9/8 | note:e s:piano ]", + "[ 9/8 → 5/4 | note:c s:piano ]", + "[ 5/4 → 11/8 | note:f s:piano ]", + "[ 11/8 → 3/2 | note:d s:piano ]", "[ 3/2 → 2/1 | note:g s:piano ]", - "[ 2/1 → 17/8 | note:e s:piano ]", - "[ 17/8 → 9/4 | note:d s:piano ]", - "[ 9/4 → 19/8 | note:f s:piano ]", - "[ 19/8 → 5/2 | note:c s:piano ]", + "[ 2/1 → 17/8 | note:d s:piano ]", + "[ 17/8 → 9/4 | note:c s:piano ]", + "[ 9/4 → 19/8 | note:e s:piano ]", + "[ 19/8 → 5/2 | note:f s:piano ]", "[ 5/2 → 3/1 | note:g s:piano ]", - "[ 3/1 → 25/8 | note:f s:piano ]", - "[ 25/8 → 13/4 | note:c s:piano ]", - "[ 13/4 → 27/8 | note:e s:piano ]", + "[ 3/1 → 25/8 | note:c s:piano ]", + "[ 25/8 → 13/4 | note:e s:piano ]", + "[ 13/4 → 27/8 | note:f s:piano ]", "[ 27/8 → 7/2 | note:d s:piano ]", "[ 7/2 → 4/1 | note:g s:piano ]", ] @@ -10198,15 +10207,15 @@ exports[`runs examples > example "someCycles" example index 0 1`] = ` "[ 5/8 → 3/4 | s:hh speed:0.5 ]", "[ 3/4 → 7/8 | s:hh speed:0.5 ]", "[ 7/8 → 1/1 | s:hh speed:0.5 ]", - "[ 1/1 → 9/8 | s:hh speed:0.5 ]", - "[ 1/1 → 2/1 | s:bd speed:0.5 ]", - "[ 9/8 → 5/4 | s:hh speed:0.5 ]", - "[ 5/4 → 11/8 | s:hh speed:0.5 ]", - "[ 11/8 → 3/2 | s:hh speed:0.5 ]", - "[ 3/2 → 13/8 | s:hh speed:0.5 ]", - "[ 13/8 → 7/4 | s:hh speed:0.5 ]", - "[ 7/4 → 15/8 | s:hh speed:0.5 ]", - "[ 15/8 → 2/1 | s:hh speed:0.5 ]", + "[ 1/1 → 9/8 | s:hh ]", + "[ 1/1 → 2/1 | s:bd ]", + "[ 9/8 → 5/4 | s:hh ]", + "[ 5/4 → 11/8 | s:hh ]", + "[ 11/8 → 3/2 | s:hh ]", + "[ 3/2 → 13/8 | s:hh ]", + "[ 13/8 → 7/4 | s:hh ]", + "[ 7/4 → 15/8 | s:hh ]", + "[ 15/8 → 2/1 | s:hh ]", "[ 2/1 → 17/8 | s:hh ]", "[ 2/1 → 3/1 | s:bd ]", "[ 17/8 → 9/4 | s:hh ]", @@ -10216,38 +10225,38 @@ exports[`runs examples > example "someCycles" example index 0 1`] = ` "[ 21/8 → 11/4 | s:hh ]", "[ 11/4 → 23/8 | s:hh ]", "[ 23/8 → 3/1 | s:hh ]", - "[ 3/1 → 25/8 | s:hh ]", - "[ 3/1 → 4/1 | s:bd ]", - "[ 25/8 → 13/4 | s:hh ]", - "[ 13/4 → 27/8 | s:hh ]", - "[ 27/8 → 7/2 | s:hh ]", - "[ 7/2 → 29/8 | s:hh ]", - "[ 29/8 → 15/4 | s:hh ]", - "[ 15/4 → 31/8 | s:hh ]", - "[ 31/8 → 4/1 | s:hh ]", + "[ 3/1 → 25/8 | s:hh speed:0.5 ]", + "[ 3/1 → 4/1 | s:bd speed:0.5 ]", + "[ 25/8 → 13/4 | s:hh speed:0.5 ]", + "[ 13/4 → 27/8 | s:hh speed:0.5 ]", + "[ 27/8 → 7/2 | s:hh speed:0.5 ]", + "[ 7/2 → 29/8 | s:hh speed:0.5 ]", + "[ 29/8 → 15/4 | s:hh speed:0.5 ]", + "[ 15/4 → 31/8 | s:hh speed:0.5 ]", + "[ 31/8 → 4/1 | s:hh speed:0.5 ]", ] `; exports[`runs examples > example "someCyclesBy" example index 0 1`] = ` [ - "[ 0/1 → 1/8 | s:hh ]", - "[ 0/1 → 1/1 | s:bd ]", - "[ 1/8 → 1/4 | s:hh ]", - "[ 1/4 → 3/8 | s:hh ]", - "[ 3/8 → 1/2 | s:hh ]", - "[ 1/2 → 5/8 | s:hh ]", - "[ 5/8 → 3/4 | s:hh ]", - "[ 3/4 → 7/8 | s:hh ]", - "[ 7/8 → 1/1 | s:hh ]", - "[ 1/1 → 9/8 | s:hh speed:0.5 ]", - "[ 1/1 → 2/1 | s:bd speed:0.5 ]", - "[ 9/8 → 5/4 | s:hh speed:0.5 ]", - "[ 5/4 → 11/8 | s:hh speed:0.5 ]", - "[ 11/8 → 3/2 | s:hh speed:0.5 ]", - "[ 3/2 → 13/8 | s:hh speed:0.5 ]", - "[ 13/8 → 7/4 | s:hh speed:0.5 ]", - "[ 7/4 → 15/8 | s:hh speed:0.5 ]", - "[ 15/8 → 2/1 | s:hh speed:0.5 ]", + "[ 0/1 → 1/8 | s:hh speed:0.5 ]", + "[ 0/1 → 1/1 | s:bd speed:0.5 ]", + "[ 1/8 → 1/4 | s:hh speed:0.5 ]", + "[ 1/4 → 3/8 | s:hh speed:0.5 ]", + "[ 3/8 → 1/2 | s:hh speed:0.5 ]", + "[ 1/2 → 5/8 | s:hh speed:0.5 ]", + "[ 5/8 → 3/4 | s:hh speed:0.5 ]", + "[ 3/4 → 7/8 | s:hh speed:0.5 ]", + "[ 7/8 → 1/1 | s:hh speed:0.5 ]", + "[ 1/1 → 9/8 | s:hh ]", + "[ 1/1 → 2/1 | s:bd ]", + "[ 9/8 → 5/4 | s:hh ]", + "[ 5/4 → 11/8 | s:hh ]", + "[ 11/8 → 3/2 | s:hh ]", + "[ 3/2 → 13/8 | s:hh ]", + "[ 13/8 → 7/4 | s:hh ]", + "[ 7/4 → 15/8 | s:hh ]", + "[ 15/8 → 2/1 | s:hh ]", "[ 2/1 → 17/8 | s:hh ]", "[ 2/1 → 3/1 | s:bd ]", "[ 17/8 → 9/4 | s:hh ]", @@ -10257,15 +10266,15 @@ exports[`runs examples > example "someCyclesBy" example index 0 1`] = ` "[ 21/8 → 11/4 | s:hh ]", "[ 11/4 → 23/8 | s:hh ]", "[ 23/8 → 3/1 | s:hh ]", - "[ 3/1 → 25/8 | s:hh ]", - "[ 3/1 → 4/1 | s:bd ]", - "[ 25/8 → 13/4 | s:hh ]", - "[ 13/4 → 27/8 | s:hh ]", - "[ 27/8 → 7/2 | s:hh ]", - "[ 7/2 → 29/8 | s:hh ]", - "[ 29/8 → 15/4 | s:hh ]", - "[ 15/4 → 31/8 | s:hh ]", - "[ 31/8 → 4/1 | s:hh ]", + "[ 3/1 → 25/8 | s:hh speed:0.5 ]", + "[ 3/1 → 4/1 | s:bd speed:0.5 ]", + "[ 25/8 → 13/4 | s:hh speed:0.5 ]", + "[ 13/4 → 27/8 | s:hh speed:0.5 ]", + "[ 27/8 → 7/2 | s:hh speed:0.5 ]", + "[ 7/2 → 29/8 | s:hh speed:0.5 ]", + "[ 29/8 → 15/4 | s:hh speed:0.5 ]", + "[ 15/4 → 31/8 | s:hh speed:0.5 ]", + "[ 31/8 → 4/1 | s:hh speed:0.5 ]", ] `; @@ -10274,35 +10283,35 @@ exports[`runs examples > example "sometimes" example index 0 1`] = ` "[ 0/1 → 1/8 | s:hh speed:0.5 ]", "[ 1/8 → 1/4 | s:hh ]", "[ 1/4 → 3/8 | s:hh speed:0.5 ]", - "[ 3/8 → 1/2 | s:hh ]", + "[ 3/8 → 1/2 | s:hh speed:0.5 ]", "[ 1/2 → 5/8 | s:hh speed:0.5 ]", - "[ 5/8 → 3/4 | s:hh ]", + "[ 5/8 → 3/4 | s:hh speed:0.5 ]", "[ 3/4 → 7/8 | s:hh speed:0.5 ]", - "[ 7/8 → 1/1 | s:hh ]", - "[ 1/1 → 9/8 | s:hh speed:0.5 ]", - "[ 9/8 → 5/4 | s:hh speed:0.5 ]", + "[ 7/8 → 1/1 | s:hh speed:0.5 ]", + "[ 1/1 → 9/8 | s:hh ]", + "[ 9/8 → 5/4 | s:hh ]", "[ 5/4 → 11/8 | s:hh ]", "[ 11/8 → 3/2 | s:hh speed:0.5 ]", - "[ 3/2 → 13/8 | s:hh speed:0.5 ]", - "[ 13/8 → 7/4 | s:hh ]", + "[ 3/2 → 13/8 | s:hh ]", + "[ 13/8 → 7/4 | s:hh speed:0.5 ]", "[ 7/4 → 15/8 | s:hh speed:0.5 ]", "[ 15/8 → 2/1 | s:hh ]", "[ 2/1 → 17/8 | s:hh ]", - "[ 17/8 → 9/4 | s:hh speed:0.5 ]", + "[ 17/8 → 9/4 | s:hh ]", "[ 9/4 → 19/8 | s:hh speed:0.5 ]", "[ 19/8 → 5/2 | s:hh ]", - "[ 5/2 → 21/8 | s:hh ]", + "[ 5/2 → 21/8 | s:hh speed:0.5 ]", "[ 21/8 → 11/4 | s:hh speed:0.5 ]", - "[ 11/4 → 23/8 | s:hh speed:0.5 ]", - "[ 23/8 → 3/1 | s:hh ]", - "[ 3/1 → 25/8 | s:hh ]", - "[ 25/8 → 13/4 | s:hh ]", + "[ 11/4 → 23/8 | s:hh ]", + "[ 23/8 → 3/1 | s:hh speed:0.5 ]", + "[ 3/1 → 25/8 | s:hh speed:0.5 ]", + "[ 25/8 → 13/4 | s:hh speed:0.5 ]", "[ 13/4 → 27/8 | s:hh ]", "[ 27/8 → 7/2 | s:hh speed:0.5 ]", "[ 7/2 → 29/8 | s:hh speed:0.5 ]", "[ 29/8 → 15/4 | s:hh ]", "[ 15/4 → 31/8 | s:hh ]", - "[ 31/8 → 4/1 | s:hh speed:0.5 ]", + "[ 31/8 → 4/1 | s:hh ]", ] `; @@ -10313,14 +10322,14 @@ exports[`runs examples > example "sometimesBy" example index 0 1`] = ` "[ 1/4 → 3/8 | s:hh speed:0.5 ]", "[ 3/8 → 1/2 | s:hh ]", "[ 1/2 → 5/8 | s:hh speed:0.5 ]", - "[ 5/8 → 3/4 | s:hh ]", + "[ 5/8 → 3/4 | s:hh speed:0.5 ]", "[ 3/4 → 7/8 | s:hh speed:0.5 ]", - "[ 7/8 → 1/1 | s:hh ]", - "[ 1/1 → 9/8 | s:hh speed:0.5 ]", - "[ 9/8 → 5/4 | s:hh speed:0.5 ]", + "[ 7/8 → 1/1 | s:hh speed:0.5 ]", + "[ 1/1 → 9/8 | s:hh ]", + "[ 9/8 → 5/4 | s:hh ]", "[ 5/4 → 11/8 | s:hh ]", "[ 11/8 → 3/2 | s:hh speed:0.5 ]", - "[ 3/2 → 13/8 | s:hh speed:0.5 ]", + "[ 3/2 → 13/8 | s:hh ]", "[ 13/8 → 7/4 | s:hh ]", "[ 7/4 → 15/8 | s:hh speed:0.5 ]", "[ 15/8 → 2/1 | s:hh ]", @@ -10330,16 +10339,16 @@ exports[`runs examples > example "sometimesBy" example index 0 1`] = ` "[ 19/8 → 5/2 | s:hh ]", "[ 5/2 → 21/8 | s:hh ]", "[ 21/8 → 11/4 | s:hh speed:0.5 ]", - "[ 11/4 → 23/8 | s:hh speed:0.5 ]", - "[ 23/8 → 3/1 | s:hh ]", - "[ 3/1 → 25/8 | s:hh ]", - "[ 25/8 → 13/4 | s:hh ]", + "[ 11/4 → 23/8 | s:hh ]", + "[ 23/8 → 3/1 | s:hh speed:0.5 ]", + "[ 3/1 → 25/8 | s:hh speed:0.5 ]", + "[ 25/8 → 13/4 | s:hh speed:0.5 ]", "[ 13/4 → 27/8 | s:hh ]", - "[ 27/8 → 7/2 | s:hh speed:0.5 ]", - "[ 7/2 → 29/8 | s:hh speed:0.5 ]", + "[ 27/8 → 7/2 | s:hh ]", + "[ 7/2 → 29/8 | s:hh ]", "[ 29/8 → 15/4 | s:hh ]", "[ 15/4 → 31/8 | s:hh ]", - "[ 31/8 → 4/1 | s:hh speed:0.5 ]", + "[ 31/8 → 4/1 | s:hh ]", ] `; @@ -11724,20 +11733,22 @@ exports[`runs examples > example "undegrade" example index 0 1`] = ` [ "[ 0/1 → 1/8 | s:hh ]", "[ 1/4 → 3/8 | s:hh ]", + "[ 3/8 → 1/2 | s:hh ]", "[ 1/2 → 5/8 | s:hh ]", + "[ 5/8 → 3/4 | s:hh ]", "[ 3/4 → 7/8 | s:hh ]", - "[ 1/1 → 9/8 | s:hh ]", - "[ 9/8 → 5/4 | s:hh ]", + "[ 7/8 → 1/1 | s:hh ]", "[ 11/8 → 3/2 | s:hh ]", - "[ 3/2 → 13/8 | s:hh ]", + "[ 13/8 → 7/4 | s:hh ]", "[ 7/4 → 15/8 | s:hh ]", - "[ 17/8 → 9/4 | s:hh ]", "[ 9/4 → 19/8 | s:hh ]", + "[ 5/2 → 21/8 | s:hh ]", "[ 21/8 → 11/4 | s:hh ]", - "[ 11/4 → 23/8 | s:hh ]", + "[ 23/8 → 3/1 | s:hh ]", + "[ 3/1 → 25/8 | s:hh ]", + "[ 25/8 → 13/4 | s:hh ]", "[ 27/8 → 7/2 | s:hh ]", "[ 7/2 → 29/8 | s:hh ]", - "[ 31/8 → 4/1 | s:hh ]", ] `; @@ -11746,42 +11757,42 @@ exports[`runs examples > example "undegrade" example index 1 1`] = ` "[ 0/1 → 1/10 | s:hh pan:1 ]", "[ 1/10 → 1/5 | s:hh pan:1 ]", "[ 1/5 → 3/10 | s:hh pan:0 ]", - "[ 3/10 → 2/5 | s:hh pan:1 ]", + "[ 3/10 → 2/5 | s:hh pan:0 ]", "[ 2/5 → 1/2 | s:hh pan:0 ]", "[ 1/2 → 3/5 | s:hh pan:1 ]", - "[ 3/5 → 7/10 | s:hh pan:1 ]", - "[ 7/10 → 4/5 | s:hh pan:1 ]", + "[ 3/5 → 7/10 | s:hh pan:0 ]", + "[ 7/10 → 4/5 | s:hh pan:0 ]", "[ 4/5 → 9/10 | s:hh pan:1 ]", "[ 9/10 → 1/1 | s:hh pan:0 ]", - "[ 1/1 → 11/10 | s:hh pan:1 ]", - "[ 11/10 → 6/5 | s:hh pan:1 ]", - "[ 6/5 → 13/10 | s:hh pan:0 ]", + "[ 1/1 → 11/10 | s:hh pan:0 ]", + "[ 11/10 → 6/5 | s:hh pan:0 ]", + "[ 6/5 → 13/10 | s:hh pan:1 ]", "[ 13/10 → 7/5 | s:hh pan:1 ]", - "[ 7/5 → 3/2 | s:hh pan:0 ]", - "[ 3/2 → 8/5 | s:hh pan:1 ]", - "[ 8/5 → 17/10 | s:hh pan:0 ]", + "[ 7/5 → 3/2 | s:hh pan:1 ]", + "[ 3/2 → 8/5 | s:hh pan:0 ]", + "[ 8/5 → 17/10 | s:hh pan:1 ]", "[ 17/10 → 9/5 | s:hh pan:1 ]", - "[ 9/5 → 19/10 | s:hh pan:0 ]", + "[ 9/5 → 19/10 | s:hh pan:1 ]", "[ 19/10 → 2/1 | s:hh pan:1 ]", "[ 2/1 → 21/10 | s:hh pan:0 ]", "[ 21/10 → 11/5 | s:hh pan:1 ]", "[ 11/5 → 23/10 | s:hh pan:0 ]", - "[ 23/10 → 12/5 | s:hh pan:1 ]", + "[ 23/10 → 12/5 | s:hh pan:0 ]", "[ 12/5 → 5/2 | s:hh pan:0 ]", - "[ 5/2 → 13/5 | s:hh pan:0 ]", - "[ 13/5 → 27/10 | s:hh pan:0 ]", + "[ 5/2 → 13/5 | s:hh pan:1 ]", + "[ 13/5 → 27/10 | s:hh pan:1 ]", "[ 27/10 → 14/5 | s:hh pan:1 ]", "[ 14/5 → 29/10 | s:hh pan:0 ]", - "[ 29/10 → 3/1 | s:hh pan:0 ]", - "[ 3/1 → 31/10 | s:hh pan:0 ]", + "[ 29/10 → 3/1 | s:hh pan:1 ]", + "[ 3/1 → 31/10 | s:hh pan:1 ]", "[ 31/10 → 16/5 | s:hh pan:1 ]", "[ 16/5 → 33/10 | s:hh pan:1 ]", "[ 33/10 → 17/5 | s:hh pan:0 ]", - "[ 17/5 → 7/2 | s:hh pan:1 ]", + "[ 17/5 → 7/2 | s:hh pan:0 ]", "[ 7/2 → 18/5 | s:hh pan:1 ]", - "[ 18/5 → 37/10 | s:hh pan:1 ]", - "[ 37/10 → 19/5 | s:hh pan:1 ]", - "[ 19/5 → 39/10 | s:hh pan:0 ]", + "[ 18/5 → 37/10 | s:hh pan:0 ]", + "[ 37/10 → 19/5 | s:hh pan:0 ]", + "[ 19/5 → 39/10 | s:hh pan:1 ]", "[ 39/10 → 4/1 | s:hh pan:1 ]", ] `; @@ -11791,36 +11802,36 @@ exports[`runs examples > example "undegradeBy" example index 0 1`] = ` "[ 0/1 → 1/8 | s:hh ]", "[ 1/8 → 1/4 | s:hh ]", "[ 1/4 → 3/8 | s:hh ]", + "[ 3/8 → 1/2 | s:hh ]", "[ 1/2 → 5/8 | s:hh ]", "[ 5/8 → 3/4 | s:hh ]", "[ 3/4 → 7/8 | s:hh ]", + "[ 7/8 → 1/1 | s:hh ]", "[ 1/1 → 9/8 | s:hh ]", "[ 9/8 → 5/4 | s:hh ]", + "[ 5/4 → 11/8 | s:hh ]", "[ 11/8 → 3/2 | s:hh ]", "[ 3/2 → 13/8 | s:hh ]", "[ 13/8 → 7/4 | s:hh ]", "[ 7/4 → 15/8 | s:hh ]", "[ 15/8 → 2/1 | s:hh ]", - "[ 2/1 → 17/8 | s:hh ]", - "[ 17/8 → 9/4 | s:hh ]", "[ 9/4 → 19/8 | s:hh ]", "[ 5/2 → 21/8 | s:hh ]", "[ 21/8 → 11/4 | s:hh ]", "[ 11/4 → 23/8 | s:hh ]", + "[ 23/8 → 3/1 | s:hh ]", "[ 3/1 → 25/8 | s:hh ]", "[ 25/8 → 13/4 | s:hh ]", "[ 27/8 → 7/2 | s:hh ]", "[ 7/2 → 29/8 | s:hh ]", - "[ 29/8 → 15/4 | s:hh ]", - "[ 15/4 → 31/8 | s:hh ]", "[ 31/8 → 4/1 | s:hh ]", ] `; exports[`runs examples > example "undegradeBy" example index 1 1`] = ` [ - "[ 0/1 → 1/10 | s:hh pan:0 ]", - "[ 1/10 → 1/5 | s:hh pan:0 ]", + "[ 0/1 → 1/10 | s:hh pan:1 ]", + "[ 1/10 → 1/5 | s:hh pan:1 ]", "[ 1/5 → 3/10 | s:hh pan:0 ]", "[ 3/10 → 2/5 | s:hh pan:0 ]", "[ 2/5 → 1/2 | s:hh pan:0 ]", @@ -11829,18 +11840,18 @@ exports[`runs examples > example "undegradeBy" example index 1 1`] = ` "[ 7/10 → 4/5 | s:hh pan:0 ]", "[ 4/5 → 9/10 | s:hh pan:0 ]", "[ 9/10 → 1/1 | s:hh pan:0 ]", - "[ 1/1 → 11/10 | s:hh pan:1 ]", + "[ 1/1 → 11/10 | s:hh pan:0 ]", "[ 11/10 → 6/5 | s:hh pan:0 ]", "[ 6/5 → 13/10 | s:hh pan:0 ]", - "[ 13/10 → 7/5 | s:hh pan:1 ]", + "[ 13/10 → 7/5 | s:hh pan:0 ]", "[ 7/5 → 3/2 | s:hh pan:0 ]", - "[ 3/2 → 8/5 | s:hh pan:1 ]", + "[ 3/2 → 8/5 | s:hh pan:0 ]", "[ 8/5 → 17/10 | s:hh pan:0 ]", "[ 17/10 → 9/5 | s:hh pan:0 ]", "[ 9/5 → 19/10 | s:hh pan:0 ]", - "[ 19/10 → 2/1 | s:hh pan:0 ]", + "[ 19/10 → 2/1 | s:hh pan:1 ]", "[ 2/1 → 21/10 | s:hh pan:0 ]", - "[ 21/10 → 11/5 | s:hh pan:1 ]", + "[ 21/10 → 11/5 | s:hh pan:0 ]", "[ 11/5 → 23/10 | s:hh pan:0 ]", "[ 23/10 → 12/5 | s:hh pan:0 ]", "[ 12/5 → 5/2 | s:hh pan:0 ]", @@ -11851,14 +11862,14 @@ exports[`runs examples > example "undegradeBy" example index 1 1`] = ` "[ 29/10 → 3/1 | s:hh pan:0 ]", "[ 3/1 → 31/10 | s:hh pan:0 ]", "[ 31/10 → 16/5 | s:hh pan:1 ]", - "[ 16/5 → 33/10 | s:hh pan:0 ]", + "[ 16/5 → 33/10 | s:hh pan:1 ]", "[ 33/10 → 17/5 | s:hh pan:0 ]", "[ 17/5 → 7/2 | s:hh pan:0 ]", "[ 7/2 → 18/5 | s:hh pan:0 ]", "[ 18/5 → 37/10 | s:hh pan:0 ]", "[ 37/10 → 19/5 | s:hh pan:0 ]", - "[ 19/5 → 39/10 | s:hh pan:0 ]", - "[ 39/10 → 4/1 | s:hh pan:1 ]", + "[ 19/5 → 39/10 | s:hh pan:1 ]", + "[ 39/10 → 4/1 | s:hh pan:0 ]", ] `; @@ -11936,7 +11947,7 @@ exports[`runs examples > example "unit" example index 0 1`] = ` ] `; -exports[`runs examples > example "useOldRandom" example index 0 1`] = ` +exports[`runs examples > example "useRNG" example index 0 1`] = ` [ "[ 0/1 → 1/16 | note:D8 ]", "[ 1/16 → 1/8 | note:Bb7 ]", @@ -12163,38 +12174,38 @@ exports[`runs examples > example "vowel" example index 0 1`] = ` exports[`runs examples > example "vowel" example index 1 1`] = ` [ - "[ 0/1 → 1/8 | s:bd vowel:e ]", - "[ 1/8 → 1/4 | s:sd vowel:e ]", - "[ 1/4 → 3/8 | s:mt vowel:e ]", - "[ 3/8 → 1/2 | s:ht vowel:e ]", - "[ 1/2 → 5/8 | s:bd vowel:e ]", - "[ 11/16 → 3/4 | s:cp vowel:e ]", - "[ 3/4 → 7/8 | s:ht vowel:e ]", - "[ 7/8 → 1/1 | s:lt vowel:e ]", - "[ 1/1 → 9/8 | s:bd vowel:a ]", - "[ 9/8 → 5/4 | s:sd vowel:a ]", - "[ 5/4 → 11/8 | s:mt vowel:a ]", - "[ 11/8 → 3/2 | s:ht vowel:a ]", - "[ 3/2 → 13/8 | s:bd vowel:a ]", - "[ 27/16 → 7/4 | s:cp vowel:a ]", - "[ 7/4 → 15/8 | s:ht vowel:a ]", - "[ 15/8 → 2/1 | s:lt vowel:a ]", - "[ 2/1 → 17/8 | s:bd vowel:i ]", - "[ 17/8 → 9/4 | s:sd vowel:i ]", - "[ 9/4 → 19/8 | s:mt vowel:i ]", - "[ 19/8 → 5/2 | s:ht vowel:i ]", - "[ 5/2 → 21/8 | s:bd vowel:i ]", - "[ 43/16 → 11/4 | s:cp vowel:i ]", - "[ 11/4 → 23/8 | s:ht vowel:i ]", - "[ 23/8 → 3/1 | s:lt vowel:i ]", - "[ 3/1 → 25/8 | s:bd vowel:o ]", - "[ 25/8 → 13/4 | s:sd vowel:o ]", - "[ 13/4 → 27/8 | s:mt vowel:o ]", - "[ 27/8 → 7/2 | s:ht vowel:o ]", - "[ 7/2 → 29/8 | s:bd vowel:o ]", - "[ 59/16 → 15/4 | s:cp vowel:o ]", - "[ 15/4 → 31/8 | s:ht vowel:o ]", - "[ 31/8 → 4/1 | s:lt vowel:o ]", + "[ 0/1 → 1/8 | s:bd vowel:a ]", + "[ 1/8 → 1/4 | s:sd vowel:a ]", + "[ 1/4 → 3/8 | s:mt vowel:a ]", + "[ 3/8 → 1/2 | s:ht vowel:a ]", + "[ 1/2 → 5/8 | s:bd vowel:a ]", + "[ 11/16 → 3/4 | s:cp vowel:a ]", + "[ 3/4 → 7/8 | s:ht vowel:a ]", + "[ 7/8 → 1/1 | s:lt vowel:a ]", + "[ 1/1 → 9/8 | s:bd vowel:i ]", + "[ 9/8 → 5/4 | s:sd vowel:i ]", + "[ 5/4 → 11/8 | s:mt vowel:i ]", + "[ 11/8 → 3/2 | s:ht vowel:i ]", + "[ 3/2 → 13/8 | s:bd vowel:i ]", + "[ 27/16 → 7/4 | s:cp vowel:i ]", + "[ 7/4 → 15/8 | s:ht vowel:i ]", + "[ 15/8 → 2/1 | s:lt vowel:i ]", + "[ 2/1 → 17/8 | s:bd vowel:u ]", + "[ 17/8 → 9/4 | s:sd vowel:u ]", + "[ 9/4 → 19/8 | s:mt vowel:u ]", + "[ 19/8 → 5/2 | s:ht vowel:u ]", + "[ 5/2 → 21/8 | s:bd vowel:u ]", + "[ 43/16 → 11/4 | s:cp vowel:u ]", + "[ 11/4 → 23/8 | s:ht vowel:u ]", + "[ 23/8 → 3/1 | s:lt vowel:u ]", + "[ 3/1 → 25/8 | s:bd vowel:e ]", + "[ 25/8 → 13/4 | s:sd vowel:e ]", + "[ 13/4 → 27/8 | s:mt vowel:e ]", + "[ 27/8 → 7/2 | s:ht vowel:e ]", + "[ 7/2 → 29/8 | s:bd vowel:e ]", + "[ 59/16 → 15/4 | s:cp vowel:e ]", + "[ 15/4 → 31/8 | s:ht vowel:e ]", + "[ 31/8 → 4/1 | s:lt vowel:e ]", ] `; @@ -12316,16 +12327,16 @@ exports[`runs examples > example "wchoose" example index 0 1`] = ` "[ 7/5 → 8/5 | note:g2 s:sine ]", "[ 8/5 → 9/5 | note:d2 s:sine ]", "[ 9/5 → 2/1 | note:f1 s:sine ]", - "[ 2/1 → 11/5 | note:c2 s:sine ]", - "[ 11/5 → 12/5 | note:g2 s:bd n:6 ]", - "[ 12/5 → 13/5 | note:g2 s:sine ]", + "[ 2/1 → 11/5 | note:c2 s:bd n:6 ]", + "[ 11/5 → 12/5 | note:g2 s:sine ]", + "[ 12/5 → 13/5 | note:g2 s:bd n:6 ]", "[ 13/5 → 14/5 | note:d2 s:sine ]", "[ 14/5 → 3/1 | note:f1 s:sine ]", "[ 3/1 → 16/5 | note:c2 s:sine ]", "[ 16/5 → 17/5 | note:g2 s:sine ]", "[ 17/5 → 18/5 | note:g2 s:sine ]", "[ 18/5 → 19/5 | note:d2 s:sine ]", - "[ 19/5 → 4/1 | note:f1 s:bd n:6 ]", + "[ 19/5 → 4/1 | note:f1 s:sine ]", ] `; @@ -12333,33 +12344,33 @@ exports[`runs examples > example "wchooseCycles" example index 0 1`] = ` [ "[ 0/1 → 1/8 | s:bd ]", "[ 1/8 → 1/4 | s:bd ]", - "[ 1/4 → 3/8 | s:bd ]", + "[ 1/4 → 3/8 | s:sd ]", "[ 3/8 → 1/2 | s:bd ]", "[ 1/2 → 5/8 | s:bd ]", - "[ 5/8 → 3/4 | s:hh ]", + "[ 5/8 → 3/4 | s:bd ]", "[ 3/4 → 7/8 | s:bd ]", "[ 7/8 → 1/1 | s:bd ]", - "[ 1/1 → 9/8 | s:bd ]", + "[ 1/1 → 9/8 | s:hh ]", "[ 9/8 → 5/4 | s:bd ]", "[ 5/4 → 11/8 | s:bd ]", - "[ 11/8 → 3/2 | s:sd ]", + "[ 11/8 → 3/2 | s:bd ]", "[ 3/2 → 13/8 | s:bd ]", - "[ 13/8 → 7/4 | s:bd ]", + "[ 13/8 → 7/4 | s:sd ]", "[ 7/4 → 15/8 | s:bd ]", "[ 15/8 → 2/1 | s:bd ]", "[ 2/1 → 17/8 | s:bd ]", - "[ 17/8 → 9/4 | s:hh ]", - "[ 9/4 → 19/8 | s:hh ]", - "[ 19/8 → 5/2 | s:hh ]", + "[ 17/8 → 9/4 | s:bd ]", + "[ 9/4 → 19/8 | s:bd ]", + "[ 19/8 → 5/2 | s:bd ]", "[ 5/2 → 21/8 | s:bd ]", "[ 21/8 → 11/4 | s:bd ]", - "[ 11/4 → 23/8 | s:hh ]", - "[ 23/8 → 3/1 | s:sd ]", + "[ 11/4 → 23/8 | s:sd ]", + "[ 23/8 → 3/1 | s:bd ]", "[ 3/1 → 25/8 | s:bd ]", - "[ 25/8 → 13/4 | s:hh ]", + "[ 25/8 → 13/4 | s:bd ]", "[ 13/4 → 27/8 | s:bd ]", "[ 27/8 → 7/2 | s:bd ]", - "[ 7/2 → 29/8 | s:sd ]", + "[ 7/2 → 29/8 | s:bd ]", "[ 29/8 → 15/4 | s:bd ]", "[ 15/4 → 31/8 | s:bd ]", "[ 31/8 → 4/1 | s:bd ]", @@ -12374,45 +12385,45 @@ exports[`runs examples > example "wchooseCycles" example index 1 1`] = ` "[ 1/4 → 1/3 | s:bd ]", "[ 1/3 → 5/12 | s:bd ]", "[ 5/12 → 1/2 | s:bd ]", - "[ 1/2 → 7/12 | s:hh ]", - "[ 7/12 → 2/3 | s:hh ]", - "[ 2/3 → 3/4 | s:hh ]", - "[ 3/4 → 5/6 | s:hh ]", - "[ 5/6 → 11/12 | s:hh ]", - "[ 11/12 → 1/1 | s:hh ]", + "[ 1/2 → 7/12 | s:sd ]", + "[ 7/12 → 2/3 | s:sd ]", + "[ 2/3 → 3/4 | s:sd ]", + "[ 3/4 → 5/6 | s:bd ]", + "[ 5/6 → 11/12 | s:bd ]", + "[ 11/12 → 1/1 | s:bd ]", "[ 1/1 → 13/12 | s:bd ]", "[ 13/12 → 7/6 | s:bd ]", "[ 7/6 → 5/4 | s:bd ]", - "[ 5/4 → 4/3 | s:hh ]", - "[ 4/3 → 17/12 | s:hh ]", - "[ 17/12 → 3/2 | s:hh ]", - "[ 3/2 → 19/12 | s:bd ]", - "[ 19/12 → 5/3 | s:bd ]", - "[ 5/3 → 7/4 | s:bd ]", - "[ 7/4 → 11/6 | s:hh ]", - "[ 11/6 → 23/12 | s:hh ]", - "[ 23/12 → 2/1 | s:hh ]", + "[ 5/4 → 4/3 | s:bd ]", + "[ 4/3 → 17/12 | s:bd ]", + "[ 17/12 → 3/2 | s:bd ]", + "[ 3/2 → 19/12 | s:hh ]", + "[ 19/12 → 5/3 | s:hh ]", + "[ 5/3 → 7/4 | s:hh ]", + "[ 7/4 → 11/6 | s:bd ]", + "[ 11/6 → 23/12 | s:bd ]", + "[ 23/12 → 2/1 | s:bd ]", "[ 2/1 → 25/12 | s:hh ]", "[ 25/12 → 13/6 | s:hh ]", "[ 13/6 → 9/4 | s:hh ]", "[ 9/4 → 7/3 | s:hh ]", "[ 7/3 → 29/12 | s:hh ]", "[ 29/12 → 5/2 | s:hh ]", - "[ 5/2 → 31/12 | s:hh ]", - "[ 31/12 → 8/3 | s:hh ]", - "[ 8/3 → 11/4 | s:hh ]", - "[ 11/4 → 17/6 | s:sd ]", - "[ 17/6 → 35/12 | s:sd ]", - "[ 35/12 → 3/1 | s:sd ]", - "[ 3/1 → 37/12 | s:hh ]", - "[ 37/12 → 19/6 | s:hh ]", - "[ 19/6 → 13/4 | s:hh ]", - "[ 13/4 → 10/3 | s:bd ]", - "[ 10/3 → 41/12 | s:bd ]", - "[ 41/12 → 7/2 | s:bd ]", - "[ 7/2 → 43/12 | s:bd ]", - "[ 43/12 → 11/3 | s:bd ]", - "[ 11/3 → 15/4 | s:bd ]", + "[ 5/2 → 31/12 | s:bd ]", + "[ 31/12 → 8/3 | s:bd ]", + "[ 8/3 → 11/4 | s:bd ]", + "[ 11/4 → 17/6 | s:bd ]", + "[ 17/6 → 35/12 | s:bd ]", + "[ 35/12 → 3/1 | s:bd ]", + "[ 3/1 → 37/12 | s:bd ]", + "[ 37/12 → 19/6 | s:bd ]", + "[ 19/6 → 13/4 | s:bd ]", + "[ 13/4 → 10/3 | s:sd ]", + "[ 10/3 → 41/12 | s:sd ]", + "[ 41/12 → 7/2 | s:sd ]", + "[ 7/2 → 43/12 | s:hh ]", + "[ 43/12 → 11/3 | s:hh ]", + "[ 11/3 → 15/4 | s:hh ]", "[ 15/4 → 23/6 | s:bd ]", "[ 23/6 → 47/12 | s:bd ]", "[ 47/12 → 4/1 | s:bd ]", @@ -12427,9 +12438,9 @@ exports[`runs examples > example "wchooseCycles" example index 2 1`] = ` "[ 1/4 → 1/3 | s:hh ]", "[ 1/3 → 5/12 | s:hh ]", "[ 5/12 → 1/2 | s:hh ]", - "[ 1/2 → 17/32 | s:bd ]", - "[ 19/32 → 5/8 | s:bd ]", - "[ 11/16 → 23/32 | s:bd ]", + "[ 1/2 → 7/12 | s:hh ]", + "[ 7/12 → 2/3 | s:hh ]", + "[ 2/3 → 3/4 | s:hh ]", "[ 3/4 → 5/6 | s:hh ]", "[ 5/6 → 11/12 | s:hh ]", "[ 11/12 → 1/1 | s:hh ]", @@ -12445,27 +12456,27 @@ exports[`runs examples > example "wchooseCycles" example index 2 1`] = ` "[ 7/4 → 11/6 | s:hh ]", "[ 11/6 → 23/12 | s:hh ]", "[ 23/12 → 2/1 | s:hh ]", - "[ 2/1 → 65/32 | s:bd ]", - "[ 67/32 → 17/8 | s:bd ]", - "[ 35/16 → 71/32 | s:bd ]", + "[ 2/1 → 25/12 | s:hh ]", + "[ 25/12 → 13/6 | s:hh ]", + "[ 13/6 → 9/4 | s:hh ]", "[ 9/4 → 7/3 | s:hh ]", "[ 7/3 → 29/12 | s:hh ]", "[ 29/12 → 5/2 | s:hh ]", - "[ 5/2 → 31/12 | s:hh ]", - "[ 31/12 → 8/3 | s:hh ]", - "[ 8/3 → 11/4 | s:hh ]", + "[ 5/2 → 81/32 | s:bd ]", + "[ 83/32 → 21/8 | s:bd ]", + "[ 43/16 → 87/32 | s:bd ]", "[ 11/4 → 17/6 | s:hh ]", "[ 17/6 → 35/12 | s:hh ]", "[ 35/12 → 3/1 | s:hh ]", - "[ 3/1 → 37/12 | s:hh ]", - "[ 37/12 → 19/6 | s:hh ]", - "[ 19/6 → 13/4 | s:hh ]", + "[ 3/1 → 97/32 | s:bd ]", + "[ 99/32 → 25/8 | s:bd ]", + "[ 51/16 → 103/32 | s:bd ]", "[ 13/4 → 10/3 | s:hh ]", "[ 10/3 → 41/12 | s:hh ]", "[ 41/12 → 7/2 | s:hh ]", - "[ 7/2 → 113/32 | s:bd ]", - "[ 115/32 → 29/8 | s:bd ]", - "[ 59/16 → 119/32 | s:bd ]", + "[ 7/2 → 43/12 | s:hh ]", + "[ 43/12 → 11/3 | s:hh ]", + "[ 11/3 → 15/4 | s:hh ]", "[ 15/4 → 23/6 | s:hh ]", "[ 23/6 → 47/12 | s:hh ]", "[ 47/12 → 4/1 | s:hh ]", diff --git a/vitest.setup.mjs b/vitest.setup.mjs index bb9d24b07..ea965df6d 100644 --- a/vitest.setup.mjs +++ b/vitest.setup.mjs @@ -1,7 +1,7 @@ import { afterEach } from 'vitest'; -import { useOldRandom } from './packages/core/signal.mjs'; +import { useRNG } from './packages/core/signal.mjs'; afterEach(() => { // Avoid bleed between tests - useOldRandom(false); + useRNG('legacy'); }); diff --git a/website/src/repl/tunes.mjs b/website/src/repl/tunes.mjs index 23efb6062..697e83c9d 100644 --- a/website/src/repl/tunes.mjs +++ b/website/src/repl/tunes.mjs @@ -393,7 +393,7 @@ samples({ bass: { d2: 'https://cdn.freesound.org/previews/608/608286_13074022-lq.mp3' } }) -useOldRandom(true) +useRNG('legacy') stack( // bells @@ -432,7 +432,7 @@ export const festivalOfFingers3 = `// "Festival of fingers 3" // @by Felix Roos setcps(1) -useOldRandom(true) +useRNG('legacy') n("[-7*3],0,2,6,[8 7]") .echoWith( @@ -457,7 +457,7 @@ export const meltingsubmarine = `// "Melting submarine" // @by Felix Roos samples('github:tidalcycles/dirt-samples') -useOldRandom(true) +useRNG('legacy') stack( s("bd:5,[~ ],hh27(3,4,1)") // drums @@ -608,7 +608,7 @@ export const belldub = `// "Belldub" samples({ bell: {b4:'https://cdn.freesound.org/previews/339/339809_5121236-lq.mp3'}}) // "Hand Bells, B, Single.wav" by InspectorJ (www.jshaw.co.uk) of Freesound.org -useOldRandom(true) +useRNG('legacy') stack( // bass @@ -646,7 +646,7 @@ export const dinofunk = `// "Dinofunk" // @by Felix Roos setcps(1) -useOldRandom(true) +useRNG('legacy') samples({bass:'https://cdn.freesound.org/previews/614/614637_2434927-hq.mp3', dino:{b4:'https://cdn.freesound.org/previews/316/316403_5123851-hq.mp3'}}) @@ -675,7 +675,7 @@ export const sampleDemo = `// "Sample demo" // @license CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ // @by Felix Roos -useOldRandom(true) +useRNG('legacy') stack( // percussion @@ -695,7 +695,7 @@ export const holyflute = `// "Holy flute" // @license CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ // @by Felix Roos -useOldRandom(true) +useRNG('legacy') "c3 eb3(3,8) c4/2 g3*2" .superimpose( @@ -712,7 +712,7 @@ export const flatrave = `// "Flatrave" // @license CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ // @by Felix Roos -useOldRandom(true) +useRNG('legacy') stack( s("bd*2,~ [cp,sd]").bank('RolandTR909'), @@ -742,7 +742,7 @@ export const amensister = `// "Amensister" samples('github:tidalcycles/dirt-samples') -useOldRandom(true) +useRNG('legacy') stack( // amen @@ -851,7 +851,7 @@ export const arpoon = `// "Arpoon" // @license CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/ // @by Felix Roos -useOldRandom(true) +useRNG('legacy') samples('github:tidalcycles/dirt-samples') From e0344dbd67c741a4586e0d345bf4cbe85d43d4c6 Mon Sep 17 00:00:00 2001 From: Aria Date: Sat, 13 Dec 2025 17:49:19 -0600 Subject: [PATCH 48/49] Simple seeding for this first iteration --- packages/core/signal.mjs | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/packages/core/signal.mjs b/packages/core/signal.mjs index a56009add..c7e143ae6 100644 --- a/packages/core/signal.mjs +++ b/packages/core/signal.mjs @@ -359,7 +359,7 @@ export const binaryNL = (n, nBits = 16) => { * .partials(randL(8)) */ export const randL = (n) => { - return signal((t) => (nVal) => timeToRands(t, nVal).map(Math.abs)).appLeft(reify(n)); + return signal((t) => (nVal) => getRandsAtTime(t, nVal).map(Math.abs)).appLeft(reify(n)); }; export const randrun = (n) => { @@ -434,19 +434,6 @@ export const withSeed = (func, pat) => { * $: s("bd*4").degrade().seed(1); // Will degrade different events from the hi-hat */ export const seed = register('seed', (n, pat) => { - return withSeed((prev) => (prev !== undefined ? randAt(prev, n) * Number.MAX_SAFE_INTEGER : n), pat); -}); - -/** - * Set the seed for random signals. Differs from `seed` in that `seed` can be used - * multiple times with the final signal depending on all seeds. `setSeed` on the - * other hand overwrites the previous calls to `seed`. - * - * @name setSeed - * @param {number} n An arbitrary number to be used as the new seed. 0 is the same - * as the default random behavior. - */ -export const setSeed = register('setSeed', (n, pat) => { return withSeed(() => n, pat); }); From 34991e9602a3d1f194d99ff45c48a4640edcdaaa Mon Sep 17 00:00:00 2001 From: jeromew Date: Sun, 14 Dec 2025 11:27:41 +0000 Subject: [PATCH 49/49] Fix: wrong warning in build environments --- 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 5abc2bad1..a3ba7df99 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -593,7 +593,7 @@ export const releaseAudioNode = (node) => { // make sure all AudioScheduledSourceNodes are in a stopped state // https://developer.mozilla.org/en-US/docs/Web/API/AudioScheduledSourceNode if (node instanceof AudioScheduledSourceNode) { - if (node.onended && node.onended.name !== 'cleanup') { + if (process.env.NODE_ENV === 'development' && node.onended && node.onended.name !== 'cleanup') { logger( `[superdough] Deprecation warning: it seems your code path is setting 'node.onended = callback' instead of using the onceEnded helper`, );