From 7f103e77e3a28ba325b2c94a12e795b17b6077c7 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Mon, 28 Jul 2025 04:05:21 +0200 Subject: [PATCH 001/312] prefix "S" for solo --- packages/core/repl.mjs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/core/repl.mjs b/packages/core/repl.mjs index 47231af4d..47489054e 100644 --- a/packages/core/repl.mjs +++ b/packages/core/repl.mjs @@ -138,9 +138,9 @@ export function repl({ // allows muting a pattern x with x_ or _x return silence; } - if (id === '$') { + if (id.includes('$')) { // allows adding anonymous patterns with $: - id = `$${anonymousIndex}`; + id = `${id}${anonymousIndex}`; anonymousIndex++; } pPatterns[id] = this; @@ -201,6 +201,13 @@ export function repl({ let { pattern, meta } = await _evaluate(code, transpiler, transpilerOptions); if (Object.keys(pPatterns).length) { let patterns = Object.values(pPatterns); + + // if there are solo patterns, only use those + const soloPatterns = Object.entries(pPatterns).filter(([key]) => key.length > 1 && key.startsWith('S')); + if (soloPatterns.length) { + patterns = Object.values(Object.fromEntries(soloPatterns)); + } + if (eachTransform) { // Explicit lambda so only element (not index and array) are passed patterns = patterns.map((x) => eachTransform(x)); From 058d950121d8ae89656cf21dfd9568a0275585f9 Mon Sep 17 00:00:00 2001 From: Aria Date: Fri, 15 Aug 2025 22:57:59 -0500 Subject: [PATCH 002/312] 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 003/312] 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 4a70ac5a998f5382541c9c999b7f05581b3e8143 Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 20 Aug 2025 00:38:25 -0500 Subject: [PATCH 004/312] Working version of LFOs --- packages/core/controls.mjs | 5 + packages/superdough/superdough.mjs | 146 +++++++++++++++++++++++++---- packages/superdough/synth.mjs | 7 ++ 3 files changed, 141 insertions(+), 17 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index e6181d453..ecb94ea58 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -1430,6 +1430,11 @@ export const { panorient } = registerControl('panorient'); // ['portamento'], // TODO: LFO rate see https://tidalcycles.org/docs/patternlib/tutorials/synthesizers/#supersquare export const { rate } = registerControl('rate'); +export const { lfoTarget } = registerControl('lfoTarget'); +export const { lfoParam } = registerControl('lfoParam'); +export const { lfoNum } = registerControl('lfoNum'); +export const { lfoBipolar } = registerControl('lfoBipolar'); +export const { lfoShape } = registerControl('lfoShape'); // TODO: slide param for certain synths export const { slide } = registerControl('slide'); // TODO: detune? https://tidalcycles.org/docs/patternlib/tutorials/synthesizers/#supersquare diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index eb1466d91..c55cbe0a0 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -510,6 +510,66 @@ export function resetGlobalEffects() { orbits = {}; analysers = {}; analysersData = {}; + lfos = {}; + nodes = {}; +} + +function _getNodeParam(node, name) { + // Worklet case + if (node?.parameters) { + const p = node.parameters.get(name); + if (p instanceof AudioParam) { + return p; + } + } + // Built-in node case + const p = node?.[name]; + if (p instanceof AudioParam) { + return p; + } + return undefined; +} + +function _getNodeParams(node) { + const params = new Set(); + // Worklet case + if (node?.parameters) { + node.parameters.forEach((_v, k) => params.add(k)); + } + // Guesses based on common parameters + ["gain", "frequency", "detune", "Q", "pan", "playbackRate", "delayTime"] + .forEach((k) => { if (node?.[k] instanceof AudioParam) params.add(k); }); + return Array.from(params); +} + +function connectLFO(lfoNum, target, param, frequency, depth, shape, bipolar, start, end) { + debugger; + let lfoNode = lfos[lfoNum]; + const params = { + frequency, + depth, + } + if (lfoNode == null) { + const ac = getAudioContext(); + const dcoffset = bipolar > 0.5 ? -0.5 : 0; + lfoNode = getLfo(ac, start, 1e9, { frequency, depth, shape, dcoffset}); + lfos[lfoNum] = lfoNode; + } + lfoNode.disconnect(); + const targetNodes = nodes[target]; + targetNodes.forEach((targetNode) => { + if (targetNode === undefined) { + const keys = Object.keys(nodes); + errorLogger(new Error(`Could not connect to target ${target} -- it does not exist. Available options are ${keys.join(", ")}`), 'superdough'); + return; + } + const targetParam = _getNodeParam(targetNode, param); + if (targetParam === undefined) { + const parameters = _getNodeParams(targetNode); + errorLogger(new Error(`Could not connect to parameter ${param} on node ${target}. Available parameters are ${parameters.join(", ")}`), 'superdough'); + } + lfoNode.connect(targetParam); + }); } let activeSoundSources = new Map(); @@ -519,6 +579,9 @@ function mapChannelNumbers(channels) { return (Array.isArray(channels) ? channels : [channels]).map((ch) => ch - 1); } +let nodes = {}; +let lfos = {}; + export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) => { // new: t is always expected to be the absolute target onset time const ac = getAudioContext(); @@ -628,6 +691,13 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) compressorKnee, compressorAttack, compressorRelease, + lfo, + lfoNum, + rate, + lfoTarget, + lfoParam, + lfoBipolar, + lfoShape, } = value; delaytime = delaytime ?? cycleToSeconds(delaysync, cps); @@ -681,7 +751,9 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) let sourceNode; if (source) { sourceNode = source(t, value, hapDuration, cps); + nodes['source'] = [sourceNode]; } else if (getSound(s)) { + debugger; const { onTrigger } = getSound(s); const onEnded = () => { audioNodes.forEach((n) => n?.disconnect()); @@ -692,6 +764,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) if (soundHandle) { sourceNode = soundHandle.node; activeSoundSources.set(chainID, soundHandle); + nodes['source'] = [soundHandle.oscillator]; } } else { throw new Error(`sound ${s} not found! Is it loaded?`); @@ -711,12 +784,14 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) stretch !== undefined && chain.push(getWorklet(ac, 'phase-vocoder-processor', { pitchFactor: stretch })); // gain stage - chain.push(gainNode(gain)); + const initialGain = gainNode(gain); + nodes['gain'] = [initialGain]; + chain.push(initialGain); //filter const ftype = getFilterType(value.ftype); if (cutoff !== undefined) { - let lp = () => + const lp = () => createFilter( ac, 'lowpass', @@ -733,14 +808,18 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) ftype, drive, ); - chain.push(lp()); + const lp1 = lp(); + nodes['lpf'] = [lp1]; + chain.push(lp1); if (ftype === '24db') { - chain.push(lp()); + const lp2 = lp(); + nodes['lpf'].push(lp2); + chain.push(lp2); } } if (hcutoff !== undefined) { - let hp = () => + const hp = () => createFilter( ac, 'highpass', @@ -755,31 +834,56 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) end, fanchor, ); - chain.push(hp()); + const hp1 = hp(); + nodes['hpf'] = [hp1]; + chain.push(hp1); if (ftype === '24db') { - chain.push(hp()); + const hp2 = hp(); + nodes['hpf'].push(hp1); + chain.push(hp2); } } if (bandf !== undefined) { let bp = () => createFilter(ac, 'bandpass', bandf, bandq, bpattack, bpdecay, bpsustain, bprelease, bpenv, t, end, fanchor); - chain.push(bp()); + const bp1 = bp(); + nodes['bpf'] = [bp1]; + chain.push(bp1); if (ftype === '24db') { - chain.push(bp()); + const bp2 = bp(); + nodes['bpf'].push(bp2); + chain.push(bp2); } } if (vowel !== undefined) { const vowelFilter = ac.createVowelFilter(vowel); + nodes['vowel'] = vowelFilter; chain.push(vowelFilter); } // effects - coarse !== undefined && chain.push(getWorklet(ac, 'coarse-processor', { coarse })); - crush !== undefined && chain.push(getWorklet(ac, 'crush-processor', { crush })); - shape !== undefined && chain.push(getWorklet(ac, 'shape-processor', { shape, postgain: shapevol })); - distort !== undefined && chain.push(getWorklet(ac, 'distort-processor', { distort, postgain: distortvol })); + if (coarse !== undefined) { + const coarseNode = getWorklet(ac, 'coarse-processor', { coarse }); + nodes['coarse'] = coarseNode; + chain.push(coarseNode); + } + if (crush !== undefined) { + const crushNode = getWorklet(ac, 'crush-processor', { crush }); + nodes['crush'] = crushNode; + chain.push(crushNode); + } + if (shape !== undefined) { + const shapeNode = getWorklet(ac, 'shape-processor', { shape }); + nodes['shape'] = shapeNode; + chain.push(shapeNode); + } + if (distort !== undefined) { + const distortNode = getWorklet(ac, 'distort-processor', { distort }); + nodes['distort'] = distortNode; + chain.push(distortNode); + } if (tremolosync != null) { tremolo = cps * tremolosync; @@ -808,10 +912,11 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) chain.push(amGain); } - compressorThreshold !== undefined && - chain.push( - getCompressor(ac, compressorThreshold, compressorRatio, compressorKnee, compressorAttack, compressorRelease), - ); + if (compressorThreshold !== undefined) { + const compressorNode = getCompressor(ac, compressorThreshold, compressorRatio, compressorKnee, compressorAttack, compressorRelease); + nodes['compressor'] = compressorNode; + chain.push(compressorNode); + } // panning if (pan !== undefined) { @@ -822,17 +927,20 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) // phaser if (phaser !== undefined && phaserdepth > 0) { const phaserFX = getPhaser(t, endWithRelease, phaser, phaserdepth, phasercenter, phasersweep); + nodes['phaser'] = phaserFX; chain.push(phaserFX); } // last gain const post = new GainNode(ac, { gain: postgain }); + nodes['post'] = post; chain.push(post); // delay let delaySend; if (delay > 0 && delaytime > 0 && delayfeedback > 0) { const delayNode = getDelay(orbit, delaytime, delayfeedback, t, orbitChannels); + nodes['delay'] = delayNode; delaySend = effectSend(post, delayNode, delay); audioNodes.push(delaySend); } @@ -851,6 +959,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) roomIR = await loadBuffer(url, ac, ir, 0); } const reverbNode = getReverb(orbit, roomsize, roomfade, roomlp, roomdim, roomIR, orbitChannels); + nodes['room'] = reverbNode; reverbSend = effectSend(post, reverbNode, room); audioNodes.push(reverbSend); } @@ -874,6 +983,9 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) // connect chain elements together chain.slice(1).reduce((last, current) => last.connect(current), chain[0]); audioNodes = audioNodes.concat(chain); + + // finally, now that `nodes` is populated, set up LFOs + connectLFO(lfoNum, lfoTarget, lfoParam, rate, lfo, lfoBipolar, lfoShape, t, endWithRelease); }; export const superdoughTrigger = (t, hap, ct, cps) => { diff --git a/packages/superdough/synth.mjs b/packages/superdough/synth.mjs index 71138ae41..3e1122b56 100644 --- a/packages/superdough/synth.mjs +++ b/packages/superdough/synth.mjs @@ -87,6 +87,7 @@ export function registerSynthSounds() { stop(envEnd); return { node, + oscillator: o, stop: (endTime) => { stop(endTime); }, @@ -156,6 +157,7 @@ export function registerSynthSounds() { return { node, + oscillator: o, stop: (endTime) => { o.stop(endTime); }, @@ -222,6 +224,7 @@ export function registerSynthSounds() { return { node: envGain, + oscillator: o, stop: (time) => { timeoutNode.stop(time); }, @@ -298,6 +301,7 @@ export function registerSynthSounds() { return { node: envGain, + oscillator: o, stop: (time) => { timeoutNode.stop(time); }, @@ -375,6 +379,7 @@ export function registerSynthSounds() { return { node: envGain, + oscillator: o, stop: (time) => { timeoutNode.stop(time); }, @@ -420,6 +425,7 @@ export function registerSynthSounds() { stop(envEnd); return { node, + oscillator: o, stop: (endTime) => { stop(endTime); }, @@ -492,6 +498,7 @@ export function getOscillator(s, t, value) { return { node: noiseMix?.node || o, + oscillator: o, stop: (time) => { fmModulator.stop(time); vibratoOscillator?.stop(time); From efb337677ced73c765f394efe749bb90298a9953 Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 20 Aug 2025 10:08:36 -0500 Subject: [PATCH 005/312] Fully working version with multiple LFOs --- packages/core/controls.mjs | 12 ++- packages/superdough/helpers.mjs | 4 +- packages/superdough/superdough.mjs | 119 ++++++++++++++++++++--------- packages/superdough/synth.mjs | 2 +- packages/superdough/worklets.mjs | 14 ++-- 5 files changed, 103 insertions(+), 48 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index ecb94ea58..83c085d0c 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -1428,13 +1428,17 @@ export const { panorient } = registerControl('panorient'); // ['pitch2'], // ['pitch3'], // ['portamento'], -// TODO: LFO rate see https://tidalcycles.org/docs/patternlib/tutorials/synthesizers/#supersquare -export const { rate } = registerControl('rate'); +export const { lfoNum } = registerControl('lfoNum'); export const { lfoTarget } = registerControl('lfoTarget'); export const { lfoParam } = registerControl('lfoParam'); -export const { lfoNum } = registerControl('lfoNum'); -export const { lfoBipolar } = registerControl('lfoBipolar'); +export const { lfoRate } = registerControl('lfoRate'); +export const { lfoDepth } = registerControl('lfoDepth'); +export const { lfoDCOffset } = registerControl('lfoDCOffset'); export const { lfoShape } = registerControl('lfoShape'); +export const { lfoSkew } = registerControl('lfoSkew'); +export const { lfoCurve } = registerControl('lfoCurve'); +export const { lfoSynced } = registerControl('lfoSynced'); + // TODO: slide param for certain synths export const { slide } = registerControl('slide'); // TODO: detune? https://tidalcycles.org/docs/patternlib/tutorials/synthesizers/#supersquare diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index c09acf1a5..31a8064c3 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -21,7 +21,9 @@ const getSlope = (y1, y2, x1, x2) => { export function getWorklet(ac, processor, params, config) { const node = new AudioWorkletNode(ac, processor, config); Object.entries(params).forEach(([key, value]) => { - node.parameters.get(key).value = value; + if (value !== undefined) { + node.parameters.get(key).value = value; + } }); return node; } diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index c55cbe0a0..67f86cb87 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -345,31 +345,21 @@ function getDelay(orbit, delaytime, delayfeedback, t, channels) { return orbits[orbit].delayNode; } -export function getLfo(audioContext, begin, end, properties = {}) { - const { shape = 0, ...props } = properties; - const { dcoffset = -0.5, depth = 1 } = properties; +export function getLfo(audioContext, properties = {}) { + // Extract some params we need for deriving other params + const { begin, shape = 0, ...props } = properties; const lfoprops = { - frequency: 1, - depth, - skew: 0.5, - phaseoffset: 0, time: begin, - begin, - end, shape: getModulationShapeInput(shape), - dcoffset, - min: dcoffset * depth, - max: dcoffset * depth + depth, - curve: 1, ...props, }; return getWorklet(audioContext, 'lfo-processor', lfoprops); } -function getPhaser(time, end, frequency = 1, depth = 0.5, centerFrequency = 1000, sweep = 2000) { +function getPhaser(begin, end, frequency = 1, depth = 0.5, centerFrequency = 1000, sweep = 2000) { const ac = getAudioContext(); - const lfoGain = getLfo(ac, time, end, { frequency, depth: sweep * 2 }); + const lfoGain = getLfo(ac, { frequency, depth: sweep * 2, begin, end }); //filters const numStages = 2; //num of filters in series @@ -542,34 +532,69 @@ function _getNodeParams(node) { return Array.from(params); } -function connectLFO(lfoNum, target, param, frequency, depth, shape, bipolar, start, end) { - debugger; +function _connectLFO(params) { + const { + frequency = 1, + synced = 0, + cps = 0.5, + lfoNum = 1, // default to LFO 1 + lfoTarget, + lfoParam, + ...filteredParams + } = params; + filteredParams['frequency'] = synced ? frequency / cps : frequency; let lfoNode = lfos[lfoNum]; - const params = { - frequency, - depth, - } if (lfoNode == null) { const ac = getAudioContext(); - const dcoffset = bipolar > 0.5 ? -0.5 : 0; - lfoNode = getLfo(ac, start, 1e9, { frequency, depth, shape, dcoffset}); + lfoNode = getLfo(ac, filteredParams); lfos[lfoNum] = lfoNode; } lfoNode.disconnect(); - const targetNodes = nodes[target]; + const targetNodes = nodes[lfoTarget]; + if (targetNodes === undefined) { + const keys = Object.keys(nodes); + errorLogger(new Error(`Could not connect to target ${lfoTarget} -- it does not exist. Available options are ${keys.join(", ")}`), 'superdough'); + return; + } targetNodes.forEach((targetNode) => { - if (targetNode === undefined) { - const keys = Object.keys(nodes); - errorLogger(new Error(`Could not connect to target ${target} -- it does not exist. Available options are ${keys.join(", ")}`), 'superdough'); - return; - } - const targetParam = _getNodeParam(targetNode, param); + const targetParam = _getNodeParam(targetNode, lfoParam); if (targetParam === undefined) { const parameters = _getNodeParams(targetNode); - errorLogger(new Error(`Could not connect to parameter ${param} on node ${target}. Available parameters are ${parameters.join(", ")}`), 'superdough'); + errorLogger(new Error(`Could not connect to parameter ${lfoParam} on node ${lfoTarget}. Available parameters are ${parameters.join(", ")}`), 'superdough'); } lfoNode.connect(targetParam); }); + const time = filteredParams.begin; + for (const [name, value] of Object.entries(filteredParams)) { + if (value == null) continue; + const p = lfoNode.parameters?.get(name); + if (p.cancelAndHoldAtTime) p.cancelAndHoldAtTime(time); + else p.cancelScheduledValues(time); + p.setValueAtTime(value, time); + } +} + +function connectLFOs(time, params) { + // We break down params specifying multiple LFOs into a set of parameters for + // a single LFO + const numLFOs = [ + [params.lfoNum].flat().length, + [params.lfoTarget].flat().length, + [params.lfoParam].flat().length, + ].reduce((a, v) => Math.max(a, v)); // Number of LFOs is the max as implied by these values + for (let i = 0; i < numLFOs; i++) { + let singleParams = {}; + for (const k in params) { + const v = params[k]; + const flatV = [v].flat(); + if (flatV.length !== numLFOs && flatV.length !== 1) { + errorLogger(new Error(`Could not setup LFOs. We derived ${numLFOs} as the intended number of LFOs, but ${k}: ${flatV} does not have matching length nor length 1`)); + return; + } + singleParams[k] = flatV[i] ?? flatV[0]; + } + _connectLFO(singleParams); + } } let activeSoundSources = new Map(); @@ -691,13 +716,16 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) compressorKnee, compressorAttack, compressorRelease, - lfo, lfoNum, - rate, lfoTarget, lfoParam, - lfoBipolar, + lfoRate, + lfoDepth, + lfoDCOffset, lfoShape, + lfoSkew, + lfoCurve, + lfoSynced, } = value; delaytime = delaytime ?? cycleToSeconds(delaysync, cps); @@ -753,7 +781,6 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) sourceNode = source(t, value, hapDuration, cps); nodes['source'] = [sourceNode]; } else if (getSound(s)) { - debugger; const { onTrigger } = getSound(s); const onEnded = () => { audioNodes.forEach((n) => n?.disconnect()); @@ -896,7 +923,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) const amGain = new GainNode(ac, { gain }); const time = cycle / cps; - const lfo = getLfo(ac, t, endWithRelease, { + const lfo = getLfo(ac, { skew: tremoloskew ?? (tremoloshape != null ? 0.5 : 1), frequency: tremolo, depth: tremolodepth, @@ -907,6 +934,8 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) min: 0, max: 1, curve: 1.5, + begin: t, + end: endWithRelease, }); lfo.connect(amGain.gain); chain.push(amGain); @@ -985,7 +1014,23 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) audioNodes = audioNodes.concat(chain); // finally, now that `nodes` is populated, set up LFOs - connectLFO(lfoNum, lfoTarget, lfoParam, rate, lfo, lfoBipolar, lfoShape, t, endWithRelease); + if (lfoTarget !== undefined && lfoParam !== undefined) { + connectLFOs(t, { + lfoNum, + lfoTarget, + lfoParam, + frequency: lfoRate, + depth: lfoDepth, + dcoffset: lfoDCOffset ?? 0, // override default value of 0.5 + shape: lfoShape, + skew: lfoSkew, + curve: lfoCurve, + persistent: 1, + begin: t, + synced: lfoSynced, + cps: cps, + }); + } }; export const superdoughTrigger = (t, hap, ct, cps) => { diff --git a/packages/superdough/synth.mjs b/packages/superdough/synth.mjs index 3e1122b56..a242bfdf3 100644 --- a/packages/superdough/synth.mjs +++ b/packages/superdough/synth.mjs @@ -360,7 +360,7 @@ export function registerSynthSounds() { getParamADSR(envGain.gain, attack, decay, sustain, release, 0, 1, begin, holdend, 'linear'); let lfo; if (pwsweep != 0) { - lfo = getLfo(ac, begin, end, { frequency: pwrate, depth: pwsweep }); + lfo = getLfo(ac, { frequency: pwrate, depth: pwsweep, begin, end }); lfo.connect(o.parameters.get('pulsewidth')); } let timeoutNode = webAudioTimeout( diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index 2406d56dc..f6d7bbec4 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -108,6 +108,7 @@ class LFOProcessor extends AudioWorkletProcessor { { name: 'dcoffset', defaultValue: 0 }, { name: 'min', defaultValue: 0 }, { name: 'max', defaultValue: 1 }, + { name: 'persistent', defaultValue: 0, min: 0, max: 1 }, // whether to ignore end ]; } @@ -123,9 +124,11 @@ class LFOProcessor extends AudioWorkletProcessor { } } - process(inputs, outputs, parameters) { + process(_inputs, outputs, parameters) { const begin = parameters['begin'][0]; - if (currentTime >= parameters.end[0]) { + const end = parameters['end'][0]; + const persistent = parameters['persistent'][0]; + if ((persistent < 0.5) && currentTime >= end) { return false; } if (currentTime <= begin) { @@ -143,8 +146,9 @@ class LFOProcessor extends AudioWorkletProcessor { const curve = parameters['curve'][0]; const dcoffset = parameters['dcoffset'][0]; - const min = parameters['min'][0]; - const max = parameters['max'][0]; + + const min = dcoffset * depth; + const max = dcoffset * depth + depth; const shape = waveShapeNames[parameters['shape'][0]]; const blockSize = output[0].length ?? 0; @@ -161,7 +165,7 @@ class LFOProcessor extends AudioWorkletProcessor { } this.incrementPhase(dt); } - + return true; } } From e25eab11ad63ff15ebd6651e9f6f00bcad596fd1 Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 20 Aug 2025 10:47:57 -0500 Subject: [PATCH 006/312] Working version of envelopes --- packages/core/controls.mjs | 11 ++++ packages/superdough/superdough.mjs | 100 +++++++++++++++++++++++++++-- 2 files changed, 106 insertions(+), 5 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 83c085d0c..9deede798 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -1439,6 +1439,17 @@ export const { lfoSkew } = registerControl('lfoSkew'); export const { lfoCurve } = registerControl('lfoCurve'); export const { lfoSynced } = registerControl('lfoSynced'); + +export const { envNum } = registerControl('envNum'); +export const { envTarget } = registerControl('envTarget'); +export const { envParam } = registerControl('envParam'); +export const { envAttack } = registerControl('envAttack'); +export const { envDecay } = registerControl('envDecay'); +export const { envSustain } = registerControl('envSustain'); +export const { envRelease } = registerControl('envRelease'); +export const { envCurve } = registerControl('envCurve'); +export const { envDepth } = registerControl('envDepth'); + // TODO: slide param for certain synths export const { slide } = registerControl('slide'); // TODO: detune? https://tidalcycles.org/docs/patternlib/tutorials/synthesizers/#supersquare diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 67f86cb87..e01655cd4 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -9,7 +9,7 @@ import './reverb.mjs'; import './vowel.mjs'; import { clamp, nanFallback, _mod, cycleToSeconds, secondsToCycle } from './util.mjs'; import workletsUrl from './worklets.mjs?audioworklet'; -import { createFilter, gainNode, getCompressor, getWorklet, webAudioTimeout } from './helpers.mjs'; +import { createFilter, gainNode, getCompressor, getWorklet, webAudioTimeout, getADSRValues, getParamADSR } from './helpers.mjs'; import { map } from 'nanostores'; import { logger, errorLogger } from './logger.mjs'; import { loadBuffer } from './sampler.mjs'; @@ -532,6 +532,7 @@ function _getNodeParams(node) { return Array.from(params); } +let lfos = {}; function _connectLFO(params) { const { frequency = 1, @@ -574,7 +575,7 @@ function _connectLFO(params) { } } -function connectLFOs(time, params) { +function connectLFOs(params) { // We break down params specifying multiple LFOs into a set of parameters for // a single LFO const numLFOs = [ @@ -597,6 +598,72 @@ function connectLFOs(time, params) { } } +function _connectEnvelope(params) { + const { + envNum = 1, // default to envelope 1 + envTarget, + envParam, + envDepth, + begin, + end, + attack, + decay, + sustain, + release, + curve, + ...filteredParams + } = params; + const targetNodes = nodes[envTarget]; + if (targetNodes === undefined) { + const keys = Object.keys(nodes); + errorLogger(new Error(`Could not connect to target ${envTarget} -- it does not exist. Available options are ${keys.join(", ")}`), 'superdough'); + return; + } + targetNodes.forEach((targetNode) => { + const targetParam = _getNodeParam(targetNode, envParam); + if (targetParam === undefined) { + const parameters = _getNodeParams(targetNode); + errorLogger(new Error(`Could not connect to parameter ${envParam} on node ${envTarget}. Available parameters are ${parameters.join(", ")}`), 'superdough'); + } + const [att, dec, sus, rel] = getADSRValues( + [ + attack, + decay, + sustain, + release, + ], + curve, + [0.005, 0.14, 0, 0.1] + ); + const min = 0; + const max = envDepth; + getParamADSR(targetParam, att, dec, sus, rel, min, max, begin, end, curve); + }); +} + +function connectEnvelopes(params) { + // We break down params specifying multiple envelopes into a set of parameters for + // a single envelopes + const numEnvelopes = [ + [params.envNum].flat().length, + [params.envTarget].flat().length, + [params.envParam].flat().length, + ].reduce((a, v) => Math.max(a, v)); // Number of envelopes is the max as implied by these values + for (let i = 0; i < numEnvelopes; i++) { + let singleParams = {}; + for (const k in params) { + const v = params[k]; + const flatV = [v].flat(); + if (flatV.length !== numEnvelopes && flatV.length !== 1) { + errorLogger(new Error(`Could not setup envelopes. We derived ${numEnvelopes} as the intended number of envelopes, but ${k}: ${flatV} does not have matching length nor length 1`)); + return; + } + singleParams[k] = flatV[i] ?? flatV[0]; + } + _connectEnvelope(singleParams); + } +} + let activeSoundSources = new Map(); //music programs/audio gear usually increments inputs/outputs from 1, we need to subtract 1 from the input because the webaudio API channels start at 0 @@ -605,7 +672,6 @@ function mapChannelNumbers(channels) { } let nodes = {}; -let lfos = {}; export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) => { // new: t is always expected to be the absolute target onset time @@ -726,6 +792,15 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) lfoSkew, lfoCurve, lfoSynced, + envNum, + envTarget, + envParam, + envAttack, + envDecay, + envSustain, + envRelease, + envCurve, + envDepth, } = value; delaytime = delaytime ?? cycleToSeconds(delaysync, cps); @@ -1013,9 +1088,9 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) chain.slice(1).reduce((last, current) => last.connect(current), chain[0]); audioNodes = audioNodes.concat(chain); - // finally, now that `nodes` is populated, set up LFOs + // finally, now that `nodes` is populated, set up LFOs and envelopes if (lfoTarget !== undefined && lfoParam !== undefined) { - connectLFOs(t, { + connectLFOs({ lfoNum, lfoTarget, lfoParam, @@ -1031,6 +1106,21 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) cps: cps, }); } + if (envTarget !== undefined && envParam !== undefined) { + connectEnvelopes({ + envNum, + envTarget, + envParam, + envDepth, + attack: envAttack, + decay: envDecay, + sustain: envSustain, + release: envRelease, + curve: envCurve, + begin: t, + end: endWithRelease, + }); + } }; export const superdoughTrigger = (t, hap, ct, cps) => { From d8f0d70908705263cb69957a14e6331a79ce3dd8 Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 20 Aug 2025 13:22:37 -0500 Subject: [PATCH 007/312] Big refactor; start envelope at current value --- packages/core/controls.mjs | 2 - packages/superdough/superdough.mjs | 237 ++++++++++++++++------------- 2 files changed, 130 insertions(+), 109 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 9deede798..ddbfe98eb 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -1439,8 +1439,6 @@ export const { lfoSkew } = registerControl('lfoSkew'); export const { lfoCurve } = registerControl('lfoCurve'); export const { lfoSynced } = registerControl('lfoSynced'); - -export const { envNum } = registerControl('envNum'); export const { envTarget } = registerControl('envTarget'); export const { envParam } = registerControl('envParam'); export const { envAttack } = registerControl('envAttack'); diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index e01655cd4..6145b3981 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -532,15 +532,100 @@ function _getNodeParams(node) { return Array.from(params); } +/** + * Split parameters (which might be arrays -- implying multiple-parameter modulation -- or a single number) into independent + * objects which only account for single-parameter modulation + * + * @param {Object} params - Dictionary of modulation parameters. + * @returns {Object[]} - Array of parameter objects, one per parameter modulation + */ +function _splitParams(params, countKeys) { + const num = ["num", "target", "parameter"] // names used to indicate individual parameter modulations + .map((k) => [params[k] ?? 0].flat().length) + .reduce((a, v) => Math.max(a, v), 1); + + const individualParams = []; + for (let i = 0; i < num; i++) { + const paramsI = {}; + for (const k in params) { + const flatV = [params[k]].flat(); + if (flatV.length !== num && flatV.length !== 1) { + errorLogger( + new Error( + `Could not set up modulations. We derived ${num} items, but ${k}: ${JSON.stringify(flatV)} has length ${flatV.length} (needs 1 or ${num}).` + ), + 'superdough' + ); + return []; + } + paramsI[k] = flatV[i] ?? flatV[0]; + } + individualParams.push(paramsI); + } + return individualParams; +} + +/** + * Given a node name and the name of a parameter on that node, attempt to retrieve + * all nodes corresponding to the name and their associated parameters + * + * Note that we say nodes, plural, because some nodes have multiple sub-nodes, like a + * 24db filter which is two filters in series + * + * @param {string} targetName - Name of the node to modulate parameters on (e.g. `lpf`, `source`, etc.) + * @param {string} paramName - Name of the parameter to modulate on that node + * @returns {AudioParam[]} - Array of audio parameter objects for modulation + * + */ +function _getTargetParams(targetName, paramName) { + const targetNodes = nodes[targetName]; + if (!targetNodes) { + const keys = Object.keys(nodes); + errorLogger( + new Error(`Could not connect to target '${targetName}' — it does not exist. Available targets: ${keys.join(", ")}`), + 'superdough' + ); + return []; + } + + const audioParams = []; + targetNodes.forEach((targetNode) => { + const targetParam = _getNodeParam(targetNode, paramName); + if (!targetParam) { + const available = _getNodeParams(targetNode); + errorLogger( + new Error( + `Could not connect to parameter '${paramName}' on '${targetName}'. Available parameters: ${available.join(", ")}` + ), + 'superdough' + ); + return; + } + audioParams.push(targetParam); + }); + return audioParams; +} + +function _setWorkletParamsAtTime(audioParams, params, time) { + for (const [name, value] of params) { + if (value == null) continue; + const p = audioParams.get(name); + if (p.cancelAndHoldAtTime) p.cancelAndHoldAtTime(time); + else p.cancelScheduledValues(time); + p.setValueAtTime(value, time); + } +} + let lfos = {}; function _connectLFO(params) { const { frequency = 1, synced = 0, cps = 0.5, - lfoNum = 1, // default to LFO 1 - lfoTarget, - lfoParam, + num = 1, // default to LFO 1 + target, + param, + begin, ...filteredParams } = params; filteredParams['frequency'] = synced ? frequency / cps : frequency; @@ -548,61 +633,22 @@ function _connectLFO(params) { if (lfoNode == null) { const ac = getAudioContext(); lfoNode = getLfo(ac, filteredParams); - lfos[lfoNum] = lfoNode; + lfos[num] = lfoNode; } - lfoNode.disconnect(); - const targetNodes = nodes[lfoTarget]; - if (targetNodes === undefined) { - const keys = Object.keys(nodes); - errorLogger(new Error(`Could not connect to target ${lfoTarget} -- it does not exist. Available options are ${keys.join(", ")}`), 'superdough'); - return; - } - targetNodes.forEach((targetNode) => { - const targetParam = _getNodeParam(targetNode, lfoParam); - if (targetParam === undefined) { - const parameters = _getNodeParams(targetNode); - errorLogger(new Error(`Could not connect to parameter ${lfoParam} on node ${lfoTarget}. Available parameters are ${parameters.join(", ")}`), 'superdough'); - } - lfoNode.connect(targetParam); - }); - const time = filteredParams.begin; - for (const [name, value] of Object.entries(filteredParams)) { - if (value == null) continue; - const p = lfoNode.parameters?.get(name); - if (p.cancelAndHoldAtTime) p.cancelAndHoldAtTime(time); - else p.cancelScheduledValues(time); - p.setValueAtTime(value, time); - } -} - -function connectLFOs(params) { - // We break down params specifying multiple LFOs into a set of parameters for - // a single LFO - const numLFOs = [ - [params.lfoNum].flat().length, - [params.lfoTarget].flat().length, - [params.lfoParam].flat().length, - ].reduce((a, v) => Math.max(a, v)); // Number of LFOs is the max as implied by these values - for (let i = 0; i < numLFOs; i++) { - let singleParams = {}; - for (const k in params) { - const v = params[k]; - const flatV = [v].flat(); - if (flatV.length !== numLFOs && flatV.length !== 1) { - errorLogger(new Error(`Could not setup LFOs. We derived ${numLFOs} as the intended number of LFOs, but ${k}: ${flatV} does not have matching length nor length 1`)); - return; - } - singleParams[k] = flatV[i] ?? flatV[0]; - } - _connectLFO(singleParams); + try { + lfoNode.disconnect(); + } catch { + // pass } + const targets = _getTargetParams(target, param); + targets.forEach((target) => lfoNode.connect(target)); + _setWorkletParamsAtTime(lfoNode.parameters, Object.entries(filteredParams), begin); } function _connectEnvelope(params) { const { - envNum = 1, // default to envelope 1 - envTarget, - envParam, + target, + param, envDepth, begin, end, @@ -613,54 +659,33 @@ function _connectEnvelope(params) { curve, ...filteredParams } = params; - const targetNodes = nodes[envTarget]; - if (targetNodes === undefined) { - const keys = Object.keys(nodes); - errorLogger(new Error(`Could not connect to target ${envTarget} -- it does not exist. Available options are ${keys.join(", ")}`), 'superdough'); - return; - } - targetNodes.forEach((targetNode) => { - const targetParam = _getNodeParam(targetNode, envParam); - if (targetParam === undefined) { - const parameters = _getNodeParams(targetNode); - errorLogger(new Error(`Could not connect to parameter ${envParam} on node ${envTarget}. Available parameters are ${parameters.join(", ")}`), 'superdough'); - } - const [att, dec, sus, rel] = getADSRValues( - [ - attack, - decay, - sustain, - release, - ], - curve, - [0.005, 0.14, 0, 0.1] - ); - const min = 0; - const max = envDepth; + const targets = _getTargetParams(target, param); + const [att, dec, sus, rel] = getADSRValues( + [ + attack, + decay, + sustain, + release, + ], + curve, + [0.005, 0.14, 0, 0.1] + ); + targets.forEach((targetParam) => { + const currentValue = targetParam.value; + const min = currentValue; + const max = currentValue + envDepth; getParamADSR(targetParam, att, dec, sus, rel, min, max, begin, end, curve); }); } -function connectEnvelopes(params) { - // We break down params specifying multiple envelopes into a set of parameters for - // a single envelopes - const numEnvelopes = [ - [params.envNum].flat().length, - [params.envTarget].flat().length, - [params.envParam].flat().length, - ].reduce((a, v) => Math.max(a, v)); // Number of envelopes is the max as implied by these values - for (let i = 0; i < numEnvelopes; i++) { - let singleParams = {}; - for (const k in params) { - const v = params[k]; - const flatV = [v].flat(); - if (flatV.length !== numEnvelopes && flatV.length !== 1) { - errorLogger(new Error(`Could not setup envelopes. We derived ${numEnvelopes} as the intended number of envelopes, but ${k}: ${flatV} does not have matching length nor length 1`)); - return; - } - singleParams[k] = flatV[i] ?? flatV[0]; - } - _connectEnvelope(singleParams); +function connectModulators(params, modulatorType) { + // We break down params specifying multiple modulators into a set of parameters for + // a single one + const individualParams = _splitParams(params); + if (modulatorType === "lfo") { + individualParams.forEach(_connectLFO); + } else if (modulatorType === "envelope") { + individualParams.forEach(_connectEnvelope); } } @@ -792,7 +817,6 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) lfoSkew, lfoCurve, lfoSynced, - envNum, envTarget, envParam, envAttack, @@ -1090,10 +1114,10 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) // finally, now that `nodes` is populated, set up LFOs and envelopes if (lfoTarget !== undefined && lfoParam !== undefined) { - connectLFOs({ - lfoNum, - lfoTarget, - lfoParam, + connectModulators({ + num: lfoNum, + target: lfoTarget, + param: lfoParam, frequency: lfoRate, depth: lfoDepth, dcoffset: lfoDCOffset ?? 0, // override default value of 0.5 @@ -1104,13 +1128,12 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) begin: t, synced: lfoSynced, cps: cps, - }); + }, "lfo"); } if (envTarget !== undefined && envParam !== undefined) { - connectEnvelopes({ - envNum, - envTarget, - envParam, + connectModulators({ + target: envTarget, + param: envParam, envDepth, attack: envAttack, decay: envDecay, @@ -1119,7 +1142,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) curve: envCurve, begin: t, end: endWithRelease, - }); + }, "envelope"); } }; From 6a9739bed509839b5e6a4d7b9673f2f6853c63a1 Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 20 Aug 2025 13:39:24 -0500 Subject: [PATCH 008/312] Code format and a typo on lfoNum --- packages/superdough/superdough.mjs | 131 +++++++++++++++-------------- packages/superdough/worklets.mjs | 4 +- 2 files changed, 69 insertions(+), 66 deletions(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 6145b3981..97f3900d0 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -9,7 +9,15 @@ import './reverb.mjs'; import './vowel.mjs'; import { clamp, nanFallback, _mod, cycleToSeconds, secondsToCycle } from './util.mjs'; import workletsUrl from './worklets.mjs?audioworklet'; -import { createFilter, gainNode, getCompressor, getWorklet, webAudioTimeout, getADSRValues, getParamADSR } from './helpers.mjs'; +import { + createFilter, + gainNode, + getCompressor, + getWorklet, + webAudioTimeout, + getADSRValues, + getParamADSR, +} from './helpers.mjs'; import { map } from 'nanostores'; import { logger, errorLogger } from './logger.mjs'; import { loadBuffer } from './sampler.mjs'; @@ -527,8 +535,9 @@ function _getNodeParams(node) { node.parameters.forEach((_v, k) => params.add(k)); } // Guesses based on common parameters - ["gain", "frequency", "detune", "Q", "pan", "playbackRate", "delayTime"] - .forEach((k) => { if (node?.[k] instanceof AudioParam) params.add(k); }); + ['gain', 'frequency', 'detune', 'Q', 'pan', 'playbackRate', 'delayTime'].forEach((k) => { + if (node?.[k] instanceof AudioParam) params.add(k); + }); return Array.from(params); } @@ -540,7 +549,7 @@ function _getNodeParams(node) { * @returns {Object[]} - Array of parameter objects, one per parameter modulation */ function _splitParams(params, countKeys) { - const num = ["num", "target", "parameter"] // names used to indicate individual parameter modulations + const num = ['num', 'target', 'parameter'] // names used to indicate individual parameter modulations .map((k) => [params[k] ?? 0].flat().length) .reduce((a, v) => Math.max(a, v), 1); @@ -552,9 +561,9 @@ function _splitParams(params, countKeys) { if (flatV.length !== num && flatV.length !== 1) { errorLogger( new Error( - `Could not set up modulations. We derived ${num} items, but ${k}: ${JSON.stringify(flatV)} has length ${flatV.length} (needs 1 or ${num}).` + `Could not set up modulations. We derived ${num} items, but ${k}: ${JSON.stringify(flatV)} has length ${flatV.length} (needs 1 or ${num}).`, ), - 'superdough' + 'superdough', ); return []; } @@ -582,8 +591,10 @@ function _getTargetParams(targetName, paramName) { if (!targetNodes) { const keys = Object.keys(nodes); errorLogger( - new Error(`Could not connect to target '${targetName}' — it does not exist. Available targets: ${keys.join(", ")}`), - 'superdough' + new Error( + `Could not connect to target '${targetName}' — it does not exist. Available targets: ${keys.join(', ')}`, + ), + 'superdough', ); return []; } @@ -595,9 +606,9 @@ function _getTargetParams(targetName, paramName) { const available = _getNodeParams(targetNode); errorLogger( new Error( - `Could not connect to parameter '${paramName}' on '${targetName}'. Available parameters: ${available.join(", ")}` + `Could not connect to parameter '${paramName}' on '${targetName}'. Available parameters: ${available.join(', ')}`, ), - 'superdough' + 'superdough', ); return; } @@ -629,7 +640,7 @@ function _connectLFO(params) { ...filteredParams } = params; filteredParams['frequency'] = synced ? frequency / cps : frequency; - let lfoNode = lfos[lfoNum]; + let lfoNode = lfos[num]; if (lfoNode == null) { const ac = getAudioContext(); lfoNode = getLfo(ac, filteredParams); @@ -646,30 +657,9 @@ function _connectLFO(params) { } function _connectEnvelope(params) { - const { - target, - param, - envDepth, - begin, - end, - attack, - decay, - sustain, - release, - curve, - ...filteredParams - } = params; + const { target, param, envDepth, begin, end, attack, decay, sustain, release, curve, ...filteredParams } = params; const targets = _getTargetParams(target, param); - const [att, dec, sus, rel] = getADSRValues( - [ - attack, - decay, - sustain, - release, - ], - curve, - [0.005, 0.14, 0, 0.1] - ); + const [att, dec, sus, rel] = getADSRValues([attack, decay, sustain, release], curve, [0.005, 0.14, 0, 0.1]); targets.forEach((targetParam) => { const currentValue = targetParam.value; const min = currentValue; @@ -682,9 +672,9 @@ function connectModulators(params, modulatorType) { // We break down params specifying multiple modulators into a set of parameters for // a single one const individualParams = _splitParams(params); - if (modulatorType === "lfo") { + if (modulatorType === 'lfo') { individualParams.forEach(_connectLFO); - } else if (modulatorType === "envelope") { + } else if (modulatorType === 'envelope') { individualParams.forEach(_connectEnvelope); } } @@ -1041,7 +1031,14 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) } if (compressorThreshold !== undefined) { - const compressorNode = getCompressor(ac, compressorThreshold, compressorRatio, compressorKnee, compressorAttack, compressorRelease); + const compressorNode = getCompressor( + ac, + compressorThreshold, + compressorRatio, + compressorKnee, + compressorAttack, + compressorRelease, + ); nodes['compressor'] = compressorNode; chain.push(compressorNode); } @@ -1114,35 +1111,41 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) // finally, now that `nodes` is populated, set up LFOs and envelopes if (lfoTarget !== undefined && lfoParam !== undefined) { - connectModulators({ - num: lfoNum, - target: lfoTarget, - param: lfoParam, - frequency: lfoRate, - depth: lfoDepth, - dcoffset: lfoDCOffset ?? 0, // override default value of 0.5 - shape: lfoShape, - skew: lfoSkew, - curve: lfoCurve, - persistent: 1, - begin: t, - synced: lfoSynced, - cps: cps, - }, "lfo"); + connectModulators( + { + num: lfoNum, + target: lfoTarget, + param: lfoParam, + frequency: lfoRate, + depth: lfoDepth, + dcoffset: lfoDCOffset ?? 0, // override default value of 0.5 + shape: lfoShape, + skew: lfoSkew, + curve: lfoCurve, + persistent: 1, + begin: t, + synced: lfoSynced, + cps: cps, + }, + 'lfo', + ); } if (envTarget !== undefined && envParam !== undefined) { - connectModulators({ - target: envTarget, - param: envParam, - envDepth, - attack: envAttack, - decay: envDecay, - sustain: envSustain, - release: envRelease, - curve: envCurve, - begin: t, - end: endWithRelease, - }, "envelope"); + connectModulators( + { + target: envTarget, + param: envParam, + envDepth, + attack: envAttack, + decay: envDecay, + sustain: envSustain, + release: envRelease, + curve: envCurve, + begin: t, + end: endWithRelease, + }, + 'envelope', + ); } }; diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index f6d7bbec4..9ab552d48 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -128,7 +128,7 @@ class LFOProcessor extends AudioWorkletProcessor { const begin = parameters['begin'][0]; const end = parameters['end'][0]; const persistent = parameters['persistent'][0]; - if ((persistent < 0.5) && currentTime >= end) { + if (persistent < 0.5 && currentTime >= end) { return false; } if (currentTime <= begin) { @@ -165,7 +165,7 @@ class LFOProcessor extends AudioWorkletProcessor { } this.incrementPhase(dt); } - + return true; } } From 5d5159a08f62c171ab4477ff4aeca87caa5f6ba9 Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 24 Aug 2025 11:56:11 -0500 Subject: [PATCH 009/312] 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 010/312] 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 011/312] 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 012/312] 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 013/312] 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 9c8e39d83d4415cbdaab6960986fa2fe1ec2d569 Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 27 Aug 2025 16:27:36 -0500 Subject: [PATCH 014/312] Add.. a lot of doc strings --- packages/core/controls.mjs | 269 +++++++++++++++++++++++++++++ packages/superdough/superdough.mjs | 2 +- 2 files changed, 270 insertions(+), 1 deletion(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index ddbfe98eb..a078c2b6f 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -1428,24 +1428,293 @@ export const { panorient } = registerControl('panorient'); // ['pitch2'], // ['pitch3'], // ['portamento'], +/** + * Selects which LFO number to use for modulation. Multiple LFOs + * can be applied using the ':' mininotation. There are an arbitrary number + * of LFOs available -- the number is only used to share LFOs across targets + * if desired (and to conserve processing power) + * + * @name lfoNum + * @param {number | Pattern} lfoNum Index of the LFO. + * setup: note("F2").sound("supersaw") + * .lpf(100) + * .lfoDepth(1000) + * .lfoRate(0.25) + * .lfoSynced(1) + * .lfoTarget("lpf") + * .lfoParam("frequency") + * .lfoNum(2) + * + * reuse: note("F3").sound("square").lpf(50) + * .lfoTarget("lpf") + * .lfoParam("frequency") + * .lfoNum(2) // uses the same LFO + */ export const { lfoNum } = registerControl('lfoNum'); + +/** + * Sets the target destination for the LFO modulation. Names are typically related + * to existing controls ("source", "lpf", "vibrato", etc.). You can try a value + * and if it fails, the console will print the available options. + * + * @name lfoTarget + * @param {string | Pattern} lfoTarget Target identifier for modulation. + * note("F2").sound("supersaw") + * .lpf(100) + * .lfoDepth(3000) + * .lfoRate(0.25) + * .lfoSynced(1) + * .lfoTarget("lpf") + * .lfoParam("frequency") + */ export const { lfoTarget } = registerControl('lfoTarget'); + +/** + * Chooses which parameter the LFO will modulate on the target. Parameter values + * are things like "frequency", "Q", "detune", etc. You can try a value + * and if it fails, the console will print the available options. + * + * @name lfoParam + * @param {string | Pattern} lfoParam Parameter name + * note("F2").sound("supersaw") + * .lpf(100) + * .lfoDepth(3000) + * .lfoRate(0.25) + * .lfoSynced(1) + * .lfoTarget("lpf") + * .lfoParam("frequency") + */ export const { lfoParam } = registerControl('lfoParam'); + +/** + * Controls the speed of the LFO. + * + * @name lfoRate + * @param {number | Pattern} lfoRate Frequency or tempo-relative value. + * note("F2").sound("supersaw") + * .lpf(100) + * .lfoTarget("lpf") + * .lfoParam("frequency") + * .lfoDepth(3000) + * .lfoRate(0.25) + */ export const { lfoRate } = registerControl('lfoRate'); + +/** + * Sets the modulation depth of the LFO. + * + * @name lfoDepth + * @param {number | Pattern} lfoDepth Modulation depth amount. + * note("F2").sound("supersaw") + * .lpf(100) + * .lfoTarget("lpf") + * .lfoParam("frequency") + * .lfoSynced(1) + * .lfoDepth(5000) + */ export const { lfoDepth } = registerControl('lfoDepth'); + +/** + * Applies a DC offset to the LFO signal. Normally the LFO varies from + * 0 to 1 (i.e. unipolar). By using an offset of -0.5, one can achieve + * a bipolar LFO. + * + * @name lfoDCOffset + * @param {number | Pattern} lfoDCOffset Offset amount. + * note("F2").sound("supersaw") + * .lpf(2000) + * .lfoTarget("lpf") + * .lfoParam("frequency") + * .lfoDepth(1000) + * .lfoRate(4) + * .lfoSynced(1) + * .lfoDCOffset(-0.5) + */ export const { lfoDCOffset } = registerControl('lfoDCOffset'); + +/** + * Selects the waveform shape of the LFO. Current options are + * triangle, square, sine, saw, ramp (corresponding to 0 through 4, + * respectively). + * + * @name lfoShape + * @param {number | Pattern} lfoShape Waveform type identifier. + * note("F2").sound("supersaw") + * .lpf(100) + * .lfoTarget("lpf") + * .lfoParam("frequency") + * .lfoDepth(1000) + * .lfoRate(4) + * .lfoSynced(1) + * .lfoShape(3) + */ export const { lfoShape } = registerControl('lfoShape'); + +/** + * Skews the LFO waveform. + * + * @name lfoSkew + * @param {number | Pattern} lfoSkew Skew amount (between 0 and 1). + * note("F2").sound("supersaw") + * .lpf(100) + * .lfoTarget("lpf") + * .lfoParam("frequency") + * .lfoDepth(1000) + * .lfoRate(4) + * .lfoSynced(1) + * .lfoSkew(0.75) + */ export const { lfoSkew } = registerControl('lfoSkew'); + +/** + * Adjusts the (exponential) curvature of the LFO waveform. + * + * @name lfoCurve + * @param {number | Pattern} lfoCurve Curve shaping amount. + * note("F2").sound("supersaw") + * .lpf(100) + * .lfoTarget("lpf") + * .lfoParam("frequency") + * .lfoDepth(1000) + * .lfoShape(3).lfoRate(4) + * .lfoSynced(1) + * .lfoCurve(0.95) + */ export const { lfoCurve } = registerControl('lfoCurve'); + +/** + * Determines whether the LFO is tempo-synced. + * + * @name lfoSynced + * @param {number | Pattern} lfoSynced Boolean flag (0 or 1). + * note("F2").sound("supersaw") + * .lpf(100) + * .lfoTarget("lpf") + * .lfoParam("frequency") + * .lfoDepth(1000) + * .lfoShape(3).lfoRate(2) + * .lfoSynced(1) + */ export const { lfoSynced } = registerControl('lfoSynced'); +/** + * Sets the target destination for the envelope modulation. Names are typically related + * to existing controls ("source", "lpf", "vibrato", etc.). You can try a value + * and if it fails, the console will print the available options. + * + * @name envTarget + * @param {number | Pattern} envTarget Target identifier for modulation. + * n(irand(12).seg(8)).scale("F#3:minor").room(1) + * .lpf(100) + * .envDepth("4800:400") + * .envTarget("source:lpf") + * .envParam("detune:frequency") + */ export const { envTarget } = registerControl('envTarget'); + +/** + * Chooses which parameter the LFO will modulate on the target. Parameter values + * are things like "frequency", "Q", "detune", etc. You can try a value + * and if it fails, the console will print the available options. + * + * @name envParam + * @param {number | Pattern} envParam Parameter index or identifier. + * n(irand(12).seg(8)).scale("F#3:minor").room(1) + * .lpf(100) + * .envDepth("4800:400") + * .envTarget("source:lpf") + * .envParam("detune:frequency") + */ export const { envParam } = registerControl('envParam'); + +/** + * Controls the attack time of the envelope. + * + * @name envAttack + * @param {number | Pattern} envAttack Duration of attack phase. + * n(irand(12).seg(8)).scale("F#3:minor").room(1) + * .lpf(500) + * .envDepth("4800:400") + * .envTarget("source:lpf") + * .envParam("detune:frequency") + * .envAttack(0.5) + */ export const { envAttack } = registerControl('envAttack'); + +/** + * Controls the decay time of the envelope. + * + * @name envDecay + * @param {number | Pattern} envDecay Duration of decay phase. + * n(irand(12).seg(8)).scale("F#3:minor").room(1) + * .lpf(100) + * .envDepth("4800:400") + * .envTarget("source:lpf") + * .envParam("detune:frequency") + * .envDecay("0.03:0.15").envCurve("exp:exp") + */ export const { envDecay } = registerControl('envDecay'); + +/** + * Sets the sustain level of the envelope. + * + * @name envSustain + * @param {number | Pattern} envSustain Sustain amplitude level. + * n(irand(12).seg(8)).scale("F#3:minor").room(1) + * .lpf(100) + * .envDepth("4800:400") + * .envTarget("source:lpf") + * .envParam("detune:frequency") + * .envDecay("0.03:0.15").envCurve("exp:exp") + * .envSustain(0.2) + */ export const { envSustain } = registerControl('envSustain'); + +/** + * Controls the release time of the envelope. + * + * @name envRelease + * @param {number | Pattern} envRelease Duration of release phase. + * @example + * n(irand(12).seg(8)).scale("F#3:minor").room(1) + * .lpf(100).release(3) + * .envDepth("4800:400") + * .envTarget("source:lpf") + * .envParam("detune:frequency") + * .envDecay("0.03:0.15").envCurve("exp:exp") + * .envSustain(0.5) + * .envRelease(3) + */ export const { envRelease } = registerControl('envRelease'); + +/** + * Selects the style of envelope: `exp` or `lin` (exponential or linear). + * + * @name envCurve + * @param {string | Pattern} envCurve Envelope curve style. + * @example + * n(irand(12).seg(8)).scale("F#3:minor").room(1) + * .lpf(100).release(2) + * .envTarget("source:lpf") + * .envParam("detune:frequency") + * .envDepth("500:4000") + * .envDecay("0.3:0.15") + * .envCurve("lin:exp") + */ export const { envCurve } = registerControl('envCurve'); + +/** + * Sets the modulation depth of the envelope. + * + * @name envDepth + * @param {number | Pattern} envDepth Modulation depth amount. + * @example + * n(irand(12).seg(8)).scale("F#3:minor").room(1) + * .lpf(100) + * .envTarget("source:lpf") + * .envParam("detune:frequency") + * .envDepth("4800:400") + */ export const { envDepth } = registerControl('envDepth'); // TODO: slide param for certain synths diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 97f3900d0..91a97c17e 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -548,7 +548,7 @@ function _getNodeParams(node) { * @param {Object} params - Dictionary of modulation parameters. * @returns {Object[]} - Array of parameter objects, one per parameter modulation */ -function _splitParams(params, countKeys) { +function _splitParams(params) { const num = ['num', 'target', 'parameter'] // names used to indicate individual parameter modulations .map((k) => [params[k] ?? 0].flat().length) .reduce((a, v) => Math.max(a, v), 1); From 763f900c6978b82b1aef3c38accc6cd6f0cece66 Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 27 Aug 2025 19:19:54 -0500 Subject: [PATCH 015/312] First pass at envelopes with curves --- packages/superdough/worklets.mjs | 94 ++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index 2406d56dc..61a93ce7b 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -907,3 +907,97 @@ class ByteBeatProcessor extends AudioWorkletProcessor { } registerProcessor('byte-beat-processor', ByteBeatProcessor); + +class EnvelopeProcessor extends AudioWorkletProcessor { + static get parameterDescriptors() { + return [ + { name: 'start', defaultValue: 0 }, + { name: 'end', defaultValue: 0 }, + { name: 'attack', defaultValue: 0.005, minValue: 0 }, + { name: 'decay', defaultValue: 0.14, minValue: 0 }, + { name: 'sustain', defaultValue: 0, minValue: 0, maxValue: 1 }, + { name: 'release', defaultValue: 0.1, minValue: 0 }, + { name: 'attackCurve', defaultValue: 0, minValue: -1, maxValue: 1 }, + { name: 'decayCurve', defaultValue: 0, minValue: -1, maxValue: 1 }, + { name: 'releaseCurve', defaultValue: 0, minValue: -1, maxValue: 1 }, + { name: 'peak', defaultValue: 1 }, + { name: 'retrigger', defaultValue: 1, minValue: 0, maxValue: 1 }, + ]; + } + + constructor() { + super(); + this.val = 0; + this.segIdx = 0; + this.state = 0; + this.startTime = 0; + this.endTime = 0; + } + + _shape(u, c) { + if (c === 0) return u; + const k = 4; + if (c > 0) { + const p = 1 + k * c; + return 1 - Math.pow(1 - u, p); + } else { + const p = 1 + k * (-c); + return Math.pow(u, p); + } + } + + _advance(start, target, length, curve) { + if (length <= 1 || start === target) { + this.val = target; + } else { + const u = Math.min(1, this.segIdx / (length - 1)); + const us = this._shape(u, curve); + this.val = start + (target - start) * us; + } + this.segIdx++; + } + + process(_inputs, outputs, params) { + const out = outputs[0][0]; + if (!out) return true; + const start = pv(params.start, 0); + this.endTime = pv(params.end, 0); + const retrig = pv(params.retrig, 0) >= 0.5; // convert to bool + if (start !== this.startTime) { + // triggered + this.startTime = start; + if (this.state === 0 || retrig) { + this.state = 1; + this._resetSegment(this.env, pv(params.peak, 0), pv(params.attack, 0)); + } + } + for (let i = 0; i < out.length; i++) { + const attack = pv(params.attack, i); + const decay = pv(params.decay, i); + const sustain = pv(params.sustain, i); + const release = pv(params.release, i); + const aCurve = pv(params.aCurve, i); + const dCurve = pv(params.dCurve, i); + const rCurve = pv(params.rCurve, i); + const peak = pv(params.peak, i); + const states = [ + { time: Number.POSITIVE_INFINITY, start: 0, target: 0 }, // idle + { time: attack, start: 0, target: peak, curve: aCurve }, + { time: decay, start: peak, target: sustain * peak, curve: dCurve }, + { time: this.endTime - this.startTime - attack - decay }, + { time: release, start: sustain * peak, target: 0, curve: rCurve }, + ] + const {time, start, target, curve} = states[this.state]; + const length = Math.floor(time * sampleRate); + this._advance(start, target, length, curve); + if (this.segIdx >= length) { + this.state = (this.state + 1) % states.length; + } + out[i] = this.val * peak; + } + + return true; + } +} + +registerProcessor('envelope-processor', EnvelopeProcessor); From ea017e762228ca81ca5099e9b72e03a828aafe0c Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 27 Aug 2025 20:11:00 -0500 Subject: [PATCH 016/312] Working version --- packages/superdough/worklets.mjs | 34 ++++++++++++++++---------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index 61a93ce7b..0885f5fe2 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -7,6 +7,7 @@ import FFT from './fft.js'; const clamp = (num, min, max) => Math.min(Math.max(num, min), max); const _mod = (n, m) => ((n % m) + m) % m; +const pv = (arr, idx) => arr[idx] ?? arr[0]; // Restrict phase to the range [0, maxPhase) via wrapping function wrapPhase(phase, maxPhase = 1) { @@ -911,7 +912,7 @@ registerProcessor('byte-beat-processor', ByteBeatProcessor); class EnvelopeProcessor extends AudioWorkletProcessor { static get parameterDescriptors() { return [ - { name: 'start', defaultValue: 0 }, + { name: 'begin', defaultValue: 0 }, { name: 'end', defaultValue: 0 }, { name: 'attack', defaultValue: 0.005, minValue: 0 }, { name: 'decay', defaultValue: 0.14, minValue: 0 }, @@ -930,13 +931,13 @@ class EnvelopeProcessor extends AudioWorkletProcessor { this.val = 0; this.segIdx = 0; this.state = 0; - this.startTime = 0; + this.beginTime = 0; this.endTime = 0; } _shape(u, c) { if (c === 0) return u; - const k = 4; + const k = 8; if (c > 0) { const p = 1 + k * c; return 1 - Math.pow(1 - u, p); @@ -960,38 +961,37 @@ class EnvelopeProcessor extends AudioWorkletProcessor { process(_inputs, outputs, params) { const out = outputs[0][0]; if (!out) return true; - const start = pv(params.start, 0); + const begin = pv(params.begin, 0); this.endTime = pv(params.end, 0); - const retrig = pv(params.retrig, 0) >= 0.5; // convert to bool - if (start !== this.startTime) { + const retrigger = pv(params.retrigger, 0) >= 0.5; // convert to bool + if (begin !== this.beginTime && (this.state === 0 || retrigger)) { // triggered - this.startTime = start; - if (this.state === 0 || retrig) { - this.state = 1; - this._resetSegment(this.env, pv(params.peak, 0), pv(params.attack, 0)); - } + this.beginTime = begin; + this.state = 1; + this.segIdx = 0; } for (let i = 0; i < out.length; i++) { const attack = pv(params.attack, i); const decay = pv(params.decay, i); const sustain = pv(params.sustain, i); const release = pv(params.release, i); - const aCurve = pv(params.aCurve, i); - const dCurve = pv(params.dCurve, i); - const rCurve = pv(params.rCurve, i); + const aCurve = pv(params.attackCurve, i); + const dCurve = pv(params.decayCurve, i); + const rCurve = pv(params.releaseCurve, i); const peak = pv(params.peak, i); const states = [ { time: Number.POSITIVE_INFINITY, start: 0, target: 0 }, // idle { time: attack, start: 0, target: peak, curve: aCurve }, - { time: decay, start: peak, target: sustain * peak, curve: dCurve }, - { time: this.endTime - this.startTime - attack - decay }, - { time: release, start: sustain * peak, target: 0, curve: rCurve }, + { time: decay, start: 1, target: sustain, curve: dCurve }, + { time: this.endTime - this.beginTime - attack - decay, start: sustain, target: sustain }, + { time: release, start: sustain, target: 0, curve: rCurve }, ] const {time, start, target, curve} = states[this.state]; const length = Math.floor(time * sampleRate); this._advance(start, target, length, curve); if (this.segIdx >= length) { this.state = (this.state + 1) % states.length; + this.segIdx = 0; } out[i] = this.val * peak; } From 869141b0a3c0021b84919e5d10bf1a76cf8c36d7 Mon Sep 17 00:00:00 2001 From: Aria Date: Thu, 28 Aug 2025 00:31:37 -0500 Subject: [PATCH 017/312] Parity with old adsr --- packages/superdough/worklets.mjs | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index 0885f5fe2..494bd4dae 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -933,6 +933,7 @@ class EnvelopeProcessor extends AudioWorkletProcessor { this.state = 0; this.beginTime = 0; this.endTime = 0; + this.attackStart = 0; } _shape(u, c) { @@ -947,29 +948,29 @@ class EnvelopeProcessor extends AudioWorkletProcessor { } } - _advance(start, target, length, curve) { - if (length <= 1 || start === target) { + _advance(start, target, time, curve) { + if (time === 0 || start === target) { this.val = target; } else { - const u = Math.min(1, this.segIdx / (length - 1)); + const u = Math.min(1, (currentTime - this.beginTime) / time); const us = this._shape(u, curve); this.val = start + (target - start) * us; } - this.segIdx++; } process(_inputs, outputs, params) { const out = outputs[0][0]; if (!out) return true; const begin = pv(params.begin, 0); - this.endTime = pv(params.end, 0); const retrigger = pv(params.retrigger, 0) >= 0.5; // convert to bool if (begin !== this.beginTime && (this.state === 0 || retrigger)) { // triggered this.beginTime = begin; this.state = 1; - this.segIdx = 0; + this.endTime = pv(params.end, 0); + this.attackStart = this.val; } + const susTime = this.endTime - this.beginTime; for (let i = 0; i < out.length; i++) { const attack = pv(params.attack, i); const decay = pv(params.decay, i); @@ -981,17 +982,16 @@ class EnvelopeProcessor extends AudioWorkletProcessor { const peak = pv(params.peak, i); const states = [ { time: Number.POSITIVE_INFINITY, start: 0, target: 0 }, // idle - { time: attack, start: 0, target: peak, curve: aCurve }, - { time: decay, start: 1, target: sustain, curve: dCurve }, - { time: this.endTime - this.beginTime - attack - decay, start: sustain, target: sustain }, - { time: release, start: sustain, target: 0, curve: rCurve }, + { time: attack, start: this.attackStart, target: 1, curve: aCurve }, + { time: attack + decay, start: 1, target: sustain, curve: dCurve }, + { time: susTime, start: sustain, target: sustain }, + { time: susTime + release, start: sustain, target: 0, curve: rCurve }, ] - const {time, start, target, curve} = states[this.state]; - const length = Math.floor(time * sampleRate); - this._advance(start, target, length, curve); - if (this.segIdx >= length) { + let {time, start, target, curve} = states[this.state]; + this._advance(start, target, time, curve); + while (currentTime - this.beginTime >= time) { this.state = (this.state + 1) % states.length; - this.segIdx = 0; + time = states[this.state].time; } out[i] = this.val * peak; } From 9eeb6da3e60957a67f18f368e2777d35cb2f9887 Mon Sep 17 00:00:00 2001 From: Aria Date: Thu, 28 Aug 2025 14:54:09 -0500 Subject: [PATCH 018/312] Codeformat --- packages/superdough/worklets.mjs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index 494bd4dae..619855e31 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -922,7 +922,7 @@ class EnvelopeProcessor extends AudioWorkletProcessor { { name: 'decayCurve', defaultValue: 0, minValue: -1, maxValue: 1 }, { name: 'releaseCurve', defaultValue: 0, minValue: -1, maxValue: 1 }, { name: 'peak', defaultValue: 1 }, - { name: 'retrigger', defaultValue: 1, minValue: 0, maxValue: 1 }, + { name: 'retrigger', defaultValue: 1, minValue: 0, maxValue: 1 }, ]; } @@ -943,7 +943,7 @@ class EnvelopeProcessor extends AudioWorkletProcessor { const p = 1 + k * c; return 1 - Math.pow(1 - u, p); } else { - const p = 1 + k * (-c); + const p = 1 + k * -c; return Math.pow(u, p); } } @@ -986,8 +986,8 @@ class EnvelopeProcessor extends AudioWorkletProcessor { { time: attack + decay, start: 1, target: sustain, curve: dCurve }, { time: susTime, start: sustain, target: sustain }, { time: susTime + release, start: sustain, target: 0, curve: rCurve }, - ] - let {time, start, target, curve} = states[this.state]; + ]; + let { time, start, target, curve } = states[this.state]; this._advance(start, target, time, curve); while (currentTime - this.beginTime >= time) { this.state = (this.state + 1) % states.length; From e4070b86f8378bdf2f72fe2fa7a4c036a7786e3a Mon Sep 17 00:00:00 2001 From: Aria Date: Fri, 29 Aug 2025 14:33:14 -0500 Subject: [PATCH 019/312] More descriptive variables and comments --- packages/superdough/worklets.mjs | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index 619855e31..6c66d2350 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -936,25 +936,29 @@ class EnvelopeProcessor extends AudioWorkletProcessor { this.attackStart = 0; } - _shape(u, c) { - if (c === 0) return u; - const k = 8; - if (c > 0) { - const p = 1 + k * c; - return 1 - Math.pow(1 - u, p); + _warp(phase, curvature, strength = 8) { + if (phase === 0 || phase === 1) return phase; // fast exit + if (curvature > 0) { + // snappier + const exp = 1 + strength * curvature; + return 1 - Math.pow(1 - phase, exp); } else { - const p = 1 + k * -c; - return Math.pow(u, p); + // more calm + const exp = 1 - strength * curvature; + return Math.pow(phase, exp); } } - _advance(start, target, time, curve) { + _advance(start, target, time, curvature) { if (time === 0 || start === target) { this.val = target; } else { - const u = Math.min(1, (currentTime - this.beginTime) / time); - const us = this._shape(u, curve); - this.val = start + (target - start) * us; + // We compute our progress through this section of the envelope in time + // as a `phase` value, which is warped by the curvature, and then used + // to compute the value of the envelope at that time + const phase = Math.min(1, (currentTime - this.beginTime) / time); + const phaseWarped = this._warp(phase, curvature); + this.val = start + (target - start) * phaseWarped; } } From 862b88b6c405d95a39500b3915a70bb198179b17 Mon Sep 17 00:00:00 2001 From: Aria Date: Thu, 4 Sep 2025 20:27:05 -0500 Subject: [PATCH 020/312] Some typos and cleanup --- packages/superdough/superdough.mjs | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 91a97c17e..f38382e88 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -549,7 +549,7 @@ function _getNodeParams(node) { * @returns {Object[]} - Array of parameter objects, one per parameter modulation */ function _splitParams(params) { - const num = ['num', 'target', 'parameter'] // names used to indicate individual parameter modulations + const num = ['num', 'target', 'param'] // names used to indicate individual parameter modulations .map((k) => [params[k] ?? 0].flat().length) .reduce((a, v) => Math.max(a, v), 1); @@ -646,11 +646,6 @@ function _connectLFO(params) { lfoNode = getLfo(ac, filteredParams); lfos[num] = lfoNode; } - try { - lfoNode.disconnect(); - } catch { - // pass - } const targets = _getTargetParams(target, param); targets.forEach((target) => lfoNode.connect(target)); _setWorkletParamsAtTime(lfoNode.parameters, Object.entries(filteredParams), begin); @@ -975,29 +970,29 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) if (vowel !== undefined) { const vowelFilter = ac.createVowelFilter(vowel); - nodes['vowel'] = vowelFilter; + nodes['vowel'] = [vowelFilter]; chain.push(vowelFilter); } // effects if (coarse !== undefined) { const coarseNode = getWorklet(ac, 'coarse-processor', { coarse }); - nodes['coarse'] = coarseNode; + nodes['coarse'] = [coarseNode]; chain.push(coarseNode); } if (crush !== undefined) { const crushNode = getWorklet(ac, 'crush-processor', { crush }); - nodes['crush'] = crushNode; + nodes['crush'] = [crushNode]; chain.push(crushNode); } if (shape !== undefined) { const shapeNode = getWorklet(ac, 'shape-processor', { shape }); - nodes['shape'] = shapeNode; + nodes['shape'] = [shapeNode]; chain.push(shapeNode); } if (distort !== undefined) { const distortNode = getWorklet(ac, 'distort-processor', { distort }); - nodes['distort'] = distortNode; + nodes['distort'] = [distortNode]; chain.push(distortNode); } @@ -1039,7 +1034,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) compressorAttack, compressorRelease, ); - nodes['compressor'] = compressorNode; + nodes['compressor'] = [compressorNode]; chain.push(compressorNode); } @@ -1052,20 +1047,20 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) // phaser if (phaser !== undefined && phaserdepth > 0) { const phaserFX = getPhaser(t, endWithRelease, phaser, phaserdepth, phasercenter, phasersweep); - nodes['phaser'] = phaserFX; + nodes['phaser'] = [phaserFX]; chain.push(phaserFX); } // last gain const post = new GainNode(ac, { gain: postgain }); - nodes['post'] = post; + nodes['post'] = [post]; chain.push(post); // delay let delaySend; if (delay > 0 && delaytime > 0 && delayfeedback > 0) { const delayNode = getDelay(orbit, delaytime, delayfeedback, t, orbitChannels); - nodes['delay'] = delayNode; + nodes['delay'] = [delayNode]; delaySend = effectSend(post, delayNode, delay); audioNodes.push(delaySend); } @@ -1084,7 +1079,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) roomIR = await loadBuffer(url, ac, ir, 0); } const reverbNode = getReverb(orbit, roomsize, roomfade, roomlp, roomdim, roomIR, orbitChannels); - nodes['room'] = reverbNode; + nodes['room'] = [reverbNode]; reverbSend = effectSend(post, reverbNode, room); audioNodes.push(reverbSend); } From 2ccbb0596d8c0ab0b226e276fc0c58dee8a3e606 Mon Sep 17 00:00:00 2001 From: Aria Date: Thu, 4 Sep 2025 20:27:32 -0500 Subject: [PATCH 021/312] Codeformat --- packages/core/controls.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index a078c2b6f..d969d7922 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -1444,7 +1444,7 @@ export const { panorient } = registerControl('panorient'); * .lfoTarget("lpf") * .lfoParam("frequency") * .lfoNum(2) - * + * * reuse: note("F3").sound("square").lpf(50) * .lfoTarget("lpf") * .lfoParam("frequency") From 945b32533654e06591af4d4425586690e3759829 Mon Sep 17 00:00:00 2001 From: Aria Date: Sat, 13 Sep 2025 14:33:32 -0500 Subject: [PATCH 022/312] Codeformat, example tests --- test/__snapshots__/examples.test.mjs.snap | 111 ++++++++++++++++++++++ website/src/pages/learn/xen.mdx | 11 +-- 2 files changed, 114 insertions(+), 8 deletions(-) diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index ecbc33eac..b602749d0 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -3395,6 +3395,117 @@ exports[`runs examples > example "end" example index 0 1`] = ` ] `; +exports[`runs examples > example "envCurve" example index 0 1`] = ` +[ + "[ 0/1 → 1/8 | note:F#3 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", + "[ 1/8 → 1/4 | note:G#4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", + "[ 1/4 → 3/8 | note:C#4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", + "[ 3/8 → 1/2 | note:C#4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", + "[ 1/2 → 5/8 | note:B3 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", + "[ 5/8 → 3/4 | note:G#3 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", + "[ 3/4 → 7/8 | note:A3 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", + "[ 7/8 → 1/1 | note:C#4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", + "[ 1/1 → 9/8 | note:E4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", + "[ 9/8 → 5/4 | note:G#4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", + "[ 5/4 → 11/8 | note:G#4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", + "[ 11/8 → 3/2 | note:A3 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", + "[ 3/2 → 13/8 | note:F#4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", + "[ 13/8 → 7/4 | note:D4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", + "[ 7/4 → 15/8 | note:A3 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", + "[ 15/8 → 2/1 | note:F#4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", + "[ 2/1 → 17/8 | note:C#5 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", + "[ 17/8 → 9/4 | note:B4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", + "[ 9/4 → 19/8 | note:C#4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", + "[ 19/8 → 5/2 | note:B4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", + "[ 5/2 → 21/8 | note:D4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", + "[ 21/8 → 11/4 | note:G#3 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", + "[ 11/4 → 23/8 | note:F#4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", + "[ 23/8 → 3/1 | note:F#3 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", + "[ 3/1 → 25/8 | note:A3 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", + "[ 25/8 → 13/4 | note:C#4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", + "[ 13/4 → 27/8 | note:C#5 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", + "[ 27/8 → 7/2 | note:C#4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", + "[ 7/2 → 29/8 | note:C#4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", + "[ 29/8 → 15/4 | note:C#5 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", + "[ 15/4 → 31/8 | note:A4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", + "[ 31/8 → 4/1 | note:G#4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", +] +`; + +exports[`runs examples > example "envDepth" example index 0 1`] = ` +[ + "[ 0/1 → 1/8 | note:F#3 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", + "[ 1/8 → 1/4 | note:G#4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", + "[ 1/4 → 3/8 | note:C#4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", + "[ 3/8 → 1/2 | note:C#4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", + "[ 1/2 → 5/8 | note:B3 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", + "[ 5/8 → 3/4 | note:G#3 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", + "[ 3/4 → 7/8 | note:A3 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", + "[ 7/8 → 1/1 | note:C#4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", + "[ 1/1 → 9/8 | note:E4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", + "[ 9/8 → 5/4 | note:G#4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", + "[ 5/4 → 11/8 | note:G#4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", + "[ 11/8 → 3/2 | note:A3 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", + "[ 3/2 → 13/8 | note:F#4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", + "[ 13/8 → 7/4 | note:D4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", + "[ 7/4 → 15/8 | note:A3 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", + "[ 15/8 → 2/1 | note:F#4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", + "[ 2/1 → 17/8 | note:C#5 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", + "[ 17/8 → 9/4 | note:B4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", + "[ 9/4 → 19/8 | note:C#4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", + "[ 19/8 → 5/2 | note:B4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", + "[ 5/2 → 21/8 | note:D4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", + "[ 21/8 → 11/4 | note:G#3 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", + "[ 11/4 → 23/8 | note:F#4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", + "[ 23/8 → 3/1 | note:F#3 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", + "[ 3/1 → 25/8 | note:A3 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", + "[ 25/8 → 13/4 | note:C#4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", + "[ 13/4 → 27/8 | note:C#5 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", + "[ 27/8 → 7/2 | note:C#4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", + "[ 7/2 → 29/8 | note:C#4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", + "[ 29/8 → 15/4 | note:C#5 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", + "[ 15/4 → 31/8 | note:A4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", + "[ 31/8 → 4/1 | note:G#4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", +] +`; + +exports[`runs examples > example "envRelease" example index 0 1`] = ` +[ + "[ 0/1 → 1/8 | note:F#3 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", + "[ 1/8 → 1/4 | note:G#4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", + "[ 1/4 → 3/8 | note:C#4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", + "[ 3/8 → 1/2 | note:C#4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", + "[ 1/2 → 5/8 | note:B3 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", + "[ 5/8 → 3/4 | note:G#3 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", + "[ 3/4 → 7/8 | note:A3 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", + "[ 7/8 → 1/1 | note:C#4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", + "[ 1/1 → 9/8 | note:E4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", + "[ 9/8 → 5/4 | note:G#4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", + "[ 5/4 → 11/8 | note:G#4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", + "[ 11/8 → 3/2 | note:A3 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", + "[ 3/2 → 13/8 | note:F#4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", + "[ 13/8 → 7/4 | note:D4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", + "[ 7/4 → 15/8 | note:A3 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", + "[ 15/8 → 2/1 | note:F#4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", + "[ 2/1 → 17/8 | note:C#5 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", + "[ 17/8 → 9/4 | note:B4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", + "[ 9/4 → 19/8 | note:C#4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", + "[ 19/8 → 5/2 | note:B4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", + "[ 5/2 → 21/8 | note:D4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", + "[ 21/8 → 11/4 | note:G#3 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", + "[ 11/4 → 23/8 | note:F#4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", + "[ 23/8 → 3/1 | note:F#3 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", + "[ 3/1 → 25/8 | note:A3 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", + "[ 25/8 → 13/4 | note:C#4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", + "[ 13/4 → 27/8 | note:C#5 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", + "[ 27/8 → 7/2 | note:C#4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", + "[ 7/2 → 29/8 | note:C#4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", + "[ 29/8 → 15/4 | note:C#5 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", + "[ 15/4 → 31/8 | note:A4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", + "[ 31/8 → 4/1 | note:G#4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", +] +`; + exports[`runs examples > example "euclid" example index 0 1`] = ` [ "[ 0/1 → 1/8 | note:c3 ]", diff --git a/website/src/pages/learn/xen.mdx b/website/src/pages/learn/xen.mdx index 32e2c0b43..b8b27ac7f 100644 --- a/website/src/pages/learn/xen.mdx +++ b/website/src/pages/learn/xen.mdx @@ -16,10 +16,7 @@ These functions allow the use of scales other than your typical chromatic 12 bas Here's an example of how to configure a basic hexany scale: - + Try other scales like `hexany1`, `iraq`, `gumbeng`, `gunkali`, or `tranh3` @@ -67,6 +64,7 @@ Another helpful trick when exploring new tunings is to strum them. Many have a much more enchanting sound that was chosen over many generations of musicians for being strummed. Take the `sanza` tuning: + + This quality is often due to how the tunings were formed with instruments that were played differently than a piano. As such, some tunings are much better strummed, with the subtle clash of the detuned notes actually making the sound much more magical: From 23aa8ef5090df4b86089333d89df612dc58c4d0f Mon Sep 17 00:00:00 2001 From: Aria Date: Sat, 13 Sep 2025 14:49:36 -0500 Subject: [PATCH 023/312] Add ability for LFOs to target.. other lfos :devil emoji: --- packages/superdough/superdough.mjs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 364681c2b..7ef3ee948 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -636,7 +636,7 @@ function _setWorkletParamsAtTime(audioParams, params, time) { } let lfos = {}; -function _connectLFO(params) { +function _connectLFO(params, nodeTracker) { const { frequency = 1, synced = 0, @@ -653,10 +653,12 @@ function _connectLFO(params) { const ac = getAudioContext(); lfoNode = getLfo(ac, filteredParams); lfos[num] = lfoNode; + nodeTracker[`lfo${num}`] = [lfoNode]; } const targets = _getTargetParams(target, param); targets.forEach((target) => lfoNode.connect(target)); _setWorkletParamsAtTime(lfoNode.parameters, Object.entries(filteredParams), begin); + return lfoNode; } function _connectEnvelope(params) { @@ -671,15 +673,16 @@ function _connectEnvelope(params) { }); } -function connectModulators(params, modulatorType) { +function connectModulators(params, modulatorType, nodeTracker) { // We break down params specifying multiple modulators into a set of parameters for // a single one const individualParams = _splitParams(params); if (modulatorType === 'lfo') { - individualParams.forEach(_connectLFO); + individualParams.map((p) => _connectLFO(p, nodeTracker)); } else if (modulatorType === 'envelope') { individualParams.forEach(_connectEnvelope); } + return []; } let activeSoundSources = new Map(); @@ -1118,7 +1121,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) if (lfoTarget !== undefined && lfoParam !== undefined) { connectModulators( { - num: lfoNum, + num: lfoNum ?? 1, target: lfoTarget, param: lfoParam, frequency: lfoRate, @@ -1133,6 +1136,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) cps: cps, }, 'lfo', + nodes, ); } if (envTarget !== undefined && envParam !== undefined) { From 82c90471954d41f90d39c3b4c108a4ee0f24c766 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Thu, 18 Sep 2025 10:47:23 +0200 Subject: [PATCH 024/312] fix: unstable filter --- packages/supradough/dough.mjs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/supradough/dough.mjs b/packages/supradough/dough.mjs index 1cb9241ad..ea572224b 100644 --- a/packages/supradough/dough.mjs +++ b/packages/supradough/dough.mjs @@ -1,5 +1,5 @@ // this is dough, the superdough without dependencies -// @ts-check +// @ts-nocheck // @ts-ignore ignore next line because sampleRate is unknown const SAMPLE_RATE = typeof sampleRate !== 'undefined' ? sampleRate : 48000; const PI_DIV_SR = Math.PI / SAMPLE_RATE; @@ -151,7 +151,8 @@ export class TwoPoleFilter { resonance = Math.max(resonance, 0); cutoff = Math.min(cutoff, 20000); - const c = 2 * Math.sin(cutoff * PI_DIV_SR); + let c = 2 * Math.sin(cutoff * PI_DIV_SR); + c = clamp(c, 0, 1.14); // this line prevents instability TODO: test const r = Math.pow(0.5, (resonance + 0.125) / 0.125); const mrc = 1 - r * c; From a0c2edad30485e27fdbc787d6a58588724ad63a8 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Thu, 18 Sep 2025 10:54:41 +0200 Subject: [PATCH 025/312] fix: add clamp function --- packages/supradough/dough.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/supradough/dough.mjs b/packages/supradough/dough.mjs index ea572224b..7231792c9 100644 --- a/packages/supradough/dough.mjs +++ b/packages/supradough/dough.mjs @@ -6,6 +6,7 @@ const PI_DIV_SR = Math.PI / SAMPLE_RATE; const ISR = 1 / SAMPLE_RATE; let gainCurveFunc = (val) => Math.pow(val, 2); +const clamp = (num, min, max) => Math.min(Math.max(num, min), max); function applyGainCurve(val) { return gainCurveFunc(val); From c64aa3bf01b1af8a01f26064ce9a4542fe1ffcd4 Mon Sep 17 00:00:00 2001 From: Kissaki Date: Sun, 21 Sep 2025 18:27:05 +0200 Subject: [PATCH 026/312] Fix link syntax in `project-start` --- website/src/pages/technical-manual/project-start.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/src/pages/technical-manual/project-start.mdx b/website/src/pages/technical-manual/project-start.mdx index 4e6e37636..d5612736a 100644 --- a/website/src/pages/technical-manual/project-start.mdx +++ b/website/src/pages/technical-manual/project-start.mdx @@ -118,7 +118,7 @@ If you'd rather use your own UI, you can use the `@strudel/web` package: ``` -For more info on this package, see the [@strudel/web README]https://codeberg.org/uzu/strudel/src/branch/main/packages/web#strudel-web). +For more info on this package, see the [@strudel/web README](https://codeberg.org/uzu/strudel/src/branch/main/packages/web#strudel-web). ## Via npm From 4d39f36868c4240f242443e5492861820c24288a Mon Sep 17 00:00:00 2001 From: Kissaki Date: Sun, 21 Sep 2025 18:31:59 +0200 Subject: [PATCH 027/312] Fix web README sample code Looks like the code was copied, and then the wrong string was replaced when creating this code sample. --- packages/web/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web/README.md b/packages/web/README.md index 659c82713..e86600cd7 100644 --- a/packages/web/README.md +++ b/packages/web/README.md @@ -62,7 +62,7 @@ initStrudel(); document.getElementById('play').addEventListener('click', () => evaluate('note("c a f e").jux(rev)') ); -document.getElementById('play').addEventListener('stop', +document.getElementById('stop').addEventListener('click', () => hush() ); ``` From c9381a11f9ba182ac4ae8e5aab3584883003125c Mon Sep 17 00:00:00 2001 From: Aria Date: Fri, 3 Oct 2025 17:21:05 -0500 Subject: [PATCH 028/312] Working version --- packages/core/controls.mjs | 144 +++++++++++++++++++++++++++++--- packages/superdough/helpers.mjs | 124 +++++++++++++++++---------- 2 files changed, 213 insertions(+), 55 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 7e3c2a8e2..a2136367d 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -72,6 +72,27 @@ export function registerControl(names, ...aliases) { return bag; } +export function registerMultiControl(names, maxControls, ...aliases) { + names = Array.isArray(names) ? names : [names]; + let bag = {}; + for (let i = 1; i <= maxControls; i++) { + let theseAliases = [...aliases]; + let theseNames = [...names]; + if (i === 1) { + // adds e.g. fm1 as an alias for fm + const aliases1 = theseAliases.map((a) => `${a}1`); + const names1 = theseNames.map((n) => `${n}1`); + theseAliases = theseAliases.concat(aliases1).concat(names1); + } else { + theseAliases = theseAliases.map((a) => `${a}${i}`); + theseNames = theseNames.map((n) => `${n}${i}`); + } + const subBag = registerControl(theseNames, ...theseAliases); + bag = { ...bag, ...subBag }; + } + return bag; +} + /** * Select a sound / sample by name. When using mininotation, you can also optionally supply 'n' and 'gain' parameters * separated by ':'. @@ -444,21 +465,22 @@ export const { attack, att } = registerControl('attack', 'att'); * ._scope() * */ -export const { fmh } = registerControl(['fmh', 'fmi'], 'fmh'); +export const { fmh, fmh1, fmh2, fmh3, fmh4, fmh5, fmh6, fmh7, fmh8 } = registerMultiControl(['fmh', 'fmi'], 8, 'fmh'); /** * Sets the Frequency Modulation of the synth. * Controls the modulation index, which defines the brightness of the sound. * - * @name fm + * @name fmi * @param {number | Pattern} brightness modulation index - * @synonyms fmi + * @synonyms fm * @example * note("c e g b g e") * .fm("<0 1 2 8 32>") * ._scope() * */ -export const { fmi, fm } = registerControl(['fmi', 'fmh'], 'fm'); +export const { fmi, fmi1, fmi2, fmi3, fmi4, fmi5, fmi6, fmi7, fmi8, fm, fm1, fm2, fm3, fm4, fm5, fm6, fm7, fm8 } = + registerMultiControl(['fmi', 'fmh'], 8, 'fm'); // fm envelope /** * Ramp type of fm envelope. Exp might be a bit broken.. @@ -474,11 +496,15 @@ export const { fmi, fm } = registerControl(['fmi', 'fmh'], 'fm'); * ._scope() * */ -export const { fmenv } = registerControl('fmenv'); +export const { fmenv, fmenv1, fmenv2, fmenv3, fmenv4, fmenv5, fmenv6, fmenv7, fmenv8 } = registerMultiControl( + 'fmenv', + 8, +); /** * Attack time for the FM envelope: time it takes to reach maximum modulation * * @name fmattack + * @synonyms fmatt * @param {number | Pattern} time attack time * @example * note("c e g b g e") @@ -487,7 +513,26 @@ export const { fmenv } = registerControl('fmenv'); * ._scope() * */ -export const { fmattack } = registerControl('fmattack'); +export const { + fmattack, + fmattack1, + fmattack2, + fmattack3, + fmattack4, + fmattack5, + fmattack6, + fmattack7, + fmattack8, + fmatt, + fmatt1, + fmatt2, + fmatt3, + fmatt4, + fmatt5, + fmatt6, + fmatt7, + fmatt8, +} = registerMultiControl('fmattack', 8, 'fmatt'); /** * Waveform of the fm modulator @@ -500,12 +545,16 @@ export const { fmattack } = registerControl('fmattack'); * n("0 1 2 3".fast(4)).chord("").voicing().s("sawtooth").fmwave("brown").fm(.6) * */ -export const { fmwave } = registerControl('fmwave'); +export const { fmwave, fmwave1, fmwave2, fmwave3, fmwave4, fmwave5, fmwave6, fmwave7, fmwave8 } = registerMultiControl( + 'fmwave', + 8, +); /** * Decay time for the FM envelope: seconds until the sustain level is reached after the attack phase. * * @name fmdecay + * @synonyms fmdec * @param {number | Pattern} time decay time * @example * note("c e g b g e") @@ -515,11 +564,31 @@ export const { fmwave } = registerControl('fmwave'); * ._scope() * */ -export const { fmdecay } = registerControl('fmdecay'); +export const { + fmdecay, + fmdecay1, + fmdecay2, + fmdecay3, + fmdecay4, + fmdecay5, + fmdecay6, + fmdecay7, + fmdecay8, + fmdec, + fmdec1, + fmdec2, + fmdec3, + fmdec4, + fmdec5, + fmdec6, + fmdec7, + fmdec8, +} = registerMultiControl('fmdecay', 8, 'fmdec'); /** * Sustain level for the FM envelope: how much modulation is applied after the decay phase * * @name fmsustain + * @synonyms fmsus * @param {number | Pattern} level sustain level * @example * note("c e g b g e") @@ -529,10 +598,61 @@ export const { fmdecay } = registerControl('fmdecay'); * ._scope() * */ -export const { fmsustain } = registerControl('fmsustain'); -// these are not really useful... skipping for now -export const { fmrelease } = registerControl('fmrelease'); -export const { fmvelocity } = registerControl('fmvelocity'); +export const { + fmsustain, + fmsustain1, + fmsustain2, + fmsustain3, + fmsustain4, + fmsustain5, + fmsustain6, + fmsustain7, + fmsustain8, + fmsus, + fmsus1, + fmsus2, + fmsus3, + fmsus4, + fmsus5, + fmsus6, + fmsus7, + fmsus8, +} = registerMultiControl('fmsustain', 8, 'fmsus'); +/** + * Release time for the FM envelope: how much modulation is applied after the note is released + * + * @name fmrelease + * @synonyms fmrel + * @param {number | Pattern} time release time + * + */ +export const { + fmrelease, + fmrelease1, + fmrelease2, + fmrelease3, + fmrelease4, + fmrelease5, + fmrelease6, + fmrelease7, + fmrelease8, + fmrel, + fmrel1, + fmrel2, + fmrel3, + fmrel4, + fmrel5, + fmrel6, + fmrel7, + fmrel8, +} = registerMultiControl('fmrelease', 8, 'fmrel'); + +// FM Matrix +for (let i = 0; i <= 8; i++) { + for (let j = 0; j <= 8; j++) { + registerControl(`fm${i}${j}`); + } +} /** * Select the sound bank to use. To be used together with `s`. The bank name (+ "_") will be prepended to the value of `s`. diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 47bca330d..361733f10 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -325,7 +325,7 @@ const mod = (freq, range = 1, type = 'sine') => { osc.start(); const g = new GainNode(ctx, { gain: range }); osc.connect(g); // -range, range - return { node: g, stop: (t) => osc.stop(t) }; + return { fm: osc, scaled: g, stop: (t) => osc.stop(t) }; }; const fm = (frequencyparam, harmonicityRatio, modulationIndex, wave = 'sine') => { const carrfreq = frequencyparam.value; @@ -334,48 +334,86 @@ const fm = (frequencyparam, harmonicityRatio, modulationIndex, wave = 'sine') => return mod(modfreq, modgain, wave); }; export function applyFM(param, value, begin) { - const { - fmh: fmHarmonicity = 1, - fmi: fmModulationIndex, - fmenv: fmEnvelopeType = 'exp', - fmattack: fmAttack, - fmdecay: fmDecay, - fmsustain: fmSustain, - fmrelease: fmRelease, - fmvelocity: fmVelocity, - fmwave: fmWaveform = 'sine', - duration, - } = value; - let modulator; - let stop = () => {}; - - if (fmModulationIndex) { - const ac = getAudioContext(); - const envGain = ac.createGain(); - const fmmod = fm(param, fmHarmonicity, fmModulationIndex, fmWaveform); - - modulator = fmmod.node; - stop = fmmod.stop; - if (![fmAttack, fmDecay, fmSustain, fmRelease, fmVelocity].some((v) => v !== undefined)) { - // no envelope by default - modulator.connect(param); - } else { - const [attack, decay, sustain, release] = getADSRValues([fmAttack, fmDecay, fmSustain, fmRelease]); - const holdEnd = begin + duration; - getParamADSR( - envGain.gain, - attack, - decay, - sustain, - release, - 0, - 1, - begin, - holdEnd, - fmEnvelopeType === 'exp' ? 'exponential' : 'linear', - ); - modulator.connect(envGain); - envGain.connect(param); + const ac = getAudioContext(); + let target = param; + let stop = (t) => {}; + const targets = [param]; + const modulators = []; + for (let i = 0; i < 8; i++) { + const iS = `${i === 0 ? '' : i}`; + let modulator; + const fmModulationIndex = value[`fmi${iS}`]; + if (fmModulationIndex) { + const fmmod = fm(target, value[`fmh${iS}`] ?? 1, fmModulationIndex, value[`fmwave${iS}`] ?? 'sine'); + modulator = fmmod.scaled; + const currStop = stop; + stop = (t) => { + currStop(t); + fmmod.stop(t); + }; + const adsr = ['attack', 'decay', 'sustain', 'release'].map((s) => value[`fm${s}${iS}`]); + if (!adsr.some((v) => v !== undefined)) { + // no envelope by default + modulator.connect(target); + modulators.push(modulator); + } else { + const envGain = ac.createGain(); + const [attack, decay, sustain, release] = getADSRValues(adsr); + const holdEnd = begin + value.duration; + const fmEnvelopeType = value[`fmenv${iS}`] ?? 'exp'; + getParamADSR( + envGain.gain, + attack, + decay, + sustain, + release, + 0, + 1, + begin, + holdEnd, + fmEnvelopeType === 'exp' ? 'exponential' : 'linear', + ); + modulator.connect(envGain); + envGain.connect(target); + modulators.push(envGain); + } + targets.push(fmmod.fm?.frequency); + if (targets[i]) { + // Cannot connect to noises, for example + target = targets[i]; + } + } + } + // Matrix + for (let i = 1; i <= 8; i++) { + for (let j = 0; j <= 8; j++) { + let control; + if (i === j + 1) { + // Standard fm3 -> fm2 -> fm1 -> param usage + control = `fm${i}`; + } else { + control = `fm${i}${j}`; + } + const amt = value[control]; + if (!amt) continue; + const source = modulators[i - 1]; + const target = targets[j]; + if (!source) { + const iS = `${i === 1 ? '' : i}`; + logger( + `[superdough] failed to connect FM from source ${i} (due to control ${control}): source ${i} does not exist. Please use control fm${iS} to set it up`, + 'warning', + ); + continue; + } + if (!target) { + logger( + `[superdough] failed to connect FM to target ${j} (due to control ${control}): target ${j} does not exist. Please use control fm${j} to set it up`, + 'warning', + ); + continue; + } + source.connect(target); } } return { stop }; From 7cf9db4872fe8d2bde619da87f197a4b1df64a70 Mon Sep 17 00:00:00 2001 From: Aria Date: Fri, 3 Oct 2025 18:20:41 -0500 Subject: [PATCH 029/312] Big matrix refactor --- packages/core/controls.mjs | 2 +- packages/superdough/helpers.mjs | 124 ++++++++++++++------------------ 2 files changed, 55 insertions(+), 71 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index a2136367d..3f8847d99 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -650,7 +650,7 @@ export const { // FM Matrix for (let i = 0; i <= 8; i++) { for (let j = 0; j <= 8; j++) { - registerControl(`fm${i}${j}`); + registerControl(`fmi${i}${j}`, `fm${i}${j}`); } } diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 361733f10..89ae7da6d 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -309,7 +309,7 @@ export function webAudioTimeout(audioContext, onComplete, startTime, stopTime) { constantNode.stop(stopTime); return constantNode; } -const mod = (freq, range = 1, type = 'sine') => { +const mod = (freq, type = 'sine') => { const ctx = getAudioContext(); let osc; if (noises.includes(type)) { @@ -321,99 +321,83 @@ const mod = (freq, range = 1, type = 'sine') => { osc.type = type; osc.frequency.value = freq; } - osc.start(); - const g = new GainNode(ctx, { gain: range }); - osc.connect(g); // -range, range - return { fm: osc, scaled: g, stop: (t) => osc.stop(t) }; + return { osc, stop: (t) => osc.stop(t), freq }; }; + const fm = (frequencyparam, harmonicityRatio, modulationIndex, wave = 'sine') => { const carrfreq = frequencyparam.value; const modfreq = carrfreq * harmonicityRatio; - const modgain = modfreq * modulationIndex; - return mod(modfreq, modgain, wave); + return mod(modfreq, wave) }; + export function applyFM(param, value, begin) { const ac = getAudioContext(); - let target = param; let stop = (t) => {}; - const targets = [param]; - const modulators = []; - for (let i = 0; i < 8; i++) { - const iS = `${i === 0 ? '' : i}`; - let modulator; - const fmModulationIndex = value[`fmi${iS}`]; - if (fmModulationIndex) { - const fmmod = fm(target, value[`fmh${iS}`] ?? 1, fmModulationIndex, value[`fmwave${iS}`] ?? 'sine'); - modulator = fmmod.scaled; - const currStop = stop; - stop = (t) => { - currStop(t); - fmmod.stop(t); - }; - const adsr = ['attack', 'decay', 'sustain', 'release'].map((s) => value[`fm${s}${iS}`]); - if (!adsr.some((v) => v !== undefined)) { - // no envelope by default - modulator.connect(target); - modulators.push(modulator); - } else { - const envGain = ac.createGain(); - const [attack, decay, sustain, release] = getADSRValues(adsr); - const holdEnd = begin + value.duration; - const fmEnvelopeType = value[`fmenv${iS}`] ?? 'exp'; - getParamADSR( - envGain.gain, - attack, - decay, - sustain, - release, - 0, - 1, - begin, - holdEnd, - fmEnvelopeType === 'exp' ? 'exponential' : 'linear', - ); - modulator.connect(envGain); - envGain.connect(target); - modulators.push(envGain); - } - targets.push(fmmod.fm?.frequency); - if (targets[i]) { - // Cannot connect to noises, for example - target = targets[i]; - } - } - } + const fms = {}; // Matrix for (let i = 1; i <= 8; i++) { for (let j = 0; j <= 8; j++) { let control; if (i === j + 1) { // Standard fm3 -> fm2 -> fm1 -> param usage - control = `fm${i}`; + const iS = i === 1 ? '' : i; + control = `fmi${iS}`; } else { - control = `fm${i}${j}`; + control = `fmi${i}${j}`; } const amt = value[control]; if (!amt) continue; - const source = modulators[i - 1]; - const target = targets[j]; - if (!source) { - const iS = `${i === 1 ? '' : i}`; + let io = []; + for (let [isMod, idx] of [[true, i], [false, j]]) { + debugger; + if (idx === 0) { + io.push(param); + continue; + } + if (!fms[idx]) { + const idxS = idx === 1 ? '' : idx; + const { osc, freq } = fm(param, value[`fmh${idxS}`] ?? 1, value[`fmwave${idxS}`] ?? 'sine'); + const currStop = stop; + stop = (t) => { + currStop(t); + osc.stop(t); + }; + const adsr = ['attack', 'decay', 'sustain', 'release'].map((s) => value[`fm${s}${idxS}`]); + if (!adsr.some((v) => v !== undefined)) { + fms[idx] = { input: osc.frequency, output: osc, freq}; + } else { + const envGain = ac.createGain(); + const [attack, decay, sustain, release] = getADSRValues(adsr); + const holdEnd = begin + value.duration; + const fmEnvelopeType = value[`fmenv${idxS}`] ?? 'exp'; + getParamADSR( + envGain.gain, + attack, + decay, + sustain, + release, + 0, + 1, + begin, + holdEnd, + fmEnvelopeType === 'exp' ? 'exponential' : 'linear', + ); + fms[idx] = { input: osc.frequency, output: osc.connect(envGain), freq}; + } + } + const { input, output, freq } = fms[idx]; + const g = gainNode(amt * freq); + io.push(isMod ? output.connect(g) : input); + } + if (!io[1]) { logger( - `[superdough] failed to connect FM from source ${i} (due to control ${control}): source ${i} does not exist. Please use control fm${iS} to set it up`, + `[superdough] control ${control} failed to connect FM ${i} to target ${j} due to missing frequency parameter (likely because fm${j} is noise)`, 'warning', ); continue; } - if (!target) { - logger( - `[superdough] failed to connect FM to target ${j} (due to control ${control}): target ${j} does not exist. Please use control fm${j} to set it up`, - 'warning', - ); - continue; - } - source.connect(target); + io[0].connect(io[1]); } } return { stop }; From bd73d96847889f78b4a3cc9e98d4df0eeeb5244f Mon Sep 17 00:00:00 2001 From: Aria Date: Fri, 3 Oct 2025 18:49:49 -0500 Subject: [PATCH 030/312] Cleanup --- packages/superdough/helpers.mjs | 15 +++--- test/__snapshots__/examples.test.mjs.snap | 58 +++++++++++------------ 2 files changed, 38 insertions(+), 35 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 89ae7da6d..de8daaf5d 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -1,6 +1,7 @@ +import { logger } from './logger.mjs'; +import { getNoiseBuffer } from './noise.mjs'; import { getAudioContext } from './superdough.mjs'; import { clamp, nanFallback, midiToFreq, noteToMidi } from './util.mjs'; -import { getNoiseBuffer } from './noise.mjs'; export const noises = ['pink', 'white', 'brown', 'crackle']; @@ -328,7 +329,7 @@ const mod = (freq, type = 'sine') => { const fm = (frequencyparam, harmonicityRatio, modulationIndex, wave = 'sine') => { const carrfreq = frequencyparam.value; const modfreq = carrfreq * harmonicityRatio; - return mod(modfreq, wave) + return mod(modfreq, wave); }; export function applyFM(param, value, begin) { @@ -349,8 +350,10 @@ export function applyFM(param, value, begin) { const amt = value[control]; if (!amt) continue; let io = []; - for (let [isMod, idx] of [[true, i], [false, j]]) { - debugger; + for (let [isMod, idx] of [ + [true, i], + [false, j], + ]) { if (idx === 0) { io.push(param); continue; @@ -365,7 +368,7 @@ export function applyFM(param, value, begin) { }; const adsr = ['attack', 'decay', 'sustain', 'release'].map((s) => value[`fm${s}${idxS}`]); if (!adsr.some((v) => v !== undefined)) { - fms[idx] = { input: osc.frequency, output: osc, freq}; + fms[idx] = { input: osc.frequency, output: osc, freq }; } else { const envGain = ac.createGain(); const [attack, decay, sustain, release] = getADSRValues(adsr); @@ -383,7 +386,7 @@ export function applyFM(param, value, begin) { holdEnd, fmEnvelopeType === 'exp' ? 'exponential' : 'linear', ); - fms[idx] = { input: osc.frequency, output: osc.connect(envGain), freq}; + fms[idx] = { input: osc.frequency, output: osc.connect(envGain), freq }; } } const { input, output, freq } = fms[idx]; diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 73278947d..be8b371ab 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -3880,35 +3880,6 @@ exports[`runs examples > example "floor" example index 0 1`] = ` ] `; -exports[`runs examples > example "fm" example index 0 1`] = ` -[ - "[ 0/1 → 1/6 | note:c fmi:0 ]", - "[ 1/6 → 1/3 | note:e fmi:0 ]", - "[ 1/3 → 1/2 | note:g fmi:0 ]", - "[ 1/2 → 2/3 | note:b fmi:0 ]", - "[ 2/3 → 5/6 | note:g fmi:0 ]", - "[ 5/6 → 1/1 | note:e fmi:0 ]", - "[ 1/1 → 7/6 | note:c fmi:1 ]", - "[ 7/6 → 4/3 | note:e fmi:1 ]", - "[ 4/3 → 3/2 | note:g fmi:1 ]", - "[ 3/2 → 5/3 | note:b fmi:1 ]", - "[ 5/3 → 11/6 | note:g fmi:1 ]", - "[ 11/6 → 2/1 | note:e fmi:1 ]", - "[ 2/1 → 13/6 | note:c fmi:2 ]", - "[ 13/6 → 7/3 | note:e fmi:2 ]", - "[ 7/3 → 5/2 | note:g fmi:2 ]", - "[ 5/2 → 8/3 | note:b fmi:2 ]", - "[ 8/3 → 17/6 | note:g fmi:2 ]", - "[ 17/6 → 3/1 | note:e fmi:2 ]", - "[ 3/1 → 19/6 | note:c fmi:8 ]", - "[ 19/6 → 10/3 | note:e fmi:8 ]", - "[ 10/3 → 7/2 | note:g fmi:8 ]", - "[ 7/2 → 11/3 | note:b fmi:8 ]", - "[ 11/3 → 23/6 | note:g fmi:8 ]", - "[ 23/6 → 4/1 | note:e fmi:8 ]", -] -`; - exports[`runs examples > example "fmattack" example index 0 1`] = ` [ "[ 0/1 → 1/6 | note:c fmi:4 fmattack:0 ]", @@ -4025,6 +3996,35 @@ exports[`runs examples > example "fmh" example index 0 1`] = ` ] `; +exports[`runs examples > example "fmi" example index 0 1`] = ` +[ + "[ 0/1 → 1/6 | note:c fmi:0 ]", + "[ 1/6 → 1/3 | note:e fmi:0 ]", + "[ 1/3 → 1/2 | note:g fmi:0 ]", + "[ 1/2 → 2/3 | note:b fmi:0 ]", + "[ 2/3 → 5/6 | note:g fmi:0 ]", + "[ 5/6 → 1/1 | note:e fmi:0 ]", + "[ 1/1 → 7/6 | note:c fmi:1 ]", + "[ 7/6 → 4/3 | note:e fmi:1 ]", + "[ 4/3 → 3/2 | note:g fmi:1 ]", + "[ 3/2 → 5/3 | note:b fmi:1 ]", + "[ 5/3 → 11/6 | note:g fmi:1 ]", + "[ 11/6 → 2/1 | note:e fmi:1 ]", + "[ 2/1 → 13/6 | note:c fmi:2 ]", + "[ 13/6 → 7/3 | note:e fmi:2 ]", + "[ 7/3 → 5/2 | note:g fmi:2 ]", + "[ 5/2 → 8/3 | note:b fmi:2 ]", + "[ 8/3 → 17/6 | note:g fmi:2 ]", + "[ 17/6 → 3/1 | note:e fmi:2 ]", + "[ 3/1 → 19/6 | note:c fmi:8 ]", + "[ 19/6 → 10/3 | note:e fmi:8 ]", + "[ 10/3 → 7/2 | note:g fmi:8 ]", + "[ 7/2 → 11/3 | note:b fmi:8 ]", + "[ 11/3 → 23/6 | note:g fmi:8 ]", + "[ 23/6 → 4/1 | note:e fmi:8 ]", +] +`; + exports[`runs examples > example "fmsustain" example index 0 1`] = ` [ "[ 0/1 → 1/6 | note:c fmi:4 fmdecay:0.1 fmsustain:1 ]", From 3ef6c7c921efd79799f3e9d0a2e3462ab748d267 Mon Sep 17 00:00:00 2001 From: Aria Date: Sat, 4 Oct 2025 02:07:35 -0500 Subject: [PATCH 031/312] Handle scale-for-notes when n also supplied --- packages/core/test/pattern.test.mjs | 4 ++-- packages/tonal/tonal.mjs | 21 ++++++++++++--------- website/src/components/Header/Search.css | 4 ++-- website/src/pages/learn/samples.mdx | 2 +- 4 files changed, 17 insertions(+), 14 deletions(-) diff --git a/packages/core/test/pattern.test.mjs b/packages/core/test/pattern.test.mjs index 1df5c8776..625f40756 100644 --- a/packages/core/test/pattern.test.mjs +++ b/packages/core/test/pattern.test.mjs @@ -796,7 +796,7 @@ describe('Pattern', () => { }); }); describe('apply', () => { - it('Can apply a function', () => { + (it('Can apply a function', () => { expect(sequence('a', 'b').apply(fast(2)).firstCycle()).toStrictEqual(sequence('a', 'b').fast(2).firstCycle()); }), it('Can apply a pattern of functions', () => { @@ -804,7 +804,7 @@ describe('Pattern', () => { expect(sequence('a', 'b').apply(fast(2), fast(3)).firstCycle()).toStrictEqual( sequence('a', 'b').fast(2, 3).firstCycle(), ); - }); + })); }); describe('layer', () => { it('Can layer up multiple functions', () => { diff --git a/packages/tonal/tonal.mjs b/packages/tonal/tonal.mjs index ae75ab690..a24dc7f25 100644 --- a/packages/tonal/tonal.mjs +++ b/packages/tonal/tonal.mjs @@ -266,9 +266,14 @@ export const scale = register( pat .fmap((value) => { const isObject = typeof value === 'object'; - // The case where the note has been defined via `n` or `pure` - if (!isObject || (isObject && ('n' in value || 'value' in value))) { - const step = isObject ? (value.n ?? value.value) : value; + // If value is a pure value, place it on `n` so that we interpret it as a scale + // degree + value = typeof value !== 'object' ? { n: value } : value; + if ('note' in value) { + const note = _getNearestScaleNote(scale, value.note); + return pure({ ...value, note }); + } else if ('n' in value || 'value' in value) { + const step = value.n ?? value.value; delete value.n; // remove n so it won't cause trouble if (isNote(step)) { // legacy.. @@ -277,7 +282,7 @@ export const scale = register( try { const [number, offset] = _convertStepToNumberAndOffset(step); let note; - if (isObject && value.anchor) { + if (value.anchor) { note = stepInNamedScale(number, scale, value.anchor); } else { note = scaleStep(number, scale); @@ -290,11 +295,9 @@ export const scale = register( } return value; } - // The case where the note has been defined via `note` - else { - const note = _getNearestScaleNote(scale, value.note); - return pure(isObject ? { ...value, note } : note); - } + throw new Error( + `Invalid value format for 'scale'. Value must contain 'n' or 'note' but received ${Object.keys(value)}`, + ); }) .outerJoin() // legacy: diff --git a/website/src/components/Header/Search.css b/website/src/components/Header/Search.css index 456ef9f6b..b14146cbd 100644 --- a/website/src/components/Header/Search.css +++ b/website/src/components/Header/Search.css @@ -18,8 +18,8 @@ --docsearch-modal-background: var(--background); --docsearch-muted-color: color-mix(in srgb, var(--foreground), #fff 30%); --docsearch-key-gradient: var(--foreground); - --docsearch-key-shadow: inset 0 -2px 0 0 var(--gutterForeground), inset 0 0 1px 1px var(--foreground), - 0 1px 2px 1px var(--gutterBackground); + --docsearch-key-shadow: + inset 0 -2px 0 0 var(--gutterForeground), inset 0 0 1px 1px var(--foreground), 0 1px 2px 1px var(--gutterBackground); } .dark { --docsearch-muted-color: color-mix(in srgb, var(--foreground), #000 30%); diff --git a/website/src/pages/learn/samples.mdx b/website/src/pages/learn/samples.mdx index eb79cccf7..201d57dfa 100644 --- a/website/src/pages/learn/samples.mdx +++ b/website/src/pages/learn/samples.mdx @@ -381,7 +381,7 @@ Sampler effects are functions that can be used to change the behaviour of sample ### scrub -{' '} + ### speed From 11dd8a318a5f329d8b5f9269192fbfdc6a15839d Mon Sep 17 00:00:00 2001 From: Aria Date: Sat, 4 Oct 2025 02:13:42 -0500 Subject: [PATCH 032/312] Cleanup --- packages/tonal/tonal.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tonal/tonal.mjs b/packages/tonal/tonal.mjs index a24dc7f25..e745a33a0 100644 --- a/packages/tonal/tonal.mjs +++ b/packages/tonal/tonal.mjs @@ -268,7 +268,7 @@ export const scale = register( const isObject = typeof value === 'object'; // If value is a pure value, place it on `n` so that we interpret it as a scale // degree - value = typeof value !== 'object' ? { n: value } : value; + value = isObject ? value : { n: value }; if ('note' in value) { const note = _getNearestScaleNote(scale, value.note); return pure({ ...value, note }); From cc4452ce58a3d2a3fd12fe37166d7d2047222d58 Mon Sep 17 00:00:00 2001 From: Aria Date: Sat, 4 Oct 2025 20:33:25 -0500 Subject: [PATCH 033/312] Working version of partials and phases --- packages/core/controls.mjs | 1 + packages/core/signal.mjs | 38 ++++++++++++++++- packages/core/test/pattern.test.mjs | 4 +- packages/superdough/synth.mjs | 52 +++++++++++++++++------- website/src/components/Header/Search.css | 4 +- website/src/pages/learn/samples.mdx | 2 +- 6 files changed, 79 insertions(+), 22 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 7e3c2a8e2..c8005927d 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -2040,6 +2040,7 @@ export const { real } = registerControl('real'); export const { imag } = registerControl('imag'); export const { enhance } = registerControl('enhance'); export const { partials } = registerControl('partials'); +export const { phases } = registerControl('phases'); export const { comb } = registerControl('comb'); export const { smear } = registerControl('smear'); export const { scram } = registerControl('scram'); diff --git a/packages/core/signal.mjs b/packages/core/signal.mjs index 6bd6fde67..b4dc825fc 100644 --- a/packages/core/signal.mjs +++ b/packages/core/signal.mjs @@ -228,7 +228,7 @@ const timeToRands = (t, n) => timeToRandsPrime(timeToIntSeed(t), n); export const run = (n) => saw.range(0, n).round().segment(n); /** - * Creates a pattern from a binary number. + * Creates a binary pattern from a number. * * @name binary * @param {number} n - input number to convert to binary @@ -242,7 +242,7 @@ export const binary = (n) => { }; /** - * Creates a pattern from a binary number, padded to n bits long. + * Creates a binary pattern from a number, padded to n bits long. * * @name binaryN * @param {number} n - input number to convert to binary @@ -258,6 +258,40 @@ export const binaryN = (n, nBits = 16) => { return reify(n).segment(nBits).brshift(bitPos).band(pure(1)); }; +/** + * Creates a binary list pattern from a number. + * + * @name binaryL + * @param {number} n - input number to convert to binary + */ +export const binaryL = (n) => { + const nBits = reify(n).log2(0).floor().add(1); + return binaryNL(n, nBits); +}; + +/** + * Creates a binary list pattern from a number, padded to n bits long. + * + * @name binaryNL + * @param {number} n - input number to convert to binary + * @param {number} nBits - pattern length, defaults to 16 + */ +export const binaryNL = (n, nBits = 16) => { + return reify(n) + .withValue((v) => (bits) => { + const bList = []; + for (let i = bits - 1; i >= 0; i--) { + bList.push((v >> i) & 1); + } + return bList; + }) + .appLeft(reify(nBits)); +}; + +export const randL = (n) => { + return signal((t) => (nVal) => timeToRands(t, nVal).map(Math.abs)).appLeft(reify(n)); +}; + export const randrun = (n) => { return signal((t) => { // Without adding 0.5, the first cycle is always 0,1,2,3,... diff --git a/packages/core/test/pattern.test.mjs b/packages/core/test/pattern.test.mjs index 1df5c8776..625f40756 100644 --- a/packages/core/test/pattern.test.mjs +++ b/packages/core/test/pattern.test.mjs @@ -796,7 +796,7 @@ describe('Pattern', () => { }); }); describe('apply', () => { - it('Can apply a function', () => { + (it('Can apply a function', () => { expect(sequence('a', 'b').apply(fast(2)).firstCycle()).toStrictEqual(sequence('a', 'b').fast(2).firstCycle()); }), it('Can apply a pattern of functions', () => { @@ -804,7 +804,7 @@ describe('Pattern', () => { expect(sequence('a', 'b').apply(fast(2), fast(3)).firstCycle()).toStrictEqual( sequence('a', 'b').fast(2, 3).firstCycle(), ); - }); + })); }); describe('layer', () => { it('Can layer up multiple functions', () => { diff --git a/packages/superdough/synth.mjs b/packages/superdough/synth.mjs index 5dc5dc08a..71c4a15dc 100644 --- a/packages/superdough/synth.mjs +++ b/packages/superdough/synth.mjs @@ -14,9 +14,10 @@ import { noises, webAudioTimeout, } from './helpers.mjs'; +import { logger } from './logger.mjs'; import { getNoiseMix, getNoiseOscillator } from './noise.mjs'; -const waveforms = ['triangle', 'square', 'sawtooth', 'sine']; +const waveforms = ['triangle', 'square', 'sawtooth', 'sine', 'user']; const waveformAliases = [ ['tri', 'triangle'], ['sqr', 'square'], @@ -413,9 +414,13 @@ export function registerSynthSounds() { waveformAliases.forEach(([alias, actual]) => soundMap.set({ ...soundMap.get(), [alias]: soundMap.get()[actual] })); } -export function waveformN(partials, type) { - const real = new Float32Array(partials + 1); - const imag = new Float32Array(partials + 1); +const PI2 = 2 * Math.PI; +export function waveformN(partials, phases, type) { + const isList = typeof partials === 'object'; + partials = isList ? partials : new Float32Array(partials).fill(1); + const len = partials.length; + const real = new Float32Array(len + 1); + const imag = new Float32Array(len + 1); const ac = getAudioContext(); const osc = ac.createOscillator(); @@ -423,20 +428,29 @@ export function waveformN(partials, type) { sawtooth: (n) => [0, -1 / n], square: (n) => [0, n % 2 === 0 ? 0 : 1 / n], triangle: (n) => [n % 2 === 0 ? 0 : 1 / (n * n), 0], + user: (_n) => [0, 1], }; if (!terms[type]) { throw new Error(`unknown wave type ${type}`); } - real[0] = 0; // dc offset - imag[0] = 0; - let n = 1; - while (n <= partials) { - const [r, i] = terms[type](n); - real[n] = r; - imag[n] = i; - n++; + for (let n = 0; n < len; n++) { + const mag = partials[n]; + const [r, i] = terms[type](n + 1); // we skip n === 0 as this is dc offset + const phase = phases?.[n] ?? 0; + // Scale by `partials` + let R = r * mag; + let I = i * mag; + // Apply rotation by the phase + if (phase !== 0) { + const c = Math.cos(PI2 * phase); + const s = Math.sin(PI2 * phase); + R = c * R - s * I; + I = s * R + c * I; + } + real[n + 1] = R; + imag[n + 1] = I; } const wave = ac.createPeriodicWave(real, imag); @@ -446,16 +460,24 @@ export function waveformN(partials, type) { // expects one of waveforms as s export function getOscillator(s, t, value) { - let { n: partials, duration, noise = 0 } = value; + const { duration, noise = 0 } = value; + const partials = value.partials ?? value.n; let o; + if (s === 'user' && !partials) { + logger( + `[superdough] Synth 'user' was selected, but partials not specified. Defaulting to triangle. Use pat.partials to setup custom waveform`, + ); + s = 'triangle'; + } + s = s === 'user' && !partials ? 'triangle' : s; // If no partials are given, use stock waveforms - if (!partials || s === 'sine') { + if (!partials || !partials?.length || s === 'sine') { o = getAudioContext().createOscillator(); o.type = s || 'triangle'; } // generate custom waveform if partials are given else { - o = waveformN(partials, s); + o = waveformN(partials, value.phases, s); } // set frequency o.frequency.value = getFrequencyFromValue(value); diff --git a/website/src/components/Header/Search.css b/website/src/components/Header/Search.css index 456ef9f6b..b14146cbd 100644 --- a/website/src/components/Header/Search.css +++ b/website/src/components/Header/Search.css @@ -18,8 +18,8 @@ --docsearch-modal-background: var(--background); --docsearch-muted-color: color-mix(in srgb, var(--foreground), #fff 30%); --docsearch-key-gradient: var(--foreground); - --docsearch-key-shadow: inset 0 -2px 0 0 var(--gutterForeground), inset 0 0 1px 1px var(--foreground), - 0 1px 2px 1px var(--gutterBackground); + --docsearch-key-shadow: + inset 0 -2px 0 0 var(--gutterForeground), inset 0 0 1px 1px var(--foreground), 0 1px 2px 1px var(--gutterBackground); } .dark { --docsearch-muted-color: color-mix(in srgb, var(--foreground), #000 30%); diff --git a/website/src/pages/learn/samples.mdx b/website/src/pages/learn/samples.mdx index eb79cccf7..201d57dfa 100644 --- a/website/src/pages/learn/samples.mdx +++ b/website/src/pages/learn/samples.mdx @@ -381,7 +381,7 @@ Sampler effects are functions that can be used to change the behaviour of sample ### scrub -{' '} + ### speed From be9368e8a2d6be6625b1f55eaf62e8f82a5b587c Mon Sep 17 00:00:00 2001 From: dtricks Date: Fri, 3 Oct 2025 17:57:58 +0200 Subject: [PATCH 034/312] feat(codemirror): add Vim :w evaluate, :q stop, and gc/gcc toggle comment via custom events; docs: add Vim shortcuts page and link from REPL manual --- packages/codemirror/codemirror.mjs | 42 +++++- packages/codemirror/keybindings.mjs | 139 +++++++++++++++++--- website/src/pages/technical-manual/repl.mdx | 4 + website/src/pages/technical-manual/vim.mdx | 36 +++++ 4 files changed, 203 insertions(+), 18 deletions(-) create mode 100644 website/src/pages/technical-manual/vim.mdx diff --git a/packages/codemirror/codemirror.mjs b/packages/codemirror/codemirror.mjs index 4dc23996f..6359609ca 100644 --- a/packages/codemirror/codemirror.mjs +++ b/packages/codemirror/codemirror.mjs @@ -1,4 +1,5 @@ import { closeBrackets } from '@codemirror/autocomplete'; +import { toggleLineComment } from '@codemirror/commands'; export { toggleComment, toggleBlockComment, toggleLineComment, toggleBlockCommentByLine } from '@codemirror/commands'; // import { search, highlightSelectionMatches } from '@codemirror/search'; import { indentWithTab } from '@codemirror/commands'; @@ -13,7 +14,7 @@ import { lineNumbers, drawSelection, } from '@codemirror/view'; -import { repl, registerControl } from '@strudel/core'; +import { repl, registerControl, logger } from '@strudel/core'; import { Drawer, cleanupDraw } from '@strudel/draw'; import { isAutoCompletionEnabled } from './autocomplete.mjs'; import { isTooltipEnabled } from './tooltip.mjs'; @@ -245,6 +246,32 @@ export class StrudelMirror { } }; document.addEventListener('start-repl', this.onStartRepl); + + // Handle global evaluation requests (e.g., from Vim :w) + this.onEvaluateRequest = (e) => { + try { + // Evaluate current editor on repl-evaluate + logger('[repl] evaluate via event'); + this.evaluate(); + e?.cancelable && e.preventDefault?.(); + } catch (err) { + console.error('Error handling repl-evaluate event', err); + } + }; + document.addEventListener('repl-evaluate', this.onEvaluateRequest); + document.addEventListener('repl-stop', this.onStopRequest); + + // Toggle comments requested from Vim (gc/gcc) + this.onToggleComment = (e) => { + try { + // Honor selections; toggleLineComment handles both selections and single line + toggleLineComment(this.editor); + e?.cancelable && e.preventDefault?.(); + } catch (err) { + console.error('Error handling repl-toggle-comment event', err); + } + }; + document.addEventListener('repl-toggle-comment', this.onToggleComment); } draw(haps, time, painters) { painters?.forEach((painter) => painter(this.drawContext, time, haps, this.drawTime)); @@ -271,6 +298,16 @@ export class StrudelMirror { async stop() { this.repl.scheduler.stop(); } + + // Listen for global stop requests (e.g., from Vim :q) + onStopRequest = (e) => { + try { + this.stop(); + e?.cancelable && e.preventDefault?.(); + } catch (err) { + console.error('Error handling repl-stop event', err); + } + }; async toggle() { if (this.repl.scheduler.started) { this.repl.stop(); @@ -351,6 +388,9 @@ export class StrudelMirror { } clear() { this.onStartRepl && document.removeEventListener('start-repl', this.onStartRepl); + this.onEvaluateRequest && document.removeEventListener('repl-evaluate', this.onEvaluateRequest); + this.onStopRequest && document.removeEventListener('repl-stop', this.onStopRequest); + this.onToggleComment && document.removeEventListener('repl-toggle-comment', this.onToggleComment); } getCursorLocation() { return this.editor.state.selection.main.head; diff --git a/packages/codemirror/keybindings.mjs b/packages/codemirror/keybindings.mjs index ca5f34f4c..7de2a7238 100644 --- a/packages/codemirror/keybindings.mjs +++ b/packages/codemirror/keybindings.mjs @@ -1,32 +1,137 @@ -import { Prec } from '@codemirror/state'; -import { keymap, ViewPlugin } from '@codemirror/view'; +import {defaultKeymap} from '@codemirror/commands'; +import {Prec} from '@codemirror/state'; +import {keymap, ViewPlugin} from '@codemirror/view'; // import { searchKeymap } from '@codemirror/search'; -import { emacs } from '@replit/codemirror-emacs'; -import { vim } from '@replit/codemirror-vim'; +import {emacs} from '@replit/codemirror-emacs'; +import {vim, Vim} from '@replit/codemirror-vim'; +import { logger } from '@strudel/core'; // import { vim } from './vim_test.mjs'; -import { vscodeKeymap } from '@replit/codemirror-vscode-keymap'; -import { defaultKeymap } from '@codemirror/commands'; +import {vscodeKeymap} from '@replit/codemirror-vscode-keymap'; const vscodePlugin = ViewPlugin.fromClass( - class { - constructor() {} - }, - { - provide: () => { - return Prec.highest(keymap.of([...vscodeKeymap])); + class { + constructor() {} + }, + { + provide : () => { return Prec.highest(keymap.of([...vscodeKeymap ])); }, }, - }, ); const vscodeExtension = (options) => [vscodePlugin].concat(options ?? []); +// Map Vim :w to trigger the same action as evaluation. We dispatch a custom +// event 'repl-evaluate' that the editor listens for, and also simulate +// Ctrl+Enter/Alt+Enter as a fallback. We log to the Strudel logger so it +// appears in the Console panel. +try { + if (Vim && typeof Vim.defineEx === 'function') { + // Map gc/gcc to toggle line comments by dispatching a custom event that our + // CodeMirror integration listens to. This avoids depending on Vim's internal + // actions and works with current selections/visual mode. + try { + Vim.defineAction('strudelToggleComment', (cm) => { + const view = cm?.view || cm; + try { + const ev = new CustomEvent('repl-toggle-comment', { detail: { source: 'vim', view }, cancelable: true }); + document.dispatchEvent(ev); + } catch (e) { + console.error('strudelToggleComment dispatch failed', e); + } + }); + Vim.mapCommand('gc', 'action', 'strudelToggleComment', {}, { context: 'normal' }); + Vim.mapCommand('gc', 'action', 'strudelToggleComment', {}, { context: 'visual' }); + Vim.mapCommand('gcc', 'action', 'strudelToggleComment', {}, { context: 'normal' }); + } catch (e) { + console.error('Vim gc/gcc mapping failed', e); + } + + // :q to pause/stop + // :q to pause/stop + Vim.defineEx('quit', 'q', (cm) => { + try { + const view = cm?.view || cm; + // First try dispatching our custom stop event, then fallback to Alt+. + let handled = false; + try { + const ev = new CustomEvent('repl-stop', { detail: { source: 'vim', view }, cancelable: true }); + handled = document.dispatchEvent(ev) === false; + } catch {} + if (!handled) { + const altDot = new KeyboardEvent('keydown', { + key: '.', + code: 'Period', + altKey: true, + bubbles: true, + cancelable: true, + }); + view?.dom?.dispatchEvent?.(altDot); + } + } catch (e) { + console.error('Error dispatching :q stop event', e); + } + }); + + // :w to evaluate + // :w to evaluate + Vim.defineEx('write', 'w', (cm) => { + const view = + cm?.view || + cm; // CM6 Vim passes either an object with view or the view itself + try { + view?.focus?.(); + // Let the app know this came from Vim :w + try { + logger('[vim] :w — evaluating code'); + } catch {} + // Dispatch a dedicated evaluate event first + let handled = false; + try { + const ev = new CustomEvent('repl-evaluate', { detail: { source: 'vim', view }, cancelable: true }); + handled = document.dispatchEvent(ev) === false; // false means preventDefault was called + } catch {} + if (handled) { + return; + } + // Try Ctrl+Enter first if not handled by custom event + const ctrlEnter = new KeyboardEvent('keydown', { + key : 'Enter', + code : 'Enter', + ctrlKey : true, + bubbles : true, + cancelable : true, + }); + view?.dom?.dispatchEvent?.(ctrlEnter); + // If not handled (no handler called preventDefault), try Alt+Enter as + // fallback + if (!ctrlEnter.defaultPrevented) { + const altEnter = new KeyboardEvent('keydown', { + key : 'Enter', + code : 'Enter', + altKey : true, + bubbles : true, + cancelable : true, + }); + view?.dom?.dispatchEvent?.(altEnter); + } + } catch (e) { + console.error('Error dispatching :w evaluation event', e); + } + }); + } +} catch (e) { + console.error('Vim ex command setup failed (defineEx missing or Vim unavailable)', e); +} + const keymaps = { - vim, + vim, + // Add extra Vim keymap for gc to toggle line comment + // We will include a Vim-specific keymap that calls the CM command + // respecting the current selection. emacs, - codemirror: () => keymap.of(defaultKeymap), - vscode: vscodeExtension, + codemirror : () => keymap.of(defaultKeymap), + vscode : vscodeExtension, }; export function keybindings(name) { const active = keymaps[name]; - return [active ? Prec.high(active()) : []]; + return [ active ? Prec.high(active()) : [] ]; } diff --git a/website/src/pages/technical-manual/repl.mdx b/website/src/pages/technical-manual/repl.mdx index 8c4287af5..f74a4fb8b 100644 --- a/website/src/pages/technical-manual/repl.mdx +++ b/website/src/pages/technical-manual/repl.mdx @@ -117,6 +117,10 @@ Here's an example AST for `c3 [e3 g3]` which translates to `seq(c3, seq(e3, g3))` +## Vim Keybindings + +See the separate page on Vim shortcuts for a quick reference: [/technical-manual/vim](/technical-manual/vim) + ## Scheduling Events After an instance of `Pattern` is obtained from the user code, diff --git a/website/src/pages/technical-manual/vim.mdx b/website/src/pages/technical-manual/vim.mdx new file mode 100644 index 000000000..ec284d0bf --- /dev/null +++ b/website/src/pages/technical-manual/vim.mdx @@ -0,0 +1,36 @@ +--- +title: Vim Shortcuts +layout: ../../layouts/MainLayout.astro +--- + +# Vim Shortcuts in the REPL + +When the REPL editor (CodeMirror) is configured to use Vim keybindings, the following commands are available: + +- :w — Evaluate the current code + - Triggers the same evaluation as Ctrl+Enter / Alt+Enter + - You’ll see messages in the Console panel such as: + - [vim] :w — evaluating code + - [repl] evaluate via event + - [eval] code updated + +- :q — Stop/pause playback + - Triggers the same stop action as Alt+. + - Useful to quickly stop scheduling without leaving Vim mode + +- gc — Toggle line comments for the current selection(s) + - Works in normal and visual mode + - If there’s a selection, all selected lines are toggled + +- gcc — Toggle comment for the current line (normal mode) + +Notes + +- Behavior respects the current language mode in the editor for comment syntax. +- If multiple REPL editors are open, commands target the active editor. The implementation dispatches custom events handled by the editor. +- If you don’t see the Console panel, open the right panel in the REPL UI. + +Troubleshooting + +- If :w logs but evaluation doesn’t apply, ensure Vim keybindings are active and try again. You can also use Ctrl+Enter as a fallback. +- For :q / gc / gcc, ensure focus is inside the editor. If an error occurs, reload the page to reset editor state and try again. From 73a98349596c68031b33b1fe44b830498faea920 Mon Sep 17 00:00:00 2001 From: dtricks Date: Fri, 3 Oct 2025 18:12:47 +0200 Subject: [PATCH 035/312] codeformat --- packages/codemirror/codemirror.mjs | 2 +- packages/codemirror/keybindings.mjs | 56 +++++++++++----------- packages/osc/server.js | 0 website/src/pages/technical-manual/vim.mdx | 3 ++ 4 files changed, 32 insertions(+), 29 deletions(-) mode change 100644 => 100755 packages/osc/server.js diff --git a/packages/codemirror/codemirror.mjs b/packages/codemirror/codemirror.mjs index 6359609ca..f3ab3890e 100644 --- a/packages/codemirror/codemirror.mjs +++ b/packages/codemirror/codemirror.mjs @@ -298,7 +298,7 @@ export class StrudelMirror { async stop() { this.repl.scheduler.stop(); } - + // Listen for global stop requests (e.g., from Vim :q) onStopRequest = (e) => { try { diff --git a/packages/codemirror/keybindings.mjs b/packages/codemirror/keybindings.mjs index 7de2a7238..06aaad523 100644 --- a/packages/codemirror/keybindings.mjs +++ b/packages/codemirror/keybindings.mjs @@ -1,20 +1,22 @@ -import {defaultKeymap} from '@codemirror/commands'; -import {Prec} from '@codemirror/state'; -import {keymap, ViewPlugin} from '@codemirror/view'; +import { defaultKeymap } from '@codemirror/commands'; +import { Prec } from '@codemirror/state'; +import { keymap, ViewPlugin } from '@codemirror/view'; // import { searchKeymap } from '@codemirror/search'; -import {emacs} from '@replit/codemirror-emacs'; -import {vim, Vim} from '@replit/codemirror-vim'; +import { emacs } from '@replit/codemirror-emacs'; +import { vim, Vim } from '@replit/codemirror-vim'; import { logger } from '@strudel/core'; // import { vim } from './vim_test.mjs'; -import {vscodeKeymap} from '@replit/codemirror-vscode-keymap'; +import { vscodeKeymap } from '@replit/codemirror-vscode-keymap'; const vscodePlugin = ViewPlugin.fromClass( - class { - constructor() {} - }, - { - provide : () => { return Prec.highest(keymap.of([...vscodeKeymap ])); }, + class { + constructor() {} + }, + { + provide: () => { + return Prec.highest(keymap.of([...vscodeKeymap])); }, + }, ); const vscodeExtension = (options) => [vscodePlugin].concat(options ?? []); @@ -73,9 +75,7 @@ try { // :w to evaluate // :w to evaluate Vim.defineEx('write', 'w', (cm) => { - const view = - cm?.view || - cm; // CM6 Vim passes either an object with view or the view itself + const view = cm?.view || cm; // CM6 Vim passes either an object with view or the view itself try { view?.focus?.(); // Let the app know this came from Vim :w @@ -93,22 +93,22 @@ try { } // Try Ctrl+Enter first if not handled by custom event const ctrlEnter = new KeyboardEvent('keydown', { - key : 'Enter', - code : 'Enter', - ctrlKey : true, - bubbles : true, - cancelable : true, + key: 'Enter', + code: 'Enter', + ctrlKey: true, + bubbles: true, + cancelable: true, }); view?.dom?.dispatchEvent?.(ctrlEnter); // If not handled (no handler called preventDefault), try Alt+Enter as // fallback if (!ctrlEnter.defaultPrevented) { const altEnter = new KeyboardEvent('keydown', { - key : 'Enter', - code : 'Enter', - altKey : true, - bubbles : true, - cancelable : true, + key: 'Enter', + code: 'Enter', + altKey: true, + bubbles: true, + cancelable: true, }); view?.dom?.dispatchEvent?.(altEnter); } @@ -122,16 +122,16 @@ try { } const keymaps = { - vim, + vim, // Add extra Vim keymap for gc to toggle line comment // We will include a Vim-specific keymap that calls the CM command // respecting the current selection. emacs, - codemirror : () => keymap.of(defaultKeymap), - vscode : vscodeExtension, + codemirror: () => keymap.of(defaultKeymap), + vscode: vscodeExtension, }; export function keybindings(name) { const active = keymaps[name]; - return [ active ? Prec.high(active()) : [] ]; + return [active ? Prec.high(active()) : []]; } diff --git a/packages/osc/server.js b/packages/osc/server.js old mode 100644 new mode 100755 diff --git a/website/src/pages/technical-manual/vim.mdx b/website/src/pages/technical-manual/vim.mdx index ec284d0bf..b18a259ec 100644 --- a/website/src/pages/technical-manual/vim.mdx +++ b/website/src/pages/technical-manual/vim.mdx @@ -8,6 +8,7 @@ layout: ../../layouts/MainLayout.astro When the REPL editor (CodeMirror) is configured to use Vim keybindings, the following commands are available: - :w — Evaluate the current code + - Triggers the same evaluation as Ctrl+Enter / Alt+Enter - You’ll see messages in the Console panel such as: - [vim] :w — evaluating code @@ -15,10 +16,12 @@ When the REPL editor (CodeMirror) is configured to use Vim keybindings, the foll - [eval] code updated - :q — Stop/pause playback + - Triggers the same stop action as Alt+. - Useful to quickly stop scheduling without leaving Vim mode - gc — Toggle line comments for the current selection(s) + - Works in normal and visual mode - If there’s a selection, all selected lines are toggled From 46ba165c7eb7375056625e837fee12ff9cef1aee Mon Sep 17 00:00:00 2001 From: dtricks Date: Fri, 3 Oct 2025 18:16:18 +0200 Subject: [PATCH 036/312] remove gcc --- packages/codemirror/codemirror.mjs | 60 ++++++++++++---------- packages/codemirror/keybindings.mjs | 11 ++-- website/src/pages/technical-manual/vim.mdx | 4 +- 3 files changed, 39 insertions(+), 36 deletions(-) diff --git a/packages/codemirror/codemirror.mjs b/packages/codemirror/codemirror.mjs index f3ab3890e..69fce4b50 100644 --- a/packages/codemirror/codemirror.mjs +++ b/packages/codemirror/codemirror.mjs @@ -1,31 +1,31 @@ import { closeBrackets } from '@codemirror/autocomplete'; -import { toggleLineComment } from '@codemirror/commands'; -export { toggleComment, toggleBlockComment, toggleLineComment, toggleBlockCommentByLine } from '@codemirror/commands'; -// import { search, highlightSelectionMatches } from '@codemirror/search'; -import { indentWithTab } from '@codemirror/commands'; +import { indentWithTab, toggleLineComment } from '@codemirror/commands'; import { javascript, javascriptLanguage } from '@codemirror/lang-javascript'; -import { defaultHighlightStyle, syntaxHighlighting, bracketMatching } from '@codemirror/language'; +import { bracketMatching, defaultHighlightStyle, syntaxHighlighting } from '@codemirror/language'; import { Compartment, EditorState, Prec } from '@codemirror/state'; import { + drawSelection, EditorView, - highlightActiveLineGutter, highlightActiveLine, + highlightActiveLineGutter, keymap, lineNumbers, - drawSelection, } from '@codemirror/view'; -import { repl, registerControl, logger } from '@strudel/core'; -import { Drawer, cleanupDraw } from '@strudel/draw'; +import { persistentAtom } from '@nanostores/persistent'; +import { logger, registerControl, repl } from '@strudel/core'; +import { cleanupDraw, Drawer } from '@strudel/draw'; + import { isAutoCompletionEnabled } from './autocomplete.mjs'; -import { isTooltipEnabled } from './tooltip.mjs'; +import { basicSetup } from './basicSetup.mjs'; import { flash, isFlashEnabled } from './flash.mjs'; import { highlightMiniLocations, isPatternHighlightingEnabled, updateMiniLocations } from './highlight.mjs'; import { keybindings } from './keybindings.mjs'; -import { initTheme, activateTheme, theme } from './themes.mjs'; import { sliderPlugin, updateSliderWidgets } from './slider.mjs'; -import { widgetPlugin, updateWidgets } from './widget.mjs'; -import { persistentAtom } from '@nanostores/persistent'; -import { basicSetup } from './basicSetup.mjs'; +import { activateTheme, initTheme, theme } from './themes.mjs'; +import { isTooltipEnabled } from './tooltip.mjs'; +import { updateWidgets, widgetPlugin } from './widget.mjs'; + +export { toggleBlockComment, toggleBlockCommentByLine, toggleComment, toggleLineComment } from '@codemirror/commands'; const extensions = { isLineWrappingEnabled: (on) => (on ? EditorView.lineWrapping : []), @@ -95,8 +95,8 @@ export function initEditor({ initialCode = '', onChange, onEvaluate, onStop, roo }), sliderPlugin, widgetPlugin, - // indentOnInput(), // works without. already brought with javascript extension? - // bracketMatching(), // does not do anything + // indentOnInput(), // works without. already brought with javascript + // extension? bracketMatching(), // does not do anything syntaxHighlighting(defaultHighlightStyle), EditorView.updateListener.of((v) => onChange(v)), drawSelection({ cursorBlinkRate: 0 }), @@ -120,13 +120,13 @@ export function initEditor({ initialCode = '', onChange, onEvaluate, onStop, roo run: () => onStop?.(), }, /* { - key: 'Ctrl-Shift-.', - run: () => (onPanic ? onPanic() : onStop?.()), - }, - { - key: 'Ctrl-Shift-Enter', - run: () => (onReEvaluate ? onReEvaluate() : onEvaluate?.()), - }, */ + key: 'Ctrl-Shift-.', + run: () => (onPanic ? onPanic() : onStop?.()), + }, + { + key: 'Ctrl-Shift-Enter', + run: () => (onReEvaluate ? onReEvaluate() : onEvaluate?.()), + }, */ ]), ), ], @@ -207,7 +207,8 @@ export class StrudelMirror { updateWidgets(this.editor, widgets); updateMiniLocations(this.editor, this.miniLocations); replOptions?.afterEval?.(options); - // if no painters are set (.onPaint was not called), then we only need the present moment (for highlighting) + // if no painters are set (.onPaint was not called), then we only need + // the present moment (for highlighting) const drawTime = options.pattern.getPainters().length ? this.drawTime : [0, 0]; this.drawer.setDrawTime(drawTime); // invalidate drawer after we've set the appropriate drawTime @@ -261,10 +262,11 @@ export class StrudelMirror { document.addEventListener('repl-evaluate', this.onEvaluateRequest); document.addEventListener('repl-stop', this.onStopRequest); - // Toggle comments requested from Vim (gc/gcc) + // Toggle comments requested from Vim (gc) this.onToggleComment = (e) => { try { - // Honor selections; toggleLineComment handles both selections and single line + // Honor selections; toggleLineComment handles both selections and + // single line toggleLineComment(this.editor); e?.cancelable && e.preventDefault?.(); } catch (err) { @@ -383,7 +385,11 @@ export class StrudelMirror { } } setCode(code) { - const changes = { from: 0, to: this.editor.state.doc.length, insert: code }; + const changes = { + from: 0, + to: this.editor.state.doc.length, + insert: code, + }; this.editor.dispatch({ changes }); } clear() { diff --git a/packages/codemirror/keybindings.mjs b/packages/codemirror/keybindings.mjs index 06aaad523..545c9797d 100644 --- a/packages/codemirror/keybindings.mjs +++ b/packages/codemirror/keybindings.mjs @@ -4,9 +4,9 @@ import { keymap, ViewPlugin } from '@codemirror/view'; // import { searchKeymap } from '@codemirror/search'; import { emacs } from '@replit/codemirror-emacs'; import { vim, Vim } from '@replit/codemirror-vim'; -import { logger } from '@strudel/core'; // import { vim } from './vim_test.mjs'; import { vscodeKeymap } from '@replit/codemirror-vscode-keymap'; +import { logger } from '@strudel/core'; const vscodePlugin = ViewPlugin.fromClass( class { @@ -26,9 +26,9 @@ const vscodeExtension = (options) => [vscodePlugin].concat(options ?? []); // appears in the Console panel. try { if (Vim && typeof Vim.defineEx === 'function') { - // Map gc/gcc to toggle line comments by dispatching a custom event that our - // CodeMirror integration listens to. This avoids depending on Vim's internal - // actions and works with current selections/visual mode. + // Map gc to toggle line comments by dispatching a custom event that our + // CodeMirror integration listens to. This avoids depending on Vim's + // internal actions and works with current selections/visual mode. try { Vim.defineAction('strudelToggleComment', (cm) => { const view = cm?.view || cm; @@ -41,9 +41,8 @@ try { }); Vim.mapCommand('gc', 'action', 'strudelToggleComment', {}, { context: 'normal' }); Vim.mapCommand('gc', 'action', 'strudelToggleComment', {}, { context: 'visual' }); - Vim.mapCommand('gcc', 'action', 'strudelToggleComment', {}, { context: 'normal' }); } catch (e) { - console.error('Vim gc/gcc mapping failed', e); + console.error('Vim gc mapping failed', e); } // :q to pause/stop diff --git a/website/src/pages/technical-manual/vim.mdx b/website/src/pages/technical-manual/vim.mdx index b18a259ec..73f5e1a11 100644 --- a/website/src/pages/technical-manual/vim.mdx +++ b/website/src/pages/technical-manual/vim.mdx @@ -25,8 +25,6 @@ When the REPL editor (CodeMirror) is configured to use Vim keybindings, the foll - Works in normal and visual mode - If there’s a selection, all selected lines are toggled -- gcc — Toggle comment for the current line (normal mode) - Notes - Behavior respects the current language mode in the editor for comment syntax. @@ -36,4 +34,4 @@ Notes Troubleshooting - If :w logs but evaluation doesn’t apply, ensure Vim keybindings are active and try again. You can also use Ctrl+Enter as a fallback. -- For :q / gc / gcc, ensure focus is inside the editor. If an error occurs, reload the page to reset editor state and try again. +- For :q / gc, ensure focus is inside the editor. If an error occurs, reload the page to reset editor state and try again. From cfe17fcba56a8d3767deecd08ef86f054c339d7f Mon Sep 17 00:00:00 2001 From: dtricks Date: Fri, 3 Oct 2025 18:19:18 +0200 Subject: [PATCH 037/312] wrong unicode char --- website/src/pages/technical-manual/vim.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/website/src/pages/technical-manual/vim.mdx b/website/src/pages/technical-manual/vim.mdx index 73f5e1a11..fa53aa550 100644 --- a/website/src/pages/technical-manual/vim.mdx +++ b/website/src/pages/technical-manual/vim.mdx @@ -10,7 +10,7 @@ When the REPL editor (CodeMirror) is configured to use Vim keybindings, the foll - :w — Evaluate the current code - Triggers the same evaluation as Ctrl+Enter / Alt+Enter - - You’ll see messages in the Console panel such as: + - You'll see messages in the Console panel such as: - [vim] :w — evaluating code - [repl] evaluate via event - [eval] code updated @@ -23,15 +23,15 @@ When the REPL editor (CodeMirror) is configured to use Vim keybindings, the foll - gc — Toggle line comments for the current selection(s) - Works in normal and visual mode - - If there’s a selection, all selected lines are toggled + - If there's a selection, all selected lines are toggled Notes - Behavior respects the current language mode in the editor for comment syntax. - If multiple REPL editors are open, commands target the active editor. The implementation dispatches custom events handled by the editor. -- If you don’t see the Console panel, open the right panel in the REPL UI. +- If you don't see the Console panel, open the right panel in the REPL UI. Troubleshooting -- If :w logs but evaluation doesn’t apply, ensure Vim keybindings are active and try again. You can also use Ctrl+Enter as a fallback. +- If :w logs but evaluation doesn't apply, ensure Vim keybindings are active and try again. You can also use Ctrl+Enter as a fallback. - For :q / gc, ensure focus is inside the editor. If an error occurs, reload the page to reset editor state and try again. From 30a2e149592659ec9e9262c7d05fc7134ef29729 Mon Sep 17 00:00:00 2001 From: dtricks Date: Fri, 3 Oct 2025 18:29:32 +0200 Subject: [PATCH 038/312] weird permission change --- packages/osc/server.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 packages/osc/server.js diff --git a/packages/osc/server.js b/packages/osc/server.js old mode 100755 new mode 100644 From a79fc3db5b78a31d6944ca5501206c41cbb9b1bd Mon Sep 17 00:00:00 2001 From: dtricks Date: Sat, 4 Oct 2025 14:49:56 +0200 Subject: [PATCH 039/312] remove unnecessary comments --- packages/codemirror/keybindings.mjs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/packages/codemirror/keybindings.mjs b/packages/codemirror/keybindings.mjs index 545c9797d..5cd6a50e4 100644 --- a/packages/codemirror/keybindings.mjs +++ b/packages/codemirror/keybindings.mjs @@ -45,7 +45,6 @@ try { console.error('Vim gc mapping failed', e); } - // :q to pause/stop // :q to pause/stop Vim.defineEx('quit', 'q', (cm) => { try { @@ -71,7 +70,6 @@ try { } }); - // :w to evaluate // :w to evaluate Vim.defineEx('write', 'w', (cm) => { const view = cm?.view || cm; // CM6 Vim passes either an object with view or the view itself @@ -122,9 +120,6 @@ try { const keymaps = { vim, - // Add extra Vim keymap for gc to toggle line comment - // We will include a Vim-specific keymap that calls the CM command - // respecting the current selection. emacs, codemirror: () => keymap.of(defaultKeymap), vscode: vscodeExtension, From f48f8e46e51c1010bb3dc9e0599b5de8dbb2a00d Mon Sep 17 00:00:00 2001 From: dtricks Date: Mon, 6 Oct 2025 11:09:21 +0200 Subject: [PATCH 040/312] fix empty catches --- packages/codemirror/keybindings.mjs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/codemirror/keybindings.mjs b/packages/codemirror/keybindings.mjs index 5cd6a50e4..81dc87a52 100644 --- a/packages/codemirror/keybindings.mjs +++ b/packages/codemirror/keybindings.mjs @@ -54,7 +54,9 @@ try { try { const ev = new CustomEvent('repl-stop', { detail: { source: 'vim', view }, cancelable: true }); handled = document.dispatchEvent(ev) === false; - } catch {} + } catch (e) { + console.error('Error dispatching repl-stop event', e); + } if (!handled) { const altDot = new KeyboardEvent('keydown', { key: '.', @@ -78,13 +80,17 @@ try { // Let the app know this came from Vim :w try { logger('[vim] :w — evaluating code'); - } catch {} + } catch (e) { + console.error('Error logging Vim :w evaluation', e); + } // Dispatch a dedicated evaluate event first let handled = false; try { const ev = new CustomEvent('repl-evaluate', { detail: { source: 'vim', view }, cancelable: true }); handled = document.dispatchEvent(ev) === false; // false means preventDefault was called - } catch {} + } catch (e) { + console.error('Error dispatching repl-evaluate event', e); + } if (handled) { return; } From 3dc9b3524c40f1dba8492940760c2dde081f5928 Mon Sep 17 00:00:00 2001 From: Tristan de Cacqueray Date: Tue, 7 Oct 2025 17:19:02 +0200 Subject: [PATCH 041/312] mondo: add & sugar --- packages/mondo/mondo.mjs | 23 +++++++++++++++++++++++ packages/mondo/test/mondo.test.mjs | 1 + 2 files changed, 24 insertions(+) diff --git a/packages/mondo/mondo.mjs b/packages/mondo/mondo.mjs index b879f24bf..cdd758431 100644 --- a/packages/mondo/mondo.mjs +++ b/packages/mondo/mondo.mjs @@ -22,6 +22,7 @@ export class MondoParser { number: /^-?[0-9]*\.?[0-9]+/, // before pipe! // TODO: better error handling when "-" is used as rest, e.g "s [- bd]" op: /^[*/:!@%?+-]|^\.{2}/, // * / : ! @ % ? .. + and: /^&/, // dollar: /^\$/, pipe: /^#/, stack: /^[,$]/, @@ -150,6 +151,27 @@ export class MondoParser { } return children; } + desugar_ands(children) { + while (true) { + let opIndex = children.findIndex((child) => child.type === 'and'); + if (opIndex === -1) break; + if (opIndex === children.length - 1) { + throw new Error(`cannot use & as last child.`); + } + if (opIndex === 0) { + throw new Error(`cannot use & as first child.`); + } + // convert infix to prefix notation + const op = { type: 'plain', value: children[opIndex].value }; + const left = children[opIndex - 1]; + const right = children[opIndex + 1]; + const call = { type: 'list', children: [op, left, right] }; + // insert call while keeping other siblings + children = [...children.slice(0, opIndex - 1), call, ...children.slice(opIndex + 2)]; + children = this.unwrap_children(children); + } + return children; + } desugar_ops(children) { while (true) { let opIndex = children.findIndex((child) => child.type === 'op'); @@ -264,6 +286,7 @@ export class MondoParser { children = [{ type: 'plain', value: type }, ...children]; } children = this.desugar_ops(children); + children = this.desugar_ands(children); // children = this.desugar_pipes(children, (children) => this.desugar_dollars(children)); children = this.desugar_pipes(children); return children; diff --git a/packages/mondo/test/mondo.test.mjs b/packages/mondo/test/mondo.test.mjs index 6393b10f9..97f447e78 100644 --- a/packages/mondo/test/mondo.test.mjs +++ b/packages/mondo/test/mondo.test.mjs @@ -117,6 +117,7 @@ describe('mondo sugar', () => { it('should desugar x:y', () => expect(desguar('x:y')).toEqual('(: y x)')); it('should desugar x:y:z', () => expect(desguar('x:y:z')).toEqual('(: z (: y x))')); it('should desugar x:y*x', () => expect(desguar('bd:0*2')).toEqual('(* 2 (: 0 bd))')); + it('should desugar x&y:z', () => expect(desguar('bd&3:8')).toEqual('(& bd (: 8 3))')); it('should desugar a..b', () => expect(desguar('0..2')).toEqual('(.. 2 0)')); /* it('should desugar x $ y', () => expect(desguar('x $ y')).toEqual('(x y)')); it('should desugar x $ y z', () => expect(desguar('x $ y z')).toEqual('(x (y z))')); From b7fa440bda53aa1c281db6fe0a007b610109508c Mon Sep 17 00:00:00 2001 From: Tristan de Cacqueray Date: Tue, 7 Oct 2025 17:33:56 +0200 Subject: [PATCH 042/312] mondough: interpret & --- packages/mondough/mondough.mjs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/mondough/mondough.mjs b/packages/mondough/mondough.mjs index b7ee83787..a299c9a55 100644 --- a/packages/mondough/mondough.mjs +++ b/packages/mondough/mondough.mjs @@ -11,6 +11,7 @@ import { chooseIn, degradeBy, silence, + e, } from '@strudel/core'; import { registerLanguage } from '@strudel/transpiler'; import { MondoRunner } from 'mondolang'; @@ -40,6 +41,7 @@ lib['!'] = extend; lib['@'] = expand; lib['%'] = pace; lib['?'] = degradeBy; // todo: default 0.5 not working.. +lib['&'] = (a, b) => a.e(b); lib[':'] = tail; lib['..'] = range; lib['def'] = () => silence; From f33db5f07f491278995d994b84f06abf3c3c34e0 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Tue, 7 Oct 2025 22:35:29 +0200 Subject: [PATCH 043/312] - refactor bjork -> bjorklund - refactor e -> bjork - flip & desugared arguments --- packages/core/euclid.mjs | 14 +++++++------- packages/mondo/mondo.mjs | 2 +- packages/mondough/mondough.mjs | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/core/euclid.mjs b/packages/core/euclid.mjs index 44ab07f11..98c21a116 100644 --- a/packages/core/euclid.mjs +++ b/packages/core/euclid.mjs @@ -35,18 +35,18 @@ const right = function (n, x) { return result; }; -const _bjork = function (n, x) { +const _bjorklund = function (n, x) { const [ons, offs] = n; - return Math.min(ons, offs) <= 1 ? [n, x] : _bjork(...(ons > offs ? left(n, x) : right(n, x))); + return Math.min(ons, offs) <= 1 ? [n, x] : _bjorklund(...(ons > offs ? left(n, x) : right(n, x))); }; -export const bjork = function (ons, steps) { +export const bjorklund = function (ons, steps) { const inverted = ons < 0; const absOns = Math.abs(ons); const offs = steps - absOns; const ones = Array(absOns).fill([1]); const zeros = Array(offs).fill([0]); - const result = _bjork([absOns, offs], [ones, zeros]); + const result = _bjorklund([absOns, offs], [ones, zeros]); const pattern = flatten(result[1][0]).concat(flatten(result[1][1])); return inverted ? pattern.map((x) => 1 - x) : pattern; }; @@ -128,7 +128,7 @@ export const bjork = function (ons, steps) { */ const _euclidRot = function (pulses, steps, rotation) { - const b = bjork(pulses, steps); + const b = bjorklund(pulses, steps); if (rotation) { return rotate(b, -rotation); } @@ -139,7 +139,7 @@ export const euclid = register('euclid', function (pulses, steps, pat) { return pat.struct(_euclidRot(pulses, steps, 0)); }); -export const e = register('e', function (euc, pat) { +export const bjork = register('bjork', function (euc, pat) { if (!Array.isArray(euc)) { euc = [euc]; } @@ -216,6 +216,6 @@ export const euclidLegatoRot = register(['euclidLegatoRot'], function (pulses, s * .pan(sine.slow(8)) */ export const { euclidish, eish } = register(['euclidish', 'eish'], function (pulses, steps, perc, pat) { - const morphed = _morph(bjork(pulses, steps), new Array(pulses).fill(1), perc); + const morphed = _morph(bjorklund(pulses, steps), new Array(pulses).fill(1), perc); return pat.struct(morphed).setSteps(steps); }); diff --git a/packages/mondo/mondo.mjs b/packages/mondo/mondo.mjs index cdd758431..d419eaff4 100644 --- a/packages/mondo/mondo.mjs +++ b/packages/mondo/mondo.mjs @@ -165,7 +165,7 @@ export class MondoParser { const op = { type: 'plain', value: children[opIndex].value }; const left = children[opIndex - 1]; const right = children[opIndex + 1]; - const call = { type: 'list', children: [op, left, right] }; + const call = { type: 'list', children: [op, right, left] }; // insert call while keeping other siblings children = [...children.slice(0, opIndex - 1), call, ...children.slice(opIndex + 2)]; children = this.unwrap_children(children); diff --git a/packages/mondough/mondough.mjs b/packages/mondough/mondough.mjs index a299c9a55..9b1edb5a5 100644 --- a/packages/mondough/mondough.mjs +++ b/packages/mondough/mondough.mjs @@ -11,7 +11,7 @@ import { chooseIn, degradeBy, silence, - e, + bjork, } from '@strudel/core'; import { registerLanguage } from '@strudel/transpiler'; import { MondoRunner } from 'mondolang'; @@ -41,7 +41,7 @@ lib['!'] = extend; lib['@'] = expand; lib['%'] = pace; lib['?'] = degradeBy; // todo: default 0.5 not working.. -lib['&'] = (a, b) => a.e(b); +lib['&'] = bjork; lib[':'] = tail; lib['..'] = range; lib['def'] = () => silence; From 3a7d50924d190896053a20a783a758da237100bf Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Tue, 7 Oct 2025 22:59:50 +0200 Subject: [PATCH 044/312] refactor: add op_precedence to express & with desugar_ops --- packages/mondo/mondo.mjs | 36 ++++++++---------------------------- 1 file changed, 8 insertions(+), 28 deletions(-) diff --git a/packages/mondo/mondo.mjs b/packages/mondo/mondo.mjs index d419eaff4..00a3b4011 100644 --- a/packages/mondo/mondo.mjs +++ b/packages/mondo/mondo.mjs @@ -21,14 +21,14 @@ export class MondoParser { close_curly: /^\}/, number: /^-?[0-9]*\.?[0-9]+/, // before pipe! // TODO: better error handling when "-" is used as rest, e.g "s [- bd]" - op: /^[*/:!@%?+-]|^\.{2}/, // * / : ! @ % ? .. - and: /^&/, + op: /^[*\/:!@%?+\-&]|^\.{2}/, // * / : ! @ % ? .. // dollar: /^\$/, pipe: /^#/, stack: /^[,$]/, or: /^[|]/, plain: /^[a-zA-Z0-9-~_^#]+/, }; + op_precedence = [['*', '/', ':', '!', '@', '%', '?', '+', '-', '..'], ['&']]; // matches next token next_token(code, offset = 0) { for (let type in this.token_types) { @@ -151,30 +151,9 @@ export class MondoParser { } return children; } - desugar_ands(children) { + desugar_ops(children, types) { while (true) { - let opIndex = children.findIndex((child) => child.type === 'and'); - if (opIndex === -1) break; - if (opIndex === children.length - 1) { - throw new Error(`cannot use & as last child.`); - } - if (opIndex === 0) { - throw new Error(`cannot use & as first child.`); - } - // convert infix to prefix notation - const op = { type: 'plain', value: children[opIndex].value }; - const left = children[opIndex - 1]; - const right = children[opIndex + 1]; - const call = { type: 'list', children: [op, right, left] }; - // insert call while keeping other siblings - children = [...children.slice(0, opIndex - 1), call, ...children.slice(opIndex + 2)]; - children = this.unwrap_children(children); - } - return children; - } - desugar_ops(children) { - while (true) { - let opIndex = children.findIndex((child) => child.type === 'op'); + let opIndex = children.findIndex((child) => child.type === 'op' && types.includes(child.value)); if (opIndex === -1) break; const op = { type: 'plain', value: children[opIndex].value }; if (opIndex === children.length - 1) { @@ -285,9 +264,10 @@ export class MondoParser { // the type we've removed before splitting needs to be added back children = [{ type: 'plain', value: type }, ...children]; } - children = this.desugar_ops(children); - children = this.desugar_ands(children); - // children = this.desugar_pipes(children, (children) => this.desugar_dollars(children)); + // for each precendence group, call desugar_ops once + this.op_precedence.forEach((ops) => { + children = this.desugar_ops(children, ops); + }); children = this.desugar_pipes(children); return children; }), From 319a2d7289ce4cd43e6f2b450e69ea27181d35da Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Tue, 7 Oct 2025 23:05:00 +0200 Subject: [PATCH 045/312] fix: tests --- packages/core/test/euclid.test.js | 16 ++++++++-------- packages/mondo/mondo.mjs | 2 +- packages/mondo/test/mondo.test.mjs | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/core/test/euclid.test.js b/packages/core/test/euclid.test.js index a33ec9514..6169abd71 100644 --- a/packages/core/test/euclid.test.js +++ b/packages/core/test/euclid.test.js @@ -1,14 +1,14 @@ -import { bjork } from '../euclid.mjs'; +import { bjorklund } from '../euclid.mjs'; import { describe, expect, it } from 'vitest'; import { fastcat } from '../pattern.mjs'; -describe('bjork', () => { - it('should apply bjorklund to ons and steps', () => { - expect(bjork(3, 8)).toStrictEqual([1, 0, 0, 1, 0, 0, 1, 0]); - expect(bjork(-3, 8)).toStrictEqual([0, 1, 1, 0, 1, 1, 0, 1]); - expect(bjork(8, 8)).toStrictEqual([1, 1, 1, 1, 1, 1, 1, 1]); - expect(bjork(-8, 8)).toStrictEqual([0, 0, 0, 0, 0, 0, 0, 0]); - expect(bjork(5, 8)).toStrictEqual([1, 0, 1, 1, 0, 1, 1, 0]); +describe('bjorklund', () => { + it('should apply bjorklundlund to ons and steps', () => { + expect(bjorklund(3, 8)).toStrictEqual([1, 0, 0, 1, 0, 0, 1, 0]); + expect(bjorklund(-3, 8)).toStrictEqual([0, 1, 1, 0, 1, 1, 0, 1]); + expect(bjorklund(8, 8)).toStrictEqual([1, 1, 1, 1, 1, 1, 1, 1]); + expect(bjorklund(-8, 8)).toStrictEqual([0, 0, 0, 0, 0, 0, 0, 0]); + expect(bjorklund(5, 8)).toStrictEqual([1, 0, 1, 1, 0, 1, 1, 0]); }); }); diff --git a/packages/mondo/mondo.mjs b/packages/mondo/mondo.mjs index 00a3b4011..b87a8b588 100644 --- a/packages/mondo/mondo.mjs +++ b/packages/mondo/mondo.mjs @@ -21,7 +21,7 @@ export class MondoParser { close_curly: /^\}/, number: /^-?[0-9]*\.?[0-9]+/, // before pipe! // TODO: better error handling when "-" is used as rest, e.g "s [- bd]" - op: /^[*\/:!@%?+\-&]|^\.{2}/, // * / : ! @ % ? .. + op: /^[*/:!@%?+\-&]|^\.{2}/, // * / : ! @ % ? .. // dollar: /^\$/, pipe: /^#/, stack: /^[,$]/, diff --git a/packages/mondo/test/mondo.test.mjs b/packages/mondo/test/mondo.test.mjs index 97f447e78..a02c6fec1 100644 --- a/packages/mondo/test/mondo.test.mjs +++ b/packages/mondo/test/mondo.test.mjs @@ -117,7 +117,7 @@ describe('mondo sugar', () => { it('should desugar x:y', () => expect(desguar('x:y')).toEqual('(: y x)')); it('should desugar x:y:z', () => expect(desguar('x:y:z')).toEqual('(: z (: y x))')); it('should desugar x:y*x', () => expect(desguar('bd:0*2')).toEqual('(* 2 (: 0 bd))')); - it('should desugar x&y:z', () => expect(desguar('bd&3:8')).toEqual('(& bd (: 8 3))')); + it('should desugar x&y:z', () => expect(desguar('bd&3:8')).toEqual('(& (: 8 3) bd)')); it('should desugar a..b', () => expect(desguar('0..2')).toEqual('(.. 2 0)')); /* it('should desugar x $ y', () => expect(desguar('x $ y')).toEqual('(x y)')); it('should desugar x $ y z', () => expect(desguar('x $ y z')).toEqual('(x (y z))')); From a3b803c3f33d9c029690ad0631adc9feec3c17ab Mon Sep 17 00:00:00 2001 From: Aria Date: Thu, 9 Oct 2025 18:28:59 -0500 Subject: [PATCH 046/312] First pass --- packages/core/controls.mjs | 145 +++++++++++++++++++++++ packages/core/test/pattern.test.mjs | 4 +- packages/superdough/helpers.mjs | 71 +++++++---- packages/superdough/superdough.mjs | 138 ++++++++++----------- packages/superdough/util.mjs | 5 + website/src/components/Header/Search.css | 4 +- website/src/pages/learn/samples.mdx | 2 +- 7 files changed, 271 insertions(+), 98 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 7e3c2a8e2..8a332ac26 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -1288,6 +1288,151 @@ export const { fanchor } = registerControl('fanchor'); */ // currently an alias of 'hcutoff' https://codeberg.org/uzu/strudel/issues/496 // ['hpf'], + +/** + * Rate of the LFO for the lowpass filter + * + * @name lprate + * @param {number | Pattern} rate rate in hertz + */ +export const { lprate } = registerControl('lprate'); + +/** + * Cycle-synced rate of the LFO for the lowpass filter + * + * @name lpsync + * @param {number | Pattern} rate rate in cycles + */ +export const { lpsync } = registerControl('lpsync'); + +/** + * Depth of the LFO for the lowpass filter + * + * @name lpdepth + * @param {number | Pattern} depth depth of modulation + */ +export const { lpdepth } = registerControl('lpdepth'); + +/** + * Shape of the LFO for the lowpass filter + * + * @name lpshape + * @param {number | Pattern} shape Shape of the lfo (0, 1, 2, ..) + */ +export const { lpshape } = registerControl('lpshape'); + +/** + * DC offset of the LFO for the lowpass filter + * + * @name lpdc + * @param {number | Pattern} dcoffset dc offset. set to 0 for unipolar + */ +export const { lpdc } = registerControl('lpdc'); + +/** + * Skew of the LFO for the lowpass filter + * + * @name lpskew + * @param {number | Pattern} skew How much to bend the LFO shape + */ +export const { lpskew } = registerControl('lpskew'); + +/** + * Rate of the LFO for the bandpass filter + * + * @name bprate + * @param {number | Pattern} rate rate in hertz + */ +export const { bprate } = registerControl('bprate'); + +/** + * Cycle-synced rate of the LFO for the bandpass filter + * + * @name bpsync + * @param {number | Pattern} rate rate in cycles + */ +export const { bpsync } = registerControl('bpsync'); + +/** + * Depth of the LFO for the bandpass filter + * + * @name bpdepth + * @param {number | Pattern} depth depth of modulation + */ +export const { bpdepth } = registerControl('bpdepth'); + +/** + * Shape of the LFO for the bandpass filter + * + * @name bpshape + * @param {number | Pattern} shape Shape of the lfo (0, 1, 2, ..) + */ +export const { bpshape } = registerControl('bpshape'); + +/** + * DC offset of the LFO for the bandpass filter + * + * @name bpdc + * @param {number | Pattern} dcoffset dc offset. set to 0 for unipolar + */ +export const { bpdc } = registerControl('bpdc'); + +/** + * Skew of the LFO for the bandpass filter + * + * @name bpskew + * @param {number | Pattern} skew How much to bend the LFO shape + */ +export const { bpskew } = registerControl('bpskew'); + +/** + * Rate of the LFO for the highpass filter + * + * @name hprate + * @param {number | Pattern} rate rate in hertz + */ +export const { hprate } = registerControl('hprate'); + +/** + * Cycle-synced rate of the LFO for the highpass filter + * + * @name hpsync + * @param {number | Pattern} rate rate in cycles + */ +export const { hpsync } = registerControl('hpsync'); + +/** + * Depth of the LFO for the highpass filter + * + * @name hpdepth + * @param {number | Pattern} depth depth of modulation + */ +export const { hpdepth } = registerControl('hpdepth'); + +/** + * Shape of the LFO for the highpass filter + * + * @name hpshape + * @param {number | Pattern} shape Shape of the lfo (0, 1, 2, ..) + */ +export const { hpshape } = registerControl('hpshape'); + +/** + * DC offset of the LFO for the highpass filter + * + * @name hpdc + * @param {number | Pattern} dcoffset dc offset. set to 0 for unipolar + */ +export const { hpdc } = registerControl('hpdc'); + +/** + * Skew of the LFO for the highpass filter + * + * @name hpskew + * @param {number | Pattern} skew How much to bend the LFO shape + */ +export const { hpskew } = registerControl('hpskew'); + /** * Applies a vibrato to the frequency of the oscillator. * diff --git a/packages/core/test/pattern.test.mjs b/packages/core/test/pattern.test.mjs index 1df5c8776..625f40756 100644 --- a/packages/core/test/pattern.test.mjs +++ b/packages/core/test/pattern.test.mjs @@ -796,7 +796,7 @@ describe('Pattern', () => { }); }); describe('apply', () => { - it('Can apply a function', () => { + (it('Can apply a function', () => { expect(sequence('a', 'b').apply(fast(2)).firstCycle()).toStrictEqual(sequence('a', 'b').fast(2).firstCycle()); }), it('Can apply a pattern of functions', () => { @@ -804,7 +804,7 @@ describe('Pattern', () => { expect(sequence('a', 'b').apply(fast(2), fast(3)).firstCycle()).toStrictEqual( sequence('a', 'b').fast(2, 3).firstCycle(), ); - }); + })); }); describe('layer', () => { it('Can layer up multiple functions', () => { diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 47bca330d..147291ad3 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -153,6 +153,24 @@ export const getADSRValues = (params, curve = 'linear', defaultValues) => { return [Math.max(a ?? 0, envmin), Math.max(d ?? 0, envmin), Math.min(sustain, envmax), Math.max(r ?? 0, releaseMin)]; }; +export function getParamLfo(audioContext, param, start, end, lfoValues) { + let { defaultDepth = 1, depth, dcoffset, ...getLfoInputs } = lfoValues; + if (depth == null) { + const hasLFOParams = Object.values(getLfoInputs).some((v) => v != null); + depth = hasLFOParams ? defaultDepth : 0; + } + let lfo; + if (depth) { + lfo = getLfo(audioContext, start, end, { + depth, + dcoffset, + ...getLfoInputs, + }); + lfo.connect(param); + } + return lfo; +} + // helper utility for applying standard modulators to a parameter export function applyParameterModulators(audioContext, param, start, end, envelopeValues, lfoValues) { let { amount, offset, defaultAmount = 1, curve = 'linear', values, holdEnd, defaultValues } = envelopeValues; @@ -169,41 +187,39 @@ export function applyParameterModulators(audioContext, param, start, end, envelo const [attack, decay, sustain, release] = getADSRValues(values, curve, defaultValues); getParamADSR(param, attack, decay, sustain, release, min, max, start, holdEnd, curve); } - let lfo; - let { defaultDepth = 1, depth, dcoffset, ...getLfoInputs } = lfoValues; - - if (depth == null) { - const hasLFOParams = Object.values(getLfoInputs).some((v) => v != null); - depth = hasLFOParams ? defaultDepth : 0; - } - if (depth) { - lfo = getLfo(audioContext, start, end, { - depth, - dcoffset, - ...getLfoInputs, - }); - lfo.connect(param); - } - + const lfo = getParamLfo(audioContext, param, start, end, lfoValues); return { lfo, disconnect: () => lfo?.disconnect() }; } -export function createFilter(context, type, frequency, Q, att, dec, sus, rel, fenv, start, end, fanchor, model, drive) { - const curve = 'exponential'; - const [attack, decay, sustain, release] = getADSRValues([att, dec, sus, rel], curve, [0.005, 0.14, 0, 0.1]); - let filter; +export function createFilter(context, start, end, params, cps) { + let { + frequency, + fanchor, + fenv, + type, + model, + q = 1, + drive = 0.69, + depth, + dcoffset = -0.5, + skew, + shape, + rate, + sync, + } = params; let frequencyParam; if (model === 'ladder') { - filter = getWorklet(context, 'ladder-processor', { frequency, q: Q, drive }); + filter = getWorklet(context, 'ladder-processor', { frequency, q, drive }); frequencyParam = filter.parameters.get('frequency'); } else { filter = context.createBiquadFilter(); filter.type = type; - filter.Q.value = Q; + filter.Q.value = q; filter.frequency.value = frequency; frequencyParam = filter.frequency; } - + const envelopeValues = [params.attack, params.decay, params.sustain, params.release]; + const [attack, decay, sustain, release] = getADSRValues(envelopeValues, 'exponential', [0.005, 0.14, 0, 0.1]); // envelope is active when any of these values is set const hasEnvelope = att ?? dec ?? sus ?? rel ?? fenv; // Apply ADSR to filter frequency @@ -216,8 +232,15 @@ export function createFilter(context, type, frequency, Q, att, dec, sus, rel, fe let max = clamp(2 ** (fenvAbs - offset) * frequency, 0, 20000); if (fenv < 0) [min, max] = [max, min]; getParamADSR(frequencyParam, attack, decay, sustain, release, min, max, start, end, curve); - return filter; } + + if (sync != null) { + rate = cps * sync; + } + const lfoValues = { depth, dcoffset, skew, shape, frequency: rate }; + getParamLfo(context, frequencyParam, start, end, lfoValues); + // TODO: remember to disconnect LFO + // lfo?.disconnect() return filter; } diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 52ed9bff8..bae422354 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -7,7 +7,7 @@ This program is free software: you can redistribute it and/or modify it under th import './feedbackdelay.mjs'; import './reverb.mjs'; import './vowel.mjs'; -import { nanFallback, _mod, cycleToSeconds } from './util.mjs'; +import { nanFallback, _mod, cycleToSeconds, pickAndRename } from './util.mjs'; import workletsUrl from './worklets.mjs?audioworklet'; import { createFilter, gainNode, getCompressor, getLfo, getWorklet, effectSend } from './helpers.mjs'; import { map } from 'nanostores'; @@ -145,11 +145,6 @@ let defaultDefaultValues = { gain: 0.8, postgain: 1, density: '.03', - ftype: '12db', - fanchor: 0, - resonance: 1, - hresonance: 1, - bandq: 1, channels: [1, 2], phaserdepth: 0.75, shapevol: 1, @@ -432,32 +427,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) djf, // filters fanchor = getDefaultValue('fanchor'), - drive = 0.69, release = 0, - // low pass - cutoff, - lpenv, - lpattack, - lpdecay, - lpsustain, - lprelease, - resonance = getDefaultValue('resonance'), - // high pass - hpenv, - hcutoff, - hpattack, - hpdecay, - hpsustain, - hprelease, - hresonance = getDefaultValue('hresonance'), - // band pass - bpenv, - bandf, - bpattack, - bpdecay, - bpsustain, - bprelease, - bandq = getDefaultValue('bandq'), //phaser phaserrate: phaser, @@ -581,57 +551,87 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) // gain stage chain.push(gainNode(gain)); - //filter + // filter const ftype = getFilterType(value.ftype); - if (cutoff !== undefined) { - let lp = () => - createFilter( - ac, - 'lowpass', - cutoff, - resonance, - lpattack, - lpdecay, - lpsustain, - lprelease, - lpenv, - t, - end, - fanchor, - ftype, - drive, - ); + + if (value.cutoff !== undefined) { + const lpMap = { + frequency: 'cutoff', + q: 'resonance', + attack: 'lpattack', + decay: 'lpdecay', + sustain: 'lpsustain', + release: 'lprelease', + env: 'lpenv', + anchor: 'fanchor', + model: 'ftype', + drive: 'drive', + rate: 'lprate', + sync: 'lpsync', + depth: 'lpdepth', + shape: 'lpshape', + dcoffset: 'lpdc', + skew: 'lpskew', + }; + const lpParams = pickAndRename(value, lpMap); + lpParams.type = 'lowpass'; + let lp = () => createFilter(ac, t, end, lpParams, cps); chain.push(lp()); if (ftype === '24db') { chain.push(lp()); } } - if (hcutoff !== undefined) { - let hp = () => - createFilter( - ac, - 'highpass', - hcutoff, - hresonance, - hpattack, - hpdecay, - hpsustain, - hprelease, - hpenv, - t, - end, - fanchor, - ); + if (value.hcutoff !== undefined) { + const hpMap = { + frequency: 'hcutoff', + q: 'hresonance', + attack: 'hpattack', + decay: 'hpdecay', + sustain: 'hpsustain', + release: 'hprelease', + env: 'hpenv', + anchor: 'fanchor', + model: 'ftype', + drive: 'drive', + rate: 'hprate', + sync: 'hpsync', + depth: 'hpdepth', + shape: 'hpshape', + dcoffset: 'hpdc', + skew: 'hpskew', + }; + const hpParams = pickAndRename(value, hpMap); + hpParams.type = 'highpass'; + let hp = () => createFilter(ac, t, end, hpParams, cps); chain.push(hp()); if (ftype === '24db') { chain.push(hp()); } } - if (bandf !== undefined) { - let bp = () => - createFilter(ac, 'bandpass', bandf, bandq, bpattack, bpdecay, bpsustain, bprelease, bpenv, t, end, fanchor); + if (value.bandf !== undefined) { + const bpMap = { + frequency: 'bandf', + q: 'bandq', + attack: 'bpattack', + decay: 'bpdecay', + sustain: 'bpsustain', + release: 'bprelease', + env: 'bpenv', + anchor: 'fanchor', + model: 'ftype', + drive: 'drive', + rate: 'bprate', + sync: 'bpsync', + depth: 'bpdepth', + shape: 'bpshape', + dcoffset: 'bpdc', + skew: 'bpskew', + }; + const bpParams = pickAndRename(value, bpMap); + bpParams.type = 'bandpass'; + let bp = () => createFilter(ac, t, end, bpParams, cps); chain.push(bp()); if (ftype === '24db') { chain.push(bp()); diff --git a/packages/superdough/util.mjs b/packages/superdough/util.mjs index 475c05f63..f296cca00 100644 --- a/packages/superdough/util.mjs +++ b/packages/superdough/util.mjs @@ -105,3 +105,8 @@ export function getCommonSampleInfo(hapValue, bank) { const label = `${s}:${index}`; return { transpose, url, index, midi, label }; } + +/** Selects entries from `source` and renames them via `map` */ +export const pickAndRename = (source, map) => { + return Object.fromEntries(Object.entries(map).map(([newKey, oldKey]) => [newKey, source[oldKey]])); +}; diff --git a/website/src/components/Header/Search.css b/website/src/components/Header/Search.css index 456ef9f6b..b14146cbd 100644 --- a/website/src/components/Header/Search.css +++ b/website/src/components/Header/Search.css @@ -18,8 +18,8 @@ --docsearch-modal-background: var(--background); --docsearch-muted-color: color-mix(in srgb, var(--foreground), #fff 30%); --docsearch-key-gradient: var(--foreground); - --docsearch-key-shadow: inset 0 -2px 0 0 var(--gutterForeground), inset 0 0 1px 1px var(--foreground), - 0 1px 2px 1px var(--gutterBackground); + --docsearch-key-shadow: + inset 0 -2px 0 0 var(--gutterForeground), inset 0 0 1px 1px var(--foreground), 0 1px 2px 1px var(--gutterBackground); } .dark { --docsearch-muted-color: color-mix(in srgb, var(--foreground), #000 30%); diff --git a/website/src/pages/learn/samples.mdx b/website/src/pages/learn/samples.mdx index eb79cccf7..201d57dfa 100644 --- a/website/src/pages/learn/samples.mdx +++ b/website/src/pages/learn/samples.mdx @@ -381,7 +381,7 @@ Sampler effects are functions that can be used to change the behaviour of sample ### scrub -{' '} + ### speed From 57fac576779d8cfcf8477aa0b32e2e02b3015772 Mon Sep 17 00:00:00 2001 From: Aria Date: Thu, 9 Oct 2025 22:23:28 -0500 Subject: [PATCH 047/312] Remove todo --- packages/superdough/helpers.mjs | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 147291ad3..f26599855 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -239,8 +239,6 @@ export function createFilter(context, start, end, params, cps) { } const lfoValues = { depth, dcoffset, skew, shape, frequency: rate }; getParamLfo(context, frequencyParam, start, end, lfoValues); - // TODO: remember to disconnect LFO - // lfo?.disconnect() return filter; } From ac7e9c697851d569ab6681ce735bc7dc8d7d0bd5 Mon Sep 17 00:00:00 2001 From: Aria Date: Tue, 14 Oct 2025 11:37:41 -0500 Subject: [PATCH 048/312] Typos on envelope values --- packages/core/test/pattern.test.mjs | 4 ++-- packages/superdough/helpers.mjs | 24 ++++++++++++------------ website/src/components/Header/Search.css | 4 ++-- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/core/test/pattern.test.mjs b/packages/core/test/pattern.test.mjs index 625f40756..1df5c8776 100644 --- a/packages/core/test/pattern.test.mjs +++ b/packages/core/test/pattern.test.mjs @@ -796,7 +796,7 @@ describe('Pattern', () => { }); }); describe('apply', () => { - (it('Can apply a function', () => { + it('Can apply a function', () => { expect(sequence('a', 'b').apply(fast(2)).firstCycle()).toStrictEqual(sequence('a', 'b').fast(2).firstCycle()); }), it('Can apply a pattern of functions', () => { @@ -804,7 +804,7 @@ describe('Pattern', () => { expect(sequence('a', 'b').apply(fast(2), fast(3)).firstCycle()).toStrictEqual( sequence('a', 'b').fast(2, 3).firstCycle(), ); - })); + }); }); describe('layer', () => { it('Can layer up multiple functions', () => { diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 8e59eb720..b3fc53356 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -195,8 +195,8 @@ export function applyParameterModulators(audioContext, param, start, end, envelo export function createFilter(context, start, end, params, cps) { let { frequency, - fanchor, - fenv, + anchor, + env, type, model, q = 1, @@ -208,7 +208,7 @@ export function createFilter(context, start, end, params, cps) { rate, sync, } = params; - let frequencyParam; + let frequencyParam, filter; if (model === 'ladder') { filter = getWorklet(context, 'ladder-processor', { frequency, q, drive }); frequencyParam = filter.parameters.get('frequency'); @@ -222,17 +222,17 @@ export function createFilter(context, start, end, params, cps) { const envelopeValues = [params.attack, params.decay, params.sustain, params.release]; const [attack, decay, sustain, release] = getADSRValues(envelopeValues, 'exponential', [0.005, 0.14, 0, 0.1]); // envelope is active when any of these values is set - const hasEnvelope = att ?? dec ?? sus ?? rel ?? fenv; + const hasEnvelope = [...envelopeValues, env].some((v) => v !== undefined); // Apply ADSR to filter frequency - if (hasEnvelope !== undefined) { - fenv = nanFallback(fenv, 1, true); - fanchor = nanFallback(fanchor, 0, true); - const fenvAbs = Math.abs(fenv); - const offset = fenvAbs * fanchor; + if (hasEnvelope) { + env = nanFallback(env, 1, true); + anchor = nanFallback(anchor, 0, true); + const envAbs = Math.abs(env); + const offset = envAbs * anchor; let min = clamp(2 ** -offset * frequency, 0, 20000); - let max = clamp(2 ** (fenvAbs - offset) * frequency, 0, 20000); - if (fenv < 0) [min, max] = [max, min]; - getParamADSR(frequencyParam, attack, decay, sustain, release, min, max, start, end, curve); + let max = clamp(2 ** (envAbs - offset) * frequency, 0, 20000); + if (env < 0) [min, max] = [max, min]; + getParamADSR(frequencyParam, attack, decay, sustain, release, min, max, start, end, 'exponential'); } if (sync != null) { diff --git a/website/src/components/Header/Search.css b/website/src/components/Header/Search.css index b14146cbd..456ef9f6b 100644 --- a/website/src/components/Header/Search.css +++ b/website/src/components/Header/Search.css @@ -18,8 +18,8 @@ --docsearch-modal-background: var(--background); --docsearch-muted-color: color-mix(in srgb, var(--foreground), #fff 30%); --docsearch-key-gradient: var(--foreground); - --docsearch-key-shadow: - inset 0 -2px 0 0 var(--gutterForeground), inset 0 0 1px 1px var(--foreground), 0 1px 2px 1px var(--gutterBackground); + --docsearch-key-shadow: inset 0 -2px 0 0 var(--gutterForeground), inset 0 0 1px 1px var(--foreground), + 0 1px 2px 1px var(--gutterBackground); } .dark { --docsearch-muted-color: color-mix(in srgb, var(--foreground), #000 30%); From 0fe7edc15756919b73564ba84f54695d9f2fcb67 Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 15 Oct 2025 14:53:07 -0500 Subject: [PATCH 049/312] Some examples --- packages/core/controls.mjs | 30 ++- packages/core/signal.mjs | 11 ++ test/__snapshots__/examples.test.mjs.snap | 212 ++++++++++++++++++++++ 3 files changed, 251 insertions(+), 2 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 30b3c14f3..327f8df51 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -2072,8 +2072,6 @@ export const { tsdelay } = registerControl('tsdelay'); export const { real } = registerControl('real'); export const { imag } = registerControl('imag'); export const { enhance } = registerControl('enhance'); -export const { partials } = registerControl('partials'); -export const { phases } = registerControl('phases'); export const { comb } = registerControl('comb'); export const { smear } = registerControl('smear'); export const { scram } = registerControl('scram'); @@ -2375,3 +2373,31 @@ export const scrub = register( }, false, ); + +/** + * Scale the magnitude of the harmonics of one of the core synths ('sine', 'tri', 'saw', ..) + * + * Can also be used to create a new synth via `s('user').partials(...)` + * + * @name partials + * @param {number[] | Pattern} partials List of magnitudes for partials. 0th entry is the first harmonic (i.e. DC offset is skipped) + * @example + * s("user").seg(16).n(irand(8)).scale("A:major") + * .partials([1, 0, 1, 0, 0, 1]) + * @example + * s("saw").seg(8).n(irand(12)).scale("G#:minor") + * .partials(binaryL(256)) + */ +export const { partials } = registerControl('partials'); + +/** + * Rotates the harmonics of one of the core synths ('sine', 'tri', 'saw', 'user', ..) by a list of phases + * + * @name phases + * @param {number[] | Pattern} phases List of phases for partials. 0th entry is the first phase (i.e. DC offset is skipped) + * @example + * s("saw").seg(8).n(irand(12)).scale("G#:minor") + * .partials(binaryL(256)) + * .phases(randL(20)) + */ +export const { phases } = registerControl('phases'); diff --git a/packages/core/signal.mjs b/packages/core/signal.mjs index b4dc825fc..604d1c805 100644 --- a/packages/core/signal.mjs +++ b/packages/core/signal.mjs @@ -263,6 +263,8 @@ export const binaryN = (n, nBits = 16) => { * * @name binaryL * @param {number} n - input number to convert to binary + * s("saw").seg(8) + * .partials(binaryL(irand(4096).add(1))) */ export const binaryL = (n) => { const nBits = reify(n).log2(0).floor().add(1); @@ -288,6 +290,15 @@ export const binaryNL = (n, nBits = 16) => { .appLeft(reify(nBits)); }; +/** + * Creates a list of random numbers of the given length + * + * @name randL + * @param {number} n Number of random numbers to sample + * @example + * s("saw").seg(16).n(irand(12)).scale("F1:minor") + * .partials(randL(8)) + */ export const randL = (n) => { return signal((t) => (nVal) => timeToRands(t, nVal).map(Math.abs)).appLeft(reify(n)); }; diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 937d42797..17c25cc5b 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -7078,6 +7078,112 @@ exports[`runs examples > example "panchor" example index 0 1`] = ` ] `; +exports[`runs examples > example "partials" example index 0 1`] = ` +[ + "[ 0/1 → 1/16 | s:user note:A3 partials:[1 0 1 0 0 1] ]", + "[ 1/16 → 1/8 | s:user note:G#4 partials:[1 0 1 0 0 1] ]", + "[ 1/8 → 3/16 | s:user note:F#4 partials:[1 0 1 0 0 1] ]", + "[ 3/16 → 1/4 | s:user note:B3 partials:[1 0 1 0 0 1] ]", + "[ 1/4 → 5/16 | s:user note:C#4 partials:[1 0 1 0 0 1] ]", + "[ 5/16 → 3/8 | s:user note:E4 partials:[1 0 1 0 0 1] ]", + "[ 3/8 → 7/16 | s:user note:D4 partials:[1 0 1 0 0 1] ]", + "[ 7/16 → 1/2 | s:user note:C#4 partials:[1 0 1 0 0 1] ]", + "[ 1/2 → 9/16 | s:user note:C#4 partials:[1 0 1 0 0 1] ]", + "[ 9/16 → 5/8 | s:user note:B3 partials:[1 0 1 0 0 1] ]", + "[ 5/8 → 11/16 | s:user note:B3 partials:[1 0 1 0 0 1] ]", + "[ 11/16 → 3/4 | s:user note:D4 partials:[1 0 1 0 0 1] ]", + "[ 3/4 → 13/16 | s:user note:B3 partials:[1 0 1 0 0 1] ]", + "[ 13/16 → 7/8 | s:user note:G#4 partials:[1 0 1 0 0 1] ]", + "[ 7/8 → 15/16 | s:user note:D4 partials:[1 0 1 0 0 1] ]", + "[ 15/16 → 1/1 | s:user note:F#4 partials:[1 0 1 0 0 1] ]", + "[ 1/1 → 17/16 | s:user note:E4 partials:[1 0 1 0 0 1] ]", + "[ 17/16 → 9/8 | s:user note:E4 partials:[1 0 1 0 0 1] ]", + "[ 9/8 → 19/16 | s:user note:F#4 partials:[1 0 1 0 0 1] ]", + "[ 19/16 → 5/4 | s:user note:A3 partials:[1 0 1 0 0 1] ]", + "[ 5/4 → 21/16 | s:user note:F#4 partials:[1 0 1 0 0 1] ]", + "[ 21/16 → 11/8 | s:user note:A3 partials:[1 0 1 0 0 1] ]", + "[ 11/8 → 23/16 | s:user note:B3 partials:[1 0 1 0 0 1] ]", + "[ 23/16 → 3/2 | s:user note:E4 partials:[1 0 1 0 0 1] ]", + "[ 3/2 → 25/16 | s:user note:E4 partials:[1 0 1 0 0 1] ]", + "[ 25/16 → 13/8 | s:user note:B3 partials:[1 0 1 0 0 1] ]", + "[ 13/8 → 27/16 | s:user note:D4 partials:[1 0 1 0 0 1] ]", + "[ 27/16 → 7/4 | s:user note:C#4 partials:[1 0 1 0 0 1] ]", + "[ 7/4 → 29/16 | s:user note:B3 partials:[1 0 1 0 0 1] ]", + "[ 29/16 → 15/8 | s:user note:D4 partials:[1 0 1 0 0 1] ]", + "[ 15/8 → 31/16 | s:user note:E4 partials:[1 0 1 0 0 1] ]", + "[ 31/16 → 2/1 | s:user note:G#4 partials:[1 0 1 0 0 1] ]", + "[ 2/1 → 33/16 | s:user note:A4 partials:[1 0 1 0 0 1] ]", + "[ 33/16 → 17/8 | s:user note:C#4 partials:[1 0 1 0 0 1] ]", + "[ 17/8 → 35/16 | s:user note:A4 partials:[1 0 1 0 0 1] ]", + "[ 35/16 → 9/4 | s:user note:A3 partials:[1 0 1 0 0 1] ]", + "[ 9/4 → 37/16 | s:user note:C#4 partials:[1 0 1 0 0 1] ]", + "[ 37/16 → 19/8 | s:user note:F#4 partials:[1 0 1 0 0 1] ]", + "[ 19/8 → 39/16 | s:user note:G#4 partials:[1 0 1 0 0 1] ]", + "[ 39/16 → 5/2 | s:user note:B3 partials:[1 0 1 0 0 1] ]", + "[ 5/2 → 41/16 | s:user note:D4 partials:[1 0 1 0 0 1] ]", + "[ 41/16 → 21/8 | s:user note:E4 partials:[1 0 1 0 0 1] ]", + "[ 21/8 → 43/16 | s:user note:B3 partials:[1 0 1 0 0 1] ]", + "[ 43/16 → 11/4 | s:user note:E4 partials:[1 0 1 0 0 1] ]", + "[ 11/4 → 45/16 | s:user note:F#4 partials:[1 0 1 0 0 1] ]", + "[ 45/16 → 23/8 | s:user note:A4 partials:[1 0 1 0 0 1] ]", + "[ 23/8 → 47/16 | s:user note:A3 partials:[1 0 1 0 0 1] ]", + "[ 47/16 → 3/1 | s:user note:C#4 partials:[1 0 1 0 0 1] ]", + "[ 3/1 → 49/16 | s:user note:B3 partials:[1 0 1 0 0 1] ]", + "[ 49/16 → 25/8 | s:user note:A3 partials:[1 0 1 0 0 1] ]", + "[ 25/8 → 51/16 | s:user note:C#4 partials:[1 0 1 0 0 1] ]", + "[ 51/16 → 13/4 | s:user note:A4 partials:[1 0 1 0 0 1] ]", + "[ 13/4 → 53/16 | s:user note:A4 partials:[1 0 1 0 0 1] ]", + "[ 53/16 → 27/8 | s:user note:C#4 partials:[1 0 1 0 0 1] ]", + "[ 27/8 → 55/16 | s:user note:D4 partials:[1 0 1 0 0 1] ]", + "[ 55/16 → 7/2 | s:user note:G#4 partials:[1 0 1 0 0 1] ]", + "[ 7/2 → 57/16 | s:user note:D4 partials:[1 0 1 0 0 1] ]", + "[ 57/16 → 29/8 | s:user note:G#4 partials:[1 0 1 0 0 1] ]", + "[ 29/8 → 59/16 | s:user note:A4 partials:[1 0 1 0 0 1] ]", + "[ 59/16 → 15/4 | s:user note:A4 partials:[1 0 1 0 0 1] ]", + "[ 15/4 → 61/16 | s:user note:G#4 partials:[1 0 1 0 0 1] ]", + "[ 61/16 → 31/8 | s:user note:A3 partials:[1 0 1 0 0 1] ]", + "[ 31/8 → 63/16 | s:user note:F#4 partials:[1 0 1 0 0 1] ]", + "[ 63/16 → 4/1 | s:user note:C#4 partials:[1 0 1 0 0 1] ]", +] +`; + +exports[`runs examples > example "partials" example index 1 1`] = ` +[ + "[ 0/1 → 1/8 | s:saw note:G#3 partials:[1 0 0 0 0 0 0 0 0] ]", + "[ 1/8 → 1/4 | s:saw note:A#4 partials:[1 0 0 0 0 0 0 0 0] ]", + "[ 1/4 → 3/8 | s:saw note:D#4 partials:[1 0 0 0 0 0 0 0 0] ]", + "[ 3/8 → 1/2 | s:saw note:D#4 partials:[1 0 0 0 0 0 0 0 0] ]", + "[ 1/2 → 5/8 | s:saw note:C#4 partials:[1 0 0 0 0 0 0 0 0] ]", + "[ 5/8 → 3/4 | s:saw note:A#3 partials:[1 0 0 0 0 0 0 0 0] ]", + "[ 3/4 → 7/8 | s:saw note:B3 partials:[1 0 0 0 0 0 0 0 0] ]", + "[ 7/8 → 1/1 | s:saw note:D#4 partials:[1 0 0 0 0 0 0 0 0] ]", + "[ 1/1 → 9/8 | s:saw note:F#4 partials:[1 0 0 0 0 0 0 0 0] ]", + "[ 9/8 → 5/4 | s:saw note:A#4 partials:[1 0 0 0 0 0 0 0 0] ]", + "[ 5/4 → 11/8 | s:saw note:A#4 partials:[1 0 0 0 0 0 0 0 0] ]", + "[ 11/8 → 3/2 | s:saw note:B3 partials:[1 0 0 0 0 0 0 0 0] ]", + "[ 3/2 → 13/8 | s:saw note:G#4 partials:[1 0 0 0 0 0 0 0 0] ]", + "[ 13/8 → 7/4 | s:saw note:E4 partials:[1 0 0 0 0 0 0 0 0] ]", + "[ 7/4 → 15/8 | s:saw note:B3 partials:[1 0 0 0 0 0 0 0 0] ]", + "[ 15/8 → 2/1 | s:saw note:G#4 partials:[1 0 0 0 0 0 0 0 0] ]", + "[ 2/1 → 17/8 | s:saw note:D#5 partials:[1 0 0 0 0 0 0 0 0] ]", + "[ 17/8 → 9/4 | s:saw note:C#5 partials:[1 0 0 0 0 0 0 0 0] ]", + "[ 9/4 → 19/8 | s:saw note:D#4 partials:[1 0 0 0 0 0 0 0 0] ]", + "[ 19/8 → 5/2 | s:saw note:C#5 partials:[1 0 0 0 0 0 0 0 0] ]", + "[ 5/2 → 21/8 | s:saw note:E4 partials:[1 0 0 0 0 0 0 0 0] ]", + "[ 21/8 → 11/4 | s:saw note:A#3 partials:[1 0 0 0 0 0 0 0 0] ]", + "[ 11/4 → 23/8 | s:saw note:G#4 partials:[1 0 0 0 0 0 0 0 0] ]", + "[ 23/8 → 3/1 | s:saw note:G#3 partials:[1 0 0 0 0 0 0 0 0] ]", + "[ 3/1 → 25/8 | s:saw note:B3 partials:[1 0 0 0 0 0 0 0 0] ]", + "[ 25/8 → 13/4 | s:saw note:D#4 partials:[1 0 0 0 0 0 0 0 0] ]", + "[ 13/4 → 27/8 | s:saw note:D#5 partials:[1 0 0 0 0 0 0 0 0] ]", + "[ 27/8 → 7/2 | s:saw note:D#4 partials:[1 0 0 0 0 0 0 0 0] ]", + "[ 7/2 → 29/8 | s:saw note:D#4 partials:[1 0 0 0 0 0 0 0 0] ]", + "[ 29/8 → 15/4 | s:saw note:D#5 partials:[1 0 0 0 0 0 0 0 0] ]", + "[ 15/4 → 31/8 | s:saw note:B4 partials:[1 0 0 0 0 0 0 0 0] ]", + "[ 31/8 → 4/1 | s:saw note:A#4 partials:[1 0 0 0 0 0 0 0 0] ]", +] +`; + exports[`runs examples > example "pattack" example index 0 1`] = ` [ "[ 0/1 → 1/2 | note:c pattack:0 ]", @@ -7331,6 +7437,43 @@ exports[`runs examples > example "phasersweep" example index 0 1`] = ` ] `; +exports[`runs examples > example "phases" example index 0 1`] = ` +[ + "[ 0/1 → 1/8 | s:saw note:G#3 partials:[1 0 0 0 0 0 0 0 0] phases:[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] ]", + "[ 1/8 → 1/4 | s:saw note:A#4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.6852155700325966 0.17723728902637959 0.8521428182721138 0.5022399611771107 0.9780306946486235 0.3186125475913286 0.1851645242422819 0.8495976086705923 0.9832699615508318 0.8203876558691263 0.7365445382893085 0.6727468091994524 0.4794053863734007 0.35482912696897984 0.5666771996766329 0.4527092967182398 0.5699347071349621 0.7358296867460012 0.5444891396909952 0.11270620673894882] ]", + "[ 1/4 → 3/8 | s:saw note:D#4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.36975969187915325 0.18273563869297504 0.012781793251633644 0.5423613861203194 0.12467948533594608 0.7188410349190235 0.856887087225914 0.8818203993141651 0.8917219173163176 0.110306391492486 0.07148400321602821 0.8493648078292608 0.9100127145648003 0.4820226952433586 0.037094997242093086 0.9857278112322092 0.23439379036426544 0.46701666340231895 0.15832693874835968 0.6921216659247875] ]", + "[ 3/8 → 1/2 | s:saw note:D#4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.40139251574873924 0.15799915604293346 0.9604704882949591 0.03873417526483536 0.4157217647880316 0.27756719291210175 0.8800551909953356 0.5692523363977671 0.11026228219270706 0.7190891150385141 0.404962956905365 0.50828124769032 0.9681975357234478 0.34809120930731297 0.9345223866403103 0.9851128943264484 0.11768617853522301 0.538263589143753 0.6650313660502434 0.02540053054690361] ]", + "[ 1/2 → 5/8 | s:saw note:C#4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.2604806162416935 0.3654713351279497 0.9900747090578079 0.22572625242173672 0.9328999016433954 0.5273839123547077 0.7047769222408533 0.7311522178351879 0.42673745937645435 0.7099553178995848 0.5597201306372881 0.8968746215105057 0.15695763938128948 0.3792166206985712 0.4147114269435406 0.38739512488245964 0.7585489805787802 0.3875726908445358 0.867314238101244 0.1866922564804554] ]", + "[ 5/8 → 3/4 | s:saw note:A#3 partials:[1 0 0 0 0 0 0 0 0] phases:[0.1356358677148819 0.5403102282434702 0.07321739941835403 0.9646544624119997 0.7707359045743942 0.46888123638927937 0.9489036612212658 0.366748945787549 0.5029341224581003 0.7194344792515039 0.282692551612854 0.7303404528647661 0.7155798356980085 0.637981578707695 0.39654020965099335 0.008769871667027473 0.5857728160917759 0.3513293471187353 0.43080931156873703 0.518209295347333] ]", + "[ 3/4 → 7/8 | s:saw note:B3 partials:[1 0 0 0 0 0 0 0 0] phases:[0.19582648016512394 0.0024610888212919235 0.08272589556872845 0.09592138417065144 0.9678201265633106 0.3249557167291641 0.9463537875562906 0.20766610652208328 0.19126702845096588 0.4482936095446348 0.23314787074923515 0.07724925130605698 0.8329483829438686 0.39804019033908844 0.2529231123626232 0.889951054006815 0.716364661231637 0.3905949704349041 0.990752438083291 0.275751456618309] ]", + "[ 7/8 → 1/1 | s:saw note:D#4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.3976310808211565 0.13476407527923584 0.963376859202981 0.6579397786408663 0.5203975513577461 0.865439185872674 0.5583905670791864 0.2736878804862499 0.17021040990948677 0.3456706069409847 0.5848060417920351 0.9889458417892456 0.9307208992540836 0.7148868907243013 0.7419579364359379 0.8103639334440231 0.3331365995109081 0.19130694679915905 0.03261224366724491 0.808204049244523] ]", + "[ 1/1 → 9/8 | s:saw note:F#4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.5195421651005745 0.9349692352116108 0.1718774326145649 0.9601866770535707 0.2802200373262167 0.8732441551983356 0.01810968853533268 0.42737805284559727 0.26281314715743065 0.7521175239235163 0.568607984110713 0.5046361442655325 0.03172125294804573 0.3706745784729719 0.9402780849486589 0.3995086643844843 0.35769628174602985 0.023460431024432182 0.043030962347984314 0.6526827793568373] ]", + "[ 9/8 → 5/4 | s:saw note:A#4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.6724895145744085 0.21410975232720375 0.5229047331959009 0.20957534946501255 0.7402758821845055 0.2681974694132805 0.4059371296316385 0.9422509074211121 0.6584139950573444 0.26589646376669407 0.16059227287769318 0.17166719026863575 0.6234225388616323 0.020276052877306938 0.4836352560669184 0.8991366866976023 0.1860280428081751 0.06238717399537563 0.4383583478629589 0.4902789145708084] ]", + "[ 5/4 → 11/8 | s:saw note:A#4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.7287282031029463 0.9341024849563837 0.5098182689398527 0.5608645845204592 0.6812942810356617 0.5015129633247852 0.4602120481431484 0.927369873970747 0.19313151575624943 0.5240397155284882 0.444337897002697 0.19362097792327404 0.7068767864257097 0.920799495652318 0.2648108974099159 0.9700228478759527 0.20331068895757198 0.38390261493623257 0.0038731005042791367 0.9156702514737844] ]", + "[ 11/8 → 3/2 | s:saw note:B3 partials:[1 0 0 0 0 0 0 0 0] phases:[0.18280375190079212 0.40527783520519733 0.30504362285137177 0.7622128054499626 0.842598931863904 0.053796686232089996 0.5124214049428701 0.9178454764187336 0.09979427233338356 0.8280061967670918 0.5572535842657089 0.0622002687305212 0.9205668028444052 0.7738517206162214 0.04644870012998581 0.2117986585944891 0.26436166651546955 0.26421429589390755 0.4649084359407425 0.10490566119551659] ]", + "[ 3/2 → 13/8 | s:saw note:G#4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.6084080748260021 0.4424846563488245 0.755185678601265 0.04328125901520252 0.04244415462017059 0.3994515985250473 0.787989066913724 0.3180440980941057 0.30072982981801033 0.24217353947460651 0.7830625418573618 0.7733921892940998 0.7720277719199657 0.4402343425899744 0.21046430803835392 0.38635879568755627 0.5671729445457458 0.9510521050542593 0.010756833478808403 0.5728995501995087] ]", + "[ 13/8 → 7/4 | s:saw note:E4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.49675471149384975 0.2965749856084585 0.09848833456635475 0.19172007404267788 0.22677889838814735 0.9841996673494577 0.11156083643436432 0.6079028844833374 0.9412728808820248 0.9376902114599943 0.3611182738095522 0.5901201106607914 0.26860327646136284 0.9782364591956139 0.18694544956088066 0.004641396924853325 0.42020696587860584 0.06209231913089752 0.4790260009467602 0.21088780276477337] ]", + "[ 7/4 → 15/8 | s:saw note:B3 partials:[1 0 0 0 0 0 0 0 0] phases:[0.20473789609968662 0.7480021081864834 0.30757393687963486 0.5827204789966345 0.22094514779746532 0.6370698790997267 0.16573002003133297 0.0638319905847311 0.12625465169548988 0.4565841108560562 0.46095744147896767 0.646710304543376 0.045173922553658485 0.4833248760551214 0.1326297614723444 0.5275116711854935 0.9871038906276226 0.424171743914485 0.761672617867589 0.08582597225904465] ]", + "[ 15/8 → 2/1 | s:saw note:G#4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.5945571791380644 0.3962489552795887 0.563431927934289 0.4742323160171509 0.4185752831399441 0.9703940469771624 0.5282467231154442 0.6896266285330057 0.6941124945878983 0.2423656489700079 0.225077323615551 0.5445358455181122 0.014737963676452637 0.2848400343209505 0.14955217391252518 0.9782383926212788 0.6327074971050024 0.23327310755848885 0.4324392694979906 0.4326172359287739] ]", + "[ 2/1 → 17/8 | s:saw note:D#5 partials:[1 0 0 0 0 0 0 0 0] phases:[0.9595271199941635 0.5427457969635725 0.45864437520504 0.8057199101895094 0.18388565629720688 0.17221237532794476 0.8838487900793552 0.4976818822324276 0.7543560564517975 0.34416236728429794 0.8638174068182707 0.5697487238794565 0.005243342369794846 0.6361143626272678 0.6039986703544855 0.38708674535155296 0.5463927835226059 0.5717255529016256 0.15141930803656578 0.22688637301325798] ]", + "[ 17/8 → 9/4 | s:saw note:C#5 partials:[1 0 0 0 0 0 0 0 0] phases:[0.9033902939409018 0.22919894196093082 0.8388008493930101 0.9108077362179756 0.32246968522667885 0.16122018359601498 0.31932324543595314 0.18524732999503613 0.19110161997377872 0.5346284378319979 0.38531880639493465 0.7401201985776424 0.07450124807655811 0.18417961709201336 0.5768439751118422 0.7161206863820553 0.5836263168603182 0.9591280855238438 0.7728104889392853 0.0006709620356559753] ]", + "[ 9/4 → 19/8 | s:saw note:D#4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.34548251144587994 0.30419893004000187 0.10205957666039467 0.9906709585338831 0.3156223688274622 0.3745057098567486 0.7668170686811209 0.9379972033202648 0.689277408644557 0.8690325897186995 0.36728161945939064 0.9668608456850052 0.7341883443295956 0.32575040124356747 0.8095720671117306 0.3182998225092888 0.38158727809786797 0.5534052699804306 0.5973556581884623 0.752589326351881] ]", + "[ 19/8 → 5/2 | s:saw note:C#5 partials:[1 0 0 0 0 0 0 0 0] phases:[0.8365066405385733 0.5369812995195389 0.2263860274106264 0.21759207546710968 0.2172116208821535 0.09454222768545151 0.8075542915612459 0.9017798062413931 0.46291174553334713 0.01372767798602581 0.3509599883109331 0.4871185813099146 0.3525365497916937 0.6883120182901621 0.19577431678771973 0.287217665463686 0.025726469233632088 0.11798650585114956 0.8464976660907269 0.981348654255271] ]", + "[ 5/2 → 21/8 | s:saw note:E4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.45861607417464256 0.6807645913213491 0.07009582966566086 0.1450389064848423 0.2579921595752239 0.612881500273943 0.5503941811621189 0.7027011960744858 0.681745121255517 0.24246043153107166 0.2981361001729965 0.02195165678858757 0.10680225491523743 0.9413154497742653 0.6108828671276569 0.9479686040431261 0.17599895782768726 0.6629563421010971 0.5875700414180756 0.05703482776880264] ]", + "[ 21/8 → 11/4 | s:saw note:A#3 partials:[1 0 0 0 0 0 0 0 0] phases:[0.16019348427653313 0.47758268006145954 0.9749126061797142 0.8025561925023794 0.3600110989063978 0.324309878051281 0.5655391272157431 0.13364790193736553 0.3045873437076807 0.3814875278621912 0.14350778982043266 0.6017840709537268 0.11792952008545399 0.7185723781585693 0.6789924055337906 0.43416675738990307 0.9378792773932219 0.48162082210183144 0.37555896304547787 0.4686833508312702] ]", + "[ 11/4 → 23/8 | s:saw note:G#4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.6332327704876661 0.7342763151973486 0.16935866326093674 0.4754706546664238 0.528122790157795 0.21934260986745358 0.7476693484932184 0.2995396424084902 0.46688378043472767 0.9741295631974936 0.9878341723233461 0.9837898630648851 0.15651432052254677 0.2896903567016125 0.7395600061863661 0.3490046579390764 0.014511989429593086 0.6857758145779371 0.7405510656535625 0.4224672969430685] ]", + "[ 23/8 → 3/1 | s:saw note:G#3 partials:[1 0 0 0 0 0 0 0 0] phases:[0.01625417172908783 0.28409438766539097 0.3075305689126253 0.40343056432902813 0.5556836389005184 0.6926821582019329 0.5635769125074148 0.017873913049697876 0.5601800158619881 0.28681862354278564 0.8022358678281307 0.13467839546501637 0.02351163513958454 0.1987263821065426 0.4515750799328089 0.0009761657565832138 0.11555273085832596 0.25053937546908855 0.29571316950023174 0.15751986764371395] ]", + "[ 3/1 → 25/8 | s:saw note:B3 partials:[1 0 0 0 0 0 0 0 0] phases:[0.21728911064565182 0.7605195846408606 0.11240843310952187 0.4372697602957487 0.15630115941166878 0.1653979979455471 0.5303416550159454 0.07218753732740879 0.47459222190082073 0.04051801189780235 0.8742353077977896 0.9356274232268333 0.6662059463560581 0.4364917427301407 0.4163493011146784 0.9820694588124752 0.09098831936717033 0.41974459774792194 0.05833998881280422 0.2601191997528076] ]", + "[ 25/8 → 13/4 | s:saw note:D#4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.34324387833476067 0.14098095521330833 0.012934491038322449 0.827436288818717 0.5283997394144535 0.8942463714629412 0.4924008697271347 0.9298017006367445 0.18076439201831818 0.5243716649711132 0.015810951590538025 0.7476964127272367 0.6734520178288221 0.3267945274710655 0.9760967157781124 0.9397075213491917 0.7225867230445147 0.938586825504899 0.9692913070321083 0.5398030783981085] ]", + "[ 13/4 → 27/8 | s:saw note:D#5 partials:[1 0 0 0 0 0 0 0 0] phases:[0.9923650715500116 0.7797339502722025 0.1992435697466135 0.9005183521658182 0.718992218375206 0.23745290748775005 0.28872333094477654 0.35448253713548183 0.6209003105759621 0.3761858306825161 0.019171399995684624 0.7563913837075233 0.1559751983731985 0.4236980527639389 0.08094430714845657 0.4560011047869921 0.5958948992192745 0.37061405926942825 0.18633292242884636 0.346891064196825] ]", + "[ 27/8 → 7/2 | s:saw note:D#4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.40869180113077164 0.4018078800290823 0.34696186147630215 0.9572948440909386 0.400035472586751 0.3531211093068123 0.7240961641073227 0.8125612027943134 0.3587487991899252 0.1545814611017704 0.8934940584003925 0.9094721674919128 0.2336172368377447 0.17333386465907097 0.227950319647789 0.12384821102023125 0.5896956156939268 0.3293947223573923 0.619540523737669 0.8746719229966402] ]", + "[ 7/2 → 29/8 | s:saw note:D#4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.40994881466031075 0.6455810181796551 0.35704658553004265 0.2732649203389883 0.31587288342416286 0.23243548162281513 0.22569947130978107 0.17241661623120308 0.7624858524650335 0.02111036144196987 0.6966175157576799 0.32112877257168293 0.2512516509741545 0.08602019399404526 0.16260642930865288 0.2627844326198101 0.1954369619488716 0.16302869468927383 0.4046020060777664 0.0904023926705122] ]", + "[ 29/8 → 15/4 | s:saw note:D#5 partials:[1 0 0 0 0 0 0 0 0] phases:[0.9391485787928104 0.3380728308111429 0.7723016366362572 0.998674126341939 0.7193406894803047 0.6963680125772953 0.9260678570717573 0.7829763628542423 0.42278125509619713 0.913721015676856 0.38873230293393135 0.7281809840351343 0.952108234167099 0.649707704782486 0.9456792045384645 0.4331315904855728 0.63712502643466 0.9180345926433802 0.7379776351153851 0.7914005517959595] ]", + "[ 15/4 → 31/8 | s:saw note:B4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.8121673222631216 0.25548945367336273 0.5759696904569864 0.6668333616107702 0.9233786761760712 0.11143362522125244 0.9734930321574211 0.369325939565897 0.6248745918273926 0.719582824036479 0.24051696807146072 0.20336504466831684 0.6860735435038805 0.10649923048913479 0.8736641593277454 0.042930178344249725 0.09769343212246895 0.7966452036052942 0.5882443580776453 0.8942952174693346] ]", + "[ 31/8 → 4/1 | s:saw note:A#4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.7361665386706591 0.7657648548483849 0.21474426984786987 0.8228576295077801 0.5647660344839096 0.08148551359772682 0.9714624118059874 0.13992334716022015 0.9609981551766396 0.6844500284641981 0.23610286228358746 0.5974335502833128 0.20678778178989887 0.5261937081813812 0.7417268306016922 0.9810918122529984 0.8138748407363892 0.9389897901564837 0.7420910261571407 0.48839940316975117] ]", +] +`; + exports[`runs examples > example "pianoroll" example index 0 1`] = ` [ "[ 0/1 → 1/8 | note:c2 s:sawtooth lpenv:4 cutoff:300 ]", @@ -8052,6 +8195,75 @@ exports[`runs examples > example "rand" example index 0 1`] = ` ] `; +exports[`runs examples > example "randL" example index 0 1`] = ` +[ + "[ 0/1 → 1/16 | s:saw note:F1 partials:[0 0 0 0 0 0 0 0] ]", + "[ 1/16 → 1/8 | s:saw note:Bb2 partials:[0.8426077850162983 0.0886186733841896 0.9342893119901419 0.06848422810435295 0.6248505394905806 0.5372848063707352 0.8283301629126072 0.7969411127269268] ]", + "[ 1/8 → 3/16 | s:saw note:G2 partials:[0.6852155700325966 0.17723728902637959 0.8521428182721138 0.5022399611771107 0.9780306946486235 0.3186125475913286 0.1851645242422819 0.8495976086705923] ]", + "[ 3/16 → 1/4 | s:saw note:Ab1 partials:[0.20066574029624462 0.17195586115121841 0.2159541044384241 0.17005567252635956 0.6841662060469389 0.07906394638121128 0.004815371707081795 0.027107616886496544] ]", + "[ 1/4 → 5/16 | s:saw note:C2 partials:[0.36975969187915325 0.18273563869297504 0.012781793251633644 0.5423613861203194 0.12467948533594608 0.7188410349190235 0.856887087225914 0.8818203993141651] ]", + "[ 5/16 → 3/8 | s:saw note:Eb2 partials:[0.5675661638379097 0.15932588279247284 0.31376867927610874 0.32359412126243114 0.3281281068921089 0.011714376509189606 0.4433113746345043 0.68459103256464] ]", + "[ 3/8 → 7/16 | s:saw note:C2 partials:[0.40139251574873924 0.15799915604293346 0.9604704882949591 0.03873417526483536 0.4157217647880316 0.27756719291210175 0.8800551909953356 0.5692523363977671] ]", + "[ 7/16 → 1/2 | s:saw note:Bb1 partials:[0.3015887886285782 0.22311350144445896 0.47645803540945053 0.001545613631606102 0.53841289319098 0.330710094422102 0.2747743520885706 0.9471044968813658] ]", + "[ 1/2 → 9/16 | s:saw note:Bb1 partials:[0.2604806162416935 0.3654713351279497 0.9900747090578079 0.22572625242173672 0.9328999016433954 0.5273839123547077 0.7047769222408533 0.7311522178351879] ]", + "[ 9/16 → 5/8 | s:saw note:G1 partials:[0.16399178467690945 0.9559339117258787 0.21830322034657001 0.4903192054480314 0.2504696864634752 0.7302105724811554 0.6580934692174196 0.9855979979038239] ]", + "[ 5/8 → 11/16 | s:saw note:G1 partials:[0.1356358677148819 0.5403102282434702 0.07321739941835403 0.9646544624119997 0.7707359045743942 0.46888123638927937 0.9489036612212658 0.366748945787549] ]", + "[ 11/16 → 3/4 | s:saw note:C2 partials:[0.408811716362834 0.9613851886242628 0.7683626655489206 0.5862949229776859 0.9568102769553661 0.7154356613755226 0.6283384170383215 0.2193678840994835] ]", + "[ 3/4 → 13/16 | s:saw note:Ab1 partials:[0.19582648016512394 0.0024610888212919235 0.08272589556872845 0.09592138417065144 0.9678201265633106 0.3249557167291641 0.9463537875562906 0.20766610652208328] ]", + "[ 13/16 → 7/8 | s:saw note:Ab2 partials:[0.7516226731240749 0.15610851533710957 0.9039078876376152 0.8602268267422915 0.928601048886776 0.4479671400040388 0.5080656576901674 0.562442347407341] ]", + "[ 7/8 → 15/16 | s:saw note:C2 partials:[0.3976310808211565 0.13476407527923584 0.963376859202981 0.6579397786408663 0.5203975513577461 0.865439185872674 0.5583905670791864 0.2736878804862499] ]", + "[ 15/16 → 1/1 | s:saw note:G2 partials:[0.7029578909277916 0.6351367030292749 0.26143294386565685 0.6411824338138103 0.5676082745194435 0.4803342465311289 0.5140306428074837 0.9477859679609537] ]", + "[ 1/1 → 17/16 | s:saw note:Eb2 partials:[0.5195421651005745 0.9349692352116108 0.1718774326145649 0.9601866770535707 0.2802200373262167 0.8732441551983356 0.01810968853533268 0.42737805284559727] ]", + "[ 17/16 → 9/8 | s:saw note:Eb2 partials:[0.5486328881233931 0.7088070474565029 0.07877279818058014 0.9422610364854336 0.7696988433599472 0.8289324026554823 0.5925844628363848 0.3920764606446028] ]", + "[ 9/8 → 19/16 | s:saw note:G2 partials:[0.6724895145744085 0.21410975232720375 0.5229047331959009 0.20957534946501255 0.7402758821845055 0.2681974694132805 0.4059371296316385 0.9422509074211121] ]", + "[ 19/16 → 5/4 | s:saw note:F1 partials:[0.08174665085971355 0.2762963864952326 0.5428560189902782 0.29452037811279297 0.17946280725300312 0.366960596293211 0.26327736489474773 0.5002023074775934] ]", + "[ 5/4 → 21/16 | s:saw note:G2 partials:[0.7287282031029463 0.9341024849563837 0.5098182689398527 0.5608645845204592 0.6812942810356617 0.5015129633247852 0.4602120481431484 0.927369873970747] ]", + "[ 21/16 → 11/8 | s:saw note:F1 partials:[0.08104278706014156 0.5200720727443695 0.5363391060382128 0.9824271816760302 0.10652091167867184 0.23473932035267353 0.7656102329492569 0.4850195776671171] ]", + "[ 11/8 → 23/16 | s:saw note:Ab1 partials:[0.18280375190079212 0.40527783520519733 0.30504362285137177 0.7622128054499626 0.842598931863904 0.053796686232089996 0.5124214049428701 0.9178454764187336] ]", + "[ 23/16 → 3/2 | s:saw note:Eb2 partials:[0.5081270858645439 0.1421387754380703 0.8852288406342268 0.9066353775560856 0.7700740322470665 0.35437702015042305 0.20032598450779915 0.963155921548605] ]", + "[ 3/2 → 25/16 | s:saw note:F2 partials:[0.6084080748260021 0.4424846563488245 0.755185678601265 0.04328125901520252 0.04244415462017059 0.3994515985250473 0.787989066913724 0.3180440980941057] ]", + "[ 25/16 → 13/8 | s:saw note:Ab1 partials:[0.17092766426503658 0.7808954659849405 0.8234915658831596 0.8643151633441448 0.9781719036400318 0.5102015696465969 0.018259897828102112 0.25844234600663185] ]", + "[ 13/8 → 27/16 | s:saw note:Db2 partials:[0.49675471149384975 0.2965749856084585 0.09848833456635475 0.19172007404267788 0.22677889838814735 0.9841996673494577 0.11156083643436432 0.6079028844833374] ]", + "[ 27/16 → 7/4 | s:saw note:Bb1 partials:[0.29589061066508293 0.13011129200458527 0.8021425940096378 0.38040103763341904 0.33274981752038 0.29745868407189846 0.9898250997066498 0.743482418358326] ]", + "[ 7/4 → 29/16 | s:saw note:Ab1 partials:[0.20473789609968662 0.7480021081864834 0.30757393687963486 0.5827204789966345 0.22094514779746532 0.6370698790997267 0.16573002003133297 0.0638319905847311] ]", + "[ 29/16 → 15/8 | s:saw note:Db2 partials:[0.4695742893964052 0.6690364442765713 0.6216684486716986 0.41342394426465034 0.9508822970092297 0.8403679896146059 0.91759910620749 0.6591395419090986] ]", + "[ 15/8 → 31/16 | s:saw note:F2 partials:[0.5945571791380644 0.3962489552795887 0.563431927934289 0.4742323160171509 0.4185752831399441 0.9703940469771624 0.5282467231154442 0.6896266285330057] ]", + "[ 31/16 → 2/1 | s:saw note:Bb2 partials:[0.8672592639923096 0.3438429981470108 0.9795673936605453 0.46547594852745533 0.9770395755767822 0.36851615831255913 0.7725539114326239 0.876962523907423] ]", + "[ 2/1 → 33/16 | s:saw note:C3 partials:[0.9595271199941635 0.5427457969635725 0.45864437520504 0.8057199101895094 0.18388565629720688 0.17221237532794476 0.8838487900793552 0.4976818822324276] ]", + "[ 33/16 → 17/8 | s:saw note:Bb1 partials:[0.3324784208089113 0.6005446836352348 0.1564352661371231 0.765217661857605 0.12899602390825748 0.20880493707954884 0.9156261626631021 0.5550615340471268] ]", + "[ 17/8 → 35/16 | s:saw note:Bb2 partials:[0.9033902939409018 0.22919894196093082 0.8388008493930101 0.9108077362179756 0.32246968522667885 0.16122018359601498 0.31932324543595314 0.18524732999503613] ]", + "[ 35/16 → 9/4 | s:saw note:F1 partials:[0.037000780925154686 0.30360451713204384 0.7516817897558212 0.17065968923270702 0.24669718369841576 0.978821286931634 0.9620356522500515 0.12417634017765522] ]", + "[ 9/4 → 37/16 | s:saw note:C2 partials:[0.34548251144587994 0.30419893004000187 0.10205957666039467 0.9906709585338831 0.3156223688274622 0.3745057098567486 0.7668170686811209 0.9379972033202648] ]", + "[ 37/16 → 19/8 | s:saw note:F2 partials:[0.6649543270468712 0.41613837145268917 0.9078915324062109 0.2232209537178278 0.2918607946485281 0.4931973237544298 0.7035325299948454 0.29280414804816246] ]", + "[ 19/8 → 39/16 | s:saw note:Bb2 partials:[0.8365066405385733 0.5369812995195389 0.2263860274106264 0.21759207546710968 0.2172116208821535 0.09454222768545151 0.8075542915612459 0.9017798062413931] ]", + "[ 39/16 → 5/2 | s:saw note:G1 partials:[0.14231421053409576 0.6801821701228619 0.7958894111216068 0.9494249671697617 0.179213372990489 0.22531690262258053 0.7458387855440378 0.3595987129956484] ]", + "[ 5/2 → 41/16 | s:saw note:Db2 partials:[0.45861607417464256 0.6807645913213491 0.07009582966566086 0.1450389064848423 0.2579921595752239 0.612881500273943 0.5503941811621189 0.7027011960744858] ]", + "[ 41/16 → 21/8 | s:saw note:F2 partials:[0.6068673655390739 0.8489279896020889 0.027898555621504784 0.90520747192204 0.18605150654911995 0.30939464271068573 0.16843407973647118 0.5127317048609257] ]", + "[ 21/8 → 43/16 | s:saw note:G1 partials:[0.16019348427653313 0.47758268006145954 0.9749126061797142 0.8025561925023794 0.3600110989063978 0.324309878051281 0.5655391272157431 0.13364790193736553] ]", + "[ 43/16 → 11/4 | s:saw note:Eb2 partials:[0.538035349920392 0.4103843830525875 0.6443832442164421 0.7532152868807316 0.32128027081489563 0.29064710810780525 0.5972099266946316 0.8252892810851336] ]", + "[ 11/4 → 45/16 | s:saw note:F2 partials:[0.6332327704876661 0.7342763151973486 0.16935866326093674 0.4754706546664238 0.528122790157795 0.21934260986745358 0.7476693484932184 0.2995396424084902] ]", + "[ 45/16 → 23/8 | s:saw note:Bb2 partials:[0.8912940509617329 0.5256196465343237 0.25639201514422894 0.46860250271856785 0.08611978217959404 0.6175916157662868 0.990638293325901 0.11189854890108109] ]", + "[ 23/8 → 47/16 | s:saw note:F1 partials:[0.01625417172908783 0.28409438766539097 0.3075305689126253 0.40343056432902813 0.5556836389005184 0.6926821582019329 0.5635769125074148 0.017873913049697876] ]", + "[ 47/16 → 3/1 | s:saw note:Bb1 partials:[0.2830589488148689 0.3613663297146559 0.6216250211000443 0.6083405166864395 0.27202711440622807 0.771099541336298 0.3156145606189966 0.736228458583355] ]", + "[ 3/1 → 49/16 | s:saw note:Ab1 partials:[0.21728911064565182 0.7605195846408606 0.11240843310952187 0.4372697602957487 0.15630115941166878 0.1653979979455471 0.5303416550159454 0.07218753732740879] ]", + "[ 49/16 → 25/8 | s:saw note:F1 partials:[0.012518879026174545 0.6565517522394657 0.783835593611002 0.2481316588819027 0.27786846831440926 0.6153149046003819 0.39914070069789886 0.2175555843859911] ]", + "[ 25/8 → 51/16 | s:saw note:C2 partials:[0.34324387833476067 0.14098095521330833 0.012934491038322449 0.827436288818717 0.5283997394144535 0.8942463714629412 0.4924008697271347 0.9298017006367445] ]", + "[ 51/16 → 13/4 | s:saw note:Bb2 partials:[0.9057559575885534 0.5731389932334423 0.06561482697725296 0.02156665176153183 0.4685337021946907 0.000788738951086998 0.6995994579046965 0.9893404543399811] ]", + "[ 13/4 → 53/16 | s:saw note:C3 partials:[0.9923650715500116 0.7797339502722025 0.1992435697466135 0.9005183521658182 0.718992218375206 0.23745290748775005 0.28872333094477654 0.35448253713548183] ]", + "[ 53/16 → 27/8 | s:saw note:Bb1 partials:[0.3235324025154114 0.5165992900729179 0.6231792941689491 0.8034896682947874 0.6663950439542532 0.4207208137959242 0.9748435858637094 0.27676148526370525] ]", + "[ 27/8 → 55/16 | s:saw note:C2 partials:[0.40869180113077164 0.4018078800290823 0.34696186147630215 0.9572948440909386 0.400035472586751 0.3531211093068123 0.7240961641073227 0.8125612027943134] ]", + "[ 55/16 → 7/2 | s:saw note:Ab2 partials:[0.775677714496851 0.0502743236720562 0.3246541116386652 0.503994770348072 0.8252716399729252 0.89872563816607 0.060319963842630386 0.25497629307210445] ]", + "[ 7/2 → 57/16 | s:saw note:C2 partials:[0.40994881466031075 0.6455810181796551 0.35704658553004265 0.2732649203389883 0.31587288342416286 0.23243548162281513 0.22569947130978107 0.17241661623120308] ]", + "[ 57/16 → 29/8 | s:saw note:Ab2 partials:[0.8133465722203255 0.8327706772834063 0.32914630882442 0.23131784796714783 0.7526696771383286 0.1361286472529173 0.11441296897828579 0.36366880126297474] ]", + "[ 29/8 → 59/16 | s:saw note:C3 partials:[0.9391485787928104 0.3380728308111429 0.7723016366362572 0.998674126341939 0.7193406894803047 0.6963680125772953 0.9260678570717573 0.7829763628542423] ]", + "[ 59/16 → 15/4 | s:saw note:C3 partials:[0.9731374885886908 0.0494034755975008 0.990720022469759 0.9819309785962105 0.22877203114330769 0.7265191469341516 0.4922411348670721 0.7549834884703159] ]", + "[ 15/4 → 61/16 | s:saw note:Ab2 partials:[0.8121673222631216 0.25548945367336273 0.5759696904569864 0.6668333616107702 0.9233786761760712 0.11143362522125244 0.9734930321574211 0.369325939565897] ]", + "[ 61/16 → 31/8 | s:saw note:G1 partials:[0.1008925698697567 0.7558664139360189 0.1523460578173399 0.6523381881415844 0.9690635204315186 0.7343240566551685 0.9544064309448004 0.9150135722011328] ]", + "[ 31/8 → 63/16 | s:saw note:G2 partials:[0.7361665386706591 0.7657648548483849 0.21474426984786987 0.8228576295077801 0.5647660344839096 0.08148551359772682 0.9714624118059874 0.13992334716022015] ]", + "[ 63/16 → 4/1 | s:saw note:Bb1 partials:[0.3056422360241413 0.8881660811603069 0.7683485243469477 0.08641545102000237 0.5427133180201054 0.20803124643862247 0.5347504671663046 0.5977730695158243] ]", +] +`; + exports[`runs examples > example "range" example index 0 1`] = ` [ "[ 0/1 → 1/8 | s:hh cutoff:2250 ]", From 35016b58476b17d6b9a2c98b922df2d1fa9e76f6 Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 15 Oct 2025 14:56:20 -0500 Subject: [PATCH 050/312] Mention range in docstring --- packages/core/controls.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 327f8df51..77e77caa7 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -2380,7 +2380,7 @@ export const scrub = register( * Can also be used to create a new synth via `s('user').partials(...)` * * @name partials - * @param {number[] | Pattern} partials List of magnitudes for partials. 0th entry is the first harmonic (i.e. DC offset is skipped) + * @param {number[] | Pattern} partials List of [0, 1] magnitudes for partials. 0th entry is the first harmonic (i.e. DC offset is skipped) * @example * s("user").seg(16).n(irand(8)).scale("A:major") * .partials([1, 0, 1, 0, 0, 1]) @@ -2394,7 +2394,7 @@ export const { partials } = registerControl('partials'); * Rotates the harmonics of one of the core synths ('sine', 'tri', 'saw', 'user', ..) by a list of phases * * @name phases - * @param {number[] | Pattern} phases List of phases for partials. 0th entry is the first phase (i.e. DC offset is skipped) + * @param {number[] | Pattern} phases List of [0, 1) phases for partials. 0th entry is the first phase (i.e. DC offset is skipped) * @example * s("saw").seg(8).n(irand(12)).scale("G#:minor") * .partials(binaryL(256)) From fd03d1fdfbc57d7b1e4b8c14bdb414d44bdc0ec8 Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 15 Oct 2025 15:14:31 -0500 Subject: [PATCH 051/312] Update conditional to allow to control user waveforms --- packages/superdough/synth.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/superdough/synth.mjs b/packages/superdough/synth.mjs index 0294762fb..10df1776b 100644 --- a/packages/superdough/synth.mjs +++ b/packages/superdough/synth.mjs @@ -472,7 +472,7 @@ export function getOscillator(s, t, value) { } s = s === 'user' && !partials ? 'triangle' : s; // If no partials are given, use stock waveforms - if (!partials || !partials?.length || s === 'sine') { + if (!partials || partials?.length === 0 || s === 'sine') { o = getAudioContext().createOscillator(); o.type = s || 'triangle'; } From 47c85f8540386d36c42c5bc64f952bde12ac79d5 Mon Sep 17 00:00:00 2001 From: jeromew Date: Thu, 16 Oct 2025 14:06:33 +0200 Subject: [PATCH 052/312] fix interoperability of `all` with hydra Hydra add methods on Array.prototype which breaks the Array enumeration with for...in. Use for...of instead cf https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of#difference_between_for...of_and_for...in for details on the issue without this fix, it is impossible to use both `await initHydra()` and `all` in the same strudel code. Strudel errors with "Error: got "undefined" instead of pattern." example code: https://strudel.cc/#YXdhaXQgaW5pdEh5ZHJhKCkKCmFsbChwaWFub3JvbGwpCgokOiBzKCJiZCIp --- packages/core/repl.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/repl.mjs b/packages/core/repl.mjs index 171697eb9..064ef1eb8 100644 --- a/packages/core/repl.mjs +++ b/packages/core/repl.mjs @@ -227,8 +227,8 @@ export function repl({ pattern = eachTransform(pattern); } if (allTransforms.length) { - for (let i in allTransforms) { - pattern = allTransforms[i](pattern); + for (const transform of allTransforms) { + pattern = transform(pattern); } } From c02def03b683a1f37a5b6cd7f53ab51b721fdb26 Mon Sep 17 00:00:00 2001 From: Aria Date: Thu, 16 Oct 2025 16:26:33 -0500 Subject: [PATCH 053/312] Don't tag when scale fails, allow mixed sharps and flats, simplify scale function --- packages/core/pattern.mjs | 2 +- packages/core/test/pattern.test.mjs | 4 +- packages/core/util.mjs | 10 ++- packages/superdough/util.mjs | 6 +- packages/tonal/test/tonal.test.mjs | 7 -- packages/tonal/tonal.mjs | 96 +++++++++++------------ test/__snapshots__/examples.test.mjs.snap | 8 +- website/src/components/Header/Search.css | 4 +- 8 files changed, 67 insertions(+), 70 deletions(-) diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index a85226a8f..51d525f74 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -2574,8 +2574,8 @@ export const { chunkBack, chunkback } = register( * @returns Pattern * @example * "<0 8> 1 2 3 4 5 6 7" - * .fastChunk(4, x => x.color('red')).slow(2) * .scale("C2:major").note() + * .fastChunk(4, x => x.color('red')).slow(2) */ export const { fastchunk, fastChunk } = register( ['fastchunk', 'fastChunk'], diff --git a/packages/core/test/pattern.test.mjs b/packages/core/test/pattern.test.mjs index 625f40756..1df5c8776 100644 --- a/packages/core/test/pattern.test.mjs +++ b/packages/core/test/pattern.test.mjs @@ -796,7 +796,7 @@ describe('Pattern', () => { }); }); describe('apply', () => { - (it('Can apply a function', () => { + it('Can apply a function', () => { expect(sequence('a', 'b').apply(fast(2)).firstCycle()).toStrictEqual(sequence('a', 'b').fast(2).firstCycle()); }), it('Can apply a pattern of functions', () => { @@ -804,7 +804,7 @@ describe('Pattern', () => { expect(sequence('a', 'b').apply(fast(2), fast(3)).firstCycle()).toStrictEqual( sequence('a', 'b').fast(2, 3).firstCycle(), ); - })); + }); }); describe('layer', () => { it('Can layer up multiple functions', () => { diff --git a/packages/core/util.mjs b/packages/core/util.mjs index ef3f1e961..915a2cb77 100644 --- a/packages/core/util.mjs +++ b/packages/core/util.mjs @@ -7,8 +7,8 @@ This program is free software: you can redistribute it and/or modify it under th import { logger } from './logger.mjs'; // returns true if the given string is a note -export const isNoteWithOctave = (name) => /^[a-gA-G][#bs]*[0-9]$/.test(name); -export const isNote = (name) => /^[a-gA-G][#bsf]*-?[0-9]?$/.test(name); +export const isNoteWithOctave = (name) => /^[a-gA-G][#bsf]*[0-9]*$/.test(name); +export const isNote = (name) => /^[a-gA-G][#bsf]*-?[0-9]*$/.test(name); export const tokenizeNote = (note) => { if (typeof note !== 'string') { return []; @@ -23,6 +23,10 @@ export const tokenizeNote = (note) => { const chromas = { c: 0, d: 2, e: 4, f: 5, g: 7, a: 9, b: 11 }; const accs = { '#': 1, b: -1, s: 1, f: -1 }; +export const getAccidentalsOffset = (accidentals) => { + return accidentals?.split('').reduce((o, char) => o + accs[char], 0) || 0; +}; + // turns the given note into its midi number representation export const noteToMidi = (note, defaultOctave = 3) => { const [pc, acc, oct = defaultOctave] = tokenizeNote(note); @@ -30,7 +34,7 @@ export const noteToMidi = (note, defaultOctave = 3) => { throw new Error('not a note: "' + note + '"'); } const chroma = chromas[pc.toLowerCase()]; - const offset = acc?.split('').reduce((o, char) => o + accs[char], 0) || 0; + const offset = getAccidentalsOffset(acc); return (Number(oct) + 1) * 12 + chroma + offset; }; export const midiToFreq = (n) => { diff --git a/packages/superdough/util.mjs b/packages/superdough/util.mjs index 475c05f63..418b7af0a 100644 --- a/packages/superdough/util.mjs +++ b/packages/superdough/util.mjs @@ -16,13 +16,17 @@ export const tokenizeNote = (note) => { const chromas = { c: 0, d: 2, e: 4, f: 5, g: 7, a: 9, b: 11 }; const accs = { '#': 1, b: -1, s: 1, f: -1 }; +export const getAccidentalsOffset = (accidentals) => { + return accidentals?.split('').reduce((o, char) => o + accs[char], 0) || 0; +}; + export const noteToMidi = (note, defaultOctave = 3) => { const [pc, acc, oct = defaultOctave] = tokenizeNote(note); if (!pc) { throw new Error('not a note: "' + note + '"'); } const chroma = chromas[pc.toLowerCase()]; - const offset = acc?.split('').reduce((o, char) => o + accs[char], 0) || 0; + const offset = getAccidentalsOffset(acc); return (Number(oct) + 1) * 12 + chroma + offset; }; export const midiToFreq = (n) => { diff --git a/packages/tonal/test/tonal.test.mjs b/packages/tonal/test/tonal.test.mjs index 5f61b05a9..06aa91188 100644 --- a/packages/tonal/test/tonal.test.mjs +++ b/packages/tonal/test/tonal.test.mjs @@ -61,13 +61,6 @@ describe('tonal', () => { .firstCycleValues.map((h) => h.note), ).toEqual(['B2', 'Eb3', 'A2', 'G3', 'F3']); }); - it('produces silence for mixed sharps and flats', () => { - expect( - n(seq('0b#', '1#b', '2#b#')) - .scale('C major') - .firstCycleValues.map((h) => h.note), - ).toEqual([]); - }); it('snaps notes (upwards) to scale', () => { const inputNotes = ['Cb', 'Eb', 'G', 'A#', 'Bb']; const expectedNotes = ['B2', 'E3', 'G3', 'B3', 'B3']; diff --git a/packages/tonal/tonal.mjs b/packages/tonal/tonal.mjs index e745a33a0..0dc468b20 100644 --- a/packages/tonal/tonal.mjs +++ b/packages/tonal/tonal.mjs @@ -5,9 +5,8 @@ This program is free software: you can redistribute it and/or modify it under th */ import { Note, Interval, Scale } from '@tonaljs/tonal'; -import { register, _mod, silence, logger, pure, isNote } from '@strudel/core'; +import { register, _mod, logger, isNote, noteToMidi, removeUndefineds, getAccidentalsOffset } from '@strudel/core'; import { stepInNamedScale, nearestNumberIndex } from './tonleiter.mjs'; -import { noteToMidi } from '../core/util.mjs'; const octavesInterval = (octaves) => (octaves <= 0 ? -1 : 1) + octaves * 7 + 'P'; @@ -185,17 +184,15 @@ function _convertStepToNumberAndOffset(step) { step = String(step); // Check to see if the step matches the expected format: // - A number (possibly negative) - // - Some number of sharps or flats (but not both) - const match = /^(-?\d+)(#+|b+)?$/.exec(step); + // - Some number of sharps or flats + const match = /^(-?\d+)([#bsf]*)$/.exec(step); if (!match) { throw new Error(`invalid scale step "${step}", expected number or integer with optional # b suffixes`); } asNumber = Number(match[1]); - // These decorations will determine the semitone offset based on the number of - // sharps or flats - const decorations = match[2] || ''; - offset = decorations[0] === '#' ? decorations.length : -decorations.length; + const accidentals = match[2] || ''; + offset = getAccidentalsOffset(accidentals); } return [asNumber, offset]; } @@ -226,7 +223,7 @@ function _getNearestScaleNote(scaleName, note, preferHigher = true) { * Turns numbers into notes in the scale (zero indexed) or quantizes notes to a scale. * * When describing notes via numbers, note that negative numbers can be used to wrap backwards - * in the scale as well as sharps or flats (but not both) to produce notes outside of the scale. + * in the scale as well as sharps or flats to produce notes outside of the scale. * * Also sets scale for other scale operations, like {@link Pattern#scaleTranspose}. * @@ -254,7 +251,6 @@ function _getNearestScaleNote(scaleName, note, preferHigher = true) { * @example * note("C1*16").transpose(irand(36)).scale('Cb2 major').scaleTranspose(3) */ - export const scale = register( 'scale', function (scale, pat) { @@ -262,47 +258,47 @@ export const scale = register( if (Array.isArray(scale)) { scale = scale.flat().join(' '); } - return ( - pat - .fmap((value) => { - const isObject = typeof value === 'object'; - // If value is a pure value, place it on `n` so that we interpret it as a scale - // degree - value = isObject ? value : { n: value }; - if ('note' in value) { - const note = _getNearestScaleNote(scale, value.note); - return pure({ ...value, note }); - } else if ('n' in value || 'value' in value) { - const step = value.n ?? value.value; - delete value.n; // remove n so it won't cause trouble - if (isNote(step)) { - // legacy.. - return pure(step); - } - try { - const [number, offset] = _convertStepToNumberAndOffset(step); - let note; - if (value.anchor) { - note = stepInNamedScale(number, scale, value.anchor); - } else { - note = scaleStep(number, scale); - } - if (offset != 0) note = Note.transpose(note, Interval.fromSemitones(offset)); - value = pure(isObject ? { ...value, note } : note); - } catch (err) { - logger(`[tonal] ${err.message}`, 'error'); - return silence; - } - return value; - } - throw new Error( - `Invalid value format for 'scale'. Value must contain 'n' or 'note' but received ${Object.keys(value)}`, + return pat.withHaps((haps) => { + haps = haps.map((hap) => { + let hVal = hap.value; + const isObject = typeof hVal === 'object'; + // If hVal is a pure value, place it on `n` so that we interpret it as a scale degree + hVal = isObject ? hVal : { n: hVal }; + const { note, n, value, ...otherValues } = hVal; + const noteOrStep = note ?? n ?? value; + if (noteOrStep === undefined) { + logger( + `[tonal] Invalid value format for 'scale'. Value must contain n, note, or value but received keys [${Object.keys(hVal).join(', ')}]`, + 'error', ); - }) - .outerJoin() - // legacy: - .withHap((hap) => hap.setContext({ ...hap.context, scale })) - ); + return hap; // pass the value through unchanged + } + let scaleNote; + if (isNote(noteOrStep)) { + // Note case (quantize to scale) + scaleNote = _getNearestScaleNote(scale, noteOrStep); + hap.value = { ...otherValues, note: scaleNote }; + } else { + // Step case (convert to note in scale) + try { + const [number, offset] = _convertStepToNumberAndOffset(noteOrStep); + if (otherValues.anchor) { + scaleNote = stepInNamedScale(number, scale, otherValues.anchor); + } else { + scaleNote = scaleStep(number, scale); + } + if (offset != 0) scaleNote = Note.transpose(scaleNote, Interval.fromSemitones(offset)); + } catch (err) { + logger(`[tonal] ${err.message}`, 'error'); + return; // will be removed + } + } + hap.value = isObject ? { ...otherValues, note: scaleNote } : scaleNote; + // Tag with scale for downsteam scale-aware operations + return hap.setContext({ ...hap.context, scale }); + }); + return removeUndefineds(haps); + }); }, true, true, // preserve step count diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 937d42797..fd0a1bb5d 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -3838,8 +3838,8 @@ exports[`runs examples > example "fast" example index 0 1`] = ` exports[`runs examples > example "fastChunk" example index 0 1`] = ` [ - "[ 0/1 → 1/4 | color:red note:0 ]", - "[ 1/4 → 1/2 | color:red note:1 ]", + "[ 0/1 → 1/4 | note:C2 color:red ]", + "[ 1/4 → 1/2 | note:D2 color:red ]", "[ 1/2 → 3/4 | note:E2 ]", "[ 3/4 → 1/1 | note:F2 ]", "[ 1/1 → 5/4 | note:G2 ]", @@ -3848,8 +3848,8 @@ exports[`runs examples > example "fastChunk" example index 0 1`] = ` "[ 7/4 → 2/1 | note:C3 ]", "[ 2/1 → 9/4 | note:D3 ]", "[ 9/4 → 5/2 | note:D2 ]", - "[ 5/2 → 11/4 | color:red note:2 ]", - "[ 11/4 → 3/1 | color:red note:3 ]", + "[ 5/2 → 11/4 | note:E2 color:red ]", + "[ 11/4 → 3/1 | note:F2 color:red ]", "[ 3/1 → 13/4 | note:G2 ]", "[ 13/4 → 7/2 | note:A2 ]", "[ 7/2 → 15/4 | note:B2 ]", diff --git a/website/src/components/Header/Search.css b/website/src/components/Header/Search.css index b14146cbd..456ef9f6b 100644 --- a/website/src/components/Header/Search.css +++ b/website/src/components/Header/Search.css @@ -18,8 +18,8 @@ --docsearch-modal-background: var(--background); --docsearch-muted-color: color-mix(in srgb, var(--foreground), #fff 30%); --docsearch-key-gradient: var(--foreground); - --docsearch-key-shadow: - inset 0 -2px 0 0 var(--gutterForeground), inset 0 0 1px 1px var(--foreground), 0 1px 2px 1px var(--gutterBackground); + --docsearch-key-shadow: inset 0 -2px 0 0 var(--gutterForeground), inset 0 0 1px 1px var(--foreground), + 0 1px 2px 1px var(--gutterBackground); } .dark { --docsearch-muted-color: color-mix(in srgb, var(--foreground), #000 30%); From 1be9f40574aa213d3ef501024e5a0e18cb04fef9 Mon Sep 17 00:00:00 2001 From: alex Date: Sat, 18 Oct 2025 10:42:35 +0100 Subject: [PATCH 054/312] 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 055/312] 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 056/312] 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 4c49cd9297326cf4991f1dca879bef3ed657be51 Mon Sep 17 00:00:00 2001 From: Aria Date: Sat, 18 Oct 2025 11:24:56 -0500 Subject: [PATCH 057/312] More examples --- packages/core/controls.mjs | 30 ++++++++++++++++++ test/__snapshots__/examples.test.mjs.snap | 37 +++++++++++++++++++++++ 2 files changed, 67 insertions(+) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 55a07cc27..281bf76b7 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -456,6 +456,9 @@ export const { attack, att } = registerControl('attack', 'att'); * Whole numbers and simple ratios sound more natural, * while decimal numbers and complex ratios sound metallic. * + * A number may be added afterwards to control the harmonicity of + * any of the 8 individual FMs (e.g. `fmh2`) + * * @name fmh * @param {number | Pattern} harmonicity * @example @@ -470,6 +473,11 @@ export const { fmh, fmh1, fmh2, fmh3, fmh4, fmh5, fmh6, fmh7, fmh8 } = registerM * Sets the Frequency Modulation of the synth. * Controls the modulation index, which defines the brightness of the sound. * + * A number may be added afterwards to control the modulation index of + * any of the 8 individual FMs (e.g. `fm3`). Also, FMs may be routed into + * each other with matrix commands like `fm13`, which would send `fm1` back into + * `fm3` + * * @name fmi * @param {number | Pattern} brightness modulation index * @synonyms fm @@ -477,6 +485,10 @@ export const { fmh, fmh1, fmh2, fmh3, fmh4, fmh5, fmh6, fmh7, fmh8 } = registerM * note("c e g b g e") * .fm("<0 1 2 8 32>") * ._scope() + * @example + * s("sine").note("F1").seg(8) + * .fm(4).fm2(rand.mul(4)).fm3(saw.mul(8).slow(8)) + * .fmh(1.06).fmh2(10).fmh3(0.1) * */ export const { fmi, fmi1, fmi2, fmi3, fmi4, fmi5, fmi6, fmi7, fmi8, fm, fm1, fm2, fm3, fm4, fm5, fm6, fm7, fm8 } = @@ -485,6 +497,9 @@ export const { fmi, fmi1, fmi2, fmi3, fmi4, fmi5, fmi6, fmi7, fmi8, fm, fm1, fm2 /** * Ramp type of fm envelope. Exp might be a bit broken.. * + * A number may be added afterwards to control the envelope of + * any of the 8 individual FMs (e.g. `fmenv4`) + * * @name fmenv * @param {number | Pattern} type lin | exp * @example @@ -503,6 +518,9 @@ export const { fmenv, fmenv1, fmenv2, fmenv3, fmenv4, fmenv5, fmenv6, fmenv7, fm /** * Attack time for the FM envelope: time it takes to reach maximum modulation * + * A number may be added afterwards to control the attack of the envelope of + * any of the 8 individual FMs (e.g. `fmatt5`) + * * @name fmattack * @synonyms fmatt * @param {number | Pattern} time attack time @@ -537,6 +555,9 @@ export const { /** * Waveform of the fm modulator * + * A number may be added afterwards to control the waveform + * any of the 8 individual FMs (e.g. `fmwave6`) + * * @name fmwave * @param {number | Pattern} wave waveform * @example @@ -553,6 +574,9 @@ export const { fmwave, fmwave1, fmwave2, fmwave3, fmwave4, fmwave5, fmwave6, fmw /** * Decay time for the FM envelope: seconds until the sustain level is reached after the attack phase. * + * A number may be added afterwards to control the decay of the envelope of + * any of the 8 individual FMs (e.g. `fmdec6`) + * * @name fmdecay * @synonyms fmdec * @param {number | Pattern} time decay time @@ -587,6 +611,9 @@ export const { /** * Sustain level for the FM envelope: how much modulation is applied after the decay phase * + * A number may be added afterwards to control the sustain of the envelope of + * any of the 8 individual FMs (e.g. `fmsus7`) + * * @name fmsustain * @synonyms fmsus * @param {number | Pattern} level sustain level @@ -621,6 +648,9 @@ export const { /** * Release time for the FM envelope: how much modulation is applied after the note is released * + * A number may be added afterwards to control the release of the envelope of + * any of the 8 individual FMs (e.g. `fmrel8`) + * * @name fmrelease * @synonyms fmrel * @param {number | Pattern} time release time diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 590c47e4e..04360a4dd 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -4101,6 +4101,43 @@ exports[`runs examples > example "fmi" example index 0 1`] = ` ] `; +exports[`runs examples > example "fmi" example index 1 1`] = ` +[ + "[ 0/1 → 1/8 | s:sine note:F1 fmi:4 fmi2:0 fmi3:0 fmh:1.06 fmh2:10 fmh3:0.1 ]", + "[ 1/8 → 1/4 | s:sine note:F1 fmi:4 fmi2:2.7408622801303864 fmi3:0.125 fmh:1.06 fmh2:10 fmh3:0.1 ]", + "[ 1/4 → 3/8 | s:sine note:F1 fmi:4 fmi2:1.479038767516613 fmi3:0.25 fmh:1.06 fmh2:10 fmh3:0.1 ]", + "[ 3/8 → 1/2 | s:sine note:F1 fmi:4 fmi2:1.605570062994957 fmi3:0.375 fmh:1.06 fmh2:10 fmh3:0.1 ]", + "[ 1/2 → 5/8 | s:sine note:F1 fmi:4 fmi2:1.041922464966774 fmi3:0.5 fmh:1.06 fmh2:10 fmh3:0.1 ]", + "[ 5/8 → 3/4 | s:sine note:F1 fmi:4 fmi2:0.5425434708595276 fmi3:0.625 fmh:1.06 fmh2:10 fmh3:0.1 ]", + "[ 3/4 → 7/8 | s:sine note:F1 fmi:4 fmi2:0.7833059206604958 fmi3:0.75 fmh:1.06 fmh2:10 fmh3:0.1 ]", + "[ 7/8 → 1/1 | s:sine note:F1 fmi:4 fmi2:1.590524323284626 fmi3:0.875 fmh:1.06 fmh2:10 fmh3:0.1 ]", + "[ 1/1 → 9/8 | s:sine note:F1 fmi:4 fmi2:2.078168660402298 fmi3:1 fmh:1.06 fmh2:10 fmh3:0.1 ]", + "[ 9/8 → 5/4 | s:sine note:F1 fmi:4 fmi2:2.689958058297634 fmi3:1.125 fmh:1.06 fmh2:10 fmh3:0.1 ]", + "[ 5/4 → 11/8 | s:sine note:F1 fmi:4 fmi2:2.914912812411785 fmi3:1.25 fmh:1.06 fmh2:10 fmh3:0.1 ]", + "[ 11/8 → 3/2 | s:sine note:F1 fmi:4 fmi2:0.7312150076031685 fmi3:1.375 fmh:1.06 fmh2:10 fmh3:0.1 ]", + "[ 3/2 → 13/8 | s:sine note:F1 fmi:4 fmi2:2.4336322993040085 fmi3:1.5 fmh:1.06 fmh2:10 fmh3:0.1 ]", + "[ 13/8 → 7/4 | s:sine note:F1 fmi:4 fmi2:1.987018845975399 fmi3:1.625 fmh:1.06 fmh2:10 fmh3:0.1 ]", + "[ 7/4 → 15/8 | s:sine note:F1 fmi:4 fmi2:0.8189515843987465 fmi3:1.75 fmh:1.06 fmh2:10 fmh3:0.1 ]", + "[ 15/8 → 2/1 | s:sine note:F1 fmi:4 fmi2:2.3782287165522575 fmi3:1.875 fmh:1.06 fmh2:10 fmh3:0.1 ]", + "[ 2/1 → 17/8 | s:sine note:F1 fmi:4 fmi2:3.838108479976654 fmi3:2 fmh:1.06 fmh2:10 fmh3:0.1 ]", + "[ 17/8 → 9/4 | s:sine note:F1 fmi:4 fmi2:3.613561175763607 fmi3:2.125 fmh:1.06 fmh2:10 fmh3:0.1 ]", + "[ 9/4 → 19/8 | s:sine note:F1 fmi:4 fmi2:1.3819300457835197 fmi3:2.25 fmh:1.06 fmh2:10 fmh3:0.1 ]", + "[ 19/8 → 5/2 | s:sine note:F1 fmi:4 fmi2:3.346026562154293 fmi3:2.375 fmh:1.06 fmh2:10 fmh3:0.1 ]", + "[ 5/2 → 21/8 | s:sine note:F1 fmi:4 fmi2:1.8344642966985703 fmi3:2.5 fmh:1.06 fmh2:10 fmh3:0.1 ]", + "[ 21/8 → 11/4 | s:sine note:F1 fmi:4 fmi2:0.6407739371061325 fmi3:2.625 fmh:1.06 fmh2:10 fmh3:0.1 ]", + "[ 11/4 → 23/8 | s:sine note:F1 fmi:4 fmi2:2.5329310819506645 fmi3:2.75 fmh:1.06 fmh2:10 fmh3:0.1 ]", + "[ 23/8 → 3/1 | s:sine note:F1 fmi:4 fmi2:0.06501668691635132 fmi3:2.875 fmh:1.06 fmh2:10 fmh3:0.1 ]", + "[ 3/1 → 25/8 | s:sine note:F1 fmi:4 fmi2:0.8691564425826073 fmi3:3 fmh:1.06 fmh2:10 fmh3:0.1 ]", + "[ 25/8 → 13/4 | s:sine note:F1 fmi:4 fmi2:1.3729755133390427 fmi3:3.125 fmh:1.06 fmh2:10 fmh3:0.1 ]", + "[ 13/4 → 27/8 | s:sine note:F1 fmi:4 fmi2:3.9694602862000465 fmi3:3.25 fmh:1.06 fmh2:10 fmh3:0.1 ]", + "[ 27/8 → 7/2 | s:sine note:F1 fmi:4 fmi2:1.6347672045230865 fmi3:3.375 fmh:1.06 fmh2:10 fmh3:0.1 ]", + "[ 7/2 → 29/8 | s:sine note:F1 fmi:4 fmi2:1.639795258641243 fmi3:3.5 fmh:1.06 fmh2:10 fmh3:0.1 ]", + "[ 29/8 → 15/4 | s:sine note:F1 fmi:4 fmi2:3.7565943151712418 fmi3:3.625 fmh:1.06 fmh2:10 fmh3:0.1 ]", + "[ 15/4 → 31/8 | s:sine note:F1 fmi:4 fmi2:3.2486692890524864 fmi3:3.75 fmh:1.06 fmh2:10 fmh3:0.1 ]", + "[ 31/8 → 4/1 | s:sine note:F1 fmi:4 fmi2:2.9446661546826363 fmi3:3.875 fmh:1.06 fmh2:10 fmh3:0.1 ]", +] +`; + exports[`runs examples > example "fmsustain" example index 0 1`] = ` [ "[ 0/1 → 1/6 | note:c fmi:4 fmdecay:0.1 fmsustain:1 ]", From 0fbde61b2dd4bb2f2c3bdf2b451d05bfa73264e4 Mon Sep 17 00:00:00 2001 From: Nikita Date: Sun, 19 Oct 2025 14:35:23 +0300 Subject: [PATCH 058/312] WIP non-realtime exporting --- packages/codemirror/codemirror.mjs | 10 +- packages/core/cyclist.mjs | 13 ++ packages/core/repl.mjs | 31 ++-- packages/superdough/audioContext.mjs | 5 + packages/superdough/feedbackdelay.mjs | 2 +- packages/superdough/reverb.mjs | 4 +- packages/superdough/superdough.mjs | 12 +- packages/superdough/vowel.mjs | 2 +- packages/webaudio/webaudio.mjs | 151 +++++++++++++++++- website/src/repl/components/Header.jsx | 12 +- .../src/repl/components/panel/SettingsTab.jsx | 2 +- website/src/repl/useReplContext.jsx | 4 + 12 files changed, 217 insertions(+), 31 deletions(-) diff --git a/packages/codemirror/codemirror.mjs b/packages/codemirror/codemirror.mjs index 4dc23996f..645a8a190 100644 --- a/packages/codemirror/codemirror.mjs +++ b/packages/codemirror/codemirror.mjs @@ -42,9 +42,9 @@ const extensions = { isMultiCursorEnabled: (on) => on ? [ - EditorState.allowMultipleSelections.of(true), - EditorView.clickAddsSelectionRange.of((ev) => ev.metaKey || ev.ctrlKey), - ] + EditorState.allowMultipleSelections.of(true), + EditorView.clickAddsSelectionRange.of((ev) => ev.metaKey || ev.ctrlKey), + ] : [], }; const compartments = Object.fromEntries(Object.keys(extensions).map((key) => [key, new Compartment()])); @@ -268,6 +268,10 @@ export class StrudelMirror { this.flash(); await this.repl.evaluate(this.code); } + async exportAudio(begin, end) { + // await this.repl.evaluate(this.code, false) + this.repl.exportAudio(begin, end); + } async stop() { this.repl.scheduler.stop(); } diff --git a/packages/core/cyclist.mjs b/packages/core/cyclist.mjs index 59e410c53..b7ab7dde4 100644 --- a/packages/core/cyclist.mjs +++ b/packages/core/cyclist.mjs @@ -6,6 +6,7 @@ This program is free software: you can redistribute it and/or modify it under th import createClock from './zyklus.mjs'; import { errorLogger, logger } from './logger.mjs'; +import { loadBuffer, renderPatternAudio, setAudioContext, superdough } from '@strudel/webaudio'; export class Cyclist { constructor({ @@ -98,6 +99,7 @@ export class Cyclist { this.started = v; this.onToggle?.(v); } + async start() { await this.beforeStart?.(); this.num_ticks_since_cps_change = 0; @@ -109,6 +111,17 @@ export class Cyclist { this.clock.start(); this.setStarted(true); } + + async exportAudio(begin, end) { + if (!this.pattern) { + throw new Error('Scheduler: no pattern set! call .setPattern first.'); + } + logger('[cyclist] exporting'); + // this.clock.start(); + // this.setStarted(true); + await renderPatternAudio(this.pattern, this.cps, begin, end) + } + pause() { logger('[cyclist] pause'); this.clock.pause(); diff --git a/packages/core/repl.mjs b/packages/core/repl.mjs index 171697eb9..d0cb1e19f 100644 --- a/packages/core/repl.mjs +++ b/packages/core/repl.mjs @@ -91,6 +91,7 @@ export function repl({ const stop = () => scheduler.stop(); const start = () => scheduler.start(); + const exportAudio = (begin, end) => scheduler.exportAudio(begin, end); const pause = () => scheduler.pause(); const toggle = () => scheduler.toggle(); const setCps = (cps) => { @@ -257,23 +258,23 @@ export function repl({ } }; const setCode = (code) => updateState({ code }); - return { scheduler, evaluate, start, stop, pause, setCps, setPattern, setCode, toggle, state }; + return { scheduler, evaluate, start, exportAudio, stop, pause, setCps, setPattern, setCode, toggle, state }; } export const getTrigger = ({ getTime, defaultOutput }) => - async (hap, deadline, duration, cps, t) => { - // ^ this signature is different from hap.context.onTrigger, as set by Pattern.onTrigger(onTrigger) - // TODO: get rid of deadline after https://codeberg.org/uzu/strudel/pulls/1004 - try { - if (!hap.context.onTrigger || !hap.context.dominantTrigger) { - await defaultOutput(hap, deadline, duration, cps, t); + async (hap, deadline, duration, cps, t) => { + // ^ this signature is different from hap.context.onTrigger, as set by Pattern.onTrigger(onTrigger) + // TODO: get rid of deadline after https://codeberg.org/uzu/strudel/pulls/1004 + try { + if (!hap.context.onTrigger || !hap.context.dominantTrigger) { + await defaultOutput(hap, deadline, duration, cps, t); + } + if (hap.context.onTrigger) { + // call signature of output / onTrigger is different... + await hap.context.onTrigger(hap, getTime(), cps, t); + } + } catch (err) { + errorLogger(err, 'getTrigger'); } - if (hap.context.onTrigger) { - // call signature of output / onTrigger is different... - await hap.context.onTrigger(hap, getTime(), cps, t); - } - } catch (err) { - errorLogger(err, 'getTrigger'); - } - }; + }; diff --git a/packages/superdough/audioContext.mjs b/packages/superdough/audioContext.mjs index 71e01d57d..30fbd9fd0 100644 --- a/packages/superdough/audioContext.mjs +++ b/packages/superdough/audioContext.mjs @@ -5,6 +5,11 @@ export const setDefaultAudioContext = () => { return audioContext; }; +export const setAudioContext = (context) => { + audioContext = context + return audioContext; +}; + export const getAudioContext = () => { if (!audioContext) { return setDefaultAudioContext(); diff --git a/packages/superdough/feedbackdelay.mjs b/packages/superdough/feedbackdelay.mjs index c182d6558..b8269bc02 100644 --- a/packages/superdough/feedbackdelay.mjs +++ b/packages/superdough/feedbackdelay.mjs @@ -25,7 +25,7 @@ if (typeof DelayNode !== 'undefined') { } } - AudioContext.prototype.createFeedbackDelay = function (wet, time, feedback) { + BaseAudioContext.prototype.createFeedbackDelay = function (wet, time, feedback) { return new FeedbackDelayNode(this, wet, time, feedback); }; } diff --git a/packages/superdough/reverb.mjs b/packages/superdough/reverb.mjs index 2960b597c..c8b6eb3e5 100644 --- a/packages/superdough/reverb.mjs +++ b/packages/superdough/reverb.mjs @@ -2,7 +2,7 @@ import reverbGen from './reverbGen.mjs'; import { clamp } from './util.mjs'; if (typeof AudioContext !== 'undefined') { - AudioContext.prototype.adjustLength = function (duration, buffer, speed = 1, offsetAmount = 0) { + BaseAudioContext.prototype.adjustLength = function (duration, buffer, speed = 1, offsetAmount = 0) { const sampleOffset = Math.floor(clamp(offsetAmount, 0, 1) * buffer.length); const newLength = buffer.sampleRate * duration; const newBuffer = this.createBuffer(buffer.numberOfChannels, buffer.length, buffer.sampleRate); @@ -23,7 +23,7 @@ if (typeof AudioContext !== 'undefined') { return newBuffer; }; - AudioContext.prototype.createReverb = function (duration, fade, lp, dim, ir, irspeed, irbegin) { + BaseAudioContext.prototype.createReverb = function (duration, fade, lp, dim, ir, irspeed, irbegin) { const convolver = this.createConvolver(); convolver.generate = (d = 2, fade = 0.1, lp = 15000, dim = 1000, ir, irspeed, irbegin) => { convolver.duration = d; diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index a37504b1d..80205a298 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -13,7 +13,7 @@ import { createFilter, gainNode, getCompressor, getDistortion, getLfo, getWorkle import { map } from 'nanostores'; import { logger } from './logger.mjs'; import { loadBuffer } from './sampler.mjs'; -import { getAudioContext } from './audioContext.mjs'; +import { getAudioContext, setAudioContext } from './audioContext.mjs'; import { SuperdoughAudioController } from './superdoughoutput.mjs'; export const DEFAULT_MAX_POLYPHONY = 128; @@ -367,6 +367,7 @@ function mapChannelNumbers(channels) { } export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) => { + controller = null; // new: t is always expected to be the absolute target onset time const ac = getAudioContext(); const audioController = getSuperdoughAudioController(); @@ -387,14 +388,13 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) // duration is passed as value too.. value.duration = hapDuration; // calculate absolute time - - if (t < ac.currentTime) { + if (t < ac.currentTime && !(ac instanceof OfflineAudioContext)) { console.warn( `[superdough]: cannot schedule sounds in the past (target: ${t.toFixed(2)}, now: ${ac.currentTime.toFixed(2)})`, ); return; - } - // destructure + } // FIXME: fix + // destructure let { tremolo, tremolosync, @@ -736,4 +736,4 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) export const superdoughTrigger = (t, hap, ct, cps) => { superdough(hap, t - ct, hap.duration / cps, cps); -}; +}; \ No newline at end of file diff --git a/packages/superdough/vowel.mjs b/packages/superdough/vowel.mjs index 3f30aef1e..025677fc1 100644 --- a/packages/superdough/vowel.mjs +++ b/packages/superdough/vowel.mjs @@ -63,7 +63,7 @@ if (typeof GainNode !== 'undefined') { } } - AudioContext.prototype.createVowelFilter = function (letter) { + BaseAudioContext.prototype.createVowelFilter = function (letter) { return new VowelNode(this, letter); }; } diff --git a/packages/webaudio/webaudio.mjs b/packages/webaudio/webaudio.mjs index 383e87f87..46bef88d6 100644 --- a/packages/webaudio/webaudio.mjs +++ b/packages/webaudio/webaudio.mjs @@ -5,7 +5,7 @@ This program is free software: you can redistribute it and/or modify it under th */ import * as strudel from '@strudel/core'; -import { superdough, getAudioContext, setLogger, doughTrigger, registerWorklet } from 'superdough'; +import { superdough, getAudioContext, setLogger, doughTrigger, registerWorklet, setAudioContext, getSampleBufferSource, loadBuffer, getSampleInfo, getSound } from 'superdough'; import './supradough.mjs'; import { workletUrl } from 'supradough'; @@ -26,6 +26,60 @@ export const webaudioOutput = (hap, _deadline, hapDuration, cps, t) => { return superdough(hap2value(hap), t, hapDuration, cps, hap.whole?.begin.valueOf()); }; +export async function renderPatternAudio(pattern, cps, begin, end) { + let audioContext = new OfflineAudioContext(2, (end - begin) / cps * 48000, 48000); + setAudioContext(audioContext) + logger('[webaudio] start rendering'); + console.log(audioContext) + + let haps = pattern.queryArc(begin, end, { _cps: cps }) + Promise.all(haps.map(async h => { + let s; + if (h.value.s) { + if (h.value.bank) { + s = `${h.value.bank}_${h.value.s}`; + } + else { + s = h.value.s + } + } + let bank = getSound(s).data.samples + if (bank) { + let { url: sampleUrl, label } = getSampleInfo(h.value, bank); + await loadBuffer(sampleUrl, audioContext, label) + } + })) + haps.forEach(async (hap) => { + if (hap.hasOnset()) { + hap.ensureObjectValue(); + await superdough(hap.value, hap.whole.begin.valueOf() / cps, hap.duration, cps, hap.whole?.begin.valueOf()); + } + }) + + let context = getAudioContext() + context.startRendering().then((renderedBuffer) => { + // console.log(renderedBuffer) + const wavBuffer = audioBufferToWav(renderedBuffer); + const blob = new Blob([wavBuffer], { type: 'audio/wav' }); + let downloadName = '' + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + // remove leading dash if they want an empty download name + if (downloadName == '') { + downloadName = `${new Date().toISOString()}.wav`; + } else { + downloadName = downloadName + `-${new Date().toISOString()}.wav`; + } + a.download = `${downloadName}`; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(url); + setAudioContext(null) + }); +} + export function webaudioRepl(options = {}) { options = { getTime: () => getAudioContext().currentTime, @@ -38,3 +92,98 @@ export function webaudioRepl(options = {}) { Pattern.prototype.dough = function () { return this.onTrigger(doughTrigger, 1); }; + + +function audioBufferToWav(buffer, opt) { + opt = opt || {} + + var numChannels = buffer.numberOfChannels + var sampleRate = buffer.sampleRate + var format = opt.float32 ? 3 : 1 + var bitDepth = format === 3 ? 32 : 16 + + var result + if (numChannels === 2) { + result = interleave(buffer.getChannelData(0), buffer.getChannelData(1)) + } else { + result = buffer.getChannelData(0) + } + + return encodeWAV(result, format, sampleRate, numChannels, bitDepth) +} + +function encodeWAV(samples, format, sampleRate, numChannels, bitDepth) { + var bytesPerSample = bitDepth / 8 + var blockAlign = numChannels * bytesPerSample + + var buffer = new ArrayBuffer(44 + samples.length * bytesPerSample) + var view = new DataView(buffer) + + /* RIFF identifier */ + writeString(view, 0, 'RIFF') + /* RIFF chunk length */ + view.setUint32(4, 36 + samples.length * bytesPerSample, true) + /* RIFF type */ + writeString(view, 8, 'WAVE') + /* format chunk identifier */ + writeString(view, 12, 'fmt ') + /* format chunk length */ + view.setUint32(16, 16, true) + /* sample format (raw) */ + view.setUint16(20, format, true) + /* channel count */ + view.setUint16(22, numChannels, true) + /* sample rate */ + view.setUint32(24, sampleRate, true) + /* byte rate (sample rate * block align) */ + view.setUint32(28, sampleRate * blockAlign, true) + /* block align (channel count * bytes per sample) */ + view.setUint16(32, blockAlign, true) + /* bits per sample */ + view.setUint16(34, bitDepth, true) + /* data chunk identifier */ + writeString(view, 36, 'data') + /* data chunk length */ + view.setUint32(40, samples.length * bytesPerSample, true) + if (format === 1) { // Raw PCM + floatTo16BitPCM(view, 44, samples) + } else { + writeFloat32(view, 44, samples) + } + + return buffer +} + +function interleave(inputL, inputR) { + var length = inputL.length + inputR.length + var result = new Float32Array(length) + + var index = 0 + var inputIndex = 0 + + while (index < length) { + result[index++] = inputL[inputIndex] + result[index++] = inputR[inputIndex] + inputIndex++ + } + return result +} + +function writeFloat32(output, offset, input) { + for (var i = 0; i < input.length; i++, offset += 4) { + output.setFloat32(offset, input[i], true) + } +} + +function floatTo16BitPCM(output, offset, input) { + for (var i = 0; i < input.length; i++, offset += 2) { + var s = Math.max(-1, Math.min(1, input[i])) + output.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true) + } +} + +function writeString(view, offset, string) { + for (var i = 0; i < string.length; i++) { + view.setUint8(offset + i, string.charCodeAt(i)) + } +} \ No newline at end of file diff --git a/website/src/repl/components/Header.jsx b/website/src/repl/components/Header.jsx index ca4e1ecf9..656aa7861 100644 --- a/website/src/repl/components/Header.jsx +++ b/website/src/repl/components/Header.jsx @@ -8,7 +8,7 @@ const { BASE_URL } = import.meta.env; const baseNoTrailing = BASE_URL.endsWith('/') ? BASE_URL.slice(0, -1) : BASE_URL; export function Header({ context, embedded = false }) { - const { started, pending, isDirty, activeCode, handleTogglePlay, handleEvaluate, handleShuffle, handleShare } = + const { started, pending, isDirty, activeCode, handleTogglePlay, handleEvaluate, handleShuffle, handleShare, handleExport } = context; const isEmbedded = typeof window !== 'undefined' && (embedded || window.location !== window.parent.location); const { isZen, isButtonRowHidden, isCSSAnimationDisabled, fontFamily } = useSettings(); @@ -93,6 +93,16 @@ export function Header({ context, embedded = false }) { > {!isEmbedded && update} + {/* !isEmbedded && ( + + +
+

Start cycle

+ { + let v = parseInt(e.target.value); + console.log(v) + v = isNaN(v) ? 0 : Math.max(1, v); + setStartCycle(v); + }} + onChange={v => { + v = parseInt(v) + setStartCycle(v); + }} + type="number" + placeholder="" + value={startCycle ?? ''} + /> +
+
+

End cycle

+ { + let v = parseInt(e.target.value); + v = isNaN(v) ? Math.max(startCycle + 1, parseInt(v)) : v; + setEndCycle(v); + }} + onChange={(v) => { + v = parseInt(v) + setEndCycle(v); + }} + type="number" + placeholder="" + value={endCycle ?? ''} + /> +
+
+

Maximum polyphony

+ { + let v = parseInt(e.target.value); + v = isNaN(v) ? Math.max(1, parseInt(v)) : v; + setMaxPolyphony(v); + }} + onChange={(v) => { + v = Math.max(1, parseInt(v)); + setMaxPolyphony(v); + }} + type="number" + placeholder="" + value={maxPolyphony ?? ''} + /> +
+
+ { + const val = cbEvent.target.checked; + setMultiChannelOrbits(val) + }} + value={multiChannelOrbits} + /> +
+ +
+ + ); +} diff --git a/website/src/repl/components/Header.jsx b/website/src/repl/components/Header.jsx index 91e942d39..d5d8b5f75 100644 --- a/website/src/repl/components/Header.jsx +++ b/website/src/repl/components/Header.jsx @@ -3,6 +3,7 @@ import StopCircleIcon from '@heroicons/react/20/solid/StopCircleIcon'; import cx from '@src/cx.mjs'; import { useSettings, setIsZen } from '../../settings.mjs'; import '../Repl.css'; +import ExportModal from './ExportModal'; const { BASE_URL } = import.meta.env; const baseNoTrailing = BASE_URL.endsWith('/') ? BASE_URL.slice(0, -1) : BASE_URL; @@ -93,18 +94,7 @@ export function Header({ context, embedded = false }) { > {!isEmbedded && update} - + {/* !isEmbedded && ( - - -
-

Start cycle

- { - let v = parseInt(e.target.value); - console.log(v) - v = isNaN(v) ? 0 : Math.max(0, v); - setStartCycle(v); - }} - onChange={v => { - v = parseInt(v) - setStartCycle(v); - }} - type="number" - placeholder="" - value={startCycle ?? ''} - /> -
-
-

End cycle

- { - let v = parseInt(e.target.value); - v = isNaN(v) ? Math.max(startCycle + 1, parseInt(v)) : v; - setEndCycle(v); - }} - onChange={(v) => { - v = parseInt(v) - setEndCycle(v); - }} - type="number" - placeholder="" - value={endCycle ?? ''} - /> -
-
-

Maximum polyphony

- { - let v = parseInt(e.target.value); - v = isNaN(v) ? Math.max(1, parseInt(v)) : v; - setMaxPolyphony(v); - }} - onChange={(v) => { - v = Math.max(1, parseInt(v)); - setMaxPolyphony(v); - }} - type="number" - placeholder="" - value={maxPolyphony ?? ''} - /> -
-
- { - const val = cbEvent.target.checked; - setMultiChannelOrbits(val) - }} - value={multiChannelOrbits} - /> -
- + }} + className={cx( + 'absolute text-foreground max-h-8 min-h-8 max-w-8 min-w-8 items-center p-1.5 right-2 top-2 z-50', + exporting && "opacity-50" + )} + aria-label="Close Modal" + > + + +
+ + { + setDownloadName(e.target.value) + }} + onChange={v => { + setDownloadName(v) + }} + disabled={exporting} + placeholder="Leave empty to use current date" + className={cx("placeholder:opacity-50", exporting && "opacity-50 border-opacity-50")} + value={downloadName ?? ''} + /> + +
+ + { + let v = parseInt(e.target.value); + v = isNaN(v) ? 0 : Math.max(0, v); + setStartCycle(v); + }} + onChange={v => { + v = parseInt(v) + setStartCycle(v); + }} + type="number" + placeholder="" + disabled={exporting} + className={cx(exporting && "opacity-50 border-opacity-50")} + value={startCycle ?? ''} + /> + + + { + let v = parseInt(e.target.value); + v = isNaN(v) ? Math.max(startCycle + 1, parseInt(v)) : v; + setEndCycle(v); + }} + onChange={(v) => { + v = parseInt(v) + setEndCycle(v); + }} + type="number" + placeholder="" + disabled={exporting} + className={cx(exporting && "opacity-50 border-opacity-50")} + value={endCycle ?? ''} + /> + +
+
+ + { + let v = parseInt(e.target.value); + v = isNaN(v) ? 1 : Math.max(1, v); + setSampleRate(v); + }} + onChange={v => { + v = parseInt(v) + setSampleRate(v); + }} + type="number" + placeholder="" + disabled={exporting} + className={cx(exporting && "opacity-50 border-opacity-50")} + value={sampleRate ?? ''} + /> + + + { + let v = parseInt(e.target.value); + v = isNaN(v) ? Math.max(1, parseInt(v)) : v; + setMaxPolyphony(v); + }} + onChange={(v) => { + v = Math.max(1, parseInt(v)); + setMaxPolyphony(v); + }} + type="number" + placeholder="" + disabled={exporting} + className={cx(exporting && "opacity-50 border-opacity-50")} + value={maxPolyphony ?? ''} + /> + +
+
+ { + const val = cbEvent.target.checked; + setMultiChannelOrbits(val) + }} + disabled={exporting} + value={multiChannelOrbits} + /> +
+ +
); diff --git a/website/src/repl/useReplContext.jsx b/website/src/repl/useReplContext.jsx index b9f1c8c8b..0e89fb68b 100644 --- a/website/src/repl/useReplContext.jsx +++ b/website/src/repl/useReplContext.jsx @@ -203,8 +203,8 @@ export function useReplContext() { const handleEvaluate = () => { editorRef.current.evaluate(); }; - const handleExport = async (begin, end) => { - await editorRef.current.exportAudio(begin, end); + const handleExport = async (begin, end, sampleRate, downloadName = undefined) => { + await editorRef.current.exportAudio(begin, end, sampleRate, downloadName); }; const handleShuffle = async () => { const patternData = await getRandomTune(); From 428a4b3dd742087b5fa50cc0c15ebd380c5d573b Mon Sep 17 00:00:00 2001 From: Nikita Date: Mon, 20 Oct 2025 20:21:23 +0300 Subject: [PATCH 065/312] Revert workletsUrl to use ?audioworklet --- packages/superdough/superdough.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index ed5cd9649..2f9eca3ee 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -8,7 +8,7 @@ import './feedbackdelay.mjs'; import './reverb.mjs'; import './vowel.mjs'; import { nanFallback, _mod, cycleToSeconds } from './util.mjs'; -import workletsUrl from './worklets.mjs?url'; +import workletsUrl from './worklets.mjs?audioworklet'; import { createFilter, gainNode, getCompressor, getDistortion, getLfo, getWorklet, effectSend } from './helpers.mjs'; import { map } from 'nanostores'; import { logger } from './logger.mjs'; From 4bdaf577c08cab55afdc4440ab737054578f8aa7 Mon Sep 17 00:00:00 2001 From: Nikita Date: Mon, 20 Oct 2025 20:22:16 +0300 Subject: [PATCH 066/312] Format --- packages/codemirror/codemirror.mjs | 9 +- packages/core/cyclist.mjs | 2 +- packages/core/repl.mjs | 31 +- packages/superdough/audioContext.mjs | 6 +- packages/superdough/helpers.mjs | 2 +- packages/superdough/superdough.mjs | 12 +- packages/webaudio/webaudio.mjs | 198 +++++----- website/src/repl/components/ExportModal.jsx | 405 ++++++++++---------- website/src/repl/components/Header.jsx | 13 +- 9 files changed, 360 insertions(+), 318 deletions(-) diff --git a/packages/codemirror/codemirror.mjs b/packages/codemirror/codemirror.mjs index 7cbb925d8..84cbfa96a 100644 --- a/packages/codemirror/codemirror.mjs +++ b/packages/codemirror/codemirror.mjs @@ -42,9 +42,9 @@ const extensions = { isMultiCursorEnabled: (on) => on ? [ - EditorState.allowMultipleSelections.of(true), - EditorView.clickAddsSelectionRange.of((ev) => ev.metaKey || ev.ctrlKey), - ] + EditorState.allowMultipleSelections.of(true), + EditorView.clickAddsSelectionRange.of((ev) => ev.metaKey || ev.ctrlKey), + ] : [], }; const compartments = Object.fromEntries(Object.keys(extensions).map((key) => [key, new Compartment()])); @@ -269,10 +269,9 @@ export class StrudelMirror { await this.repl.evaluate(this.code); } async exportAudio(begin, end, sampleRate, downloadName = undefined) { - await this.repl.evaluate(this.code, false) + await this.repl.evaluate(this.code, false); await this.repl.exportAudio(begin, end, sampleRate, downloadName); this.repl.scheduler.stop(); - } async stop() { this.repl.scheduler.stop(); diff --git a/packages/core/cyclist.mjs b/packages/core/cyclist.mjs index 167f18828..185d5588b 100644 --- a/packages/core/cyclist.mjs +++ b/packages/core/cyclist.mjs @@ -117,7 +117,7 @@ export class Cyclist { throw new Error('Scheduler: no pattern set! call .setPattern first.'); } logger('[cyclist] exporting'); - await renderPatternAudio(this.pattern, this.cps, begin, end, sampleRate, downloadName) + await renderPatternAudio(this.pattern, this.cps, begin, end, sampleRate, downloadName); } pause() { diff --git a/packages/core/repl.mjs b/packages/core/repl.mjs index 970c15a67..4a35b932e 100644 --- a/packages/core/repl.mjs +++ b/packages/core/repl.mjs @@ -91,7 +91,8 @@ export function repl({ const stop = () => scheduler.stop(); const start = () => scheduler.start(); - const exportAudio = async (begin, end, sampleRate, downloadName = undefined) => await scheduler.exportAudio(begin, end, sampleRate, downloadName); + const exportAudio = async (begin, end, sampleRate, downloadName = undefined) => + await scheduler.exportAudio(begin, end, sampleRate, downloadName); const pause = () => scheduler.pause(); const toggle = () => scheduler.toggle(); const setCps = (cps) => { @@ -263,18 +264,18 @@ export function repl({ export const getTrigger = ({ getTime, defaultOutput }) => - async (hap, deadline, duration, cps, t) => { - // ^ this signature is different from hap.context.onTrigger, as set by Pattern.onTrigger(onTrigger) - // TODO: get rid of deadline after https://codeberg.org/uzu/strudel/pulls/1004 - try { - if (!hap.context.onTrigger || !hap.context.dominantTrigger) { - await defaultOutput(hap, deadline, duration, cps, t); - } - if (hap.context.onTrigger) { - // call signature of output / onTrigger is different... - await hap.context.onTrigger(hap, getTime(), cps, t); - } - } catch (err) { - errorLogger(err, 'getTrigger'); + async (hap, deadline, duration, cps, t) => { + // ^ this signature is different from hap.context.onTrigger, as set by Pattern.onTrigger(onTrigger) + // TODO: get rid of deadline after https://codeberg.org/uzu/strudel/pulls/1004 + try { + if (!hap.context.onTrigger || !hap.context.dominantTrigger) { + await defaultOutput(hap, deadline, duration, cps, t); } - }; + if (hap.context.onTrigger) { + // call signature of output / onTrigger is different... + await hap.context.onTrigger(hap, getTime(), cps, t); + } + } catch (err) { + errorLogger(err, 'getTrigger'); + } + }; diff --git a/packages/superdough/audioContext.mjs b/packages/superdough/audioContext.mjs index ea60722b1..9a5913d80 100644 --- a/packages/superdough/audioContext.mjs +++ b/packages/superdough/audioContext.mjs @@ -1,15 +1,15 @@ -import { analysers, resetGlobalEffects } from "./superdough.mjs"; +import { analysers, resetGlobalEffects } from './superdough.mjs'; let audioContext; export const setDefaultAudioContext = () => { audioContext = new AudioContext(); - resetGlobalEffects() + resetGlobalEffects(); return audioContext; }; export const setAudioContext = (context) => { - audioContext = context + audioContext = context; return audioContext; }; diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index cf65c390f..a471da9dd 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -348,7 +348,7 @@ export function applyFM(param, value, begin) { duration, } = value; let modulator; - let stop = () => { }; + let stop = () => {}; if (fmModulationIndex) { const ac = getAudioContext(); diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 2f9eca3ee..118a152b1 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -212,7 +212,9 @@ export function loadWorklets() { if (!workletsLoading) { const audioCtx = getAudioContext(); const allWorkletURLs = externalWorklets.concat([workletsUrl]); - workletsLoading = Promise.all(allWorkletURLs.map((workletURL) => audioCtx.audioWorklet.addModule(workletURL))).then(() => workletsLoading = undefined); + workletsLoading = Promise.all(allWorkletURLs.map((workletURL) => audioCtx.audioWorklet.addModule(workletURL))).then( + () => (workletsLoading = undefined), + ); } return workletsLoading; @@ -250,7 +252,7 @@ export async function initAudio(options = {}) { logger('[superdough] failed to set audio interface', 'warning'); } } - if (!audioCtx instanceof OfflineAudioContext) { + if ((!audioCtx) instanceof OfflineAudioContext) { await audioCtx.resume(); } if (disableWorklets) { @@ -288,7 +290,7 @@ function getSuperdoughAudioController() { } export function setSuperdoughAudioController(newController) { - controller = newController + controller = newController; return controller; } @@ -401,7 +403,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) ); return; } // FIXME: fix - // destructure + // destructure let { tremolo, tremolosync, @@ -743,4 +745,4 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) export const superdoughTrigger = (t, hap, ct, cps) => { superdough(hap, t - ct, hap.duration / cps, cps); -}; \ No newline at end of file +}; diff --git a/packages/webaudio/webaudio.mjs b/packages/webaudio/webaudio.mjs index 27718bd7d..43c011460 100644 --- a/packages/webaudio/webaudio.mjs +++ b/packages/webaudio/webaudio.mjs @@ -5,7 +5,23 @@ This program is free software: you can redistribute it and/or modify it under th */ import * as strudel from '@strudel/core'; -import { superdough, getAudioContext, setLogger, doughTrigger, registerWorklet, setAudioContext, getSampleBufferSource, loadBuffer, getSampleInfo, getSound, initAudio, setSuperdoughAudioController, loadWorklets, setMaxPolyphony, setMultiChannelOrbits } from 'superdough'; +import { + superdough, + getAudioContext, + setLogger, + doughTrigger, + registerWorklet, + setAudioContext, + getSampleBufferSource, + loadBuffer, + getSampleInfo, + getSound, + initAudio, + setSuperdoughAudioController, + loadWorklets, + setMaxPolyphony, + setMultiChannelOrbits, +} from 'superdough'; import './supradough.mjs'; import { workletUrl } from 'supradough'; import { SuperdoughAudioController } from 'superdough/superdoughoutput.mjs'; @@ -28,59 +44,63 @@ export const webaudioOutput = (hap, _deadline, hapDuration, cps, t) => { }; export async function renderPatternAudio(pattern, cps, begin, end, sampleRate, downloadName = undefined) { - const oldAudioCtx = getAudioContext() - await oldAudioCtx.close() - let audioContext = new OfflineAudioContext(2, (end - begin) / cps * sampleRate, sampleRate); - setAudioContext(audioContext) - let context = getAudioContext() - setSuperdoughAudioController(new SuperdoughAudioController(context)) - setMaxPolyphony(1024) - setMultiChannelOrbits(true) - await loadWorklets() + const oldAudioCtx = getAudioContext(); + await oldAudioCtx.close(); + let audioContext = new OfflineAudioContext(2, ((end - begin) / cps) * sampleRate, sampleRate); + setAudioContext(audioContext); + let context = getAudioContext(); + setSuperdoughAudioController(new SuperdoughAudioController(context)); + setMaxPolyphony(1024); + setMultiChannelOrbits(true); + await loadWorklets(); logger('[webaudio] start rendering'); - let haps = pattern.queryArc(begin, end, { _cps: cps }) - Promise.all(haps.map(async h => { - let s; - if (h.value.s) { - if (h.value.bank) { - s = `${h.value.bank}_${h.value.s}`; + let haps = pattern.queryArc(begin, end, { _cps: cps }); + Promise.all( + haps.map(async (h) => { + let s; + if (h.value.s) { + if (h.value.bank) { + s = `${h.value.bank}_${h.value.s}`; + } else { + s = h.value.s; + } + let bank = getSound(s).data.samples; + if (bank) { + let { url: sampleUrl, label } = getSampleInfo(h.value, bank); + await loadBuffer(sampleUrl, context, label); + } } - else { - s = h.value.s - } - let bank = getSound(s).data.samples - if (bank) { - let { url: sampleUrl, label } = getSampleInfo(h.value, bank); - await loadBuffer(sampleUrl, context, label) - } - } - })) + }), + ); haps.forEach(async (hap) => { if (hap.hasOnset()) { hap.ensureObjectValue(); await superdough(hap.value, hap.whole.begin.valueOf() / cps, hap.duration, cps, hap.whole?.begin.valueOf()); } - }) - - return context.startRendering().then((renderedBuffer) => { - console.log(renderedBuffer) - const wavBuffer = audioBufferToWav(renderedBuffer); - const blob = new Blob([wavBuffer], { type: 'audio/wav' }); - const url = URL.createObjectURL(blob); - const a = document.createElement('a'); - a.href = url; - downloadName = downloadName ? `${downloadName}.wav` : `${new Date().toISOString()}.wav`; - a.download = `${downloadName}`; - document.body.appendChild(a); - a.click(); - document.body.removeChild(a); - URL.revokeObjectURL(url); - }).finally(async () => { - setAudioContext(null) - setSuperdoughAudioController(null) - await initAudio() }); + + return context + .startRendering() + .then((renderedBuffer) => { + console.log(renderedBuffer); + const wavBuffer = audioBufferToWav(renderedBuffer); + const blob = new Blob([wavBuffer], { type: 'audio/wav' }); + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + downloadName = downloadName ? `${downloadName}.wav` : `${new Date().toISOString()}.wav`; + a.download = `${downloadName}`; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(url); + }) + .finally(async () => { + setAudioContext(null); + setSuperdoughAudioController(null); + await initAudio(); + }); } export function webaudioRepl(options = {}) { @@ -96,97 +116,97 @@ Pattern.prototype.dough = function () { return this.onTrigger(doughTrigger, 1); }; - function audioBufferToWav(buffer, opt) { - opt = opt || {} + opt = opt || {}; - var numChannels = buffer.numberOfChannels - var sampleRate = buffer.sampleRate - var format = opt.float32 ? 3 : 1 - var bitDepth = format === 3 ? 32 : 16 + var numChannels = buffer.numberOfChannels; + var sampleRate = buffer.sampleRate; + var format = opt.float32 ? 3 : 1; + var bitDepth = format === 3 ? 32 : 16; - var result + var result; if (numChannels === 2) { - result = interleave(buffer.getChannelData(0), buffer.getChannelData(1)) + result = interleave(buffer.getChannelData(0), buffer.getChannelData(1)); } else { - result = buffer.getChannelData(0) + result = buffer.getChannelData(0); } - return encodeWAV(result, format, sampleRate, numChannels, bitDepth) + return encodeWAV(result, format, sampleRate, numChannels, bitDepth); } function encodeWAV(samples, format, sampleRate, numChannels, bitDepth) { - var bytesPerSample = bitDepth / 8 - var blockAlign = numChannels * bytesPerSample + var bytesPerSample = bitDepth / 8; + var blockAlign = numChannels * bytesPerSample; - var buffer = new ArrayBuffer(44 + samples.length * bytesPerSample) - var view = new DataView(buffer) + var buffer = new ArrayBuffer(44 + samples.length * bytesPerSample); + var view = new DataView(buffer); /* RIFF identifier */ - writeString(view, 0, 'RIFF') + writeString(view, 0, 'RIFF'); /* RIFF chunk length */ - view.setUint32(4, 36 + samples.length * bytesPerSample, true) + view.setUint32(4, 36 + samples.length * bytesPerSample, true); /* RIFF type */ - writeString(view, 8, 'WAVE') + writeString(view, 8, 'WAVE'); /* format chunk identifier */ - writeString(view, 12, 'fmt ') + writeString(view, 12, 'fmt '); /* format chunk length */ - view.setUint32(16, 16, true) + view.setUint32(16, 16, true); /* sample format (raw) */ - view.setUint16(20, format, true) + view.setUint16(20, format, true); /* channel count */ - view.setUint16(22, numChannels, true) + view.setUint16(22, numChannels, true); /* sample rate */ - view.setUint32(24, sampleRate, true) + view.setUint32(24, sampleRate, true); /* byte rate (sample rate * block align) */ - view.setUint32(28, sampleRate * blockAlign, true) + view.setUint32(28, sampleRate * blockAlign, true); /* block align (channel count * bytes per sample) */ - view.setUint16(32, blockAlign, true) + view.setUint16(32, blockAlign, true); /* bits per sample */ - view.setUint16(34, bitDepth, true) + view.setUint16(34, bitDepth, true); /* data chunk identifier */ - writeString(view, 36, 'data') + writeString(view, 36, 'data'); /* data chunk length */ - view.setUint32(40, samples.length * bytesPerSample, true) - if (format === 1) { // Raw PCM - floatTo16BitPCM(view, 44, samples) + view.setUint32(40, samples.length * bytesPerSample, true); + if (format === 1) { + // Raw PCM + floatTo16BitPCM(view, 44, samples); } else { - writeFloat32(view, 44, samples) + writeFloat32(view, 44, samples); } - return buffer + return buffer; } function interleave(inputL, inputR) { - var length = inputL.length + inputR.length - var result = new Float32Array(length) + var length = inputL.length + inputR.length; + var result = new Float32Array(length); - var index = 0 - var inputIndex = 0 + var index = 0; + var inputIndex = 0; while (index < length) { - result[index++] = inputL[inputIndex] - result[index++] = inputR[inputIndex] - inputIndex++ + result[index++] = inputL[inputIndex]; + result[index++] = inputR[inputIndex]; + inputIndex++; } - return result + return result; } function writeFloat32(output, offset, input) { for (var i = 0; i < input.length; i++, offset += 4) { - output.setFloat32(offset, input[i], true) + output.setFloat32(offset, input[i], true); } } function floatTo16BitPCM(output, offset, input) { for (var i = 0; i < input.length; i++, offset += 2) { - var s = Math.max(-1, Math.min(1, input[i])) - output.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true) + var s = Math.max(-1, Math.min(1, input[i])); + output.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7fff, true); } } function writeString(view, offset, string) { for (var i = 0; i < string.length; i++) { - view.setUint8(offset + i, string.charCodeAt(i)) + view.setUint8(offset + i, string.charCodeAt(i)); } -} \ No newline at end of file +} diff --git a/website/src/repl/components/ExportModal.jsx b/website/src/repl/components/ExportModal.jsx index 4f474f381..036f6f36a 100644 --- a/website/src/repl/components/ExportModal.jsx +++ b/website/src/repl/components/ExportModal.jsx @@ -3,215 +3,226 @@ import cx from '@src/cx.mjs'; import NumberInput from './NumberInput'; import { useEffect, useState } from 'react'; import { Textbox } from './textbox/Textbox'; -import { setMultiChannelOrbits as setStrudelMultiChannelOrbits, setMaxPolyphony as setStrudelMaxPolyphony, getAudioContext } from '@strudel/webaudio'; +import { + setMultiChannelOrbits as setStrudelMultiChannelOrbits, + setMaxPolyphony as setStrudelMaxPolyphony, + getAudioContext, +} from '@strudel/webaudio'; import XMarkIcon from '@heroicons/react/24/outline/XMarkIcon'; function Checkbox({ label, value, onChange, disabled = false }) { - return ( - - ); + return ( + + ); } function FormItem({ label, children, disabled }) { - return ( -
- - {children} -
- ); + return ( +
+ + {children} +
+ ); } export default function ExportModal(Props) { - const { started, isEmbedded, handleExport } = Props; + const { started, isEmbedded, handleExport } = Props; - const [downloadName, setDownloadName] = useState("") // TODO: make a form? - const [startCycle, setStartCycle] = useState(0) - const [endCycle, setEndCycle] = useState(1) - const [sampleRate, setSampleRate] = useState(48000) - const [multiChannelOrbits, setMultiChannelOrbits] = useState(true) - const [maxPolyphony, setMaxPolyphony] = useState(1024) - const [exporting, setExporting] = useState(false) - const [progress, setProgress] = useState(0) - const [length, setLength] = useState(1) + const [downloadName, setDownloadName] = useState(''); // TODO: make a form? + const [startCycle, setStartCycle] = useState(0); + const [endCycle, setEndCycle] = useState(1); + const [sampleRate, setSampleRate] = useState(48000); + const [multiChannelOrbits, setMultiChannelOrbits] = useState(true); + const [maxPolyphony, setMaxPolyphony] = useState(1024); + const [exporting, setExporting] = useState(false); + const [progress, setProgress] = useState(0); + const [length, setLength] = useState(1); - const refreshProgress = () => { - const audioContext = getAudioContext() - if (audioContext instanceof OfflineAudioContext) { - setProgress(audioContext.currentTime) - setLength(audioContext.length / sampleRate) - setTimeout(refreshProgress, 100); - } + const refreshProgress = () => { + const audioContext = getAudioContext(); + if (audioContext instanceof OfflineAudioContext) { + setProgress(audioContext.currentTime); + setLength(audioContext.length / sampleRate); + setTimeout(refreshProgress, 100); } + }; - return ( - <> - + + +
+ + { + setDownloadName(e.target.value); + }} + onChange={(v) => { + setDownloadName(v); + }} + disabled={exporting} + placeholder="Leave empty to use current date" + className={cx('placeholder:opacity-50', exporting && 'opacity-50 border-opacity-50')} + value={downloadName ?? ''} + /> + +
+ + { + let v = parseInt(e.target.value); + v = isNaN(v) ? 0 : Math.max(0, v); + setStartCycle(v); }} - title="export" - className={cx( - 'flex items-center space-x-1', - !isEmbedded ? 'p-2' : 'px-2', - started ? 'opacity-50' : 'hover:opacity-50', - )} - > - {!isEmbedded && export} - - - -
- - { - setDownloadName(e.target.value) - }} - onChange={v => { - setDownloadName(v) - }} - disabled={exporting} - placeholder="Leave empty to use current date" - className={cx("placeholder:opacity-50", exporting && "opacity-50 border-opacity-50")} - value={downloadName ?? ''} - /> - -
- - { - let v = parseInt(e.target.value); - v = isNaN(v) ? 0 : Math.max(0, v); - setStartCycle(v); - }} - onChange={v => { - v = parseInt(v) - setStartCycle(v); - }} - type="number" - placeholder="" - disabled={exporting} - className={cx(exporting && "opacity-50 border-opacity-50")} - value={startCycle ?? ''} - /> - - - { - let v = parseInt(e.target.value); - v = isNaN(v) ? Math.max(startCycle + 1, parseInt(v)) : v; - setEndCycle(v); - }} - onChange={(v) => { - v = parseInt(v) - setEndCycle(v); - }} - type="number" - placeholder="" - disabled={exporting} - className={cx(exporting && "opacity-50 border-opacity-50")} - value={endCycle ?? ''} - /> - -
-
- - { - let v = parseInt(e.target.value); - v = isNaN(v) ? 1 : Math.max(1, v); - setSampleRate(v); - }} - onChange={v => { - v = parseInt(v) - setSampleRate(v); - }} - type="number" - placeholder="" - disabled={exporting} - className={cx(exporting && "opacity-50 border-opacity-50")} - value={sampleRate ?? ''} - /> - - - { - let v = parseInt(e.target.value); - v = isNaN(v) ? Math.max(1, parseInt(v)) : v; - setMaxPolyphony(v); - }} - onChange={(v) => { - v = Math.max(1, parseInt(v)); - setMaxPolyphony(v); - }} - type="number" - placeholder="" - disabled={exporting} - className={cx(exporting && "opacity-50 border-opacity-50")} - value={maxPolyphony ?? ''} - /> - -
-
- { - const val = cbEvent.target.checked; - setMultiChannelOrbits(val) - }} - disabled={exporting} - value={multiChannelOrbits} - /> -
- -
-
- - ); + onChange={(v) => { + v = parseInt(v); + setStartCycle(v); + }} + type="number" + placeholder="" + disabled={exporting} + className={cx(exporting && 'opacity-50 border-opacity-50')} + value={startCycle ?? ''} + /> +
+ + { + let v = parseInt(e.target.value); + v = isNaN(v) ? Math.max(startCycle + 1, parseInt(v)) : v; + setEndCycle(v); + }} + onChange={(v) => { + v = parseInt(v); + setEndCycle(v); + }} + type="number" + placeholder="" + disabled={exporting} + className={cx(exporting && 'opacity-50 border-opacity-50')} + value={endCycle ?? ''} + /> + +
+
+ + { + let v = parseInt(e.target.value); + v = isNaN(v) ? 1 : Math.max(1, v); + setSampleRate(v); + }} + onChange={(v) => { + v = parseInt(v); + setSampleRate(v); + }} + type="number" + placeholder="" + disabled={exporting} + className={cx(exporting && 'opacity-50 border-opacity-50')} + value={sampleRate ?? ''} + /> + + + { + let v = parseInt(e.target.value); + v = isNaN(v) ? Math.max(1, parseInt(v)) : v; + setMaxPolyphony(v); + }} + onChange={(v) => { + v = Math.max(1, parseInt(v)); + setMaxPolyphony(v); + }} + type="number" + placeholder="" + disabled={exporting} + className={cx(exporting && 'opacity-50 border-opacity-50')} + value={maxPolyphony ?? ''} + /> + +
+
+ { + const val = cbEvent.target.checked; + setMultiChannelOrbits(val); + }} + disabled={exporting} + value={multiChannelOrbits} + /> +
+ +
+
+ + ); } diff --git a/website/src/repl/components/Header.jsx b/website/src/repl/components/Header.jsx index d5d8b5f75..dd9f684c1 100644 --- a/website/src/repl/components/Header.jsx +++ b/website/src/repl/components/Header.jsx @@ -9,8 +9,17 @@ const { BASE_URL } = import.meta.env; const baseNoTrailing = BASE_URL.endsWith('/') ? BASE_URL.slice(0, -1) : BASE_URL; export function Header({ context, embedded = false }) { - const { started, pending, isDirty, activeCode, handleTogglePlay, handleEvaluate, handleShuffle, handleShare, handleExport } = - context; + const { + started, + pending, + isDirty, + activeCode, + handleTogglePlay, + handleEvaluate, + handleShuffle, + handleShare, + handleExport, + } = context; const isEmbedded = typeof window !== 'undefined' && (embedded || window.location !== window.parent.location); const { isZen, isButtonRowHidden, isCSSAnimationDisabled, fontFamily } = useSettings(); From 120b46c4a516d0a5932b6162f83185761503f8dc Mon Sep 17 00:00:00 2001 From: Nikita Date: Mon, 20 Oct 2025 20:24:42 +0300 Subject: [PATCH 067/312] Add webaudio as a cyclist dependency (do we want that?) --- packages/core/cyclist.mjs | 2 +- packages/core/package-lock.json | 331 ++++++++++++++++++++++++++++++++ packages/core/package.json | 1 + 3 files changed, 333 insertions(+), 1 deletion(-) create mode 100644 packages/core/package-lock.json diff --git a/packages/core/cyclist.mjs b/packages/core/cyclist.mjs index 185d5588b..119f1d511 100644 --- a/packages/core/cyclist.mjs +++ b/packages/core/cyclist.mjs @@ -6,7 +6,7 @@ This program is free software: you can redistribute it and/or modify it under th import createClock from './zyklus.mjs'; import { errorLogger, logger } from './logger.mjs'; -import { loadBuffer, renderPatternAudio, setAudioContext, superdough } from '@strudel/webaudio'; +import { renderPatternAudio } from '@strudel/webaudio'; export class Cyclist { constructor({ diff --git a/packages/core/package-lock.json b/packages/core/package-lock.json new file mode 100644 index 000000000..dea7b53a7 --- /dev/null +++ b/packages/core/package-lock.json @@ -0,0 +1,331 @@ +{ + "name": "@strudel/core", + "version": "1.2.4", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@strudel/core", + "version": "1.2.4", + "license": "AGPL-3.0-or-later", + "dependencies": { + "@strudel/webaudio": "^1.2.5", + "fraction.js": "^5.2.1" + }, + "devDependencies": { + "vite": "^6.0.11", + "vitest": "^3.0.4" + } + }, + "../../node_modules/.pnpm/fraction.js@5.2.1/node_modules/fraction.js": { + "version": "5.2.1", + "license": "MIT", + "devDependencies": { + "crude-build": "^0.1.2", + "mocha": "*" + }, + "engines": { + "node": ">= 12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "../../node_modules/.pnpm/vite@6.0.11_@types+node@22.10.10_jiti@2.4.2_lightningcss@1.29.1_terser@5.37.0_yaml@2.7.0/node_modules/vite": { + "version": "6.0.11", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.24.2", + "postcss": "^8.4.49", + "rollup": "^4.23.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "devDependencies": { + "@ampproject/remapping": "^2.3.0", + "@babel/parser": "^7.26.3", + "@jridgewell/trace-mapping": "^0.3.25", + "@polka/compression": "^1.0.0-next.25", + "@rollup/plugin-alias": "^5.1.1", + "@rollup/plugin-commonjs": "^28.0.2", + "@rollup/plugin-dynamic-import-vars": "2.1.4", + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "16.0.0", + "@rollup/pluginutils": "^5.1.4", + "@types/escape-html": "^1.0.4", + "@types/pnpapi": "^0.0.5", + "artichokie": "^0.3.1", + "cac": "^6.7.14", + "chokidar": "^3.6.0", + "connect": "^3.7.0", + "convert-source-map": "^2.0.0", + "cors": "^2.8.5", + "cross-spawn": "^7.0.6", + "debug": "^4.4.0", + "dep-types": "link:./src/types", + "dotenv": "^16.4.7", + "dotenv-expand": "^12.0.1", + "es-module-lexer": "^1.6.0", + "escape-html": "^1.0.3", + "estree-walker": "^3.0.3", + "etag": "^1.8.1", + "http-proxy": "^1.18.1", + "launch-editor-middleware": "^2.9.1", + "lightningcss": "^1.28.2", + "magic-string": "^0.30.17", + "mlly": "^1.7.3", + "mrmime": "^2.0.0", + "nanoid": "^5.0.9", + "open": "^10.1.0", + "parse5": "^7.2.1", + "pathe": "^2.0.0", + "periscopic": "^4.0.2", + "picocolors": "^1.1.1", + "picomatch": "^4.0.2", + "postcss-import": "^16.1.0", + "postcss-load-config": "^6.0.1", + "postcss-modules": "^6.0.1", + "resolve.exports": "^2.0.3", + "rollup-plugin-dts": "^6.1.1", + "rollup-plugin-esbuild": "^6.1.1", + "rollup-plugin-license": "^3.5.3", + "sass": "^1.83.1", + "sass-embedded": "^1.83.1", + "sirv": "^3.0.0", + "source-map-support": "^0.5.21", + "strip-literal": "^2.1.1", + "terser": "^5.37.0", + "tinyglobby": "^0.2.10", + "tsconfck": "^3.1.4", + "tslib": "^2.8.1", + "types": "link:./types", + "ufo": "^1.5.4", + "ws": "^8.18.0" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "../../node_modules/.pnpm/vitest@3.0.4_@types+debug@4.1.12_@types+node@22.10.10_@vitest+ui@3.0.4_jiti@2.4.2_light_04b28d5d33383b617211459e5738d579/node_modules/vitest": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "3.0.4", + "@vitest/mocker": "3.0.4", + "@vitest/pretty-format": "^3.0.4", + "@vitest/runner": "3.0.4", + "@vitest/snapshot": "3.0.4", + "@vitest/spy": "3.0.4", + "@vitest/utils": "3.0.4", + "chai": "^5.1.2", + "debug": "^4.4.0", + "expect-type": "^1.1.0", + "magic-string": "^0.30.17", + "pathe": "^2.0.2", + "std-env": "^3.8.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinypool": "^1.0.2", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0", + "vite-node": "3.0.4", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "devDependencies": { + "@ampproject/remapping": "^2.3.0", + "@antfu/install-pkg": "^1.0.0", + "@edge-runtime/vm": "^5.0.0", + "@sinonjs/fake-timers": "14.0.0", + "@types/debug": "^4.1.12", + "@types/estree": "^1.0.6", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/jsdom": "^21.1.7", + "@types/micromatch": "^4.0.9", + "@types/node": "^22.10.9", + "@types/prompts": "^2.4.9", + "@types/sinonjs__fake-timers": "^8.1.5", + "acorn-walk": "^8.3.4", + "birpc": "0.2.19", + "cac": "^6.7.14", + "chai-subset": "^1.6.0", + "fast-glob": "3.3.3", + "find-up": "^6.3.0", + "flatted": "^3.3.2", + "get-tsconfig": "^4.10.0", + "happy-dom": "^16.7.2", + "jsdom": "^25.0.1", + "local-pkg": "^0.5.1", + "micromatch": "^4.0.8", + "pretty-format": "^29.7.0", + "prompts": "^2.4.2", + "strip-literal": "^2.1.1", + "ws": "^8.18.0" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.0.4", + "@vitest/ui": "3.0.4", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/debug": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/@strudel/core": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@strudel/core/-/core-1.2.4.tgz", + "integrity": "sha512-sUm9/zjEEQuWfW3hNOCcfNbn8jq2G+Ye+mvpLUgcGyLfI5XPlPTn/PBIkv2hFjNs/basnMyrOUvg0Z85AA6+OA==", + "license": "AGPL-3.0-or-later", + "dependencies": { + "fraction.js": "^5.2.1" + } + }, + "node_modules/@strudel/draw": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@strudel/draw/-/draw-1.2.4.tgz", + "integrity": "sha512-9ui5+ZQQB+EEgwJQueGVMgpnPSHnFgRgivlAZbdjEoMdSm5vULWvKK3Psml8WKtOBNiuL+5Bci7a0INRTRusOA==", + "license": "AGPL-3.0-or-later", + "dependencies": { + "@strudel/core": "1.2.4" + } + }, + "node_modules/@strudel/webaudio": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@strudel/webaudio/-/webaudio-1.2.5.tgz", + "integrity": "sha512-ilcyBsuwkH6Ghz0egaqIJ5DZi0xFBZwVWvZb0vnfU7kVESroD2j6yptyFMysJFZhQ5pfRiZs2ZeF6yTsviUjng==", + "license": "AGPL-3.0-or-later", + "dependencies": { + "@strudel/core": "1.2.4", + "@strudel/draw": "1.2.4", + "superdough": "1.2.5" + } + }, + "node_modules/fraction.js": { + "resolved": "../../node_modules/.pnpm/fraction.js@5.2.1/node_modules/fraction.js", + "link": true + }, + "node_modules/nanostores": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/nanostores/-/nanostores-0.11.4.tgz", + "integrity": "sha512-k1oiVNN4hDK8NcNERSZLQiMfRzEGtfnvZvdBvey3SQbgn8Dcrk0h1I6vpxApjb10PFUflZrgJ2WEZyJQ+5v7YQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/superdough": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/superdough/-/superdough-1.2.5.tgz", + "integrity": "sha512-QVkMGGZjWzaRxYKXoZYMfsRHVk5vwNiqAaDOseccSTgqPPwFRTY2fmHAm5OmwwS8XqFOenZjn+XU3LEaCZMdJw==", + "license": "AGPL-3.0-or-later", + "dependencies": { + "nanostores": "^0.11.3" + } + }, + "node_modules/vite": { + "resolved": "../../node_modules/.pnpm/vite@6.0.11_@types+node@22.10.10_jiti@2.4.2_lightningcss@1.29.1_terser@5.37.0_yaml@2.7.0/node_modules/vite", + "link": true + }, + "node_modules/vitest": { + "resolved": "../../node_modules/.pnpm/vitest@3.0.4_@types+debug@4.1.12_@types+node@22.10.10_@vitest+ui@3.0.4_jiti@2.4.2_light_04b28d5d33383b617211459e5738d579/node_modules/vitest", + "link": true + } + } +} diff --git a/packages/core/package.json b/packages/core/package.json index 7cf20cea7..daaa111de 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -31,6 +31,7 @@ }, "homepage": "https://strudel.cc", "dependencies": { + "@strudel/webaudio": "^1.2.5", "fraction.js": "^5.2.1" }, "gitHead": "0e26d4e741500f5bae35b023608f062a794905c2", From 8b3c0d2a4aa8e9d2c89622e63d2d614ff15f2ef0 Mon Sep 17 00:00:00 2001 From: Nikita Date: Mon, 20 Oct 2025 20:27:31 +0300 Subject: [PATCH 068/312] Refresh deps --- packages/osc/server.js | 0 pnpm-lock.yaml | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) mode change 100644 => 100755 packages/osc/server.js diff --git a/packages/osc/server.js b/packages/osc/server.js old mode 100644 new mode 100755 diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c225057f3..40d6eb57b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -225,6 +225,9 @@ importers: packages/core: dependencies: + '@strudel/webaudio': + specifier: ^1.2.5 + version: 1.2.5 fraction.js: specifier: ^5.2.1 version: 5.2.1 @@ -2468,6 +2471,15 @@ packages: '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@strudel/core@1.2.4': + resolution: {integrity: sha512-sUm9/zjEEQuWfW3hNOCcfNbn8jq2G+Ye+mvpLUgcGyLfI5XPlPTn/PBIkv2hFjNs/basnMyrOUvg0Z85AA6+OA==} + + '@strudel/draw@1.2.4': + resolution: {integrity: sha512-9ui5+ZQQB+EEgwJQueGVMgpnPSHnFgRgivlAZbdjEoMdSm5vULWvKK3Psml8WKtOBNiuL+5Bci7a0INRTRusOA==} + + '@strudel/webaudio@1.2.5': + resolution: {integrity: sha512-ilcyBsuwkH6Ghz0egaqIJ5DZi0xFBZwVWvZb0vnfU7kVESroD2j6yptyFMysJFZhQ5pfRiZs2ZeF6yTsviUjng==} + '@supabase/auth-js@2.67.3': resolution: {integrity: sha512-NJDaW8yXs49xMvWVOkSIr8j46jf+tYHV0wHhrwOaLLMZSFO4g6kKAf+MfzQ2RaD06OCUkUHIzctLAxjTgEVpzw==} @@ -6989,6 +7001,9 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true + superdough@1.2.5: + resolution: {integrity: sha512-QVkMGGZjWzaRxYKXoZYMfsRHVk5vwNiqAaDOseccSTgqPPwFRTY2fmHAm5OmwwS8XqFOenZjn+XU3LEaCZMdJw==} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -9829,6 +9844,20 @@ snapshots: '@sinclair/typebox@0.27.8': {} + '@strudel/core@1.2.4': + dependencies: + fraction.js: 5.2.1 + + '@strudel/draw@1.2.4': + dependencies: + '@strudel/core': 1.2.4 + + '@strudel/webaudio@1.2.5': + dependencies: + '@strudel/core': 1.2.4 + '@strudel/draw': 1.2.4 + superdough: 1.2.5 + '@supabase/auth-js@2.67.3': dependencies: '@supabase/node-fetch': 2.6.15 @@ -15431,6 +15460,10 @@ snapshots: pirates: 4.0.6 ts-interface-checker: 0.1.13 + superdough@1.2.5: + dependencies: + nanostores: 0.11.3 + supports-color@7.2.0: dependencies: has-flag: 4.0.0 From 329289fc3589661473447f0f1d7563d858cdd04d Mon Sep 17 00:00:00 2001 From: Nikita Date: Mon, 20 Oct 2025 20:33:04 +0300 Subject: [PATCH 069/312] Revert refreshing deps --- packages/core/cyclist.mjs | 2 +- packages/core/package-lock.json | 331 -------------------------------- packages/core/package.json | 1 - packages/osc/server.js | 0 pnpm-lock.yaml | 33 ---- 5 files changed, 1 insertion(+), 366 deletions(-) delete mode 100644 packages/core/package-lock.json mode change 100755 => 100644 packages/osc/server.js diff --git a/packages/core/cyclist.mjs b/packages/core/cyclist.mjs index 119f1d511..185d5588b 100644 --- a/packages/core/cyclist.mjs +++ b/packages/core/cyclist.mjs @@ -6,7 +6,7 @@ This program is free software: you can redistribute it and/or modify it under th import createClock from './zyklus.mjs'; import { errorLogger, logger } from './logger.mjs'; -import { renderPatternAudio } from '@strudel/webaudio'; +import { loadBuffer, renderPatternAudio, setAudioContext, superdough } from '@strudel/webaudio'; export class Cyclist { constructor({ diff --git a/packages/core/package-lock.json b/packages/core/package-lock.json deleted file mode 100644 index dea7b53a7..000000000 --- a/packages/core/package-lock.json +++ /dev/null @@ -1,331 +0,0 @@ -{ - "name": "@strudel/core", - "version": "1.2.4", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@strudel/core", - "version": "1.2.4", - "license": "AGPL-3.0-or-later", - "dependencies": { - "@strudel/webaudio": "^1.2.5", - "fraction.js": "^5.2.1" - }, - "devDependencies": { - "vite": "^6.0.11", - "vitest": "^3.0.4" - } - }, - "../../node_modules/.pnpm/fraction.js@5.2.1/node_modules/fraction.js": { - "version": "5.2.1", - "license": "MIT", - "devDependencies": { - "crude-build": "^0.1.2", - "mocha": "*" - }, - "engines": { - "node": ">= 12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/rawify" - } - }, - "../../node_modules/.pnpm/vite@6.0.11_@types+node@22.10.10_jiti@2.4.2_lightningcss@1.29.1_terser@5.37.0_yaml@2.7.0/node_modules/vite": { - "version": "6.0.11", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.24.2", - "postcss": "^8.4.49", - "rollup": "^4.23.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "devDependencies": { - "@ampproject/remapping": "^2.3.0", - "@babel/parser": "^7.26.3", - "@jridgewell/trace-mapping": "^0.3.25", - "@polka/compression": "^1.0.0-next.25", - "@rollup/plugin-alias": "^5.1.1", - "@rollup/plugin-commonjs": "^28.0.2", - "@rollup/plugin-dynamic-import-vars": "2.1.4", - "@rollup/plugin-json": "^6.1.0", - "@rollup/plugin-node-resolve": "16.0.0", - "@rollup/pluginutils": "^5.1.4", - "@types/escape-html": "^1.0.4", - "@types/pnpapi": "^0.0.5", - "artichokie": "^0.3.1", - "cac": "^6.7.14", - "chokidar": "^3.6.0", - "connect": "^3.7.0", - "convert-source-map": "^2.0.0", - "cors": "^2.8.5", - "cross-spawn": "^7.0.6", - "debug": "^4.4.0", - "dep-types": "link:./src/types", - "dotenv": "^16.4.7", - "dotenv-expand": "^12.0.1", - "es-module-lexer": "^1.6.0", - "escape-html": "^1.0.3", - "estree-walker": "^3.0.3", - "etag": "^1.8.1", - "http-proxy": "^1.18.1", - "launch-editor-middleware": "^2.9.1", - "lightningcss": "^1.28.2", - "magic-string": "^0.30.17", - "mlly": "^1.7.3", - "mrmime": "^2.0.0", - "nanoid": "^5.0.9", - "open": "^10.1.0", - "parse5": "^7.2.1", - "pathe": "^2.0.0", - "periscopic": "^4.0.2", - "picocolors": "^1.1.1", - "picomatch": "^4.0.2", - "postcss-import": "^16.1.0", - "postcss-load-config": "^6.0.1", - "postcss-modules": "^6.0.1", - "resolve.exports": "^2.0.3", - "rollup-plugin-dts": "^6.1.1", - "rollup-plugin-esbuild": "^6.1.1", - "rollup-plugin-license": "^3.5.3", - "sass": "^1.83.1", - "sass-embedded": "^1.83.1", - "sirv": "^3.0.0", - "source-map-support": "^0.5.21", - "strip-literal": "^2.1.1", - "terser": "^5.37.0", - "tinyglobby": "^0.2.10", - "tsconfck": "^3.1.4", - "tslib": "^2.8.1", - "types": "link:./types", - "ufo": "^1.5.4", - "ws": "^8.18.0" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "../../node_modules/.pnpm/vitest@3.0.4_@types+debug@4.1.12_@types+node@22.10.10_@vitest+ui@3.0.4_jiti@2.4.2_light_04b28d5d33383b617211459e5738d579/node_modules/vitest": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "3.0.4", - "@vitest/mocker": "3.0.4", - "@vitest/pretty-format": "^3.0.4", - "@vitest/runner": "3.0.4", - "@vitest/snapshot": "3.0.4", - "@vitest/spy": "3.0.4", - "@vitest/utils": "3.0.4", - "chai": "^5.1.2", - "debug": "^4.4.0", - "expect-type": "^1.1.0", - "magic-string": "^0.30.17", - "pathe": "^2.0.2", - "std-env": "^3.8.0", - "tinybench": "^2.9.0", - "tinyexec": "^0.3.2", - "tinypool": "^1.0.2", - "tinyrainbow": "^2.0.0", - "vite": "^5.0.0 || ^6.0.0", - "vite-node": "3.0.4", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "devDependencies": { - "@ampproject/remapping": "^2.3.0", - "@antfu/install-pkg": "^1.0.0", - "@edge-runtime/vm": "^5.0.0", - "@sinonjs/fake-timers": "14.0.0", - "@types/debug": "^4.1.12", - "@types/estree": "^1.0.6", - "@types/istanbul-lib-coverage": "^2.0.6", - "@types/istanbul-reports": "^3.0.4", - "@types/jsdom": "^21.1.7", - "@types/micromatch": "^4.0.9", - "@types/node": "^22.10.9", - "@types/prompts": "^2.4.9", - "@types/sinonjs__fake-timers": "^8.1.5", - "acorn-walk": "^8.3.4", - "birpc": "0.2.19", - "cac": "^6.7.14", - "chai-subset": "^1.6.0", - "fast-glob": "3.3.3", - "find-up": "^6.3.0", - "flatted": "^3.3.2", - "get-tsconfig": "^4.10.0", - "happy-dom": "^16.7.2", - "jsdom": "^25.0.1", - "local-pkg": "^0.5.1", - "micromatch": "^4.0.8", - "pretty-format": "^29.7.0", - "prompts": "^2.4.2", - "strip-literal": "^2.1.1", - "ws": "^8.18.0" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/debug": "^4.1.12", - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.0.4", - "@vitest/ui": "3.0.4", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/debug": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/@strudel/core": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@strudel/core/-/core-1.2.4.tgz", - "integrity": "sha512-sUm9/zjEEQuWfW3hNOCcfNbn8jq2G+Ye+mvpLUgcGyLfI5XPlPTn/PBIkv2hFjNs/basnMyrOUvg0Z85AA6+OA==", - "license": "AGPL-3.0-or-later", - "dependencies": { - "fraction.js": "^5.2.1" - } - }, - "node_modules/@strudel/draw": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@strudel/draw/-/draw-1.2.4.tgz", - "integrity": "sha512-9ui5+ZQQB+EEgwJQueGVMgpnPSHnFgRgivlAZbdjEoMdSm5vULWvKK3Psml8WKtOBNiuL+5Bci7a0INRTRusOA==", - "license": "AGPL-3.0-or-later", - "dependencies": { - "@strudel/core": "1.2.4" - } - }, - "node_modules/@strudel/webaudio": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@strudel/webaudio/-/webaudio-1.2.5.tgz", - "integrity": "sha512-ilcyBsuwkH6Ghz0egaqIJ5DZi0xFBZwVWvZb0vnfU7kVESroD2j6yptyFMysJFZhQ5pfRiZs2ZeF6yTsviUjng==", - "license": "AGPL-3.0-or-later", - "dependencies": { - "@strudel/core": "1.2.4", - "@strudel/draw": "1.2.4", - "superdough": "1.2.5" - } - }, - "node_modules/fraction.js": { - "resolved": "../../node_modules/.pnpm/fraction.js@5.2.1/node_modules/fraction.js", - "link": true - }, - "node_modules/nanostores": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/nanostores/-/nanostores-0.11.4.tgz", - "integrity": "sha512-k1oiVNN4hDK8NcNERSZLQiMfRzEGtfnvZvdBvey3SQbgn8Dcrk0h1I6vpxApjb10PFUflZrgJ2WEZyJQ+5v7YQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, - "node_modules/superdough": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/superdough/-/superdough-1.2.5.tgz", - "integrity": "sha512-QVkMGGZjWzaRxYKXoZYMfsRHVk5vwNiqAaDOseccSTgqPPwFRTY2fmHAm5OmwwS8XqFOenZjn+XU3LEaCZMdJw==", - "license": "AGPL-3.0-or-later", - "dependencies": { - "nanostores": "^0.11.3" - } - }, - "node_modules/vite": { - "resolved": "../../node_modules/.pnpm/vite@6.0.11_@types+node@22.10.10_jiti@2.4.2_lightningcss@1.29.1_terser@5.37.0_yaml@2.7.0/node_modules/vite", - "link": true - }, - "node_modules/vitest": { - "resolved": "../../node_modules/.pnpm/vitest@3.0.4_@types+debug@4.1.12_@types+node@22.10.10_@vitest+ui@3.0.4_jiti@2.4.2_light_04b28d5d33383b617211459e5738d579/node_modules/vitest", - "link": true - } - } -} diff --git a/packages/core/package.json b/packages/core/package.json index daaa111de..7cf20cea7 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -31,7 +31,6 @@ }, "homepage": "https://strudel.cc", "dependencies": { - "@strudel/webaudio": "^1.2.5", "fraction.js": "^5.2.1" }, "gitHead": "0e26d4e741500f5bae35b023608f062a794905c2", diff --git a/packages/osc/server.js b/packages/osc/server.js old mode 100755 new mode 100644 diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 40d6eb57b..c225057f3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -225,9 +225,6 @@ importers: packages/core: dependencies: - '@strudel/webaudio': - specifier: ^1.2.5 - version: 1.2.5 fraction.js: specifier: ^5.2.1 version: 5.2.1 @@ -2471,15 +2468,6 @@ packages: '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - '@strudel/core@1.2.4': - resolution: {integrity: sha512-sUm9/zjEEQuWfW3hNOCcfNbn8jq2G+Ye+mvpLUgcGyLfI5XPlPTn/PBIkv2hFjNs/basnMyrOUvg0Z85AA6+OA==} - - '@strudel/draw@1.2.4': - resolution: {integrity: sha512-9ui5+ZQQB+EEgwJQueGVMgpnPSHnFgRgivlAZbdjEoMdSm5vULWvKK3Psml8WKtOBNiuL+5Bci7a0INRTRusOA==} - - '@strudel/webaudio@1.2.5': - resolution: {integrity: sha512-ilcyBsuwkH6Ghz0egaqIJ5DZi0xFBZwVWvZb0vnfU7kVESroD2j6yptyFMysJFZhQ5pfRiZs2ZeF6yTsviUjng==} - '@supabase/auth-js@2.67.3': resolution: {integrity: sha512-NJDaW8yXs49xMvWVOkSIr8j46jf+tYHV0wHhrwOaLLMZSFO4g6kKAf+MfzQ2RaD06OCUkUHIzctLAxjTgEVpzw==} @@ -7001,9 +6989,6 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true - superdough@1.2.5: - resolution: {integrity: sha512-QVkMGGZjWzaRxYKXoZYMfsRHVk5vwNiqAaDOseccSTgqPPwFRTY2fmHAm5OmwwS8XqFOenZjn+XU3LEaCZMdJw==} - supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -9844,20 +9829,6 @@ snapshots: '@sinclair/typebox@0.27.8': {} - '@strudel/core@1.2.4': - dependencies: - fraction.js: 5.2.1 - - '@strudel/draw@1.2.4': - dependencies: - '@strudel/core': 1.2.4 - - '@strudel/webaudio@1.2.5': - dependencies: - '@strudel/core': 1.2.4 - '@strudel/draw': 1.2.4 - superdough: 1.2.5 - '@supabase/auth-js@2.67.3': dependencies: '@supabase/node-fetch': 2.6.15 @@ -15460,10 +15431,6 @@ snapshots: pirates: 4.0.6 ts-interface-checker: 0.1.13 - superdough@1.2.5: - dependencies: - nanostores: 0.11.3 - supports-color@7.2.0: dependencies: has-flag: 4.0.0 From 7774364ac78b6be15d1fab04b95abf3f9be94ef9 Mon Sep 17 00:00:00 2001 From: Nikita Date: Mon, 20 Oct 2025 20:36:19 +0300 Subject: [PATCH 070/312] Add webaudio as a workspace dependency --- packages/core/package.json | 1 + packages/osc/server.js | 0 pnpm-lock.yaml | 3 +++ 3 files changed, 4 insertions(+) mode change 100644 => 100755 packages/osc/server.js diff --git a/packages/core/package.json b/packages/core/package.json index 7cf20cea7..e771f0a73 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -31,6 +31,7 @@ }, "homepage": "https://strudel.cc", "dependencies": { + "@strudel/webaudio": "workspace:*", "fraction.js": "^5.2.1" }, "gitHead": "0e26d4e741500f5bae35b023608f062a794905c2", diff --git a/packages/osc/server.js b/packages/osc/server.js old mode 100644 new mode 100755 diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c225057f3..217a63d8f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -225,6 +225,9 @@ importers: packages/core: dependencies: + '@strudel/webaudio': + specifier: workspace:* + version: link:../webaudio fraction.js: specifier: ^5.2.1 version: 5.2.1 From f5fc0ff9d19dfb0dc89017be4aa8dd66960864d6 Mon Sep 17 00:00:00 2001 From: Nikita Date: Mon, 20 Oct 2025 20:58:01 +0300 Subject: [PATCH 071/312] Remove resetGlobalEffects from AudioContext --- packages/superdough/audioContext.mjs | 3 --- packages/webaudio/webaudio.mjs | 2 ++ 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/superdough/audioContext.mjs b/packages/superdough/audioContext.mjs index 9a5913d80..2c34f9daf 100644 --- a/packages/superdough/audioContext.mjs +++ b/packages/superdough/audioContext.mjs @@ -1,10 +1,7 @@ -import { analysers, resetGlobalEffects } from './superdough.mjs'; - let audioContext; export const setDefaultAudioContext = () => { audioContext = new AudioContext(); - resetGlobalEffects(); return audioContext; }; diff --git a/packages/webaudio/webaudio.mjs b/packages/webaudio/webaudio.mjs index 43c011460..b1247e34b 100644 --- a/packages/webaudio/webaudio.mjs +++ b/packages/webaudio/webaudio.mjs @@ -21,6 +21,7 @@ import { loadWorklets, setMaxPolyphony, setMultiChannelOrbits, + resetGlobalEffects, } from 'superdough'; import './supradough.mjs'; import { workletUrl } from 'supradough'; @@ -99,6 +100,7 @@ export async function renderPatternAudio(pattern, cps, begin, end, sampleRate, d .finally(async () => { setAudioContext(null); setSuperdoughAudioController(null); + resetGlobalEffects() await initAudio(); }); } From 2a0635879cf4fdbc21c933fcaaa46ced4acb6a25 Mon Sep 17 00:00:00 2001 From: Nikita Date: Mon, 20 Oct 2025 20:58:27 +0300 Subject: [PATCH 072/312] Format --- packages/webaudio/webaudio.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/webaudio/webaudio.mjs b/packages/webaudio/webaudio.mjs index b1247e34b..8141b5363 100644 --- a/packages/webaudio/webaudio.mjs +++ b/packages/webaudio/webaudio.mjs @@ -100,7 +100,7 @@ export async function renderPatternAudio(pattern, cps, begin, end, sampleRate, d .finally(async () => { setAudioContext(null); setSuperdoughAudioController(null); - resetGlobalEffects() + resetGlobalEffects(); await initAudio(); }); } From 0f652e8b5bc73609daa1f52a77cea9db6bc5fb47 Mon Sep 17 00:00:00 2001 From: Nikita Date: Mon, 20 Oct 2025 21:24:27 +0300 Subject: [PATCH 073/312] Remove webaudio from core dependencies --- packages/codemirror/codemirror.mjs | 11 +++------- packages/core/cyclist.mjs | 10 --------- packages/core/package.json | 3 +-- packages/core/repl.mjs | 32 ++++++++++++++--------------- website/src/repl/useReplContext.jsx | 6 +++++- 5 files changed, 24 insertions(+), 38 deletions(-) diff --git a/packages/codemirror/codemirror.mjs b/packages/codemirror/codemirror.mjs index 84cbfa96a..a5a978bbb 100644 --- a/packages/codemirror/codemirror.mjs +++ b/packages/codemirror/codemirror.mjs @@ -42,9 +42,9 @@ const extensions = { isMultiCursorEnabled: (on) => on ? [ - EditorState.allowMultipleSelections.of(true), - EditorView.clickAddsSelectionRange.of((ev) => ev.metaKey || ev.ctrlKey), - ] + EditorState.allowMultipleSelections.of(true), + EditorView.clickAddsSelectionRange.of((ev) => ev.metaKey || ev.ctrlKey), + ] : [], }; const compartments = Object.fromEntries(Object.keys(extensions).map((key) => [key, new Compartment()])); @@ -268,11 +268,6 @@ export class StrudelMirror { this.flash(); await this.repl.evaluate(this.code); } - async exportAudio(begin, end, sampleRate, downloadName = undefined) { - await this.repl.evaluate(this.code, false); - await this.repl.exportAudio(begin, end, sampleRate, downloadName); - this.repl.scheduler.stop(); - } async stop() { this.repl.scheduler.stop(); } diff --git a/packages/core/cyclist.mjs b/packages/core/cyclist.mjs index 185d5588b..fdd8cf1c7 100644 --- a/packages/core/cyclist.mjs +++ b/packages/core/cyclist.mjs @@ -6,7 +6,6 @@ This program is free software: you can redistribute it and/or modify it under th import createClock from './zyklus.mjs'; import { errorLogger, logger } from './logger.mjs'; -import { loadBuffer, renderPatternAudio, setAudioContext, superdough } from '@strudel/webaudio'; export class Cyclist { constructor({ @@ -111,15 +110,6 @@ export class Cyclist { this.clock.start(); this.setStarted(true); } - - async exportAudio(begin, end, sampleRate, downloadName = undefined) { - if (!this.pattern) { - throw new Error('Scheduler: no pattern set! call .setPattern first.'); - } - logger('[cyclist] exporting'); - await renderPatternAudio(this.pattern, this.cps, begin, end, sampleRate, downloadName); - } - pause() { logger('[cyclist] pause'); this.clock.pause(); diff --git a/packages/core/package.json b/packages/core/package.json index e771f0a73..50e02e4b2 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -31,7 +31,6 @@ }, "homepage": "https://strudel.cc", "dependencies": { - "@strudel/webaudio": "workspace:*", "fraction.js": "^5.2.1" }, "gitHead": "0e26d4e741500f5bae35b023608f062a794905c2", @@ -39,4 +38,4 @@ "vite": "^6.0.11", "vitest": "^3.0.4" } -} +} \ No newline at end of file diff --git a/packages/core/repl.mjs b/packages/core/repl.mjs index 4a35b932e..6cbc9e9ce 100644 --- a/packages/core/repl.mjs +++ b/packages/core/repl.mjs @@ -91,8 +91,6 @@ export function repl({ const stop = () => scheduler.stop(); const start = () => scheduler.start(); - const exportAudio = async (begin, end, sampleRate, downloadName = undefined) => - await scheduler.exportAudio(begin, end, sampleRate, downloadName); const pause = () => scheduler.pause(); const toggle = () => scheduler.toggle(); const setCps = (cps) => { @@ -259,23 +257,23 @@ export function repl({ } }; const setCode = (code) => updateState({ code }); - return { scheduler, evaluate, start, exportAudio, stop, pause, setCps, setPattern, setCode, toggle, state }; + return { scheduler, evaluate, start, stop, pause, setCps, setPattern, setCode, toggle, state }; } export const getTrigger = ({ getTime, defaultOutput }) => - async (hap, deadline, duration, cps, t) => { - // ^ this signature is different from hap.context.onTrigger, as set by Pattern.onTrigger(onTrigger) - // TODO: get rid of deadline after https://codeberg.org/uzu/strudel/pulls/1004 - try { - if (!hap.context.onTrigger || !hap.context.dominantTrigger) { - await defaultOutput(hap, deadline, duration, cps, t); + async (hap, deadline, duration, cps, t) => { + // ^ this signature is different from hap.context.onTrigger, as set by Pattern.onTrigger(onTrigger) + // TODO: get rid of deadline after https://codeberg.org/uzu/strudel/pulls/1004 + try { + if (!hap.context.onTrigger || !hap.context.dominantTrigger) { + await defaultOutput(hap, deadline, duration, cps, t); + } + if (hap.context.onTrigger) { + // call signature of output / onTrigger is different... + await hap.context.onTrigger(hap, getTime(), cps, t); + } + } catch (err) { + errorLogger(err, 'getTrigger'); } - if (hap.context.onTrigger) { - // call signature of output / onTrigger is different... - await hap.context.onTrigger(hap, getTime(), cps, t); - } - } catch (err) { - errorLogger(err, 'getTrigger'); - } - }; + }; diff --git a/website/src/repl/useReplContext.jsx b/website/src/repl/useReplContext.jsx index 0e89fb68b..118277083 100644 --- a/website/src/repl/useReplContext.jsx +++ b/website/src/repl/useReplContext.jsx @@ -9,6 +9,7 @@ import { getDrawContext } from '@strudel/draw'; import { transpiler } from '@strudel/transpiler'; import { getAudioContextCurrentTime, + renderPatternAudio, webaudioOutput, resetGlobalEffects, resetLoadedSounds, @@ -203,8 +204,11 @@ export function useReplContext() { const handleEvaluate = () => { editorRef.current.evaluate(); }; + const handleExport = async (begin, end, sampleRate, downloadName = undefined) => { - await editorRef.current.exportAudio(begin, end, sampleRate, downloadName); + await editorRef.current.evaluate(); + await renderPatternAudio(editorRef.current.repl.state.pattern, editorRef.current.repl.scheduler.cps, begin, end, sampleRate, downloadName) + editorRef.current.repl.scheduler.stop(); }; const handleShuffle = async () => { const patternData = await getRandomTune(); From a2b76bde142dbca85a993fc9f18e7bf2071d8095 Mon Sep 17 00:00:00 2001 From: Nikita Date: Mon, 20 Oct 2025 21:24:54 +0300 Subject: [PATCH 074/312] Format --- packages/codemirror/codemirror.mjs | 6 +++--- packages/core/repl.mjs | 28 ++++++++++++++-------------- website/src/repl/useReplContext.jsx | 9 ++++++++- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/packages/codemirror/codemirror.mjs b/packages/codemirror/codemirror.mjs index a5a978bbb..4dc23996f 100644 --- a/packages/codemirror/codemirror.mjs +++ b/packages/codemirror/codemirror.mjs @@ -42,9 +42,9 @@ const extensions = { isMultiCursorEnabled: (on) => on ? [ - EditorState.allowMultipleSelections.of(true), - EditorView.clickAddsSelectionRange.of((ev) => ev.metaKey || ev.ctrlKey), - ] + EditorState.allowMultipleSelections.of(true), + EditorView.clickAddsSelectionRange.of((ev) => ev.metaKey || ev.ctrlKey), + ] : [], }; const compartments = Object.fromEntries(Object.keys(extensions).map((key) => [key, new Compartment()])); diff --git a/packages/core/repl.mjs b/packages/core/repl.mjs index 6cbc9e9ce..171697eb9 100644 --- a/packages/core/repl.mjs +++ b/packages/core/repl.mjs @@ -262,18 +262,18 @@ export function repl({ export const getTrigger = ({ getTime, defaultOutput }) => - async (hap, deadline, duration, cps, t) => { - // ^ this signature is different from hap.context.onTrigger, as set by Pattern.onTrigger(onTrigger) - // TODO: get rid of deadline after https://codeberg.org/uzu/strudel/pulls/1004 - try { - if (!hap.context.onTrigger || !hap.context.dominantTrigger) { - await defaultOutput(hap, deadline, duration, cps, t); - } - if (hap.context.onTrigger) { - // call signature of output / onTrigger is different... - await hap.context.onTrigger(hap, getTime(), cps, t); - } - } catch (err) { - errorLogger(err, 'getTrigger'); + async (hap, deadline, duration, cps, t) => { + // ^ this signature is different from hap.context.onTrigger, as set by Pattern.onTrigger(onTrigger) + // TODO: get rid of deadline after https://codeberg.org/uzu/strudel/pulls/1004 + try { + if (!hap.context.onTrigger || !hap.context.dominantTrigger) { + await defaultOutput(hap, deadline, duration, cps, t); } - }; + if (hap.context.onTrigger) { + // call signature of output / onTrigger is different... + await hap.context.onTrigger(hap, getTime(), cps, t); + } + } catch (err) { + errorLogger(err, 'getTrigger'); + } + }; diff --git a/website/src/repl/useReplContext.jsx b/website/src/repl/useReplContext.jsx index 118277083..aacd0872a 100644 --- a/website/src/repl/useReplContext.jsx +++ b/website/src/repl/useReplContext.jsx @@ -207,7 +207,14 @@ export function useReplContext() { const handleExport = async (begin, end, sampleRate, downloadName = undefined) => { await editorRef.current.evaluate(); - await renderPatternAudio(editorRef.current.repl.state.pattern, editorRef.current.repl.scheduler.cps, begin, end, sampleRate, downloadName) + await renderPatternAudio( + editorRef.current.repl.state.pattern, + editorRef.current.repl.scheduler.cps, + begin, + end, + sampleRate, + downloadName, + ); editorRef.current.repl.scheduler.stop(); }; const handleShuffle = async () => { From a8ea9a1b6334e0792b404c7bdefa850a8d41329e Mon Sep 17 00:00:00 2001 From: Nikita Date: Mon, 20 Oct 2025 21:26:40 +0300 Subject: [PATCH 075/312] Update lockfile --- pnpm-lock.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 217a63d8f..c225057f3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -225,9 +225,6 @@ importers: packages/core: dependencies: - '@strudel/webaudio': - specifier: workspace:* - version: link:../webaudio fraction.js: specifier: ^5.2.1 version: 5.2.1 From bf702c3b2a12a76d1dbac81c2d5eb0d50f72acff Mon Sep 17 00:00:00 2001 From: Nikita Date: Tue, 21 Oct 2025 16:30:18 +0300 Subject: [PATCH 076/312] Reviewed changes --- packages/core/cyclist.mjs | 1 - packages/superdough/superdough.mjs | 5 ++--- packages/webaudio/webaudio.mjs | 14 ++++++-------- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/packages/core/cyclist.mjs b/packages/core/cyclist.mjs index fdd8cf1c7..59e410c53 100644 --- a/packages/core/cyclist.mjs +++ b/packages/core/cyclist.mjs @@ -98,7 +98,6 @@ export class Cyclist { this.started = v; this.onToggle?.(v); } - async start() { await this.beforeStart?.(); this.num_ticks_since_cps_change = 0; diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 118a152b1..c2bbba36a 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -282,7 +282,7 @@ export async function initAudioOnFirstClick(options) { } let controller; -function getSuperdoughAudioController() { +export function getSuperdoughAudioController() { if (controller == null) { controller = new SuperdoughAudioController(getAudioContext()); } @@ -376,7 +376,6 @@ function mapChannelNumbers(channels) { } export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) => { - // controller = null; // new: t is always expected to be the absolute target onset time const ac = getAudioContext(); const audioController = getSuperdoughAudioController(); @@ -402,7 +401,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) `[superdough]: cannot schedule sounds in the past (target: ${t.toFixed(2)}, now: ${ac.currentTime.toFixed(2)})`, ); return; - } // FIXME: fix + } // destructure let { tremolo, diff --git a/packages/webaudio/webaudio.mjs b/packages/webaudio/webaudio.mjs index 8141b5363..46b5d8d08 100644 --- a/packages/webaudio/webaudio.mjs +++ b/packages/webaudio/webaudio.mjs @@ -45,12 +45,11 @@ export const webaudioOutput = (hap, _deadline, hapDuration, cps, t) => { }; export async function renderPatternAudio(pattern, cps, begin, end, sampleRate, downloadName = undefined) { - const oldAudioCtx = getAudioContext(); - await oldAudioCtx.close(); - let audioContext = new OfflineAudioContext(2, ((end - begin) / cps) * sampleRate, sampleRate); + let audioContext = getAudioContext(); + await audioContext.close(); + audioContext = new OfflineAudioContext(2, ((end - begin) / cps) * sampleRate, sampleRate); setAudioContext(audioContext); - let context = getAudioContext(); - setSuperdoughAudioController(new SuperdoughAudioController(context)); + setSuperdoughAudioController(new SuperdoughAudioController(audioContext)); setMaxPolyphony(1024); setMultiChannelOrbits(true); await loadWorklets(); @@ -69,7 +68,7 @@ export async function renderPatternAudio(pattern, cps, begin, end, sampleRate, d let bank = getSound(s).data.samples; if (bank) { let { url: sampleUrl, label } = getSampleInfo(h.value, bank); - await loadBuffer(sampleUrl, context, label); + await loadBuffer(sampleUrl, audioContext, label); } } }), @@ -81,10 +80,9 @@ export async function renderPatternAudio(pattern, cps, begin, end, sampleRate, d } }); - return context + return audioContext .startRendering() .then((renderedBuffer) => { - console.log(renderedBuffer); const wavBuffer = audioBufferToWav(renderedBuffer); const blob = new Blob([wavBuffer], { type: 'audio/wav' }); const url = URL.createObjectURL(blob); From 498624f6fe24b57b83d5e1e028b0b23a9ad8d5b7 Mon Sep 17 00:00:00 2001 From: Nikita Date: Tue, 21 Oct 2025 16:35:33 +0300 Subject: [PATCH 077/312] Make server.js a normal file --- packages/osc/server.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 packages/osc/server.js diff --git a/packages/osc/server.js b/packages/osc/server.js old mode 100755 new mode 100644 From 98031676d6a13e5ee8ceb76a0e82cb539f92552c Mon Sep 17 00:00:00 2001 From: Nikita Date: Tue, 21 Oct 2025 16:44:42 +0300 Subject: [PATCH 078/312] Add an EOL character to package.json --- packages/core/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/package.json b/packages/core/package.json index 50e02e4b2..7cf20cea7 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -38,4 +38,4 @@ "vite": "^6.0.11", "vitest": "^3.0.4" } -} \ No newline at end of file +} From 92d3fe496d7d893497724cfb436ca6c7965561a5 Mon Sep 17 00:00:00 2001 From: Nikita Date: Tue, 21 Oct 2025 21:00:30 +0300 Subject: [PATCH 079/312] Bug fixes --- packages/codemirror/codemirror.mjs | 4 ++-- packages/webaudio/webaudio.mjs | 4 ++-- website/src/repl/useReplContext.jsx | 8 +++++--- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/codemirror/codemirror.mjs b/packages/codemirror/codemirror.mjs index 4dc23996f..a42529cc4 100644 --- a/packages/codemirror/codemirror.mjs +++ b/packages/codemirror/codemirror.mjs @@ -264,9 +264,9 @@ export class StrudelMirror { console.warn('first frame could not be painted'); } } - async evaluate() { + async evaluate(autoplay = true) { this.flash(); - await this.repl.evaluate(this.code); + await this.repl.evaluate(this.code, autoplay); } async stop() { this.repl.scheduler.stop(); diff --git a/packages/webaudio/webaudio.mjs b/packages/webaudio/webaudio.mjs index 46b5d8d08..7a5ffac32 100644 --- a/packages/webaudio/webaudio.mjs +++ b/packages/webaudio/webaudio.mjs @@ -52,11 +52,11 @@ export async function renderPatternAudio(pattern, cps, begin, end, sampleRate, d setSuperdoughAudioController(new SuperdoughAudioController(audioContext)); setMaxPolyphony(1024); setMultiChannelOrbits(true); - await loadWorklets(); + await initAudio(); logger('[webaudio] start rendering'); let haps = pattern.queryArc(begin, end, { _cps: cps }); - Promise.all( + await Promise.all( haps.map(async (h) => { let s; if (h.value.s) { diff --git a/website/src/repl/useReplContext.jsx b/website/src/repl/useReplContext.jsx index aacd0872a..49d493157 100644 --- a/website/src/repl/useReplContext.jsx +++ b/website/src/repl/useReplContext.jsx @@ -206,7 +206,8 @@ export function useReplContext() { }; const handleExport = async (begin, end, sampleRate, downloadName = undefined) => { - await editorRef.current.evaluate(); + await editorRef.current.evaluate(true); + editorRef.current.repl.scheduler.stop(); await renderPatternAudio( editorRef.current.repl.state.pattern, editorRef.current.repl.scheduler.cps, @@ -214,8 +215,9 @@ export function useReplContext() { end, sampleRate, downloadName, - ); - editorRef.current.repl.scheduler.stop(); + ).finally(() => { + editorRef.current.repl.scheduler.stop(); + }); }; const handleShuffle = async () => { const patternData = await getRandomTune(); From daea207aff9403ae7db8365136caa7702f08337a Mon Sep 17 00:00:00 2001 From: Nikita Date: Tue, 21 Oct 2025 22:42:01 +0300 Subject: [PATCH 080/312] Better sample loading --- packages/codemirror/codemirror.mjs | 10 ++++----- packages/superdough/sampler.mjs | 2 +- packages/superdough/superdough.mjs | 2 +- packages/webaudio/webaudio.mjs | 32 ++++++++++++++++++++++------- website/src/repl/useReplContext.jsx | 2 +- 5 files changed, 33 insertions(+), 15 deletions(-) diff --git a/packages/codemirror/codemirror.mjs b/packages/codemirror/codemirror.mjs index a42529cc4..3411728a0 100644 --- a/packages/codemirror/codemirror.mjs +++ b/packages/codemirror/codemirror.mjs @@ -42,9 +42,9 @@ const extensions = { isMultiCursorEnabled: (on) => on ? [ - EditorState.allowMultipleSelections.of(true), - EditorView.clickAddsSelectionRange.of((ev) => ev.metaKey || ev.ctrlKey), - ] + EditorState.allowMultipleSelections.of(true), + EditorView.clickAddsSelectionRange.of((ev) => ev.metaKey || ev.ctrlKey), + ] : [], }; const compartments = Object.fromEntries(Object.keys(extensions).map((key) => [key, new Compartment()])); @@ -264,9 +264,9 @@ export class StrudelMirror { console.warn('first frame could not be painted'); } } - async evaluate(autoplay = true) { + async evaluate(autostart = true) { this.flash(); - await this.repl.evaluate(this.code, autoplay); + await this.repl.evaluate(this.code, autostart); } async stop() { this.repl.scheduler.stop(); diff --git a/packages/superdough/sampler.mjs b/packages/superdough/sampler.mjs index 3232fa476..d996f3a26 100644 --- a/packages/superdough/sampler.mjs +++ b/packages/superdough/sampler.mjs @@ -289,7 +289,7 @@ export async function onTriggerSample(t, value, onended, bank, resolveUrl) { const { bufferSource, sliceDuration, offset } = await getSampleBufferSource(value, bank, resolveUrl); // asny stuff above took too long? - if (ac.currentTime > t) { + if (ac.currentTime > t && !(ac instanceof OfflineAudioContext)) { logger(`[sampler] still loading sound "${s}:${n}"`, 'highlight'); // console.warn('sample still loading:', s, n); return; diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index c2bbba36a..e6972ab71 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -562,7 +562,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) return; } - if (ac.currentTime > t) { + if (ac.currentTime > t && !(ac instanceof OfflineAudioContext)) { logger('[webaudio] skip hap: still loading', ac.currentTime - t); return; } diff --git a/packages/webaudio/webaudio.mjs b/packages/webaudio/webaudio.mjs index 7a5ffac32..fae2c46cf 100644 --- a/packages/webaudio/webaudio.mjs +++ b/packages/webaudio/webaudio.mjs @@ -22,11 +22,14 @@ import { setMaxPolyphony, setMultiChannelOrbits, resetGlobalEffects, + getDefaultValue, } from 'superdough'; import './supradough.mjs'; import { workletUrl } from 'supradough'; import { SuperdoughAudioController } from 'superdough/superdoughoutput.mjs'; - +import { loadModules } from '@src/repl/util.mjs'; +import { prebake } from '@src/repl/prebake.mjs'; +import { getFontBufferSource, getFontPitch } from 'node_modules/@strudel/soundfonts/fontloader.mjs'; registerWorklet(workletUrl); const { Pattern, logger, repl } = strudel; @@ -56,7 +59,9 @@ export async function renderPatternAudio(pattern, cps, begin, end, sampleRate, d logger('[webaudio] start rendering'); let haps = pattern.queryArc(begin, end, { _cps: cps }); - await Promise.all( + await Promise.all([ + loadModules(), + prebake(), haps.map(async (h) => { let s; if (h.value.s) { @@ -65,13 +70,26 @@ export async function renderPatternAudio(pattern, cps, begin, end, sampleRate, d } else { s = h.value.s; } - let bank = getSound(s).data.samples; - if (bank) { - let { url: sampleUrl, label } = getSampleInfo(h.value, bank); - await loadBuffer(sampleUrl, audioContext, label); + // let bank = getSound(s).data.samples; + let sample = getSound(s); + if (sample.data.type == "soundfont") { + sample.data.fonts.forEach(async (font) => { + await getFontBufferSource(font, h.value, audioContext) + }) } + if (sample.data.type == "sample") { + let url; + if (Array.isArray(sample)) { + url = sample.data.samples[i % sample.data.samples.length]; + } else if (typeof sample === 'object') { + console.log(sample.data.samples) + url = Object.values(sample.data.samples).flat()[getDefaultValue("i") % Object.values(sample.data.samples).length]; + } + await loadBuffer(url, audioContext, s, 0); + } // TODO: waveform } - }), + }) + ], ); haps.forEach(async (hap) => { if (hap.hasOnset()) { diff --git a/website/src/repl/useReplContext.jsx b/website/src/repl/useReplContext.jsx index 49d493157..b775df659 100644 --- a/website/src/repl/useReplContext.jsx +++ b/website/src/repl/useReplContext.jsx @@ -206,7 +206,7 @@ export function useReplContext() { }; const handleExport = async (begin, end, sampleRate, downloadName = undefined) => { - await editorRef.current.evaluate(true); + await editorRef.current.evaluate(false); editorRef.current.repl.scheduler.stop(); await renderPatternAudio( editorRef.current.repl.state.pattern, From 5e27358fe86706d36775ac6134c3d7025fc780f6 Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 22 Oct 2025 16:19:58 +0300 Subject: [PATCH 081/312] Better preloading --- packages/webaudio/webaudio.mjs | 65 ++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 31 deletions(-) diff --git a/packages/webaudio/webaudio.mjs b/packages/webaudio/webaudio.mjs index fae2c46cf..2bdb9a98a 100644 --- a/packages/webaudio/webaudio.mjs +++ b/packages/webaudio/webaudio.mjs @@ -23,6 +23,7 @@ import { setMultiChannelOrbits, resetGlobalEffects, getDefaultValue, + getSampleBuffer, } from 'superdough'; import './supradough.mjs'; import { workletUrl } from 'supradough'; @@ -62,45 +63,47 @@ export async function renderPatternAudio(pattern, cps, begin, end, sampleRate, d await Promise.all([ loadModules(), prebake(), - haps.map(async (h) => { - let s; - if (h.value.s) { - if (h.value.bank) { - s = `${h.value.bank}_${h.value.s}`; - } else { - s = h.value.s; - } - // let bank = getSound(s).data.samples; - let sample = getSound(s); - if (sample.data.type == "soundfont") { - sample.data.fonts.forEach(async (font) => { - await getFontBufferSource(font, h.value, audioContext) - }) - } - if (sample.data.type == "sample") { - let url; - if (Array.isArray(sample)) { - url = sample.data.samples[i % sample.data.samples.length]; - } else if (typeof sample === 'object') { - console.log(sample.data.samples) - url = Object.values(sample.data.samples).flat()[getDefaultValue("i") % Object.values(sample.data.samples).length]; - } - await loadBuffer(url, audioContext, s, 0); - } // TODO: waveform + ]); + + haps.forEach(async (h) => { + let s; + if (h.value.s) { + if (h.value.bank) { + s = `${h.value.bank}_${h.value.s}`; + } else { + s = h.value.s; } - }) - ], - ); - haps.forEach(async (hap) => { + // let bank = getSound(s).data.samples; + let sample = getSound(s); + if (sample.data.type == "soundfont") { + for (let index = 0; index < sample.data.fonts.length; index++) { + const font = array[index]; + await getFontBufferSource(font, h.value, audioContext) + } + } + if (sample.data.type == "sample") { + for (let index = 0; index < sample.data.samples.length; index++) { + const sample = array[index]; + await getSampleBuffer(h.value, bank, sample) + } + } // TODO: waveform + } + }) + + for (let index = 0; index < haps.length; index++) { + const hap = haps[index]; if (hap.hasOnset()) { - hap.ensureObjectValue(); + await hap.ensureObjectValue(); + console.log("dough") await superdough(hap.value, hap.whole.begin.valueOf() / cps, hap.duration, cps, hap.whole?.begin.valueOf()); } - }); + } + console.log("starting rendering") return audioContext .startRendering() .then((renderedBuffer) => { + console.log('downloading') const wavBuffer = audioBufferToWav(renderedBuffer); const blob = new Blob([wavBuffer], { type: 'audio/wav' }); const url = URL.createObjectURL(blob); From e7578be6c5c11756e20669337ca33f310c24a2ea Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 22 Oct 2025 17:16:05 +0300 Subject: [PATCH 082/312] Remove preloading code and instead await superdough --- packages/webaudio/webaudio.mjs | 42 ++++------------------------------ 1 file changed, 5 insertions(+), 37 deletions(-) diff --git a/packages/webaudio/webaudio.mjs b/packages/webaudio/webaudio.mjs index 2bdb9a98a..9764516c7 100644 --- a/packages/webaudio/webaudio.mjs +++ b/packages/webaudio/webaudio.mjs @@ -57,48 +57,16 @@ export async function renderPatternAudio(pattern, cps, begin, end, sampleRate, d setMaxPolyphony(1024); setMultiChannelOrbits(true); await initAudio(); - logger('[webaudio] start rendering'); + logger('[webaudio] preloading'); let haps = pattern.queryArc(begin, end, { _cps: cps }); - await Promise.all([ - loadModules(), - prebake(), - ]); - haps.forEach(async (h) => { - let s; - if (h.value.s) { - if (h.value.bank) { - s = `${h.value.bank}_${h.value.s}`; - } else { - s = h.value.s; - } - // let bank = getSound(s).data.samples; - let sample = getSound(s); - if (sample.data.type == "soundfont") { - for (let index = 0; index < sample.data.fonts.length; index++) { - const font = array[index]; - await getFontBufferSource(font, h.value, audioContext) - } - } - if (sample.data.type == "sample") { - for (let index = 0; index < sample.data.samples.length; index++) { - const sample = array[index]; - await getSampleBuffer(h.value, bank, sample) - } - } // TODO: waveform - } - }) - - for (let index = 0; index < haps.length; index++) { - const hap = haps[index]; + await Promise.all(haps.map(async (hap) => { if (hap.hasOnset()) { - await hap.ensureObjectValue(); - console.log("dough") - await superdough(hap.value, hap.whole.begin.valueOf() / cps, hap.duration, cps, hap.whole?.begin.valueOf()); + await superdough(hap2value(hap), hap.whole.begin.valueOf() / cps, hap.duration, cps, hap.whole?.begin.valueOf()); } - } - console.log("starting rendering") + })); + logger('[webaudio] start rendering'); return audioContext .startRendering() From 95700e11967b9be35c984f67e9a8510573fbe80f Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 22 Oct 2025 20:00:36 +0300 Subject: [PATCH 083/312] Fix wavetables breaking after playback --- packages/codemirror/codemirror.mjs | 6 +++--- packages/superdough/superdough.mjs | 2 ++ packages/superdough/wavetable.mjs | 5 +++++ packages/webaudio/webaudio.mjs | 20 ++++++++++++++------ 4 files changed, 24 insertions(+), 9 deletions(-) diff --git a/packages/codemirror/codemirror.mjs b/packages/codemirror/codemirror.mjs index 3411728a0..ab3a3c995 100644 --- a/packages/codemirror/codemirror.mjs +++ b/packages/codemirror/codemirror.mjs @@ -42,9 +42,9 @@ const extensions = { isMultiCursorEnabled: (on) => on ? [ - EditorState.allowMultipleSelections.of(true), - EditorView.clickAddsSelectionRange.of((ev) => ev.metaKey || ev.ctrlKey), - ] + EditorState.allowMultipleSelections.of(true), + EditorView.clickAddsSelectionRange.of((ev) => ev.metaKey || ev.ctrlKey), + ] : [], }; const compartments = Object.fromEntries(Object.keys(extensions).map((key) => [key, new Compartment()])); diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index e6972ab71..7fe60ae49 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -15,6 +15,7 @@ import { logger } from './logger.mjs'; import { loadBuffer } from './sampler.mjs'; import { getAudioContext, setAudioContext } from './audioContext.mjs'; import { SuperdoughAudioController } from './superdoughoutput.mjs'; +import { resetSeenKeys } from './wavetable.mjs'; export const DEFAULT_MAX_POLYPHONY = 128; const DEFAULT_AUDIO_DEVICE_NAME = 'System Standard'; @@ -231,6 +232,7 @@ export async function initAudio(options = {}) { setMaxPolyphony(maxPolyphony); setMultiChannelOrbits(multiChannelOrbits); + resetSeenKeys(); if (typeof window === 'undefined') { return; } diff --git a/packages/superdough/wavetable.mjs b/packages/superdough/wavetable.mjs index 01d4eb838..902fb4edd 100644 --- a/packages/superdough/wavetable.mjs +++ b/packages/superdough/wavetable.mjs @@ -40,6 +40,11 @@ export const Warpmode = Object.freeze({ }); const seenKeys = new Set(); + +export function resetSeenKeys() { + seenKeys.clear(); +} + async function getPayload(url, label, frameLen = 2048) { const key = `${url},${frameLen}`; if (!seenKeys.has(key)) { diff --git a/packages/webaudio/webaudio.mjs b/packages/webaudio/webaudio.mjs index 9764516c7..777a271aa 100644 --- a/packages/webaudio/webaudio.mjs +++ b/packages/webaudio/webaudio.mjs @@ -61,17 +61,25 @@ export async function renderPatternAudio(pattern, cps, begin, end, sampleRate, d let haps = pattern.queryArc(begin, end, { _cps: cps }); - await Promise.all(haps.map(async (hap) => { - if (hap.hasOnset()) { - await superdough(hap2value(hap), hap.whole.begin.valueOf() / cps, hap.duration, cps, hap.whole?.begin.valueOf()); - } - })); + await Promise.all( + haps.map(async (hap) => { + if (hap.hasOnset()) { + await superdough( + hap2value(hap), + hap.whole.begin.valueOf() / cps, + hap.duration, + cps, + hap.whole?.begin.valueOf(), + ); + } + }), + ); logger('[webaudio] start rendering'); return audioContext .startRendering() .then((renderedBuffer) => { - console.log('downloading') + console.log('downloading'); const wavBuffer = audioBufferToWav(renderedBuffer); const blob = new Blob([wavBuffer], { type: 'audio/wav' }); const url = URL.createObjectURL(blob); From 7b74a902a21ffcf3aa171f2b28ebe29d821d25a6 Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 22 Oct 2025 20:05:03 +0300 Subject: [PATCH 084/312] Remove unneeded imports --- packages/webaudio/webaudio.mjs | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/packages/webaudio/webaudio.mjs b/packages/webaudio/webaudio.mjs index 777a271aa..c87f8ab05 100644 --- a/packages/webaudio/webaudio.mjs +++ b/packages/webaudio/webaudio.mjs @@ -12,25 +12,15 @@ import { doughTrigger, registerWorklet, setAudioContext, - getSampleBufferSource, - loadBuffer, - getSampleInfo, - getSound, initAudio, setSuperdoughAudioController, - loadWorklets, setMaxPolyphony, setMultiChannelOrbits, resetGlobalEffects, - getDefaultValue, - getSampleBuffer, } from 'superdough'; import './supradough.mjs'; import { workletUrl } from 'supradough'; import { SuperdoughAudioController } from 'superdough/superdoughoutput.mjs'; -import { loadModules } from '@src/repl/util.mjs'; -import { prebake } from '@src/repl/prebake.mjs'; -import { getFontBufferSource, getFontPitch } from 'node_modules/@strudel/soundfonts/fontloader.mjs'; registerWorklet(workletUrl); const { Pattern, logger, repl } = strudel; @@ -79,7 +69,6 @@ export async function renderPatternAudio(pattern, cps, begin, end, sampleRate, d return audioContext .startRendering() .then((renderedBuffer) => { - console.log('downloading'); const wavBuffer = audioBufferToWav(renderedBuffer); const blob = new Blob([wavBuffer], { type: 'audio/wav' }); const url = URL.createObjectURL(blob); From 5a70599aac6907fbcb32b4e2a3cb85f55d8410de Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 22 Oct 2025 22:48:04 +0300 Subject: [PATCH 085/312] Ignore superdough errors when exporting, instead skip sound. --- packages/webaudio/webaudio.mjs | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/packages/webaudio/webaudio.mjs b/packages/webaudio/webaudio.mjs index c87f8ab05..816434889 100644 --- a/packages/webaudio/webaudio.mjs +++ b/packages/webaudio/webaudio.mjs @@ -54,13 +54,17 @@ export async function renderPatternAudio(pattern, cps, begin, end, sampleRate, d await Promise.all( haps.map(async (hap) => { if (hap.hasOnset()) { - await superdough( - hap2value(hap), - hap.whole.begin.valueOf() / cps, - hap.duration, - cps, - hap.whole?.begin.valueOf(), - ); + try { + await superdough( + hap2value(hap), + hap.whole.begin.valueOf() / cps, + hap.duration, + cps, + hap.whole?.begin.valueOf(), + ); + } catch (error) { + logger("[webaudio] An error had occured while calling superdough. Skipping hap.") + } } }), ); @@ -81,12 +85,12 @@ export async function renderPatternAudio(pattern, cps, begin, end, sampleRate, d document.body.removeChild(a); URL.revokeObjectURL(url); }) - .finally(async () => { - setAudioContext(null); - setSuperdoughAudioController(null); - resetGlobalEffects(); - await initAudio(); - }); + // .finally(async () => { + // setAudioContext(null); + // setSuperdoughAudioController(null); + // resetGlobalEffects(); + // await initAudio(); + // }); } export function webaudioRepl(options = {}) { From 16f885c010d9fc27f7afd7a49a3419476b767f86 Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 22 Oct 2025 23:09:30 +0300 Subject: [PATCH 086/312] Use errorLogger instead --- packages/webaudio/webaudio.mjs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/webaudio/webaudio.mjs b/packages/webaudio/webaudio.mjs index 816434889..4ad778d17 100644 --- a/packages/webaudio/webaudio.mjs +++ b/packages/webaudio/webaudio.mjs @@ -17,6 +17,7 @@ import { setMaxPolyphony, setMultiChannelOrbits, resetGlobalEffects, + errorLogger, } from 'superdough'; import './supradough.mjs'; import { workletUrl } from 'supradough'; @@ -62,8 +63,8 @@ export async function renderPatternAudio(pattern, cps, begin, end, sampleRate, d cps, hap.whole?.begin.valueOf(), ); - } catch (error) { - logger("[webaudio] An error had occured while calling superdough. Skipping hap.") + } catch (err) { + errorLogger(err, 'webaudio') } } }), @@ -85,12 +86,12 @@ export async function renderPatternAudio(pattern, cps, begin, end, sampleRate, d document.body.removeChild(a); URL.revokeObjectURL(url); }) - // .finally(async () => { - // setAudioContext(null); - // setSuperdoughAudioController(null); - // resetGlobalEffects(); - // await initAudio(); - // }); + .finally(async () => { + setAudioContext(null); + setSuperdoughAudioController(null); + resetGlobalEffects(); + await initAudio(); + }); } export function webaudioRepl(options = {}) { From 6baca67cd3f7ab18970dfff68d8e72dbfccd77f5 Mon Sep 17 00:00:00 2001 From: Nikita Date: Thu, 23 Oct 2025 17:07:53 +0300 Subject: [PATCH 087/312] Fix maxPolyphony and multiChannelOrbits not applying to export --- packages/webaudio/webaudio.mjs | 8 ++++---- website/src/repl/components/ExportModal.jsx | 2 +- website/src/repl/useReplContext.jsx | 4 +++- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/webaudio/webaudio.mjs b/packages/webaudio/webaudio.mjs index 4ad778d17..3fc4df8bd 100644 --- a/packages/webaudio/webaudio.mjs +++ b/packages/webaudio/webaudio.mjs @@ -39,15 +39,15 @@ export const webaudioOutput = (hap, _deadline, hapDuration, cps, t) => { return superdough(hap2value(hap), t, hapDuration, cps, hap.whole?.begin.valueOf()); }; -export async function renderPatternAudio(pattern, cps, begin, end, sampleRate, downloadName = undefined) { +export async function renderPatternAudio(pattern, cps, begin, end, sampleRate, maxPolyphony, multiChannelOrbits, downloadName = undefined) { let audioContext = getAudioContext(); await audioContext.close(); audioContext = new OfflineAudioContext(2, ((end - begin) / cps) * sampleRate, sampleRate); setAudioContext(audioContext); setSuperdoughAudioController(new SuperdoughAudioController(audioContext)); - setMaxPolyphony(1024); - setMultiChannelOrbits(true); await initAudio(); + setMaxPolyphony(maxPolyphony); + setMultiChannelOrbits(multiChannelOrbits); logger('[webaudio] preloading'); let haps = pattern.queryArc(begin, end, { _cps: cps }); @@ -64,7 +64,7 @@ export async function renderPatternAudio(pattern, cps, begin, end, sampleRate, d hap.whole?.begin.valueOf(), ); } catch (err) { - errorLogger(err, 'webaudio') + errorLogger(err, 'webaudio'); } } }), diff --git a/website/src/repl/components/ExportModal.jsx b/website/src/repl/components/ExportModal.jsx index 036f6f36a..990eb1132 100644 --- a/website/src/repl/components/ExportModal.jsx +++ b/website/src/repl/components/ExportModal.jsx @@ -204,7 +204,7 @@ export default function ExportModal(Props) { setStrudelMaxPolyphony(maxPolyphony); setStrudelMultiChannelOrbits(multiChannelOrbits); setTimeout(refreshProgress, 1000); - await handleExport(startCycle, endCycle, sampleRate, downloadName).finally(() => { + await handleExport(startCycle, endCycle, sampleRate, maxPolyphony, multiChannelOrbits, downloadName).finally(() => { setExporting(false); const modal = document.getElementById('exportModal'); setProgress(0); diff --git a/website/src/repl/useReplContext.jsx b/website/src/repl/useReplContext.jsx index b775df659..15b3fab10 100644 --- a/website/src/repl/useReplContext.jsx +++ b/website/src/repl/useReplContext.jsx @@ -205,7 +205,7 @@ export function useReplContext() { editorRef.current.evaluate(); }; - const handleExport = async (begin, end, sampleRate, downloadName = undefined) => { + const handleExport = async (begin, end, sampleRate, maxPolyphony, multiChannelOrbits, downloadName = undefined) => { await editorRef.current.evaluate(false); editorRef.current.repl.scheduler.stop(); await renderPatternAudio( @@ -214,6 +214,8 @@ export function useReplContext() { begin, end, sampleRate, + maxPolyphony, + multiChannelOrbits, downloadName, ).finally(() => { editorRef.current.repl.scheduler.stop(); From fe70a2df43c874639ff0fd778fe03e9261212de5 Mon Sep 17 00:00:00 2001 From: Nikita Date: Thu, 23 Oct 2025 17:08:11 +0300 Subject: [PATCH 088/312] Format --- packages/webaudio/webaudio.mjs | 11 ++++++++++- website/src/repl/components/ExportModal.jsx | 9 ++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/webaudio/webaudio.mjs b/packages/webaudio/webaudio.mjs index 3fc4df8bd..0df487be2 100644 --- a/packages/webaudio/webaudio.mjs +++ b/packages/webaudio/webaudio.mjs @@ -39,7 +39,16 @@ export const webaudioOutput = (hap, _deadline, hapDuration, cps, t) => { return superdough(hap2value(hap), t, hapDuration, cps, hap.whole?.begin.valueOf()); }; -export async function renderPatternAudio(pattern, cps, begin, end, sampleRate, maxPolyphony, multiChannelOrbits, downloadName = undefined) { +export async function renderPatternAudio( + pattern, + cps, + begin, + end, + sampleRate, + maxPolyphony, + multiChannelOrbits, + downloadName = undefined, +) { let audioContext = getAudioContext(); await audioContext.close(); audioContext = new OfflineAudioContext(2, ((end - begin) / cps) * sampleRate, sampleRate); diff --git a/website/src/repl/components/ExportModal.jsx b/website/src/repl/components/ExportModal.jsx index 990eb1132..ad4ddad5d 100644 --- a/website/src/repl/components/ExportModal.jsx +++ b/website/src/repl/components/ExportModal.jsx @@ -204,7 +204,14 @@ export default function ExportModal(Props) { setStrudelMaxPolyphony(maxPolyphony); setStrudelMultiChannelOrbits(multiChannelOrbits); setTimeout(refreshProgress, 1000); - await handleExport(startCycle, endCycle, sampleRate, maxPolyphony, multiChannelOrbits, downloadName).finally(() => { + await handleExport( + startCycle, + endCycle, + sampleRate, + maxPolyphony, + multiChannelOrbits, + downloadName, + ).finally(() => { setExporting(false); const modal = document.getElementById('exportModal'); setProgress(0); From fd0a910bfbcf9127d0f970c8475f445b94082f96 Mon Sep 17 00:00:00 2001 From: Jason Dufair Date: Wed, 22 Oct 2025 19:38:22 -0400 Subject: [PATCH 089/312] Voicings JSDoc --- packages/core/controls.mjs | 53 +++++++++++++++++++++++++++++++++----- 1 file changed, 47 insertions(+), 6 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index a3ca638aa..6f247180d 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -1750,17 +1750,58 @@ export const { semitone } = registerControl('semitone'); // TODO: synth param export const { voice } = registerControl('voice'); // voicings // https://codeberg.org/uzu/strudel/issues/506 -// chord to voice, like C Eb Fm7 G7. the symbols can be defined via addVoicings +/** + * The chord to voice + * @name chord + * @param {string | Pattern} symbols chord symbols to voice e.g., C, Eb, Fm7, G7. The symbols can be defined via addVoicings + * @example + * chord("").voicing() + **/ export const { chord } = registerControl('chord'); -// which dictionary to use for the voicings +/** + * Which dictionary to use for the voicings. This falls back to the default dictionary if not provided + * + * @name dictionary + * @param {string} dictionaryName which dictionary (having been defined with `addVoicings`) to use + * @example + * chord("Am C D F Am E Am E").dict('house').voicing + **/ export const { dictionary, dict } = registerControl('dictionary', 'dict'); -// the top note to align the voicing to, defaults to c5 +/** The top note to align the voicing to. Defaults to c5 + * + * @name anchor + * @param {string | Pattern} anchorNote the note to align the voicings to + * @example + * anchor("").chord("C").voicing() + **/ export const { anchor } = registerControl('anchor'); -// how the voicing is offset from the anchored position +/** + * Sets how the voicing is offset from the anchored position + * + * @name offset + * @param {number | Pattern} shift the amount to shift the voicing up or down + * @example + * chord("").offset("<0 1 2 3 4 5>") // alter the voicing each time + **/ export const { offset } = registerControl('offset'); -// how many octaves are voicing steps spread apart, defaults to 1 +/** + * How many octaves are voicing steps spread apart, defaults to 1 + * + * @name octaves + * @param {number | Pattern} count the number of octaves + * @example + * chord("").octaves("<2 4>").voicing() + **/ export const { octaves } = registerControl('octaves'); -// below = anchor note will be removed from the voicing, useful for melody harmonization +/** + * Remove anchor note from the voicing. Useful for melody harmonization + * + * @name mode + * @param {string | Pattern} modeName one of {below | above | duck | root} + * @example + * mode("").chord("C").voicing() + * + **/ export const { mode } = registerControl(['mode', 'anchor']); /** From a8c613b7eb46df2c3bdfa39b2930434306225cc4 Mon Sep 17 00:00:00 2001 From: Ignacio Ortega Date: Thu, 23 Oct 2025 12:45:44 +0200 Subject: [PATCH 090/312] Refactor sound stopping and triggering logic in SoundsTab component --- .../src/repl/components/panel/SoundsTab.jsx | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/website/src/repl/components/panel/SoundsTab.jsx b/website/src/repl/components/panel/SoundsTab.jsx index 363f6b98a..a9f10bf12 100644 --- a/website/src/repl/components/panel/SoundsTab.jsx +++ b/website/src/repl/components/panel/SoundsTab.jsx @@ -62,11 +62,9 @@ export function SoundsTab() { // stop current sound on mouseup useEvent('mouseup', () => { - const t = trigRef.current; + const ref = trigRef.current; trigRef.current = undefined; - t?.then((ref) => { - ref?.stop(getAudioContext().currentTime + 0.01); - }); + ref?.stop?.(getAudioContext().currentTime + 0.01); }); return (
@@ -124,12 +122,19 @@ export function SoundsTab() { duration: 0.5, }; soundPreviewIdx++; - const time = ctx.currentTime + 0.05; const onended = () => trigRef.current?.node?.disconnect(); - trigRef.current = Promise.resolve(onTrigger(time, params, onended)); - trigRef.current.then((ref) => { - connectToDestination(ref?.node); - }); + try { + // Pre-load the sample by calling onTrigger with a future time + // This triggers the loading but schedules playback for later + const time = ctx.currentTime + 0.5; // Give 500ms for loading + const ref = await onTrigger(time, params, onended); + trigRef.current = ref; + if (ref?.node) { + connectToDestination(ref.node); + } + } catch (err) { + console.warn('Failed to trigger sound:', err); + } }} > {' '} From ca936aada775ec734c25769fa10af2a35f4da402 Mon Sep 17 00:00:00 2001 From: Nikita Date: Thu, 23 Oct 2025 21:46:13 +0300 Subject: [PATCH 091/312] Fix incorrect duration calculation --- packages/webaudio/webaudio.mjs | 2 +- website/src/repl/components/ExportModal.jsx | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/webaudio/webaudio.mjs b/packages/webaudio/webaudio.mjs index 0df487be2..99e5be5ed 100644 --- a/packages/webaudio/webaudio.mjs +++ b/packages/webaudio/webaudio.mjs @@ -68,7 +68,7 @@ export async function renderPatternAudio( await superdough( hap2value(hap), hap.whole.begin.valueOf() / cps, - hap.duration, + hap.duration / cps, cps, hap.whole?.begin.valueOf(), ); diff --git a/website/src/repl/components/ExportModal.jsx b/website/src/repl/components/ExportModal.jsx index ad4ddad5d..9f32d6930 100644 --- a/website/src/repl/components/ExportModal.jsx +++ b/website/src/repl/components/ExportModal.jsx @@ -211,12 +211,13 @@ export default function ExportModal(Props) { maxPolyphony, multiChannelOrbits, downloadName, - ).finally(() => { - setExporting(false); + ).then(() => { const modal = document.getElementById('exportModal'); + modal.close(); + }).finally(() => { + setExporting(false); setProgress(0); setLength(1); - modal.close(); }); }} > From 9cbeaef88defc63150db0eb094ca3e7e2ad21275 Mon Sep 17 00:00:00 2001 From: Nikita Date: Thu, 23 Oct 2025 22:21:40 +0300 Subject: [PATCH 092/312] Format --- website/src/repl/components/ExportModal.jsx | 25 +++++++++------------ 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/website/src/repl/components/ExportModal.jsx b/website/src/repl/components/ExportModal.jsx index 9f32d6930..93624fa07 100644 --- a/website/src/repl/components/ExportModal.jsx +++ b/website/src/repl/components/ExportModal.jsx @@ -204,21 +204,16 @@ export default function ExportModal(Props) { setStrudelMaxPolyphony(maxPolyphony); setStrudelMultiChannelOrbits(multiChannelOrbits); setTimeout(refreshProgress, 1000); - await handleExport( - startCycle, - endCycle, - sampleRate, - maxPolyphony, - multiChannelOrbits, - downloadName, - ).then(() => { - const modal = document.getElementById('exportModal'); - modal.close(); - }).finally(() => { - setExporting(false); - setProgress(0); - setLength(1); - }); + await handleExport(startCycle, endCycle, sampleRate, maxPolyphony, multiChannelOrbits, downloadName) + .then(() => { + const modal = document.getElementById('exportModal'); + modal.close(); + }) + .finally(() => { + setExporting(false); + setProgress(0); + setLength(1); + }); }} > {exporting ? 'Exporting...' : 'Export to WAV'} From 20bbda30f8aa9d8d56c9cf65c98dc51ccc78f8a2 Mon Sep 17 00:00:00 2001 From: moumar Date: Thu, 23 Oct 2025 23:15:21 +0200 Subject: [PATCH 093/312] Add setting to toggle pattern auto-start on pattern change --- website/src/repl/components/panel/PatternsTab.jsx | 12 ++++++------ website/src/repl/components/panel/SettingsTab.jsx | 6 ++++++ website/src/settings.mjs | 1 + 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/website/src/repl/components/panel/PatternsTab.jsx b/website/src/repl/components/panel/PatternsTab.jsx index 8e2b75b96..519461442 100644 --- a/website/src/repl/components/panel/PatternsTab.jsx +++ b/website/src/repl/components/panel/PatternsTab.jsx @@ -79,13 +79,11 @@ const updateCodeWindow = (context, patternData, reset = false) => { context.handleUpdate(patternData, reset); }; -const autoResetPatternOnChange = !isUdels(); - function UserPatterns({ context }) { const activePattern = useActivePattern(); const viewingPatternStore = useViewingPatternData(); const viewingPatternData = parseJSON(viewingPatternStore); - const { userPatterns, patternFilter } = useSettings(); + const { userPatterns, patternFilter, patternAutoStart } = useSettings(); const viewingPatternID = viewingPatternData?.id; return (
@@ -139,7 +137,7 @@ function UserPatterns({ context }) { updateCodeWindow( context, { ...userPatterns[id], collection: userPattern.collection }, - autoResetPatternOnChange, + patternAutoStart, ) } patterns={userPatterns} @@ -188,6 +186,7 @@ function FeaturedPatterns({ context }) { const examplePatterns = useExamplePatterns(); const collections = examplePatterns.collections; const patterns = collections.get(patternFilterName.featured); + const { patternAutoStart } = useSettings(); return ( { @@ -213,13 +212,14 @@ function LatestPatterns({ context }) { const examplePatterns = useExamplePatterns(); const collections = examplePatterns.collections; const patterns = collections.get(patternFilterName.public); + const { patternAutoStart } = useSettings(); return ( { - updateCodeWindow(context, { ...patterns[id], collection: patternFilterName.public }, autoResetPatternOnChange); + updateCodeWindow(context, { ...patterns[id], collection: patternFilterName.public }, patternAutoStart); }} paginationOnChange={async (pageNum) => { await loadAndSetPublicPatterns(pageNum - 1); diff --git a/website/src/repl/components/panel/SettingsTab.jsx b/website/src/repl/components/panel/SettingsTab.jsx index 80daef018..c898609d2 100644 --- a/website/src/repl/components/panel/SettingsTab.jsx +++ b/website/src/repl/components/panel/SettingsTab.jsx @@ -112,6 +112,7 @@ export function SettingsTab({ started }) { multiChannelOrbits, isTabIndentationEnabled, isMultiCursorEnabled, + patternAutoStart } = useSettings(); const shouldAlwaysSync = isUdels(); const canChangeAudioDevice = AudioContext.prototype.setSinkId != null; @@ -304,6 +305,11 @@ export function SettingsTab({ started }) { onChange={(cbEvent) => settingsMap.setKey('isCSSAnimationDisabled', cbEvent.target.checked)} value={isCSSAnimationDisabled} /> + settingsMap.setKey('patternAutoStart', cbEvent.target.checked)} + value={patternAutoStart} + /> Try clicking the logo in the top left! diff --git a/website/src/settings.mjs b/website/src/settings.mjs index 9365a6db5..bbf893551 100644 --- a/website/src/settings.mjs +++ b/website/src/settings.mjs @@ -96,6 +96,7 @@ export function useSettings() { isPanelOpen: parseBoolean(state.isPanelOpen), userPatterns: userPatterns, multiChannelOrbits: parseBoolean(state.multiChannelOrbits), + patternAutoStart: isUdels() ? false : parseBoolean(state.patternAutoStart) }; } From ff370cf86f5d5a2b7bc21b59f74fb1839cd3c755 Mon Sep 17 00:00:00 2001 From: Nikita Date: Fri, 24 Oct 2025 14:07:57 +0300 Subject: [PATCH 094/312] Reapply realtimeOptions after export --- packages/superdough/sampler.mjs | 2 +- packages/superdough/superdough.mjs | 8 ++++---- packages/webaudio/webaudio.mjs | 15 +++++++++++---- website/src/repl/components/ExportModal.jsx | 4 ---- 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/packages/superdough/sampler.mjs b/packages/superdough/sampler.mjs index 742be592f..84bac3582 100644 --- a/packages/superdough/sampler.mjs +++ b/packages/superdough/sampler.mjs @@ -287,7 +287,7 @@ export async function onTriggerSample(t, value, onended, bank, resolveUrl) { const { bufferSource, sliceDuration, offset } = await getSampleBufferSource(value, bank, resolveUrl); // asny stuff above took too long? - if (ac.currentTime > t && !(ac instanceof OfflineAudioContext)) { + if (ac.currentTime > t) { logger(`[sampler] still loading sound "${s}:${n}"`, 'highlight'); // console.warn('sample still loading:', s, n); return; diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index ae722b7ce..e7d62a8eb 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -20,13 +20,13 @@ import { resetSeenKeys } from './wavetable.mjs'; export const DEFAULT_MAX_POLYPHONY = 128; const DEFAULT_AUDIO_DEVICE_NAME = 'System Standard'; -let maxPolyphony = DEFAULT_MAX_POLYPHONY; +export let maxPolyphony = DEFAULT_MAX_POLYPHONY; export function setMaxPolyphony(polyphony) { maxPolyphony = parseInt(polyphony) ?? DEFAULT_MAX_POLYPHONY; } -let multiChannelOrbits = false; +export let multiChannelOrbits = false; export function setMultiChannelOrbits(bool) { multiChannelOrbits = bool == true; } @@ -398,7 +398,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) // duration is passed as value too.. value.duration = hapDuration; // calculate absolute time - if (t < ac.currentTime && !(ac instanceof OfflineAudioContext)) { + if (t < ac.currentTime) { console.warn( `[superdough]: cannot schedule sounds in the past (target: ${t.toFixed(2)}, now: ${ac.currentTime.toFixed(2)})`, ); @@ -564,7 +564,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) return; } - if (ac.currentTime > t && !(ac instanceof OfflineAudioContext)) { + if (ac.currentTime > t) { logger('[webaudio] skip hap: still loading', ac.currentTime - t); return; } diff --git a/packages/webaudio/webaudio.mjs b/packages/webaudio/webaudio.mjs index 99e5be5ed..c9b5cbda3 100644 --- a/packages/webaudio/webaudio.mjs +++ b/packages/webaudio/webaudio.mjs @@ -18,6 +18,8 @@ import { setMultiChannelOrbits, resetGlobalEffects, errorLogger, + maxPolyphony as superdoughMaxPolyphony, + multiChannelOrbits as superdoughMultiChannelOrbits } from 'superdough'; import './supradough.mjs'; import { workletUrl } from 'supradough'; @@ -49,14 +51,19 @@ export async function renderPatternAudio( multiChannelOrbits, downloadName = undefined, ) { + let realtimeOptions = { + maxPolyphony: superdoughMaxPolyphony, + multiChannelOrbits: superdoughMultiChannelOrbits + } let audioContext = getAudioContext(); await audioContext.close(); audioContext = new OfflineAudioContext(2, ((end - begin) / cps) * sampleRate, sampleRate); setAudioContext(audioContext); setSuperdoughAudioController(new SuperdoughAudioController(audioContext)); - await initAudio(); - setMaxPolyphony(maxPolyphony); - setMultiChannelOrbits(multiChannelOrbits); + await initAudio({ + maxPolyphony, + multiChannelOrbits + }); logger('[webaudio] preloading'); let haps = pattern.queryArc(begin, end, { _cps: cps }); @@ -99,7 +106,7 @@ export async function renderPatternAudio( setAudioContext(null); setSuperdoughAudioController(null); resetGlobalEffects(); - await initAudio(); + await initAudio(realtimeOptions); }); } diff --git a/website/src/repl/components/ExportModal.jsx b/website/src/repl/components/ExportModal.jsx index 93624fa07..4bc8990ea 100644 --- a/website/src/repl/components/ExportModal.jsx +++ b/website/src/repl/components/ExportModal.jsx @@ -4,8 +4,6 @@ import NumberInput from './NumberInput'; import { useEffect, useState } from 'react'; import { Textbox } from './textbox/Textbox'; import { - setMultiChannelOrbits as setStrudelMultiChannelOrbits, - setMaxPolyphony as setStrudelMaxPolyphony, getAudioContext, } from '@strudel/webaudio'; import XMarkIcon from '@heroicons/react/24/outline/XMarkIcon'; @@ -201,8 +199,6 @@ export default function ExportModal(Props) { disabled={exporting} onClick={async () => { setExporting(true); - setStrudelMaxPolyphony(maxPolyphony); - setStrudelMultiChannelOrbits(multiChannelOrbits); setTimeout(refreshProgress, 1000); await handleExport(startCycle, endCycle, sampleRate, maxPolyphony, multiChannelOrbits, downloadName) .then(() => { From 1a362bd8ea640cfc250832db66255d1b95ff0db7 Mon Sep 17 00:00:00 2001 From: Jason Dufair Date: Fri, 24 Oct 2025 09:19:02 -0400 Subject: [PATCH 095/312] Fix example --- packages/core/controls.mjs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 6f247180d..e317af357 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -1764,7 +1764,13 @@ export const { chord } = registerControl('chord'); * @name dictionary * @param {string} dictionaryName which dictionary (having been defined with `addVoicings`) to use * @example - * chord("Am C D F Am E Am E").dict('house').voicing + * addVoicings('house', { +'': ['7 12 16', '0 7 16', '4 7 12'], +'m': ['0 3 7'] +}) +chord("") +.dict('house').anchor(66) +.voicing().room(.5) **/ export const { dictionary, dict } = registerControl('dictionary', 'dict'); /** The top note to align the voicing to. Defaults to c5 From 6d4787ee33df83f83a8ee54ae7338e4c90702e60 Mon Sep 17 00:00:00 2001 From: Jason Dufair Date: Fri, 24 Oct 2025 09:21:04 -0400 Subject: [PATCH 096/312] Test snapshot --- test/__snapshots__/examples.test.mjs.snap | 123 ++++++++++++++++++++++ 1 file changed, 123 insertions(+) diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index c39bb87bf..8ab10e8e0 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -840,6 +840,31 @@ exports[`runs examples > example "amp" example index 0 1`] = ` ] `; +exports[`runs examples > example "anchor" example index 0 1`] = ` +[ + "[ 0/1 → 1/1 | note:E2 ]", + "[ 0/1 → 1/1 | note:C3 ]", + "[ 0/1 → 1/1 | note:E3 ]", + "[ 0/1 → 1/1 | note:G3 ]", + "[ 0/1 → 1/1 | note:C4 ]", + "[ 1/1 → 2/1 | note:C3 ]", + "[ 1/1 → 2/1 | note:G3 ]", + "[ 1/1 → 2/1 | note:C4 ]", + "[ 1/1 → 2/1 | note:E4 ]", + "[ 1/1 → 2/1 | note:G4 ]", + "[ 2/1 → 3/1 | note:E3 ]", + "[ 2/1 → 3/1 | note:C4 ]", + "[ 2/1 → 3/1 | note:E4 ]", + "[ 2/1 → 3/1 | note:G4 ]", + "[ 2/1 → 3/1 | note:C5 ]", + "[ 3/1 → 4/1 | note:C4 ]", + "[ 3/1 → 4/1 | note:G4 ]", + "[ 3/1 → 4/1 | note:C5 ]", + "[ 3/1 → 4/1 | note:E5 ]", + "[ 3/1 → 4/1 | note:G5 ]", +] +`; + exports[`runs examples > example "apply" example index 0 1`] = ` [ "[ 0/1 → 1/1 | note:C3 ]", @@ -1847,6 +1872,31 @@ exports[`runs examples > example "chop" example index 0 1`] = ` ] `; +exports[`runs examples > example "chord" example index 0 1`] = ` +[ + "[ 0/1 → 1/1 | note:A3 ]", + "[ 0/1 → 1/1 | note:C4 ]", + "[ 0/1 → 1/1 | note:E4 ]", + "[ 0/1 → 1/1 | note:A4 ]", + "[ 0/1 → 1/1 | note:C5 ]", + "[ 1/1 → 2/1 | note:E3 ]", + "[ 1/1 → 2/1 | note:C4 ]", + "[ 1/1 → 2/1 | note:E4 ]", + "[ 1/1 → 2/1 | note:G4 ]", + "[ 1/1 → 2/1 | note:C5 ]", + "[ 2/1 → 3/1 | note:D3 ]", + "[ 2/1 → 3/1 | note:A3 ]", + "[ 2/1 → 3/1 | note:D4 ]", + "[ 2/1 → 3/1 | note:Gb4 ]", + "[ 2/1 → 3/1 | note:A4 ]", + "[ 3/1 → 4/1 | note:F3 ]", + "[ 3/1 → 4/1 | note:C4 ]", + "[ 3/1 → 4/1 | note:F4 ]", + "[ 3/1 → 4/1 | note:A4 ]", + "[ 3/1 → 4/1 | note:C5 ]", +] +`; + exports[`runs examples > example "chorus" example index 0 1`] = ` [ "[ 0/1 → 1/4 | note:d s:sawtooth chorus:0.5 ]", @@ -2739,6 +2789,23 @@ exports[`runs examples > example "detune" example index 0 1`] = ` ] `; +exports[`runs examples > example "dictionary" example index 0 1`] = ` +[ + "[ 0/1 → 1/1 | note:A3 room:0.5 ]", + "[ 0/1 → 1/1 | note:C4 room:0.5 ]", + "[ 0/1 → 1/1 | note:E4 room:0.5 ]", + "[ 1/1 → 2/1 | note:G3 room:0.5 ]", + "[ 1/1 → 2/1 | note:C4 room:0.5 ]", + "[ 1/1 → 2/1 | note:E4 room:0.5 ]", + "[ 2/1 → 3/1 | note:A3 room:0.5 ]", + "[ 2/1 → 3/1 | note:D4 room:0.5 ]", + "[ 2/1 → 3/1 | note:Gb4 room:0.5 ]", + "[ 3/1 → 4/1 | note:A3 room:0.5 ]", + "[ 3/1 → 4/1 | note:C4 room:0.5 ]", + "[ 3/1 → 4/1 | note:F4 room:0.5 ]", +] +`; + exports[`runs examples > example "distort" example index 0 1`] = ` [ "[ 0/1 → 1/8 | s:hh distort:0 ]", @@ -6496,6 +6563,28 @@ exports[`runs examples > example "miditouch" example index 0 1`] = ` ] `; +exports[`runs examples > example "mode" example index 0 1`] = ` +[ + "[ 0/1 → 1/1 | note:E3 ]", + "[ 0/1 → 1/1 | note:C4 ]", + "[ 0/1 → 1/1 | note:E4 ]", + "[ 0/1 → 1/1 | note:G4 ]", + "[ 0/1 → 1/1 | note:C5 ]", + "[ 1/1 → 2/1 | note:C5 ]", + "[ 1/1 → 2/1 | note:G5 ]", + "[ 1/1 → 2/1 | note:C6 ]", + "[ 1/1 → 2/1 | note:E6 ]", + "[ 2/1 → 3/1 | note:E3 ]", + "[ 2/1 → 3/1 | note:C4 ]", + "[ 2/1 → 3/1 | note:E4 ]", + "[ 2/1 → 3/1 | note:G4 ]", + "[ 3/1 → 4/1 | note:C5 ]", + "[ 3/1 → 4/1 | note:G5 ]", + "[ 3/1 → 4/1 | note:C6 ]", + "[ 3/1 → 4/1 | note:E6 ]", +] +`; + exports[`runs examples > example "morph" example index 0 1`] = ` [ "[ 0/1 → 1/8 | s:hh ]", @@ -6814,6 +6903,31 @@ exports[`runs examples > example "octave" example index 0 1`] = ` ] `; +exports[`runs examples > example "octaves" example index 0 1`] = ` +[ + "[ 0/1 → 1/1 | note:A3 ]", + "[ 0/1 → 1/1 | note:C4 ]", + "[ 0/1 → 1/1 | note:E4 ]", + "[ 0/1 → 1/1 | note:A4 ]", + "[ 0/1 → 1/1 | note:C5 ]", + "[ 1/1 → 2/1 | note:E3 ]", + "[ 1/1 → 2/1 | note:C4 ]", + "[ 1/1 → 2/1 | note:E4 ]", + "[ 1/1 → 2/1 | note:G4 ]", + "[ 1/1 → 2/1 | note:C5 ]", + "[ 2/1 → 3/1 | note:D3 ]", + "[ 2/1 → 3/1 | note:A3 ]", + "[ 2/1 → 3/1 | note:D4 ]", + "[ 2/1 → 3/1 | note:Gb4 ]", + "[ 2/1 → 3/1 | note:A4 ]", + "[ 3/1 → 4/1 | note:F3 ]", + "[ 3/1 → 4/1 | note:C4 ]", + "[ 3/1 → 4/1 | note:F4 ]", + "[ 3/1 → 4/1 | note:A4 ]", + "[ 3/1 → 4/1 | note:C5 ]", +] +`; + exports[`runs examples > example "off" example index 0 1`] = ` [ "[ -5/24 ⇜ (0/1 → 1/8) | note:62 ]", @@ -6847,6 +6961,15 @@ exports[`runs examples > example "off" example index 0 1`] = ` ] `; +exports[`runs examples > example "offset" example index 0 1`] = ` +[ + "[ 0/1 → 1/1 | chord:Am offset:0 ]", + "[ 1/1 → 2/1 | chord:C offset:1 ]", + "[ 2/1 → 3/1 | chord:D offset:2 ]", + "[ 3/1 → 4/1 | chord:F offset:3 ]", +] +`; + exports[`runs examples > example "often" example index 0 1`] = ` [ "[ 0/1 → 1/8 | s:hh speed:0.5 ]", From fddf2ff2a76eb04f900f187642e6c2e978d97df9 Mon Sep 17 00:00:00 2001 From: moumar Date: Sun, 26 Oct 2025 14:06:31 +0100 Subject: [PATCH 097/312] Set pattern auto-start to true by default --- website/src/settings.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/src/settings.mjs b/website/src/settings.mjs index bbf893551..ef074b785 100644 --- a/website/src/settings.mjs +++ b/website/src/settings.mjs @@ -96,7 +96,7 @@ export function useSettings() { isPanelOpen: parseBoolean(state.isPanelOpen), userPatterns: userPatterns, multiChannelOrbits: parseBoolean(state.multiChannelOrbits), - patternAutoStart: isUdels() ? false : parseBoolean(state.patternAutoStart) + patternAutoStart: isUdels() ? false : state.patternAutoStart === undefined ? true : parseBoolean(state.patternAutoStart) }; } From fcd83cce5556541c4fcb72e05a2468ef902af157 Mon Sep 17 00:00:00 2001 From: moumar Date: Sun, 26 Oct 2025 14:07:36 +0100 Subject: [PATCH 098/312] Re-evaluate pattern if activated --- website/src/repl/components/panel/PatternsTab.jsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/website/src/repl/components/panel/PatternsTab.jsx b/website/src/repl/components/panel/PatternsTab.jsx index 519461442..38b7294de 100644 --- a/website/src/repl/components/panel/PatternsTab.jsx +++ b/website/src/repl/components/panel/PatternsTab.jsx @@ -133,13 +133,17 @@ function UserPatterns({ context }) {
{/* {patternFilter === patternFilterName.user && ( */} + onClick={(id) => { updateCodeWindow( context, { ...userPatterns[id], collection: userPattern.collection }, patternAutoStart, ) - } + + if (context.started && activePattern === id) { + context.handleEvaluate() + } + }} patterns={userPatterns} started={context.started} activePattern={activePattern} From ee43d85f2983cad68a3dc6ae184560038053bdd4 Mon Sep 17 00:00:00 2001 From: Greg Ervin Date: Sun, 26 Oct 2025 13:31:13 -0500 Subject: [PATCH 099/312] Add stick button mappings to gamepad implementation and improve docs --- packages/gamepad/README.md | 6 ++++++ packages/gamepad/docs/gamepad.mdx | 4 ++++ packages/gamepad/gamepad.mjs | 4 ++++ 3 files changed, 14 insertions(+) diff --git a/packages/gamepad/README.md b/packages/gamepad/README.md index 239353fb7..a84177bc2 100644 --- a/packages/gamepad/README.md +++ b/packages/gamepad/README.md @@ -40,6 +40,12 @@ const pattern = sequence([ - D-Pad - `up`, `down`, `left`, `right` (or `u`, `d`, `l`, `r` or uppercase) - Toggle versions: `tglUp`, `tglDown`, `tglLeft`, `tglRight`(or `tglU`, `tglD`, `tglL`, `tglR`) +- Stick Buttons + - `l3`, `r3` (or `ls`, `rs`) + - Toggle versions: `tglL3`, `tglR3` (or `tglLS`, `tglRS`) +- System Buttons + - `start`, `back` (or uppercase `START`, `BACK`) + - Toggle versions: `tglStart`, `tglBack` (or `tglSTART`, `tglBACK`) ### Analog Sticks - Left Stick diff --git a/packages/gamepad/docs/gamepad.mdx b/packages/gamepad/docs/gamepad.mdx index e2da594ea..5071e3d58 100644 --- a/packages/gamepad/docs/gamepad.mdx +++ b/packages/gamepad/docs/gamepad.mdx @@ -29,6 +29,10 @@ The gamepad module provides access to buttons and analog sticks as normalized si | | Toggle versions: `tglLB`, `tglRB`, `tglLT`, `tglRT` | | D-Pad | `up`, `down`, `left`, `right` (or `u`, `d`, `l`, `r` or uppercase) | | | Toggle versions: `tglUp`, `tglDown`, `tglLeft`, `tglRight` (or `tglU`, `tglD`, `tglL`, `tglR`) | +| Stick Buttons | `l3`, 'r3' (or `ls`, `rs`) | +| | Toggle versions: `tglL3`, 'tglR3' (or `tglLs`, `tglRs`) | +| System Buttons | `start`, `back` (or uppercase `START`, `BACK`) | +| | Toggle versions: `tglStart`, `tglBack` (or `tglSTART`, `tglBACK`) | ### Analog Sticks diff --git a/packages/gamepad/gamepad.mjs b/packages/gamepad/gamepad.mjs index 7667a3620..069c54af1 100644 --- a/packages/gamepad/gamepad.mjs +++ b/packages/gamepad/gamepad.mjs @@ -14,6 +14,10 @@ export const buttonMap = { rt: 7, back: 8, start: 9, + l3: 10, + ls: 10, + r3: 11, + rs: 11, u: 12, up: 12, d: 13, From 484c5e6cddd7426138da77c32da96f63d8172cbc Mon Sep 17 00:00:00 2001 From: "Jade (Rose) Rowland" Date: Sat, 1 Nov 2025 01:26:25 -0400 Subject: [PATCH 100/312] working --- website/src/repl/idbutils.mjs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/website/src/repl/idbutils.mjs b/website/src/repl/idbutils.mjs index d87d649c2..9dfc9faae 100644 --- a/website/src/repl/idbutils.mjs +++ b/website/src/repl/idbutils.mjs @@ -92,11 +92,7 @@ export function registerSamplesFromDB(config = userSamplesDBConfig, onComplete = async function blobToDataUrl(blob) { return new Promise((resolve) => { - var reader = new FileReader(); - reader.onload = function (event) { - resolve(event.target.result); - }; - reader.readAsDataURL(blob); + resolve(URL.createObjectURL(blob)) }); } From f38792c5699c7f00aedcdfddc80c726dc21810de Mon Sep 17 00:00:00 2001 From: "Jade (Rose) Rowland" Date: Sat, 1 Nov 2025 01:32:24 -0400 Subject: [PATCH 101/312] format --- packages/superdough/sampler.mjs | 1 + website/src/repl/idbutils.mjs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/superdough/sampler.mjs b/packages/superdough/sampler.mjs index 3232fa476..7b7a6d3b6 100644 --- a/packages/superdough/sampler.mjs +++ b/packages/superdough/sampler.mjs @@ -349,6 +349,7 @@ export async function onTriggerSample(t, value, onended, bank, resolveUrl) { } function registerSample(key, bank, params) { + console.info({ key, bank }); registerSound(key, (t, hapValue, onended) => onTriggerSample(t, hapValue, onended, bank), { type: 'sample', samples: bank, diff --git a/website/src/repl/idbutils.mjs b/website/src/repl/idbutils.mjs index 9dfc9faae..e1ca3a604 100644 --- a/website/src/repl/idbutils.mjs +++ b/website/src/repl/idbutils.mjs @@ -92,7 +92,7 @@ export function registerSamplesFromDB(config = userSamplesDBConfig, onComplete = async function blobToDataUrl(blob) { return new Promise((resolve) => { - resolve(URL.createObjectURL(blob)) + resolve(URL.createObjectURL(blob)); }); } From a41b07c67a19fd6361c75b2e251f04dcac9c8a91 Mon Sep 17 00:00:00 2001 From: "Jade (Rose) Rowland" Date: Sat, 1 Nov 2025 01:44:32 -0400 Subject: [PATCH 102/312] fixed build --- packages/codemirror/autocomplete.mjs | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/packages/codemirror/autocomplete.mjs b/packages/codemirror/autocomplete.mjs index b8a569bea..fd8ff9e29 100644 --- a/packages/codemirror/autocomplete.mjs +++ b/packages/codemirror/autocomplete.mjs @@ -1,8 +1,9 @@ import jsdoc from '../../doc.json'; import { autocompletion } from '@codemirror/autocomplete'; import { h } from './html'; -import { Scale } from '@tonaljs/tonal'; -import { soundMap } from 'superdough'; +//TODO: fix tonal scale import +// import { Scale } from '@tonaljs/tonal'; +import { soundMap } from '@strudel/webaudio'; import { complex } from '@strudel/tonal'; const escapeHtml = (str) => { @@ -90,13 +91,13 @@ export function bankCompletions() { .map((name) => ({ label: name, type: 'bank' })); } -// Attempt to get all scale names from Tonal -let scaleCompletions = []; -try { - scaleCompletions = (Scale.names ? Scale.names() : []).map((name) => ({ label: name, type: 'scale' })); -} catch (e) { - console.warn('[autocomplete] Could not load scale names from Tonal:', e); -} +// Attempt to get all scale names from Tonal TODO: FIX IMPORT +// let scaleCompletions = []; +// try { +// scaleCompletions = (Scale.names ? Scale.names() : []).map((name) => ({ label: name, type: 'scale' })); +// } catch (e) { +// console.warn('[autocomplete] Could not load scale names from Tonal:', e); +// } // Valid mode values for voicing const modeCompletions = [ From 10bfe32a2d7e4f6e81a8b87c5c24d0cd2fb8a94a Mon Sep 17 00:00:00 2001 From: "Jade (Rose) Rowland" Date: Sat, 1 Nov 2025 01:48:42 -0400 Subject: [PATCH 103/312] rm console --- packages/superdough/sampler.mjs | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/superdough/sampler.mjs b/packages/superdough/sampler.mjs index 9cf96d478..84bac3582 100644 --- a/packages/superdough/sampler.mjs +++ b/packages/superdough/sampler.mjs @@ -347,7 +347,6 @@ export async function onTriggerSample(t, value, onended, bank, resolveUrl) { } function registerSample(key, bank, params) { - console.info({ key, bank }); registerSound(key, (t, hapValue, onended) => onTriggerSample(t, hapValue, onended, bank), { type: 'sample', samples: bank, From 7b928749091f204d23810c2b48e187b87479a237 Mon Sep 17 00:00:00 2001 From: "Jade (Rose) Rowland" Date: Sat, 1 Nov 2025 01:55:05 -0400 Subject: [PATCH 104/312] fix broken array --- packages/codemirror/autocomplete.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/codemirror/autocomplete.mjs b/packages/codemirror/autocomplete.mjs index fd8ff9e29..0e15a41f7 100644 --- a/packages/codemirror/autocomplete.mjs +++ b/packages/codemirror/autocomplete.mjs @@ -92,7 +92,7 @@ export function bankCompletions() { } // Attempt to get all scale names from Tonal TODO: FIX IMPORT -// let scaleCompletions = []; +let scaleCompletions = []; // try { // scaleCompletions = (Scale.names ? Scale.names() : []).map((name) => ({ label: name, type: 'scale' })); // } catch (e) { From 2b575d50b9af222039aa9c42fa466413cbf8dd17 Mon Sep 17 00:00:00 2001 From: "Jade (Rose) Rowland" Date: Sat, 1 Nov 2025 02:39:43 -0400 Subject: [PATCH 105/312] temporarily disable sample autocomplete --- packages/codemirror/autocomplete.mjs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/codemirror/autocomplete.mjs b/packages/codemirror/autocomplete.mjs index 0e15a41f7..9d01f8e9b 100644 --- a/packages/codemirror/autocomplete.mjs +++ b/packages/codemirror/autocomplete.mjs @@ -3,7 +3,8 @@ import { autocompletion } from '@codemirror/autocomplete'; import { h } from './html'; //TODO: fix tonal scale import // import { Scale } from '@tonaljs/tonal'; -import { soundMap } from '@strudel/webaudio'; +// import { soundMap } from '@strudel/webaudio'; +let soundMap = undefined; import { complex } from '@strudel/tonal'; const escapeHtml = (str) => { @@ -80,7 +81,9 @@ const hasExcludedTags = (doc) => ['superdirtOnly', 'noAutocomplete'].some((tag) => doc.tags?.find((t) => t.originalTitle === tag)); export function bankCompletions() { - const soundDict = soundMap.get(); + // TODO: FIX IMPORT + const soundDict = soundMap?.get() ?? {}; + const banks = new Set(); for (const key of Object.keys(soundDict)) { const [bank, suffix] = key.split('_'); @@ -269,7 +272,7 @@ function soundHandler(context) { const inside = text.slice(quoteIdx + 1); const fragMatch = inside.match(SOUND_FRAGMENT_MATCH_REGEX); const fragment = fragMatch ? fragMatch[1] : inside; - const soundNames = Object.keys(soundMap.get()).sort(); + const soundNames = Object.keys(soundMap?.get() ?? {}).sort(); const filteredSounds = soundNames.filter((name) => name.includes(fragment)); let options = filteredSounds.map((name) => ({ label: name, type: 'sound' })); const from = soundContext.to - fragment.length; From 4f046ae88355fb384a1a01d35dd51e2c5fb85457 Mon Sep 17 00:00:00 2001 From: "Jade (Rose) Rowland" Date: Sat, 1 Nov 2025 02:40:40 -0400 Subject: [PATCH 106/312] cf --- packages/codemirror/autocomplete.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/codemirror/autocomplete.mjs b/packages/codemirror/autocomplete.mjs index 9d01f8e9b..20c128188 100644 --- a/packages/codemirror/autocomplete.mjs +++ b/packages/codemirror/autocomplete.mjs @@ -83,7 +83,7 @@ const hasExcludedTags = (doc) => export function bankCompletions() { // TODO: FIX IMPORT const soundDict = soundMap?.get() ?? {}; - + const banks = new Set(); for (const key of Object.keys(soundDict)) { const [bank, suffix] = key.split('_'); From 91e1cc136e1169b1864b784cdbb02b8e29e14cb5 Mon Sep 17 00:00:00 2001 From: "Jade (Rose) Rowland" Date: Sat, 1 Nov 2025 23:34:10 -0400 Subject: [PATCH 107/312] working --- packages/midi/midi.mjs | 101 +++++++++++++++++++------------- packages/superdough/helpers.mjs | 5 ++ 2 files changed, 64 insertions(+), 42 deletions(-) diff --git a/packages/midi/midi.mjs b/packages/midi/midi.mjs index ae983d200..32f030125 100644 --- a/packages/midi/midi.mjs +++ b/packages/midi/midi.mjs @@ -5,9 +5,10 @@ This program is free software: you can redistribute it and/or modify it under th */ import * as _WebMidi from 'webmidi'; -import { Pattern, getEventOffsetMs, isPattern, logger, ref } from '@strudel/core'; +import { Pattern, isPattern, logger, ref } from '@strudel/core'; import { noteToMidi, getControlName } from '@strudel/core'; import { Note } from 'webmidi'; +import { scheduleAtTime } from '../superdough/helpers.mjs'; // if you use WebMidi from outside of this package, make sure to import that instance: export const { WebMidi } = _WebMidi; @@ -190,7 +191,7 @@ function mapCC(mapping, value) { } // sends a cc message to the given device on the given channel -function sendCC(ccn, ccv, device, midichan, timeOffsetString) { +function sendCC(ccn, ccv, device, midichan, targetTime) { if (typeof ccv !== 'number' || ccv < 0 || ccv > 1) { throw new Error('expected ccv to be a number between 0 and 1'); } @@ -198,19 +199,23 @@ function sendCC(ccn, ccv, device, midichan, timeOffsetString) { throw new Error('expected ccn to be a number or a string'); } const scaled = Math.round(ccv * 127); - device.sendControlChange(ccn, scaled, midichan, { time: timeOffsetString }); + scheduleAtTime(() => { + device.sendControlChange(ccn, scaled, midichan); + }, targetTime); } // sends a program change message to the given device on the given channel -function sendProgramChange(progNum, device, midichan, timeOffsetString) { +function sendProgramChange(progNum, device, midichan, targetTime) { if (typeof progNum !== 'number' || progNum < 0 || progNum > 127) { throw new Error('expected progNum (program change) to be a number between 0 and 127'); } - device.sendProgramChange(progNum, midichan, { time: timeOffsetString }); + scheduleAtTime(() => { + device.sendProgramChange(progNum, midichan); + }, targetTime); } // sends a sysex message to the given device on the given channel -function sendSysex(sysexid, sysexdata, device, timeOffsetString) { +function sendSysex(sysexid, sysexdata, device, targetTime) { if (Array.isArray(sysexid)) { if (!sysexid.every((byte) => Number.isInteger(byte) && byte >= 0 && byte <= 255)) { throw new Error('all sysexid bytes must be integers between 0 and 255'); @@ -225,11 +230,13 @@ function sendSysex(sysexid, sysexdata, device, timeOffsetString) { if (!sysexdata.every((byte) => Number.isInteger(byte) && byte >= 0 && byte <= 255)) { throw new Error('all sysex bytes must be integers between 0 and 255'); } - device.sendSysex(sysexid, sysexdata, { time: timeOffsetString }); + scheduleAtTime(() => { + device.sendSysex(sysexid, sysexdata); + }, targetTime); } // sends a NRPN message to the given device on the given channel -function sendNRPN(nrpnn, nrpv, device, midichan, timeOffsetString) { +function sendNRPN(nrpnn, nrpv, device, midichan, targetTime) { if (Array.isArray(nrpnn)) { if (!nrpnn.every((byte) => Number.isInteger(byte) && byte >= 0 && byte <= 255)) { throw new Error('all nrpnn bytes must be integers between 0 and 255'); @@ -237,28 +244,34 @@ function sendNRPN(nrpnn, nrpv, device, midichan, timeOffsetString) { } else if (!Number.isInteger(nrpv) || nrpv < 0 || nrpv > 255) { throw new Error('A:sysexid must be an number between 0 and 255 or an array of such integers'); } - - device.sendNRPN(nrpnn, nrpv, midichan, { time: timeOffsetString }); + scheduleAtTime(() => { + device.sendNRPN(nrpnn, nrpv, midichan); + }, targetTime); } // sends a pitch bend message to the given device on the given channel -function sendPitchBend(midibend, device, midichan, timeOffsetString) { +function sendPitchBend(midibend, device, midichan, targetTime) { if (typeof midibend !== 'number' || midibend < -1 || midibend > 1) { throw new Error('expected midibend to be a number between -1 and 1'); } - device.sendPitchBend(midibend, midichan, { time: timeOffsetString }); + scheduleAtTime(() => { + device.sendPitchBend(midibend, midichan); + }, targetTime); } // sends a channel aftertouch message to the given device on the given channel -function sendAftertouch(miditouch, device, midichan, timeOffsetString) { +function sendAftertouch(miditouch, device, midichan, targetTime) { if (typeof miditouch !== 'number' || miditouch < 0 || miditouch > 1) { throw new Error('expected miditouch to be a number between 0 and 1'); } - device.sendChannelAftertouch(miditouch, midichan, { time: timeOffsetString }); + + scheduleAtTime(() => { + device.sendChannelAftertouch(miditouch, midichan); + }, targetTime); } // sends a note message to the given device on the given channel -function sendNote(note, velocity, duration, device, midichan, timeOffsetString) { +function sendNote(note, velocity, duration, device, midichan, targetTime) { if (note == null || note === '') { throw new Error('note cannot be null or empty'); } @@ -268,12 +281,12 @@ function sendNote(note, velocity, duration, device, midichan, timeOffsetString) if (duration != null && (typeof duration !== 'number' || duration < 0)) { throw new Error('duration must be a positive number'); } - const midiNumber = typeof note === 'number' ? note : noteToMidi(note); const midiNote = new Note(midiNumber, { attack: velocity, duration }); - device.playNote(midiNote, midichan, { - time: timeOffsetString, - }); + + scheduleAtTime(() => { + device.playNote(midiNote, midichan); + }, targetTime); } /** @@ -309,7 +322,6 @@ Pattern.prototype.midi = function (midiport, options = {}) { let midiConfig = { // Default configuration values isController: false, // Disable sending notes for midi controllers - latencyMs: 34, // Default latency to get audio engine to line up in ms noteOffsetMs: 10, // Default note-off offset to prevent glitching in ms midichannel: 1, // Default MIDI channel velocity: 0.9, // Default velocity @@ -333,18 +345,13 @@ Pattern.prototype.midi = function (midiport, options = {}) { logger(`Midi device disconnected! Available: ${getMidiDeviceNamesString(outputs)}`), }); - return this.onTrigger((hap, currentTime, cps, targetTime) => { + return this.onTrigger((hap, _currentTime, cps, targetTime) => { if (!WebMidi.enabled) { logger('Midi not enabled'); return; } hap.ensureObjectValue(); - //magic number to get audio engine to line up, can probably be calculated somehow - const latencyMs = midiConfig.latencyMs; - // passing a string with a +num into the webmidi api adds an offset to the current time https://webmidijs.org/api/classes/Output - const timeOffsetString = `+${getEventOffsetMs(targetTime, currentTime) + latencyMs}`; - // midi event values from hap with configurable defaults let { note, @@ -380,7 +387,7 @@ Pattern.prototype.midi = function (midiport, options = {}) { // if midimap is set, send a cc messages from defined controls if (midicontrolMap.has(midimap)) { const ccs = mapCC(midicontrolMap.get(midimap), hap.value); - ccs.forEach(({ ccn, ccv }) => sendCC(ccn, ccv, device, midichan, timeOffsetString)); + ccs.forEach(({ ccn, ccv }) => sendCC(ccn, ccv, device, midichan, targetTime)); } else if (midimap !== 'default') { // Add warning when a non-existent midimap is specified logger(`[midi] midimap "${midimap}" not found! Available maps: ${[...midicontrolMap.keys()].join(', ')}`); @@ -392,12 +399,12 @@ Pattern.prototype.midi = function (midiport, options = {}) { // try to prevent glitching by subtracting noteOffsetMs from the duration length const duration = (hap.duration.valueOf() / cps) * 1000 - midiConfig.noteOffsetMs; - sendNote(note, velocity, duration, device, midichan, timeOffsetString); + sendNote(note, velocity, duration, device, midichan, targetTime); } // Handle program change if (progNum !== undefined) { - sendProgramChange(progNum, device, midichan, timeOffsetString); + sendProgramChange(progNum, device, midichan, targetTime); } // Handle sysex @@ -407,53 +414,63 @@ Pattern.prototype.midi = function (midiport, options = {}) { // if sysexid is an array the first byte is 0x00 if (sysexid !== undefined && sysexdata !== undefined) { - sendSysex(sysexid, sysexdata, device, timeOffsetString); + sendSysex(sysexid, sysexdata, device, targetTime); } // Handle control change if (ccv !== undefined && ccn !== undefined) { - sendCC(ccn, ccv, device, midichan, timeOffsetString); + sendCC(ccn, ccv, device, midichan, targetTime); } // Handle NRPN non-registered parameter number if (nrpnn !== undefined && nrpv !== undefined) { - sendNRPN(nrpnn, nrpv, device, midichan, timeOffsetString); + sendNRPN(nrpnn, nrpv, device, midichan, targetTime); } // Handle midibend if (midibend !== undefined) { - sendPitchBend(midibend, device, midichan, timeOffsetString); + sendPitchBend(midibend, device, midichan, targetTime); } // Handle miditouch if (miditouch !== undefined) { - sendAftertouch(miditouch, device, midichan, timeOffsetString); + sendAftertouch(miditouch, device, midichan, targetTime); } // Handle midicmd if (hap.whole.begin + 0 === 0) { // we need to start here because we have the timing info - device.sendStart({ time: timeOffsetString }); + scheduleAtTime(() => { + device.sendStart(); + }, targetTime); } if (['clock', 'midiClock'].includes(midicmd)) { - device.sendClock({ time: timeOffsetString }); + scheduleAtTime(() => { + device.sendClock(); + }, targetTime); } else if (['start'].includes(midicmd)) { - device.sendStart({ time: timeOffsetString }); + scheduleAtTime(() => { + device.sendStart(); + }, targetTime); } else if (['stop'].includes(midicmd)) { - device.sendStop({ time: timeOffsetString }); + scheduleAtTime(() => { + device.sendStop(); + }, targetTime); } else if (['continue'].includes(midicmd)) { - device.sendContinue({ time: timeOffsetString }); + scheduleAtTime(() => { + device.sendContinue(); + }, targetTime); } else if (Array.isArray(midicmd)) { if (midicmd[0] === 'progNum') { - sendProgramChange(midicmd[1], device, midichan, timeOffsetString); + sendProgramChange(midicmd[1], device, midichan, targetTime); } else if (midicmd[0] === 'cc') { if (midicmd.length === 2) { - sendCC(midicmd[0], midicmd[1] / 127, device, midichan, timeOffsetString); + sendCC(midicmd[0], midicmd[1] / 127, device, midichan, targetTime); } } else if (midicmd[0] === 'sysex') { if (midicmd.length === 3) { const [_, id, data] = midicmd; - sendSysex(id, data, device, timeOffsetString); + sendSysex(id, data, device, targetTime); } } } diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index a471da9dd..b06f584a0 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -280,6 +280,11 @@ export function getVibratoOscillator(param, value, t) { return vibratoOscillator; } } + +export function scheduleAtTime(callback, targetTime, audioContext = getAudioContext()) { + const currentTime = audioContext.currentTime; + webAudioTimeout(audioContext, callback, currentTime, targetTime); +} // ConstantSource inherits AudioScheduledSourceNode, which has scheduling abilities // a bit of a hack, but it works very well :) export function webAudioTimeout(audioContext, onComplete, startTime, stopTime) { From bc1c83ed64243831dc6e612c9aa7cf63d52c8a7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dami=C3=A1n=20Silvani?= Date: Sun, 2 Nov 2025 09:21:25 -0300 Subject: [PATCH 108/312] fix: Add missing vite.config.js to supradough package --- packages/supradough/vite.config.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 packages/supradough/vite.config.js diff --git a/packages/supradough/vite.config.js b/packages/supradough/vite.config.js new file mode 100644 index 000000000..deb488e3e --- /dev/null +++ b/packages/supradough/vite.config.js @@ -0,0 +1,16 @@ +import { defineConfig } from 'vite'; +import { resolve } from 'path'; +import bundleAudioWorkletPlugin from 'vite-plugin-bundle-audioworklet'; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [bundleAudioWorkletPlugin()], + build: { + lib: { + entry: resolve(__dirname, 'index.mjs'), + formats: ['es'], + fileName: (ext) => ({ es: 'index.mjs' })[ext], + }, + target: 'esnext', + }, +}); From 404d9999f30be56d5cf454423dc4200796b9bfab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dami=C3=A1n=20Silvani?= Date: Sun, 2 Nov 2025 09:21:40 -0300 Subject: [PATCH 109/312] fix: Update github.com links --- packages/supradough/package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/supradough/package.json b/packages/supradough/package.json index 503043718..7611a9b58 100644 --- a/packages/supradough/package.json +++ b/packages/supradough/package.json @@ -13,7 +13,7 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/tidalcycles/strudel.git" + "url": "git+https://codeberg.org/uzu/strudel.git" }, "keywords": [ "tidalcycles", @@ -25,9 +25,9 @@ "author": "Felix Roos ", "license": "AGPL-3.0-or-later", "bugs": { - "url": "https://github.com/tidalcycles/strudel/issues" + "url": "https://codeberg.org/uzu/strudel/issues" }, - "homepage": "https://github.com/tidalcycles/strudel#readme", + "homepage": "https://codeberg.org/uzu/strudel#readme", "devDependencies": { "vite": "^6.0.11", "vite-plugin-bundle-audioworklet": "workspace:*", From 809eb7132c43cb4ea6e7c22511f9d314bd403498 Mon Sep 17 00:00:00 2001 From: moumar Date: Sun, 2 Nov 2025 15:20:31 +0100 Subject: [PATCH 110/312] codeformat --- website/src/repl/components/panel/PatternsTab.jsx | 14 +++----------- website/src/repl/components/panel/SettingsTab.jsx | 2 +- website/src/settings.mjs | 6 +++++- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/website/src/repl/components/panel/PatternsTab.jsx b/website/src/repl/components/panel/PatternsTab.jsx index 38b7294de..5e0d50e72 100644 --- a/website/src/repl/components/panel/PatternsTab.jsx +++ b/website/src/repl/components/panel/PatternsTab.jsx @@ -134,14 +134,10 @@ function UserPatterns({ context }) { {/* {patternFilter === patternFilterName.user && ( */} { - updateCodeWindow( - context, - { ...userPatterns[id], collection: userPattern.collection }, - patternAutoStart, - ) + updateCodeWindow(context, { ...userPatterns[id], collection: userPattern.collection }, patternAutoStart); if (context.started && activePattern === id) { - context.handleEvaluate() + context.handleEvaluate(); } }} patterns={userPatterns} @@ -197,11 +193,7 @@ function FeaturedPatterns({ context }) { context={context} initialPage={featuredPageNum} patternOnClick={(id) => { - updateCodeWindow( - context, - { ...patterns[id], collection: patternFilterName.featured }, - patternAutoStart, - ); + updateCodeWindow(context, { ...patterns[id], collection: patternFilterName.featured }, patternAutoStart); }} paginationOnChange={async (pageNum) => { await loadAndSetFeaturedPatterns(pageNum - 1); diff --git a/website/src/repl/components/panel/SettingsTab.jsx b/website/src/repl/components/panel/SettingsTab.jsx index c898609d2..85991f55c 100644 --- a/website/src/repl/components/panel/SettingsTab.jsx +++ b/website/src/repl/components/panel/SettingsTab.jsx @@ -112,7 +112,7 @@ export function SettingsTab({ started }) { multiChannelOrbits, isTabIndentationEnabled, isMultiCursorEnabled, - patternAutoStart + patternAutoStart, } = useSettings(); const shouldAlwaysSync = isUdels(); const canChangeAudioDevice = AudioContext.prototype.setSinkId != null; diff --git a/website/src/settings.mjs b/website/src/settings.mjs index ef074b785..7c62b0ded 100644 --- a/website/src/settings.mjs +++ b/website/src/settings.mjs @@ -96,7 +96,11 @@ export function useSettings() { isPanelOpen: parseBoolean(state.isPanelOpen), userPatterns: userPatterns, multiChannelOrbits: parseBoolean(state.multiChannelOrbits), - patternAutoStart: isUdels() ? false : state.patternAutoStart === undefined ? true : parseBoolean(state.patternAutoStart) + patternAutoStart: isUdels() + ? false + : state.patternAutoStart === undefined + ? true + : parseBoolean(state.patternAutoStart), }; } From 4df2cc30867b5ad4c4cf602028654768c8d4b3b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20=C5=BD=C3=A1ra?= Date: Mon, 3 Nov 2025 22:03:39 +0100 Subject: [PATCH 111/312] added docs for spaces in scale names --- packages/tonal/tonal.mjs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/tonal/tonal.mjs b/packages/tonal/tonal.mjs index 0dc468b20..427a66f4c 100644 --- a/packages/tonal/tonal.mjs +++ b/packages/tonal/tonal.mjs @@ -229,6 +229,9 @@ function _getNearestScaleNote(scaleName, note, preferHigher = true) { * * A scale consists of a root note (e.g. `c4`, `c`, `f#`, `bb4`) followed by semicolon (':') and then a [scale type](https://github.com/tonaljs/tonal/blob/main/packages/scale-type/data.ts). * + * The scale name must be written without spaces (because it would be interpreted as a multi-step pattern otherwise). + * If your scale name includes spaces, replace them with colons. + * * The root note defaults to octave 3, if no octave number is given. * * @name scale @@ -250,6 +253,8 @@ function _getNearestScaleNote(scaleName, note, preferHigher = true) { * .s("piano") * @example * note("C1*16").transpose(irand(36)).scale('Cb2 major').scaleTranspose(3) + * @example + * n("[0 0] [1 2] [3 4] [5 6]").scale("C:major:blues") */ export const scale = register( 'scale', From 247bf9b930a265a7e654f87a8f93a5b1eab10db7 Mon Sep 17 00:00:00 2001 From: Alex Victoria Date: Tue, 4 Nov 2025 20:36:25 -0600 Subject: [PATCH 112/312] fix for node 24 support #1718 --- .nvmrc | 1 + README.md | 2 +- examples/codemirror-repl/package.json | 3 + examples/headless-repl/package.json | 3 + examples/minimal-repl/package.json | 3 + examples/superdough/package.json | 3 + examples/tidal-repl/package.json | 3 + package.json | 5 +- packages/codemirror/package.json | 3 + packages/core/package.json | 3 + packages/csound/package.json | 3 + packages/desktopbridge/package.json | 5 +- packages/draw/package.json | 3 + packages/embed/package.json | 5 +- packages/gamepad/package.json | 3 + packages/hs2js/package.json | 3 + packages/hydra/package.json | 3 + packages/midi/package.json | 3 + packages/mini/package.json | 3 + packages/mondo/package.json | 3 + packages/mondough/package.json | 3 + packages/motion/package.json | 3 + packages/mqtt/package.json | 3 + packages/osc/package.json | 3 + packages/reference/package.json | 3 + packages/repl/package.json | 3 + packages/sampler/package.json | 3 + packages/serial/package.json | 3 + packages/soundfonts/package.json | 3 + packages/superdough/package.json | 3 + packages/supradough/package.json | 3 + packages/tidal/package.json | 3 + packages/tonal/package.json | 3 + packages/transpiler/package.json | 3 + .../package.json | 3 + packages/web/package.json | 3 + packages/webaudio/package.json | 3 + packages/xen/package.json | 3 + test/__snapshots__/tunes.test.mjs.snap | 12672 ++++++++-------- test/tunes.test.mjs | 16 +- tools/dbpatch/package.json | 3 + website/package.json | 3 + 42 files changed, 6470 insertions(+), 6341 deletions(-) create mode 100644 .nvmrc diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 000000000..2bd5a0a98 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +22 diff --git a/README.md b/README.md index baaac82b2..779769d57 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ https://strudel.cc/ After cloning the project, you can run the REPL locally: -1. Install [Node.js](https://nodejs.org/) +1. Install [Node.js](https://nodejs.org/) 18 or newer 2. Install [pnpm](https://pnpm.io/installation) 3. Install dependencies by running the following command: ```bash diff --git a/examples/codemirror-repl/package.json b/examples/codemirror-repl/package.json index e0ce35b8a..0a65eb71c 100644 --- a/examples/codemirror-repl/package.json +++ b/examples/codemirror-repl/package.json @@ -20,5 +20,8 @@ "@strudel/tonal": "workspace:*", "@strudel/transpiler": "workspace:*", "@strudel/webaudio": "workspace:*" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/examples/headless-repl/package.json b/examples/headless-repl/package.json index 0a2941797..b3e62971c 100644 --- a/examples/headless-repl/package.json +++ b/examples/headless-repl/package.json @@ -14,5 +14,8 @@ }, "dependencies": { "@strudel/web": "workspace:*" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/examples/minimal-repl/package.json b/examples/minimal-repl/package.json index 8f904c61c..a2e37123e 100644 --- a/examples/minimal-repl/package.json +++ b/examples/minimal-repl/package.json @@ -18,5 +18,8 @@ "@strudel/transpiler": "workspace:*", "@strudel/webaudio": "workspace:*", "@strudel/tonal": "workspace:*" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/examples/superdough/package.json b/examples/superdough/package.json index eb5d8e9fd..aaa021c1d 100644 --- a/examples/superdough/package.json +++ b/examples/superdough/package.json @@ -13,5 +13,8 @@ }, "devDependencies": { "vite": "^6.0.11" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/examples/tidal-repl/package.json b/examples/tidal-repl/package.json index 21c8ee177..5b18c6de1 100644 --- a/examples/tidal-repl/package.json +++ b/examples/tidal-repl/package.json @@ -32,5 +32,8 @@ }, "devDependencies": { "vite": "^6.0.11" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/package.json b/package.json index d18291eb2..b74c85753 100644 --- a/package.json +++ b/package.json @@ -73,5 +73,8 @@ "prettier": "^3.4.2", "vitest": "^3.0.4", "vite-plugin-bundle-audioworklet": "workspace:*" + }, + "engines": { + "node": ">=18.0.0" } -} \ No newline at end of file +} diff --git a/packages/codemirror/package.json b/packages/codemirror/package.json index e54c4a428..a3735491f 100644 --- a/packages/codemirror/package.json +++ b/packages/codemirror/package.json @@ -54,5 +54,8 @@ }, "devDependencies": { "vite": "^6.0.11" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/packages/core/package.json b/packages/core/package.json index c33432f14..fa0761039 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -37,5 +37,8 @@ "devDependencies": { "vite": "^6.0.11", "vitest": "^3.0.4" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/packages/csound/package.json b/packages/csound/package.json index 058b8d774..762131d65 100644 --- a/packages/csound/package.json +++ b/packages/csound/package.json @@ -38,5 +38,8 @@ }, "devDependencies": { "vite": "^6.0.11" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/packages/desktopbridge/package.json b/packages/desktopbridge/package.json index a01ec1f8a..a7352d6b0 100644 --- a/packages/desktopbridge/package.json +++ b/packages/desktopbridge/package.json @@ -25,5 +25,8 @@ "@strudel/core": "workspace:*", "@tauri-apps/api": "^2.2.0" }, - "homepage": "https://codeberg.org/uzu/strudel#readme" + "homepage": "https://codeberg.org/uzu/strudel#readme", + "engines": { + "node": ">=18.0.0" + } } diff --git a/packages/draw/package.json b/packages/draw/package.json index ac2123985..b0af8418b 100644 --- a/packages/draw/package.json +++ b/packages/draw/package.json @@ -33,5 +33,8 @@ }, "devDependencies": { "vite": "^6.0.11" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/packages/embed/package.json b/packages/embed/package.json index 6a00ee904..ffafdc8bc 100644 --- a/packages/embed/package.json +++ b/packages/embed/package.json @@ -20,5 +20,8 @@ "bugs": { "url": "https://codeberg.org/uzu/strudel/issues" }, - "homepage": "https://codeberg.org/uzu/strudel#readme" + "homepage": "https://codeberg.org/uzu/strudel#readme", + "engines": { + "node": ">=18.0.0" + } } diff --git a/packages/gamepad/package.json b/packages/gamepad/package.json index 8605e35cd..6a07df968 100644 --- a/packages/gamepad/package.json +++ b/packages/gamepad/package.json @@ -33,5 +33,8 @@ }, "devDependencies": { "vite": "^6.0.11" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/packages/hs2js/package.json b/packages/hs2js/package.json index c0bf8fa8c..e8d698601 100644 --- a/packages/hs2js/package.json +++ b/packages/hs2js/package.json @@ -34,5 +34,8 @@ "devDependencies": { "tree-sitter-haskell": "^0.23.1", "vite": "^6.0.11" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/packages/hydra/package.json b/packages/hydra/package.json index eccdde52f..16d6f0f4c 100644 --- a/packages/hydra/package.json +++ b/packages/hydra/package.json @@ -40,5 +40,8 @@ "devDependencies": { "pkg": "^5.8.1", "vite": "^6.0.11" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/packages/midi/package.json b/packages/midi/package.json index ebb07fc3a..11fe9a3f7 100644 --- a/packages/midi/package.json +++ b/packages/midi/package.json @@ -35,5 +35,8 @@ }, "devDependencies": { "vite": "^6.0.11" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/packages/mini/package.json b/packages/mini/package.json index 05bbd019b..b9a50fb60 100644 --- a/packages/mini/package.json +++ b/packages/mini/package.json @@ -38,5 +38,8 @@ "peggy": "^4.2.0", "vite": "^6.0.11", "vitest": "^3.0.4" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/packages/mondo/package.json b/packages/mondo/package.json index a59bfc344..ebdbd329a 100644 --- a/packages/mondo/package.json +++ b/packages/mondo/package.json @@ -33,5 +33,8 @@ "devDependencies": { "vite": "^6.0.11", "vitest": "^3.0.4" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/packages/mondough/package.json b/packages/mondough/package.json index 593d2264a..9b170fde5 100644 --- a/packages/mondough/package.json +++ b/packages/mondough/package.json @@ -40,5 +40,8 @@ "mondo": "*", "vite": "^6.0.11", "vitest": "^3.0.4" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/packages/motion/package.json b/packages/motion/package.json index b0a4d5565..fd1fae890 100644 --- a/packages/motion/package.json +++ b/packages/motion/package.json @@ -33,5 +33,8 @@ }, "devDependencies": { "vite": "^6.0.11" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/packages/mqtt/package.json b/packages/mqtt/package.json index 1b34a4eae..492d915d5 100644 --- a/packages/mqtt/package.json +++ b/packages/mqtt/package.json @@ -34,5 +34,8 @@ }, "devDependencies": { "vite": "^6.0.11" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/packages/osc/package.json b/packages/osc/package.json index 173b76744..00faffbd0 100644 --- a/packages/osc/package.json +++ b/packages/osc/package.json @@ -44,5 +44,8 @@ "devDependencies": { "pkg": "^5.8.1", "vite": "^6.0.11" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/packages/reference/package.json b/packages/reference/package.json index 634057e4c..6d1fa1807 100644 --- a/packages/reference/package.json +++ b/packages/reference/package.json @@ -33,5 +33,8 @@ "homepage": "https://codeberg.org/uzu/strudel#readme", "devDependencies": { "vite": "^6.0.11" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/packages/repl/package.json b/packages/repl/package.json index 1ad173c61..e5216316e 100644 --- a/packages/repl/package.json +++ b/packages/repl/package.json @@ -48,5 +48,8 @@ "@rollup/plugin-replace": "^6.0.2", "vite": "^6.0.11", "vite-plugin-bundle-audioworklet": "workspace:*" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/packages/sampler/package.json b/packages/sampler/package.json index 2bf0607b1..b9ea4c2a1 100644 --- a/packages/sampler/package.json +++ b/packages/sampler/package.json @@ -15,5 +15,8 @@ "type": "module", "dependencies": { "cowsay": "^1.6.0" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/packages/serial/package.json b/packages/serial/package.json index d73b05a1c..9dc6c8999 100644 --- a/packages/serial/package.json +++ b/packages/serial/package.json @@ -33,5 +33,8 @@ }, "devDependencies": { "vite": "^6.0.11" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/packages/soundfonts/package.json b/packages/soundfonts/package.json index 8c41a5d50..9bf0c4006 100644 --- a/packages/soundfonts/package.json +++ b/packages/soundfonts/package.json @@ -37,5 +37,8 @@ "devDependencies": { "node-fetch": "^3.3.2", "vite": "^6.0.11" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/packages/superdough/package.json b/packages/superdough/package.json index a95fc5ed0..36201297a 100644 --- a/packages/superdough/package.json +++ b/packages/superdough/package.json @@ -37,5 +37,8 @@ }, "dependencies": { "nanostores": "^0.11.3" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/packages/supradough/package.json b/packages/supradough/package.json index 503043718..87d4a56c3 100644 --- a/packages/supradough/package.json +++ b/packages/supradough/package.json @@ -32,5 +32,8 @@ "vite": "^6.0.11", "vite-plugin-bundle-audioworklet": "workspace:*", "wav-encoder": "^1.3.0" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/packages/tidal/package.json b/packages/tidal/package.json index 960b09001..bd299b397 100644 --- a/packages/tidal/package.json +++ b/packages/tidal/package.json @@ -25,5 +25,8 @@ }, "devDependencies": { "vite": "^6.0.11" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/packages/tonal/package.json b/packages/tonal/package.json index 611df6766..14ffabc7b 100644 --- a/packages/tonal/package.json +++ b/packages/tonal/package.json @@ -38,5 +38,8 @@ "devDependencies": { "vite": "^6.0.11", "vitest": "^3.0.4" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/packages/transpiler/package.json b/packages/transpiler/package.json index bd28a19f4..513550442 100644 --- a/packages/transpiler/package.json +++ b/packages/transpiler/package.json @@ -39,5 +39,8 @@ "devDependencies": { "vite": "^6.0.11", "vitest": "^3.0.4" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/packages/vite-plugin-bundle-audioworklet/package.json b/packages/vite-plugin-bundle-audioworklet/package.json index f803ae065..198a4f9cf 100644 --- a/packages/vite-plugin-bundle-audioworklet/package.json +++ b/packages/vite-plugin-bundle-audioworklet/package.json @@ -12,5 +12,8 @@ "type": "module", "devDependencies": { "vite": "^6.0.11" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/packages/web/package.json b/packages/web/package.json index aef044c79..f02d86139 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -43,5 +43,8 @@ "@rollup/plugin-replace": "^6.0.2", "vite": "^6.0.11", "vite-plugin-bundle-audioworklet": "workspace:*" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/packages/webaudio/package.json b/packages/webaudio/package.json index 2d5cd420c..f0bc4043f 100644 --- a/packages/webaudio/package.json +++ b/packages/webaudio/package.json @@ -40,5 +40,8 @@ }, "devDependencies": { "vite": "^6.0.11" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/packages/xen/package.json b/packages/xen/package.json index 4015c437d..c178c5de4 100644 --- a/packages/xen/package.json +++ b/packages/xen/package.json @@ -35,5 +35,8 @@ "devDependencies": { "vite": "^6.0.11", "vitest": "^3.0.4" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/test/__snapshots__/tunes.test.mjs.snap b/test/__snapshots__/tunes.test.mjs.snap index 4a0ddd539..fc77616c4 100644 --- a/test/__snapshots__/tunes.test.mjs.snap +++ b/test/__snapshots__/tunes.test.mjs.snap @@ -7,12 +7,12 @@ exports[`renders tunes > tune: amensister 1`] = ` "[ 1/16 → 1/8 | s:breath room:1 shape:0.6 begin:0.875 end:0.9375 ]", "[ 1/8 → 3/16 | s:breath room:1 shape:0.6 begin:0.8125 end:0.875 ]", "[ 1/8 → 1/4 | n:0 s:amencutup room:0.5 ]", - "[ 1/8 → 1/4 | note:G1 s:sawtooth gain:0.4 decay:0.1 sustain:0 lpattack:0.1 lpenv:-4 resonance:10 cutoff:300.0522648640107 ]", - "[ 1/8 → 1/4 | note:G1 s:sawtooth gain:0.4 decay:0.1 sustain:0 lpattack:0.1 lpenv:-4 resonance:10 cutoff:300.0522648640107 ]", + "[ 1/8 → 1/4 | note:G1 s:sawtooth gain:0.4 decay:0.1 sustain:0 lpattack:0.1 lpenv:-4 resonance:10 cutoff:300.052264864011 ]", + "[ 1/8 → 1/4 | note:G1 s:sawtooth gain:0.4 decay:0.1 sustain:0 lpattack:0.1 lpenv:-4 resonance:10 cutoff:300.052264864011 ]", "[ 3/16 → 1/4 | s:breath room:1 shape:0.6 begin:0.75 end:0.8125 ]", "[ 1/4 → 5/16 | s:breath room:1 shape:0.6 begin:0.6875 end:0.75 ]", - "[ 1/4 → 3/8 | note:A1 s:sawtooth gain:0.4 decay:0.1 sustain:0 lpattack:0.1 lpenv:-4 resonance:10 cutoff:300.4082736884894 ]", - "[ 1/4 → 3/8 | note:A1 s:sawtooth gain:0.4 decay:0.1 sustain:0 lpattack:0.1 lpenv:-4 resonance:10 cutoff:300.4082736884894 ]", + "[ 1/4 → 3/8 | note:A1 s:sawtooth gain:0.4 decay:0.1 sustain:0 lpattack:0.1 lpenv:-4 resonance:10 cutoff:300.408273688489 ]", + "[ 1/4 → 3/8 | note:A1 s:sawtooth gain:0.4 decay:0.1 sustain:0 lpattack:0.1 lpenv:-4 resonance:10 cutoff:300.408273688489 ]", "[ 1/4 → 1/2 | n:1 s:amencutup room:0.5 ]", "[ 5/16 → 3/8 | s:breath room:1 shape:0.6 begin:0.625 end:0.6875 ]", "[ 3/8 → 7/16 | s:breath room:1 shape:0.6 begin:0.5625 end:0.625 ]", @@ -27,231 +27,231 @@ exports[`renders tunes > tune: amensister 1`] = ` "[ 11/16 → 3/4 | s:breath room:1 shape:0.6 begin:0.25 end:0.3125 ]", "[ 3/4 → 13/16 | s:breath room:1 shape:0.6 begin:0.1875 end:0.25 ]", "[ 3/4 → 7/8 | n:3 s:amencutup room:0.5 ]", - "[ 3/4 → 7/8 | note:34 s:sawtooth gain:0.4 decay:0.1 sustain:0 lpattack:0.1 lpenv:-4 resonance:10 cutoff:309.9939679933326 ]", - "[ 3/4 → 7/8 | note:34 s:sawtooth gain:0.4 decay:0.1 sustain:0 lpattack:0.1 lpenv:-4 resonance:10 cutoff:309.9939679933326 ]", + "[ 3/4 → 7/8 | note:34 s:sawtooth gain:0.4 decay:0.1 sustain:0 lpattack:0.1 lpenv:-4 resonance:10 cutoff:309.993967993333 ]", + "[ 3/4 → 7/8 | note:34 s:sawtooth gain:0.4 decay:0.1 sustain:0 lpattack:0.1 lpenv:-4 resonance:10 cutoff:309.993967993333 ]", "[ 13/16 → 7/8 | s:breath room:1 shape:0.6 begin:0.125 end:0.1875 ]", "[ 7/8 → 15/16 | s:breath room:1 shape:0.6 begin:0.0625 end:0.125 ]", "[ 7/8 → 1/1 | n:3 delay:0.5 s:amencutup room:0.5 ]", - "[ 7/8 → 1/1 | note:C1 s:sawtooth gain:0.4 decay:0.1 sustain:0 lpattack:0.1 lpenv:-4 resonance:10 cutoff:315.47482330436543 ]", - "[ 7/8 → 1/1 | note:C1 s:sawtooth gain:0.4 decay:0.1 sustain:0 lpattack:0.1 lpenv:-4 resonance:10 cutoff:315.47482330436543 ]", + "[ 7/8 → 1/1 | note:C1 s:sawtooth gain:0.4 decay:0.1 sustain:0 lpattack:0.1 lpenv:-4 resonance:10 cutoff:315.474823304365 ]", + "[ 7/8 → 1/1 | note:C1 s:sawtooth gain:0.4 decay:0.1 sustain:0 lpattack:0.1 lpenv:-4 resonance:10 cutoff:315.474823304365 ]", "[ 15/16 → 1/1 | s:breath room:1 shape:0.6 begin:0 end:0.0625 ]", ] `; exports[`renders tunes > tune: arpoon 1`] = ` [ - "[ (0/1 → 1/4) ⇝ 1/3 | note:55 clip:2 cutoff:500 resonance:12 gain:0.5 decay:0.16 sustain:0.5 delay:0.2 room:0.5 pan:0.44999999999999996 s:piano ]", - "[ (0/1 → 1/4) ⇝ 1/3 | note:64 clip:2 cutoff:500 resonance:12 gain:0.5 decay:0.16 sustain:0.5 delay:0.2 room:0.5 pan:0.44999999999999996 s:piano ]", + "[ (0/1 → 1/4) ⇝ 1/3 | note:55 clip:2 cutoff:500 resonance:12 gain:0.5 decay:0.16 sustain:0.5 delay:0.2 room:0.5 pan:0.45 s:piano ]", + "[ (0/1 → 1/4) ⇝ 1/3 | note:64 clip:2 cutoff:500 resonance:12 gain:0.5 decay:0.16 sustain:0.5 delay:0.2 room:0.5 pan:0.45 s:piano ]", "[ 0/1 → 1/2 | s:bd bank:RolandTR909 gain:0.5 ]", "[ 0/1 → 1/1 | note:33 s:sawtooth cutoff:180 lpattack:0.1 lpenv:2 ]", "[ 0/1 → 1/1 | note:33.12 s:sawtooth cutoff:180 lpattack:0.1 lpenv:2 ]", - "[ 0/1 ⇜ (1/4 → 1/3) | note:55 clip:2 cutoff:500 resonance:12 gain:0.8 decay:0.16 sustain:0.5 delay:0.2 room:0.5 pan:0.44999999999999996 s:piano ]", - "[ 0/1 ⇜ (1/4 → 1/3) | note:64 clip:2 cutoff:500 resonance:12 gain:0.8 decay:0.16 sustain:0.5 delay:0.2 room:0.5 pan:0.44999999999999996 s:piano ]", - "[ (1/3 → 1/2) ⇝ 2/3 | note:60.00052866221468 clip:2 cutoff:509.2515887569149 resonance:12 gain:0.8 decay:0.16 sustain:0.5 delay:0.2 room:0.5 pan:0.5249999999999999 s:piano ]", - "[ 1/3 ⇜ (1/2 → 2/3) | note:60.00052866221468 clip:2 cutoff:509.2515887569149 resonance:12 gain:0.5 decay:0.16 sustain:0.5 delay:0.2 room:0.5 pan:0.5249999999999999 s:piano ]", + "[ 0/1 ⇜ (1/4 → 1/3) | note:55 clip:2 cutoff:500 resonance:12 gain:0.8 decay:0.16 sustain:0.5 delay:0.2 room:0.5 pan:0.45 s:piano ]", + "[ 0/1 ⇜ (1/4 → 1/3) | note:64 clip:2 cutoff:500 resonance:12 gain:0.8 decay:0.16 sustain:0.5 delay:0.2 room:0.5 pan:0.45 s:piano ]", + "[ (1/3 → 1/2) ⇝ 2/3 | note:60.000528662215 clip:2 cutoff:509.251588756915 resonance:12 gain:0.8 decay:0.16 sustain:0.5 delay:0.2 room:0.5 pan:0.525 s:piano ]", + "[ 1/3 ⇜ (1/2 → 2/3) | note:60.000528662215 clip:2 cutoff:509.251588756915 resonance:12 gain:0.5 decay:0.16 sustain:0.5 delay:0.2 room:0.5 pan:0.525 s:piano ]", "[ 1/2 → 2/3 | s:hh bank:RolandTR909 gain:0.5 ]", "[ 1/2 → 1/1 | s:bd bank:RolandTR909 gain:0.5 ]", - "[ (2/3 → 3/4) ⇝ 1/1 | note:59.003688107962134 clip:2 cutoff:564.5418893373399 resonance:12 gain:0.5 decay:0.16 sustain:0.5 delay:0.2 room:0.5 pan:0.5799038105676657 s:piano ]", - "[ (2/3 → 3/4) ⇝ 1/1 | note:64.00368810796213 clip:2 cutoff:564.5418893373399 resonance:12 gain:0.5 decay:0.16 sustain:0.5 delay:0.2 room:0.5 pan:0.5799038105676657 s:piano ]", - "[ 2/3 ⇜ (3/4 → 1/1) | note:59.003688107962134 clip:2 cutoff:564.5418893373399 resonance:12 gain:0.8 decay:0.16 sustain:0.5 delay:0.2 room:0.5 pan:0.5799038105676657 s:piano ]", - "[ 2/3 ⇜ (3/4 → 1/1) | note:64.00368810796213 clip:2 cutoff:564.5418893373399 resonance:12 gain:0.8 decay:0.16 sustain:0.5 delay:0.2 room:0.5 pan:0.5799038105676657 s:piano ]", + "[ (2/3 → 3/4) ⇝ 1/1 | note:59.003688107962 clip:2 cutoff:564.54188933734 resonance:12 gain:0.5 decay:0.16 sustain:0.5 delay:0.2 room:0.5 pan:0.579903810568 s:piano ]", + "[ (2/3 → 3/4) ⇝ 1/1 | note:64.003688107962 clip:2 cutoff:564.54188933734 resonance:12 gain:0.5 decay:0.16 sustain:0.5 delay:0.2 room:0.5 pan:0.579903810568 s:piano ]", + "[ 2/3 ⇜ (3/4 → 1/1) | note:59.003688107962 clip:2 cutoff:564.54188933734 resonance:12 gain:0.8 decay:0.16 sustain:0.5 delay:0.2 room:0.5 pan:0.579903810568 s:piano ]", + "[ 2/3 ⇜ (3/4 → 1/1) | note:64.003688107962 clip:2 cutoff:564.54188933734 resonance:12 gain:0.8 decay:0.16 sustain:0.5 delay:0.2 room:0.5 pan:0.579903810568 s:piano ]", ] `; exports[`renders tunes > tune: barryHarris 1`] = ` [ - "[ 0/1 → 1/1 | note:B3 clip:1 s:piano release:0.1 pan:0.5231481481481481 color:#00B8D4 ]", - "[ (0/1 → 1/1) ⇝ 2/1 | note:C3 clip:1 s:piano release:0.1 pan:0.4722222222222222 color:#00B8D4 ]", - "[ (0/1 → 1/1) ⇝ 2/1 | note:E3 clip:1 s:piano release:0.1 pan:0.4907407407407407 color:#00B8D4 ]", - "[ 0/1 ⇜ (1/1 → 2/1) | note:C3 clip:1 s:piano release:0.1 pan:0.4722222222222222 color:#00B8D4 ]", - "[ 0/1 ⇜ (1/1 → 2/1) | note:E3 clip:1 s:piano release:0.1 pan:0.4907407407407407 color:#00B8D4 ]", - "[ 1/1 → 2/1 | note:A3 clip:1 s:piano release:0.1 pan:0.5138888888888888 color:#00B8D4 ]", - "[ 2/1 → 3/1 | note:C4 clip:1 s:piano release:0.1 pan:0.5277777777777778 color:#00B8D4 ]", - "[ (2/1 → 3/1) ⇝ 4/1 | note:D3 clip:1 s:piano release:0.1 pan:0.4814814814814815 color:#00B8D4 ]", - "[ (2/1 → 3/1) ⇝ 4/1 | note:F3 clip:1 s:piano release:0.1 pan:0.49537037037037035 color:#00B8D4 ]", - "[ 2/1 ⇜ (3/1 → 4/1) | note:D3 clip:1 s:piano release:0.1 pan:0.4814814814814815 color:#00B8D4 ]", - "[ 2/1 ⇜ (3/1 → 4/1) | note:F3 clip:1 s:piano release:0.1 pan:0.49537037037037035 color:#00B8D4 ]", - "[ 3/1 → 4/1 | note:B3 clip:1 s:piano release:0.1 pan:0.5231481481481481 color:#00B8D4 ]", - "[ 4/1 → 5/1 | note:D4 clip:1 s:piano release:0.1 pan:0.537037037037037 color:#00B8D4 ]", - "[ (4/1 → 5/1) ⇝ 6/1 | note:E3 clip:1 s:piano release:0.1 pan:0.4907407407407407 color:#00B8D4 ]", - "[ (4/1 → 5/1) ⇝ 6/1 | note:G3 clip:1 s:piano release:0.1 pan:0.5046296296296297 color:#00B8D4 ]", - "[ 4/1 ⇜ (5/1 → 6/1) | note:E3 clip:1 s:piano release:0.1 pan:0.4907407407407407 color:#00B8D4 ]", - "[ 4/1 ⇜ (5/1 → 6/1) | note:G3 clip:1 s:piano release:0.1 pan:0.5046296296296297 color:#00B8D4 ]", - "[ 5/1 → 6/1 | note:C4 clip:1 s:piano release:0.1 pan:0.5277777777777778 color:#00B8D4 ]", - "[ 6/1 → 7/1 | note:E4 clip:1 s:piano release:0.1 pan:0.5462962962962963 color:#00B8D4 ]", - "[ (6/1 → 7/1) ⇝ 8/1 | note:F3 clip:1 s:piano release:0.1 pan:0.49537037037037035 color:#00B8D4 ]", - "[ (6/1 → 7/1) ⇝ 8/1 | note:G#3 clip:1 s:piano release:0.1 pan:0.5092592592592593 color:#00B8D4 ]", - "[ 6/1 ⇜ (7/1 → 8/1) | note:F3 clip:1 s:piano release:0.1 pan:0.49537037037037035 color:#00B8D4 ]", - "[ 6/1 ⇜ (7/1 → 8/1) | note:G#3 clip:1 s:piano release:0.1 pan:0.5092592592592593 color:#00B8D4 ]", - "[ 7/1 → 8/1 | note:D4 clip:1 s:piano release:0.1 pan:0.537037037037037 color:#00B8D4 ]", - "[ 8/1 → 9/1 | note:F4 clip:1 s:piano release:0.1 pan:0.5509259259259259 color:#00B8D4 ]", - "[ (8/1 → 9/1) ⇝ 10/1 | note:G3 clip:1 s:piano release:0.1 pan:0.5046296296296297 color:#00B8D4 ]", - "[ (8/1 → 9/1) ⇝ 10/1 | note:A3 clip:1 s:piano release:0.1 pan:0.5138888888888888 color:#00B8D4 ]", - "[ 8/1 ⇜ (9/1 → 10/1) | note:G3 clip:1 s:piano release:0.1 pan:0.5046296296296297 color:#00B8D4 ]", - "[ 8/1 ⇜ (9/1 → 10/1) | note:A3 clip:1 s:piano release:0.1 pan:0.5138888888888888 color:#00B8D4 ]", - "[ 9/1 → 10/1 | note:E4 clip:1 s:piano release:0.1 pan:0.5462962962962963 color:#00B8D4 ]", - "[ 10/1 → 11/1 | note:G4 clip:1 s:piano release:0.1 pan:0.5601851851851851 color:#00B8D4 ]", - "[ (10/1 → 11/1) ⇝ 12/1 | note:G#3 clip:1 s:piano release:0.1 pan:0.5092592592592593 color:#00B8D4 ]", - "[ (10/1 → 11/1) ⇝ 12/1 | note:B3 clip:1 s:piano release:0.1 pan:0.5231481481481481 color:#00B8D4 ]", - "[ 10/1 ⇜ (11/1 → 12/1) | note:G#3 clip:1 s:piano release:0.1 pan:0.5092592592592593 color:#00B8D4 ]", - "[ 10/1 ⇜ (11/1 → 12/1) | note:B3 clip:1 s:piano release:0.1 pan:0.5231481481481481 color:#00B8D4 ]", - "[ 11/1 → 12/1 | note:F4 clip:1 s:piano release:0.1 pan:0.5509259259259259 color:#00B8D4 ]", - "[ 12/1 → 13/1 | note:A4 clip:1 s:piano release:0.1 pan:0.5694444444444444 color:#00B8D4 ]", - "[ (12/1 → 13/1) ⇝ 14/1 | note:B3 clip:1 s:piano release:0.1 pan:0.5231481481481481 color:#00B8D4 ]", - "[ (12/1 → 13/1) ⇝ 14/1 | note:D4 clip:1 s:piano release:0.1 pan:0.537037037037037 color:#00B8D4 ]", - "[ 12/1 ⇜ (13/1 → 14/1) | note:B3 clip:1 s:piano release:0.1 pan:0.5231481481481481 color:#00B8D4 ]", - "[ 12/1 ⇜ (13/1 → 14/1) | note:D4 clip:1 s:piano release:0.1 pan:0.537037037037037 color:#00B8D4 ]", - "[ 13/1 → 14/1 | note:G#4 clip:1 s:piano release:0.1 pan:0.5648148148148149 color:#00B8D4 ]", - "[ 14/1 → 15/1 | note:B4 clip:1 s:piano release:0.1 pan:0.5787037037037037 color:#00B8D4 ]", - "[ (14/1 → 15/1) ⇝ 16/1 | note:C4 clip:1 s:piano release:0.1 pan:0.5277777777777778 color:#00B8D4 ]", - "[ (14/1 → 15/1) ⇝ 16/1 | note:E4 clip:1 s:piano release:0.1 pan:0.5462962962962963 color:#00B8D4 ]", - "[ 14/1 ⇜ (15/1 → 16/1) | note:C4 clip:1 s:piano release:0.1 pan:0.5277777777777778 color:#00B8D4 ]", - "[ 14/1 ⇜ (15/1 → 16/1) | note:E4 clip:1 s:piano release:0.1 pan:0.5462962962962963 color:#00B8D4 ]", - "[ 15/1 → 16/1 | note:A4 clip:1 s:piano release:0.1 pan:0.5694444444444444 color:#00B8D4 ]", - "[ 16/1 → 17/1 | note:C4 clip:1 s:piano release:0.1 pan:0.5277777777777778 color:#00B8D4 ]", - "[ (16/1 → 17/1) ⇝ 18/1 | note:Db3 clip:1 s:piano release:0.1 pan:0.47685185185185186 color:#00B8D4 ]", - "[ (16/1 → 17/1) ⇝ 18/1 | note:F3 clip:1 s:piano release:0.1 pan:0.49537037037037035 color:#00B8D4 ]", - "[ 16/1 ⇜ (17/1 → 18/1) | note:Db3 clip:1 s:piano release:0.1 pan:0.47685185185185186 color:#00B8D4 ]", - "[ 16/1 ⇜ (17/1 → 18/1) | note:F3 clip:1 s:piano release:0.1 pan:0.49537037037037035 color:#00B8D4 ]", - "[ 17/1 → 18/1 | note:Bb3 clip:1 s:piano release:0.1 pan:0.5185185185185186 color:#00B8D4 ]", - "[ 18/1 → 19/1 | note:Db4 clip:1 s:piano release:0.1 pan:0.5324074074074074 color:#00B8D4 ]", - "[ (18/1 → 19/1) ⇝ 20/1 | note:Eb3 clip:1 s:piano release:0.1 pan:0.4861111111111111 color:#00B8D4 ]", + "[ 0/1 → 1/1 | note:B3 clip:1 s:piano release:0.1 pan:0.523148148148 color:#00B8D4 ]", + "[ (0/1 → 1/1) ⇝ 2/1 | note:C3 clip:1 s:piano release:0.1 pan:0.472222222222 color:#00B8D4 ]", + "[ (0/1 → 1/1) ⇝ 2/1 | note:E3 clip:1 s:piano release:0.1 pan:0.490740740741 color:#00B8D4 ]", + "[ 0/1 ⇜ (1/1 → 2/1) | note:C3 clip:1 s:piano release:0.1 pan:0.472222222222 color:#00B8D4 ]", + "[ 0/1 ⇜ (1/1 → 2/1) | note:E3 clip:1 s:piano release:0.1 pan:0.490740740741 color:#00B8D4 ]", + "[ 1/1 → 2/1 | note:A3 clip:1 s:piano release:0.1 pan:0.513888888889 color:#00B8D4 ]", + "[ 2/1 → 3/1 | note:C4 clip:1 s:piano release:0.1 pan:0.527777777778 color:#00B8D4 ]", + "[ (2/1 → 3/1) ⇝ 4/1 | note:D3 clip:1 s:piano release:0.1 pan:0.481481481481 color:#00B8D4 ]", + "[ (2/1 → 3/1) ⇝ 4/1 | note:F3 clip:1 s:piano release:0.1 pan:0.49537037037 color:#00B8D4 ]", + "[ 2/1 ⇜ (3/1 → 4/1) | note:D3 clip:1 s:piano release:0.1 pan:0.481481481481 color:#00B8D4 ]", + "[ 2/1 ⇜ (3/1 → 4/1) | note:F3 clip:1 s:piano release:0.1 pan:0.49537037037 color:#00B8D4 ]", + "[ 3/1 → 4/1 | note:B3 clip:1 s:piano release:0.1 pan:0.523148148148 color:#00B8D4 ]", + "[ 4/1 → 5/1 | note:D4 clip:1 s:piano release:0.1 pan:0.537037037037 color:#00B8D4 ]", + "[ (4/1 → 5/1) ⇝ 6/1 | note:E3 clip:1 s:piano release:0.1 pan:0.490740740741 color:#00B8D4 ]", + "[ (4/1 → 5/1) ⇝ 6/1 | note:G3 clip:1 s:piano release:0.1 pan:0.50462962963 color:#00B8D4 ]", + "[ 4/1 ⇜ (5/1 → 6/1) | note:E3 clip:1 s:piano release:0.1 pan:0.490740740741 color:#00B8D4 ]", + "[ 4/1 ⇜ (5/1 → 6/1) | note:G3 clip:1 s:piano release:0.1 pan:0.50462962963 color:#00B8D4 ]", + "[ 5/1 → 6/1 | note:C4 clip:1 s:piano release:0.1 pan:0.527777777778 color:#00B8D4 ]", + "[ 6/1 → 7/1 | note:E4 clip:1 s:piano release:0.1 pan:0.546296296296 color:#00B8D4 ]", + "[ (6/1 → 7/1) ⇝ 8/1 | note:F3 clip:1 s:piano release:0.1 pan:0.49537037037 color:#00B8D4 ]", + "[ (6/1 → 7/1) ⇝ 8/1 | note:G#3 clip:1 s:piano release:0.1 pan:0.509259259259 color:#00B8D4 ]", + "[ 6/1 ⇜ (7/1 → 8/1) | note:F3 clip:1 s:piano release:0.1 pan:0.49537037037 color:#00B8D4 ]", + "[ 6/1 ⇜ (7/1 → 8/1) | note:G#3 clip:1 s:piano release:0.1 pan:0.509259259259 color:#00B8D4 ]", + "[ 7/1 → 8/1 | note:D4 clip:1 s:piano release:0.1 pan:0.537037037037 color:#00B8D4 ]", + "[ 8/1 → 9/1 | note:F4 clip:1 s:piano release:0.1 pan:0.550925925926 color:#00B8D4 ]", + "[ (8/1 → 9/1) ⇝ 10/1 | note:G3 clip:1 s:piano release:0.1 pan:0.50462962963 color:#00B8D4 ]", + "[ (8/1 → 9/1) ⇝ 10/1 | note:A3 clip:1 s:piano release:0.1 pan:0.513888888889 color:#00B8D4 ]", + "[ 8/1 ⇜ (9/1 → 10/1) | note:G3 clip:1 s:piano release:0.1 pan:0.50462962963 color:#00B8D4 ]", + "[ 8/1 ⇜ (9/1 → 10/1) | note:A3 clip:1 s:piano release:0.1 pan:0.513888888889 color:#00B8D4 ]", + "[ 9/1 → 10/1 | note:E4 clip:1 s:piano release:0.1 pan:0.546296296296 color:#00B8D4 ]", + "[ 10/1 → 11/1 | note:G4 clip:1 s:piano release:0.1 pan:0.560185185185 color:#00B8D4 ]", + "[ (10/1 → 11/1) ⇝ 12/1 | note:G#3 clip:1 s:piano release:0.1 pan:0.509259259259 color:#00B8D4 ]", + "[ (10/1 → 11/1) ⇝ 12/1 | note:B3 clip:1 s:piano release:0.1 pan:0.523148148148 color:#00B8D4 ]", + "[ 10/1 ⇜ (11/1 → 12/1) | note:G#3 clip:1 s:piano release:0.1 pan:0.509259259259 color:#00B8D4 ]", + "[ 10/1 ⇜ (11/1 → 12/1) | note:B3 clip:1 s:piano release:0.1 pan:0.523148148148 color:#00B8D4 ]", + "[ 11/1 → 12/1 | note:F4 clip:1 s:piano release:0.1 pan:0.550925925926 color:#00B8D4 ]", + "[ 12/1 → 13/1 | note:A4 clip:1 s:piano release:0.1 pan:0.569444444444 color:#00B8D4 ]", + "[ (12/1 → 13/1) ⇝ 14/1 | note:B3 clip:1 s:piano release:0.1 pan:0.523148148148 color:#00B8D4 ]", + "[ (12/1 → 13/1) ⇝ 14/1 | note:D4 clip:1 s:piano release:0.1 pan:0.537037037037 color:#00B8D4 ]", + "[ 12/1 ⇜ (13/1 → 14/1) | note:B3 clip:1 s:piano release:0.1 pan:0.523148148148 color:#00B8D4 ]", + "[ 12/1 ⇜ (13/1 → 14/1) | note:D4 clip:1 s:piano release:0.1 pan:0.537037037037 color:#00B8D4 ]", + "[ 13/1 → 14/1 | note:G#4 clip:1 s:piano release:0.1 pan:0.564814814815 color:#00B8D4 ]", + "[ 14/1 → 15/1 | note:B4 clip:1 s:piano release:0.1 pan:0.578703703704 color:#00B8D4 ]", + "[ (14/1 → 15/1) ⇝ 16/1 | note:C4 clip:1 s:piano release:0.1 pan:0.527777777778 color:#00B8D4 ]", + "[ (14/1 → 15/1) ⇝ 16/1 | note:E4 clip:1 s:piano release:0.1 pan:0.546296296296 color:#00B8D4 ]", + "[ 14/1 ⇜ (15/1 → 16/1) | note:C4 clip:1 s:piano release:0.1 pan:0.527777777778 color:#00B8D4 ]", + "[ 14/1 ⇜ (15/1 → 16/1) | note:E4 clip:1 s:piano release:0.1 pan:0.546296296296 color:#00B8D4 ]", + "[ 15/1 → 16/1 | note:A4 clip:1 s:piano release:0.1 pan:0.569444444444 color:#00B8D4 ]", + "[ 16/1 → 17/1 | note:C4 clip:1 s:piano release:0.1 pan:0.527777777778 color:#00B8D4 ]", + "[ (16/1 → 17/1) ⇝ 18/1 | note:Db3 clip:1 s:piano release:0.1 pan:0.476851851852 color:#00B8D4 ]", + "[ (16/1 → 17/1) ⇝ 18/1 | note:F3 clip:1 s:piano release:0.1 pan:0.49537037037 color:#00B8D4 ]", + "[ 16/1 ⇜ (17/1 → 18/1) | note:Db3 clip:1 s:piano release:0.1 pan:0.476851851852 color:#00B8D4 ]", + "[ 16/1 ⇜ (17/1 → 18/1) | note:F3 clip:1 s:piano release:0.1 pan:0.49537037037 color:#00B8D4 ]", + "[ 17/1 → 18/1 | note:Bb3 clip:1 s:piano release:0.1 pan:0.518518518519 color:#00B8D4 ]", + "[ 18/1 → 19/1 | note:Db4 clip:1 s:piano release:0.1 pan:0.532407407407 color:#00B8D4 ]", + "[ (18/1 → 19/1) ⇝ 20/1 | note:Eb3 clip:1 s:piano release:0.1 pan:0.486111111111 color:#00B8D4 ]", "[ (18/1 → 19/1) ⇝ 20/1 | note:Gb3 clip:1 s:piano release:0.1 pan:0.5 color:#00B8D4 ]", - "[ 18/1 ⇜ (19/1 → 20/1) | note:Eb3 clip:1 s:piano release:0.1 pan:0.4861111111111111 color:#00B8D4 ]", + "[ 18/1 ⇜ (19/1 → 20/1) | note:Eb3 clip:1 s:piano release:0.1 pan:0.486111111111 color:#00B8D4 ]", "[ 18/1 ⇜ (19/1 → 20/1) | note:Gb3 clip:1 s:piano release:0.1 pan:0.5 color:#00B8D4 ]", - "[ 19/1 → 20/1 | note:C4 clip:1 s:piano release:0.1 pan:0.5277777777777778 color:#00B8D4 ]", - "[ 20/1 → 21/1 | note:Eb4 clip:1 s:piano release:0.1 pan:0.5416666666666667 color:#00B8D4 ]", - "[ (20/1 → 21/1) ⇝ 22/1 | note:F3 clip:1 s:piano release:0.1 pan:0.49537037037037035 color:#00B8D4 ]", - "[ (20/1 → 21/1) ⇝ 22/1 | note:Ab3 clip:1 s:piano release:0.1 pan:0.5092592592592593 color:#00B8D4 ]", - "[ 20/1 ⇜ (21/1 → 22/1) | note:F3 clip:1 s:piano release:0.1 pan:0.49537037037037035 color:#00B8D4 ]", - "[ 20/1 ⇜ (21/1 → 22/1) | note:Ab3 clip:1 s:piano release:0.1 pan:0.5092592592592593 color:#00B8D4 ]", - "[ 21/1 → 22/1 | note:Db4 clip:1 s:piano release:0.1 pan:0.5324074074074074 color:#00B8D4 ]", - "[ 22/1 → 23/1 | note:F4 clip:1 s:piano release:0.1 pan:0.5509259259259259 color:#00B8D4 ]", + "[ 19/1 → 20/1 | note:C4 clip:1 s:piano release:0.1 pan:0.527777777778 color:#00B8D4 ]", + "[ 20/1 → 21/1 | note:Eb4 clip:1 s:piano release:0.1 pan:0.541666666667 color:#00B8D4 ]", + "[ (20/1 → 21/1) ⇝ 22/1 | note:F3 clip:1 s:piano release:0.1 pan:0.49537037037 color:#00B8D4 ]", + "[ (20/1 → 21/1) ⇝ 22/1 | note:Ab3 clip:1 s:piano release:0.1 pan:0.509259259259 color:#00B8D4 ]", + "[ 20/1 ⇜ (21/1 → 22/1) | note:F3 clip:1 s:piano release:0.1 pan:0.49537037037 color:#00B8D4 ]", + "[ 20/1 ⇜ (21/1 → 22/1) | note:Ab3 clip:1 s:piano release:0.1 pan:0.509259259259 color:#00B8D4 ]", + "[ 21/1 → 22/1 | note:Db4 clip:1 s:piano release:0.1 pan:0.532407407407 color:#00B8D4 ]", + "[ 22/1 → 23/1 | note:F4 clip:1 s:piano release:0.1 pan:0.550925925926 color:#00B8D4 ]", "[ (22/1 → 23/1) ⇝ 24/1 | note:Gb3 clip:1 s:piano release:0.1 pan:0.5 color:#00B8D4 ]", - "[ (22/1 → 23/1) ⇝ 24/1 | note:A3 clip:1 s:piano release:0.1 pan:0.5138888888888888 color:#00B8D4 ]", + "[ (22/1 → 23/1) ⇝ 24/1 | note:A3 clip:1 s:piano release:0.1 pan:0.513888888889 color:#00B8D4 ]", "[ 22/1 ⇜ (23/1 → 24/1) | note:Gb3 clip:1 s:piano release:0.1 pan:0.5 color:#00B8D4 ]", - "[ 22/1 ⇜ (23/1 → 24/1) | note:A3 clip:1 s:piano release:0.1 pan:0.5138888888888888 color:#00B8D4 ]", - "[ 23/1 → 24/1 | note:Eb4 clip:1 s:piano release:0.1 pan:0.5416666666666667 color:#00B8D4 ]", - "[ 24/1 → 25/1 | note:Gb4 clip:1 s:piano release:0.1 pan:0.5555555555555556 color:#00B8D4 ]", - "[ (24/1 → 25/1) ⇝ 26/1 | note:Ab3 clip:1 s:piano release:0.1 pan:0.5092592592592593 color:#00B8D4 ]", - "[ (24/1 → 25/1) ⇝ 26/1 | note:Bb3 clip:1 s:piano release:0.1 pan:0.5185185185185186 color:#00B8D4 ]", - "[ 24/1 ⇜ (25/1 → 26/1) | note:Ab3 clip:1 s:piano release:0.1 pan:0.5092592592592593 color:#00B8D4 ]", - "[ 24/1 ⇜ (25/1 → 26/1) | note:Bb3 clip:1 s:piano release:0.1 pan:0.5185185185185186 color:#00B8D4 ]", - "[ 25/1 → 26/1 | note:F4 clip:1 s:piano release:0.1 pan:0.5509259259259259 color:#00B8D4 ]", - "[ 26/1 → 27/1 | note:Ab4 clip:1 s:piano release:0.1 pan:0.5648148148148149 color:#00B8D4 ]", - "[ (26/1 → 27/1) ⇝ 28/1 | note:A3 clip:1 s:piano release:0.1 pan:0.5138888888888888 color:#00B8D4 ]", - "[ (26/1 → 27/1) ⇝ 28/1 | note:C4 clip:1 s:piano release:0.1 pan:0.5277777777777778 color:#00B8D4 ]", - "[ 26/1 ⇜ (27/1 → 28/1) | note:A3 clip:1 s:piano release:0.1 pan:0.5138888888888888 color:#00B8D4 ]", - "[ 26/1 ⇜ (27/1 → 28/1) | note:C4 clip:1 s:piano release:0.1 pan:0.5277777777777778 color:#00B8D4 ]", - "[ 27/1 → 28/1 | note:Gb4 clip:1 s:piano release:0.1 pan:0.5555555555555556 color:#00B8D4 ]", - "[ 28/1 → 29/1 | note:Bb4 clip:1 s:piano release:0.1 pan:0.5740740740740741 color:#00B8D4 ]", - "[ (28/1 → 29/1) ⇝ 30/1 | note:C4 clip:1 s:piano release:0.1 pan:0.5277777777777778 color:#00B8D4 ]", - "[ (28/1 → 29/1) ⇝ 30/1 | note:Eb4 clip:1 s:piano release:0.1 pan:0.5416666666666667 color:#00B8D4 ]", - "[ 28/1 ⇜ (29/1 → 30/1) | note:C4 clip:1 s:piano release:0.1 pan:0.5277777777777778 color:#00B8D4 ]", - "[ 28/1 ⇜ (29/1 → 30/1) | note:Eb4 clip:1 s:piano release:0.1 pan:0.5416666666666667 color:#00B8D4 ]", - "[ 29/1 → 30/1 | note:A4 clip:1 s:piano release:0.1 pan:0.5694444444444444 color:#00B8D4 ]", - "[ 30/1 → 31/1 | note:C5 clip:1 s:piano release:0.1 pan:0.5833333333333333 color:#00B8D4 ]", - "[ (30/1 → 31/1) ⇝ 32/1 | note:Db4 clip:1 s:piano release:0.1 pan:0.5324074074074074 color:#00B8D4 ]", - "[ (30/1 → 31/1) ⇝ 32/1 | note:F4 clip:1 s:piano release:0.1 pan:0.5509259259259259 color:#00B8D4 ]", - "[ 30/1 ⇜ (31/1 → 32/1) | note:Db4 clip:1 s:piano release:0.1 pan:0.5324074074074074 color:#00B8D4 ]", - "[ 30/1 ⇜ (31/1 → 32/1) | note:F4 clip:1 s:piano release:0.1 pan:0.5509259259259259 color:#00B8D4 ]", - "[ 31/1 → 32/1 | note:Bb4 clip:1 s:piano release:0.1 pan:0.5740740740740741 color:#00B8D4 ]", - "[ 32/1 → 33/1 | note:C#4 clip:1 s:piano release:0.1 pan:0.5324074074074074 color:#00B8D4 ]", - "[ (32/1 → 33/1) ⇝ 34/1 | note:D3 clip:1 s:piano release:0.1 pan:0.4814814814814815 color:#00B8D4 ]", + "[ 22/1 ⇜ (23/1 → 24/1) | note:A3 clip:1 s:piano release:0.1 pan:0.513888888889 color:#00B8D4 ]", + "[ 23/1 → 24/1 | note:Eb4 clip:1 s:piano release:0.1 pan:0.541666666667 color:#00B8D4 ]", + "[ 24/1 → 25/1 | note:Gb4 clip:1 s:piano release:0.1 pan:0.555555555556 color:#00B8D4 ]", + "[ (24/1 → 25/1) ⇝ 26/1 | note:Ab3 clip:1 s:piano release:0.1 pan:0.509259259259 color:#00B8D4 ]", + "[ (24/1 → 25/1) ⇝ 26/1 | note:Bb3 clip:1 s:piano release:0.1 pan:0.518518518519 color:#00B8D4 ]", + "[ 24/1 ⇜ (25/1 → 26/1) | note:Ab3 clip:1 s:piano release:0.1 pan:0.509259259259 color:#00B8D4 ]", + "[ 24/1 ⇜ (25/1 → 26/1) | note:Bb3 clip:1 s:piano release:0.1 pan:0.518518518519 color:#00B8D4 ]", + "[ 25/1 → 26/1 | note:F4 clip:1 s:piano release:0.1 pan:0.550925925926 color:#00B8D4 ]", + "[ 26/1 → 27/1 | note:Ab4 clip:1 s:piano release:0.1 pan:0.564814814815 color:#00B8D4 ]", + "[ (26/1 → 27/1) ⇝ 28/1 | note:A3 clip:1 s:piano release:0.1 pan:0.513888888889 color:#00B8D4 ]", + "[ (26/1 → 27/1) ⇝ 28/1 | note:C4 clip:1 s:piano release:0.1 pan:0.527777777778 color:#00B8D4 ]", + "[ 26/1 ⇜ (27/1 → 28/1) | note:A3 clip:1 s:piano release:0.1 pan:0.513888888889 color:#00B8D4 ]", + "[ 26/1 ⇜ (27/1 → 28/1) | note:C4 clip:1 s:piano release:0.1 pan:0.527777777778 color:#00B8D4 ]", + "[ 27/1 → 28/1 | note:Gb4 clip:1 s:piano release:0.1 pan:0.555555555556 color:#00B8D4 ]", + "[ 28/1 → 29/1 | note:Bb4 clip:1 s:piano release:0.1 pan:0.574074074074 color:#00B8D4 ]", + "[ (28/1 → 29/1) ⇝ 30/1 | note:C4 clip:1 s:piano release:0.1 pan:0.527777777778 color:#00B8D4 ]", + "[ (28/1 → 29/1) ⇝ 30/1 | note:Eb4 clip:1 s:piano release:0.1 pan:0.541666666667 color:#00B8D4 ]", + "[ 28/1 ⇜ (29/1 → 30/1) | note:C4 clip:1 s:piano release:0.1 pan:0.527777777778 color:#00B8D4 ]", + "[ 28/1 ⇜ (29/1 → 30/1) | note:Eb4 clip:1 s:piano release:0.1 pan:0.541666666667 color:#00B8D4 ]", + "[ 29/1 → 30/1 | note:A4 clip:1 s:piano release:0.1 pan:0.569444444444 color:#00B8D4 ]", + "[ 30/1 → 31/1 | note:C5 clip:1 s:piano release:0.1 pan:0.583333333333 color:#00B8D4 ]", + "[ (30/1 → 31/1) ⇝ 32/1 | note:Db4 clip:1 s:piano release:0.1 pan:0.532407407407 color:#00B8D4 ]", + "[ (30/1 → 31/1) ⇝ 32/1 | note:F4 clip:1 s:piano release:0.1 pan:0.550925925926 color:#00B8D4 ]", + "[ 30/1 ⇜ (31/1 → 32/1) | note:Db4 clip:1 s:piano release:0.1 pan:0.532407407407 color:#00B8D4 ]", + "[ 30/1 ⇜ (31/1 → 32/1) | note:F4 clip:1 s:piano release:0.1 pan:0.550925925926 color:#00B8D4 ]", + "[ 31/1 → 32/1 | note:Bb4 clip:1 s:piano release:0.1 pan:0.574074074074 color:#00B8D4 ]", + "[ 32/1 → 33/1 | note:C#4 clip:1 s:piano release:0.1 pan:0.532407407407 color:#00B8D4 ]", + "[ (32/1 → 33/1) ⇝ 34/1 | note:D3 clip:1 s:piano release:0.1 pan:0.481481481481 color:#00B8D4 ]", "[ (32/1 → 33/1) ⇝ 34/1 | note:F#3 clip:1 s:piano release:0.1 pan:0.5 color:#00B8D4 ]", - "[ 32/1 ⇜ (33/1 → 34/1) | note:D3 clip:1 s:piano release:0.1 pan:0.4814814814814815 color:#00B8D4 ]", + "[ 32/1 ⇜ (33/1 → 34/1) | note:D3 clip:1 s:piano release:0.1 pan:0.481481481481 color:#00B8D4 ]", "[ 32/1 ⇜ (33/1 → 34/1) | note:F#3 clip:1 s:piano release:0.1 pan:0.5 color:#00B8D4 ]", - "[ 33/1 → 34/1 | note:B3 clip:1 s:piano release:0.1 pan:0.5231481481481481 color:#00B8D4 ]", - "[ 34/1 → 35/1 | note:D4 clip:1 s:piano release:0.1 pan:0.537037037037037 color:#00B8D4 ]", - "[ (34/1 → 35/1) ⇝ 36/1 | note:E3 clip:1 s:piano release:0.1 pan:0.4907407407407407 color:#00B8D4 ]", - "[ (34/1 → 35/1) ⇝ 36/1 | note:G3 clip:1 s:piano release:0.1 pan:0.5046296296296297 color:#00B8D4 ]", - "[ 34/1 ⇜ (35/1 → 36/1) | note:E3 clip:1 s:piano release:0.1 pan:0.4907407407407407 color:#00B8D4 ]", - "[ 34/1 ⇜ (35/1 → 36/1) | note:G3 clip:1 s:piano release:0.1 pan:0.5046296296296297 color:#00B8D4 ]", - "[ 35/1 → 36/1 | note:C#4 clip:1 s:piano release:0.1 pan:0.5324074074074074 color:#00B8D4 ]", - "[ 36/1 → 37/1 | note:E4 clip:1 s:piano release:0.1 pan:0.5462962962962963 color:#00B8D4 ]", + "[ 33/1 → 34/1 | note:B3 clip:1 s:piano release:0.1 pan:0.523148148148 color:#00B8D4 ]", + "[ 34/1 → 35/1 | note:D4 clip:1 s:piano release:0.1 pan:0.537037037037 color:#00B8D4 ]", + "[ (34/1 → 35/1) ⇝ 36/1 | note:E3 clip:1 s:piano release:0.1 pan:0.490740740741 color:#00B8D4 ]", + "[ (34/1 → 35/1) ⇝ 36/1 | note:G3 clip:1 s:piano release:0.1 pan:0.50462962963 color:#00B8D4 ]", + "[ 34/1 ⇜ (35/1 → 36/1) | note:E3 clip:1 s:piano release:0.1 pan:0.490740740741 color:#00B8D4 ]", + "[ 34/1 ⇜ (35/1 → 36/1) | note:G3 clip:1 s:piano release:0.1 pan:0.50462962963 color:#00B8D4 ]", + "[ 35/1 → 36/1 | note:C#4 clip:1 s:piano release:0.1 pan:0.532407407407 color:#00B8D4 ]", + "[ 36/1 → 37/1 | note:E4 clip:1 s:piano release:0.1 pan:0.546296296296 color:#00B8D4 ]", "[ (36/1 → 37/1) ⇝ 38/1 | note:F#3 clip:1 s:piano release:0.1 pan:0.5 color:#00B8D4 ]", - "[ (36/1 → 37/1) ⇝ 38/1 | note:A3 clip:1 s:piano release:0.1 pan:0.5138888888888888 color:#00B8D4 ]", + "[ (36/1 → 37/1) ⇝ 38/1 | note:A3 clip:1 s:piano release:0.1 pan:0.513888888889 color:#00B8D4 ]", "[ 36/1 ⇜ (37/1 → 38/1) | note:F#3 clip:1 s:piano release:0.1 pan:0.5 color:#00B8D4 ]", - "[ 36/1 ⇜ (37/1 → 38/1) | note:A3 clip:1 s:piano release:0.1 pan:0.5138888888888888 color:#00B8D4 ]", - "[ 37/1 → 38/1 | note:D4 clip:1 s:piano release:0.1 pan:0.537037037037037 color:#00B8D4 ]", - "[ 38/1 → 39/1 | note:F#4 clip:1 s:piano release:0.1 pan:0.5555555555555556 color:#00B8D4 ]", - "[ (38/1 → 39/1) ⇝ 40/1 | note:G3 clip:1 s:piano release:0.1 pan:0.5046296296296297 color:#00B8D4 ]", - "[ (38/1 → 39/1) ⇝ 40/1 | note:A#3 clip:1 s:piano release:0.1 pan:0.5185185185185186 color:#00B8D4 ]", - "[ 38/1 ⇜ (39/1 → 40/1) | note:G3 clip:1 s:piano release:0.1 pan:0.5046296296296297 color:#00B8D4 ]", - "[ 38/1 ⇜ (39/1 → 40/1) | note:A#3 clip:1 s:piano release:0.1 pan:0.5185185185185186 color:#00B8D4 ]", - "[ 39/1 → 40/1 | note:E4 clip:1 s:piano release:0.1 pan:0.5462962962962963 color:#00B8D4 ]", - "[ 40/1 → 41/1 | note:G4 clip:1 s:piano release:0.1 pan:0.5601851851851851 color:#00B8D4 ]", - "[ (40/1 → 41/1) ⇝ 42/1 | note:A3 clip:1 s:piano release:0.1 pan:0.5138888888888888 color:#00B8D4 ]", - "[ (40/1 → 41/1) ⇝ 42/1 | note:B3 clip:1 s:piano release:0.1 pan:0.5231481481481481 color:#00B8D4 ]", - "[ 40/1 ⇜ (41/1 → 42/1) | note:A3 clip:1 s:piano release:0.1 pan:0.5138888888888888 color:#00B8D4 ]", - "[ 40/1 ⇜ (41/1 → 42/1) | note:B3 clip:1 s:piano release:0.1 pan:0.5231481481481481 color:#00B8D4 ]", - "[ 41/1 → 42/1 | note:F#4 clip:1 s:piano release:0.1 pan:0.5555555555555556 color:#00B8D4 ]", - "[ 42/1 → 43/1 | note:A4 clip:1 s:piano release:0.1 pan:0.5694444444444444 color:#00B8D4 ]", - "[ (42/1 → 43/1) ⇝ 44/1 | note:A#3 clip:1 s:piano release:0.1 pan:0.5185185185185186 color:#00B8D4 ]", - "[ (42/1 → 43/1) ⇝ 44/1 | note:C#4 clip:1 s:piano release:0.1 pan:0.5324074074074074 color:#00B8D4 ]", - "[ 42/1 ⇜ (43/1 → 44/1) | note:A#3 clip:1 s:piano release:0.1 pan:0.5185185185185186 color:#00B8D4 ]", - "[ 42/1 ⇜ (43/1 → 44/1) | note:C#4 clip:1 s:piano release:0.1 pan:0.5324074074074074 color:#00B8D4 ]", - "[ 43/1 → 44/1 | note:G4 clip:1 s:piano release:0.1 pan:0.5601851851851851 color:#00B8D4 ]", - "[ 44/1 → 45/1 | note:B4 clip:1 s:piano release:0.1 pan:0.5787037037037037 color:#00B8D4 ]", - "[ (44/1 → 45/1) ⇝ 46/1 | note:C#4 clip:1 s:piano release:0.1 pan:0.5324074074074074 color:#00B8D4 ]", - "[ (44/1 → 45/1) ⇝ 46/1 | note:E4 clip:1 s:piano release:0.1 pan:0.5462962962962963 color:#00B8D4 ]", - "[ 44/1 ⇜ (45/1 → 46/1) | note:C#4 clip:1 s:piano release:0.1 pan:0.5324074074074074 color:#00B8D4 ]", - "[ 44/1 ⇜ (45/1 → 46/1) | note:E4 clip:1 s:piano release:0.1 pan:0.5462962962962963 color:#00B8D4 ]", - "[ 45/1 → 46/1 | note:A#4 clip:1 s:piano release:0.1 pan:0.5740740740740741 color:#00B8D4 ]", - "[ 46/1 → 47/1 | note:C#5 clip:1 s:piano release:0.1 pan:0.587962962962963 color:#00B8D4 ]", - "[ (46/1 → 47/1) ⇝ 48/1 | note:D4 clip:1 s:piano release:0.1 pan:0.537037037037037 color:#00B8D4 ]", - "[ (46/1 → 47/1) ⇝ 48/1 | note:F#4 clip:1 s:piano release:0.1 pan:0.5555555555555556 color:#00B8D4 ]", - "[ 46/1 ⇜ (47/1 → 48/1) | note:D4 clip:1 s:piano release:0.1 pan:0.537037037037037 color:#00B8D4 ]", - "[ 46/1 ⇜ (47/1 → 48/1) | note:F#4 clip:1 s:piano release:0.1 pan:0.5555555555555556 color:#00B8D4 ]", - "[ 47/1 → 48/1 | note:B4 clip:1 s:piano release:0.1 pan:0.5787037037037037 color:#00B8D4 ]", - "[ 48/1 → 49/1 | note:C4 clip:1 s:piano release:0.1 pan:0.5277777777777778 color:#00B8D4 ]", - "[ (48/1 → 49/1) ⇝ 50/1 | note:Db3 clip:1 s:piano release:0.1 pan:0.47685185185185186 color:#00B8D4 ]", - "[ (48/1 → 49/1) ⇝ 50/1 | note:F3 clip:1 s:piano release:0.1 pan:0.49537037037037035 color:#00B8D4 ]", - "[ 48/1 ⇜ (49/1 → 50/1) | note:Db3 clip:1 s:piano release:0.1 pan:0.47685185185185186 color:#00B8D4 ]", - "[ 48/1 ⇜ (49/1 → 50/1) | note:F3 clip:1 s:piano release:0.1 pan:0.49537037037037035 color:#00B8D4 ]", - "[ 49/1 → 50/1 | note:Bb3 clip:1 s:piano release:0.1 pan:0.5185185185185186 color:#00B8D4 ]", - "[ 50/1 → 51/1 | note:Db4 clip:1 s:piano release:0.1 pan:0.5324074074074074 color:#00B8D4 ]", - "[ (50/1 → 51/1) ⇝ 52/1 | note:Eb3 clip:1 s:piano release:0.1 pan:0.4861111111111111 color:#00B8D4 ]", + "[ 36/1 ⇜ (37/1 → 38/1) | note:A3 clip:1 s:piano release:0.1 pan:0.513888888889 color:#00B8D4 ]", + "[ 37/1 → 38/1 | note:D4 clip:1 s:piano release:0.1 pan:0.537037037037 color:#00B8D4 ]", + "[ 38/1 → 39/1 | note:F#4 clip:1 s:piano release:0.1 pan:0.555555555556 color:#00B8D4 ]", + "[ (38/1 → 39/1) ⇝ 40/1 | note:G3 clip:1 s:piano release:0.1 pan:0.50462962963 color:#00B8D4 ]", + "[ (38/1 → 39/1) ⇝ 40/1 | note:A#3 clip:1 s:piano release:0.1 pan:0.518518518519 color:#00B8D4 ]", + "[ 38/1 ⇜ (39/1 → 40/1) | note:G3 clip:1 s:piano release:0.1 pan:0.50462962963 color:#00B8D4 ]", + "[ 38/1 ⇜ (39/1 → 40/1) | note:A#3 clip:1 s:piano release:0.1 pan:0.518518518519 color:#00B8D4 ]", + "[ 39/1 → 40/1 | note:E4 clip:1 s:piano release:0.1 pan:0.546296296296 color:#00B8D4 ]", + "[ 40/1 → 41/1 | note:G4 clip:1 s:piano release:0.1 pan:0.560185185185 color:#00B8D4 ]", + "[ (40/1 → 41/1) ⇝ 42/1 | note:A3 clip:1 s:piano release:0.1 pan:0.513888888889 color:#00B8D4 ]", + "[ (40/1 → 41/1) ⇝ 42/1 | note:B3 clip:1 s:piano release:0.1 pan:0.523148148148 color:#00B8D4 ]", + "[ 40/1 ⇜ (41/1 → 42/1) | note:A3 clip:1 s:piano release:0.1 pan:0.513888888889 color:#00B8D4 ]", + "[ 40/1 ⇜ (41/1 → 42/1) | note:B3 clip:1 s:piano release:0.1 pan:0.523148148148 color:#00B8D4 ]", + "[ 41/1 → 42/1 | note:F#4 clip:1 s:piano release:0.1 pan:0.555555555556 color:#00B8D4 ]", + "[ 42/1 → 43/1 | note:A4 clip:1 s:piano release:0.1 pan:0.569444444444 color:#00B8D4 ]", + "[ (42/1 → 43/1) ⇝ 44/1 | note:A#3 clip:1 s:piano release:0.1 pan:0.518518518519 color:#00B8D4 ]", + "[ (42/1 → 43/1) ⇝ 44/1 | note:C#4 clip:1 s:piano release:0.1 pan:0.532407407407 color:#00B8D4 ]", + "[ 42/1 ⇜ (43/1 → 44/1) | note:A#3 clip:1 s:piano release:0.1 pan:0.518518518519 color:#00B8D4 ]", + "[ 42/1 ⇜ (43/1 → 44/1) | note:C#4 clip:1 s:piano release:0.1 pan:0.532407407407 color:#00B8D4 ]", + "[ 43/1 → 44/1 | note:G4 clip:1 s:piano release:0.1 pan:0.560185185185 color:#00B8D4 ]", + "[ 44/1 → 45/1 | note:B4 clip:1 s:piano release:0.1 pan:0.578703703704 color:#00B8D4 ]", + "[ (44/1 → 45/1) ⇝ 46/1 | note:C#4 clip:1 s:piano release:0.1 pan:0.532407407407 color:#00B8D4 ]", + "[ (44/1 → 45/1) ⇝ 46/1 | note:E4 clip:1 s:piano release:0.1 pan:0.546296296296 color:#00B8D4 ]", + "[ 44/1 ⇜ (45/1 → 46/1) | note:C#4 clip:1 s:piano release:0.1 pan:0.532407407407 color:#00B8D4 ]", + "[ 44/1 ⇜ (45/1 → 46/1) | note:E4 clip:1 s:piano release:0.1 pan:0.546296296296 color:#00B8D4 ]", + "[ 45/1 → 46/1 | note:A#4 clip:1 s:piano release:0.1 pan:0.574074074074 color:#00B8D4 ]", + "[ 46/1 → 47/1 | note:C#5 clip:1 s:piano release:0.1 pan:0.587962962963 color:#00B8D4 ]", + "[ (46/1 → 47/1) ⇝ 48/1 | note:D4 clip:1 s:piano release:0.1 pan:0.537037037037 color:#00B8D4 ]", + "[ (46/1 → 47/1) ⇝ 48/1 | note:F#4 clip:1 s:piano release:0.1 pan:0.555555555556 color:#00B8D4 ]", + "[ 46/1 ⇜ (47/1 → 48/1) | note:D4 clip:1 s:piano release:0.1 pan:0.537037037037 color:#00B8D4 ]", + "[ 46/1 ⇜ (47/1 → 48/1) | note:F#4 clip:1 s:piano release:0.1 pan:0.555555555556 color:#00B8D4 ]", + "[ 47/1 → 48/1 | note:B4 clip:1 s:piano release:0.1 pan:0.578703703704 color:#00B8D4 ]", + "[ 48/1 → 49/1 | note:C4 clip:1 s:piano release:0.1 pan:0.527777777778 color:#00B8D4 ]", + "[ (48/1 → 49/1) ⇝ 50/1 | note:Db3 clip:1 s:piano release:0.1 pan:0.476851851852 color:#00B8D4 ]", + "[ (48/1 → 49/1) ⇝ 50/1 | note:F3 clip:1 s:piano release:0.1 pan:0.49537037037 color:#00B8D4 ]", + "[ 48/1 ⇜ (49/1 → 50/1) | note:Db3 clip:1 s:piano release:0.1 pan:0.476851851852 color:#00B8D4 ]", + "[ 48/1 ⇜ (49/1 → 50/1) | note:F3 clip:1 s:piano release:0.1 pan:0.49537037037 color:#00B8D4 ]", + "[ 49/1 → 50/1 | note:Bb3 clip:1 s:piano release:0.1 pan:0.518518518519 color:#00B8D4 ]", + "[ 50/1 → 51/1 | note:Db4 clip:1 s:piano release:0.1 pan:0.532407407407 color:#00B8D4 ]", + "[ (50/1 → 51/1) ⇝ 52/1 | note:Eb3 clip:1 s:piano release:0.1 pan:0.486111111111 color:#00B8D4 ]", "[ (50/1 → 51/1) ⇝ 52/1 | note:Gb3 clip:1 s:piano release:0.1 pan:0.5 color:#00B8D4 ]", - "[ 50/1 ⇜ (51/1 → 52/1) | note:Eb3 clip:1 s:piano release:0.1 pan:0.4861111111111111 color:#00B8D4 ]", + "[ 50/1 ⇜ (51/1 → 52/1) | note:Eb3 clip:1 s:piano release:0.1 pan:0.486111111111 color:#00B8D4 ]", "[ 50/1 ⇜ (51/1 → 52/1) | note:Gb3 clip:1 s:piano release:0.1 pan:0.5 color:#00B8D4 ]", - "[ 51/1 → 52/1 | note:C4 clip:1 s:piano release:0.1 pan:0.5277777777777778 color:#00B8D4 ]", - "[ 52/1 → 53/1 | note:Eb4 clip:1 s:piano release:0.1 pan:0.5416666666666667 color:#00B8D4 ]", - "[ (52/1 → 53/1) ⇝ 54/1 | note:F3 clip:1 s:piano release:0.1 pan:0.49537037037037035 color:#00B8D4 ]", - "[ (52/1 → 53/1) ⇝ 54/1 | note:Ab3 clip:1 s:piano release:0.1 pan:0.5092592592592593 color:#00B8D4 ]", - "[ 52/1 ⇜ (53/1 → 54/1) | note:F3 clip:1 s:piano release:0.1 pan:0.49537037037037035 color:#00B8D4 ]", - "[ 52/1 ⇜ (53/1 → 54/1) | note:Ab3 clip:1 s:piano release:0.1 pan:0.5092592592592593 color:#00B8D4 ]", - "[ 53/1 → 54/1 | note:Db4 clip:1 s:piano release:0.1 pan:0.5324074074074074 color:#00B8D4 ]", - "[ 54/1 → 55/1 | note:F4 clip:1 s:piano release:0.1 pan:0.5509259259259259 color:#00B8D4 ]", + "[ 51/1 → 52/1 | note:C4 clip:1 s:piano release:0.1 pan:0.527777777778 color:#00B8D4 ]", + "[ 52/1 → 53/1 | note:Eb4 clip:1 s:piano release:0.1 pan:0.541666666667 color:#00B8D4 ]", + "[ (52/1 → 53/1) ⇝ 54/1 | note:F3 clip:1 s:piano release:0.1 pan:0.49537037037 color:#00B8D4 ]", + "[ (52/1 → 53/1) ⇝ 54/1 | note:Ab3 clip:1 s:piano release:0.1 pan:0.509259259259 color:#00B8D4 ]", + "[ 52/1 ⇜ (53/1 → 54/1) | note:F3 clip:1 s:piano release:0.1 pan:0.49537037037 color:#00B8D4 ]", + "[ 52/1 ⇜ (53/1 → 54/1) | note:Ab3 clip:1 s:piano release:0.1 pan:0.509259259259 color:#00B8D4 ]", + "[ 53/1 → 54/1 | note:Db4 clip:1 s:piano release:0.1 pan:0.532407407407 color:#00B8D4 ]", + "[ 54/1 → 55/1 | note:F4 clip:1 s:piano release:0.1 pan:0.550925925926 color:#00B8D4 ]", "[ (54/1 → 55/1) ⇝ 56/1 | note:Gb3 clip:1 s:piano release:0.1 pan:0.5 color:#00B8D4 ]", - "[ (54/1 → 55/1) ⇝ 56/1 | note:A3 clip:1 s:piano release:0.1 pan:0.5138888888888888 color:#00B8D4 ]", + "[ (54/1 → 55/1) ⇝ 56/1 | note:A3 clip:1 s:piano release:0.1 pan:0.513888888889 color:#00B8D4 ]", "[ 54/1 ⇜ (55/1 → 56/1) | note:Gb3 clip:1 s:piano release:0.1 pan:0.5 color:#00B8D4 ]", - "[ 54/1 ⇜ (55/1 → 56/1) | note:A3 clip:1 s:piano release:0.1 pan:0.5138888888888888 color:#00B8D4 ]", - "[ 55/1 → 56/1 | note:Eb4 clip:1 s:piano release:0.1 pan:0.5416666666666667 color:#00B8D4 ]", - "[ 56/1 → 57/1 | note:Gb4 clip:1 s:piano release:0.1 pan:0.5555555555555556 color:#00B8D4 ]", - "[ (56/1 → 57/1) ⇝ 58/1 | note:Ab3 clip:1 s:piano release:0.1 pan:0.5092592592592593 color:#00B8D4 ]", - "[ (56/1 → 57/1) ⇝ 58/1 | note:Bb3 clip:1 s:piano release:0.1 pan:0.5185185185185186 color:#00B8D4 ]", - "[ 56/1 ⇜ (57/1 → 58/1) | note:Ab3 clip:1 s:piano release:0.1 pan:0.5092592592592593 color:#00B8D4 ]", - "[ 56/1 ⇜ (57/1 → 58/1) | note:Bb3 clip:1 s:piano release:0.1 pan:0.5185185185185186 color:#00B8D4 ]", - "[ 57/1 → 58/1 | note:F4 clip:1 s:piano release:0.1 pan:0.5509259259259259 color:#00B8D4 ]", - "[ 58/1 → 59/1 | note:Ab4 clip:1 s:piano release:0.1 pan:0.5648148148148149 color:#00B8D4 ]", - "[ (58/1 → 59/1) ⇝ 60/1 | note:A3 clip:1 s:piano release:0.1 pan:0.5138888888888888 color:#00B8D4 ]", - "[ (58/1 → 59/1) ⇝ 60/1 | note:C4 clip:1 s:piano release:0.1 pan:0.5277777777777778 color:#00B8D4 ]", - "[ 58/1 ⇜ (59/1 → 60/1) | note:A3 clip:1 s:piano release:0.1 pan:0.5138888888888888 color:#00B8D4 ]", - "[ 58/1 ⇜ (59/1 → 60/1) | note:C4 clip:1 s:piano release:0.1 pan:0.5277777777777778 color:#00B8D4 ]", - "[ 59/1 → 60/1 | note:Gb4 clip:1 s:piano release:0.1 pan:0.5555555555555556 color:#00B8D4 ]", - "[ 60/1 → 61/1 | note:Bb4 clip:1 s:piano release:0.1 pan:0.5740740740740741 color:#00B8D4 ]", - "[ (60/1 → 61/1) ⇝ 62/1 | note:C4 clip:1 s:piano release:0.1 pan:0.5277777777777778 color:#00B8D4 ]", - "[ (60/1 → 61/1) ⇝ 62/1 | note:Eb4 clip:1 s:piano release:0.1 pan:0.5416666666666667 color:#00B8D4 ]", - "[ 60/1 ⇜ (61/1 → 62/1) | note:C4 clip:1 s:piano release:0.1 pan:0.5277777777777778 color:#00B8D4 ]", - "[ 60/1 ⇜ (61/1 → 62/1) | note:Eb4 clip:1 s:piano release:0.1 pan:0.5416666666666667 color:#00B8D4 ]", - "[ 61/1 → 62/1 | note:A4 clip:1 s:piano release:0.1 pan:0.5694444444444444 color:#00B8D4 ]", - "[ 62/1 → 63/1 | note:C5 clip:1 s:piano release:0.1 pan:0.5833333333333333 color:#00B8D4 ]", - "[ (62/1 → 63/1) ⇝ 64/1 | note:Db4 clip:1 s:piano release:0.1 pan:0.5324074074074074 color:#00B8D4 ]", - "[ (62/1 → 63/1) ⇝ 64/1 | note:F4 clip:1 s:piano release:0.1 pan:0.5509259259259259 color:#00B8D4 ]", - "[ 62/1 ⇜ (63/1 → 64/1) | note:Db4 clip:1 s:piano release:0.1 pan:0.5324074074074074 color:#00B8D4 ]", - "[ 62/1 ⇜ (63/1 → 64/1) | note:F4 clip:1 s:piano release:0.1 pan:0.5509259259259259 color:#00B8D4 ]", - "[ 63/1 → 64/1 | note:Bb4 clip:1 s:piano release:0.1 pan:0.5740740740740741 color:#00B8D4 ]", + "[ 54/1 ⇜ (55/1 → 56/1) | note:A3 clip:1 s:piano release:0.1 pan:0.513888888889 color:#00B8D4 ]", + "[ 55/1 → 56/1 | note:Eb4 clip:1 s:piano release:0.1 pan:0.541666666667 color:#00B8D4 ]", + "[ 56/1 → 57/1 | note:Gb4 clip:1 s:piano release:0.1 pan:0.555555555556 color:#00B8D4 ]", + "[ (56/1 → 57/1) ⇝ 58/1 | note:Ab3 clip:1 s:piano release:0.1 pan:0.509259259259 color:#00B8D4 ]", + "[ (56/1 → 57/1) ⇝ 58/1 | note:Bb3 clip:1 s:piano release:0.1 pan:0.518518518519 color:#00B8D4 ]", + "[ 56/1 ⇜ (57/1 → 58/1) | note:Ab3 clip:1 s:piano release:0.1 pan:0.509259259259 color:#00B8D4 ]", + "[ 56/1 ⇜ (57/1 → 58/1) | note:Bb3 clip:1 s:piano release:0.1 pan:0.518518518519 color:#00B8D4 ]", + "[ 57/1 → 58/1 | note:F4 clip:1 s:piano release:0.1 pan:0.550925925926 color:#00B8D4 ]", + "[ 58/1 → 59/1 | note:Ab4 clip:1 s:piano release:0.1 pan:0.564814814815 color:#00B8D4 ]", + "[ (58/1 → 59/1) ⇝ 60/1 | note:A3 clip:1 s:piano release:0.1 pan:0.513888888889 color:#00B8D4 ]", + "[ (58/1 → 59/1) ⇝ 60/1 | note:C4 clip:1 s:piano release:0.1 pan:0.527777777778 color:#00B8D4 ]", + "[ 58/1 ⇜ (59/1 → 60/1) | note:A3 clip:1 s:piano release:0.1 pan:0.513888888889 color:#00B8D4 ]", + "[ 58/1 ⇜ (59/1 → 60/1) | note:C4 clip:1 s:piano release:0.1 pan:0.527777777778 color:#00B8D4 ]", + "[ 59/1 → 60/1 | note:Gb4 clip:1 s:piano release:0.1 pan:0.555555555556 color:#00B8D4 ]", + "[ 60/1 → 61/1 | note:Bb4 clip:1 s:piano release:0.1 pan:0.574074074074 color:#00B8D4 ]", + "[ (60/1 → 61/1) ⇝ 62/1 | note:C4 clip:1 s:piano release:0.1 pan:0.527777777778 color:#00B8D4 ]", + "[ (60/1 → 61/1) ⇝ 62/1 | note:Eb4 clip:1 s:piano release:0.1 pan:0.541666666667 color:#00B8D4 ]", + "[ 60/1 ⇜ (61/1 → 62/1) | note:C4 clip:1 s:piano release:0.1 pan:0.527777777778 color:#00B8D4 ]", + "[ 60/1 ⇜ (61/1 → 62/1) | note:Eb4 clip:1 s:piano release:0.1 pan:0.541666666667 color:#00B8D4 ]", + "[ 61/1 → 62/1 | note:A4 clip:1 s:piano release:0.1 pan:0.569444444444 color:#00B8D4 ]", + "[ 62/1 → 63/1 | note:C5 clip:1 s:piano release:0.1 pan:0.583333333333 color:#00B8D4 ]", + "[ (62/1 → 63/1) ⇝ 64/1 | note:Db4 clip:1 s:piano release:0.1 pan:0.532407407407 color:#00B8D4 ]", + "[ (62/1 → 63/1) ⇝ 64/1 | note:F4 clip:1 s:piano release:0.1 pan:0.550925925926 color:#00B8D4 ]", + "[ 62/1 ⇜ (63/1 → 64/1) | note:Db4 clip:1 s:piano release:0.1 pan:0.532407407407 color:#00B8D4 ]", + "[ 62/1 ⇜ (63/1 → 64/1) | note:F4 clip:1 s:piano release:0.1 pan:0.550925925926 color:#00B8D4 ]", + "[ 63/1 → 64/1 | note:Bb4 clip:1 s:piano release:0.1 pan:0.574074074074 color:#00B8D4 ]", ] `; @@ -260,40 +260,40 @@ exports[`renders tunes > tune: bassFuge 1`] = ` "[ 0/1 → 1/8 | note:A2 s:flbass n:0 gain:0.3 cutoff:2100 resonance:10 clip:1 ]", "[ -7/4 ⇜ (0/1 → 1/4) | note:C4 s:flbass n:0 gain:0.3 cutoff:200 resonance:10 clip:1 ]", "[ -7/4 ⇜ (0/1 → 1/4) | note:E4 s:flbass n:0 gain:0.3 cutoff:200 resonance:10 clip:1 ]", - "[ -3/2 ⇜ (0/1 → 1/4) ⇝ 1/2 | gain:0.3 note:A4 s:flbass n:0 cutoff:247.63696685453513 resonance:10 clip:1 ]", - "[ -3/2 ⇜ (0/1 → 1/4) ⇝ 1/2 | gain:0.3 note:C5 s:flbass n:0 cutoff:247.63696685453513 resonance:10 clip:1 ]", - "[ -5/4 ⇜ (0/1 → 1/4) ⇝ 3/4 | gain:0.15 note:A4 s:flbass n:0 cutoff:388.1591509854036 resonance:10 clip:1 ]", - "[ -5/4 ⇜ (0/1 → 1/4) ⇝ 3/4 | gain:0.15 note:C5 s:flbass n:0 cutoff:388.1591509854036 resonance:10 clip:1 ]", + "[ -3/2 ⇜ (0/1 → 1/4) ⇝ 1/2 | gain:0.3 note:A4 s:flbass n:0 cutoff:247.636966854535 resonance:10 clip:1 ]", + "[ -3/2 ⇜ (0/1 → 1/4) ⇝ 1/2 | gain:0.3 note:C5 s:flbass n:0 cutoff:247.636966854535 resonance:10 clip:1 ]", + "[ -5/4 ⇜ (0/1 → 1/4) ⇝ 3/4 | gain:0.15 note:A4 s:flbass n:0 cutoff:388.159150985404 resonance:10 clip:1 ]", + "[ -5/4 ⇜ (0/1 → 1/4) ⇝ 3/4 | gain:0.15 note:C5 s:flbass n:0 cutoff:388.159150985404 resonance:10 clip:1 ]", "[ 0/1 → 1/4 | note:A3 s:flbass n:0 gain:0.3 cutoff:2100 resonance:10 clip:1 ]", - "[ -1/1 ⇜ (0/1 → 1/2) ⇝ 1/1 | gain:0.075 note:A4 s:flbass n:0 cutoff:614.5201833107434 resonance:10 clip:1 ]", - "[ -1/1 ⇜ (0/1 → 1/2) ⇝ 1/1 | gain:0.075 note:C5 s:flbass n:0 cutoff:614.5201833107434 resonance:10 clip:1 ]", + "[ -1/1 ⇜ (0/1 → 1/2) ⇝ 1/1 | gain:0.075 note:A4 s:flbass n:0 cutoff:614.520183310743 resonance:10 clip:1 ]", + "[ -1/1 ⇜ (0/1 → 1/2) ⇝ 1/1 | gain:0.075 note:C5 s:flbass n:0 cutoff:614.520183310743 resonance:10 clip:1 ]", "[ 0/1 → 1/2 | s:bd n:1 ]", - "[ -3/4 ⇜ (0/1 → 3/4) ⇝ 5/4 | gain:0.0375 note:A4 s:flbass n:0 cutoff:915.3693764684064 resonance:10 clip:1 ]", - "[ -3/4 ⇜ (0/1 → 3/4) ⇝ 5/4 | gain:0.0375 note:C5 s:flbass n:0 cutoff:915.3693764684064 resonance:10 clip:1 ]", - "[ -3/2 ⇜ (1/4 → 1/2) | gain:0.3 note:A4 s:flbass n:0 cutoff:247.63696685453513 resonance:10 clip:1 ]", - "[ -3/2 ⇜ (1/4 → 1/2) | gain:0.3 note:C5 s:flbass n:0 cutoff:247.63696685453513 resonance:10 clip:1 ]", - "[ -5/4 ⇜ (1/4 → 1/2) ⇝ 3/4 | gain:0.15 note:A4 s:flbass n:0 cutoff:388.1591509854036 resonance:10 clip:1 ]", - "[ -5/4 ⇜ (1/4 → 1/2) ⇝ 3/4 | gain:0.15 note:C5 s:flbass n:0 cutoff:388.1591509854036 resonance:10 clip:1 ]", + "[ -3/4 ⇜ (0/1 → 3/4) ⇝ 5/4 | gain:0.0375 note:A4 s:flbass n:0 cutoff:915.369376468406 resonance:10 clip:1 ]", + "[ -3/4 ⇜ (0/1 → 3/4) ⇝ 5/4 | gain:0.0375 note:C5 s:flbass n:0 cutoff:915.369376468406 resonance:10 clip:1 ]", + "[ -3/2 ⇜ (1/4 → 1/2) | gain:0.3 note:A4 s:flbass n:0 cutoff:247.636966854535 resonance:10 clip:1 ]", + "[ -3/2 ⇜ (1/4 → 1/2) | gain:0.3 note:C5 s:flbass n:0 cutoff:247.636966854535 resonance:10 clip:1 ]", + "[ -5/4 ⇜ (1/4 → 1/2) ⇝ 3/4 | gain:0.15 note:A4 s:flbass n:0 cutoff:388.159150985404 resonance:10 clip:1 ]", + "[ -5/4 ⇜ (1/4 → 1/2) ⇝ 3/4 | gain:0.15 note:C5 s:flbass n:0 cutoff:388.159150985404 resonance:10 clip:1 ]", "[ 1/4 → 1/2 | note:C4 s:flbass n:0 gain:0.3 cutoff:2522.789774516997 resonance:10 clip:1 ]", "[ 1/4 → 1/2 | note:E4 s:flbass n:0 gain:0.3 cutoff:2522.789774516997 resonance:10 clip:1 ]", "[ 1/4 → 1/2 | s:hh n:0 ]", - "[ 3/8 → 1/2 | note:A2 s:flbass n:0 gain:0.3 cutoff:2727.5302177148174 resonance:10 clip:1 ]", - "[ -5/4 ⇜ (1/2 → 3/4) | gain:0.15 note:A4 s:flbass n:0 cutoff:388.1591509854036 resonance:10 clip:1 ]", - "[ -5/4 ⇜ (1/2 → 3/4) | gain:0.15 note:C5 s:flbass n:0 cutoff:388.1591509854036 resonance:10 clip:1 ]", - "[ -1/1 ⇜ (1/2 → 3/4) ⇝ 1/1 | gain:0.075 note:A4 s:flbass n:0 cutoff:614.5201833107434 resonance:10 clip:1 ]", - "[ -1/1 ⇜ (1/2 → 3/4) ⇝ 1/1 | gain:0.075 note:C5 s:flbass n:0 cutoff:614.5201833107434 resonance:10 clip:1 ]", - "[ 1/2 → 3/4 | gain:0.3 note:A4 s:flbass n:0 cutoff:2924.3791043233605 resonance:10 clip:1 ]", - "[ 1/2 → 3/4 | gain:0.3 note:C5 s:flbass n:0 cutoff:2924.3791043233605 resonance:10 clip:1 ]", + "[ 3/8 → 1/2 | note:A2 s:flbass n:0 gain:0.3 cutoff:2727.530217714817 resonance:10 clip:1 ]", + "[ -5/4 ⇜ (1/2 → 3/4) | gain:0.15 note:A4 s:flbass n:0 cutoff:388.159150985404 resonance:10 clip:1 ]", + "[ -5/4 ⇜ (1/2 → 3/4) | gain:0.15 note:C5 s:flbass n:0 cutoff:388.159150985404 resonance:10 clip:1 ]", + "[ -1/1 ⇜ (1/2 → 3/4) ⇝ 1/1 | gain:0.075 note:A4 s:flbass n:0 cutoff:614.520183310743 resonance:10 clip:1 ]", + "[ -1/1 ⇜ (1/2 → 3/4) ⇝ 1/1 | gain:0.075 note:C5 s:flbass n:0 cutoff:614.520183310743 resonance:10 clip:1 ]", + "[ 1/2 → 3/4 | gain:0.3 note:A4 s:flbass n:0 cutoff:2924.37910432336 resonance:10 clip:1 ]", + "[ 1/2 → 3/4 | gain:0.3 note:C5 s:flbass n:0 cutoff:2924.37910432336 resonance:10 clip:1 ]", "[ 1/2 → 1/1 | s:bd n:1 ]", "[ 1/2 → 1/1 | s:sd n:0 ]", - "[ 3/4 → 7/8 | note:A2 s:flbass n:0 gain:0.3 cutoff:3284.6306235315933 resonance:10 clip:1 ]", - "[ -1/1 ⇜ (3/4 → 1/1) | gain:0.075 note:A4 s:flbass n:0 cutoff:614.5201833107434 resonance:10 clip:1 ]", - "[ -1/1 ⇜ (3/4 → 1/1) | gain:0.075 note:C5 s:flbass n:0 cutoff:614.5201833107434 resonance:10 clip:1 ]", - "[ -3/4 ⇜ (3/4 → 1/1) ⇝ 5/4 | gain:0.0375 note:A4 s:flbass n:0 cutoff:915.3693764684064 resonance:10 clip:1 ]", - "[ -3/4 ⇜ (3/4 → 1/1) ⇝ 5/4 | gain:0.0375 note:C5 s:flbass n:0 cutoff:915.3693764684064 resonance:10 clip:1 ]", - "[ 3/4 → 1/1 | note:A3 s:flbass n:0 gain:0.3 cutoff:3284.6306235315933 resonance:10 clip:1 ]", - "[ 3/4 → 1/1 | gain:0.15 note:A4 s:flbass n:0 cutoff:3284.6306235315933 resonance:10 clip:1 ]", - "[ 3/4 → 1/1 | gain:0.15 note:C5 s:flbass n:0 cutoff:3284.6306235315933 resonance:10 clip:1 ]", + "[ 3/4 → 7/8 | note:A2 s:flbass n:0 gain:0.3 cutoff:3284.630623531593 resonance:10 clip:1 ]", + "[ -1/1 ⇜ (3/4 → 1/1) | gain:0.075 note:A4 s:flbass n:0 cutoff:614.520183310743 resonance:10 clip:1 ]", + "[ -1/1 ⇜ (3/4 → 1/1) | gain:0.075 note:C5 s:flbass n:0 cutoff:614.520183310743 resonance:10 clip:1 ]", + "[ -3/4 ⇜ (3/4 → 1/1) ⇝ 5/4 | gain:0.0375 note:A4 s:flbass n:0 cutoff:915.369376468406 resonance:10 clip:1 ]", + "[ -3/4 ⇜ (3/4 → 1/1) ⇝ 5/4 | gain:0.0375 note:C5 s:flbass n:0 cutoff:915.369376468406 resonance:10 clip:1 ]", + "[ 3/4 → 1/1 | note:A3 s:flbass n:0 gain:0.3 cutoff:3284.630623531593 resonance:10 clip:1 ]", + "[ 3/4 → 1/1 | gain:0.15 note:A4 s:flbass n:0 cutoff:3284.630623531593 resonance:10 clip:1 ]", + "[ 3/4 → 1/1 | gain:0.15 note:C5 s:flbass n:0 cutoff:3284.630623531593 resonance:10 clip:1 ]", "[ 3/4 → 1/1 | s:hh n:0 ]", ] `; @@ -303,16 +303,16 @@ exports[`renders tunes > tune: belldub 1`] = ` "[ 0/1 → 5/16 | s:mt gain:0.5 room:0.5 speed:0.5 ]", "[ 0/1 → 5/8 | note:G1 s:sawtooth cutoff:200 resonance:20 gain:0.15 shape:0.6 release:0.05 ]", "[ 0/1 → 5/8 | note:31.02 s:sawtooth cutoff:200 resonance:20 gain:0.15 shape:0.6 release:0.05 ]", - "[ (0/1 → 1/1) ⇝ 5/1 | s:misc n:2 speed:1 delay:0.5 delaytime:0.3333333333333333 gain:0.4 ]", - "[ (5/8 → 1/1) ⇝ 5/4 | s:hh room:0 end:0.028173022316468635 ]", - "[ (5/8 → 1/1) ⇝ 5/4 | note:58 s:sawtooth gain:0.8 cutoff:400.0503291283066 decay:0.05125097280354112 sustain:0 delay:0.9 room:1 ]", - "[ (5/8 → 1/1) ⇝ 5/4 | note:58.1 s:sawtooth gain:0.8 cutoff:400.0503291283066 decay:0.05125097280354112 sustain:0 delay:0.9 room:1 ]", - "[ (5/8 → 1/1) ⇝ 5/4 | note:62 s:sawtooth gain:0.8 cutoff:400.0503291283066 decay:0.05125097280354112 sustain:0 delay:0.9 room:1 ]", - "[ (5/8 → 1/1) ⇝ 5/4 | note:62.1 s:sawtooth gain:0.8 cutoff:400.0503291283066 decay:0.05125097280354112 sustain:0 delay:0.9 room:1 ]", - "[ (5/8 → 1/1) ⇝ 5/4 | note:65 s:sawtooth gain:0.8 cutoff:400.0503291283066 decay:0.05125097280354112 sustain:0 delay:0.9 room:1 ]", - "[ (5/8 → 1/1) ⇝ 5/4 | note:65.1 s:sawtooth gain:0.8 cutoff:400.0503291283066 decay:0.05125097280354112 sustain:0 delay:0.9 room:1 ]", - "[ (5/8 → 1/1) ⇝ 5/4 | note:69 s:sawtooth gain:0.8 cutoff:400.0503291283066 decay:0.05125097280354112 sustain:0 delay:0.9 room:1 ]", - "[ (5/8 → 1/1) ⇝ 5/4 | note:69.1 s:sawtooth gain:0.8 cutoff:400.0503291283066 decay:0.05125097280354112 sustain:0 delay:0.9 room:1 ]", + "[ (0/1 → 1/1) ⇝ 5/1 | s:misc n:2 speed:1 delay:0.5 delaytime:0.333333333333 gain:0.4 ]", + "[ (5/8 → 1/1) ⇝ 5/4 | s:hh room:0 end:0.028173022316 ]", + "[ (5/8 → 1/1) ⇝ 5/4 | note:58 s:sawtooth gain:0.8 cutoff:400.050329128307 decay:0.051250972804 sustain:0 delay:0.9 room:1 ]", + "[ (5/8 → 1/1) ⇝ 5/4 | note:58.1 s:sawtooth gain:0.8 cutoff:400.050329128307 decay:0.051250972804 sustain:0 delay:0.9 room:1 ]", + "[ (5/8 → 1/1) ⇝ 5/4 | note:62 s:sawtooth gain:0.8 cutoff:400.050329128307 decay:0.051250972804 sustain:0 delay:0.9 room:1 ]", + "[ (5/8 → 1/1) ⇝ 5/4 | note:62.1 s:sawtooth gain:0.8 cutoff:400.050329128307 decay:0.051250972804 sustain:0 delay:0.9 room:1 ]", + "[ (5/8 → 1/1) ⇝ 5/4 | note:65 s:sawtooth gain:0.8 cutoff:400.050329128307 decay:0.051250972804 sustain:0 delay:0.9 room:1 ]", + "[ (5/8 → 1/1) ⇝ 5/4 | note:65.1 s:sawtooth gain:0.8 cutoff:400.050329128307 decay:0.051250972804 sustain:0 delay:0.9 room:1 ]", + "[ (5/8 → 1/1) ⇝ 5/4 | note:69 s:sawtooth gain:0.8 cutoff:400.050329128307 decay:0.051250972804 sustain:0 delay:0.9 room:1 ]", + "[ (5/8 → 1/1) ⇝ 5/4 | note:69.1 s:sawtooth gain:0.8 cutoff:400.050329128307 decay:0.051250972804 sustain:0 delay:0.9 room:1 ]", "[ (5/8 → 1/1) ⇝ 5/4 | note:F4 s:bell begin:0.05 delay:0.2 gain:0.4 ]", "[ (15/16 → 1/1) ⇝ 5/4 | s:lt gain:0.5 room:0.5 speed:0.5 ]", ] @@ -320,21 +320,21 @@ exports[`renders tunes > tune: belldub 1`] = ` exports[`renders tunes > tune: blippyRhodes 1`] = ` [ - "[ 0/1 → 1/6 | note:G4 clip:0.3 s:rhodes room:0.5 delay:0.3 delayfeedback:0.4 delaytime:0.08333333333333333 gain:0.5 color:#7ED321 ]", + "[ 0/1 → 1/6 | note:G4 clip:0.3 s:rhodes room:0.5 delay:0.3 delayfeedback:0.4 delaytime:0.083333333333 gain:0.5 color:#7ED321 ]", "[ 0/1 → 1/3 | s:bd color:#00B8D4 ]", "[ (0/1 → 2/3) ⇝ 4/3 | note:36 gain:0.3 clip:1 cutoff:600 lpattack:0.2 lpenv:-4 s:sawtooth color:#F8E71C ]", "[ (0/1 → 2/3) ⇝ 4/3 | note:36.02 gain:0.3 clip:1 cutoff:600 lpattack:0.2 lpenv:-4 s:sawtooth color:#F8E71C ]", - "[ 1/6 → 1/3 | note:G4 clip:0.3 s:rhodes room:0.5 delay:0.3 delayfeedback:0.4 delaytime:0.08333333333333333 gain:0.5 color:#7ED321 ]", - "[ 1/3 → 1/2 | note:B3 clip:0.3 s:rhodes room:0.5 delay:0.3 delayfeedback:0.4 delaytime:0.08333333333333333 gain:0.5 color:#7ED321 ]", - "[ 1/3 → 1/2 | note:E4 clip:0.3 s:rhodes room:0.5 delay:0.3 delayfeedback:0.4 delaytime:0.08333333333333333 gain:0.5 color:#7ED321 ]", + "[ 1/6 → 1/3 | note:G4 clip:0.3 s:rhodes room:0.5 delay:0.3 delayfeedback:0.4 delaytime:0.083333333333 gain:0.5 color:#7ED321 ]", + "[ 1/3 → 1/2 | note:B3 clip:0.3 s:rhodes room:0.5 delay:0.3 delayfeedback:0.4 delaytime:0.083333333333 gain:0.5 color:#7ED321 ]", + "[ 1/3 → 1/2 | note:E4 clip:0.3 s:rhodes room:0.5 delay:0.3 delayfeedback:0.4 delaytime:0.083333333333 gain:0.5 color:#7ED321 ]", "[ 1/3 → 2/3 | s:hh color:#00B8D4 ]", - "[ 1/2 → 2/3 | note:B3 clip:0.3 s:rhodes room:0.5 delay:0.3 delayfeedback:0.4 delaytime:0.08333333333333333 gain:0.5 color:#7ED321 ]", - "[ 1/2 → 2/3 | note:E4 clip:0.3 s:rhodes room:0.5 delay:0.3 delayfeedback:0.4 delaytime:0.08333333333333333 gain:0.5 color:#7ED321 ]", - "[ 2/3 → 5/6 | note:G3 clip:0.3 s:rhodes room:0.5 delay:0.3 delayfeedback:0.4 delaytime:0.08333333333333333 gain:0.5 color:#7ED321 ]", + "[ 1/2 → 2/3 | note:B3 clip:0.3 s:rhodes room:0.5 delay:0.3 delayfeedback:0.4 delaytime:0.083333333333 gain:0.5 color:#7ED321 ]", + "[ 1/2 → 2/3 | note:E4 clip:0.3 s:rhodes room:0.5 delay:0.3 delayfeedback:0.4 delaytime:0.083333333333 gain:0.5 color:#7ED321 ]", + "[ 2/3 → 5/6 | note:G3 clip:0.3 s:rhodes room:0.5 delay:0.3 delayfeedback:0.4 delaytime:0.083333333333 gain:0.5 color:#7ED321 ]", "[ 0/1 ⇜ (2/3 → 1/1) ⇝ 4/3 | note:36 gain:0.3 clip:1 cutoff:600 lpattack:0.2 lpenv:-4 s:sawtooth color:#F8E71C ]", "[ 0/1 ⇜ (2/3 → 1/1) ⇝ 4/3 | note:36.02 gain:0.3 clip:1 cutoff:600 lpattack:0.2 lpenv:-4 s:sawtooth color:#F8E71C ]", "[ 2/3 → 1/1 | s:sn color:#00B8D4 ]", - "[ 5/6 → 1/1 | note:G3 clip:0.3 s:rhodes room:0.5 delay:0.3 delayfeedback:0.4 delaytime:0.08333333333333333 gain:0.5 color:#7ED321 ]", + "[ 5/6 → 1/1 | note:G3 clip:0.3 s:rhodes room:0.5 delay:0.3 delayfeedback:0.4 delaytime:0.083333333333 gain:0.5 color:#7ED321 ]", ] `; @@ -1148,5748 +1148,5748 @@ exports[`renders tunes > tune: dinofunk 1`] = ` exports[`renders tunes > tune: echoPiano 1`] = ` [ - "[ -3/8 ⇜ (0/1 → 1/8) | color:salmon note:G3 gain:0.5 clip:1 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ -3/8 ⇜ (0/1 → 1/8) | color:steelblue note:F4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ -3/8 ⇜ (0/1 → 1/8) | color:green note:Bb3 gain:0.125 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ -1/8 ⇜ (0/1 → 1/8) | color:steelblue note:D5 gain:0.125 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ -1/8 ⇜ (0/1 → 1/8) ⇝ 3/8 | color:green note:Bb3 gain:0.5 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ -1/8 ⇜ (0/1 → 1/8) ⇝ 3/8 | color:steelblue note:A4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ -1/4 ⇜ (0/1 → 1/4) | color:green note:Bb3 gain:1 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ -1/4 ⇜ (0/1 → 1/4) | color:steelblue note:A4 gain:1 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ -1/4 ⇜ (0/1 → 1/4) | color:salmon note:G3 gain:0.25 clip:1 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ -1/4 ⇜ (0/1 → 1/4) | color:steelblue note:F4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ (0/1 → 1/4) ⇝ 1/2 | color:green note:Bb3 gain:0.25 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ (0/1 → 1/4) ⇝ 1/2 | color:steelblue note:A4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ -1/8 ⇜ (0/1 → 3/8) | color:salmon note:G3 gain:0.125 clip:1 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ -1/8 ⇜ (0/1 → 3/8) | color:steelblue note:F4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 0/1 → 1/2 | color:steelblue note:F4 gain:1 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 0/1 → 1/1 | color:salmon note:D3 gain:1 clip:1 s:piano release:0.1 pan:0.4814814814814815 ]", - "[ -1/8 ⇜ (1/8 → 3/8) | color:green note:Bb3 gain:0.5 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ -1/8 ⇜ (1/8 → 3/8) | color:steelblue note:A4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ (1/8 → 3/8) ⇝ 5/8 | color:green note:Bb3 gain:0.125 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ (1/8 → 3/8) ⇝ 5/8 | color:steelblue note:A4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 1/8 → 5/8 | color:steelblue note:F4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ (1/8 → 1/1) ⇝ 9/8 | color:salmon note:D3 gain:0.5 clip:1 s:piano release:0.1 pan:0.4814814814814815 ]", - "[ 0/1 ⇜ (1/4 → 1/2) | color:green note:Bb3 gain:0.25 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 0/1 ⇜ (1/4 → 1/2) | color:steelblue note:A4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ (1/4 → 1/2) ⇝ 3/4 | color:steelblue note:A4 gain:1 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 1/4 → 3/4 | color:steelblue note:F4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ (1/4 → 1/1) ⇝ 5/4 | color:green note:F3 gain:1 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ (1/4 → 1/1) ⇝ 5/4 | color:salmon note:D3 gain:0.25 clip:1 s:piano release:0.1 pan:0.4814814814814815 ]", - "[ 1/8 ⇜ (3/8 → 5/8) | color:green note:Bb3 gain:0.125 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 1/8 ⇜ (3/8 → 5/8) | color:steelblue note:A4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ (3/8 → 5/8) ⇝ 7/8 | color:steelblue note:A4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 3/8 → 7/8 | color:steelblue note:F4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ (3/8 → 1/1) ⇝ 11/8 | color:green note:F3 gain:0.5 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ (3/8 → 1/1) ⇝ 11/8 | color:salmon note:D3 gain:0.125 clip:1 s:piano release:0.1 pan:0.4814814814814815 ]", - "[ 1/4 ⇜ (1/2 → 3/4) | color:steelblue note:A4 gain:1 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ (1/2 → 3/4) ⇝ 1/1 | color:steelblue note:A4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ (1/2 → 1/1) ⇝ 3/2 | color:steelblue note:C4 gain:1 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ (1/2 → 1/1) ⇝ 3/2 | color:green note:F3 gain:0.25 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 3/8 ⇜ (5/8 → 7/8) | color:steelblue note:A4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ (5/8 → 7/8) ⇝ 9/8 | color:steelblue note:A4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ (5/8 → 1/1) ⇝ 13/8 | color:steelblue note:C4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ (5/8 → 1/1) ⇝ 13/8 | color:green note:F3 gain:0.125 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 1/2 ⇜ (3/4 → 1/1) | color:steelblue note:A4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ (3/4 → 1/1) ⇝ 7/4 | color:steelblue note:E4 gain:1 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (3/4 → 1/1) ⇝ 7/4 | color:steelblue note:C4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 5/8 ⇜ (7/8 → 1/1) ⇝ 9/8 | color:steelblue note:A4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ (7/8 → 1/1) ⇝ 15/8 | color:steelblue note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (7/8 → 1/1) ⇝ 15/8 | color:steelblue note:C4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 1/8 ⇜ (1/1 → 9/8) | color:salmon note:D3 gain:0.5 clip:1 s:piano release:0.1 pan:0.4814814814814815 ]", - "[ 3/8 ⇜ (1/1 → 9/8) ⇝ 11/8 | color:green note:F3 gain:0.5 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 5/8 ⇜ (1/1 → 9/8) | color:steelblue note:A4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 5/8 ⇜ (1/1 → 9/8) ⇝ 13/8 | color:steelblue note:C4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 7/8 ⇜ (1/1 → 9/8) ⇝ 15/8 | color:steelblue note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 1/4 ⇜ (1/1 → 5/4) | color:green note:F3 gain:1 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 1/4 ⇜ (1/1 → 5/4) | color:salmon note:D3 gain:0.25 clip:1 s:piano release:0.1 pan:0.4814814814814815 ]", - "[ 1/2 ⇜ (1/1 → 5/4) ⇝ 3/2 | color:green note:F3 gain:0.25 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 3/4 ⇜ (1/1 → 5/4) ⇝ 7/4 | color:steelblue note:C4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ (1/1 → 5/4) ⇝ 2/1 | color:steelblue note:E4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 3/8 ⇜ (1/1 → 11/8) | color:salmon note:D3 gain:0.125 clip:1 s:piano release:0.1 pan:0.4814814814814815 ]", - "[ 5/8 ⇜ (1/1 → 11/8) ⇝ 13/8 | color:green note:F3 gain:0.125 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 7/8 ⇜ (1/1 → 11/8) ⇝ 15/8 | color:steelblue note:C4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 1/2 ⇜ (1/1 → 3/2) | color:steelblue note:C4 gain:1 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 3/4 ⇜ (1/1 → 3/2) ⇝ 7/4 | color:steelblue note:E4 gain:1 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 1/1 → 2/1 | color:salmon note:F3 gain:1 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 3/8 ⇜ (9/8 → 11/8) | color:green note:F3 gain:0.5 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ (9/8 → 11/8) ⇝ 17/8 | color:steelblue note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 5/8 ⇜ (9/8 → 13/8) | color:steelblue note:C4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 7/8 ⇜ (9/8 → 13/8) ⇝ 15/8 | color:steelblue note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (9/8 → 2/1) ⇝ 17/8 | color:salmon note:F3 gain:0.5 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 1/2 ⇜ (5/4 → 3/2) | color:green note:F3 gain:0.25 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 3/4 ⇜ (5/4 → 7/4) | color:steelblue note:C4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 1/1 ⇜ (5/4 → 7/4) ⇝ 2/1 | color:steelblue note:E4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (5/4 → 2/1) ⇝ 9/4 | color:green note:A3 gain:1 clip:1 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ (5/4 → 2/1) ⇝ 9/4 | color:salmon note:F3 gain:0.25 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 5/8 ⇜ (11/8 → 13/8) | color:green note:F3 gain:0.125 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 7/8 ⇜ (11/8 → 15/8) | color:steelblue note:C4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 9/8 ⇜ (11/8 → 15/8) ⇝ 17/8 | color:steelblue note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (11/8 → 2/1) ⇝ 19/8 | color:green note:A3 gain:0.5 clip:1 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ (11/8 → 2/1) ⇝ 19/8 | color:salmon note:F3 gain:0.125 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 3/4 ⇜ (3/2 → 7/4) | color:steelblue note:E4 gain:1 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (3/2 → 2/1) ⇝ 5/2 | color:steelblue note:E4 gain:1 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (3/2 → 2/1) ⇝ 5/2 | color:green note:A3 gain:0.25 clip:1 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 7/8 ⇜ (13/8 → 15/8) | color:steelblue note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (13/8 → 2/1) ⇝ 21/8 | color:steelblue note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (13/8 → 2/1) ⇝ 21/8 | color:green note:A3 gain:0.125 clip:1 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 1/1 ⇜ (7/4 → 2/1) | color:steelblue note:E4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (7/4 → 2/1) ⇝ 11/4 | color:steelblue note:G4 gain:1 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (7/4 → 2/1) ⇝ 11/4 | color:steelblue note:E4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 9/8 ⇜ (15/8 → 2/1) ⇝ 17/8 | color:steelblue note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (15/8 → 2/1) ⇝ 23/8 | color:steelblue note:G4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (15/8 → 2/1) ⇝ 23/8 | color:steelblue note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 9/8 ⇜ (2/1 → 17/8) | color:salmon note:F3 gain:0.5 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 9/8 ⇜ (2/1 → 17/8) | color:steelblue note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 11/8 ⇜ (2/1 → 17/8) ⇝ 19/8 | color:green note:A3 gain:0.5 clip:1 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 13/8 ⇜ (2/1 → 17/8) ⇝ 21/8 | color:steelblue note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 15/8 ⇜ (2/1 → 17/8) ⇝ 23/8 | color:steelblue note:G4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/4 ⇜ (2/1 → 9/4) | color:green note:A3 gain:1 clip:1 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 5/4 ⇜ (2/1 → 9/4) | color:salmon note:F3 gain:0.25 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 3/2 ⇜ (2/1 → 9/4) ⇝ 5/2 | color:green note:A3 gain:0.25 clip:1 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 7/4 ⇜ (2/1 → 9/4) ⇝ 11/4 | color:steelblue note:E4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 2/1 → 9/4 | color:salmon note:A3 gain:1 clip:1 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ (2/1 → 9/4) ⇝ 3/1 | color:steelblue note:G4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 11/8 ⇜ (2/1 → 19/8) | color:salmon note:F3 gain:0.125 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 13/8 ⇜ (2/1 → 19/8) ⇝ 21/8 | color:green note:A3 gain:0.125 clip:1 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 15/8 ⇜ (2/1 → 19/8) ⇝ 23/8 | color:steelblue note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 3/2 ⇜ (2/1 → 5/2) | color:steelblue note:E4 gain:1 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 7/4 ⇜ (2/1 → 5/2) ⇝ 11/4 | color:steelblue note:G4 gain:1 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 11/8 ⇜ (17/8 → 19/8) | color:green note:A3 gain:0.5 clip:1 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 17/8 → 19/8 | color:salmon note:A3 gain:0.5 clip:1 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ (17/8 → 19/8) ⇝ 25/8 | color:steelblue note:G4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 13/8 ⇜ (17/8 → 21/8) | color:steelblue note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 15/8 ⇜ (17/8 → 21/8) ⇝ 23/8 | color:steelblue note:G4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 3/2 ⇜ (9/4 → 5/2) | color:green note:A3 gain:0.25 clip:1 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 9/4 → 5/2 | color:green note:C4 gain:1 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 9/4 → 5/2 | color:salmon note:A3 gain:0.25 clip:1 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 7/4 ⇜ (9/4 → 11/4) | color:steelblue note:E4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 2/1 ⇜ (9/4 → 11/4) ⇝ 3/1 | color:steelblue note:G4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 13/8 ⇜ (19/8 → 21/8) | color:green note:A3 gain:0.125 clip:1 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 19/8 → 21/8 | color:green note:C4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 19/8 → 21/8 | color:salmon note:A3 gain:0.125 clip:1 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 15/8 ⇜ (19/8 → 23/8) | color:steelblue note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 17/8 ⇜ (19/8 → 23/8) ⇝ 25/8 | color:steelblue note:G4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 7/4 ⇜ (5/2 → 11/4) | color:steelblue note:G4 gain:1 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/2 → 11/4 | color:salmon note:C4 gain:1 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 5/2 → 11/4 | color:steelblue note:G4 gain:1 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/2 → 11/4 | color:green note:C4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 15/8 ⇜ (21/8 → 23/8) | color:steelblue note:G4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 21/8 → 23/8 | color:salmon note:C4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 21/8 → 23/8 | color:steelblue note:G4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 21/8 → 23/8 | color:green note:C4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 2/1 ⇜ (11/4 → 3/1) | color:steelblue note:G4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 11/4 → 3/1 | color:salmon note:C4 gain:1 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 11/4 → 3/1 | color:green note:E4 gain:1 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 11/4 → 3/1 | color:steelblue note:Bb4 gain:1 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 11/4 → 3/1 | color:salmon note:C4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 11/4 → 3/1 | color:steelblue note:G4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 17/8 ⇜ (23/8 → 3/1) ⇝ 25/8 | color:steelblue note:G4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (23/8 → 3/1) ⇝ 25/8 | color:salmon note:C4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ (23/8 → 3/1) ⇝ 25/8 | color:green note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (23/8 → 3/1) ⇝ 25/8 | color:steelblue note:Bb4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ (23/8 → 3/1) ⇝ 25/8 | color:salmon note:C4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ (23/8 → 3/1) ⇝ 25/8 | color:steelblue note:G4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 17/8 ⇜ (3/1 → 25/8) | color:steelblue note:G4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 23/8 ⇜ (3/1 → 25/8) | color:salmon note:C4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 23/8 ⇜ (3/1 → 25/8) | color:green note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 23/8 ⇜ (3/1 → 25/8) | color:steelblue note:Bb4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 23/8 ⇜ (3/1 → 25/8) | color:salmon note:C4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 23/8 ⇜ (3/1 → 25/8) | color:steelblue note:G4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 3/1 → 13/4 | color:green note:E4 gain:1 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 3/1 → 13/4 | color:steelblue note:Bb4 gain:1 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 3/1 → 13/4 | color:salmon note:C4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 3/1 → 13/4 | color:green note:E4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 3/1 → 13/4 | color:steelblue note:Bb4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 3/1 → 7/2 | color:salmon note:G3 gain:1 clip:1 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 25/8 → 27/8 | color:green note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 25/8 → 27/8 | color:steelblue note:Bb4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 25/8 → 27/8 | color:salmon note:C4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 25/8 → 27/8 | color:green note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 25/8 → 27/8 | color:steelblue note:Bb4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 25/8 → 29/8 | color:salmon note:G3 gain:0.5 clip:1 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 13/4 → 7/2 | color:steelblue note:Bb4 gain:1 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 13/4 → 7/2 | color:steelblue note:D5 gain:1 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 13/4 → 7/2 | color:green note:E4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 13/4 → 7/2 | color:steelblue note:Bb4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 13/4 → 15/4 | color:green note:Bb3 gain:1 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 13/4 → 15/4 | color:salmon note:G3 gain:0.25 clip:1 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 27/8 → 29/8 | color:steelblue note:Bb4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 27/8 → 29/8 | color:steelblue note:D5 gain:0.5 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 27/8 → 29/8 | color:green note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 27/8 → 29/8 | color:steelblue note:Bb4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 27/8 → 31/8 | color:green note:Bb3 gain:0.5 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 27/8 → 31/8 | color:salmon note:G3 gain:0.125 clip:1 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 7/2 → 15/4 | color:steelblue note:D5 gain:1 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 7/2 → 15/4 | color:steelblue note:Bb4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 7/2 → 15/4 | color:steelblue note:D5 gain:0.25 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 7/2 → 4/1 | color:salmon note:G3 gain:1 clip:1 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 7/2 → 4/1 | color:steelblue note:F4 gain:1 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 7/2 → 4/1 | color:green note:Bb3 gain:0.25 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 29/8 → 31/8 | color:steelblue note:D5 gain:0.5 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 29/8 → 31/8 | color:steelblue note:Bb4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 29/8 → 31/8 | color:steelblue note:D5 gain:0.125 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ (29/8 → 4/1) ⇝ 33/8 | color:salmon note:G3 gain:0.5 clip:1 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ (29/8 → 4/1) ⇝ 33/8 | color:steelblue note:F4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ (29/8 → 4/1) ⇝ 33/8 | color:green note:Bb3 gain:0.125 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 15/4 → 4/1 | color:steelblue note:D5 gain:0.25 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ (15/4 → 4/1) ⇝ 17/4 | color:green note:Bb3 gain:1 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ (15/4 → 4/1) ⇝ 17/4 | color:steelblue note:A4 gain:1 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ (15/4 → 4/1) ⇝ 17/4 | color:salmon note:G3 gain:0.25 clip:1 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ (15/4 → 4/1) ⇝ 17/4 | color:steelblue note:F4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ (31/8 → 4/1) ⇝ 33/8 | color:steelblue note:D5 gain:0.125 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ (31/8 → 4/1) ⇝ 35/8 | color:green note:Bb3 gain:0.5 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ (31/8 → 4/1) ⇝ 35/8 | color:steelblue note:A4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ (31/8 → 4/1) ⇝ 35/8 | color:salmon note:G3 gain:0.125 clip:1 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ (31/8 → 4/1) ⇝ 35/8 | color:steelblue note:F4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 29/8 ⇜ (4/1 → 33/8) | color:salmon note:G3 gain:0.5 clip:1 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 29/8 ⇜ (4/1 → 33/8) | color:steelblue note:F4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 29/8 ⇜ (4/1 → 33/8) | color:green note:Bb3 gain:0.125 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 31/8 ⇜ (4/1 → 33/8) | color:steelblue note:D5 gain:0.125 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 31/8 ⇜ (4/1 → 33/8) ⇝ 35/8 | color:green note:Bb3 gain:0.5 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 31/8 ⇜ (4/1 → 33/8) ⇝ 35/8 | color:steelblue note:A4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 15/4 ⇜ (4/1 → 17/4) | color:green note:Bb3 gain:1 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 15/4 ⇜ (4/1 → 17/4) | color:steelblue note:A4 gain:1 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 15/4 ⇜ (4/1 → 17/4) | color:salmon note:G3 gain:0.25 clip:1 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 15/4 ⇜ (4/1 → 17/4) | color:steelblue note:F4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ (4/1 → 17/4) ⇝ 9/2 | color:green note:Bb3 gain:0.25 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ (4/1 → 17/4) ⇝ 9/2 | color:steelblue note:A4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 31/8 ⇜ (4/1 → 35/8) | color:salmon note:G3 gain:0.125 clip:1 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 31/8 ⇜ (4/1 → 35/8) | color:steelblue note:F4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 4/1 → 9/2 | color:steelblue note:F4 gain:1 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 4/1 → 5/1 | color:salmon note:D3 gain:1 clip:1 s:piano release:0.1 pan:0.4814814814814815 ]", - "[ 31/8 ⇜ (33/8 → 35/8) | color:green note:Bb3 gain:0.5 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 31/8 ⇜ (33/8 → 35/8) | color:steelblue note:A4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ (33/8 → 35/8) ⇝ 37/8 | color:green note:Bb3 gain:0.125 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ (33/8 → 35/8) ⇝ 37/8 | color:steelblue note:A4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 33/8 → 37/8 | color:steelblue note:F4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ (33/8 → 5/1) ⇝ 41/8 | color:salmon note:D3 gain:0.5 clip:1 s:piano release:0.1 pan:0.4814814814814815 ]", - "[ 4/1 ⇜ (17/4 → 9/2) | color:green note:Bb3 gain:0.25 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 4/1 ⇜ (17/4 → 9/2) | color:steelblue note:A4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ (17/4 → 9/2) ⇝ 19/4 | color:steelblue note:A4 gain:1 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 17/4 → 19/4 | color:steelblue note:F4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ (17/4 → 5/1) ⇝ 21/4 | color:green note:F3 gain:1 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ (17/4 → 5/1) ⇝ 21/4 | color:salmon note:D3 gain:0.25 clip:1 s:piano release:0.1 pan:0.4814814814814815 ]", - "[ 33/8 ⇜ (35/8 → 37/8) | color:green note:Bb3 gain:0.125 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 33/8 ⇜ (35/8 → 37/8) | color:steelblue note:A4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ (35/8 → 37/8) ⇝ 39/8 | color:steelblue note:A4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 35/8 → 39/8 | color:steelblue note:F4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ (35/8 → 5/1) ⇝ 43/8 | color:green note:F3 gain:0.5 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ (35/8 → 5/1) ⇝ 43/8 | color:salmon note:D3 gain:0.125 clip:1 s:piano release:0.1 pan:0.4814814814814815 ]", - "[ 17/4 ⇜ (9/2 → 19/4) | color:steelblue note:A4 gain:1 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ (9/2 → 19/4) ⇝ 5/1 | color:steelblue note:A4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ (9/2 → 5/1) ⇝ 11/2 | color:steelblue note:C4 gain:1 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ (9/2 → 5/1) ⇝ 11/2 | color:green note:F3 gain:0.25 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 35/8 ⇜ (37/8 → 39/8) | color:steelblue note:A4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ (37/8 → 39/8) ⇝ 41/8 | color:steelblue note:A4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ (37/8 → 5/1) ⇝ 45/8 | color:steelblue note:C4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ (37/8 → 5/1) ⇝ 45/8 | color:green note:F3 gain:0.125 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 9/2 ⇜ (19/4 → 5/1) | color:steelblue note:A4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ (19/4 → 5/1) ⇝ 23/4 | color:steelblue note:E4 gain:1 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (19/4 → 5/1) ⇝ 23/4 | color:steelblue note:C4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 37/8 ⇜ (39/8 → 5/1) ⇝ 41/8 | color:steelblue note:A4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ (39/8 → 5/1) ⇝ 47/8 | color:steelblue note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (39/8 → 5/1) ⇝ 47/8 | color:steelblue note:C4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 33/8 ⇜ (5/1 → 41/8) | color:salmon note:D3 gain:0.5 clip:1 s:piano release:0.1 pan:0.4814814814814815 ]", - "[ 35/8 ⇜ (5/1 → 41/8) ⇝ 43/8 | color:green note:F3 gain:0.5 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 37/8 ⇜ (5/1 → 41/8) | color:steelblue note:A4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 37/8 ⇜ (5/1 → 41/8) ⇝ 45/8 | color:steelblue note:C4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 39/8 ⇜ (5/1 → 41/8) ⇝ 47/8 | color:steelblue note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 17/4 ⇜ (5/1 → 21/4) | color:green note:F3 gain:1 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 17/4 ⇜ (5/1 → 21/4) | color:salmon note:D3 gain:0.25 clip:1 s:piano release:0.1 pan:0.4814814814814815 ]", - "[ 9/2 ⇜ (5/1 → 21/4) ⇝ 11/2 | color:green note:F3 gain:0.25 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 19/4 ⇜ (5/1 → 21/4) ⇝ 23/4 | color:steelblue note:C4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ (5/1 → 21/4) ⇝ 6/1 | color:steelblue note:E4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 35/8 ⇜ (5/1 → 43/8) | color:salmon note:D3 gain:0.125 clip:1 s:piano release:0.1 pan:0.4814814814814815 ]", - "[ 37/8 ⇜ (5/1 → 43/8) ⇝ 45/8 | color:green note:F3 gain:0.125 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 39/8 ⇜ (5/1 → 43/8) ⇝ 47/8 | color:steelblue note:C4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 9/2 ⇜ (5/1 → 11/2) | color:steelblue note:C4 gain:1 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 19/4 ⇜ (5/1 → 11/2) ⇝ 23/4 | color:steelblue note:E4 gain:1 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 5/1 → 6/1 | color:salmon note:F3 gain:1 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 35/8 ⇜ (41/8 → 43/8) | color:green note:F3 gain:0.5 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ (41/8 → 43/8) ⇝ 49/8 | color:steelblue note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 37/8 ⇜ (41/8 → 45/8) | color:steelblue note:C4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 39/8 ⇜ (41/8 → 45/8) ⇝ 47/8 | color:steelblue note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (41/8 → 6/1) ⇝ 49/8 | color:salmon note:F3 gain:0.5 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 9/2 ⇜ (21/4 → 11/2) | color:green note:F3 gain:0.25 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 19/4 ⇜ (21/4 → 23/4) | color:steelblue note:C4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 5/1 ⇜ (21/4 → 23/4) ⇝ 6/1 | color:steelblue note:E4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (21/4 → 6/1) ⇝ 25/4 | color:green note:A3 gain:1 clip:1 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ (21/4 → 6/1) ⇝ 25/4 | color:salmon note:F3 gain:0.25 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 37/8 ⇜ (43/8 → 45/8) | color:green note:F3 gain:0.125 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 39/8 ⇜ (43/8 → 47/8) | color:steelblue note:C4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 41/8 ⇜ (43/8 → 47/8) ⇝ 49/8 | color:steelblue note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (43/8 → 6/1) ⇝ 51/8 | color:green note:A3 gain:0.5 clip:1 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ (43/8 → 6/1) ⇝ 51/8 | color:salmon note:F3 gain:0.125 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 19/4 ⇜ (11/2 → 23/4) | color:steelblue note:E4 gain:1 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (11/2 → 6/1) ⇝ 13/2 | color:steelblue note:E4 gain:1 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (11/2 → 6/1) ⇝ 13/2 | color:green note:A3 gain:0.25 clip:1 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 39/8 ⇜ (45/8 → 47/8) | color:steelblue note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (45/8 → 6/1) ⇝ 53/8 | color:steelblue note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (45/8 → 6/1) ⇝ 53/8 | color:green note:A3 gain:0.125 clip:1 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 5/1 ⇜ (23/4 → 6/1) | color:steelblue note:E4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (23/4 → 6/1) ⇝ 27/4 | color:steelblue note:G4 gain:1 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (23/4 → 6/1) ⇝ 27/4 | color:steelblue note:E4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 41/8 ⇜ (47/8 → 6/1) ⇝ 49/8 | color:steelblue note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (47/8 → 6/1) ⇝ 55/8 | color:steelblue note:G4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (47/8 → 6/1) ⇝ 55/8 | color:steelblue note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 41/8 ⇜ (6/1 → 49/8) | color:salmon note:F3 gain:0.5 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 41/8 ⇜ (6/1 → 49/8) | color:steelblue note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 43/8 ⇜ (6/1 → 49/8) ⇝ 51/8 | color:green note:A3 gain:0.5 clip:1 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 45/8 ⇜ (6/1 → 49/8) ⇝ 53/8 | color:steelblue note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 47/8 ⇜ (6/1 → 49/8) ⇝ 55/8 | color:steelblue note:G4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 21/4 ⇜ (6/1 → 25/4) | color:green note:A3 gain:1 clip:1 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 21/4 ⇜ (6/1 → 25/4) | color:salmon note:F3 gain:0.25 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 11/2 ⇜ (6/1 → 25/4) ⇝ 13/2 | color:green note:A3 gain:0.25 clip:1 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 23/4 ⇜ (6/1 → 25/4) ⇝ 27/4 | color:steelblue note:E4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 6/1 → 25/4 | color:salmon note:A3 gain:1 clip:1 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ (6/1 → 25/4) ⇝ 7/1 | color:steelblue note:G4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 43/8 ⇜ (6/1 → 51/8) | color:salmon note:F3 gain:0.125 clip:1 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 45/8 ⇜ (6/1 → 51/8) ⇝ 53/8 | color:green note:A3 gain:0.125 clip:1 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 47/8 ⇜ (6/1 → 51/8) ⇝ 55/8 | color:steelblue note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 11/2 ⇜ (6/1 → 13/2) | color:steelblue note:E4 gain:1 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 23/4 ⇜ (6/1 → 13/2) ⇝ 27/4 | color:steelblue note:G4 gain:1 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 43/8 ⇜ (49/8 → 51/8) | color:green note:A3 gain:0.5 clip:1 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 49/8 → 51/8 | color:salmon note:A3 gain:0.5 clip:1 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ (49/8 → 51/8) ⇝ 57/8 | color:steelblue note:G4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 45/8 ⇜ (49/8 → 53/8) | color:steelblue note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 47/8 ⇜ (49/8 → 53/8) ⇝ 55/8 | color:steelblue note:G4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 11/2 ⇜ (25/4 → 13/2) | color:green note:A3 gain:0.25 clip:1 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 25/4 → 13/2 | color:green note:C4 gain:1 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 25/4 → 13/2 | color:salmon note:A3 gain:0.25 clip:1 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 23/4 ⇜ (25/4 → 27/4) | color:steelblue note:E4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 6/1 ⇜ (25/4 → 27/4) ⇝ 7/1 | color:steelblue note:G4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 45/8 ⇜ (51/8 → 53/8) | color:green note:A3 gain:0.125 clip:1 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 51/8 → 53/8 | color:green note:C4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 51/8 → 53/8 | color:salmon note:A3 gain:0.125 clip:1 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 47/8 ⇜ (51/8 → 55/8) | color:steelblue note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 49/8 ⇜ (51/8 → 55/8) ⇝ 57/8 | color:steelblue note:G4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 23/4 ⇜ (13/2 → 27/4) | color:steelblue note:G4 gain:1 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 13/2 → 27/4 | color:salmon note:C4 gain:1 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 13/2 → 27/4 | color:steelblue note:G4 gain:1 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 13/2 → 27/4 | color:green note:C4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 47/8 ⇜ (53/8 → 55/8) | color:steelblue note:G4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 53/8 → 55/8 | color:salmon note:C4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 53/8 → 55/8 | color:steelblue note:G4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 53/8 → 55/8 | color:green note:C4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 6/1 ⇜ (27/4 → 7/1) | color:steelblue note:G4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 27/4 → 7/1 | color:salmon note:C4 gain:1 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 27/4 → 7/1 | color:green note:E4 gain:1 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 27/4 → 7/1 | color:steelblue note:Bb4 gain:1 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 27/4 → 7/1 | color:salmon note:C4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 27/4 → 7/1 | color:steelblue note:G4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 49/8 ⇜ (55/8 → 7/1) ⇝ 57/8 | color:steelblue note:G4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (55/8 → 7/1) ⇝ 57/8 | color:salmon note:C4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ (55/8 → 7/1) ⇝ 57/8 | color:green note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (55/8 → 7/1) ⇝ 57/8 | color:steelblue note:Bb4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ (55/8 → 7/1) ⇝ 57/8 | color:salmon note:C4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ (55/8 → 7/1) ⇝ 57/8 | color:steelblue note:G4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 49/8 ⇜ (7/1 → 57/8) | color:steelblue note:G4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 55/8 ⇜ (7/1 → 57/8) | color:salmon note:C4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 55/8 ⇜ (7/1 → 57/8) | color:green note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 55/8 ⇜ (7/1 → 57/8) | color:steelblue note:Bb4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 55/8 ⇜ (7/1 → 57/8) | color:salmon note:C4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 55/8 ⇜ (7/1 → 57/8) | color:steelblue note:G4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 7/1 → 29/4 | color:green note:E4 gain:1 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 7/1 → 29/4 | color:steelblue note:Bb4 gain:1 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 7/1 → 29/4 | color:salmon note:C4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 7/1 → 29/4 | color:green note:E4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 7/1 → 29/4 | color:steelblue note:Bb4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 7/1 → 15/2 | color:salmon note:G3 gain:1 clip:1 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 57/8 → 59/8 | color:green note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 57/8 → 59/8 | color:steelblue note:Bb4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 57/8 → 59/8 | color:salmon note:C4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 57/8 → 59/8 | color:green note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 57/8 → 59/8 | color:steelblue note:Bb4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 57/8 → 61/8 | color:salmon note:G3 gain:0.5 clip:1 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 29/4 → 15/2 | color:steelblue note:Bb4 gain:1 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 29/4 → 15/2 | color:steelblue note:D5 gain:1 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 29/4 → 15/2 | color:green note:E4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 29/4 → 15/2 | color:steelblue note:Bb4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 29/4 → 31/4 | color:green note:Bb3 gain:1 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 29/4 → 31/4 | color:salmon note:G3 gain:0.25 clip:1 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 59/8 → 61/8 | color:steelblue note:Bb4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 59/8 → 61/8 | color:steelblue note:D5 gain:0.5 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 59/8 → 61/8 | color:green note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 59/8 → 61/8 | color:steelblue note:Bb4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 59/8 → 63/8 | color:green note:Bb3 gain:0.5 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 59/8 → 63/8 | color:salmon note:G3 gain:0.125 clip:1 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 15/2 → 31/4 | color:steelblue note:D5 gain:1 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 15/2 → 31/4 | color:steelblue note:Bb4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 15/2 → 31/4 | color:steelblue note:D5 gain:0.25 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 15/2 → 8/1 | color:salmon note:G3 gain:1 clip:1 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 15/2 → 8/1 | color:steelblue note:F4 gain:1 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 15/2 → 8/1 | color:green note:Bb3 gain:0.25 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 61/8 → 63/8 | color:steelblue note:D5 gain:0.5 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 61/8 → 63/8 | color:steelblue note:Bb4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 61/8 → 63/8 | color:steelblue note:D5 gain:0.125 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ (61/8 → 8/1) ⇝ 65/8 | color:salmon note:G3 gain:0.5 clip:1 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ (61/8 → 8/1) ⇝ 65/8 | color:steelblue note:F4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ (61/8 → 8/1) ⇝ 65/8 | color:green note:Bb3 gain:0.125 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 31/4 → 8/1 | color:steelblue note:D5 gain:0.25 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ (31/4 → 8/1) ⇝ 33/4 | color:green note:Bb3 gain:1 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ (31/4 → 8/1) ⇝ 33/4 | color:steelblue note:A4 gain:1 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ (31/4 → 8/1) ⇝ 33/4 | color:salmon note:G3 gain:0.25 clip:1 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ (31/4 → 8/1) ⇝ 33/4 | color:steelblue note:F4 gain:0.25 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ (63/8 → 8/1) ⇝ 65/8 | color:steelblue note:D5 gain:0.125 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ (63/8 → 8/1) ⇝ 67/8 | color:green note:Bb3 gain:0.5 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ (63/8 → 8/1) ⇝ 67/8 | color:steelblue note:A4 gain:0.5 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ (63/8 → 8/1) ⇝ 67/8 | color:salmon note:G3 gain:0.125 clip:1 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ (63/8 → 8/1) ⇝ 67/8 | color:steelblue note:F4 gain:0.125 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", + "[ -3/8 ⇜ (0/1 → 1/8) | color:salmon note:G3 gain:0.5 clip:1 s:piano release:0.1 pan:0.50462962963 ]", + "[ -3/8 ⇜ (0/1 → 1/8) | color:steelblue note:F4 gain:0.5 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ -3/8 ⇜ (0/1 → 1/8) | color:green note:Bb3 gain:0.125 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ -1/8 ⇜ (0/1 → 1/8) | color:steelblue note:D5 gain:0.125 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ -1/8 ⇜ (0/1 → 1/8) ⇝ 3/8 | color:green note:Bb3 gain:0.5 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ -1/8 ⇜ (0/1 → 1/8) ⇝ 3/8 | color:steelblue note:A4 gain:0.5 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ -1/4 ⇜ (0/1 → 1/4) | color:green note:Bb3 gain:1 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ -1/4 ⇜ (0/1 → 1/4) | color:steelblue note:A4 gain:1 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ -1/4 ⇜ (0/1 → 1/4) | color:salmon note:G3 gain:0.25 clip:1 s:piano release:0.1 pan:0.50462962963 ]", + "[ -1/4 ⇜ (0/1 → 1/4) | color:steelblue note:F4 gain:0.25 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ (0/1 → 1/4) ⇝ 1/2 | color:green note:Bb3 gain:0.25 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ (0/1 → 1/4) ⇝ 1/2 | color:steelblue note:A4 gain:0.25 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ -1/8 ⇜ (0/1 → 3/8) | color:salmon note:G3 gain:0.125 clip:1 s:piano release:0.1 pan:0.50462962963 ]", + "[ -1/8 ⇜ (0/1 → 3/8) | color:steelblue note:F4 gain:0.125 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 0/1 → 1/2 | color:steelblue note:F4 gain:1 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 0/1 → 1/1 | color:salmon note:D3 gain:1 clip:1 s:piano release:0.1 pan:0.481481481481 ]", + "[ -1/8 ⇜ (1/8 → 3/8) | color:green note:Bb3 gain:0.5 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ -1/8 ⇜ (1/8 → 3/8) | color:steelblue note:A4 gain:0.5 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ (1/8 → 3/8) ⇝ 5/8 | color:green note:Bb3 gain:0.125 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ (1/8 → 3/8) ⇝ 5/8 | color:steelblue note:A4 gain:0.125 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 1/8 → 5/8 | color:steelblue note:F4 gain:0.5 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ (1/8 → 1/1) ⇝ 9/8 | color:salmon note:D3 gain:0.5 clip:1 s:piano release:0.1 pan:0.481481481481 ]", + "[ 0/1 ⇜ (1/4 → 1/2) | color:green note:Bb3 gain:0.25 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 0/1 ⇜ (1/4 → 1/2) | color:steelblue note:A4 gain:0.25 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ (1/4 → 1/2) ⇝ 3/4 | color:steelblue note:A4 gain:1 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 1/4 → 3/4 | color:steelblue note:F4 gain:0.25 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ (1/4 → 1/1) ⇝ 5/4 | color:green note:F3 gain:1 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ (1/4 → 1/1) ⇝ 5/4 | color:salmon note:D3 gain:0.25 clip:1 s:piano release:0.1 pan:0.481481481481 ]", + "[ 1/8 ⇜ (3/8 → 5/8) | color:green note:Bb3 gain:0.125 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 1/8 ⇜ (3/8 → 5/8) | color:steelblue note:A4 gain:0.125 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ (3/8 → 5/8) ⇝ 7/8 | color:steelblue note:A4 gain:0.5 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 3/8 → 7/8 | color:steelblue note:F4 gain:0.125 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ (3/8 → 1/1) ⇝ 11/8 | color:green note:F3 gain:0.5 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ (3/8 → 1/1) ⇝ 11/8 | color:salmon note:D3 gain:0.125 clip:1 s:piano release:0.1 pan:0.481481481481 ]", + "[ 1/4 ⇜ (1/2 → 3/4) | color:steelblue note:A4 gain:1 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ (1/2 → 3/4) ⇝ 1/1 | color:steelblue note:A4 gain:0.25 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ (1/2 → 1/1) ⇝ 3/2 | color:steelblue note:C4 gain:1 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ (1/2 → 1/1) ⇝ 3/2 | color:green note:F3 gain:0.25 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ 3/8 ⇜ (5/8 → 7/8) | color:steelblue note:A4 gain:0.5 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ (5/8 → 7/8) ⇝ 9/8 | color:steelblue note:A4 gain:0.125 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ (5/8 → 1/1) ⇝ 13/8 | color:steelblue note:C4 gain:0.5 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ (5/8 → 1/1) ⇝ 13/8 | color:green note:F3 gain:0.125 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ 1/2 ⇜ (3/4 → 1/1) | color:steelblue note:A4 gain:0.25 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ (3/4 → 1/1) ⇝ 7/4 | color:steelblue note:E4 gain:1 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (3/4 → 1/1) ⇝ 7/4 | color:steelblue note:C4 gain:0.25 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 5/8 ⇜ (7/8 → 1/1) ⇝ 9/8 | color:steelblue note:A4 gain:0.125 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ (7/8 → 1/1) ⇝ 15/8 | color:steelblue note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (7/8 → 1/1) ⇝ 15/8 | color:steelblue note:C4 gain:0.125 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 1/8 ⇜ (1/1 → 9/8) | color:salmon note:D3 gain:0.5 clip:1 s:piano release:0.1 pan:0.481481481481 ]", + "[ 3/8 ⇜ (1/1 → 9/8) ⇝ 11/8 | color:green note:F3 gain:0.5 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ 5/8 ⇜ (1/1 → 9/8) | color:steelblue note:A4 gain:0.125 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 5/8 ⇜ (1/1 → 9/8) ⇝ 13/8 | color:steelblue note:C4 gain:0.5 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 7/8 ⇜ (1/1 → 9/8) ⇝ 15/8 | color:steelblue note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 1/4 ⇜ (1/1 → 5/4) | color:green note:F3 gain:1 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ 1/4 ⇜ (1/1 → 5/4) | color:salmon note:D3 gain:0.25 clip:1 s:piano release:0.1 pan:0.481481481481 ]", + "[ 1/2 ⇜ (1/1 → 5/4) ⇝ 3/2 | color:green note:F3 gain:0.25 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ 3/4 ⇜ (1/1 → 5/4) ⇝ 7/4 | color:steelblue note:C4 gain:0.25 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ (1/1 → 5/4) ⇝ 2/1 | color:steelblue note:E4 gain:0.25 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 3/8 ⇜ (1/1 → 11/8) | color:salmon note:D3 gain:0.125 clip:1 s:piano release:0.1 pan:0.481481481481 ]", + "[ 5/8 ⇜ (1/1 → 11/8) ⇝ 13/8 | color:green note:F3 gain:0.125 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ 7/8 ⇜ (1/1 → 11/8) ⇝ 15/8 | color:steelblue note:C4 gain:0.125 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 1/2 ⇜ (1/1 → 3/2) | color:steelblue note:C4 gain:1 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 3/4 ⇜ (1/1 → 3/2) ⇝ 7/4 | color:steelblue note:E4 gain:1 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 1/1 → 2/1 | color:salmon note:F3 gain:1 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ 3/8 ⇜ (9/8 → 11/8) | color:green note:F3 gain:0.5 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ (9/8 → 11/8) ⇝ 17/8 | color:steelblue note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 5/8 ⇜ (9/8 → 13/8) | color:steelblue note:C4 gain:0.5 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 7/8 ⇜ (9/8 → 13/8) ⇝ 15/8 | color:steelblue note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (9/8 → 2/1) ⇝ 17/8 | color:salmon note:F3 gain:0.5 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ 1/2 ⇜ (5/4 → 3/2) | color:green note:F3 gain:0.25 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ 3/4 ⇜ (5/4 → 7/4) | color:steelblue note:C4 gain:0.25 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 1/1 ⇜ (5/4 → 7/4) ⇝ 2/1 | color:steelblue note:E4 gain:0.25 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (5/4 → 2/1) ⇝ 9/4 | color:green note:A3 gain:1 clip:1 s:piano release:0.1 pan:0.513888888889 ]", + "[ (5/4 → 2/1) ⇝ 9/4 | color:salmon note:F3 gain:0.25 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ 5/8 ⇜ (11/8 → 13/8) | color:green note:F3 gain:0.125 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ 7/8 ⇜ (11/8 → 15/8) | color:steelblue note:C4 gain:0.125 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 9/8 ⇜ (11/8 → 15/8) ⇝ 17/8 | color:steelblue note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (11/8 → 2/1) ⇝ 19/8 | color:green note:A3 gain:0.5 clip:1 s:piano release:0.1 pan:0.513888888889 ]", + "[ (11/8 → 2/1) ⇝ 19/8 | color:salmon note:F3 gain:0.125 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ 3/4 ⇜ (3/2 → 7/4) | color:steelblue note:E4 gain:1 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (3/2 → 2/1) ⇝ 5/2 | color:steelblue note:E4 gain:1 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (3/2 → 2/1) ⇝ 5/2 | color:green note:A3 gain:0.25 clip:1 s:piano release:0.1 pan:0.513888888889 ]", + "[ 7/8 ⇜ (13/8 → 15/8) | color:steelblue note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (13/8 → 2/1) ⇝ 21/8 | color:steelblue note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (13/8 → 2/1) ⇝ 21/8 | color:green note:A3 gain:0.125 clip:1 s:piano release:0.1 pan:0.513888888889 ]", + "[ 1/1 ⇜ (7/4 → 2/1) | color:steelblue note:E4 gain:0.25 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (7/4 → 2/1) ⇝ 11/4 | color:steelblue note:G4 gain:1 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ (7/4 → 2/1) ⇝ 11/4 | color:steelblue note:E4 gain:0.25 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 9/8 ⇜ (15/8 → 2/1) ⇝ 17/8 | color:steelblue note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (15/8 → 2/1) ⇝ 23/8 | color:steelblue note:G4 gain:0.5 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ (15/8 → 2/1) ⇝ 23/8 | color:steelblue note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 9/8 ⇜ (2/1 → 17/8) | color:salmon note:F3 gain:0.5 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ 9/8 ⇜ (2/1 → 17/8) | color:steelblue note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 11/8 ⇜ (2/1 → 17/8) ⇝ 19/8 | color:green note:A3 gain:0.5 clip:1 s:piano release:0.1 pan:0.513888888889 ]", + "[ 13/8 ⇜ (2/1 → 17/8) ⇝ 21/8 | color:steelblue note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 15/8 ⇜ (2/1 → 17/8) ⇝ 23/8 | color:steelblue note:G4 gain:0.5 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/4 ⇜ (2/1 → 9/4) | color:green note:A3 gain:1 clip:1 s:piano release:0.1 pan:0.513888888889 ]", + "[ 5/4 ⇜ (2/1 → 9/4) | color:salmon note:F3 gain:0.25 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ 3/2 ⇜ (2/1 → 9/4) ⇝ 5/2 | color:green note:A3 gain:0.25 clip:1 s:piano release:0.1 pan:0.513888888889 ]", + "[ 7/4 ⇜ (2/1 → 9/4) ⇝ 11/4 | color:steelblue note:E4 gain:0.25 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 2/1 → 9/4 | color:salmon note:A3 gain:1 clip:1 s:piano release:0.1 pan:0.513888888889 ]", + "[ (2/1 → 9/4) ⇝ 3/1 | color:steelblue note:G4 gain:0.25 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 11/8 ⇜ (2/1 → 19/8) | color:salmon note:F3 gain:0.125 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ 13/8 ⇜ (2/1 → 19/8) ⇝ 21/8 | color:green note:A3 gain:0.125 clip:1 s:piano release:0.1 pan:0.513888888889 ]", + "[ 15/8 ⇜ (2/1 → 19/8) ⇝ 23/8 | color:steelblue note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 3/2 ⇜ (2/1 → 5/2) | color:steelblue note:E4 gain:1 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 7/4 ⇜ (2/1 → 5/2) ⇝ 11/4 | color:steelblue note:G4 gain:1 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 11/8 ⇜ (17/8 → 19/8) | color:green note:A3 gain:0.5 clip:1 s:piano release:0.1 pan:0.513888888889 ]", + "[ 17/8 → 19/8 | color:salmon note:A3 gain:0.5 clip:1 s:piano release:0.1 pan:0.513888888889 ]", + "[ (17/8 → 19/8) ⇝ 25/8 | color:steelblue note:G4 gain:0.125 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 13/8 ⇜ (17/8 → 21/8) | color:steelblue note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 15/8 ⇜ (17/8 → 21/8) ⇝ 23/8 | color:steelblue note:G4 gain:0.5 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 3/2 ⇜ (9/4 → 5/2) | color:green note:A3 gain:0.25 clip:1 s:piano release:0.1 pan:0.513888888889 ]", + "[ 9/4 → 5/2 | color:green note:C4 gain:1 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 9/4 → 5/2 | color:salmon note:A3 gain:0.25 clip:1 s:piano release:0.1 pan:0.513888888889 ]", + "[ 7/4 ⇜ (9/4 → 11/4) | color:steelblue note:E4 gain:0.25 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 2/1 ⇜ (9/4 → 11/4) ⇝ 3/1 | color:steelblue note:G4 gain:0.25 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 13/8 ⇜ (19/8 → 21/8) | color:green note:A3 gain:0.125 clip:1 s:piano release:0.1 pan:0.513888888889 ]", + "[ 19/8 → 21/8 | color:green note:C4 gain:0.5 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 19/8 → 21/8 | color:salmon note:A3 gain:0.125 clip:1 s:piano release:0.1 pan:0.513888888889 ]", + "[ 15/8 ⇜ (19/8 → 23/8) | color:steelblue note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 17/8 ⇜ (19/8 → 23/8) ⇝ 25/8 | color:steelblue note:G4 gain:0.125 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 7/4 ⇜ (5/2 → 11/4) | color:steelblue note:G4 gain:1 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/2 → 11/4 | color:salmon note:C4 gain:1 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 5/2 → 11/4 | color:steelblue note:G4 gain:1 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/2 → 11/4 | color:green note:C4 gain:0.25 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 15/8 ⇜ (21/8 → 23/8) | color:steelblue note:G4 gain:0.5 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 21/8 → 23/8 | color:salmon note:C4 gain:0.5 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 21/8 → 23/8 | color:steelblue note:G4 gain:0.5 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 21/8 → 23/8 | color:green note:C4 gain:0.125 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 2/1 ⇜ (11/4 → 3/1) | color:steelblue note:G4 gain:0.25 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 11/4 → 3/1 | color:salmon note:C4 gain:1 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 11/4 → 3/1 | color:green note:E4 gain:1 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 11/4 → 3/1 | color:steelblue note:Bb4 gain:1 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 11/4 → 3/1 | color:salmon note:C4 gain:0.25 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 11/4 → 3/1 | color:steelblue note:G4 gain:0.25 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 17/8 ⇜ (23/8 → 3/1) ⇝ 25/8 | color:steelblue note:G4 gain:0.125 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ (23/8 → 3/1) ⇝ 25/8 | color:salmon note:C4 gain:0.5 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ (23/8 → 3/1) ⇝ 25/8 | color:green note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (23/8 → 3/1) ⇝ 25/8 | color:steelblue note:Bb4 gain:0.5 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ (23/8 → 3/1) ⇝ 25/8 | color:salmon note:C4 gain:0.125 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ (23/8 → 3/1) ⇝ 25/8 | color:steelblue note:G4 gain:0.125 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 17/8 ⇜ (3/1 → 25/8) | color:steelblue note:G4 gain:0.125 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 23/8 ⇜ (3/1 → 25/8) | color:salmon note:C4 gain:0.5 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 23/8 ⇜ (3/1 → 25/8) | color:green note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 23/8 ⇜ (3/1 → 25/8) | color:steelblue note:Bb4 gain:0.5 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 23/8 ⇜ (3/1 → 25/8) | color:salmon note:C4 gain:0.125 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 23/8 ⇜ (3/1 → 25/8) | color:steelblue note:G4 gain:0.125 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 3/1 → 13/4 | color:green note:E4 gain:1 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 3/1 → 13/4 | color:steelblue note:Bb4 gain:1 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 3/1 → 13/4 | color:salmon note:C4 gain:0.25 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 3/1 → 13/4 | color:green note:E4 gain:0.25 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 3/1 → 13/4 | color:steelblue note:Bb4 gain:0.25 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 3/1 → 7/2 | color:salmon note:G3 gain:1 clip:1 s:piano release:0.1 pan:0.50462962963 ]", + "[ 25/8 → 27/8 | color:green note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 25/8 → 27/8 | color:steelblue note:Bb4 gain:0.5 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 25/8 → 27/8 | color:salmon note:C4 gain:0.125 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 25/8 → 27/8 | color:green note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 25/8 → 27/8 | color:steelblue note:Bb4 gain:0.125 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 25/8 → 29/8 | color:salmon note:G3 gain:0.5 clip:1 s:piano release:0.1 pan:0.50462962963 ]", + "[ 13/4 → 7/2 | color:steelblue note:Bb4 gain:1 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 13/4 → 7/2 | color:steelblue note:D5 gain:1 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 13/4 → 7/2 | color:green note:E4 gain:0.25 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 13/4 → 7/2 | color:steelblue note:Bb4 gain:0.25 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 13/4 → 15/4 | color:green note:Bb3 gain:1 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 13/4 → 15/4 | color:salmon note:G3 gain:0.25 clip:1 s:piano release:0.1 pan:0.50462962963 ]", + "[ 27/8 → 29/8 | color:steelblue note:Bb4 gain:0.5 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 27/8 → 29/8 | color:steelblue note:D5 gain:0.5 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 27/8 → 29/8 | color:green note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 27/8 → 29/8 | color:steelblue note:Bb4 gain:0.125 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 27/8 → 31/8 | color:green note:Bb3 gain:0.5 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 27/8 → 31/8 | color:salmon note:G3 gain:0.125 clip:1 s:piano release:0.1 pan:0.50462962963 ]", + "[ 7/2 → 15/4 | color:steelblue note:D5 gain:1 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 7/2 → 15/4 | color:steelblue note:Bb4 gain:0.25 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 7/2 → 15/4 | color:steelblue note:D5 gain:0.25 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 7/2 → 4/1 | color:salmon note:G3 gain:1 clip:1 s:piano release:0.1 pan:0.50462962963 ]", + "[ 7/2 → 4/1 | color:steelblue note:F4 gain:1 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 7/2 → 4/1 | color:green note:Bb3 gain:0.25 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 29/8 → 31/8 | color:steelblue note:D5 gain:0.5 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 29/8 → 31/8 | color:steelblue note:Bb4 gain:0.125 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 29/8 → 31/8 | color:steelblue note:D5 gain:0.125 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ (29/8 → 4/1) ⇝ 33/8 | color:salmon note:G3 gain:0.5 clip:1 s:piano release:0.1 pan:0.50462962963 ]", + "[ (29/8 → 4/1) ⇝ 33/8 | color:steelblue note:F4 gain:0.5 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ (29/8 → 4/1) ⇝ 33/8 | color:green note:Bb3 gain:0.125 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 15/4 → 4/1 | color:steelblue note:D5 gain:0.25 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ (15/4 → 4/1) ⇝ 17/4 | color:green note:Bb3 gain:1 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ (15/4 → 4/1) ⇝ 17/4 | color:steelblue note:A4 gain:1 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ (15/4 → 4/1) ⇝ 17/4 | color:salmon note:G3 gain:0.25 clip:1 s:piano release:0.1 pan:0.50462962963 ]", + "[ (15/4 → 4/1) ⇝ 17/4 | color:steelblue note:F4 gain:0.25 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ (31/8 → 4/1) ⇝ 33/8 | color:steelblue note:D5 gain:0.125 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ (31/8 → 4/1) ⇝ 35/8 | color:green note:Bb3 gain:0.5 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ (31/8 → 4/1) ⇝ 35/8 | color:steelblue note:A4 gain:0.5 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ (31/8 → 4/1) ⇝ 35/8 | color:salmon note:G3 gain:0.125 clip:1 s:piano release:0.1 pan:0.50462962963 ]", + "[ (31/8 → 4/1) ⇝ 35/8 | color:steelblue note:F4 gain:0.125 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 29/8 ⇜ (4/1 → 33/8) | color:salmon note:G3 gain:0.5 clip:1 s:piano release:0.1 pan:0.50462962963 ]", + "[ 29/8 ⇜ (4/1 → 33/8) | color:steelblue note:F4 gain:0.5 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 29/8 ⇜ (4/1 → 33/8) | color:green note:Bb3 gain:0.125 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 31/8 ⇜ (4/1 → 33/8) | color:steelblue note:D5 gain:0.125 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 31/8 ⇜ (4/1 → 33/8) ⇝ 35/8 | color:green note:Bb3 gain:0.5 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 31/8 ⇜ (4/1 → 33/8) ⇝ 35/8 | color:steelblue note:A4 gain:0.5 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 15/4 ⇜ (4/1 → 17/4) | color:green note:Bb3 gain:1 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 15/4 ⇜ (4/1 → 17/4) | color:steelblue note:A4 gain:1 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 15/4 ⇜ (4/1 → 17/4) | color:salmon note:G3 gain:0.25 clip:1 s:piano release:0.1 pan:0.50462962963 ]", + "[ 15/4 ⇜ (4/1 → 17/4) | color:steelblue note:F4 gain:0.25 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ (4/1 → 17/4) ⇝ 9/2 | color:green note:Bb3 gain:0.25 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ (4/1 → 17/4) ⇝ 9/2 | color:steelblue note:A4 gain:0.25 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 31/8 ⇜ (4/1 → 35/8) | color:salmon note:G3 gain:0.125 clip:1 s:piano release:0.1 pan:0.50462962963 ]", + "[ 31/8 ⇜ (4/1 → 35/8) | color:steelblue note:F4 gain:0.125 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 4/1 → 9/2 | color:steelblue note:F4 gain:1 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 4/1 → 5/1 | color:salmon note:D3 gain:1 clip:1 s:piano release:0.1 pan:0.481481481481 ]", + "[ 31/8 ⇜ (33/8 → 35/8) | color:green note:Bb3 gain:0.5 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 31/8 ⇜ (33/8 → 35/8) | color:steelblue note:A4 gain:0.5 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ (33/8 → 35/8) ⇝ 37/8 | color:green note:Bb3 gain:0.125 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ (33/8 → 35/8) ⇝ 37/8 | color:steelblue note:A4 gain:0.125 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 33/8 → 37/8 | color:steelblue note:F4 gain:0.5 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ (33/8 → 5/1) ⇝ 41/8 | color:salmon note:D3 gain:0.5 clip:1 s:piano release:0.1 pan:0.481481481481 ]", + "[ 4/1 ⇜ (17/4 → 9/2) | color:green note:Bb3 gain:0.25 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 4/1 ⇜ (17/4 → 9/2) | color:steelblue note:A4 gain:0.25 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ (17/4 → 9/2) ⇝ 19/4 | color:steelblue note:A4 gain:1 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 17/4 → 19/4 | color:steelblue note:F4 gain:0.25 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ (17/4 → 5/1) ⇝ 21/4 | color:green note:F3 gain:1 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ (17/4 → 5/1) ⇝ 21/4 | color:salmon note:D3 gain:0.25 clip:1 s:piano release:0.1 pan:0.481481481481 ]", + "[ 33/8 ⇜ (35/8 → 37/8) | color:green note:Bb3 gain:0.125 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 33/8 ⇜ (35/8 → 37/8) | color:steelblue note:A4 gain:0.125 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ (35/8 → 37/8) ⇝ 39/8 | color:steelblue note:A4 gain:0.5 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 35/8 → 39/8 | color:steelblue note:F4 gain:0.125 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ (35/8 → 5/1) ⇝ 43/8 | color:green note:F3 gain:0.5 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ (35/8 → 5/1) ⇝ 43/8 | color:salmon note:D3 gain:0.125 clip:1 s:piano release:0.1 pan:0.481481481481 ]", + "[ 17/4 ⇜ (9/2 → 19/4) | color:steelblue note:A4 gain:1 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ (9/2 → 19/4) ⇝ 5/1 | color:steelblue note:A4 gain:0.25 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ (9/2 → 5/1) ⇝ 11/2 | color:steelblue note:C4 gain:1 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ (9/2 → 5/1) ⇝ 11/2 | color:green note:F3 gain:0.25 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ 35/8 ⇜ (37/8 → 39/8) | color:steelblue note:A4 gain:0.5 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ (37/8 → 39/8) ⇝ 41/8 | color:steelblue note:A4 gain:0.125 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ (37/8 → 5/1) ⇝ 45/8 | color:steelblue note:C4 gain:0.5 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ (37/8 → 5/1) ⇝ 45/8 | color:green note:F3 gain:0.125 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ 9/2 ⇜ (19/4 → 5/1) | color:steelblue note:A4 gain:0.25 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ (19/4 → 5/1) ⇝ 23/4 | color:steelblue note:E4 gain:1 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (19/4 → 5/1) ⇝ 23/4 | color:steelblue note:C4 gain:0.25 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 37/8 ⇜ (39/8 → 5/1) ⇝ 41/8 | color:steelblue note:A4 gain:0.125 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ (39/8 → 5/1) ⇝ 47/8 | color:steelblue note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (39/8 → 5/1) ⇝ 47/8 | color:steelblue note:C4 gain:0.125 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 33/8 ⇜ (5/1 → 41/8) | color:salmon note:D3 gain:0.5 clip:1 s:piano release:0.1 pan:0.481481481481 ]", + "[ 35/8 ⇜ (5/1 → 41/8) ⇝ 43/8 | color:green note:F3 gain:0.5 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ 37/8 ⇜ (5/1 → 41/8) | color:steelblue note:A4 gain:0.125 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 37/8 ⇜ (5/1 → 41/8) ⇝ 45/8 | color:steelblue note:C4 gain:0.5 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 39/8 ⇜ (5/1 → 41/8) ⇝ 47/8 | color:steelblue note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 17/4 ⇜ (5/1 → 21/4) | color:green note:F3 gain:1 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ 17/4 ⇜ (5/1 → 21/4) | color:salmon note:D3 gain:0.25 clip:1 s:piano release:0.1 pan:0.481481481481 ]", + "[ 9/2 ⇜ (5/1 → 21/4) ⇝ 11/2 | color:green note:F3 gain:0.25 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ 19/4 ⇜ (5/1 → 21/4) ⇝ 23/4 | color:steelblue note:C4 gain:0.25 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ (5/1 → 21/4) ⇝ 6/1 | color:steelblue note:E4 gain:0.25 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 35/8 ⇜ (5/1 → 43/8) | color:salmon note:D3 gain:0.125 clip:1 s:piano release:0.1 pan:0.481481481481 ]", + "[ 37/8 ⇜ (5/1 → 43/8) ⇝ 45/8 | color:green note:F3 gain:0.125 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ 39/8 ⇜ (5/1 → 43/8) ⇝ 47/8 | color:steelblue note:C4 gain:0.125 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 9/2 ⇜ (5/1 → 11/2) | color:steelblue note:C4 gain:1 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 19/4 ⇜ (5/1 → 11/2) ⇝ 23/4 | color:steelblue note:E4 gain:1 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 5/1 → 6/1 | color:salmon note:F3 gain:1 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ 35/8 ⇜ (41/8 → 43/8) | color:green note:F3 gain:0.5 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ (41/8 → 43/8) ⇝ 49/8 | color:steelblue note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 37/8 ⇜ (41/8 → 45/8) | color:steelblue note:C4 gain:0.5 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 39/8 ⇜ (41/8 → 45/8) ⇝ 47/8 | color:steelblue note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (41/8 → 6/1) ⇝ 49/8 | color:salmon note:F3 gain:0.5 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ 9/2 ⇜ (21/4 → 11/2) | color:green note:F3 gain:0.25 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ 19/4 ⇜ (21/4 → 23/4) | color:steelblue note:C4 gain:0.25 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 5/1 ⇜ (21/4 → 23/4) ⇝ 6/1 | color:steelblue note:E4 gain:0.25 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (21/4 → 6/1) ⇝ 25/4 | color:green note:A3 gain:1 clip:1 s:piano release:0.1 pan:0.513888888889 ]", + "[ (21/4 → 6/1) ⇝ 25/4 | color:salmon note:F3 gain:0.25 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ 37/8 ⇜ (43/8 → 45/8) | color:green note:F3 gain:0.125 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ 39/8 ⇜ (43/8 → 47/8) | color:steelblue note:C4 gain:0.125 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 41/8 ⇜ (43/8 → 47/8) ⇝ 49/8 | color:steelblue note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (43/8 → 6/1) ⇝ 51/8 | color:green note:A3 gain:0.5 clip:1 s:piano release:0.1 pan:0.513888888889 ]", + "[ (43/8 → 6/1) ⇝ 51/8 | color:salmon note:F3 gain:0.125 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ 19/4 ⇜ (11/2 → 23/4) | color:steelblue note:E4 gain:1 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (11/2 → 6/1) ⇝ 13/2 | color:steelblue note:E4 gain:1 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (11/2 → 6/1) ⇝ 13/2 | color:green note:A3 gain:0.25 clip:1 s:piano release:0.1 pan:0.513888888889 ]", + "[ 39/8 ⇜ (45/8 → 47/8) | color:steelblue note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (45/8 → 6/1) ⇝ 53/8 | color:steelblue note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (45/8 → 6/1) ⇝ 53/8 | color:green note:A3 gain:0.125 clip:1 s:piano release:0.1 pan:0.513888888889 ]", + "[ 5/1 ⇜ (23/4 → 6/1) | color:steelblue note:E4 gain:0.25 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (23/4 → 6/1) ⇝ 27/4 | color:steelblue note:G4 gain:1 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ (23/4 → 6/1) ⇝ 27/4 | color:steelblue note:E4 gain:0.25 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 41/8 ⇜ (47/8 → 6/1) ⇝ 49/8 | color:steelblue note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (47/8 → 6/1) ⇝ 55/8 | color:steelblue note:G4 gain:0.5 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ (47/8 → 6/1) ⇝ 55/8 | color:steelblue note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 41/8 ⇜ (6/1 → 49/8) | color:salmon note:F3 gain:0.5 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ 41/8 ⇜ (6/1 → 49/8) | color:steelblue note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 43/8 ⇜ (6/1 → 49/8) ⇝ 51/8 | color:green note:A3 gain:0.5 clip:1 s:piano release:0.1 pan:0.513888888889 ]", + "[ 45/8 ⇜ (6/1 → 49/8) ⇝ 53/8 | color:steelblue note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 47/8 ⇜ (6/1 → 49/8) ⇝ 55/8 | color:steelblue note:G4 gain:0.5 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 21/4 ⇜ (6/1 → 25/4) | color:green note:A3 gain:1 clip:1 s:piano release:0.1 pan:0.513888888889 ]", + "[ 21/4 ⇜ (6/1 → 25/4) | color:salmon note:F3 gain:0.25 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ 11/2 ⇜ (6/1 → 25/4) ⇝ 13/2 | color:green note:A3 gain:0.25 clip:1 s:piano release:0.1 pan:0.513888888889 ]", + "[ 23/4 ⇜ (6/1 → 25/4) ⇝ 27/4 | color:steelblue note:E4 gain:0.25 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 6/1 → 25/4 | color:salmon note:A3 gain:1 clip:1 s:piano release:0.1 pan:0.513888888889 ]", + "[ (6/1 → 25/4) ⇝ 7/1 | color:steelblue note:G4 gain:0.25 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 43/8 ⇜ (6/1 → 51/8) | color:salmon note:F3 gain:0.125 clip:1 s:piano release:0.1 pan:0.49537037037 ]", + "[ 45/8 ⇜ (6/1 → 51/8) ⇝ 53/8 | color:green note:A3 gain:0.125 clip:1 s:piano release:0.1 pan:0.513888888889 ]", + "[ 47/8 ⇜ (6/1 → 51/8) ⇝ 55/8 | color:steelblue note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 11/2 ⇜ (6/1 → 13/2) | color:steelblue note:E4 gain:1 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 23/4 ⇜ (6/1 → 13/2) ⇝ 27/4 | color:steelblue note:G4 gain:1 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 43/8 ⇜ (49/8 → 51/8) | color:green note:A3 gain:0.5 clip:1 s:piano release:0.1 pan:0.513888888889 ]", + "[ 49/8 → 51/8 | color:salmon note:A3 gain:0.5 clip:1 s:piano release:0.1 pan:0.513888888889 ]", + "[ (49/8 → 51/8) ⇝ 57/8 | color:steelblue note:G4 gain:0.125 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 45/8 ⇜ (49/8 → 53/8) | color:steelblue note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 47/8 ⇜ (49/8 → 53/8) ⇝ 55/8 | color:steelblue note:G4 gain:0.5 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 11/2 ⇜ (25/4 → 13/2) | color:green note:A3 gain:0.25 clip:1 s:piano release:0.1 pan:0.513888888889 ]", + "[ 25/4 → 13/2 | color:green note:C4 gain:1 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 25/4 → 13/2 | color:salmon note:A3 gain:0.25 clip:1 s:piano release:0.1 pan:0.513888888889 ]", + "[ 23/4 ⇜ (25/4 → 27/4) | color:steelblue note:E4 gain:0.25 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 6/1 ⇜ (25/4 → 27/4) ⇝ 7/1 | color:steelblue note:G4 gain:0.25 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 45/8 ⇜ (51/8 → 53/8) | color:green note:A3 gain:0.125 clip:1 s:piano release:0.1 pan:0.513888888889 ]", + "[ 51/8 → 53/8 | color:green note:C4 gain:0.5 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 51/8 → 53/8 | color:salmon note:A3 gain:0.125 clip:1 s:piano release:0.1 pan:0.513888888889 ]", + "[ 47/8 ⇜ (51/8 → 55/8) | color:steelblue note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 49/8 ⇜ (51/8 → 55/8) ⇝ 57/8 | color:steelblue note:G4 gain:0.125 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 23/4 ⇜ (13/2 → 27/4) | color:steelblue note:G4 gain:1 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 13/2 → 27/4 | color:salmon note:C4 gain:1 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 13/2 → 27/4 | color:steelblue note:G4 gain:1 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 13/2 → 27/4 | color:green note:C4 gain:0.25 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 47/8 ⇜ (53/8 → 55/8) | color:steelblue note:G4 gain:0.5 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 53/8 → 55/8 | color:salmon note:C4 gain:0.5 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 53/8 → 55/8 | color:steelblue note:G4 gain:0.5 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 53/8 → 55/8 | color:green note:C4 gain:0.125 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 6/1 ⇜ (27/4 → 7/1) | color:steelblue note:G4 gain:0.25 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 27/4 → 7/1 | color:salmon note:C4 gain:1 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 27/4 → 7/1 | color:green note:E4 gain:1 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 27/4 → 7/1 | color:steelblue note:Bb4 gain:1 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 27/4 → 7/1 | color:salmon note:C4 gain:0.25 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 27/4 → 7/1 | color:steelblue note:G4 gain:0.25 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 49/8 ⇜ (55/8 → 7/1) ⇝ 57/8 | color:steelblue note:G4 gain:0.125 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ (55/8 → 7/1) ⇝ 57/8 | color:salmon note:C4 gain:0.5 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ (55/8 → 7/1) ⇝ 57/8 | color:green note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (55/8 → 7/1) ⇝ 57/8 | color:steelblue note:Bb4 gain:0.5 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ (55/8 → 7/1) ⇝ 57/8 | color:salmon note:C4 gain:0.125 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ (55/8 → 7/1) ⇝ 57/8 | color:steelblue note:G4 gain:0.125 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 49/8 ⇜ (7/1 → 57/8) | color:steelblue note:G4 gain:0.125 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 55/8 ⇜ (7/1 → 57/8) | color:salmon note:C4 gain:0.5 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 55/8 ⇜ (7/1 → 57/8) | color:green note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 55/8 ⇜ (7/1 → 57/8) | color:steelblue note:Bb4 gain:0.5 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 55/8 ⇜ (7/1 → 57/8) | color:salmon note:C4 gain:0.125 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 55/8 ⇜ (7/1 → 57/8) | color:steelblue note:G4 gain:0.125 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 7/1 → 29/4 | color:green note:E4 gain:1 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 7/1 → 29/4 | color:steelblue note:Bb4 gain:1 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 7/1 → 29/4 | color:salmon note:C4 gain:0.25 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 7/1 → 29/4 | color:green note:E4 gain:0.25 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 7/1 → 29/4 | color:steelblue note:Bb4 gain:0.25 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 7/1 → 15/2 | color:salmon note:G3 gain:1 clip:1 s:piano release:0.1 pan:0.50462962963 ]", + "[ 57/8 → 59/8 | color:green note:E4 gain:0.5 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 57/8 → 59/8 | color:steelblue note:Bb4 gain:0.5 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 57/8 → 59/8 | color:salmon note:C4 gain:0.125 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 57/8 → 59/8 | color:green note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 57/8 → 59/8 | color:steelblue note:Bb4 gain:0.125 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 57/8 → 61/8 | color:salmon note:G3 gain:0.5 clip:1 s:piano release:0.1 pan:0.50462962963 ]", + "[ 29/4 → 15/2 | color:steelblue note:Bb4 gain:1 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 29/4 → 15/2 | color:steelblue note:D5 gain:1 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 29/4 → 15/2 | color:green note:E4 gain:0.25 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 29/4 → 15/2 | color:steelblue note:Bb4 gain:0.25 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 29/4 → 31/4 | color:green note:Bb3 gain:1 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 29/4 → 31/4 | color:salmon note:G3 gain:0.25 clip:1 s:piano release:0.1 pan:0.50462962963 ]", + "[ 59/8 → 61/8 | color:steelblue note:Bb4 gain:0.5 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 59/8 → 61/8 | color:steelblue note:D5 gain:0.5 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 59/8 → 61/8 | color:green note:E4 gain:0.125 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 59/8 → 61/8 | color:steelblue note:Bb4 gain:0.125 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 59/8 → 63/8 | color:green note:Bb3 gain:0.5 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 59/8 → 63/8 | color:salmon note:G3 gain:0.125 clip:1 s:piano release:0.1 pan:0.50462962963 ]", + "[ 15/2 → 31/4 | color:steelblue note:D5 gain:1 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 15/2 → 31/4 | color:steelblue note:Bb4 gain:0.25 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 15/2 → 31/4 | color:steelblue note:D5 gain:0.25 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 15/2 → 8/1 | color:salmon note:G3 gain:1 clip:1 s:piano release:0.1 pan:0.50462962963 ]", + "[ 15/2 → 8/1 | color:steelblue note:F4 gain:1 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 15/2 → 8/1 | color:green note:Bb3 gain:0.25 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 61/8 → 63/8 | color:steelblue note:D5 gain:0.5 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 61/8 → 63/8 | color:steelblue note:Bb4 gain:0.125 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 61/8 → 63/8 | color:steelblue note:D5 gain:0.125 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ (61/8 → 8/1) ⇝ 65/8 | color:salmon note:G3 gain:0.5 clip:1 s:piano release:0.1 pan:0.50462962963 ]", + "[ (61/8 → 8/1) ⇝ 65/8 | color:steelblue note:F4 gain:0.5 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ (61/8 → 8/1) ⇝ 65/8 | color:green note:Bb3 gain:0.125 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 31/4 → 8/1 | color:steelblue note:D5 gain:0.25 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ (31/4 → 8/1) ⇝ 33/4 | color:green note:Bb3 gain:1 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ (31/4 → 8/1) ⇝ 33/4 | color:steelblue note:A4 gain:1 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ (31/4 → 8/1) ⇝ 33/4 | color:salmon note:G3 gain:0.25 clip:1 s:piano release:0.1 pan:0.50462962963 ]", + "[ (31/4 → 8/1) ⇝ 33/4 | color:steelblue note:F4 gain:0.25 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ (63/8 → 8/1) ⇝ 65/8 | color:steelblue note:D5 gain:0.125 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ (63/8 → 8/1) ⇝ 67/8 | color:green note:Bb3 gain:0.5 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ (63/8 → 8/1) ⇝ 67/8 | color:steelblue note:A4 gain:0.5 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ (63/8 → 8/1) ⇝ 67/8 | color:salmon note:G3 gain:0.125 clip:1 s:piano release:0.1 pan:0.50462962963 ]", + "[ (63/8 → 8/1) ⇝ 67/8 | color:steelblue note:F4 gain:0.125 clip:1 s:piano release:0.1 pan:0.550925925926 ]", ] `; exports[`renders tunes > tune: festivalOfFingers 1`] = ` [ - "[ (0/1 → 1/64) ⇝ 1/4 | note:C2 gain:0.44000000000000006 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 0/1 ⇜ (1/64 → 1/32) ⇝ 1/4 | note:C2 gain:0.5814213562373095 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 0/1 ⇜ (1/32 → 3/64) ⇝ 1/4 | note:C2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ (1/28 → 3/64) ⇝ 2/7 | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ (1/28 → 3/64) ⇝ 2/7 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ (1/28 → 3/64) ⇝ 2/7 | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ (1/28 → 3/64) ⇝ 2/7 | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 0/1 ⇜ (3/64 → 1/16) ⇝ 1/4 | note:C2 gain:0.5814213562373095 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 1/28 ⇜ (3/64 → 1/16) ⇝ 2/7 | note:70 gain:0.05814213562373095 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 1/28 ⇜ (3/64 → 1/16) ⇝ 2/7 | note:75 gain:0.05814213562373095 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 1/28 ⇜ (3/64 → 1/16) ⇝ 2/7 | note:76 gain:0.05814213562373095 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 1/28 ⇜ (3/64 → 1/16) ⇝ 2/7 | note:80 gain:0.05814213562373095 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 0/1 ⇜ (1/16 → 5/64) ⇝ 1/4 | note:C2 gain:0.44000000000000006 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 1/28 ⇜ (1/16 → 5/64) ⇝ 2/7 | note:70 gain:0.04400000000000001 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 1/28 ⇜ (1/16 → 5/64) ⇝ 2/7 | note:75 gain:0.04400000000000001 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 1/28 ⇜ (1/16 → 5/64) ⇝ 2/7 | note:76 gain:0.04400000000000001 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 1/28 ⇜ (1/16 → 5/64) ⇝ 2/7 | note:80 gain:0.04400000000000001 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 0/1 ⇜ (5/64 → 3/32) ⇝ 1/4 | note:C2 gain:0.2985786437626905 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 1/28 ⇜ (5/64 → 3/32) ⇝ 2/7 | note:70 gain:0.029857864376269052 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 1/28 ⇜ (5/64 → 3/32) ⇝ 2/7 | note:75 gain:0.029857864376269052 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 1/28 ⇜ (5/64 → 3/32) ⇝ 2/7 | note:76 gain:0.029857864376269052 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 1/28 ⇜ (5/64 → 3/32) ⇝ 2/7 | note:80 gain:0.029857864376269052 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 0/1 ⇜ (3/32 → 7/64) ⇝ 1/4 | note:C2 gain:0.24 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 1/28 ⇜ (3/32 → 7/64) ⇝ 2/7 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 1/28 ⇜ (3/32 → 7/64) ⇝ 2/7 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 1/28 ⇜ (3/32 → 7/64) ⇝ 2/7 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 1/28 ⇜ (3/32 → 7/64) ⇝ 2/7 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 0/1 ⇜ (7/64 → 1/8) ⇝ 1/4 | note:C2 gain:0.29857864376269044 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 1/28 ⇜ (7/64 → 1/8) ⇝ 2/7 | note:70 gain:0.029857864376269045 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 1/28 ⇜ (7/64 → 1/8) ⇝ 2/7 | note:75 gain:0.029857864376269045 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 1/28 ⇜ (7/64 → 1/8) ⇝ 2/7 | note:76 gain:0.029857864376269045 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 1/28 ⇜ (7/64 → 1/8) ⇝ 2/7 | note:80 gain:0.029857864376269045 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 0/1 ⇜ (1/8 → 9/64) ⇝ 1/4 | note:C2 gain:0.43999999999999995 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 1/28 ⇜ (1/8 → 9/64) ⇝ 2/7 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 1/28 ⇜ (1/8 → 9/64) ⇝ 2/7 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 1/28 ⇜ (1/8 → 9/64) ⇝ 2/7 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 1/28 ⇜ (1/8 → 9/64) ⇝ 2/7 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ (1/8 → 9/64) ⇝ 1/4 | note:C4 gain:0.43999999999999995 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ (1/8 → 9/64) ⇝ 1/4 | note:Eb4 gain:0.43999999999999995 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 0/1 ⇜ (9/64 → 5/32) ⇝ 1/4 | note:C2 gain:0.5814213562373095 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 1/28 ⇜ (9/64 → 5/32) ⇝ 2/7 | note:70 gain:0.05814213562373095 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 1/28 ⇜ (9/64 → 5/32) ⇝ 2/7 | note:75 gain:0.05814213562373095 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 1/28 ⇜ (9/64 → 5/32) ⇝ 2/7 | note:76 gain:0.05814213562373095 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 1/28 ⇜ (9/64 → 5/32) ⇝ 2/7 | note:80 gain:0.05814213562373095 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 1/8 ⇜ (9/64 → 5/32) ⇝ 1/4 | note:C4 gain:0.5814213562373095 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 1/8 ⇜ (9/64 → 5/32) ⇝ 1/4 | note:Eb4 gain:0.5814213562373095 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 0/1 ⇜ (5/32 → 11/64) ⇝ 1/4 | note:C2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 1/28 ⇜ (5/32 → 11/64) ⇝ 2/7 | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 1/28 ⇜ (5/32 → 11/64) ⇝ 2/7 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 1/28 ⇜ (5/32 → 11/64) ⇝ 2/7 | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 1/28 ⇜ (5/32 → 11/64) ⇝ 2/7 | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 1/8 ⇜ (5/32 → 11/64) ⇝ 1/4 | note:C4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 1/8 ⇜ (5/32 → 11/64) ⇝ 1/4 | note:Eb4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 0/1 ⇜ (11/64 → 3/16) ⇝ 1/4 | note:C2 gain:0.5814213562373096 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 1/28 ⇜ (11/64 → 3/16) ⇝ 2/7 | note:70 gain:0.05814213562373097 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 1/28 ⇜ (11/64 → 3/16) ⇝ 2/7 | note:75 gain:0.05814213562373097 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 1/28 ⇜ (11/64 → 3/16) ⇝ 2/7 | note:76 gain:0.05814213562373097 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 1/28 ⇜ (11/64 → 3/16) ⇝ 2/7 | note:80 gain:0.05814213562373097 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 1/8 ⇜ (11/64 → 3/16) ⇝ 1/4 | note:C4 gain:0.5814213562373096 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 1/8 ⇜ (11/64 → 3/16) ⇝ 1/4 | note:Eb4 gain:0.5814213562373096 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 0/1 ⇜ (3/16 → 13/64) ⇝ 1/4 | note:C2 gain:0.44000000000000006 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 1/28 ⇜ (3/16 → 13/64) ⇝ 2/7 | note:70 gain:0.04400000000000001 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 1/28 ⇜ (3/16 → 13/64) ⇝ 2/7 | note:75 gain:0.04400000000000001 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 1/28 ⇜ (3/16 → 13/64) ⇝ 2/7 | note:76 gain:0.04400000000000001 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 1/28 ⇜ (3/16 → 13/64) ⇝ 2/7 | note:80 gain:0.04400000000000001 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 1/8 ⇜ (3/16 → 13/64) ⇝ 1/4 | note:C4 gain:0.44000000000000006 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 1/8 ⇜ (3/16 → 13/64) ⇝ 1/4 | note:Eb4 gain:0.44000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 0/1 ⇜ (13/64 → 7/32) ⇝ 1/4 | note:C2 gain:0.29857864376269044 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 1/28 ⇜ (13/64 → 7/32) ⇝ 2/7 | note:70 gain:0.029857864376269045 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 1/28 ⇜ (13/64 → 7/32) ⇝ 2/7 | note:75 gain:0.029857864376269045 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 1/28 ⇜ (13/64 → 7/32) ⇝ 2/7 | note:76 gain:0.029857864376269045 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 1/28 ⇜ (13/64 → 7/32) ⇝ 2/7 | note:80 gain:0.029857864376269045 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 1/8 ⇜ (13/64 → 7/32) ⇝ 1/4 | note:C4 gain:0.29857864376269044 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 1/8 ⇜ (13/64 → 7/32) ⇝ 1/4 | note:Eb4 gain:0.29857864376269044 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 0/1 ⇜ (7/32 → 15/64) ⇝ 1/4 | note:C2 gain:0.24 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 1/28 ⇜ (7/32 → 15/64) ⇝ 2/7 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 1/28 ⇜ (7/32 → 15/64) ⇝ 2/7 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 1/28 ⇜ (7/32 → 15/64) ⇝ 2/7 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 1/28 ⇜ (7/32 → 15/64) ⇝ 2/7 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 1/8 ⇜ (7/32 → 15/64) ⇝ 1/4 | note:C4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 1/8 ⇜ (7/32 → 15/64) ⇝ 1/4 | note:Eb4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 0/1 ⇜ (15/64 → 1/4) | note:C2 gain:0.2985786437626903 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 1/28 ⇜ (15/64 → 1/4) ⇝ 2/7 | note:70 gain:0.029857864376269028 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 1/28 ⇜ (15/64 → 1/4) ⇝ 2/7 | note:75 gain:0.029857864376269028 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 1/28 ⇜ (15/64 → 1/4) ⇝ 2/7 | note:76 gain:0.029857864376269028 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 1/28 ⇜ (15/64 → 1/4) ⇝ 2/7 | note:80 gain:0.029857864376269028 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 1/8 ⇜ (15/64 → 1/4) | note:C4 gain:0.2985786437626903 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 1/8 ⇜ (15/64 → 1/4) | note:Eb4 gain:0.2985786437626903 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 1/28 ⇜ (1/4 → 17/64) ⇝ 2/7 | note:70 gain:0.04399999999999999 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 1/28 ⇜ (1/4 → 17/64) ⇝ 2/7 | note:75 gain:0.04399999999999999 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 1/28 ⇜ (1/4 → 17/64) ⇝ 2/7 | note:76 gain:0.04399999999999999 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 1/28 ⇜ (1/4 → 17/64) ⇝ 2/7 | note:80 gain:0.04399999999999999 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 1/28 ⇜ (17/64 → 9/32) ⇝ 2/7 | note:70 gain:0.05814213562373097 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 1/28 ⇜ (17/64 → 9/32) ⇝ 2/7 | note:75 gain:0.05814213562373097 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 1/28 ⇜ (17/64 → 9/32) ⇝ 2/7 | note:76 gain:0.05814213562373097 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 1/28 ⇜ (17/64 → 9/32) ⇝ 2/7 | note:80 gain:0.05814213562373097 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 1/28 ⇜ (9/32 → 2/7) | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 1/28 ⇜ (9/32 → 2/7) | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 1/28 ⇜ (9/32 → 2/7) | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 1/28 ⇜ (9/32 → 2/7) | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ (1/2 → 33/64) ⇝ 5/8 | note:G4 gain:0.4399999999999998 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (1/2 → 33/64) ⇝ 5/8 | note:Bb4 gain:0.4399999999999998 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ (1/2 → 33/64) ⇝ 3/4 | note:Bb3 gain:0.2199999999999999 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ (1/2 → 33/64) ⇝ 3/4 | note:D4 gain:0.2199999999999999 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ (1/2 → 33/64) ⇝ 3/4 | note:Eb4 gain:0.2199999999999999 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ (1/2 → 33/64) ⇝ 3/4 | note:G4 gain:0.2199999999999999 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (1/2 → 33/64) ⇝ 3/4 | note:C2 gain:0.4399999999999998 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 1/2 ⇜ (33/64 → 17/32) ⇝ 5/8 | note:G4 gain:0.5814213562373095 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 1/2 ⇜ (33/64 → 17/32) ⇝ 5/8 | note:Bb4 gain:0.5814213562373095 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 1/2 ⇜ (33/64 → 17/32) ⇝ 3/4 | note:Bb3 gain:0.29071067811865475 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 1/2 ⇜ (33/64 → 17/32) ⇝ 3/4 | note:D4 gain:0.29071067811865475 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 1/2 ⇜ (33/64 → 17/32) ⇝ 3/4 | note:Eb4 gain:0.29071067811865475 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 1/2 ⇜ (33/64 → 17/32) ⇝ 3/4 | note:G4 gain:0.29071067811865475 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 1/2 ⇜ (33/64 → 17/32) ⇝ 3/4 | note:C2 gain:0.5814213562373095 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 1/2 ⇜ (17/32 → 35/64) ⇝ 5/8 | note:G4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 1/2 ⇜ (17/32 → 35/64) ⇝ 5/8 | note:Bb4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 1/2 ⇜ (17/32 → 35/64) ⇝ 3/4 | note:Bb3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 1/2 ⇜ (17/32 → 35/64) ⇝ 3/4 | note:D4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 1/2 ⇜ (17/32 → 35/64) ⇝ 3/4 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 1/2 ⇜ (17/32 → 35/64) ⇝ 3/4 | note:G4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 1/2 ⇜ (17/32 → 35/64) ⇝ 3/4 | note:C2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 1/2 ⇜ (35/64 → 9/16) ⇝ 5/8 | note:G4 gain:0.5814213562373098 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 1/2 ⇜ (35/64 → 9/16) ⇝ 5/8 | note:Bb4 gain:0.5814213562373098 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 1/2 ⇜ (35/64 → 9/16) ⇝ 3/4 | note:Bb3 gain:0.2907106781186549 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 1/2 ⇜ (35/64 → 9/16) ⇝ 3/4 | note:D4 gain:0.2907106781186549 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 1/2 ⇜ (35/64 → 9/16) ⇝ 3/4 | note:Eb4 gain:0.2907106781186549 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 1/2 ⇜ (35/64 → 9/16) ⇝ 3/4 | note:G4 gain:0.2907106781186549 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 1/2 ⇜ (35/64 → 9/16) ⇝ 3/4 | note:C2 gain:0.5814213562373098 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 1/2 ⇜ (9/16 → 37/64) ⇝ 5/8 | note:G4 gain:0.4400000000000002 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 1/2 ⇜ (9/16 → 37/64) ⇝ 5/8 | note:Bb4 gain:0.4400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 1/2 ⇜ (9/16 → 37/64) ⇝ 3/4 | note:Bb3 gain:0.2200000000000001 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 1/2 ⇜ (9/16 → 37/64) ⇝ 3/4 | note:D4 gain:0.2200000000000001 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 1/2 ⇜ (9/16 → 37/64) ⇝ 3/4 | note:Eb4 gain:0.2200000000000001 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 1/2 ⇜ (9/16 → 37/64) ⇝ 3/4 | note:G4 gain:0.2200000000000001 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 1/2 ⇜ (9/16 → 37/64) ⇝ 3/4 | note:C2 gain:0.4400000000000002 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 1/2 ⇜ (37/64 → 19/32) ⇝ 5/8 | note:G4 gain:0.29857864376269055 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 1/2 ⇜ (37/64 → 19/32) ⇝ 5/8 | note:Bb4 gain:0.29857864376269055 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 1/2 ⇜ (37/64 → 19/32) ⇝ 3/4 | note:Bb3 gain:0.14928932188134528 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 1/2 ⇜ (37/64 → 19/32) ⇝ 3/4 | note:D4 gain:0.14928932188134528 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 1/2 ⇜ (37/64 → 19/32) ⇝ 3/4 | note:Eb4 gain:0.14928932188134528 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 1/2 ⇜ (37/64 → 19/32) ⇝ 3/4 | note:G4 gain:0.14928932188134528 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 1/2 ⇜ (37/64 → 19/32) ⇝ 3/4 | note:C2 gain:0.29857864376269055 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 1/2 ⇜ (19/32 → 39/64) ⇝ 5/8 | note:G4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 1/2 ⇜ (19/32 → 39/64) ⇝ 5/8 | note:Bb4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 1/2 ⇜ (19/32 → 39/64) ⇝ 3/4 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 1/2 ⇜ (19/32 → 39/64) ⇝ 3/4 | note:D4 gain:0.12 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 1/2 ⇜ (19/32 → 39/64) ⇝ 3/4 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 1/2 ⇜ (19/32 → 39/64) ⇝ 3/4 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 1/2 ⇜ (19/32 → 39/64) ⇝ 3/4 | note:C2 gain:0.24 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 1/2 ⇜ (39/64 → 5/8) | note:G4 gain:0.2985786437626902 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 1/2 ⇜ (39/64 → 5/8) | note:Bb4 gain:0.2985786437626902 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 1/2 ⇜ (39/64 → 5/8) ⇝ 3/4 | note:Bb3 gain:0.1492893218813451 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 1/2 ⇜ (39/64 → 5/8) ⇝ 3/4 | note:D4 gain:0.1492893218813451 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 1/2 ⇜ (39/64 → 5/8) ⇝ 3/4 | note:Eb4 gain:0.1492893218813451 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 1/2 ⇜ (39/64 → 5/8) ⇝ 3/4 | note:G4 gain:0.1492893218813451 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 1/2 ⇜ (39/64 → 5/8) ⇝ 3/4 | note:C2 gain:0.2985786437626902 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 1/2 ⇜ (5/8 → 41/64) ⇝ 3/4 | note:Bb3 gain:0.2199999999999999 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 1/2 ⇜ (5/8 → 41/64) ⇝ 3/4 | note:D4 gain:0.2199999999999999 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 1/2 ⇜ (5/8 → 41/64) ⇝ 3/4 | note:Eb4 gain:0.2199999999999999 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 1/2 ⇜ (5/8 → 41/64) ⇝ 3/4 | note:G4 gain:0.2199999999999999 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 1/2 ⇜ (5/8 → 41/64) ⇝ 3/4 | note:C2 gain:0.4399999999999998 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 1/2 ⇜ (41/64 → 21/32) ⇝ 3/4 | note:Bb3 gain:0.2907106781186545 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 1/2 ⇜ (41/64 → 21/32) ⇝ 3/4 | note:D4 gain:0.2907106781186545 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 1/2 ⇜ (41/64 → 21/32) ⇝ 3/4 | note:Eb4 gain:0.2907106781186545 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 1/2 ⇜ (41/64 → 21/32) ⇝ 3/4 | note:G4 gain:0.2907106781186545 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 1/2 ⇜ (41/64 → 21/32) ⇝ 3/4 | note:C2 gain:0.581421356237309 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 1/2 ⇜ (21/32 → 43/64) ⇝ 3/4 | note:Bb3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 1/2 ⇜ (21/32 → 43/64) ⇝ 3/4 | note:D4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 1/2 ⇜ (21/32 → 43/64) ⇝ 3/4 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 1/2 ⇜ (21/32 → 43/64) ⇝ 3/4 | note:G4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 1/2 ⇜ (21/32 → 43/64) ⇝ 3/4 | note:C2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 1/2 ⇜ (43/64 → 11/16) ⇝ 3/4 | note:Bb3 gain:0.2907106781186549 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 1/2 ⇜ (43/64 → 11/16) ⇝ 3/4 | note:D4 gain:0.2907106781186549 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 1/2 ⇜ (43/64 → 11/16) ⇝ 3/4 | note:Eb4 gain:0.2907106781186549 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 1/2 ⇜ (43/64 → 11/16) ⇝ 3/4 | note:G4 gain:0.2907106781186549 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 1/2 ⇜ (43/64 → 11/16) ⇝ 3/4 | note:C2 gain:0.5814213562373098 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 1/2 ⇜ (11/16 → 45/64) ⇝ 3/4 | note:Bb3 gain:0.22000000000000047 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 1/2 ⇜ (11/16 → 45/64) ⇝ 3/4 | note:D4 gain:0.22000000000000047 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 1/2 ⇜ (11/16 → 45/64) ⇝ 3/4 | note:Eb4 gain:0.22000000000000047 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 1/2 ⇜ (11/16 → 45/64) ⇝ 3/4 | note:G4 gain:0.22000000000000047 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 1/2 ⇜ (11/16 → 45/64) ⇝ 3/4 | note:C2 gain:0.44000000000000095 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 1/2 ⇜ (45/64 → 23/32) ⇝ 3/4 | note:Bb3 gain:0.14928932188134528 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 1/2 ⇜ (45/64 → 23/32) ⇝ 3/4 | note:D4 gain:0.14928932188134528 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 1/2 ⇜ (45/64 → 23/32) ⇝ 3/4 | note:Eb4 gain:0.14928932188134528 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 1/2 ⇜ (45/64 → 23/32) ⇝ 3/4 | note:G4 gain:0.14928932188134528 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 1/2 ⇜ (45/64 → 23/32) ⇝ 3/4 | note:C2 gain:0.29857864376269055 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 1/2 ⇜ (23/32 → 47/64) ⇝ 3/4 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 1/2 ⇜ (23/32 → 47/64) ⇝ 3/4 | note:D4 gain:0.12 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 1/2 ⇜ (23/32 → 47/64) ⇝ 3/4 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 1/2 ⇜ (23/32 → 47/64) ⇝ 3/4 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 1/2 ⇜ (23/32 → 47/64) ⇝ 3/4 | note:C2 gain:0.24 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 1/2 ⇜ (47/64 → 3/4) | note:Bb3 gain:0.14928932188134533 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 1/2 ⇜ (47/64 → 3/4) | note:D4 gain:0.14928932188134533 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 1/2 ⇜ (47/64 → 3/4) | note:Eb4 gain:0.14928932188134533 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 1/2 ⇜ (47/64 → 3/4) | note:G4 gain:0.14928932188134533 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 1/2 ⇜ (47/64 → 3/4) | note:C2 gain:0.29857864376269067 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ (3/4 → 49/64) ⇝ 7/8 | note:C4 gain:0.4399999999999997 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ (3/4 → 49/64) ⇝ 7/8 | note:Eb4 gain:0.4399999999999997 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 3/4 ⇜ (49/64 → 25/32) ⇝ 7/8 | note:C4 gain:0.581421356237309 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 3/4 ⇜ (49/64 → 25/32) ⇝ 7/8 | note:Eb4 gain:0.581421356237309 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 3/4 ⇜ (25/32 → 51/64) ⇝ 7/8 | note:C4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 3/4 ⇜ (25/32 → 51/64) ⇝ 7/8 | note:Eb4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ (11/14 → 51/64) ⇝ 29/28 | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ (11/14 → 51/64) ⇝ 29/28 | note:74 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ (11/14 → 51/64) ⇝ 29/28 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ (11/14 → 51/64) ⇝ 29/28 | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 3/4 ⇜ (51/64 → 13/16) ⇝ 7/8 | note:C4 gain:0.5814213562373098 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 3/4 ⇜ (51/64 → 13/16) ⇝ 7/8 | note:Eb4 gain:0.5814213562373098 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 11/14 ⇜ (51/64 → 13/16) ⇝ 29/28 | note:70 gain:0.05814213562373099 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 11/14 ⇜ (51/64 → 13/16) ⇝ 29/28 | note:74 gain:0.05814213562373099 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 11/14 ⇜ (51/64 → 13/16) ⇝ 29/28 | note:75 gain:0.05814213562373099 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 11/14 ⇜ (51/64 → 13/16) ⇝ 29/28 | note:79 gain:0.05814213562373099 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 3/4 ⇜ (13/16 → 53/64) ⇝ 7/8 | note:C4 gain:0.4399999999999996 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 3/4 ⇜ (13/16 → 53/64) ⇝ 7/8 | note:Eb4 gain:0.4399999999999996 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 11/14 ⇜ (13/16 → 53/64) ⇝ 29/28 | note:70 gain:0.04399999999999996 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 11/14 ⇜ (13/16 → 53/64) ⇝ 29/28 | note:74 gain:0.04399999999999996 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 11/14 ⇜ (13/16 → 53/64) ⇝ 29/28 | note:75 gain:0.04399999999999996 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 11/14 ⇜ (13/16 → 53/64) ⇝ 29/28 | note:79 gain:0.04399999999999996 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 3/4 ⇜ (53/64 → 27/32) ⇝ 7/8 | note:C4 gain:0.2985786437626906 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 3/4 ⇜ (53/64 → 27/32) ⇝ 7/8 | note:Eb4 gain:0.2985786437626906 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 11/14 ⇜ (53/64 → 27/32) ⇝ 29/28 | note:70 gain:0.029857864376269062 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 11/14 ⇜ (53/64 → 27/32) ⇝ 29/28 | note:74 gain:0.029857864376269062 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 11/14 ⇜ (53/64 → 27/32) ⇝ 29/28 | note:75 gain:0.029857864376269062 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 11/14 ⇜ (53/64 → 27/32) ⇝ 29/28 | note:79 gain:0.029857864376269062 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 3/4 ⇜ (27/32 → 55/64) ⇝ 7/8 | note:C4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 3/4 ⇜ (27/32 → 55/64) ⇝ 7/8 | note:Eb4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 11/14 ⇜ (27/32 → 55/64) ⇝ 29/28 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 11/14 ⇜ (27/32 → 55/64) ⇝ 29/28 | note:74 gain:0.024 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 11/14 ⇜ (27/32 → 55/64) ⇝ 29/28 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 11/14 ⇜ (27/32 → 55/64) ⇝ 29/28 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 3/4 ⇜ (55/64 → 7/8) | note:C4 gain:0.29857864376269067 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 3/4 ⇜ (55/64 → 7/8) | note:Eb4 gain:0.29857864376269067 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 11/14 ⇜ (55/64 → 7/8) ⇝ 29/28 | note:70 gain:0.02985786437626907 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 11/14 ⇜ (55/64 → 7/8) ⇝ 29/28 | note:74 gain:0.02985786437626907 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 11/14 ⇜ (55/64 → 7/8) ⇝ 29/28 | note:75 gain:0.02985786437626907 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 11/14 ⇜ (55/64 → 7/8) ⇝ 29/28 | note:79 gain:0.02985786437626907 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 11/14 ⇜ (7/8 → 57/64) ⇝ 29/28 | note:70 gain:0.04399999999999998 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 11/14 ⇜ (7/8 → 57/64) ⇝ 29/28 | note:74 gain:0.04399999999999998 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 11/14 ⇜ (7/8 → 57/64) ⇝ 29/28 | note:75 gain:0.04399999999999998 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 11/14 ⇜ (7/8 → 57/64) ⇝ 29/28 | note:79 gain:0.04399999999999998 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 11/14 ⇜ (57/64 → 29/32) ⇝ 29/28 | note:70 gain:0.0581421356237309 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 11/14 ⇜ (57/64 → 29/32) ⇝ 29/28 | note:74 gain:0.0581421356237309 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 11/14 ⇜ (57/64 → 29/32) ⇝ 29/28 | note:75 gain:0.0581421356237309 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 11/14 ⇜ (57/64 → 29/32) ⇝ 29/28 | note:79 gain:0.0581421356237309 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 11/14 ⇜ (29/32 → 59/64) ⇝ 29/28 | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 11/14 ⇜ (29/32 → 59/64) ⇝ 29/28 | note:74 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 11/14 ⇜ (29/32 → 59/64) ⇝ 29/28 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 11/14 ⇜ (29/32 → 59/64) ⇝ 29/28 | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 11/14 ⇜ (59/64 → 15/16) ⇝ 29/28 | note:70 gain:0.058142135623730995 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 11/14 ⇜ (59/64 → 15/16) ⇝ 29/28 | note:74 gain:0.058142135623730995 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 11/14 ⇜ (59/64 → 15/16) ⇝ 29/28 | note:75 gain:0.058142135623730995 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 11/14 ⇜ (59/64 → 15/16) ⇝ 29/28 | note:79 gain:0.058142135623730995 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 11/14 ⇜ (15/16 → 61/64) ⇝ 29/28 | note:70 gain:0.044000000000000115 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 11/14 ⇜ (15/16 → 61/64) ⇝ 29/28 | note:74 gain:0.044000000000000115 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 11/14 ⇜ (15/16 → 61/64) ⇝ 29/28 | note:75 gain:0.044000000000000115 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 11/14 ⇜ (15/16 → 61/64) ⇝ 29/28 | note:79 gain:0.044000000000000115 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 11/14 ⇜ (61/64 → 31/32) ⇝ 29/28 | note:70 gain:0.02985786437626907 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 11/14 ⇜ (61/64 → 31/32) ⇝ 29/28 | note:74 gain:0.02985786437626907 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 11/14 ⇜ (61/64 → 31/32) ⇝ 29/28 | note:75 gain:0.02985786437626907 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 11/14 ⇜ (61/64 → 31/32) ⇝ 29/28 | note:79 gain:0.02985786437626907 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 11/14 ⇜ (31/32 → 63/64) ⇝ 29/28 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 11/14 ⇜ (31/32 → 63/64) ⇝ 29/28 | note:74 gain:0.024 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 11/14 ⇜ (31/32 → 63/64) ⇝ 29/28 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 11/14 ⇜ (31/32 → 63/64) ⇝ 29/28 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 11/14 ⇜ (63/64 → 1/1) ⇝ 29/28 | note:70 gain:0.029857864376269062 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 11/14 ⇜ (63/64 → 1/1) ⇝ 29/28 | note:74 gain:0.029857864376269062 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 11/14 ⇜ (63/64 → 1/1) ⇝ 29/28 | note:75 gain:0.029857864376269062 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 11/14 ⇜ (63/64 → 1/1) ⇝ 29/28 | note:79 gain:0.029857864376269062 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 11/14 ⇜ (1/1 → 65/64) ⇝ 29/28 | note:70 gain:0.04399999999999996 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 11/14 ⇜ (1/1 → 65/64) ⇝ 29/28 | note:74 gain:0.04399999999999996 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 11/14 ⇜ (1/1 → 65/64) ⇝ 29/28 | note:75 gain:0.04399999999999996 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 11/14 ⇜ (1/1 → 65/64) ⇝ 29/28 | note:79 gain:0.04399999999999996 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ (1/1 → 65/64) ⇝ 5/4 | note:C2 gain:0.4399999999999996 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 11/14 ⇜ (65/64 → 33/32) ⇝ 29/28 | note:70 gain:0.0581421356237309 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 11/14 ⇜ (65/64 → 33/32) ⇝ 29/28 | note:74 gain:0.0581421356237309 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 11/14 ⇜ (65/64 → 33/32) ⇝ 29/28 | note:75 gain:0.0581421356237309 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 11/14 ⇜ (65/64 → 33/32) ⇝ 29/28 | note:79 gain:0.0581421356237309 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 1/1 ⇜ (65/64 → 33/32) ⇝ 5/4 | note:C2 gain:0.581421356237309 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 11/14 ⇜ (33/32 → 29/28) | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 11/14 ⇜ (33/32 → 29/28) | note:74 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 11/14 ⇜ (33/32 → 29/28) | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 11/14 ⇜ (33/32 → 29/28) | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 1/1 ⇜ (33/32 → 67/64) ⇝ 5/4 | note:C2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 1/1 ⇜ (67/64 → 17/16) ⇝ 5/4 | note:C2 gain:0.58142135623731 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 1/1 ⇜ (17/16 → 69/64) ⇝ 5/4 | note:C2 gain:0.4399999999999997 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 1/1 ⇜ (69/64 → 35/32) ⇝ 5/4 | note:C2 gain:0.29857864376269067 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 1/1 ⇜ (35/32 → 71/64) ⇝ 5/4 | note:C2 gain:0.24 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 1/1 ⇜ (71/64 → 9/8) ⇝ 5/4 | note:C2 gain:0.29857864376269055 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 1/1 ⇜ (9/8 → 73/64) ⇝ 5/4 | note:C2 gain:0.4399999999999995 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ (9/8 → 73/64) ⇝ 5/4 | note:C4 gain:0.4399999999999995 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ (9/8 → 73/64) ⇝ 5/4 | note:Eb4 gain:0.4399999999999995 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 1/1 ⇜ (73/64 → 37/32) ⇝ 5/4 | note:C2 gain:0.5814213562373087 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 9/8 ⇜ (73/64 → 37/32) ⇝ 5/4 | note:C4 gain:0.5814213562373087 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 9/8 ⇜ (73/64 → 37/32) ⇝ 5/4 | note:Eb4 gain:0.5814213562373087 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 1/1 ⇜ (37/32 → 75/64) ⇝ 5/4 | note:C2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 9/8 ⇜ (37/32 → 75/64) ⇝ 5/4 | note:C4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 9/8 ⇜ (37/32 → 75/64) ⇝ 5/4 | note:Eb4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 1/1 ⇜ (75/64 → 19/16) ⇝ 5/4 | note:C2 gain:0.58142135623731 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 9/8 ⇜ (75/64 → 19/16) ⇝ 5/4 | note:C4 gain:0.58142135623731 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 9/8 ⇜ (75/64 → 19/16) ⇝ 5/4 | note:Eb4 gain:0.58142135623731 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 1/1 ⇜ (19/16 → 77/64) ⇝ 5/4 | note:C2 gain:0.4400000000000011 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 9/8 ⇜ (19/16 → 77/64) ⇝ 5/4 | note:C4 gain:0.4400000000000011 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 9/8 ⇜ (19/16 → 77/64) ⇝ 5/4 | note:Eb4 gain:0.4400000000000011 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 1/1 ⇜ (77/64 → 39/32) ⇝ 5/4 | note:C2 gain:0.2985786437626907 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 9/8 ⇜ (77/64 → 39/32) ⇝ 5/4 | note:C4 gain:0.2985786437626907 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 9/8 ⇜ (77/64 → 39/32) ⇝ 5/4 | note:Eb4 gain:0.2985786437626907 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 1/1 ⇜ (39/32 → 79/64) ⇝ 5/4 | note:C2 gain:0.24 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 9/8 ⇜ (39/32 → 79/64) ⇝ 5/4 | note:C4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 9/8 ⇜ (39/32 → 79/64) ⇝ 5/4 | note:Eb4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 1/1 ⇜ (79/64 → 5/4) | note:C2 gain:0.29857864376269055 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 9/8 ⇜ (79/64 → 5/4) | note:C4 gain:0.29857864376269055 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 9/8 ⇜ (79/64 → 5/4) | note:Eb4 gain:0.29857864376269055 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ (5/4 → 81/64) ⇝ 3/2 | note:Bb3 gain:0.21999999999999975 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ (5/4 → 81/64) ⇝ 3/2 | note:D4 gain:0.21999999999999975 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ (5/4 → 81/64) ⇝ 3/2 | note:Eb4 gain:0.21999999999999975 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ (5/4 → 81/64) ⇝ 3/2 | note:G4 gain:0.21999999999999975 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/4 ⇜ (81/64 → 41/32) ⇝ 3/2 | note:Bb3 gain:0.29071067811865436 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 5/4 ⇜ (81/64 → 41/32) ⇝ 3/2 | note:D4 gain:0.29071067811865436 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 5/4 ⇜ (81/64 → 41/32) ⇝ 3/2 | note:Eb4 gain:0.29071067811865436 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 5/4 ⇜ (81/64 → 41/32) ⇝ 3/2 | note:G4 gain:0.29071067811865436 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/4 ⇜ (41/32 → 83/64) ⇝ 3/2 | note:Bb3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 5/4 ⇜ (41/32 → 83/64) ⇝ 3/2 | note:D4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 5/4 ⇜ (41/32 → 83/64) ⇝ 3/2 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 5/4 ⇜ (41/32 → 83/64) ⇝ 3/2 | note:G4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/4 ⇜ (83/64 → 21/16) ⇝ 3/2 | note:Bb3 gain:0.2907106781186545 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 5/4 ⇜ (83/64 → 21/16) ⇝ 3/2 | note:D4 gain:0.2907106781186545 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 5/4 ⇜ (83/64 → 21/16) ⇝ 3/2 | note:Eb4 gain:0.2907106781186545 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 5/4 ⇜ (83/64 → 21/16) ⇝ 3/2 | note:G4 gain:0.2907106781186545 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/4 ⇜ (21/16 → 85/64) ⇝ 3/2 | note:Bb3 gain:0.2199999999999999 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 5/4 ⇜ (21/16 → 85/64) ⇝ 3/2 | note:D4 gain:0.2199999999999999 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 5/4 ⇜ (21/16 → 85/64) ⇝ 3/2 | note:Eb4 gain:0.2199999999999999 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 5/4 ⇜ (21/16 → 85/64) ⇝ 3/2 | note:G4 gain:0.2199999999999999 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/4 ⇜ (85/64 → 43/32) ⇝ 3/2 | note:Bb3 gain:0.14928932188134536 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 5/4 ⇜ (85/64 → 43/32) ⇝ 3/2 | note:D4 gain:0.14928932188134536 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 5/4 ⇜ (85/64 → 43/32) ⇝ 3/2 | note:Eb4 gain:0.14928932188134536 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 5/4 ⇜ (85/64 → 43/32) ⇝ 3/2 | note:G4 gain:0.14928932188134536 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/4 ⇜ (43/32 → 87/64) ⇝ 3/2 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 5/4 ⇜ (43/32 → 87/64) ⇝ 3/2 | note:D4 gain:0.12 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 5/4 ⇜ (43/32 → 87/64) ⇝ 3/2 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 5/4 ⇜ (43/32 → 87/64) ⇝ 3/2 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/4 ⇜ (87/64 → 11/8) ⇝ 3/2 | note:Bb3 gain:0.14928932188134475 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 5/4 ⇜ (87/64 → 11/8) ⇝ 3/2 | note:D4 gain:0.14928932188134475 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 5/4 ⇜ (87/64 → 11/8) ⇝ 3/2 | note:Eb4 gain:0.14928932188134475 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 5/4 ⇜ (87/64 → 11/8) ⇝ 3/2 | note:G4 gain:0.14928932188134475 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/4 ⇜ (11/8 → 89/64) ⇝ 3/2 | note:Bb3 gain:0.21999999999999906 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 5/4 ⇜ (11/8 → 89/64) ⇝ 3/2 | note:D4 gain:0.21999999999999906 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 5/4 ⇜ (11/8 → 89/64) ⇝ 3/2 | note:Eb4 gain:0.21999999999999906 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 5/4 ⇜ (11/8 → 89/64) ⇝ 3/2 | note:G4 gain:0.21999999999999906 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/4 ⇜ (89/64 → 45/32) ⇝ 3/2 | note:Bb3 gain:0.2907106781186549 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 5/4 ⇜ (89/64 → 45/32) ⇝ 3/2 | note:D4 gain:0.2907106781186549 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 5/4 ⇜ (89/64 → 45/32) ⇝ 3/2 | note:Eb4 gain:0.2907106781186549 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 5/4 ⇜ (89/64 → 45/32) ⇝ 3/2 | note:G4 gain:0.2907106781186549 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/4 ⇜ (45/32 → 91/64) ⇝ 3/2 | note:Bb3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 5/4 ⇜ (45/32 → 91/64) ⇝ 3/2 | note:D4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 5/4 ⇜ (45/32 → 91/64) ⇝ 3/2 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 5/4 ⇜ (45/32 → 91/64) ⇝ 3/2 | note:G4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/4 ⇜ (91/64 → 23/16) ⇝ 3/2 | note:Bb3 gain:0.290710678118655 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 5/4 ⇜ (91/64 → 23/16) ⇝ 3/2 | note:D4 gain:0.290710678118655 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 5/4 ⇜ (91/64 → 23/16) ⇝ 3/2 | note:Eb4 gain:0.290710678118655 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 5/4 ⇜ (91/64 → 23/16) ⇝ 3/2 | note:G4 gain:0.290710678118655 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/4 ⇜ (23/16 → 93/64) ⇝ 3/2 | note:Bb3 gain:0.22000000000000064 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 5/4 ⇜ (23/16 → 93/64) ⇝ 3/2 | note:D4 gain:0.22000000000000064 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 5/4 ⇜ (23/16 → 93/64) ⇝ 3/2 | note:Eb4 gain:0.22000000000000064 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 5/4 ⇜ (23/16 → 93/64) ⇝ 3/2 | note:G4 gain:0.22000000000000064 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/4 ⇜ (93/64 → 47/32) ⇝ 3/2 | note:Bb3 gain:0.1492893218813459 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 5/4 ⇜ (93/64 → 47/32) ⇝ 3/2 | note:D4 gain:0.1492893218813459 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 5/4 ⇜ (93/64 → 47/32) ⇝ 3/2 | note:Eb4 gain:0.1492893218813459 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 5/4 ⇜ (93/64 → 47/32) ⇝ 3/2 | note:G4 gain:0.1492893218813459 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/4 ⇜ (47/32 → 95/64) ⇝ 3/2 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 5/4 ⇜ (47/32 → 95/64) ⇝ 3/2 | note:D4 gain:0.12 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 5/4 ⇜ (47/32 → 95/64) ⇝ 3/2 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 5/4 ⇜ (47/32 → 95/64) ⇝ 3/2 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/4 ⇜ (95/64 → 3/2) | note:Bb3 gain:0.14928932188134522 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 5/4 ⇜ (95/64 → 3/2) | note:D4 gain:0.14928932188134522 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 5/4 ⇜ (95/64 → 3/2) | note:Eb4 gain:0.14928932188134522 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 5/4 ⇜ (95/64 → 3/2) | note:G4 gain:0.14928932188134522 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (3/2 → 97/64) ⇝ 13/8 | note:G4 gain:0.43999999999999945 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (3/2 → 97/64) ⇝ 13/8 | note:Bb4 gain:0.43999999999999945 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ (3/2 → 97/64) ⇝ 7/4 | note:C2 gain:0.43999999999999945 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 3/2 ⇜ (97/64 → 49/32) ⇝ 13/8 | note:G4 gain:0.5814213562373087 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 3/2 ⇜ (97/64 → 49/32) ⇝ 13/8 | note:Bb4 gain:0.5814213562373087 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 3/2 ⇜ (97/64 → 49/32) ⇝ 7/4 | note:C2 gain:0.5814213562373087 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 3/2 ⇜ (49/32 → 99/64) ⇝ 13/8 | note:G4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 3/2 ⇜ (49/32 → 99/64) ⇝ 13/8 | note:Bb4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 3/2 ⇜ (49/32 → 99/64) ⇝ 7/4 | note:C2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ (43/28 → 99/64) ⇝ 25/14 | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ (43/28 → 99/64) ⇝ 25/14 | note:74 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ (43/28 → 99/64) ⇝ 25/14 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ (43/28 → 99/64) ⇝ 25/14 | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 3/2 ⇜ (99/64 → 25/16) ⇝ 13/8 | note:G4 gain:0.5814213562373091 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 3/2 ⇜ (99/64 → 25/16) ⇝ 13/8 | note:Bb4 gain:0.5814213562373091 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 3/2 ⇜ (99/64 → 25/16) ⇝ 7/4 | note:C2 gain:0.5814213562373091 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 43/28 ⇜ (99/64 → 25/16) ⇝ 25/14 | note:70 gain:0.05814213562373091 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 43/28 ⇜ (99/64 → 25/16) ⇝ 25/14 | note:74 gain:0.05814213562373091 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 43/28 ⇜ (99/64 → 25/16) ⇝ 25/14 | note:75 gain:0.05814213562373091 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 43/28 ⇜ (99/64 → 25/16) ⇝ 25/14 | note:79 gain:0.05814213562373091 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 3/2 ⇜ (25/16 → 101/64) ⇝ 13/8 | note:G4 gain:0.4399999999999999 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 3/2 ⇜ (25/16 → 101/64) ⇝ 13/8 | note:Bb4 gain:0.4399999999999999 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 3/2 ⇜ (25/16 → 101/64) ⇝ 7/4 | note:C2 gain:0.4399999999999999 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 43/28 ⇜ (25/16 → 101/64) ⇝ 25/14 | note:70 gain:0.04399999999999999 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 43/28 ⇜ (25/16 → 101/64) ⇝ 25/14 | note:74 gain:0.04399999999999999 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 43/28 ⇜ (25/16 → 101/64) ⇝ 25/14 | note:75 gain:0.04399999999999999 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 43/28 ⇜ (25/16 → 101/64) ⇝ 25/14 | note:79 gain:0.04399999999999999 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 3/2 ⇜ (101/64 → 51/32) ⇝ 13/8 | note:G4 gain:0.29857864376269083 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 3/2 ⇜ (101/64 → 51/32) ⇝ 13/8 | note:Bb4 gain:0.29857864376269083 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 3/2 ⇜ (101/64 → 51/32) ⇝ 7/4 | note:C2 gain:0.29857864376269083 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 43/28 ⇜ (101/64 → 51/32) ⇝ 25/14 | note:70 gain:0.029857864376269083 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 43/28 ⇜ (101/64 → 51/32) ⇝ 25/14 | note:74 gain:0.029857864376269083 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 43/28 ⇜ (101/64 → 51/32) ⇝ 25/14 | note:75 gain:0.029857864376269083 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 43/28 ⇜ (101/64 → 51/32) ⇝ 25/14 | note:79 gain:0.029857864376269083 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 3/2 ⇜ (51/32 → 103/64) ⇝ 13/8 | note:G4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 3/2 ⇜ (51/32 → 103/64) ⇝ 13/8 | note:Bb4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 3/2 ⇜ (51/32 → 103/64) ⇝ 7/4 | note:C2 gain:0.24 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 43/28 ⇜ (51/32 → 103/64) ⇝ 25/14 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 43/28 ⇜ (51/32 → 103/64) ⇝ 25/14 | note:74 gain:0.024 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 43/28 ⇜ (51/32 → 103/64) ⇝ 25/14 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 43/28 ⇜ (51/32 → 103/64) ⇝ 25/14 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 3/2 ⇜ (103/64 → 13/8) | note:G4 gain:0.2985786437626894 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 3/2 ⇜ (103/64 → 13/8) | note:Bb4 gain:0.2985786437626894 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 3/2 ⇜ (103/64 → 13/8) ⇝ 7/4 | note:C2 gain:0.2985786437626894 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 43/28 ⇜ (103/64 → 13/8) ⇝ 25/14 | note:70 gain:0.02985786437626894 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 43/28 ⇜ (103/64 → 13/8) ⇝ 25/14 | note:74 gain:0.02985786437626894 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 43/28 ⇜ (103/64 → 13/8) ⇝ 25/14 | note:75 gain:0.02985786437626894 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 43/28 ⇜ (103/64 → 13/8) ⇝ 25/14 | note:79 gain:0.02985786437626894 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 3/2 ⇜ (13/8 → 105/64) ⇝ 7/4 | note:C2 gain:0.4400000000000008 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 43/28 ⇜ (13/8 → 105/64) ⇝ 25/14 | note:70 gain:0.04400000000000008 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 43/28 ⇜ (13/8 → 105/64) ⇝ 25/14 | note:74 gain:0.04400000000000008 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 43/28 ⇜ (13/8 → 105/64) ⇝ 25/14 | note:75 gain:0.04400000000000008 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 43/28 ⇜ (13/8 → 105/64) ⇝ 25/14 | note:79 gain:0.04400000000000008 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 3/2 ⇜ (105/64 → 53/32) ⇝ 7/4 | note:C2 gain:0.5814213562373096 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 43/28 ⇜ (105/64 → 53/32) ⇝ 25/14 | note:70 gain:0.05814213562373097 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 43/28 ⇜ (105/64 → 53/32) ⇝ 25/14 | note:74 gain:0.05814213562373097 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 43/28 ⇜ (105/64 → 53/32) ⇝ 25/14 | note:75 gain:0.05814213562373097 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 43/28 ⇜ (105/64 → 53/32) ⇝ 25/14 | note:79 gain:0.05814213562373097 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 3/2 ⇜ (53/32 → 107/64) ⇝ 7/4 | note:C2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 43/28 ⇜ (53/32 → 107/64) ⇝ 25/14 | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 43/28 ⇜ (53/32 → 107/64) ⇝ 25/14 | note:74 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 43/28 ⇜ (53/32 → 107/64) ⇝ 25/14 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 43/28 ⇜ (53/32 → 107/64) ⇝ 25/14 | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 3/2 ⇜ (107/64 → 27/16) ⇝ 7/4 | note:C2 gain:0.5814213562373102 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 43/28 ⇜ (107/64 → 27/16) ⇝ 25/14 | note:70 gain:0.05814213562373102 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 43/28 ⇜ (107/64 → 27/16) ⇝ 25/14 | note:74 gain:0.05814213562373102 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 43/28 ⇜ (107/64 → 27/16) ⇝ 25/14 | note:75 gain:0.05814213562373102 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 43/28 ⇜ (107/64 → 27/16) ⇝ 25/14 | note:79 gain:0.05814213562373102 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 3/2 ⇜ (27/16 → 109/64) ⇝ 7/4 | note:C2 gain:0.4400000000000014 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 43/28 ⇜ (27/16 → 109/64) ⇝ 25/14 | note:70 gain:0.04400000000000014 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 43/28 ⇜ (27/16 → 109/64) ⇝ 25/14 | note:74 gain:0.04400000000000014 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 43/28 ⇜ (27/16 → 109/64) ⇝ 25/14 | note:75 gain:0.04400000000000014 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 43/28 ⇜ (27/16 → 109/64) ⇝ 25/14 | note:79 gain:0.04400000000000014 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 3/2 ⇜ (109/64 → 55/32) ⇝ 7/4 | note:C2 gain:0.29857864376269183 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 43/28 ⇜ (109/64 → 55/32) ⇝ 25/14 | note:70 gain:0.029857864376269184 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 43/28 ⇜ (109/64 → 55/32) ⇝ 25/14 | note:74 gain:0.029857864376269184 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 43/28 ⇜ (109/64 → 55/32) ⇝ 25/14 | note:75 gain:0.029857864376269184 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 43/28 ⇜ (109/64 → 55/32) ⇝ 25/14 | note:79 gain:0.029857864376269184 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 3/2 ⇜ (55/32 → 111/64) ⇝ 7/4 | note:C2 gain:0.24 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 43/28 ⇜ (55/32 → 111/64) ⇝ 25/14 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 43/28 ⇜ (55/32 → 111/64) ⇝ 25/14 | note:74 gain:0.024 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 43/28 ⇜ (55/32 → 111/64) ⇝ 25/14 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 43/28 ⇜ (55/32 → 111/64) ⇝ 25/14 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 3/2 ⇜ (111/64 → 7/4) | note:C2 gain:0.2985786437626904 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 43/28 ⇜ (111/64 → 7/4) ⇝ 25/14 | note:70 gain:0.02985786437626904 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 43/28 ⇜ (111/64 → 7/4) ⇝ 25/14 | note:74 gain:0.02985786437626904 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 43/28 ⇜ (111/64 → 7/4) ⇝ 25/14 | note:75 gain:0.02985786437626904 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 43/28 ⇜ (111/64 → 7/4) ⇝ 25/14 | note:79 gain:0.02985786437626904 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 43/28 ⇜ (7/4 → 113/64) ⇝ 25/14 | note:70 gain:0.043999999999999935 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 43/28 ⇜ (7/4 → 113/64) ⇝ 25/14 | note:74 gain:0.043999999999999935 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 43/28 ⇜ (7/4 → 113/64) ⇝ 25/14 | note:75 gain:0.043999999999999935 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 43/28 ⇜ (7/4 → 113/64) ⇝ 25/14 | note:79 gain:0.043999999999999935 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ (7/4 → 113/64) ⇝ 15/8 | note:G4 gain:0.43999999999999934 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (7/4 → 113/64) ⇝ 15/8 | note:Bb4 gain:0.43999999999999934 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ (7/4 → 113/64) ⇝ 2/1 | note:Bb3 gain:0.21999999999999967 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ (7/4 → 113/64) ⇝ 2/1 | note:D4 gain:0.21999999999999967 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ (7/4 → 113/64) ⇝ 2/1 | note:Eb4 gain:0.21999999999999967 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ (7/4 → 113/64) ⇝ 2/1 | note:G4 gain:0.21999999999999967 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 43/28 ⇜ (113/64 → 57/32) ⇝ 25/14 | note:70 gain:0.05814213562373086 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 43/28 ⇜ (113/64 → 57/32) ⇝ 25/14 | note:74 gain:0.05814213562373086 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 43/28 ⇜ (113/64 → 57/32) ⇝ 25/14 | note:75 gain:0.05814213562373086 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 43/28 ⇜ (113/64 → 57/32) ⇝ 25/14 | note:79 gain:0.05814213562373086 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 7/4 ⇜ (113/64 → 57/32) ⇝ 15/8 | note:G4 gain:0.5814213562373086 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 7/4 ⇜ (113/64 → 57/32) ⇝ 15/8 | note:Bb4 gain:0.5814213562373086 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 7/4 ⇜ (113/64 → 57/32) ⇝ 2/1 | note:Bb3 gain:0.2907106781186543 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 7/4 ⇜ (113/64 → 57/32) ⇝ 2/1 | note:D4 gain:0.2907106781186543 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 7/4 ⇜ (113/64 → 57/32) ⇝ 2/1 | note:Eb4 gain:0.2907106781186543 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 7/4 ⇜ (113/64 → 57/32) ⇝ 2/1 | note:G4 gain:0.2907106781186543 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 43/28 ⇜ (57/32 → 25/14) | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 43/28 ⇜ (57/32 → 25/14) | note:74 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 43/28 ⇜ (57/32 → 25/14) | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 43/28 ⇜ (57/32 → 25/14) | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 7/4 ⇜ (57/32 → 115/64) ⇝ 15/8 | note:G4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 7/4 ⇜ (57/32 → 115/64) ⇝ 15/8 | note:Bb4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 7/4 ⇜ (57/32 → 115/64) ⇝ 2/1 | note:Bb3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 7/4 ⇜ (57/32 → 115/64) ⇝ 2/1 | note:D4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 7/4 ⇜ (57/32 → 115/64) ⇝ 2/1 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 7/4 ⇜ (57/32 → 115/64) ⇝ 2/1 | note:G4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 7/4 ⇜ (115/64 → 29/16) ⇝ 15/8 | note:G4 gain:0.5814213562373091 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 7/4 ⇜ (115/64 → 29/16) ⇝ 15/8 | note:Bb4 gain:0.5814213562373091 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 7/4 ⇜ (115/64 → 29/16) ⇝ 2/1 | note:Bb3 gain:0.29071067811865453 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 7/4 ⇜ (115/64 → 29/16) ⇝ 2/1 | note:D4 gain:0.29071067811865453 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 7/4 ⇜ (115/64 → 29/16) ⇝ 2/1 | note:Eb4 gain:0.29071067811865453 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 7/4 ⇜ (115/64 → 29/16) ⇝ 2/1 | note:G4 gain:0.29071067811865453 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 7/4 ⇜ (29/16 → 117/64) ⇝ 15/8 | note:G4 gain:0.44000000000000006 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 7/4 ⇜ (29/16 → 117/64) ⇝ 15/8 | note:Bb4 gain:0.44000000000000006 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 7/4 ⇜ (29/16 → 117/64) ⇝ 2/1 | note:Bb3 gain:0.22000000000000003 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 7/4 ⇜ (29/16 → 117/64) ⇝ 2/1 | note:D4 gain:0.22000000000000003 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 7/4 ⇜ (29/16 → 117/64) ⇝ 2/1 | note:Eb4 gain:0.22000000000000003 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 7/4 ⇜ (29/16 → 117/64) ⇝ 2/1 | note:G4 gain:0.22000000000000003 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 7/4 ⇜ (117/64 → 59/32) ⇝ 15/8 | note:G4 gain:0.2985786437626909 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 7/4 ⇜ (117/64 → 59/32) ⇝ 15/8 | note:Bb4 gain:0.2985786437626909 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 7/4 ⇜ (117/64 → 59/32) ⇝ 2/1 | note:Bb3 gain:0.14928932188134544 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 7/4 ⇜ (117/64 → 59/32) ⇝ 2/1 | note:D4 gain:0.14928932188134544 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 7/4 ⇜ (117/64 → 59/32) ⇝ 2/1 | note:Eb4 gain:0.14928932188134544 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 7/4 ⇜ (117/64 → 59/32) ⇝ 2/1 | note:G4 gain:0.14928932188134544 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 7/4 ⇜ (59/32 → 119/64) ⇝ 15/8 | note:G4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 7/4 ⇜ (59/32 → 119/64) ⇝ 15/8 | note:Bb4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 7/4 ⇜ (59/32 → 119/64) ⇝ 2/1 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 7/4 ⇜ (59/32 → 119/64) ⇝ 2/1 | note:D4 gain:0.12 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 7/4 ⇜ (59/32 → 119/64) ⇝ 2/1 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 7/4 ⇜ (59/32 → 119/64) ⇝ 2/1 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 7/4 ⇜ (119/64 → 15/8) | note:G4 gain:0.29857864376268933 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 7/4 ⇜ (119/64 → 15/8) | note:Bb4 gain:0.29857864376268933 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 7/4 ⇜ (119/64 → 15/8) ⇝ 2/1 | note:Bb3 gain:0.14928932188134467 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 7/4 ⇜ (119/64 → 15/8) ⇝ 2/1 | note:D4 gain:0.14928932188134467 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 7/4 ⇜ (119/64 → 15/8) ⇝ 2/1 | note:Eb4 gain:0.14928932188134467 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 7/4 ⇜ (119/64 → 15/8) ⇝ 2/1 | note:G4 gain:0.14928932188134467 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 7/4 ⇜ (15/8 → 121/64) ⇝ 2/1 | note:Bb3 gain:0.21999999999999892 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 7/4 ⇜ (15/8 → 121/64) ⇝ 2/1 | note:D4 gain:0.21999999999999892 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 7/4 ⇜ (15/8 → 121/64) ⇝ 2/1 | note:Eb4 gain:0.21999999999999892 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 7/4 ⇜ (15/8 → 121/64) ⇝ 2/1 | note:G4 gain:0.21999999999999892 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 7/4 ⇜ (121/64 → 61/32) ⇝ 2/1 | note:Bb3 gain:0.2907106781186548 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 7/4 ⇜ (121/64 → 61/32) ⇝ 2/1 | note:D4 gain:0.2907106781186548 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 7/4 ⇜ (121/64 → 61/32) ⇝ 2/1 | note:Eb4 gain:0.2907106781186548 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 7/4 ⇜ (121/64 → 61/32) ⇝ 2/1 | note:G4 gain:0.2907106781186548 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 7/4 ⇜ (61/32 → 123/64) ⇝ 2/1 | note:Bb3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 7/4 ⇜ (61/32 → 123/64) ⇝ 2/1 | note:D4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 7/4 ⇜ (61/32 → 123/64) ⇝ 2/1 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 7/4 ⇜ (61/32 → 123/64) ⇝ 2/1 | note:G4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 7/4 ⇜ (123/64 → 31/16) ⇝ 2/1 | note:Bb3 gain:0.2907106781186551 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 7/4 ⇜ (123/64 → 31/16) ⇝ 2/1 | note:D4 gain:0.2907106781186551 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 7/4 ⇜ (123/64 → 31/16) ⇝ 2/1 | note:Eb4 gain:0.2907106781186551 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 7/4 ⇜ (123/64 → 31/16) ⇝ 2/1 | note:G4 gain:0.2907106781186551 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 7/4 ⇜ (31/16 → 125/64) ⇝ 2/1 | note:Bb3 gain:0.22000000000000075 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 7/4 ⇜ (31/16 → 125/64) ⇝ 2/1 | note:D4 gain:0.22000000000000075 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 7/4 ⇜ (31/16 → 125/64) ⇝ 2/1 | note:Eb4 gain:0.22000000000000075 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 7/4 ⇜ (31/16 → 125/64) ⇝ 2/1 | note:G4 gain:0.22000000000000075 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 7/4 ⇜ (125/64 → 63/32) ⇝ 2/1 | note:Bb3 gain:0.14928932188134594 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 7/4 ⇜ (125/64 → 63/32) ⇝ 2/1 | note:D4 gain:0.14928932188134594 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 7/4 ⇜ (125/64 → 63/32) ⇝ 2/1 | note:Eb4 gain:0.14928932188134594 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 7/4 ⇜ (125/64 → 63/32) ⇝ 2/1 | note:G4 gain:0.14928932188134594 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 7/4 ⇜ (63/32 → 127/64) ⇝ 2/1 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 7/4 ⇜ (63/32 → 127/64) ⇝ 2/1 | note:D4 gain:0.12 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 7/4 ⇜ (63/32 → 127/64) ⇝ 2/1 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 7/4 ⇜ (63/32 → 127/64) ⇝ 2/1 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 7/4 ⇜ (127/64 → 2/1) | note:Bb3 gain:0.14928932188134517 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 7/4 ⇜ (127/64 → 2/1) | note:D4 gain:0.14928932188134517 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 7/4 ⇜ (127/64 → 2/1) | note:Eb4 gain:0.14928932188134517 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 7/4 ⇜ (127/64 → 2/1) | note:G4 gain:0.14928932188134517 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (2/1 → 129/64) ⇝ 9/4 | note:F2 gain:0.4399999999999993 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 2/1 ⇜ (129/64 → 65/32) ⇝ 9/4 | note:F2 gain:0.5814213562373086 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 2/1 ⇜ (65/32 → 131/64) ⇝ 9/4 | note:F2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ (57/28 → 131/64) ⇝ 16/7 | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ (57/28 → 131/64) ⇝ 16/7 | note:74 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ (57/28 → 131/64) ⇝ 16/7 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ (57/28 → 131/64) ⇝ 16/7 | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 2/1 ⇜ (131/64 → 33/16) ⇝ 9/4 | note:F2 gain:0.5814213562373092 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 57/28 ⇜ (131/64 → 33/16) ⇝ 16/7 | note:70 gain:0.05814213562373092 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 57/28 ⇜ (131/64 → 33/16) ⇝ 16/7 | note:74 gain:0.05814213562373092 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 57/28 ⇜ (131/64 → 33/16) ⇝ 16/7 | note:75 gain:0.05814213562373092 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 57/28 ⇜ (131/64 → 33/16) ⇝ 16/7 | note:79 gain:0.05814213562373092 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 2/1 ⇜ (33/16 → 133/64) ⇝ 9/4 | note:F2 gain:0.44000000000000006 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 57/28 ⇜ (33/16 → 133/64) ⇝ 16/7 | note:70 gain:0.04400000000000001 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 57/28 ⇜ (33/16 → 133/64) ⇝ 16/7 | note:74 gain:0.04400000000000001 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 57/28 ⇜ (33/16 → 133/64) ⇝ 16/7 | note:75 gain:0.04400000000000001 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 57/28 ⇜ (33/16 → 133/64) ⇝ 16/7 | note:79 gain:0.04400000000000001 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 2/1 ⇜ (133/64 → 67/32) ⇝ 9/4 | note:F2 gain:0.2985786437626909 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 57/28 ⇜ (133/64 → 67/32) ⇝ 16/7 | note:70 gain:0.02985786437626909 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 57/28 ⇜ (133/64 → 67/32) ⇝ 16/7 | note:74 gain:0.02985786437626909 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 57/28 ⇜ (133/64 → 67/32) ⇝ 16/7 | note:75 gain:0.02985786437626909 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 57/28 ⇜ (133/64 → 67/32) ⇝ 16/7 | note:79 gain:0.02985786437626909 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 2/1 ⇜ (67/32 → 135/64) ⇝ 9/4 | note:F2 gain:0.24 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 57/28 ⇜ (67/32 → 135/64) ⇝ 16/7 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 57/28 ⇜ (67/32 → 135/64) ⇝ 16/7 | note:74 gain:0.024 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 57/28 ⇜ (67/32 → 135/64) ⇝ 16/7 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 57/28 ⇜ (67/32 → 135/64) ⇝ 16/7 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 2/1 ⇜ (135/64 → 17/8) ⇝ 9/4 | note:F2 gain:0.29857864376268933 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 57/28 ⇜ (135/64 → 17/8) ⇝ 16/7 | note:70 gain:0.029857864376268934 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 57/28 ⇜ (135/64 → 17/8) ⇝ 16/7 | note:74 gain:0.029857864376268934 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 57/28 ⇜ (135/64 → 17/8) ⇝ 16/7 | note:75 gain:0.029857864376268934 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 57/28 ⇜ (135/64 → 17/8) ⇝ 16/7 | note:79 gain:0.029857864376268934 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 2/1 ⇜ (17/8 → 137/64) ⇝ 9/4 | note:F2 gain:0.4400000000000006 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 57/28 ⇜ (17/8 → 137/64) ⇝ 16/7 | note:70 gain:0.04400000000000007 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 57/28 ⇜ (17/8 → 137/64) ⇝ 16/7 | note:74 gain:0.04400000000000007 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 57/28 ⇜ (17/8 → 137/64) ⇝ 16/7 | note:75 gain:0.04400000000000007 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 57/28 ⇜ (17/8 → 137/64) ⇝ 16/7 | note:79 gain:0.04400000000000007 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ (17/8 → 137/64) ⇝ 9/4 | note:F4 gain:0.4400000000000006 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ (17/8 → 137/64) ⇝ 9/4 | note:Ab4 gain:0.4400000000000006 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 2/1 ⇜ (137/64 → 69/32) ⇝ 9/4 | note:F2 gain:0.5814213562373095 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 57/28 ⇜ (137/64 → 69/32) ⇝ 16/7 | note:70 gain:0.05814213562373095 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 57/28 ⇜ (137/64 → 69/32) ⇝ 16/7 | note:74 gain:0.05814213562373095 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 57/28 ⇜ (137/64 → 69/32) ⇝ 16/7 | note:75 gain:0.05814213562373095 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 57/28 ⇜ (137/64 → 69/32) ⇝ 16/7 | note:79 gain:0.05814213562373095 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 17/8 ⇜ (137/64 → 69/32) ⇝ 9/4 | note:F4 gain:0.5814213562373095 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 17/8 ⇜ (137/64 → 69/32) ⇝ 9/4 | note:Ab4 gain:0.5814213562373095 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 2/1 ⇜ (69/32 → 139/64) ⇝ 9/4 | note:F2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 57/28 ⇜ (69/32 → 139/64) ⇝ 16/7 | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 57/28 ⇜ (69/32 → 139/64) ⇝ 16/7 | note:74 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 57/28 ⇜ (69/32 → 139/64) ⇝ 16/7 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 57/28 ⇜ (69/32 → 139/64) ⇝ 16/7 | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 17/8 ⇜ (69/32 → 139/64) ⇝ 9/4 | note:F4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 17/8 ⇜ (69/32 → 139/64) ⇝ 9/4 | note:Ab4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 2/1 ⇜ (139/64 → 35/16) ⇝ 9/4 | note:F2 gain:0.5814213562373102 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 57/28 ⇜ (139/64 → 35/16) ⇝ 16/7 | note:70 gain:0.05814213562373102 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 57/28 ⇜ (139/64 → 35/16) ⇝ 16/7 | note:74 gain:0.05814213562373102 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 57/28 ⇜ (139/64 → 35/16) ⇝ 16/7 | note:75 gain:0.05814213562373102 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 57/28 ⇜ (139/64 → 35/16) ⇝ 16/7 | note:79 gain:0.05814213562373102 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 17/8 ⇜ (139/64 → 35/16) ⇝ 9/4 | note:F4 gain:0.5814213562373102 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 17/8 ⇜ (139/64 → 35/16) ⇝ 9/4 | note:Ab4 gain:0.5814213562373102 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 2/1 ⇜ (35/16 → 141/64) ⇝ 9/4 | note:F2 gain:0.44000000000000156 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 57/28 ⇜ (35/16 → 141/64) ⇝ 16/7 | note:70 gain:0.04400000000000016 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 57/28 ⇜ (35/16 → 141/64) ⇝ 16/7 | note:74 gain:0.04400000000000016 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 57/28 ⇜ (35/16 → 141/64) ⇝ 16/7 | note:75 gain:0.04400000000000016 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 57/28 ⇜ (35/16 → 141/64) ⇝ 16/7 | note:79 gain:0.04400000000000016 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 17/8 ⇜ (35/16 → 141/64) ⇝ 9/4 | note:F4 gain:0.44000000000000156 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 17/8 ⇜ (35/16 → 141/64) ⇝ 9/4 | note:Ab4 gain:0.44000000000000156 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 2/1 ⇜ (141/64 → 71/32) ⇝ 9/4 | note:F2 gain:0.298578643762692 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 57/28 ⇜ (141/64 → 71/32) ⇝ 16/7 | note:70 gain:0.0298578643762692 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 57/28 ⇜ (141/64 → 71/32) ⇝ 16/7 | note:74 gain:0.0298578643762692 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 57/28 ⇜ (141/64 → 71/32) ⇝ 16/7 | note:75 gain:0.0298578643762692 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 57/28 ⇜ (141/64 → 71/32) ⇝ 16/7 | note:79 gain:0.0298578643762692 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 17/8 ⇜ (141/64 → 71/32) ⇝ 9/4 | note:F4 gain:0.298578643762692 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 17/8 ⇜ (141/64 → 71/32) ⇝ 9/4 | note:Ab4 gain:0.298578643762692 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 2/1 ⇜ (71/32 → 143/64) ⇝ 9/4 | note:F2 gain:0.24 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 57/28 ⇜ (71/32 → 143/64) ⇝ 16/7 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 57/28 ⇜ (71/32 → 143/64) ⇝ 16/7 | note:74 gain:0.024 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 57/28 ⇜ (71/32 → 143/64) ⇝ 16/7 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 57/28 ⇜ (71/32 → 143/64) ⇝ 16/7 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 17/8 ⇜ (71/32 → 143/64) ⇝ 9/4 | note:F4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 17/8 ⇜ (71/32 → 143/64) ⇝ 9/4 | note:Ab4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 2/1 ⇜ (143/64 → 9/4) | note:F2 gain:0.2985786437626902 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 57/28 ⇜ (143/64 → 9/4) ⇝ 16/7 | note:70 gain:0.029857864376269024 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 57/28 ⇜ (143/64 → 9/4) ⇝ 16/7 | note:74 gain:0.029857864376269024 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 57/28 ⇜ (143/64 → 9/4) ⇝ 16/7 | note:75 gain:0.029857864376269024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 57/28 ⇜ (143/64 → 9/4) ⇝ 16/7 | note:79 gain:0.029857864376269024 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 17/8 ⇜ (143/64 → 9/4) | note:F4 gain:0.2985786437626902 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 17/8 ⇜ (143/64 → 9/4) | note:Ab4 gain:0.2985786437626902 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 57/28 ⇜ (9/4 → 145/64) ⇝ 16/7 | note:70 gain:0.04399999999999992 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 57/28 ⇜ (9/4 → 145/64) ⇝ 16/7 | note:74 gain:0.04399999999999992 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 57/28 ⇜ (9/4 → 145/64) ⇝ 16/7 | note:75 gain:0.04399999999999992 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 57/28 ⇜ (9/4 → 145/64) ⇝ 16/7 | note:79 gain:0.04399999999999992 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 57/28 ⇜ (145/64 → 73/32) ⇝ 16/7 | note:70 gain:0.05814213562373086 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 57/28 ⇜ (145/64 → 73/32) ⇝ 16/7 | note:74 gain:0.05814213562373086 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 57/28 ⇜ (145/64 → 73/32) ⇝ 16/7 | note:75 gain:0.05814213562373086 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 57/28 ⇜ (145/64 → 73/32) ⇝ 16/7 | note:79 gain:0.05814213562373086 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 57/28 ⇜ (73/32 → 16/7) | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 57/28 ⇜ (73/32 → 16/7) | note:74 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 57/28 ⇜ (73/32 → 16/7) | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 57/28 ⇜ (73/32 → 16/7) | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ (5/2 → 161/64) ⇝ 21/8 | note:C5 gain:0.439999999999999 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ (5/2 → 161/64) ⇝ 21/8 | note:Eb5 gain:0.439999999999999 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ (5/2 → 161/64) ⇝ 11/4 | note:Eb4 gain:0.2199999999999995 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ (5/2 → 161/64) ⇝ 11/4 | note:G4 gain:0.2199999999999995 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (5/2 → 161/64) ⇝ 11/4 | note:Ab4 gain:0.2199999999999995 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ (5/2 → 161/64) ⇝ 11/4 | note:C5 gain:0.2199999999999995 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ (5/2 → 161/64) ⇝ 11/4 | note:F2 gain:0.439999999999999 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 5/2 ⇜ (161/64 → 81/32) ⇝ 21/8 | note:C5 gain:0.5814213562373084 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 5/2 ⇜ (161/64 → 81/32) ⇝ 21/8 | note:Eb5 gain:0.5814213562373084 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 5/2 ⇜ (161/64 → 81/32) ⇝ 11/4 | note:Eb4 gain:0.2907106781186542 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 5/2 ⇜ (161/64 → 81/32) ⇝ 11/4 | note:G4 gain:0.2907106781186542 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/2 ⇜ (161/64 → 81/32) ⇝ 11/4 | note:Ab4 gain:0.2907106781186542 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 5/2 ⇜ (161/64 → 81/32) ⇝ 11/4 | note:C5 gain:0.2907106781186542 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 5/2 ⇜ (161/64 → 81/32) ⇝ 11/4 | note:F2 gain:0.5814213562373084 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 5/2 ⇜ (81/32 → 163/64) ⇝ 21/8 | note:C5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 5/2 ⇜ (81/32 → 163/64) ⇝ 21/8 | note:Eb5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 5/2 ⇜ (81/32 → 163/64) ⇝ 11/4 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 5/2 ⇜ (81/32 → 163/64) ⇝ 11/4 | note:G4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/2 ⇜ (81/32 → 163/64) ⇝ 11/4 | note:Ab4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 5/2 ⇜ (81/32 → 163/64) ⇝ 11/4 | note:C5 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 5/2 ⇜ (81/32 → 163/64) ⇝ 11/4 | note:F2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 5/2 ⇜ (163/64 → 41/16) ⇝ 21/8 | note:C5 gain:0.5814213562373114 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 5/2 ⇜ (163/64 → 41/16) ⇝ 21/8 | note:Eb5 gain:0.5814213562373114 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 5/2 ⇜ (163/64 → 41/16) ⇝ 11/4 | note:Eb4 gain:0.2907106781186557 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 5/2 ⇜ (163/64 → 41/16) ⇝ 11/4 | note:G4 gain:0.2907106781186557 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/2 ⇜ (163/64 → 41/16) ⇝ 11/4 | note:Ab4 gain:0.2907106781186557 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 5/2 ⇜ (163/64 → 41/16) ⇝ 11/4 | note:C5 gain:0.2907106781186557 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 5/2 ⇜ (163/64 → 41/16) ⇝ 11/4 | note:F2 gain:0.5814213562373114 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 5/2 ⇜ (41/16 → 165/64) ⇝ 21/8 | note:C5 gain:0.44000000000000317 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 5/2 ⇜ (41/16 → 165/64) ⇝ 21/8 | note:Eb5 gain:0.44000000000000317 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 5/2 ⇜ (41/16 → 165/64) ⇝ 11/4 | note:Eb4 gain:0.22000000000000158 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 5/2 ⇜ (41/16 → 165/64) ⇝ 11/4 | note:G4 gain:0.22000000000000158 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/2 ⇜ (41/16 → 165/64) ⇝ 11/4 | note:Ab4 gain:0.22000000000000158 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 5/2 ⇜ (41/16 → 165/64) ⇝ 11/4 | note:C5 gain:0.22000000000000158 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 5/2 ⇜ (41/16 → 165/64) ⇝ 11/4 | note:F2 gain:0.44000000000000317 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 5/2 ⇜ (165/64 → 83/32) ⇝ 21/8 | note:C5 gain:0.2985786437626931 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 5/2 ⇜ (165/64 → 83/32) ⇝ 21/8 | note:Eb5 gain:0.2985786437626931 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 5/2 ⇜ (165/64 → 83/32) ⇝ 11/4 | note:Eb4 gain:0.14928932188134655 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 5/2 ⇜ (165/64 → 83/32) ⇝ 11/4 | note:G4 gain:0.14928932188134655 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/2 ⇜ (165/64 → 83/32) ⇝ 11/4 | note:Ab4 gain:0.14928932188134655 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 5/2 ⇜ (165/64 → 83/32) ⇝ 11/4 | note:C5 gain:0.14928932188134655 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 5/2 ⇜ (165/64 → 83/32) ⇝ 11/4 | note:F2 gain:0.2985786437626931 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 5/2 ⇜ (83/32 → 167/64) ⇝ 21/8 | note:C5 gain:0.24 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 5/2 ⇜ (83/32 → 167/64) ⇝ 21/8 | note:Eb5 gain:0.24 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 5/2 ⇜ (83/32 → 167/64) ⇝ 11/4 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 5/2 ⇜ (83/32 → 167/64) ⇝ 11/4 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/2 ⇜ (83/32 → 167/64) ⇝ 11/4 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 5/2 ⇜ (83/32 → 167/64) ⇝ 11/4 | note:C5 gain:0.12 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 5/2 ⇜ (83/32 → 167/64) ⇝ 11/4 | note:F2 gain:0.24 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 5/2 ⇜ (167/64 → 21/8) | note:C5 gain:0.29857864376269116 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 5/2 ⇜ (167/64 → 21/8) | note:Eb5 gain:0.29857864376269116 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 5/2 ⇜ (167/64 → 21/8) ⇝ 11/4 | note:Eb4 gain:0.14928932188134558 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 5/2 ⇜ (167/64 → 21/8) ⇝ 11/4 | note:G4 gain:0.14928932188134558 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/2 ⇜ (167/64 → 21/8) ⇝ 11/4 | note:Ab4 gain:0.14928932188134558 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 5/2 ⇜ (167/64 → 21/8) ⇝ 11/4 | note:C5 gain:0.14928932188134558 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 5/2 ⇜ (167/64 → 21/8) ⇝ 11/4 | note:F2 gain:0.29857864376269116 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 5/2 ⇜ (21/8 → 169/64) ⇝ 11/4 | note:Eb4 gain:0.2200000000000002 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 5/2 ⇜ (21/8 → 169/64) ⇝ 11/4 | note:G4 gain:0.2200000000000002 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/2 ⇜ (21/8 → 169/64) ⇝ 11/4 | note:Ab4 gain:0.2200000000000002 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 5/2 ⇜ (21/8 → 169/64) ⇝ 11/4 | note:C5 gain:0.2200000000000002 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 5/2 ⇜ (21/8 → 169/64) ⇝ 11/4 | note:F2 gain:0.4400000000000004 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 5/2 ⇜ (169/64 → 85/32) ⇝ 11/4 | note:Eb4 gain:0.29071067811865475 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 5/2 ⇜ (169/64 → 85/32) ⇝ 11/4 | note:G4 gain:0.29071067811865475 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/2 ⇜ (169/64 → 85/32) ⇝ 11/4 | note:Ab4 gain:0.29071067811865475 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 5/2 ⇜ (169/64 → 85/32) ⇝ 11/4 | note:C5 gain:0.29071067811865475 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 5/2 ⇜ (169/64 → 85/32) ⇝ 11/4 | note:F2 gain:0.5814213562373095 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 5/2 ⇜ (85/32 → 171/64) ⇝ 11/4 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 5/2 ⇜ (85/32 → 171/64) ⇝ 11/4 | note:G4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/2 ⇜ (85/32 → 171/64) ⇝ 11/4 | note:Ab4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 5/2 ⇜ (85/32 → 171/64) ⇝ 11/4 | note:C5 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 5/2 ⇜ (85/32 → 171/64) ⇝ 11/4 | note:F2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 5/2 ⇜ (171/64 → 43/16) ⇝ 11/4 | note:Eb4 gain:0.2907106781186552 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 5/2 ⇜ (171/64 → 43/16) ⇝ 11/4 | note:G4 gain:0.2907106781186552 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/2 ⇜ (171/64 → 43/16) ⇝ 11/4 | note:Ab4 gain:0.2907106781186552 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 5/2 ⇜ (171/64 → 43/16) ⇝ 11/4 | note:C5 gain:0.2907106781186552 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 5/2 ⇜ (171/64 → 43/16) ⇝ 11/4 | note:F2 gain:0.5814213562373104 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 5/2 ⇜ (43/16 → 173/64) ⇝ 11/4 | note:Eb4 gain:0.22000000000000092 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 5/2 ⇜ (43/16 → 173/64) ⇝ 11/4 | note:G4 gain:0.22000000000000092 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/2 ⇜ (43/16 → 173/64) ⇝ 11/4 | note:Ab4 gain:0.22000000000000092 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 5/2 ⇜ (43/16 → 173/64) ⇝ 11/4 | note:C5 gain:0.22000000000000092 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 5/2 ⇜ (43/16 → 173/64) ⇝ 11/4 | note:F2 gain:0.44000000000000183 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 5/2 ⇜ (173/64 → 87/32) ⇝ 11/4 | note:Eb4 gain:0.14928932188134608 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 5/2 ⇜ (173/64 → 87/32) ⇝ 11/4 | note:G4 gain:0.14928932188134608 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/2 ⇜ (173/64 → 87/32) ⇝ 11/4 | note:Ab4 gain:0.14928932188134608 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 5/2 ⇜ (173/64 → 87/32) ⇝ 11/4 | note:C5 gain:0.14928932188134608 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 5/2 ⇜ (173/64 → 87/32) ⇝ 11/4 | note:F2 gain:0.29857864376269216 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 5/2 ⇜ (87/32 → 175/64) ⇝ 11/4 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 5/2 ⇜ (87/32 → 175/64) ⇝ 11/4 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/2 ⇜ (87/32 → 175/64) ⇝ 11/4 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 5/2 ⇜ (87/32 → 175/64) ⇝ 11/4 | note:C5 gain:0.12 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 5/2 ⇜ (87/32 → 175/64) ⇝ 11/4 | note:F2 gain:0.24 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 5/2 ⇜ (175/64 → 11/4) | note:Eb4 gain:0.14928932188134406 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 5/2 ⇜ (175/64 → 11/4) | note:G4 gain:0.14928932188134406 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/2 ⇜ (175/64 → 11/4) | note:Ab4 gain:0.14928932188134406 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 5/2 ⇜ (175/64 → 11/4) | note:C5 gain:0.14928932188134406 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 5/2 ⇜ (175/64 → 11/4) | note:F2 gain:0.2985786437626881 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ (11/4 → 177/64) ⇝ 23/8 | note:F4 gain:0.43999999999999606 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ (11/4 → 177/64) ⇝ 23/8 | note:Ab4 gain:0.43999999999999606 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 11/4 ⇜ (177/64 → 89/32) ⇝ 23/8 | note:F4 gain:0.5814213562373104 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 11/4 ⇜ (177/64 → 89/32) ⇝ 23/8 | note:Ab4 gain:0.5814213562373104 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 11/4 ⇜ (89/32 → 179/64) ⇝ 23/8 | note:F4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 11/4 ⇜ (89/32 → 179/64) ⇝ 23/8 | note:Ab4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ (39/14 → 179/64) ⇝ 85/28 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ (39/14 → 179/64) ⇝ 85/28 | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ (39/14 → 179/64) ⇝ 85/28 | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ (39/14 → 179/64) ⇝ 85/28 | note:84 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 11/4 ⇜ (179/64 → 45/16) ⇝ 23/8 | note:F4 gain:0.5814213562373095 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 11/4 ⇜ (179/64 → 45/16) ⇝ 23/8 | note:Ab4 gain:0.5814213562373095 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 39/14 ⇜ (179/64 → 45/16) ⇝ 85/28 | note:75 gain:0.05814213562373095 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 39/14 ⇜ (179/64 → 45/16) ⇝ 85/28 | note:79 gain:0.05814213562373095 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 39/14 ⇜ (179/64 → 45/16) ⇝ 85/28 | note:80 gain:0.05814213562373095 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 39/14 ⇜ (179/64 → 45/16) ⇝ 85/28 | note:84 gain:0.05814213562373095 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 11/4 ⇜ (45/16 → 181/64) ⇝ 23/8 | note:F4 gain:0.4400000000000004 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 11/4 ⇜ (45/16 → 181/64) ⇝ 23/8 | note:Ab4 gain:0.4400000000000004 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 39/14 ⇜ (45/16 → 181/64) ⇝ 85/28 | note:75 gain:0.04400000000000004 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 39/14 ⇜ (45/16 → 181/64) ⇝ 85/28 | note:79 gain:0.04400000000000004 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 39/14 ⇜ (45/16 → 181/64) ⇝ 85/28 | note:80 gain:0.04400000000000004 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 39/14 ⇜ (45/16 → 181/64) ⇝ 85/28 | note:84 gain:0.04400000000000004 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 11/4 ⇜ (181/64 → 91/32) ⇝ 23/8 | note:F4 gain:0.29857864376269116 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 11/4 ⇜ (181/64 → 91/32) ⇝ 23/8 | note:Ab4 gain:0.29857864376269116 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 39/14 ⇜ (181/64 → 91/32) ⇝ 85/28 | note:75 gain:0.029857864376269118 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 39/14 ⇜ (181/64 → 91/32) ⇝ 85/28 | note:79 gain:0.029857864376269118 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 39/14 ⇜ (181/64 → 91/32) ⇝ 85/28 | note:80 gain:0.029857864376269118 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 39/14 ⇜ (181/64 → 91/32) ⇝ 85/28 | note:84 gain:0.029857864376269118 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 11/4 ⇜ (91/32 → 183/64) ⇝ 23/8 | note:F4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 11/4 ⇜ (91/32 → 183/64) ⇝ 23/8 | note:Ab4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 39/14 ⇜ (91/32 → 183/64) ⇝ 85/28 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 39/14 ⇜ (91/32 → 183/64) ⇝ 85/28 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 39/14 ⇜ (91/32 → 183/64) ⇝ 85/28 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 39/14 ⇜ (91/32 → 183/64) ⇝ 85/28 | note:84 gain:0.024 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 11/4 ⇜ (183/64 → 23/8) | note:F4 gain:0.2985786437626891 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 11/4 ⇜ (183/64 → 23/8) | note:Ab4 gain:0.2985786437626891 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 39/14 ⇜ (183/64 → 23/8) ⇝ 85/28 | note:75 gain:0.029857864376268913 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 39/14 ⇜ (183/64 → 23/8) ⇝ 85/28 | note:79 gain:0.029857864376268913 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 39/14 ⇜ (183/64 → 23/8) ⇝ 85/28 | note:80 gain:0.029857864376268913 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 39/14 ⇜ (183/64 → 23/8) ⇝ 85/28 | note:84 gain:0.029857864376268913 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 39/14 ⇜ (23/8 → 185/64) ⇝ 85/28 | note:75 gain:0.043999999999999755 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 39/14 ⇜ (23/8 → 185/64) ⇝ 85/28 | note:79 gain:0.043999999999999755 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 39/14 ⇜ (23/8 → 185/64) ⇝ 85/28 | note:80 gain:0.043999999999999755 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 39/14 ⇜ (23/8 → 185/64) ⇝ 85/28 | note:84 gain:0.043999999999999755 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 39/14 ⇜ (185/64 → 93/32) ⇝ 85/28 | note:75 gain:0.05814213562373073 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 39/14 ⇜ (185/64 → 93/32) ⇝ 85/28 | note:79 gain:0.05814213562373073 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 39/14 ⇜ (185/64 → 93/32) ⇝ 85/28 | note:80 gain:0.05814213562373073 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 39/14 ⇜ (185/64 → 93/32) ⇝ 85/28 | note:84 gain:0.05814213562373073 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 39/14 ⇜ (93/32 → 187/64) ⇝ 85/28 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 39/14 ⇜ (93/32 → 187/64) ⇝ 85/28 | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 39/14 ⇜ (93/32 → 187/64) ⇝ 85/28 | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 39/14 ⇜ (93/32 → 187/64) ⇝ 85/28 | note:84 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 39/14 ⇜ (187/64 → 47/16) ⇝ 85/28 | note:75 gain:0.05814213562373084 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 39/14 ⇜ (187/64 → 47/16) ⇝ 85/28 | note:79 gain:0.05814213562373084 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 39/14 ⇜ (187/64 → 47/16) ⇝ 85/28 | note:80 gain:0.05814213562373084 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 39/14 ⇜ (187/64 → 47/16) ⇝ 85/28 | note:84 gain:0.05814213562373084 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 39/14 ⇜ (47/16 → 189/64) ⇝ 85/28 | note:75 gain:0.0439999999999999 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 39/14 ⇜ (47/16 → 189/64) ⇝ 85/28 | note:79 gain:0.0439999999999999 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 39/14 ⇜ (47/16 → 189/64) ⇝ 85/28 | note:80 gain:0.0439999999999999 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 39/14 ⇜ (47/16 → 189/64) ⇝ 85/28 | note:84 gain:0.0439999999999999 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 39/14 ⇜ (189/64 → 95/32) ⇝ 85/28 | note:75 gain:0.029857864376269024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 39/14 ⇜ (189/64 → 95/32) ⇝ 85/28 | note:79 gain:0.029857864376269024 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 39/14 ⇜ (189/64 → 95/32) ⇝ 85/28 | note:80 gain:0.029857864376269024 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 39/14 ⇜ (189/64 → 95/32) ⇝ 85/28 | note:84 gain:0.029857864376269024 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 39/14 ⇜ (95/32 → 191/64) ⇝ 85/28 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 39/14 ⇜ (95/32 → 191/64) ⇝ 85/28 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 39/14 ⇜ (95/32 → 191/64) ⇝ 85/28 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 39/14 ⇜ (95/32 → 191/64) ⇝ 85/28 | note:84 gain:0.024 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 39/14 ⇜ (191/64 → 3/1) ⇝ 85/28 | note:75 gain:0.029857864376269 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 39/14 ⇜ (191/64 → 3/1) ⇝ 85/28 | note:79 gain:0.029857864376269 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 39/14 ⇜ (191/64 → 3/1) ⇝ 85/28 | note:80 gain:0.029857864376269 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 39/14 ⇜ (191/64 → 3/1) ⇝ 85/28 | note:84 gain:0.029857864376269 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 39/14 ⇜ (3/1 → 193/64) ⇝ 85/28 | note:75 gain:0.043999999999999886 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 39/14 ⇜ (3/1 → 193/64) ⇝ 85/28 | note:79 gain:0.043999999999999886 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 39/14 ⇜ (3/1 → 193/64) ⇝ 85/28 | note:80 gain:0.043999999999999886 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 39/14 ⇜ (3/1 → 193/64) ⇝ 85/28 | note:84 gain:0.043999999999999886 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ (3/1 → 193/64) ⇝ 13/4 | note:F2 gain:0.43999999999999884 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 39/14 ⇜ (193/64 → 97/32) ⇝ 85/28 | note:75 gain:0.05814213562373083 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 39/14 ⇜ (193/64 → 97/32) ⇝ 85/28 | note:79 gain:0.05814213562373083 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 39/14 ⇜ (193/64 → 97/32) ⇝ 85/28 | note:80 gain:0.05814213562373083 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 39/14 ⇜ (193/64 → 97/32) ⇝ 85/28 | note:84 gain:0.05814213562373083 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 3/1 ⇜ (193/64 → 97/32) ⇝ 13/4 | note:F2 gain:0.5814213562373083 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 39/14 ⇜ (97/32 → 85/28) | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 39/14 ⇜ (97/32 → 85/28) | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 39/14 ⇜ (97/32 → 85/28) | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 39/14 ⇜ (97/32 → 85/28) | note:84 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 3/1 ⇜ (97/32 → 195/64) ⇝ 13/4 | note:F2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 3/1 ⇜ (195/64 → 49/16) ⇝ 13/4 | note:F2 gain:0.5814213562373115 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 3/1 ⇜ (49/16 → 197/64) ⇝ 13/4 | note:F2 gain:0.44000000000000333 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 3/1 ⇜ (197/64 → 99/32) ⇝ 13/4 | note:F2 gain:0.2985786437626932 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 3/1 ⇜ (99/32 → 199/64) ⇝ 13/4 | note:F2 gain:0.24 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 3/1 ⇜ (199/64 → 25/8) ⇝ 13/4 | note:F2 gain:0.298578643762691 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 3/1 ⇜ (25/8 → 201/64) ⇝ 13/4 | note:F2 gain:0.4400000000000002 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ (25/8 → 201/64) ⇝ 13/4 | note:F4 gain:0.4400000000000002 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ (25/8 → 201/64) ⇝ 13/4 | note:Ab4 gain:0.4400000000000002 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 3/1 ⇜ (201/64 → 101/32) ⇝ 13/4 | note:F2 gain:0.5814213562373093 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 25/8 ⇜ (201/64 → 101/32) ⇝ 13/4 | note:F4 gain:0.5814213562373093 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 25/8 ⇜ (201/64 → 101/32) ⇝ 13/4 | note:Ab4 gain:0.5814213562373093 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 3/1 ⇜ (101/32 → 203/64) ⇝ 13/4 | note:F2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 25/8 ⇜ (101/32 → 203/64) ⇝ 13/4 | note:F4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 25/8 ⇜ (101/32 → 203/64) ⇝ 13/4 | note:Ab4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 3/1 ⇜ (203/64 → 51/16) ⇝ 13/4 | note:F2 gain:0.5814213562373105 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 25/8 ⇜ (203/64 → 51/16) ⇝ 13/4 | note:F4 gain:0.5814213562373105 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 25/8 ⇜ (203/64 → 51/16) ⇝ 13/4 | note:Ab4 gain:0.5814213562373105 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 3/1 ⇜ (51/16 → 205/64) ⇝ 13/4 | note:F2 gain:0.440000000000002 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 25/8 ⇜ (51/16 → 205/64) ⇝ 13/4 | note:F4 gain:0.440000000000002 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 25/8 ⇜ (51/16 → 205/64) ⇝ 13/4 | note:Ab4 gain:0.440000000000002 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 3/1 ⇜ (205/64 → 103/32) ⇝ 13/4 | note:F2 gain:0.2985786437626922 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 25/8 ⇜ (205/64 → 103/32) ⇝ 13/4 | note:F4 gain:0.2985786437626922 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 25/8 ⇜ (205/64 → 103/32) ⇝ 13/4 | note:Ab4 gain:0.2985786437626922 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 3/1 ⇜ (103/32 → 207/64) ⇝ 13/4 | note:F2 gain:0.24 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 25/8 ⇜ (103/32 → 207/64) ⇝ 13/4 | note:F4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 25/8 ⇜ (103/32 → 207/64) ⇝ 13/4 | note:Ab4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 3/1 ⇜ (207/64 → 13/4) | note:F2 gain:0.298578643762688 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 25/8 ⇜ (207/64 → 13/4) | note:F4 gain:0.298578643762688 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 25/8 ⇜ (207/64 → 13/4) | note:Ab4 gain:0.298578643762688 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ (13/4 → 209/64) ⇝ 7/2 | note:Eb4 gain:0.22000000000000078 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ (13/4 → 209/64) ⇝ 7/2 | note:G4 gain:0.22000000000000078 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (13/4 → 209/64) ⇝ 7/2 | note:Ab4 gain:0.22000000000000078 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ (13/4 → 209/64) ⇝ 7/2 | note:C5 gain:0.22000000000000078 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 13/4 ⇜ (209/64 → 105/32) ⇝ 7/2 | note:Eb4 gain:0.2907106781186551 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 13/4 ⇜ (209/64 → 105/32) ⇝ 7/2 | note:G4 gain:0.2907106781186551 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 13/4 ⇜ (209/64 → 105/32) ⇝ 7/2 | note:Ab4 gain:0.2907106781186551 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 13/4 ⇜ (209/64 → 105/32) ⇝ 7/2 | note:C5 gain:0.2907106781186551 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 13/4 ⇜ (105/32 → 211/64) ⇝ 7/2 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 13/4 ⇜ (105/32 → 211/64) ⇝ 7/2 | note:G4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 13/4 ⇜ (105/32 → 211/64) ⇝ 7/2 | note:Ab4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 13/4 ⇜ (105/32 → 211/64) ⇝ 7/2 | note:C5 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 13/4 ⇜ (211/64 → 53/16) ⇝ 7/2 | note:Eb4 gain:0.29071067811865475 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 13/4 ⇜ (211/64 → 53/16) ⇝ 7/2 | note:G4 gain:0.29071067811865475 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 13/4 ⇜ (211/64 → 53/16) ⇝ 7/2 | note:Ab4 gain:0.29071067811865475 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 13/4 ⇜ (211/64 → 53/16) ⇝ 7/2 | note:C5 gain:0.29071067811865475 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 13/4 ⇜ (53/16 → 213/64) ⇝ 7/2 | note:Eb4 gain:0.2200000000000003 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 13/4 ⇜ (53/16 → 213/64) ⇝ 7/2 | note:G4 gain:0.2200000000000003 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 13/4 ⇜ (53/16 → 213/64) ⇝ 7/2 | note:Ab4 gain:0.2200000000000003 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 13/4 ⇜ (53/16 → 213/64) ⇝ 7/2 | note:C5 gain:0.2200000000000003 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 13/4 ⇜ (213/64 → 107/32) ⇝ 7/2 | note:Eb4 gain:0.14928932188134564 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 13/4 ⇜ (213/64 → 107/32) ⇝ 7/2 | note:G4 gain:0.14928932188134564 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 13/4 ⇜ (213/64 → 107/32) ⇝ 7/2 | note:Ab4 gain:0.14928932188134564 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 13/4 ⇜ (213/64 → 107/32) ⇝ 7/2 | note:C5 gain:0.14928932188134564 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 13/4 ⇜ (107/32 → 215/64) ⇝ 7/2 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 13/4 ⇜ (107/32 → 215/64) ⇝ 7/2 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 13/4 ⇜ (107/32 → 215/64) ⇝ 7/2 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 13/4 ⇜ (107/32 → 215/64) ⇝ 7/2 | note:C5 gain:0.12 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 13/4 ⇜ (215/64 → 27/8) ⇝ 7/2 | note:Eb4 gain:0.14928932188134447 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 13/4 ⇜ (215/64 → 27/8) ⇝ 7/2 | note:G4 gain:0.14928932188134447 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 13/4 ⇜ (215/64 → 27/8) ⇝ 7/2 | note:Ab4 gain:0.14928932188134447 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 13/4 ⇜ (215/64 → 27/8) ⇝ 7/2 | note:C5 gain:0.14928932188134447 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 13/4 ⇜ (27/8 → 217/64) ⇝ 7/2 | note:Eb4 gain:0.2199999999999986 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 13/4 ⇜ (27/8 → 217/64) ⇝ 7/2 | note:G4 gain:0.2199999999999986 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 13/4 ⇜ (27/8 → 217/64) ⇝ 7/2 | note:Ab4 gain:0.2199999999999986 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 13/4 ⇜ (27/8 → 217/64) ⇝ 7/2 | note:C5 gain:0.2199999999999986 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 13/4 ⇜ (217/64 → 109/32) ⇝ 7/2 | note:Eb4 gain:0.2907106781186536 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 13/4 ⇜ (217/64 → 109/32) ⇝ 7/2 | note:G4 gain:0.2907106781186536 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 13/4 ⇜ (217/64 → 109/32) ⇝ 7/2 | note:Ab4 gain:0.2907106781186536 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 13/4 ⇜ (217/64 → 109/32) ⇝ 7/2 | note:C5 gain:0.2907106781186536 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 13/4 ⇜ (109/32 → 219/64) ⇝ 7/2 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 13/4 ⇜ (109/32 → 219/64) ⇝ 7/2 | note:G4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 13/4 ⇜ (109/32 → 219/64) ⇝ 7/2 | note:Ab4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 13/4 ⇜ (109/32 → 219/64) ⇝ 7/2 | note:C5 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 13/4 ⇜ (219/64 → 55/16) ⇝ 7/2 | note:Eb4 gain:0.2907106781186543 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 13/4 ⇜ (219/64 → 55/16) ⇝ 7/2 | note:G4 gain:0.2907106781186543 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 13/4 ⇜ (219/64 → 55/16) ⇝ 7/2 | note:Ab4 gain:0.2907106781186543 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 13/4 ⇜ (219/64 → 55/16) ⇝ 7/2 | note:C5 gain:0.2907106781186543 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 13/4 ⇜ (55/16 → 221/64) ⇝ 7/2 | note:Eb4 gain:0.21999999999999964 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 13/4 ⇜ (55/16 → 221/64) ⇝ 7/2 | note:G4 gain:0.21999999999999964 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 13/4 ⇜ (55/16 → 221/64) ⇝ 7/2 | note:Ab4 gain:0.21999999999999964 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 13/4 ⇜ (55/16 → 221/64) ⇝ 7/2 | note:C5 gain:0.21999999999999964 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 13/4 ⇜ (221/64 → 111/32) ⇝ 7/2 | note:Eb4 gain:0.14928932188134517 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 13/4 ⇜ (221/64 → 111/32) ⇝ 7/2 | note:G4 gain:0.14928932188134517 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 13/4 ⇜ (221/64 → 111/32) ⇝ 7/2 | note:Ab4 gain:0.14928932188134517 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 13/4 ⇜ (221/64 → 111/32) ⇝ 7/2 | note:C5 gain:0.14928932188134517 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 13/4 ⇜ (111/32 → 223/64) ⇝ 7/2 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 13/4 ⇜ (111/32 → 223/64) ⇝ 7/2 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 13/4 ⇜ (111/32 → 223/64) ⇝ 7/2 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 13/4 ⇜ (111/32 → 223/64) ⇝ 7/2 | note:C5 gain:0.12 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 13/4 ⇜ (223/64 → 7/2) | note:Eb4 gain:0.14928932188134497 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 13/4 ⇜ (223/64 → 7/2) | note:G4 gain:0.14928932188134497 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 13/4 ⇜ (223/64 → 7/2) | note:Ab4 gain:0.14928932188134497 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 13/4 ⇜ (223/64 → 7/2) | note:C5 gain:0.14928932188134497 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ (7/2 → 225/64) ⇝ 29/8 | note:C5 gain:0.4399999999999986 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ (7/2 → 225/64) ⇝ 29/8 | note:Eb5 gain:0.4399999999999986 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ (7/2 → 225/64) ⇝ 15/4 | note:F2 gain:0.4399999999999986 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 7/2 ⇜ (225/64 → 113/32) ⇝ 29/8 | note:C5 gain:0.5814213562373082 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 7/2 ⇜ (225/64 → 113/32) ⇝ 29/8 | note:Eb5 gain:0.5814213562373082 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 7/2 ⇜ (225/64 → 113/32) ⇝ 15/4 | note:F2 gain:0.5814213562373082 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 7/2 ⇜ (113/32 → 227/64) ⇝ 29/8 | note:C5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 7/2 ⇜ (113/32 → 227/64) ⇝ 29/8 | note:Eb5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 7/2 ⇜ (113/32 → 227/64) ⇝ 15/4 | note:F2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ (99/28 → 227/64) ⇝ 53/14 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ (99/28 → 227/64) ⇝ 53/14 | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ (99/28 → 227/64) ⇝ 53/14 | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ (99/28 → 227/64) ⇝ 53/14 | note:84 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 7/2 ⇜ (227/64 → 57/16) ⇝ 29/8 | note:C5 gain:0.5814213562373116 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 7/2 ⇜ (227/64 → 57/16) ⇝ 29/8 | note:Eb5 gain:0.5814213562373116 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 7/2 ⇜ (227/64 → 57/16) ⇝ 15/4 | note:F2 gain:0.5814213562373116 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 99/28 ⇜ (227/64 → 57/16) ⇝ 53/14 | note:75 gain:0.05814213562373116 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 99/28 ⇜ (227/64 → 57/16) ⇝ 53/14 | note:79 gain:0.05814213562373116 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 99/28 ⇜ (227/64 → 57/16) ⇝ 53/14 | note:80 gain:0.05814213562373116 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 99/28 ⇜ (227/64 → 57/16) ⇝ 53/14 | note:84 gain:0.05814213562373116 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 7/2 ⇜ (57/16 → 229/64) ⇝ 29/8 | note:C5 gain:0.4400000000000035 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 7/2 ⇜ (57/16 → 229/64) ⇝ 29/8 | note:Eb5 gain:0.4400000000000035 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 7/2 ⇜ (57/16 → 229/64) ⇝ 15/4 | note:F2 gain:0.4400000000000035 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 99/28 ⇜ (57/16 → 229/64) ⇝ 53/14 | note:75 gain:0.04400000000000035 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 99/28 ⇜ (57/16 → 229/64) ⇝ 53/14 | note:79 gain:0.04400000000000035 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 99/28 ⇜ (57/16 → 229/64) ⇝ 53/14 | note:80 gain:0.04400000000000035 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 99/28 ⇜ (57/16 → 229/64) ⇝ 53/14 | note:84 gain:0.04400000000000035 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 7/2 ⇜ (229/64 → 115/32) ⇝ 29/8 | note:C5 gain:0.2985786437626934 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 7/2 ⇜ (229/64 → 115/32) ⇝ 29/8 | note:Eb5 gain:0.2985786437626934 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 7/2 ⇜ (229/64 → 115/32) ⇝ 15/4 | note:F2 gain:0.2985786437626934 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 99/28 ⇜ (229/64 → 115/32) ⇝ 53/14 | note:75 gain:0.02985786437626934 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 99/28 ⇜ (229/64 → 115/32) ⇝ 53/14 | note:79 gain:0.02985786437626934 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 99/28 ⇜ (229/64 → 115/32) ⇝ 53/14 | note:80 gain:0.02985786437626934 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 99/28 ⇜ (229/64 → 115/32) ⇝ 53/14 | note:84 gain:0.02985786437626934 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 7/2 ⇜ (115/32 → 231/64) ⇝ 29/8 | note:C5 gain:0.24 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 7/2 ⇜ (115/32 → 231/64) ⇝ 29/8 | note:Eb5 gain:0.24 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 7/2 ⇜ (115/32 → 231/64) ⇝ 15/4 | note:F2 gain:0.24 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 99/28 ⇜ (115/32 → 231/64) ⇝ 53/14 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 99/28 ⇜ (115/32 → 231/64) ⇝ 53/14 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 99/28 ⇜ (115/32 → 231/64) ⇝ 53/14 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 99/28 ⇜ (115/32 → 231/64) ⇝ 53/14 | note:84 gain:0.024 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 7/2 ⇜ (231/64 → 29/8) | note:C5 gain:0.2985786437626909 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 7/2 ⇜ (231/64 → 29/8) | note:Eb5 gain:0.2985786437626909 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 7/2 ⇜ (231/64 → 29/8) ⇝ 15/4 | note:F2 gain:0.2985786437626909 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 99/28 ⇜ (231/64 → 29/8) ⇝ 53/14 | note:75 gain:0.02985786437626909 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 99/28 ⇜ (231/64 → 29/8) ⇝ 53/14 | note:79 gain:0.02985786437626909 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 99/28 ⇜ (231/64 → 29/8) ⇝ 53/14 | note:80 gain:0.02985786437626909 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 99/28 ⇜ (231/64 → 29/8) ⇝ 53/14 | note:84 gain:0.02985786437626909 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 7/2 ⇜ (29/8 → 233/64) ⇝ 15/4 | note:F2 gain:0.44000000000000006 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 99/28 ⇜ (29/8 → 233/64) ⇝ 53/14 | note:75 gain:0.04400000000000001 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 99/28 ⇜ (29/8 → 233/64) ⇝ 53/14 | note:79 gain:0.04400000000000001 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 99/28 ⇜ (29/8 → 233/64) ⇝ 53/14 | note:80 gain:0.04400000000000001 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 99/28 ⇜ (29/8 → 233/64) ⇝ 53/14 | note:84 gain:0.04400000000000001 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 7/2 ⇜ (233/64 → 117/32) ⇝ 15/4 | note:F2 gain:0.5814213562373091 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 99/28 ⇜ (233/64 → 117/32) ⇝ 53/14 | note:75 gain:0.05814213562373091 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 99/28 ⇜ (233/64 → 117/32) ⇝ 53/14 | note:79 gain:0.05814213562373091 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 99/28 ⇜ (233/64 → 117/32) ⇝ 53/14 | note:80 gain:0.05814213562373091 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 99/28 ⇜ (233/64 → 117/32) ⇝ 53/14 | note:84 gain:0.05814213562373091 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 7/2 ⇜ (117/32 → 235/64) ⇝ 15/4 | note:F2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 99/28 ⇜ (117/32 → 235/64) ⇝ 53/14 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 99/28 ⇜ (117/32 → 235/64) ⇝ 53/14 | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 99/28 ⇜ (117/32 → 235/64) ⇝ 53/14 | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 99/28 ⇜ (117/32 → 235/64) ⇝ 53/14 | note:84 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 7/2 ⇜ (235/64 → 59/16) ⇝ 15/4 | note:F2 gain:0.5814213562373107 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 99/28 ⇜ (235/64 → 59/16) ⇝ 53/14 | note:75 gain:0.05814213562373108 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 99/28 ⇜ (235/64 → 59/16) ⇝ 53/14 | note:79 gain:0.05814213562373108 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 99/28 ⇜ (235/64 → 59/16) ⇝ 53/14 | note:80 gain:0.05814213562373108 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 99/28 ⇜ (235/64 → 59/16) ⇝ 53/14 | note:84 gain:0.05814213562373108 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 7/2 ⇜ (59/16 → 237/64) ⇝ 15/4 | note:F2 gain:0.44000000000000217 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 99/28 ⇜ (59/16 → 237/64) ⇝ 53/14 | note:75 gain:0.04400000000000022 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 99/28 ⇜ (59/16 → 237/64) ⇝ 53/14 | note:79 gain:0.04400000000000022 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 99/28 ⇜ (59/16 → 237/64) ⇝ 53/14 | note:80 gain:0.04400000000000022 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 99/28 ⇜ (59/16 → 237/64) ⇝ 53/14 | note:84 gain:0.04400000000000022 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 7/2 ⇜ (237/64 → 119/32) ⇝ 15/4 | note:F2 gain:0.29857864376269244 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 99/28 ⇜ (237/64 → 119/32) ⇝ 53/14 | note:75 gain:0.029857864376269246 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 99/28 ⇜ (237/64 → 119/32) ⇝ 53/14 | note:79 gain:0.029857864376269246 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 99/28 ⇜ (237/64 → 119/32) ⇝ 53/14 | note:80 gain:0.029857864376269246 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 99/28 ⇜ (237/64 → 119/32) ⇝ 53/14 | note:84 gain:0.029857864376269246 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 7/2 ⇜ (119/32 → 239/64) ⇝ 15/4 | note:F2 gain:0.24 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 99/28 ⇜ (119/32 → 239/64) ⇝ 53/14 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 99/28 ⇜ (119/32 → 239/64) ⇝ 53/14 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 99/28 ⇜ (119/32 → 239/64) ⇝ 53/14 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 99/28 ⇜ (119/32 → 239/64) ⇝ 53/14 | note:84 gain:0.024 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 7/2 ⇜ (239/64 → 15/4) | note:F2 gain:0.2985786437626878 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 99/28 ⇜ (239/64 → 15/4) ⇝ 53/14 | note:75 gain:0.029857864376268778 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 99/28 ⇜ (239/64 → 15/4) ⇝ 53/14 | note:79 gain:0.029857864376268778 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 99/28 ⇜ (239/64 → 15/4) ⇝ 53/14 | note:80 gain:0.029857864376268778 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 99/28 ⇜ (239/64 → 15/4) ⇝ 53/14 | note:84 gain:0.029857864376268778 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 99/28 ⇜ (15/4 → 241/64) ⇝ 53/14 | note:75 gain:0.043999999999999574 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 99/28 ⇜ (15/4 → 241/64) ⇝ 53/14 | note:79 gain:0.043999999999999574 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 99/28 ⇜ (15/4 → 241/64) ⇝ 53/14 | note:80 gain:0.043999999999999574 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 99/28 ⇜ (15/4 → 241/64) ⇝ 53/14 | note:84 gain:0.043999999999999574 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ (15/4 → 241/64) ⇝ 31/8 | note:C5 gain:0.43999999999999573 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ (15/4 → 241/64) ⇝ 31/8 | note:Eb5 gain:0.43999999999999573 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ (15/4 → 241/64) ⇝ 4/1 | note:Eb4 gain:0.21999999999999786 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ (15/4 → 241/64) ⇝ 4/1 | note:G4 gain:0.21999999999999786 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (15/4 → 241/64) ⇝ 4/1 | note:Ab4 gain:0.21999999999999786 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ (15/4 → 241/64) ⇝ 4/1 | note:C5 gain:0.21999999999999786 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 99/28 ⇜ (241/64 → 121/32) ⇝ 53/14 | note:75 gain:0.05814213562373102 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 99/28 ⇜ (241/64 → 121/32) ⇝ 53/14 | note:79 gain:0.05814213562373102 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 99/28 ⇜ (241/64 → 121/32) ⇝ 53/14 | note:80 gain:0.05814213562373102 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 99/28 ⇜ (241/64 → 121/32) ⇝ 53/14 | note:84 gain:0.05814213562373102 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 15/4 ⇜ (241/64 → 121/32) ⇝ 31/8 | note:C5 gain:0.5814213562373102 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 15/4 ⇜ (241/64 → 121/32) ⇝ 31/8 | note:Eb5 gain:0.5814213562373102 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 15/4 ⇜ (241/64 → 121/32) ⇝ 4/1 | note:Eb4 gain:0.2907106781186551 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 15/4 ⇜ (241/64 → 121/32) ⇝ 4/1 | note:G4 gain:0.2907106781186551 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 15/4 ⇜ (241/64 → 121/32) ⇝ 4/1 | note:Ab4 gain:0.2907106781186551 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 15/4 ⇜ (241/64 → 121/32) ⇝ 4/1 | note:C5 gain:0.2907106781186551 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 99/28 ⇜ (121/32 → 53/14) | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 99/28 ⇜ (121/32 → 53/14) | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 99/28 ⇜ (121/32 → 53/14) | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 99/28 ⇜ (121/32 → 53/14) | note:84 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 15/4 ⇜ (121/32 → 243/64) ⇝ 31/8 | note:C5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 15/4 ⇜ (121/32 → 243/64) ⇝ 31/8 | note:Eb5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 15/4 ⇜ (121/32 → 243/64) ⇝ 4/1 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 15/4 ⇜ (121/32 → 243/64) ⇝ 4/1 | note:G4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 15/4 ⇜ (121/32 → 243/64) ⇝ 4/1 | note:Ab4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 15/4 ⇜ (121/32 → 243/64) ⇝ 4/1 | note:C5 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 15/4 ⇜ (243/64 → 61/16) ⇝ 31/8 | note:C5 gain:0.5814213562373096 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 15/4 ⇜ (243/64 → 61/16) ⇝ 31/8 | note:Eb5 gain:0.5814213562373096 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 15/4 ⇜ (243/64 → 61/16) ⇝ 4/1 | note:Eb4 gain:0.2907106781186548 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 15/4 ⇜ (243/64 → 61/16) ⇝ 4/1 | note:G4 gain:0.2907106781186548 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 15/4 ⇜ (243/64 → 61/16) ⇝ 4/1 | note:Ab4 gain:0.2907106781186548 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 15/4 ⇜ (243/64 → 61/16) ⇝ 4/1 | note:C5 gain:0.2907106781186548 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 15/4 ⇜ (61/16 → 245/64) ⇝ 31/8 | note:C5 gain:0.4400000000000008 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 15/4 ⇜ (61/16 → 245/64) ⇝ 31/8 | note:Eb5 gain:0.4400000000000008 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 15/4 ⇜ (61/16 → 245/64) ⇝ 4/1 | note:Eb4 gain:0.2200000000000004 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 15/4 ⇜ (61/16 → 245/64) ⇝ 4/1 | note:G4 gain:0.2200000000000004 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 15/4 ⇜ (61/16 → 245/64) ⇝ 4/1 | note:Ab4 gain:0.2200000000000004 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 15/4 ⇜ (61/16 → 245/64) ⇝ 4/1 | note:C5 gain:0.2200000000000004 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 15/4 ⇜ (245/64 → 123/32) ⇝ 31/8 | note:C5 gain:0.29857864376269144 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 15/4 ⇜ (245/64 → 123/32) ⇝ 31/8 | note:Eb5 gain:0.29857864376269144 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 15/4 ⇜ (245/64 → 123/32) ⇝ 4/1 | note:Eb4 gain:0.14928932188134572 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 15/4 ⇜ (245/64 → 123/32) ⇝ 4/1 | note:G4 gain:0.14928932188134572 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 15/4 ⇜ (245/64 → 123/32) ⇝ 4/1 | note:Ab4 gain:0.14928932188134572 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 15/4 ⇜ (245/64 → 123/32) ⇝ 4/1 | note:C5 gain:0.14928932188134572 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 15/4 ⇜ (123/32 → 247/64) ⇝ 31/8 | note:C5 gain:0.24 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 15/4 ⇜ (123/32 → 247/64) ⇝ 31/8 | note:Eb5 gain:0.24 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 15/4 ⇜ (123/32 → 247/64) ⇝ 4/1 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 15/4 ⇜ (123/32 → 247/64) ⇝ 4/1 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 15/4 ⇜ (123/32 → 247/64) ⇝ 4/1 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 15/4 ⇜ (123/32 → 247/64) ⇝ 4/1 | note:C5 gain:0.12 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 15/4 ⇜ (247/64 → 31/8) | note:C5 gain:0.2985786437626888 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 15/4 ⇜ (247/64 → 31/8) | note:Eb5 gain:0.2985786437626888 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 15/4 ⇜ (247/64 → 31/8) ⇝ 4/1 | note:Eb4 gain:0.1492893218813444 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 15/4 ⇜ (247/64 → 31/8) ⇝ 4/1 | note:G4 gain:0.1492893218813444 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 15/4 ⇜ (247/64 → 31/8) ⇝ 4/1 | note:Ab4 gain:0.1492893218813444 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 15/4 ⇜ (247/64 → 31/8) ⇝ 4/1 | note:C5 gain:0.1492893218813444 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 15/4 ⇜ (31/8 → 249/64) ⇝ 4/1 | note:Eb4 gain:0.21999999999999853 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 15/4 ⇜ (31/8 → 249/64) ⇝ 4/1 | note:G4 gain:0.21999999999999853 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 15/4 ⇜ (31/8 → 249/64) ⇝ 4/1 | note:Ab4 gain:0.21999999999999853 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 15/4 ⇜ (31/8 → 249/64) ⇝ 4/1 | note:C5 gain:0.21999999999999853 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 15/4 ⇜ (249/64 → 125/32) ⇝ 4/1 | note:Eb4 gain:0.29071067811865353 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 15/4 ⇜ (249/64 → 125/32) ⇝ 4/1 | note:G4 gain:0.29071067811865353 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 15/4 ⇜ (249/64 → 125/32) ⇝ 4/1 | note:Ab4 gain:0.29071067811865353 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 15/4 ⇜ (249/64 → 125/32) ⇝ 4/1 | note:C5 gain:0.29071067811865353 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 15/4 ⇜ (125/32 → 251/64) ⇝ 4/1 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 15/4 ⇜ (125/32 → 251/64) ⇝ 4/1 | note:G4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 15/4 ⇜ (125/32 → 251/64) ⇝ 4/1 | note:Ab4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 15/4 ⇜ (125/32 → 251/64) ⇝ 4/1 | note:C5 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 15/4 ⇜ (251/64 → 63/16) ⇝ 4/1 | note:Eb4 gain:0.29071067811865436 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 15/4 ⇜ (251/64 → 63/16) ⇝ 4/1 | note:G4 gain:0.29071067811865436 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 15/4 ⇜ (251/64 → 63/16) ⇝ 4/1 | note:Ab4 gain:0.29071067811865436 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 15/4 ⇜ (251/64 → 63/16) ⇝ 4/1 | note:C5 gain:0.29071067811865436 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 15/4 ⇜ (63/16 → 253/64) ⇝ 4/1 | note:Eb4 gain:0.21999999999999972 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 15/4 ⇜ (63/16 → 253/64) ⇝ 4/1 | note:G4 gain:0.21999999999999972 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 15/4 ⇜ (63/16 → 253/64) ⇝ 4/1 | note:Ab4 gain:0.21999999999999972 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 15/4 ⇜ (63/16 → 253/64) ⇝ 4/1 | note:C5 gain:0.21999999999999972 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 15/4 ⇜ (253/64 → 127/32) ⇝ 4/1 | note:Eb4 gain:0.14928932188134522 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 15/4 ⇜ (253/64 → 127/32) ⇝ 4/1 | note:G4 gain:0.14928932188134522 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 15/4 ⇜ (253/64 → 127/32) ⇝ 4/1 | note:Ab4 gain:0.14928932188134522 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 15/4 ⇜ (253/64 → 127/32) ⇝ 4/1 | note:C5 gain:0.14928932188134522 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 15/4 ⇜ (127/32 → 255/64) ⇝ 4/1 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 15/4 ⇜ (127/32 → 255/64) ⇝ 4/1 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 15/4 ⇜ (127/32 → 255/64) ⇝ 4/1 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 15/4 ⇜ (127/32 → 255/64) ⇝ 4/1 | note:C5 gain:0.12 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 15/4 ⇜ (255/64 → 4/1) | note:Eb4 gain:0.1492893218813449 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 15/4 ⇜ (255/64 → 4/1) | note:G4 gain:0.1492893218813449 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 15/4 ⇜ (255/64 → 4/1) | note:Ab4 gain:0.1492893218813449 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 15/4 ⇜ (255/64 → 4/1) | note:C5 gain:0.1492893218813449 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ (4/1 → 257/64) ⇝ 17/4 | note:G2 gain:0.43999999999999845 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 4/1 ⇜ (257/64 → 129/32) ⇝ 17/4 | note:G2 gain:0.5814213562373081 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 4/1 ⇜ (129/32 → 259/64) ⇝ 17/4 | note:G2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ (113/28 → 259/64) ⇝ 30/7 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ (113/28 → 259/64) ⇝ 30/7 | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ (113/28 → 259/64) ⇝ 30/7 | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ (113/28 → 259/64) ⇝ 30/7 | note:84 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 4/1 ⇜ (259/64 → 65/16) ⇝ 17/4 | note:G2 gain:0.5814213562373117 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 113/28 ⇜ (259/64 → 65/16) ⇝ 30/7 | note:75 gain:0.058142135623731175 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 113/28 ⇜ (259/64 → 65/16) ⇝ 30/7 | note:79 gain:0.058142135623731175 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 113/28 ⇜ (259/64 → 65/16) ⇝ 30/7 | note:80 gain:0.058142135623731175 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 113/28 ⇜ (259/64 → 65/16) ⇝ 30/7 | note:84 gain:0.058142135623731175 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 4/1 ⇜ (65/16 → 261/64) ⇝ 17/4 | note:G2 gain:0.4400000000000038 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 113/28 ⇜ (65/16 → 261/64) ⇝ 30/7 | note:75 gain:0.04400000000000038 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 113/28 ⇜ (65/16 → 261/64) ⇝ 30/7 | note:79 gain:0.04400000000000038 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 113/28 ⇜ (65/16 → 261/64) ⇝ 30/7 | note:80 gain:0.04400000000000038 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 113/28 ⇜ (65/16 → 261/64) ⇝ 30/7 | note:84 gain:0.04400000000000038 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 4/1 ⇜ (261/64 → 131/32) ⇝ 17/4 | note:G2 gain:0.2985786437626935 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 113/28 ⇜ (261/64 → 131/32) ⇝ 30/7 | note:75 gain:0.02985786437626935 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 113/28 ⇜ (261/64 → 131/32) ⇝ 30/7 | note:79 gain:0.02985786437626935 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 113/28 ⇜ (261/64 → 131/32) ⇝ 30/7 | note:80 gain:0.02985786437626935 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 113/28 ⇜ (261/64 → 131/32) ⇝ 30/7 | note:84 gain:0.02985786437626935 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 4/1 ⇜ (131/32 → 263/64) ⇝ 17/4 | note:G2 gain:0.24 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 113/28 ⇜ (131/32 → 263/64) ⇝ 30/7 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 113/28 ⇜ (131/32 → 263/64) ⇝ 30/7 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 113/28 ⇜ (131/32 → 263/64) ⇝ 30/7 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 113/28 ⇜ (131/32 → 263/64) ⇝ 30/7 | note:84 gain:0.024 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 4/1 ⇜ (263/64 → 33/8) ⇝ 17/4 | note:G2 gain:0.2985786437626907 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 113/28 ⇜ (263/64 → 33/8) ⇝ 30/7 | note:75 gain:0.029857864376269073 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 113/28 ⇜ (263/64 → 33/8) ⇝ 30/7 | note:79 gain:0.029857864376269073 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 113/28 ⇜ (263/64 → 33/8) ⇝ 30/7 | note:80 gain:0.029857864376269073 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 113/28 ⇜ (263/64 → 33/8) ⇝ 30/7 | note:84 gain:0.029857864376269073 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 4/1 ⇜ (33/8 → 265/64) ⇝ 17/4 | note:G2 gain:0.4399999999999998 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 113/28 ⇜ (33/8 → 265/64) ⇝ 30/7 | note:75 gain:0.043999999999999984 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 113/28 ⇜ (33/8 → 265/64) ⇝ 30/7 | note:79 gain:0.043999999999999984 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 113/28 ⇜ (33/8 → 265/64) ⇝ 30/7 | note:80 gain:0.043999999999999984 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 113/28 ⇜ (33/8 → 265/64) ⇝ 30/7 | note:84 gain:0.043999999999999984 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ (33/8 → 265/64) ⇝ 17/4 | note:G4 gain:0.4399999999999998 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (33/8 → 265/64) ⇝ 17/4 | note:Bb4 gain:0.4399999999999998 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 4/1 ⇜ (265/64 → 133/32) ⇝ 17/4 | note:G2 gain:0.581421356237309 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 113/28 ⇜ (265/64 → 133/32) ⇝ 30/7 | note:75 gain:0.0581421356237309 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 113/28 ⇜ (265/64 → 133/32) ⇝ 30/7 | note:79 gain:0.0581421356237309 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 113/28 ⇜ (265/64 → 133/32) ⇝ 30/7 | note:80 gain:0.0581421356237309 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 113/28 ⇜ (265/64 → 133/32) ⇝ 30/7 | note:84 gain:0.0581421356237309 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 33/8 ⇜ (265/64 → 133/32) ⇝ 17/4 | note:G4 gain:0.581421356237309 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 33/8 ⇜ (265/64 → 133/32) ⇝ 17/4 | note:Bb4 gain:0.581421356237309 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 4/1 ⇜ (133/32 → 267/64) ⇝ 17/4 | note:G2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 113/28 ⇜ (133/32 → 267/64) ⇝ 30/7 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 113/28 ⇜ (133/32 → 267/64) ⇝ 30/7 | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 113/28 ⇜ (133/32 → 267/64) ⇝ 30/7 | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 113/28 ⇜ (133/32 → 267/64) ⇝ 30/7 | note:84 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 33/8 ⇜ (133/32 → 267/64) ⇝ 17/4 | note:G4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 33/8 ⇜ (133/32 → 267/64) ⇝ 17/4 | note:Bb4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 4/1 ⇜ (267/64 → 67/16) ⇝ 17/4 | note:G2 gain:0.5814213562373108 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 113/28 ⇜ (267/64 → 67/16) ⇝ 30/7 | note:75 gain:0.058142135623731085 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 113/28 ⇜ (267/64 → 67/16) ⇝ 30/7 | note:79 gain:0.058142135623731085 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 113/28 ⇜ (267/64 → 67/16) ⇝ 30/7 | note:80 gain:0.058142135623731085 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 113/28 ⇜ (267/64 → 67/16) ⇝ 30/7 | note:84 gain:0.058142135623731085 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 33/8 ⇜ (267/64 → 67/16) ⇝ 17/4 | note:G4 gain:0.5814213562373108 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 33/8 ⇜ (267/64 → 67/16) ⇝ 17/4 | note:Bb4 gain:0.5814213562373108 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 4/1 ⇜ (67/16 → 269/64) ⇝ 17/4 | note:G2 gain:0.4400000000000024 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 113/28 ⇜ (67/16 → 269/64) ⇝ 30/7 | note:75 gain:0.04400000000000024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 113/28 ⇜ (67/16 → 269/64) ⇝ 30/7 | note:79 gain:0.04400000000000024 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 113/28 ⇜ (67/16 → 269/64) ⇝ 30/7 | note:80 gain:0.04400000000000024 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 113/28 ⇜ (67/16 → 269/64) ⇝ 30/7 | note:84 gain:0.04400000000000024 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 33/8 ⇜ (67/16 → 269/64) ⇝ 17/4 | note:G4 gain:0.4400000000000024 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 33/8 ⇜ (67/16 → 269/64) ⇝ 17/4 | note:Bb4 gain:0.4400000000000024 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 4/1 ⇜ (269/64 → 135/32) ⇝ 17/4 | note:G2 gain:0.2985786437626925 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 113/28 ⇜ (269/64 → 135/32) ⇝ 30/7 | note:75 gain:0.02985786437626925 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 113/28 ⇜ (269/64 → 135/32) ⇝ 30/7 | note:79 gain:0.02985786437626925 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 113/28 ⇜ (269/64 → 135/32) ⇝ 30/7 | note:80 gain:0.02985786437626925 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 113/28 ⇜ (269/64 → 135/32) ⇝ 30/7 | note:84 gain:0.02985786437626925 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 33/8 ⇜ (269/64 → 135/32) ⇝ 17/4 | note:G4 gain:0.2985786437626925 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 33/8 ⇜ (269/64 → 135/32) ⇝ 17/4 | note:Bb4 gain:0.2985786437626925 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 4/1 ⇜ (135/32 → 271/64) ⇝ 17/4 | note:G2 gain:0.24 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 113/28 ⇜ (135/32 → 271/64) ⇝ 30/7 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 113/28 ⇜ (135/32 → 271/64) ⇝ 30/7 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 113/28 ⇜ (135/32 → 271/64) ⇝ 30/7 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 113/28 ⇜ (135/32 → 271/64) ⇝ 30/7 | note:84 gain:0.024 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 33/8 ⇜ (135/32 → 271/64) ⇝ 17/4 | note:G4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 33/8 ⇜ (135/32 → 271/64) ⇝ 17/4 | note:Bb4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 4/1 ⇜ (271/64 → 17/4) | note:G2 gain:0.2985786437626877 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 113/28 ⇜ (271/64 → 17/4) ⇝ 30/7 | note:75 gain:0.029857864376268774 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 113/28 ⇜ (271/64 → 17/4) ⇝ 30/7 | note:79 gain:0.029857864376268774 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 113/28 ⇜ (271/64 → 17/4) ⇝ 30/7 | note:80 gain:0.029857864376268774 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 113/28 ⇜ (271/64 → 17/4) ⇝ 30/7 | note:84 gain:0.029857864376268774 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 33/8 ⇜ (271/64 → 17/4) | note:G4 gain:0.2985786437626877 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 33/8 ⇜ (271/64 → 17/4) | note:Bb4 gain:0.2985786437626877 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 113/28 ⇜ (17/4 → 273/64) ⇝ 30/7 | note:75 gain:0.044000000000000115 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 113/28 ⇜ (17/4 → 273/64) ⇝ 30/7 | note:79 gain:0.044000000000000115 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 113/28 ⇜ (17/4 → 273/64) ⇝ 30/7 | note:80 gain:0.044000000000000115 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 113/28 ⇜ (17/4 → 273/64) ⇝ 30/7 | note:84 gain:0.044000000000000115 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 113/28 ⇜ (273/64 → 137/32) ⇝ 30/7 | note:75 gain:0.058142135623730995 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 113/28 ⇜ (273/64 → 137/32) ⇝ 30/7 | note:79 gain:0.058142135623730995 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 113/28 ⇜ (273/64 → 137/32) ⇝ 30/7 | note:80 gain:0.058142135623730995 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 113/28 ⇜ (273/64 → 137/32) ⇝ 30/7 | note:84 gain:0.058142135623730995 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 113/28 ⇜ (137/32 → 30/7) | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 113/28 ⇜ (137/32 → 30/7) | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 113/28 ⇜ (137/32 → 30/7) | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 113/28 ⇜ (137/32 → 30/7) | note:84 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ (9/2 → 289/64) ⇝ 37/8 | note:D5 gain:0.4399999999999983 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ (9/2 → 289/64) ⇝ 37/8 | note:F5 gain:0.4399999999999983 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ (9/2 → 289/64) ⇝ 19/4 | note:B3 gain:0.21999999999999914 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ (9/2 → 289/64) ⇝ 19/4 | note:E4 gain:0.21999999999999914 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (9/2 → 289/64) ⇝ 19/4 | note:F4 gain:0.21999999999999914 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ (9/2 → 289/64) ⇝ 19/4 | note:A4 gain:0.21999999999999914 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ (9/2 → 289/64) ⇝ 19/4 | note:G2 gain:0.4399999999999983 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 9/2 ⇜ (289/64 → 145/32) ⇝ 37/8 | note:D5 gain:0.5814213562373078 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 9/2 ⇜ (289/64 → 145/32) ⇝ 37/8 | note:F5 gain:0.5814213562373078 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 9/2 ⇜ (289/64 → 145/32) ⇝ 19/4 | note:B3 gain:0.2907106781186539 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 9/2 ⇜ (289/64 → 145/32) ⇝ 19/4 | note:E4 gain:0.2907106781186539 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 9/2 ⇜ (289/64 → 145/32) ⇝ 19/4 | note:F4 gain:0.2907106781186539 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 9/2 ⇜ (289/64 → 145/32) ⇝ 19/4 | note:A4 gain:0.2907106781186539 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 9/2 ⇜ (289/64 → 145/32) ⇝ 19/4 | note:G2 gain:0.5814213562373078 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 9/2 ⇜ (145/32 → 291/64) ⇝ 37/8 | note:D5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 9/2 ⇜ (145/32 → 291/64) ⇝ 37/8 | note:F5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 9/2 ⇜ (145/32 → 291/64) ⇝ 19/4 | note:B3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 9/2 ⇜ (145/32 → 291/64) ⇝ 19/4 | note:E4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 9/2 ⇜ (145/32 → 291/64) ⇝ 19/4 | note:F4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 9/2 ⇜ (145/32 → 291/64) ⇝ 19/4 | note:A4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 9/2 ⇜ (145/32 → 291/64) ⇝ 19/4 | note:G2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 9/2 ⇜ (291/64 → 73/16) ⇝ 37/8 | note:D5 gain:0.581421356237312 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 9/2 ⇜ (291/64 → 73/16) ⇝ 37/8 | note:F5 gain:0.581421356237312 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 9/2 ⇜ (291/64 → 73/16) ⇝ 19/4 | note:B3 gain:0.290710678118656 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 9/2 ⇜ (291/64 → 73/16) ⇝ 19/4 | note:E4 gain:0.290710678118656 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 9/2 ⇜ (291/64 → 73/16) ⇝ 19/4 | note:F4 gain:0.290710678118656 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 9/2 ⇜ (291/64 → 73/16) ⇝ 19/4 | note:A4 gain:0.290710678118656 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 9/2 ⇜ (291/64 → 73/16) ⇝ 19/4 | note:G2 gain:0.581421356237312 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 9/2 ⇜ (73/16 → 293/64) ⇝ 37/8 | note:D5 gain:0.44000000000000394 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 9/2 ⇜ (73/16 → 293/64) ⇝ 37/8 | note:F5 gain:0.44000000000000394 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 9/2 ⇜ (73/16 → 293/64) ⇝ 19/4 | note:B3 gain:0.22000000000000197 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 9/2 ⇜ (73/16 → 293/64) ⇝ 19/4 | note:E4 gain:0.22000000000000197 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 9/2 ⇜ (73/16 → 293/64) ⇝ 19/4 | note:F4 gain:0.22000000000000197 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 9/2 ⇜ (73/16 → 293/64) ⇝ 19/4 | note:A4 gain:0.22000000000000197 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 9/2 ⇜ (73/16 → 293/64) ⇝ 19/4 | note:G2 gain:0.44000000000000394 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 9/2 ⇜ (293/64 → 147/32) ⇝ 37/8 | note:D5 gain:0.29857864376269366 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 9/2 ⇜ (293/64 → 147/32) ⇝ 37/8 | note:F5 gain:0.29857864376269366 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 9/2 ⇜ (293/64 → 147/32) ⇝ 19/4 | note:B3 gain:0.14928932188134683 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 9/2 ⇜ (293/64 → 147/32) ⇝ 19/4 | note:E4 gain:0.14928932188134683 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 9/2 ⇜ (293/64 → 147/32) ⇝ 19/4 | note:F4 gain:0.14928932188134683 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 9/2 ⇜ (293/64 → 147/32) ⇝ 19/4 | note:A4 gain:0.14928932188134683 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 9/2 ⇜ (293/64 → 147/32) ⇝ 19/4 | note:G2 gain:0.29857864376269366 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 9/2 ⇜ (147/32 → 295/64) ⇝ 37/8 | note:D5 gain:0.24 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 9/2 ⇜ (147/32 → 295/64) ⇝ 37/8 | note:F5 gain:0.24 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 9/2 ⇜ (147/32 → 295/64) ⇝ 19/4 | note:B3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 9/2 ⇜ (147/32 → 295/64) ⇝ 19/4 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 9/2 ⇜ (147/32 → 295/64) ⇝ 19/4 | note:F4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 9/2 ⇜ (147/32 → 295/64) ⇝ 19/4 | note:A4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 9/2 ⇜ (147/32 → 295/64) ⇝ 19/4 | note:G2 gain:0.24 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 9/2 ⇜ (295/64 → 37/8) | note:D5 gain:0.2985786437626906 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 9/2 ⇜ (295/64 → 37/8) | note:F5 gain:0.2985786437626906 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 9/2 ⇜ (295/64 → 37/8) ⇝ 19/4 | note:B3 gain:0.1492893218813453 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 9/2 ⇜ (295/64 → 37/8) ⇝ 19/4 | note:E4 gain:0.1492893218813453 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 9/2 ⇜ (295/64 → 37/8) ⇝ 19/4 | note:F4 gain:0.1492893218813453 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 9/2 ⇜ (295/64 → 37/8) ⇝ 19/4 | note:A4 gain:0.1492893218813453 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 9/2 ⇜ (295/64 → 37/8) ⇝ 19/4 | note:G2 gain:0.2985786437626906 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 9/2 ⇜ (37/8 → 297/64) ⇝ 19/4 | note:B3 gain:0.2199999999999998 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 9/2 ⇜ (37/8 → 297/64) ⇝ 19/4 | note:E4 gain:0.2199999999999998 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 9/2 ⇜ (37/8 → 297/64) ⇝ 19/4 | note:F4 gain:0.2199999999999998 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 9/2 ⇜ (37/8 → 297/64) ⇝ 19/4 | note:A4 gain:0.2199999999999998 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 9/2 ⇜ (37/8 → 297/64) ⇝ 19/4 | note:G2 gain:0.4399999999999996 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 9/2 ⇜ (297/64 → 149/32) ⇝ 19/4 | note:B3 gain:0.2907106781186545 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 9/2 ⇜ (297/64 → 149/32) ⇝ 19/4 | note:E4 gain:0.2907106781186545 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 9/2 ⇜ (297/64 → 149/32) ⇝ 19/4 | note:F4 gain:0.2907106781186545 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 9/2 ⇜ (297/64 → 149/32) ⇝ 19/4 | note:A4 gain:0.2907106781186545 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 9/2 ⇜ (297/64 → 149/32) ⇝ 19/4 | note:G2 gain:0.581421356237309 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 9/2 ⇜ (149/32 → 299/64) ⇝ 19/4 | note:B3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 9/2 ⇜ (149/32 → 299/64) ⇝ 19/4 | note:E4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 9/2 ⇜ (149/32 → 299/64) ⇝ 19/4 | note:F4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 9/2 ⇜ (149/32 → 299/64) ⇝ 19/4 | note:A4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 9/2 ⇜ (149/32 → 299/64) ⇝ 19/4 | note:G2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 9/2 ⇜ (299/64 → 75/16) ⇝ 19/4 | note:B3 gain:0.2907106781186554 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 9/2 ⇜ (299/64 → 75/16) ⇝ 19/4 | note:E4 gain:0.2907106781186554 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 9/2 ⇜ (299/64 → 75/16) ⇝ 19/4 | note:F4 gain:0.2907106781186554 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 9/2 ⇜ (299/64 → 75/16) ⇝ 19/4 | note:A4 gain:0.2907106781186554 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 9/2 ⇜ (299/64 → 75/16) ⇝ 19/4 | note:G2 gain:0.5814213562373108 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 9/2 ⇜ (75/16 → 301/64) ⇝ 19/4 | note:B3 gain:0.22000000000000128 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 9/2 ⇜ (75/16 → 301/64) ⇝ 19/4 | note:E4 gain:0.22000000000000128 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 9/2 ⇜ (75/16 → 301/64) ⇝ 19/4 | note:F4 gain:0.22000000000000128 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 9/2 ⇜ (75/16 → 301/64) ⇝ 19/4 | note:A4 gain:0.22000000000000128 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 9/2 ⇜ (75/16 → 301/64) ⇝ 19/4 | note:G2 gain:0.44000000000000256 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 9/2 ⇜ (301/64 → 151/32) ⇝ 19/4 | note:B3 gain:0.14928932188134633 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 9/2 ⇜ (301/64 → 151/32) ⇝ 19/4 | note:E4 gain:0.14928932188134633 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 9/2 ⇜ (301/64 → 151/32) ⇝ 19/4 | note:F4 gain:0.14928932188134633 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 9/2 ⇜ (301/64 → 151/32) ⇝ 19/4 | note:A4 gain:0.14928932188134633 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 9/2 ⇜ (301/64 → 151/32) ⇝ 19/4 | note:G2 gain:0.29857864376269266 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 9/2 ⇜ (151/32 → 303/64) ⇝ 19/4 | note:B3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 9/2 ⇜ (151/32 → 303/64) ⇝ 19/4 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 9/2 ⇜ (151/32 → 303/64) ⇝ 19/4 | note:F4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 9/2 ⇜ (151/32 → 303/64) ⇝ 19/4 | note:A4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 9/2 ⇜ (151/32 → 303/64) ⇝ 19/4 | note:G2 gain:0.24 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 9/2 ⇜ (303/64 → 19/4) | note:B3 gain:0.14928932188134378 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 9/2 ⇜ (303/64 → 19/4) | note:E4 gain:0.14928932188134378 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 9/2 ⇜ (303/64 → 19/4) | note:F4 gain:0.14928932188134378 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 9/2 ⇜ (303/64 → 19/4) | note:A4 gain:0.14928932188134378 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 9/2 ⇜ (303/64 → 19/4) | note:G2 gain:0.29857864376268756 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ (19/4 → 305/64) ⇝ 39/8 | note:G4 gain:0.4399999999999953 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (19/4 → 305/64) ⇝ 39/8 | note:Bb4 gain:0.4399999999999953 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 19/4 ⇜ (305/64 → 153/32) ⇝ 39/8 | note:G4 gain:0.5814213562373098 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 19/4 ⇜ (305/64 → 153/32) ⇝ 39/8 | note:Bb4 gain:0.5814213562373098 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 19/4 ⇜ (153/32 → 307/64) ⇝ 39/8 | note:G4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 19/4 ⇜ (153/32 → 307/64) ⇝ 39/8 | note:Bb4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ (67/14 → 307/64) ⇝ 141/28 | note:71 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ (67/14 → 307/64) ⇝ 141/28 | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ (67/14 → 307/64) ⇝ 141/28 | note:77 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ (67/14 → 307/64) ⇝ 141/28 | note:81 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 19/4 ⇜ (307/64 → 77/16) ⇝ 39/8 | note:G4 gain:0.58142135623731 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 19/4 ⇜ (307/64 → 77/16) ⇝ 39/8 | note:Bb4 gain:0.58142135623731 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 67/14 ⇜ (307/64 → 77/16) ⇝ 141/28 | note:71 gain:0.058142135623730995 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 67/14 ⇜ (307/64 → 77/16) ⇝ 141/28 | note:76 gain:0.058142135623730995 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 67/14 ⇜ (307/64 → 77/16) ⇝ 141/28 | note:77 gain:0.058142135623730995 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 67/14 ⇜ (307/64 → 77/16) ⇝ 141/28 | note:81 gain:0.058142135623730995 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 19/4 ⇜ (77/16 → 309/64) ⇝ 39/8 | note:G4 gain:0.4400000000000011 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 19/4 ⇜ (77/16 → 309/64) ⇝ 39/8 | note:Bb4 gain:0.4400000000000011 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 67/14 ⇜ (77/16 → 309/64) ⇝ 141/28 | note:71 gain:0.044000000000000115 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 67/14 ⇜ (77/16 → 309/64) ⇝ 141/28 | note:76 gain:0.044000000000000115 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 67/14 ⇜ (77/16 → 309/64) ⇝ 141/28 | note:77 gain:0.044000000000000115 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 67/14 ⇜ (77/16 → 309/64) ⇝ 141/28 | note:81 gain:0.044000000000000115 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 19/4 ⇜ (309/64 → 155/32) ⇝ 39/8 | note:G4 gain:0.2985786437626917 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 19/4 ⇜ (309/64 → 155/32) ⇝ 39/8 | note:Bb4 gain:0.2985786437626917 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 67/14 ⇜ (309/64 → 155/32) ⇝ 141/28 | note:71 gain:0.029857864376269173 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 67/14 ⇜ (309/64 → 155/32) ⇝ 141/28 | note:76 gain:0.029857864376269173 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 67/14 ⇜ (309/64 → 155/32) ⇝ 141/28 | note:77 gain:0.029857864376269173 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 67/14 ⇜ (309/64 → 155/32) ⇝ 141/28 | note:81 gain:0.029857864376269173 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 19/4 ⇜ (155/32 → 311/64) ⇝ 39/8 | note:G4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 19/4 ⇜ (155/32 → 311/64) ⇝ 39/8 | note:Bb4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 67/14 ⇜ (155/32 → 311/64) ⇝ 141/28 | note:71 gain:0.024 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 67/14 ⇜ (155/32 → 311/64) ⇝ 141/28 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 67/14 ⇜ (155/32 → 311/64) ⇝ 141/28 | note:77 gain:0.024 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", + "[ (0/1 → 1/64) ⇝ 1/4 | note:C2 gain:0.44 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 0/1 ⇜ (1/64 → 1/32) ⇝ 1/4 | note:C2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 0/1 ⇜ (1/32 → 3/64) ⇝ 1/4 | note:C2 gain:0.64 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ (1/28 → 3/64) ⇝ 2/7 | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ (1/28 → 3/64) ⇝ 2/7 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ (1/28 → 3/64) ⇝ 2/7 | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ (1/28 → 3/64) ⇝ 2/7 | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 0/1 ⇜ (3/64 → 1/16) ⇝ 1/4 | note:C2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 1/28 ⇜ (3/64 → 1/16) ⇝ 2/7 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 1/28 ⇜ (3/64 → 1/16) ⇝ 2/7 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 1/28 ⇜ (3/64 → 1/16) ⇝ 2/7 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 1/28 ⇜ (3/64 → 1/16) ⇝ 2/7 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 0/1 ⇜ (1/16 → 5/64) ⇝ 1/4 | note:C2 gain:0.44 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 1/28 ⇜ (1/16 → 5/64) ⇝ 2/7 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 1/28 ⇜ (1/16 → 5/64) ⇝ 2/7 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 1/28 ⇜ (1/16 → 5/64) ⇝ 2/7 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 1/28 ⇜ (1/16 → 5/64) ⇝ 2/7 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 0/1 ⇜ (5/64 → 3/32) ⇝ 1/4 | note:C2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 1/28 ⇜ (5/64 → 3/32) ⇝ 2/7 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 1/28 ⇜ (5/64 → 3/32) ⇝ 2/7 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 1/28 ⇜ (5/64 → 3/32) ⇝ 2/7 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 1/28 ⇜ (5/64 → 3/32) ⇝ 2/7 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 0/1 ⇜ (3/32 → 7/64) ⇝ 1/4 | note:C2 gain:0.24 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 1/28 ⇜ (3/32 → 7/64) ⇝ 2/7 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 1/28 ⇜ (3/32 → 7/64) ⇝ 2/7 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 1/28 ⇜ (3/32 → 7/64) ⇝ 2/7 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 1/28 ⇜ (3/32 → 7/64) ⇝ 2/7 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 0/1 ⇜ (7/64 → 1/8) ⇝ 1/4 | note:C2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 1/28 ⇜ (7/64 → 1/8) ⇝ 2/7 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 1/28 ⇜ (7/64 → 1/8) ⇝ 2/7 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 1/28 ⇜ (7/64 → 1/8) ⇝ 2/7 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 1/28 ⇜ (7/64 → 1/8) ⇝ 2/7 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 0/1 ⇜ (1/8 → 9/64) ⇝ 1/4 | note:C2 gain:0.44 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 1/28 ⇜ (1/8 → 9/64) ⇝ 2/7 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 1/28 ⇜ (1/8 → 9/64) ⇝ 2/7 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 1/28 ⇜ (1/8 → 9/64) ⇝ 2/7 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 1/28 ⇜ (1/8 → 9/64) ⇝ 2/7 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ (1/8 → 9/64) ⇝ 1/4 | note:C4 gain:0.44 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ (1/8 → 9/64) ⇝ 1/4 | note:Eb4 gain:0.44 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 0/1 ⇜ (9/64 → 5/32) ⇝ 1/4 | note:C2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 1/28 ⇜ (9/64 → 5/32) ⇝ 2/7 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 1/28 ⇜ (9/64 → 5/32) ⇝ 2/7 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 1/28 ⇜ (9/64 → 5/32) ⇝ 2/7 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 1/28 ⇜ (9/64 → 5/32) ⇝ 2/7 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 1/8 ⇜ (9/64 → 5/32) ⇝ 1/4 | note:C4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 1/8 ⇜ (9/64 → 5/32) ⇝ 1/4 | note:Eb4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 0/1 ⇜ (5/32 → 11/64) ⇝ 1/4 | note:C2 gain:0.64 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 1/28 ⇜ (5/32 → 11/64) ⇝ 2/7 | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 1/28 ⇜ (5/32 → 11/64) ⇝ 2/7 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 1/28 ⇜ (5/32 → 11/64) ⇝ 2/7 | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 1/28 ⇜ (5/32 → 11/64) ⇝ 2/7 | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 1/8 ⇜ (5/32 → 11/64) ⇝ 1/4 | note:C4 gain:0.64 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 1/8 ⇜ (5/32 → 11/64) ⇝ 1/4 | note:Eb4 gain:0.64 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 0/1 ⇜ (11/64 → 3/16) ⇝ 1/4 | note:C2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 1/28 ⇜ (11/64 → 3/16) ⇝ 2/7 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 1/28 ⇜ (11/64 → 3/16) ⇝ 2/7 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 1/28 ⇜ (11/64 → 3/16) ⇝ 2/7 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 1/28 ⇜ (11/64 → 3/16) ⇝ 2/7 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 1/8 ⇜ (11/64 → 3/16) ⇝ 1/4 | note:C4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 1/8 ⇜ (11/64 → 3/16) ⇝ 1/4 | note:Eb4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 0/1 ⇜ (3/16 → 13/64) ⇝ 1/4 | note:C2 gain:0.44 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 1/28 ⇜ (3/16 → 13/64) ⇝ 2/7 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 1/28 ⇜ (3/16 → 13/64) ⇝ 2/7 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 1/28 ⇜ (3/16 → 13/64) ⇝ 2/7 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 1/28 ⇜ (3/16 → 13/64) ⇝ 2/7 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 1/8 ⇜ (3/16 → 13/64) ⇝ 1/4 | note:C4 gain:0.44 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 1/8 ⇜ (3/16 → 13/64) ⇝ 1/4 | note:Eb4 gain:0.44 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 0/1 ⇜ (13/64 → 7/32) ⇝ 1/4 | note:C2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 1/28 ⇜ (13/64 → 7/32) ⇝ 2/7 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 1/28 ⇜ (13/64 → 7/32) ⇝ 2/7 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 1/28 ⇜ (13/64 → 7/32) ⇝ 2/7 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 1/28 ⇜ (13/64 → 7/32) ⇝ 2/7 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 1/8 ⇜ (13/64 → 7/32) ⇝ 1/4 | note:C4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 1/8 ⇜ (13/64 → 7/32) ⇝ 1/4 | note:Eb4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 0/1 ⇜ (7/32 → 15/64) ⇝ 1/4 | note:C2 gain:0.24 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 1/28 ⇜ (7/32 → 15/64) ⇝ 2/7 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 1/28 ⇜ (7/32 → 15/64) ⇝ 2/7 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 1/28 ⇜ (7/32 → 15/64) ⇝ 2/7 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 1/28 ⇜ (7/32 → 15/64) ⇝ 2/7 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 1/8 ⇜ (7/32 → 15/64) ⇝ 1/4 | note:C4 gain:0.24 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 1/8 ⇜ (7/32 → 15/64) ⇝ 1/4 | note:Eb4 gain:0.24 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 0/1 ⇜ (15/64 → 1/4) | note:C2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 1/28 ⇜ (15/64 → 1/4) ⇝ 2/7 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 1/28 ⇜ (15/64 → 1/4) ⇝ 2/7 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 1/28 ⇜ (15/64 → 1/4) ⇝ 2/7 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 1/28 ⇜ (15/64 → 1/4) ⇝ 2/7 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 1/8 ⇜ (15/64 → 1/4) | note:C4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 1/8 ⇜ (15/64 → 1/4) | note:Eb4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 1/28 ⇜ (1/4 → 17/64) ⇝ 2/7 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 1/28 ⇜ (1/4 → 17/64) ⇝ 2/7 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 1/28 ⇜ (1/4 → 17/64) ⇝ 2/7 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 1/28 ⇜ (1/4 → 17/64) ⇝ 2/7 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 1/28 ⇜ (17/64 → 9/32) ⇝ 2/7 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 1/28 ⇜ (17/64 → 9/32) ⇝ 2/7 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 1/28 ⇜ (17/64 → 9/32) ⇝ 2/7 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 1/28 ⇜ (17/64 → 9/32) ⇝ 2/7 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 1/28 ⇜ (9/32 → 2/7) | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 1/28 ⇜ (9/32 → 2/7) | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 1/28 ⇜ (9/32 → 2/7) | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 1/28 ⇜ (9/32 → 2/7) | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ (1/2 → 33/64) ⇝ 5/8 | note:G4 gain:0.44 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ (1/2 → 33/64) ⇝ 5/8 | note:Bb4 gain:0.44 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ (1/2 → 33/64) ⇝ 3/4 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ (1/2 → 33/64) ⇝ 3/4 | note:D4 gain:0.22 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ (1/2 → 33/64) ⇝ 3/4 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ (1/2 → 33/64) ⇝ 3/4 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ (1/2 → 33/64) ⇝ 3/4 | note:C2 gain:0.44 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 1/2 ⇜ (33/64 → 17/32) ⇝ 5/8 | note:G4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 1/2 ⇜ (33/64 → 17/32) ⇝ 5/8 | note:Bb4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 1/2 ⇜ (33/64 → 17/32) ⇝ 3/4 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 1/2 ⇜ (33/64 → 17/32) ⇝ 3/4 | note:D4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 1/2 ⇜ (33/64 → 17/32) ⇝ 3/4 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 1/2 ⇜ (33/64 → 17/32) ⇝ 3/4 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 1/2 ⇜ (33/64 → 17/32) ⇝ 3/4 | note:C2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 1/2 ⇜ (17/32 → 35/64) ⇝ 5/8 | note:G4 gain:0.64 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 1/2 ⇜ (17/32 → 35/64) ⇝ 5/8 | note:Bb4 gain:0.64 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 1/2 ⇜ (17/32 → 35/64) ⇝ 3/4 | note:Bb3 gain:0.32 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 1/2 ⇜ (17/32 → 35/64) ⇝ 3/4 | note:D4 gain:0.32 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 1/2 ⇜ (17/32 → 35/64) ⇝ 3/4 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 1/2 ⇜ (17/32 → 35/64) ⇝ 3/4 | note:G4 gain:0.32 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 1/2 ⇜ (17/32 → 35/64) ⇝ 3/4 | note:C2 gain:0.64 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 1/2 ⇜ (35/64 → 9/16) ⇝ 5/8 | note:G4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 1/2 ⇜ (35/64 → 9/16) ⇝ 5/8 | note:Bb4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 1/2 ⇜ (35/64 → 9/16) ⇝ 3/4 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 1/2 ⇜ (35/64 → 9/16) ⇝ 3/4 | note:D4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 1/2 ⇜ (35/64 → 9/16) ⇝ 3/4 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 1/2 ⇜ (35/64 → 9/16) ⇝ 3/4 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 1/2 ⇜ (35/64 → 9/16) ⇝ 3/4 | note:C2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 1/2 ⇜ (9/16 → 37/64) ⇝ 5/8 | note:G4 gain:0.44 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 1/2 ⇜ (9/16 → 37/64) ⇝ 5/8 | note:Bb4 gain:0.44 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 1/2 ⇜ (9/16 → 37/64) ⇝ 3/4 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 1/2 ⇜ (9/16 → 37/64) ⇝ 3/4 | note:D4 gain:0.22 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 1/2 ⇜ (9/16 → 37/64) ⇝ 3/4 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 1/2 ⇜ (9/16 → 37/64) ⇝ 3/4 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 1/2 ⇜ (9/16 → 37/64) ⇝ 3/4 | note:C2 gain:0.44 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 1/2 ⇜ (37/64 → 19/32) ⇝ 5/8 | note:G4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 1/2 ⇜ (37/64 → 19/32) ⇝ 5/8 | note:Bb4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 1/2 ⇜ (37/64 → 19/32) ⇝ 3/4 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 1/2 ⇜ (37/64 → 19/32) ⇝ 3/4 | note:D4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 1/2 ⇜ (37/64 → 19/32) ⇝ 3/4 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 1/2 ⇜ (37/64 → 19/32) ⇝ 3/4 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 1/2 ⇜ (37/64 → 19/32) ⇝ 3/4 | note:C2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 1/2 ⇜ (19/32 → 39/64) ⇝ 5/8 | note:G4 gain:0.24 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 1/2 ⇜ (19/32 → 39/64) ⇝ 5/8 | note:Bb4 gain:0.24 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 1/2 ⇜ (19/32 → 39/64) ⇝ 3/4 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 1/2 ⇜ (19/32 → 39/64) ⇝ 3/4 | note:D4 gain:0.12 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 1/2 ⇜ (19/32 → 39/64) ⇝ 3/4 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 1/2 ⇜ (19/32 → 39/64) ⇝ 3/4 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 1/2 ⇜ (19/32 → 39/64) ⇝ 3/4 | note:C2 gain:0.24 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 1/2 ⇜ (39/64 → 5/8) | note:G4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 1/2 ⇜ (39/64 → 5/8) | note:Bb4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 1/2 ⇜ (39/64 → 5/8) ⇝ 3/4 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 1/2 ⇜ (39/64 → 5/8) ⇝ 3/4 | note:D4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 1/2 ⇜ (39/64 → 5/8) ⇝ 3/4 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 1/2 ⇜ (39/64 → 5/8) ⇝ 3/4 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 1/2 ⇜ (39/64 → 5/8) ⇝ 3/4 | note:C2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 1/2 ⇜ (5/8 → 41/64) ⇝ 3/4 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 1/2 ⇜ (5/8 → 41/64) ⇝ 3/4 | note:D4 gain:0.22 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 1/2 ⇜ (5/8 → 41/64) ⇝ 3/4 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 1/2 ⇜ (5/8 → 41/64) ⇝ 3/4 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 1/2 ⇜ (5/8 → 41/64) ⇝ 3/4 | note:C2 gain:0.44 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 1/2 ⇜ (41/64 → 21/32) ⇝ 3/4 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 1/2 ⇜ (41/64 → 21/32) ⇝ 3/4 | note:D4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 1/2 ⇜ (41/64 → 21/32) ⇝ 3/4 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 1/2 ⇜ (41/64 → 21/32) ⇝ 3/4 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 1/2 ⇜ (41/64 → 21/32) ⇝ 3/4 | note:C2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 1/2 ⇜ (21/32 → 43/64) ⇝ 3/4 | note:Bb3 gain:0.32 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 1/2 ⇜ (21/32 → 43/64) ⇝ 3/4 | note:D4 gain:0.32 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 1/2 ⇜ (21/32 → 43/64) ⇝ 3/4 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 1/2 ⇜ (21/32 → 43/64) ⇝ 3/4 | note:G4 gain:0.32 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 1/2 ⇜ (21/32 → 43/64) ⇝ 3/4 | note:C2 gain:0.64 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 1/2 ⇜ (43/64 → 11/16) ⇝ 3/4 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 1/2 ⇜ (43/64 → 11/16) ⇝ 3/4 | note:D4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 1/2 ⇜ (43/64 → 11/16) ⇝ 3/4 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 1/2 ⇜ (43/64 → 11/16) ⇝ 3/4 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 1/2 ⇜ (43/64 → 11/16) ⇝ 3/4 | note:C2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 1/2 ⇜ (11/16 → 45/64) ⇝ 3/4 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 1/2 ⇜ (11/16 → 45/64) ⇝ 3/4 | note:D4 gain:0.22 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 1/2 ⇜ (11/16 → 45/64) ⇝ 3/4 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 1/2 ⇜ (11/16 → 45/64) ⇝ 3/4 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 1/2 ⇜ (11/16 → 45/64) ⇝ 3/4 | note:C2 gain:0.44 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 1/2 ⇜ (45/64 → 23/32) ⇝ 3/4 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 1/2 ⇜ (45/64 → 23/32) ⇝ 3/4 | note:D4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 1/2 ⇜ (45/64 → 23/32) ⇝ 3/4 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 1/2 ⇜ (45/64 → 23/32) ⇝ 3/4 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 1/2 ⇜ (45/64 → 23/32) ⇝ 3/4 | note:C2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 1/2 ⇜ (23/32 → 47/64) ⇝ 3/4 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 1/2 ⇜ (23/32 → 47/64) ⇝ 3/4 | note:D4 gain:0.12 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 1/2 ⇜ (23/32 → 47/64) ⇝ 3/4 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 1/2 ⇜ (23/32 → 47/64) ⇝ 3/4 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 1/2 ⇜ (23/32 → 47/64) ⇝ 3/4 | note:C2 gain:0.24 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 1/2 ⇜ (47/64 → 3/4) | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 1/2 ⇜ (47/64 → 3/4) | note:D4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 1/2 ⇜ (47/64 → 3/4) | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 1/2 ⇜ (47/64 → 3/4) | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 1/2 ⇜ (47/64 → 3/4) | note:C2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ (3/4 → 49/64) ⇝ 7/8 | note:C4 gain:0.44 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ (3/4 → 49/64) ⇝ 7/8 | note:Eb4 gain:0.44 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 3/4 ⇜ (49/64 → 25/32) ⇝ 7/8 | note:C4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 3/4 ⇜ (49/64 → 25/32) ⇝ 7/8 | note:Eb4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 3/4 ⇜ (25/32 → 51/64) ⇝ 7/8 | note:C4 gain:0.64 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 3/4 ⇜ (25/32 → 51/64) ⇝ 7/8 | note:Eb4 gain:0.64 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ (11/14 → 51/64) ⇝ 29/28 | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ (11/14 → 51/64) ⇝ 29/28 | note:74 gain:0.064 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ (11/14 → 51/64) ⇝ 29/28 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ (11/14 → 51/64) ⇝ 29/28 | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 3/4 ⇜ (51/64 → 13/16) ⇝ 7/8 | note:C4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 3/4 ⇜ (51/64 → 13/16) ⇝ 7/8 | note:Eb4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 11/14 ⇜ (51/64 → 13/16) ⇝ 29/28 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 11/14 ⇜ (51/64 → 13/16) ⇝ 29/28 | note:74 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 11/14 ⇜ (51/64 → 13/16) ⇝ 29/28 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 11/14 ⇜ (51/64 → 13/16) ⇝ 29/28 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 3/4 ⇜ (13/16 → 53/64) ⇝ 7/8 | note:C4 gain:0.44 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 3/4 ⇜ (13/16 → 53/64) ⇝ 7/8 | note:Eb4 gain:0.44 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 11/14 ⇜ (13/16 → 53/64) ⇝ 29/28 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 11/14 ⇜ (13/16 → 53/64) ⇝ 29/28 | note:74 gain:0.044 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 11/14 ⇜ (13/16 → 53/64) ⇝ 29/28 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 11/14 ⇜ (13/16 → 53/64) ⇝ 29/28 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 3/4 ⇜ (53/64 → 27/32) ⇝ 7/8 | note:C4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 3/4 ⇜ (53/64 → 27/32) ⇝ 7/8 | note:Eb4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 11/14 ⇜ (53/64 → 27/32) ⇝ 29/28 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 11/14 ⇜ (53/64 → 27/32) ⇝ 29/28 | note:74 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 11/14 ⇜ (53/64 → 27/32) ⇝ 29/28 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 11/14 ⇜ (53/64 → 27/32) ⇝ 29/28 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 3/4 ⇜ (27/32 → 55/64) ⇝ 7/8 | note:C4 gain:0.24 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 3/4 ⇜ (27/32 → 55/64) ⇝ 7/8 | note:Eb4 gain:0.24 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 11/14 ⇜ (27/32 → 55/64) ⇝ 29/28 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 11/14 ⇜ (27/32 → 55/64) ⇝ 29/28 | note:74 gain:0.024 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 11/14 ⇜ (27/32 → 55/64) ⇝ 29/28 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 11/14 ⇜ (27/32 → 55/64) ⇝ 29/28 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 3/4 ⇜ (55/64 → 7/8) | note:C4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 3/4 ⇜ (55/64 → 7/8) | note:Eb4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 11/14 ⇜ (55/64 → 7/8) ⇝ 29/28 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 11/14 ⇜ (55/64 → 7/8) ⇝ 29/28 | note:74 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 11/14 ⇜ (55/64 → 7/8) ⇝ 29/28 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 11/14 ⇜ (55/64 → 7/8) ⇝ 29/28 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 11/14 ⇜ (7/8 → 57/64) ⇝ 29/28 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 11/14 ⇜ (7/8 → 57/64) ⇝ 29/28 | note:74 gain:0.044 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 11/14 ⇜ (7/8 → 57/64) ⇝ 29/28 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 11/14 ⇜ (7/8 → 57/64) ⇝ 29/28 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 11/14 ⇜ (57/64 → 29/32) ⇝ 29/28 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 11/14 ⇜ (57/64 → 29/32) ⇝ 29/28 | note:74 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 11/14 ⇜ (57/64 → 29/32) ⇝ 29/28 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 11/14 ⇜ (57/64 → 29/32) ⇝ 29/28 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 11/14 ⇜ (29/32 → 59/64) ⇝ 29/28 | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 11/14 ⇜ (29/32 → 59/64) ⇝ 29/28 | note:74 gain:0.064 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 11/14 ⇜ (29/32 → 59/64) ⇝ 29/28 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 11/14 ⇜ (29/32 → 59/64) ⇝ 29/28 | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 11/14 ⇜ (59/64 → 15/16) ⇝ 29/28 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 11/14 ⇜ (59/64 → 15/16) ⇝ 29/28 | note:74 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 11/14 ⇜ (59/64 → 15/16) ⇝ 29/28 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 11/14 ⇜ (59/64 → 15/16) ⇝ 29/28 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 11/14 ⇜ (15/16 → 61/64) ⇝ 29/28 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 11/14 ⇜ (15/16 → 61/64) ⇝ 29/28 | note:74 gain:0.044 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 11/14 ⇜ (15/16 → 61/64) ⇝ 29/28 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 11/14 ⇜ (15/16 → 61/64) ⇝ 29/28 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 11/14 ⇜ (61/64 → 31/32) ⇝ 29/28 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 11/14 ⇜ (61/64 → 31/32) ⇝ 29/28 | note:74 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 11/14 ⇜ (61/64 → 31/32) ⇝ 29/28 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 11/14 ⇜ (61/64 → 31/32) ⇝ 29/28 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 11/14 ⇜ (31/32 → 63/64) ⇝ 29/28 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 11/14 ⇜ (31/32 → 63/64) ⇝ 29/28 | note:74 gain:0.024 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 11/14 ⇜ (31/32 → 63/64) ⇝ 29/28 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 11/14 ⇜ (31/32 → 63/64) ⇝ 29/28 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 11/14 ⇜ (63/64 → 1/1) ⇝ 29/28 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 11/14 ⇜ (63/64 → 1/1) ⇝ 29/28 | note:74 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 11/14 ⇜ (63/64 → 1/1) ⇝ 29/28 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 11/14 ⇜ (63/64 → 1/1) ⇝ 29/28 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 11/14 ⇜ (1/1 → 65/64) ⇝ 29/28 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 11/14 ⇜ (1/1 → 65/64) ⇝ 29/28 | note:74 gain:0.044 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 11/14 ⇜ (1/1 → 65/64) ⇝ 29/28 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 11/14 ⇜ (1/1 → 65/64) ⇝ 29/28 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ (1/1 → 65/64) ⇝ 5/4 | note:C2 gain:0.44 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 11/14 ⇜ (65/64 → 33/32) ⇝ 29/28 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 11/14 ⇜ (65/64 → 33/32) ⇝ 29/28 | note:74 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 11/14 ⇜ (65/64 → 33/32) ⇝ 29/28 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 11/14 ⇜ (65/64 → 33/32) ⇝ 29/28 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 1/1 ⇜ (65/64 → 33/32) ⇝ 5/4 | note:C2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 11/14 ⇜ (33/32 → 29/28) | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 11/14 ⇜ (33/32 → 29/28) | note:74 gain:0.064 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 11/14 ⇜ (33/32 → 29/28) | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 11/14 ⇜ (33/32 → 29/28) | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 1/1 ⇜ (33/32 → 67/64) ⇝ 5/4 | note:C2 gain:0.64 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 1/1 ⇜ (67/64 → 17/16) ⇝ 5/4 | note:C2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 1/1 ⇜ (17/16 → 69/64) ⇝ 5/4 | note:C2 gain:0.44 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 1/1 ⇜ (69/64 → 35/32) ⇝ 5/4 | note:C2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 1/1 ⇜ (35/32 → 71/64) ⇝ 5/4 | note:C2 gain:0.24 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 1/1 ⇜ (71/64 → 9/8) ⇝ 5/4 | note:C2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 1/1 ⇜ (9/8 → 73/64) ⇝ 5/4 | note:C2 gain:0.44 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ (9/8 → 73/64) ⇝ 5/4 | note:C4 gain:0.44 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ (9/8 → 73/64) ⇝ 5/4 | note:Eb4 gain:0.44 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 1/1 ⇜ (73/64 → 37/32) ⇝ 5/4 | note:C2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 9/8 ⇜ (73/64 → 37/32) ⇝ 5/4 | note:C4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 9/8 ⇜ (73/64 → 37/32) ⇝ 5/4 | note:Eb4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 1/1 ⇜ (37/32 → 75/64) ⇝ 5/4 | note:C2 gain:0.64 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 9/8 ⇜ (37/32 → 75/64) ⇝ 5/4 | note:C4 gain:0.64 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 9/8 ⇜ (37/32 → 75/64) ⇝ 5/4 | note:Eb4 gain:0.64 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 1/1 ⇜ (75/64 → 19/16) ⇝ 5/4 | note:C2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 9/8 ⇜ (75/64 → 19/16) ⇝ 5/4 | note:C4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 9/8 ⇜ (75/64 → 19/16) ⇝ 5/4 | note:Eb4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 1/1 ⇜ (19/16 → 77/64) ⇝ 5/4 | note:C2 gain:0.44 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 9/8 ⇜ (19/16 → 77/64) ⇝ 5/4 | note:C4 gain:0.44 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 9/8 ⇜ (19/16 → 77/64) ⇝ 5/4 | note:Eb4 gain:0.44 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 1/1 ⇜ (77/64 → 39/32) ⇝ 5/4 | note:C2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 9/8 ⇜ (77/64 → 39/32) ⇝ 5/4 | note:C4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 9/8 ⇜ (77/64 → 39/32) ⇝ 5/4 | note:Eb4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 1/1 ⇜ (39/32 → 79/64) ⇝ 5/4 | note:C2 gain:0.24 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 9/8 ⇜ (39/32 → 79/64) ⇝ 5/4 | note:C4 gain:0.24 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 9/8 ⇜ (39/32 → 79/64) ⇝ 5/4 | note:Eb4 gain:0.24 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 1/1 ⇜ (79/64 → 5/4) | note:C2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 9/8 ⇜ (79/64 → 5/4) | note:C4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 9/8 ⇜ (79/64 → 5/4) | note:Eb4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ (5/4 → 81/64) ⇝ 3/2 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ (5/4 → 81/64) ⇝ 3/2 | note:D4 gain:0.22 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ (5/4 → 81/64) ⇝ 3/2 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ (5/4 → 81/64) ⇝ 3/2 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/4 ⇜ (81/64 → 41/32) ⇝ 3/2 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 5/4 ⇜ (81/64 → 41/32) ⇝ 3/2 | note:D4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 5/4 ⇜ (81/64 → 41/32) ⇝ 3/2 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 5/4 ⇜ (81/64 → 41/32) ⇝ 3/2 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/4 ⇜ (41/32 → 83/64) ⇝ 3/2 | note:Bb3 gain:0.32 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 5/4 ⇜ (41/32 → 83/64) ⇝ 3/2 | note:D4 gain:0.32 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 5/4 ⇜ (41/32 → 83/64) ⇝ 3/2 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 5/4 ⇜ (41/32 → 83/64) ⇝ 3/2 | note:G4 gain:0.32 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/4 ⇜ (83/64 → 21/16) ⇝ 3/2 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 5/4 ⇜ (83/64 → 21/16) ⇝ 3/2 | note:D4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 5/4 ⇜ (83/64 → 21/16) ⇝ 3/2 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 5/4 ⇜ (83/64 → 21/16) ⇝ 3/2 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/4 ⇜ (21/16 → 85/64) ⇝ 3/2 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 5/4 ⇜ (21/16 → 85/64) ⇝ 3/2 | note:D4 gain:0.22 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 5/4 ⇜ (21/16 → 85/64) ⇝ 3/2 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 5/4 ⇜ (21/16 → 85/64) ⇝ 3/2 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/4 ⇜ (85/64 → 43/32) ⇝ 3/2 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 5/4 ⇜ (85/64 → 43/32) ⇝ 3/2 | note:D4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 5/4 ⇜ (85/64 → 43/32) ⇝ 3/2 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 5/4 ⇜ (85/64 → 43/32) ⇝ 3/2 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/4 ⇜ (43/32 → 87/64) ⇝ 3/2 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 5/4 ⇜ (43/32 → 87/64) ⇝ 3/2 | note:D4 gain:0.12 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 5/4 ⇜ (43/32 → 87/64) ⇝ 3/2 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 5/4 ⇜ (43/32 → 87/64) ⇝ 3/2 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/4 ⇜ (87/64 → 11/8) ⇝ 3/2 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 5/4 ⇜ (87/64 → 11/8) ⇝ 3/2 | note:D4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 5/4 ⇜ (87/64 → 11/8) ⇝ 3/2 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 5/4 ⇜ (87/64 → 11/8) ⇝ 3/2 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/4 ⇜ (11/8 → 89/64) ⇝ 3/2 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 5/4 ⇜ (11/8 → 89/64) ⇝ 3/2 | note:D4 gain:0.22 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 5/4 ⇜ (11/8 → 89/64) ⇝ 3/2 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 5/4 ⇜ (11/8 → 89/64) ⇝ 3/2 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/4 ⇜ (89/64 → 45/32) ⇝ 3/2 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 5/4 ⇜ (89/64 → 45/32) ⇝ 3/2 | note:D4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 5/4 ⇜ (89/64 → 45/32) ⇝ 3/2 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 5/4 ⇜ (89/64 → 45/32) ⇝ 3/2 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/4 ⇜ (45/32 → 91/64) ⇝ 3/2 | note:Bb3 gain:0.32 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 5/4 ⇜ (45/32 → 91/64) ⇝ 3/2 | note:D4 gain:0.32 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 5/4 ⇜ (45/32 → 91/64) ⇝ 3/2 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 5/4 ⇜ (45/32 → 91/64) ⇝ 3/2 | note:G4 gain:0.32 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/4 ⇜ (91/64 → 23/16) ⇝ 3/2 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 5/4 ⇜ (91/64 → 23/16) ⇝ 3/2 | note:D4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 5/4 ⇜ (91/64 → 23/16) ⇝ 3/2 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 5/4 ⇜ (91/64 → 23/16) ⇝ 3/2 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/4 ⇜ (23/16 → 93/64) ⇝ 3/2 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 5/4 ⇜ (23/16 → 93/64) ⇝ 3/2 | note:D4 gain:0.22 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 5/4 ⇜ (23/16 → 93/64) ⇝ 3/2 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 5/4 ⇜ (23/16 → 93/64) ⇝ 3/2 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/4 ⇜ (93/64 → 47/32) ⇝ 3/2 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 5/4 ⇜ (93/64 → 47/32) ⇝ 3/2 | note:D4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 5/4 ⇜ (93/64 → 47/32) ⇝ 3/2 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 5/4 ⇜ (93/64 → 47/32) ⇝ 3/2 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/4 ⇜ (47/32 → 95/64) ⇝ 3/2 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 5/4 ⇜ (47/32 → 95/64) ⇝ 3/2 | note:D4 gain:0.12 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 5/4 ⇜ (47/32 → 95/64) ⇝ 3/2 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 5/4 ⇜ (47/32 → 95/64) ⇝ 3/2 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/4 ⇜ (95/64 → 3/2) | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 5/4 ⇜ (95/64 → 3/2) | note:D4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 5/4 ⇜ (95/64 → 3/2) | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 5/4 ⇜ (95/64 → 3/2) | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ (3/2 → 97/64) ⇝ 13/8 | note:G4 gain:0.44 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ (3/2 → 97/64) ⇝ 13/8 | note:Bb4 gain:0.44 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ (3/2 → 97/64) ⇝ 7/4 | note:C2 gain:0.44 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 3/2 ⇜ (97/64 → 49/32) ⇝ 13/8 | note:G4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 3/2 ⇜ (97/64 → 49/32) ⇝ 13/8 | note:Bb4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 3/2 ⇜ (97/64 → 49/32) ⇝ 7/4 | note:C2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 3/2 ⇜ (49/32 → 99/64) ⇝ 13/8 | note:G4 gain:0.64 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 3/2 ⇜ (49/32 → 99/64) ⇝ 13/8 | note:Bb4 gain:0.64 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 3/2 ⇜ (49/32 → 99/64) ⇝ 7/4 | note:C2 gain:0.64 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ (43/28 → 99/64) ⇝ 25/14 | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ (43/28 → 99/64) ⇝ 25/14 | note:74 gain:0.064 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ (43/28 → 99/64) ⇝ 25/14 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ (43/28 → 99/64) ⇝ 25/14 | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 3/2 ⇜ (99/64 → 25/16) ⇝ 13/8 | note:G4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 3/2 ⇜ (99/64 → 25/16) ⇝ 13/8 | note:Bb4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 3/2 ⇜ (99/64 → 25/16) ⇝ 7/4 | note:C2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 43/28 ⇜ (99/64 → 25/16) ⇝ 25/14 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 43/28 ⇜ (99/64 → 25/16) ⇝ 25/14 | note:74 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 43/28 ⇜ (99/64 → 25/16) ⇝ 25/14 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 43/28 ⇜ (99/64 → 25/16) ⇝ 25/14 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 3/2 ⇜ (25/16 → 101/64) ⇝ 13/8 | note:G4 gain:0.44 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 3/2 ⇜ (25/16 → 101/64) ⇝ 13/8 | note:Bb4 gain:0.44 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 3/2 ⇜ (25/16 → 101/64) ⇝ 7/4 | note:C2 gain:0.44 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 43/28 ⇜ (25/16 → 101/64) ⇝ 25/14 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 43/28 ⇜ (25/16 → 101/64) ⇝ 25/14 | note:74 gain:0.044 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 43/28 ⇜ (25/16 → 101/64) ⇝ 25/14 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 43/28 ⇜ (25/16 → 101/64) ⇝ 25/14 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 3/2 ⇜ (101/64 → 51/32) ⇝ 13/8 | note:G4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 3/2 ⇜ (101/64 → 51/32) ⇝ 13/8 | note:Bb4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 3/2 ⇜ (101/64 → 51/32) ⇝ 7/4 | note:C2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 43/28 ⇜ (101/64 → 51/32) ⇝ 25/14 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 43/28 ⇜ (101/64 → 51/32) ⇝ 25/14 | note:74 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 43/28 ⇜ (101/64 → 51/32) ⇝ 25/14 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 43/28 ⇜ (101/64 → 51/32) ⇝ 25/14 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 3/2 ⇜ (51/32 → 103/64) ⇝ 13/8 | note:G4 gain:0.24 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 3/2 ⇜ (51/32 → 103/64) ⇝ 13/8 | note:Bb4 gain:0.24 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 3/2 ⇜ (51/32 → 103/64) ⇝ 7/4 | note:C2 gain:0.24 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 43/28 ⇜ (51/32 → 103/64) ⇝ 25/14 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 43/28 ⇜ (51/32 → 103/64) ⇝ 25/14 | note:74 gain:0.024 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 43/28 ⇜ (51/32 → 103/64) ⇝ 25/14 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 43/28 ⇜ (51/32 → 103/64) ⇝ 25/14 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 3/2 ⇜ (103/64 → 13/8) | note:G4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 3/2 ⇜ (103/64 → 13/8) | note:Bb4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 3/2 ⇜ (103/64 → 13/8) ⇝ 7/4 | note:C2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 43/28 ⇜ (103/64 → 13/8) ⇝ 25/14 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 43/28 ⇜ (103/64 → 13/8) ⇝ 25/14 | note:74 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 43/28 ⇜ (103/64 → 13/8) ⇝ 25/14 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 43/28 ⇜ (103/64 → 13/8) ⇝ 25/14 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 3/2 ⇜ (13/8 → 105/64) ⇝ 7/4 | note:C2 gain:0.44 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 43/28 ⇜ (13/8 → 105/64) ⇝ 25/14 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 43/28 ⇜ (13/8 → 105/64) ⇝ 25/14 | note:74 gain:0.044 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 43/28 ⇜ (13/8 → 105/64) ⇝ 25/14 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 43/28 ⇜ (13/8 → 105/64) ⇝ 25/14 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 3/2 ⇜ (105/64 → 53/32) ⇝ 7/4 | note:C2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 43/28 ⇜ (105/64 → 53/32) ⇝ 25/14 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 43/28 ⇜ (105/64 → 53/32) ⇝ 25/14 | note:74 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 43/28 ⇜ (105/64 → 53/32) ⇝ 25/14 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 43/28 ⇜ (105/64 → 53/32) ⇝ 25/14 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 3/2 ⇜ (53/32 → 107/64) ⇝ 7/4 | note:C2 gain:0.64 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 43/28 ⇜ (53/32 → 107/64) ⇝ 25/14 | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 43/28 ⇜ (53/32 → 107/64) ⇝ 25/14 | note:74 gain:0.064 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 43/28 ⇜ (53/32 → 107/64) ⇝ 25/14 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 43/28 ⇜ (53/32 → 107/64) ⇝ 25/14 | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 3/2 ⇜ (107/64 → 27/16) ⇝ 7/4 | note:C2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 43/28 ⇜ (107/64 → 27/16) ⇝ 25/14 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 43/28 ⇜ (107/64 → 27/16) ⇝ 25/14 | note:74 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 43/28 ⇜ (107/64 → 27/16) ⇝ 25/14 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 43/28 ⇜ (107/64 → 27/16) ⇝ 25/14 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 3/2 ⇜ (27/16 → 109/64) ⇝ 7/4 | note:C2 gain:0.44 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 43/28 ⇜ (27/16 → 109/64) ⇝ 25/14 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 43/28 ⇜ (27/16 → 109/64) ⇝ 25/14 | note:74 gain:0.044 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 43/28 ⇜ (27/16 → 109/64) ⇝ 25/14 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 43/28 ⇜ (27/16 → 109/64) ⇝ 25/14 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 3/2 ⇜ (109/64 → 55/32) ⇝ 7/4 | note:C2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 43/28 ⇜ (109/64 → 55/32) ⇝ 25/14 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 43/28 ⇜ (109/64 → 55/32) ⇝ 25/14 | note:74 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 43/28 ⇜ (109/64 → 55/32) ⇝ 25/14 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 43/28 ⇜ (109/64 → 55/32) ⇝ 25/14 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 3/2 ⇜ (55/32 → 111/64) ⇝ 7/4 | note:C2 gain:0.24 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 43/28 ⇜ (55/32 → 111/64) ⇝ 25/14 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 43/28 ⇜ (55/32 → 111/64) ⇝ 25/14 | note:74 gain:0.024 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 43/28 ⇜ (55/32 → 111/64) ⇝ 25/14 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 43/28 ⇜ (55/32 → 111/64) ⇝ 25/14 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 3/2 ⇜ (111/64 → 7/4) | note:C2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 43/28 ⇜ (111/64 → 7/4) ⇝ 25/14 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 43/28 ⇜ (111/64 → 7/4) ⇝ 25/14 | note:74 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 43/28 ⇜ (111/64 → 7/4) ⇝ 25/14 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 43/28 ⇜ (111/64 → 7/4) ⇝ 25/14 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 43/28 ⇜ (7/4 → 113/64) ⇝ 25/14 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 43/28 ⇜ (7/4 → 113/64) ⇝ 25/14 | note:74 gain:0.044 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 43/28 ⇜ (7/4 → 113/64) ⇝ 25/14 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 43/28 ⇜ (7/4 → 113/64) ⇝ 25/14 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ (7/4 → 113/64) ⇝ 15/8 | note:G4 gain:0.44 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ (7/4 → 113/64) ⇝ 15/8 | note:Bb4 gain:0.44 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ (7/4 → 113/64) ⇝ 2/1 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ (7/4 → 113/64) ⇝ 2/1 | note:D4 gain:0.22 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ (7/4 → 113/64) ⇝ 2/1 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ (7/4 → 113/64) ⇝ 2/1 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 43/28 ⇜ (113/64 → 57/32) ⇝ 25/14 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 43/28 ⇜ (113/64 → 57/32) ⇝ 25/14 | note:74 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 43/28 ⇜ (113/64 → 57/32) ⇝ 25/14 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 43/28 ⇜ (113/64 → 57/32) ⇝ 25/14 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 7/4 ⇜ (113/64 → 57/32) ⇝ 15/8 | note:G4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 7/4 ⇜ (113/64 → 57/32) ⇝ 15/8 | note:Bb4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 7/4 ⇜ (113/64 → 57/32) ⇝ 2/1 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 7/4 ⇜ (113/64 → 57/32) ⇝ 2/1 | note:D4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 7/4 ⇜ (113/64 → 57/32) ⇝ 2/1 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 7/4 ⇜ (113/64 → 57/32) ⇝ 2/1 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 43/28 ⇜ (57/32 → 25/14) | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 43/28 ⇜ (57/32 → 25/14) | note:74 gain:0.064 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 43/28 ⇜ (57/32 → 25/14) | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 43/28 ⇜ (57/32 → 25/14) | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 7/4 ⇜ (57/32 → 115/64) ⇝ 15/8 | note:G4 gain:0.64 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 7/4 ⇜ (57/32 → 115/64) ⇝ 15/8 | note:Bb4 gain:0.64 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 7/4 ⇜ (57/32 → 115/64) ⇝ 2/1 | note:Bb3 gain:0.32 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 7/4 ⇜ (57/32 → 115/64) ⇝ 2/1 | note:D4 gain:0.32 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 7/4 ⇜ (57/32 → 115/64) ⇝ 2/1 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 7/4 ⇜ (57/32 → 115/64) ⇝ 2/1 | note:G4 gain:0.32 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 7/4 ⇜ (115/64 → 29/16) ⇝ 15/8 | note:G4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 7/4 ⇜ (115/64 → 29/16) ⇝ 15/8 | note:Bb4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 7/4 ⇜ (115/64 → 29/16) ⇝ 2/1 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 7/4 ⇜ (115/64 → 29/16) ⇝ 2/1 | note:D4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 7/4 ⇜ (115/64 → 29/16) ⇝ 2/1 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 7/4 ⇜ (115/64 → 29/16) ⇝ 2/1 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 7/4 ⇜ (29/16 → 117/64) ⇝ 15/8 | note:G4 gain:0.44 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 7/4 ⇜ (29/16 → 117/64) ⇝ 15/8 | note:Bb4 gain:0.44 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 7/4 ⇜ (29/16 → 117/64) ⇝ 2/1 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 7/4 ⇜ (29/16 → 117/64) ⇝ 2/1 | note:D4 gain:0.22 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 7/4 ⇜ (29/16 → 117/64) ⇝ 2/1 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 7/4 ⇜ (29/16 → 117/64) ⇝ 2/1 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 7/4 ⇜ (117/64 → 59/32) ⇝ 15/8 | note:G4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 7/4 ⇜ (117/64 → 59/32) ⇝ 15/8 | note:Bb4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 7/4 ⇜ (117/64 → 59/32) ⇝ 2/1 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 7/4 ⇜ (117/64 → 59/32) ⇝ 2/1 | note:D4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 7/4 ⇜ (117/64 → 59/32) ⇝ 2/1 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 7/4 ⇜ (117/64 → 59/32) ⇝ 2/1 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 7/4 ⇜ (59/32 → 119/64) ⇝ 15/8 | note:G4 gain:0.24 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 7/4 ⇜ (59/32 → 119/64) ⇝ 15/8 | note:Bb4 gain:0.24 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 7/4 ⇜ (59/32 → 119/64) ⇝ 2/1 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 7/4 ⇜ (59/32 → 119/64) ⇝ 2/1 | note:D4 gain:0.12 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 7/4 ⇜ (59/32 → 119/64) ⇝ 2/1 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 7/4 ⇜ (59/32 → 119/64) ⇝ 2/1 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 7/4 ⇜ (119/64 → 15/8) | note:G4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 7/4 ⇜ (119/64 → 15/8) | note:Bb4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 7/4 ⇜ (119/64 → 15/8) ⇝ 2/1 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 7/4 ⇜ (119/64 → 15/8) ⇝ 2/1 | note:D4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 7/4 ⇜ (119/64 → 15/8) ⇝ 2/1 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 7/4 ⇜ (119/64 → 15/8) ⇝ 2/1 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 7/4 ⇜ (15/8 → 121/64) ⇝ 2/1 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 7/4 ⇜ (15/8 → 121/64) ⇝ 2/1 | note:D4 gain:0.22 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 7/4 ⇜ (15/8 → 121/64) ⇝ 2/1 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 7/4 ⇜ (15/8 → 121/64) ⇝ 2/1 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 7/4 ⇜ (121/64 → 61/32) ⇝ 2/1 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 7/4 ⇜ (121/64 → 61/32) ⇝ 2/1 | note:D4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 7/4 ⇜ (121/64 → 61/32) ⇝ 2/1 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 7/4 ⇜ (121/64 → 61/32) ⇝ 2/1 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 7/4 ⇜ (61/32 → 123/64) ⇝ 2/1 | note:Bb3 gain:0.32 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 7/4 ⇜ (61/32 → 123/64) ⇝ 2/1 | note:D4 gain:0.32 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 7/4 ⇜ (61/32 → 123/64) ⇝ 2/1 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 7/4 ⇜ (61/32 → 123/64) ⇝ 2/1 | note:G4 gain:0.32 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 7/4 ⇜ (123/64 → 31/16) ⇝ 2/1 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 7/4 ⇜ (123/64 → 31/16) ⇝ 2/1 | note:D4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 7/4 ⇜ (123/64 → 31/16) ⇝ 2/1 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 7/4 ⇜ (123/64 → 31/16) ⇝ 2/1 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 7/4 ⇜ (31/16 → 125/64) ⇝ 2/1 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 7/4 ⇜ (31/16 → 125/64) ⇝ 2/1 | note:D4 gain:0.22 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 7/4 ⇜ (31/16 → 125/64) ⇝ 2/1 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 7/4 ⇜ (31/16 → 125/64) ⇝ 2/1 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 7/4 ⇜ (125/64 → 63/32) ⇝ 2/1 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 7/4 ⇜ (125/64 → 63/32) ⇝ 2/1 | note:D4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 7/4 ⇜ (125/64 → 63/32) ⇝ 2/1 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 7/4 ⇜ (125/64 → 63/32) ⇝ 2/1 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 7/4 ⇜ (63/32 → 127/64) ⇝ 2/1 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 7/4 ⇜ (63/32 → 127/64) ⇝ 2/1 | note:D4 gain:0.12 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 7/4 ⇜ (63/32 → 127/64) ⇝ 2/1 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 7/4 ⇜ (63/32 → 127/64) ⇝ 2/1 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 7/4 ⇜ (127/64 → 2/1) | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 7/4 ⇜ (127/64 → 2/1) | note:D4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 7/4 ⇜ (127/64 → 2/1) | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 7/4 ⇜ (127/64 → 2/1) | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ (2/1 → 129/64) ⇝ 9/4 | note:F2 gain:0.44 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 2/1 ⇜ (129/64 → 65/32) ⇝ 9/4 | note:F2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 2/1 ⇜ (65/32 → 131/64) ⇝ 9/4 | note:F2 gain:0.64 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ (57/28 → 131/64) ⇝ 16/7 | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ (57/28 → 131/64) ⇝ 16/7 | note:74 gain:0.064 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ (57/28 → 131/64) ⇝ 16/7 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ (57/28 → 131/64) ⇝ 16/7 | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 2/1 ⇜ (131/64 → 33/16) ⇝ 9/4 | note:F2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 57/28 ⇜ (131/64 → 33/16) ⇝ 16/7 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 57/28 ⇜ (131/64 → 33/16) ⇝ 16/7 | note:74 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 57/28 ⇜ (131/64 → 33/16) ⇝ 16/7 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 57/28 ⇜ (131/64 → 33/16) ⇝ 16/7 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 2/1 ⇜ (33/16 → 133/64) ⇝ 9/4 | note:F2 gain:0.44 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 57/28 ⇜ (33/16 → 133/64) ⇝ 16/7 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 57/28 ⇜ (33/16 → 133/64) ⇝ 16/7 | note:74 gain:0.044 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 57/28 ⇜ (33/16 → 133/64) ⇝ 16/7 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 57/28 ⇜ (33/16 → 133/64) ⇝ 16/7 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 2/1 ⇜ (133/64 → 67/32) ⇝ 9/4 | note:F2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 57/28 ⇜ (133/64 → 67/32) ⇝ 16/7 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 57/28 ⇜ (133/64 → 67/32) ⇝ 16/7 | note:74 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 57/28 ⇜ (133/64 → 67/32) ⇝ 16/7 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 57/28 ⇜ (133/64 → 67/32) ⇝ 16/7 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 2/1 ⇜ (67/32 → 135/64) ⇝ 9/4 | note:F2 gain:0.24 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 57/28 ⇜ (67/32 → 135/64) ⇝ 16/7 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 57/28 ⇜ (67/32 → 135/64) ⇝ 16/7 | note:74 gain:0.024 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 57/28 ⇜ (67/32 → 135/64) ⇝ 16/7 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 57/28 ⇜ (67/32 → 135/64) ⇝ 16/7 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 2/1 ⇜ (135/64 → 17/8) ⇝ 9/4 | note:F2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 57/28 ⇜ (135/64 → 17/8) ⇝ 16/7 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 57/28 ⇜ (135/64 → 17/8) ⇝ 16/7 | note:74 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 57/28 ⇜ (135/64 → 17/8) ⇝ 16/7 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 57/28 ⇜ (135/64 → 17/8) ⇝ 16/7 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 2/1 ⇜ (17/8 → 137/64) ⇝ 9/4 | note:F2 gain:0.44 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 57/28 ⇜ (17/8 → 137/64) ⇝ 16/7 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 57/28 ⇜ (17/8 → 137/64) ⇝ 16/7 | note:74 gain:0.044 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 57/28 ⇜ (17/8 → 137/64) ⇝ 16/7 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 57/28 ⇜ (17/8 → 137/64) ⇝ 16/7 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ (17/8 → 137/64) ⇝ 9/4 | note:F4 gain:0.44 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ (17/8 → 137/64) ⇝ 9/4 | note:Ab4 gain:0.44 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 2/1 ⇜ (137/64 → 69/32) ⇝ 9/4 | note:F2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 57/28 ⇜ (137/64 → 69/32) ⇝ 16/7 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 57/28 ⇜ (137/64 → 69/32) ⇝ 16/7 | note:74 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 57/28 ⇜ (137/64 → 69/32) ⇝ 16/7 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 57/28 ⇜ (137/64 → 69/32) ⇝ 16/7 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 17/8 ⇜ (137/64 → 69/32) ⇝ 9/4 | note:F4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 17/8 ⇜ (137/64 → 69/32) ⇝ 9/4 | note:Ab4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 2/1 ⇜ (69/32 → 139/64) ⇝ 9/4 | note:F2 gain:0.64 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 57/28 ⇜ (69/32 → 139/64) ⇝ 16/7 | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 57/28 ⇜ (69/32 → 139/64) ⇝ 16/7 | note:74 gain:0.064 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 57/28 ⇜ (69/32 → 139/64) ⇝ 16/7 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 57/28 ⇜ (69/32 → 139/64) ⇝ 16/7 | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 17/8 ⇜ (69/32 → 139/64) ⇝ 9/4 | note:F4 gain:0.64 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 17/8 ⇜ (69/32 → 139/64) ⇝ 9/4 | note:Ab4 gain:0.64 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 2/1 ⇜ (139/64 → 35/16) ⇝ 9/4 | note:F2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 57/28 ⇜ (139/64 → 35/16) ⇝ 16/7 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 57/28 ⇜ (139/64 → 35/16) ⇝ 16/7 | note:74 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 57/28 ⇜ (139/64 → 35/16) ⇝ 16/7 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 57/28 ⇜ (139/64 → 35/16) ⇝ 16/7 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 17/8 ⇜ (139/64 → 35/16) ⇝ 9/4 | note:F4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 17/8 ⇜ (139/64 → 35/16) ⇝ 9/4 | note:Ab4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 2/1 ⇜ (35/16 → 141/64) ⇝ 9/4 | note:F2 gain:0.44 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 57/28 ⇜ (35/16 → 141/64) ⇝ 16/7 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 57/28 ⇜ (35/16 → 141/64) ⇝ 16/7 | note:74 gain:0.044 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 57/28 ⇜ (35/16 → 141/64) ⇝ 16/7 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 57/28 ⇜ (35/16 → 141/64) ⇝ 16/7 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 17/8 ⇜ (35/16 → 141/64) ⇝ 9/4 | note:F4 gain:0.44 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 17/8 ⇜ (35/16 → 141/64) ⇝ 9/4 | note:Ab4 gain:0.44 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 2/1 ⇜ (141/64 → 71/32) ⇝ 9/4 | note:F2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 57/28 ⇜ (141/64 → 71/32) ⇝ 16/7 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 57/28 ⇜ (141/64 → 71/32) ⇝ 16/7 | note:74 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 57/28 ⇜ (141/64 → 71/32) ⇝ 16/7 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 57/28 ⇜ (141/64 → 71/32) ⇝ 16/7 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 17/8 ⇜ (141/64 → 71/32) ⇝ 9/4 | note:F4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 17/8 ⇜ (141/64 → 71/32) ⇝ 9/4 | note:Ab4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 2/1 ⇜ (71/32 → 143/64) ⇝ 9/4 | note:F2 gain:0.24 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 57/28 ⇜ (71/32 → 143/64) ⇝ 16/7 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 57/28 ⇜ (71/32 → 143/64) ⇝ 16/7 | note:74 gain:0.024 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 57/28 ⇜ (71/32 → 143/64) ⇝ 16/7 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 57/28 ⇜ (71/32 → 143/64) ⇝ 16/7 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 17/8 ⇜ (71/32 → 143/64) ⇝ 9/4 | note:F4 gain:0.24 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 17/8 ⇜ (71/32 → 143/64) ⇝ 9/4 | note:Ab4 gain:0.24 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 2/1 ⇜ (143/64 → 9/4) | note:F2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 57/28 ⇜ (143/64 → 9/4) ⇝ 16/7 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 57/28 ⇜ (143/64 → 9/4) ⇝ 16/7 | note:74 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 57/28 ⇜ (143/64 → 9/4) ⇝ 16/7 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 57/28 ⇜ (143/64 → 9/4) ⇝ 16/7 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 17/8 ⇜ (143/64 → 9/4) | note:F4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 17/8 ⇜ (143/64 → 9/4) | note:Ab4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 57/28 ⇜ (9/4 → 145/64) ⇝ 16/7 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 57/28 ⇜ (9/4 → 145/64) ⇝ 16/7 | note:74 gain:0.044 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 57/28 ⇜ (9/4 → 145/64) ⇝ 16/7 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 57/28 ⇜ (9/4 → 145/64) ⇝ 16/7 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 57/28 ⇜ (145/64 → 73/32) ⇝ 16/7 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 57/28 ⇜ (145/64 → 73/32) ⇝ 16/7 | note:74 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 57/28 ⇜ (145/64 → 73/32) ⇝ 16/7 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 57/28 ⇜ (145/64 → 73/32) ⇝ 16/7 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 57/28 ⇜ (73/32 → 16/7) | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 57/28 ⇜ (73/32 → 16/7) | note:74 gain:0.064 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 57/28 ⇜ (73/32 → 16/7) | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 57/28 ⇜ (73/32 → 16/7) | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ (5/2 → 161/64) ⇝ 21/8 | note:C5 gain:0.44 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ (5/2 → 161/64) ⇝ 21/8 | note:Eb5 gain:0.44 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ (5/2 → 161/64) ⇝ 11/4 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ (5/2 → 161/64) ⇝ 11/4 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ (5/2 → 161/64) ⇝ 11/4 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ (5/2 → 161/64) ⇝ 11/4 | note:C5 gain:0.22 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ (5/2 → 161/64) ⇝ 11/4 | note:F2 gain:0.44 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 5/2 ⇜ (161/64 → 81/32) ⇝ 21/8 | note:C5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 5/2 ⇜ (161/64 → 81/32) ⇝ 21/8 | note:Eb5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 5/2 ⇜ (161/64 → 81/32) ⇝ 11/4 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 5/2 ⇜ (161/64 → 81/32) ⇝ 11/4 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/2 ⇜ (161/64 → 81/32) ⇝ 11/4 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 5/2 ⇜ (161/64 → 81/32) ⇝ 11/4 | note:C5 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 5/2 ⇜ (161/64 → 81/32) ⇝ 11/4 | note:F2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 5/2 ⇜ (81/32 → 163/64) ⇝ 21/8 | note:C5 gain:0.64 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 5/2 ⇜ (81/32 → 163/64) ⇝ 21/8 | note:Eb5 gain:0.64 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 5/2 ⇜ (81/32 → 163/64) ⇝ 11/4 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 5/2 ⇜ (81/32 → 163/64) ⇝ 11/4 | note:G4 gain:0.32 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/2 ⇜ (81/32 → 163/64) ⇝ 11/4 | note:Ab4 gain:0.32 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 5/2 ⇜ (81/32 → 163/64) ⇝ 11/4 | note:C5 gain:0.32 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 5/2 ⇜ (81/32 → 163/64) ⇝ 11/4 | note:F2 gain:0.64 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 5/2 ⇜ (163/64 → 41/16) ⇝ 21/8 | note:C5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 5/2 ⇜ (163/64 → 41/16) ⇝ 21/8 | note:Eb5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 5/2 ⇜ (163/64 → 41/16) ⇝ 11/4 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 5/2 ⇜ (163/64 → 41/16) ⇝ 11/4 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/2 ⇜ (163/64 → 41/16) ⇝ 11/4 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 5/2 ⇜ (163/64 → 41/16) ⇝ 11/4 | note:C5 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 5/2 ⇜ (163/64 → 41/16) ⇝ 11/4 | note:F2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 5/2 ⇜ (41/16 → 165/64) ⇝ 21/8 | note:C5 gain:0.44 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 5/2 ⇜ (41/16 → 165/64) ⇝ 21/8 | note:Eb5 gain:0.44 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 5/2 ⇜ (41/16 → 165/64) ⇝ 11/4 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 5/2 ⇜ (41/16 → 165/64) ⇝ 11/4 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/2 ⇜ (41/16 → 165/64) ⇝ 11/4 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 5/2 ⇜ (41/16 → 165/64) ⇝ 11/4 | note:C5 gain:0.22 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 5/2 ⇜ (41/16 → 165/64) ⇝ 11/4 | note:F2 gain:0.44 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 5/2 ⇜ (165/64 → 83/32) ⇝ 21/8 | note:C5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 5/2 ⇜ (165/64 → 83/32) ⇝ 21/8 | note:Eb5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 5/2 ⇜ (165/64 → 83/32) ⇝ 11/4 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 5/2 ⇜ (165/64 → 83/32) ⇝ 11/4 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/2 ⇜ (165/64 → 83/32) ⇝ 11/4 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 5/2 ⇜ (165/64 → 83/32) ⇝ 11/4 | note:C5 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 5/2 ⇜ (165/64 → 83/32) ⇝ 11/4 | note:F2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 5/2 ⇜ (83/32 → 167/64) ⇝ 21/8 | note:C5 gain:0.24 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 5/2 ⇜ (83/32 → 167/64) ⇝ 21/8 | note:Eb5 gain:0.24 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 5/2 ⇜ (83/32 → 167/64) ⇝ 11/4 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 5/2 ⇜ (83/32 → 167/64) ⇝ 11/4 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/2 ⇜ (83/32 → 167/64) ⇝ 11/4 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 5/2 ⇜ (83/32 → 167/64) ⇝ 11/4 | note:C5 gain:0.12 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 5/2 ⇜ (83/32 → 167/64) ⇝ 11/4 | note:F2 gain:0.24 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 5/2 ⇜ (167/64 → 21/8) | note:C5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 5/2 ⇜ (167/64 → 21/8) | note:Eb5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 5/2 ⇜ (167/64 → 21/8) ⇝ 11/4 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 5/2 ⇜ (167/64 → 21/8) ⇝ 11/4 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/2 ⇜ (167/64 → 21/8) ⇝ 11/4 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 5/2 ⇜ (167/64 → 21/8) ⇝ 11/4 | note:C5 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 5/2 ⇜ (167/64 → 21/8) ⇝ 11/4 | note:F2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 5/2 ⇜ (21/8 → 169/64) ⇝ 11/4 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 5/2 ⇜ (21/8 → 169/64) ⇝ 11/4 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/2 ⇜ (21/8 → 169/64) ⇝ 11/4 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 5/2 ⇜ (21/8 → 169/64) ⇝ 11/4 | note:C5 gain:0.22 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 5/2 ⇜ (21/8 → 169/64) ⇝ 11/4 | note:F2 gain:0.44 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 5/2 ⇜ (169/64 → 85/32) ⇝ 11/4 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 5/2 ⇜ (169/64 → 85/32) ⇝ 11/4 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/2 ⇜ (169/64 → 85/32) ⇝ 11/4 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 5/2 ⇜ (169/64 → 85/32) ⇝ 11/4 | note:C5 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 5/2 ⇜ (169/64 → 85/32) ⇝ 11/4 | note:F2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 5/2 ⇜ (85/32 → 171/64) ⇝ 11/4 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 5/2 ⇜ (85/32 → 171/64) ⇝ 11/4 | note:G4 gain:0.32 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/2 ⇜ (85/32 → 171/64) ⇝ 11/4 | note:Ab4 gain:0.32 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 5/2 ⇜ (85/32 → 171/64) ⇝ 11/4 | note:C5 gain:0.32 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 5/2 ⇜ (85/32 → 171/64) ⇝ 11/4 | note:F2 gain:0.64 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 5/2 ⇜ (171/64 → 43/16) ⇝ 11/4 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 5/2 ⇜ (171/64 → 43/16) ⇝ 11/4 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/2 ⇜ (171/64 → 43/16) ⇝ 11/4 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 5/2 ⇜ (171/64 → 43/16) ⇝ 11/4 | note:C5 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 5/2 ⇜ (171/64 → 43/16) ⇝ 11/4 | note:F2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 5/2 ⇜ (43/16 → 173/64) ⇝ 11/4 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 5/2 ⇜ (43/16 → 173/64) ⇝ 11/4 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/2 ⇜ (43/16 → 173/64) ⇝ 11/4 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 5/2 ⇜ (43/16 → 173/64) ⇝ 11/4 | note:C5 gain:0.22 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 5/2 ⇜ (43/16 → 173/64) ⇝ 11/4 | note:F2 gain:0.44 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 5/2 ⇜ (173/64 → 87/32) ⇝ 11/4 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 5/2 ⇜ (173/64 → 87/32) ⇝ 11/4 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/2 ⇜ (173/64 → 87/32) ⇝ 11/4 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 5/2 ⇜ (173/64 → 87/32) ⇝ 11/4 | note:C5 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 5/2 ⇜ (173/64 → 87/32) ⇝ 11/4 | note:F2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 5/2 ⇜ (87/32 → 175/64) ⇝ 11/4 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 5/2 ⇜ (87/32 → 175/64) ⇝ 11/4 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/2 ⇜ (87/32 → 175/64) ⇝ 11/4 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 5/2 ⇜ (87/32 → 175/64) ⇝ 11/4 | note:C5 gain:0.12 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 5/2 ⇜ (87/32 → 175/64) ⇝ 11/4 | note:F2 gain:0.24 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 5/2 ⇜ (175/64 → 11/4) | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 5/2 ⇜ (175/64 → 11/4) | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/2 ⇜ (175/64 → 11/4) | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 5/2 ⇜ (175/64 → 11/4) | note:C5 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 5/2 ⇜ (175/64 → 11/4) | note:F2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ (11/4 → 177/64) ⇝ 23/8 | note:F4 gain:0.44 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ (11/4 → 177/64) ⇝ 23/8 | note:Ab4 gain:0.44 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 11/4 ⇜ (177/64 → 89/32) ⇝ 23/8 | note:F4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 11/4 ⇜ (177/64 → 89/32) ⇝ 23/8 | note:Ab4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 11/4 ⇜ (89/32 → 179/64) ⇝ 23/8 | note:F4 gain:0.64 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 11/4 ⇜ (89/32 → 179/64) ⇝ 23/8 | note:Ab4 gain:0.64 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ (39/14 → 179/64) ⇝ 85/28 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ (39/14 → 179/64) ⇝ 85/28 | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ (39/14 → 179/64) ⇝ 85/28 | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ (39/14 → 179/64) ⇝ 85/28 | note:84 gain:0.064 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 11/4 ⇜ (179/64 → 45/16) ⇝ 23/8 | note:F4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 11/4 ⇜ (179/64 → 45/16) ⇝ 23/8 | note:Ab4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 39/14 ⇜ (179/64 → 45/16) ⇝ 85/28 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 39/14 ⇜ (179/64 → 45/16) ⇝ 85/28 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 39/14 ⇜ (179/64 → 45/16) ⇝ 85/28 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 39/14 ⇜ (179/64 → 45/16) ⇝ 85/28 | note:84 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 11/4 ⇜ (45/16 → 181/64) ⇝ 23/8 | note:F4 gain:0.44 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 11/4 ⇜ (45/16 → 181/64) ⇝ 23/8 | note:Ab4 gain:0.44 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 39/14 ⇜ (45/16 → 181/64) ⇝ 85/28 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 39/14 ⇜ (45/16 → 181/64) ⇝ 85/28 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 39/14 ⇜ (45/16 → 181/64) ⇝ 85/28 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 39/14 ⇜ (45/16 → 181/64) ⇝ 85/28 | note:84 gain:0.044 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 11/4 ⇜ (181/64 → 91/32) ⇝ 23/8 | note:F4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 11/4 ⇜ (181/64 → 91/32) ⇝ 23/8 | note:Ab4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 39/14 ⇜ (181/64 → 91/32) ⇝ 85/28 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 39/14 ⇜ (181/64 → 91/32) ⇝ 85/28 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 39/14 ⇜ (181/64 → 91/32) ⇝ 85/28 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 39/14 ⇜ (181/64 → 91/32) ⇝ 85/28 | note:84 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 11/4 ⇜ (91/32 → 183/64) ⇝ 23/8 | note:F4 gain:0.24 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 11/4 ⇜ (91/32 → 183/64) ⇝ 23/8 | note:Ab4 gain:0.24 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 39/14 ⇜ (91/32 → 183/64) ⇝ 85/28 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 39/14 ⇜ (91/32 → 183/64) ⇝ 85/28 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 39/14 ⇜ (91/32 → 183/64) ⇝ 85/28 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 39/14 ⇜ (91/32 → 183/64) ⇝ 85/28 | note:84 gain:0.024 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 11/4 ⇜ (183/64 → 23/8) | note:F4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 11/4 ⇜ (183/64 → 23/8) | note:Ab4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 39/14 ⇜ (183/64 → 23/8) ⇝ 85/28 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 39/14 ⇜ (183/64 → 23/8) ⇝ 85/28 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 39/14 ⇜ (183/64 → 23/8) ⇝ 85/28 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 39/14 ⇜ (183/64 → 23/8) ⇝ 85/28 | note:84 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 39/14 ⇜ (23/8 → 185/64) ⇝ 85/28 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 39/14 ⇜ (23/8 → 185/64) ⇝ 85/28 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 39/14 ⇜ (23/8 → 185/64) ⇝ 85/28 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 39/14 ⇜ (23/8 → 185/64) ⇝ 85/28 | note:84 gain:0.044 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 39/14 ⇜ (185/64 → 93/32) ⇝ 85/28 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 39/14 ⇜ (185/64 → 93/32) ⇝ 85/28 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 39/14 ⇜ (185/64 → 93/32) ⇝ 85/28 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 39/14 ⇜ (185/64 → 93/32) ⇝ 85/28 | note:84 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 39/14 ⇜ (93/32 → 187/64) ⇝ 85/28 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 39/14 ⇜ (93/32 → 187/64) ⇝ 85/28 | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 39/14 ⇜ (93/32 → 187/64) ⇝ 85/28 | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 39/14 ⇜ (93/32 → 187/64) ⇝ 85/28 | note:84 gain:0.064 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 39/14 ⇜ (187/64 → 47/16) ⇝ 85/28 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 39/14 ⇜ (187/64 → 47/16) ⇝ 85/28 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 39/14 ⇜ (187/64 → 47/16) ⇝ 85/28 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 39/14 ⇜ (187/64 → 47/16) ⇝ 85/28 | note:84 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 39/14 ⇜ (47/16 → 189/64) ⇝ 85/28 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 39/14 ⇜ (47/16 → 189/64) ⇝ 85/28 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 39/14 ⇜ (47/16 → 189/64) ⇝ 85/28 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 39/14 ⇜ (47/16 → 189/64) ⇝ 85/28 | note:84 gain:0.044 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 39/14 ⇜ (189/64 → 95/32) ⇝ 85/28 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 39/14 ⇜ (189/64 → 95/32) ⇝ 85/28 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 39/14 ⇜ (189/64 → 95/32) ⇝ 85/28 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 39/14 ⇜ (189/64 → 95/32) ⇝ 85/28 | note:84 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 39/14 ⇜ (95/32 → 191/64) ⇝ 85/28 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 39/14 ⇜ (95/32 → 191/64) ⇝ 85/28 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 39/14 ⇜ (95/32 → 191/64) ⇝ 85/28 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 39/14 ⇜ (95/32 → 191/64) ⇝ 85/28 | note:84 gain:0.024 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 39/14 ⇜ (191/64 → 3/1) ⇝ 85/28 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 39/14 ⇜ (191/64 → 3/1) ⇝ 85/28 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 39/14 ⇜ (191/64 → 3/1) ⇝ 85/28 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 39/14 ⇜ (191/64 → 3/1) ⇝ 85/28 | note:84 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 39/14 ⇜ (3/1 → 193/64) ⇝ 85/28 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 39/14 ⇜ (3/1 → 193/64) ⇝ 85/28 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 39/14 ⇜ (3/1 → 193/64) ⇝ 85/28 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 39/14 ⇜ (3/1 → 193/64) ⇝ 85/28 | note:84 gain:0.044 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ (3/1 → 193/64) ⇝ 13/4 | note:F2 gain:0.44 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 39/14 ⇜ (193/64 → 97/32) ⇝ 85/28 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 39/14 ⇜ (193/64 → 97/32) ⇝ 85/28 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 39/14 ⇜ (193/64 → 97/32) ⇝ 85/28 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 39/14 ⇜ (193/64 → 97/32) ⇝ 85/28 | note:84 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 3/1 ⇜ (193/64 → 97/32) ⇝ 13/4 | note:F2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 39/14 ⇜ (97/32 → 85/28) | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 39/14 ⇜ (97/32 → 85/28) | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 39/14 ⇜ (97/32 → 85/28) | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 39/14 ⇜ (97/32 → 85/28) | note:84 gain:0.064 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 3/1 ⇜ (97/32 → 195/64) ⇝ 13/4 | note:F2 gain:0.64 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 3/1 ⇜ (195/64 → 49/16) ⇝ 13/4 | note:F2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 3/1 ⇜ (49/16 → 197/64) ⇝ 13/4 | note:F2 gain:0.44 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 3/1 ⇜ (197/64 → 99/32) ⇝ 13/4 | note:F2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 3/1 ⇜ (99/32 → 199/64) ⇝ 13/4 | note:F2 gain:0.24 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 3/1 ⇜ (199/64 → 25/8) ⇝ 13/4 | note:F2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 3/1 ⇜ (25/8 → 201/64) ⇝ 13/4 | note:F2 gain:0.44 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ (25/8 → 201/64) ⇝ 13/4 | note:F4 gain:0.44 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ (25/8 → 201/64) ⇝ 13/4 | note:Ab4 gain:0.44 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 3/1 ⇜ (201/64 → 101/32) ⇝ 13/4 | note:F2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 25/8 ⇜ (201/64 → 101/32) ⇝ 13/4 | note:F4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 25/8 ⇜ (201/64 → 101/32) ⇝ 13/4 | note:Ab4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 3/1 ⇜ (101/32 → 203/64) ⇝ 13/4 | note:F2 gain:0.64 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 25/8 ⇜ (101/32 → 203/64) ⇝ 13/4 | note:F4 gain:0.64 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 25/8 ⇜ (101/32 → 203/64) ⇝ 13/4 | note:Ab4 gain:0.64 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 3/1 ⇜ (203/64 → 51/16) ⇝ 13/4 | note:F2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 25/8 ⇜ (203/64 → 51/16) ⇝ 13/4 | note:F4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 25/8 ⇜ (203/64 → 51/16) ⇝ 13/4 | note:Ab4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 3/1 ⇜ (51/16 → 205/64) ⇝ 13/4 | note:F2 gain:0.44 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 25/8 ⇜ (51/16 → 205/64) ⇝ 13/4 | note:F4 gain:0.44 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 25/8 ⇜ (51/16 → 205/64) ⇝ 13/4 | note:Ab4 gain:0.44 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 3/1 ⇜ (205/64 → 103/32) ⇝ 13/4 | note:F2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 25/8 ⇜ (205/64 → 103/32) ⇝ 13/4 | note:F4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 25/8 ⇜ (205/64 → 103/32) ⇝ 13/4 | note:Ab4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 3/1 ⇜ (103/32 → 207/64) ⇝ 13/4 | note:F2 gain:0.24 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 25/8 ⇜ (103/32 → 207/64) ⇝ 13/4 | note:F4 gain:0.24 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 25/8 ⇜ (103/32 → 207/64) ⇝ 13/4 | note:Ab4 gain:0.24 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 3/1 ⇜ (207/64 → 13/4) | note:F2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 25/8 ⇜ (207/64 → 13/4) | note:F4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 25/8 ⇜ (207/64 → 13/4) | note:Ab4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ (13/4 → 209/64) ⇝ 7/2 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ (13/4 → 209/64) ⇝ 7/2 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ (13/4 → 209/64) ⇝ 7/2 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ (13/4 → 209/64) ⇝ 7/2 | note:C5 gain:0.22 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 13/4 ⇜ (209/64 → 105/32) ⇝ 7/2 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 13/4 ⇜ (209/64 → 105/32) ⇝ 7/2 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 13/4 ⇜ (209/64 → 105/32) ⇝ 7/2 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 13/4 ⇜ (209/64 → 105/32) ⇝ 7/2 | note:C5 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 13/4 ⇜ (105/32 → 211/64) ⇝ 7/2 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 13/4 ⇜ (105/32 → 211/64) ⇝ 7/2 | note:G4 gain:0.32 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 13/4 ⇜ (105/32 → 211/64) ⇝ 7/2 | note:Ab4 gain:0.32 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 13/4 ⇜ (105/32 → 211/64) ⇝ 7/2 | note:C5 gain:0.32 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 13/4 ⇜ (211/64 → 53/16) ⇝ 7/2 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 13/4 ⇜ (211/64 → 53/16) ⇝ 7/2 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 13/4 ⇜ (211/64 → 53/16) ⇝ 7/2 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 13/4 ⇜ (211/64 → 53/16) ⇝ 7/2 | note:C5 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 13/4 ⇜ (53/16 → 213/64) ⇝ 7/2 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 13/4 ⇜ (53/16 → 213/64) ⇝ 7/2 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 13/4 ⇜ (53/16 → 213/64) ⇝ 7/2 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 13/4 ⇜ (53/16 → 213/64) ⇝ 7/2 | note:C5 gain:0.22 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 13/4 ⇜ (213/64 → 107/32) ⇝ 7/2 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 13/4 ⇜ (213/64 → 107/32) ⇝ 7/2 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 13/4 ⇜ (213/64 → 107/32) ⇝ 7/2 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 13/4 ⇜ (213/64 → 107/32) ⇝ 7/2 | note:C5 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 13/4 ⇜ (107/32 → 215/64) ⇝ 7/2 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 13/4 ⇜ (107/32 → 215/64) ⇝ 7/2 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 13/4 ⇜ (107/32 → 215/64) ⇝ 7/2 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 13/4 ⇜ (107/32 → 215/64) ⇝ 7/2 | note:C5 gain:0.12 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 13/4 ⇜ (215/64 → 27/8) ⇝ 7/2 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 13/4 ⇜ (215/64 → 27/8) ⇝ 7/2 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 13/4 ⇜ (215/64 → 27/8) ⇝ 7/2 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 13/4 ⇜ (215/64 → 27/8) ⇝ 7/2 | note:C5 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 13/4 ⇜ (27/8 → 217/64) ⇝ 7/2 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 13/4 ⇜ (27/8 → 217/64) ⇝ 7/2 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 13/4 ⇜ (27/8 → 217/64) ⇝ 7/2 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 13/4 ⇜ (27/8 → 217/64) ⇝ 7/2 | note:C5 gain:0.22 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 13/4 ⇜ (217/64 → 109/32) ⇝ 7/2 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 13/4 ⇜ (217/64 → 109/32) ⇝ 7/2 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 13/4 ⇜ (217/64 → 109/32) ⇝ 7/2 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 13/4 ⇜ (217/64 → 109/32) ⇝ 7/2 | note:C5 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 13/4 ⇜ (109/32 → 219/64) ⇝ 7/2 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 13/4 ⇜ (109/32 → 219/64) ⇝ 7/2 | note:G4 gain:0.32 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 13/4 ⇜ (109/32 → 219/64) ⇝ 7/2 | note:Ab4 gain:0.32 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 13/4 ⇜ (109/32 → 219/64) ⇝ 7/2 | note:C5 gain:0.32 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 13/4 ⇜ (219/64 → 55/16) ⇝ 7/2 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 13/4 ⇜ (219/64 → 55/16) ⇝ 7/2 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 13/4 ⇜ (219/64 → 55/16) ⇝ 7/2 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 13/4 ⇜ (219/64 → 55/16) ⇝ 7/2 | note:C5 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 13/4 ⇜ (55/16 → 221/64) ⇝ 7/2 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 13/4 ⇜ (55/16 → 221/64) ⇝ 7/2 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 13/4 ⇜ (55/16 → 221/64) ⇝ 7/2 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 13/4 ⇜ (55/16 → 221/64) ⇝ 7/2 | note:C5 gain:0.22 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 13/4 ⇜ (221/64 → 111/32) ⇝ 7/2 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 13/4 ⇜ (221/64 → 111/32) ⇝ 7/2 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 13/4 ⇜ (221/64 → 111/32) ⇝ 7/2 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 13/4 ⇜ (221/64 → 111/32) ⇝ 7/2 | note:C5 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 13/4 ⇜ (111/32 → 223/64) ⇝ 7/2 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 13/4 ⇜ (111/32 → 223/64) ⇝ 7/2 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 13/4 ⇜ (111/32 → 223/64) ⇝ 7/2 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 13/4 ⇜ (111/32 → 223/64) ⇝ 7/2 | note:C5 gain:0.12 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 13/4 ⇜ (223/64 → 7/2) | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 13/4 ⇜ (223/64 → 7/2) | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 13/4 ⇜ (223/64 → 7/2) | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 13/4 ⇜ (223/64 → 7/2) | note:C5 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ (7/2 → 225/64) ⇝ 29/8 | note:C5 gain:0.44 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ (7/2 → 225/64) ⇝ 29/8 | note:Eb5 gain:0.44 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ (7/2 → 225/64) ⇝ 15/4 | note:F2 gain:0.44 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 7/2 ⇜ (225/64 → 113/32) ⇝ 29/8 | note:C5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 7/2 ⇜ (225/64 → 113/32) ⇝ 29/8 | note:Eb5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 7/2 ⇜ (225/64 → 113/32) ⇝ 15/4 | note:F2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 7/2 ⇜ (113/32 → 227/64) ⇝ 29/8 | note:C5 gain:0.64 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 7/2 ⇜ (113/32 → 227/64) ⇝ 29/8 | note:Eb5 gain:0.64 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 7/2 ⇜ (113/32 → 227/64) ⇝ 15/4 | note:F2 gain:0.64 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ (99/28 → 227/64) ⇝ 53/14 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ (99/28 → 227/64) ⇝ 53/14 | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ (99/28 → 227/64) ⇝ 53/14 | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ (99/28 → 227/64) ⇝ 53/14 | note:84 gain:0.064 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 7/2 ⇜ (227/64 → 57/16) ⇝ 29/8 | note:C5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 7/2 ⇜ (227/64 → 57/16) ⇝ 29/8 | note:Eb5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 7/2 ⇜ (227/64 → 57/16) ⇝ 15/4 | note:F2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 99/28 ⇜ (227/64 → 57/16) ⇝ 53/14 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 99/28 ⇜ (227/64 → 57/16) ⇝ 53/14 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 99/28 ⇜ (227/64 → 57/16) ⇝ 53/14 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 99/28 ⇜ (227/64 → 57/16) ⇝ 53/14 | note:84 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 7/2 ⇜ (57/16 → 229/64) ⇝ 29/8 | note:C5 gain:0.44 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 7/2 ⇜ (57/16 → 229/64) ⇝ 29/8 | note:Eb5 gain:0.44 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 7/2 ⇜ (57/16 → 229/64) ⇝ 15/4 | note:F2 gain:0.44 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 99/28 ⇜ (57/16 → 229/64) ⇝ 53/14 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 99/28 ⇜ (57/16 → 229/64) ⇝ 53/14 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 99/28 ⇜ (57/16 → 229/64) ⇝ 53/14 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 99/28 ⇜ (57/16 → 229/64) ⇝ 53/14 | note:84 gain:0.044 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 7/2 ⇜ (229/64 → 115/32) ⇝ 29/8 | note:C5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 7/2 ⇜ (229/64 → 115/32) ⇝ 29/8 | note:Eb5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 7/2 ⇜ (229/64 → 115/32) ⇝ 15/4 | note:F2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 99/28 ⇜ (229/64 → 115/32) ⇝ 53/14 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 99/28 ⇜ (229/64 → 115/32) ⇝ 53/14 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 99/28 ⇜ (229/64 → 115/32) ⇝ 53/14 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 99/28 ⇜ (229/64 → 115/32) ⇝ 53/14 | note:84 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 7/2 ⇜ (115/32 → 231/64) ⇝ 29/8 | note:C5 gain:0.24 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 7/2 ⇜ (115/32 → 231/64) ⇝ 29/8 | note:Eb5 gain:0.24 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 7/2 ⇜ (115/32 → 231/64) ⇝ 15/4 | note:F2 gain:0.24 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 99/28 ⇜ (115/32 → 231/64) ⇝ 53/14 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 99/28 ⇜ (115/32 → 231/64) ⇝ 53/14 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 99/28 ⇜ (115/32 → 231/64) ⇝ 53/14 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 99/28 ⇜ (115/32 → 231/64) ⇝ 53/14 | note:84 gain:0.024 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 7/2 ⇜ (231/64 → 29/8) | note:C5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 7/2 ⇜ (231/64 → 29/8) | note:Eb5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 7/2 ⇜ (231/64 → 29/8) ⇝ 15/4 | note:F2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 99/28 ⇜ (231/64 → 29/8) ⇝ 53/14 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 99/28 ⇜ (231/64 → 29/8) ⇝ 53/14 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 99/28 ⇜ (231/64 → 29/8) ⇝ 53/14 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 99/28 ⇜ (231/64 → 29/8) ⇝ 53/14 | note:84 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 7/2 ⇜ (29/8 → 233/64) ⇝ 15/4 | note:F2 gain:0.44 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 99/28 ⇜ (29/8 → 233/64) ⇝ 53/14 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 99/28 ⇜ (29/8 → 233/64) ⇝ 53/14 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 99/28 ⇜ (29/8 → 233/64) ⇝ 53/14 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 99/28 ⇜ (29/8 → 233/64) ⇝ 53/14 | note:84 gain:0.044 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 7/2 ⇜ (233/64 → 117/32) ⇝ 15/4 | note:F2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 99/28 ⇜ (233/64 → 117/32) ⇝ 53/14 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 99/28 ⇜ (233/64 → 117/32) ⇝ 53/14 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 99/28 ⇜ (233/64 → 117/32) ⇝ 53/14 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 99/28 ⇜ (233/64 → 117/32) ⇝ 53/14 | note:84 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 7/2 ⇜ (117/32 → 235/64) ⇝ 15/4 | note:F2 gain:0.64 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 99/28 ⇜ (117/32 → 235/64) ⇝ 53/14 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 99/28 ⇜ (117/32 → 235/64) ⇝ 53/14 | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 99/28 ⇜ (117/32 → 235/64) ⇝ 53/14 | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 99/28 ⇜ (117/32 → 235/64) ⇝ 53/14 | note:84 gain:0.064 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 7/2 ⇜ (235/64 → 59/16) ⇝ 15/4 | note:F2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 99/28 ⇜ (235/64 → 59/16) ⇝ 53/14 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 99/28 ⇜ (235/64 → 59/16) ⇝ 53/14 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 99/28 ⇜ (235/64 → 59/16) ⇝ 53/14 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 99/28 ⇜ (235/64 → 59/16) ⇝ 53/14 | note:84 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 7/2 ⇜ (59/16 → 237/64) ⇝ 15/4 | note:F2 gain:0.44 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 99/28 ⇜ (59/16 → 237/64) ⇝ 53/14 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 99/28 ⇜ (59/16 → 237/64) ⇝ 53/14 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 99/28 ⇜ (59/16 → 237/64) ⇝ 53/14 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 99/28 ⇜ (59/16 → 237/64) ⇝ 53/14 | note:84 gain:0.044 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 7/2 ⇜ (237/64 → 119/32) ⇝ 15/4 | note:F2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 99/28 ⇜ (237/64 → 119/32) ⇝ 53/14 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 99/28 ⇜ (237/64 → 119/32) ⇝ 53/14 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 99/28 ⇜ (237/64 → 119/32) ⇝ 53/14 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 99/28 ⇜ (237/64 → 119/32) ⇝ 53/14 | note:84 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 7/2 ⇜ (119/32 → 239/64) ⇝ 15/4 | note:F2 gain:0.24 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 99/28 ⇜ (119/32 → 239/64) ⇝ 53/14 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 99/28 ⇜ (119/32 → 239/64) ⇝ 53/14 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 99/28 ⇜ (119/32 → 239/64) ⇝ 53/14 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 99/28 ⇜ (119/32 → 239/64) ⇝ 53/14 | note:84 gain:0.024 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 7/2 ⇜ (239/64 → 15/4) | note:F2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 99/28 ⇜ (239/64 → 15/4) ⇝ 53/14 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 99/28 ⇜ (239/64 → 15/4) ⇝ 53/14 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 99/28 ⇜ (239/64 → 15/4) ⇝ 53/14 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 99/28 ⇜ (239/64 → 15/4) ⇝ 53/14 | note:84 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 99/28 ⇜ (15/4 → 241/64) ⇝ 53/14 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 99/28 ⇜ (15/4 → 241/64) ⇝ 53/14 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 99/28 ⇜ (15/4 → 241/64) ⇝ 53/14 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 99/28 ⇜ (15/4 → 241/64) ⇝ 53/14 | note:84 gain:0.044 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ (15/4 → 241/64) ⇝ 31/8 | note:C5 gain:0.44 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ (15/4 → 241/64) ⇝ 31/8 | note:Eb5 gain:0.44 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ (15/4 → 241/64) ⇝ 4/1 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ (15/4 → 241/64) ⇝ 4/1 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ (15/4 → 241/64) ⇝ 4/1 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ (15/4 → 241/64) ⇝ 4/1 | note:C5 gain:0.22 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 99/28 ⇜ (241/64 → 121/32) ⇝ 53/14 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 99/28 ⇜ (241/64 → 121/32) ⇝ 53/14 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 99/28 ⇜ (241/64 → 121/32) ⇝ 53/14 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 99/28 ⇜ (241/64 → 121/32) ⇝ 53/14 | note:84 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 15/4 ⇜ (241/64 → 121/32) ⇝ 31/8 | note:C5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 15/4 ⇜ (241/64 → 121/32) ⇝ 31/8 | note:Eb5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 15/4 ⇜ (241/64 → 121/32) ⇝ 4/1 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 15/4 ⇜ (241/64 → 121/32) ⇝ 4/1 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 15/4 ⇜ (241/64 → 121/32) ⇝ 4/1 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 15/4 ⇜ (241/64 → 121/32) ⇝ 4/1 | note:C5 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 99/28 ⇜ (121/32 → 53/14) | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 99/28 ⇜ (121/32 → 53/14) | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 99/28 ⇜ (121/32 → 53/14) | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 99/28 ⇜ (121/32 → 53/14) | note:84 gain:0.064 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 15/4 ⇜ (121/32 → 243/64) ⇝ 31/8 | note:C5 gain:0.64 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 15/4 ⇜ (121/32 → 243/64) ⇝ 31/8 | note:Eb5 gain:0.64 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 15/4 ⇜ (121/32 → 243/64) ⇝ 4/1 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 15/4 ⇜ (121/32 → 243/64) ⇝ 4/1 | note:G4 gain:0.32 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 15/4 ⇜ (121/32 → 243/64) ⇝ 4/1 | note:Ab4 gain:0.32 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 15/4 ⇜ (121/32 → 243/64) ⇝ 4/1 | note:C5 gain:0.32 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 15/4 ⇜ (243/64 → 61/16) ⇝ 31/8 | note:C5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 15/4 ⇜ (243/64 → 61/16) ⇝ 31/8 | note:Eb5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 15/4 ⇜ (243/64 → 61/16) ⇝ 4/1 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 15/4 ⇜ (243/64 → 61/16) ⇝ 4/1 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 15/4 ⇜ (243/64 → 61/16) ⇝ 4/1 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 15/4 ⇜ (243/64 → 61/16) ⇝ 4/1 | note:C5 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 15/4 ⇜ (61/16 → 245/64) ⇝ 31/8 | note:C5 gain:0.44 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 15/4 ⇜ (61/16 → 245/64) ⇝ 31/8 | note:Eb5 gain:0.44 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 15/4 ⇜ (61/16 → 245/64) ⇝ 4/1 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 15/4 ⇜ (61/16 → 245/64) ⇝ 4/1 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 15/4 ⇜ (61/16 → 245/64) ⇝ 4/1 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 15/4 ⇜ (61/16 → 245/64) ⇝ 4/1 | note:C5 gain:0.22 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 15/4 ⇜ (245/64 → 123/32) ⇝ 31/8 | note:C5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 15/4 ⇜ (245/64 → 123/32) ⇝ 31/8 | note:Eb5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 15/4 ⇜ (245/64 → 123/32) ⇝ 4/1 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 15/4 ⇜ (245/64 → 123/32) ⇝ 4/1 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 15/4 ⇜ (245/64 → 123/32) ⇝ 4/1 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 15/4 ⇜ (245/64 → 123/32) ⇝ 4/1 | note:C5 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 15/4 ⇜ (123/32 → 247/64) ⇝ 31/8 | note:C5 gain:0.24 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 15/4 ⇜ (123/32 → 247/64) ⇝ 31/8 | note:Eb5 gain:0.24 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 15/4 ⇜ (123/32 → 247/64) ⇝ 4/1 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 15/4 ⇜ (123/32 → 247/64) ⇝ 4/1 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 15/4 ⇜ (123/32 → 247/64) ⇝ 4/1 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 15/4 ⇜ (123/32 → 247/64) ⇝ 4/1 | note:C5 gain:0.12 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 15/4 ⇜ (247/64 → 31/8) | note:C5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 15/4 ⇜ (247/64 → 31/8) | note:Eb5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 15/4 ⇜ (247/64 → 31/8) ⇝ 4/1 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 15/4 ⇜ (247/64 → 31/8) ⇝ 4/1 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 15/4 ⇜ (247/64 → 31/8) ⇝ 4/1 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 15/4 ⇜ (247/64 → 31/8) ⇝ 4/1 | note:C5 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 15/4 ⇜ (31/8 → 249/64) ⇝ 4/1 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 15/4 ⇜ (31/8 → 249/64) ⇝ 4/1 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 15/4 ⇜ (31/8 → 249/64) ⇝ 4/1 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 15/4 ⇜ (31/8 → 249/64) ⇝ 4/1 | note:C5 gain:0.22 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 15/4 ⇜ (249/64 → 125/32) ⇝ 4/1 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 15/4 ⇜ (249/64 → 125/32) ⇝ 4/1 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 15/4 ⇜ (249/64 → 125/32) ⇝ 4/1 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 15/4 ⇜ (249/64 → 125/32) ⇝ 4/1 | note:C5 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 15/4 ⇜ (125/32 → 251/64) ⇝ 4/1 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 15/4 ⇜ (125/32 → 251/64) ⇝ 4/1 | note:G4 gain:0.32 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 15/4 ⇜ (125/32 → 251/64) ⇝ 4/1 | note:Ab4 gain:0.32 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 15/4 ⇜ (125/32 → 251/64) ⇝ 4/1 | note:C5 gain:0.32 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 15/4 ⇜ (251/64 → 63/16) ⇝ 4/1 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 15/4 ⇜ (251/64 → 63/16) ⇝ 4/1 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 15/4 ⇜ (251/64 → 63/16) ⇝ 4/1 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 15/4 ⇜ (251/64 → 63/16) ⇝ 4/1 | note:C5 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 15/4 ⇜ (63/16 → 253/64) ⇝ 4/1 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 15/4 ⇜ (63/16 → 253/64) ⇝ 4/1 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 15/4 ⇜ (63/16 → 253/64) ⇝ 4/1 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 15/4 ⇜ (63/16 → 253/64) ⇝ 4/1 | note:C5 gain:0.22 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 15/4 ⇜ (253/64 → 127/32) ⇝ 4/1 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 15/4 ⇜ (253/64 → 127/32) ⇝ 4/1 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 15/4 ⇜ (253/64 → 127/32) ⇝ 4/1 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 15/4 ⇜ (253/64 → 127/32) ⇝ 4/1 | note:C5 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 15/4 ⇜ (127/32 → 255/64) ⇝ 4/1 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 15/4 ⇜ (127/32 → 255/64) ⇝ 4/1 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 15/4 ⇜ (127/32 → 255/64) ⇝ 4/1 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 15/4 ⇜ (127/32 → 255/64) ⇝ 4/1 | note:C5 gain:0.12 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 15/4 ⇜ (255/64 → 4/1) | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 15/4 ⇜ (255/64 → 4/1) | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 15/4 ⇜ (255/64 → 4/1) | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 15/4 ⇜ (255/64 → 4/1) | note:C5 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ (4/1 → 257/64) ⇝ 17/4 | note:G2 gain:0.44 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 4/1 ⇜ (257/64 → 129/32) ⇝ 17/4 | note:G2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 4/1 ⇜ (129/32 → 259/64) ⇝ 17/4 | note:G2 gain:0.64 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ (113/28 → 259/64) ⇝ 30/7 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ (113/28 → 259/64) ⇝ 30/7 | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ (113/28 → 259/64) ⇝ 30/7 | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ (113/28 → 259/64) ⇝ 30/7 | note:84 gain:0.064 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 4/1 ⇜ (259/64 → 65/16) ⇝ 17/4 | note:G2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 113/28 ⇜ (259/64 → 65/16) ⇝ 30/7 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 113/28 ⇜ (259/64 → 65/16) ⇝ 30/7 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 113/28 ⇜ (259/64 → 65/16) ⇝ 30/7 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 113/28 ⇜ (259/64 → 65/16) ⇝ 30/7 | note:84 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 4/1 ⇜ (65/16 → 261/64) ⇝ 17/4 | note:G2 gain:0.44 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 113/28 ⇜ (65/16 → 261/64) ⇝ 30/7 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 113/28 ⇜ (65/16 → 261/64) ⇝ 30/7 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 113/28 ⇜ (65/16 → 261/64) ⇝ 30/7 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 113/28 ⇜ (65/16 → 261/64) ⇝ 30/7 | note:84 gain:0.044 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 4/1 ⇜ (261/64 → 131/32) ⇝ 17/4 | note:G2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 113/28 ⇜ (261/64 → 131/32) ⇝ 30/7 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 113/28 ⇜ (261/64 → 131/32) ⇝ 30/7 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 113/28 ⇜ (261/64 → 131/32) ⇝ 30/7 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 113/28 ⇜ (261/64 → 131/32) ⇝ 30/7 | note:84 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 4/1 ⇜ (131/32 → 263/64) ⇝ 17/4 | note:G2 gain:0.24 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 113/28 ⇜ (131/32 → 263/64) ⇝ 30/7 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 113/28 ⇜ (131/32 → 263/64) ⇝ 30/7 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 113/28 ⇜ (131/32 → 263/64) ⇝ 30/7 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 113/28 ⇜ (131/32 → 263/64) ⇝ 30/7 | note:84 gain:0.024 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 4/1 ⇜ (263/64 → 33/8) ⇝ 17/4 | note:G2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 113/28 ⇜ (263/64 → 33/8) ⇝ 30/7 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 113/28 ⇜ (263/64 → 33/8) ⇝ 30/7 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 113/28 ⇜ (263/64 → 33/8) ⇝ 30/7 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 113/28 ⇜ (263/64 → 33/8) ⇝ 30/7 | note:84 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 4/1 ⇜ (33/8 → 265/64) ⇝ 17/4 | note:G2 gain:0.44 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 113/28 ⇜ (33/8 → 265/64) ⇝ 30/7 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 113/28 ⇜ (33/8 → 265/64) ⇝ 30/7 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 113/28 ⇜ (33/8 → 265/64) ⇝ 30/7 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 113/28 ⇜ (33/8 → 265/64) ⇝ 30/7 | note:84 gain:0.044 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ (33/8 → 265/64) ⇝ 17/4 | note:G4 gain:0.44 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ (33/8 → 265/64) ⇝ 17/4 | note:Bb4 gain:0.44 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 4/1 ⇜ (265/64 → 133/32) ⇝ 17/4 | note:G2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 113/28 ⇜ (265/64 → 133/32) ⇝ 30/7 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 113/28 ⇜ (265/64 → 133/32) ⇝ 30/7 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 113/28 ⇜ (265/64 → 133/32) ⇝ 30/7 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 113/28 ⇜ (265/64 → 133/32) ⇝ 30/7 | note:84 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 33/8 ⇜ (265/64 → 133/32) ⇝ 17/4 | note:G4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 33/8 ⇜ (265/64 → 133/32) ⇝ 17/4 | note:Bb4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 4/1 ⇜ (133/32 → 267/64) ⇝ 17/4 | note:G2 gain:0.64 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 113/28 ⇜ (133/32 → 267/64) ⇝ 30/7 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 113/28 ⇜ (133/32 → 267/64) ⇝ 30/7 | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 113/28 ⇜ (133/32 → 267/64) ⇝ 30/7 | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 113/28 ⇜ (133/32 → 267/64) ⇝ 30/7 | note:84 gain:0.064 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 33/8 ⇜ (133/32 → 267/64) ⇝ 17/4 | note:G4 gain:0.64 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 33/8 ⇜ (133/32 → 267/64) ⇝ 17/4 | note:Bb4 gain:0.64 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 4/1 ⇜ (267/64 → 67/16) ⇝ 17/4 | note:G2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 113/28 ⇜ (267/64 → 67/16) ⇝ 30/7 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 113/28 ⇜ (267/64 → 67/16) ⇝ 30/7 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 113/28 ⇜ (267/64 → 67/16) ⇝ 30/7 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 113/28 ⇜ (267/64 → 67/16) ⇝ 30/7 | note:84 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 33/8 ⇜ (267/64 → 67/16) ⇝ 17/4 | note:G4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 33/8 ⇜ (267/64 → 67/16) ⇝ 17/4 | note:Bb4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 4/1 ⇜ (67/16 → 269/64) ⇝ 17/4 | note:G2 gain:0.44 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 113/28 ⇜ (67/16 → 269/64) ⇝ 30/7 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 113/28 ⇜ (67/16 → 269/64) ⇝ 30/7 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 113/28 ⇜ (67/16 → 269/64) ⇝ 30/7 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 113/28 ⇜ (67/16 → 269/64) ⇝ 30/7 | note:84 gain:0.044 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 33/8 ⇜ (67/16 → 269/64) ⇝ 17/4 | note:G4 gain:0.44 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 33/8 ⇜ (67/16 → 269/64) ⇝ 17/4 | note:Bb4 gain:0.44 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 4/1 ⇜ (269/64 → 135/32) ⇝ 17/4 | note:G2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 113/28 ⇜ (269/64 → 135/32) ⇝ 30/7 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 113/28 ⇜ (269/64 → 135/32) ⇝ 30/7 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 113/28 ⇜ (269/64 → 135/32) ⇝ 30/7 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 113/28 ⇜ (269/64 → 135/32) ⇝ 30/7 | note:84 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 33/8 ⇜ (269/64 → 135/32) ⇝ 17/4 | note:G4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 33/8 ⇜ (269/64 → 135/32) ⇝ 17/4 | note:Bb4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 4/1 ⇜ (135/32 → 271/64) ⇝ 17/4 | note:G2 gain:0.24 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 113/28 ⇜ (135/32 → 271/64) ⇝ 30/7 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 113/28 ⇜ (135/32 → 271/64) ⇝ 30/7 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 113/28 ⇜ (135/32 → 271/64) ⇝ 30/7 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 113/28 ⇜ (135/32 → 271/64) ⇝ 30/7 | note:84 gain:0.024 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 33/8 ⇜ (135/32 → 271/64) ⇝ 17/4 | note:G4 gain:0.24 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 33/8 ⇜ (135/32 → 271/64) ⇝ 17/4 | note:Bb4 gain:0.24 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 4/1 ⇜ (271/64 → 17/4) | note:G2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 113/28 ⇜ (271/64 → 17/4) ⇝ 30/7 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 113/28 ⇜ (271/64 → 17/4) ⇝ 30/7 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 113/28 ⇜ (271/64 → 17/4) ⇝ 30/7 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 113/28 ⇜ (271/64 → 17/4) ⇝ 30/7 | note:84 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 33/8 ⇜ (271/64 → 17/4) | note:G4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 33/8 ⇜ (271/64 → 17/4) | note:Bb4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 113/28 ⇜ (17/4 → 273/64) ⇝ 30/7 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 113/28 ⇜ (17/4 → 273/64) ⇝ 30/7 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 113/28 ⇜ (17/4 → 273/64) ⇝ 30/7 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 113/28 ⇜ (17/4 → 273/64) ⇝ 30/7 | note:84 gain:0.044 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 113/28 ⇜ (273/64 → 137/32) ⇝ 30/7 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 113/28 ⇜ (273/64 → 137/32) ⇝ 30/7 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 113/28 ⇜ (273/64 → 137/32) ⇝ 30/7 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 113/28 ⇜ (273/64 → 137/32) ⇝ 30/7 | note:84 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 113/28 ⇜ (137/32 → 30/7) | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 113/28 ⇜ (137/32 → 30/7) | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 113/28 ⇜ (137/32 → 30/7) | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 113/28 ⇜ (137/32 → 30/7) | note:84 gain:0.064 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ (9/2 → 289/64) ⇝ 37/8 | note:D5 gain:0.44 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ (9/2 → 289/64) ⇝ 37/8 | note:F5 gain:0.44 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ (9/2 → 289/64) ⇝ 19/4 | note:B3 gain:0.22 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ (9/2 → 289/64) ⇝ 19/4 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (9/2 → 289/64) ⇝ 19/4 | note:F4 gain:0.22 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ (9/2 → 289/64) ⇝ 19/4 | note:A4 gain:0.22 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ (9/2 → 289/64) ⇝ 19/4 | note:G2 gain:0.44 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 9/2 ⇜ (289/64 → 145/32) ⇝ 37/8 | note:D5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 9/2 ⇜ (289/64 → 145/32) ⇝ 37/8 | note:F5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 9/2 ⇜ (289/64 → 145/32) ⇝ 19/4 | note:B3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 9/2 ⇜ (289/64 → 145/32) ⇝ 19/4 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 9/2 ⇜ (289/64 → 145/32) ⇝ 19/4 | note:F4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 9/2 ⇜ (289/64 → 145/32) ⇝ 19/4 | note:A4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 9/2 ⇜ (289/64 → 145/32) ⇝ 19/4 | note:G2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 9/2 ⇜ (145/32 → 291/64) ⇝ 37/8 | note:D5 gain:0.64 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 9/2 ⇜ (145/32 → 291/64) ⇝ 37/8 | note:F5 gain:0.64 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 9/2 ⇜ (145/32 → 291/64) ⇝ 19/4 | note:B3 gain:0.32 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 9/2 ⇜ (145/32 → 291/64) ⇝ 19/4 | note:E4 gain:0.32 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 9/2 ⇜ (145/32 → 291/64) ⇝ 19/4 | note:F4 gain:0.32 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 9/2 ⇜ (145/32 → 291/64) ⇝ 19/4 | note:A4 gain:0.32 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 9/2 ⇜ (145/32 → 291/64) ⇝ 19/4 | note:G2 gain:0.64 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 9/2 ⇜ (291/64 → 73/16) ⇝ 37/8 | note:D5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 9/2 ⇜ (291/64 → 73/16) ⇝ 37/8 | note:F5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 9/2 ⇜ (291/64 → 73/16) ⇝ 19/4 | note:B3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 9/2 ⇜ (291/64 → 73/16) ⇝ 19/4 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 9/2 ⇜ (291/64 → 73/16) ⇝ 19/4 | note:F4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 9/2 ⇜ (291/64 → 73/16) ⇝ 19/4 | note:A4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 9/2 ⇜ (291/64 → 73/16) ⇝ 19/4 | note:G2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 9/2 ⇜ (73/16 → 293/64) ⇝ 37/8 | note:D5 gain:0.44 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 9/2 ⇜ (73/16 → 293/64) ⇝ 37/8 | note:F5 gain:0.44 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 9/2 ⇜ (73/16 → 293/64) ⇝ 19/4 | note:B3 gain:0.22 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 9/2 ⇜ (73/16 → 293/64) ⇝ 19/4 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 9/2 ⇜ (73/16 → 293/64) ⇝ 19/4 | note:F4 gain:0.22 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 9/2 ⇜ (73/16 → 293/64) ⇝ 19/4 | note:A4 gain:0.22 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 9/2 ⇜ (73/16 → 293/64) ⇝ 19/4 | note:G2 gain:0.44 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 9/2 ⇜ (293/64 → 147/32) ⇝ 37/8 | note:D5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 9/2 ⇜ (293/64 → 147/32) ⇝ 37/8 | note:F5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 9/2 ⇜ (293/64 → 147/32) ⇝ 19/4 | note:B3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 9/2 ⇜ (293/64 → 147/32) ⇝ 19/4 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 9/2 ⇜ (293/64 → 147/32) ⇝ 19/4 | note:F4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 9/2 ⇜ (293/64 → 147/32) ⇝ 19/4 | note:A4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 9/2 ⇜ (293/64 → 147/32) ⇝ 19/4 | note:G2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 9/2 ⇜ (147/32 → 295/64) ⇝ 37/8 | note:D5 gain:0.24 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 9/2 ⇜ (147/32 → 295/64) ⇝ 37/8 | note:F5 gain:0.24 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 9/2 ⇜ (147/32 → 295/64) ⇝ 19/4 | note:B3 gain:0.12 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 9/2 ⇜ (147/32 → 295/64) ⇝ 19/4 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 9/2 ⇜ (147/32 → 295/64) ⇝ 19/4 | note:F4 gain:0.12 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 9/2 ⇜ (147/32 → 295/64) ⇝ 19/4 | note:A4 gain:0.12 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 9/2 ⇜ (147/32 → 295/64) ⇝ 19/4 | note:G2 gain:0.24 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 9/2 ⇜ (295/64 → 37/8) | note:D5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 9/2 ⇜ (295/64 → 37/8) | note:F5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 9/2 ⇜ (295/64 → 37/8) ⇝ 19/4 | note:B3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 9/2 ⇜ (295/64 → 37/8) ⇝ 19/4 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 9/2 ⇜ (295/64 → 37/8) ⇝ 19/4 | note:F4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 9/2 ⇜ (295/64 → 37/8) ⇝ 19/4 | note:A4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 9/2 ⇜ (295/64 → 37/8) ⇝ 19/4 | note:G2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 9/2 ⇜ (37/8 → 297/64) ⇝ 19/4 | note:B3 gain:0.22 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 9/2 ⇜ (37/8 → 297/64) ⇝ 19/4 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 9/2 ⇜ (37/8 → 297/64) ⇝ 19/4 | note:F4 gain:0.22 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 9/2 ⇜ (37/8 → 297/64) ⇝ 19/4 | note:A4 gain:0.22 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 9/2 ⇜ (37/8 → 297/64) ⇝ 19/4 | note:G2 gain:0.44 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 9/2 ⇜ (297/64 → 149/32) ⇝ 19/4 | note:B3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 9/2 ⇜ (297/64 → 149/32) ⇝ 19/4 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 9/2 ⇜ (297/64 → 149/32) ⇝ 19/4 | note:F4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 9/2 ⇜ (297/64 → 149/32) ⇝ 19/4 | note:A4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 9/2 ⇜ (297/64 → 149/32) ⇝ 19/4 | note:G2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 9/2 ⇜ (149/32 → 299/64) ⇝ 19/4 | note:B3 gain:0.32 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 9/2 ⇜ (149/32 → 299/64) ⇝ 19/4 | note:E4 gain:0.32 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 9/2 ⇜ (149/32 → 299/64) ⇝ 19/4 | note:F4 gain:0.32 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 9/2 ⇜ (149/32 → 299/64) ⇝ 19/4 | note:A4 gain:0.32 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 9/2 ⇜ (149/32 → 299/64) ⇝ 19/4 | note:G2 gain:0.64 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 9/2 ⇜ (299/64 → 75/16) ⇝ 19/4 | note:B3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 9/2 ⇜ (299/64 → 75/16) ⇝ 19/4 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 9/2 ⇜ (299/64 → 75/16) ⇝ 19/4 | note:F4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 9/2 ⇜ (299/64 → 75/16) ⇝ 19/4 | note:A4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 9/2 ⇜ (299/64 → 75/16) ⇝ 19/4 | note:G2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 9/2 ⇜ (75/16 → 301/64) ⇝ 19/4 | note:B3 gain:0.22 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 9/2 ⇜ (75/16 → 301/64) ⇝ 19/4 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 9/2 ⇜ (75/16 → 301/64) ⇝ 19/4 | note:F4 gain:0.22 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 9/2 ⇜ (75/16 → 301/64) ⇝ 19/4 | note:A4 gain:0.22 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 9/2 ⇜ (75/16 → 301/64) ⇝ 19/4 | note:G2 gain:0.44 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 9/2 ⇜ (301/64 → 151/32) ⇝ 19/4 | note:B3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 9/2 ⇜ (301/64 → 151/32) ⇝ 19/4 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 9/2 ⇜ (301/64 → 151/32) ⇝ 19/4 | note:F4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 9/2 ⇜ (301/64 → 151/32) ⇝ 19/4 | note:A4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 9/2 ⇜ (301/64 → 151/32) ⇝ 19/4 | note:G2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 9/2 ⇜ (151/32 → 303/64) ⇝ 19/4 | note:B3 gain:0.12 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 9/2 ⇜ (151/32 → 303/64) ⇝ 19/4 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 9/2 ⇜ (151/32 → 303/64) ⇝ 19/4 | note:F4 gain:0.12 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 9/2 ⇜ (151/32 → 303/64) ⇝ 19/4 | note:A4 gain:0.12 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 9/2 ⇜ (151/32 → 303/64) ⇝ 19/4 | note:G2 gain:0.24 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 9/2 ⇜ (303/64 → 19/4) | note:B3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 9/2 ⇜ (303/64 → 19/4) | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 9/2 ⇜ (303/64 → 19/4) | note:F4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 9/2 ⇜ (303/64 → 19/4) | note:A4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 9/2 ⇜ (303/64 → 19/4) | note:G2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ (19/4 → 305/64) ⇝ 39/8 | note:G4 gain:0.44 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ (19/4 → 305/64) ⇝ 39/8 | note:Bb4 gain:0.44 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 19/4 ⇜ (305/64 → 153/32) ⇝ 39/8 | note:G4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 19/4 ⇜ (305/64 → 153/32) ⇝ 39/8 | note:Bb4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 19/4 ⇜ (153/32 → 307/64) ⇝ 39/8 | note:G4 gain:0.64 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 19/4 ⇜ (153/32 → 307/64) ⇝ 39/8 | note:Bb4 gain:0.64 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ (67/14 → 307/64) ⇝ 141/28 | note:71 gain:0.064 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ (67/14 → 307/64) ⇝ 141/28 | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ (67/14 → 307/64) ⇝ 141/28 | note:77 gain:0.064 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ (67/14 → 307/64) ⇝ 141/28 | note:81 gain:0.064 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 19/4 ⇜ (307/64 → 77/16) ⇝ 39/8 | note:G4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 19/4 ⇜ (307/64 → 77/16) ⇝ 39/8 | note:Bb4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 67/14 ⇜ (307/64 → 77/16) ⇝ 141/28 | note:71 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 67/14 ⇜ (307/64 → 77/16) ⇝ 141/28 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 67/14 ⇜ (307/64 → 77/16) ⇝ 141/28 | note:77 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 67/14 ⇜ (307/64 → 77/16) ⇝ 141/28 | note:81 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 19/4 ⇜ (77/16 → 309/64) ⇝ 39/8 | note:G4 gain:0.44 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 19/4 ⇜ (77/16 → 309/64) ⇝ 39/8 | note:Bb4 gain:0.44 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 67/14 ⇜ (77/16 → 309/64) ⇝ 141/28 | note:71 gain:0.044 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 67/14 ⇜ (77/16 → 309/64) ⇝ 141/28 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 67/14 ⇜ (77/16 → 309/64) ⇝ 141/28 | note:77 gain:0.044 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 67/14 ⇜ (77/16 → 309/64) ⇝ 141/28 | note:81 gain:0.044 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 19/4 ⇜ (309/64 → 155/32) ⇝ 39/8 | note:G4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 19/4 ⇜ (309/64 → 155/32) ⇝ 39/8 | note:Bb4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 67/14 ⇜ (309/64 → 155/32) ⇝ 141/28 | note:71 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 67/14 ⇜ (309/64 → 155/32) ⇝ 141/28 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 67/14 ⇜ (309/64 → 155/32) ⇝ 141/28 | note:77 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 67/14 ⇜ (309/64 → 155/32) ⇝ 141/28 | note:81 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 19/4 ⇜ (155/32 → 311/64) ⇝ 39/8 | note:G4 gain:0.24 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 19/4 ⇜ (155/32 → 311/64) ⇝ 39/8 | note:Bb4 gain:0.24 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 67/14 ⇜ (155/32 → 311/64) ⇝ 141/28 | note:71 gain:0.024 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 67/14 ⇜ (155/32 → 311/64) ⇝ 141/28 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 67/14 ⇜ (155/32 → 311/64) ⇝ 141/28 | note:77 gain:0.024 clip:1 s:piano release:0.1 pan:0.606481481481 ]", "[ 67/14 ⇜ (155/32 → 311/64) ⇝ 141/28 | note:81 gain:0.024 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 19/4 ⇜ (311/64 → 39/8) | note:G4 gain:0.2985786437626885 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 19/4 ⇜ (311/64 → 39/8) | note:Bb4 gain:0.2985786437626885 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 67/14 ⇜ (311/64 → 39/8) ⇝ 141/28 | note:71 gain:0.02985786437626885 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 67/14 ⇜ (311/64 → 39/8) ⇝ 141/28 | note:76 gain:0.02985786437626885 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 67/14 ⇜ (311/64 → 39/8) ⇝ 141/28 | note:77 gain:0.02985786437626885 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 67/14 ⇜ (311/64 → 39/8) ⇝ 141/28 | note:81 gain:0.02985786437626885 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 67/14 ⇜ (39/8 → 313/64) ⇝ 141/28 | note:71 gain:0.04399999999999967 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 67/14 ⇜ (39/8 → 313/64) ⇝ 141/28 | note:76 gain:0.04399999999999967 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 67/14 ⇜ (39/8 → 313/64) ⇝ 141/28 | note:77 gain:0.04399999999999967 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 67/14 ⇜ (39/8 → 313/64) ⇝ 141/28 | note:81 gain:0.04399999999999967 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 67/14 ⇜ (313/64 → 157/32) ⇝ 141/28 | note:71 gain:0.05814213562373069 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 67/14 ⇜ (313/64 → 157/32) ⇝ 141/28 | note:76 gain:0.05814213562373069 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 67/14 ⇜ (313/64 → 157/32) ⇝ 141/28 | note:77 gain:0.05814213562373069 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 67/14 ⇜ (313/64 → 157/32) ⇝ 141/28 | note:81 gain:0.05814213562373069 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 67/14 ⇜ (157/32 → 315/64) ⇝ 141/28 | note:71 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 67/14 ⇜ (157/32 → 315/64) ⇝ 141/28 | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 67/14 ⇜ (157/32 → 315/64) ⇝ 141/28 | note:77 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 67/14 ⇜ (157/32 → 315/64) ⇝ 141/28 | note:81 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 67/14 ⇜ (315/64 → 79/16) ⇝ 141/28 | note:71 gain:0.0581421356237309 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 67/14 ⇜ (315/64 → 79/16) ⇝ 141/28 | note:76 gain:0.0581421356237309 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 67/14 ⇜ (315/64 → 79/16) ⇝ 141/28 | note:77 gain:0.0581421356237309 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 67/14 ⇜ (315/64 → 79/16) ⇝ 141/28 | note:81 gain:0.0581421356237309 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 67/14 ⇜ (79/16 → 317/64) ⇝ 141/28 | note:71 gain:0.043999999999999984 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 67/14 ⇜ (79/16 → 317/64) ⇝ 141/28 | note:76 gain:0.043999999999999984 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 67/14 ⇜ (79/16 → 317/64) ⇝ 141/28 | note:77 gain:0.043999999999999984 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 67/14 ⇜ (79/16 → 317/64) ⇝ 141/28 | note:81 gain:0.043999999999999984 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 67/14 ⇜ (317/64 → 159/32) ⇝ 141/28 | note:71 gain:0.029857864376269073 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 67/14 ⇜ (317/64 → 159/32) ⇝ 141/28 | note:76 gain:0.029857864376269073 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 67/14 ⇜ (317/64 → 159/32) ⇝ 141/28 | note:77 gain:0.029857864376269073 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 67/14 ⇜ (317/64 → 159/32) ⇝ 141/28 | note:81 gain:0.029857864376269073 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 67/14 ⇜ (159/32 → 319/64) ⇝ 141/28 | note:71 gain:0.024 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 67/14 ⇜ (159/32 → 319/64) ⇝ 141/28 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 67/14 ⇜ (159/32 → 319/64) ⇝ 141/28 | note:77 gain:0.024 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", + "[ 19/4 ⇜ (311/64 → 39/8) | note:G4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 19/4 ⇜ (311/64 → 39/8) | note:Bb4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 67/14 ⇜ (311/64 → 39/8) ⇝ 141/28 | note:71 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 67/14 ⇜ (311/64 → 39/8) ⇝ 141/28 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 67/14 ⇜ (311/64 → 39/8) ⇝ 141/28 | note:77 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 67/14 ⇜ (311/64 → 39/8) ⇝ 141/28 | note:81 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 67/14 ⇜ (39/8 → 313/64) ⇝ 141/28 | note:71 gain:0.044 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 67/14 ⇜ (39/8 → 313/64) ⇝ 141/28 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 67/14 ⇜ (39/8 → 313/64) ⇝ 141/28 | note:77 gain:0.044 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 67/14 ⇜ (39/8 → 313/64) ⇝ 141/28 | note:81 gain:0.044 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 67/14 ⇜ (313/64 → 157/32) ⇝ 141/28 | note:71 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 67/14 ⇜ (313/64 → 157/32) ⇝ 141/28 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 67/14 ⇜ (313/64 → 157/32) ⇝ 141/28 | note:77 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 67/14 ⇜ (313/64 → 157/32) ⇝ 141/28 | note:81 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 67/14 ⇜ (157/32 → 315/64) ⇝ 141/28 | note:71 gain:0.064 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 67/14 ⇜ (157/32 → 315/64) ⇝ 141/28 | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 67/14 ⇜ (157/32 → 315/64) ⇝ 141/28 | note:77 gain:0.064 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 67/14 ⇜ (157/32 → 315/64) ⇝ 141/28 | note:81 gain:0.064 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 67/14 ⇜ (315/64 → 79/16) ⇝ 141/28 | note:71 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 67/14 ⇜ (315/64 → 79/16) ⇝ 141/28 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 67/14 ⇜ (315/64 → 79/16) ⇝ 141/28 | note:77 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 67/14 ⇜ (315/64 → 79/16) ⇝ 141/28 | note:81 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 67/14 ⇜ (79/16 → 317/64) ⇝ 141/28 | note:71 gain:0.044 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 67/14 ⇜ (79/16 → 317/64) ⇝ 141/28 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 67/14 ⇜ (79/16 → 317/64) ⇝ 141/28 | note:77 gain:0.044 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 67/14 ⇜ (79/16 → 317/64) ⇝ 141/28 | note:81 gain:0.044 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 67/14 ⇜ (317/64 → 159/32) ⇝ 141/28 | note:71 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 67/14 ⇜ (317/64 → 159/32) ⇝ 141/28 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 67/14 ⇜ (317/64 → 159/32) ⇝ 141/28 | note:77 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 67/14 ⇜ (317/64 → 159/32) ⇝ 141/28 | note:81 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 67/14 ⇜ (159/32 → 319/64) ⇝ 141/28 | note:71 gain:0.024 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 67/14 ⇜ (159/32 → 319/64) ⇝ 141/28 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 67/14 ⇜ (159/32 → 319/64) ⇝ 141/28 | note:77 gain:0.024 clip:1 s:piano release:0.1 pan:0.606481481481 ]", "[ 67/14 ⇜ (159/32 → 319/64) ⇝ 141/28 | note:81 gain:0.024 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 67/14 ⇜ (319/64 → 5/1) ⇝ 141/28 | note:71 gain:0.02985786437626895 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 67/14 ⇜ (319/64 → 5/1) ⇝ 141/28 | note:76 gain:0.02985786437626895 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 67/14 ⇜ (319/64 → 5/1) ⇝ 141/28 | note:77 gain:0.02985786437626895 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 67/14 ⇜ (319/64 → 5/1) ⇝ 141/28 | note:81 gain:0.02985786437626895 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 67/14 ⇜ (5/1 → 321/64) ⇝ 141/28 | note:71 gain:0.04399999999999982 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 67/14 ⇜ (5/1 → 321/64) ⇝ 141/28 | note:76 gain:0.04399999999999982 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 67/14 ⇜ (5/1 → 321/64) ⇝ 141/28 | note:77 gain:0.04399999999999982 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 67/14 ⇜ (5/1 → 321/64) ⇝ 141/28 | note:81 gain:0.04399999999999982 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ (5/1 → 321/64) ⇝ 21/4 | note:G2 gain:0.4399999999999981 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 67/14 ⇜ (321/64 → 161/32) ⇝ 141/28 | note:71 gain:0.05814213562373077 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 67/14 ⇜ (321/64 → 161/32) ⇝ 141/28 | note:76 gain:0.05814213562373077 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 67/14 ⇜ (321/64 → 161/32) ⇝ 141/28 | note:77 gain:0.05814213562373077 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 67/14 ⇜ (321/64 → 161/32) ⇝ 141/28 | note:81 gain:0.05814213562373077 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 5/1 ⇜ (321/64 → 161/32) ⇝ 21/4 | note:G2 gain:0.5814213562373077 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 67/14 ⇜ (161/32 → 141/28) | note:71 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 67/14 ⇜ (161/32 → 141/28) | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 67/14 ⇜ (161/32 → 141/28) | note:77 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 67/14 ⇜ (161/32 → 141/28) | note:81 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 5/1 ⇜ (161/32 → 323/64) ⇝ 21/4 | note:G2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 5/1 ⇜ (323/64 → 81/16) ⇝ 21/4 | note:G2 gain:0.5814213562373121 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 5/1 ⇜ (81/16 → 325/64) ⇝ 21/4 | note:G2 gain:0.44000000000000417 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 5/1 ⇜ (325/64 → 163/32) ⇝ 21/4 | note:G2 gain:0.2985786437626938 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 5/1 ⇜ (163/32 → 327/64) ⇝ 21/4 | note:G2 gain:0.24 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 5/1 ⇜ (327/64 → 41/8) ⇝ 21/4 | note:G2 gain:0.29857864376269044 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 5/1 ⇜ (41/8 → 329/64) ⇝ 21/4 | note:G2 gain:0.43999999999999373 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ (41/8 → 329/64) ⇝ 21/4 | note:G4 gain:0.43999999999999373 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (41/8 → 329/64) ⇝ 21/4 | note:Bb4 gain:0.43999999999999373 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 5/1 ⇜ (329/64 → 165/32) ⇝ 21/4 | note:G2 gain:0.5814213562373087 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 41/8 ⇜ (329/64 → 165/32) ⇝ 21/4 | note:G4 gain:0.5814213562373087 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 41/8 ⇜ (329/64 → 165/32) ⇝ 21/4 | note:Bb4 gain:0.5814213562373087 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 5/1 ⇜ (165/32 → 331/64) ⇝ 21/4 | note:G2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 41/8 ⇜ (165/32 → 331/64) ⇝ 21/4 | note:G4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 41/8 ⇜ (165/32 → 331/64) ⇝ 21/4 | note:Bb4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 5/1 ⇜ (331/64 → 83/16) ⇝ 21/4 | note:G2 gain:0.5814213562373111 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 41/8 ⇜ (331/64 → 83/16) ⇝ 21/4 | note:G4 gain:0.5814213562373111 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 41/8 ⇜ (331/64 → 83/16) ⇝ 21/4 | note:Bb4 gain:0.5814213562373111 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 5/1 ⇜ (83/16 → 333/64) ⇝ 21/4 | note:G2 gain:0.43999999999999706 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 41/8 ⇜ (83/16 → 333/64) ⇝ 21/4 | note:G4 gain:0.43999999999999706 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 41/8 ⇜ (83/16 → 333/64) ⇝ 21/4 | note:Bb4 gain:0.43999999999999706 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 5/1 ⇜ (333/64 → 167/32) ⇝ 21/4 | note:G2 gain:0.29857864376269283 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 41/8 ⇜ (333/64 → 167/32) ⇝ 21/4 | note:G4 gain:0.29857864376269283 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 41/8 ⇜ (333/64 → 167/32) ⇝ 21/4 | note:Bb4 gain:0.29857864376269283 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 5/1 ⇜ (167/32 → 335/64) ⇝ 21/4 | note:G2 gain:0.24 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 41/8 ⇜ (167/32 → 335/64) ⇝ 21/4 | note:G4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 41/8 ⇜ (167/32 → 335/64) ⇝ 21/4 | note:Bb4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 5/1 ⇜ (335/64 → 21/4) | note:G2 gain:0.2985786437626874 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 41/8 ⇜ (335/64 → 21/4) | note:G4 gain:0.2985786437626874 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 41/8 ⇜ (335/64 → 21/4) | note:Bb4 gain:0.2985786437626874 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ (21/4 → 337/64) ⇝ 11/2 | note:B3 gain:0.2200000000000004 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ (21/4 → 337/64) ⇝ 11/2 | note:E4 gain:0.2200000000000004 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (21/4 → 337/64) ⇝ 11/2 | note:F4 gain:0.2200000000000004 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ (21/4 → 337/64) ⇝ 11/2 | note:A4 gain:0.2200000000000004 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 21/4 ⇜ (337/64 → 169/32) ⇝ 11/2 | note:B3 gain:0.29071067811865287 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 21/4 ⇜ (337/64 → 169/32) ⇝ 11/2 | note:E4 gain:0.29071067811865287 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 21/4 ⇜ (337/64 → 169/32) ⇝ 11/2 | note:F4 gain:0.29071067811865287 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 21/4 ⇜ (337/64 → 169/32) ⇝ 11/2 | note:A4 gain:0.29071067811865287 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 21/4 ⇜ (169/32 → 339/64) ⇝ 11/2 | note:B3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 21/4 ⇜ (169/32 → 339/64) ⇝ 11/2 | note:E4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 21/4 ⇜ (169/32 → 339/64) ⇝ 11/2 | note:F4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 21/4 ⇜ (169/32 → 339/64) ⇝ 11/2 | note:A4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 21/4 ⇜ (339/64 → 85/16) ⇝ 11/2 | note:B3 gain:0.29071067811865703 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 21/4 ⇜ (339/64 → 85/16) ⇝ 11/2 | note:E4 gain:0.29071067811865703 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 21/4 ⇜ (339/64 → 85/16) ⇝ 11/2 | note:F4 gain:0.29071067811865703 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 21/4 ⇜ (339/64 → 85/16) ⇝ 11/2 | note:A4 gain:0.29071067811865703 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 21/4 ⇜ (85/16 → 341/64) ⇝ 11/2 | note:B3 gain:0.2200000000000007 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 21/4 ⇜ (85/16 → 341/64) ⇝ 11/2 | note:E4 gain:0.2200000000000007 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 21/4 ⇜ (85/16 → 341/64) ⇝ 11/2 | note:F4 gain:0.2200000000000007 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 21/4 ⇜ (85/16 → 341/64) ⇝ 11/2 | note:A4 gain:0.2200000000000007 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 21/4 ⇜ (341/64 → 171/32) ⇝ 11/2 | note:B3 gain:0.14928932188134794 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 21/4 ⇜ (341/64 → 171/32) ⇝ 11/2 | note:E4 gain:0.14928932188134794 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 21/4 ⇜ (341/64 → 171/32) ⇝ 11/2 | note:F4 gain:0.14928932188134794 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 21/4 ⇜ (341/64 → 171/32) ⇝ 11/2 | note:A4 gain:0.14928932188134794 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 21/4 ⇜ (171/32 → 343/64) ⇝ 11/2 | note:B3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 21/4 ⇜ (171/32 → 343/64) ⇝ 11/2 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 21/4 ⇜ (171/32 → 343/64) ⇝ 11/2 | note:F4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 21/4 ⇜ (171/32 → 343/64) ⇝ 11/2 | note:A4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 21/4 ⇜ (343/64 → 43/8) ⇝ 11/2 | note:B3 gain:0.14928932188134622 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 21/4 ⇜ (343/64 → 43/8) ⇝ 11/2 | note:E4 gain:0.14928932188134622 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 21/4 ⇜ (343/64 → 43/8) ⇝ 11/2 | note:F4 gain:0.14928932188134622 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 21/4 ⇜ (343/64 → 43/8) ⇝ 11/2 | note:A4 gain:0.14928932188134622 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 21/4 ⇜ (43/8 → 345/64) ⇝ 11/2 | note:B3 gain:0.21999999999999825 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 21/4 ⇜ (43/8 → 345/64) ⇝ 11/2 | note:E4 gain:0.21999999999999825 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 21/4 ⇜ (43/8 → 345/64) ⇝ 11/2 | note:F4 gain:0.21999999999999825 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 21/4 ⇜ (43/8 → 345/64) ⇝ 11/2 | note:A4 gain:0.21999999999999825 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 21/4 ⇜ (345/64 → 173/32) ⇝ 11/2 | note:B3 gain:0.29071067811865536 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 21/4 ⇜ (345/64 → 173/32) ⇝ 11/2 | note:E4 gain:0.29071067811865536 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 21/4 ⇜ (345/64 → 173/32) ⇝ 11/2 | note:F4 gain:0.29071067811865536 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 21/4 ⇜ (345/64 → 173/32) ⇝ 11/2 | note:A4 gain:0.29071067811865536 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 21/4 ⇜ (173/32 → 347/64) ⇝ 11/2 | note:B3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 21/4 ⇜ (173/32 → 347/64) ⇝ 11/2 | note:E4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 21/4 ⇜ (173/32 → 347/64) ⇝ 11/2 | note:F4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 21/4 ⇜ (173/32 → 347/64) ⇝ 11/2 | note:A4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 21/4 ⇜ (347/64 → 87/16) ⇝ 11/2 | note:B3 gain:0.29071067811865453 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 21/4 ⇜ (347/64 → 87/16) ⇝ 11/2 | note:E4 gain:0.29071067811865453 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 21/4 ⇜ (347/64 → 87/16) ⇝ 11/2 | note:F4 gain:0.29071067811865453 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 21/4 ⇜ (347/64 → 87/16) ⇝ 11/2 | note:A4 gain:0.29071067811865453 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 21/4 ⇜ (87/16 → 349/64) ⇝ 11/2 | note:B3 gain:0.22000000000000286 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 21/4 ⇜ (87/16 → 349/64) ⇝ 11/2 | note:E4 gain:0.22000000000000286 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 21/4 ⇜ (87/16 → 349/64) ⇝ 11/2 | note:F4 gain:0.22000000000000286 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 21/4 ⇜ (87/16 → 349/64) ⇝ 11/2 | note:A4 gain:0.22000000000000286 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 21/4 ⇜ (349/64 → 175/32) ⇝ 11/2 | note:B3 gain:0.14928932188134544 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 21/4 ⇜ (349/64 → 175/32) ⇝ 11/2 | note:E4 gain:0.14928932188134544 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 21/4 ⇜ (349/64 → 175/32) ⇝ 11/2 | note:F4 gain:0.14928932188134544 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 21/4 ⇜ (349/64 → 175/32) ⇝ 11/2 | note:A4 gain:0.14928932188134544 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 21/4 ⇜ (175/32 → 351/64) ⇝ 11/2 | note:B3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 21/4 ⇜ (175/32 → 351/64) ⇝ 11/2 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 21/4 ⇜ (175/32 → 351/64) ⇝ 11/2 | note:F4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 21/4 ⇜ (175/32 → 351/64) ⇝ 11/2 | note:A4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 21/4 ⇜ (351/64 → 11/2) | note:B3 gain:0.14928932188134467 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 21/4 ⇜ (351/64 → 11/2) | note:E4 gain:0.14928932188134467 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 21/4 ⇜ (351/64 → 11/2) | note:F4 gain:0.14928932188134467 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 21/4 ⇜ (351/64 → 11/2) | note:A4 gain:0.14928932188134467 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ (11/2 → 353/64) ⇝ 45/8 | note:D5 gain:0.4399999999999922 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ (11/2 → 353/64) ⇝ 45/8 | note:F5 gain:0.4399999999999922 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ (11/2 → 353/64) ⇝ 23/4 | note:G2 gain:0.4399999999999922 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 11/2 ⇜ (353/64 → 177/32) ⇝ 45/8 | note:D5 gain:0.5814213562373077 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 11/2 ⇜ (353/64 → 177/32) ⇝ 45/8 | note:F5 gain:0.5814213562373077 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 11/2 ⇜ (353/64 → 177/32) ⇝ 23/4 | note:G2 gain:0.5814213562373077 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 11/2 ⇜ (177/32 → 355/64) ⇝ 45/8 | note:D5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 11/2 ⇜ (177/32 → 355/64) ⇝ 45/8 | note:F5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 11/2 ⇜ (177/32 → 355/64) ⇝ 23/4 | note:G2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ (155/28 → 355/64) ⇝ 81/14 | note:71 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ (155/28 → 355/64) ⇝ 81/14 | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ (155/28 → 355/64) ⇝ 81/14 | note:77 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ (155/28 → 355/64) ⇝ 81/14 | note:81 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 11/2 ⇜ (355/64 → 89/16) ⇝ 45/8 | note:D5 gain:0.5814213562373122 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 11/2 ⇜ (355/64 → 89/16) ⇝ 45/8 | note:F5 gain:0.5814213562373122 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 11/2 ⇜ (355/64 → 89/16) ⇝ 23/4 | note:G2 gain:0.5814213562373122 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 155/28 ⇜ (355/64 → 89/16) ⇝ 81/14 | note:71 gain:0.05814213562373122 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 155/28 ⇜ (355/64 → 89/16) ⇝ 81/14 | note:76 gain:0.05814213562373122 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 155/28 ⇜ (355/64 → 89/16) ⇝ 81/14 | note:77 gain:0.05814213562373122 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 155/28 ⇜ (355/64 → 89/16) ⇝ 81/14 | note:81 gain:0.05814213562373122 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 11/2 ⇜ (89/16 → 357/64) ⇝ 45/8 | note:D5 gain:0.4399999999999986 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 11/2 ⇜ (89/16 → 357/64) ⇝ 45/8 | note:F5 gain:0.4399999999999986 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 11/2 ⇜ (89/16 → 357/64) ⇝ 23/4 | note:G2 gain:0.4399999999999986 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 155/28 ⇜ (89/16 → 357/64) ⇝ 81/14 | note:71 gain:0.043999999999999866 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 155/28 ⇜ (89/16 → 357/64) ⇝ 81/14 | note:76 gain:0.043999999999999866 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 155/28 ⇜ (89/16 → 357/64) ⇝ 81/14 | note:77 gain:0.043999999999999866 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 155/28 ⇜ (89/16 → 357/64) ⇝ 81/14 | note:81 gain:0.043999999999999866 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 11/2 ⇜ (357/64 → 179/32) ⇝ 45/8 | note:D5 gain:0.29857864376269394 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 11/2 ⇜ (357/64 → 179/32) ⇝ 45/8 | note:F5 gain:0.29857864376269394 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 11/2 ⇜ (357/64 → 179/32) ⇝ 23/4 | note:G2 gain:0.29857864376269394 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 155/28 ⇜ (357/64 → 179/32) ⇝ 81/14 | note:71 gain:0.029857864376269395 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 155/28 ⇜ (357/64 → 179/32) ⇝ 81/14 | note:76 gain:0.029857864376269395 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 155/28 ⇜ (357/64 → 179/32) ⇝ 81/14 | note:77 gain:0.029857864376269395 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 155/28 ⇜ (357/64 → 179/32) ⇝ 81/14 | note:81 gain:0.029857864376269395 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 11/2 ⇜ (179/32 → 359/64) ⇝ 45/8 | note:D5 gain:0.24 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 11/2 ⇜ (179/32 → 359/64) ⇝ 45/8 | note:F5 gain:0.24 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 11/2 ⇜ (179/32 → 359/64) ⇝ 23/4 | note:G2 gain:0.24 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 155/28 ⇜ (179/32 → 359/64) ⇝ 81/14 | note:71 gain:0.024 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 155/28 ⇜ (179/32 → 359/64) ⇝ 81/14 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 155/28 ⇜ (179/32 → 359/64) ⇝ 81/14 | note:77 gain:0.024 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", + "[ 67/14 ⇜ (319/64 → 5/1) ⇝ 141/28 | note:71 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 67/14 ⇜ (319/64 → 5/1) ⇝ 141/28 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 67/14 ⇜ (319/64 → 5/1) ⇝ 141/28 | note:77 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 67/14 ⇜ (319/64 → 5/1) ⇝ 141/28 | note:81 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 67/14 ⇜ (5/1 → 321/64) ⇝ 141/28 | note:71 gain:0.044 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 67/14 ⇜ (5/1 → 321/64) ⇝ 141/28 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 67/14 ⇜ (5/1 → 321/64) ⇝ 141/28 | note:77 gain:0.044 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 67/14 ⇜ (5/1 → 321/64) ⇝ 141/28 | note:81 gain:0.044 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ (5/1 → 321/64) ⇝ 21/4 | note:G2 gain:0.44 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 67/14 ⇜ (321/64 → 161/32) ⇝ 141/28 | note:71 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 67/14 ⇜ (321/64 → 161/32) ⇝ 141/28 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 67/14 ⇜ (321/64 → 161/32) ⇝ 141/28 | note:77 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 67/14 ⇜ (321/64 → 161/32) ⇝ 141/28 | note:81 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 5/1 ⇜ (321/64 → 161/32) ⇝ 21/4 | note:G2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 67/14 ⇜ (161/32 → 141/28) | note:71 gain:0.064 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 67/14 ⇜ (161/32 → 141/28) | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 67/14 ⇜ (161/32 → 141/28) | note:77 gain:0.064 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 67/14 ⇜ (161/32 → 141/28) | note:81 gain:0.064 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 5/1 ⇜ (161/32 → 323/64) ⇝ 21/4 | note:G2 gain:0.64 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 5/1 ⇜ (323/64 → 81/16) ⇝ 21/4 | note:G2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 5/1 ⇜ (81/16 → 325/64) ⇝ 21/4 | note:G2 gain:0.44 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 5/1 ⇜ (325/64 → 163/32) ⇝ 21/4 | note:G2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 5/1 ⇜ (163/32 → 327/64) ⇝ 21/4 | note:G2 gain:0.24 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 5/1 ⇜ (327/64 → 41/8) ⇝ 21/4 | note:G2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 5/1 ⇜ (41/8 → 329/64) ⇝ 21/4 | note:G2 gain:0.44 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ (41/8 → 329/64) ⇝ 21/4 | note:G4 gain:0.44 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ (41/8 → 329/64) ⇝ 21/4 | note:Bb4 gain:0.44 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 5/1 ⇜ (329/64 → 165/32) ⇝ 21/4 | note:G2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 41/8 ⇜ (329/64 → 165/32) ⇝ 21/4 | note:G4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 41/8 ⇜ (329/64 → 165/32) ⇝ 21/4 | note:Bb4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 5/1 ⇜ (165/32 → 331/64) ⇝ 21/4 | note:G2 gain:0.64 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 41/8 ⇜ (165/32 → 331/64) ⇝ 21/4 | note:G4 gain:0.64 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 41/8 ⇜ (165/32 → 331/64) ⇝ 21/4 | note:Bb4 gain:0.64 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 5/1 ⇜ (331/64 → 83/16) ⇝ 21/4 | note:G2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 41/8 ⇜ (331/64 → 83/16) ⇝ 21/4 | note:G4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 41/8 ⇜ (331/64 → 83/16) ⇝ 21/4 | note:Bb4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 5/1 ⇜ (83/16 → 333/64) ⇝ 21/4 | note:G2 gain:0.44 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 41/8 ⇜ (83/16 → 333/64) ⇝ 21/4 | note:G4 gain:0.44 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 41/8 ⇜ (83/16 → 333/64) ⇝ 21/4 | note:Bb4 gain:0.44 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 5/1 ⇜ (333/64 → 167/32) ⇝ 21/4 | note:G2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 41/8 ⇜ (333/64 → 167/32) ⇝ 21/4 | note:G4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 41/8 ⇜ (333/64 → 167/32) ⇝ 21/4 | note:Bb4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 5/1 ⇜ (167/32 → 335/64) ⇝ 21/4 | note:G2 gain:0.24 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 41/8 ⇜ (167/32 → 335/64) ⇝ 21/4 | note:G4 gain:0.24 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 41/8 ⇜ (167/32 → 335/64) ⇝ 21/4 | note:Bb4 gain:0.24 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 5/1 ⇜ (335/64 → 21/4) | note:G2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 41/8 ⇜ (335/64 → 21/4) | note:G4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 41/8 ⇜ (335/64 → 21/4) | note:Bb4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ (21/4 → 337/64) ⇝ 11/2 | note:B3 gain:0.22 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ (21/4 → 337/64) ⇝ 11/2 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (21/4 → 337/64) ⇝ 11/2 | note:F4 gain:0.22 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ (21/4 → 337/64) ⇝ 11/2 | note:A4 gain:0.22 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 21/4 ⇜ (337/64 → 169/32) ⇝ 11/2 | note:B3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 21/4 ⇜ (337/64 → 169/32) ⇝ 11/2 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 21/4 ⇜ (337/64 → 169/32) ⇝ 11/2 | note:F4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 21/4 ⇜ (337/64 → 169/32) ⇝ 11/2 | note:A4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 21/4 ⇜ (169/32 → 339/64) ⇝ 11/2 | note:B3 gain:0.32 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 21/4 ⇜ (169/32 → 339/64) ⇝ 11/2 | note:E4 gain:0.32 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 21/4 ⇜ (169/32 → 339/64) ⇝ 11/2 | note:F4 gain:0.32 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 21/4 ⇜ (169/32 → 339/64) ⇝ 11/2 | note:A4 gain:0.32 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 21/4 ⇜ (339/64 → 85/16) ⇝ 11/2 | note:B3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 21/4 ⇜ (339/64 → 85/16) ⇝ 11/2 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 21/4 ⇜ (339/64 → 85/16) ⇝ 11/2 | note:F4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 21/4 ⇜ (339/64 → 85/16) ⇝ 11/2 | note:A4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 21/4 ⇜ (85/16 → 341/64) ⇝ 11/2 | note:B3 gain:0.22 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 21/4 ⇜ (85/16 → 341/64) ⇝ 11/2 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 21/4 ⇜ (85/16 → 341/64) ⇝ 11/2 | note:F4 gain:0.22 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 21/4 ⇜ (85/16 → 341/64) ⇝ 11/2 | note:A4 gain:0.22 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 21/4 ⇜ (341/64 → 171/32) ⇝ 11/2 | note:B3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 21/4 ⇜ (341/64 → 171/32) ⇝ 11/2 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 21/4 ⇜ (341/64 → 171/32) ⇝ 11/2 | note:F4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 21/4 ⇜ (341/64 → 171/32) ⇝ 11/2 | note:A4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 21/4 ⇜ (171/32 → 343/64) ⇝ 11/2 | note:B3 gain:0.12 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 21/4 ⇜ (171/32 → 343/64) ⇝ 11/2 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 21/4 ⇜ (171/32 → 343/64) ⇝ 11/2 | note:F4 gain:0.12 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 21/4 ⇜ (171/32 → 343/64) ⇝ 11/2 | note:A4 gain:0.12 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 21/4 ⇜ (343/64 → 43/8) ⇝ 11/2 | note:B3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 21/4 ⇜ (343/64 → 43/8) ⇝ 11/2 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 21/4 ⇜ (343/64 → 43/8) ⇝ 11/2 | note:F4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 21/4 ⇜ (343/64 → 43/8) ⇝ 11/2 | note:A4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 21/4 ⇜ (43/8 → 345/64) ⇝ 11/2 | note:B3 gain:0.22 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 21/4 ⇜ (43/8 → 345/64) ⇝ 11/2 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 21/4 ⇜ (43/8 → 345/64) ⇝ 11/2 | note:F4 gain:0.22 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 21/4 ⇜ (43/8 → 345/64) ⇝ 11/2 | note:A4 gain:0.22 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 21/4 ⇜ (345/64 → 173/32) ⇝ 11/2 | note:B3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 21/4 ⇜ (345/64 → 173/32) ⇝ 11/2 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 21/4 ⇜ (345/64 → 173/32) ⇝ 11/2 | note:F4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 21/4 ⇜ (345/64 → 173/32) ⇝ 11/2 | note:A4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 21/4 ⇜ (173/32 → 347/64) ⇝ 11/2 | note:B3 gain:0.32 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 21/4 ⇜ (173/32 → 347/64) ⇝ 11/2 | note:E4 gain:0.32 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 21/4 ⇜ (173/32 → 347/64) ⇝ 11/2 | note:F4 gain:0.32 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 21/4 ⇜ (173/32 → 347/64) ⇝ 11/2 | note:A4 gain:0.32 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 21/4 ⇜ (347/64 → 87/16) ⇝ 11/2 | note:B3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 21/4 ⇜ (347/64 → 87/16) ⇝ 11/2 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 21/4 ⇜ (347/64 → 87/16) ⇝ 11/2 | note:F4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 21/4 ⇜ (347/64 → 87/16) ⇝ 11/2 | note:A4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 21/4 ⇜ (87/16 → 349/64) ⇝ 11/2 | note:B3 gain:0.22 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 21/4 ⇜ (87/16 → 349/64) ⇝ 11/2 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 21/4 ⇜ (87/16 → 349/64) ⇝ 11/2 | note:F4 gain:0.22 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 21/4 ⇜ (87/16 → 349/64) ⇝ 11/2 | note:A4 gain:0.22 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 21/4 ⇜ (349/64 → 175/32) ⇝ 11/2 | note:B3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 21/4 ⇜ (349/64 → 175/32) ⇝ 11/2 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 21/4 ⇜ (349/64 → 175/32) ⇝ 11/2 | note:F4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 21/4 ⇜ (349/64 → 175/32) ⇝ 11/2 | note:A4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 21/4 ⇜ (175/32 → 351/64) ⇝ 11/2 | note:B3 gain:0.12 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 21/4 ⇜ (175/32 → 351/64) ⇝ 11/2 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 21/4 ⇜ (175/32 → 351/64) ⇝ 11/2 | note:F4 gain:0.12 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 21/4 ⇜ (175/32 → 351/64) ⇝ 11/2 | note:A4 gain:0.12 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 21/4 ⇜ (351/64 → 11/2) | note:B3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 21/4 ⇜ (351/64 → 11/2) | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 21/4 ⇜ (351/64 → 11/2) | note:F4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 21/4 ⇜ (351/64 → 11/2) | note:A4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ (11/2 → 353/64) ⇝ 45/8 | note:D5 gain:0.44 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ (11/2 → 353/64) ⇝ 45/8 | note:F5 gain:0.44 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ (11/2 → 353/64) ⇝ 23/4 | note:G2 gain:0.44 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 11/2 ⇜ (353/64 → 177/32) ⇝ 45/8 | note:D5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 11/2 ⇜ (353/64 → 177/32) ⇝ 45/8 | note:F5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 11/2 ⇜ (353/64 → 177/32) ⇝ 23/4 | note:G2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 11/2 ⇜ (177/32 → 355/64) ⇝ 45/8 | note:D5 gain:0.64 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 11/2 ⇜ (177/32 → 355/64) ⇝ 45/8 | note:F5 gain:0.64 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 11/2 ⇜ (177/32 → 355/64) ⇝ 23/4 | note:G2 gain:0.64 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ (155/28 → 355/64) ⇝ 81/14 | note:71 gain:0.064 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ (155/28 → 355/64) ⇝ 81/14 | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ (155/28 → 355/64) ⇝ 81/14 | note:77 gain:0.064 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ (155/28 → 355/64) ⇝ 81/14 | note:81 gain:0.064 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 11/2 ⇜ (355/64 → 89/16) ⇝ 45/8 | note:D5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 11/2 ⇜ (355/64 → 89/16) ⇝ 45/8 | note:F5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 11/2 ⇜ (355/64 → 89/16) ⇝ 23/4 | note:G2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 155/28 ⇜ (355/64 → 89/16) ⇝ 81/14 | note:71 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 155/28 ⇜ (355/64 → 89/16) ⇝ 81/14 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 155/28 ⇜ (355/64 → 89/16) ⇝ 81/14 | note:77 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 155/28 ⇜ (355/64 → 89/16) ⇝ 81/14 | note:81 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 11/2 ⇜ (89/16 → 357/64) ⇝ 45/8 | note:D5 gain:0.44 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 11/2 ⇜ (89/16 → 357/64) ⇝ 45/8 | note:F5 gain:0.44 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 11/2 ⇜ (89/16 → 357/64) ⇝ 23/4 | note:G2 gain:0.44 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 155/28 ⇜ (89/16 → 357/64) ⇝ 81/14 | note:71 gain:0.044 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 155/28 ⇜ (89/16 → 357/64) ⇝ 81/14 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 155/28 ⇜ (89/16 → 357/64) ⇝ 81/14 | note:77 gain:0.044 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 155/28 ⇜ (89/16 → 357/64) ⇝ 81/14 | note:81 gain:0.044 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 11/2 ⇜ (357/64 → 179/32) ⇝ 45/8 | note:D5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 11/2 ⇜ (357/64 → 179/32) ⇝ 45/8 | note:F5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 11/2 ⇜ (357/64 → 179/32) ⇝ 23/4 | note:G2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 155/28 ⇜ (357/64 → 179/32) ⇝ 81/14 | note:71 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 155/28 ⇜ (357/64 → 179/32) ⇝ 81/14 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 155/28 ⇜ (357/64 → 179/32) ⇝ 81/14 | note:77 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 155/28 ⇜ (357/64 → 179/32) ⇝ 81/14 | note:81 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 11/2 ⇜ (179/32 → 359/64) ⇝ 45/8 | note:D5 gain:0.24 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 11/2 ⇜ (179/32 → 359/64) ⇝ 45/8 | note:F5 gain:0.24 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 11/2 ⇜ (179/32 → 359/64) ⇝ 23/4 | note:G2 gain:0.24 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 155/28 ⇜ (179/32 → 359/64) ⇝ 81/14 | note:71 gain:0.024 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 155/28 ⇜ (179/32 → 359/64) ⇝ 81/14 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 155/28 ⇜ (179/32 → 359/64) ⇝ 81/14 | note:77 gain:0.024 clip:1 s:piano release:0.1 pan:0.606481481481 ]", "[ 155/28 ⇜ (179/32 → 359/64) ⇝ 81/14 | note:81 gain:0.024 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 11/2 ⇜ (359/64 → 45/8) | note:D5 gain:0.2985786437626863 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 11/2 ⇜ (359/64 → 45/8) | note:F5 gain:0.2985786437626863 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 11/2 ⇜ (359/64 → 45/8) ⇝ 23/4 | note:G2 gain:0.2985786437626863 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 155/28 ⇜ (359/64 → 45/8) ⇝ 81/14 | note:71 gain:0.02985786437626863 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 155/28 ⇜ (359/64 → 45/8) ⇝ 81/14 | note:76 gain:0.02985786437626863 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 155/28 ⇜ (359/64 → 45/8) ⇝ 81/14 | note:77 gain:0.02985786437626863 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 155/28 ⇜ (359/64 → 45/8) ⇝ 81/14 | note:81 gain:0.02985786437626863 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 11/2 ⇜ (45/8 → 361/64) ⇝ 23/4 | note:G2 gain:0.4399999999999993 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 155/28 ⇜ (45/8 → 361/64) ⇝ 81/14 | note:71 gain:0.04399999999999993 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 155/28 ⇜ (45/8 → 361/64) ⇝ 81/14 | note:76 gain:0.04399999999999993 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 155/28 ⇜ (45/8 → 361/64) ⇝ 81/14 | note:77 gain:0.04399999999999993 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 155/28 ⇜ (45/8 → 361/64) ⇝ 81/14 | note:81 gain:0.04399999999999993 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 11/2 ⇜ (361/64 → 181/32) ⇝ 23/4 | note:G2 gain:0.5814213562373046 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 155/28 ⇜ (361/64 → 181/32) ⇝ 81/14 | note:71 gain:0.05814213562373047 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 155/28 ⇜ (361/64 → 181/32) ⇝ 81/14 | note:76 gain:0.05814213562373047 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 155/28 ⇜ (361/64 → 181/32) ⇝ 81/14 | note:77 gain:0.05814213562373047 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 155/28 ⇜ (361/64 → 181/32) ⇝ 81/14 | note:81 gain:0.05814213562373047 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 11/2 ⇜ (181/32 → 363/64) ⇝ 23/4 | note:G2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 155/28 ⇜ (181/32 → 363/64) ⇝ 81/14 | note:71 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 155/28 ⇜ (181/32 → 363/64) ⇝ 81/14 | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 155/28 ⇜ (181/32 → 363/64) ⇝ 81/14 | note:77 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 155/28 ⇜ (181/32 → 363/64) ⇝ 81/14 | note:81 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 11/2 ⇜ (363/64 → 91/16) ⇝ 23/4 | note:G2 gain:0.5814213562373072 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 155/28 ⇜ (363/64 → 91/16) ⇝ 81/14 | note:71 gain:0.05814213562373072 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 155/28 ⇜ (363/64 → 91/16) ⇝ 81/14 | note:76 gain:0.05814213562373072 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 155/28 ⇜ (363/64 → 91/16) ⇝ 81/14 | note:77 gain:0.05814213562373072 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 155/28 ⇜ (363/64 → 91/16) ⇝ 81/14 | note:81 gain:0.05814213562373072 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 11/2 ⇜ (91/16 → 365/64) ⇝ 23/4 | note:G2 gain:0.4400000000000029 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 155/28 ⇜ (91/16 → 365/64) ⇝ 81/14 | note:71 gain:0.04400000000000029 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 155/28 ⇜ (91/16 → 365/64) ⇝ 81/14 | note:76 gain:0.04400000000000029 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 155/28 ⇜ (91/16 → 365/64) ⇝ 81/14 | note:77 gain:0.04400000000000029 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 155/28 ⇜ (91/16 → 365/64) ⇝ 81/14 | note:81 gain:0.04400000000000029 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 11/2 ⇜ (365/64 → 183/32) ⇝ 23/4 | note:G2 gain:0.29857864376268894 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 155/28 ⇜ (365/64 → 183/32) ⇝ 81/14 | note:71 gain:0.029857864376268896 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 155/28 ⇜ (365/64 → 183/32) ⇝ 81/14 | note:76 gain:0.029857864376268896 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 155/28 ⇜ (365/64 → 183/32) ⇝ 81/14 | note:77 gain:0.029857864376268896 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 155/28 ⇜ (365/64 → 183/32) ⇝ 81/14 | note:81 gain:0.029857864376268896 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 11/2 ⇜ (183/32 → 367/64) ⇝ 23/4 | note:G2 gain:0.24 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 155/28 ⇜ (183/32 → 367/64) ⇝ 81/14 | note:71 gain:0.024 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 155/28 ⇜ (183/32 → 367/64) ⇝ 81/14 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 155/28 ⇜ (183/32 → 367/64) ⇝ 81/14 | note:77 gain:0.024 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", + "[ 11/2 ⇜ (359/64 → 45/8) | note:D5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 11/2 ⇜ (359/64 → 45/8) | note:F5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 11/2 ⇜ (359/64 → 45/8) ⇝ 23/4 | note:G2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 155/28 ⇜ (359/64 → 45/8) ⇝ 81/14 | note:71 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 155/28 ⇜ (359/64 → 45/8) ⇝ 81/14 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 155/28 ⇜ (359/64 → 45/8) ⇝ 81/14 | note:77 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 155/28 ⇜ (359/64 → 45/8) ⇝ 81/14 | note:81 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 11/2 ⇜ (45/8 → 361/64) ⇝ 23/4 | note:G2 gain:0.44 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 155/28 ⇜ (45/8 → 361/64) ⇝ 81/14 | note:71 gain:0.044 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 155/28 ⇜ (45/8 → 361/64) ⇝ 81/14 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 155/28 ⇜ (45/8 → 361/64) ⇝ 81/14 | note:77 gain:0.044 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 155/28 ⇜ (45/8 → 361/64) ⇝ 81/14 | note:81 gain:0.044 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 11/2 ⇜ (361/64 → 181/32) ⇝ 23/4 | note:G2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 155/28 ⇜ (361/64 → 181/32) ⇝ 81/14 | note:71 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 155/28 ⇜ (361/64 → 181/32) ⇝ 81/14 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 155/28 ⇜ (361/64 → 181/32) ⇝ 81/14 | note:77 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 155/28 ⇜ (361/64 → 181/32) ⇝ 81/14 | note:81 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 11/2 ⇜ (181/32 → 363/64) ⇝ 23/4 | note:G2 gain:0.64 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 155/28 ⇜ (181/32 → 363/64) ⇝ 81/14 | note:71 gain:0.064 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 155/28 ⇜ (181/32 → 363/64) ⇝ 81/14 | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 155/28 ⇜ (181/32 → 363/64) ⇝ 81/14 | note:77 gain:0.064 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 155/28 ⇜ (181/32 → 363/64) ⇝ 81/14 | note:81 gain:0.064 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 11/2 ⇜ (363/64 → 91/16) ⇝ 23/4 | note:G2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 155/28 ⇜ (363/64 → 91/16) ⇝ 81/14 | note:71 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 155/28 ⇜ (363/64 → 91/16) ⇝ 81/14 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 155/28 ⇜ (363/64 → 91/16) ⇝ 81/14 | note:77 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 155/28 ⇜ (363/64 → 91/16) ⇝ 81/14 | note:81 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 11/2 ⇜ (91/16 → 365/64) ⇝ 23/4 | note:G2 gain:0.44 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 155/28 ⇜ (91/16 → 365/64) ⇝ 81/14 | note:71 gain:0.044 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 155/28 ⇜ (91/16 → 365/64) ⇝ 81/14 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 155/28 ⇜ (91/16 → 365/64) ⇝ 81/14 | note:77 gain:0.044 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 155/28 ⇜ (91/16 → 365/64) ⇝ 81/14 | note:81 gain:0.044 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 11/2 ⇜ (365/64 → 183/32) ⇝ 23/4 | note:G2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 155/28 ⇜ (365/64 → 183/32) ⇝ 81/14 | note:71 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 155/28 ⇜ (365/64 → 183/32) ⇝ 81/14 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 155/28 ⇜ (365/64 → 183/32) ⇝ 81/14 | note:77 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 155/28 ⇜ (365/64 → 183/32) ⇝ 81/14 | note:81 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 11/2 ⇜ (183/32 → 367/64) ⇝ 23/4 | note:G2 gain:0.24 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 155/28 ⇜ (183/32 → 367/64) ⇝ 81/14 | note:71 gain:0.024 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 155/28 ⇜ (183/32 → 367/64) ⇝ 81/14 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 155/28 ⇜ (183/32 → 367/64) ⇝ 81/14 | note:77 gain:0.024 clip:1 s:piano release:0.1 pan:0.606481481481 ]", "[ 155/28 ⇜ (183/32 → 367/64) ⇝ 81/14 | note:81 gain:0.024 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 11/2 ⇜ (367/64 → 23/4) | note:G2 gain:0.2985786437626913 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 155/28 ⇜ (367/64 → 23/4) ⇝ 81/14 | note:71 gain:0.02985786437626913 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 155/28 ⇜ (367/64 → 23/4) ⇝ 81/14 | note:76 gain:0.02985786437626913 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 155/28 ⇜ (367/64 → 23/4) ⇝ 81/14 | note:77 gain:0.02985786437626913 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 155/28 ⇜ (367/64 → 23/4) ⇝ 81/14 | note:81 gain:0.02985786437626913 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 155/28 ⇜ (23/4 → 369/64) ⇝ 81/14 | note:71 gain:0.04399999999999949 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 155/28 ⇜ (23/4 → 369/64) ⇝ 81/14 | note:76 gain:0.04399999999999949 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 155/28 ⇜ (23/4 → 369/64) ⇝ 81/14 | note:77 gain:0.04399999999999949 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 155/28 ⇜ (23/4 → 369/64) ⇝ 81/14 | note:81 gain:0.04399999999999949 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ (23/4 → 369/64) ⇝ 47/8 | note:D5 gain:0.4399999999999949 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ (23/4 → 369/64) ⇝ 47/8 | note:F5 gain:0.4399999999999949 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ (23/4 → 369/64) ⇝ 6/1 | note:B3 gain:0.21999999999999745 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ (23/4 → 369/64) ⇝ 6/1 | note:E4 gain:0.21999999999999745 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (23/4 → 369/64) ⇝ 6/1 | note:F4 gain:0.21999999999999745 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ (23/4 → 369/64) ⇝ 6/1 | note:A4 gain:0.21999999999999745 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 155/28 ⇜ (369/64 → 185/32) ⇝ 81/14 | note:71 gain:0.05814213562373095 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 155/28 ⇜ (369/64 → 185/32) ⇝ 81/14 | note:76 gain:0.05814213562373095 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 155/28 ⇜ (369/64 → 185/32) ⇝ 81/14 | note:77 gain:0.05814213562373095 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 155/28 ⇜ (369/64 → 185/32) ⇝ 81/14 | note:81 gain:0.05814213562373095 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 23/4 ⇜ (369/64 → 185/32) ⇝ 47/8 | note:D5 gain:0.5814213562373095 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 23/4 ⇜ (369/64 → 185/32) ⇝ 47/8 | note:F5 gain:0.5814213562373095 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 23/4 ⇜ (369/64 → 185/32) ⇝ 6/1 | note:B3 gain:0.29071067811865475 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 23/4 ⇜ (369/64 → 185/32) ⇝ 6/1 | note:E4 gain:0.29071067811865475 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 23/4 ⇜ (369/64 → 185/32) ⇝ 6/1 | note:F4 gain:0.29071067811865475 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 23/4 ⇜ (369/64 → 185/32) ⇝ 6/1 | note:A4 gain:0.29071067811865475 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 155/28 ⇜ (185/32 → 81/14) | note:71 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 155/28 ⇜ (185/32 → 81/14) | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 155/28 ⇜ (185/32 → 81/14) | note:77 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 155/28 ⇜ (185/32 → 81/14) | note:81 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 23/4 ⇜ (185/32 → 371/64) ⇝ 47/8 | note:D5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 23/4 ⇜ (185/32 → 371/64) ⇝ 47/8 | note:F5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 23/4 ⇜ (185/32 → 371/64) ⇝ 6/1 | note:B3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 23/4 ⇜ (185/32 → 371/64) ⇝ 6/1 | note:E4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 23/4 ⇜ (185/32 → 371/64) ⇝ 6/1 | note:F4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 23/4 ⇜ (185/32 → 371/64) ⇝ 6/1 | note:A4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 23/4 ⇜ (371/64 → 93/16) ⇝ 47/8 | note:D5 gain:0.5814213562373102 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 23/4 ⇜ (371/64 → 93/16) ⇝ 47/8 | note:F5 gain:0.5814213562373102 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 23/4 ⇜ (371/64 → 93/16) ⇝ 6/1 | note:B3 gain:0.2907106781186551 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 23/4 ⇜ (371/64 → 93/16) ⇝ 6/1 | note:E4 gain:0.2907106781186551 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 23/4 ⇜ (371/64 → 93/16) ⇝ 6/1 | note:F4 gain:0.2907106781186551 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 23/4 ⇜ (371/64 → 93/16) ⇝ 6/1 | note:A4 gain:0.2907106781186551 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 23/4 ⇜ (93/16 → 373/64) ⇝ 47/8 | note:D5 gain:0.4400000000000073 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 23/4 ⇜ (93/16 → 373/64) ⇝ 47/8 | note:F5 gain:0.4400000000000073 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 23/4 ⇜ (93/16 → 373/64) ⇝ 6/1 | note:B3 gain:0.22000000000000364 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 23/4 ⇜ (93/16 → 373/64) ⇝ 6/1 | note:E4 gain:0.22000000000000364 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 23/4 ⇜ (93/16 → 373/64) ⇝ 6/1 | note:F4 gain:0.22000000000000364 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 23/4 ⇜ (93/16 → 373/64) ⇝ 6/1 | note:A4 gain:0.22000000000000364 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 23/4 ⇜ (373/64 → 187/32) ⇝ 47/8 | note:D5 gain:0.298578643762692 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 23/4 ⇜ (373/64 → 187/32) ⇝ 47/8 | note:F5 gain:0.298578643762692 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 23/4 ⇜ (373/64 → 187/32) ⇝ 6/1 | note:B3 gain:0.149289321881346 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 23/4 ⇜ (373/64 → 187/32) ⇝ 6/1 | note:E4 gain:0.149289321881346 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 23/4 ⇜ (373/64 → 187/32) ⇝ 6/1 | note:F4 gain:0.149289321881346 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 23/4 ⇜ (373/64 → 187/32) ⇝ 6/1 | note:A4 gain:0.149289321881346 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 23/4 ⇜ (187/32 → 375/64) ⇝ 47/8 | note:D5 gain:0.24 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 23/4 ⇜ (187/32 → 375/64) ⇝ 47/8 | note:F5 gain:0.24 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 23/4 ⇜ (187/32 → 375/64) ⇝ 6/1 | note:B3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 23/4 ⇜ (187/32 → 375/64) ⇝ 6/1 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 23/4 ⇜ (187/32 → 375/64) ⇝ 6/1 | note:F4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 23/4 ⇜ (187/32 → 375/64) ⇝ 6/1 | note:A4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 23/4 ⇜ (375/64 → 47/8) | note:D5 gain:0.2985786437626882 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 23/4 ⇜ (375/64 → 47/8) | note:F5 gain:0.2985786437626882 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 23/4 ⇜ (375/64 → 47/8) ⇝ 6/1 | note:B3 gain:0.1492893218813441 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 23/4 ⇜ (375/64 → 47/8) ⇝ 6/1 | note:E4 gain:0.1492893218813441 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 23/4 ⇜ (375/64 → 47/8) ⇝ 6/1 | note:F4 gain:0.1492893218813441 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 23/4 ⇜ (375/64 → 47/8) ⇝ 6/1 | note:A4 gain:0.1492893218813441 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 23/4 ⇜ (47/8 → 377/64) ⇝ 6/1 | note:B3 gain:0.220000000000001 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 23/4 ⇜ (47/8 → 377/64) ⇝ 6/1 | note:E4 gain:0.220000000000001 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 23/4 ⇜ (47/8 → 377/64) ⇝ 6/1 | note:F4 gain:0.220000000000001 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 23/4 ⇜ (47/8 → 377/64) ⇝ 6/1 | note:A4 gain:0.220000000000001 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 23/4 ⇜ (377/64 → 189/32) ⇝ 6/1 | note:B3 gain:0.2907106781186532 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 23/4 ⇜ (377/64 → 189/32) ⇝ 6/1 | note:E4 gain:0.2907106781186532 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 23/4 ⇜ (377/64 → 189/32) ⇝ 6/1 | note:F4 gain:0.2907106781186532 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 23/4 ⇜ (377/64 → 189/32) ⇝ 6/1 | note:A4 gain:0.2907106781186532 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 23/4 ⇜ (189/32 → 379/64) ⇝ 6/1 | note:B3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 23/4 ⇜ (189/32 → 379/64) ⇝ 6/1 | note:E4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 23/4 ⇜ (189/32 → 379/64) ⇝ 6/1 | note:F4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 23/4 ⇜ (189/32 → 379/64) ⇝ 6/1 | note:A4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 23/4 ⇜ (379/64 → 95/16) ⇝ 6/1 | note:B3 gain:0.2907106781186567 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 23/4 ⇜ (379/64 → 95/16) ⇝ 6/1 | note:E4 gain:0.2907106781186567 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 23/4 ⇜ (379/64 → 95/16) ⇝ 6/1 | note:F4 gain:0.2907106781186567 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 23/4 ⇜ (379/64 → 95/16) ⇝ 6/1 | note:A4 gain:0.2907106781186567 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 23/4 ⇜ (95/16 → 381/64) ⇝ 6/1 | note:B3 gain:0.2200000000000001 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 23/4 ⇜ (95/16 → 381/64) ⇝ 6/1 | note:E4 gain:0.2200000000000001 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 23/4 ⇜ (95/16 → 381/64) ⇝ 6/1 | note:F4 gain:0.2200000000000001 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 23/4 ⇜ (95/16 → 381/64) ⇝ 6/1 | note:A4 gain:0.2200000000000001 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 23/4 ⇜ (381/64 → 191/32) ⇝ 6/1 | note:B3 gain:0.14928932188134753 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 23/4 ⇜ (381/64 → 191/32) ⇝ 6/1 | note:E4 gain:0.14928932188134753 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 23/4 ⇜ (381/64 → 191/32) ⇝ 6/1 | note:F4 gain:0.14928932188134753 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 23/4 ⇜ (381/64 → 191/32) ⇝ 6/1 | note:A4 gain:0.14928932188134753 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 23/4 ⇜ (191/32 → 383/64) ⇝ 6/1 | note:B3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 23/4 ⇜ (191/32 → 383/64) ⇝ 6/1 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 23/4 ⇜ (191/32 → 383/64) ⇝ 6/1 | note:F4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 23/4 ⇜ (191/32 → 383/64) ⇝ 6/1 | note:A4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 23/4 ⇜ (383/64 → 6/1) | note:B3 gain:0.1492893218813426 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 23/4 ⇜ (383/64 → 6/1) | note:E4 gain:0.1492893218813426 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 23/4 ⇜ (383/64 → 6/1) | note:F4 gain:0.1492893218813426 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 23/4 ⇜ (383/64 → 6/1) | note:A4 gain:0.1492893218813426 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ (6/1 → 385/64) ⇝ 25/4 | note:F#2 gain:0.43999999999999767 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 6/1 ⇜ (385/64 → 193/32) ⇝ 25/4 | note:F#2 gain:0.5814213562373115 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 6/1 ⇜ (193/32 → 387/64) ⇝ 25/4 | note:F#2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ (169/28 → 387/64) ⇝ 44/7 | note:71 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ (169/28 → 387/64) ⇝ 44/7 | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ (169/28 → 387/64) ⇝ 44/7 | note:77 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ (169/28 → 387/64) ⇝ 44/7 | note:81 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 6/1 ⇜ (387/64 → 97/16) ⇝ 25/4 | note:F#2 gain:0.5814213562373083 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 169/28 ⇜ (387/64 → 97/16) ⇝ 44/7 | note:71 gain:0.05814213562373083 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 169/28 ⇜ (387/64 → 97/16) ⇝ 44/7 | note:76 gain:0.05814213562373083 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 169/28 ⇜ (387/64 → 97/16) ⇝ 44/7 | note:77 gain:0.05814213562373083 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 169/28 ⇜ (387/64 → 97/16) ⇝ 44/7 | note:81 gain:0.05814213562373083 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 6/1 ⇜ (97/16 → 389/64) ⇝ 25/4 | note:F#2 gain:0.4400000000000045 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 169/28 ⇜ (97/16 → 389/64) ⇝ 44/7 | note:71 gain:0.044000000000000455 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 169/28 ⇜ (97/16 → 389/64) ⇝ 44/7 | note:76 gain:0.044000000000000455 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 169/28 ⇜ (97/16 → 389/64) ⇝ 44/7 | note:77 gain:0.044000000000000455 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 169/28 ⇜ (97/16 → 389/64) ⇝ 44/7 | note:81 gain:0.044000000000000455 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 6/1 ⇜ (389/64 → 195/32) ⇝ 25/4 | note:F#2 gain:0.29857864376269 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 169/28 ⇜ (389/64 → 195/32) ⇝ 44/7 | note:71 gain:0.029857864376269 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 169/28 ⇜ (389/64 → 195/32) ⇝ 44/7 | note:76 gain:0.029857864376269 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 169/28 ⇜ (389/64 → 195/32) ⇝ 44/7 | note:77 gain:0.029857864376269 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 169/28 ⇜ (389/64 → 195/32) ⇝ 44/7 | note:81 gain:0.029857864376269 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 6/1 ⇜ (195/32 → 391/64) ⇝ 25/4 | note:F#2 gain:0.24 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 169/28 ⇜ (195/32 → 391/64) ⇝ 44/7 | note:71 gain:0.024 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 169/28 ⇜ (195/32 → 391/64) ⇝ 44/7 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 169/28 ⇜ (195/32 → 391/64) ⇝ 44/7 | note:77 gain:0.024 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", + "[ 11/2 ⇜ (367/64 → 23/4) | note:G2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 155/28 ⇜ (367/64 → 23/4) ⇝ 81/14 | note:71 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 155/28 ⇜ (367/64 → 23/4) ⇝ 81/14 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 155/28 ⇜ (367/64 → 23/4) ⇝ 81/14 | note:77 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 155/28 ⇜ (367/64 → 23/4) ⇝ 81/14 | note:81 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 155/28 ⇜ (23/4 → 369/64) ⇝ 81/14 | note:71 gain:0.044 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 155/28 ⇜ (23/4 → 369/64) ⇝ 81/14 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 155/28 ⇜ (23/4 → 369/64) ⇝ 81/14 | note:77 gain:0.044 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 155/28 ⇜ (23/4 → 369/64) ⇝ 81/14 | note:81 gain:0.044 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ (23/4 → 369/64) ⇝ 47/8 | note:D5 gain:0.44 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ (23/4 → 369/64) ⇝ 47/8 | note:F5 gain:0.44 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ (23/4 → 369/64) ⇝ 6/1 | note:B3 gain:0.22 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ (23/4 → 369/64) ⇝ 6/1 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (23/4 → 369/64) ⇝ 6/1 | note:F4 gain:0.22 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ (23/4 → 369/64) ⇝ 6/1 | note:A4 gain:0.22 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 155/28 ⇜ (369/64 → 185/32) ⇝ 81/14 | note:71 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 155/28 ⇜ (369/64 → 185/32) ⇝ 81/14 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 155/28 ⇜ (369/64 → 185/32) ⇝ 81/14 | note:77 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 155/28 ⇜ (369/64 → 185/32) ⇝ 81/14 | note:81 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 23/4 ⇜ (369/64 → 185/32) ⇝ 47/8 | note:D5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 23/4 ⇜ (369/64 → 185/32) ⇝ 47/8 | note:F5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 23/4 ⇜ (369/64 → 185/32) ⇝ 6/1 | note:B3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 23/4 ⇜ (369/64 → 185/32) ⇝ 6/1 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 23/4 ⇜ (369/64 → 185/32) ⇝ 6/1 | note:F4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 23/4 ⇜ (369/64 → 185/32) ⇝ 6/1 | note:A4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 155/28 ⇜ (185/32 → 81/14) | note:71 gain:0.064 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 155/28 ⇜ (185/32 → 81/14) | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 155/28 ⇜ (185/32 → 81/14) | note:77 gain:0.064 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 155/28 ⇜ (185/32 → 81/14) | note:81 gain:0.064 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 23/4 ⇜ (185/32 → 371/64) ⇝ 47/8 | note:D5 gain:0.64 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 23/4 ⇜ (185/32 → 371/64) ⇝ 47/8 | note:F5 gain:0.64 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 23/4 ⇜ (185/32 → 371/64) ⇝ 6/1 | note:B3 gain:0.32 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 23/4 ⇜ (185/32 → 371/64) ⇝ 6/1 | note:E4 gain:0.32 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 23/4 ⇜ (185/32 → 371/64) ⇝ 6/1 | note:F4 gain:0.32 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 23/4 ⇜ (185/32 → 371/64) ⇝ 6/1 | note:A4 gain:0.32 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 23/4 ⇜ (371/64 → 93/16) ⇝ 47/8 | note:D5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 23/4 ⇜ (371/64 → 93/16) ⇝ 47/8 | note:F5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 23/4 ⇜ (371/64 → 93/16) ⇝ 6/1 | note:B3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 23/4 ⇜ (371/64 → 93/16) ⇝ 6/1 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 23/4 ⇜ (371/64 → 93/16) ⇝ 6/1 | note:F4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 23/4 ⇜ (371/64 → 93/16) ⇝ 6/1 | note:A4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 23/4 ⇜ (93/16 → 373/64) ⇝ 47/8 | note:D5 gain:0.44 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 23/4 ⇜ (93/16 → 373/64) ⇝ 47/8 | note:F5 gain:0.44 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 23/4 ⇜ (93/16 → 373/64) ⇝ 6/1 | note:B3 gain:0.22 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 23/4 ⇜ (93/16 → 373/64) ⇝ 6/1 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 23/4 ⇜ (93/16 → 373/64) ⇝ 6/1 | note:F4 gain:0.22 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 23/4 ⇜ (93/16 → 373/64) ⇝ 6/1 | note:A4 gain:0.22 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 23/4 ⇜ (373/64 → 187/32) ⇝ 47/8 | note:D5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 23/4 ⇜ (373/64 → 187/32) ⇝ 47/8 | note:F5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 23/4 ⇜ (373/64 → 187/32) ⇝ 6/1 | note:B3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 23/4 ⇜ (373/64 → 187/32) ⇝ 6/1 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 23/4 ⇜ (373/64 → 187/32) ⇝ 6/1 | note:F4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 23/4 ⇜ (373/64 → 187/32) ⇝ 6/1 | note:A4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 23/4 ⇜ (187/32 → 375/64) ⇝ 47/8 | note:D5 gain:0.24 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 23/4 ⇜ (187/32 → 375/64) ⇝ 47/8 | note:F5 gain:0.24 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 23/4 ⇜ (187/32 → 375/64) ⇝ 6/1 | note:B3 gain:0.12 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 23/4 ⇜ (187/32 → 375/64) ⇝ 6/1 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 23/4 ⇜ (187/32 → 375/64) ⇝ 6/1 | note:F4 gain:0.12 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 23/4 ⇜ (187/32 → 375/64) ⇝ 6/1 | note:A4 gain:0.12 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 23/4 ⇜ (375/64 → 47/8) | note:D5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 23/4 ⇜ (375/64 → 47/8) | note:F5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 23/4 ⇜ (375/64 → 47/8) ⇝ 6/1 | note:B3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 23/4 ⇜ (375/64 → 47/8) ⇝ 6/1 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 23/4 ⇜ (375/64 → 47/8) ⇝ 6/1 | note:F4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 23/4 ⇜ (375/64 → 47/8) ⇝ 6/1 | note:A4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 23/4 ⇜ (47/8 → 377/64) ⇝ 6/1 | note:B3 gain:0.22 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 23/4 ⇜ (47/8 → 377/64) ⇝ 6/1 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 23/4 ⇜ (47/8 → 377/64) ⇝ 6/1 | note:F4 gain:0.22 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 23/4 ⇜ (47/8 → 377/64) ⇝ 6/1 | note:A4 gain:0.22 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 23/4 ⇜ (377/64 → 189/32) ⇝ 6/1 | note:B3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 23/4 ⇜ (377/64 → 189/32) ⇝ 6/1 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 23/4 ⇜ (377/64 → 189/32) ⇝ 6/1 | note:F4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 23/4 ⇜ (377/64 → 189/32) ⇝ 6/1 | note:A4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 23/4 ⇜ (189/32 → 379/64) ⇝ 6/1 | note:B3 gain:0.32 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 23/4 ⇜ (189/32 → 379/64) ⇝ 6/1 | note:E4 gain:0.32 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 23/4 ⇜ (189/32 → 379/64) ⇝ 6/1 | note:F4 gain:0.32 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 23/4 ⇜ (189/32 → 379/64) ⇝ 6/1 | note:A4 gain:0.32 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 23/4 ⇜ (379/64 → 95/16) ⇝ 6/1 | note:B3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 23/4 ⇜ (379/64 → 95/16) ⇝ 6/1 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 23/4 ⇜ (379/64 → 95/16) ⇝ 6/1 | note:F4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 23/4 ⇜ (379/64 → 95/16) ⇝ 6/1 | note:A4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 23/4 ⇜ (95/16 → 381/64) ⇝ 6/1 | note:B3 gain:0.22 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 23/4 ⇜ (95/16 → 381/64) ⇝ 6/1 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 23/4 ⇜ (95/16 → 381/64) ⇝ 6/1 | note:F4 gain:0.22 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 23/4 ⇜ (95/16 → 381/64) ⇝ 6/1 | note:A4 gain:0.22 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 23/4 ⇜ (381/64 → 191/32) ⇝ 6/1 | note:B3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 23/4 ⇜ (381/64 → 191/32) ⇝ 6/1 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 23/4 ⇜ (381/64 → 191/32) ⇝ 6/1 | note:F4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 23/4 ⇜ (381/64 → 191/32) ⇝ 6/1 | note:A4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 23/4 ⇜ (191/32 → 383/64) ⇝ 6/1 | note:B3 gain:0.12 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 23/4 ⇜ (191/32 → 383/64) ⇝ 6/1 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 23/4 ⇜ (191/32 → 383/64) ⇝ 6/1 | note:F4 gain:0.12 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 23/4 ⇜ (191/32 → 383/64) ⇝ 6/1 | note:A4 gain:0.12 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 23/4 ⇜ (383/64 → 6/1) | note:B3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 23/4 ⇜ (383/64 → 6/1) | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 23/4 ⇜ (383/64 → 6/1) | note:F4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 23/4 ⇜ (383/64 → 6/1) | note:A4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ (6/1 → 385/64) ⇝ 25/4 | note:F#2 gain:0.44 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 6/1 ⇜ (385/64 → 193/32) ⇝ 25/4 | note:F#2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 6/1 ⇜ (193/32 → 387/64) ⇝ 25/4 | note:F#2 gain:0.64 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ (169/28 → 387/64) ⇝ 44/7 | note:71 gain:0.064 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ (169/28 → 387/64) ⇝ 44/7 | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ (169/28 → 387/64) ⇝ 44/7 | note:77 gain:0.064 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ (169/28 → 387/64) ⇝ 44/7 | note:81 gain:0.064 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 6/1 ⇜ (387/64 → 97/16) ⇝ 25/4 | note:F#2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 169/28 ⇜ (387/64 → 97/16) ⇝ 44/7 | note:71 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 169/28 ⇜ (387/64 → 97/16) ⇝ 44/7 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 169/28 ⇜ (387/64 → 97/16) ⇝ 44/7 | note:77 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 169/28 ⇜ (387/64 → 97/16) ⇝ 44/7 | note:81 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 6/1 ⇜ (97/16 → 389/64) ⇝ 25/4 | note:F#2 gain:0.44 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 169/28 ⇜ (97/16 → 389/64) ⇝ 44/7 | note:71 gain:0.044 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 169/28 ⇜ (97/16 → 389/64) ⇝ 44/7 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 169/28 ⇜ (97/16 → 389/64) ⇝ 44/7 | note:77 gain:0.044 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 169/28 ⇜ (97/16 → 389/64) ⇝ 44/7 | note:81 gain:0.044 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 6/1 ⇜ (389/64 → 195/32) ⇝ 25/4 | note:F#2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 169/28 ⇜ (389/64 → 195/32) ⇝ 44/7 | note:71 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 169/28 ⇜ (389/64 → 195/32) ⇝ 44/7 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 169/28 ⇜ (389/64 → 195/32) ⇝ 44/7 | note:77 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 169/28 ⇜ (389/64 → 195/32) ⇝ 44/7 | note:81 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 6/1 ⇜ (195/32 → 391/64) ⇝ 25/4 | note:F#2 gain:0.24 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 169/28 ⇜ (195/32 → 391/64) ⇝ 44/7 | note:71 gain:0.024 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 169/28 ⇜ (195/32 → 391/64) ⇝ 44/7 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 169/28 ⇜ (195/32 → 391/64) ⇝ 44/7 | note:77 gain:0.024 clip:1 s:piano release:0.1 pan:0.606481481481 ]", "[ 169/28 ⇜ (195/32 → 391/64) ⇝ 44/7 | note:81 gain:0.024 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 6/1 ⇜ (391/64 → 49/8) ⇝ 25/4 | note:F#2 gain:0.2985786437626902 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 169/28 ⇜ (391/64 → 49/8) ⇝ 44/7 | note:71 gain:0.029857864376269024 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 169/28 ⇜ (391/64 → 49/8) ⇝ 44/7 | note:76 gain:0.029857864376269024 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 169/28 ⇜ (391/64 → 49/8) ⇝ 44/7 | note:77 gain:0.029857864376269024 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 169/28 ⇜ (391/64 → 49/8) ⇝ 44/7 | note:81 gain:0.029857864376269024 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 6/1 ⇜ (49/8 → 393/64) ⇝ 25/4 | note:F#2 gain:0.4399999999999933 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 169/28 ⇜ (49/8 → 393/64) ⇝ 44/7 | note:71 gain:0.04399999999999933 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 169/28 ⇜ (49/8 → 393/64) ⇝ 44/7 | note:76 gain:0.04399999999999933 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 169/28 ⇜ (49/8 → 393/64) ⇝ 44/7 | note:77 gain:0.04399999999999933 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 169/28 ⇜ (49/8 → 393/64) ⇝ 44/7 | note:81 gain:0.04399999999999933 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ (49/8 → 393/64) ⇝ 25/4 | note:F#4 gain:0.4399999999999933 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ (49/8 → 393/64) ⇝ 25/4 | note:A#4 gain:0.4399999999999933 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 6/1 ⇜ (393/64 → 197/32) ⇝ 25/4 | note:F#2 gain:0.5814213562373084 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 169/28 ⇜ (393/64 → 197/32) ⇝ 44/7 | note:71 gain:0.05814213562373084 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 169/28 ⇜ (393/64 → 197/32) ⇝ 44/7 | note:76 gain:0.05814213562373084 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 169/28 ⇜ (393/64 → 197/32) ⇝ 44/7 | note:77 gain:0.05814213562373084 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 169/28 ⇜ (393/64 → 197/32) ⇝ 44/7 | note:81 gain:0.05814213562373084 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 49/8 ⇜ (393/64 → 197/32) ⇝ 25/4 | note:F#4 gain:0.5814213562373084 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 49/8 ⇜ (393/64 → 197/32) ⇝ 25/4 | note:A#4 gain:0.5814213562373084 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 6/1 ⇜ (197/32 → 395/64) ⇝ 25/4 | note:F#2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 169/28 ⇜ (197/32 → 395/64) ⇝ 44/7 | note:71 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 169/28 ⇜ (197/32 → 395/64) ⇝ 44/7 | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 169/28 ⇜ (197/32 → 395/64) ⇝ 44/7 | note:77 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 169/28 ⇜ (197/32 → 395/64) ⇝ 44/7 | note:81 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 49/8 ⇜ (197/32 → 395/64) ⇝ 25/4 | note:F#4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 49/8 ⇜ (197/32 → 395/64) ⇝ 25/4 | note:A#4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 6/1 ⇜ (395/64 → 99/16) ⇝ 25/4 | note:F#2 gain:0.5814213562373114 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 169/28 ⇜ (395/64 → 99/16) ⇝ 44/7 | note:71 gain:0.05814213562373114 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 169/28 ⇜ (395/64 → 99/16) ⇝ 44/7 | note:76 gain:0.05814213562373114 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 169/28 ⇜ (395/64 → 99/16) ⇝ 44/7 | note:77 gain:0.05814213562373114 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 169/28 ⇜ (395/64 → 99/16) ⇝ 44/7 | note:81 gain:0.05814213562373114 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 49/8 ⇜ (395/64 → 99/16) ⇝ 25/4 | note:F#4 gain:0.5814213562373114 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 49/8 ⇜ (395/64 → 99/16) ⇝ 25/4 | note:A#4 gain:0.5814213562373114 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 6/1 ⇜ (99/16 → 397/64) ⇝ 25/4 | note:F#2 gain:0.4399999999999975 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 169/28 ⇜ (99/16 → 397/64) ⇝ 44/7 | note:71 gain:0.043999999999999755 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 169/28 ⇜ (99/16 → 397/64) ⇝ 44/7 | note:76 gain:0.043999999999999755 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 169/28 ⇜ (99/16 → 397/64) ⇝ 44/7 | note:77 gain:0.043999999999999755 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 169/28 ⇜ (99/16 → 397/64) ⇝ 44/7 | note:81 gain:0.043999999999999755 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 49/8 ⇜ (99/16 → 397/64) ⇝ 25/4 | note:F#4 gain:0.4399999999999975 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 49/8 ⇜ (99/16 → 397/64) ⇝ 25/4 | note:A#4 gain:0.4399999999999975 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 6/1 ⇜ (397/64 → 199/32) ⇝ 25/4 | note:F#2 gain:0.2985786437626931 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 169/28 ⇜ (397/64 → 199/32) ⇝ 44/7 | note:71 gain:0.029857864376269312 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 169/28 ⇜ (397/64 → 199/32) ⇝ 44/7 | note:76 gain:0.029857864376269312 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 169/28 ⇜ (397/64 → 199/32) ⇝ 44/7 | note:77 gain:0.029857864376269312 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 169/28 ⇜ (397/64 → 199/32) ⇝ 44/7 | note:81 gain:0.029857864376269312 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 49/8 ⇜ (397/64 → 199/32) ⇝ 25/4 | note:F#4 gain:0.2985786437626931 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 49/8 ⇜ (397/64 → 199/32) ⇝ 25/4 | note:A#4 gain:0.2985786437626931 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 6/1 ⇜ (199/32 → 399/64) ⇝ 25/4 | note:F#2 gain:0.24 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 169/28 ⇜ (199/32 → 399/64) ⇝ 44/7 | note:71 gain:0.024 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 169/28 ⇜ (199/32 → 399/64) ⇝ 44/7 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 169/28 ⇜ (199/32 → 399/64) ⇝ 44/7 | note:77 gain:0.024 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", + "[ 6/1 ⇜ (391/64 → 49/8) ⇝ 25/4 | note:F#2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 169/28 ⇜ (391/64 → 49/8) ⇝ 44/7 | note:71 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 169/28 ⇜ (391/64 → 49/8) ⇝ 44/7 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 169/28 ⇜ (391/64 → 49/8) ⇝ 44/7 | note:77 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 169/28 ⇜ (391/64 → 49/8) ⇝ 44/7 | note:81 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 6/1 ⇜ (49/8 → 393/64) ⇝ 25/4 | note:F#2 gain:0.44 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 169/28 ⇜ (49/8 → 393/64) ⇝ 44/7 | note:71 gain:0.044 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 169/28 ⇜ (49/8 → 393/64) ⇝ 44/7 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 169/28 ⇜ (49/8 → 393/64) ⇝ 44/7 | note:77 gain:0.044 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 169/28 ⇜ (49/8 → 393/64) ⇝ 44/7 | note:81 gain:0.044 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ (49/8 → 393/64) ⇝ 25/4 | note:F#4 gain:0.44 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ (49/8 → 393/64) ⇝ 25/4 | note:A#4 gain:0.44 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 6/1 ⇜ (393/64 → 197/32) ⇝ 25/4 | note:F#2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 169/28 ⇜ (393/64 → 197/32) ⇝ 44/7 | note:71 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 169/28 ⇜ (393/64 → 197/32) ⇝ 44/7 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 169/28 ⇜ (393/64 → 197/32) ⇝ 44/7 | note:77 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 169/28 ⇜ (393/64 → 197/32) ⇝ 44/7 | note:81 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 49/8 ⇜ (393/64 → 197/32) ⇝ 25/4 | note:F#4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 49/8 ⇜ (393/64 → 197/32) ⇝ 25/4 | note:A#4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 6/1 ⇜ (197/32 → 395/64) ⇝ 25/4 | note:F#2 gain:0.64 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 169/28 ⇜ (197/32 → 395/64) ⇝ 44/7 | note:71 gain:0.064 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 169/28 ⇜ (197/32 → 395/64) ⇝ 44/7 | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 169/28 ⇜ (197/32 → 395/64) ⇝ 44/7 | note:77 gain:0.064 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 169/28 ⇜ (197/32 → 395/64) ⇝ 44/7 | note:81 gain:0.064 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 49/8 ⇜ (197/32 → 395/64) ⇝ 25/4 | note:F#4 gain:0.64 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 49/8 ⇜ (197/32 → 395/64) ⇝ 25/4 | note:A#4 gain:0.64 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 6/1 ⇜ (395/64 → 99/16) ⇝ 25/4 | note:F#2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 169/28 ⇜ (395/64 → 99/16) ⇝ 44/7 | note:71 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 169/28 ⇜ (395/64 → 99/16) ⇝ 44/7 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 169/28 ⇜ (395/64 → 99/16) ⇝ 44/7 | note:77 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 169/28 ⇜ (395/64 → 99/16) ⇝ 44/7 | note:81 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 49/8 ⇜ (395/64 → 99/16) ⇝ 25/4 | note:F#4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 49/8 ⇜ (395/64 → 99/16) ⇝ 25/4 | note:A#4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 6/1 ⇜ (99/16 → 397/64) ⇝ 25/4 | note:F#2 gain:0.44 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 169/28 ⇜ (99/16 → 397/64) ⇝ 44/7 | note:71 gain:0.044 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 169/28 ⇜ (99/16 → 397/64) ⇝ 44/7 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 169/28 ⇜ (99/16 → 397/64) ⇝ 44/7 | note:77 gain:0.044 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 169/28 ⇜ (99/16 → 397/64) ⇝ 44/7 | note:81 gain:0.044 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 49/8 ⇜ (99/16 → 397/64) ⇝ 25/4 | note:F#4 gain:0.44 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 49/8 ⇜ (99/16 → 397/64) ⇝ 25/4 | note:A#4 gain:0.44 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 6/1 ⇜ (397/64 → 199/32) ⇝ 25/4 | note:F#2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 169/28 ⇜ (397/64 → 199/32) ⇝ 44/7 | note:71 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 169/28 ⇜ (397/64 → 199/32) ⇝ 44/7 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 169/28 ⇜ (397/64 → 199/32) ⇝ 44/7 | note:77 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 169/28 ⇜ (397/64 → 199/32) ⇝ 44/7 | note:81 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 49/8 ⇜ (397/64 → 199/32) ⇝ 25/4 | note:F#4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 49/8 ⇜ (397/64 → 199/32) ⇝ 25/4 | note:A#4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 6/1 ⇜ (199/32 → 399/64) ⇝ 25/4 | note:F#2 gain:0.24 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 169/28 ⇜ (199/32 → 399/64) ⇝ 44/7 | note:71 gain:0.024 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 169/28 ⇜ (199/32 → 399/64) ⇝ 44/7 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 169/28 ⇜ (199/32 → 399/64) ⇝ 44/7 | note:77 gain:0.024 clip:1 s:piano release:0.1 pan:0.606481481481 ]", "[ 169/28 ⇜ (199/32 → 399/64) ⇝ 44/7 | note:81 gain:0.024 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 49/8 ⇜ (199/32 → 399/64) ⇝ 25/4 | note:F#4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 49/8 ⇜ (199/32 → 399/64) ⇝ 25/4 | note:A#4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 6/1 ⇜ (399/64 → 25/4) | note:F#2 gain:0.2985786437626871 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 169/28 ⇜ (399/64 → 25/4) ⇝ 44/7 | note:71 gain:0.029857864376268712 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 169/28 ⇜ (399/64 → 25/4) ⇝ 44/7 | note:76 gain:0.029857864376268712 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 169/28 ⇜ (399/64 → 25/4) ⇝ 44/7 | note:77 gain:0.029857864376268712 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 169/28 ⇜ (399/64 → 25/4) ⇝ 44/7 | note:81 gain:0.029857864376268712 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 49/8 ⇜ (399/64 → 25/4) | note:F#4 gain:0.2985786437626871 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 49/8 ⇜ (399/64 → 25/4) | note:A#4 gain:0.2985786437626871 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 169/28 ⇜ (25/4 → 401/64) ⇝ 44/7 | note:71 gain:0.04400000000000004 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 169/28 ⇜ (25/4 → 401/64) ⇝ 44/7 | note:76 gain:0.04400000000000004 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 169/28 ⇜ (25/4 → 401/64) ⇝ 44/7 | note:77 gain:0.04400000000000004 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 169/28 ⇜ (25/4 → 401/64) ⇝ 44/7 | note:81 gain:0.04400000000000004 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 169/28 ⇜ (401/64 → 201/32) ⇝ 44/7 | note:71 gain:0.058142135623730544 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 169/28 ⇜ (401/64 → 201/32) ⇝ 44/7 | note:76 gain:0.058142135623730544 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 169/28 ⇜ (401/64 → 201/32) ⇝ 44/7 | note:77 gain:0.058142135623730544 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 169/28 ⇜ (401/64 → 201/32) ⇝ 44/7 | note:81 gain:0.058142135623730544 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 169/28 ⇜ (201/32 → 44/7) | note:71 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 169/28 ⇜ (201/32 → 44/7) | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 169/28 ⇜ (201/32 → 44/7) | note:77 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 169/28 ⇜ (201/32 → 44/7) | note:81 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ (13/2 → 417/64) ⇝ 53/8 | note:C#5 gain:0.44000000000000317 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ (13/2 → 417/64) ⇝ 53/8 | note:E5 gain:0.44000000000000317 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ (13/2 → 417/64) ⇝ 27/4 | note:Bb3 gain:0.22000000000000158 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ (13/2 → 417/64) ⇝ 27/4 | note:Eb4 gain:0.22000000000000158 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ (13/2 → 417/64) ⇝ 27/4 | note:E4 gain:0.22000000000000158 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (13/2 → 417/64) ⇝ 27/4 | note:Ab4 gain:0.22000000000000158 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ (13/2 → 417/64) ⇝ 27/4 | note:F#2 gain:0.44000000000000317 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 13/2 ⇜ (417/64 → 209/32) ⇝ 53/8 | note:C#5 gain:0.5814213562373073 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 13/2 ⇜ (417/64 → 209/32) ⇝ 53/8 | note:E5 gain:0.5814213562373073 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 13/2 ⇜ (417/64 → 209/32) ⇝ 27/4 | note:Bb3 gain:0.29071067811865364 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 13/2 ⇜ (417/64 → 209/32) ⇝ 27/4 | note:Eb4 gain:0.29071067811865364 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 13/2 ⇜ (417/64 → 209/32) ⇝ 27/4 | note:E4 gain:0.29071067811865364 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 13/2 ⇜ (417/64 → 209/32) ⇝ 27/4 | note:Ab4 gain:0.29071067811865364 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 13/2 ⇜ (417/64 → 209/32) ⇝ 27/4 | note:F#2 gain:0.5814213562373073 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 13/2 ⇜ (209/32 → 419/64) ⇝ 53/8 | note:C#5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 13/2 ⇜ (209/32 → 419/64) ⇝ 53/8 | note:E5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 13/2 ⇜ (209/32 → 419/64) ⇝ 27/4 | note:Bb3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 13/2 ⇜ (209/32 → 419/64) ⇝ 27/4 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 13/2 ⇜ (209/32 → 419/64) ⇝ 27/4 | note:E4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 13/2 ⇜ (209/32 → 419/64) ⇝ 27/4 | note:Ab4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 13/2 ⇜ (209/32 → 419/64) ⇝ 27/4 | note:F#2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 13/2 ⇜ (419/64 → 105/16) ⇝ 53/8 | note:C#5 gain:0.5814213562373125 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 13/2 ⇜ (419/64 → 105/16) ⇝ 53/8 | note:E5 gain:0.5814213562373125 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 13/2 ⇜ (419/64 → 105/16) ⇝ 27/4 | note:Bb3 gain:0.29071067811865625 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 13/2 ⇜ (419/64 → 105/16) ⇝ 27/4 | note:Eb4 gain:0.29071067811865625 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 13/2 ⇜ (419/64 → 105/16) ⇝ 27/4 | note:E4 gain:0.29071067811865625 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 13/2 ⇜ (419/64 → 105/16) ⇝ 27/4 | note:Ab4 gain:0.29071067811865625 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 13/2 ⇜ (419/64 → 105/16) ⇝ 27/4 | note:F#2 gain:0.5814213562373125 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 13/2 ⇜ (105/16 → 421/64) ⇝ 53/8 | note:C#5 gain:0.439999999999999 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 13/2 ⇜ (105/16 → 421/64) ⇝ 53/8 | note:E5 gain:0.439999999999999 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 13/2 ⇜ (105/16 → 421/64) ⇝ 27/4 | note:Bb3 gain:0.2199999999999995 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 13/2 ⇜ (105/16 → 421/64) ⇝ 27/4 | note:Eb4 gain:0.2199999999999995 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 13/2 ⇜ (105/16 → 421/64) ⇝ 27/4 | note:E4 gain:0.2199999999999995 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 13/2 ⇜ (105/16 → 421/64) ⇝ 27/4 | note:Ab4 gain:0.2199999999999995 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 13/2 ⇜ (105/16 → 421/64) ⇝ 27/4 | note:F#2 gain:0.439999999999999 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 13/2 ⇜ (421/64 → 211/32) ⇝ 53/8 | note:C#5 gain:0.2985786437626942 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 13/2 ⇜ (421/64 → 211/32) ⇝ 53/8 | note:E5 gain:0.2985786437626942 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 13/2 ⇜ (421/64 → 211/32) ⇝ 27/4 | note:Bb3 gain:0.1492893218813471 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 13/2 ⇜ (421/64 → 211/32) ⇝ 27/4 | note:Eb4 gain:0.1492893218813471 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 13/2 ⇜ (421/64 → 211/32) ⇝ 27/4 | note:E4 gain:0.1492893218813471 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 13/2 ⇜ (421/64 → 211/32) ⇝ 27/4 | note:Ab4 gain:0.1492893218813471 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 13/2 ⇜ (421/64 → 211/32) ⇝ 27/4 | note:F#2 gain:0.2985786437626942 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 13/2 ⇜ (211/32 → 423/64) ⇝ 53/8 | note:C#5 gain:0.24 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 13/2 ⇜ (211/32 → 423/64) ⇝ 53/8 | note:E5 gain:0.24 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 13/2 ⇜ (211/32 → 423/64) ⇝ 27/4 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 13/2 ⇜ (211/32 → 423/64) ⇝ 27/4 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 13/2 ⇜ (211/32 → 423/64) ⇝ 27/4 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 13/2 ⇜ (211/32 → 423/64) ⇝ 27/4 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 13/2 ⇜ (211/32 → 423/64) ⇝ 27/4 | note:F#2 gain:0.24 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 13/2 ⇜ (423/64 → 53/8) | note:C#5 gain:0.298578643762686 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 13/2 ⇜ (423/64 → 53/8) | note:E5 gain:0.298578643762686 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 13/2 ⇜ (423/64 → 53/8) ⇝ 27/4 | note:Bb3 gain:0.149289321881343 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 13/2 ⇜ (423/64 → 53/8) ⇝ 27/4 | note:Eb4 gain:0.149289321881343 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 13/2 ⇜ (423/64 → 53/8) ⇝ 27/4 | note:E4 gain:0.149289321881343 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 13/2 ⇜ (423/64 → 53/8) ⇝ 27/4 | note:Ab4 gain:0.149289321881343 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 13/2 ⇜ (423/64 → 53/8) ⇝ 27/4 | note:F#2 gain:0.298578643762686 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 13/2 ⇜ (53/8 → 425/64) ⇝ 27/4 | note:Bb3 gain:0.21999999999999942 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 13/2 ⇜ (53/8 → 425/64) ⇝ 27/4 | note:Eb4 gain:0.21999999999999942 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 13/2 ⇜ (53/8 → 425/64) ⇝ 27/4 | note:E4 gain:0.21999999999999942 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 13/2 ⇜ (53/8 → 425/64) ⇝ 27/4 | note:Ab4 gain:0.21999999999999942 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 13/2 ⇜ (53/8 → 425/64) ⇝ 27/4 | note:F#2 gain:0.43999999999999884 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 13/2 ⇜ (425/64 → 213/32) ⇝ 27/4 | note:Bb3 gain:0.29071067811865214 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 13/2 ⇜ (425/64 → 213/32) ⇝ 27/4 | note:Eb4 gain:0.29071067811865214 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 13/2 ⇜ (425/64 → 213/32) ⇝ 27/4 | note:E4 gain:0.29071067811865214 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 13/2 ⇜ (425/64 → 213/32) ⇝ 27/4 | note:Ab4 gain:0.29071067811865214 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 13/2 ⇜ (425/64 → 213/32) ⇝ 27/4 | note:F#2 gain:0.5814213562373043 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 13/2 ⇜ (213/32 → 427/64) ⇝ 27/4 | note:Bb3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 13/2 ⇜ (213/32 → 427/64) ⇝ 27/4 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 13/2 ⇜ (213/32 → 427/64) ⇝ 27/4 | note:E4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 13/2 ⇜ (213/32 → 427/64) ⇝ 27/4 | note:Ab4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 13/2 ⇜ (213/32 → 427/64) ⇝ 27/4 | note:F#2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 13/2 ⇜ (427/64 → 107/16) ⇝ 27/4 | note:Bb3 gain:0.29071067811865375 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 13/2 ⇜ (427/64 → 107/16) ⇝ 27/4 | note:Eb4 gain:0.29071067811865375 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 13/2 ⇜ (427/64 → 107/16) ⇝ 27/4 | note:E4 gain:0.29071067811865375 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 13/2 ⇜ (427/64 → 107/16) ⇝ 27/4 | note:Ab4 gain:0.29071067811865375 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 13/2 ⇜ (427/64 → 107/16) ⇝ 27/4 | note:F#2 gain:0.5814213562373075 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 13/2 ⇜ (107/16 → 429/64) ⇝ 27/4 | note:Bb3 gain:0.22000000000000167 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 13/2 ⇜ (107/16 → 429/64) ⇝ 27/4 | note:Eb4 gain:0.22000000000000167 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 13/2 ⇜ (107/16 → 429/64) ⇝ 27/4 | note:E4 gain:0.22000000000000167 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 13/2 ⇜ (107/16 → 429/64) ⇝ 27/4 | note:Ab4 gain:0.22000000000000167 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 13/2 ⇜ (107/16 → 429/64) ⇝ 27/4 | note:F#2 gain:0.44000000000000333 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 13/2 ⇜ (429/64 → 215/32) ⇝ 27/4 | note:Bb3 gain:0.1492893218813446 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 13/2 ⇜ (429/64 → 215/32) ⇝ 27/4 | note:Eb4 gain:0.1492893218813446 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 13/2 ⇜ (429/64 → 215/32) ⇝ 27/4 | note:E4 gain:0.1492893218813446 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 13/2 ⇜ (429/64 → 215/32) ⇝ 27/4 | note:Ab4 gain:0.1492893218813446 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 13/2 ⇜ (429/64 → 215/32) ⇝ 27/4 | note:F#2 gain:0.2985786437626892 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 13/2 ⇜ (215/32 → 431/64) ⇝ 27/4 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 13/2 ⇜ (215/32 → 431/64) ⇝ 27/4 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 13/2 ⇜ (215/32 → 431/64) ⇝ 27/4 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 13/2 ⇜ (215/32 → 431/64) ⇝ 27/4 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 13/2 ⇜ (215/32 → 431/64) ⇝ 27/4 | note:F#2 gain:0.24 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 13/2 ⇜ (431/64 → 27/4) | note:Bb3 gain:0.1492893218813455 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 13/2 ⇜ (431/64 → 27/4) | note:Eb4 gain:0.1492893218813455 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 13/2 ⇜ (431/64 → 27/4) | note:E4 gain:0.1492893218813455 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 13/2 ⇜ (431/64 → 27/4) | note:Ab4 gain:0.1492893218813455 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 13/2 ⇜ (431/64 → 27/4) | note:F#2 gain:0.298578643762691 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ (27/4 → 433/64) ⇝ 55/8 | note:F#4 gain:0.43999999999999456 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ (27/4 → 433/64) ⇝ 55/8 | note:A#4 gain:0.43999999999999456 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 27/4 ⇜ (433/64 → 217/32) ⇝ 55/8 | note:F#4 gain:0.5814213562373093 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 27/4 ⇜ (433/64 → 217/32) ⇝ 55/8 | note:A#4 gain:0.5814213562373093 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 27/4 ⇜ (217/32 → 435/64) ⇝ 55/8 | note:F#4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 27/4 ⇜ (217/32 → 435/64) ⇝ 55/8 | note:A#4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ (95/14 → 435/64) ⇝ 197/28 | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ (95/14 → 435/64) ⇝ 197/28 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ (95/14 → 435/64) ⇝ 197/28 | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ (95/14 → 435/64) ⇝ 197/28 | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 27/4 ⇜ (435/64 → 109/16) ⇝ 55/8 | note:F#4 gain:0.5814213562373105 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 27/4 ⇜ (435/64 → 109/16) ⇝ 55/8 | note:A#4 gain:0.5814213562373105 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 95/14 ⇜ (435/64 → 109/16) ⇝ 197/28 | note:70 gain:0.05814213562373105 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 95/14 ⇜ (435/64 → 109/16) ⇝ 197/28 | note:75 gain:0.05814213562373105 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 95/14 ⇜ (435/64 → 109/16) ⇝ 197/28 | note:76 gain:0.05814213562373105 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 95/14 ⇜ (435/64 → 109/16) ⇝ 197/28 | note:80 gain:0.05814213562373105 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 27/4 ⇜ (109/16 → 437/64) ⇝ 55/8 | note:F#4 gain:0.4400000000000077 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 27/4 ⇜ (109/16 → 437/64) ⇝ 55/8 | note:A#4 gain:0.4400000000000077 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 95/14 ⇜ (109/16 → 437/64) ⇝ 197/28 | note:70 gain:0.044000000000000775 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 95/14 ⇜ (109/16 → 437/64) ⇝ 197/28 | note:75 gain:0.044000000000000775 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 95/14 ⇜ (109/16 → 437/64) ⇝ 197/28 | note:76 gain:0.044000000000000775 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 95/14 ⇜ (109/16 → 437/64) ⇝ 197/28 | note:80 gain:0.044000000000000775 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 27/4 ⇜ (437/64 → 219/32) ⇝ 55/8 | note:F#4 gain:0.2985786437626922 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 27/4 ⇜ (437/64 → 219/32) ⇝ 55/8 | note:A#4 gain:0.2985786437626922 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 95/14 ⇜ (437/64 → 219/32) ⇝ 197/28 | note:70 gain:0.029857864376269222 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 95/14 ⇜ (437/64 → 219/32) ⇝ 197/28 | note:75 gain:0.029857864376269222 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 95/14 ⇜ (437/64 → 219/32) ⇝ 197/28 | note:76 gain:0.029857864376269222 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 95/14 ⇜ (437/64 → 219/32) ⇝ 197/28 | note:80 gain:0.029857864376269222 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 27/4 ⇜ (219/32 → 439/64) ⇝ 55/8 | note:F#4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 27/4 ⇜ (219/32 → 439/64) ⇝ 55/8 | note:A#4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 95/14 ⇜ (219/32 → 439/64) ⇝ 197/28 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 95/14 ⇜ (219/32 → 439/64) ⇝ 197/28 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 95/14 ⇜ (219/32 → 439/64) ⇝ 197/28 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 95/14 ⇜ (219/32 → 439/64) ⇝ 197/28 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 27/4 ⇜ (439/64 → 55/8) | note:F#4 gain:0.298578643762688 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 27/4 ⇜ (439/64 → 55/8) | note:A#4 gain:0.298578643762688 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 95/14 ⇜ (439/64 → 55/8) ⇝ 197/28 | note:70 gain:0.029857864376268802 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 95/14 ⇜ (439/64 → 55/8) ⇝ 197/28 | note:75 gain:0.029857864376268802 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 95/14 ⇜ (439/64 → 55/8) ⇝ 197/28 | note:76 gain:0.029857864376268802 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 95/14 ⇜ (439/64 → 55/8) ⇝ 197/28 | note:80 gain:0.029857864376268802 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 95/14 ⇜ (55/8 → 441/64) ⇝ 197/28 | note:70 gain:0.04400000000000016 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 95/14 ⇜ (55/8 → 441/64) ⇝ 197/28 | note:75 gain:0.04400000000000016 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 95/14 ⇜ (55/8 → 441/64) ⇝ 197/28 | note:76 gain:0.04400000000000016 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 95/14 ⇜ (55/8 → 441/64) ⇝ 197/28 | note:80 gain:0.04400000000000016 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 95/14 ⇜ (441/64 → 221/32) ⇝ 197/28 | note:70 gain:0.058142135623730634 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 95/14 ⇜ (441/64 → 221/32) ⇝ 197/28 | note:75 gain:0.058142135623730634 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 95/14 ⇜ (441/64 → 221/32) ⇝ 197/28 | note:76 gain:0.058142135623730634 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 95/14 ⇜ (441/64 → 221/32) ⇝ 197/28 | note:80 gain:0.058142135623730634 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 95/14 ⇜ (221/32 → 443/64) ⇝ 197/28 | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 95/14 ⇜ (221/32 → 443/64) ⇝ 197/28 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 95/14 ⇜ (221/32 → 443/64) ⇝ 197/28 | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 95/14 ⇜ (221/32 → 443/64) ⇝ 197/28 | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 95/14 ⇜ (443/64 → 111/16) ⇝ 197/28 | note:70 gain:0.058142135623731356 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 95/14 ⇜ (443/64 → 111/16) ⇝ 197/28 | note:75 gain:0.058142135623731356 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 95/14 ⇜ (443/64 → 111/16) ⇝ 197/28 | note:76 gain:0.058142135623731356 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 95/14 ⇜ (443/64 → 111/16) ⇝ 197/28 | note:80 gain:0.058142135623731356 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 95/14 ⇜ (111/16 → 445/64) ⇝ 197/28 | note:70 gain:0.04400000000000007 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 95/14 ⇜ (111/16 → 445/64) ⇝ 197/28 | note:75 gain:0.04400000000000007 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 95/14 ⇜ (111/16 → 445/64) ⇝ 197/28 | note:76 gain:0.04400000000000007 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 95/14 ⇜ (111/16 → 445/64) ⇝ 197/28 | note:80 gain:0.04400000000000007 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 95/14 ⇜ (445/64 → 223/32) ⇝ 197/28 | note:70 gain:0.029857864376269534 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 95/14 ⇜ (445/64 → 223/32) ⇝ 197/28 | note:75 gain:0.029857864376269534 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 95/14 ⇜ (445/64 → 223/32) ⇝ 197/28 | note:76 gain:0.029857864376269534 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 95/14 ⇜ (445/64 → 223/32) ⇝ 197/28 | note:80 gain:0.029857864376269534 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 95/14 ⇜ (223/32 → 447/64) ⇝ 197/28 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 95/14 ⇜ (223/32 → 447/64) ⇝ 197/28 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 95/14 ⇜ (223/32 → 447/64) ⇝ 197/28 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 95/14 ⇜ (223/32 → 447/64) ⇝ 197/28 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 95/14 ⇜ (447/64 → 7/1) ⇝ 197/28 | note:70 gain:0.02985786437626849 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 95/14 ⇜ (447/64 → 7/1) ⇝ 197/28 | note:75 gain:0.02985786437626849 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 95/14 ⇜ (447/64 → 7/1) ⇝ 197/28 | note:76 gain:0.02985786437626849 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 95/14 ⇜ (447/64 → 7/1) ⇝ 197/28 | note:80 gain:0.02985786437626849 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 95/14 ⇜ (7/1 → 449/64) ⇝ 197/28 | note:70 gain:0.04399999999999973 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 95/14 ⇜ (7/1 → 449/64) ⇝ 197/28 | note:75 gain:0.04399999999999973 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 95/14 ⇜ (7/1 → 449/64) ⇝ 197/28 | note:76 gain:0.04399999999999973 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 95/14 ⇜ (7/1 → 449/64) ⇝ 197/28 | note:80 gain:0.04399999999999973 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ (7/1 → 449/64) ⇝ 29/4 | note:F#2 gain:0.4399999999999972 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 95/14 ⇜ (449/64 → 225/32) ⇝ 197/28 | note:70 gain:0.058142135623731134 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 95/14 ⇜ (449/64 → 225/32) ⇝ 197/28 | note:75 gain:0.058142135623731134 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 95/14 ⇜ (449/64 → 225/32) ⇝ 197/28 | note:76 gain:0.058142135623731134 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 95/14 ⇜ (449/64 → 225/32) ⇝ 197/28 | note:80 gain:0.058142135623731134 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 7/1 ⇜ (449/64 → 225/32) ⇝ 29/4 | note:F#2 gain:0.5814213562373113 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 95/14 ⇜ (225/32 → 197/28) | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 95/14 ⇜ (225/32 → 197/28) | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 95/14 ⇜ (225/32 → 197/28) | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 95/14 ⇜ (225/32 → 197/28) | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 7/1 ⇜ (225/32 → 451/64) ⇝ 29/4 | note:F#2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 7/1 ⇜ (451/64 → 113/16) ⇝ 29/4 | note:F#2 gain:0.5814213562373086 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 7/1 ⇜ (113/16 → 453/64) ⇝ 29/4 | note:F#2 gain:0.44000000000000483 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 7/1 ⇜ (453/64 → 227/32) ⇝ 29/4 | note:F#2 gain:0.29857864376269033 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 7/1 ⇜ (227/32 → 455/64) ⇝ 29/4 | note:F#2 gain:0.24 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 7/1 ⇜ (455/64 → 57/8) ⇝ 29/4 | note:F#2 gain:0.29857864376268994 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 7/1 ⇜ (57/8 → 457/64) ⇝ 29/4 | note:F#2 gain:0.43999999999999295 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ (57/8 → 457/64) ⇝ 29/4 | note:F#4 gain:0.43999999999999295 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ (57/8 → 457/64) ⇝ 29/4 | note:A#4 gain:0.43999999999999295 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 7/1 ⇜ (457/64 → 229/32) ⇝ 29/4 | note:F#2 gain:0.5814213562373082 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 57/8 ⇜ (457/64 → 229/32) ⇝ 29/4 | note:F#4 gain:0.5814213562373082 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 57/8 ⇜ (457/64 → 229/32) ⇝ 29/4 | note:A#4 gain:0.5814213562373082 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 7/1 ⇜ (229/32 → 459/64) ⇝ 29/4 | note:F#2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 57/8 ⇜ (229/32 → 459/64) ⇝ 29/4 | note:F#4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 57/8 ⇜ (229/32 → 459/64) ⇝ 29/4 | note:A#4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 7/1 ⇜ (459/64 → 115/16) ⇝ 29/4 | note:F#2 gain:0.5814213562373116 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 57/8 ⇜ (459/64 → 115/16) ⇝ 29/4 | note:F#4 gain:0.5814213562373116 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 57/8 ⇜ (459/64 → 115/16) ⇝ 29/4 | note:A#4 gain:0.5814213562373116 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 7/1 ⇜ (115/16 → 461/64) ⇝ 29/4 | note:F#2 gain:0.43999999999999784 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 57/8 ⇜ (115/16 → 461/64) ⇝ 29/4 | note:F#4 gain:0.43999999999999784 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 57/8 ⇜ (115/16 → 461/64) ⇝ 29/4 | note:A#4 gain:0.43999999999999784 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 7/1 ⇜ (461/64 → 231/32) ⇝ 29/4 | note:F#2 gain:0.2985786437626934 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 57/8 ⇜ (461/64 → 231/32) ⇝ 29/4 | note:F#4 gain:0.2985786437626934 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 57/8 ⇜ (461/64 → 231/32) ⇝ 29/4 | note:A#4 gain:0.2985786437626934 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 7/1 ⇜ (231/32 → 463/64) ⇝ 29/4 | note:F#2 gain:0.24 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 57/8 ⇜ (231/32 → 463/64) ⇝ 29/4 | note:F#4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 57/8 ⇜ (231/32 → 463/64) ⇝ 29/4 | note:A#4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 7/1 ⇜ (463/64 → 29/4) | note:F#2 gain:0.2985786437626869 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 57/8 ⇜ (463/64 → 29/4) | note:F#4 gain:0.2985786437626869 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 57/8 ⇜ (463/64 → 29/4) | note:A#4 gain:0.2985786437626869 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ (29/4 → 465/64) ⇝ 15/2 | note:Bb3 gain:0.22000000000000003 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ (29/4 → 465/64) ⇝ 15/2 | note:Eb4 gain:0.22000000000000003 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ (29/4 → 465/64) ⇝ 15/2 | note:E4 gain:0.22000000000000003 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (29/4 → 465/64) ⇝ 15/2 | note:Ab4 gain:0.22000000000000003 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 29/4 ⇜ (465/64 → 233/32) ⇝ 15/2 | note:Bb3 gain:0.2907106781186526 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 29/4 ⇜ (465/64 → 233/32) ⇝ 15/2 | note:Eb4 gain:0.2907106781186526 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 29/4 ⇜ (465/64 → 233/32) ⇝ 15/2 | note:E4 gain:0.2907106781186526 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 29/4 ⇜ (465/64 → 233/32) ⇝ 15/2 | note:Ab4 gain:0.2907106781186526 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 29/4 ⇜ (233/32 → 467/64) ⇝ 15/2 | note:Bb3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 29/4 ⇜ (233/32 → 467/64) ⇝ 15/2 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 29/4 ⇜ (233/32 → 467/64) ⇝ 15/2 | note:E4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 29/4 ⇜ (233/32 → 467/64) ⇝ 15/2 | note:Ab4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 29/4 ⇜ (467/64 → 117/16) ⇝ 15/2 | note:Bb3 gain:0.2907106781186573 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 29/4 ⇜ (467/64 → 117/16) ⇝ 15/2 | note:Eb4 gain:0.2907106781186573 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 29/4 ⇜ (467/64 → 117/16) ⇝ 15/2 | note:E4 gain:0.2907106781186573 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 29/4 ⇜ (467/64 → 117/16) ⇝ 15/2 | note:Ab4 gain:0.2907106781186573 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 29/4 ⇜ (117/16 → 469/64) ⇝ 15/2 | note:Bb3 gain:0.22000000000000108 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 29/4 ⇜ (117/16 → 469/64) ⇝ 15/2 | note:Eb4 gain:0.22000000000000108 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 29/4 ⇜ (117/16 → 469/64) ⇝ 15/2 | note:E4 gain:0.22000000000000108 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 29/4 ⇜ (117/16 → 469/64) ⇝ 15/2 | note:Ab4 gain:0.22000000000000108 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 29/4 ⇜ (469/64 → 235/32) ⇝ 15/2 | note:Bb3 gain:0.14928932188134822 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 29/4 ⇜ (469/64 → 235/32) ⇝ 15/2 | note:Eb4 gain:0.14928932188134822 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 29/4 ⇜ (469/64 → 235/32) ⇝ 15/2 | note:E4 gain:0.14928932188134822 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 29/4 ⇜ (469/64 → 235/32) ⇝ 15/2 | note:Ab4 gain:0.14928932188134822 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 29/4 ⇜ (235/32 → 471/64) ⇝ 15/2 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 29/4 ⇜ (235/32 → 471/64) ⇝ 15/2 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 29/4 ⇜ (235/32 → 471/64) ⇝ 15/2 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 29/4 ⇜ (235/32 → 471/64) ⇝ 15/2 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 29/4 ⇜ (471/64 → 59/8) ⇝ 15/2 | note:Bb3 gain:0.14928932188134592 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 29/4 ⇜ (471/64 → 59/8) ⇝ 15/2 | note:Eb4 gain:0.14928932188134592 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 29/4 ⇜ (471/64 → 59/8) ⇝ 15/2 | note:E4 gain:0.14928932188134592 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 29/4 ⇜ (471/64 → 59/8) ⇝ 15/2 | note:Ab4 gain:0.14928932188134592 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 29/4 ⇜ (59/8 → 473/64) ⇝ 15/2 | note:Bb3 gain:0.21999999999999786 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 29/4 ⇜ (59/8 → 473/64) ⇝ 15/2 | note:Eb4 gain:0.21999999999999786 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 29/4 ⇜ (59/8 → 473/64) ⇝ 15/2 | note:E4 gain:0.21999999999999786 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 29/4 ⇜ (59/8 → 473/64) ⇝ 15/2 | note:Ab4 gain:0.21999999999999786 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 29/4 ⇜ (473/64 → 237/32) ⇝ 15/2 | note:Bb3 gain:0.2907106781186551 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 29/4 ⇜ (473/64 → 237/32) ⇝ 15/2 | note:Eb4 gain:0.2907106781186551 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 29/4 ⇜ (473/64 → 237/32) ⇝ 15/2 | note:E4 gain:0.2907106781186551 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 29/4 ⇜ (473/64 → 237/32) ⇝ 15/2 | note:Ab4 gain:0.2907106781186551 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 29/4 ⇜ (237/32 → 475/64) ⇝ 15/2 | note:Bb3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 29/4 ⇜ (237/32 → 475/64) ⇝ 15/2 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 29/4 ⇜ (237/32 → 475/64) ⇝ 15/2 | note:E4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 29/4 ⇜ (237/32 → 475/64) ⇝ 15/2 | note:Ab4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 29/4 ⇜ (475/64 → 119/16) ⇝ 15/2 | note:Bb3 gain:0.2907106781186548 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 29/4 ⇜ (475/64 → 119/16) ⇝ 15/2 | note:Eb4 gain:0.2907106781186548 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 29/4 ⇜ (475/64 → 119/16) ⇝ 15/2 | note:E4 gain:0.2907106781186548 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 29/4 ⇜ (475/64 → 119/16) ⇝ 15/2 | note:Ab4 gain:0.2907106781186548 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 29/4 ⇜ (119/16 → 477/64) ⇝ 15/2 | note:Bb3 gain:0.22000000000000322 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 29/4 ⇜ (119/16 → 477/64) ⇝ 15/2 | note:Eb4 gain:0.22000000000000322 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 29/4 ⇜ (119/16 → 477/64) ⇝ 15/2 | note:E4 gain:0.22000000000000322 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 29/4 ⇜ (119/16 → 477/64) ⇝ 15/2 | note:Ab4 gain:0.22000000000000322 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 29/4 ⇜ (477/64 → 239/32) ⇝ 15/2 | note:Bb3 gain:0.14928932188134572 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 29/4 ⇜ (477/64 → 239/32) ⇝ 15/2 | note:Eb4 gain:0.14928932188134572 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 29/4 ⇜ (477/64 → 239/32) ⇝ 15/2 | note:E4 gain:0.14928932188134572 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 29/4 ⇜ (477/64 → 239/32) ⇝ 15/2 | note:Ab4 gain:0.14928932188134572 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 29/4 ⇜ (239/32 → 479/64) ⇝ 15/2 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 29/4 ⇜ (239/32 → 479/64) ⇝ 15/2 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 29/4 ⇜ (239/32 → 479/64) ⇝ 15/2 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 29/4 ⇜ (239/32 → 479/64) ⇝ 15/2 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 29/4 ⇜ (479/64 → 15/2) | note:Bb3 gain:0.1492893218813444 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 29/4 ⇜ (479/64 → 15/2) | note:Eb4 gain:0.1492893218813444 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 29/4 ⇜ (479/64 → 15/2) | note:E4 gain:0.1492893218813444 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 29/4 ⇜ (479/64 → 15/2) | note:Ab4 gain:0.1492893218813444 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ (15/2 → 481/64) ⇝ 61/8 | note:C#5 gain:0.43999999999999134 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ (15/2 → 481/64) ⇝ 61/8 | note:E5 gain:0.43999999999999134 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ (15/2 → 481/64) ⇝ 31/4 | note:F#2 gain:0.43999999999999134 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 15/2 ⇜ (481/64 → 241/32) ⇝ 61/8 | note:C#5 gain:0.5814213562373071 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 15/2 ⇜ (481/64 → 241/32) ⇝ 61/8 | note:E5 gain:0.5814213562373071 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 15/2 ⇜ (481/64 → 241/32) ⇝ 31/4 | note:F#2 gain:0.5814213562373071 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 15/2 ⇜ (241/32 → 483/64) ⇝ 61/8 | note:C#5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 15/2 ⇜ (241/32 → 483/64) ⇝ 61/8 | note:E5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 15/2 ⇜ (241/32 → 483/64) ⇝ 31/4 | note:F#2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ (211/28 → 483/64) ⇝ 109/14 | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ (211/28 → 483/64) ⇝ 109/14 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ (211/28 → 483/64) ⇝ 109/14 | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ (211/28 → 483/64) ⇝ 109/14 | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 15/2 ⇜ (483/64 → 121/16) ⇝ 61/8 | note:C#5 gain:0.5814213562373127 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 15/2 ⇜ (483/64 → 121/16) ⇝ 61/8 | note:E5 gain:0.5814213562373127 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 15/2 ⇜ (483/64 → 121/16) ⇝ 31/4 | note:F#2 gain:0.5814213562373127 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 211/28 ⇜ (483/64 → 121/16) ⇝ 109/14 | note:70 gain:0.05814213562373127 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 211/28 ⇜ (483/64 → 121/16) ⇝ 109/14 | note:75 gain:0.05814213562373127 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 211/28 ⇜ (483/64 → 121/16) ⇝ 109/14 | note:76 gain:0.05814213562373127 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 211/28 ⇜ (483/64 → 121/16) ⇝ 109/14 | note:80 gain:0.05814213562373127 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 15/2 ⇜ (121/16 → 485/64) ⇝ 61/8 | note:C#5 gain:0.43999999999999945 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 15/2 ⇜ (121/16 → 485/64) ⇝ 61/8 | note:E5 gain:0.43999999999999945 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 15/2 ⇜ (121/16 → 485/64) ⇝ 31/4 | note:F#2 gain:0.43999999999999945 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 211/28 ⇜ (121/16 → 485/64) ⇝ 109/14 | note:70 gain:0.04399999999999995 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 211/28 ⇜ (121/16 → 485/64) ⇝ 109/14 | note:75 gain:0.04399999999999995 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 211/28 ⇜ (121/16 → 485/64) ⇝ 109/14 | note:76 gain:0.04399999999999995 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 211/28 ⇜ (121/16 → 485/64) ⇝ 109/14 | note:80 gain:0.04399999999999995 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 15/2 ⇜ (485/64 → 243/32) ⇝ 61/8 | note:C#5 gain:0.29857864376269444 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 15/2 ⇜ (485/64 → 243/32) ⇝ 61/8 | note:E5 gain:0.29857864376269444 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 15/2 ⇜ (485/64 → 243/32) ⇝ 31/4 | note:F#2 gain:0.29857864376269444 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 211/28 ⇜ (485/64 → 243/32) ⇝ 109/14 | note:70 gain:0.029857864376269444 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 211/28 ⇜ (485/64 → 243/32) ⇝ 109/14 | note:75 gain:0.029857864376269444 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 211/28 ⇜ (485/64 → 243/32) ⇝ 109/14 | note:76 gain:0.029857864376269444 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 211/28 ⇜ (485/64 → 243/32) ⇝ 109/14 | note:80 gain:0.029857864376269444 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 15/2 ⇜ (243/32 → 487/64) ⇝ 61/8 | note:C#5 gain:0.24 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 15/2 ⇜ (243/32 → 487/64) ⇝ 61/8 | note:E5 gain:0.24 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 15/2 ⇜ (243/32 → 487/64) ⇝ 31/4 | note:F#2 gain:0.24 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 211/28 ⇜ (243/32 → 487/64) ⇝ 109/14 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 211/28 ⇜ (243/32 → 487/64) ⇝ 109/14 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 211/28 ⇜ (243/32 → 487/64) ⇝ 109/14 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 211/28 ⇜ (243/32 → 487/64) ⇝ 109/14 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 15/2 ⇜ (487/64 → 61/8) | note:C#5 gain:0.2985786437626858 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 15/2 ⇜ (487/64 → 61/8) | note:E5 gain:0.2985786437626858 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 15/2 ⇜ (487/64 → 61/8) ⇝ 31/4 | note:F#2 gain:0.2985786437626858 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 211/28 ⇜ (487/64 → 61/8) ⇝ 109/14 | note:70 gain:0.02985786437626858 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 211/28 ⇜ (487/64 → 61/8) ⇝ 109/14 | note:75 gain:0.02985786437626858 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 211/28 ⇜ (487/64 → 61/8) ⇝ 109/14 | note:76 gain:0.02985786437626858 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 211/28 ⇜ (487/64 → 61/8) ⇝ 109/14 | note:80 gain:0.02985786437626858 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 15/2 ⇜ (61/8 → 489/64) ⇝ 31/4 | note:F#2 gain:0.43999999999999845 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 211/28 ⇜ (61/8 → 489/64) ⇝ 109/14 | note:70 gain:0.043999999999999845 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 211/28 ⇜ (61/8 → 489/64) ⇝ 109/14 | note:75 gain:0.043999999999999845 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 211/28 ⇜ (61/8 → 489/64) ⇝ 109/14 | note:76 gain:0.043999999999999845 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 211/28 ⇜ (61/8 → 489/64) ⇝ 109/14 | note:80 gain:0.043999999999999845 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 15/2 ⇜ (489/64 → 245/32) ⇝ 31/4 | note:F#2 gain:0.581421356237304 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 211/28 ⇜ (489/64 → 245/32) ⇝ 109/14 | note:70 gain:0.0581421356237304 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 211/28 ⇜ (489/64 → 245/32) ⇝ 109/14 | note:75 gain:0.0581421356237304 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 211/28 ⇜ (489/64 → 245/32) ⇝ 109/14 | note:76 gain:0.0581421356237304 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 211/28 ⇜ (489/64 → 245/32) ⇝ 109/14 | note:80 gain:0.0581421356237304 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 15/2 ⇜ (245/32 → 491/64) ⇝ 31/4 | note:F#2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 211/28 ⇜ (245/32 → 491/64) ⇝ 109/14 | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 211/28 ⇜ (245/32 → 491/64) ⇝ 109/14 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 211/28 ⇜ (245/32 → 491/64) ⇝ 109/14 | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 211/28 ⇜ (245/32 → 491/64) ⇝ 109/14 | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 15/2 ⇜ (491/64 → 123/16) ⇝ 31/4 | note:F#2 gain:0.5814213562373077 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 211/28 ⇜ (491/64 → 123/16) ⇝ 109/14 | note:70 gain:0.05814213562373077 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 211/28 ⇜ (491/64 → 123/16) ⇝ 109/14 | note:75 gain:0.05814213562373077 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 211/28 ⇜ (491/64 → 123/16) ⇝ 109/14 | note:76 gain:0.05814213562373077 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 211/28 ⇜ (491/64 → 123/16) ⇝ 109/14 | note:80 gain:0.05814213562373077 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 15/2 ⇜ (123/16 → 493/64) ⇝ 31/4 | note:F#2 gain:0.4400000000000038 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 211/28 ⇜ (123/16 → 493/64) ⇝ 109/14 | note:70 gain:0.04400000000000038 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 211/28 ⇜ (123/16 → 493/64) ⇝ 109/14 | note:75 gain:0.04400000000000038 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 211/28 ⇜ (123/16 → 493/64) ⇝ 109/14 | note:76 gain:0.04400000000000038 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 211/28 ⇜ (123/16 → 493/64) ⇝ 109/14 | note:80 gain:0.04400000000000038 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 15/2 ⇜ (493/64 → 247/32) ⇝ 31/4 | note:F#2 gain:0.2985786437626895 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 211/28 ⇜ (493/64 → 247/32) ⇝ 109/14 | note:70 gain:0.02985786437626895 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 211/28 ⇜ (493/64 → 247/32) ⇝ 109/14 | note:75 gain:0.02985786437626895 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 211/28 ⇜ (493/64 → 247/32) ⇝ 109/14 | note:76 gain:0.02985786437626895 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 211/28 ⇜ (493/64 → 247/32) ⇝ 109/14 | note:80 gain:0.02985786437626895 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 15/2 ⇜ (247/32 → 495/64) ⇝ 31/4 | note:F#2 gain:0.24 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 211/28 ⇜ (247/32 → 495/64) ⇝ 109/14 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 211/28 ⇜ (247/32 → 495/64) ⇝ 109/14 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 211/28 ⇜ (247/32 → 495/64) ⇝ 109/14 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 211/28 ⇜ (247/32 → 495/64) ⇝ 109/14 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 15/2 ⇜ (495/64 → 31/4) | note:F#2 gain:0.2985786437626907 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 211/28 ⇜ (495/64 → 31/4) ⇝ 109/14 | note:70 gain:0.029857864376269073 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 211/28 ⇜ (495/64 → 31/4) ⇝ 109/14 | note:75 gain:0.029857864376269073 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 211/28 ⇜ (495/64 → 31/4) ⇝ 109/14 | note:76 gain:0.029857864376269073 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 211/28 ⇜ (495/64 → 31/4) ⇝ 109/14 | note:80 gain:0.029857864376269073 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 211/28 ⇜ (31/4 → 497/64) ⇝ 109/14 | note:70 gain:0.043999999999999415 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 211/28 ⇜ (31/4 → 497/64) ⇝ 109/14 | note:75 gain:0.043999999999999415 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 211/28 ⇜ (31/4 → 497/64) ⇝ 109/14 | note:76 gain:0.043999999999999415 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 211/28 ⇜ (31/4 → 497/64) ⇝ 109/14 | note:80 gain:0.043999999999999415 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ (31/4 → 497/64) ⇝ 63/8 | note:C#5 gain:0.4399999999999941 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ (31/4 → 497/64) ⇝ 63/8 | note:E5 gain:0.4399999999999941 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ (31/4 → 497/64) ⇝ 8/1 | note:Bb3 gain:0.21999999999999706 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ (31/4 → 497/64) ⇝ 8/1 | note:Eb4 gain:0.21999999999999706 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ (31/4 → 497/64) ⇝ 8/1 | note:E4 gain:0.21999999999999706 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (31/4 → 497/64) ⇝ 8/1 | note:Ab4 gain:0.21999999999999706 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 211/28 ⇜ (497/64 → 249/32) ⇝ 109/14 | note:70 gain:0.0581421356237309 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 211/28 ⇜ (497/64 → 249/32) ⇝ 109/14 | note:75 gain:0.0581421356237309 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 211/28 ⇜ (497/64 → 249/32) ⇝ 109/14 | note:76 gain:0.0581421356237309 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 211/28 ⇜ (497/64 → 249/32) ⇝ 109/14 | note:80 gain:0.0581421356237309 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 31/4 ⇜ (497/64 → 249/32) ⇝ 63/8 | note:C#5 gain:0.581421356237309 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 31/4 ⇜ (497/64 → 249/32) ⇝ 63/8 | note:E5 gain:0.581421356237309 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 31/4 ⇜ (497/64 → 249/32) ⇝ 8/1 | note:Bb3 gain:0.2907106781186545 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 31/4 ⇜ (497/64 → 249/32) ⇝ 8/1 | note:Eb4 gain:0.2907106781186545 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 31/4 ⇜ (497/64 → 249/32) ⇝ 8/1 | note:E4 gain:0.2907106781186545 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 31/4 ⇜ (497/64 → 249/32) ⇝ 8/1 | note:Ab4 gain:0.2907106781186545 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 211/28 ⇜ (249/32 → 109/14) | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 211/28 ⇜ (249/32 → 109/14) | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 211/28 ⇜ (249/32 → 109/14) | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 211/28 ⇜ (249/32 → 109/14) | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 31/4 ⇜ (249/32 → 499/64) ⇝ 63/8 | note:C#5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 31/4 ⇜ (249/32 → 499/64) ⇝ 63/8 | note:E5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 31/4 ⇜ (249/32 → 499/64) ⇝ 8/1 | note:Bb3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 31/4 ⇜ (249/32 → 499/64) ⇝ 8/1 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 31/4 ⇜ (249/32 → 499/64) ⇝ 8/1 | note:E4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 31/4 ⇜ (249/32 → 499/64) ⇝ 8/1 | note:Ab4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 31/4 ⇜ (499/64 → 125/16) ⇝ 63/8 | note:C#5 gain:0.5814213562373108 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 31/4 ⇜ (499/64 → 125/16) ⇝ 63/8 | note:E5 gain:0.5814213562373108 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 31/4 ⇜ (499/64 → 125/16) ⇝ 8/1 | note:Bb3 gain:0.2907106781186554 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 31/4 ⇜ (499/64 → 125/16) ⇝ 8/1 | note:Eb4 gain:0.2907106781186554 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 31/4 ⇜ (499/64 → 125/16) ⇝ 8/1 | note:E4 gain:0.2907106781186554 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 31/4 ⇜ (499/64 → 125/16) ⇝ 8/1 | note:Ab4 gain:0.2907106781186554 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 31/4 ⇜ (125/16 → 501/64) ⇝ 63/8 | note:C#5 gain:0.44000000000000805 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 31/4 ⇜ (125/16 → 501/64) ⇝ 63/8 | note:E5 gain:0.44000000000000805 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 31/4 ⇜ (125/16 → 501/64) ⇝ 8/1 | note:Bb3 gain:0.22000000000000403 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 31/4 ⇜ (125/16 → 501/64) ⇝ 8/1 | note:Eb4 gain:0.22000000000000403 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 31/4 ⇜ (125/16 → 501/64) ⇝ 8/1 | note:E4 gain:0.22000000000000403 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 31/4 ⇜ (125/16 → 501/64) ⇝ 8/1 | note:Ab4 gain:0.22000000000000403 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 31/4 ⇜ (501/64 → 251/32) ⇝ 63/8 | note:C#5 gain:0.2985786437626925 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 31/4 ⇜ (501/64 → 251/32) ⇝ 63/8 | note:E5 gain:0.2985786437626925 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 31/4 ⇜ (501/64 → 251/32) ⇝ 8/1 | note:Bb3 gain:0.14928932188134625 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 31/4 ⇜ (501/64 → 251/32) ⇝ 8/1 | note:Eb4 gain:0.14928932188134625 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 31/4 ⇜ (501/64 → 251/32) ⇝ 8/1 | note:E4 gain:0.14928932188134625 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 31/4 ⇜ (501/64 → 251/32) ⇝ 8/1 | note:Ab4 gain:0.14928932188134625 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 31/4 ⇜ (251/32 → 503/64) ⇝ 63/8 | note:C#5 gain:0.24 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 31/4 ⇜ (251/32 → 503/64) ⇝ 63/8 | note:E5 gain:0.24 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 31/4 ⇜ (251/32 → 503/64) ⇝ 8/1 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 31/4 ⇜ (251/32 → 503/64) ⇝ 8/1 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 31/4 ⇜ (251/32 → 503/64) ⇝ 8/1 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 31/4 ⇜ (251/32 → 503/64) ⇝ 8/1 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 31/4 ⇜ (503/64 → 63/8) | note:C#5 gain:0.2985786437626877 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 31/4 ⇜ (503/64 → 63/8) | note:E5 gain:0.2985786437626877 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 31/4 ⇜ (503/64 → 63/8) ⇝ 8/1 | note:Bb3 gain:0.14928932188134386 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 31/4 ⇜ (503/64 → 63/8) ⇝ 8/1 | note:Eb4 gain:0.14928932188134386 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 31/4 ⇜ (503/64 → 63/8) ⇝ 8/1 | note:E4 gain:0.14928932188134386 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 31/4 ⇜ (503/64 → 63/8) ⇝ 8/1 | note:Ab4 gain:0.14928932188134386 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 31/4 ⇜ (63/8 → 505/64) ⇝ 8/1 | note:Bb3 gain:0.2200000000000006 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 31/4 ⇜ (63/8 → 505/64) ⇝ 8/1 | note:Eb4 gain:0.2200000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 31/4 ⇜ (63/8 → 505/64) ⇝ 8/1 | note:E4 gain:0.2200000000000006 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 31/4 ⇜ (63/8 → 505/64) ⇝ 8/1 | note:Ab4 gain:0.2200000000000006 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 31/4 ⇜ (505/64 → 253/32) ⇝ 8/1 | note:Bb3 gain:0.290710678118653 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 31/4 ⇜ (505/64 → 253/32) ⇝ 8/1 | note:Eb4 gain:0.290710678118653 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 31/4 ⇜ (505/64 → 253/32) ⇝ 8/1 | note:E4 gain:0.290710678118653 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 31/4 ⇜ (505/64 → 253/32) ⇝ 8/1 | note:Ab4 gain:0.290710678118653 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 31/4 ⇜ (253/32 → 507/64) ⇝ 8/1 | note:Bb3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 31/4 ⇜ (253/32 → 507/64) ⇝ 8/1 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 31/4 ⇜ (253/32 → 507/64) ⇝ 8/1 | note:E4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 31/4 ⇜ (253/32 → 507/64) ⇝ 8/1 | note:Ab4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 31/4 ⇜ (507/64 → 127/16) ⇝ 8/1 | note:Bb3 gain:0.290710678118657 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 31/4 ⇜ (507/64 → 127/16) ⇝ 8/1 | note:Eb4 gain:0.290710678118657 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 31/4 ⇜ (507/64 → 127/16) ⇝ 8/1 | note:E4 gain:0.290710678118657 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 31/4 ⇜ (507/64 → 127/16) ⇝ 8/1 | note:Ab4 gain:0.290710678118657 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 31/4 ⇜ (127/16 → 509/64) ⇝ 8/1 | note:Bb3 gain:0.22000000000000047 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 31/4 ⇜ (127/16 → 509/64) ⇝ 8/1 | note:Eb4 gain:0.22000000000000047 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 31/4 ⇜ (127/16 → 509/64) ⇝ 8/1 | note:E4 gain:0.22000000000000047 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 31/4 ⇜ (127/16 → 509/64) ⇝ 8/1 | note:Ab4 gain:0.22000000000000047 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 31/4 ⇜ (509/64 → 255/32) ⇝ 8/1 | note:Bb3 gain:0.1492893218813478 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 31/4 ⇜ (509/64 → 255/32) ⇝ 8/1 | note:Eb4 gain:0.1492893218813478 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 31/4 ⇜ (509/64 → 255/32) ⇝ 8/1 | note:E4 gain:0.1492893218813478 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 31/4 ⇜ (509/64 → 255/32) ⇝ 8/1 | note:Ab4 gain:0.1492893218813478 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 31/4 ⇜ (255/32 → 511/64) ⇝ 8/1 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 31/4 ⇜ (255/32 → 511/64) ⇝ 8/1 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 31/4 ⇜ (255/32 → 511/64) ⇝ 8/1 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 31/4 ⇜ (255/32 → 511/64) ⇝ 8/1 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 31/4 ⇜ (511/64 → 8/1) | note:Bb3 gain:0.14928932188134234 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 31/4 ⇜ (511/64 → 8/1) | note:Eb4 gain:0.14928932188134234 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 31/4 ⇜ (511/64 → 8/1) | note:E4 gain:0.14928932188134234 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 31/4 ⇜ (511/64 → 8/1) | note:Ab4 gain:0.14928932188134234 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ (8/1 → 513/64) ⇝ 33/4 | note:C2 gain:0.43999999999999684 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 8/1 ⇜ (513/64 → 257/32) ⇝ 33/4 | note:C2 gain:0.5814213562373108 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 8/1 ⇜ (257/32 → 515/64) ⇝ 33/4 | note:C2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ (225/28 → 515/64) ⇝ 58/7 | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ (225/28 → 515/64) ⇝ 58/7 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ (225/28 → 515/64) ⇝ 58/7 | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ (225/28 → 515/64) ⇝ 58/7 | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 8/1 ⇜ (515/64 → 129/16) ⇝ 33/4 | note:C2 gain:0.581421356237309 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 225/28 ⇜ (515/64 → 129/16) ⇝ 58/7 | note:70 gain:0.0581421356237309 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 225/28 ⇜ (515/64 → 129/16) ⇝ 58/7 | note:75 gain:0.0581421356237309 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 225/28 ⇜ (515/64 → 129/16) ⇝ 58/7 | note:76 gain:0.0581421356237309 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 225/28 ⇜ (515/64 → 129/16) ⇝ 58/7 | note:80 gain:0.0581421356237309 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 8/1 ⇜ (129/16 → 517/64) ⇝ 33/4 | note:C2 gain:0.4400000000000053 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 225/28 ⇜ (129/16 → 517/64) ⇝ 58/7 | note:70 gain:0.04400000000000053 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 225/28 ⇜ (129/16 → 517/64) ⇝ 58/7 | note:75 gain:0.04400000000000053 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 225/28 ⇜ (129/16 → 517/64) ⇝ 58/7 | note:76 gain:0.04400000000000053 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 225/28 ⇜ (129/16 → 517/64) ⇝ 58/7 | note:80 gain:0.04400000000000053 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 8/1 ⇜ (517/64 → 259/32) ⇝ 33/4 | note:C2 gain:0.2985786437626906 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 225/28 ⇜ (517/64 → 259/32) ⇝ 58/7 | note:70 gain:0.029857864376269062 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 225/28 ⇜ (517/64 → 259/32) ⇝ 58/7 | note:75 gain:0.029857864376269062 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 225/28 ⇜ (517/64 → 259/32) ⇝ 58/7 | note:76 gain:0.029857864376269062 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 225/28 ⇜ (517/64 → 259/32) ⇝ 58/7 | note:80 gain:0.029857864376269062 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 8/1 ⇜ (259/32 → 519/64) ⇝ 33/4 | note:C2 gain:0.24 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 225/28 ⇜ (259/32 → 519/64) ⇝ 58/7 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 225/28 ⇜ (259/32 → 519/64) ⇝ 58/7 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 225/28 ⇜ (259/32 → 519/64) ⇝ 58/7 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 225/28 ⇜ (259/32 → 519/64) ⇝ 58/7 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 8/1 ⇜ (519/64 → 65/8) ⇝ 33/4 | note:C2 gain:0.2985786437626896 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 225/28 ⇜ (519/64 → 65/8) ⇝ 58/7 | note:70 gain:0.029857864376268962 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 225/28 ⇜ (519/64 → 65/8) ⇝ 58/7 | note:75 gain:0.029857864376268962 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 225/28 ⇜ (519/64 → 65/8) ⇝ 58/7 | note:76 gain:0.029857864376268962 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 225/28 ⇜ (519/64 → 65/8) ⇝ 58/7 | note:80 gain:0.029857864376268962 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 8/1 ⇜ (65/8 → 521/64) ⇝ 33/4 | note:C2 gain:0.4399999999999926 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 225/28 ⇜ (65/8 → 521/64) ⇝ 58/7 | note:70 gain:0.04399999999999926 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 225/28 ⇜ (65/8 → 521/64) ⇝ 58/7 | note:75 gain:0.04399999999999926 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 225/28 ⇜ (65/8 → 521/64) ⇝ 58/7 | note:76 gain:0.04399999999999926 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 225/28 ⇜ (65/8 → 521/64) ⇝ 58/7 | note:80 gain:0.04399999999999926 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ (65/8 → 521/64) ⇝ 33/4 | note:C4 gain:0.4399999999999926 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ (65/8 → 521/64) ⇝ 33/4 | note:G4 gain:0.4399999999999926 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (65/8 → 521/64) ⇝ 33/4 | note:Bb4 gain:0.4399999999999926 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 8/1 ⇜ (521/64 → 261/32) ⇝ 33/4 | note:C2 gain:0.5814213562373078 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 225/28 ⇜ (521/64 → 261/32) ⇝ 58/7 | note:70 gain:0.05814213562373079 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 225/28 ⇜ (521/64 → 261/32) ⇝ 58/7 | note:75 gain:0.05814213562373079 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 225/28 ⇜ (521/64 → 261/32) ⇝ 58/7 | note:76 gain:0.05814213562373079 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 225/28 ⇜ (521/64 → 261/32) ⇝ 58/7 | note:80 gain:0.05814213562373079 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 65/8 ⇜ (521/64 → 261/32) ⇝ 33/4 | note:C4 gain:0.5814213562373078 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 65/8 ⇜ (521/64 → 261/32) ⇝ 33/4 | note:G4 gain:0.5814213562373078 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 65/8 ⇜ (521/64 → 261/32) ⇝ 33/4 | note:Bb4 gain:0.5814213562373078 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 8/1 ⇜ (261/32 → 523/64) ⇝ 33/4 | note:C2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 225/28 ⇜ (261/32 → 523/64) ⇝ 58/7 | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 225/28 ⇜ (261/32 → 523/64) ⇝ 58/7 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 225/28 ⇜ (261/32 → 523/64) ⇝ 58/7 | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 225/28 ⇜ (261/32 → 523/64) ⇝ 58/7 | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 65/8 ⇜ (261/32 → 523/64) ⇝ 33/4 | note:C4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 65/8 ⇜ (261/32 → 523/64) ⇝ 33/4 | note:G4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 65/8 ⇜ (261/32 → 523/64) ⇝ 33/4 | note:Bb4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 8/1 ⇜ (523/64 → 131/16) ⇝ 33/4 | note:C2 gain:0.581421356237312 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 225/28 ⇜ (523/64 → 131/16) ⇝ 58/7 | note:70 gain:0.058142135623731196 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 225/28 ⇜ (523/64 → 131/16) ⇝ 58/7 | note:75 gain:0.058142135623731196 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 225/28 ⇜ (523/64 → 131/16) ⇝ 58/7 | note:76 gain:0.058142135623731196 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 225/28 ⇜ (523/64 → 131/16) ⇝ 58/7 | note:80 gain:0.058142135623731196 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 65/8 ⇜ (523/64 → 131/16) ⇝ 33/4 | note:C4 gain:0.581421356237312 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 65/8 ⇜ (523/64 → 131/16) ⇝ 33/4 | note:G4 gain:0.581421356237312 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 65/8 ⇜ (523/64 → 131/16) ⇝ 33/4 | note:Bb4 gain:0.581421356237312 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 8/1 ⇜ (131/16 → 525/64) ⇝ 33/4 | note:C2 gain:0.4399999999999983 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 225/28 ⇜ (131/16 → 525/64) ⇝ 58/7 | note:70 gain:0.04399999999999983 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 225/28 ⇜ (131/16 → 525/64) ⇝ 58/7 | note:75 gain:0.04399999999999983 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 225/28 ⇜ (131/16 → 525/64) ⇝ 58/7 | note:76 gain:0.04399999999999983 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 225/28 ⇜ (131/16 → 525/64) ⇝ 58/7 | note:80 gain:0.04399999999999983 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 65/8 ⇜ (131/16 → 525/64) ⇝ 33/4 | note:C4 gain:0.4399999999999983 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 65/8 ⇜ (131/16 → 525/64) ⇝ 33/4 | note:G4 gain:0.4399999999999983 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 65/8 ⇜ (131/16 → 525/64) ⇝ 33/4 | note:Bb4 gain:0.4399999999999983 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 8/1 ⇜ (525/64 → 263/32) ⇝ 33/4 | note:C2 gain:0.29857864376269366 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 225/28 ⇜ (525/64 → 263/32) ⇝ 58/7 | note:70 gain:0.029857864376269368 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 225/28 ⇜ (525/64 → 263/32) ⇝ 58/7 | note:75 gain:0.029857864376269368 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 225/28 ⇜ (525/64 → 263/32) ⇝ 58/7 | note:76 gain:0.029857864376269368 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 225/28 ⇜ (525/64 → 263/32) ⇝ 58/7 | note:80 gain:0.029857864376269368 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 65/8 ⇜ (525/64 → 263/32) ⇝ 33/4 | note:C4 gain:0.29857864376269366 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 65/8 ⇜ (525/64 → 263/32) ⇝ 33/4 | note:G4 gain:0.29857864376269366 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 65/8 ⇜ (525/64 → 263/32) ⇝ 33/4 | note:Bb4 gain:0.29857864376269366 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 8/1 ⇜ (263/32 → 527/64) ⇝ 33/4 | note:C2 gain:0.24 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 225/28 ⇜ (263/32 → 527/64) ⇝ 58/7 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 225/28 ⇜ (263/32 → 527/64) ⇝ 58/7 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 225/28 ⇜ (263/32 → 527/64) ⇝ 58/7 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 225/28 ⇜ (263/32 → 527/64) ⇝ 58/7 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 65/8 ⇜ (263/32 → 527/64) ⇝ 33/4 | note:C4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 65/8 ⇜ (263/32 → 527/64) ⇝ 33/4 | note:G4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 65/8 ⇜ (263/32 → 527/64) ⇝ 33/4 | note:Bb4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 8/1 ⇜ (527/64 → 33/4) | note:C2 gain:0.29857864376268656 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 225/28 ⇜ (527/64 → 33/4) ⇝ 58/7 | note:70 gain:0.029857864376268656 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 225/28 ⇜ (527/64 → 33/4) ⇝ 58/7 | note:75 gain:0.029857864376268656 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 225/28 ⇜ (527/64 → 33/4) ⇝ 58/7 | note:76 gain:0.029857864376268656 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 225/28 ⇜ (527/64 → 33/4) ⇝ 58/7 | note:80 gain:0.029857864376268656 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 65/8 ⇜ (527/64 → 33/4) | note:C4 gain:0.29857864376268656 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 65/8 ⇜ (527/64 → 33/4) | note:G4 gain:0.29857864376268656 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 65/8 ⇜ (527/64 → 33/4) | note:Bb4 gain:0.29857864376268656 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 225/28 ⇜ (33/4 → 529/64) ⇝ 58/7 | note:70 gain:0.04399999999999996 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 225/28 ⇜ (33/4 → 529/64) ⇝ 58/7 | note:75 gain:0.04399999999999996 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 225/28 ⇜ (33/4 → 529/64) ⇝ 58/7 | note:76 gain:0.04399999999999996 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 225/28 ⇜ (33/4 → 529/64) ⇝ 58/7 | note:80 gain:0.04399999999999996 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 225/28 ⇜ (529/64 → 265/32) ⇝ 58/7 | note:70 gain:0.05814213562373049 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 225/28 ⇜ (529/64 → 265/32) ⇝ 58/7 | note:75 gain:0.05814213562373049 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 225/28 ⇜ (529/64 → 265/32) ⇝ 58/7 | note:76 gain:0.05814213562373049 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 225/28 ⇜ (529/64 → 265/32) ⇝ 58/7 | note:80 gain:0.05814213562373049 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 225/28 ⇜ (265/32 → 58/7) | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 225/28 ⇜ (265/32 → 58/7) | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 225/28 ⇜ (265/32 → 58/7) | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 225/28 ⇜ (265/32 → 58/7) | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ (17/2 → 545/64) ⇝ 69/8 | note:G4 gain:0.4400000000000024 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (17/2 → 545/64) ⇝ 69/8 | note:D5 gain:0.4400000000000024 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ (17/2 → 545/64) ⇝ 69/8 | note:F5 gain:0.4400000000000024 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ (17/2 → 545/64) ⇝ 35/4 | note:Bb3 gain:0.2200000000000012 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ (17/2 → 545/64) ⇝ 35/4 | note:D4 gain:0.2200000000000012 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ (17/2 → 545/64) ⇝ 35/4 | note:Eb4 gain:0.2200000000000012 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ (17/2 → 545/64) ⇝ 35/4 | note:G4 gain:0.2200000000000012 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (17/2 → 545/64) ⇝ 35/4 | note:C2 gain:0.4400000000000024 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 17/2 ⇜ (545/64 → 273/32) ⇝ 69/8 | note:G4 gain:0.5814213562373068 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 17/2 ⇜ (545/64 → 273/32) ⇝ 69/8 | note:D5 gain:0.5814213562373068 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 17/2 ⇜ (545/64 → 273/32) ⇝ 69/8 | note:F5 gain:0.5814213562373068 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 17/2 ⇜ (545/64 → 273/32) ⇝ 35/4 | note:Bb3 gain:0.2907106781186534 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 17/2 ⇜ (545/64 → 273/32) ⇝ 35/4 | note:D4 gain:0.2907106781186534 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 17/2 ⇜ (545/64 → 273/32) ⇝ 35/4 | note:Eb4 gain:0.2907106781186534 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 17/2 ⇜ (545/64 → 273/32) ⇝ 35/4 | note:G4 gain:0.2907106781186534 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 17/2 ⇜ (545/64 → 273/32) ⇝ 35/4 | note:C2 gain:0.5814213562373068 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 17/2 ⇜ (273/32 → 547/64) ⇝ 69/8 | note:G4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 17/2 ⇜ (273/32 → 547/64) ⇝ 69/8 | note:D5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 17/2 ⇜ (273/32 → 547/64) ⇝ 69/8 | note:F5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 17/2 ⇜ (273/32 → 547/64) ⇝ 35/4 | note:Bb3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 17/2 ⇜ (273/32 → 547/64) ⇝ 35/4 | note:D4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 17/2 ⇜ (273/32 → 547/64) ⇝ 35/4 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 17/2 ⇜ (273/32 → 547/64) ⇝ 35/4 | note:G4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 17/2 ⇜ (273/32 → 547/64) ⇝ 35/4 | note:C2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 17/2 ⇜ (547/64 → 137/16) ⇝ 69/8 | note:G4 gain:0.5814213562373131 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 17/2 ⇜ (547/64 → 137/16) ⇝ 69/8 | note:D5 gain:0.5814213562373131 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 17/2 ⇜ (547/64 → 137/16) ⇝ 69/8 | note:F5 gain:0.5814213562373131 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 17/2 ⇜ (547/64 → 137/16) ⇝ 35/4 | note:Bb3 gain:0.29071067811865653 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 17/2 ⇜ (547/64 → 137/16) ⇝ 35/4 | note:D4 gain:0.29071067811865653 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 17/2 ⇜ (547/64 → 137/16) ⇝ 35/4 | note:Eb4 gain:0.29071067811865653 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 17/2 ⇜ (547/64 → 137/16) ⇝ 35/4 | note:G4 gain:0.29071067811865653 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 17/2 ⇜ (547/64 → 137/16) ⇝ 35/4 | note:C2 gain:0.5814213562373131 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 17/2 ⇜ (137/16 → 549/64) ⇝ 69/8 | note:G4 gain:0.4399999999999998 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 17/2 ⇜ (137/16 → 549/64) ⇝ 69/8 | note:D5 gain:0.4399999999999998 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 17/2 ⇜ (137/16 → 549/64) ⇝ 69/8 | note:F5 gain:0.4399999999999998 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 17/2 ⇜ (137/16 → 549/64) ⇝ 35/4 | note:Bb3 gain:0.2199999999999999 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 17/2 ⇜ (137/16 → 549/64) ⇝ 35/4 | note:D4 gain:0.2199999999999999 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 17/2 ⇜ (137/16 → 549/64) ⇝ 35/4 | note:Eb4 gain:0.2199999999999999 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 17/2 ⇜ (137/16 → 549/64) ⇝ 35/4 | note:G4 gain:0.2199999999999999 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 17/2 ⇜ (137/16 → 549/64) ⇝ 35/4 | note:C2 gain:0.4399999999999998 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 17/2 ⇜ (549/64 → 275/32) ⇝ 69/8 | note:G4 gain:0.2985786437626947 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 17/2 ⇜ (549/64 → 275/32) ⇝ 69/8 | note:D5 gain:0.2985786437626947 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 17/2 ⇜ (549/64 → 275/32) ⇝ 69/8 | note:F5 gain:0.2985786437626947 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 17/2 ⇜ (549/64 → 275/32) ⇝ 35/4 | note:Bb3 gain:0.14928932188134736 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 17/2 ⇜ (549/64 → 275/32) ⇝ 35/4 | note:D4 gain:0.14928932188134736 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 17/2 ⇜ (549/64 → 275/32) ⇝ 35/4 | note:Eb4 gain:0.14928932188134736 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 17/2 ⇜ (549/64 → 275/32) ⇝ 35/4 | note:G4 gain:0.14928932188134736 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 17/2 ⇜ (549/64 → 275/32) ⇝ 35/4 | note:C2 gain:0.2985786437626947 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 17/2 ⇜ (275/32 → 551/64) ⇝ 69/8 | note:G4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 17/2 ⇜ (275/32 → 551/64) ⇝ 69/8 | note:D5 gain:0.24 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 17/2 ⇜ (275/32 → 551/64) ⇝ 69/8 | note:F5 gain:0.24 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 17/2 ⇜ (275/32 → 551/64) ⇝ 35/4 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 17/2 ⇜ (275/32 → 551/64) ⇝ 35/4 | note:D4 gain:0.12 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 17/2 ⇜ (275/32 → 551/64) ⇝ 35/4 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 17/2 ⇜ (275/32 → 551/64) ⇝ 35/4 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 17/2 ⇜ (275/32 → 551/64) ⇝ 35/4 | note:C2 gain:0.24 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 17/2 ⇜ (551/64 → 69/8) | note:G4 gain:0.2985786437626855 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 17/2 ⇜ (551/64 → 69/8) | note:D5 gain:0.2985786437626855 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 17/2 ⇜ (551/64 → 69/8) | note:F5 gain:0.2985786437626855 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 17/2 ⇜ (551/64 → 69/8) ⇝ 35/4 | note:Bb3 gain:0.14928932188134275 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 17/2 ⇜ (551/64 → 69/8) ⇝ 35/4 | note:D4 gain:0.14928932188134275 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 17/2 ⇜ (551/64 → 69/8) ⇝ 35/4 | note:Eb4 gain:0.14928932188134275 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 17/2 ⇜ (551/64 → 69/8) ⇝ 35/4 | note:G4 gain:0.14928932188134275 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 17/2 ⇜ (551/64 → 69/8) ⇝ 35/4 | note:C2 gain:0.2985786437626855 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 17/2 ⇜ (69/8 → 553/64) ⇝ 35/4 | note:Bb3 gain:0.21999999999999906 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 17/2 ⇜ (69/8 → 553/64) ⇝ 35/4 | note:D4 gain:0.21999999999999906 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 17/2 ⇜ (69/8 → 553/64) ⇝ 35/4 | note:Eb4 gain:0.21999999999999906 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 17/2 ⇜ (69/8 → 553/64) ⇝ 35/4 | note:G4 gain:0.21999999999999906 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 17/2 ⇜ (69/8 → 553/64) ⇝ 35/4 | note:C2 gain:0.4399999999999981 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 17/2 ⇜ (553/64 → 277/32) ⇝ 35/4 | note:Bb3 gain:0.29071067811865187 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 17/2 ⇜ (553/64 → 277/32) ⇝ 35/4 | note:D4 gain:0.29071067811865187 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 17/2 ⇜ (553/64 → 277/32) ⇝ 35/4 | note:Eb4 gain:0.29071067811865187 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 17/2 ⇜ (553/64 → 277/32) ⇝ 35/4 | note:G4 gain:0.29071067811865187 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 17/2 ⇜ (553/64 → 277/32) ⇝ 35/4 | note:C2 gain:0.5814213562373037 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 17/2 ⇜ (277/32 → 555/64) ⇝ 35/4 | note:Bb3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 17/2 ⇜ (277/32 → 555/64) ⇝ 35/4 | note:D4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 17/2 ⇜ (277/32 → 555/64) ⇝ 35/4 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 17/2 ⇜ (277/32 → 555/64) ⇝ 35/4 | note:G4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 17/2 ⇜ (277/32 → 555/64) ⇝ 35/4 | note:C2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 17/2 ⇜ (555/64 → 139/16) ⇝ 35/4 | note:Bb3 gain:0.29071067811865403 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 17/2 ⇜ (555/64 → 139/16) ⇝ 35/4 | note:D4 gain:0.29071067811865403 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 17/2 ⇜ (555/64 → 139/16) ⇝ 35/4 | note:Eb4 gain:0.29071067811865403 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 17/2 ⇜ (555/64 → 139/16) ⇝ 35/4 | note:G4 gain:0.29071067811865403 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 17/2 ⇜ (555/64 → 139/16) ⇝ 35/4 | note:C2 gain:0.5814213562373081 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 17/2 ⇜ (139/16 → 557/64) ⇝ 35/4 | note:Bb3 gain:0.22000000000000208 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 17/2 ⇜ (139/16 → 557/64) ⇝ 35/4 | note:D4 gain:0.22000000000000208 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 17/2 ⇜ (139/16 → 557/64) ⇝ 35/4 | note:Eb4 gain:0.22000000000000208 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 17/2 ⇜ (139/16 → 557/64) ⇝ 35/4 | note:G4 gain:0.22000000000000208 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 17/2 ⇜ (139/16 → 557/64) ⇝ 35/4 | note:C2 gain:0.44000000000000417 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 17/2 ⇜ (557/64 → 279/32) ⇝ 35/4 | note:Bb3 gain:0.1492893218813449 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 17/2 ⇜ (557/64 → 279/32) ⇝ 35/4 | note:D4 gain:0.1492893218813449 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 17/2 ⇜ (557/64 → 279/32) ⇝ 35/4 | note:Eb4 gain:0.1492893218813449 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 17/2 ⇜ (557/64 → 279/32) ⇝ 35/4 | note:G4 gain:0.1492893218813449 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 17/2 ⇜ (557/64 → 279/32) ⇝ 35/4 | note:C2 gain:0.2985786437626898 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 17/2 ⇜ (279/32 → 559/64) ⇝ 35/4 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 17/2 ⇜ (279/32 → 559/64) ⇝ 35/4 | note:D4 gain:0.12 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 17/2 ⇜ (279/32 → 559/64) ⇝ 35/4 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 17/2 ⇜ (279/32 → 559/64) ⇝ 35/4 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 17/2 ⇜ (279/32 → 559/64) ⇝ 35/4 | note:C2 gain:0.24 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 17/2 ⇜ (559/64 → 35/4) | note:Bb3 gain:0.14928932188134522 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 17/2 ⇜ (559/64 → 35/4) | note:D4 gain:0.14928932188134522 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 17/2 ⇜ (559/64 → 35/4) | note:Eb4 gain:0.14928932188134522 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 17/2 ⇜ (559/64 → 35/4) | note:G4 gain:0.14928932188134522 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 17/2 ⇜ (559/64 → 35/4) | note:C2 gain:0.29857864376269044 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ (35/4 → 561/64) ⇝ 71/8 | note:C4 gain:0.43999999999999373 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ (35/4 → 561/64) ⇝ 71/8 | note:G4 gain:0.43999999999999373 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (35/4 → 561/64) ⇝ 71/8 | note:Bb4 gain:0.43999999999999373 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 35/4 ⇜ (561/64 → 281/32) ⇝ 71/8 | note:C4 gain:0.5814213562373087 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 35/4 ⇜ (561/64 → 281/32) ⇝ 71/8 | note:G4 gain:0.5814213562373087 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 35/4 ⇜ (561/64 → 281/32) ⇝ 71/8 | note:Bb4 gain:0.5814213562373087 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 35/4 ⇜ (281/32 → 563/64) ⇝ 71/8 | note:C4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 35/4 ⇜ (281/32 → 563/64) ⇝ 71/8 | note:G4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 35/4 ⇜ (281/32 → 563/64) ⇝ 71/8 | note:Bb4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ (123/14 → 563/64) ⇝ 253/28 | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ (123/14 → 563/64) ⇝ 253/28 | note:74 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ (123/14 → 563/64) ⇝ 253/28 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ (123/14 → 563/64) ⇝ 253/28 | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 35/4 ⇜ (563/64 → 141/16) ⇝ 71/8 | note:C4 gain:0.5814213562373111 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 35/4 ⇜ (563/64 → 141/16) ⇝ 71/8 | note:G4 gain:0.5814213562373111 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 35/4 ⇜ (563/64 → 141/16) ⇝ 71/8 | note:Bb4 gain:0.5814213562373111 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 123/14 ⇜ (563/64 → 141/16) ⇝ 253/28 | note:70 gain:0.058142135623731106 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 123/14 ⇜ (563/64 → 141/16) ⇝ 253/28 | note:74 gain:0.058142135623731106 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 123/14 ⇜ (563/64 → 141/16) ⇝ 253/28 | note:75 gain:0.058142135623731106 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 123/14 ⇜ (563/64 → 141/16) ⇝ 253/28 | note:79 gain:0.058142135623731106 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 35/4 ⇜ (141/16 → 565/64) ⇝ 71/8 | note:C4 gain:0.4400000000000084 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 35/4 ⇜ (141/16 → 565/64) ⇝ 71/8 | note:G4 gain:0.4400000000000084 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 35/4 ⇜ (141/16 → 565/64) ⇝ 71/8 | note:Bb4 gain:0.4400000000000084 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 123/14 ⇜ (141/16 → 565/64) ⇝ 253/28 | note:70 gain:0.044000000000000844 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 123/14 ⇜ (141/16 → 565/64) ⇝ 253/28 | note:74 gain:0.044000000000000844 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 123/14 ⇜ (141/16 → 565/64) ⇝ 253/28 | note:75 gain:0.044000000000000844 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 123/14 ⇜ (141/16 → 565/64) ⇝ 253/28 | note:79 gain:0.044000000000000844 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 35/4 ⇜ (565/64 → 283/32) ⇝ 71/8 | note:C4 gain:0.29857864376269283 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 35/4 ⇜ (565/64 → 283/32) ⇝ 71/8 | note:G4 gain:0.29857864376269283 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 35/4 ⇜ (565/64 → 283/32) ⇝ 71/8 | note:Bb4 gain:0.29857864376269283 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 123/14 ⇜ (565/64 → 283/32) ⇝ 253/28 | note:70 gain:0.029857864376269284 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 123/14 ⇜ (565/64 → 283/32) ⇝ 253/28 | note:74 gain:0.029857864376269284 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 123/14 ⇜ (565/64 → 283/32) ⇝ 253/28 | note:75 gain:0.029857864376269284 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 123/14 ⇜ (565/64 → 283/32) ⇝ 253/28 | note:79 gain:0.029857864376269284 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 35/4 ⇜ (283/32 → 567/64) ⇝ 71/8 | note:C4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 35/4 ⇜ (283/32 → 567/64) ⇝ 71/8 | note:G4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 35/4 ⇜ (283/32 → 567/64) ⇝ 71/8 | note:Bb4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 123/14 ⇜ (283/32 → 567/64) ⇝ 253/28 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 123/14 ⇜ (283/32 → 567/64) ⇝ 253/28 | note:74 gain:0.024 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 123/14 ⇜ (283/32 → 567/64) ⇝ 253/28 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 123/14 ⇜ (283/32 → 567/64) ⇝ 253/28 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 35/4 ⇜ (567/64 → 71/8) | note:C4 gain:0.2985786437626874 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 35/4 ⇜ (567/64 → 71/8) | note:G4 gain:0.2985786437626874 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 35/4 ⇜ (567/64 → 71/8) | note:Bb4 gain:0.2985786437626874 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 123/14 ⇜ (567/64 → 71/8) ⇝ 253/28 | note:70 gain:0.02985786437626874 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 123/14 ⇜ (567/64 → 71/8) ⇝ 253/28 | note:74 gain:0.02985786437626874 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 123/14 ⇜ (567/64 → 71/8) ⇝ 253/28 | note:75 gain:0.02985786437626874 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 123/14 ⇜ (567/64 → 71/8) ⇝ 253/28 | note:79 gain:0.02985786437626874 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 123/14 ⇜ (71/8 → 569/64) ⇝ 253/28 | note:70 gain:0.04400000000000008 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 123/14 ⇜ (71/8 → 569/64) ⇝ 253/28 | note:74 gain:0.04400000000000008 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 123/14 ⇜ (71/8 → 569/64) ⇝ 253/28 | note:75 gain:0.04400000000000008 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 123/14 ⇜ (71/8 → 569/64) ⇝ 253/28 | note:79 gain:0.04400000000000008 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 123/14 ⇜ (569/64 → 285/32) ⇝ 253/28 | note:70 gain:0.05814213562373058 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 123/14 ⇜ (569/64 → 285/32) ⇝ 253/28 | note:74 gain:0.05814213562373058 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 123/14 ⇜ (569/64 → 285/32) ⇝ 253/28 | note:75 gain:0.05814213562373058 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 123/14 ⇜ (569/64 → 285/32) ⇝ 253/28 | note:79 gain:0.05814213562373058 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 123/14 ⇜ (285/32 → 571/64) ⇝ 253/28 | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 123/14 ⇜ (285/32 → 571/64) ⇝ 253/28 | note:74 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 123/14 ⇜ (285/32 → 571/64) ⇝ 253/28 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 123/14 ⇜ (285/32 → 571/64) ⇝ 253/28 | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 123/14 ⇜ (571/64 → 143/16) ⇝ 253/28 | note:70 gain:0.05814213562373141 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 123/14 ⇜ (571/64 → 143/16) ⇝ 253/28 | note:74 gain:0.05814213562373141 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 123/14 ⇜ (571/64 → 143/16) ⇝ 253/28 | note:75 gain:0.05814213562373141 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 123/14 ⇜ (571/64 → 143/16) ⇝ 253/28 | note:79 gain:0.05814213562373141 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 123/14 ⇜ (143/16 → 573/64) ⇝ 253/28 | note:70 gain:0.04400000000000014 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 123/14 ⇜ (143/16 → 573/64) ⇝ 253/28 | note:74 gain:0.04400000000000014 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 123/14 ⇜ (143/16 → 573/64) ⇝ 253/28 | note:75 gain:0.04400000000000014 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 123/14 ⇜ (143/16 → 573/64) ⇝ 253/28 | note:79 gain:0.04400000000000014 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 123/14 ⇜ (573/64 → 287/32) ⇝ 253/28 | note:70 gain:0.02985786437626959 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 123/14 ⇜ (573/64 → 287/32) ⇝ 253/28 | note:74 gain:0.02985786437626959 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 123/14 ⇜ (573/64 → 287/32) ⇝ 253/28 | note:75 gain:0.02985786437626959 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 123/14 ⇜ (573/64 → 287/32) ⇝ 253/28 | note:79 gain:0.02985786437626959 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 123/14 ⇜ (287/32 → 575/64) ⇝ 253/28 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 123/14 ⇜ (287/32 → 575/64) ⇝ 253/28 | note:74 gain:0.024 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 123/14 ⇜ (287/32 → 575/64) ⇝ 253/28 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 123/14 ⇜ (287/32 → 575/64) ⇝ 253/28 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 123/14 ⇜ (575/64 → 9/1) ⇝ 253/28 | note:70 gain:0.029857864376268434 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 123/14 ⇜ (575/64 → 9/1) ⇝ 253/28 | note:74 gain:0.029857864376268434 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 123/14 ⇜ (575/64 → 9/1) ⇝ 253/28 | note:75 gain:0.029857864376268434 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 123/14 ⇜ (575/64 → 9/1) ⇝ 253/28 | note:79 gain:0.029857864376268434 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 123/14 ⇜ (9/1 → 577/64) ⇝ 253/28 | note:70 gain:0.04399999999999965 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 123/14 ⇜ (9/1 → 577/64) ⇝ 253/28 | note:74 gain:0.04399999999999965 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 123/14 ⇜ (9/1 → 577/64) ⇝ 253/28 | note:75 gain:0.04399999999999965 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 123/14 ⇜ (9/1 → 577/64) ⇝ 253/28 | note:79 gain:0.04399999999999965 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ (9/1 → 577/64) ⇝ 37/4 | note:C2 gain:0.4399999999999965 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 123/14 ⇜ (577/64 → 289/32) ⇝ 253/28 | note:70 gain:0.05814213562373108 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 123/14 ⇜ (577/64 → 289/32) ⇝ 253/28 | note:74 gain:0.05814213562373108 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 123/14 ⇜ (577/64 → 289/32) ⇝ 253/28 | note:75 gain:0.05814213562373108 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 123/14 ⇜ (577/64 → 289/32) ⇝ 253/28 | note:79 gain:0.05814213562373108 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 9/1 ⇜ (577/64 → 289/32) ⇝ 37/4 | note:C2 gain:0.5814213562373107 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 123/14 ⇜ (289/32 → 253/28) | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 123/14 ⇜ (289/32 → 253/28) | note:74 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 123/14 ⇜ (289/32 → 253/28) | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 123/14 ⇜ (289/32 → 253/28) | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 9/1 ⇜ (289/32 → 579/64) ⇝ 37/4 | note:C2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 9/1 ⇜ (579/64 → 145/16) ⇝ 37/4 | note:C2 gain:0.5814213562373091 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 9/1 ⇜ (145/16 → 581/64) ⇝ 37/4 | note:C2 gain:0.4400000000000057 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 9/1 ⇜ (581/64 → 291/32) ⇝ 37/4 | note:C2 gain:0.2985786437626909 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 9/1 ⇜ (291/32 → 583/64) ⇝ 37/4 | note:C2 gain:0.24 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 9/1 ⇜ (583/64 → 73/8) ⇝ 37/4 | note:C2 gain:0.29857864376268933 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 9/1 ⇜ (73/8 → 585/64) ⇝ 37/4 | note:C2 gain:0.4399999999999922 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ (73/8 → 585/64) ⇝ 37/4 | note:C4 gain:0.4399999999999922 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ (73/8 → 585/64) ⇝ 37/4 | note:G4 gain:0.4399999999999922 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (73/8 → 585/64) ⇝ 37/4 | note:Bb4 gain:0.4399999999999922 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 9/1 ⇜ (585/64 → 293/32) ⇝ 37/4 | note:C2 gain:0.5814213562373077 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 73/8 ⇜ (585/64 → 293/32) ⇝ 37/4 | note:C4 gain:0.5814213562373077 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 73/8 ⇜ (585/64 → 293/32) ⇝ 37/4 | note:G4 gain:0.5814213562373077 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 73/8 ⇜ (585/64 → 293/32) ⇝ 37/4 | note:Bb4 gain:0.5814213562373077 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 9/1 ⇜ (293/32 → 587/64) ⇝ 37/4 | note:C2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 73/8 ⇜ (293/32 → 587/64) ⇝ 37/4 | note:C4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 73/8 ⇜ (293/32 → 587/64) ⇝ 37/4 | note:G4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 73/8 ⇜ (293/32 → 587/64) ⇝ 37/4 | note:Bb4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 9/1 ⇜ (587/64 → 147/16) ⇝ 37/4 | note:C2 gain:0.5814213562373122 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 73/8 ⇜ (587/64 → 147/16) ⇝ 37/4 | note:C4 gain:0.5814213562373122 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 73/8 ⇜ (587/64 → 147/16) ⇝ 37/4 | note:G4 gain:0.5814213562373122 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 73/8 ⇜ (587/64 → 147/16) ⇝ 37/4 | note:Bb4 gain:0.5814213562373122 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 9/1 ⇜ (147/16 → 589/64) ⇝ 37/4 | note:C2 gain:0.4399999999999986 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 73/8 ⇜ (147/16 → 589/64) ⇝ 37/4 | note:C4 gain:0.4399999999999986 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 73/8 ⇜ (147/16 → 589/64) ⇝ 37/4 | note:G4 gain:0.4399999999999986 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 73/8 ⇜ (147/16 → 589/64) ⇝ 37/4 | note:Bb4 gain:0.4399999999999986 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 9/1 ⇜ (589/64 → 295/32) ⇝ 37/4 | note:C2 gain:0.29857864376269394 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 73/8 ⇜ (589/64 → 295/32) ⇝ 37/4 | note:C4 gain:0.29857864376269394 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 73/8 ⇜ (589/64 → 295/32) ⇝ 37/4 | note:G4 gain:0.29857864376269394 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 73/8 ⇜ (589/64 → 295/32) ⇝ 37/4 | note:Bb4 gain:0.29857864376269394 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 9/1 ⇜ (295/32 → 591/64) ⇝ 37/4 | note:C2 gain:0.24 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 73/8 ⇜ (295/32 → 591/64) ⇝ 37/4 | note:C4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 73/8 ⇜ (295/32 → 591/64) ⇝ 37/4 | note:G4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 73/8 ⇜ (295/32 → 591/64) ⇝ 37/4 | note:Bb4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 9/1 ⇜ (591/64 → 37/4) | note:C2 gain:0.2985786437626863 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 73/8 ⇜ (591/64 → 37/4) | note:C4 gain:0.2985786437626863 clip:1 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 73/8 ⇜ (591/64 → 37/4) | note:G4 gain:0.2985786437626863 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 73/8 ⇜ (591/64 → 37/4) | note:Bb4 gain:0.2985786437626863 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ (37/4 → 593/64) ⇝ 19/2 | note:Bb3 gain:0.21999999999999964 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ (37/4 → 593/64) ⇝ 19/2 | note:D4 gain:0.21999999999999964 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ (37/4 → 593/64) ⇝ 19/2 | note:Eb4 gain:0.21999999999999964 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ (37/4 → 593/64) ⇝ 19/2 | note:G4 gain:0.21999999999999964 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 37/4 ⇜ (593/64 → 297/32) ⇝ 19/2 | note:Bb3 gain:0.2907106781186523 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 37/4 ⇜ (593/64 → 297/32) ⇝ 19/2 | note:D4 gain:0.2907106781186523 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 37/4 ⇜ (593/64 → 297/32) ⇝ 19/2 | note:Eb4 gain:0.2907106781186523 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 37/4 ⇜ (593/64 → 297/32) ⇝ 19/2 | note:G4 gain:0.2907106781186523 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 37/4 ⇜ (297/32 → 595/64) ⇝ 19/2 | note:Bb3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 37/4 ⇜ (297/32 → 595/64) ⇝ 19/2 | note:D4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 37/4 ⇜ (297/32 → 595/64) ⇝ 19/2 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 37/4 ⇜ (297/32 → 595/64) ⇝ 19/2 | note:G4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 37/4 ⇜ (595/64 → 149/16) ⇝ 19/2 | note:Bb3 gain:0.29071067811865764 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 37/4 ⇜ (595/64 → 149/16) ⇝ 19/2 | note:D4 gain:0.29071067811865764 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 37/4 ⇜ (595/64 → 149/16) ⇝ 19/2 | note:Eb4 gain:0.29071067811865764 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 37/4 ⇜ (595/64 → 149/16) ⇝ 19/2 | note:G4 gain:0.29071067811865764 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 37/4 ⇜ (149/16 → 597/64) ⇝ 19/2 | note:Bb3 gain:0.22000000000000144 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 37/4 ⇜ (149/16 → 597/64) ⇝ 19/2 | note:D4 gain:0.22000000000000144 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 37/4 ⇜ (149/16 → 597/64) ⇝ 19/2 | note:Eb4 gain:0.22000000000000144 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 37/4 ⇜ (149/16 → 597/64) ⇝ 19/2 | note:G4 gain:0.22000000000000144 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 37/4 ⇜ (597/64 → 299/32) ⇝ 19/2 | note:Bb3 gain:0.14928932188134847 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 37/4 ⇜ (597/64 → 299/32) ⇝ 19/2 | note:D4 gain:0.14928932188134847 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 37/4 ⇜ (597/64 → 299/32) ⇝ 19/2 | note:Eb4 gain:0.14928932188134847 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 37/4 ⇜ (597/64 → 299/32) ⇝ 19/2 | note:G4 gain:0.14928932188134847 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 37/4 ⇜ (299/32 → 599/64) ⇝ 19/2 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 37/4 ⇜ (299/32 → 599/64) ⇝ 19/2 | note:D4 gain:0.12 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 37/4 ⇜ (299/32 → 599/64) ⇝ 19/2 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 37/4 ⇜ (299/32 → 599/64) ⇝ 19/2 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 37/4 ⇜ (599/64 → 75/8) ⇝ 19/2 | note:Bb3 gain:0.14928932188134564 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 37/4 ⇜ (599/64 → 75/8) ⇝ 19/2 | note:D4 gain:0.14928932188134564 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 37/4 ⇜ (599/64 → 75/8) ⇝ 19/2 | note:Eb4 gain:0.14928932188134564 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 37/4 ⇜ (599/64 → 75/8) ⇝ 19/2 | note:G4 gain:0.14928932188134564 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 37/4 ⇜ (75/8 → 601/64) ⇝ 19/2 | note:Bb3 gain:0.21999999999999745 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 37/4 ⇜ (75/8 → 601/64) ⇝ 19/2 | note:D4 gain:0.21999999999999745 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 37/4 ⇜ (75/8 → 601/64) ⇝ 19/2 | note:Eb4 gain:0.21999999999999745 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 37/4 ⇜ (75/8 → 601/64) ⇝ 19/2 | note:G4 gain:0.21999999999999745 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 37/4 ⇜ (601/64 → 301/32) ⇝ 19/2 | note:Bb3 gain:0.29071067811865475 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 37/4 ⇜ (601/64 → 301/32) ⇝ 19/2 | note:D4 gain:0.29071067811865475 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 37/4 ⇜ (601/64 → 301/32) ⇝ 19/2 | note:Eb4 gain:0.29071067811865475 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 37/4 ⇜ (601/64 → 301/32) ⇝ 19/2 | note:G4 gain:0.29071067811865475 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 37/4 ⇜ (301/32 → 603/64) ⇝ 19/2 | note:Bb3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 37/4 ⇜ (301/32 → 603/64) ⇝ 19/2 | note:D4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 37/4 ⇜ (301/32 → 603/64) ⇝ 19/2 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 37/4 ⇜ (301/32 → 603/64) ⇝ 19/2 | note:G4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 37/4 ⇜ (603/64 → 151/16) ⇝ 19/2 | note:Bb3 gain:0.2907106781186551 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 37/4 ⇜ (603/64 → 151/16) ⇝ 19/2 | note:D4 gain:0.2907106781186551 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 37/4 ⇜ (603/64 → 151/16) ⇝ 19/2 | note:Eb4 gain:0.2907106781186551 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 37/4 ⇜ (603/64 → 151/16) ⇝ 19/2 | note:G4 gain:0.2907106781186551 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 37/4 ⇜ (151/16 → 605/64) ⇝ 19/2 | note:Bb3 gain:0.22000000000000364 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 37/4 ⇜ (151/16 → 605/64) ⇝ 19/2 | note:D4 gain:0.22000000000000364 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 37/4 ⇜ (151/16 → 605/64) ⇝ 19/2 | note:Eb4 gain:0.22000000000000364 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 37/4 ⇜ (151/16 → 605/64) ⇝ 19/2 | note:G4 gain:0.22000000000000364 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 37/4 ⇜ (605/64 → 303/32) ⇝ 19/2 | note:Bb3 gain:0.149289321881346 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 37/4 ⇜ (605/64 → 303/32) ⇝ 19/2 | note:D4 gain:0.149289321881346 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 37/4 ⇜ (605/64 → 303/32) ⇝ 19/2 | note:Eb4 gain:0.149289321881346 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 37/4 ⇜ (605/64 → 303/32) ⇝ 19/2 | note:G4 gain:0.149289321881346 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 37/4 ⇜ (303/32 → 607/64) ⇝ 19/2 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 37/4 ⇜ (303/32 → 607/64) ⇝ 19/2 | note:D4 gain:0.12 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 37/4 ⇜ (303/32 → 607/64) ⇝ 19/2 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 37/4 ⇜ (303/32 → 607/64) ⇝ 19/2 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 37/4 ⇜ (607/64 → 19/2) | note:Bb3 gain:0.1492893218813441 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 37/4 ⇜ (607/64 → 19/2) | note:D4 gain:0.1492893218813441 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 37/4 ⇜ (607/64 → 19/2) | note:Eb4 gain:0.1492893218813441 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 37/4 ⇜ (607/64 → 19/2) | note:G4 gain:0.1492893218813441 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (19/2 → 609/64) ⇝ 77/8 | note:G4 gain:0.4399999999999906 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (19/2 → 609/64) ⇝ 77/8 | note:D5 gain:0.4399999999999906 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ (19/2 → 609/64) ⇝ 77/8 | note:F5 gain:0.4399999999999906 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ (19/2 → 609/64) ⇝ 39/4 | note:C2 gain:0.4399999999999906 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 19/2 ⇜ (609/64 → 305/32) ⇝ 77/8 | note:G4 gain:0.5814213562373064 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 19/2 ⇜ (609/64 → 305/32) ⇝ 77/8 | note:D5 gain:0.5814213562373064 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 19/2 ⇜ (609/64 → 305/32) ⇝ 77/8 | note:F5 gain:0.5814213562373064 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 19/2 ⇜ (609/64 → 305/32) ⇝ 39/4 | note:C2 gain:0.5814213562373064 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 19/2 ⇜ (305/32 → 611/64) ⇝ 77/8 | note:G4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 19/2 ⇜ (305/32 → 611/64) ⇝ 77/8 | note:D5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 19/2 ⇜ (305/32 → 611/64) ⇝ 77/8 | note:F5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 19/2 ⇜ (305/32 → 611/64) ⇝ 39/4 | note:C2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ (267/28 → 611/64) ⇝ 137/14 | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ (267/28 → 611/64) ⇝ 137/14 | note:74 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ (267/28 → 611/64) ⇝ 137/14 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ (267/28 → 611/64) ⇝ 137/14 | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 19/2 ⇜ (611/64 → 153/16) ⇝ 77/8 | note:G4 gain:0.5814213562373134 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 19/2 ⇜ (611/64 → 153/16) ⇝ 77/8 | note:D5 gain:0.5814213562373134 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 19/2 ⇜ (611/64 → 153/16) ⇝ 77/8 | note:F5 gain:0.5814213562373134 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 19/2 ⇜ (611/64 → 153/16) ⇝ 39/4 | note:C2 gain:0.5814213562373134 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 267/28 ⇜ (611/64 → 153/16) ⇝ 137/14 | note:70 gain:0.05814213562373134 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 267/28 ⇜ (611/64 → 153/16) ⇝ 137/14 | note:74 gain:0.05814213562373134 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 267/28 ⇜ (611/64 → 153/16) ⇝ 137/14 | note:75 gain:0.05814213562373134 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 267/28 ⇜ (611/64 → 153/16) ⇝ 137/14 | note:79 gain:0.05814213562373134 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 19/2 ⇜ (153/16 → 613/64) ⇝ 77/8 | note:G4 gain:0.4400000000000002 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 19/2 ⇜ (153/16 → 613/64) ⇝ 77/8 | note:D5 gain:0.4400000000000002 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 19/2 ⇜ (153/16 → 613/64) ⇝ 77/8 | note:F5 gain:0.4400000000000002 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 19/2 ⇜ (153/16 → 613/64) ⇝ 39/4 | note:C2 gain:0.4400000000000002 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 267/28 ⇜ (153/16 → 613/64) ⇝ 137/14 | note:70 gain:0.044000000000000025 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 267/28 ⇜ (153/16 → 613/64) ⇝ 137/14 | note:74 gain:0.044000000000000025 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 267/28 ⇜ (153/16 → 613/64) ⇝ 137/14 | note:75 gain:0.044000000000000025 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 267/28 ⇜ (153/16 → 613/64) ⇝ 137/14 | note:79 gain:0.044000000000000025 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 19/2 ⇜ (613/64 → 307/32) ⇝ 77/8 | note:G4 gain:0.29857864376269505 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 19/2 ⇜ (613/64 → 307/32) ⇝ 77/8 | note:D5 gain:0.29857864376269505 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 19/2 ⇜ (613/64 → 307/32) ⇝ 77/8 | note:F5 gain:0.29857864376269505 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 19/2 ⇜ (613/64 → 307/32) ⇝ 39/4 | note:C2 gain:0.29857864376269505 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 267/28 ⇜ (613/64 → 307/32) ⇝ 137/14 | note:70 gain:0.029857864376269506 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 267/28 ⇜ (613/64 → 307/32) ⇝ 137/14 | note:74 gain:0.029857864376269506 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 267/28 ⇜ (613/64 → 307/32) ⇝ 137/14 | note:75 gain:0.029857864376269506 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 267/28 ⇜ (613/64 → 307/32) ⇝ 137/14 | note:79 gain:0.029857864376269506 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 19/2 ⇜ (307/32 → 615/64) ⇝ 77/8 | note:G4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 19/2 ⇜ (307/32 → 615/64) ⇝ 77/8 | note:D5 gain:0.24 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 19/2 ⇜ (307/32 → 615/64) ⇝ 77/8 | note:F5 gain:0.24 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 19/2 ⇜ (307/32 → 615/64) ⇝ 39/4 | note:C2 gain:0.24 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 267/28 ⇜ (307/32 → 615/64) ⇝ 137/14 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 267/28 ⇜ (307/32 → 615/64) ⇝ 137/14 | note:74 gain:0.024 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 267/28 ⇜ (307/32 → 615/64) ⇝ 137/14 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 267/28 ⇜ (307/32 → 615/64) ⇝ 137/14 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 19/2 ⇜ (615/64 → 77/8) | note:G4 gain:0.2985786437626852 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 19/2 ⇜ (615/64 → 77/8) | note:D5 gain:0.2985786437626852 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 19/2 ⇜ (615/64 → 77/8) | note:F5 gain:0.2985786437626852 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 19/2 ⇜ (615/64 → 77/8) ⇝ 39/4 | note:C2 gain:0.2985786437626852 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 267/28 ⇜ (615/64 → 77/8) ⇝ 137/14 | note:70 gain:0.029857864376268525 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 267/28 ⇜ (615/64 → 77/8) ⇝ 137/14 | note:74 gain:0.029857864376268525 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 267/28 ⇜ (615/64 → 77/8) ⇝ 137/14 | note:75 gain:0.029857864376268525 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 267/28 ⇜ (615/64 → 77/8) ⇝ 137/14 | note:79 gain:0.029857864376268525 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 19/2 ⇜ (77/8 → 617/64) ⇝ 39/4 | note:C2 gain:0.43999999999999767 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 267/28 ⇜ (77/8 → 617/64) ⇝ 137/14 | note:70 gain:0.04399999999999977 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 267/28 ⇜ (77/8 → 617/64) ⇝ 137/14 | note:74 gain:0.04399999999999977 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 267/28 ⇜ (77/8 → 617/64) ⇝ 137/14 | note:75 gain:0.04399999999999977 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 267/28 ⇜ (77/8 → 617/64) ⇝ 137/14 | note:79 gain:0.04399999999999977 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 19/2 ⇜ (617/64 → 309/32) ⇝ 39/4 | note:C2 gain:0.5814213562373034 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 267/28 ⇜ (617/64 → 309/32) ⇝ 137/14 | note:70 gain:0.05814213562373034 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 267/28 ⇜ (617/64 → 309/32) ⇝ 137/14 | note:74 gain:0.05814213562373034 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 267/28 ⇜ (617/64 → 309/32) ⇝ 137/14 | note:75 gain:0.05814213562373034 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 267/28 ⇜ (617/64 → 309/32) ⇝ 137/14 | note:79 gain:0.05814213562373034 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 19/2 ⇜ (309/32 → 619/64) ⇝ 39/4 | note:C2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 267/28 ⇜ (309/32 → 619/64) ⇝ 137/14 | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 267/28 ⇜ (309/32 → 619/64) ⇝ 137/14 | note:74 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 267/28 ⇜ (309/32 → 619/64) ⇝ 137/14 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 267/28 ⇜ (309/32 → 619/64) ⇝ 137/14 | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 19/2 ⇜ (619/64 → 155/16) ⇝ 39/4 | note:C2 gain:0.5814213562373083 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 267/28 ⇜ (619/64 → 155/16) ⇝ 137/14 | note:70 gain:0.05814213562373083 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 267/28 ⇜ (619/64 → 155/16) ⇝ 137/14 | note:74 gain:0.05814213562373083 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 267/28 ⇜ (619/64 → 155/16) ⇝ 137/14 | note:75 gain:0.05814213562373083 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 267/28 ⇜ (619/64 → 155/16) ⇝ 137/14 | note:79 gain:0.05814213562373083 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 19/2 ⇜ (155/16 → 621/64) ⇝ 39/4 | note:C2 gain:0.4400000000000045 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 267/28 ⇜ (155/16 → 621/64) ⇝ 137/14 | note:70 gain:0.044000000000000455 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 267/28 ⇜ (155/16 → 621/64) ⇝ 137/14 | note:74 gain:0.044000000000000455 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 267/28 ⇜ (155/16 → 621/64) ⇝ 137/14 | note:75 gain:0.044000000000000455 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 267/28 ⇜ (155/16 → 621/64) ⇝ 137/14 | note:79 gain:0.044000000000000455 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 19/2 ⇜ (621/64 → 311/32) ⇝ 39/4 | note:C2 gain:0.29857864376269 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 267/28 ⇜ (621/64 → 311/32) ⇝ 137/14 | note:70 gain:0.029857864376269 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 267/28 ⇜ (621/64 → 311/32) ⇝ 137/14 | note:74 gain:0.029857864376269 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 267/28 ⇜ (621/64 → 311/32) ⇝ 137/14 | note:75 gain:0.029857864376269 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 267/28 ⇜ (621/64 → 311/32) ⇝ 137/14 | note:79 gain:0.029857864376269 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 19/2 ⇜ (311/32 → 623/64) ⇝ 39/4 | note:C2 gain:0.24 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 267/28 ⇜ (311/32 → 623/64) ⇝ 137/14 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 267/28 ⇜ (311/32 → 623/64) ⇝ 137/14 | note:74 gain:0.024 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 267/28 ⇜ (311/32 → 623/64) ⇝ 137/14 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 267/28 ⇜ (311/32 → 623/64) ⇝ 137/14 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 19/2 ⇜ (623/64 → 39/4) | note:C2 gain:0.2985786437626902 clip:1 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 267/28 ⇜ (623/64 → 39/4) ⇝ 137/14 | note:70 gain:0.029857864376269024 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 267/28 ⇜ (623/64 → 39/4) ⇝ 137/14 | note:74 gain:0.029857864376269024 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 267/28 ⇜ (623/64 → 39/4) ⇝ 137/14 | note:75 gain:0.029857864376269024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 267/28 ⇜ (623/64 → 39/4) ⇝ 137/14 | note:79 gain:0.029857864376269024 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 267/28 ⇜ (39/4 → 625/64) ⇝ 137/14 | note:70 gain:0.04399999999999933 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 267/28 ⇜ (39/4 → 625/64) ⇝ 137/14 | note:74 gain:0.04399999999999933 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 267/28 ⇜ (39/4 → 625/64) ⇝ 137/14 | note:75 gain:0.04399999999999933 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 267/28 ⇜ (39/4 → 625/64) ⇝ 137/14 | note:79 gain:0.04399999999999933 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ (39/4 → 625/64) ⇝ 79/8 | note:G4 gain:0.4399999999999933 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (39/4 → 625/64) ⇝ 79/8 | note:D5 gain:0.4399999999999933 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ (39/4 → 625/64) ⇝ 79/8 | note:F5 gain:0.4399999999999933 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ (39/4 → 625/64) ⇝ 10/1 | note:Bb3 gain:0.21999999999999664 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ (39/4 → 625/64) ⇝ 10/1 | note:D4 gain:0.21999999999999664 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ (39/4 → 625/64) ⇝ 10/1 | note:Eb4 gain:0.21999999999999664 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ (39/4 → 625/64) ⇝ 10/1 | note:G4 gain:0.21999999999999664 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 267/28 ⇜ (625/64 → 313/32) ⇝ 137/14 | note:70 gain:0.05814213562373084 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 267/28 ⇜ (625/64 → 313/32) ⇝ 137/14 | note:74 gain:0.05814213562373084 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 267/28 ⇜ (625/64 → 313/32) ⇝ 137/14 | note:75 gain:0.05814213562373084 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 267/28 ⇜ (625/64 → 313/32) ⇝ 137/14 | note:79 gain:0.05814213562373084 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 39/4 ⇜ (625/64 → 313/32) ⇝ 79/8 | note:G4 gain:0.5814213562373084 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 39/4 ⇜ (625/64 → 313/32) ⇝ 79/8 | note:D5 gain:0.5814213562373084 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 39/4 ⇜ (625/64 → 313/32) ⇝ 79/8 | note:F5 gain:0.5814213562373084 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 39/4 ⇜ (625/64 → 313/32) ⇝ 10/1 | note:Bb3 gain:0.2907106781186542 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 39/4 ⇜ (625/64 → 313/32) ⇝ 10/1 | note:D4 gain:0.2907106781186542 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 39/4 ⇜ (625/64 → 313/32) ⇝ 10/1 | note:Eb4 gain:0.2907106781186542 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 39/4 ⇜ (625/64 → 313/32) ⇝ 10/1 | note:G4 gain:0.2907106781186542 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 267/28 ⇜ (313/32 → 137/14) | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 267/28 ⇜ (313/32 → 137/14) | note:74 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 267/28 ⇜ (313/32 → 137/14) | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 267/28 ⇜ (313/32 → 137/14) | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 39/4 ⇜ (313/32 → 627/64) ⇝ 79/8 | note:G4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 39/4 ⇜ (313/32 → 627/64) ⇝ 79/8 | note:D5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 39/4 ⇜ (313/32 → 627/64) ⇝ 79/8 | note:F5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 39/4 ⇜ (313/32 → 627/64) ⇝ 10/1 | note:Bb3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 39/4 ⇜ (313/32 → 627/64) ⇝ 10/1 | note:D4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 39/4 ⇜ (313/32 → 627/64) ⇝ 10/1 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 39/4 ⇜ (313/32 → 627/64) ⇝ 10/1 | note:G4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 39/4 ⇜ (627/64 → 157/16) ⇝ 79/8 | note:G4 gain:0.5814213562373114 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 39/4 ⇜ (627/64 → 157/16) ⇝ 79/8 | note:D5 gain:0.5814213562373114 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 39/4 ⇜ (627/64 → 157/16) ⇝ 79/8 | note:F5 gain:0.5814213562373114 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 39/4 ⇜ (627/64 → 157/16) ⇝ 10/1 | note:Bb3 gain:0.2907106781186557 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 39/4 ⇜ (627/64 → 157/16) ⇝ 10/1 | note:D4 gain:0.2907106781186557 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 39/4 ⇜ (627/64 → 157/16) ⇝ 10/1 | note:Eb4 gain:0.2907106781186557 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 39/4 ⇜ (627/64 → 157/16) ⇝ 10/1 | note:G4 gain:0.2907106781186557 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 39/4 ⇜ (157/16 → 629/64) ⇝ 79/8 | note:G4 gain:0.44000000000000883 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 39/4 ⇜ (157/16 → 629/64) ⇝ 79/8 | note:D5 gain:0.44000000000000883 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 39/4 ⇜ (157/16 → 629/64) ⇝ 79/8 | note:F5 gain:0.44000000000000883 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 39/4 ⇜ (157/16 → 629/64) ⇝ 10/1 | note:Bb3 gain:0.22000000000000441 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 39/4 ⇜ (157/16 → 629/64) ⇝ 10/1 | note:D4 gain:0.22000000000000441 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 39/4 ⇜ (157/16 → 629/64) ⇝ 10/1 | note:Eb4 gain:0.22000000000000441 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 39/4 ⇜ (157/16 → 629/64) ⇝ 10/1 | note:G4 gain:0.22000000000000441 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 39/4 ⇜ (629/64 → 315/32) ⇝ 79/8 | note:G4 gain:0.2985786437626931 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 39/4 ⇜ (629/64 → 315/32) ⇝ 79/8 | note:D5 gain:0.2985786437626931 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 39/4 ⇜ (629/64 → 315/32) ⇝ 79/8 | note:F5 gain:0.2985786437626931 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 39/4 ⇜ (629/64 → 315/32) ⇝ 10/1 | note:Bb3 gain:0.14928932188134655 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 39/4 ⇜ (629/64 → 315/32) ⇝ 10/1 | note:D4 gain:0.14928932188134655 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 39/4 ⇜ (629/64 → 315/32) ⇝ 10/1 | note:Eb4 gain:0.14928932188134655 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 39/4 ⇜ (629/64 → 315/32) ⇝ 10/1 | note:G4 gain:0.14928932188134655 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 39/4 ⇜ (315/32 → 631/64) ⇝ 79/8 | note:G4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 39/4 ⇜ (315/32 → 631/64) ⇝ 79/8 | note:D5 gain:0.24 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 39/4 ⇜ (315/32 → 631/64) ⇝ 79/8 | note:F5 gain:0.24 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 39/4 ⇜ (315/32 → 631/64) ⇝ 10/1 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 39/4 ⇜ (315/32 → 631/64) ⇝ 10/1 | note:D4 gain:0.12 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 39/4 ⇜ (315/32 → 631/64) ⇝ 10/1 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 39/4 ⇜ (315/32 → 631/64) ⇝ 10/1 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 39/4 ⇜ (631/64 → 79/8) | note:G4 gain:0.2985786437626871 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 39/4 ⇜ (631/64 → 79/8) | note:D5 gain:0.2985786437626871 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 39/4 ⇜ (631/64 → 79/8) | note:F5 gain:0.2985786437626871 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 39/4 ⇜ (631/64 → 79/8) ⇝ 10/1 | note:Bb3 gain:0.14928932188134356 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 39/4 ⇜ (631/64 → 79/8) ⇝ 10/1 | note:D4 gain:0.14928932188134356 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 39/4 ⇜ (631/64 → 79/8) ⇝ 10/1 | note:Eb4 gain:0.14928932188134356 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 39/4 ⇜ (631/64 → 79/8) ⇝ 10/1 | note:G4 gain:0.14928932188134356 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 39/4 ⇜ (79/8 → 633/64) ⇝ 10/1 | note:Bb3 gain:0.2200000000000002 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 39/4 ⇜ (79/8 → 633/64) ⇝ 10/1 | note:D4 gain:0.2200000000000002 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 39/4 ⇜ (79/8 → 633/64) ⇝ 10/1 | note:Eb4 gain:0.2200000000000002 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 39/4 ⇜ (79/8 → 633/64) ⇝ 10/1 | note:G4 gain:0.2200000000000002 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 39/4 ⇜ (633/64 → 317/32) ⇝ 10/1 | note:Bb3 gain:0.2907106781186527 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 39/4 ⇜ (633/64 → 317/32) ⇝ 10/1 | note:D4 gain:0.2907106781186527 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 39/4 ⇜ (633/64 → 317/32) ⇝ 10/1 | note:Eb4 gain:0.2907106781186527 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 39/4 ⇜ (633/64 → 317/32) ⇝ 10/1 | note:G4 gain:0.2907106781186527 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 39/4 ⇜ (317/32 → 635/64) ⇝ 10/1 | note:Bb3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 39/4 ⇜ (317/32 → 635/64) ⇝ 10/1 | note:D4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 39/4 ⇜ (317/32 → 635/64) ⇝ 10/1 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 39/4 ⇜ (317/32 → 635/64) ⇝ 10/1 | note:G4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 39/4 ⇜ (635/64 → 159/16) ⇝ 10/1 | note:Bb3 gain:0.2907106781186572 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 39/4 ⇜ (635/64 → 159/16) ⇝ 10/1 | note:D4 gain:0.2907106781186572 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 39/4 ⇜ (635/64 → 159/16) ⇝ 10/1 | note:Eb4 gain:0.2907106781186572 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 39/4 ⇜ (635/64 → 159/16) ⇝ 10/1 | note:G4 gain:0.2907106781186572 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 39/4 ⇜ (159/16 → 637/64) ⇝ 10/1 | note:Bb3 gain:0.22000000000000092 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 39/4 ⇜ (159/16 → 637/64) ⇝ 10/1 | note:D4 gain:0.22000000000000092 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 39/4 ⇜ (159/16 → 637/64) ⇝ 10/1 | note:Eb4 gain:0.22000000000000092 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 39/4 ⇜ (159/16 → 637/64) ⇝ 10/1 | note:G4 gain:0.22000000000000092 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 39/4 ⇜ (637/64 → 319/32) ⇝ 10/1 | note:Bb3 gain:0.14928932188134808 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 39/4 ⇜ (637/64 → 319/32) ⇝ 10/1 | note:D4 gain:0.14928932188134808 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 39/4 ⇜ (637/64 → 319/32) ⇝ 10/1 | note:Eb4 gain:0.14928932188134808 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 39/4 ⇜ (637/64 → 319/32) ⇝ 10/1 | note:G4 gain:0.14928932188134808 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 39/4 ⇜ (319/32 → 639/64) ⇝ 10/1 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 39/4 ⇜ (319/32 → 639/64) ⇝ 10/1 | note:D4 gain:0.12 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 39/4 ⇜ (319/32 → 639/64) ⇝ 10/1 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 39/4 ⇜ (319/32 → 639/64) ⇝ 10/1 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 39/4 ⇜ (639/64 → 10/1) | note:Bb3 gain:0.14928932188134203 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 39/4 ⇜ (639/64 → 10/1) | note:D4 gain:0.14928932188134203 clip:1 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 39/4 ⇜ (639/64 → 10/1) | note:Eb4 gain:0.14928932188134203 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 39/4 ⇜ (639/64 → 10/1) | note:G4 gain:0.14928932188134203 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (10/1 → 641/64) ⇝ 41/4 | note:F2 gain:0.43999999999999617 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 10/1 ⇜ (641/64 → 321/32) ⇝ 41/4 | note:F2 gain:0.5814213562373104 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 10/1 ⇜ (321/32 → 643/64) ⇝ 41/4 | note:F2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ (281/28 → 643/64) ⇝ 72/7 | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ (281/28 → 643/64) ⇝ 72/7 | note:74 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ (281/28 → 643/64) ⇝ 72/7 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ (281/28 → 643/64) ⇝ 72/7 | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 10/1 ⇜ (643/64 → 161/16) ⇝ 41/4 | note:F2 gain:0.5814213562373095 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 281/28 ⇜ (643/64 → 161/16) ⇝ 72/7 | note:70 gain:0.05814213562373095 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 281/28 ⇜ (643/64 → 161/16) ⇝ 72/7 | note:74 gain:0.05814213562373095 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 281/28 ⇜ (643/64 → 161/16) ⇝ 72/7 | note:75 gain:0.05814213562373095 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 281/28 ⇜ (643/64 → 161/16) ⇝ 72/7 | note:79 gain:0.05814213562373095 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 10/1 ⇜ (161/16 → 645/64) ⇝ 41/4 | note:F2 gain:0.4400000000000061 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 281/28 ⇜ (161/16 → 645/64) ⇝ 72/7 | note:70 gain:0.044000000000000615 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 281/28 ⇜ (161/16 → 645/64) ⇝ 72/7 | note:74 gain:0.044000000000000615 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 281/28 ⇜ (161/16 → 645/64) ⇝ 72/7 | note:75 gain:0.044000000000000615 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 281/28 ⇜ (161/16 → 645/64) ⇝ 72/7 | note:79 gain:0.044000000000000615 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 10/1 ⇜ (645/64 → 323/32) ⇝ 41/4 | note:F2 gain:0.29857864376269116 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 281/28 ⇜ (645/64 → 323/32) ⇝ 72/7 | note:70 gain:0.029857864376269118 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 281/28 ⇜ (645/64 → 323/32) ⇝ 72/7 | note:74 gain:0.029857864376269118 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 281/28 ⇜ (645/64 → 323/32) ⇝ 72/7 | note:75 gain:0.029857864376269118 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 281/28 ⇜ (645/64 → 323/32) ⇝ 72/7 | note:79 gain:0.029857864376269118 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 10/1 ⇜ (323/32 → 647/64) ⇝ 41/4 | note:F2 gain:0.24 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 281/28 ⇜ (323/32 → 647/64) ⇝ 72/7 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 281/28 ⇜ (323/32 → 647/64) ⇝ 72/7 | note:74 gain:0.024 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 281/28 ⇜ (323/32 → 647/64) ⇝ 72/7 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 281/28 ⇜ (323/32 → 647/64) ⇝ 72/7 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 10/1 ⇜ (647/64 → 81/8) ⇝ 41/4 | note:F2 gain:0.2985786437626891 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 281/28 ⇜ (647/64 → 81/8) ⇝ 72/7 | note:70 gain:0.029857864376268913 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 281/28 ⇜ (647/64 → 81/8) ⇝ 72/7 | note:74 gain:0.029857864376268913 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 281/28 ⇜ (647/64 → 81/8) ⇝ 72/7 | note:75 gain:0.029857864376268913 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 281/28 ⇜ (647/64 → 81/8) ⇝ 72/7 | note:79 gain:0.029857864376268913 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 10/1 ⇜ (81/8 → 649/64) ⇝ 41/4 | note:F2 gain:0.4399999999999918 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 281/28 ⇜ (81/8 → 649/64) ⇝ 72/7 | note:70 gain:0.04399999999999918 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 281/28 ⇜ (81/8 → 649/64) ⇝ 72/7 | note:74 gain:0.04399999999999918 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 281/28 ⇜ (81/8 → 649/64) ⇝ 72/7 | note:75 gain:0.04399999999999918 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 281/28 ⇜ (81/8 → 649/64) ⇝ 72/7 | note:79 gain:0.04399999999999918 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ (81/8 → 649/64) ⇝ 41/4 | note:F4 gain:0.4399999999999918 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ (81/8 → 649/64) ⇝ 41/4 | note:C5 gain:0.4399999999999918 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ (81/8 → 649/64) ⇝ 41/4 | note:Eb5 gain:0.4399999999999918 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 10/1 ⇜ (649/64 → 325/32) ⇝ 41/4 | note:F2 gain:0.5814213562373073 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 281/28 ⇜ (649/64 → 325/32) ⇝ 72/7 | note:70 gain:0.05814213562373073 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 281/28 ⇜ (649/64 → 325/32) ⇝ 72/7 | note:74 gain:0.05814213562373073 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 281/28 ⇜ (649/64 → 325/32) ⇝ 72/7 | note:75 gain:0.05814213562373073 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 281/28 ⇜ (649/64 → 325/32) ⇝ 72/7 | note:79 gain:0.05814213562373073 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 81/8 ⇜ (649/64 → 325/32) ⇝ 41/4 | note:F4 gain:0.5814213562373073 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 81/8 ⇜ (649/64 → 325/32) ⇝ 41/4 | note:C5 gain:0.5814213562373073 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 81/8 ⇜ (649/64 → 325/32) ⇝ 41/4 | note:Eb5 gain:0.5814213562373073 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 10/1 ⇜ (325/32 → 651/64) ⇝ 41/4 | note:F2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 281/28 ⇜ (325/32 → 651/64) ⇝ 72/7 | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 281/28 ⇜ (325/32 → 651/64) ⇝ 72/7 | note:74 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 281/28 ⇜ (325/32 → 651/64) ⇝ 72/7 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 281/28 ⇜ (325/32 → 651/64) ⇝ 72/7 | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 81/8 ⇜ (325/32 → 651/64) ⇝ 41/4 | note:F4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 81/8 ⇜ (325/32 → 651/64) ⇝ 41/4 | note:C5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 81/8 ⇜ (325/32 → 651/64) ⇝ 41/4 | note:Eb5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 10/1 ⇜ (651/64 → 163/16) ⇝ 41/4 | note:F2 gain:0.5814213562373125 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 281/28 ⇜ (651/64 → 163/16) ⇝ 72/7 | note:70 gain:0.05814213562373125 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 281/28 ⇜ (651/64 → 163/16) ⇝ 72/7 | note:74 gain:0.05814213562373125 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 281/28 ⇜ (651/64 → 163/16) ⇝ 72/7 | note:75 gain:0.05814213562373125 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 281/28 ⇜ (651/64 → 163/16) ⇝ 72/7 | note:79 gain:0.05814213562373125 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 81/8 ⇜ (651/64 → 163/16) ⇝ 41/4 | note:F4 gain:0.5814213562373125 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 81/8 ⇜ (651/64 → 163/16) ⇝ 41/4 | note:C5 gain:0.5814213562373125 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 81/8 ⇜ (651/64 → 163/16) ⇝ 41/4 | note:Eb5 gain:0.5814213562373125 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 10/1 ⇜ (163/16 → 653/64) ⇝ 41/4 | note:F2 gain:0.4400000000000104 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 281/28 ⇜ (163/16 → 653/64) ⇝ 72/7 | note:70 gain:0.04400000000000104 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 281/28 ⇜ (163/16 → 653/64) ⇝ 72/7 | note:74 gain:0.04400000000000104 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 281/28 ⇜ (163/16 → 653/64) ⇝ 72/7 | note:75 gain:0.04400000000000104 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 281/28 ⇜ (163/16 → 653/64) ⇝ 72/7 | note:79 gain:0.04400000000000104 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 81/8 ⇜ (163/16 → 653/64) ⇝ 41/4 | note:F4 gain:0.4400000000000104 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 81/8 ⇜ (163/16 → 653/64) ⇝ 41/4 | note:C5 gain:0.4400000000000104 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 81/8 ⇜ (163/16 → 653/64) ⇝ 41/4 | note:Eb5 gain:0.4400000000000104 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 10/1 ⇜ (653/64 → 327/32) ⇝ 41/4 | note:F2 gain:0.29857864376268617 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 281/28 ⇜ (653/64 → 327/32) ⇝ 72/7 | note:70 gain:0.02985786437626862 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 281/28 ⇜ (653/64 → 327/32) ⇝ 72/7 | note:74 gain:0.02985786437626862 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 281/28 ⇜ (653/64 → 327/32) ⇝ 72/7 | note:75 gain:0.02985786437626862 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 281/28 ⇜ (653/64 → 327/32) ⇝ 72/7 | note:79 gain:0.02985786437626862 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 81/8 ⇜ (653/64 → 327/32) ⇝ 41/4 | note:F4 gain:0.29857864376268617 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 81/8 ⇜ (653/64 → 327/32) ⇝ 41/4 | note:C5 gain:0.29857864376268617 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 81/8 ⇜ (653/64 → 327/32) ⇝ 41/4 | note:Eb5 gain:0.29857864376268617 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 10/1 ⇜ (327/32 → 655/64) ⇝ 41/4 | note:F2 gain:0.24 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 281/28 ⇜ (327/32 → 655/64) ⇝ 72/7 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 281/28 ⇜ (327/32 → 655/64) ⇝ 72/7 | note:74 gain:0.024 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 281/28 ⇜ (327/32 → 655/64) ⇝ 72/7 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 281/28 ⇜ (327/32 → 655/64) ⇝ 72/7 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 81/8 ⇜ (327/32 → 655/64) ⇝ 41/4 | note:F4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 81/8 ⇜ (327/32 → 655/64) ⇝ 41/4 | note:C5 gain:0.24 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 81/8 ⇜ (327/32 → 655/64) ⇝ 41/4 | note:Eb5 gain:0.24 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 10/1 ⇜ (655/64 → 41/4) | note:F2 gain:0.298578643762686 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 281/28 ⇜ (655/64 → 41/4) ⇝ 72/7 | note:70 gain:0.0298578643762686 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 281/28 ⇜ (655/64 → 41/4) ⇝ 72/7 | note:74 gain:0.0298578643762686 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 281/28 ⇜ (655/64 → 41/4) ⇝ 72/7 | note:75 gain:0.0298578643762686 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 281/28 ⇜ (655/64 → 41/4) ⇝ 72/7 | note:79 gain:0.0298578643762686 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 81/8 ⇜ (655/64 → 41/4) | note:F4 gain:0.298578643762686 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 81/8 ⇜ (655/64 → 41/4) | note:C5 gain:0.298578643762686 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 81/8 ⇜ (655/64 → 41/4) | note:Eb5 gain:0.298578643762686 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 281/28 ⇜ (41/4 → 657/64) ⇝ 72/7 | note:70 gain:0.04399999999999875 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 281/28 ⇜ (41/4 → 657/64) ⇝ 72/7 | note:74 gain:0.04399999999999875 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 281/28 ⇜ (41/4 → 657/64) ⇝ 72/7 | note:75 gain:0.04399999999999875 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 281/28 ⇜ (41/4 → 657/64) ⇝ 72/7 | note:79 gain:0.04399999999999875 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 281/28 ⇜ (657/64 → 329/32) ⇝ 72/7 | note:70 gain:0.05814213562373123 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 281/28 ⇜ (657/64 → 329/32) ⇝ 72/7 | note:74 gain:0.05814213562373123 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 281/28 ⇜ (657/64 → 329/32) ⇝ 72/7 | note:75 gain:0.05814213562373123 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 281/28 ⇜ (657/64 → 329/32) ⇝ 72/7 | note:79 gain:0.05814213562373123 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 281/28 ⇜ (329/32 → 72/7) | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 281/28 ⇜ (329/32 → 72/7) | note:74 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 281/28 ⇜ (329/32 → 72/7) | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 281/28 ⇜ (329/32 → 72/7) | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ (21/2 → 673/64) ⇝ 85/8 | note:C5 gain:0.44000000000000156 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ (21/2 → 673/64) ⇝ 85/8 | note:G5 gain:0.44000000000000156 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ (21/2 → 673/64) ⇝ 85/8 | note:Bb5 gain:0.44000000000000156 clip:1 s:piano release:0.1 pan:0.6296296296296297 ]", - "[ (21/2 → 673/64) ⇝ 43/4 | note:Eb4 gain:0.22000000000000078 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ (21/2 → 673/64) ⇝ 43/4 | note:G4 gain:0.22000000000000078 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (21/2 → 673/64) ⇝ 43/4 | note:Ab4 gain:0.22000000000000078 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ (21/2 → 673/64) ⇝ 43/4 | note:C5 gain:0.22000000000000078 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ (21/2 → 673/64) ⇝ 43/4 | note:F2 gain:0.44000000000000156 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 21/2 ⇜ (673/64 → 337/32) ⇝ 85/8 | note:C5 gain:0.5814213562373063 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 21/2 ⇜ (673/64 → 337/32) ⇝ 85/8 | note:G5 gain:0.5814213562373063 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 21/2 ⇜ (673/64 → 337/32) ⇝ 85/8 | note:Bb5 gain:0.5814213562373063 clip:1 s:piano release:0.1 pan:0.6296296296296297 ]", - "[ 21/2 ⇜ (673/64 → 337/32) ⇝ 43/4 | note:Eb4 gain:0.29071067811865314 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 21/2 ⇜ (673/64 → 337/32) ⇝ 43/4 | note:G4 gain:0.29071067811865314 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 21/2 ⇜ (673/64 → 337/32) ⇝ 43/4 | note:Ab4 gain:0.29071067811865314 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 21/2 ⇜ (673/64 → 337/32) ⇝ 43/4 | note:C5 gain:0.29071067811865314 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 21/2 ⇜ (673/64 → 337/32) ⇝ 43/4 | note:F2 gain:0.5814213562373063 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 21/2 ⇜ (337/32 → 675/64) ⇝ 85/8 | note:C5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 21/2 ⇜ (337/32 → 675/64) ⇝ 85/8 | note:G5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 21/2 ⇜ (337/32 → 675/64) ⇝ 85/8 | note:Bb5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.6296296296296297 ]", - "[ 21/2 ⇜ (337/32 → 675/64) ⇝ 43/4 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 21/2 ⇜ (337/32 → 675/64) ⇝ 43/4 | note:G4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 21/2 ⇜ (337/32 → 675/64) ⇝ 43/4 | note:Ab4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 21/2 ⇜ (337/32 → 675/64) ⇝ 43/4 | note:C5 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 21/2 ⇜ (337/32 → 675/64) ⇝ 43/4 | note:F2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 21/2 ⇜ (675/64 → 169/16) ⇝ 85/8 | note:C5 gain:0.5814213562373055 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 21/2 ⇜ (675/64 → 169/16) ⇝ 85/8 | note:G5 gain:0.5814213562373055 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 21/2 ⇜ (675/64 → 169/16) ⇝ 85/8 | note:Bb5 gain:0.5814213562373055 clip:1 s:piano release:0.1 pan:0.6296296296296297 ]", - "[ 21/2 ⇜ (675/64 → 169/16) ⇝ 43/4 | note:Eb4 gain:0.29071067811865275 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 21/2 ⇜ (675/64 → 169/16) ⇝ 43/4 | note:G4 gain:0.29071067811865275 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 21/2 ⇜ (675/64 → 169/16) ⇝ 43/4 | note:Ab4 gain:0.29071067811865275 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 21/2 ⇜ (675/64 → 169/16) ⇝ 43/4 | note:C5 gain:0.29071067811865275 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 21/2 ⇜ (675/64 → 169/16) ⇝ 43/4 | note:F2 gain:0.5814213562373055 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 21/2 ⇜ (169/16 → 677/64) ⇝ 85/8 | note:C5 gain:0.4400000000000006 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 21/2 ⇜ (169/16 → 677/64) ⇝ 85/8 | note:G5 gain:0.4400000000000006 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 21/2 ⇜ (169/16 → 677/64) ⇝ 85/8 | note:Bb5 gain:0.4400000000000006 clip:1 s:piano release:0.1 pan:0.6296296296296297 ]", - "[ 21/2 ⇜ (169/16 → 677/64) ⇝ 43/4 | note:Eb4 gain:0.2200000000000003 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 21/2 ⇜ (169/16 → 677/64) ⇝ 43/4 | note:G4 gain:0.2200000000000003 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 21/2 ⇜ (169/16 → 677/64) ⇝ 43/4 | note:Ab4 gain:0.2200000000000003 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 21/2 ⇜ (169/16 → 677/64) ⇝ 43/4 | note:C5 gain:0.2200000000000003 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 21/2 ⇜ (169/16 → 677/64) ⇝ 43/4 | note:F2 gain:0.4400000000000006 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 21/2 ⇜ (677/64 → 339/32) ⇝ 85/8 | note:C5 gain:0.29857864376269533 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 21/2 ⇜ (677/64 → 339/32) ⇝ 85/8 | note:G5 gain:0.29857864376269533 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 21/2 ⇜ (677/64 → 339/32) ⇝ 85/8 | note:Bb5 gain:0.29857864376269533 clip:1 s:piano release:0.1 pan:0.6296296296296297 ]", - "[ 21/2 ⇜ (677/64 → 339/32) ⇝ 43/4 | note:Eb4 gain:0.14928932188134766 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 21/2 ⇜ (677/64 → 339/32) ⇝ 43/4 | note:G4 gain:0.14928932188134766 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 21/2 ⇜ (677/64 → 339/32) ⇝ 43/4 | note:Ab4 gain:0.14928932188134766 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 21/2 ⇜ (677/64 → 339/32) ⇝ 43/4 | note:C5 gain:0.14928932188134766 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 21/2 ⇜ (677/64 → 339/32) ⇝ 43/4 | note:F2 gain:0.29857864376269533 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 21/2 ⇜ (339/32 → 679/64) ⇝ 85/8 | note:C5 gain:0.24 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 21/2 ⇜ (339/32 → 679/64) ⇝ 85/8 | note:G5 gain:0.24 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 21/2 ⇜ (339/32 → 679/64) ⇝ 85/8 | note:Bb5 gain:0.24 clip:1 s:piano release:0.1 pan:0.6296296296296297 ]", - "[ 21/2 ⇜ (339/32 → 679/64) ⇝ 43/4 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 21/2 ⇜ (339/32 → 679/64) ⇝ 43/4 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 21/2 ⇜ (339/32 → 679/64) ⇝ 43/4 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 21/2 ⇜ (339/32 → 679/64) ⇝ 43/4 | note:C5 gain:0.12 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 21/2 ⇜ (339/32 → 679/64) ⇝ 43/4 | note:F2 gain:0.24 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 21/2 ⇜ (679/64 → 85/8) | note:C5 gain:0.29857864376269294 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 21/2 ⇜ (679/64 → 85/8) | note:G5 gain:0.29857864376269294 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 21/2 ⇜ (679/64 → 85/8) | note:Bb5 gain:0.29857864376269294 clip:1 s:piano release:0.1 pan:0.6296296296296297 ]", - "[ 21/2 ⇜ (679/64 → 85/8) ⇝ 43/4 | note:Eb4 gain:0.14928932188134647 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 21/2 ⇜ (679/64 → 85/8) ⇝ 43/4 | note:G4 gain:0.14928932188134647 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 21/2 ⇜ (679/64 → 85/8) ⇝ 43/4 | note:Ab4 gain:0.14928932188134647 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 21/2 ⇜ (679/64 → 85/8) ⇝ 43/4 | note:C5 gain:0.14928932188134647 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 21/2 ⇜ (679/64 → 85/8) ⇝ 43/4 | note:F2 gain:0.29857864376269294 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 21/2 ⇜ (85/8 → 681/64) ⇝ 43/4 | note:Eb4 gain:0.2199999999999986 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 21/2 ⇜ (85/8 → 681/64) ⇝ 43/4 | note:G4 gain:0.2199999999999986 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 21/2 ⇜ (85/8 → 681/64) ⇝ 43/4 | note:Ab4 gain:0.2199999999999986 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 21/2 ⇜ (85/8 → 681/64) ⇝ 43/4 | note:C5 gain:0.2199999999999986 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 21/2 ⇜ (85/8 → 681/64) ⇝ 43/4 | note:F2 gain:0.4399999999999972 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 21/2 ⇜ (681/64 → 341/32) ⇝ 43/4 | note:Eb4 gain:0.29071067811865164 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 21/2 ⇜ (681/64 → 341/32) ⇝ 43/4 | note:G4 gain:0.29071067811865164 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 21/2 ⇜ (681/64 → 341/32) ⇝ 43/4 | note:Ab4 gain:0.29071067811865164 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 21/2 ⇜ (681/64 → 341/32) ⇝ 43/4 | note:C5 gain:0.29071067811865164 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 21/2 ⇜ (681/64 → 341/32) ⇝ 43/4 | note:F2 gain:0.5814213562373033 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 21/2 ⇜ (341/32 → 683/64) ⇝ 43/4 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 21/2 ⇜ (341/32 → 683/64) ⇝ 43/4 | note:G4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 21/2 ⇜ (341/32 → 683/64) ⇝ 43/4 | note:Ab4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 21/2 ⇜ (341/32 → 683/64) ⇝ 43/4 | note:C5 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 21/2 ⇜ (341/32 → 683/64) ⇝ 43/4 | note:F2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 21/2 ⇜ (683/64 → 171/16) ⇝ 43/4 | note:Eb4 gain:0.2907106781186543 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 21/2 ⇜ (683/64 → 171/16) ⇝ 43/4 | note:G4 gain:0.2907106781186543 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 21/2 ⇜ (683/64 → 171/16) ⇝ 43/4 | note:Ab4 gain:0.2907106781186543 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 21/2 ⇜ (683/64 → 171/16) ⇝ 43/4 | note:C5 gain:0.2907106781186543 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 21/2 ⇜ (683/64 → 171/16) ⇝ 43/4 | note:F2 gain:0.5814213562373086 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 21/2 ⇜ (171/16 → 685/64) ⇝ 43/4 | note:Eb4 gain:0.22000000000000242 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 21/2 ⇜ (171/16 → 685/64) ⇝ 43/4 | note:G4 gain:0.22000000000000242 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 21/2 ⇜ (171/16 → 685/64) ⇝ 43/4 | note:Ab4 gain:0.22000000000000242 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 21/2 ⇜ (171/16 → 685/64) ⇝ 43/4 | note:C5 gain:0.22000000000000242 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 21/2 ⇜ (171/16 → 685/64) ⇝ 43/4 | note:F2 gain:0.44000000000000483 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 21/2 ⇜ (685/64 → 343/32) ⇝ 43/4 | note:Eb4 gain:0.1492893218813492 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 21/2 ⇜ (685/64 → 343/32) ⇝ 43/4 | note:G4 gain:0.1492893218813492 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 21/2 ⇜ (685/64 → 343/32) ⇝ 43/4 | note:Ab4 gain:0.1492893218813492 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 21/2 ⇜ (685/64 → 343/32) ⇝ 43/4 | note:C5 gain:0.1492893218813492 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 21/2 ⇜ (685/64 → 343/32) ⇝ 43/4 | note:F2 gain:0.2985786437626984 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 21/2 ⇜ (343/32 → 687/64) ⇝ 43/4 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 21/2 ⇜ (343/32 → 687/64) ⇝ 43/4 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 21/2 ⇜ (343/32 → 687/64) ⇝ 43/4 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 21/2 ⇜ (343/32 → 687/64) ⇝ 43/4 | note:C5 gain:0.12 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 21/2 ⇜ (343/32 → 687/64) ⇝ 43/4 | note:F2 gain:0.24 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 21/2 ⇜ (687/64 → 43/4) | note:Eb4 gain:0.14928932188134497 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 21/2 ⇜ (687/64 → 43/4) | note:G4 gain:0.14928932188134497 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 21/2 ⇜ (687/64 → 43/4) | note:Ab4 gain:0.14928932188134497 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 21/2 ⇜ (687/64 → 43/4) | note:C5 gain:0.14928932188134497 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 21/2 ⇜ (687/64 → 43/4) | note:F2 gain:0.29857864376268994 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ (43/4 → 689/64) ⇝ 87/8 | note:F4 gain:0.43999999999999295 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ (43/4 → 689/64) ⇝ 87/8 | note:C5 gain:0.43999999999999295 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ (43/4 → 689/64) ⇝ 87/8 | note:Eb5 gain:0.43999999999999295 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 43/4 ⇜ (689/64 → 345/32) ⇝ 87/8 | note:F4 gain:0.5814213562373002 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 43/4 ⇜ (689/64 → 345/32) ⇝ 87/8 | note:C5 gain:0.5814213562373002 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 43/4 ⇜ (689/64 → 345/32) ⇝ 87/8 | note:Eb5 gain:0.5814213562373002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 43/4 ⇜ (345/32 → 691/64) ⇝ 87/8 | note:F4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 43/4 ⇜ (345/32 → 691/64) ⇝ 87/8 | note:C5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 43/4 ⇜ (345/32 → 691/64) ⇝ 87/8 | note:Eb5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ (151/14 → 691/64) ⇝ 309/28 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ (151/14 → 691/64) ⇝ 309/28 | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ (151/14 → 691/64) ⇝ 309/28 | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ (151/14 → 691/64) ⇝ 309/28 | note:84 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 43/4 ⇜ (691/64 → 173/16) ⇝ 87/8 | note:F4 gain:0.5814213562373116 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 43/4 ⇜ (691/64 → 173/16) ⇝ 87/8 | note:C5 gain:0.5814213562373116 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 43/4 ⇜ (691/64 → 173/16) ⇝ 87/8 | note:Eb5 gain:0.5814213562373116 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 151/14 ⇜ (691/64 → 173/16) ⇝ 309/28 | note:75 gain:0.05814213562373116 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 151/14 ⇜ (691/64 → 173/16) ⇝ 309/28 | note:79 gain:0.05814213562373116 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 151/14 ⇜ (691/64 → 173/16) ⇝ 309/28 | note:80 gain:0.05814213562373116 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 151/14 ⇜ (691/64 → 173/16) ⇝ 309/28 | note:84 gain:0.05814213562373116 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 43/4 ⇜ (173/16 → 693/64) ⇝ 87/8 | note:F4 gain:0.4400000000000092 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 43/4 ⇜ (173/16 → 693/64) ⇝ 87/8 | note:C5 gain:0.4400000000000092 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 43/4 ⇜ (173/16 → 693/64) ⇝ 87/8 | note:Eb5 gain:0.4400000000000092 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 151/14 ⇜ (173/16 → 693/64) ⇝ 309/28 | note:75 gain:0.04400000000000093 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 151/14 ⇜ (173/16 → 693/64) ⇝ 309/28 | note:79 gain:0.04400000000000093 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 151/14 ⇜ (173/16 → 693/64) ⇝ 309/28 | note:80 gain:0.04400000000000093 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 151/14 ⇜ (173/16 → 693/64) ⇝ 309/28 | note:84 gain:0.04400000000000093 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 43/4 ⇜ (693/64 → 347/32) ⇝ 87/8 | note:F4 gain:0.2985786437627014 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 43/4 ⇜ (693/64 → 347/32) ⇝ 87/8 | note:C5 gain:0.2985786437627014 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 43/4 ⇜ (693/64 → 347/32) ⇝ 87/8 | note:Eb5 gain:0.2985786437627014 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 151/14 ⇜ (693/64 → 347/32) ⇝ 309/28 | note:75 gain:0.029857864376270138 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 151/14 ⇜ (693/64 → 347/32) ⇝ 309/28 | note:79 gain:0.029857864376270138 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 151/14 ⇜ (693/64 → 347/32) ⇝ 309/28 | note:80 gain:0.029857864376270138 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 151/14 ⇜ (693/64 → 347/32) ⇝ 309/28 | note:84 gain:0.029857864376270138 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 43/4 ⇜ (347/32 → 695/64) ⇝ 87/8 | note:F4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 43/4 ⇜ (347/32 → 695/64) ⇝ 87/8 | note:C5 gain:0.24 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 43/4 ⇜ (347/32 → 695/64) ⇝ 87/8 | note:Eb5 gain:0.24 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 151/14 ⇜ (347/32 → 695/64) ⇝ 309/28 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 151/14 ⇜ (347/32 → 695/64) ⇝ 309/28 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 151/14 ⇜ (347/32 → 695/64) ⇝ 309/28 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 151/14 ⇜ (347/32 → 695/64) ⇝ 309/28 | note:84 gain:0.024 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 43/4 ⇜ (695/64 → 87/8) | note:F4 gain:0.2985786437626869 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 43/4 ⇜ (695/64 → 87/8) | note:C5 gain:0.2985786437626869 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 43/4 ⇜ (695/64 → 87/8) | note:Eb5 gain:0.2985786437626869 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 151/14 ⇜ (695/64 → 87/8) ⇝ 309/28 | note:75 gain:0.02985786437626869 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 151/14 ⇜ (695/64 → 87/8) ⇝ 309/28 | note:79 gain:0.02985786437626869 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 151/14 ⇜ (695/64 → 87/8) ⇝ 309/28 | note:80 gain:0.02985786437626869 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 151/14 ⇜ (695/64 → 87/8) ⇝ 309/28 | note:84 gain:0.02985786437626869 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 151/14 ⇜ (87/8 → 697/64) ⇝ 309/28 | note:75 gain:0.04399999999999887 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 151/14 ⇜ (87/8 → 697/64) ⇝ 309/28 | note:79 gain:0.04399999999999887 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 151/14 ⇜ (87/8 → 697/64) ⇝ 309/28 | note:80 gain:0.04399999999999887 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 151/14 ⇜ (87/8 → 697/64) ⇝ 309/28 | note:84 gain:0.04399999999999887 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 151/14 ⇜ (697/64 → 349/32) ⇝ 309/28 | note:75 gain:0.05814213562373132 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 151/14 ⇜ (697/64 → 349/32) ⇝ 309/28 | note:79 gain:0.05814213562373132 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 151/14 ⇜ (697/64 → 349/32) ⇝ 309/28 | note:80 gain:0.05814213562373132 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 151/14 ⇜ (697/64 → 349/32) ⇝ 309/28 | note:84 gain:0.05814213562373132 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 151/14 ⇜ (349/32 → 699/64) ⇝ 309/28 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 151/14 ⇜ (349/32 → 699/64) ⇝ 309/28 | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 151/14 ⇜ (349/32 → 699/64) ⇝ 309/28 | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 151/14 ⇜ (349/32 → 699/64) ⇝ 309/28 | note:84 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 151/14 ⇜ (699/64 → 175/16) ⇝ 309/28 | note:75 gain:0.05814213562373147 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 151/14 ⇜ (699/64 → 175/16) ⇝ 309/28 | note:79 gain:0.05814213562373147 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 151/14 ⇜ (699/64 → 175/16) ⇝ 309/28 | note:80 gain:0.05814213562373147 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 151/14 ⇜ (699/64 → 175/16) ⇝ 309/28 | note:84 gain:0.05814213562373147 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 151/14 ⇜ (175/16 → 701/64) ⇝ 309/28 | note:75 gain:0.04400000000000136 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 151/14 ⇜ (175/16 → 701/64) ⇝ 309/28 | note:79 gain:0.04400000000000136 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 151/14 ⇜ (175/16 → 701/64) ⇝ 309/28 | note:80 gain:0.04400000000000136 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 151/14 ⇜ (175/16 → 701/64) ⇝ 309/28 | note:84 gain:0.04400000000000136 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 151/14 ⇜ (701/64 → 351/32) ⇝ 309/28 | note:75 gain:0.02985786437626884 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 151/14 ⇜ (701/64 → 351/32) ⇝ 309/28 | note:79 gain:0.02985786437626884 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 151/14 ⇜ (701/64 → 351/32) ⇝ 309/28 | note:80 gain:0.02985786437626884 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 151/14 ⇜ (701/64 → 351/32) ⇝ 309/28 | note:84 gain:0.02985786437626884 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 151/14 ⇜ (351/32 → 703/64) ⇝ 309/28 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 151/14 ⇜ (351/32 → 703/64) ⇝ 309/28 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 151/14 ⇜ (351/32 → 703/64) ⇝ 309/28 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 151/14 ⇜ (351/32 → 703/64) ⇝ 309/28 | note:84 gain:0.024 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 151/14 ⇜ (703/64 → 11/1) ⇝ 309/28 | note:75 gain:0.02985786437626838 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 151/14 ⇜ (703/64 → 11/1) ⇝ 309/28 | note:79 gain:0.02985786437626838 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 151/14 ⇜ (703/64 → 11/1) ⇝ 309/28 | note:80 gain:0.02985786437626838 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 151/14 ⇜ (703/64 → 11/1) ⇝ 309/28 | note:84 gain:0.02985786437626838 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 151/14 ⇜ (11/1 → 705/64) ⇝ 309/28 | note:75 gain:0.043999999999998436 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 151/14 ⇜ (11/1 → 705/64) ⇝ 309/28 | note:79 gain:0.043999999999998436 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 151/14 ⇜ (11/1 → 705/64) ⇝ 309/28 | note:80 gain:0.043999999999998436 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 151/14 ⇜ (11/1 → 705/64) ⇝ 309/28 | note:84 gain:0.043999999999998436 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ (11/1 → 705/64) ⇝ 45/4 | note:F2 gain:0.43999999999998435 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 151/14 ⇜ (705/64 → 353/32) ⇝ 309/28 | note:75 gain:0.05814213562373102 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 151/14 ⇜ (705/64 → 353/32) ⇝ 309/28 | note:79 gain:0.05814213562373102 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 151/14 ⇜ (705/64 → 353/32) ⇝ 309/28 | note:80 gain:0.05814213562373102 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 151/14 ⇜ (705/64 → 353/32) ⇝ 309/28 | note:84 gain:0.05814213562373102 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 11/1 ⇜ (705/64 → 353/32) ⇝ 45/4 | note:F2 gain:0.5814213562373102 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 151/14 ⇜ (353/32 → 309/28) | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 151/14 ⇜ (353/32 → 309/28) | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 151/14 ⇜ (353/32 → 309/28) | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 151/14 ⇜ (353/32 → 309/28) | note:84 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 11/1 ⇜ (353/32 → 707/64) ⇝ 45/4 | note:F2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 11/1 ⇜ (707/64 → 177/16) ⇝ 45/4 | note:F2 gain:0.5814213562373177 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 11/1 ⇜ (177/16 → 709/64) ⇝ 45/4 | note:F2 gain:0.43999999999999506 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 11/1 ⇜ (709/64 → 355/32) ⇝ 45/4 | note:F2 gain:0.29857864376269144 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 11/1 ⇜ (355/32 → 711/64) ⇝ 45/4 | note:F2 gain:0.24 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 11/1 ⇜ (711/64 → 89/8) ⇝ 45/4 | note:F2 gain:0.2985786437626808 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 11/1 ⇜ (89/8 → 713/64) ⇝ 45/4 | note:F2 gain:0.4400000000000027 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ (89/8 → 713/64) ⇝ 45/4 | note:F4 gain:0.4400000000000027 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ (89/8 → 713/64) ⇝ 45/4 | note:C5 gain:0.4400000000000027 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ (89/8 → 713/64) ⇝ 45/4 | note:Eb5 gain:0.4400000000000027 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 11/1 ⇜ (713/64 → 357/32) ⇝ 45/4 | note:F2 gain:0.5814213562373071 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 89/8 ⇜ (713/64 → 357/32) ⇝ 45/4 | note:F4 gain:0.5814213562373071 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 89/8 ⇜ (713/64 → 357/32) ⇝ 45/4 | note:C5 gain:0.5814213562373071 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 89/8 ⇜ (713/64 → 357/32) ⇝ 45/4 | note:Eb5 gain:0.5814213562373071 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 11/1 ⇜ (357/32 → 715/64) ⇝ 45/4 | note:F2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 89/8 ⇜ (357/32 → 715/64) ⇝ 45/4 | note:F4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 89/8 ⇜ (357/32 → 715/64) ⇝ 45/4 | note:C5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 89/8 ⇜ (357/32 → 715/64) ⇝ 45/4 | note:Eb5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 11/1 ⇜ (715/64 → 179/16) ⇝ 45/4 | note:F2 gain:0.5814213562373046 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 89/8 ⇜ (715/64 → 179/16) ⇝ 45/4 | note:F4 gain:0.5814213562373046 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 89/8 ⇜ (715/64 → 179/16) ⇝ 45/4 | note:C5 gain:0.5814213562373046 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 89/8 ⇜ (715/64 → 179/16) ⇝ 45/4 | note:Eb5 gain:0.5814213562373046 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 11/1 ⇜ (179/16 → 717/64) ⇝ 45/4 | note:F2 gain:0.43999999999999945 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 89/8 ⇜ (179/16 → 717/64) ⇝ 45/4 | note:F4 gain:0.43999999999999945 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 89/8 ⇜ (179/16 → 717/64) ⇝ 45/4 | note:C5 gain:0.43999999999999945 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 89/8 ⇜ (179/16 → 717/64) ⇝ 45/4 | note:Eb5 gain:0.43999999999999945 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 11/1 ⇜ (717/64 → 359/32) ⇝ 45/4 | note:F2 gain:0.29857864376269444 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 89/8 ⇜ (717/64 → 359/32) ⇝ 45/4 | note:F4 gain:0.29857864376269444 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 89/8 ⇜ (717/64 → 359/32) ⇝ 45/4 | note:C5 gain:0.29857864376269444 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 89/8 ⇜ (717/64 → 359/32) ⇝ 45/4 | note:Eb5 gain:0.29857864376269444 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 11/1 ⇜ (359/32 → 719/64) ⇝ 45/4 | note:F2 gain:0.24 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 89/8 ⇜ (359/32 → 719/64) ⇝ 45/4 | note:F4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 89/8 ⇜ (359/32 → 719/64) ⇝ 45/4 | note:C5 gain:0.24 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 89/8 ⇜ (359/32 → 719/64) ⇝ 45/4 | note:Eb5 gain:0.24 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 11/1 ⇜ (719/64 → 45/4) | note:F2 gain:0.2985786437626938 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 89/8 ⇜ (719/64 → 45/4) | note:F4 gain:0.2985786437626938 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 89/8 ⇜ (719/64 → 45/4) | note:C5 gain:0.2985786437626938 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 89/8 ⇜ (719/64 → 45/4) | note:Eb5 gain:0.2985786437626938 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ (45/4 → 721/64) ⇝ 23/2 | note:Eb4 gain:0.21999999999999922 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ (45/4 → 721/64) ⇝ 23/2 | note:G4 gain:0.21999999999999922 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (45/4 → 721/64) ⇝ 23/2 | note:Ab4 gain:0.21999999999999922 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ (45/4 → 721/64) ⇝ 23/2 | note:C5 gain:0.21999999999999922 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 45/4 ⇜ (721/64 → 361/32) ⇝ 23/2 | note:Eb4 gain:0.290710678118652 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 45/4 ⇜ (721/64 → 361/32) ⇝ 23/2 | note:G4 gain:0.290710678118652 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 45/4 ⇜ (721/64 → 361/32) ⇝ 23/2 | note:Ab4 gain:0.290710678118652 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 45/4 ⇜ (721/64 → 361/32) ⇝ 23/2 | note:C5 gain:0.290710678118652 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 45/4 ⇜ (361/32 → 723/64) ⇝ 23/2 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 45/4 ⇜ (361/32 → 723/64) ⇝ 23/2 | note:G4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 45/4 ⇜ (361/32 → 723/64) ⇝ 23/2 | note:Ab4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 45/4 ⇜ (361/32 → 723/64) ⇝ 23/2 | note:C5 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 45/4 ⇜ (723/64 → 181/16) ⇝ 23/2 | note:Eb4 gain:0.29071067811865386 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 45/4 ⇜ (723/64 → 181/16) ⇝ 23/2 | note:G4 gain:0.29071067811865386 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 45/4 ⇜ (723/64 → 181/16) ⇝ 23/2 | note:Ab4 gain:0.29071067811865386 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 45/4 ⇜ (723/64 → 181/16) ⇝ 23/2 | note:C5 gain:0.29071067811865386 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 45/4 ⇜ (181/16 → 725/64) ⇝ 23/2 | note:Eb4 gain:0.2200000000000019 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 45/4 ⇜ (181/16 → 725/64) ⇝ 23/2 | note:G4 gain:0.2200000000000019 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 45/4 ⇜ (181/16 → 725/64) ⇝ 23/2 | note:Ab4 gain:0.2200000000000019 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 45/4 ⇜ (181/16 → 725/64) ⇝ 23/2 | note:C5 gain:0.2200000000000019 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 45/4 ⇜ (725/64 → 363/32) ⇝ 23/2 | note:Eb4 gain:0.14928932188134877 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 45/4 ⇜ (725/64 → 363/32) ⇝ 23/2 | note:G4 gain:0.14928932188134877 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 45/4 ⇜ (725/64 → 363/32) ⇝ 23/2 | note:Ab4 gain:0.14928932188134877 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 45/4 ⇜ (725/64 → 363/32) ⇝ 23/2 | note:C5 gain:0.14928932188134877 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 45/4 ⇜ (363/32 → 727/64) ⇝ 23/2 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 45/4 ⇜ (363/32 → 727/64) ⇝ 23/2 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 45/4 ⇜ (363/32 → 727/64) ⇝ 23/2 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 45/4 ⇜ (363/32 → 727/64) ⇝ 23/2 | note:C5 gain:0.12 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 45/4 ⇜ (727/64 → 91/8) ⇝ 23/2 | note:Eb4 gain:0.14928932188134536 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 45/4 ⇜ (727/64 → 91/8) ⇝ 23/2 | note:G4 gain:0.14928932188134536 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 45/4 ⇜ (727/64 → 91/8) ⇝ 23/2 | note:Ab4 gain:0.14928932188134536 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 45/4 ⇜ (727/64 → 91/8) ⇝ 23/2 | note:C5 gain:0.14928932188134536 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 45/4 ⇜ (91/8 → 729/64) ⇝ 23/2 | note:Eb4 gain:0.21999999999999706 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 45/4 ⇜ (91/8 → 729/64) ⇝ 23/2 | note:G4 gain:0.21999999999999706 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 45/4 ⇜ (91/8 → 729/64) ⇝ 23/2 | note:Ab4 gain:0.21999999999999706 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 45/4 ⇜ (91/8 → 729/64) ⇝ 23/2 | note:C5 gain:0.21999999999999706 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 45/4 ⇜ (729/64 → 365/32) ⇝ 23/2 | note:Eb4 gain:0.2907106781186505 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 45/4 ⇜ (729/64 → 365/32) ⇝ 23/2 | note:G4 gain:0.2907106781186505 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 45/4 ⇜ (729/64 → 365/32) ⇝ 23/2 | note:Ab4 gain:0.2907106781186505 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 45/4 ⇜ (729/64 → 365/32) ⇝ 23/2 | note:C5 gain:0.2907106781186505 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 45/4 ⇜ (365/32 → 731/64) ⇝ 23/2 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 45/4 ⇜ (365/32 → 731/64) ⇝ 23/2 | note:G4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 45/4 ⇜ (365/32 → 731/64) ⇝ 23/2 | note:Ab4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 45/4 ⇜ (365/32 → 731/64) ⇝ 23/2 | note:C5 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 45/4 ⇜ (731/64 → 183/16) ⇝ 23/2 | note:Eb4 gain:0.2907106781186554 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 45/4 ⇜ (731/64 → 183/16) ⇝ 23/2 | note:G4 gain:0.2907106781186554 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 45/4 ⇜ (731/64 → 183/16) ⇝ 23/2 | note:Ab4 gain:0.2907106781186554 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 45/4 ⇜ (731/64 → 183/16) ⇝ 23/2 | note:C5 gain:0.2907106781186554 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 45/4 ⇜ (183/16 → 733/64) ⇝ 23/2 | note:Eb4 gain:0.22000000000000403 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 45/4 ⇜ (183/16 → 733/64) ⇝ 23/2 | note:G4 gain:0.22000000000000403 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 45/4 ⇜ (183/16 → 733/64) ⇝ 23/2 | note:Ab4 gain:0.22000000000000403 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 45/4 ⇜ (183/16 → 733/64) ⇝ 23/2 | note:C5 gain:0.22000000000000403 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 45/4 ⇜ (733/64 → 367/32) ⇝ 23/2 | note:Eb4 gain:0.1492893218813503 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 45/4 ⇜ (733/64 → 367/32) ⇝ 23/2 | note:G4 gain:0.1492893218813503 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 45/4 ⇜ (733/64 → 367/32) ⇝ 23/2 | note:Ab4 gain:0.1492893218813503 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 45/4 ⇜ (733/64 → 367/32) ⇝ 23/2 | note:C5 gain:0.1492893218813503 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 45/4 ⇜ (367/32 → 735/64) ⇝ 23/2 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 45/4 ⇜ (367/32 → 735/64) ⇝ 23/2 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 45/4 ⇜ (367/32 → 735/64) ⇝ 23/2 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 45/4 ⇜ (367/32 → 735/64) ⇝ 23/2 | note:C5 gain:0.12 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 45/4 ⇜ (735/64 → 23/2) | note:Eb4 gain:0.14928932188134386 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 45/4 ⇜ (735/64 → 23/2) | note:G4 gain:0.14928932188134386 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 45/4 ⇜ (735/64 → 23/2) | note:Ab4 gain:0.14928932188134386 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 45/4 ⇜ (735/64 → 23/2) | note:C5 gain:0.14928932188134386 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ (23/2 → 737/64) ⇝ 93/8 | note:C5 gain:0.43999999999998984 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ (23/2 → 737/64) ⇝ 93/8 | note:G5 gain:0.43999999999998984 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ (23/2 → 737/64) ⇝ 93/8 | note:Bb5 gain:0.43999999999998984 clip:1 s:piano release:0.1 pan:0.6296296296296297 ]", - "[ (23/2 → 737/64) ⇝ 47/4 | note:F2 gain:0.43999999999998984 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 23/2 ⇜ (737/64 → 369/32) ⇝ 93/8 | note:C5 gain:0.581421356237314 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 23/2 ⇜ (737/64 → 369/32) ⇝ 93/8 | note:G5 gain:0.581421356237314 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 23/2 ⇜ (737/64 → 369/32) ⇝ 93/8 | note:Bb5 gain:0.581421356237314 clip:1 s:piano release:0.1 pan:0.6296296296296297 ]", - "[ 23/2 ⇜ (737/64 → 369/32) ⇝ 47/4 | note:F2 gain:0.581421356237314 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 23/2 ⇜ (369/32 → 739/64) ⇝ 93/8 | note:C5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 23/2 ⇜ (369/32 → 739/64) ⇝ 93/8 | note:G5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 23/2 ⇜ (369/32 → 739/64) ⇝ 93/8 | note:Bb5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.6296296296296297 ]", - "[ 23/2 ⇜ (369/32 → 739/64) ⇝ 47/4 | note:F2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ (323/28 → 739/64) ⇝ 165/14 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ (323/28 → 739/64) ⇝ 165/14 | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ (323/28 → 739/64) ⇝ 165/14 | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ (323/28 → 739/64) ⇝ 165/14 | note:84 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 23/2 ⇜ (739/64 → 185/16) ⇝ 93/8 | note:C5 gain:0.581421356237314 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 23/2 ⇜ (739/64 → 185/16) ⇝ 93/8 | note:G5 gain:0.581421356237314 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 23/2 ⇜ (739/64 → 185/16) ⇝ 93/8 | note:Bb5 gain:0.581421356237314 clip:1 s:piano release:0.1 pan:0.6296296296296297 ]", - "[ 23/2 ⇜ (739/64 → 185/16) ⇝ 47/4 | note:F2 gain:0.581421356237314 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 323/28 ⇜ (739/64 → 185/16) ⇝ 165/14 | note:75 gain:0.0581421356237314 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 323/28 ⇜ (739/64 → 185/16) ⇝ 165/14 | note:79 gain:0.0581421356237314 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 323/28 ⇜ (739/64 → 185/16) ⇝ 165/14 | note:80 gain:0.0581421356237314 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 323/28 ⇜ (739/64 → 185/16) ⇝ 165/14 | note:84 gain:0.0581421356237314 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 23/2 ⇜ (185/16 → 741/64) ⇝ 93/8 | note:C5 gain:0.4400000000000123 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 23/2 ⇜ (185/16 → 741/64) ⇝ 93/8 | note:G5 gain:0.4400000000000123 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 23/2 ⇜ (185/16 → 741/64) ⇝ 93/8 | note:Bb5 gain:0.4400000000000123 clip:1 s:piano release:0.1 pan:0.6296296296296297 ]", - "[ 23/2 ⇜ (185/16 → 741/64) ⇝ 47/4 | note:F2 gain:0.4400000000000123 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 323/28 ⇜ (185/16 → 741/64) ⇝ 165/14 | note:75 gain:0.04400000000000123 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 323/28 ⇜ (185/16 → 741/64) ⇝ 165/14 | note:79 gain:0.04400000000000123 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 323/28 ⇜ (185/16 → 741/64) ⇝ 165/14 | note:80 gain:0.04400000000000123 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 323/28 ⇜ (185/16 → 741/64) ⇝ 165/14 | note:84 gain:0.04400000000000123 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 23/2 ⇜ (741/64 → 371/32) ⇝ 93/8 | note:C5 gain:0.29857864376268756 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 23/2 ⇜ (741/64 → 371/32) ⇝ 93/8 | note:G5 gain:0.29857864376268756 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 23/2 ⇜ (741/64 → 371/32) ⇝ 93/8 | note:Bb5 gain:0.29857864376268756 clip:1 s:piano release:0.1 pan:0.6296296296296297 ]", - "[ 23/2 ⇜ (741/64 → 371/32) ⇝ 47/4 | note:F2 gain:0.29857864376268756 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 323/28 ⇜ (741/64 → 371/32) ⇝ 165/14 | note:75 gain:0.029857864376268757 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 323/28 ⇜ (741/64 → 371/32) ⇝ 165/14 | note:79 gain:0.029857864376268757 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 323/28 ⇜ (741/64 → 371/32) ⇝ 165/14 | note:80 gain:0.029857864376268757 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 323/28 ⇜ (741/64 → 371/32) ⇝ 165/14 | note:84 gain:0.029857864376268757 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 23/2 ⇜ (371/32 → 743/64) ⇝ 93/8 | note:C5 gain:0.24 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 23/2 ⇜ (371/32 → 743/64) ⇝ 93/8 | note:G5 gain:0.24 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 23/2 ⇜ (371/32 → 743/64) ⇝ 93/8 | note:Bb5 gain:0.24 clip:1 s:piano release:0.1 pan:0.6296296296296297 ]", - "[ 23/2 ⇜ (371/32 → 743/64) ⇝ 47/4 | note:F2 gain:0.24 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 323/28 ⇜ (371/32 → 743/64) ⇝ 165/14 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 323/28 ⇜ (371/32 → 743/64) ⇝ 165/14 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 323/28 ⇜ (371/32 → 743/64) ⇝ 165/14 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 323/28 ⇜ (371/32 → 743/64) ⇝ 165/14 | note:84 gain:0.024 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 23/2 ⇜ (743/64 → 93/8) | note:C5 gain:0.29857864376268467 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 23/2 ⇜ (743/64 → 93/8) | note:G5 gain:0.29857864376268467 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 23/2 ⇜ (743/64 → 93/8) | note:Bb5 gain:0.29857864376268467 clip:1 s:piano release:0.1 pan:0.6296296296296297 ]", - "[ 23/2 ⇜ (743/64 → 93/8) ⇝ 47/4 | note:F2 gain:0.29857864376268467 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 323/28 ⇜ (743/64 → 93/8) ⇝ 165/14 | note:75 gain:0.02985786437626847 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 323/28 ⇜ (743/64 → 93/8) ⇝ 165/14 | note:79 gain:0.02985786437626847 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 323/28 ⇜ (743/64 → 93/8) ⇝ 165/14 | note:80 gain:0.02985786437626847 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 323/28 ⇜ (743/64 → 93/8) ⇝ 165/14 | note:84 gain:0.02985786437626847 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 23/2 ⇜ (93/8 → 745/64) ⇝ 47/4 | note:F2 gain:0.4399999999999855 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 323/28 ⇜ (93/8 → 745/64) ⇝ 165/14 | note:75 gain:0.043999999999998554 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 323/28 ⇜ (93/8 → 745/64) ⇝ 165/14 | note:79 gain:0.043999999999998554 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 323/28 ⇜ (93/8 → 745/64) ⇝ 165/14 | note:80 gain:0.043999999999998554 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 323/28 ⇜ (93/8 → 745/64) ⇝ 165/14 | note:84 gain:0.043999999999998554 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 23/2 ⇜ (745/64 → 373/32) ⇝ 47/4 | note:F2 gain:0.5814213562373108 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 323/28 ⇜ (745/64 → 373/32) ⇝ 165/14 | note:75 gain:0.058142135623731085 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 323/28 ⇜ (745/64 → 373/32) ⇝ 165/14 | note:79 gain:0.058142135623731085 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 323/28 ⇜ (745/64 → 373/32) ⇝ 165/14 | note:80 gain:0.058142135623731085 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 323/28 ⇜ (745/64 → 373/32) ⇝ 165/14 | note:84 gain:0.058142135623731085 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 23/2 ⇜ (373/32 → 747/64) ⇝ 47/4 | note:F2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 323/28 ⇜ (373/32 → 747/64) ⇝ 165/14 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 323/28 ⇜ (373/32 → 747/64) ⇝ 165/14 | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 323/28 ⇜ (373/32 → 747/64) ⇝ 165/14 | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 323/28 ⇜ (373/32 → 747/64) ⇝ 165/14 | note:84 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 23/2 ⇜ (747/64 → 187/16) ⇝ 47/4 | note:F2 gain:0.5814213562373169 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 323/28 ⇜ (747/64 → 187/16) ⇝ 165/14 | note:75 gain:0.058142135623731696 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 323/28 ⇜ (747/64 → 187/16) ⇝ 165/14 | note:79 gain:0.058142135623731696 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 323/28 ⇜ (747/64 → 187/16) ⇝ 165/14 | note:80 gain:0.058142135623731696 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 323/28 ⇜ (747/64 → 187/16) ⇝ 165/14 | note:84 gain:0.058142135623731696 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 23/2 ⇜ (187/16 → 749/64) ⇝ 47/4 | note:F2 gain:0.43999999999999395 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 323/28 ⇜ (187/16 → 749/64) ⇝ 165/14 | note:75 gain:0.0439999999999994 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 323/28 ⇜ (187/16 → 749/64) ⇝ 165/14 | note:79 gain:0.0439999999999994 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 323/28 ⇜ (187/16 → 749/64) ⇝ 165/14 | note:80 gain:0.0439999999999994 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 323/28 ⇜ (187/16 → 749/64) ⇝ 165/14 | note:84 gain:0.0439999999999994 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 23/2 ⇜ (749/64 → 375/32) ⇝ 47/4 | note:F2 gain:0.2985786437626906 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 323/28 ⇜ (749/64 → 375/32) ⇝ 165/14 | note:75 gain:0.029857864376269062 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 323/28 ⇜ (749/64 → 375/32) ⇝ 165/14 | note:79 gain:0.029857864376269062 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 323/28 ⇜ (749/64 → 375/32) ⇝ 165/14 | note:80 gain:0.029857864376269062 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 323/28 ⇜ (749/64 → 375/32) ⇝ 165/14 | note:84 gain:0.029857864376269062 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 23/2 ⇜ (375/32 → 751/64) ⇝ 47/4 | note:F2 gain:0.24 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 323/28 ⇜ (375/32 → 751/64) ⇝ 165/14 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 323/28 ⇜ (375/32 → 751/64) ⇝ 165/14 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 323/28 ⇜ (375/32 → 751/64) ⇝ 165/14 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 323/28 ⇜ (375/32 → 751/64) ⇝ 165/14 | note:84 gain:0.024 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 23/2 ⇜ (751/64 → 47/4) | note:F2 gain:0.29857864376268156 clip:1 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 323/28 ⇜ (751/64 → 47/4) ⇝ 165/14 | note:75 gain:0.029857864376268157 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 323/28 ⇜ (751/64 → 47/4) ⇝ 165/14 | note:79 gain:0.029857864376268157 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 323/28 ⇜ (751/64 → 47/4) ⇝ 165/14 | note:80 gain:0.029857864376268157 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 323/28 ⇜ (751/64 → 47/4) ⇝ 165/14 | note:84 gain:0.029857864376268157 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 323/28 ⇜ (47/4 → 753/64) ⇝ 165/14 | note:75 gain:0.0440000000000004 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 323/28 ⇜ (47/4 → 753/64) ⇝ 165/14 | note:79 gain:0.0440000000000004 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 323/28 ⇜ (47/4 → 753/64) ⇝ 165/14 | note:80 gain:0.0440000000000004 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 323/28 ⇜ (47/4 → 753/64) ⇝ 165/14 | note:84 gain:0.0440000000000004 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ (47/4 → 753/64) ⇝ 95/8 | note:C5 gain:0.44000000000000394 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ (47/4 → 753/64) ⇝ 95/8 | note:G5 gain:0.44000000000000394 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ (47/4 → 753/64) ⇝ 95/8 | note:Bb5 gain:0.44000000000000394 clip:1 s:piano release:0.1 pan:0.6296296296296297 ]", - "[ (47/4 → 753/64) ⇝ 12/1 | note:Eb4 gain:0.22000000000000197 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ (47/4 → 753/64) ⇝ 12/1 | note:G4 gain:0.22000000000000197 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (47/4 → 753/64) ⇝ 12/1 | note:Ab4 gain:0.22000000000000197 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ (47/4 → 753/64) ⇝ 12/1 | note:C5 gain:0.22000000000000197 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 323/28 ⇜ (753/64 → 377/32) ⇝ 165/14 | note:75 gain:0.05814213562373079 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 323/28 ⇜ (753/64 → 377/32) ⇝ 165/14 | note:79 gain:0.05814213562373079 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 323/28 ⇜ (753/64 → 377/32) ⇝ 165/14 | note:80 gain:0.05814213562373079 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 323/28 ⇜ (753/64 → 377/32) ⇝ 165/14 | note:84 gain:0.05814213562373079 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 47/4 ⇜ (753/64 → 377/32) ⇝ 95/8 | note:C5 gain:0.5814213562373078 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 47/4 ⇜ (753/64 → 377/32) ⇝ 95/8 | note:G5 gain:0.5814213562373078 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 47/4 ⇜ (753/64 → 377/32) ⇝ 95/8 | note:Bb5 gain:0.5814213562373078 clip:1 s:piano release:0.1 pan:0.6296296296296297 ]", - "[ 47/4 ⇜ (753/64 → 377/32) ⇝ 12/1 | note:Eb4 gain:0.2907106781186539 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 47/4 ⇜ (753/64 → 377/32) ⇝ 12/1 | note:G4 gain:0.2907106781186539 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 47/4 ⇜ (753/64 → 377/32) ⇝ 12/1 | note:Ab4 gain:0.2907106781186539 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 47/4 ⇜ (753/64 → 377/32) ⇝ 12/1 | note:C5 gain:0.2907106781186539 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 323/28 ⇜ (377/32 → 165/14) | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 323/28 ⇜ (377/32 → 165/14) | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 323/28 ⇜ (377/32 → 165/14) | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 323/28 ⇜ (377/32 → 165/14) | note:84 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 47/4 ⇜ (377/32 → 755/64) ⇝ 95/8 | note:C5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 47/4 ⇜ (377/32 → 755/64) ⇝ 95/8 | note:G5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 47/4 ⇜ (377/32 → 755/64) ⇝ 95/8 | note:Bb5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.6296296296296297 ]", - "[ 47/4 ⇜ (377/32 → 755/64) ⇝ 12/1 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 47/4 ⇜ (377/32 → 755/64) ⇝ 12/1 | note:G4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 47/4 ⇜ (377/32 → 755/64) ⇝ 12/1 | note:Ab4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 47/4 ⇜ (377/32 → 755/64) ⇝ 12/1 | note:C5 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 47/4 ⇜ (755/64 → 189/16) ⇝ 95/8 | note:C5 gain:0.5814213562373199 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 47/4 ⇜ (755/64 → 189/16) ⇝ 95/8 | note:G5 gain:0.5814213562373199 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 47/4 ⇜ (755/64 → 189/16) ⇝ 95/8 | note:Bb5 gain:0.5814213562373199 clip:1 s:piano release:0.1 pan:0.6296296296296297 ]", - "[ 47/4 ⇜ (755/64 → 189/16) ⇝ 12/1 | note:Eb4 gain:0.29071067811865997 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 47/4 ⇜ (755/64 → 189/16) ⇝ 12/1 | note:G4 gain:0.29071067811865997 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 47/4 ⇜ (755/64 → 189/16) ⇝ 12/1 | note:Ab4 gain:0.29071067811865997 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 47/4 ⇜ (755/64 → 189/16) ⇝ 12/1 | note:C5 gain:0.29071067811865997 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 47/4 ⇜ (189/16 → 757/64) ⇝ 95/8 | note:C5 gain:0.4399999999999983 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 47/4 ⇜ (189/16 → 757/64) ⇝ 95/8 | note:G5 gain:0.4399999999999983 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 47/4 ⇜ (189/16 → 757/64) ⇝ 95/8 | note:Bb5 gain:0.4399999999999983 clip:1 s:piano release:0.1 pan:0.6296296296296297 ]", - "[ 47/4 ⇜ (189/16 → 757/64) ⇝ 12/1 | note:Eb4 gain:0.21999999999999914 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 47/4 ⇜ (189/16 → 757/64) ⇝ 12/1 | note:G4 gain:0.21999999999999914 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 47/4 ⇜ (189/16 → 757/64) ⇝ 12/1 | note:Ab4 gain:0.21999999999999914 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 47/4 ⇜ (189/16 → 757/64) ⇝ 12/1 | note:C5 gain:0.21999999999999914 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 47/4 ⇜ (757/64 → 379/32) ⇝ 95/8 | note:C5 gain:0.29857864376269366 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 47/4 ⇜ (757/64 → 379/32) ⇝ 95/8 | note:G5 gain:0.29857864376269366 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 47/4 ⇜ (757/64 → 379/32) ⇝ 95/8 | note:Bb5 gain:0.29857864376269366 clip:1 s:piano release:0.1 pan:0.6296296296296297 ]", - "[ 47/4 ⇜ (757/64 → 379/32) ⇝ 12/1 | note:Eb4 gain:0.14928932188134683 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 47/4 ⇜ (757/64 → 379/32) ⇝ 12/1 | note:G4 gain:0.14928932188134683 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 47/4 ⇜ (757/64 → 379/32) ⇝ 12/1 | note:Ab4 gain:0.14928932188134683 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 47/4 ⇜ (757/64 → 379/32) ⇝ 12/1 | note:C5 gain:0.14928932188134683 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 47/4 ⇜ (379/32 → 759/64) ⇝ 95/8 | note:C5 gain:0.24 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 47/4 ⇜ (379/32 → 759/64) ⇝ 95/8 | note:G5 gain:0.24 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 47/4 ⇜ (379/32 → 759/64) ⇝ 95/8 | note:Bb5 gain:0.24 clip:1 s:piano release:0.1 pan:0.6296296296296297 ]", - "[ 47/4 ⇜ (379/32 → 759/64) ⇝ 12/1 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 47/4 ⇜ (379/32 → 759/64) ⇝ 12/1 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 47/4 ⇜ (379/32 → 759/64) ⇝ 12/1 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 47/4 ⇜ (379/32 → 759/64) ⇝ 12/1 | note:C5 gain:0.12 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 47/4 ⇜ (759/64 → 95/8) | note:C5 gain:0.29857864376269466 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 47/4 ⇜ (759/64 → 95/8) | note:G5 gain:0.29857864376269466 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 47/4 ⇜ (759/64 → 95/8) | note:Bb5 gain:0.29857864376269466 clip:1 s:piano release:0.1 pan:0.6296296296296297 ]", - "[ 47/4 ⇜ (759/64 → 95/8) ⇝ 12/1 | note:Eb4 gain:0.14928932188134733 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 47/4 ⇜ (759/64 → 95/8) ⇝ 12/1 | note:G4 gain:0.14928932188134733 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 47/4 ⇜ (759/64 → 95/8) ⇝ 12/1 | note:Ab4 gain:0.14928932188134733 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 47/4 ⇜ (759/64 → 95/8) ⇝ 12/1 | note:C5 gain:0.14928932188134733 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 47/4 ⇜ (95/8 → 761/64) ⇝ 12/1 | note:Eb4 gain:0.2199999999999998 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 47/4 ⇜ (95/8 → 761/64) ⇝ 12/1 | note:G4 gain:0.2199999999999998 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 47/4 ⇜ (95/8 → 761/64) ⇝ 12/1 | note:Ab4 gain:0.2199999999999998 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 47/4 ⇜ (95/8 → 761/64) ⇝ 12/1 | note:C5 gain:0.2199999999999998 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 47/4 ⇜ (761/64 → 381/32) ⇝ 12/1 | note:Eb4 gain:0.2907106781186524 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 47/4 ⇜ (761/64 → 381/32) ⇝ 12/1 | note:G4 gain:0.2907106781186524 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 47/4 ⇜ (761/64 → 381/32) ⇝ 12/1 | note:Ab4 gain:0.2907106781186524 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 47/4 ⇜ (761/64 → 381/32) ⇝ 12/1 | note:C5 gain:0.2907106781186524 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 47/4 ⇜ (381/32 → 763/64) ⇝ 12/1 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 47/4 ⇜ (381/32 → 763/64) ⇝ 12/1 | note:G4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 47/4 ⇜ (381/32 → 763/64) ⇝ 12/1 | note:Ab4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 47/4 ⇜ (381/32 → 763/64) ⇝ 12/1 | note:C5 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 47/4 ⇜ (763/64 → 191/16) ⇝ 12/1 | note:Eb4 gain:0.2907106781186535 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 47/4 ⇜ (763/64 → 191/16) ⇝ 12/1 | note:G4 gain:0.2907106781186535 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 47/4 ⇜ (763/64 → 191/16) ⇝ 12/1 | note:Ab4 gain:0.2907106781186535 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 47/4 ⇜ (763/64 → 191/16) ⇝ 12/1 | note:C5 gain:0.2907106781186535 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 47/4 ⇜ (191/16 → 765/64) ⇝ 12/1 | note:Eb4 gain:0.22000000000000128 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 47/4 ⇜ (191/16 → 765/64) ⇝ 12/1 | note:G4 gain:0.22000000000000128 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 47/4 ⇜ (191/16 → 765/64) ⇝ 12/1 | note:Ab4 gain:0.22000000000000128 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 47/4 ⇜ (191/16 → 765/64) ⇝ 12/1 | note:C5 gain:0.22000000000000128 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 47/4 ⇜ (765/64 → 383/32) ⇝ 12/1 | note:Eb4 gain:0.14928932188134833 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 47/4 ⇜ (765/64 → 383/32) ⇝ 12/1 | note:G4 gain:0.14928932188134833 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 47/4 ⇜ (765/64 → 383/32) ⇝ 12/1 | note:Ab4 gain:0.14928932188134833 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 47/4 ⇜ (765/64 → 383/32) ⇝ 12/1 | note:C5 gain:0.14928932188134833 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 47/4 ⇜ (383/32 → 767/64) ⇝ 12/1 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 47/4 ⇜ (383/32 → 767/64) ⇝ 12/1 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 47/4 ⇜ (383/32 → 767/64) ⇝ 12/1 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 47/4 ⇜ (383/32 → 767/64) ⇝ 12/1 | note:C5 gain:0.12 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 47/4 ⇜ (767/64 → 12/1) | note:Eb4 gain:0.14928932188134578 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 47/4 ⇜ (767/64 → 12/1) | note:G4 gain:0.14928932188134578 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 47/4 ⇜ (767/64 → 12/1) | note:Ab4 gain:0.14928932188134578 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 47/4 ⇜ (767/64 → 12/1) | note:C5 gain:0.14928932188134578 clip:1 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ (12/1 → 769/64) ⇝ 49/4 | note:G2 gain:0.4399999999999953 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 12/1 ⇜ (769/64 → 385/32) ⇝ 49/4 | note:G2 gain:0.5814213562373018 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 12/1 ⇜ (385/32 → 771/64) ⇝ 49/4 | note:G2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ (337/28 → 771/64) ⇝ 86/7 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ (337/28 → 771/64) ⇝ 86/7 | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ (337/28 → 771/64) ⇝ 86/7 | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ (337/28 → 771/64) ⇝ 86/7 | note:84 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 12/1 ⇜ (771/64 → 193/16) ⇝ 49/4 | note:G2 gain:0.58142135623731 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 337/28 ⇜ (771/64 → 193/16) ⇝ 86/7 | note:75 gain:0.058142135623730995 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 337/28 ⇜ (771/64 → 193/16) ⇝ 86/7 | note:79 gain:0.058142135623730995 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 337/28 ⇜ (771/64 → 193/16) ⇝ 86/7 | note:80 gain:0.058142135623730995 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 337/28 ⇜ (771/64 → 193/16) ⇝ 86/7 | note:84 gain:0.058142135623730995 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 12/1 ⇜ (193/16 → 773/64) ⇝ 49/4 | note:G2 gain:0.44000000000000683 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 337/28 ⇜ (193/16 → 773/64) ⇝ 86/7 | note:75 gain:0.044000000000000684 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 337/28 ⇜ (193/16 → 773/64) ⇝ 86/7 | note:79 gain:0.044000000000000684 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 337/28 ⇜ (193/16 → 773/64) ⇝ 86/7 | note:80 gain:0.044000000000000684 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 337/28 ⇜ (193/16 → 773/64) ⇝ 86/7 | note:84 gain:0.044000000000000684 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 12/1 ⇜ (773/64 → 387/32) ⇝ 49/4 | note:G2 gain:0.29857864376269977 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 337/28 ⇜ (773/64 → 387/32) ⇝ 86/7 | note:75 gain:0.02985786437626998 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 337/28 ⇜ (773/64 → 387/32) ⇝ 86/7 | note:79 gain:0.02985786437626998 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 337/28 ⇜ (773/64 → 387/32) ⇝ 86/7 | note:80 gain:0.02985786437626998 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 337/28 ⇜ (773/64 → 387/32) ⇝ 86/7 | note:84 gain:0.02985786437626998 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 12/1 ⇜ (387/32 → 775/64) ⇝ 49/4 | note:G2 gain:0.24 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 337/28 ⇜ (387/32 → 775/64) ⇝ 86/7 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 337/28 ⇜ (387/32 → 775/64) ⇝ 86/7 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 337/28 ⇜ (387/32 → 775/64) ⇝ 86/7 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 337/28 ⇜ (387/32 → 775/64) ⇝ 86/7 | note:84 gain:0.024 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 12/1 ⇜ (775/64 → 97/8) ⇝ 49/4 | note:G2 gain:0.2985786437626885 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 337/28 ⇜ (775/64 → 97/8) ⇝ 86/7 | note:75 gain:0.02985786437626885 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 337/28 ⇜ (775/64 → 97/8) ⇝ 86/7 | note:79 gain:0.02985786437626885 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 337/28 ⇜ (775/64 → 97/8) ⇝ 86/7 | note:80 gain:0.02985786437626885 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 337/28 ⇜ (775/64 → 97/8) ⇝ 86/7 | note:84 gain:0.02985786437626885 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 12/1 ⇜ (97/8 → 777/64) ⇝ 49/4 | note:G2 gain:0.439999999999991 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 337/28 ⇜ (97/8 → 777/64) ⇝ 86/7 | note:75 gain:0.0439999999999991 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 337/28 ⇜ (97/8 → 777/64) ⇝ 86/7 | note:79 gain:0.0439999999999991 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 337/28 ⇜ (97/8 → 777/64) ⇝ 86/7 | note:80 gain:0.0439999999999991 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 337/28 ⇜ (97/8 → 777/64) ⇝ 86/7 | note:84 gain:0.0439999999999991 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ (97/8 → 777/64) ⇝ 49/4 | note:G4 gain:0.439999999999991 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (97/8 → 777/64) ⇝ 49/4 | note:D5 gain:0.439999999999991 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ (97/8 → 777/64) ⇝ 49/4 | note:F5 gain:0.439999999999991 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 12/1 ⇜ (777/64 → 389/32) ⇝ 49/4 | note:G2 gain:0.5814213562372988 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 337/28 ⇜ (777/64 → 389/32) ⇝ 86/7 | note:75 gain:0.058142135623729885 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 337/28 ⇜ (777/64 → 389/32) ⇝ 86/7 | note:79 gain:0.058142135623729885 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 337/28 ⇜ (777/64 → 389/32) ⇝ 86/7 | note:80 gain:0.058142135623729885 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 337/28 ⇜ (777/64 → 389/32) ⇝ 86/7 | note:84 gain:0.058142135623729885 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 97/8 ⇜ (777/64 → 389/32) ⇝ 49/4 | note:G4 gain:0.5814213562372988 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 97/8 ⇜ (777/64 → 389/32) ⇝ 49/4 | note:D5 gain:0.5814213562372988 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 97/8 ⇜ (777/64 → 389/32) ⇝ 49/4 | note:F5 gain:0.5814213562372988 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 12/1 ⇜ (389/32 → 779/64) ⇝ 49/4 | note:G2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 337/28 ⇜ (389/32 → 779/64) ⇝ 86/7 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 337/28 ⇜ (389/32 → 779/64) ⇝ 86/7 | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 337/28 ⇜ (389/32 → 779/64) ⇝ 86/7 | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 337/28 ⇜ (389/32 → 779/64) ⇝ 86/7 | note:84 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 97/8 ⇜ (389/32 → 779/64) ⇝ 49/4 | note:G4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 97/8 ⇜ (389/32 → 779/64) ⇝ 49/4 | note:D5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 97/8 ⇜ (389/32 → 779/64) ⇝ 49/4 | note:F5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 12/1 ⇜ (779/64 → 195/16) ⇝ 49/4 | note:G2 gain:0.5814213562373131 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 337/28 ⇜ (779/64 → 195/16) ⇝ 86/7 | note:75 gain:0.05814213562373131 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 337/28 ⇜ (779/64 → 195/16) ⇝ 86/7 | note:79 gain:0.05814213562373131 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 337/28 ⇜ (779/64 → 195/16) ⇝ 86/7 | note:80 gain:0.05814213562373131 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 337/28 ⇜ (779/64 → 195/16) ⇝ 86/7 | note:84 gain:0.05814213562373131 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 97/8 ⇜ (779/64 → 195/16) ⇝ 49/4 | note:G4 gain:0.5814213562373131 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 97/8 ⇜ (779/64 → 195/16) ⇝ 49/4 | note:D5 gain:0.5814213562373131 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 97/8 ⇜ (779/64 → 195/16) ⇝ 49/4 | note:F5 gain:0.5814213562373131 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 12/1 ⇜ (195/16 → 781/64) ⇝ 49/4 | note:G2 gain:0.44000000000001127 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 337/28 ⇜ (195/16 → 781/64) ⇝ 86/7 | note:75 gain:0.04400000000000113 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 337/28 ⇜ (195/16 → 781/64) ⇝ 86/7 | note:79 gain:0.04400000000000113 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 337/28 ⇜ (195/16 → 781/64) ⇝ 86/7 | note:80 gain:0.04400000000000113 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 337/28 ⇜ (195/16 → 781/64) ⇝ 86/7 | note:84 gain:0.04400000000000113 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 97/8 ⇜ (195/16 → 781/64) ⇝ 49/4 | note:G4 gain:0.44000000000001127 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 97/8 ⇜ (195/16 → 781/64) ⇝ 49/4 | note:D5 gain:0.44000000000001127 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 97/8 ⇜ (195/16 → 781/64) ⇝ 49/4 | note:F5 gain:0.44000000000001127 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 12/1 ⇜ (781/64 → 391/32) ⇝ 49/4 | note:G2 gain:0.2985786437626867 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 337/28 ⇜ (781/64 → 391/32) ⇝ 86/7 | note:75 gain:0.029857864376268674 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 337/28 ⇜ (781/64 → 391/32) ⇝ 86/7 | note:79 gain:0.029857864376268674 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 337/28 ⇜ (781/64 → 391/32) ⇝ 86/7 | note:80 gain:0.029857864376268674 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 337/28 ⇜ (781/64 → 391/32) ⇝ 86/7 | note:84 gain:0.029857864376268674 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 97/8 ⇜ (781/64 → 391/32) ⇝ 49/4 | note:G4 gain:0.2985786437626867 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 97/8 ⇜ (781/64 → 391/32) ⇝ 49/4 | note:D5 gain:0.2985786437626867 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 97/8 ⇜ (781/64 → 391/32) ⇝ 49/4 | note:F5 gain:0.2985786437626867 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 12/1 ⇜ (391/32 → 783/64) ⇝ 49/4 | note:G2 gain:0.24 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 337/28 ⇜ (391/32 → 783/64) ⇝ 86/7 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 337/28 ⇜ (391/32 → 783/64) ⇝ 86/7 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 337/28 ⇜ (391/32 → 783/64) ⇝ 86/7 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 337/28 ⇜ (391/32 → 783/64) ⇝ 86/7 | note:84 gain:0.024 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 97/8 ⇜ (391/32 → 783/64) ⇝ 49/4 | note:G4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 97/8 ⇜ (391/32 → 783/64) ⇝ 49/4 | note:D5 gain:0.24 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 97/8 ⇜ (391/32 → 783/64) ⇝ 49/4 | note:F5 gain:0.24 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 12/1 ⇜ (783/64 → 49/4) | note:G2 gain:0.2985786437626855 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 337/28 ⇜ (783/64 → 49/4) ⇝ 86/7 | note:75 gain:0.029857864376268552 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 337/28 ⇜ (783/64 → 49/4) ⇝ 86/7 | note:79 gain:0.029857864376268552 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 337/28 ⇜ (783/64 → 49/4) ⇝ 86/7 | note:80 gain:0.029857864376268552 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 337/28 ⇜ (783/64 → 49/4) ⇝ 86/7 | note:84 gain:0.029857864376268552 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 97/8 ⇜ (783/64 → 49/4) | note:G4 gain:0.2985786437626855 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 97/8 ⇜ (783/64 → 49/4) | note:D5 gain:0.2985786437626855 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 97/8 ⇜ (783/64 → 49/4) | note:F5 gain:0.2985786437626855 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 337/28 ⇜ (49/4 → 785/64) ⇝ 86/7 | note:75 gain:0.04399999999999868 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 337/28 ⇜ (49/4 → 785/64) ⇝ 86/7 | note:79 gain:0.04399999999999868 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 337/28 ⇜ (49/4 → 785/64) ⇝ 86/7 | note:80 gain:0.04399999999999868 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 337/28 ⇜ (49/4 → 785/64) ⇝ 86/7 | note:84 gain:0.04399999999999868 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 337/28 ⇜ (785/64 → 393/32) ⇝ 86/7 | note:75 gain:0.058142135623731175 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 337/28 ⇜ (785/64 → 393/32) ⇝ 86/7 | note:79 gain:0.058142135623731175 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 337/28 ⇜ (785/64 → 393/32) ⇝ 86/7 | note:80 gain:0.058142135623731175 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 337/28 ⇜ (785/64 → 393/32) ⇝ 86/7 | note:84 gain:0.058142135623731175 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 337/28 ⇜ (393/32 → 86/7) | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 337/28 ⇜ (393/32 → 86/7) | note:79 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 337/28 ⇜ (393/32 → 86/7) | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 337/28 ⇜ (393/32 → 86/7) | note:84 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ (25/2 → 801/64) ⇝ 101/8 | note:D5 gain:0.4400000000000008 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ (25/2 → 801/64) ⇝ 101/8 | note:A5 gain:0.4400000000000008 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ (25/2 → 801/64) ⇝ 101/8 | note:C6 gain:0.4400000000000008 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ (25/2 → 801/64) ⇝ 51/4 | note:B3 gain:0.2200000000000004 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ (25/2 → 801/64) ⇝ 51/4 | note:E4 gain:0.2200000000000004 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (25/2 → 801/64) ⇝ 51/4 | note:F4 gain:0.2200000000000004 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ (25/2 → 801/64) ⇝ 51/4 | note:A4 gain:0.2200000000000004 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ (25/2 → 801/64) ⇝ 51/4 | note:G2 gain:0.4400000000000008 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 25/2 ⇜ (801/64 → 401/32) ⇝ 101/8 | note:D5 gain:0.5814213562373057 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 25/2 ⇜ (801/64 → 401/32) ⇝ 101/8 | note:A5 gain:0.5814213562373057 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 25/2 ⇜ (801/64 → 401/32) ⇝ 101/8 | note:C6 gain:0.5814213562373057 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 25/2 ⇜ (801/64 → 401/32) ⇝ 51/4 | note:B3 gain:0.29071067811865287 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 25/2 ⇜ (801/64 → 401/32) ⇝ 51/4 | note:E4 gain:0.29071067811865287 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 25/2 ⇜ (801/64 → 401/32) ⇝ 51/4 | note:F4 gain:0.29071067811865287 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 25/2 ⇜ (801/64 → 401/32) ⇝ 51/4 | note:A4 gain:0.29071067811865287 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 25/2 ⇜ (801/64 → 401/32) ⇝ 51/4 | note:G2 gain:0.5814213562373057 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 25/2 ⇜ (401/32 → 803/64) ⇝ 101/8 | note:D5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 25/2 ⇜ (401/32 → 803/64) ⇝ 101/8 | note:A5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 25/2 ⇜ (401/32 → 803/64) ⇝ 101/8 | note:C6 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 25/2 ⇜ (401/32 → 803/64) ⇝ 51/4 | note:B3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 25/2 ⇜ (401/32 → 803/64) ⇝ 51/4 | note:E4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 25/2 ⇜ (401/32 → 803/64) ⇝ 51/4 | note:F4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 25/2 ⇜ (401/32 → 803/64) ⇝ 51/4 | note:A4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 25/2 ⇜ (401/32 → 803/64) ⇝ 51/4 | note:G2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 25/2 ⇜ (803/64 → 201/16) ⇝ 101/8 | note:D5 gain:0.5814213562373061 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 25/2 ⇜ (803/64 → 201/16) ⇝ 101/8 | note:A5 gain:0.5814213562373061 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 25/2 ⇜ (803/64 → 201/16) ⇝ 101/8 | note:C6 gain:0.5814213562373061 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 25/2 ⇜ (803/64 → 201/16) ⇝ 51/4 | note:B3 gain:0.29071067811865303 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 25/2 ⇜ (803/64 → 201/16) ⇝ 51/4 | note:E4 gain:0.29071067811865303 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 25/2 ⇜ (803/64 → 201/16) ⇝ 51/4 | note:F4 gain:0.29071067811865303 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 25/2 ⇜ (803/64 → 201/16) ⇝ 51/4 | note:A4 gain:0.29071067811865303 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 25/2 ⇜ (803/64 → 201/16) ⇝ 51/4 | note:G2 gain:0.5814213562373061 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 25/2 ⇜ (201/16 → 805/64) ⇝ 101/8 | note:D5 gain:0.4400000000000014 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 25/2 ⇜ (201/16 → 805/64) ⇝ 101/8 | note:A5 gain:0.4400000000000014 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 25/2 ⇜ (201/16 → 805/64) ⇝ 101/8 | note:C6 gain:0.4400000000000014 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 25/2 ⇜ (201/16 → 805/64) ⇝ 51/4 | note:B3 gain:0.2200000000000007 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 25/2 ⇜ (201/16 → 805/64) ⇝ 51/4 | note:E4 gain:0.2200000000000007 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 25/2 ⇜ (201/16 → 805/64) ⇝ 51/4 | note:F4 gain:0.2200000000000007 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 25/2 ⇜ (201/16 → 805/64) ⇝ 51/4 | note:A4 gain:0.2200000000000007 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 25/2 ⇜ (201/16 → 805/64) ⇝ 51/4 | note:G2 gain:0.4400000000000014 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 25/2 ⇜ (805/64 → 403/32) ⇝ 101/8 | note:D5 gain:0.2985786437626959 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 25/2 ⇜ (805/64 → 403/32) ⇝ 101/8 | note:A5 gain:0.2985786437626959 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 25/2 ⇜ (805/64 → 403/32) ⇝ 101/8 | note:C6 gain:0.2985786437626959 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 25/2 ⇜ (805/64 → 403/32) ⇝ 51/4 | note:B3 gain:0.14928932188134794 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 25/2 ⇜ (805/64 → 403/32) ⇝ 51/4 | note:E4 gain:0.14928932188134794 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 25/2 ⇜ (805/64 → 403/32) ⇝ 51/4 | note:F4 gain:0.14928932188134794 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 25/2 ⇜ (805/64 → 403/32) ⇝ 51/4 | note:A4 gain:0.14928932188134794 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 25/2 ⇜ (805/64 → 403/32) ⇝ 51/4 | note:G2 gain:0.2985786437626959 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 25/2 ⇜ (403/32 → 807/64) ⇝ 101/8 | note:D5 gain:0.24 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", + "[ 49/8 ⇜ (199/32 → 399/64) ⇝ 25/4 | note:F#4 gain:0.24 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 49/8 ⇜ (199/32 → 399/64) ⇝ 25/4 | note:A#4 gain:0.24 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 6/1 ⇜ (399/64 → 25/4) | note:F#2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 169/28 ⇜ (399/64 → 25/4) ⇝ 44/7 | note:71 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 169/28 ⇜ (399/64 → 25/4) ⇝ 44/7 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 169/28 ⇜ (399/64 → 25/4) ⇝ 44/7 | note:77 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 169/28 ⇜ (399/64 → 25/4) ⇝ 44/7 | note:81 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 49/8 ⇜ (399/64 → 25/4) | note:F#4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 49/8 ⇜ (399/64 → 25/4) | note:A#4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 169/28 ⇜ (25/4 → 401/64) ⇝ 44/7 | note:71 gain:0.044 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 169/28 ⇜ (25/4 → 401/64) ⇝ 44/7 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 169/28 ⇜ (25/4 → 401/64) ⇝ 44/7 | note:77 gain:0.044 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 169/28 ⇜ (25/4 → 401/64) ⇝ 44/7 | note:81 gain:0.044 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 169/28 ⇜ (401/64 → 201/32) ⇝ 44/7 | note:71 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 169/28 ⇜ (401/64 → 201/32) ⇝ 44/7 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 169/28 ⇜ (401/64 → 201/32) ⇝ 44/7 | note:77 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 169/28 ⇜ (401/64 → 201/32) ⇝ 44/7 | note:81 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 169/28 ⇜ (201/32 → 44/7) | note:71 gain:0.064 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 169/28 ⇜ (201/32 → 44/7) | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 169/28 ⇜ (201/32 → 44/7) | note:77 gain:0.064 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 169/28 ⇜ (201/32 → 44/7) | note:81 gain:0.064 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ (13/2 → 417/64) ⇝ 53/8 | note:C#5 gain:0.44 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ (13/2 → 417/64) ⇝ 53/8 | note:E5 gain:0.44 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ (13/2 → 417/64) ⇝ 27/4 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ (13/2 → 417/64) ⇝ 27/4 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ (13/2 → 417/64) ⇝ 27/4 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (13/2 → 417/64) ⇝ 27/4 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ (13/2 → 417/64) ⇝ 27/4 | note:F#2 gain:0.44 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 13/2 ⇜ (417/64 → 209/32) ⇝ 53/8 | note:C#5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 13/2 ⇜ (417/64 → 209/32) ⇝ 53/8 | note:E5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 13/2 ⇜ (417/64 → 209/32) ⇝ 27/4 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 13/2 ⇜ (417/64 → 209/32) ⇝ 27/4 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 13/2 ⇜ (417/64 → 209/32) ⇝ 27/4 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 13/2 ⇜ (417/64 → 209/32) ⇝ 27/4 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 13/2 ⇜ (417/64 → 209/32) ⇝ 27/4 | note:F#2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 13/2 ⇜ (209/32 → 419/64) ⇝ 53/8 | note:C#5 gain:0.64 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 13/2 ⇜ (209/32 → 419/64) ⇝ 53/8 | note:E5 gain:0.64 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 13/2 ⇜ (209/32 → 419/64) ⇝ 27/4 | note:Bb3 gain:0.32 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 13/2 ⇜ (209/32 → 419/64) ⇝ 27/4 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 13/2 ⇜ (209/32 → 419/64) ⇝ 27/4 | note:E4 gain:0.32 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 13/2 ⇜ (209/32 → 419/64) ⇝ 27/4 | note:Ab4 gain:0.32 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 13/2 ⇜ (209/32 → 419/64) ⇝ 27/4 | note:F#2 gain:0.64 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 13/2 ⇜ (419/64 → 105/16) ⇝ 53/8 | note:C#5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 13/2 ⇜ (419/64 → 105/16) ⇝ 53/8 | note:E5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 13/2 ⇜ (419/64 → 105/16) ⇝ 27/4 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 13/2 ⇜ (419/64 → 105/16) ⇝ 27/4 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 13/2 ⇜ (419/64 → 105/16) ⇝ 27/4 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 13/2 ⇜ (419/64 → 105/16) ⇝ 27/4 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 13/2 ⇜ (419/64 → 105/16) ⇝ 27/4 | note:F#2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 13/2 ⇜ (105/16 → 421/64) ⇝ 53/8 | note:C#5 gain:0.44 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 13/2 ⇜ (105/16 → 421/64) ⇝ 53/8 | note:E5 gain:0.44 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 13/2 ⇜ (105/16 → 421/64) ⇝ 27/4 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 13/2 ⇜ (105/16 → 421/64) ⇝ 27/4 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 13/2 ⇜ (105/16 → 421/64) ⇝ 27/4 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 13/2 ⇜ (105/16 → 421/64) ⇝ 27/4 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 13/2 ⇜ (105/16 → 421/64) ⇝ 27/4 | note:F#2 gain:0.44 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 13/2 ⇜ (421/64 → 211/32) ⇝ 53/8 | note:C#5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 13/2 ⇜ (421/64 → 211/32) ⇝ 53/8 | note:E5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 13/2 ⇜ (421/64 → 211/32) ⇝ 27/4 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 13/2 ⇜ (421/64 → 211/32) ⇝ 27/4 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 13/2 ⇜ (421/64 → 211/32) ⇝ 27/4 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 13/2 ⇜ (421/64 → 211/32) ⇝ 27/4 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 13/2 ⇜ (421/64 → 211/32) ⇝ 27/4 | note:F#2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 13/2 ⇜ (211/32 → 423/64) ⇝ 53/8 | note:C#5 gain:0.24 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 13/2 ⇜ (211/32 → 423/64) ⇝ 53/8 | note:E5 gain:0.24 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 13/2 ⇜ (211/32 → 423/64) ⇝ 27/4 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 13/2 ⇜ (211/32 → 423/64) ⇝ 27/4 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 13/2 ⇜ (211/32 → 423/64) ⇝ 27/4 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 13/2 ⇜ (211/32 → 423/64) ⇝ 27/4 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 13/2 ⇜ (211/32 → 423/64) ⇝ 27/4 | note:F#2 gain:0.24 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 13/2 ⇜ (423/64 → 53/8) | note:C#5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 13/2 ⇜ (423/64 → 53/8) | note:E5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 13/2 ⇜ (423/64 → 53/8) ⇝ 27/4 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 13/2 ⇜ (423/64 → 53/8) ⇝ 27/4 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 13/2 ⇜ (423/64 → 53/8) ⇝ 27/4 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 13/2 ⇜ (423/64 → 53/8) ⇝ 27/4 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 13/2 ⇜ (423/64 → 53/8) ⇝ 27/4 | note:F#2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 13/2 ⇜ (53/8 → 425/64) ⇝ 27/4 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 13/2 ⇜ (53/8 → 425/64) ⇝ 27/4 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 13/2 ⇜ (53/8 → 425/64) ⇝ 27/4 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 13/2 ⇜ (53/8 → 425/64) ⇝ 27/4 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 13/2 ⇜ (53/8 → 425/64) ⇝ 27/4 | note:F#2 gain:0.44 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 13/2 ⇜ (425/64 → 213/32) ⇝ 27/4 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 13/2 ⇜ (425/64 → 213/32) ⇝ 27/4 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 13/2 ⇜ (425/64 → 213/32) ⇝ 27/4 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 13/2 ⇜ (425/64 → 213/32) ⇝ 27/4 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 13/2 ⇜ (425/64 → 213/32) ⇝ 27/4 | note:F#2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 13/2 ⇜ (213/32 → 427/64) ⇝ 27/4 | note:Bb3 gain:0.32 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 13/2 ⇜ (213/32 → 427/64) ⇝ 27/4 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 13/2 ⇜ (213/32 → 427/64) ⇝ 27/4 | note:E4 gain:0.32 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 13/2 ⇜ (213/32 → 427/64) ⇝ 27/4 | note:Ab4 gain:0.32 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 13/2 ⇜ (213/32 → 427/64) ⇝ 27/4 | note:F#2 gain:0.64 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 13/2 ⇜ (427/64 → 107/16) ⇝ 27/4 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 13/2 ⇜ (427/64 → 107/16) ⇝ 27/4 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 13/2 ⇜ (427/64 → 107/16) ⇝ 27/4 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 13/2 ⇜ (427/64 → 107/16) ⇝ 27/4 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 13/2 ⇜ (427/64 → 107/16) ⇝ 27/4 | note:F#2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 13/2 ⇜ (107/16 → 429/64) ⇝ 27/4 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 13/2 ⇜ (107/16 → 429/64) ⇝ 27/4 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 13/2 ⇜ (107/16 → 429/64) ⇝ 27/4 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 13/2 ⇜ (107/16 → 429/64) ⇝ 27/4 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 13/2 ⇜ (107/16 → 429/64) ⇝ 27/4 | note:F#2 gain:0.44 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 13/2 ⇜ (429/64 → 215/32) ⇝ 27/4 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 13/2 ⇜ (429/64 → 215/32) ⇝ 27/4 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 13/2 ⇜ (429/64 → 215/32) ⇝ 27/4 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 13/2 ⇜ (429/64 → 215/32) ⇝ 27/4 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 13/2 ⇜ (429/64 → 215/32) ⇝ 27/4 | note:F#2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 13/2 ⇜ (215/32 → 431/64) ⇝ 27/4 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 13/2 ⇜ (215/32 → 431/64) ⇝ 27/4 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 13/2 ⇜ (215/32 → 431/64) ⇝ 27/4 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 13/2 ⇜ (215/32 → 431/64) ⇝ 27/4 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 13/2 ⇜ (215/32 → 431/64) ⇝ 27/4 | note:F#2 gain:0.24 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 13/2 ⇜ (431/64 → 27/4) | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 13/2 ⇜ (431/64 → 27/4) | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 13/2 ⇜ (431/64 → 27/4) | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 13/2 ⇜ (431/64 → 27/4) | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 13/2 ⇜ (431/64 → 27/4) | note:F#2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ (27/4 → 433/64) ⇝ 55/8 | note:F#4 gain:0.44 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ (27/4 → 433/64) ⇝ 55/8 | note:A#4 gain:0.44 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 27/4 ⇜ (433/64 → 217/32) ⇝ 55/8 | note:F#4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 27/4 ⇜ (433/64 → 217/32) ⇝ 55/8 | note:A#4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 27/4 ⇜ (217/32 → 435/64) ⇝ 55/8 | note:F#4 gain:0.64 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 27/4 ⇜ (217/32 → 435/64) ⇝ 55/8 | note:A#4 gain:0.64 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ (95/14 → 435/64) ⇝ 197/28 | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ (95/14 → 435/64) ⇝ 197/28 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ (95/14 → 435/64) ⇝ 197/28 | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ (95/14 → 435/64) ⇝ 197/28 | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 27/4 ⇜ (435/64 → 109/16) ⇝ 55/8 | note:F#4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 27/4 ⇜ (435/64 → 109/16) ⇝ 55/8 | note:A#4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 95/14 ⇜ (435/64 → 109/16) ⇝ 197/28 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 95/14 ⇜ (435/64 → 109/16) ⇝ 197/28 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 95/14 ⇜ (435/64 → 109/16) ⇝ 197/28 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 95/14 ⇜ (435/64 → 109/16) ⇝ 197/28 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 27/4 ⇜ (109/16 → 437/64) ⇝ 55/8 | note:F#4 gain:0.44 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 27/4 ⇜ (109/16 → 437/64) ⇝ 55/8 | note:A#4 gain:0.44 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 95/14 ⇜ (109/16 → 437/64) ⇝ 197/28 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 95/14 ⇜ (109/16 → 437/64) ⇝ 197/28 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 95/14 ⇜ (109/16 → 437/64) ⇝ 197/28 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 95/14 ⇜ (109/16 → 437/64) ⇝ 197/28 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 27/4 ⇜ (437/64 → 219/32) ⇝ 55/8 | note:F#4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 27/4 ⇜ (437/64 → 219/32) ⇝ 55/8 | note:A#4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 95/14 ⇜ (437/64 → 219/32) ⇝ 197/28 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 95/14 ⇜ (437/64 → 219/32) ⇝ 197/28 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 95/14 ⇜ (437/64 → 219/32) ⇝ 197/28 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 95/14 ⇜ (437/64 → 219/32) ⇝ 197/28 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 27/4 ⇜ (219/32 → 439/64) ⇝ 55/8 | note:F#4 gain:0.24 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 27/4 ⇜ (219/32 → 439/64) ⇝ 55/8 | note:A#4 gain:0.24 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 95/14 ⇜ (219/32 → 439/64) ⇝ 197/28 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 95/14 ⇜ (219/32 → 439/64) ⇝ 197/28 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 95/14 ⇜ (219/32 → 439/64) ⇝ 197/28 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 95/14 ⇜ (219/32 → 439/64) ⇝ 197/28 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 27/4 ⇜ (439/64 → 55/8) | note:F#4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 27/4 ⇜ (439/64 → 55/8) | note:A#4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 95/14 ⇜ (439/64 → 55/8) ⇝ 197/28 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 95/14 ⇜ (439/64 → 55/8) ⇝ 197/28 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 95/14 ⇜ (439/64 → 55/8) ⇝ 197/28 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 95/14 ⇜ (439/64 → 55/8) ⇝ 197/28 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 95/14 ⇜ (55/8 → 441/64) ⇝ 197/28 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 95/14 ⇜ (55/8 → 441/64) ⇝ 197/28 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 95/14 ⇜ (55/8 → 441/64) ⇝ 197/28 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 95/14 ⇜ (55/8 → 441/64) ⇝ 197/28 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 95/14 ⇜ (441/64 → 221/32) ⇝ 197/28 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 95/14 ⇜ (441/64 → 221/32) ⇝ 197/28 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 95/14 ⇜ (441/64 → 221/32) ⇝ 197/28 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 95/14 ⇜ (441/64 → 221/32) ⇝ 197/28 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 95/14 ⇜ (221/32 → 443/64) ⇝ 197/28 | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 95/14 ⇜ (221/32 → 443/64) ⇝ 197/28 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 95/14 ⇜ (221/32 → 443/64) ⇝ 197/28 | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 95/14 ⇜ (221/32 → 443/64) ⇝ 197/28 | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 95/14 ⇜ (443/64 → 111/16) ⇝ 197/28 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 95/14 ⇜ (443/64 → 111/16) ⇝ 197/28 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 95/14 ⇜ (443/64 → 111/16) ⇝ 197/28 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 95/14 ⇜ (443/64 → 111/16) ⇝ 197/28 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 95/14 ⇜ (111/16 → 445/64) ⇝ 197/28 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 95/14 ⇜ (111/16 → 445/64) ⇝ 197/28 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 95/14 ⇜ (111/16 → 445/64) ⇝ 197/28 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 95/14 ⇜ (111/16 → 445/64) ⇝ 197/28 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 95/14 ⇜ (445/64 → 223/32) ⇝ 197/28 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 95/14 ⇜ (445/64 → 223/32) ⇝ 197/28 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 95/14 ⇜ (445/64 → 223/32) ⇝ 197/28 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 95/14 ⇜ (445/64 → 223/32) ⇝ 197/28 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 95/14 ⇜ (223/32 → 447/64) ⇝ 197/28 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 95/14 ⇜ (223/32 → 447/64) ⇝ 197/28 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 95/14 ⇜ (223/32 → 447/64) ⇝ 197/28 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 95/14 ⇜ (223/32 → 447/64) ⇝ 197/28 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 95/14 ⇜ (447/64 → 7/1) ⇝ 197/28 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 95/14 ⇜ (447/64 → 7/1) ⇝ 197/28 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 95/14 ⇜ (447/64 → 7/1) ⇝ 197/28 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 95/14 ⇜ (447/64 → 7/1) ⇝ 197/28 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 95/14 ⇜ (7/1 → 449/64) ⇝ 197/28 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 95/14 ⇜ (7/1 → 449/64) ⇝ 197/28 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 95/14 ⇜ (7/1 → 449/64) ⇝ 197/28 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 95/14 ⇜ (7/1 → 449/64) ⇝ 197/28 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ (7/1 → 449/64) ⇝ 29/4 | note:F#2 gain:0.44 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 95/14 ⇜ (449/64 → 225/32) ⇝ 197/28 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 95/14 ⇜ (449/64 → 225/32) ⇝ 197/28 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 95/14 ⇜ (449/64 → 225/32) ⇝ 197/28 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 95/14 ⇜ (449/64 → 225/32) ⇝ 197/28 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 7/1 ⇜ (449/64 → 225/32) ⇝ 29/4 | note:F#2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 95/14 ⇜ (225/32 → 197/28) | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 95/14 ⇜ (225/32 → 197/28) | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 95/14 ⇜ (225/32 → 197/28) | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 95/14 ⇜ (225/32 → 197/28) | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 7/1 ⇜ (225/32 → 451/64) ⇝ 29/4 | note:F#2 gain:0.64 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 7/1 ⇜ (451/64 → 113/16) ⇝ 29/4 | note:F#2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 7/1 ⇜ (113/16 → 453/64) ⇝ 29/4 | note:F#2 gain:0.44 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 7/1 ⇜ (453/64 → 227/32) ⇝ 29/4 | note:F#2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 7/1 ⇜ (227/32 → 455/64) ⇝ 29/4 | note:F#2 gain:0.24 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 7/1 ⇜ (455/64 → 57/8) ⇝ 29/4 | note:F#2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 7/1 ⇜ (57/8 → 457/64) ⇝ 29/4 | note:F#2 gain:0.44 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ (57/8 → 457/64) ⇝ 29/4 | note:F#4 gain:0.44 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ (57/8 → 457/64) ⇝ 29/4 | note:A#4 gain:0.44 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 7/1 ⇜ (457/64 → 229/32) ⇝ 29/4 | note:F#2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 57/8 ⇜ (457/64 → 229/32) ⇝ 29/4 | note:F#4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 57/8 ⇜ (457/64 → 229/32) ⇝ 29/4 | note:A#4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 7/1 ⇜ (229/32 → 459/64) ⇝ 29/4 | note:F#2 gain:0.64 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 57/8 ⇜ (229/32 → 459/64) ⇝ 29/4 | note:F#4 gain:0.64 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 57/8 ⇜ (229/32 → 459/64) ⇝ 29/4 | note:A#4 gain:0.64 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 7/1 ⇜ (459/64 → 115/16) ⇝ 29/4 | note:F#2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 57/8 ⇜ (459/64 → 115/16) ⇝ 29/4 | note:F#4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 57/8 ⇜ (459/64 → 115/16) ⇝ 29/4 | note:A#4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 7/1 ⇜ (115/16 → 461/64) ⇝ 29/4 | note:F#2 gain:0.44 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 57/8 ⇜ (115/16 → 461/64) ⇝ 29/4 | note:F#4 gain:0.44 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 57/8 ⇜ (115/16 → 461/64) ⇝ 29/4 | note:A#4 gain:0.44 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 7/1 ⇜ (461/64 → 231/32) ⇝ 29/4 | note:F#2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 57/8 ⇜ (461/64 → 231/32) ⇝ 29/4 | note:F#4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 57/8 ⇜ (461/64 → 231/32) ⇝ 29/4 | note:A#4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 7/1 ⇜ (231/32 → 463/64) ⇝ 29/4 | note:F#2 gain:0.24 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 57/8 ⇜ (231/32 → 463/64) ⇝ 29/4 | note:F#4 gain:0.24 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 57/8 ⇜ (231/32 → 463/64) ⇝ 29/4 | note:A#4 gain:0.24 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 7/1 ⇜ (463/64 → 29/4) | note:F#2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 57/8 ⇜ (463/64 → 29/4) | note:F#4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 57/8 ⇜ (463/64 → 29/4) | note:A#4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ (29/4 → 465/64) ⇝ 15/2 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ (29/4 → 465/64) ⇝ 15/2 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ (29/4 → 465/64) ⇝ 15/2 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (29/4 → 465/64) ⇝ 15/2 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 29/4 ⇜ (465/64 → 233/32) ⇝ 15/2 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 29/4 ⇜ (465/64 → 233/32) ⇝ 15/2 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 29/4 ⇜ (465/64 → 233/32) ⇝ 15/2 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 29/4 ⇜ (465/64 → 233/32) ⇝ 15/2 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 29/4 ⇜ (233/32 → 467/64) ⇝ 15/2 | note:Bb3 gain:0.32 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 29/4 ⇜ (233/32 → 467/64) ⇝ 15/2 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 29/4 ⇜ (233/32 → 467/64) ⇝ 15/2 | note:E4 gain:0.32 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 29/4 ⇜ (233/32 → 467/64) ⇝ 15/2 | note:Ab4 gain:0.32 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 29/4 ⇜ (467/64 → 117/16) ⇝ 15/2 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 29/4 ⇜ (467/64 → 117/16) ⇝ 15/2 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 29/4 ⇜ (467/64 → 117/16) ⇝ 15/2 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 29/4 ⇜ (467/64 → 117/16) ⇝ 15/2 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 29/4 ⇜ (117/16 → 469/64) ⇝ 15/2 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 29/4 ⇜ (117/16 → 469/64) ⇝ 15/2 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 29/4 ⇜ (117/16 → 469/64) ⇝ 15/2 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 29/4 ⇜ (117/16 → 469/64) ⇝ 15/2 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 29/4 ⇜ (469/64 → 235/32) ⇝ 15/2 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 29/4 ⇜ (469/64 → 235/32) ⇝ 15/2 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 29/4 ⇜ (469/64 → 235/32) ⇝ 15/2 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 29/4 ⇜ (469/64 → 235/32) ⇝ 15/2 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 29/4 ⇜ (235/32 → 471/64) ⇝ 15/2 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 29/4 ⇜ (235/32 → 471/64) ⇝ 15/2 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 29/4 ⇜ (235/32 → 471/64) ⇝ 15/2 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 29/4 ⇜ (235/32 → 471/64) ⇝ 15/2 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 29/4 ⇜ (471/64 → 59/8) ⇝ 15/2 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 29/4 ⇜ (471/64 → 59/8) ⇝ 15/2 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 29/4 ⇜ (471/64 → 59/8) ⇝ 15/2 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 29/4 ⇜ (471/64 → 59/8) ⇝ 15/2 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 29/4 ⇜ (59/8 → 473/64) ⇝ 15/2 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 29/4 ⇜ (59/8 → 473/64) ⇝ 15/2 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 29/4 ⇜ (59/8 → 473/64) ⇝ 15/2 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 29/4 ⇜ (59/8 → 473/64) ⇝ 15/2 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 29/4 ⇜ (473/64 → 237/32) ⇝ 15/2 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 29/4 ⇜ (473/64 → 237/32) ⇝ 15/2 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 29/4 ⇜ (473/64 → 237/32) ⇝ 15/2 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 29/4 ⇜ (473/64 → 237/32) ⇝ 15/2 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 29/4 ⇜ (237/32 → 475/64) ⇝ 15/2 | note:Bb3 gain:0.32 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 29/4 ⇜ (237/32 → 475/64) ⇝ 15/2 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 29/4 ⇜ (237/32 → 475/64) ⇝ 15/2 | note:E4 gain:0.32 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 29/4 ⇜ (237/32 → 475/64) ⇝ 15/2 | note:Ab4 gain:0.32 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 29/4 ⇜ (475/64 → 119/16) ⇝ 15/2 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 29/4 ⇜ (475/64 → 119/16) ⇝ 15/2 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 29/4 ⇜ (475/64 → 119/16) ⇝ 15/2 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 29/4 ⇜ (475/64 → 119/16) ⇝ 15/2 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 29/4 ⇜ (119/16 → 477/64) ⇝ 15/2 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 29/4 ⇜ (119/16 → 477/64) ⇝ 15/2 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 29/4 ⇜ (119/16 → 477/64) ⇝ 15/2 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 29/4 ⇜ (119/16 → 477/64) ⇝ 15/2 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 29/4 ⇜ (477/64 → 239/32) ⇝ 15/2 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 29/4 ⇜ (477/64 → 239/32) ⇝ 15/2 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 29/4 ⇜ (477/64 → 239/32) ⇝ 15/2 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 29/4 ⇜ (477/64 → 239/32) ⇝ 15/2 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 29/4 ⇜ (239/32 → 479/64) ⇝ 15/2 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 29/4 ⇜ (239/32 → 479/64) ⇝ 15/2 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 29/4 ⇜ (239/32 → 479/64) ⇝ 15/2 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 29/4 ⇜ (239/32 → 479/64) ⇝ 15/2 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 29/4 ⇜ (479/64 → 15/2) | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 29/4 ⇜ (479/64 → 15/2) | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 29/4 ⇜ (479/64 → 15/2) | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 29/4 ⇜ (479/64 → 15/2) | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ (15/2 → 481/64) ⇝ 61/8 | note:C#5 gain:0.44 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ (15/2 → 481/64) ⇝ 61/8 | note:E5 gain:0.44 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ (15/2 → 481/64) ⇝ 31/4 | note:F#2 gain:0.44 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 15/2 ⇜ (481/64 → 241/32) ⇝ 61/8 | note:C#5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 15/2 ⇜ (481/64 → 241/32) ⇝ 61/8 | note:E5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 15/2 ⇜ (481/64 → 241/32) ⇝ 31/4 | note:F#2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 15/2 ⇜ (241/32 → 483/64) ⇝ 61/8 | note:C#5 gain:0.64 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 15/2 ⇜ (241/32 → 483/64) ⇝ 61/8 | note:E5 gain:0.64 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 15/2 ⇜ (241/32 → 483/64) ⇝ 31/4 | note:F#2 gain:0.64 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ (211/28 → 483/64) ⇝ 109/14 | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ (211/28 → 483/64) ⇝ 109/14 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ (211/28 → 483/64) ⇝ 109/14 | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ (211/28 → 483/64) ⇝ 109/14 | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 15/2 ⇜ (483/64 → 121/16) ⇝ 61/8 | note:C#5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 15/2 ⇜ (483/64 → 121/16) ⇝ 61/8 | note:E5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 15/2 ⇜ (483/64 → 121/16) ⇝ 31/4 | note:F#2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 211/28 ⇜ (483/64 → 121/16) ⇝ 109/14 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 211/28 ⇜ (483/64 → 121/16) ⇝ 109/14 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 211/28 ⇜ (483/64 → 121/16) ⇝ 109/14 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 211/28 ⇜ (483/64 → 121/16) ⇝ 109/14 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 15/2 ⇜ (121/16 → 485/64) ⇝ 61/8 | note:C#5 gain:0.44 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 15/2 ⇜ (121/16 → 485/64) ⇝ 61/8 | note:E5 gain:0.44 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 15/2 ⇜ (121/16 → 485/64) ⇝ 31/4 | note:F#2 gain:0.44 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 211/28 ⇜ (121/16 → 485/64) ⇝ 109/14 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 211/28 ⇜ (121/16 → 485/64) ⇝ 109/14 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 211/28 ⇜ (121/16 → 485/64) ⇝ 109/14 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 211/28 ⇜ (121/16 → 485/64) ⇝ 109/14 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 15/2 ⇜ (485/64 → 243/32) ⇝ 61/8 | note:C#5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 15/2 ⇜ (485/64 → 243/32) ⇝ 61/8 | note:E5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 15/2 ⇜ (485/64 → 243/32) ⇝ 31/4 | note:F#2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 211/28 ⇜ (485/64 → 243/32) ⇝ 109/14 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 211/28 ⇜ (485/64 → 243/32) ⇝ 109/14 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 211/28 ⇜ (485/64 → 243/32) ⇝ 109/14 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 211/28 ⇜ (485/64 → 243/32) ⇝ 109/14 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 15/2 ⇜ (243/32 → 487/64) ⇝ 61/8 | note:C#5 gain:0.24 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 15/2 ⇜ (243/32 → 487/64) ⇝ 61/8 | note:E5 gain:0.24 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 15/2 ⇜ (243/32 → 487/64) ⇝ 31/4 | note:F#2 gain:0.24 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 211/28 ⇜ (243/32 → 487/64) ⇝ 109/14 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 211/28 ⇜ (243/32 → 487/64) ⇝ 109/14 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 211/28 ⇜ (243/32 → 487/64) ⇝ 109/14 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 211/28 ⇜ (243/32 → 487/64) ⇝ 109/14 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 15/2 ⇜ (487/64 → 61/8) | note:C#5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 15/2 ⇜ (487/64 → 61/8) | note:E5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 15/2 ⇜ (487/64 → 61/8) ⇝ 31/4 | note:F#2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 211/28 ⇜ (487/64 → 61/8) ⇝ 109/14 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 211/28 ⇜ (487/64 → 61/8) ⇝ 109/14 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 211/28 ⇜ (487/64 → 61/8) ⇝ 109/14 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 211/28 ⇜ (487/64 → 61/8) ⇝ 109/14 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 15/2 ⇜ (61/8 → 489/64) ⇝ 31/4 | note:F#2 gain:0.44 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 211/28 ⇜ (61/8 → 489/64) ⇝ 109/14 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 211/28 ⇜ (61/8 → 489/64) ⇝ 109/14 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 211/28 ⇜ (61/8 → 489/64) ⇝ 109/14 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 211/28 ⇜ (61/8 → 489/64) ⇝ 109/14 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 15/2 ⇜ (489/64 → 245/32) ⇝ 31/4 | note:F#2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 211/28 ⇜ (489/64 → 245/32) ⇝ 109/14 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 211/28 ⇜ (489/64 → 245/32) ⇝ 109/14 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 211/28 ⇜ (489/64 → 245/32) ⇝ 109/14 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 211/28 ⇜ (489/64 → 245/32) ⇝ 109/14 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 15/2 ⇜ (245/32 → 491/64) ⇝ 31/4 | note:F#2 gain:0.64 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 211/28 ⇜ (245/32 → 491/64) ⇝ 109/14 | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 211/28 ⇜ (245/32 → 491/64) ⇝ 109/14 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 211/28 ⇜ (245/32 → 491/64) ⇝ 109/14 | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 211/28 ⇜ (245/32 → 491/64) ⇝ 109/14 | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 15/2 ⇜ (491/64 → 123/16) ⇝ 31/4 | note:F#2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 211/28 ⇜ (491/64 → 123/16) ⇝ 109/14 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 211/28 ⇜ (491/64 → 123/16) ⇝ 109/14 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 211/28 ⇜ (491/64 → 123/16) ⇝ 109/14 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 211/28 ⇜ (491/64 → 123/16) ⇝ 109/14 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 15/2 ⇜ (123/16 → 493/64) ⇝ 31/4 | note:F#2 gain:0.44 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 211/28 ⇜ (123/16 → 493/64) ⇝ 109/14 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 211/28 ⇜ (123/16 → 493/64) ⇝ 109/14 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 211/28 ⇜ (123/16 → 493/64) ⇝ 109/14 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 211/28 ⇜ (123/16 → 493/64) ⇝ 109/14 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 15/2 ⇜ (493/64 → 247/32) ⇝ 31/4 | note:F#2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 211/28 ⇜ (493/64 → 247/32) ⇝ 109/14 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 211/28 ⇜ (493/64 → 247/32) ⇝ 109/14 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 211/28 ⇜ (493/64 → 247/32) ⇝ 109/14 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 211/28 ⇜ (493/64 → 247/32) ⇝ 109/14 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 15/2 ⇜ (247/32 → 495/64) ⇝ 31/4 | note:F#2 gain:0.24 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 211/28 ⇜ (247/32 → 495/64) ⇝ 109/14 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 211/28 ⇜ (247/32 → 495/64) ⇝ 109/14 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 211/28 ⇜ (247/32 → 495/64) ⇝ 109/14 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 211/28 ⇜ (247/32 → 495/64) ⇝ 109/14 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 15/2 ⇜ (495/64 → 31/4) | note:F#2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 211/28 ⇜ (495/64 → 31/4) ⇝ 109/14 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 211/28 ⇜ (495/64 → 31/4) ⇝ 109/14 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 211/28 ⇜ (495/64 → 31/4) ⇝ 109/14 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 211/28 ⇜ (495/64 → 31/4) ⇝ 109/14 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 211/28 ⇜ (31/4 → 497/64) ⇝ 109/14 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 211/28 ⇜ (31/4 → 497/64) ⇝ 109/14 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 211/28 ⇜ (31/4 → 497/64) ⇝ 109/14 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 211/28 ⇜ (31/4 → 497/64) ⇝ 109/14 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ (31/4 → 497/64) ⇝ 63/8 | note:C#5 gain:0.44 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ (31/4 → 497/64) ⇝ 63/8 | note:E5 gain:0.44 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ (31/4 → 497/64) ⇝ 8/1 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ (31/4 → 497/64) ⇝ 8/1 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ (31/4 → 497/64) ⇝ 8/1 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (31/4 → 497/64) ⇝ 8/1 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 211/28 ⇜ (497/64 → 249/32) ⇝ 109/14 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 211/28 ⇜ (497/64 → 249/32) ⇝ 109/14 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 211/28 ⇜ (497/64 → 249/32) ⇝ 109/14 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 211/28 ⇜ (497/64 → 249/32) ⇝ 109/14 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 31/4 ⇜ (497/64 → 249/32) ⇝ 63/8 | note:C#5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 31/4 ⇜ (497/64 → 249/32) ⇝ 63/8 | note:E5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 31/4 ⇜ (497/64 → 249/32) ⇝ 8/1 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 31/4 ⇜ (497/64 → 249/32) ⇝ 8/1 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 31/4 ⇜ (497/64 → 249/32) ⇝ 8/1 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 31/4 ⇜ (497/64 → 249/32) ⇝ 8/1 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 211/28 ⇜ (249/32 → 109/14) | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 211/28 ⇜ (249/32 → 109/14) | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 211/28 ⇜ (249/32 → 109/14) | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 211/28 ⇜ (249/32 → 109/14) | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 31/4 ⇜ (249/32 → 499/64) ⇝ 63/8 | note:C#5 gain:0.64 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 31/4 ⇜ (249/32 → 499/64) ⇝ 63/8 | note:E5 gain:0.64 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 31/4 ⇜ (249/32 → 499/64) ⇝ 8/1 | note:Bb3 gain:0.32 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 31/4 ⇜ (249/32 → 499/64) ⇝ 8/1 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 31/4 ⇜ (249/32 → 499/64) ⇝ 8/1 | note:E4 gain:0.32 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 31/4 ⇜ (249/32 → 499/64) ⇝ 8/1 | note:Ab4 gain:0.32 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 31/4 ⇜ (499/64 → 125/16) ⇝ 63/8 | note:C#5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 31/4 ⇜ (499/64 → 125/16) ⇝ 63/8 | note:E5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 31/4 ⇜ (499/64 → 125/16) ⇝ 8/1 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 31/4 ⇜ (499/64 → 125/16) ⇝ 8/1 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 31/4 ⇜ (499/64 → 125/16) ⇝ 8/1 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 31/4 ⇜ (499/64 → 125/16) ⇝ 8/1 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 31/4 ⇜ (125/16 → 501/64) ⇝ 63/8 | note:C#5 gain:0.44 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 31/4 ⇜ (125/16 → 501/64) ⇝ 63/8 | note:E5 gain:0.44 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 31/4 ⇜ (125/16 → 501/64) ⇝ 8/1 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 31/4 ⇜ (125/16 → 501/64) ⇝ 8/1 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 31/4 ⇜ (125/16 → 501/64) ⇝ 8/1 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 31/4 ⇜ (125/16 → 501/64) ⇝ 8/1 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 31/4 ⇜ (501/64 → 251/32) ⇝ 63/8 | note:C#5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 31/4 ⇜ (501/64 → 251/32) ⇝ 63/8 | note:E5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 31/4 ⇜ (501/64 → 251/32) ⇝ 8/1 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 31/4 ⇜ (501/64 → 251/32) ⇝ 8/1 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 31/4 ⇜ (501/64 → 251/32) ⇝ 8/1 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 31/4 ⇜ (501/64 → 251/32) ⇝ 8/1 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 31/4 ⇜ (251/32 → 503/64) ⇝ 63/8 | note:C#5 gain:0.24 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 31/4 ⇜ (251/32 → 503/64) ⇝ 63/8 | note:E5 gain:0.24 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 31/4 ⇜ (251/32 → 503/64) ⇝ 8/1 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 31/4 ⇜ (251/32 → 503/64) ⇝ 8/1 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 31/4 ⇜ (251/32 → 503/64) ⇝ 8/1 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 31/4 ⇜ (251/32 → 503/64) ⇝ 8/1 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 31/4 ⇜ (503/64 → 63/8) | note:C#5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 31/4 ⇜ (503/64 → 63/8) | note:E5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 31/4 ⇜ (503/64 → 63/8) ⇝ 8/1 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 31/4 ⇜ (503/64 → 63/8) ⇝ 8/1 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 31/4 ⇜ (503/64 → 63/8) ⇝ 8/1 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 31/4 ⇜ (503/64 → 63/8) ⇝ 8/1 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 31/4 ⇜ (63/8 → 505/64) ⇝ 8/1 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 31/4 ⇜ (63/8 → 505/64) ⇝ 8/1 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 31/4 ⇜ (63/8 → 505/64) ⇝ 8/1 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 31/4 ⇜ (63/8 → 505/64) ⇝ 8/1 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 31/4 ⇜ (505/64 → 253/32) ⇝ 8/1 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 31/4 ⇜ (505/64 → 253/32) ⇝ 8/1 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 31/4 ⇜ (505/64 → 253/32) ⇝ 8/1 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 31/4 ⇜ (505/64 → 253/32) ⇝ 8/1 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 31/4 ⇜ (253/32 → 507/64) ⇝ 8/1 | note:Bb3 gain:0.32 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 31/4 ⇜ (253/32 → 507/64) ⇝ 8/1 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 31/4 ⇜ (253/32 → 507/64) ⇝ 8/1 | note:E4 gain:0.32 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 31/4 ⇜ (253/32 → 507/64) ⇝ 8/1 | note:Ab4 gain:0.32 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 31/4 ⇜ (507/64 → 127/16) ⇝ 8/1 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 31/4 ⇜ (507/64 → 127/16) ⇝ 8/1 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 31/4 ⇜ (507/64 → 127/16) ⇝ 8/1 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 31/4 ⇜ (507/64 → 127/16) ⇝ 8/1 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 31/4 ⇜ (127/16 → 509/64) ⇝ 8/1 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 31/4 ⇜ (127/16 → 509/64) ⇝ 8/1 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 31/4 ⇜ (127/16 → 509/64) ⇝ 8/1 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 31/4 ⇜ (127/16 → 509/64) ⇝ 8/1 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 31/4 ⇜ (509/64 → 255/32) ⇝ 8/1 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 31/4 ⇜ (509/64 → 255/32) ⇝ 8/1 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 31/4 ⇜ (509/64 → 255/32) ⇝ 8/1 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 31/4 ⇜ (509/64 → 255/32) ⇝ 8/1 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 31/4 ⇜ (255/32 → 511/64) ⇝ 8/1 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 31/4 ⇜ (255/32 → 511/64) ⇝ 8/1 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 31/4 ⇜ (255/32 → 511/64) ⇝ 8/1 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 31/4 ⇜ (255/32 → 511/64) ⇝ 8/1 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 31/4 ⇜ (511/64 → 8/1) | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 31/4 ⇜ (511/64 → 8/1) | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 31/4 ⇜ (511/64 → 8/1) | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 31/4 ⇜ (511/64 → 8/1) | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ (8/1 → 513/64) ⇝ 33/4 | note:C2 gain:0.44 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 8/1 ⇜ (513/64 → 257/32) ⇝ 33/4 | note:C2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 8/1 ⇜ (257/32 → 515/64) ⇝ 33/4 | note:C2 gain:0.64 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ (225/28 → 515/64) ⇝ 58/7 | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ (225/28 → 515/64) ⇝ 58/7 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ (225/28 → 515/64) ⇝ 58/7 | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ (225/28 → 515/64) ⇝ 58/7 | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 8/1 ⇜ (515/64 → 129/16) ⇝ 33/4 | note:C2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 225/28 ⇜ (515/64 → 129/16) ⇝ 58/7 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 225/28 ⇜ (515/64 → 129/16) ⇝ 58/7 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 225/28 ⇜ (515/64 → 129/16) ⇝ 58/7 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 225/28 ⇜ (515/64 → 129/16) ⇝ 58/7 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 8/1 ⇜ (129/16 → 517/64) ⇝ 33/4 | note:C2 gain:0.44 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 225/28 ⇜ (129/16 → 517/64) ⇝ 58/7 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 225/28 ⇜ (129/16 → 517/64) ⇝ 58/7 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 225/28 ⇜ (129/16 → 517/64) ⇝ 58/7 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 225/28 ⇜ (129/16 → 517/64) ⇝ 58/7 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 8/1 ⇜ (517/64 → 259/32) ⇝ 33/4 | note:C2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 225/28 ⇜ (517/64 → 259/32) ⇝ 58/7 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 225/28 ⇜ (517/64 → 259/32) ⇝ 58/7 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 225/28 ⇜ (517/64 → 259/32) ⇝ 58/7 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 225/28 ⇜ (517/64 → 259/32) ⇝ 58/7 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 8/1 ⇜ (259/32 → 519/64) ⇝ 33/4 | note:C2 gain:0.24 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 225/28 ⇜ (259/32 → 519/64) ⇝ 58/7 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 225/28 ⇜ (259/32 → 519/64) ⇝ 58/7 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 225/28 ⇜ (259/32 → 519/64) ⇝ 58/7 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 225/28 ⇜ (259/32 → 519/64) ⇝ 58/7 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 8/1 ⇜ (519/64 → 65/8) ⇝ 33/4 | note:C2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 225/28 ⇜ (519/64 → 65/8) ⇝ 58/7 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 225/28 ⇜ (519/64 → 65/8) ⇝ 58/7 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 225/28 ⇜ (519/64 → 65/8) ⇝ 58/7 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 225/28 ⇜ (519/64 → 65/8) ⇝ 58/7 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 8/1 ⇜ (65/8 → 521/64) ⇝ 33/4 | note:C2 gain:0.44 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 225/28 ⇜ (65/8 → 521/64) ⇝ 58/7 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 225/28 ⇜ (65/8 → 521/64) ⇝ 58/7 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 225/28 ⇜ (65/8 → 521/64) ⇝ 58/7 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 225/28 ⇜ (65/8 → 521/64) ⇝ 58/7 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ (65/8 → 521/64) ⇝ 33/4 | note:C4 gain:0.44 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ (65/8 → 521/64) ⇝ 33/4 | note:G4 gain:0.44 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ (65/8 → 521/64) ⇝ 33/4 | note:Bb4 gain:0.44 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 8/1 ⇜ (521/64 → 261/32) ⇝ 33/4 | note:C2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 225/28 ⇜ (521/64 → 261/32) ⇝ 58/7 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 225/28 ⇜ (521/64 → 261/32) ⇝ 58/7 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 225/28 ⇜ (521/64 → 261/32) ⇝ 58/7 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 225/28 ⇜ (521/64 → 261/32) ⇝ 58/7 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 65/8 ⇜ (521/64 → 261/32) ⇝ 33/4 | note:C4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 65/8 ⇜ (521/64 → 261/32) ⇝ 33/4 | note:G4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 65/8 ⇜ (521/64 → 261/32) ⇝ 33/4 | note:Bb4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 8/1 ⇜ (261/32 → 523/64) ⇝ 33/4 | note:C2 gain:0.64 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 225/28 ⇜ (261/32 → 523/64) ⇝ 58/7 | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 225/28 ⇜ (261/32 → 523/64) ⇝ 58/7 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 225/28 ⇜ (261/32 → 523/64) ⇝ 58/7 | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 225/28 ⇜ (261/32 → 523/64) ⇝ 58/7 | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 65/8 ⇜ (261/32 → 523/64) ⇝ 33/4 | note:C4 gain:0.64 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 65/8 ⇜ (261/32 → 523/64) ⇝ 33/4 | note:G4 gain:0.64 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 65/8 ⇜ (261/32 → 523/64) ⇝ 33/4 | note:Bb4 gain:0.64 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 8/1 ⇜ (523/64 → 131/16) ⇝ 33/4 | note:C2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 225/28 ⇜ (523/64 → 131/16) ⇝ 58/7 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 225/28 ⇜ (523/64 → 131/16) ⇝ 58/7 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 225/28 ⇜ (523/64 → 131/16) ⇝ 58/7 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 225/28 ⇜ (523/64 → 131/16) ⇝ 58/7 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 65/8 ⇜ (523/64 → 131/16) ⇝ 33/4 | note:C4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 65/8 ⇜ (523/64 → 131/16) ⇝ 33/4 | note:G4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 65/8 ⇜ (523/64 → 131/16) ⇝ 33/4 | note:Bb4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 8/1 ⇜ (131/16 → 525/64) ⇝ 33/4 | note:C2 gain:0.44 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 225/28 ⇜ (131/16 → 525/64) ⇝ 58/7 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 225/28 ⇜ (131/16 → 525/64) ⇝ 58/7 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 225/28 ⇜ (131/16 → 525/64) ⇝ 58/7 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 225/28 ⇜ (131/16 → 525/64) ⇝ 58/7 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 65/8 ⇜ (131/16 → 525/64) ⇝ 33/4 | note:C4 gain:0.44 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 65/8 ⇜ (131/16 → 525/64) ⇝ 33/4 | note:G4 gain:0.44 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 65/8 ⇜ (131/16 → 525/64) ⇝ 33/4 | note:Bb4 gain:0.44 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 8/1 ⇜ (525/64 → 263/32) ⇝ 33/4 | note:C2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 225/28 ⇜ (525/64 → 263/32) ⇝ 58/7 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 225/28 ⇜ (525/64 → 263/32) ⇝ 58/7 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 225/28 ⇜ (525/64 → 263/32) ⇝ 58/7 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 225/28 ⇜ (525/64 → 263/32) ⇝ 58/7 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 65/8 ⇜ (525/64 → 263/32) ⇝ 33/4 | note:C4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 65/8 ⇜ (525/64 → 263/32) ⇝ 33/4 | note:G4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 65/8 ⇜ (525/64 → 263/32) ⇝ 33/4 | note:Bb4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 8/1 ⇜ (263/32 → 527/64) ⇝ 33/4 | note:C2 gain:0.24 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 225/28 ⇜ (263/32 → 527/64) ⇝ 58/7 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 225/28 ⇜ (263/32 → 527/64) ⇝ 58/7 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 225/28 ⇜ (263/32 → 527/64) ⇝ 58/7 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 225/28 ⇜ (263/32 → 527/64) ⇝ 58/7 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 65/8 ⇜ (263/32 → 527/64) ⇝ 33/4 | note:C4 gain:0.24 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 65/8 ⇜ (263/32 → 527/64) ⇝ 33/4 | note:G4 gain:0.24 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 65/8 ⇜ (263/32 → 527/64) ⇝ 33/4 | note:Bb4 gain:0.24 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 8/1 ⇜ (527/64 → 33/4) | note:C2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 225/28 ⇜ (527/64 → 33/4) ⇝ 58/7 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 225/28 ⇜ (527/64 → 33/4) ⇝ 58/7 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 225/28 ⇜ (527/64 → 33/4) ⇝ 58/7 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 225/28 ⇜ (527/64 → 33/4) ⇝ 58/7 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 65/8 ⇜ (527/64 → 33/4) | note:C4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 65/8 ⇜ (527/64 → 33/4) | note:G4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 65/8 ⇜ (527/64 → 33/4) | note:Bb4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 225/28 ⇜ (33/4 → 529/64) ⇝ 58/7 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 225/28 ⇜ (33/4 → 529/64) ⇝ 58/7 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 225/28 ⇜ (33/4 → 529/64) ⇝ 58/7 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 225/28 ⇜ (33/4 → 529/64) ⇝ 58/7 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 225/28 ⇜ (529/64 → 265/32) ⇝ 58/7 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 225/28 ⇜ (529/64 → 265/32) ⇝ 58/7 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 225/28 ⇜ (529/64 → 265/32) ⇝ 58/7 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 225/28 ⇜ (529/64 → 265/32) ⇝ 58/7 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 225/28 ⇜ (265/32 → 58/7) | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 225/28 ⇜ (265/32 → 58/7) | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 225/28 ⇜ (265/32 → 58/7) | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 225/28 ⇜ (265/32 → 58/7) | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ (17/2 → 545/64) ⇝ 69/8 | note:G4 gain:0.44 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ (17/2 → 545/64) ⇝ 69/8 | note:D5 gain:0.44 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ (17/2 → 545/64) ⇝ 69/8 | note:F5 gain:0.44 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ (17/2 → 545/64) ⇝ 35/4 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ (17/2 → 545/64) ⇝ 35/4 | note:D4 gain:0.22 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ (17/2 → 545/64) ⇝ 35/4 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ (17/2 → 545/64) ⇝ 35/4 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ (17/2 → 545/64) ⇝ 35/4 | note:C2 gain:0.44 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 17/2 ⇜ (545/64 → 273/32) ⇝ 69/8 | note:G4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 17/2 ⇜ (545/64 → 273/32) ⇝ 69/8 | note:D5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 17/2 ⇜ (545/64 → 273/32) ⇝ 69/8 | note:F5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 17/2 ⇜ (545/64 → 273/32) ⇝ 35/4 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 17/2 ⇜ (545/64 → 273/32) ⇝ 35/4 | note:D4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 17/2 ⇜ (545/64 → 273/32) ⇝ 35/4 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 17/2 ⇜ (545/64 → 273/32) ⇝ 35/4 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 17/2 ⇜ (545/64 → 273/32) ⇝ 35/4 | note:C2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 17/2 ⇜ (273/32 → 547/64) ⇝ 69/8 | note:G4 gain:0.64 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 17/2 ⇜ (273/32 → 547/64) ⇝ 69/8 | note:D5 gain:0.64 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 17/2 ⇜ (273/32 → 547/64) ⇝ 69/8 | note:F5 gain:0.64 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 17/2 ⇜ (273/32 → 547/64) ⇝ 35/4 | note:Bb3 gain:0.32 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 17/2 ⇜ (273/32 → 547/64) ⇝ 35/4 | note:D4 gain:0.32 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 17/2 ⇜ (273/32 → 547/64) ⇝ 35/4 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 17/2 ⇜ (273/32 → 547/64) ⇝ 35/4 | note:G4 gain:0.32 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 17/2 ⇜ (273/32 → 547/64) ⇝ 35/4 | note:C2 gain:0.64 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 17/2 ⇜ (547/64 → 137/16) ⇝ 69/8 | note:G4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 17/2 ⇜ (547/64 → 137/16) ⇝ 69/8 | note:D5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 17/2 ⇜ (547/64 → 137/16) ⇝ 69/8 | note:F5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 17/2 ⇜ (547/64 → 137/16) ⇝ 35/4 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 17/2 ⇜ (547/64 → 137/16) ⇝ 35/4 | note:D4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 17/2 ⇜ (547/64 → 137/16) ⇝ 35/4 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 17/2 ⇜ (547/64 → 137/16) ⇝ 35/4 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 17/2 ⇜ (547/64 → 137/16) ⇝ 35/4 | note:C2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 17/2 ⇜ (137/16 → 549/64) ⇝ 69/8 | note:G4 gain:0.44 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 17/2 ⇜ (137/16 → 549/64) ⇝ 69/8 | note:D5 gain:0.44 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 17/2 ⇜ (137/16 → 549/64) ⇝ 69/8 | note:F5 gain:0.44 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 17/2 ⇜ (137/16 → 549/64) ⇝ 35/4 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 17/2 ⇜ (137/16 → 549/64) ⇝ 35/4 | note:D4 gain:0.22 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 17/2 ⇜ (137/16 → 549/64) ⇝ 35/4 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 17/2 ⇜ (137/16 → 549/64) ⇝ 35/4 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 17/2 ⇜ (137/16 → 549/64) ⇝ 35/4 | note:C2 gain:0.44 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 17/2 ⇜ (549/64 → 275/32) ⇝ 69/8 | note:G4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 17/2 ⇜ (549/64 → 275/32) ⇝ 69/8 | note:D5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 17/2 ⇜ (549/64 → 275/32) ⇝ 69/8 | note:F5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 17/2 ⇜ (549/64 → 275/32) ⇝ 35/4 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 17/2 ⇜ (549/64 → 275/32) ⇝ 35/4 | note:D4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 17/2 ⇜ (549/64 → 275/32) ⇝ 35/4 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 17/2 ⇜ (549/64 → 275/32) ⇝ 35/4 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 17/2 ⇜ (549/64 → 275/32) ⇝ 35/4 | note:C2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 17/2 ⇜ (275/32 → 551/64) ⇝ 69/8 | note:G4 gain:0.24 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 17/2 ⇜ (275/32 → 551/64) ⇝ 69/8 | note:D5 gain:0.24 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 17/2 ⇜ (275/32 → 551/64) ⇝ 69/8 | note:F5 gain:0.24 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 17/2 ⇜ (275/32 → 551/64) ⇝ 35/4 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 17/2 ⇜ (275/32 → 551/64) ⇝ 35/4 | note:D4 gain:0.12 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 17/2 ⇜ (275/32 → 551/64) ⇝ 35/4 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 17/2 ⇜ (275/32 → 551/64) ⇝ 35/4 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 17/2 ⇜ (275/32 → 551/64) ⇝ 35/4 | note:C2 gain:0.24 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 17/2 ⇜ (551/64 → 69/8) | note:G4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 17/2 ⇜ (551/64 → 69/8) | note:D5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 17/2 ⇜ (551/64 → 69/8) | note:F5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 17/2 ⇜ (551/64 → 69/8) ⇝ 35/4 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 17/2 ⇜ (551/64 → 69/8) ⇝ 35/4 | note:D4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 17/2 ⇜ (551/64 → 69/8) ⇝ 35/4 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 17/2 ⇜ (551/64 → 69/8) ⇝ 35/4 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 17/2 ⇜ (551/64 → 69/8) ⇝ 35/4 | note:C2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 17/2 ⇜ (69/8 → 553/64) ⇝ 35/4 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 17/2 ⇜ (69/8 → 553/64) ⇝ 35/4 | note:D4 gain:0.22 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 17/2 ⇜ (69/8 → 553/64) ⇝ 35/4 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 17/2 ⇜ (69/8 → 553/64) ⇝ 35/4 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 17/2 ⇜ (69/8 → 553/64) ⇝ 35/4 | note:C2 gain:0.44 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 17/2 ⇜ (553/64 → 277/32) ⇝ 35/4 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 17/2 ⇜ (553/64 → 277/32) ⇝ 35/4 | note:D4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 17/2 ⇜ (553/64 → 277/32) ⇝ 35/4 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 17/2 ⇜ (553/64 → 277/32) ⇝ 35/4 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 17/2 ⇜ (553/64 → 277/32) ⇝ 35/4 | note:C2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 17/2 ⇜ (277/32 → 555/64) ⇝ 35/4 | note:Bb3 gain:0.32 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 17/2 ⇜ (277/32 → 555/64) ⇝ 35/4 | note:D4 gain:0.32 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 17/2 ⇜ (277/32 → 555/64) ⇝ 35/4 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 17/2 ⇜ (277/32 → 555/64) ⇝ 35/4 | note:G4 gain:0.32 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 17/2 ⇜ (277/32 → 555/64) ⇝ 35/4 | note:C2 gain:0.64 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 17/2 ⇜ (555/64 → 139/16) ⇝ 35/4 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 17/2 ⇜ (555/64 → 139/16) ⇝ 35/4 | note:D4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 17/2 ⇜ (555/64 → 139/16) ⇝ 35/4 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 17/2 ⇜ (555/64 → 139/16) ⇝ 35/4 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 17/2 ⇜ (555/64 → 139/16) ⇝ 35/4 | note:C2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 17/2 ⇜ (139/16 → 557/64) ⇝ 35/4 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 17/2 ⇜ (139/16 → 557/64) ⇝ 35/4 | note:D4 gain:0.22 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 17/2 ⇜ (139/16 → 557/64) ⇝ 35/4 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 17/2 ⇜ (139/16 → 557/64) ⇝ 35/4 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 17/2 ⇜ (139/16 → 557/64) ⇝ 35/4 | note:C2 gain:0.44 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 17/2 ⇜ (557/64 → 279/32) ⇝ 35/4 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 17/2 ⇜ (557/64 → 279/32) ⇝ 35/4 | note:D4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 17/2 ⇜ (557/64 → 279/32) ⇝ 35/4 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 17/2 ⇜ (557/64 → 279/32) ⇝ 35/4 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 17/2 ⇜ (557/64 → 279/32) ⇝ 35/4 | note:C2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 17/2 ⇜ (279/32 → 559/64) ⇝ 35/4 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 17/2 ⇜ (279/32 → 559/64) ⇝ 35/4 | note:D4 gain:0.12 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 17/2 ⇜ (279/32 → 559/64) ⇝ 35/4 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 17/2 ⇜ (279/32 → 559/64) ⇝ 35/4 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 17/2 ⇜ (279/32 → 559/64) ⇝ 35/4 | note:C2 gain:0.24 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 17/2 ⇜ (559/64 → 35/4) | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 17/2 ⇜ (559/64 → 35/4) | note:D4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 17/2 ⇜ (559/64 → 35/4) | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 17/2 ⇜ (559/64 → 35/4) | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 17/2 ⇜ (559/64 → 35/4) | note:C2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ (35/4 → 561/64) ⇝ 71/8 | note:C4 gain:0.44 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ (35/4 → 561/64) ⇝ 71/8 | note:G4 gain:0.44 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ (35/4 → 561/64) ⇝ 71/8 | note:Bb4 gain:0.44 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 35/4 ⇜ (561/64 → 281/32) ⇝ 71/8 | note:C4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 35/4 ⇜ (561/64 → 281/32) ⇝ 71/8 | note:G4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 35/4 ⇜ (561/64 → 281/32) ⇝ 71/8 | note:Bb4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 35/4 ⇜ (281/32 → 563/64) ⇝ 71/8 | note:C4 gain:0.64 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 35/4 ⇜ (281/32 → 563/64) ⇝ 71/8 | note:G4 gain:0.64 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 35/4 ⇜ (281/32 → 563/64) ⇝ 71/8 | note:Bb4 gain:0.64 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ (123/14 → 563/64) ⇝ 253/28 | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ (123/14 → 563/64) ⇝ 253/28 | note:74 gain:0.064 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ (123/14 → 563/64) ⇝ 253/28 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ (123/14 → 563/64) ⇝ 253/28 | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 35/4 ⇜ (563/64 → 141/16) ⇝ 71/8 | note:C4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 35/4 ⇜ (563/64 → 141/16) ⇝ 71/8 | note:G4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 35/4 ⇜ (563/64 → 141/16) ⇝ 71/8 | note:Bb4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 123/14 ⇜ (563/64 → 141/16) ⇝ 253/28 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 123/14 ⇜ (563/64 → 141/16) ⇝ 253/28 | note:74 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 123/14 ⇜ (563/64 → 141/16) ⇝ 253/28 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 123/14 ⇜ (563/64 → 141/16) ⇝ 253/28 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 35/4 ⇜ (141/16 → 565/64) ⇝ 71/8 | note:C4 gain:0.44 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 35/4 ⇜ (141/16 → 565/64) ⇝ 71/8 | note:G4 gain:0.44 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 35/4 ⇜ (141/16 → 565/64) ⇝ 71/8 | note:Bb4 gain:0.44 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 123/14 ⇜ (141/16 → 565/64) ⇝ 253/28 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 123/14 ⇜ (141/16 → 565/64) ⇝ 253/28 | note:74 gain:0.044 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 123/14 ⇜ (141/16 → 565/64) ⇝ 253/28 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 123/14 ⇜ (141/16 → 565/64) ⇝ 253/28 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 35/4 ⇜ (565/64 → 283/32) ⇝ 71/8 | note:C4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 35/4 ⇜ (565/64 → 283/32) ⇝ 71/8 | note:G4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 35/4 ⇜ (565/64 → 283/32) ⇝ 71/8 | note:Bb4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 123/14 ⇜ (565/64 → 283/32) ⇝ 253/28 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 123/14 ⇜ (565/64 → 283/32) ⇝ 253/28 | note:74 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 123/14 ⇜ (565/64 → 283/32) ⇝ 253/28 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 123/14 ⇜ (565/64 → 283/32) ⇝ 253/28 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 35/4 ⇜ (283/32 → 567/64) ⇝ 71/8 | note:C4 gain:0.24 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 35/4 ⇜ (283/32 → 567/64) ⇝ 71/8 | note:G4 gain:0.24 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 35/4 ⇜ (283/32 → 567/64) ⇝ 71/8 | note:Bb4 gain:0.24 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 123/14 ⇜ (283/32 → 567/64) ⇝ 253/28 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 123/14 ⇜ (283/32 → 567/64) ⇝ 253/28 | note:74 gain:0.024 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 123/14 ⇜ (283/32 → 567/64) ⇝ 253/28 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 123/14 ⇜ (283/32 → 567/64) ⇝ 253/28 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 35/4 ⇜ (567/64 → 71/8) | note:C4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 35/4 ⇜ (567/64 → 71/8) | note:G4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 35/4 ⇜ (567/64 → 71/8) | note:Bb4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 123/14 ⇜ (567/64 → 71/8) ⇝ 253/28 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 123/14 ⇜ (567/64 → 71/8) ⇝ 253/28 | note:74 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 123/14 ⇜ (567/64 → 71/8) ⇝ 253/28 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 123/14 ⇜ (567/64 → 71/8) ⇝ 253/28 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 123/14 ⇜ (71/8 → 569/64) ⇝ 253/28 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 123/14 ⇜ (71/8 → 569/64) ⇝ 253/28 | note:74 gain:0.044 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 123/14 ⇜ (71/8 → 569/64) ⇝ 253/28 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 123/14 ⇜ (71/8 → 569/64) ⇝ 253/28 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 123/14 ⇜ (569/64 → 285/32) ⇝ 253/28 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 123/14 ⇜ (569/64 → 285/32) ⇝ 253/28 | note:74 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 123/14 ⇜ (569/64 → 285/32) ⇝ 253/28 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 123/14 ⇜ (569/64 → 285/32) ⇝ 253/28 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 123/14 ⇜ (285/32 → 571/64) ⇝ 253/28 | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 123/14 ⇜ (285/32 → 571/64) ⇝ 253/28 | note:74 gain:0.064 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 123/14 ⇜ (285/32 → 571/64) ⇝ 253/28 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 123/14 ⇜ (285/32 → 571/64) ⇝ 253/28 | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 123/14 ⇜ (571/64 → 143/16) ⇝ 253/28 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 123/14 ⇜ (571/64 → 143/16) ⇝ 253/28 | note:74 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 123/14 ⇜ (571/64 → 143/16) ⇝ 253/28 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 123/14 ⇜ (571/64 → 143/16) ⇝ 253/28 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 123/14 ⇜ (143/16 → 573/64) ⇝ 253/28 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 123/14 ⇜ (143/16 → 573/64) ⇝ 253/28 | note:74 gain:0.044 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 123/14 ⇜ (143/16 → 573/64) ⇝ 253/28 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 123/14 ⇜ (143/16 → 573/64) ⇝ 253/28 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 123/14 ⇜ (573/64 → 287/32) ⇝ 253/28 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 123/14 ⇜ (573/64 → 287/32) ⇝ 253/28 | note:74 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 123/14 ⇜ (573/64 → 287/32) ⇝ 253/28 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 123/14 ⇜ (573/64 → 287/32) ⇝ 253/28 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 123/14 ⇜ (287/32 → 575/64) ⇝ 253/28 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 123/14 ⇜ (287/32 → 575/64) ⇝ 253/28 | note:74 gain:0.024 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 123/14 ⇜ (287/32 → 575/64) ⇝ 253/28 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 123/14 ⇜ (287/32 → 575/64) ⇝ 253/28 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 123/14 ⇜ (575/64 → 9/1) ⇝ 253/28 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 123/14 ⇜ (575/64 → 9/1) ⇝ 253/28 | note:74 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 123/14 ⇜ (575/64 → 9/1) ⇝ 253/28 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 123/14 ⇜ (575/64 → 9/1) ⇝ 253/28 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 123/14 ⇜ (9/1 → 577/64) ⇝ 253/28 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 123/14 ⇜ (9/1 → 577/64) ⇝ 253/28 | note:74 gain:0.044 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 123/14 ⇜ (9/1 → 577/64) ⇝ 253/28 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 123/14 ⇜ (9/1 → 577/64) ⇝ 253/28 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ (9/1 → 577/64) ⇝ 37/4 | note:C2 gain:0.44 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 123/14 ⇜ (577/64 → 289/32) ⇝ 253/28 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 123/14 ⇜ (577/64 → 289/32) ⇝ 253/28 | note:74 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 123/14 ⇜ (577/64 → 289/32) ⇝ 253/28 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 123/14 ⇜ (577/64 → 289/32) ⇝ 253/28 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 9/1 ⇜ (577/64 → 289/32) ⇝ 37/4 | note:C2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 123/14 ⇜ (289/32 → 253/28) | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 123/14 ⇜ (289/32 → 253/28) | note:74 gain:0.064 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 123/14 ⇜ (289/32 → 253/28) | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 123/14 ⇜ (289/32 → 253/28) | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 9/1 ⇜ (289/32 → 579/64) ⇝ 37/4 | note:C2 gain:0.64 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 9/1 ⇜ (579/64 → 145/16) ⇝ 37/4 | note:C2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 9/1 ⇜ (145/16 → 581/64) ⇝ 37/4 | note:C2 gain:0.44 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 9/1 ⇜ (581/64 → 291/32) ⇝ 37/4 | note:C2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 9/1 ⇜ (291/32 → 583/64) ⇝ 37/4 | note:C2 gain:0.24 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 9/1 ⇜ (583/64 → 73/8) ⇝ 37/4 | note:C2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 9/1 ⇜ (73/8 → 585/64) ⇝ 37/4 | note:C2 gain:0.44 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ (73/8 → 585/64) ⇝ 37/4 | note:C4 gain:0.44 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ (73/8 → 585/64) ⇝ 37/4 | note:G4 gain:0.44 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ (73/8 → 585/64) ⇝ 37/4 | note:Bb4 gain:0.44 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 9/1 ⇜ (585/64 → 293/32) ⇝ 37/4 | note:C2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 73/8 ⇜ (585/64 → 293/32) ⇝ 37/4 | note:C4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 73/8 ⇜ (585/64 → 293/32) ⇝ 37/4 | note:G4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 73/8 ⇜ (585/64 → 293/32) ⇝ 37/4 | note:Bb4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 9/1 ⇜ (293/32 → 587/64) ⇝ 37/4 | note:C2 gain:0.64 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 73/8 ⇜ (293/32 → 587/64) ⇝ 37/4 | note:C4 gain:0.64 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 73/8 ⇜ (293/32 → 587/64) ⇝ 37/4 | note:G4 gain:0.64 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 73/8 ⇜ (293/32 → 587/64) ⇝ 37/4 | note:Bb4 gain:0.64 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 9/1 ⇜ (587/64 → 147/16) ⇝ 37/4 | note:C2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 73/8 ⇜ (587/64 → 147/16) ⇝ 37/4 | note:C4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 73/8 ⇜ (587/64 → 147/16) ⇝ 37/4 | note:G4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 73/8 ⇜ (587/64 → 147/16) ⇝ 37/4 | note:Bb4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 9/1 ⇜ (147/16 → 589/64) ⇝ 37/4 | note:C2 gain:0.44 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 73/8 ⇜ (147/16 → 589/64) ⇝ 37/4 | note:C4 gain:0.44 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 73/8 ⇜ (147/16 → 589/64) ⇝ 37/4 | note:G4 gain:0.44 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 73/8 ⇜ (147/16 → 589/64) ⇝ 37/4 | note:Bb4 gain:0.44 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 9/1 ⇜ (589/64 → 295/32) ⇝ 37/4 | note:C2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 73/8 ⇜ (589/64 → 295/32) ⇝ 37/4 | note:C4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 73/8 ⇜ (589/64 → 295/32) ⇝ 37/4 | note:G4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 73/8 ⇜ (589/64 → 295/32) ⇝ 37/4 | note:Bb4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 9/1 ⇜ (295/32 → 591/64) ⇝ 37/4 | note:C2 gain:0.24 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 73/8 ⇜ (295/32 → 591/64) ⇝ 37/4 | note:C4 gain:0.24 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 73/8 ⇜ (295/32 → 591/64) ⇝ 37/4 | note:G4 gain:0.24 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 73/8 ⇜ (295/32 → 591/64) ⇝ 37/4 | note:Bb4 gain:0.24 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 9/1 ⇜ (591/64 → 37/4) | note:C2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 73/8 ⇜ (591/64 → 37/4) | note:C4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.527777777778 ]", + "[ 73/8 ⇜ (591/64 → 37/4) | note:G4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 73/8 ⇜ (591/64 → 37/4) | note:Bb4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ (37/4 → 593/64) ⇝ 19/2 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ (37/4 → 593/64) ⇝ 19/2 | note:D4 gain:0.22 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ (37/4 → 593/64) ⇝ 19/2 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ (37/4 → 593/64) ⇝ 19/2 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 37/4 ⇜ (593/64 → 297/32) ⇝ 19/2 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 37/4 ⇜ (593/64 → 297/32) ⇝ 19/2 | note:D4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 37/4 ⇜ (593/64 → 297/32) ⇝ 19/2 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 37/4 ⇜ (593/64 → 297/32) ⇝ 19/2 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 37/4 ⇜ (297/32 → 595/64) ⇝ 19/2 | note:Bb3 gain:0.32 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 37/4 ⇜ (297/32 → 595/64) ⇝ 19/2 | note:D4 gain:0.32 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 37/4 ⇜ (297/32 → 595/64) ⇝ 19/2 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 37/4 ⇜ (297/32 → 595/64) ⇝ 19/2 | note:G4 gain:0.32 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 37/4 ⇜ (595/64 → 149/16) ⇝ 19/2 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 37/4 ⇜ (595/64 → 149/16) ⇝ 19/2 | note:D4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 37/4 ⇜ (595/64 → 149/16) ⇝ 19/2 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 37/4 ⇜ (595/64 → 149/16) ⇝ 19/2 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 37/4 ⇜ (149/16 → 597/64) ⇝ 19/2 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 37/4 ⇜ (149/16 → 597/64) ⇝ 19/2 | note:D4 gain:0.22 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 37/4 ⇜ (149/16 → 597/64) ⇝ 19/2 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 37/4 ⇜ (149/16 → 597/64) ⇝ 19/2 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 37/4 ⇜ (597/64 → 299/32) ⇝ 19/2 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 37/4 ⇜ (597/64 → 299/32) ⇝ 19/2 | note:D4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 37/4 ⇜ (597/64 → 299/32) ⇝ 19/2 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 37/4 ⇜ (597/64 → 299/32) ⇝ 19/2 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 37/4 ⇜ (299/32 → 599/64) ⇝ 19/2 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 37/4 ⇜ (299/32 → 599/64) ⇝ 19/2 | note:D4 gain:0.12 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 37/4 ⇜ (299/32 → 599/64) ⇝ 19/2 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 37/4 ⇜ (299/32 → 599/64) ⇝ 19/2 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 37/4 ⇜ (599/64 → 75/8) ⇝ 19/2 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 37/4 ⇜ (599/64 → 75/8) ⇝ 19/2 | note:D4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 37/4 ⇜ (599/64 → 75/8) ⇝ 19/2 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 37/4 ⇜ (599/64 → 75/8) ⇝ 19/2 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 37/4 ⇜ (75/8 → 601/64) ⇝ 19/2 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 37/4 ⇜ (75/8 → 601/64) ⇝ 19/2 | note:D4 gain:0.22 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 37/4 ⇜ (75/8 → 601/64) ⇝ 19/2 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 37/4 ⇜ (75/8 → 601/64) ⇝ 19/2 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 37/4 ⇜ (601/64 → 301/32) ⇝ 19/2 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 37/4 ⇜ (601/64 → 301/32) ⇝ 19/2 | note:D4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 37/4 ⇜ (601/64 → 301/32) ⇝ 19/2 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 37/4 ⇜ (601/64 → 301/32) ⇝ 19/2 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 37/4 ⇜ (301/32 → 603/64) ⇝ 19/2 | note:Bb3 gain:0.32 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 37/4 ⇜ (301/32 → 603/64) ⇝ 19/2 | note:D4 gain:0.32 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 37/4 ⇜ (301/32 → 603/64) ⇝ 19/2 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 37/4 ⇜ (301/32 → 603/64) ⇝ 19/2 | note:G4 gain:0.32 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 37/4 ⇜ (603/64 → 151/16) ⇝ 19/2 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 37/4 ⇜ (603/64 → 151/16) ⇝ 19/2 | note:D4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 37/4 ⇜ (603/64 → 151/16) ⇝ 19/2 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 37/4 ⇜ (603/64 → 151/16) ⇝ 19/2 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 37/4 ⇜ (151/16 → 605/64) ⇝ 19/2 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 37/4 ⇜ (151/16 → 605/64) ⇝ 19/2 | note:D4 gain:0.22 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 37/4 ⇜ (151/16 → 605/64) ⇝ 19/2 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 37/4 ⇜ (151/16 → 605/64) ⇝ 19/2 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 37/4 ⇜ (605/64 → 303/32) ⇝ 19/2 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 37/4 ⇜ (605/64 → 303/32) ⇝ 19/2 | note:D4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 37/4 ⇜ (605/64 → 303/32) ⇝ 19/2 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 37/4 ⇜ (605/64 → 303/32) ⇝ 19/2 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 37/4 ⇜ (303/32 → 607/64) ⇝ 19/2 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 37/4 ⇜ (303/32 → 607/64) ⇝ 19/2 | note:D4 gain:0.12 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 37/4 ⇜ (303/32 → 607/64) ⇝ 19/2 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 37/4 ⇜ (303/32 → 607/64) ⇝ 19/2 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 37/4 ⇜ (607/64 → 19/2) | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 37/4 ⇜ (607/64 → 19/2) | note:D4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 37/4 ⇜ (607/64 → 19/2) | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 37/4 ⇜ (607/64 → 19/2) | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ (19/2 → 609/64) ⇝ 77/8 | note:G4 gain:0.44 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ (19/2 → 609/64) ⇝ 77/8 | note:D5 gain:0.44 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ (19/2 → 609/64) ⇝ 77/8 | note:F5 gain:0.44 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ (19/2 → 609/64) ⇝ 39/4 | note:C2 gain:0.44 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 19/2 ⇜ (609/64 → 305/32) ⇝ 77/8 | note:G4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 19/2 ⇜ (609/64 → 305/32) ⇝ 77/8 | note:D5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 19/2 ⇜ (609/64 → 305/32) ⇝ 77/8 | note:F5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 19/2 ⇜ (609/64 → 305/32) ⇝ 39/4 | note:C2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 19/2 ⇜ (305/32 → 611/64) ⇝ 77/8 | note:G4 gain:0.64 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 19/2 ⇜ (305/32 → 611/64) ⇝ 77/8 | note:D5 gain:0.64 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 19/2 ⇜ (305/32 → 611/64) ⇝ 77/8 | note:F5 gain:0.64 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 19/2 ⇜ (305/32 → 611/64) ⇝ 39/4 | note:C2 gain:0.64 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ (267/28 → 611/64) ⇝ 137/14 | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ (267/28 → 611/64) ⇝ 137/14 | note:74 gain:0.064 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ (267/28 → 611/64) ⇝ 137/14 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ (267/28 → 611/64) ⇝ 137/14 | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 19/2 ⇜ (611/64 → 153/16) ⇝ 77/8 | note:G4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 19/2 ⇜ (611/64 → 153/16) ⇝ 77/8 | note:D5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 19/2 ⇜ (611/64 → 153/16) ⇝ 77/8 | note:F5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 19/2 ⇜ (611/64 → 153/16) ⇝ 39/4 | note:C2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 267/28 ⇜ (611/64 → 153/16) ⇝ 137/14 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 267/28 ⇜ (611/64 → 153/16) ⇝ 137/14 | note:74 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 267/28 ⇜ (611/64 → 153/16) ⇝ 137/14 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 267/28 ⇜ (611/64 → 153/16) ⇝ 137/14 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 19/2 ⇜ (153/16 → 613/64) ⇝ 77/8 | note:G4 gain:0.44 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 19/2 ⇜ (153/16 → 613/64) ⇝ 77/8 | note:D5 gain:0.44 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 19/2 ⇜ (153/16 → 613/64) ⇝ 77/8 | note:F5 gain:0.44 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 19/2 ⇜ (153/16 → 613/64) ⇝ 39/4 | note:C2 gain:0.44 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 267/28 ⇜ (153/16 → 613/64) ⇝ 137/14 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 267/28 ⇜ (153/16 → 613/64) ⇝ 137/14 | note:74 gain:0.044 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 267/28 ⇜ (153/16 → 613/64) ⇝ 137/14 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 267/28 ⇜ (153/16 → 613/64) ⇝ 137/14 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 19/2 ⇜ (613/64 → 307/32) ⇝ 77/8 | note:G4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 19/2 ⇜ (613/64 → 307/32) ⇝ 77/8 | note:D5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 19/2 ⇜ (613/64 → 307/32) ⇝ 77/8 | note:F5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 19/2 ⇜ (613/64 → 307/32) ⇝ 39/4 | note:C2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 267/28 ⇜ (613/64 → 307/32) ⇝ 137/14 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 267/28 ⇜ (613/64 → 307/32) ⇝ 137/14 | note:74 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 267/28 ⇜ (613/64 → 307/32) ⇝ 137/14 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 267/28 ⇜ (613/64 → 307/32) ⇝ 137/14 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 19/2 ⇜ (307/32 → 615/64) ⇝ 77/8 | note:G4 gain:0.24 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 19/2 ⇜ (307/32 → 615/64) ⇝ 77/8 | note:D5 gain:0.24 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 19/2 ⇜ (307/32 → 615/64) ⇝ 77/8 | note:F5 gain:0.24 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 19/2 ⇜ (307/32 → 615/64) ⇝ 39/4 | note:C2 gain:0.24 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 267/28 ⇜ (307/32 → 615/64) ⇝ 137/14 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 267/28 ⇜ (307/32 → 615/64) ⇝ 137/14 | note:74 gain:0.024 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 267/28 ⇜ (307/32 → 615/64) ⇝ 137/14 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 267/28 ⇜ (307/32 → 615/64) ⇝ 137/14 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 19/2 ⇜ (615/64 → 77/8) | note:G4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 19/2 ⇜ (615/64 → 77/8) | note:D5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 19/2 ⇜ (615/64 → 77/8) | note:F5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 19/2 ⇜ (615/64 → 77/8) ⇝ 39/4 | note:C2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 267/28 ⇜ (615/64 → 77/8) ⇝ 137/14 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 267/28 ⇜ (615/64 → 77/8) ⇝ 137/14 | note:74 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 267/28 ⇜ (615/64 → 77/8) ⇝ 137/14 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 267/28 ⇜ (615/64 → 77/8) ⇝ 137/14 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 19/2 ⇜ (77/8 → 617/64) ⇝ 39/4 | note:C2 gain:0.44 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 267/28 ⇜ (77/8 → 617/64) ⇝ 137/14 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 267/28 ⇜ (77/8 → 617/64) ⇝ 137/14 | note:74 gain:0.044 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 267/28 ⇜ (77/8 → 617/64) ⇝ 137/14 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 267/28 ⇜ (77/8 → 617/64) ⇝ 137/14 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 19/2 ⇜ (617/64 → 309/32) ⇝ 39/4 | note:C2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 267/28 ⇜ (617/64 → 309/32) ⇝ 137/14 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 267/28 ⇜ (617/64 → 309/32) ⇝ 137/14 | note:74 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 267/28 ⇜ (617/64 → 309/32) ⇝ 137/14 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 267/28 ⇜ (617/64 → 309/32) ⇝ 137/14 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 19/2 ⇜ (309/32 → 619/64) ⇝ 39/4 | note:C2 gain:0.64 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 267/28 ⇜ (309/32 → 619/64) ⇝ 137/14 | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 267/28 ⇜ (309/32 → 619/64) ⇝ 137/14 | note:74 gain:0.064 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 267/28 ⇜ (309/32 → 619/64) ⇝ 137/14 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 267/28 ⇜ (309/32 → 619/64) ⇝ 137/14 | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 19/2 ⇜ (619/64 → 155/16) ⇝ 39/4 | note:C2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 267/28 ⇜ (619/64 → 155/16) ⇝ 137/14 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 267/28 ⇜ (619/64 → 155/16) ⇝ 137/14 | note:74 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 267/28 ⇜ (619/64 → 155/16) ⇝ 137/14 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 267/28 ⇜ (619/64 → 155/16) ⇝ 137/14 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 19/2 ⇜ (155/16 → 621/64) ⇝ 39/4 | note:C2 gain:0.44 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 267/28 ⇜ (155/16 → 621/64) ⇝ 137/14 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 267/28 ⇜ (155/16 → 621/64) ⇝ 137/14 | note:74 gain:0.044 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 267/28 ⇜ (155/16 → 621/64) ⇝ 137/14 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 267/28 ⇜ (155/16 → 621/64) ⇝ 137/14 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 19/2 ⇜ (621/64 → 311/32) ⇝ 39/4 | note:C2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 267/28 ⇜ (621/64 → 311/32) ⇝ 137/14 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 267/28 ⇜ (621/64 → 311/32) ⇝ 137/14 | note:74 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 267/28 ⇜ (621/64 → 311/32) ⇝ 137/14 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 267/28 ⇜ (621/64 → 311/32) ⇝ 137/14 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 19/2 ⇜ (311/32 → 623/64) ⇝ 39/4 | note:C2 gain:0.24 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 267/28 ⇜ (311/32 → 623/64) ⇝ 137/14 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 267/28 ⇜ (311/32 → 623/64) ⇝ 137/14 | note:74 gain:0.024 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 267/28 ⇜ (311/32 → 623/64) ⇝ 137/14 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 267/28 ⇜ (311/32 → 623/64) ⇝ 137/14 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 19/2 ⇜ (623/64 → 39/4) | note:C2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.416666666667 ]", + "[ 267/28 ⇜ (623/64 → 39/4) ⇝ 137/14 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 267/28 ⇜ (623/64 → 39/4) ⇝ 137/14 | note:74 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 267/28 ⇜ (623/64 → 39/4) ⇝ 137/14 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 267/28 ⇜ (623/64 → 39/4) ⇝ 137/14 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 267/28 ⇜ (39/4 → 625/64) ⇝ 137/14 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 267/28 ⇜ (39/4 → 625/64) ⇝ 137/14 | note:74 gain:0.044 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 267/28 ⇜ (39/4 → 625/64) ⇝ 137/14 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 267/28 ⇜ (39/4 → 625/64) ⇝ 137/14 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ (39/4 → 625/64) ⇝ 79/8 | note:G4 gain:0.44 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ (39/4 → 625/64) ⇝ 79/8 | note:D5 gain:0.44 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ (39/4 → 625/64) ⇝ 79/8 | note:F5 gain:0.44 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ (39/4 → 625/64) ⇝ 10/1 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ (39/4 → 625/64) ⇝ 10/1 | note:D4 gain:0.22 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ (39/4 → 625/64) ⇝ 10/1 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ (39/4 → 625/64) ⇝ 10/1 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 267/28 ⇜ (625/64 → 313/32) ⇝ 137/14 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 267/28 ⇜ (625/64 → 313/32) ⇝ 137/14 | note:74 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 267/28 ⇜ (625/64 → 313/32) ⇝ 137/14 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 267/28 ⇜ (625/64 → 313/32) ⇝ 137/14 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 39/4 ⇜ (625/64 → 313/32) ⇝ 79/8 | note:G4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 39/4 ⇜ (625/64 → 313/32) ⇝ 79/8 | note:D5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 39/4 ⇜ (625/64 → 313/32) ⇝ 79/8 | note:F5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 39/4 ⇜ (625/64 → 313/32) ⇝ 10/1 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 39/4 ⇜ (625/64 → 313/32) ⇝ 10/1 | note:D4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 39/4 ⇜ (625/64 → 313/32) ⇝ 10/1 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 39/4 ⇜ (625/64 → 313/32) ⇝ 10/1 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 267/28 ⇜ (313/32 → 137/14) | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 267/28 ⇜ (313/32 → 137/14) | note:74 gain:0.064 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 267/28 ⇜ (313/32 → 137/14) | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 267/28 ⇜ (313/32 → 137/14) | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 39/4 ⇜ (313/32 → 627/64) ⇝ 79/8 | note:G4 gain:0.64 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 39/4 ⇜ (313/32 → 627/64) ⇝ 79/8 | note:D5 gain:0.64 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 39/4 ⇜ (313/32 → 627/64) ⇝ 79/8 | note:F5 gain:0.64 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 39/4 ⇜ (313/32 → 627/64) ⇝ 10/1 | note:Bb3 gain:0.32 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 39/4 ⇜ (313/32 → 627/64) ⇝ 10/1 | note:D4 gain:0.32 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 39/4 ⇜ (313/32 → 627/64) ⇝ 10/1 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 39/4 ⇜ (313/32 → 627/64) ⇝ 10/1 | note:G4 gain:0.32 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 39/4 ⇜ (627/64 → 157/16) ⇝ 79/8 | note:G4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 39/4 ⇜ (627/64 → 157/16) ⇝ 79/8 | note:D5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 39/4 ⇜ (627/64 → 157/16) ⇝ 79/8 | note:F5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 39/4 ⇜ (627/64 → 157/16) ⇝ 10/1 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 39/4 ⇜ (627/64 → 157/16) ⇝ 10/1 | note:D4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 39/4 ⇜ (627/64 → 157/16) ⇝ 10/1 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 39/4 ⇜ (627/64 → 157/16) ⇝ 10/1 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 39/4 ⇜ (157/16 → 629/64) ⇝ 79/8 | note:G4 gain:0.44 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 39/4 ⇜ (157/16 → 629/64) ⇝ 79/8 | note:D5 gain:0.44 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 39/4 ⇜ (157/16 → 629/64) ⇝ 79/8 | note:F5 gain:0.44 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 39/4 ⇜ (157/16 → 629/64) ⇝ 10/1 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 39/4 ⇜ (157/16 → 629/64) ⇝ 10/1 | note:D4 gain:0.22 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 39/4 ⇜ (157/16 → 629/64) ⇝ 10/1 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 39/4 ⇜ (157/16 → 629/64) ⇝ 10/1 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 39/4 ⇜ (629/64 → 315/32) ⇝ 79/8 | note:G4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 39/4 ⇜ (629/64 → 315/32) ⇝ 79/8 | note:D5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 39/4 ⇜ (629/64 → 315/32) ⇝ 79/8 | note:F5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 39/4 ⇜ (629/64 → 315/32) ⇝ 10/1 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 39/4 ⇜ (629/64 → 315/32) ⇝ 10/1 | note:D4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 39/4 ⇜ (629/64 → 315/32) ⇝ 10/1 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 39/4 ⇜ (629/64 → 315/32) ⇝ 10/1 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 39/4 ⇜ (315/32 → 631/64) ⇝ 79/8 | note:G4 gain:0.24 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 39/4 ⇜ (315/32 → 631/64) ⇝ 79/8 | note:D5 gain:0.24 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 39/4 ⇜ (315/32 → 631/64) ⇝ 79/8 | note:F5 gain:0.24 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 39/4 ⇜ (315/32 → 631/64) ⇝ 10/1 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 39/4 ⇜ (315/32 → 631/64) ⇝ 10/1 | note:D4 gain:0.12 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 39/4 ⇜ (315/32 → 631/64) ⇝ 10/1 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 39/4 ⇜ (315/32 → 631/64) ⇝ 10/1 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 39/4 ⇜ (631/64 → 79/8) | note:G4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 39/4 ⇜ (631/64 → 79/8) | note:D5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 39/4 ⇜ (631/64 → 79/8) | note:F5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 39/4 ⇜ (631/64 → 79/8) ⇝ 10/1 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 39/4 ⇜ (631/64 → 79/8) ⇝ 10/1 | note:D4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 39/4 ⇜ (631/64 → 79/8) ⇝ 10/1 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 39/4 ⇜ (631/64 → 79/8) ⇝ 10/1 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 39/4 ⇜ (79/8 → 633/64) ⇝ 10/1 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 39/4 ⇜ (79/8 → 633/64) ⇝ 10/1 | note:D4 gain:0.22 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 39/4 ⇜ (79/8 → 633/64) ⇝ 10/1 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 39/4 ⇜ (79/8 → 633/64) ⇝ 10/1 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 39/4 ⇜ (633/64 → 317/32) ⇝ 10/1 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 39/4 ⇜ (633/64 → 317/32) ⇝ 10/1 | note:D4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 39/4 ⇜ (633/64 → 317/32) ⇝ 10/1 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 39/4 ⇜ (633/64 → 317/32) ⇝ 10/1 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 39/4 ⇜ (317/32 → 635/64) ⇝ 10/1 | note:Bb3 gain:0.32 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 39/4 ⇜ (317/32 → 635/64) ⇝ 10/1 | note:D4 gain:0.32 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 39/4 ⇜ (317/32 → 635/64) ⇝ 10/1 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 39/4 ⇜ (317/32 → 635/64) ⇝ 10/1 | note:G4 gain:0.32 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 39/4 ⇜ (635/64 → 159/16) ⇝ 10/1 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 39/4 ⇜ (635/64 → 159/16) ⇝ 10/1 | note:D4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 39/4 ⇜ (635/64 → 159/16) ⇝ 10/1 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 39/4 ⇜ (635/64 → 159/16) ⇝ 10/1 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 39/4 ⇜ (159/16 → 637/64) ⇝ 10/1 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 39/4 ⇜ (159/16 → 637/64) ⇝ 10/1 | note:D4 gain:0.22 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 39/4 ⇜ (159/16 → 637/64) ⇝ 10/1 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 39/4 ⇜ (159/16 → 637/64) ⇝ 10/1 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 39/4 ⇜ (637/64 → 319/32) ⇝ 10/1 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 39/4 ⇜ (637/64 → 319/32) ⇝ 10/1 | note:D4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 39/4 ⇜ (637/64 → 319/32) ⇝ 10/1 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 39/4 ⇜ (637/64 → 319/32) ⇝ 10/1 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 39/4 ⇜ (319/32 → 639/64) ⇝ 10/1 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 39/4 ⇜ (319/32 → 639/64) ⇝ 10/1 | note:D4 gain:0.12 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 39/4 ⇜ (319/32 → 639/64) ⇝ 10/1 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 39/4 ⇜ (319/32 → 639/64) ⇝ 10/1 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 39/4 ⇜ (639/64 → 10/1) | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 39/4 ⇜ (639/64 → 10/1) | note:D4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.537037037037 ]", + "[ 39/4 ⇜ (639/64 → 10/1) | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 39/4 ⇜ (639/64 → 10/1) | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ (10/1 → 641/64) ⇝ 41/4 | note:F2 gain:0.44 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 10/1 ⇜ (641/64 → 321/32) ⇝ 41/4 | note:F2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 10/1 ⇜ (321/32 → 643/64) ⇝ 41/4 | note:F2 gain:0.64 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ (281/28 → 643/64) ⇝ 72/7 | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ (281/28 → 643/64) ⇝ 72/7 | note:74 gain:0.064 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ (281/28 → 643/64) ⇝ 72/7 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ (281/28 → 643/64) ⇝ 72/7 | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 10/1 ⇜ (643/64 → 161/16) ⇝ 41/4 | note:F2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 281/28 ⇜ (643/64 → 161/16) ⇝ 72/7 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 281/28 ⇜ (643/64 → 161/16) ⇝ 72/7 | note:74 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 281/28 ⇜ (643/64 → 161/16) ⇝ 72/7 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 281/28 ⇜ (643/64 → 161/16) ⇝ 72/7 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 10/1 ⇜ (161/16 → 645/64) ⇝ 41/4 | note:F2 gain:0.44 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 281/28 ⇜ (161/16 → 645/64) ⇝ 72/7 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 281/28 ⇜ (161/16 → 645/64) ⇝ 72/7 | note:74 gain:0.044 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 281/28 ⇜ (161/16 → 645/64) ⇝ 72/7 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 281/28 ⇜ (161/16 → 645/64) ⇝ 72/7 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 10/1 ⇜ (645/64 → 323/32) ⇝ 41/4 | note:F2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 281/28 ⇜ (645/64 → 323/32) ⇝ 72/7 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 281/28 ⇜ (645/64 → 323/32) ⇝ 72/7 | note:74 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 281/28 ⇜ (645/64 → 323/32) ⇝ 72/7 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 281/28 ⇜ (645/64 → 323/32) ⇝ 72/7 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 10/1 ⇜ (323/32 → 647/64) ⇝ 41/4 | note:F2 gain:0.24 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 281/28 ⇜ (323/32 → 647/64) ⇝ 72/7 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 281/28 ⇜ (323/32 → 647/64) ⇝ 72/7 | note:74 gain:0.024 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 281/28 ⇜ (323/32 → 647/64) ⇝ 72/7 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 281/28 ⇜ (323/32 → 647/64) ⇝ 72/7 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 10/1 ⇜ (647/64 → 81/8) ⇝ 41/4 | note:F2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 281/28 ⇜ (647/64 → 81/8) ⇝ 72/7 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 281/28 ⇜ (647/64 → 81/8) ⇝ 72/7 | note:74 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 281/28 ⇜ (647/64 → 81/8) ⇝ 72/7 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 281/28 ⇜ (647/64 → 81/8) ⇝ 72/7 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 10/1 ⇜ (81/8 → 649/64) ⇝ 41/4 | note:F2 gain:0.44 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 281/28 ⇜ (81/8 → 649/64) ⇝ 72/7 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 281/28 ⇜ (81/8 → 649/64) ⇝ 72/7 | note:74 gain:0.044 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 281/28 ⇜ (81/8 → 649/64) ⇝ 72/7 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 281/28 ⇜ (81/8 → 649/64) ⇝ 72/7 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ (81/8 → 649/64) ⇝ 41/4 | note:F4 gain:0.44 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ (81/8 → 649/64) ⇝ 41/4 | note:C5 gain:0.44 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ (81/8 → 649/64) ⇝ 41/4 | note:Eb5 gain:0.44 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 10/1 ⇜ (649/64 → 325/32) ⇝ 41/4 | note:F2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 281/28 ⇜ (649/64 → 325/32) ⇝ 72/7 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 281/28 ⇜ (649/64 → 325/32) ⇝ 72/7 | note:74 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 281/28 ⇜ (649/64 → 325/32) ⇝ 72/7 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 281/28 ⇜ (649/64 → 325/32) ⇝ 72/7 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 81/8 ⇜ (649/64 → 325/32) ⇝ 41/4 | note:F4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 81/8 ⇜ (649/64 → 325/32) ⇝ 41/4 | note:C5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 81/8 ⇜ (649/64 → 325/32) ⇝ 41/4 | note:Eb5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 10/1 ⇜ (325/32 → 651/64) ⇝ 41/4 | note:F2 gain:0.64 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 281/28 ⇜ (325/32 → 651/64) ⇝ 72/7 | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 281/28 ⇜ (325/32 → 651/64) ⇝ 72/7 | note:74 gain:0.064 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 281/28 ⇜ (325/32 → 651/64) ⇝ 72/7 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 281/28 ⇜ (325/32 → 651/64) ⇝ 72/7 | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 81/8 ⇜ (325/32 → 651/64) ⇝ 41/4 | note:F4 gain:0.64 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 81/8 ⇜ (325/32 → 651/64) ⇝ 41/4 | note:C5 gain:0.64 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 81/8 ⇜ (325/32 → 651/64) ⇝ 41/4 | note:Eb5 gain:0.64 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 10/1 ⇜ (651/64 → 163/16) ⇝ 41/4 | note:F2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 281/28 ⇜ (651/64 → 163/16) ⇝ 72/7 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 281/28 ⇜ (651/64 → 163/16) ⇝ 72/7 | note:74 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 281/28 ⇜ (651/64 → 163/16) ⇝ 72/7 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 281/28 ⇜ (651/64 → 163/16) ⇝ 72/7 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 81/8 ⇜ (651/64 → 163/16) ⇝ 41/4 | note:F4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 81/8 ⇜ (651/64 → 163/16) ⇝ 41/4 | note:C5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 81/8 ⇜ (651/64 → 163/16) ⇝ 41/4 | note:Eb5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 10/1 ⇜ (163/16 → 653/64) ⇝ 41/4 | note:F2 gain:0.44 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 281/28 ⇜ (163/16 → 653/64) ⇝ 72/7 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 281/28 ⇜ (163/16 → 653/64) ⇝ 72/7 | note:74 gain:0.044 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 281/28 ⇜ (163/16 → 653/64) ⇝ 72/7 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 281/28 ⇜ (163/16 → 653/64) ⇝ 72/7 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 81/8 ⇜ (163/16 → 653/64) ⇝ 41/4 | note:F4 gain:0.44 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 81/8 ⇜ (163/16 → 653/64) ⇝ 41/4 | note:C5 gain:0.44 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 81/8 ⇜ (163/16 → 653/64) ⇝ 41/4 | note:Eb5 gain:0.44 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 10/1 ⇜ (653/64 → 327/32) ⇝ 41/4 | note:F2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 281/28 ⇜ (653/64 → 327/32) ⇝ 72/7 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 281/28 ⇜ (653/64 → 327/32) ⇝ 72/7 | note:74 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 281/28 ⇜ (653/64 → 327/32) ⇝ 72/7 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 281/28 ⇜ (653/64 → 327/32) ⇝ 72/7 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 81/8 ⇜ (653/64 → 327/32) ⇝ 41/4 | note:F4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 81/8 ⇜ (653/64 → 327/32) ⇝ 41/4 | note:C5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 81/8 ⇜ (653/64 → 327/32) ⇝ 41/4 | note:Eb5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 10/1 ⇜ (327/32 → 655/64) ⇝ 41/4 | note:F2 gain:0.24 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 281/28 ⇜ (327/32 → 655/64) ⇝ 72/7 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 281/28 ⇜ (327/32 → 655/64) ⇝ 72/7 | note:74 gain:0.024 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 281/28 ⇜ (327/32 → 655/64) ⇝ 72/7 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 281/28 ⇜ (327/32 → 655/64) ⇝ 72/7 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 81/8 ⇜ (327/32 → 655/64) ⇝ 41/4 | note:F4 gain:0.24 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 81/8 ⇜ (327/32 → 655/64) ⇝ 41/4 | note:C5 gain:0.24 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 81/8 ⇜ (327/32 → 655/64) ⇝ 41/4 | note:Eb5 gain:0.24 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 10/1 ⇜ (655/64 → 41/4) | note:F2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 281/28 ⇜ (655/64 → 41/4) ⇝ 72/7 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 281/28 ⇜ (655/64 → 41/4) ⇝ 72/7 | note:74 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 281/28 ⇜ (655/64 → 41/4) ⇝ 72/7 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 281/28 ⇜ (655/64 → 41/4) ⇝ 72/7 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 81/8 ⇜ (655/64 → 41/4) | note:F4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 81/8 ⇜ (655/64 → 41/4) | note:C5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 81/8 ⇜ (655/64 → 41/4) | note:Eb5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 281/28 ⇜ (41/4 → 657/64) ⇝ 72/7 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 281/28 ⇜ (41/4 → 657/64) ⇝ 72/7 | note:74 gain:0.044 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 281/28 ⇜ (41/4 → 657/64) ⇝ 72/7 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 281/28 ⇜ (41/4 → 657/64) ⇝ 72/7 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 281/28 ⇜ (657/64 → 329/32) ⇝ 72/7 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 281/28 ⇜ (657/64 → 329/32) ⇝ 72/7 | note:74 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 281/28 ⇜ (657/64 → 329/32) ⇝ 72/7 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 281/28 ⇜ (657/64 → 329/32) ⇝ 72/7 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 281/28 ⇜ (329/32 → 72/7) | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 281/28 ⇜ (329/32 → 72/7) | note:74 gain:0.064 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 281/28 ⇜ (329/32 → 72/7) | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 281/28 ⇜ (329/32 → 72/7) | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ (21/2 → 673/64) ⇝ 85/8 | note:C5 gain:0.44 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ (21/2 → 673/64) ⇝ 85/8 | note:G5 gain:0.44 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ (21/2 → 673/64) ⇝ 85/8 | note:Bb5 gain:0.44 clip:1 s:piano release:0.1 pan:0.62962962963 ]", + "[ (21/2 → 673/64) ⇝ 43/4 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ (21/2 → 673/64) ⇝ 43/4 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ (21/2 → 673/64) ⇝ 43/4 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ (21/2 → 673/64) ⇝ 43/4 | note:C5 gain:0.22 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ (21/2 → 673/64) ⇝ 43/4 | note:F2 gain:0.44 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 21/2 ⇜ (673/64 → 337/32) ⇝ 85/8 | note:C5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 21/2 ⇜ (673/64 → 337/32) ⇝ 85/8 | note:G5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 21/2 ⇜ (673/64 → 337/32) ⇝ 85/8 | note:Bb5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.62962962963 ]", + "[ 21/2 ⇜ (673/64 → 337/32) ⇝ 43/4 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 21/2 ⇜ (673/64 → 337/32) ⇝ 43/4 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 21/2 ⇜ (673/64 → 337/32) ⇝ 43/4 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 21/2 ⇜ (673/64 → 337/32) ⇝ 43/4 | note:C5 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 21/2 ⇜ (673/64 → 337/32) ⇝ 43/4 | note:F2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 21/2 ⇜ (337/32 → 675/64) ⇝ 85/8 | note:C5 gain:0.64 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 21/2 ⇜ (337/32 → 675/64) ⇝ 85/8 | note:G5 gain:0.64 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 21/2 ⇜ (337/32 → 675/64) ⇝ 85/8 | note:Bb5 gain:0.64 clip:1 s:piano release:0.1 pan:0.62962962963 ]", + "[ 21/2 ⇜ (337/32 → 675/64) ⇝ 43/4 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 21/2 ⇜ (337/32 → 675/64) ⇝ 43/4 | note:G4 gain:0.32 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 21/2 ⇜ (337/32 → 675/64) ⇝ 43/4 | note:Ab4 gain:0.32 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 21/2 ⇜ (337/32 → 675/64) ⇝ 43/4 | note:C5 gain:0.32 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 21/2 ⇜ (337/32 → 675/64) ⇝ 43/4 | note:F2 gain:0.64 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 21/2 ⇜ (675/64 → 169/16) ⇝ 85/8 | note:C5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 21/2 ⇜ (675/64 → 169/16) ⇝ 85/8 | note:G5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 21/2 ⇜ (675/64 → 169/16) ⇝ 85/8 | note:Bb5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.62962962963 ]", + "[ 21/2 ⇜ (675/64 → 169/16) ⇝ 43/4 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 21/2 ⇜ (675/64 → 169/16) ⇝ 43/4 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 21/2 ⇜ (675/64 → 169/16) ⇝ 43/4 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 21/2 ⇜ (675/64 → 169/16) ⇝ 43/4 | note:C5 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 21/2 ⇜ (675/64 → 169/16) ⇝ 43/4 | note:F2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 21/2 ⇜ (169/16 → 677/64) ⇝ 85/8 | note:C5 gain:0.44 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 21/2 ⇜ (169/16 → 677/64) ⇝ 85/8 | note:G5 gain:0.44 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 21/2 ⇜ (169/16 → 677/64) ⇝ 85/8 | note:Bb5 gain:0.44 clip:1 s:piano release:0.1 pan:0.62962962963 ]", + "[ 21/2 ⇜ (169/16 → 677/64) ⇝ 43/4 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 21/2 ⇜ (169/16 → 677/64) ⇝ 43/4 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 21/2 ⇜ (169/16 → 677/64) ⇝ 43/4 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 21/2 ⇜ (169/16 → 677/64) ⇝ 43/4 | note:C5 gain:0.22 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 21/2 ⇜ (169/16 → 677/64) ⇝ 43/4 | note:F2 gain:0.44 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 21/2 ⇜ (677/64 → 339/32) ⇝ 85/8 | note:C5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 21/2 ⇜ (677/64 → 339/32) ⇝ 85/8 | note:G5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 21/2 ⇜ (677/64 → 339/32) ⇝ 85/8 | note:Bb5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.62962962963 ]", + "[ 21/2 ⇜ (677/64 → 339/32) ⇝ 43/4 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 21/2 ⇜ (677/64 → 339/32) ⇝ 43/4 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 21/2 ⇜ (677/64 → 339/32) ⇝ 43/4 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 21/2 ⇜ (677/64 → 339/32) ⇝ 43/4 | note:C5 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 21/2 ⇜ (677/64 → 339/32) ⇝ 43/4 | note:F2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 21/2 ⇜ (339/32 → 679/64) ⇝ 85/8 | note:C5 gain:0.24 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 21/2 ⇜ (339/32 → 679/64) ⇝ 85/8 | note:G5 gain:0.24 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 21/2 ⇜ (339/32 → 679/64) ⇝ 85/8 | note:Bb5 gain:0.24 clip:1 s:piano release:0.1 pan:0.62962962963 ]", + "[ 21/2 ⇜ (339/32 → 679/64) ⇝ 43/4 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 21/2 ⇜ (339/32 → 679/64) ⇝ 43/4 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 21/2 ⇜ (339/32 → 679/64) ⇝ 43/4 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 21/2 ⇜ (339/32 → 679/64) ⇝ 43/4 | note:C5 gain:0.12 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 21/2 ⇜ (339/32 → 679/64) ⇝ 43/4 | note:F2 gain:0.24 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 21/2 ⇜ (679/64 → 85/8) | note:C5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 21/2 ⇜ (679/64 → 85/8) | note:G5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 21/2 ⇜ (679/64 → 85/8) | note:Bb5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.62962962963 ]", + "[ 21/2 ⇜ (679/64 → 85/8) ⇝ 43/4 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 21/2 ⇜ (679/64 → 85/8) ⇝ 43/4 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 21/2 ⇜ (679/64 → 85/8) ⇝ 43/4 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 21/2 ⇜ (679/64 → 85/8) ⇝ 43/4 | note:C5 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 21/2 ⇜ (679/64 → 85/8) ⇝ 43/4 | note:F2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 21/2 ⇜ (85/8 → 681/64) ⇝ 43/4 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 21/2 ⇜ (85/8 → 681/64) ⇝ 43/4 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 21/2 ⇜ (85/8 → 681/64) ⇝ 43/4 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 21/2 ⇜ (85/8 → 681/64) ⇝ 43/4 | note:C5 gain:0.22 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 21/2 ⇜ (85/8 → 681/64) ⇝ 43/4 | note:F2 gain:0.44 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 21/2 ⇜ (681/64 → 341/32) ⇝ 43/4 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 21/2 ⇜ (681/64 → 341/32) ⇝ 43/4 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 21/2 ⇜ (681/64 → 341/32) ⇝ 43/4 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 21/2 ⇜ (681/64 → 341/32) ⇝ 43/4 | note:C5 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 21/2 ⇜ (681/64 → 341/32) ⇝ 43/4 | note:F2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 21/2 ⇜ (341/32 → 683/64) ⇝ 43/4 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 21/2 ⇜ (341/32 → 683/64) ⇝ 43/4 | note:G4 gain:0.32 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 21/2 ⇜ (341/32 → 683/64) ⇝ 43/4 | note:Ab4 gain:0.32 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 21/2 ⇜ (341/32 → 683/64) ⇝ 43/4 | note:C5 gain:0.32 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 21/2 ⇜ (341/32 → 683/64) ⇝ 43/4 | note:F2 gain:0.64 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 21/2 ⇜ (683/64 → 171/16) ⇝ 43/4 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 21/2 ⇜ (683/64 → 171/16) ⇝ 43/4 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 21/2 ⇜ (683/64 → 171/16) ⇝ 43/4 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 21/2 ⇜ (683/64 → 171/16) ⇝ 43/4 | note:C5 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 21/2 ⇜ (683/64 → 171/16) ⇝ 43/4 | note:F2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 21/2 ⇜ (171/16 → 685/64) ⇝ 43/4 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 21/2 ⇜ (171/16 → 685/64) ⇝ 43/4 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 21/2 ⇜ (171/16 → 685/64) ⇝ 43/4 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 21/2 ⇜ (171/16 → 685/64) ⇝ 43/4 | note:C5 gain:0.22 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 21/2 ⇜ (171/16 → 685/64) ⇝ 43/4 | note:F2 gain:0.44 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 21/2 ⇜ (685/64 → 343/32) ⇝ 43/4 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 21/2 ⇜ (685/64 → 343/32) ⇝ 43/4 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 21/2 ⇜ (685/64 → 343/32) ⇝ 43/4 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 21/2 ⇜ (685/64 → 343/32) ⇝ 43/4 | note:C5 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 21/2 ⇜ (685/64 → 343/32) ⇝ 43/4 | note:F2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 21/2 ⇜ (343/32 → 687/64) ⇝ 43/4 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 21/2 ⇜ (343/32 → 687/64) ⇝ 43/4 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 21/2 ⇜ (343/32 → 687/64) ⇝ 43/4 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 21/2 ⇜ (343/32 → 687/64) ⇝ 43/4 | note:C5 gain:0.12 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 21/2 ⇜ (343/32 → 687/64) ⇝ 43/4 | note:F2 gain:0.24 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 21/2 ⇜ (687/64 → 43/4) | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 21/2 ⇜ (687/64 → 43/4) | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 21/2 ⇜ (687/64 → 43/4) | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 21/2 ⇜ (687/64 → 43/4) | note:C5 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 21/2 ⇜ (687/64 → 43/4) | note:F2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ (43/4 → 689/64) ⇝ 87/8 | note:F4 gain:0.44 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ (43/4 → 689/64) ⇝ 87/8 | note:C5 gain:0.44 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ (43/4 → 689/64) ⇝ 87/8 | note:Eb5 gain:0.44 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 43/4 ⇜ (689/64 → 345/32) ⇝ 87/8 | note:F4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 43/4 ⇜ (689/64 → 345/32) ⇝ 87/8 | note:C5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 43/4 ⇜ (689/64 → 345/32) ⇝ 87/8 | note:Eb5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 43/4 ⇜ (345/32 → 691/64) ⇝ 87/8 | note:F4 gain:0.64 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 43/4 ⇜ (345/32 → 691/64) ⇝ 87/8 | note:C5 gain:0.64 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 43/4 ⇜ (345/32 → 691/64) ⇝ 87/8 | note:Eb5 gain:0.64 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ (151/14 → 691/64) ⇝ 309/28 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ (151/14 → 691/64) ⇝ 309/28 | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ (151/14 → 691/64) ⇝ 309/28 | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ (151/14 → 691/64) ⇝ 309/28 | note:84 gain:0.064 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 43/4 ⇜ (691/64 → 173/16) ⇝ 87/8 | note:F4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 43/4 ⇜ (691/64 → 173/16) ⇝ 87/8 | note:C5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 43/4 ⇜ (691/64 → 173/16) ⇝ 87/8 | note:Eb5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 151/14 ⇜ (691/64 → 173/16) ⇝ 309/28 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 151/14 ⇜ (691/64 → 173/16) ⇝ 309/28 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 151/14 ⇜ (691/64 → 173/16) ⇝ 309/28 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 151/14 ⇜ (691/64 → 173/16) ⇝ 309/28 | note:84 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 43/4 ⇜ (173/16 → 693/64) ⇝ 87/8 | note:F4 gain:0.44 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 43/4 ⇜ (173/16 → 693/64) ⇝ 87/8 | note:C5 gain:0.44 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 43/4 ⇜ (173/16 → 693/64) ⇝ 87/8 | note:Eb5 gain:0.44 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 151/14 ⇜ (173/16 → 693/64) ⇝ 309/28 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 151/14 ⇜ (173/16 → 693/64) ⇝ 309/28 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 151/14 ⇜ (173/16 → 693/64) ⇝ 309/28 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 151/14 ⇜ (173/16 → 693/64) ⇝ 309/28 | note:84 gain:0.044 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 43/4 ⇜ (693/64 → 347/32) ⇝ 87/8 | note:F4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 43/4 ⇜ (693/64 → 347/32) ⇝ 87/8 | note:C5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 43/4 ⇜ (693/64 → 347/32) ⇝ 87/8 | note:Eb5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 151/14 ⇜ (693/64 → 347/32) ⇝ 309/28 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 151/14 ⇜ (693/64 → 347/32) ⇝ 309/28 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 151/14 ⇜ (693/64 → 347/32) ⇝ 309/28 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 151/14 ⇜ (693/64 → 347/32) ⇝ 309/28 | note:84 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 43/4 ⇜ (347/32 → 695/64) ⇝ 87/8 | note:F4 gain:0.24 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 43/4 ⇜ (347/32 → 695/64) ⇝ 87/8 | note:C5 gain:0.24 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 43/4 ⇜ (347/32 → 695/64) ⇝ 87/8 | note:Eb5 gain:0.24 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 151/14 ⇜ (347/32 → 695/64) ⇝ 309/28 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 151/14 ⇜ (347/32 → 695/64) ⇝ 309/28 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 151/14 ⇜ (347/32 → 695/64) ⇝ 309/28 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 151/14 ⇜ (347/32 → 695/64) ⇝ 309/28 | note:84 gain:0.024 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 43/4 ⇜ (695/64 → 87/8) | note:F4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 43/4 ⇜ (695/64 → 87/8) | note:C5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 43/4 ⇜ (695/64 → 87/8) | note:Eb5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 151/14 ⇜ (695/64 → 87/8) ⇝ 309/28 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 151/14 ⇜ (695/64 → 87/8) ⇝ 309/28 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 151/14 ⇜ (695/64 → 87/8) ⇝ 309/28 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 151/14 ⇜ (695/64 → 87/8) ⇝ 309/28 | note:84 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 151/14 ⇜ (87/8 → 697/64) ⇝ 309/28 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 151/14 ⇜ (87/8 → 697/64) ⇝ 309/28 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 151/14 ⇜ (87/8 → 697/64) ⇝ 309/28 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 151/14 ⇜ (87/8 → 697/64) ⇝ 309/28 | note:84 gain:0.044 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 151/14 ⇜ (697/64 → 349/32) ⇝ 309/28 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 151/14 ⇜ (697/64 → 349/32) ⇝ 309/28 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 151/14 ⇜ (697/64 → 349/32) ⇝ 309/28 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 151/14 ⇜ (697/64 → 349/32) ⇝ 309/28 | note:84 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 151/14 ⇜ (349/32 → 699/64) ⇝ 309/28 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 151/14 ⇜ (349/32 → 699/64) ⇝ 309/28 | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 151/14 ⇜ (349/32 → 699/64) ⇝ 309/28 | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 151/14 ⇜ (349/32 → 699/64) ⇝ 309/28 | note:84 gain:0.064 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 151/14 ⇜ (699/64 → 175/16) ⇝ 309/28 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 151/14 ⇜ (699/64 → 175/16) ⇝ 309/28 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 151/14 ⇜ (699/64 → 175/16) ⇝ 309/28 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 151/14 ⇜ (699/64 → 175/16) ⇝ 309/28 | note:84 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 151/14 ⇜ (175/16 → 701/64) ⇝ 309/28 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 151/14 ⇜ (175/16 → 701/64) ⇝ 309/28 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 151/14 ⇜ (175/16 → 701/64) ⇝ 309/28 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 151/14 ⇜ (175/16 → 701/64) ⇝ 309/28 | note:84 gain:0.044 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 151/14 ⇜ (701/64 → 351/32) ⇝ 309/28 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 151/14 ⇜ (701/64 → 351/32) ⇝ 309/28 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 151/14 ⇜ (701/64 → 351/32) ⇝ 309/28 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 151/14 ⇜ (701/64 → 351/32) ⇝ 309/28 | note:84 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 151/14 ⇜ (351/32 → 703/64) ⇝ 309/28 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 151/14 ⇜ (351/32 → 703/64) ⇝ 309/28 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 151/14 ⇜ (351/32 → 703/64) ⇝ 309/28 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 151/14 ⇜ (351/32 → 703/64) ⇝ 309/28 | note:84 gain:0.024 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 151/14 ⇜ (703/64 → 11/1) ⇝ 309/28 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 151/14 ⇜ (703/64 → 11/1) ⇝ 309/28 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 151/14 ⇜ (703/64 → 11/1) ⇝ 309/28 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 151/14 ⇜ (703/64 → 11/1) ⇝ 309/28 | note:84 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 151/14 ⇜ (11/1 → 705/64) ⇝ 309/28 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 151/14 ⇜ (11/1 → 705/64) ⇝ 309/28 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 151/14 ⇜ (11/1 → 705/64) ⇝ 309/28 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 151/14 ⇜ (11/1 → 705/64) ⇝ 309/28 | note:84 gain:0.044 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ (11/1 → 705/64) ⇝ 45/4 | note:F2 gain:0.44 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 151/14 ⇜ (705/64 → 353/32) ⇝ 309/28 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 151/14 ⇜ (705/64 → 353/32) ⇝ 309/28 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 151/14 ⇜ (705/64 → 353/32) ⇝ 309/28 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 151/14 ⇜ (705/64 → 353/32) ⇝ 309/28 | note:84 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 11/1 ⇜ (705/64 → 353/32) ⇝ 45/4 | note:F2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 151/14 ⇜ (353/32 → 309/28) | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 151/14 ⇜ (353/32 → 309/28) | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 151/14 ⇜ (353/32 → 309/28) | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 151/14 ⇜ (353/32 → 309/28) | note:84 gain:0.064 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 11/1 ⇜ (353/32 → 707/64) ⇝ 45/4 | note:F2 gain:0.64 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 11/1 ⇜ (707/64 → 177/16) ⇝ 45/4 | note:F2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 11/1 ⇜ (177/16 → 709/64) ⇝ 45/4 | note:F2 gain:0.44 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 11/1 ⇜ (709/64 → 355/32) ⇝ 45/4 | note:F2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 11/1 ⇜ (355/32 → 711/64) ⇝ 45/4 | note:F2 gain:0.24 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 11/1 ⇜ (711/64 → 89/8) ⇝ 45/4 | note:F2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 11/1 ⇜ (89/8 → 713/64) ⇝ 45/4 | note:F2 gain:0.44 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ (89/8 → 713/64) ⇝ 45/4 | note:F4 gain:0.44 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ (89/8 → 713/64) ⇝ 45/4 | note:C5 gain:0.44 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ (89/8 → 713/64) ⇝ 45/4 | note:Eb5 gain:0.44 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 11/1 ⇜ (713/64 → 357/32) ⇝ 45/4 | note:F2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 89/8 ⇜ (713/64 → 357/32) ⇝ 45/4 | note:F4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 89/8 ⇜ (713/64 → 357/32) ⇝ 45/4 | note:C5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 89/8 ⇜ (713/64 → 357/32) ⇝ 45/4 | note:Eb5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 11/1 ⇜ (357/32 → 715/64) ⇝ 45/4 | note:F2 gain:0.64 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 89/8 ⇜ (357/32 → 715/64) ⇝ 45/4 | note:F4 gain:0.64 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 89/8 ⇜ (357/32 → 715/64) ⇝ 45/4 | note:C5 gain:0.64 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 89/8 ⇜ (357/32 → 715/64) ⇝ 45/4 | note:Eb5 gain:0.64 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 11/1 ⇜ (715/64 → 179/16) ⇝ 45/4 | note:F2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 89/8 ⇜ (715/64 → 179/16) ⇝ 45/4 | note:F4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 89/8 ⇜ (715/64 → 179/16) ⇝ 45/4 | note:C5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 89/8 ⇜ (715/64 → 179/16) ⇝ 45/4 | note:Eb5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 11/1 ⇜ (179/16 → 717/64) ⇝ 45/4 | note:F2 gain:0.44 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 89/8 ⇜ (179/16 → 717/64) ⇝ 45/4 | note:F4 gain:0.44 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 89/8 ⇜ (179/16 → 717/64) ⇝ 45/4 | note:C5 gain:0.44 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 89/8 ⇜ (179/16 → 717/64) ⇝ 45/4 | note:Eb5 gain:0.44 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 11/1 ⇜ (717/64 → 359/32) ⇝ 45/4 | note:F2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 89/8 ⇜ (717/64 → 359/32) ⇝ 45/4 | note:F4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 89/8 ⇜ (717/64 → 359/32) ⇝ 45/4 | note:C5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 89/8 ⇜ (717/64 → 359/32) ⇝ 45/4 | note:Eb5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 11/1 ⇜ (359/32 → 719/64) ⇝ 45/4 | note:F2 gain:0.24 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 89/8 ⇜ (359/32 → 719/64) ⇝ 45/4 | note:F4 gain:0.24 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 89/8 ⇜ (359/32 → 719/64) ⇝ 45/4 | note:C5 gain:0.24 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 89/8 ⇜ (359/32 → 719/64) ⇝ 45/4 | note:Eb5 gain:0.24 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 11/1 ⇜ (719/64 → 45/4) | note:F2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 89/8 ⇜ (719/64 → 45/4) | note:F4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 89/8 ⇜ (719/64 → 45/4) | note:C5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 89/8 ⇜ (719/64 → 45/4) | note:Eb5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ (45/4 → 721/64) ⇝ 23/2 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ (45/4 → 721/64) ⇝ 23/2 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ (45/4 → 721/64) ⇝ 23/2 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ (45/4 → 721/64) ⇝ 23/2 | note:C5 gain:0.22 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 45/4 ⇜ (721/64 → 361/32) ⇝ 23/2 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 45/4 ⇜ (721/64 → 361/32) ⇝ 23/2 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 45/4 ⇜ (721/64 → 361/32) ⇝ 23/2 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 45/4 ⇜ (721/64 → 361/32) ⇝ 23/2 | note:C5 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 45/4 ⇜ (361/32 → 723/64) ⇝ 23/2 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 45/4 ⇜ (361/32 → 723/64) ⇝ 23/2 | note:G4 gain:0.32 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 45/4 ⇜ (361/32 → 723/64) ⇝ 23/2 | note:Ab4 gain:0.32 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 45/4 ⇜ (361/32 → 723/64) ⇝ 23/2 | note:C5 gain:0.32 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 45/4 ⇜ (723/64 → 181/16) ⇝ 23/2 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 45/4 ⇜ (723/64 → 181/16) ⇝ 23/2 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 45/4 ⇜ (723/64 → 181/16) ⇝ 23/2 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 45/4 ⇜ (723/64 → 181/16) ⇝ 23/2 | note:C5 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 45/4 ⇜ (181/16 → 725/64) ⇝ 23/2 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 45/4 ⇜ (181/16 → 725/64) ⇝ 23/2 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 45/4 ⇜ (181/16 → 725/64) ⇝ 23/2 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 45/4 ⇜ (181/16 → 725/64) ⇝ 23/2 | note:C5 gain:0.22 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 45/4 ⇜ (725/64 → 363/32) ⇝ 23/2 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 45/4 ⇜ (725/64 → 363/32) ⇝ 23/2 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 45/4 ⇜ (725/64 → 363/32) ⇝ 23/2 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 45/4 ⇜ (725/64 → 363/32) ⇝ 23/2 | note:C5 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 45/4 ⇜ (363/32 → 727/64) ⇝ 23/2 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 45/4 ⇜ (363/32 → 727/64) ⇝ 23/2 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 45/4 ⇜ (363/32 → 727/64) ⇝ 23/2 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 45/4 ⇜ (363/32 → 727/64) ⇝ 23/2 | note:C5 gain:0.12 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 45/4 ⇜ (727/64 → 91/8) ⇝ 23/2 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 45/4 ⇜ (727/64 → 91/8) ⇝ 23/2 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 45/4 ⇜ (727/64 → 91/8) ⇝ 23/2 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 45/4 ⇜ (727/64 → 91/8) ⇝ 23/2 | note:C5 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 45/4 ⇜ (91/8 → 729/64) ⇝ 23/2 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 45/4 ⇜ (91/8 → 729/64) ⇝ 23/2 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 45/4 ⇜ (91/8 → 729/64) ⇝ 23/2 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 45/4 ⇜ (91/8 → 729/64) ⇝ 23/2 | note:C5 gain:0.22 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 45/4 ⇜ (729/64 → 365/32) ⇝ 23/2 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 45/4 ⇜ (729/64 → 365/32) ⇝ 23/2 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 45/4 ⇜ (729/64 → 365/32) ⇝ 23/2 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 45/4 ⇜ (729/64 → 365/32) ⇝ 23/2 | note:C5 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 45/4 ⇜ (365/32 → 731/64) ⇝ 23/2 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 45/4 ⇜ (365/32 → 731/64) ⇝ 23/2 | note:G4 gain:0.32 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 45/4 ⇜ (365/32 → 731/64) ⇝ 23/2 | note:Ab4 gain:0.32 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 45/4 ⇜ (365/32 → 731/64) ⇝ 23/2 | note:C5 gain:0.32 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 45/4 ⇜ (731/64 → 183/16) ⇝ 23/2 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 45/4 ⇜ (731/64 → 183/16) ⇝ 23/2 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 45/4 ⇜ (731/64 → 183/16) ⇝ 23/2 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 45/4 ⇜ (731/64 → 183/16) ⇝ 23/2 | note:C5 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 45/4 ⇜ (183/16 → 733/64) ⇝ 23/2 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 45/4 ⇜ (183/16 → 733/64) ⇝ 23/2 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 45/4 ⇜ (183/16 → 733/64) ⇝ 23/2 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 45/4 ⇜ (183/16 → 733/64) ⇝ 23/2 | note:C5 gain:0.22 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 45/4 ⇜ (733/64 → 367/32) ⇝ 23/2 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 45/4 ⇜ (733/64 → 367/32) ⇝ 23/2 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 45/4 ⇜ (733/64 → 367/32) ⇝ 23/2 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 45/4 ⇜ (733/64 → 367/32) ⇝ 23/2 | note:C5 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 45/4 ⇜ (367/32 → 735/64) ⇝ 23/2 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 45/4 ⇜ (367/32 → 735/64) ⇝ 23/2 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 45/4 ⇜ (367/32 → 735/64) ⇝ 23/2 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 45/4 ⇜ (367/32 → 735/64) ⇝ 23/2 | note:C5 gain:0.12 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 45/4 ⇜ (735/64 → 23/2) | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 45/4 ⇜ (735/64 → 23/2) | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 45/4 ⇜ (735/64 → 23/2) | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 45/4 ⇜ (735/64 → 23/2) | note:C5 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ (23/2 → 737/64) ⇝ 93/8 | note:C5 gain:0.44 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ (23/2 → 737/64) ⇝ 93/8 | note:G5 gain:0.44 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ (23/2 → 737/64) ⇝ 93/8 | note:Bb5 gain:0.44 clip:1 s:piano release:0.1 pan:0.62962962963 ]", + "[ (23/2 → 737/64) ⇝ 47/4 | note:F2 gain:0.44 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 23/2 ⇜ (737/64 → 369/32) ⇝ 93/8 | note:C5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 23/2 ⇜ (737/64 → 369/32) ⇝ 93/8 | note:G5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 23/2 ⇜ (737/64 → 369/32) ⇝ 93/8 | note:Bb5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.62962962963 ]", + "[ 23/2 ⇜ (737/64 → 369/32) ⇝ 47/4 | note:F2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 23/2 ⇜ (369/32 → 739/64) ⇝ 93/8 | note:C5 gain:0.64 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 23/2 ⇜ (369/32 → 739/64) ⇝ 93/8 | note:G5 gain:0.64 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 23/2 ⇜ (369/32 → 739/64) ⇝ 93/8 | note:Bb5 gain:0.64 clip:1 s:piano release:0.1 pan:0.62962962963 ]", + "[ 23/2 ⇜ (369/32 → 739/64) ⇝ 47/4 | note:F2 gain:0.64 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ (323/28 → 739/64) ⇝ 165/14 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ (323/28 → 739/64) ⇝ 165/14 | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ (323/28 → 739/64) ⇝ 165/14 | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ (323/28 → 739/64) ⇝ 165/14 | note:84 gain:0.064 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 23/2 ⇜ (739/64 → 185/16) ⇝ 93/8 | note:C5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 23/2 ⇜ (739/64 → 185/16) ⇝ 93/8 | note:G5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 23/2 ⇜ (739/64 → 185/16) ⇝ 93/8 | note:Bb5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.62962962963 ]", + "[ 23/2 ⇜ (739/64 → 185/16) ⇝ 47/4 | note:F2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 323/28 ⇜ (739/64 → 185/16) ⇝ 165/14 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 323/28 ⇜ (739/64 → 185/16) ⇝ 165/14 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 323/28 ⇜ (739/64 → 185/16) ⇝ 165/14 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 323/28 ⇜ (739/64 → 185/16) ⇝ 165/14 | note:84 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 23/2 ⇜ (185/16 → 741/64) ⇝ 93/8 | note:C5 gain:0.44 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 23/2 ⇜ (185/16 → 741/64) ⇝ 93/8 | note:G5 gain:0.44 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 23/2 ⇜ (185/16 → 741/64) ⇝ 93/8 | note:Bb5 gain:0.44 clip:1 s:piano release:0.1 pan:0.62962962963 ]", + "[ 23/2 ⇜ (185/16 → 741/64) ⇝ 47/4 | note:F2 gain:0.44 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 323/28 ⇜ (185/16 → 741/64) ⇝ 165/14 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 323/28 ⇜ (185/16 → 741/64) ⇝ 165/14 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 323/28 ⇜ (185/16 → 741/64) ⇝ 165/14 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 323/28 ⇜ (185/16 → 741/64) ⇝ 165/14 | note:84 gain:0.044 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 23/2 ⇜ (741/64 → 371/32) ⇝ 93/8 | note:C5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 23/2 ⇜ (741/64 → 371/32) ⇝ 93/8 | note:G5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 23/2 ⇜ (741/64 → 371/32) ⇝ 93/8 | note:Bb5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.62962962963 ]", + "[ 23/2 ⇜ (741/64 → 371/32) ⇝ 47/4 | note:F2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 323/28 ⇜ (741/64 → 371/32) ⇝ 165/14 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 323/28 ⇜ (741/64 → 371/32) ⇝ 165/14 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 323/28 ⇜ (741/64 → 371/32) ⇝ 165/14 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 323/28 ⇜ (741/64 → 371/32) ⇝ 165/14 | note:84 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 23/2 ⇜ (371/32 → 743/64) ⇝ 93/8 | note:C5 gain:0.24 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 23/2 ⇜ (371/32 → 743/64) ⇝ 93/8 | note:G5 gain:0.24 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 23/2 ⇜ (371/32 → 743/64) ⇝ 93/8 | note:Bb5 gain:0.24 clip:1 s:piano release:0.1 pan:0.62962962963 ]", + "[ 23/2 ⇜ (371/32 → 743/64) ⇝ 47/4 | note:F2 gain:0.24 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 323/28 ⇜ (371/32 → 743/64) ⇝ 165/14 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 323/28 ⇜ (371/32 → 743/64) ⇝ 165/14 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 323/28 ⇜ (371/32 → 743/64) ⇝ 165/14 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 323/28 ⇜ (371/32 → 743/64) ⇝ 165/14 | note:84 gain:0.024 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 23/2 ⇜ (743/64 → 93/8) | note:C5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 23/2 ⇜ (743/64 → 93/8) | note:G5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 23/2 ⇜ (743/64 → 93/8) | note:Bb5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.62962962963 ]", + "[ 23/2 ⇜ (743/64 → 93/8) ⇝ 47/4 | note:F2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 323/28 ⇜ (743/64 → 93/8) ⇝ 165/14 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 323/28 ⇜ (743/64 → 93/8) ⇝ 165/14 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 323/28 ⇜ (743/64 → 93/8) ⇝ 165/14 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 323/28 ⇜ (743/64 → 93/8) ⇝ 165/14 | note:84 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 23/2 ⇜ (93/8 → 745/64) ⇝ 47/4 | note:F2 gain:0.44 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 323/28 ⇜ (93/8 → 745/64) ⇝ 165/14 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 323/28 ⇜ (93/8 → 745/64) ⇝ 165/14 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 323/28 ⇜ (93/8 → 745/64) ⇝ 165/14 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 323/28 ⇜ (93/8 → 745/64) ⇝ 165/14 | note:84 gain:0.044 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 23/2 ⇜ (745/64 → 373/32) ⇝ 47/4 | note:F2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 323/28 ⇜ (745/64 → 373/32) ⇝ 165/14 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 323/28 ⇜ (745/64 → 373/32) ⇝ 165/14 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 323/28 ⇜ (745/64 → 373/32) ⇝ 165/14 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 323/28 ⇜ (745/64 → 373/32) ⇝ 165/14 | note:84 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 23/2 ⇜ (373/32 → 747/64) ⇝ 47/4 | note:F2 gain:0.64 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 323/28 ⇜ (373/32 → 747/64) ⇝ 165/14 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 323/28 ⇜ (373/32 → 747/64) ⇝ 165/14 | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 323/28 ⇜ (373/32 → 747/64) ⇝ 165/14 | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 323/28 ⇜ (373/32 → 747/64) ⇝ 165/14 | note:84 gain:0.064 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 23/2 ⇜ (747/64 → 187/16) ⇝ 47/4 | note:F2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 323/28 ⇜ (747/64 → 187/16) ⇝ 165/14 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 323/28 ⇜ (747/64 → 187/16) ⇝ 165/14 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 323/28 ⇜ (747/64 → 187/16) ⇝ 165/14 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 323/28 ⇜ (747/64 → 187/16) ⇝ 165/14 | note:84 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 23/2 ⇜ (187/16 → 749/64) ⇝ 47/4 | note:F2 gain:0.44 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 323/28 ⇜ (187/16 → 749/64) ⇝ 165/14 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 323/28 ⇜ (187/16 → 749/64) ⇝ 165/14 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 323/28 ⇜ (187/16 → 749/64) ⇝ 165/14 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 323/28 ⇜ (187/16 → 749/64) ⇝ 165/14 | note:84 gain:0.044 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 23/2 ⇜ (749/64 → 375/32) ⇝ 47/4 | note:F2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 323/28 ⇜ (749/64 → 375/32) ⇝ 165/14 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 323/28 ⇜ (749/64 → 375/32) ⇝ 165/14 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 323/28 ⇜ (749/64 → 375/32) ⇝ 165/14 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 323/28 ⇜ (749/64 → 375/32) ⇝ 165/14 | note:84 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 23/2 ⇜ (375/32 → 751/64) ⇝ 47/4 | note:F2 gain:0.24 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 323/28 ⇜ (375/32 → 751/64) ⇝ 165/14 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 323/28 ⇜ (375/32 → 751/64) ⇝ 165/14 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 323/28 ⇜ (375/32 → 751/64) ⇝ 165/14 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 323/28 ⇜ (375/32 → 751/64) ⇝ 165/14 | note:84 gain:0.024 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 23/2 ⇜ (751/64 → 47/4) | note:F2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.439814814815 ]", + "[ 323/28 ⇜ (751/64 → 47/4) ⇝ 165/14 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 323/28 ⇜ (751/64 → 47/4) ⇝ 165/14 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 323/28 ⇜ (751/64 → 47/4) ⇝ 165/14 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 323/28 ⇜ (751/64 → 47/4) ⇝ 165/14 | note:84 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 323/28 ⇜ (47/4 → 753/64) ⇝ 165/14 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 323/28 ⇜ (47/4 → 753/64) ⇝ 165/14 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 323/28 ⇜ (47/4 → 753/64) ⇝ 165/14 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 323/28 ⇜ (47/4 → 753/64) ⇝ 165/14 | note:84 gain:0.044 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ (47/4 → 753/64) ⇝ 95/8 | note:C5 gain:0.44 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ (47/4 → 753/64) ⇝ 95/8 | note:G5 gain:0.44 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ (47/4 → 753/64) ⇝ 95/8 | note:Bb5 gain:0.44 clip:1 s:piano release:0.1 pan:0.62962962963 ]", + "[ (47/4 → 753/64) ⇝ 12/1 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ (47/4 → 753/64) ⇝ 12/1 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ (47/4 → 753/64) ⇝ 12/1 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ (47/4 → 753/64) ⇝ 12/1 | note:C5 gain:0.22 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 323/28 ⇜ (753/64 → 377/32) ⇝ 165/14 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 323/28 ⇜ (753/64 → 377/32) ⇝ 165/14 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 323/28 ⇜ (753/64 → 377/32) ⇝ 165/14 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 323/28 ⇜ (753/64 → 377/32) ⇝ 165/14 | note:84 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 47/4 ⇜ (753/64 → 377/32) ⇝ 95/8 | note:C5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 47/4 ⇜ (753/64 → 377/32) ⇝ 95/8 | note:G5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 47/4 ⇜ (753/64 → 377/32) ⇝ 95/8 | note:Bb5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.62962962963 ]", + "[ 47/4 ⇜ (753/64 → 377/32) ⇝ 12/1 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 47/4 ⇜ (753/64 → 377/32) ⇝ 12/1 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 47/4 ⇜ (753/64 → 377/32) ⇝ 12/1 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 47/4 ⇜ (753/64 → 377/32) ⇝ 12/1 | note:C5 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 323/28 ⇜ (377/32 → 165/14) | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 323/28 ⇜ (377/32 → 165/14) | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 323/28 ⇜ (377/32 → 165/14) | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 323/28 ⇜ (377/32 → 165/14) | note:84 gain:0.064 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 47/4 ⇜ (377/32 → 755/64) ⇝ 95/8 | note:C5 gain:0.64 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 47/4 ⇜ (377/32 → 755/64) ⇝ 95/8 | note:G5 gain:0.64 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 47/4 ⇜ (377/32 → 755/64) ⇝ 95/8 | note:Bb5 gain:0.64 clip:1 s:piano release:0.1 pan:0.62962962963 ]", + "[ 47/4 ⇜ (377/32 → 755/64) ⇝ 12/1 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 47/4 ⇜ (377/32 → 755/64) ⇝ 12/1 | note:G4 gain:0.32 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 47/4 ⇜ (377/32 → 755/64) ⇝ 12/1 | note:Ab4 gain:0.32 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 47/4 ⇜ (377/32 → 755/64) ⇝ 12/1 | note:C5 gain:0.32 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 47/4 ⇜ (755/64 → 189/16) ⇝ 95/8 | note:C5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 47/4 ⇜ (755/64 → 189/16) ⇝ 95/8 | note:G5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 47/4 ⇜ (755/64 → 189/16) ⇝ 95/8 | note:Bb5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.62962962963 ]", + "[ 47/4 ⇜ (755/64 → 189/16) ⇝ 12/1 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 47/4 ⇜ (755/64 → 189/16) ⇝ 12/1 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 47/4 ⇜ (755/64 → 189/16) ⇝ 12/1 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 47/4 ⇜ (755/64 → 189/16) ⇝ 12/1 | note:C5 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 47/4 ⇜ (189/16 → 757/64) ⇝ 95/8 | note:C5 gain:0.44 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 47/4 ⇜ (189/16 → 757/64) ⇝ 95/8 | note:G5 gain:0.44 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 47/4 ⇜ (189/16 → 757/64) ⇝ 95/8 | note:Bb5 gain:0.44 clip:1 s:piano release:0.1 pan:0.62962962963 ]", + "[ 47/4 ⇜ (189/16 → 757/64) ⇝ 12/1 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 47/4 ⇜ (189/16 → 757/64) ⇝ 12/1 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 47/4 ⇜ (189/16 → 757/64) ⇝ 12/1 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 47/4 ⇜ (189/16 → 757/64) ⇝ 12/1 | note:C5 gain:0.22 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 47/4 ⇜ (757/64 → 379/32) ⇝ 95/8 | note:C5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 47/4 ⇜ (757/64 → 379/32) ⇝ 95/8 | note:G5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 47/4 ⇜ (757/64 → 379/32) ⇝ 95/8 | note:Bb5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.62962962963 ]", + "[ 47/4 ⇜ (757/64 → 379/32) ⇝ 12/1 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 47/4 ⇜ (757/64 → 379/32) ⇝ 12/1 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 47/4 ⇜ (757/64 → 379/32) ⇝ 12/1 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 47/4 ⇜ (757/64 → 379/32) ⇝ 12/1 | note:C5 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 47/4 ⇜ (379/32 → 759/64) ⇝ 95/8 | note:C5 gain:0.24 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 47/4 ⇜ (379/32 → 759/64) ⇝ 95/8 | note:G5 gain:0.24 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 47/4 ⇜ (379/32 → 759/64) ⇝ 95/8 | note:Bb5 gain:0.24 clip:1 s:piano release:0.1 pan:0.62962962963 ]", + "[ 47/4 ⇜ (379/32 → 759/64) ⇝ 12/1 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 47/4 ⇜ (379/32 → 759/64) ⇝ 12/1 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 47/4 ⇜ (379/32 → 759/64) ⇝ 12/1 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 47/4 ⇜ (379/32 → 759/64) ⇝ 12/1 | note:C5 gain:0.12 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 47/4 ⇜ (759/64 → 95/8) | note:C5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 47/4 ⇜ (759/64 → 95/8) | note:G5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 47/4 ⇜ (759/64 → 95/8) | note:Bb5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.62962962963 ]", + "[ 47/4 ⇜ (759/64 → 95/8) ⇝ 12/1 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 47/4 ⇜ (759/64 → 95/8) ⇝ 12/1 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 47/4 ⇜ (759/64 → 95/8) ⇝ 12/1 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 47/4 ⇜ (759/64 → 95/8) ⇝ 12/1 | note:C5 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 47/4 ⇜ (95/8 → 761/64) ⇝ 12/1 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 47/4 ⇜ (95/8 → 761/64) ⇝ 12/1 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 47/4 ⇜ (95/8 → 761/64) ⇝ 12/1 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 47/4 ⇜ (95/8 → 761/64) ⇝ 12/1 | note:C5 gain:0.22 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 47/4 ⇜ (761/64 → 381/32) ⇝ 12/1 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 47/4 ⇜ (761/64 → 381/32) ⇝ 12/1 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 47/4 ⇜ (761/64 → 381/32) ⇝ 12/1 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 47/4 ⇜ (761/64 → 381/32) ⇝ 12/1 | note:C5 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 47/4 ⇜ (381/32 → 763/64) ⇝ 12/1 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 47/4 ⇜ (381/32 → 763/64) ⇝ 12/1 | note:G4 gain:0.32 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 47/4 ⇜ (381/32 → 763/64) ⇝ 12/1 | note:Ab4 gain:0.32 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 47/4 ⇜ (381/32 → 763/64) ⇝ 12/1 | note:C5 gain:0.32 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 47/4 ⇜ (763/64 → 191/16) ⇝ 12/1 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 47/4 ⇜ (763/64 → 191/16) ⇝ 12/1 | note:G4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 47/4 ⇜ (763/64 → 191/16) ⇝ 12/1 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 47/4 ⇜ (763/64 → 191/16) ⇝ 12/1 | note:C5 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 47/4 ⇜ (191/16 → 765/64) ⇝ 12/1 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 47/4 ⇜ (191/16 → 765/64) ⇝ 12/1 | note:G4 gain:0.22 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 47/4 ⇜ (191/16 → 765/64) ⇝ 12/1 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 47/4 ⇜ (191/16 → 765/64) ⇝ 12/1 | note:C5 gain:0.22 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 47/4 ⇜ (765/64 → 383/32) ⇝ 12/1 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 47/4 ⇜ (765/64 → 383/32) ⇝ 12/1 | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 47/4 ⇜ (765/64 → 383/32) ⇝ 12/1 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 47/4 ⇜ (765/64 → 383/32) ⇝ 12/1 | note:C5 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 47/4 ⇜ (383/32 → 767/64) ⇝ 12/1 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 47/4 ⇜ (383/32 → 767/64) ⇝ 12/1 | note:G4 gain:0.12 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 47/4 ⇜ (383/32 → 767/64) ⇝ 12/1 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 47/4 ⇜ (383/32 → 767/64) ⇝ 12/1 | note:C5 gain:0.12 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ 47/4 ⇜ (767/64 → 12/1) | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 47/4 ⇜ (767/64 → 12/1) | note:G4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 47/4 ⇜ (767/64 → 12/1) | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 47/4 ⇜ (767/64 → 12/1) | note:C5 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.583333333333 ]", + "[ (12/1 → 769/64) ⇝ 49/4 | note:G2 gain:0.44 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 12/1 ⇜ (769/64 → 385/32) ⇝ 49/4 | note:G2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 12/1 ⇜ (385/32 → 771/64) ⇝ 49/4 | note:G2 gain:0.64 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ (337/28 → 771/64) ⇝ 86/7 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ (337/28 → 771/64) ⇝ 86/7 | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ (337/28 → 771/64) ⇝ 86/7 | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ (337/28 → 771/64) ⇝ 86/7 | note:84 gain:0.064 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 12/1 ⇜ (771/64 → 193/16) ⇝ 49/4 | note:G2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 337/28 ⇜ (771/64 → 193/16) ⇝ 86/7 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 337/28 ⇜ (771/64 → 193/16) ⇝ 86/7 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 337/28 ⇜ (771/64 → 193/16) ⇝ 86/7 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 337/28 ⇜ (771/64 → 193/16) ⇝ 86/7 | note:84 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 12/1 ⇜ (193/16 → 773/64) ⇝ 49/4 | note:G2 gain:0.44 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 337/28 ⇜ (193/16 → 773/64) ⇝ 86/7 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 337/28 ⇜ (193/16 → 773/64) ⇝ 86/7 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 337/28 ⇜ (193/16 → 773/64) ⇝ 86/7 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 337/28 ⇜ (193/16 → 773/64) ⇝ 86/7 | note:84 gain:0.044 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 12/1 ⇜ (773/64 → 387/32) ⇝ 49/4 | note:G2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 337/28 ⇜ (773/64 → 387/32) ⇝ 86/7 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 337/28 ⇜ (773/64 → 387/32) ⇝ 86/7 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 337/28 ⇜ (773/64 → 387/32) ⇝ 86/7 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 337/28 ⇜ (773/64 → 387/32) ⇝ 86/7 | note:84 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 12/1 ⇜ (387/32 → 775/64) ⇝ 49/4 | note:G2 gain:0.24 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 337/28 ⇜ (387/32 → 775/64) ⇝ 86/7 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 337/28 ⇜ (387/32 → 775/64) ⇝ 86/7 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 337/28 ⇜ (387/32 → 775/64) ⇝ 86/7 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 337/28 ⇜ (387/32 → 775/64) ⇝ 86/7 | note:84 gain:0.024 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 12/1 ⇜ (775/64 → 97/8) ⇝ 49/4 | note:G2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 337/28 ⇜ (775/64 → 97/8) ⇝ 86/7 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 337/28 ⇜ (775/64 → 97/8) ⇝ 86/7 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 337/28 ⇜ (775/64 → 97/8) ⇝ 86/7 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 337/28 ⇜ (775/64 → 97/8) ⇝ 86/7 | note:84 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 12/1 ⇜ (97/8 → 777/64) ⇝ 49/4 | note:G2 gain:0.44 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 337/28 ⇜ (97/8 → 777/64) ⇝ 86/7 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 337/28 ⇜ (97/8 → 777/64) ⇝ 86/7 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 337/28 ⇜ (97/8 → 777/64) ⇝ 86/7 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 337/28 ⇜ (97/8 → 777/64) ⇝ 86/7 | note:84 gain:0.044 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ (97/8 → 777/64) ⇝ 49/4 | note:G4 gain:0.44 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ (97/8 → 777/64) ⇝ 49/4 | note:D5 gain:0.44 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ (97/8 → 777/64) ⇝ 49/4 | note:F5 gain:0.44 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 12/1 ⇜ (777/64 → 389/32) ⇝ 49/4 | note:G2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 337/28 ⇜ (777/64 → 389/32) ⇝ 86/7 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 337/28 ⇜ (777/64 → 389/32) ⇝ 86/7 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 337/28 ⇜ (777/64 → 389/32) ⇝ 86/7 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 337/28 ⇜ (777/64 → 389/32) ⇝ 86/7 | note:84 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 97/8 ⇜ (777/64 → 389/32) ⇝ 49/4 | note:G4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 97/8 ⇜ (777/64 → 389/32) ⇝ 49/4 | note:D5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 97/8 ⇜ (777/64 → 389/32) ⇝ 49/4 | note:F5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 12/1 ⇜ (389/32 → 779/64) ⇝ 49/4 | note:G2 gain:0.64 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 337/28 ⇜ (389/32 → 779/64) ⇝ 86/7 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 337/28 ⇜ (389/32 → 779/64) ⇝ 86/7 | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 337/28 ⇜ (389/32 → 779/64) ⇝ 86/7 | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 337/28 ⇜ (389/32 → 779/64) ⇝ 86/7 | note:84 gain:0.064 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 97/8 ⇜ (389/32 → 779/64) ⇝ 49/4 | note:G4 gain:0.64 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 97/8 ⇜ (389/32 → 779/64) ⇝ 49/4 | note:D5 gain:0.64 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 97/8 ⇜ (389/32 → 779/64) ⇝ 49/4 | note:F5 gain:0.64 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 12/1 ⇜ (779/64 → 195/16) ⇝ 49/4 | note:G2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 337/28 ⇜ (779/64 → 195/16) ⇝ 86/7 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 337/28 ⇜ (779/64 → 195/16) ⇝ 86/7 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 337/28 ⇜ (779/64 → 195/16) ⇝ 86/7 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 337/28 ⇜ (779/64 → 195/16) ⇝ 86/7 | note:84 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 97/8 ⇜ (779/64 → 195/16) ⇝ 49/4 | note:G4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 97/8 ⇜ (779/64 → 195/16) ⇝ 49/4 | note:D5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 97/8 ⇜ (779/64 → 195/16) ⇝ 49/4 | note:F5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 12/1 ⇜ (195/16 → 781/64) ⇝ 49/4 | note:G2 gain:0.44 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 337/28 ⇜ (195/16 → 781/64) ⇝ 86/7 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 337/28 ⇜ (195/16 → 781/64) ⇝ 86/7 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 337/28 ⇜ (195/16 → 781/64) ⇝ 86/7 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 337/28 ⇜ (195/16 → 781/64) ⇝ 86/7 | note:84 gain:0.044 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 97/8 ⇜ (195/16 → 781/64) ⇝ 49/4 | note:G4 gain:0.44 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 97/8 ⇜ (195/16 → 781/64) ⇝ 49/4 | note:D5 gain:0.44 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 97/8 ⇜ (195/16 → 781/64) ⇝ 49/4 | note:F5 gain:0.44 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 12/1 ⇜ (781/64 → 391/32) ⇝ 49/4 | note:G2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 337/28 ⇜ (781/64 → 391/32) ⇝ 86/7 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 337/28 ⇜ (781/64 → 391/32) ⇝ 86/7 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 337/28 ⇜ (781/64 → 391/32) ⇝ 86/7 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 337/28 ⇜ (781/64 → 391/32) ⇝ 86/7 | note:84 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 97/8 ⇜ (781/64 → 391/32) ⇝ 49/4 | note:G4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 97/8 ⇜ (781/64 → 391/32) ⇝ 49/4 | note:D5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 97/8 ⇜ (781/64 → 391/32) ⇝ 49/4 | note:F5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 12/1 ⇜ (391/32 → 783/64) ⇝ 49/4 | note:G2 gain:0.24 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 337/28 ⇜ (391/32 → 783/64) ⇝ 86/7 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 337/28 ⇜ (391/32 → 783/64) ⇝ 86/7 | note:79 gain:0.024 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 337/28 ⇜ (391/32 → 783/64) ⇝ 86/7 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 337/28 ⇜ (391/32 → 783/64) ⇝ 86/7 | note:84 gain:0.024 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 97/8 ⇜ (391/32 → 783/64) ⇝ 49/4 | note:G4 gain:0.24 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 97/8 ⇜ (391/32 → 783/64) ⇝ 49/4 | note:D5 gain:0.24 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 97/8 ⇜ (391/32 → 783/64) ⇝ 49/4 | note:F5 gain:0.24 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 12/1 ⇜ (783/64 → 49/4) | note:G2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 337/28 ⇜ (783/64 → 49/4) ⇝ 86/7 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 337/28 ⇜ (783/64 → 49/4) ⇝ 86/7 | note:79 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 337/28 ⇜ (783/64 → 49/4) ⇝ 86/7 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 337/28 ⇜ (783/64 → 49/4) ⇝ 86/7 | note:84 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 97/8 ⇜ (783/64 → 49/4) | note:G4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 97/8 ⇜ (783/64 → 49/4) | note:D5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 97/8 ⇜ (783/64 → 49/4) | note:F5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 337/28 ⇜ (49/4 → 785/64) ⇝ 86/7 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 337/28 ⇜ (49/4 → 785/64) ⇝ 86/7 | note:79 gain:0.044 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 337/28 ⇜ (49/4 → 785/64) ⇝ 86/7 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 337/28 ⇜ (49/4 → 785/64) ⇝ 86/7 | note:84 gain:0.044 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 337/28 ⇜ (785/64 → 393/32) ⇝ 86/7 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 337/28 ⇜ (785/64 → 393/32) ⇝ 86/7 | note:79 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 337/28 ⇜ (785/64 → 393/32) ⇝ 86/7 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 337/28 ⇜ (785/64 → 393/32) ⇝ 86/7 | note:84 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 337/28 ⇜ (393/32 → 86/7) | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 337/28 ⇜ (393/32 → 86/7) | note:79 gain:0.064 clip:1 s:piano release:0.1 pan:0.615740740741 ]", + "[ 337/28 ⇜ (393/32 → 86/7) | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 337/28 ⇜ (393/32 → 86/7) | note:84 gain:0.064 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ (25/2 → 801/64) ⇝ 101/8 | note:D5 gain:0.44 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ (25/2 → 801/64) ⇝ 101/8 | note:A5 gain:0.44 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ (25/2 → 801/64) ⇝ 101/8 | note:C6 gain:0.44 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ (25/2 → 801/64) ⇝ 51/4 | note:B3 gain:0.22 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ (25/2 → 801/64) ⇝ 51/4 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (25/2 → 801/64) ⇝ 51/4 | note:F4 gain:0.22 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ (25/2 → 801/64) ⇝ 51/4 | note:A4 gain:0.22 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ (25/2 → 801/64) ⇝ 51/4 | note:G2 gain:0.44 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 25/2 ⇜ (801/64 → 401/32) ⇝ 101/8 | note:D5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 25/2 ⇜ (801/64 → 401/32) ⇝ 101/8 | note:A5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 25/2 ⇜ (801/64 → 401/32) ⇝ 101/8 | note:C6 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 25/2 ⇜ (801/64 → 401/32) ⇝ 51/4 | note:B3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 25/2 ⇜ (801/64 → 401/32) ⇝ 51/4 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 25/2 ⇜ (801/64 → 401/32) ⇝ 51/4 | note:F4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 25/2 ⇜ (801/64 → 401/32) ⇝ 51/4 | note:A4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 25/2 ⇜ (801/64 → 401/32) ⇝ 51/4 | note:G2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 25/2 ⇜ (401/32 → 803/64) ⇝ 101/8 | note:D5 gain:0.64 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 25/2 ⇜ (401/32 → 803/64) ⇝ 101/8 | note:A5 gain:0.64 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 25/2 ⇜ (401/32 → 803/64) ⇝ 101/8 | note:C6 gain:0.64 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 25/2 ⇜ (401/32 → 803/64) ⇝ 51/4 | note:B3 gain:0.32 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 25/2 ⇜ (401/32 → 803/64) ⇝ 51/4 | note:E4 gain:0.32 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 25/2 ⇜ (401/32 → 803/64) ⇝ 51/4 | note:F4 gain:0.32 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 25/2 ⇜ (401/32 → 803/64) ⇝ 51/4 | note:A4 gain:0.32 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 25/2 ⇜ (401/32 → 803/64) ⇝ 51/4 | note:G2 gain:0.64 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 25/2 ⇜ (803/64 → 201/16) ⇝ 101/8 | note:D5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 25/2 ⇜ (803/64 → 201/16) ⇝ 101/8 | note:A5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 25/2 ⇜ (803/64 → 201/16) ⇝ 101/8 | note:C6 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 25/2 ⇜ (803/64 → 201/16) ⇝ 51/4 | note:B3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 25/2 ⇜ (803/64 → 201/16) ⇝ 51/4 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 25/2 ⇜ (803/64 → 201/16) ⇝ 51/4 | note:F4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 25/2 ⇜ (803/64 → 201/16) ⇝ 51/4 | note:A4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 25/2 ⇜ (803/64 → 201/16) ⇝ 51/4 | note:G2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 25/2 ⇜ (201/16 → 805/64) ⇝ 101/8 | note:D5 gain:0.44 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 25/2 ⇜ (201/16 → 805/64) ⇝ 101/8 | note:A5 gain:0.44 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 25/2 ⇜ (201/16 → 805/64) ⇝ 101/8 | note:C6 gain:0.44 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 25/2 ⇜ (201/16 → 805/64) ⇝ 51/4 | note:B3 gain:0.22 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 25/2 ⇜ (201/16 → 805/64) ⇝ 51/4 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 25/2 ⇜ (201/16 → 805/64) ⇝ 51/4 | note:F4 gain:0.22 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 25/2 ⇜ (201/16 → 805/64) ⇝ 51/4 | note:A4 gain:0.22 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 25/2 ⇜ (201/16 → 805/64) ⇝ 51/4 | note:G2 gain:0.44 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 25/2 ⇜ (805/64 → 403/32) ⇝ 101/8 | note:D5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 25/2 ⇜ (805/64 → 403/32) ⇝ 101/8 | note:A5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 25/2 ⇜ (805/64 → 403/32) ⇝ 101/8 | note:C6 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 25/2 ⇜ (805/64 → 403/32) ⇝ 51/4 | note:B3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 25/2 ⇜ (805/64 → 403/32) ⇝ 51/4 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 25/2 ⇜ (805/64 → 403/32) ⇝ 51/4 | note:F4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 25/2 ⇜ (805/64 → 403/32) ⇝ 51/4 | note:A4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 25/2 ⇜ (805/64 → 403/32) ⇝ 51/4 | note:G2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 25/2 ⇜ (403/32 → 807/64) ⇝ 101/8 | note:D5 gain:0.24 clip:1 s:piano release:0.1 pan:0.592592592593 ]", "[ 25/2 ⇜ (403/32 → 807/64) ⇝ 101/8 | note:A5 gain:0.24 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 25/2 ⇜ (403/32 → 807/64) ⇝ 101/8 | note:C6 gain:0.24 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 25/2 ⇜ (403/32 → 807/64) ⇝ 51/4 | note:B3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 25/2 ⇜ (403/32 → 807/64) ⇝ 51/4 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 25/2 ⇜ (403/32 → 807/64) ⇝ 51/4 | note:F4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 25/2 ⇜ (403/32 → 807/64) ⇝ 51/4 | note:A4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 25/2 ⇜ (403/32 → 807/64) ⇝ 51/4 | note:G2 gain:0.24 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 25/2 ⇜ (807/64 → 101/8) | note:D5 gain:0.29857864376269244 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 25/2 ⇜ (807/64 → 101/8) | note:A5 gain:0.29857864376269244 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 25/2 ⇜ (807/64 → 101/8) | note:C6 gain:0.29857864376269244 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 25/2 ⇜ (807/64 → 101/8) ⇝ 51/4 | note:B3 gain:0.14928932188134622 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 25/2 ⇜ (807/64 → 101/8) ⇝ 51/4 | note:E4 gain:0.14928932188134622 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 25/2 ⇜ (807/64 → 101/8) ⇝ 51/4 | note:F4 gain:0.14928932188134622 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 25/2 ⇜ (807/64 → 101/8) ⇝ 51/4 | note:A4 gain:0.14928932188134622 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 25/2 ⇜ (807/64 → 101/8) ⇝ 51/4 | note:G2 gain:0.29857864376269244 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 25/2 ⇜ (101/8 → 809/64) ⇝ 51/4 | note:B3 gain:0.21999999999999825 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 25/2 ⇜ (101/8 → 809/64) ⇝ 51/4 | note:E4 gain:0.21999999999999825 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 25/2 ⇜ (101/8 → 809/64) ⇝ 51/4 | note:F4 gain:0.21999999999999825 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 25/2 ⇜ (101/8 → 809/64) ⇝ 51/4 | note:A4 gain:0.21999999999999825 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 25/2 ⇜ (101/8 → 809/64) ⇝ 51/4 | note:G2 gain:0.4399999999999965 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 25/2 ⇜ (809/64 → 405/32) ⇝ 51/4 | note:B3 gain:0.2907106781186513 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 25/2 ⇜ (809/64 → 405/32) ⇝ 51/4 | note:E4 gain:0.2907106781186513 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 25/2 ⇜ (809/64 → 405/32) ⇝ 51/4 | note:F4 gain:0.2907106781186513 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 25/2 ⇜ (809/64 → 405/32) ⇝ 51/4 | note:A4 gain:0.2907106781186513 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 25/2 ⇜ (809/64 → 405/32) ⇝ 51/4 | note:G2 gain:0.5814213562373026 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 25/2 ⇜ (405/32 → 811/64) ⇝ 51/4 | note:B3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 25/2 ⇜ (405/32 → 811/64) ⇝ 51/4 | note:E4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 25/2 ⇜ (405/32 → 811/64) ⇝ 51/4 | note:F4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 25/2 ⇜ (405/32 → 811/64) ⇝ 51/4 | note:A4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 25/2 ⇜ (405/32 → 811/64) ⇝ 51/4 | note:G2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 25/2 ⇜ (811/64 → 203/16) ⇝ 51/4 | note:B3 gain:0.29071067811865453 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 25/2 ⇜ (811/64 → 203/16) ⇝ 51/4 | note:E4 gain:0.29071067811865453 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 25/2 ⇜ (811/64 → 203/16) ⇝ 51/4 | note:F4 gain:0.29071067811865453 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 25/2 ⇜ (811/64 → 203/16) ⇝ 51/4 | note:A4 gain:0.29071067811865453 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 25/2 ⇜ (811/64 → 203/16) ⇝ 51/4 | note:G2 gain:0.5814213562373091 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 25/2 ⇜ (203/16 → 813/64) ⇝ 51/4 | note:B3 gain:0.22000000000000286 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 25/2 ⇜ (203/16 → 813/64) ⇝ 51/4 | note:E4 gain:0.22000000000000286 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 25/2 ⇜ (203/16 → 813/64) ⇝ 51/4 | note:F4 gain:0.22000000000000286 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 25/2 ⇜ (203/16 → 813/64) ⇝ 51/4 | note:A4 gain:0.22000000000000286 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 25/2 ⇜ (203/16 → 813/64) ⇝ 51/4 | note:G2 gain:0.4400000000000057 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 25/2 ⇜ (813/64 → 407/32) ⇝ 51/4 | note:B3 gain:0.14928932188134944 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 25/2 ⇜ (813/64 → 407/32) ⇝ 51/4 | note:E4 gain:0.14928932188134944 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 25/2 ⇜ (813/64 → 407/32) ⇝ 51/4 | note:F4 gain:0.14928932188134944 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 25/2 ⇜ (813/64 → 407/32) ⇝ 51/4 | note:A4 gain:0.14928932188134944 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 25/2 ⇜ (813/64 → 407/32) ⇝ 51/4 | note:G2 gain:0.2985786437626989 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 25/2 ⇜ (407/32 → 815/64) ⇝ 51/4 | note:B3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 25/2 ⇜ (407/32 → 815/64) ⇝ 51/4 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 25/2 ⇜ (407/32 → 815/64) ⇝ 51/4 | note:F4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 25/2 ⇜ (407/32 → 815/64) ⇝ 51/4 | note:A4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 25/2 ⇜ (407/32 → 815/64) ⇝ 51/4 | note:G2 gain:0.24 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 25/2 ⇜ (815/64 → 51/4) | note:B3 gain:0.14928932188134467 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 25/2 ⇜ (815/64 → 51/4) | note:E4 gain:0.14928932188134467 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 25/2 ⇜ (815/64 → 51/4) | note:F4 gain:0.14928932188134467 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 25/2 ⇜ (815/64 → 51/4) | note:A4 gain:0.14928932188134467 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 25/2 ⇜ (815/64 → 51/4) | note:G2 gain:0.29857864376268933 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ (51/4 → 817/64) ⇝ 103/8 | note:G4 gain:0.4399999999999922 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (51/4 → 817/64) ⇝ 103/8 | note:D5 gain:0.4399999999999922 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ (51/4 → 817/64) ⇝ 103/8 | note:F5 gain:0.4399999999999922 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 51/4 ⇜ (817/64 → 409/32) ⇝ 103/8 | note:G4 gain:0.5814213562372995 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 51/4 ⇜ (817/64 → 409/32) ⇝ 103/8 | note:D5 gain:0.5814213562372995 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 51/4 ⇜ (817/64 → 409/32) ⇝ 103/8 | note:F5 gain:0.5814213562372995 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 51/4 ⇜ (409/32 → 819/64) ⇝ 103/8 | note:G4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 51/4 ⇜ (409/32 → 819/64) ⇝ 103/8 | note:D5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 51/4 ⇜ (409/32 → 819/64) ⇝ 103/8 | note:F5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ (179/14 → 819/64) ⇝ 365/28 | note:71 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ (179/14 → 819/64) ⇝ 365/28 | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ (179/14 → 819/64) ⇝ 365/28 | note:77 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ (179/14 → 819/64) ⇝ 365/28 | note:81 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 51/4 ⇜ (819/64 → 205/16) ⇝ 103/8 | note:G4 gain:0.5814213562373122 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 51/4 ⇜ (819/64 → 205/16) ⇝ 103/8 | note:D5 gain:0.5814213562373122 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 51/4 ⇜ (819/64 → 205/16) ⇝ 103/8 | note:F5 gain:0.5814213562373122 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 179/14 ⇜ (819/64 → 205/16) ⇝ 365/28 | note:71 gain:0.05814213562373122 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 179/14 ⇜ (819/64 → 205/16) ⇝ 365/28 | note:76 gain:0.05814213562373122 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 179/14 ⇜ (819/64 → 205/16) ⇝ 365/28 | note:77 gain:0.05814213562373122 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 179/14 ⇜ (819/64 → 205/16) ⇝ 365/28 | note:81 gain:0.05814213562373122 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 51/4 ⇜ (205/16 → 821/64) ⇝ 103/8 | note:G4 gain:0.44000000000001 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 51/4 ⇜ (205/16 → 821/64) ⇝ 103/8 | note:D5 gain:0.44000000000001 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 51/4 ⇜ (205/16 → 821/64) ⇝ 103/8 | note:F5 gain:0.44000000000001 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 179/14 ⇜ (205/16 → 821/64) ⇝ 365/28 | note:71 gain:0.044000000000001004 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 179/14 ⇜ (205/16 → 821/64) ⇝ 365/28 | note:76 gain:0.044000000000001004 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 179/14 ⇜ (205/16 → 821/64) ⇝ 365/28 | note:77 gain:0.044000000000001004 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 179/14 ⇜ (205/16 → 821/64) ⇝ 365/28 | note:81 gain:0.044000000000001004 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 51/4 ⇜ (821/64 → 411/32) ⇝ 103/8 | note:G4 gain:0.298578643762702 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 51/4 ⇜ (821/64 → 411/32) ⇝ 103/8 | note:D5 gain:0.298578643762702 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 51/4 ⇜ (821/64 → 411/32) ⇝ 103/8 | note:F5 gain:0.298578643762702 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 179/14 ⇜ (821/64 → 411/32) ⇝ 365/28 | note:71 gain:0.0298578643762702 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 179/14 ⇜ (821/64 → 411/32) ⇝ 365/28 | note:76 gain:0.0298578643762702 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 179/14 ⇜ (821/64 → 411/32) ⇝ 365/28 | note:77 gain:0.0298578643762702 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 179/14 ⇜ (821/64 → 411/32) ⇝ 365/28 | note:81 gain:0.0298578643762702 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 51/4 ⇜ (411/32 → 823/64) ⇝ 103/8 | note:G4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 51/4 ⇜ (411/32 → 823/64) ⇝ 103/8 | note:D5 gain:0.24 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 51/4 ⇜ (411/32 → 823/64) ⇝ 103/8 | note:F5 gain:0.24 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 179/14 ⇜ (411/32 → 823/64) ⇝ 365/28 | note:71 gain:0.024 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 179/14 ⇜ (411/32 → 823/64) ⇝ 365/28 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 179/14 ⇜ (411/32 → 823/64) ⇝ 365/28 | note:77 gain:0.024 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", + "[ 25/2 ⇜ (403/32 → 807/64) ⇝ 101/8 | note:C6 gain:0.24 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 25/2 ⇜ (403/32 → 807/64) ⇝ 51/4 | note:B3 gain:0.12 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 25/2 ⇜ (403/32 → 807/64) ⇝ 51/4 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 25/2 ⇜ (403/32 → 807/64) ⇝ 51/4 | note:F4 gain:0.12 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 25/2 ⇜ (403/32 → 807/64) ⇝ 51/4 | note:A4 gain:0.12 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 25/2 ⇜ (403/32 → 807/64) ⇝ 51/4 | note:G2 gain:0.24 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 25/2 ⇜ (807/64 → 101/8) | note:D5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 25/2 ⇜ (807/64 → 101/8) | note:A5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 25/2 ⇜ (807/64 → 101/8) | note:C6 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 25/2 ⇜ (807/64 → 101/8) ⇝ 51/4 | note:B3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 25/2 ⇜ (807/64 → 101/8) ⇝ 51/4 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 25/2 ⇜ (807/64 → 101/8) ⇝ 51/4 | note:F4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 25/2 ⇜ (807/64 → 101/8) ⇝ 51/4 | note:A4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 25/2 ⇜ (807/64 → 101/8) ⇝ 51/4 | note:G2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 25/2 ⇜ (101/8 → 809/64) ⇝ 51/4 | note:B3 gain:0.22 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 25/2 ⇜ (101/8 → 809/64) ⇝ 51/4 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 25/2 ⇜ (101/8 → 809/64) ⇝ 51/4 | note:F4 gain:0.22 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 25/2 ⇜ (101/8 → 809/64) ⇝ 51/4 | note:A4 gain:0.22 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 25/2 ⇜ (101/8 → 809/64) ⇝ 51/4 | note:G2 gain:0.44 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 25/2 ⇜ (809/64 → 405/32) ⇝ 51/4 | note:B3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 25/2 ⇜ (809/64 → 405/32) ⇝ 51/4 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 25/2 ⇜ (809/64 → 405/32) ⇝ 51/4 | note:F4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 25/2 ⇜ (809/64 → 405/32) ⇝ 51/4 | note:A4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 25/2 ⇜ (809/64 → 405/32) ⇝ 51/4 | note:G2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 25/2 ⇜ (405/32 → 811/64) ⇝ 51/4 | note:B3 gain:0.32 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 25/2 ⇜ (405/32 → 811/64) ⇝ 51/4 | note:E4 gain:0.32 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 25/2 ⇜ (405/32 → 811/64) ⇝ 51/4 | note:F4 gain:0.32 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 25/2 ⇜ (405/32 → 811/64) ⇝ 51/4 | note:A4 gain:0.32 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 25/2 ⇜ (405/32 → 811/64) ⇝ 51/4 | note:G2 gain:0.64 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 25/2 ⇜ (811/64 → 203/16) ⇝ 51/4 | note:B3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 25/2 ⇜ (811/64 → 203/16) ⇝ 51/4 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 25/2 ⇜ (811/64 → 203/16) ⇝ 51/4 | note:F4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 25/2 ⇜ (811/64 → 203/16) ⇝ 51/4 | note:A4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 25/2 ⇜ (811/64 → 203/16) ⇝ 51/4 | note:G2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 25/2 ⇜ (203/16 → 813/64) ⇝ 51/4 | note:B3 gain:0.22 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 25/2 ⇜ (203/16 → 813/64) ⇝ 51/4 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 25/2 ⇜ (203/16 → 813/64) ⇝ 51/4 | note:F4 gain:0.22 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 25/2 ⇜ (203/16 → 813/64) ⇝ 51/4 | note:A4 gain:0.22 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 25/2 ⇜ (203/16 → 813/64) ⇝ 51/4 | note:G2 gain:0.44 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 25/2 ⇜ (813/64 → 407/32) ⇝ 51/4 | note:B3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 25/2 ⇜ (813/64 → 407/32) ⇝ 51/4 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 25/2 ⇜ (813/64 → 407/32) ⇝ 51/4 | note:F4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 25/2 ⇜ (813/64 → 407/32) ⇝ 51/4 | note:A4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 25/2 ⇜ (813/64 → 407/32) ⇝ 51/4 | note:G2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 25/2 ⇜ (407/32 → 815/64) ⇝ 51/4 | note:B3 gain:0.12 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 25/2 ⇜ (407/32 → 815/64) ⇝ 51/4 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 25/2 ⇜ (407/32 → 815/64) ⇝ 51/4 | note:F4 gain:0.12 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 25/2 ⇜ (407/32 → 815/64) ⇝ 51/4 | note:A4 gain:0.12 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 25/2 ⇜ (407/32 → 815/64) ⇝ 51/4 | note:G2 gain:0.24 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 25/2 ⇜ (815/64 → 51/4) | note:B3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 25/2 ⇜ (815/64 → 51/4) | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 25/2 ⇜ (815/64 → 51/4) | note:F4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 25/2 ⇜ (815/64 → 51/4) | note:A4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 25/2 ⇜ (815/64 → 51/4) | note:G2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ (51/4 → 817/64) ⇝ 103/8 | note:G4 gain:0.44 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ (51/4 → 817/64) ⇝ 103/8 | note:D5 gain:0.44 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ (51/4 → 817/64) ⇝ 103/8 | note:F5 gain:0.44 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 51/4 ⇜ (817/64 → 409/32) ⇝ 103/8 | note:G4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 51/4 ⇜ (817/64 → 409/32) ⇝ 103/8 | note:D5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 51/4 ⇜ (817/64 → 409/32) ⇝ 103/8 | note:F5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 51/4 ⇜ (409/32 → 819/64) ⇝ 103/8 | note:G4 gain:0.64 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 51/4 ⇜ (409/32 → 819/64) ⇝ 103/8 | note:D5 gain:0.64 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 51/4 ⇜ (409/32 → 819/64) ⇝ 103/8 | note:F5 gain:0.64 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ (179/14 → 819/64) ⇝ 365/28 | note:71 gain:0.064 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ (179/14 → 819/64) ⇝ 365/28 | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ (179/14 → 819/64) ⇝ 365/28 | note:77 gain:0.064 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ (179/14 → 819/64) ⇝ 365/28 | note:81 gain:0.064 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 51/4 ⇜ (819/64 → 205/16) ⇝ 103/8 | note:G4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 51/4 ⇜ (819/64 → 205/16) ⇝ 103/8 | note:D5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 51/4 ⇜ (819/64 → 205/16) ⇝ 103/8 | note:F5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 179/14 ⇜ (819/64 → 205/16) ⇝ 365/28 | note:71 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 179/14 ⇜ (819/64 → 205/16) ⇝ 365/28 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 179/14 ⇜ (819/64 → 205/16) ⇝ 365/28 | note:77 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 179/14 ⇜ (819/64 → 205/16) ⇝ 365/28 | note:81 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 51/4 ⇜ (205/16 → 821/64) ⇝ 103/8 | note:G4 gain:0.44 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 51/4 ⇜ (205/16 → 821/64) ⇝ 103/8 | note:D5 gain:0.44 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 51/4 ⇜ (205/16 → 821/64) ⇝ 103/8 | note:F5 gain:0.44 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 179/14 ⇜ (205/16 → 821/64) ⇝ 365/28 | note:71 gain:0.044 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 179/14 ⇜ (205/16 → 821/64) ⇝ 365/28 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 179/14 ⇜ (205/16 → 821/64) ⇝ 365/28 | note:77 gain:0.044 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 179/14 ⇜ (205/16 → 821/64) ⇝ 365/28 | note:81 gain:0.044 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 51/4 ⇜ (821/64 → 411/32) ⇝ 103/8 | note:G4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 51/4 ⇜ (821/64 → 411/32) ⇝ 103/8 | note:D5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 51/4 ⇜ (821/64 → 411/32) ⇝ 103/8 | note:F5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 179/14 ⇜ (821/64 → 411/32) ⇝ 365/28 | note:71 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 179/14 ⇜ (821/64 → 411/32) ⇝ 365/28 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 179/14 ⇜ (821/64 → 411/32) ⇝ 365/28 | note:77 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 179/14 ⇜ (821/64 → 411/32) ⇝ 365/28 | note:81 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 51/4 ⇜ (411/32 → 823/64) ⇝ 103/8 | note:G4 gain:0.24 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 51/4 ⇜ (411/32 → 823/64) ⇝ 103/8 | note:D5 gain:0.24 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 51/4 ⇜ (411/32 → 823/64) ⇝ 103/8 | note:F5 gain:0.24 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 179/14 ⇜ (411/32 → 823/64) ⇝ 365/28 | note:71 gain:0.024 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 179/14 ⇜ (411/32 → 823/64) ⇝ 365/28 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 179/14 ⇜ (411/32 → 823/64) ⇝ 365/28 | note:77 gain:0.024 clip:1 s:piano release:0.1 pan:0.606481481481 ]", "[ 179/14 ⇜ (411/32 → 823/64) ⇝ 365/28 | note:81 gain:0.024 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 51/4 ⇜ (823/64 → 103/8) | note:G4 gain:0.2985786437626863 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 51/4 ⇜ (823/64 → 103/8) | note:D5 gain:0.2985786437626863 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 51/4 ⇜ (823/64 → 103/8) | note:F5 gain:0.2985786437626863 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 179/14 ⇜ (823/64 → 103/8) ⇝ 365/28 | note:71 gain:0.02985786437626863 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 179/14 ⇜ (823/64 → 103/8) ⇝ 365/28 | note:76 gain:0.02985786437626863 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 179/14 ⇜ (823/64 → 103/8) ⇝ 365/28 | note:77 gain:0.02985786437626863 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 179/14 ⇜ (823/64 → 103/8) ⇝ 365/28 | note:81 gain:0.02985786437626863 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 179/14 ⇜ (103/8 → 825/64) ⇝ 365/28 | note:71 gain:0.04399999999999879 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 179/14 ⇜ (103/8 → 825/64) ⇝ 365/28 | note:76 gain:0.04399999999999879 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 179/14 ⇜ (103/8 → 825/64) ⇝ 365/28 | note:77 gain:0.04399999999999879 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 179/14 ⇜ (103/8 → 825/64) ⇝ 365/28 | note:81 gain:0.04399999999999879 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 179/14 ⇜ (825/64 → 413/32) ⇝ 365/28 | note:71 gain:0.058142135623731266 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 179/14 ⇜ (825/64 → 413/32) ⇝ 365/28 | note:76 gain:0.058142135623731266 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 179/14 ⇜ (825/64 → 413/32) ⇝ 365/28 | note:77 gain:0.058142135623731266 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 179/14 ⇜ (825/64 → 413/32) ⇝ 365/28 | note:81 gain:0.058142135623731266 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 179/14 ⇜ (413/32 → 827/64) ⇝ 365/28 | note:71 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 179/14 ⇜ (413/32 → 827/64) ⇝ 365/28 | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 179/14 ⇜ (413/32 → 827/64) ⇝ 365/28 | note:77 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 179/14 ⇜ (413/32 → 827/64) ⇝ 365/28 | note:81 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 179/14 ⇜ (827/64 → 207/16) ⇝ 365/28 | note:71 gain:0.05814213562373153 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 179/14 ⇜ (827/64 → 207/16) ⇝ 365/28 | note:76 gain:0.05814213562373153 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 179/14 ⇜ (827/64 → 207/16) ⇝ 365/28 | note:77 gain:0.05814213562373153 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 179/14 ⇜ (827/64 → 207/16) ⇝ 365/28 | note:81 gain:0.05814213562373153 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 179/14 ⇜ (207/16 → 829/64) ⇝ 365/28 | note:71 gain:0.04400000000000143 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 179/14 ⇜ (207/16 → 829/64) ⇝ 365/28 | note:76 gain:0.04400000000000143 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 179/14 ⇜ (207/16 → 829/64) ⇝ 365/28 | note:77 gain:0.04400000000000143 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 179/14 ⇜ (207/16 → 829/64) ⇝ 365/28 | note:81 gain:0.04400000000000143 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 179/14 ⇜ (829/64 → 415/32) ⇝ 365/28 | note:71 gain:0.029857864376268896 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 179/14 ⇜ (829/64 → 415/32) ⇝ 365/28 | note:76 gain:0.029857864376268896 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 179/14 ⇜ (829/64 → 415/32) ⇝ 365/28 | note:77 gain:0.029857864376268896 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 179/14 ⇜ (829/64 → 415/32) ⇝ 365/28 | note:81 gain:0.029857864376268896 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 179/14 ⇜ (415/32 → 831/64) ⇝ 365/28 | note:71 gain:0.024 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 179/14 ⇜ (415/32 → 831/64) ⇝ 365/28 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 179/14 ⇜ (415/32 → 831/64) ⇝ 365/28 | note:77 gain:0.024 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", + "[ 51/4 ⇜ (823/64 → 103/8) | note:G4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 51/4 ⇜ (823/64 → 103/8) | note:D5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 51/4 ⇜ (823/64 → 103/8) | note:F5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 179/14 ⇜ (823/64 → 103/8) ⇝ 365/28 | note:71 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 179/14 ⇜ (823/64 → 103/8) ⇝ 365/28 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 179/14 ⇜ (823/64 → 103/8) ⇝ 365/28 | note:77 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 179/14 ⇜ (823/64 → 103/8) ⇝ 365/28 | note:81 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 179/14 ⇜ (103/8 → 825/64) ⇝ 365/28 | note:71 gain:0.044 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 179/14 ⇜ (103/8 → 825/64) ⇝ 365/28 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 179/14 ⇜ (103/8 → 825/64) ⇝ 365/28 | note:77 gain:0.044 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 179/14 ⇜ (103/8 → 825/64) ⇝ 365/28 | note:81 gain:0.044 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 179/14 ⇜ (825/64 → 413/32) ⇝ 365/28 | note:71 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 179/14 ⇜ (825/64 → 413/32) ⇝ 365/28 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 179/14 ⇜ (825/64 → 413/32) ⇝ 365/28 | note:77 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 179/14 ⇜ (825/64 → 413/32) ⇝ 365/28 | note:81 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 179/14 ⇜ (413/32 → 827/64) ⇝ 365/28 | note:71 gain:0.064 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 179/14 ⇜ (413/32 → 827/64) ⇝ 365/28 | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 179/14 ⇜ (413/32 → 827/64) ⇝ 365/28 | note:77 gain:0.064 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 179/14 ⇜ (413/32 → 827/64) ⇝ 365/28 | note:81 gain:0.064 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 179/14 ⇜ (827/64 → 207/16) ⇝ 365/28 | note:71 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 179/14 ⇜ (827/64 → 207/16) ⇝ 365/28 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 179/14 ⇜ (827/64 → 207/16) ⇝ 365/28 | note:77 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 179/14 ⇜ (827/64 → 207/16) ⇝ 365/28 | note:81 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 179/14 ⇜ (207/16 → 829/64) ⇝ 365/28 | note:71 gain:0.044 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 179/14 ⇜ (207/16 → 829/64) ⇝ 365/28 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 179/14 ⇜ (207/16 → 829/64) ⇝ 365/28 | note:77 gain:0.044 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 179/14 ⇜ (207/16 → 829/64) ⇝ 365/28 | note:81 gain:0.044 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 179/14 ⇜ (829/64 → 415/32) ⇝ 365/28 | note:71 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 179/14 ⇜ (829/64 → 415/32) ⇝ 365/28 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 179/14 ⇜ (829/64 → 415/32) ⇝ 365/28 | note:77 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 179/14 ⇜ (829/64 → 415/32) ⇝ 365/28 | note:81 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 179/14 ⇜ (415/32 → 831/64) ⇝ 365/28 | note:71 gain:0.024 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 179/14 ⇜ (415/32 → 831/64) ⇝ 365/28 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 179/14 ⇜ (415/32 → 831/64) ⇝ 365/28 | note:77 gain:0.024 clip:1 s:piano release:0.1 pan:0.606481481481 ]", "[ 179/14 ⇜ (415/32 → 831/64) ⇝ 365/28 | note:81 gain:0.024 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 179/14 ⇜ (831/64 → 13/1) ⇝ 365/28 | note:71 gain:0.02985786437626833 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 179/14 ⇜ (831/64 → 13/1) ⇝ 365/28 | note:76 gain:0.02985786437626833 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 179/14 ⇜ (831/64 → 13/1) ⇝ 365/28 | note:77 gain:0.02985786437626833 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 179/14 ⇜ (831/64 → 13/1) ⇝ 365/28 | note:81 gain:0.02985786437626833 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 179/14 ⇜ (13/1 → 833/64) ⇝ 365/28 | note:71 gain:0.04400000000000063 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 179/14 ⇜ (13/1 → 833/64) ⇝ 365/28 | note:76 gain:0.04400000000000063 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 179/14 ⇜ (13/1 → 833/64) ⇝ 365/28 | note:77 gain:0.04400000000000063 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 179/14 ⇜ (13/1 → 833/64) ⇝ 365/28 | note:81 gain:0.04400000000000063 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ (13/1 → 833/64) ⇝ 53/4 | note:G2 gain:0.4400000000000063 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 179/14 ⇜ (833/64 → 417/32) ⇝ 365/28 | note:71 gain:0.05814213562373095 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 179/14 ⇜ (833/64 → 417/32) ⇝ 365/28 | note:76 gain:0.05814213562373095 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 179/14 ⇜ (833/64 → 417/32) ⇝ 365/28 | note:77 gain:0.05814213562373095 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 179/14 ⇜ (833/64 → 417/32) ⇝ 365/28 | note:81 gain:0.05814213562373095 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 13/1 ⇜ (833/64 → 417/32) ⇝ 53/4 | note:G2 gain:0.5814213562373095 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 179/14 ⇜ (417/32 → 365/28) | note:71 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 179/14 ⇜ (417/32 → 365/28) | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 179/14 ⇜ (417/32 → 365/28) | note:77 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 179/14 ⇜ (417/32 → 365/28) | note:81 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 13/1 ⇜ (417/32 → 835/64) ⇝ 53/4 | note:G2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 13/1 ⇜ (835/64 → 209/16) ⇝ 53/4 | note:G2 gain:0.5814213562373184 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 13/1 ⇜ (209/16 → 837/64) ⇝ 53/4 | note:G2 gain:0.4399999999999959 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 13/1 ⇜ (837/64 → 419/32) ⇝ 53/4 | note:G2 gain:0.298578643762692 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 13/1 ⇜ (419/32 → 839/64) ⇝ 53/4 | note:G2 gain:0.24 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 13/1 ⇜ (839/64 → 105/8) ⇝ 53/4 | note:G2 gain:0.29857864376268023 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 13/1 ⇜ (105/8 → 841/64) ⇝ 53/4 | note:G2 gain:0.440000000000002 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ (105/8 → 841/64) ⇝ 53/4 | note:G4 gain:0.440000000000002 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (105/8 → 841/64) ⇝ 53/4 | note:D5 gain:0.440000000000002 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ (105/8 → 841/64) ⇝ 53/4 | note:F5 gain:0.440000000000002 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 13/1 ⇜ (841/64 → 421/32) ⇝ 53/4 | note:G2 gain:0.5814213562373064 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 105/8 ⇜ (841/64 → 421/32) ⇝ 53/4 | note:G4 gain:0.5814213562373064 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 105/8 ⇜ (841/64 → 421/32) ⇝ 53/4 | note:D5 gain:0.5814213562373064 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 105/8 ⇜ (841/64 → 421/32) ⇝ 53/4 | note:F5 gain:0.5814213562373064 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 13/1 ⇜ (421/32 → 843/64) ⇝ 53/4 | note:G2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 105/8 ⇜ (421/32 → 843/64) ⇝ 53/4 | note:G4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 105/8 ⇜ (421/32 → 843/64) ⇝ 53/4 | note:D5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 105/8 ⇜ (421/32 → 843/64) ⇝ 53/4 | note:F5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 13/1 ⇜ (843/64 → 211/16) ⇝ 53/4 | note:G2 gain:0.5814213562373052 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 105/8 ⇜ (843/64 → 211/16) ⇝ 53/4 | note:G4 gain:0.5814213562373052 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 105/8 ⇜ (843/64 → 211/16) ⇝ 53/4 | note:D5 gain:0.5814213562373052 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 105/8 ⇜ (843/64 → 211/16) ⇝ 53/4 | note:F5 gain:0.5814213562373052 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 13/1 ⇜ (211/16 → 845/64) ⇝ 53/4 | note:G2 gain:0.4400000000000002 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 105/8 ⇜ (211/16 → 845/64) ⇝ 53/4 | note:G4 gain:0.4400000000000002 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 105/8 ⇜ (211/16 → 845/64) ⇝ 53/4 | note:D5 gain:0.4400000000000002 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 105/8 ⇜ (211/16 → 845/64) ⇝ 53/4 | note:F5 gain:0.4400000000000002 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 13/1 ⇜ (845/64 → 423/32) ⇝ 53/4 | note:G2 gain:0.29857864376269505 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 105/8 ⇜ (845/64 → 423/32) ⇝ 53/4 | note:G4 gain:0.29857864376269505 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 105/8 ⇜ (845/64 → 423/32) ⇝ 53/4 | note:D5 gain:0.29857864376269505 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 105/8 ⇜ (845/64 → 423/32) ⇝ 53/4 | note:F5 gain:0.29857864376269505 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 13/1 ⇜ (423/32 → 847/64) ⇝ 53/4 | note:G2 gain:0.24 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 105/8 ⇜ (423/32 → 847/64) ⇝ 53/4 | note:G4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 105/8 ⇜ (423/32 → 847/64) ⇝ 53/4 | note:D5 gain:0.24 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 105/8 ⇜ (423/32 → 847/64) ⇝ 53/4 | note:F5 gain:0.24 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 13/1 ⇜ (847/64 → 53/4) | note:G2 gain:0.2985786437626932 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 105/8 ⇜ (847/64 → 53/4) | note:G4 gain:0.2985786437626932 clip:1 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 105/8 ⇜ (847/64 → 53/4) | note:D5 gain:0.2985786437626932 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 105/8 ⇜ (847/64 → 53/4) | note:F5 gain:0.2985786437626932 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ (53/4 → 849/64) ⇝ 27/2 | note:B3 gain:0.21999999999999884 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ (53/4 → 849/64) ⇝ 27/2 | note:E4 gain:0.21999999999999884 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (53/4 → 849/64) ⇝ 27/2 | note:F4 gain:0.21999999999999884 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ (53/4 → 849/64) ⇝ 27/2 | note:A4 gain:0.21999999999999884 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 53/4 ⇜ (849/64 → 425/32) ⇝ 27/2 | note:B3 gain:0.2907106781186517 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 53/4 ⇜ (849/64 → 425/32) ⇝ 27/2 | note:E4 gain:0.2907106781186517 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 53/4 ⇜ (849/64 → 425/32) ⇝ 27/2 | note:F4 gain:0.2907106781186517 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 53/4 ⇜ (849/64 → 425/32) ⇝ 27/2 | note:A4 gain:0.2907106781186517 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 53/4 ⇜ (425/32 → 851/64) ⇝ 27/2 | note:B3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 53/4 ⇜ (425/32 → 851/64) ⇝ 27/2 | note:E4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 53/4 ⇜ (425/32 → 851/64) ⇝ 27/2 | note:F4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 53/4 ⇜ (425/32 → 851/64) ⇝ 27/2 | note:A4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 53/4 ⇜ (851/64 → 213/16) ⇝ 27/2 | note:B3 gain:0.29071067811865414 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 53/4 ⇜ (851/64 → 213/16) ⇝ 27/2 | note:E4 gain:0.29071067811865414 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 53/4 ⇜ (851/64 → 213/16) ⇝ 27/2 | note:F4 gain:0.29071067811865414 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 53/4 ⇜ (851/64 → 213/16) ⇝ 27/2 | note:A4 gain:0.29071067811865414 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 53/4 ⇜ (213/16 → 853/64) ⇝ 27/2 | note:B3 gain:0.22000000000000225 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 53/4 ⇜ (213/16 → 853/64) ⇝ 27/2 | note:E4 gain:0.22000000000000225 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 53/4 ⇜ (213/16 → 853/64) ⇝ 27/2 | note:F4 gain:0.22000000000000225 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 53/4 ⇜ (213/16 → 853/64) ⇝ 27/2 | note:A4 gain:0.22000000000000225 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 53/4 ⇜ (853/64 → 427/32) ⇝ 27/2 | note:B3 gain:0.14928932188134905 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 53/4 ⇜ (853/64 → 427/32) ⇝ 27/2 | note:E4 gain:0.14928932188134905 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 53/4 ⇜ (853/64 → 427/32) ⇝ 27/2 | note:F4 gain:0.14928932188134905 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 53/4 ⇜ (853/64 → 427/32) ⇝ 27/2 | note:A4 gain:0.14928932188134905 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 53/4 ⇜ (427/32 → 855/64) ⇝ 27/2 | note:B3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 53/4 ⇜ (427/32 → 855/64) ⇝ 27/2 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 53/4 ⇜ (427/32 → 855/64) ⇝ 27/2 | note:F4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 53/4 ⇜ (427/32 → 855/64) ⇝ 27/2 | note:A4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 53/4 ⇜ (855/64 → 107/8) ⇝ 27/2 | note:B3 gain:0.1492893218813451 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 53/4 ⇜ (855/64 → 107/8) ⇝ 27/2 | note:E4 gain:0.1492893218813451 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 53/4 ⇜ (855/64 → 107/8) ⇝ 27/2 | note:F4 gain:0.1492893218813451 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 53/4 ⇜ (855/64 → 107/8) ⇝ 27/2 | note:A4 gain:0.1492893218813451 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 53/4 ⇜ (107/8 → 857/64) ⇝ 27/2 | note:B3 gain:0.21999999999999664 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 53/4 ⇜ (107/8 → 857/64) ⇝ 27/2 | note:E4 gain:0.21999999999999664 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 53/4 ⇜ (107/8 → 857/64) ⇝ 27/2 | note:F4 gain:0.21999999999999664 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 53/4 ⇜ (107/8 → 857/64) ⇝ 27/2 | note:A4 gain:0.21999999999999664 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 53/4 ⇜ (857/64 → 429/32) ⇝ 27/2 | note:B3 gain:0.2907106781186502 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 53/4 ⇜ (857/64 → 429/32) ⇝ 27/2 | note:E4 gain:0.2907106781186502 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 53/4 ⇜ (857/64 → 429/32) ⇝ 27/2 | note:F4 gain:0.2907106781186502 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 53/4 ⇜ (857/64 → 429/32) ⇝ 27/2 | note:A4 gain:0.2907106781186502 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 53/4 ⇜ (429/32 → 859/64) ⇝ 27/2 | note:B3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 53/4 ⇜ (429/32 → 859/64) ⇝ 27/2 | note:E4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 53/4 ⇜ (429/32 → 859/64) ⇝ 27/2 | note:F4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 53/4 ⇜ (429/32 → 859/64) ⇝ 27/2 | note:A4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 53/4 ⇜ (859/64 → 215/16) ⇝ 27/2 | note:B3 gain:0.2907106781186557 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 53/4 ⇜ (859/64 → 215/16) ⇝ 27/2 | note:E4 gain:0.2907106781186557 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 53/4 ⇜ (859/64 → 215/16) ⇝ 27/2 | note:F4 gain:0.2907106781186557 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 53/4 ⇜ (859/64 → 215/16) ⇝ 27/2 | note:A4 gain:0.2907106781186557 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 53/4 ⇜ (215/16 → 861/64) ⇝ 27/2 | note:B3 gain:0.22000000000000441 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 53/4 ⇜ (215/16 → 861/64) ⇝ 27/2 | note:E4 gain:0.22000000000000441 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 53/4 ⇜ (215/16 → 861/64) ⇝ 27/2 | note:F4 gain:0.22000000000000441 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 53/4 ⇜ (215/16 → 861/64) ⇝ 27/2 | note:A4 gain:0.22000000000000441 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 53/4 ⇜ (861/64 → 431/32) ⇝ 27/2 | note:B3 gain:0.14928932188135055 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 53/4 ⇜ (861/64 → 431/32) ⇝ 27/2 | note:E4 gain:0.14928932188135055 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 53/4 ⇜ (861/64 → 431/32) ⇝ 27/2 | note:F4 gain:0.14928932188135055 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 53/4 ⇜ (861/64 → 431/32) ⇝ 27/2 | note:A4 gain:0.14928932188135055 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 53/4 ⇜ (431/32 → 863/64) ⇝ 27/2 | note:B3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 53/4 ⇜ (431/32 → 863/64) ⇝ 27/2 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 53/4 ⇜ (431/32 → 863/64) ⇝ 27/2 | note:F4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 53/4 ⇜ (431/32 → 863/64) ⇝ 27/2 | note:A4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 53/4 ⇜ (863/64 → 27/2) | note:B3 gain:0.14928932188134356 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 53/4 ⇜ (863/64 → 27/2) | note:E4 gain:0.14928932188134356 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 53/4 ⇜ (863/64 → 27/2) | note:F4 gain:0.14928932188134356 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 53/4 ⇜ (863/64 → 27/2) | note:A4 gain:0.14928932188134356 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ (27/2 → 865/64) ⇝ 109/8 | note:D5 gain:0.43999999999998907 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ (27/2 → 865/64) ⇝ 109/8 | note:A5 gain:0.43999999999998907 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ (27/2 → 865/64) ⇝ 109/8 | note:C6 gain:0.43999999999998907 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ (27/2 → 865/64) ⇝ 55/4 | note:G2 gain:0.43999999999998907 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 27/2 ⇜ (865/64 → 433/32) ⇝ 109/8 | note:D5 gain:0.5814213562373134 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 27/2 ⇜ (865/64 → 433/32) ⇝ 109/8 | note:A5 gain:0.5814213562373134 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 27/2 ⇜ (865/64 → 433/32) ⇝ 109/8 | note:C6 gain:0.5814213562373134 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 27/2 ⇜ (865/64 → 433/32) ⇝ 55/4 | note:G2 gain:0.5814213562373134 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 27/2 ⇜ (433/32 → 867/64) ⇝ 109/8 | note:D5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 27/2 ⇜ (433/32 → 867/64) ⇝ 109/8 | note:A5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 27/2 ⇜ (433/32 → 867/64) ⇝ 109/8 | note:C6 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 27/2 ⇜ (433/32 → 867/64) ⇝ 55/4 | note:G2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ (379/28 → 867/64) ⇝ 193/14 | note:71 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ (379/28 → 867/64) ⇝ 193/14 | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ (379/28 → 867/64) ⇝ 193/14 | note:77 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ (379/28 → 867/64) ⇝ 193/14 | note:81 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 27/2 ⇜ (867/64 → 217/16) ⇝ 109/8 | note:D5 gain:0.5814213562373144 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 27/2 ⇜ (867/64 → 217/16) ⇝ 109/8 | note:A5 gain:0.5814213562373144 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 27/2 ⇜ (867/64 → 217/16) ⇝ 109/8 | note:C6 gain:0.5814213562373144 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 27/2 ⇜ (867/64 → 217/16) ⇝ 55/4 | note:G2 gain:0.5814213562373144 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 379/28 ⇜ (867/64 → 217/16) ⇝ 193/14 | note:71 gain:0.05814213562373144 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 379/28 ⇜ (867/64 → 217/16) ⇝ 193/14 | note:76 gain:0.05814213562373144 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 379/28 ⇜ (867/64 → 217/16) ⇝ 193/14 | note:77 gain:0.05814213562373144 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 379/28 ⇜ (867/64 → 217/16) ⇝ 193/14 | note:81 gain:0.05814213562373144 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 27/2 ⇜ (217/16 → 869/64) ⇝ 109/8 | note:D5 gain:0.4400000000000132 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 27/2 ⇜ (217/16 → 869/64) ⇝ 109/8 | note:A5 gain:0.4400000000000132 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 27/2 ⇜ (217/16 → 869/64) ⇝ 109/8 | note:C6 gain:0.4400000000000132 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 27/2 ⇜ (217/16 → 869/64) ⇝ 55/4 | note:G2 gain:0.4400000000000132 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 379/28 ⇜ (217/16 → 869/64) ⇝ 193/14 | note:71 gain:0.04400000000000132 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 379/28 ⇜ (217/16 → 869/64) ⇝ 193/14 | note:76 gain:0.04400000000000132 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 379/28 ⇜ (217/16 → 869/64) ⇝ 193/14 | note:77 gain:0.04400000000000132 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 379/28 ⇜ (217/16 → 869/64) ⇝ 193/14 | note:81 gain:0.04400000000000132 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 27/2 ⇜ (869/64 → 435/32) ⇝ 109/8 | note:D5 gain:0.2985786437626881 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 27/2 ⇜ (869/64 → 435/32) ⇝ 109/8 | note:A5 gain:0.2985786437626881 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 27/2 ⇜ (869/64 → 435/32) ⇝ 109/8 | note:C6 gain:0.2985786437626881 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 27/2 ⇜ (869/64 → 435/32) ⇝ 55/4 | note:G2 gain:0.2985786437626881 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 379/28 ⇜ (869/64 → 435/32) ⇝ 193/14 | note:71 gain:0.029857864376268813 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 379/28 ⇜ (869/64 → 435/32) ⇝ 193/14 | note:76 gain:0.029857864376268813 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 379/28 ⇜ (869/64 → 435/32) ⇝ 193/14 | note:77 gain:0.029857864376268813 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 379/28 ⇜ (869/64 → 435/32) ⇝ 193/14 | note:81 gain:0.029857864376268813 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 27/2 ⇜ (435/32 → 871/64) ⇝ 109/8 | note:D5 gain:0.24 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", + "[ 179/14 ⇜ (831/64 → 13/1) ⇝ 365/28 | note:71 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 179/14 ⇜ (831/64 → 13/1) ⇝ 365/28 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 179/14 ⇜ (831/64 → 13/1) ⇝ 365/28 | note:77 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 179/14 ⇜ (831/64 → 13/1) ⇝ 365/28 | note:81 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 179/14 ⇜ (13/1 → 833/64) ⇝ 365/28 | note:71 gain:0.044 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 179/14 ⇜ (13/1 → 833/64) ⇝ 365/28 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 179/14 ⇜ (13/1 → 833/64) ⇝ 365/28 | note:77 gain:0.044 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 179/14 ⇜ (13/1 → 833/64) ⇝ 365/28 | note:81 gain:0.044 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ (13/1 → 833/64) ⇝ 53/4 | note:G2 gain:0.44 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 179/14 ⇜ (833/64 → 417/32) ⇝ 365/28 | note:71 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 179/14 ⇜ (833/64 → 417/32) ⇝ 365/28 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 179/14 ⇜ (833/64 → 417/32) ⇝ 365/28 | note:77 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 179/14 ⇜ (833/64 → 417/32) ⇝ 365/28 | note:81 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 13/1 ⇜ (833/64 → 417/32) ⇝ 53/4 | note:G2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 179/14 ⇜ (417/32 → 365/28) | note:71 gain:0.064 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 179/14 ⇜ (417/32 → 365/28) | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 179/14 ⇜ (417/32 → 365/28) | note:77 gain:0.064 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 179/14 ⇜ (417/32 → 365/28) | note:81 gain:0.064 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 13/1 ⇜ (417/32 → 835/64) ⇝ 53/4 | note:G2 gain:0.64 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 13/1 ⇜ (835/64 → 209/16) ⇝ 53/4 | note:G2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 13/1 ⇜ (209/16 → 837/64) ⇝ 53/4 | note:G2 gain:0.44 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 13/1 ⇜ (837/64 → 419/32) ⇝ 53/4 | note:G2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 13/1 ⇜ (419/32 → 839/64) ⇝ 53/4 | note:G2 gain:0.24 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 13/1 ⇜ (839/64 → 105/8) ⇝ 53/4 | note:G2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 13/1 ⇜ (105/8 → 841/64) ⇝ 53/4 | note:G2 gain:0.44 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ (105/8 → 841/64) ⇝ 53/4 | note:G4 gain:0.44 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ (105/8 → 841/64) ⇝ 53/4 | note:D5 gain:0.44 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ (105/8 → 841/64) ⇝ 53/4 | note:F5 gain:0.44 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 13/1 ⇜ (841/64 → 421/32) ⇝ 53/4 | note:G2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 105/8 ⇜ (841/64 → 421/32) ⇝ 53/4 | note:G4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 105/8 ⇜ (841/64 → 421/32) ⇝ 53/4 | note:D5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 105/8 ⇜ (841/64 → 421/32) ⇝ 53/4 | note:F5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 13/1 ⇜ (421/32 → 843/64) ⇝ 53/4 | note:G2 gain:0.64 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 105/8 ⇜ (421/32 → 843/64) ⇝ 53/4 | note:G4 gain:0.64 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 105/8 ⇜ (421/32 → 843/64) ⇝ 53/4 | note:D5 gain:0.64 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 105/8 ⇜ (421/32 → 843/64) ⇝ 53/4 | note:F5 gain:0.64 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 13/1 ⇜ (843/64 → 211/16) ⇝ 53/4 | note:G2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 105/8 ⇜ (843/64 → 211/16) ⇝ 53/4 | note:G4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 105/8 ⇜ (843/64 → 211/16) ⇝ 53/4 | note:D5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 105/8 ⇜ (843/64 → 211/16) ⇝ 53/4 | note:F5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 13/1 ⇜ (211/16 → 845/64) ⇝ 53/4 | note:G2 gain:0.44 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 105/8 ⇜ (211/16 → 845/64) ⇝ 53/4 | note:G4 gain:0.44 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 105/8 ⇜ (211/16 → 845/64) ⇝ 53/4 | note:D5 gain:0.44 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 105/8 ⇜ (211/16 → 845/64) ⇝ 53/4 | note:F5 gain:0.44 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 13/1 ⇜ (845/64 → 423/32) ⇝ 53/4 | note:G2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 105/8 ⇜ (845/64 → 423/32) ⇝ 53/4 | note:G4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 105/8 ⇜ (845/64 → 423/32) ⇝ 53/4 | note:D5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 105/8 ⇜ (845/64 → 423/32) ⇝ 53/4 | note:F5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 13/1 ⇜ (423/32 → 847/64) ⇝ 53/4 | note:G2 gain:0.24 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 105/8 ⇜ (423/32 → 847/64) ⇝ 53/4 | note:G4 gain:0.24 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 105/8 ⇜ (423/32 → 847/64) ⇝ 53/4 | note:D5 gain:0.24 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 105/8 ⇜ (423/32 → 847/64) ⇝ 53/4 | note:F5 gain:0.24 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 13/1 ⇜ (847/64 → 53/4) | note:G2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 105/8 ⇜ (847/64 → 53/4) | note:G4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.560185185185 ]", + "[ 105/8 ⇜ (847/64 → 53/4) | note:D5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 105/8 ⇜ (847/64 → 53/4) | note:F5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ (53/4 → 849/64) ⇝ 27/2 | note:B3 gain:0.22 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ (53/4 → 849/64) ⇝ 27/2 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (53/4 → 849/64) ⇝ 27/2 | note:F4 gain:0.22 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ (53/4 → 849/64) ⇝ 27/2 | note:A4 gain:0.22 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 53/4 ⇜ (849/64 → 425/32) ⇝ 27/2 | note:B3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 53/4 ⇜ (849/64 → 425/32) ⇝ 27/2 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 53/4 ⇜ (849/64 → 425/32) ⇝ 27/2 | note:F4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 53/4 ⇜ (849/64 → 425/32) ⇝ 27/2 | note:A4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 53/4 ⇜ (425/32 → 851/64) ⇝ 27/2 | note:B3 gain:0.32 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 53/4 ⇜ (425/32 → 851/64) ⇝ 27/2 | note:E4 gain:0.32 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 53/4 ⇜ (425/32 → 851/64) ⇝ 27/2 | note:F4 gain:0.32 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 53/4 ⇜ (425/32 → 851/64) ⇝ 27/2 | note:A4 gain:0.32 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 53/4 ⇜ (851/64 → 213/16) ⇝ 27/2 | note:B3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 53/4 ⇜ (851/64 → 213/16) ⇝ 27/2 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 53/4 ⇜ (851/64 → 213/16) ⇝ 27/2 | note:F4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 53/4 ⇜ (851/64 → 213/16) ⇝ 27/2 | note:A4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 53/4 ⇜ (213/16 → 853/64) ⇝ 27/2 | note:B3 gain:0.22 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 53/4 ⇜ (213/16 → 853/64) ⇝ 27/2 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 53/4 ⇜ (213/16 → 853/64) ⇝ 27/2 | note:F4 gain:0.22 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 53/4 ⇜ (213/16 → 853/64) ⇝ 27/2 | note:A4 gain:0.22 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 53/4 ⇜ (853/64 → 427/32) ⇝ 27/2 | note:B3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 53/4 ⇜ (853/64 → 427/32) ⇝ 27/2 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 53/4 ⇜ (853/64 → 427/32) ⇝ 27/2 | note:F4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 53/4 ⇜ (853/64 → 427/32) ⇝ 27/2 | note:A4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 53/4 ⇜ (427/32 → 855/64) ⇝ 27/2 | note:B3 gain:0.12 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 53/4 ⇜ (427/32 → 855/64) ⇝ 27/2 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 53/4 ⇜ (427/32 → 855/64) ⇝ 27/2 | note:F4 gain:0.12 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 53/4 ⇜ (427/32 → 855/64) ⇝ 27/2 | note:A4 gain:0.12 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 53/4 ⇜ (855/64 → 107/8) ⇝ 27/2 | note:B3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 53/4 ⇜ (855/64 → 107/8) ⇝ 27/2 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 53/4 ⇜ (855/64 → 107/8) ⇝ 27/2 | note:F4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 53/4 ⇜ (855/64 → 107/8) ⇝ 27/2 | note:A4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 53/4 ⇜ (107/8 → 857/64) ⇝ 27/2 | note:B3 gain:0.22 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 53/4 ⇜ (107/8 → 857/64) ⇝ 27/2 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 53/4 ⇜ (107/8 → 857/64) ⇝ 27/2 | note:F4 gain:0.22 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 53/4 ⇜ (107/8 → 857/64) ⇝ 27/2 | note:A4 gain:0.22 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 53/4 ⇜ (857/64 → 429/32) ⇝ 27/2 | note:B3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 53/4 ⇜ (857/64 → 429/32) ⇝ 27/2 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 53/4 ⇜ (857/64 → 429/32) ⇝ 27/2 | note:F4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 53/4 ⇜ (857/64 → 429/32) ⇝ 27/2 | note:A4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 53/4 ⇜ (429/32 → 859/64) ⇝ 27/2 | note:B3 gain:0.32 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 53/4 ⇜ (429/32 → 859/64) ⇝ 27/2 | note:E4 gain:0.32 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 53/4 ⇜ (429/32 → 859/64) ⇝ 27/2 | note:F4 gain:0.32 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 53/4 ⇜ (429/32 → 859/64) ⇝ 27/2 | note:A4 gain:0.32 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 53/4 ⇜ (859/64 → 215/16) ⇝ 27/2 | note:B3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 53/4 ⇜ (859/64 → 215/16) ⇝ 27/2 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 53/4 ⇜ (859/64 → 215/16) ⇝ 27/2 | note:F4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 53/4 ⇜ (859/64 → 215/16) ⇝ 27/2 | note:A4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 53/4 ⇜ (215/16 → 861/64) ⇝ 27/2 | note:B3 gain:0.22 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 53/4 ⇜ (215/16 → 861/64) ⇝ 27/2 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 53/4 ⇜ (215/16 → 861/64) ⇝ 27/2 | note:F4 gain:0.22 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 53/4 ⇜ (215/16 → 861/64) ⇝ 27/2 | note:A4 gain:0.22 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 53/4 ⇜ (861/64 → 431/32) ⇝ 27/2 | note:B3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 53/4 ⇜ (861/64 → 431/32) ⇝ 27/2 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 53/4 ⇜ (861/64 → 431/32) ⇝ 27/2 | note:F4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 53/4 ⇜ (861/64 → 431/32) ⇝ 27/2 | note:A4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 53/4 ⇜ (431/32 → 863/64) ⇝ 27/2 | note:B3 gain:0.12 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 53/4 ⇜ (431/32 → 863/64) ⇝ 27/2 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 53/4 ⇜ (431/32 → 863/64) ⇝ 27/2 | note:F4 gain:0.12 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 53/4 ⇜ (431/32 → 863/64) ⇝ 27/2 | note:A4 gain:0.12 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 53/4 ⇜ (863/64 → 27/2) | note:B3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 53/4 ⇜ (863/64 → 27/2) | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 53/4 ⇜ (863/64 → 27/2) | note:F4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 53/4 ⇜ (863/64 → 27/2) | note:A4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ (27/2 → 865/64) ⇝ 109/8 | note:D5 gain:0.44 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ (27/2 → 865/64) ⇝ 109/8 | note:A5 gain:0.44 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ (27/2 → 865/64) ⇝ 109/8 | note:C6 gain:0.44 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ (27/2 → 865/64) ⇝ 55/4 | note:G2 gain:0.44 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 27/2 ⇜ (865/64 → 433/32) ⇝ 109/8 | note:D5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 27/2 ⇜ (865/64 → 433/32) ⇝ 109/8 | note:A5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 27/2 ⇜ (865/64 → 433/32) ⇝ 109/8 | note:C6 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 27/2 ⇜ (865/64 → 433/32) ⇝ 55/4 | note:G2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 27/2 ⇜ (433/32 → 867/64) ⇝ 109/8 | note:D5 gain:0.64 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 27/2 ⇜ (433/32 → 867/64) ⇝ 109/8 | note:A5 gain:0.64 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 27/2 ⇜ (433/32 → 867/64) ⇝ 109/8 | note:C6 gain:0.64 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 27/2 ⇜ (433/32 → 867/64) ⇝ 55/4 | note:G2 gain:0.64 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ (379/28 → 867/64) ⇝ 193/14 | note:71 gain:0.064 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ (379/28 → 867/64) ⇝ 193/14 | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ (379/28 → 867/64) ⇝ 193/14 | note:77 gain:0.064 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ (379/28 → 867/64) ⇝ 193/14 | note:81 gain:0.064 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 27/2 ⇜ (867/64 → 217/16) ⇝ 109/8 | note:D5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 27/2 ⇜ (867/64 → 217/16) ⇝ 109/8 | note:A5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 27/2 ⇜ (867/64 → 217/16) ⇝ 109/8 | note:C6 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 27/2 ⇜ (867/64 → 217/16) ⇝ 55/4 | note:G2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 379/28 ⇜ (867/64 → 217/16) ⇝ 193/14 | note:71 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 379/28 ⇜ (867/64 → 217/16) ⇝ 193/14 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 379/28 ⇜ (867/64 → 217/16) ⇝ 193/14 | note:77 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 379/28 ⇜ (867/64 → 217/16) ⇝ 193/14 | note:81 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 27/2 ⇜ (217/16 → 869/64) ⇝ 109/8 | note:D5 gain:0.44 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 27/2 ⇜ (217/16 → 869/64) ⇝ 109/8 | note:A5 gain:0.44 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 27/2 ⇜ (217/16 → 869/64) ⇝ 109/8 | note:C6 gain:0.44 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 27/2 ⇜ (217/16 → 869/64) ⇝ 55/4 | note:G2 gain:0.44 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 379/28 ⇜ (217/16 → 869/64) ⇝ 193/14 | note:71 gain:0.044 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 379/28 ⇜ (217/16 → 869/64) ⇝ 193/14 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 379/28 ⇜ (217/16 → 869/64) ⇝ 193/14 | note:77 gain:0.044 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 379/28 ⇜ (217/16 → 869/64) ⇝ 193/14 | note:81 gain:0.044 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 27/2 ⇜ (869/64 → 435/32) ⇝ 109/8 | note:D5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 27/2 ⇜ (869/64 → 435/32) ⇝ 109/8 | note:A5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 27/2 ⇜ (869/64 → 435/32) ⇝ 109/8 | note:C6 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 27/2 ⇜ (869/64 → 435/32) ⇝ 55/4 | note:G2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 379/28 ⇜ (869/64 → 435/32) ⇝ 193/14 | note:71 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 379/28 ⇜ (869/64 → 435/32) ⇝ 193/14 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 379/28 ⇜ (869/64 → 435/32) ⇝ 193/14 | note:77 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 379/28 ⇜ (869/64 → 435/32) ⇝ 193/14 | note:81 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 27/2 ⇜ (435/32 → 871/64) ⇝ 109/8 | note:D5 gain:0.24 clip:1 s:piano release:0.1 pan:0.592592592593 ]", "[ 27/2 ⇜ (435/32 → 871/64) ⇝ 109/8 | note:A5 gain:0.24 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 27/2 ⇜ (435/32 → 871/64) ⇝ 109/8 | note:C6 gain:0.24 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 27/2 ⇜ (435/32 → 871/64) ⇝ 55/4 | note:G2 gain:0.24 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 379/28 ⇜ (435/32 → 871/64) ⇝ 193/14 | note:71 gain:0.024 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 379/28 ⇜ (435/32 → 871/64) ⇝ 193/14 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 379/28 ⇜ (435/32 → 871/64) ⇝ 193/14 | note:77 gain:0.024 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", + "[ 27/2 ⇜ (435/32 → 871/64) ⇝ 109/8 | note:C6 gain:0.24 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 27/2 ⇜ (435/32 → 871/64) ⇝ 55/4 | note:G2 gain:0.24 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 379/28 ⇜ (435/32 → 871/64) ⇝ 193/14 | note:71 gain:0.024 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 379/28 ⇜ (435/32 → 871/64) ⇝ 193/14 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 379/28 ⇜ (435/32 → 871/64) ⇝ 193/14 | note:77 gain:0.024 clip:1 s:piano release:0.1 pan:0.606481481481 ]", "[ 379/28 ⇜ (435/32 → 871/64) ⇝ 193/14 | note:81 gain:0.024 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 27/2 ⇜ (871/64 → 109/8) | note:D5 gain:0.29857864376268406 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 27/2 ⇜ (871/64 → 109/8) | note:A5 gain:0.29857864376268406 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 27/2 ⇜ (871/64 → 109/8) | note:C6 gain:0.29857864376268406 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 27/2 ⇜ (871/64 → 109/8) ⇝ 55/4 | note:G2 gain:0.29857864376268406 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 379/28 ⇜ (871/64 → 109/8) ⇝ 193/14 | note:71 gain:0.029857864376268407 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 379/28 ⇜ (871/64 → 109/8) ⇝ 193/14 | note:76 gain:0.029857864376268407 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 379/28 ⇜ (871/64 → 109/8) ⇝ 193/14 | note:77 gain:0.029857864376268407 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 379/28 ⇜ (871/64 → 109/8) ⇝ 193/14 | note:81 gain:0.029857864376268407 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 27/2 ⇜ (109/8 → 873/64) ⇝ 55/4 | note:G2 gain:0.4399999999999848 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 379/28 ⇜ (109/8 → 873/64) ⇝ 193/14 | note:71 gain:0.043999999999998485 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 379/28 ⇜ (109/8 → 873/64) ⇝ 193/14 | note:76 gain:0.043999999999998485 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 379/28 ⇜ (109/8 → 873/64) ⇝ 193/14 | note:77 gain:0.043999999999998485 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 379/28 ⇜ (109/8 → 873/64) ⇝ 193/14 | note:81 gain:0.043999999999998485 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 27/2 ⇜ (873/64 → 437/32) ⇝ 55/4 | note:G2 gain:0.5814213562373104 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 379/28 ⇜ (873/64 → 437/32) ⇝ 193/14 | note:71 gain:0.058142135623731044 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 379/28 ⇜ (873/64 → 437/32) ⇝ 193/14 | note:76 gain:0.058142135623731044 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 379/28 ⇜ (873/64 → 437/32) ⇝ 193/14 | note:77 gain:0.058142135623731044 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 379/28 ⇜ (873/64 → 437/32) ⇝ 193/14 | note:81 gain:0.058142135623731044 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 27/2 ⇜ (437/32 → 875/64) ⇝ 55/4 | note:G2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 379/28 ⇜ (437/32 → 875/64) ⇝ 193/14 | note:71 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 379/28 ⇜ (437/32 → 875/64) ⇝ 193/14 | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 379/28 ⇜ (437/32 → 875/64) ⇝ 193/14 | note:77 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 379/28 ⇜ (437/32 → 875/64) ⇝ 193/14 | note:81 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 27/2 ⇜ (875/64 → 219/16) ⇝ 55/4 | note:G2 gain:0.5814213562373175 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 379/28 ⇜ (875/64 → 219/16) ⇝ 193/14 | note:71 gain:0.05814213562373175 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 379/28 ⇜ (875/64 → 219/16) ⇝ 193/14 | note:76 gain:0.05814213562373175 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 379/28 ⇜ (875/64 → 219/16) ⇝ 193/14 | note:77 gain:0.05814213562373175 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 379/28 ⇜ (875/64 → 219/16) ⇝ 193/14 | note:81 gain:0.05814213562373175 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 27/2 ⇜ (219/16 → 877/64) ⇝ 55/4 | note:G2 gain:0.43999999999999473 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 379/28 ⇜ (219/16 → 877/64) ⇝ 193/14 | note:71 gain:0.04399999999999948 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 379/28 ⇜ (219/16 → 877/64) ⇝ 193/14 | note:76 gain:0.04399999999999948 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 379/28 ⇜ (219/16 → 877/64) ⇝ 193/14 | note:77 gain:0.04399999999999948 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 379/28 ⇜ (219/16 → 877/64) ⇝ 193/14 | note:81 gain:0.04399999999999948 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 27/2 ⇜ (877/64 → 439/32) ⇝ 55/4 | note:G2 gain:0.29857864376269116 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 379/28 ⇜ (877/64 → 439/32) ⇝ 193/14 | note:71 gain:0.029857864376269118 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 379/28 ⇜ (877/64 → 439/32) ⇝ 193/14 | note:76 gain:0.029857864376269118 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 379/28 ⇜ (877/64 → 439/32) ⇝ 193/14 | note:77 gain:0.029857864376269118 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 379/28 ⇜ (877/64 → 439/32) ⇝ 193/14 | note:81 gain:0.029857864376269118 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 27/2 ⇜ (439/32 → 879/64) ⇝ 55/4 | note:G2 gain:0.24 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 379/28 ⇜ (439/32 → 879/64) ⇝ 193/14 | note:71 gain:0.024 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 379/28 ⇜ (439/32 → 879/64) ⇝ 193/14 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 379/28 ⇜ (439/32 → 879/64) ⇝ 193/14 | note:77 gain:0.024 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", + "[ 27/2 ⇜ (871/64 → 109/8) | note:D5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 27/2 ⇜ (871/64 → 109/8) | note:A5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 27/2 ⇜ (871/64 → 109/8) | note:C6 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 27/2 ⇜ (871/64 → 109/8) ⇝ 55/4 | note:G2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 379/28 ⇜ (871/64 → 109/8) ⇝ 193/14 | note:71 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 379/28 ⇜ (871/64 → 109/8) ⇝ 193/14 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 379/28 ⇜ (871/64 → 109/8) ⇝ 193/14 | note:77 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 379/28 ⇜ (871/64 → 109/8) ⇝ 193/14 | note:81 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 27/2 ⇜ (109/8 → 873/64) ⇝ 55/4 | note:G2 gain:0.44 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 379/28 ⇜ (109/8 → 873/64) ⇝ 193/14 | note:71 gain:0.044 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 379/28 ⇜ (109/8 → 873/64) ⇝ 193/14 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 379/28 ⇜ (109/8 → 873/64) ⇝ 193/14 | note:77 gain:0.044 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 379/28 ⇜ (109/8 → 873/64) ⇝ 193/14 | note:81 gain:0.044 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 27/2 ⇜ (873/64 → 437/32) ⇝ 55/4 | note:G2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 379/28 ⇜ (873/64 → 437/32) ⇝ 193/14 | note:71 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 379/28 ⇜ (873/64 → 437/32) ⇝ 193/14 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 379/28 ⇜ (873/64 → 437/32) ⇝ 193/14 | note:77 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 379/28 ⇜ (873/64 → 437/32) ⇝ 193/14 | note:81 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 27/2 ⇜ (437/32 → 875/64) ⇝ 55/4 | note:G2 gain:0.64 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 379/28 ⇜ (437/32 → 875/64) ⇝ 193/14 | note:71 gain:0.064 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 379/28 ⇜ (437/32 → 875/64) ⇝ 193/14 | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 379/28 ⇜ (437/32 → 875/64) ⇝ 193/14 | note:77 gain:0.064 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 379/28 ⇜ (437/32 → 875/64) ⇝ 193/14 | note:81 gain:0.064 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 27/2 ⇜ (875/64 → 219/16) ⇝ 55/4 | note:G2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 379/28 ⇜ (875/64 → 219/16) ⇝ 193/14 | note:71 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 379/28 ⇜ (875/64 → 219/16) ⇝ 193/14 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 379/28 ⇜ (875/64 → 219/16) ⇝ 193/14 | note:77 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 379/28 ⇜ (875/64 → 219/16) ⇝ 193/14 | note:81 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 27/2 ⇜ (219/16 → 877/64) ⇝ 55/4 | note:G2 gain:0.44 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 379/28 ⇜ (219/16 → 877/64) ⇝ 193/14 | note:71 gain:0.044 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 379/28 ⇜ (219/16 → 877/64) ⇝ 193/14 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 379/28 ⇜ (219/16 → 877/64) ⇝ 193/14 | note:77 gain:0.044 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 379/28 ⇜ (219/16 → 877/64) ⇝ 193/14 | note:81 gain:0.044 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 27/2 ⇜ (877/64 → 439/32) ⇝ 55/4 | note:G2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 379/28 ⇜ (877/64 → 439/32) ⇝ 193/14 | note:71 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 379/28 ⇜ (877/64 → 439/32) ⇝ 193/14 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 379/28 ⇜ (877/64 → 439/32) ⇝ 193/14 | note:77 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 379/28 ⇜ (877/64 → 439/32) ⇝ 193/14 | note:81 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 27/2 ⇜ (439/32 → 879/64) ⇝ 55/4 | note:G2 gain:0.24 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 379/28 ⇜ (439/32 → 879/64) ⇝ 193/14 | note:71 gain:0.024 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 379/28 ⇜ (439/32 → 879/64) ⇝ 193/14 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 379/28 ⇜ (439/32 → 879/64) ⇝ 193/14 | note:77 gain:0.024 clip:1 s:piano release:0.1 pan:0.606481481481 ]", "[ 379/28 ⇜ (439/32 → 879/64) ⇝ 193/14 | note:81 gain:0.024 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 27/2 ⇜ (879/64 → 55/4) | note:G2 gain:0.29857864376268106 clip:1 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 379/28 ⇜ (879/64 → 55/4) ⇝ 193/14 | note:71 gain:0.02985786437626811 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 379/28 ⇜ (879/64 → 55/4) ⇝ 193/14 | note:76 gain:0.02985786437626811 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 379/28 ⇜ (879/64 → 55/4) ⇝ 193/14 | note:77 gain:0.02985786437626811 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 379/28 ⇜ (879/64 → 55/4) ⇝ 193/14 | note:81 gain:0.02985786437626811 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 379/28 ⇜ (55/4 → 881/64) ⇝ 193/14 | note:71 gain:0.04400000000000032 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 379/28 ⇜ (55/4 → 881/64) ⇝ 193/14 | note:76 gain:0.04400000000000032 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 379/28 ⇜ (55/4 → 881/64) ⇝ 193/14 | note:77 gain:0.04400000000000032 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 379/28 ⇜ (55/4 → 881/64) ⇝ 193/14 | note:81 gain:0.04400000000000032 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ (55/4 → 881/64) ⇝ 111/8 | note:D5 gain:0.44000000000000317 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ (55/4 → 881/64) ⇝ 111/8 | note:A5 gain:0.44000000000000317 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ (55/4 → 881/64) ⇝ 111/8 | note:C6 gain:0.44000000000000317 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ (55/4 → 881/64) ⇝ 14/1 | note:B3 gain:0.22000000000000158 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ (55/4 → 881/64) ⇝ 14/1 | note:E4 gain:0.22000000000000158 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (55/4 → 881/64) ⇝ 14/1 | note:F4 gain:0.22000000000000158 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ (55/4 → 881/64) ⇝ 14/1 | note:A4 gain:0.22000000000000158 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 379/28 ⇜ (881/64 → 441/32) ⇝ 193/14 | note:71 gain:0.05814213562373073 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 379/28 ⇜ (881/64 → 441/32) ⇝ 193/14 | note:76 gain:0.05814213562373073 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 379/28 ⇜ (881/64 → 441/32) ⇝ 193/14 | note:77 gain:0.05814213562373073 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 379/28 ⇜ (881/64 → 441/32) ⇝ 193/14 | note:81 gain:0.05814213562373073 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 55/4 ⇜ (881/64 → 441/32) ⇝ 111/8 | note:D5 gain:0.5814213562373073 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 55/4 ⇜ (881/64 → 441/32) ⇝ 111/8 | note:A5 gain:0.5814213562373073 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 55/4 ⇜ (881/64 → 441/32) ⇝ 111/8 | note:C6 gain:0.5814213562373073 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 55/4 ⇜ (881/64 → 441/32) ⇝ 14/1 | note:B3 gain:0.29071067811865364 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 55/4 ⇜ (881/64 → 441/32) ⇝ 14/1 | note:E4 gain:0.29071067811865364 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 55/4 ⇜ (881/64 → 441/32) ⇝ 14/1 | note:F4 gain:0.29071067811865364 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 55/4 ⇜ (881/64 → 441/32) ⇝ 14/1 | note:A4 gain:0.29071067811865364 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 379/28 ⇜ (441/32 → 193/14) | note:71 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 379/28 ⇜ (441/32 → 193/14) | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 379/28 ⇜ (441/32 → 193/14) | note:77 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 379/28 ⇜ (441/32 → 193/14) | note:81 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 55/4 ⇜ (441/32 → 883/64) ⇝ 111/8 | note:D5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 55/4 ⇜ (441/32 → 883/64) ⇝ 111/8 | note:A5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 55/4 ⇜ (441/32 → 883/64) ⇝ 111/8 | note:C6 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 55/4 ⇜ (441/32 → 883/64) ⇝ 14/1 | note:B3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 55/4 ⇜ (441/32 → 883/64) ⇝ 14/1 | note:E4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 55/4 ⇜ (441/32 → 883/64) ⇝ 14/1 | note:F4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 55/4 ⇜ (441/32 → 883/64) ⇝ 14/1 | note:A4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 55/4 ⇜ (883/64 → 221/16) ⇝ 111/8 | note:D5 gain:0.5814213562373205 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 55/4 ⇜ (883/64 → 221/16) ⇝ 111/8 | note:A5 gain:0.5814213562373205 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 55/4 ⇜ (883/64 → 221/16) ⇝ 111/8 | note:C6 gain:0.5814213562373205 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 55/4 ⇜ (883/64 → 221/16) ⇝ 14/1 | note:B3 gain:0.29071067811866025 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 55/4 ⇜ (883/64 → 221/16) ⇝ 14/1 | note:E4 gain:0.29071067811866025 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 55/4 ⇜ (883/64 → 221/16) ⇝ 14/1 | note:F4 gain:0.29071067811866025 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 55/4 ⇜ (883/64 → 221/16) ⇝ 14/1 | note:A4 gain:0.29071067811866025 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 55/4 ⇜ (221/16 → 885/64) ⇝ 111/8 | note:D5 gain:0.439999999999999 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 55/4 ⇜ (221/16 → 885/64) ⇝ 111/8 | note:A5 gain:0.439999999999999 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 55/4 ⇜ (221/16 → 885/64) ⇝ 111/8 | note:C6 gain:0.439999999999999 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 55/4 ⇜ (221/16 → 885/64) ⇝ 14/1 | note:B3 gain:0.2199999999999995 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 55/4 ⇜ (221/16 → 885/64) ⇝ 14/1 | note:E4 gain:0.2199999999999995 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 55/4 ⇜ (221/16 → 885/64) ⇝ 14/1 | note:F4 gain:0.2199999999999995 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 55/4 ⇜ (221/16 → 885/64) ⇝ 14/1 | note:A4 gain:0.2199999999999995 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 55/4 ⇜ (885/64 → 443/32) ⇝ 111/8 | note:D5 gain:0.2985786437626942 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 55/4 ⇜ (885/64 → 443/32) ⇝ 111/8 | note:A5 gain:0.2985786437626942 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 55/4 ⇜ (885/64 → 443/32) ⇝ 111/8 | note:C6 gain:0.2985786437626942 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 55/4 ⇜ (885/64 → 443/32) ⇝ 14/1 | note:B3 gain:0.1492893218813471 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 55/4 ⇜ (885/64 → 443/32) ⇝ 14/1 | note:E4 gain:0.1492893218813471 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 55/4 ⇜ (885/64 → 443/32) ⇝ 14/1 | note:F4 gain:0.1492893218813471 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 55/4 ⇜ (885/64 → 443/32) ⇝ 14/1 | note:A4 gain:0.1492893218813471 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 55/4 ⇜ (443/32 → 887/64) ⇝ 111/8 | note:D5 gain:0.24 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", + "[ 27/2 ⇜ (879/64 → 55/4) | note:G2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.449074074074 ]", + "[ 379/28 ⇜ (879/64 → 55/4) ⇝ 193/14 | note:71 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 379/28 ⇜ (879/64 → 55/4) ⇝ 193/14 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 379/28 ⇜ (879/64 → 55/4) ⇝ 193/14 | note:77 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 379/28 ⇜ (879/64 → 55/4) ⇝ 193/14 | note:81 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 379/28 ⇜ (55/4 → 881/64) ⇝ 193/14 | note:71 gain:0.044 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 379/28 ⇜ (55/4 → 881/64) ⇝ 193/14 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 379/28 ⇜ (55/4 → 881/64) ⇝ 193/14 | note:77 gain:0.044 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 379/28 ⇜ (55/4 → 881/64) ⇝ 193/14 | note:81 gain:0.044 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ (55/4 → 881/64) ⇝ 111/8 | note:D5 gain:0.44 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ (55/4 → 881/64) ⇝ 111/8 | note:A5 gain:0.44 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ (55/4 → 881/64) ⇝ 111/8 | note:C6 gain:0.44 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ (55/4 → 881/64) ⇝ 14/1 | note:B3 gain:0.22 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ (55/4 → 881/64) ⇝ 14/1 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (55/4 → 881/64) ⇝ 14/1 | note:F4 gain:0.22 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ (55/4 → 881/64) ⇝ 14/1 | note:A4 gain:0.22 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 379/28 ⇜ (881/64 → 441/32) ⇝ 193/14 | note:71 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 379/28 ⇜ (881/64 → 441/32) ⇝ 193/14 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 379/28 ⇜ (881/64 → 441/32) ⇝ 193/14 | note:77 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 379/28 ⇜ (881/64 → 441/32) ⇝ 193/14 | note:81 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 55/4 ⇜ (881/64 → 441/32) ⇝ 111/8 | note:D5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 55/4 ⇜ (881/64 → 441/32) ⇝ 111/8 | note:A5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 55/4 ⇜ (881/64 → 441/32) ⇝ 111/8 | note:C6 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 55/4 ⇜ (881/64 → 441/32) ⇝ 14/1 | note:B3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 55/4 ⇜ (881/64 → 441/32) ⇝ 14/1 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 55/4 ⇜ (881/64 → 441/32) ⇝ 14/1 | note:F4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 55/4 ⇜ (881/64 → 441/32) ⇝ 14/1 | note:A4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 379/28 ⇜ (441/32 → 193/14) | note:71 gain:0.064 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 379/28 ⇜ (441/32 → 193/14) | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 379/28 ⇜ (441/32 → 193/14) | note:77 gain:0.064 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 379/28 ⇜ (441/32 → 193/14) | note:81 gain:0.064 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 55/4 ⇜ (441/32 → 883/64) ⇝ 111/8 | note:D5 gain:0.64 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 55/4 ⇜ (441/32 → 883/64) ⇝ 111/8 | note:A5 gain:0.64 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 55/4 ⇜ (441/32 → 883/64) ⇝ 111/8 | note:C6 gain:0.64 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 55/4 ⇜ (441/32 → 883/64) ⇝ 14/1 | note:B3 gain:0.32 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 55/4 ⇜ (441/32 → 883/64) ⇝ 14/1 | note:E4 gain:0.32 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 55/4 ⇜ (441/32 → 883/64) ⇝ 14/1 | note:F4 gain:0.32 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 55/4 ⇜ (441/32 → 883/64) ⇝ 14/1 | note:A4 gain:0.32 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 55/4 ⇜ (883/64 → 221/16) ⇝ 111/8 | note:D5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 55/4 ⇜ (883/64 → 221/16) ⇝ 111/8 | note:A5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 55/4 ⇜ (883/64 → 221/16) ⇝ 111/8 | note:C6 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 55/4 ⇜ (883/64 → 221/16) ⇝ 14/1 | note:B3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 55/4 ⇜ (883/64 → 221/16) ⇝ 14/1 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 55/4 ⇜ (883/64 → 221/16) ⇝ 14/1 | note:F4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 55/4 ⇜ (883/64 → 221/16) ⇝ 14/1 | note:A4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 55/4 ⇜ (221/16 → 885/64) ⇝ 111/8 | note:D5 gain:0.44 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 55/4 ⇜ (221/16 → 885/64) ⇝ 111/8 | note:A5 gain:0.44 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 55/4 ⇜ (221/16 → 885/64) ⇝ 111/8 | note:C6 gain:0.44 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 55/4 ⇜ (221/16 → 885/64) ⇝ 14/1 | note:B3 gain:0.22 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 55/4 ⇜ (221/16 → 885/64) ⇝ 14/1 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 55/4 ⇜ (221/16 → 885/64) ⇝ 14/1 | note:F4 gain:0.22 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 55/4 ⇜ (221/16 → 885/64) ⇝ 14/1 | note:A4 gain:0.22 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 55/4 ⇜ (885/64 → 443/32) ⇝ 111/8 | note:D5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 55/4 ⇜ (885/64 → 443/32) ⇝ 111/8 | note:A5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 55/4 ⇜ (885/64 → 443/32) ⇝ 111/8 | note:C6 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 55/4 ⇜ (885/64 → 443/32) ⇝ 14/1 | note:B3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 55/4 ⇜ (885/64 → 443/32) ⇝ 14/1 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 55/4 ⇜ (885/64 → 443/32) ⇝ 14/1 | note:F4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 55/4 ⇜ (885/64 → 443/32) ⇝ 14/1 | note:A4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 55/4 ⇜ (443/32 → 887/64) ⇝ 111/8 | note:D5 gain:0.24 clip:1 s:piano release:0.1 pan:0.592592592593 ]", "[ 55/4 ⇜ (443/32 → 887/64) ⇝ 111/8 | note:A5 gain:0.24 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 55/4 ⇜ (443/32 → 887/64) ⇝ 111/8 | note:C6 gain:0.24 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 55/4 ⇜ (443/32 → 887/64) ⇝ 14/1 | note:B3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 55/4 ⇜ (443/32 → 887/64) ⇝ 14/1 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 55/4 ⇜ (443/32 → 887/64) ⇝ 14/1 | note:F4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 55/4 ⇜ (443/32 → 887/64) ⇝ 14/1 | note:A4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 55/4 ⇜ (887/64 → 111/8) | note:D5 gain:0.29857864376269405 clip:1 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 55/4 ⇜ (887/64 → 111/8) | note:A5 gain:0.29857864376269405 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 55/4 ⇜ (887/64 → 111/8) | note:C6 gain:0.29857864376269405 clip:1 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 55/4 ⇜ (887/64 → 111/8) ⇝ 14/1 | note:B3 gain:0.14928932188134703 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 55/4 ⇜ (887/64 → 111/8) ⇝ 14/1 | note:E4 gain:0.14928932188134703 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 55/4 ⇜ (887/64 → 111/8) ⇝ 14/1 | note:F4 gain:0.14928932188134703 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 55/4 ⇜ (887/64 → 111/8) ⇝ 14/1 | note:A4 gain:0.14928932188134703 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 55/4 ⇜ (111/8 → 889/64) ⇝ 14/1 | note:B3 gain:0.21999999999999942 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 55/4 ⇜ (111/8 → 889/64) ⇝ 14/1 | note:E4 gain:0.21999999999999942 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 55/4 ⇜ (111/8 → 889/64) ⇝ 14/1 | note:F4 gain:0.21999999999999942 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 55/4 ⇜ (111/8 → 889/64) ⇝ 14/1 | note:A4 gain:0.21999999999999942 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 55/4 ⇜ (889/64 → 445/32) ⇝ 14/1 | note:B3 gain:0.29071067811865214 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 55/4 ⇜ (889/64 → 445/32) ⇝ 14/1 | note:E4 gain:0.29071067811865214 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 55/4 ⇜ (889/64 → 445/32) ⇝ 14/1 | note:F4 gain:0.29071067811865214 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 55/4 ⇜ (889/64 → 445/32) ⇝ 14/1 | note:A4 gain:0.29071067811865214 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 55/4 ⇜ (445/32 → 891/64) ⇝ 14/1 | note:B3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 55/4 ⇜ (445/32 → 891/64) ⇝ 14/1 | note:E4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 55/4 ⇜ (445/32 → 891/64) ⇝ 14/1 | note:F4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 55/4 ⇜ (445/32 → 891/64) ⇝ 14/1 | note:A4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 55/4 ⇜ (891/64 → 223/16) ⇝ 14/1 | note:B3 gain:0.29071067811865375 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 55/4 ⇜ (891/64 → 223/16) ⇝ 14/1 | note:E4 gain:0.29071067811865375 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 55/4 ⇜ (891/64 → 223/16) ⇝ 14/1 | note:F4 gain:0.29071067811865375 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 55/4 ⇜ (891/64 → 223/16) ⇝ 14/1 | note:A4 gain:0.29071067811865375 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 55/4 ⇜ (223/16 → 893/64) ⇝ 14/1 | note:B3 gain:0.22000000000000167 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 55/4 ⇜ (223/16 → 893/64) ⇝ 14/1 | note:E4 gain:0.22000000000000167 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 55/4 ⇜ (223/16 → 893/64) ⇝ 14/1 | note:F4 gain:0.22000000000000167 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 55/4 ⇜ (223/16 → 893/64) ⇝ 14/1 | note:A4 gain:0.22000000000000167 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 55/4 ⇜ (893/64 → 447/32) ⇝ 14/1 | note:B3 gain:0.14928932188134864 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 55/4 ⇜ (893/64 → 447/32) ⇝ 14/1 | note:E4 gain:0.14928932188134864 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 55/4 ⇜ (893/64 → 447/32) ⇝ 14/1 | note:F4 gain:0.14928932188134864 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 55/4 ⇜ (893/64 → 447/32) ⇝ 14/1 | note:A4 gain:0.14928932188134864 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 55/4 ⇜ (447/32 → 895/64) ⇝ 14/1 | note:B3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 55/4 ⇜ (447/32 → 895/64) ⇝ 14/1 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 55/4 ⇜ (447/32 → 895/64) ⇝ 14/1 | note:F4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 55/4 ⇜ (447/32 → 895/64) ⇝ 14/1 | note:A4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 55/4 ⇜ (895/64 → 14/1) | note:B3 gain:0.1492893218813455 clip:1 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 55/4 ⇜ (895/64 → 14/1) | note:E4 gain:0.1492893218813455 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 55/4 ⇜ (895/64 → 14/1) | note:F4 gain:0.1492893218813455 clip:1 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 55/4 ⇜ (895/64 → 14/1) | note:A4 gain:0.1492893218813455 clip:1 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ (14/1 → 897/64) ⇝ 57/4 | note:F#2 gain:0.43999999999999456 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 14/1 ⇜ (897/64 → 449/32) ⇝ 57/4 | note:F#2 gain:0.5814213562373013 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 14/1 ⇜ (449/32 → 899/64) ⇝ 57/4 | note:F#2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ (393/28 → 899/64) ⇝ 100/7 | note:71 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ (393/28 → 899/64) ⇝ 100/7 | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ (393/28 → 899/64) ⇝ 100/7 | note:77 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ (393/28 → 899/64) ⇝ 100/7 | note:81 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 14/1 ⇜ (899/64 → 225/16) ⇝ 57/4 | note:F#2 gain:0.5814213562373105 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 393/28 ⇜ (899/64 → 225/16) ⇝ 100/7 | note:71 gain:0.05814213562373105 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 393/28 ⇜ (899/64 → 225/16) ⇝ 100/7 | note:76 gain:0.05814213562373105 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 393/28 ⇜ (899/64 → 225/16) ⇝ 100/7 | note:77 gain:0.05814213562373105 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 393/28 ⇜ (899/64 → 225/16) ⇝ 100/7 | note:81 gain:0.05814213562373105 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 14/1 ⇜ (225/16 → 901/64) ⇝ 57/4 | note:F#2 gain:0.4400000000000077 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 393/28 ⇜ (225/16 → 901/64) ⇝ 100/7 | note:71 gain:0.044000000000000775 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 393/28 ⇜ (225/16 → 901/64) ⇝ 100/7 | note:76 gain:0.044000000000000775 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 393/28 ⇜ (225/16 → 901/64) ⇝ 100/7 | note:77 gain:0.044000000000000775 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 393/28 ⇜ (225/16 → 901/64) ⇝ 100/7 | note:81 gain:0.044000000000000775 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 14/1 ⇜ (901/64 → 451/32) ⇝ 57/4 | note:F#2 gain:0.2985786437627003 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 393/28 ⇜ (901/64 → 451/32) ⇝ 100/7 | note:71 gain:0.029857864376270034 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 393/28 ⇜ (901/64 → 451/32) ⇝ 100/7 | note:76 gain:0.029857864376270034 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 393/28 ⇜ (901/64 → 451/32) ⇝ 100/7 | note:77 gain:0.029857864376270034 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 393/28 ⇜ (901/64 → 451/32) ⇝ 100/7 | note:81 gain:0.029857864376270034 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 14/1 ⇜ (451/32 → 903/64) ⇝ 57/4 | note:F#2 gain:0.24 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 393/28 ⇜ (451/32 → 903/64) ⇝ 100/7 | note:71 gain:0.024 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 393/28 ⇜ (451/32 → 903/64) ⇝ 100/7 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 393/28 ⇜ (451/32 → 903/64) ⇝ 100/7 | note:77 gain:0.024 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", + "[ 55/4 ⇜ (443/32 → 887/64) ⇝ 111/8 | note:C6 gain:0.24 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 55/4 ⇜ (443/32 → 887/64) ⇝ 14/1 | note:B3 gain:0.12 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 55/4 ⇜ (443/32 → 887/64) ⇝ 14/1 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 55/4 ⇜ (443/32 → 887/64) ⇝ 14/1 | note:F4 gain:0.12 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 55/4 ⇜ (443/32 → 887/64) ⇝ 14/1 | note:A4 gain:0.12 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 55/4 ⇜ (887/64 → 111/8) | note:D5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.592592592593 ]", + "[ 55/4 ⇜ (887/64 → 111/8) | note:A5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 55/4 ⇜ (887/64 → 111/8) | note:C6 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.638888888889 ]", + "[ 55/4 ⇜ (887/64 → 111/8) ⇝ 14/1 | note:B3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 55/4 ⇜ (887/64 → 111/8) ⇝ 14/1 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 55/4 ⇜ (887/64 → 111/8) ⇝ 14/1 | note:F4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 55/4 ⇜ (887/64 → 111/8) ⇝ 14/1 | note:A4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 55/4 ⇜ (111/8 → 889/64) ⇝ 14/1 | note:B3 gain:0.22 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 55/4 ⇜ (111/8 → 889/64) ⇝ 14/1 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 55/4 ⇜ (111/8 → 889/64) ⇝ 14/1 | note:F4 gain:0.22 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 55/4 ⇜ (111/8 → 889/64) ⇝ 14/1 | note:A4 gain:0.22 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 55/4 ⇜ (889/64 → 445/32) ⇝ 14/1 | note:B3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 55/4 ⇜ (889/64 → 445/32) ⇝ 14/1 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 55/4 ⇜ (889/64 → 445/32) ⇝ 14/1 | note:F4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 55/4 ⇜ (889/64 → 445/32) ⇝ 14/1 | note:A4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 55/4 ⇜ (445/32 → 891/64) ⇝ 14/1 | note:B3 gain:0.32 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 55/4 ⇜ (445/32 → 891/64) ⇝ 14/1 | note:E4 gain:0.32 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 55/4 ⇜ (445/32 → 891/64) ⇝ 14/1 | note:F4 gain:0.32 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 55/4 ⇜ (445/32 → 891/64) ⇝ 14/1 | note:A4 gain:0.32 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 55/4 ⇜ (891/64 → 223/16) ⇝ 14/1 | note:B3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 55/4 ⇜ (891/64 → 223/16) ⇝ 14/1 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 55/4 ⇜ (891/64 → 223/16) ⇝ 14/1 | note:F4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 55/4 ⇜ (891/64 → 223/16) ⇝ 14/1 | note:A4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 55/4 ⇜ (223/16 → 893/64) ⇝ 14/1 | note:B3 gain:0.22 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 55/4 ⇜ (223/16 → 893/64) ⇝ 14/1 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 55/4 ⇜ (223/16 → 893/64) ⇝ 14/1 | note:F4 gain:0.22 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 55/4 ⇜ (223/16 → 893/64) ⇝ 14/1 | note:A4 gain:0.22 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 55/4 ⇜ (893/64 → 447/32) ⇝ 14/1 | note:B3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 55/4 ⇜ (893/64 → 447/32) ⇝ 14/1 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 55/4 ⇜ (893/64 → 447/32) ⇝ 14/1 | note:F4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 55/4 ⇜ (893/64 → 447/32) ⇝ 14/1 | note:A4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 55/4 ⇜ (447/32 → 895/64) ⇝ 14/1 | note:B3 gain:0.12 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 55/4 ⇜ (447/32 → 895/64) ⇝ 14/1 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 55/4 ⇜ (447/32 → 895/64) ⇝ 14/1 | note:F4 gain:0.12 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 55/4 ⇜ (447/32 → 895/64) ⇝ 14/1 | note:A4 gain:0.12 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ 55/4 ⇜ (895/64 → 14/1) | note:B3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.523148148148 ]", + "[ 55/4 ⇜ (895/64 → 14/1) | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 55/4 ⇜ (895/64 → 14/1) | note:F4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.550925925926 ]", + "[ 55/4 ⇜ (895/64 → 14/1) | note:A4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.569444444444 ]", + "[ (14/1 → 897/64) ⇝ 57/4 | note:F#2 gain:0.44 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 14/1 ⇜ (897/64 → 449/32) ⇝ 57/4 | note:F#2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 14/1 ⇜ (449/32 → 899/64) ⇝ 57/4 | note:F#2 gain:0.64 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ (393/28 → 899/64) ⇝ 100/7 | note:71 gain:0.064 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ (393/28 → 899/64) ⇝ 100/7 | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ (393/28 → 899/64) ⇝ 100/7 | note:77 gain:0.064 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ (393/28 → 899/64) ⇝ 100/7 | note:81 gain:0.064 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 14/1 ⇜ (899/64 → 225/16) ⇝ 57/4 | note:F#2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 393/28 ⇜ (899/64 → 225/16) ⇝ 100/7 | note:71 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 393/28 ⇜ (899/64 → 225/16) ⇝ 100/7 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 393/28 ⇜ (899/64 → 225/16) ⇝ 100/7 | note:77 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 393/28 ⇜ (899/64 → 225/16) ⇝ 100/7 | note:81 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 14/1 ⇜ (225/16 → 901/64) ⇝ 57/4 | note:F#2 gain:0.44 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 393/28 ⇜ (225/16 → 901/64) ⇝ 100/7 | note:71 gain:0.044 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 393/28 ⇜ (225/16 → 901/64) ⇝ 100/7 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 393/28 ⇜ (225/16 → 901/64) ⇝ 100/7 | note:77 gain:0.044 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 393/28 ⇜ (225/16 → 901/64) ⇝ 100/7 | note:81 gain:0.044 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 14/1 ⇜ (901/64 → 451/32) ⇝ 57/4 | note:F#2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 393/28 ⇜ (901/64 → 451/32) ⇝ 100/7 | note:71 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 393/28 ⇜ (901/64 → 451/32) ⇝ 100/7 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 393/28 ⇜ (901/64 → 451/32) ⇝ 100/7 | note:77 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 393/28 ⇜ (901/64 → 451/32) ⇝ 100/7 | note:81 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 14/1 ⇜ (451/32 → 903/64) ⇝ 57/4 | note:F#2 gain:0.24 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 393/28 ⇜ (451/32 → 903/64) ⇝ 100/7 | note:71 gain:0.024 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 393/28 ⇜ (451/32 → 903/64) ⇝ 100/7 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 393/28 ⇜ (451/32 → 903/64) ⇝ 100/7 | note:77 gain:0.024 clip:1 s:piano release:0.1 pan:0.606481481481 ]", "[ 393/28 ⇜ (451/32 → 903/64) ⇝ 100/7 | note:81 gain:0.024 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 14/1 ⇜ (903/64 → 113/8) ⇝ 57/4 | note:F#2 gain:0.298578643762688 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 393/28 ⇜ (903/64 → 113/8) ⇝ 100/7 | note:71 gain:0.029857864376268802 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 393/28 ⇜ (903/64 → 113/8) ⇝ 100/7 | note:76 gain:0.029857864376268802 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 393/28 ⇜ (903/64 → 113/8) ⇝ 100/7 | note:77 gain:0.029857864376268802 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 393/28 ⇜ (903/64 → 113/8) ⇝ 100/7 | note:81 gain:0.029857864376268802 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 14/1 ⇜ (113/8 → 905/64) ⇝ 57/4 | note:F#2 gain:0.4399999999999902 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 393/28 ⇜ (113/8 → 905/64) ⇝ 100/7 | note:71 gain:0.04399999999999902 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 393/28 ⇜ (113/8 → 905/64) ⇝ 100/7 | note:76 gain:0.04399999999999902 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 393/28 ⇜ (113/8 → 905/64) ⇝ 100/7 | note:77 gain:0.04399999999999902 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 393/28 ⇜ (113/8 → 905/64) ⇝ 100/7 | note:81 gain:0.04399999999999902 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ (113/8 → 905/64) ⇝ 57/4 | note:F#4 gain:0.4399999999999902 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ (113/8 → 905/64) ⇝ 57/4 | note:C#5 gain:0.4399999999999902 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ (113/8 → 905/64) ⇝ 57/4 | note:E5 gain:0.4399999999999902 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 14/1 ⇜ (905/64 → 453/32) ⇝ 57/4 | note:F#2 gain:0.5814213562372982 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 393/28 ⇜ (905/64 → 453/32) ⇝ 100/7 | note:71 gain:0.05814213562372982 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 393/28 ⇜ (905/64 → 453/32) ⇝ 100/7 | note:76 gain:0.05814213562372982 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 393/28 ⇜ (905/64 → 453/32) ⇝ 100/7 | note:77 gain:0.05814213562372982 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 393/28 ⇜ (905/64 → 453/32) ⇝ 100/7 | note:81 gain:0.05814213562372982 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 113/8 ⇜ (905/64 → 453/32) ⇝ 57/4 | note:F#4 gain:0.5814213562372982 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 113/8 ⇜ (905/64 → 453/32) ⇝ 57/4 | note:C#5 gain:0.5814213562372982 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 113/8 ⇜ (905/64 → 453/32) ⇝ 57/4 | note:E5 gain:0.5814213562372982 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 14/1 ⇜ (453/32 → 907/64) ⇝ 57/4 | note:F#2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 393/28 ⇜ (453/32 → 907/64) ⇝ 100/7 | note:71 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 393/28 ⇜ (453/32 → 907/64) ⇝ 100/7 | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 393/28 ⇜ (453/32 → 907/64) ⇝ 100/7 | note:77 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 393/28 ⇜ (453/32 → 907/64) ⇝ 100/7 | note:81 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 113/8 ⇜ (453/32 → 907/64) ⇝ 57/4 | note:F#4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 113/8 ⇜ (453/32 → 907/64) ⇝ 57/4 | note:C#5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 113/8 ⇜ (453/32 → 907/64) ⇝ 57/4 | note:E5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 14/1 ⇜ (907/64 → 227/16) ⇝ 57/4 | note:F#2 gain:0.5814213562373135 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 393/28 ⇜ (907/64 → 227/16) ⇝ 100/7 | note:71 gain:0.058142135623731356 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 393/28 ⇜ (907/64 → 227/16) ⇝ 100/7 | note:76 gain:0.058142135623731356 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 393/28 ⇜ (907/64 → 227/16) ⇝ 100/7 | note:77 gain:0.058142135623731356 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 393/28 ⇜ (907/64 → 227/16) ⇝ 100/7 | note:81 gain:0.058142135623731356 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 113/8 ⇜ (907/64 → 227/16) ⇝ 57/4 | note:F#4 gain:0.5814213562373135 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 113/8 ⇜ (907/64 → 227/16) ⇝ 57/4 | note:C#5 gain:0.5814213562373135 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 113/8 ⇜ (907/64 → 227/16) ⇝ 57/4 | note:E5 gain:0.5814213562373135 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 14/1 ⇜ (227/16 → 909/64) ⇝ 57/4 | note:F#2 gain:0.44000000000001194 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 393/28 ⇜ (227/16 → 909/64) ⇝ 100/7 | note:71 gain:0.0440000000000012 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 393/28 ⇜ (227/16 → 909/64) ⇝ 100/7 | note:76 gain:0.0440000000000012 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 393/28 ⇜ (227/16 → 909/64) ⇝ 100/7 | note:77 gain:0.0440000000000012 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 393/28 ⇜ (227/16 → 909/64) ⇝ 100/7 | note:81 gain:0.0440000000000012 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 113/8 ⇜ (227/16 → 909/64) ⇝ 57/4 | note:F#4 gain:0.44000000000001194 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 113/8 ⇜ (227/16 → 909/64) ⇝ 57/4 | note:C#5 gain:0.44000000000001194 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 113/8 ⇜ (227/16 → 909/64) ⇝ 57/4 | note:E5 gain:0.44000000000001194 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 14/1 ⇜ (909/64 → 455/32) ⇝ 57/4 | note:F#2 gain:0.2985786437626873 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 393/28 ⇜ (909/64 → 455/32) ⇝ 100/7 | note:71 gain:0.02985786437626873 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 393/28 ⇜ (909/64 → 455/32) ⇝ 100/7 | note:76 gain:0.02985786437626873 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 393/28 ⇜ (909/64 → 455/32) ⇝ 100/7 | note:77 gain:0.02985786437626873 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 393/28 ⇜ (909/64 → 455/32) ⇝ 100/7 | note:81 gain:0.02985786437626873 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 113/8 ⇜ (909/64 → 455/32) ⇝ 57/4 | note:F#4 gain:0.2985786437626873 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 113/8 ⇜ (909/64 → 455/32) ⇝ 57/4 | note:C#5 gain:0.2985786437626873 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 113/8 ⇜ (909/64 → 455/32) ⇝ 57/4 | note:E5 gain:0.2985786437626873 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 14/1 ⇜ (455/32 → 911/64) ⇝ 57/4 | note:F#2 gain:0.24 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 393/28 ⇜ (455/32 → 911/64) ⇝ 100/7 | note:71 gain:0.024 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 393/28 ⇜ (455/32 → 911/64) ⇝ 100/7 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 393/28 ⇜ (455/32 → 911/64) ⇝ 100/7 | note:77 gain:0.024 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", + "[ 14/1 ⇜ (903/64 → 113/8) ⇝ 57/4 | note:F#2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 393/28 ⇜ (903/64 → 113/8) ⇝ 100/7 | note:71 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 393/28 ⇜ (903/64 → 113/8) ⇝ 100/7 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 393/28 ⇜ (903/64 → 113/8) ⇝ 100/7 | note:77 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 393/28 ⇜ (903/64 → 113/8) ⇝ 100/7 | note:81 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 14/1 ⇜ (113/8 → 905/64) ⇝ 57/4 | note:F#2 gain:0.44 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 393/28 ⇜ (113/8 → 905/64) ⇝ 100/7 | note:71 gain:0.044 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 393/28 ⇜ (113/8 → 905/64) ⇝ 100/7 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 393/28 ⇜ (113/8 → 905/64) ⇝ 100/7 | note:77 gain:0.044 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 393/28 ⇜ (113/8 → 905/64) ⇝ 100/7 | note:81 gain:0.044 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ (113/8 → 905/64) ⇝ 57/4 | note:F#4 gain:0.44 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ (113/8 → 905/64) ⇝ 57/4 | note:C#5 gain:0.44 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ (113/8 → 905/64) ⇝ 57/4 | note:E5 gain:0.44 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 14/1 ⇜ (905/64 → 453/32) ⇝ 57/4 | note:F#2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 393/28 ⇜ (905/64 → 453/32) ⇝ 100/7 | note:71 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 393/28 ⇜ (905/64 → 453/32) ⇝ 100/7 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 393/28 ⇜ (905/64 → 453/32) ⇝ 100/7 | note:77 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 393/28 ⇜ (905/64 → 453/32) ⇝ 100/7 | note:81 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 113/8 ⇜ (905/64 → 453/32) ⇝ 57/4 | note:F#4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 113/8 ⇜ (905/64 → 453/32) ⇝ 57/4 | note:C#5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 113/8 ⇜ (905/64 → 453/32) ⇝ 57/4 | note:E5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 14/1 ⇜ (453/32 → 907/64) ⇝ 57/4 | note:F#2 gain:0.64 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 393/28 ⇜ (453/32 → 907/64) ⇝ 100/7 | note:71 gain:0.064 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 393/28 ⇜ (453/32 → 907/64) ⇝ 100/7 | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 393/28 ⇜ (453/32 → 907/64) ⇝ 100/7 | note:77 gain:0.064 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 393/28 ⇜ (453/32 → 907/64) ⇝ 100/7 | note:81 gain:0.064 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 113/8 ⇜ (453/32 → 907/64) ⇝ 57/4 | note:F#4 gain:0.64 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 113/8 ⇜ (453/32 → 907/64) ⇝ 57/4 | note:C#5 gain:0.64 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 113/8 ⇜ (453/32 → 907/64) ⇝ 57/4 | note:E5 gain:0.64 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 14/1 ⇜ (907/64 → 227/16) ⇝ 57/4 | note:F#2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 393/28 ⇜ (907/64 → 227/16) ⇝ 100/7 | note:71 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 393/28 ⇜ (907/64 → 227/16) ⇝ 100/7 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 393/28 ⇜ (907/64 → 227/16) ⇝ 100/7 | note:77 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 393/28 ⇜ (907/64 → 227/16) ⇝ 100/7 | note:81 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 113/8 ⇜ (907/64 → 227/16) ⇝ 57/4 | note:F#4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 113/8 ⇜ (907/64 → 227/16) ⇝ 57/4 | note:C#5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 113/8 ⇜ (907/64 → 227/16) ⇝ 57/4 | note:E5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 14/1 ⇜ (227/16 → 909/64) ⇝ 57/4 | note:F#2 gain:0.44 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 393/28 ⇜ (227/16 → 909/64) ⇝ 100/7 | note:71 gain:0.044 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 393/28 ⇜ (227/16 → 909/64) ⇝ 100/7 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 393/28 ⇜ (227/16 → 909/64) ⇝ 100/7 | note:77 gain:0.044 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 393/28 ⇜ (227/16 → 909/64) ⇝ 100/7 | note:81 gain:0.044 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 113/8 ⇜ (227/16 → 909/64) ⇝ 57/4 | note:F#4 gain:0.44 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 113/8 ⇜ (227/16 → 909/64) ⇝ 57/4 | note:C#5 gain:0.44 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 113/8 ⇜ (227/16 → 909/64) ⇝ 57/4 | note:E5 gain:0.44 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 14/1 ⇜ (909/64 → 455/32) ⇝ 57/4 | note:F#2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 393/28 ⇜ (909/64 → 455/32) ⇝ 100/7 | note:71 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 393/28 ⇜ (909/64 → 455/32) ⇝ 100/7 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 393/28 ⇜ (909/64 → 455/32) ⇝ 100/7 | note:77 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 393/28 ⇜ (909/64 → 455/32) ⇝ 100/7 | note:81 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 113/8 ⇜ (909/64 → 455/32) ⇝ 57/4 | note:F#4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 113/8 ⇜ (909/64 → 455/32) ⇝ 57/4 | note:C#5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 113/8 ⇜ (909/64 → 455/32) ⇝ 57/4 | note:E5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 14/1 ⇜ (455/32 → 911/64) ⇝ 57/4 | note:F#2 gain:0.24 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 393/28 ⇜ (455/32 → 911/64) ⇝ 100/7 | note:71 gain:0.024 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 393/28 ⇜ (455/32 → 911/64) ⇝ 100/7 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 393/28 ⇜ (455/32 → 911/64) ⇝ 100/7 | note:77 gain:0.024 clip:1 s:piano release:0.1 pan:0.606481481481 ]", "[ 393/28 ⇜ (455/32 → 911/64) ⇝ 100/7 | note:81 gain:0.024 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 113/8 ⇜ (455/32 → 911/64) ⇝ 57/4 | note:F#4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 113/8 ⇜ (455/32 → 911/64) ⇝ 57/4 | note:C#5 gain:0.24 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 113/8 ⇜ (455/32 → 911/64) ⇝ 57/4 | note:E5 gain:0.24 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 14/1 ⇜ (911/64 → 57/4) | note:F#2 gain:0.2985786437626849 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 393/28 ⇜ (911/64 → 57/4) ⇝ 100/7 | note:71 gain:0.02985786437626849 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 393/28 ⇜ (911/64 → 57/4) ⇝ 100/7 | note:76 gain:0.02985786437626849 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 393/28 ⇜ (911/64 → 57/4) ⇝ 100/7 | note:77 gain:0.02985786437626849 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 393/28 ⇜ (911/64 → 57/4) ⇝ 100/7 | note:81 gain:0.02985786437626849 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 113/8 ⇜ (911/64 → 57/4) | note:F#4 gain:0.2985786437626849 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 113/8 ⇜ (911/64 → 57/4) | note:C#5 gain:0.2985786437626849 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 113/8 ⇜ (911/64 → 57/4) | note:E5 gain:0.2985786437626849 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 393/28 ⇜ (57/4 → 913/64) ⇝ 100/7 | note:71 gain:0.043999999999998596 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 393/28 ⇜ (57/4 → 913/64) ⇝ 100/7 | note:76 gain:0.043999999999998596 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 393/28 ⇜ (57/4 → 913/64) ⇝ 100/7 | note:77 gain:0.043999999999998596 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 393/28 ⇜ (57/4 → 913/64) ⇝ 100/7 | note:81 gain:0.043999999999998596 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 393/28 ⇜ (913/64 → 457/32) ⇝ 100/7 | note:71 gain:0.058142135623731134 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 393/28 ⇜ (913/64 → 457/32) ⇝ 100/7 | note:76 gain:0.058142135623731134 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 393/28 ⇜ (913/64 → 457/32) ⇝ 100/7 | note:77 gain:0.058142135623731134 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 393/28 ⇜ (913/64 → 457/32) ⇝ 100/7 | note:81 gain:0.058142135623731134 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ 393/28 ⇜ (457/32 → 100/7) | note:71 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 393/28 ⇜ (457/32 → 100/7) | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 393/28 ⇜ (457/32 → 100/7) | note:77 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 393/28 ⇜ (457/32 → 100/7) | note:81 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.625 ]", - "[ (29/2 → 929/64) ⇝ 117/8 | note:C#5 gain:0.44000000000000006 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ (29/2 → 929/64) ⇝ 117/8 | note:G#5 gain:0.44000000000000006 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ (29/2 → 929/64) ⇝ 117/8 | note:B5 gain:0.44000000000000006 clip:1 s:piano release:0.1 pan:0.6342592592592593 ]", - "[ (29/2 → 929/64) ⇝ 59/4 | note:Bb3 gain:0.22000000000000003 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ (29/2 → 929/64) ⇝ 59/4 | note:Eb4 gain:0.22000000000000003 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ (29/2 → 929/64) ⇝ 59/4 | note:E4 gain:0.22000000000000003 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (29/2 → 929/64) ⇝ 59/4 | note:Ab4 gain:0.22000000000000003 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ (29/2 → 929/64) ⇝ 59/4 | note:F#2 gain:0.44000000000000006 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 29/2 ⇜ (929/64 → 465/32) ⇝ 117/8 | note:C#5 gain:0.5814213562373051 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 29/2 ⇜ (929/64 → 465/32) ⇝ 117/8 | note:G#5 gain:0.5814213562373051 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 29/2 ⇜ (929/64 → 465/32) ⇝ 117/8 | note:B5 gain:0.5814213562373051 clip:1 s:piano release:0.1 pan:0.6342592592592593 ]", - "[ 29/2 ⇜ (929/64 → 465/32) ⇝ 59/4 | note:Bb3 gain:0.29071067811865253 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 29/2 ⇜ (929/64 → 465/32) ⇝ 59/4 | note:Eb4 gain:0.29071067811865253 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 29/2 ⇜ (929/64 → 465/32) ⇝ 59/4 | note:E4 gain:0.29071067811865253 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 29/2 ⇜ (929/64 → 465/32) ⇝ 59/4 | note:Ab4 gain:0.29071067811865253 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 29/2 ⇜ (929/64 → 465/32) ⇝ 59/4 | note:F#2 gain:0.5814213562373051 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 29/2 ⇜ (465/32 → 931/64) ⇝ 117/8 | note:C#5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 29/2 ⇜ (465/32 → 931/64) ⇝ 117/8 | note:G#5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 29/2 ⇜ (465/32 → 931/64) ⇝ 117/8 | note:B5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.6342592592592593 ]", - "[ 29/2 ⇜ (465/32 → 931/64) ⇝ 59/4 | note:Bb3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 29/2 ⇜ (465/32 → 931/64) ⇝ 59/4 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 29/2 ⇜ (465/32 → 931/64) ⇝ 59/4 | note:E4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 29/2 ⇜ (465/32 → 931/64) ⇝ 59/4 | note:Ab4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 29/2 ⇜ (465/32 → 931/64) ⇝ 59/4 | note:F#2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 29/2 ⇜ (931/64 → 233/16) ⇝ 117/8 | note:C#5 gain:0.5814213562373066 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 29/2 ⇜ (931/64 → 233/16) ⇝ 117/8 | note:G#5 gain:0.5814213562373066 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 29/2 ⇜ (931/64 → 233/16) ⇝ 117/8 | note:B5 gain:0.5814213562373066 clip:1 s:piano release:0.1 pan:0.6342592592592593 ]", - "[ 29/2 ⇜ (931/64 → 233/16) ⇝ 59/4 | note:Bb3 gain:0.2907106781186533 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 29/2 ⇜ (931/64 → 233/16) ⇝ 59/4 | note:Eb4 gain:0.2907106781186533 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 29/2 ⇜ (931/64 → 233/16) ⇝ 59/4 | note:E4 gain:0.2907106781186533 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 29/2 ⇜ (931/64 → 233/16) ⇝ 59/4 | note:Ab4 gain:0.2907106781186533 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 29/2 ⇜ (931/64 → 233/16) ⇝ 59/4 | note:F#2 gain:0.5814213562373066 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 29/2 ⇜ (233/16 → 933/64) ⇝ 117/8 | note:C#5 gain:0.44000000000000217 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 29/2 ⇜ (233/16 → 933/64) ⇝ 117/8 | note:G#5 gain:0.44000000000000217 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 29/2 ⇜ (233/16 → 933/64) ⇝ 117/8 | note:B5 gain:0.44000000000000217 clip:1 s:piano release:0.1 pan:0.6342592592592593 ]", - "[ 29/2 ⇜ (233/16 → 933/64) ⇝ 59/4 | note:Bb3 gain:0.22000000000000108 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 29/2 ⇜ (233/16 → 933/64) ⇝ 59/4 | note:Eb4 gain:0.22000000000000108 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 29/2 ⇜ (233/16 → 933/64) ⇝ 59/4 | note:E4 gain:0.22000000000000108 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 29/2 ⇜ (233/16 → 933/64) ⇝ 59/4 | note:Ab4 gain:0.22000000000000108 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 29/2 ⇜ (233/16 → 933/64) ⇝ 59/4 | note:F#2 gain:0.44000000000000217 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 29/2 ⇜ (933/64 → 467/32) ⇝ 117/8 | note:C#5 gain:0.29857864376269644 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 29/2 ⇜ (933/64 → 467/32) ⇝ 117/8 | note:G#5 gain:0.29857864376269644 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 29/2 ⇜ (933/64 → 467/32) ⇝ 117/8 | note:B5 gain:0.29857864376269644 clip:1 s:piano release:0.1 pan:0.6342592592592593 ]", - "[ 29/2 ⇜ (933/64 → 467/32) ⇝ 59/4 | note:Bb3 gain:0.14928932188134822 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 29/2 ⇜ (933/64 → 467/32) ⇝ 59/4 | note:Eb4 gain:0.14928932188134822 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 29/2 ⇜ (933/64 → 467/32) ⇝ 59/4 | note:E4 gain:0.14928932188134822 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 29/2 ⇜ (933/64 → 467/32) ⇝ 59/4 | note:Ab4 gain:0.14928932188134822 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 29/2 ⇜ (933/64 → 467/32) ⇝ 59/4 | note:F#2 gain:0.29857864376269644 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 29/2 ⇜ (467/32 → 935/64) ⇝ 117/8 | note:C#5 gain:0.24 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 29/2 ⇜ (467/32 → 935/64) ⇝ 117/8 | note:G#5 gain:0.24 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 29/2 ⇜ (467/32 → 935/64) ⇝ 117/8 | note:B5 gain:0.24 clip:1 s:piano release:0.1 pan:0.6342592592592593 ]", - "[ 29/2 ⇜ (467/32 → 935/64) ⇝ 59/4 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 29/2 ⇜ (467/32 → 935/64) ⇝ 59/4 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 29/2 ⇜ (467/32 → 935/64) ⇝ 59/4 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 29/2 ⇜ (467/32 → 935/64) ⇝ 59/4 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 29/2 ⇜ (467/32 → 935/64) ⇝ 59/4 | note:F#2 gain:0.24 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 29/2 ⇜ (935/64 → 117/8) | note:C#5 gain:0.29857864376269183 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 29/2 ⇜ (935/64 → 117/8) | note:G#5 gain:0.29857864376269183 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 29/2 ⇜ (935/64 → 117/8) | note:B5 gain:0.29857864376269183 clip:1 s:piano release:0.1 pan:0.6342592592592593 ]", - "[ 29/2 ⇜ (935/64 → 117/8) ⇝ 59/4 | note:Bb3 gain:0.14928932188134592 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 29/2 ⇜ (935/64 → 117/8) ⇝ 59/4 | note:Eb4 gain:0.14928932188134592 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 29/2 ⇜ (935/64 → 117/8) ⇝ 59/4 | note:E4 gain:0.14928932188134592 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 29/2 ⇜ (935/64 → 117/8) ⇝ 59/4 | note:Ab4 gain:0.14928932188134592 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 29/2 ⇜ (935/64 → 117/8) ⇝ 59/4 | note:F#2 gain:0.29857864376269183 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 29/2 ⇜ (117/8 → 937/64) ⇝ 59/4 | note:Bb3 gain:0.21999999999999786 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 29/2 ⇜ (117/8 → 937/64) ⇝ 59/4 | note:Eb4 gain:0.21999999999999786 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 29/2 ⇜ (117/8 → 937/64) ⇝ 59/4 | note:E4 gain:0.21999999999999786 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 29/2 ⇜ (117/8 → 937/64) ⇝ 59/4 | note:Ab4 gain:0.21999999999999786 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 29/2 ⇜ (117/8 → 937/64) ⇝ 59/4 | note:F#2 gain:0.43999999999999573 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 29/2 ⇜ (937/64 → 469/32) ⇝ 59/4 | note:Bb3 gain:0.290710678118651 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 29/2 ⇜ (937/64 → 469/32) ⇝ 59/4 | note:Eb4 gain:0.290710678118651 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 29/2 ⇜ (937/64 → 469/32) ⇝ 59/4 | note:E4 gain:0.290710678118651 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 29/2 ⇜ (937/64 → 469/32) ⇝ 59/4 | note:Ab4 gain:0.290710678118651 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 29/2 ⇜ (937/64 → 469/32) ⇝ 59/4 | note:F#2 gain:0.581421356237302 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 29/2 ⇜ (469/32 → 939/64) ⇝ 59/4 | note:Bb3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 29/2 ⇜ (469/32 → 939/64) ⇝ 59/4 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 29/2 ⇜ (469/32 → 939/64) ⇝ 59/4 | note:E4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 29/2 ⇜ (469/32 → 939/64) ⇝ 59/4 | note:Ab4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 29/2 ⇜ (469/32 → 939/64) ⇝ 59/4 | note:F#2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 29/2 ⇜ (939/64 → 235/16) ⇝ 59/4 | note:Bb3 gain:0.2907106781186548 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 29/2 ⇜ (939/64 → 235/16) ⇝ 59/4 | note:Eb4 gain:0.2907106781186548 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 29/2 ⇜ (939/64 → 235/16) ⇝ 59/4 | note:E4 gain:0.2907106781186548 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 29/2 ⇜ (939/64 → 235/16) ⇝ 59/4 | note:Ab4 gain:0.2907106781186548 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 29/2 ⇜ (939/64 → 235/16) ⇝ 59/4 | note:F#2 gain:0.5814213562373096 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 29/2 ⇜ (235/16 → 941/64) ⇝ 59/4 | note:Bb3 gain:0.22000000000000322 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 29/2 ⇜ (235/16 → 941/64) ⇝ 59/4 | note:Eb4 gain:0.22000000000000322 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 29/2 ⇜ (235/16 → 941/64) ⇝ 59/4 | note:E4 gain:0.22000000000000322 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 29/2 ⇜ (235/16 → 941/64) ⇝ 59/4 | note:Ab4 gain:0.22000000000000322 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 29/2 ⇜ (235/16 → 941/64) ⇝ 59/4 | note:F#2 gain:0.44000000000000644 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 29/2 ⇜ (941/64 → 471/32) ⇝ 59/4 | note:Bb3 gain:0.14928932188134972 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 29/2 ⇜ (941/64 → 471/32) ⇝ 59/4 | note:Eb4 gain:0.14928932188134972 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 29/2 ⇜ (941/64 → 471/32) ⇝ 59/4 | note:E4 gain:0.14928932188134972 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 29/2 ⇜ (941/64 → 471/32) ⇝ 59/4 | note:Ab4 gain:0.14928932188134972 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 29/2 ⇜ (941/64 → 471/32) ⇝ 59/4 | note:F#2 gain:0.29857864376269944 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 29/2 ⇜ (471/32 → 943/64) ⇝ 59/4 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 29/2 ⇜ (471/32 → 943/64) ⇝ 59/4 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 29/2 ⇜ (471/32 → 943/64) ⇝ 59/4 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 29/2 ⇜ (471/32 → 943/64) ⇝ 59/4 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 29/2 ⇜ (471/32 → 943/64) ⇝ 59/4 | note:F#2 gain:0.24 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 29/2 ⇜ (943/64 → 59/4) | note:Bb3 gain:0.1492893218813444 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 29/2 ⇜ (943/64 → 59/4) | note:Eb4 gain:0.1492893218813444 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 29/2 ⇜ (943/64 → 59/4) | note:E4 gain:0.1492893218813444 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 29/2 ⇜ (943/64 → 59/4) | note:Ab4 gain:0.1492893218813444 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 29/2 ⇜ (943/64 → 59/4) | note:F#2 gain:0.2985786437626888 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ (59/4 → 945/64) ⇝ 119/8 | note:F#4 gain:0.43999999999999134 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ (59/4 → 945/64) ⇝ 119/8 | note:C#5 gain:0.43999999999999134 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ (59/4 → 945/64) ⇝ 119/8 | note:E5 gain:0.43999999999999134 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 59/4 ⇜ (945/64 → 473/32) ⇝ 119/8 | note:F#4 gain:0.581421356237299 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 59/4 ⇜ (945/64 → 473/32) ⇝ 119/8 | note:C#5 gain:0.581421356237299 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 59/4 ⇜ (945/64 → 473/32) ⇝ 119/8 | note:E5 gain:0.581421356237299 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 59/4 ⇜ (473/32 → 947/64) ⇝ 119/8 | note:F#4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 59/4 ⇜ (473/32 → 947/64) ⇝ 119/8 | note:C#5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 59/4 ⇜ (473/32 → 947/64) ⇝ 119/8 | note:E5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ (207/14 → 947/64) ⇝ 421/28 | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ (207/14 → 947/64) ⇝ 421/28 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ (207/14 → 947/64) ⇝ 421/28 | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ (207/14 → 947/64) ⇝ 421/28 | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 59/4 ⇜ (947/64 → 237/16) ⇝ 119/8 | note:F#4 gain:0.5814213562373127 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 59/4 ⇜ (947/64 → 237/16) ⇝ 119/8 | note:C#5 gain:0.5814213562373127 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 59/4 ⇜ (947/64 → 237/16) ⇝ 119/8 | note:E5 gain:0.5814213562373127 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 207/14 ⇜ (947/64 → 237/16) ⇝ 421/28 | note:70 gain:0.05814213562373127 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 207/14 ⇜ (947/64 → 237/16) ⇝ 421/28 | note:75 gain:0.05814213562373127 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 207/14 ⇜ (947/64 → 237/16) ⇝ 421/28 | note:76 gain:0.05814213562373127 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 207/14 ⇜ (947/64 → 237/16) ⇝ 421/28 | note:80 gain:0.05814213562373127 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 59/4 ⇜ (237/16 → 949/64) ⇝ 119/8 | note:F#4 gain:0.4400000000000108 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 59/4 ⇜ (237/16 → 949/64) ⇝ 119/8 | note:C#5 gain:0.4400000000000108 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 59/4 ⇜ (237/16 → 949/64) ⇝ 119/8 | note:E5 gain:0.4400000000000108 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 207/14 ⇜ (237/16 → 949/64) ⇝ 421/28 | note:70 gain:0.04400000000000109 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 207/14 ⇜ (237/16 → 949/64) ⇝ 421/28 | note:75 gain:0.04400000000000109 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 207/14 ⇜ (237/16 → 949/64) ⇝ 421/28 | note:76 gain:0.04400000000000109 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 207/14 ⇜ (237/16 → 949/64) ⇝ 421/28 | note:80 gain:0.04400000000000109 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 59/4 ⇜ (949/64 → 475/32) ⇝ 119/8 | note:F#4 gain:0.29857864376270254 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 59/4 ⇜ (949/64 → 475/32) ⇝ 119/8 | note:C#5 gain:0.29857864376270254 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 59/4 ⇜ (949/64 → 475/32) ⇝ 119/8 | note:E5 gain:0.29857864376270254 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 207/14 ⇜ (949/64 → 475/32) ⇝ 421/28 | note:70 gain:0.029857864376270256 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 207/14 ⇜ (949/64 → 475/32) ⇝ 421/28 | note:75 gain:0.029857864376270256 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 207/14 ⇜ (949/64 → 475/32) ⇝ 421/28 | note:76 gain:0.029857864376270256 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 207/14 ⇜ (949/64 → 475/32) ⇝ 421/28 | note:80 gain:0.029857864376270256 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 59/4 ⇜ (475/32 → 951/64) ⇝ 119/8 | note:F#4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 59/4 ⇜ (475/32 → 951/64) ⇝ 119/8 | note:C#5 gain:0.24 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 59/4 ⇜ (475/32 → 951/64) ⇝ 119/8 | note:E5 gain:0.24 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 207/14 ⇜ (475/32 → 951/64) ⇝ 421/28 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 207/14 ⇜ (475/32 → 951/64) ⇝ 421/28 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 207/14 ⇜ (475/32 → 951/64) ⇝ 421/28 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 207/14 ⇜ (475/32 → 951/64) ⇝ 421/28 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 59/4 ⇜ (951/64 → 119/8) | note:F#4 gain:0.2985786437626858 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 59/4 ⇜ (951/64 → 119/8) | note:C#5 gain:0.2985786437626858 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 59/4 ⇜ (951/64 → 119/8) | note:E5 gain:0.2985786437626858 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 207/14 ⇜ (951/64 → 119/8) ⇝ 421/28 | note:70 gain:0.02985786437626858 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 207/14 ⇜ (951/64 → 119/8) ⇝ 421/28 | note:75 gain:0.02985786437626858 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 207/14 ⇜ (951/64 → 119/8) ⇝ 421/28 | note:76 gain:0.02985786437626858 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 207/14 ⇜ (951/64 → 119/8) ⇝ 421/28 | note:80 gain:0.02985786437626858 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 207/14 ⇜ (119/8 → 953/64) ⇝ 421/28 | note:70 gain:0.04399999999999871 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 207/14 ⇜ (119/8 → 953/64) ⇝ 421/28 | note:75 gain:0.04399999999999871 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 207/14 ⇜ (119/8 → 953/64) ⇝ 421/28 | note:76 gain:0.04399999999999871 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 207/14 ⇜ (119/8 → 953/64) ⇝ 421/28 | note:80 gain:0.04399999999999871 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 207/14 ⇜ (953/64 → 477/32) ⇝ 421/28 | note:70 gain:0.05814213562373122 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 207/14 ⇜ (953/64 → 477/32) ⇝ 421/28 | note:75 gain:0.05814213562373122 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 207/14 ⇜ (953/64 → 477/32) ⇝ 421/28 | note:76 gain:0.05814213562373122 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 207/14 ⇜ (953/64 → 477/32) ⇝ 421/28 | note:80 gain:0.05814213562373122 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 207/14 ⇜ (477/32 → 955/64) ⇝ 421/28 | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 207/14 ⇜ (477/32 → 955/64) ⇝ 421/28 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 207/14 ⇜ (477/32 → 955/64) ⇝ 421/28 | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 207/14 ⇜ (477/32 → 955/64) ⇝ 421/28 | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 207/14 ⇜ (955/64 → 239/16) ⇝ 421/28 | note:70 gain:0.058142135623731585 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 207/14 ⇜ (955/64 → 239/16) ⇝ 421/28 | note:75 gain:0.058142135623731585 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 207/14 ⇜ (955/64 → 239/16) ⇝ 421/28 | note:76 gain:0.058142135623731585 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 207/14 ⇜ (955/64 → 239/16) ⇝ 421/28 | note:80 gain:0.058142135623731585 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 207/14 ⇜ (239/16 → 957/64) ⇝ 421/28 | note:70 gain:0.04400000000000152 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 207/14 ⇜ (239/16 → 957/64) ⇝ 421/28 | note:75 gain:0.04400000000000152 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 207/14 ⇜ (239/16 → 957/64) ⇝ 421/28 | note:76 gain:0.04400000000000152 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 207/14 ⇜ (239/16 → 957/64) ⇝ 421/28 | note:80 gain:0.04400000000000152 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 207/14 ⇜ (957/64 → 479/32) ⇝ 421/28 | note:70 gain:0.02985786437626895 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 207/14 ⇜ (957/64 → 479/32) ⇝ 421/28 | note:75 gain:0.02985786437626895 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 207/14 ⇜ (957/64 → 479/32) ⇝ 421/28 | note:76 gain:0.02985786437626895 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 207/14 ⇜ (957/64 → 479/32) ⇝ 421/28 | note:80 gain:0.02985786437626895 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 207/14 ⇜ (479/32 → 959/64) ⇝ 421/28 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 207/14 ⇜ (479/32 → 959/64) ⇝ 421/28 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 207/14 ⇜ (479/32 → 959/64) ⇝ 421/28 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 207/14 ⇜ (479/32 → 959/64) ⇝ 421/28 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 207/14 ⇜ (959/64 → 15/1) ⇝ 421/28 | note:70 gain:0.029857864376268268 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 207/14 ⇜ (959/64 → 15/1) ⇝ 421/28 | note:75 gain:0.029857864376268268 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 207/14 ⇜ (959/64 → 15/1) ⇝ 421/28 | note:76 gain:0.029857864376268268 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 207/14 ⇜ (959/64 → 15/1) ⇝ 421/28 | note:80 gain:0.029857864376268268 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 207/14 ⇜ (15/1 → 961/64) ⇝ 421/28 | note:70 gain:0.04399999999999828 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 207/14 ⇜ (15/1 → 961/64) ⇝ 421/28 | note:75 gain:0.04399999999999828 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 207/14 ⇜ (15/1 → 961/64) ⇝ 421/28 | note:76 gain:0.04399999999999828 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 207/14 ⇜ (15/1 → 961/64) ⇝ 421/28 | note:80 gain:0.04399999999999828 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ (15/1 → 961/64) ⇝ 61/4 | note:F#2 gain:0.43999999999998274 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 207/14 ⇜ (961/64 → 481/32) ⇝ 421/28 | note:70 gain:0.0581421356237309 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 207/14 ⇜ (961/64 → 481/32) ⇝ 421/28 | note:75 gain:0.0581421356237309 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 207/14 ⇜ (961/64 → 481/32) ⇝ 421/28 | note:76 gain:0.0581421356237309 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 207/14 ⇜ (961/64 → 481/32) ⇝ 421/28 | note:80 gain:0.0581421356237309 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 15/1 ⇜ (961/64 → 481/32) ⇝ 61/4 | note:F#2 gain:0.581421356237309 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 207/14 ⇜ (481/32 → 421/28) | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 207/14 ⇜ (481/32 → 421/28) | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 207/14 ⇜ (481/32 → 421/28) | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 207/14 ⇜ (481/32 → 421/28) | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 15/1 ⇜ (481/32 → 963/64) ⇝ 61/4 | note:F#2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 15/1 ⇜ (963/64 → 241/16) ⇝ 61/4 | note:F#2 gain:0.5814213562373188 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 15/1 ⇜ (241/16 → 965/64) ⇝ 61/4 | note:F#2 gain:0.43999999999999667 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 15/1 ⇜ (965/64 → 483/32) ⇝ 61/4 | note:F#2 gain:0.2985786437626925 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 15/1 ⇜ (483/32 → 967/64) ⇝ 61/4 | note:F#2 gain:0.24 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 15/1 ⇜ (967/64 → 121/8) ⇝ 61/4 | note:F#2 gain:0.2985786437626796 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 15/1 ⇜ (121/8 → 969/64) ⇝ 61/4 | note:F#2 gain:0.4400000000000012 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ (121/8 → 969/64) ⇝ 61/4 | note:F#4 gain:0.4400000000000012 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ (121/8 → 969/64) ⇝ 61/4 | note:C#5 gain:0.4400000000000012 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ (121/8 → 969/64) ⇝ 61/4 | note:E5 gain:0.4400000000000012 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 15/1 ⇜ (969/64 → 485/32) ⇝ 61/4 | note:F#2 gain:0.581421356237306 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 121/8 ⇜ (969/64 → 485/32) ⇝ 61/4 | note:F#4 gain:0.581421356237306 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 121/8 ⇜ (969/64 → 485/32) ⇝ 61/4 | note:C#5 gain:0.581421356237306 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 121/8 ⇜ (969/64 → 485/32) ⇝ 61/4 | note:E5 gain:0.581421356237306 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 15/1 ⇜ (485/32 → 971/64) ⇝ 61/4 | note:F#2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 121/8 ⇜ (485/32 → 971/64) ⇝ 61/4 | note:F#4 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 121/8 ⇜ (485/32 → 971/64) ⇝ 61/4 | note:C#5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 121/8 ⇜ (485/32 → 971/64) ⇝ 61/4 | note:E5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 15/1 ⇜ (971/64 → 243/16) ⇝ 61/4 | note:F#2 gain:0.5814213562373058 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 121/8 ⇜ (971/64 → 243/16) ⇝ 61/4 | note:F#4 gain:0.5814213562373058 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 121/8 ⇜ (971/64 → 243/16) ⇝ 61/4 | note:C#5 gain:0.5814213562373058 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 121/8 ⇜ (971/64 → 243/16) ⇝ 61/4 | note:E5 gain:0.5814213562373058 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 15/1 ⇜ (243/16 → 973/64) ⇝ 61/4 | note:F#2 gain:0.44000000000000095 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 121/8 ⇜ (243/16 → 973/64) ⇝ 61/4 | note:F#4 gain:0.44000000000000095 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 121/8 ⇜ (243/16 → 973/64) ⇝ 61/4 | note:C#5 gain:0.44000000000000095 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 121/8 ⇜ (243/16 → 973/64) ⇝ 61/4 | note:E5 gain:0.44000000000000095 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 15/1 ⇜ (973/64 → 487/32) ⇝ 61/4 | note:F#2 gain:0.2985786437626956 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 121/8 ⇜ (973/64 → 487/32) ⇝ 61/4 | note:F#4 gain:0.2985786437626956 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 121/8 ⇜ (973/64 → 487/32) ⇝ 61/4 | note:C#5 gain:0.2985786437626956 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 121/8 ⇜ (973/64 → 487/32) ⇝ 61/4 | note:E5 gain:0.2985786437626956 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 15/1 ⇜ (487/32 → 975/64) ⇝ 61/4 | note:F#2 gain:0.24 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 121/8 ⇜ (487/32 → 975/64) ⇝ 61/4 | note:F#4 gain:0.24 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 121/8 ⇜ (487/32 → 975/64) ⇝ 61/4 | note:C#5 gain:0.24 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 121/8 ⇜ (487/32 → 975/64) ⇝ 61/4 | note:E5 gain:0.24 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 15/1 ⇜ (975/64 → 61/4) | note:F#2 gain:0.29857864376269266 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 121/8 ⇜ (975/64 → 61/4) | note:F#4 gain:0.29857864376269266 clip:1 s:piano release:0.1 pan:0.5555555555555556 ]", - "[ 121/8 ⇜ (975/64 → 61/4) | note:C#5 gain:0.29857864376269266 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 121/8 ⇜ (975/64 → 61/4) | note:E5 gain:0.29857864376269266 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ (61/4 → 977/64) ⇝ 31/2 | note:Bb3 gain:0.21999999999999842 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ (61/4 → 977/64) ⇝ 31/2 | note:Eb4 gain:0.21999999999999842 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ (61/4 → 977/64) ⇝ 31/2 | note:E4 gain:0.21999999999999842 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (61/4 → 977/64) ⇝ 31/2 | note:Ab4 gain:0.21999999999999842 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 61/4 ⇜ (977/64 → 489/32) ⇝ 31/2 | note:Bb3 gain:0.2907106781186514 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 61/4 ⇜ (977/64 → 489/32) ⇝ 31/2 | note:Eb4 gain:0.2907106781186514 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 61/4 ⇜ (977/64 → 489/32) ⇝ 31/2 | note:E4 gain:0.2907106781186514 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 61/4 ⇜ (977/64 → 489/32) ⇝ 31/2 | note:Ab4 gain:0.2907106781186514 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 61/4 ⇜ (489/32 → 979/64) ⇝ 31/2 | note:Bb3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 61/4 ⇜ (489/32 → 979/64) ⇝ 31/2 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 61/4 ⇜ (489/32 → 979/64) ⇝ 31/2 | note:E4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 61/4 ⇜ (489/32 → 979/64) ⇝ 31/2 | note:Ab4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 61/4 ⇜ (979/64 → 245/16) ⇝ 31/2 | note:Bb3 gain:0.2907106781186545 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 61/4 ⇜ (979/64 → 245/16) ⇝ 31/2 | note:Eb4 gain:0.2907106781186545 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 61/4 ⇜ (979/64 → 245/16) ⇝ 31/2 | note:E4 gain:0.2907106781186545 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 61/4 ⇜ (979/64 → 245/16) ⇝ 31/2 | note:Ab4 gain:0.2907106781186545 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 61/4 ⇜ (245/16 → 981/64) ⇝ 31/2 | note:Bb3 gain:0.22000000000000264 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 61/4 ⇜ (245/16 → 981/64) ⇝ 31/2 | note:Eb4 gain:0.22000000000000264 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 61/4 ⇜ (245/16 → 981/64) ⇝ 31/2 | note:E4 gain:0.22000000000000264 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 61/4 ⇜ (245/16 → 981/64) ⇝ 31/2 | note:Ab4 gain:0.22000000000000264 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 61/4 ⇜ (981/64 → 491/32) ⇝ 31/2 | note:Bb3 gain:0.14928932188134933 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 61/4 ⇜ (981/64 → 491/32) ⇝ 31/2 | note:Eb4 gain:0.14928932188134933 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 61/4 ⇜ (981/64 → 491/32) ⇝ 31/2 | note:E4 gain:0.14928932188134933 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 61/4 ⇜ (981/64 → 491/32) ⇝ 31/2 | note:Ab4 gain:0.14928932188134933 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 61/4 ⇜ (491/32 → 983/64) ⇝ 31/2 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 61/4 ⇜ (491/32 → 983/64) ⇝ 31/2 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 61/4 ⇜ (491/32 → 983/64) ⇝ 31/2 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 61/4 ⇜ (491/32 → 983/64) ⇝ 31/2 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 61/4 ⇜ (983/64 → 123/8) ⇝ 31/2 | note:Bb3 gain:0.1492893218813448 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 61/4 ⇜ (983/64 → 123/8) ⇝ 31/2 | note:Eb4 gain:0.1492893218813448 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 61/4 ⇜ (983/64 → 123/8) ⇝ 31/2 | note:E4 gain:0.1492893218813448 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 61/4 ⇜ (983/64 → 123/8) ⇝ 31/2 | note:Ab4 gain:0.1492893218813448 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 61/4 ⇜ (123/8 → 985/64) ⇝ 31/2 | note:Bb3 gain:0.2199999999999963 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 61/4 ⇜ (123/8 → 985/64) ⇝ 31/2 | note:Eb4 gain:0.2199999999999963 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 61/4 ⇜ (123/8 → 985/64) ⇝ 31/2 | note:E4 gain:0.2199999999999963 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 61/4 ⇜ (123/8 → 985/64) ⇝ 31/2 | note:Ab4 gain:0.2199999999999963 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 61/4 ⇜ (985/64 → 493/32) ⇝ 31/2 | note:Bb3 gain:0.2907106781186499 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 61/4 ⇜ (985/64 → 493/32) ⇝ 31/2 | note:Eb4 gain:0.2907106781186499 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 61/4 ⇜ (985/64 → 493/32) ⇝ 31/2 | note:E4 gain:0.2907106781186499 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 61/4 ⇜ (985/64 → 493/32) ⇝ 31/2 | note:Ab4 gain:0.2907106781186499 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 61/4 ⇜ (493/32 → 987/64) ⇝ 31/2 | note:Bb3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 61/4 ⇜ (493/32 → 987/64) ⇝ 31/2 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 61/4 ⇜ (493/32 → 987/64) ⇝ 31/2 | note:E4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 61/4 ⇜ (493/32 → 987/64) ⇝ 31/2 | note:Ab4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 61/4 ⇜ (987/64 → 247/16) ⇝ 31/2 | note:Bb3 gain:0.290710678118656 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 61/4 ⇜ (987/64 → 247/16) ⇝ 31/2 | note:Eb4 gain:0.290710678118656 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 61/4 ⇜ (987/64 → 247/16) ⇝ 31/2 | note:E4 gain:0.290710678118656 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 61/4 ⇜ (987/64 → 247/16) ⇝ 31/2 | note:Ab4 gain:0.290710678118656 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 61/4 ⇜ (247/16 → 989/64) ⇝ 31/2 | note:Bb3 gain:0.22000000000000483 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 61/4 ⇜ (247/16 → 989/64) ⇝ 31/2 | note:Eb4 gain:0.22000000000000483 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 61/4 ⇜ (247/16 → 989/64) ⇝ 31/2 | note:E4 gain:0.22000000000000483 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 61/4 ⇜ (247/16 → 989/64) ⇝ 31/2 | note:Ab4 gain:0.22000000000000483 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 61/4 ⇜ (989/64 → 495/32) ⇝ 31/2 | note:Bb3 gain:0.14928932188135083 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 61/4 ⇜ (989/64 → 495/32) ⇝ 31/2 | note:Eb4 gain:0.14928932188135083 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 61/4 ⇜ (989/64 → 495/32) ⇝ 31/2 | note:E4 gain:0.14928932188135083 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 61/4 ⇜ (989/64 → 495/32) ⇝ 31/2 | note:Ab4 gain:0.14928932188135083 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 61/4 ⇜ (495/32 → 991/64) ⇝ 31/2 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 61/4 ⇜ (495/32 → 991/64) ⇝ 31/2 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 61/4 ⇜ (495/32 → 991/64) ⇝ 31/2 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 61/4 ⇜ (495/32 → 991/64) ⇝ 31/2 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 61/4 ⇜ (991/64 → 31/2) | note:Bb3 gain:0.14928932188134328 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 61/4 ⇜ (991/64 → 31/2) | note:Eb4 gain:0.14928932188134328 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 61/4 ⇜ (991/64 → 31/2) | note:E4 gain:0.14928932188134328 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 61/4 ⇜ (991/64 → 31/2) | note:Ab4 gain:0.14928932188134328 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ (31/2 → 993/64) ⇝ 125/8 | note:C#5 gain:0.43999999999998823 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ (31/2 → 993/64) ⇝ 125/8 | note:G#5 gain:0.43999999999998823 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ (31/2 → 993/64) ⇝ 125/8 | note:B5 gain:0.43999999999998823 clip:1 s:piano release:0.1 pan:0.6342592592592593 ]", - "[ (31/2 → 993/64) ⇝ 63/4 | note:F#2 gain:0.43999999999998823 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 31/2 ⇜ (993/64 → 497/32) ⇝ 125/8 | note:C#5 gain:0.5814213562373128 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 31/2 ⇜ (993/64 → 497/32) ⇝ 125/8 | note:G#5 gain:0.5814213562373128 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 31/2 ⇜ (993/64 → 497/32) ⇝ 125/8 | note:B5 gain:0.5814213562373128 clip:1 s:piano release:0.1 pan:0.6342592592592593 ]", - "[ 31/2 ⇜ (993/64 → 497/32) ⇝ 63/4 | note:F#2 gain:0.5814213562373128 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 31/2 ⇜ (497/32 → 995/64) ⇝ 125/8 | note:C#5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 31/2 ⇜ (497/32 → 995/64) ⇝ 125/8 | note:G#5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 31/2 ⇜ (497/32 → 995/64) ⇝ 125/8 | note:B5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.6342592592592593 ]", - "[ 31/2 ⇜ (497/32 → 995/64) ⇝ 63/4 | note:F#2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ (435/28 → 995/64) ⇝ 221/14 | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ (435/28 → 995/64) ⇝ 221/14 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ (435/28 → 995/64) ⇝ 221/14 | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ (435/28 → 995/64) ⇝ 221/14 | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 31/2 ⇜ (995/64 → 249/16) ⇝ 125/8 | note:C#5 gain:0.581421356237315 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 31/2 ⇜ (995/64 → 249/16) ⇝ 125/8 | note:G#5 gain:0.581421356237315 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 31/2 ⇜ (995/64 → 249/16) ⇝ 125/8 | note:B5 gain:0.581421356237315 clip:1 s:piano release:0.1 pan:0.6342592592592593 ]", - "[ 31/2 ⇜ (995/64 → 249/16) ⇝ 63/4 | note:F#2 gain:0.581421356237315 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 435/28 ⇜ (995/64 → 249/16) ⇝ 221/14 | note:70 gain:0.058142135623731495 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 435/28 ⇜ (995/64 → 249/16) ⇝ 221/14 | note:75 gain:0.058142135623731495 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 435/28 ⇜ (995/64 → 249/16) ⇝ 221/14 | note:76 gain:0.058142135623731495 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 435/28 ⇜ (995/64 → 249/16) ⇝ 221/14 | note:80 gain:0.058142135623731495 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 31/2 ⇜ (249/16 → 997/64) ⇝ 125/8 | note:C#5 gain:0.44000000000001394 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 31/2 ⇜ (249/16 → 997/64) ⇝ 125/8 | note:G#5 gain:0.44000000000001394 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 31/2 ⇜ (249/16 → 997/64) ⇝ 125/8 | note:B5 gain:0.44000000000001394 clip:1 s:piano release:0.1 pan:0.6342592592592593 ]", - "[ 31/2 ⇜ (249/16 → 997/64) ⇝ 63/4 | note:F#2 gain:0.44000000000001394 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 435/28 ⇜ (249/16 → 997/64) ⇝ 221/14 | note:70 gain:0.0440000000000014 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 435/28 ⇜ (249/16 → 997/64) ⇝ 221/14 | note:75 gain:0.0440000000000014 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 435/28 ⇜ (249/16 → 997/64) ⇝ 221/14 | note:76 gain:0.0440000000000014 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 435/28 ⇜ (249/16 → 997/64) ⇝ 221/14 | note:80 gain:0.0440000000000014 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 31/2 ⇜ (997/64 → 499/32) ⇝ 125/8 | note:C#5 gain:0.29857864376268867 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 31/2 ⇜ (997/64 → 499/32) ⇝ 125/8 | note:G#5 gain:0.29857864376268867 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 31/2 ⇜ (997/64 → 499/32) ⇝ 125/8 | note:B5 gain:0.29857864376268867 clip:1 s:piano release:0.1 pan:0.6342592592592593 ]", - "[ 31/2 ⇜ (997/64 → 499/32) ⇝ 63/4 | note:F#2 gain:0.29857864376268867 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 435/28 ⇜ (997/64 → 499/32) ⇝ 221/14 | note:70 gain:0.029857864376268868 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 435/28 ⇜ (997/64 → 499/32) ⇝ 221/14 | note:75 gain:0.029857864376268868 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 435/28 ⇜ (997/64 → 499/32) ⇝ 221/14 | note:76 gain:0.029857864376268868 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 435/28 ⇜ (997/64 → 499/32) ⇝ 221/14 | note:80 gain:0.029857864376268868 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 31/2 ⇜ (499/32 → 999/64) ⇝ 125/8 | note:C#5 gain:0.24 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 31/2 ⇜ (499/32 → 999/64) ⇝ 125/8 | note:G#5 gain:0.24 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 31/2 ⇜ (499/32 → 999/64) ⇝ 125/8 | note:B5 gain:0.24 clip:1 s:piano release:0.1 pan:0.6342592592592593 ]", - "[ 31/2 ⇜ (499/32 → 999/64) ⇝ 63/4 | note:F#2 gain:0.24 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 435/28 ⇜ (499/32 → 999/64) ⇝ 221/14 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 435/28 ⇜ (499/32 → 999/64) ⇝ 221/14 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 435/28 ⇜ (499/32 → 999/64) ⇝ 221/14 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 435/28 ⇜ (499/32 → 999/64) ⇝ 221/14 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 31/2 ⇜ (999/64 → 125/8) | note:C#5 gain:0.29857864376268356 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 31/2 ⇜ (999/64 → 125/8) | note:G#5 gain:0.29857864376268356 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 31/2 ⇜ (999/64 → 125/8) | note:B5 gain:0.29857864376268356 clip:1 s:piano release:0.1 pan:0.6342592592592593 ]", - "[ 31/2 ⇜ (999/64 → 125/8) ⇝ 63/4 | note:F#2 gain:0.29857864376268356 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 435/28 ⇜ (999/64 → 125/8) ⇝ 221/14 | note:70 gain:0.029857864376268358 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 435/28 ⇜ (999/64 → 125/8) ⇝ 221/14 | note:75 gain:0.029857864376268358 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 435/28 ⇜ (999/64 → 125/8) ⇝ 221/14 | note:76 gain:0.029857864376268358 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 435/28 ⇜ (999/64 → 125/8) ⇝ 221/14 | note:80 gain:0.029857864376268358 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 31/2 ⇜ (125/8 → 1001/64) ⇝ 63/4 | note:F#2 gain:0.4399999999999839 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 435/28 ⇜ (125/8 → 1001/64) ⇝ 221/14 | note:70 gain:0.043999999999998395 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 435/28 ⇜ (125/8 → 1001/64) ⇝ 221/14 | note:75 gain:0.043999999999998395 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 435/28 ⇜ (125/8 → 1001/64) ⇝ 221/14 | note:76 gain:0.043999999999998395 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 435/28 ⇜ (125/8 → 1001/64) ⇝ 221/14 | note:80 gain:0.043999999999998395 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 31/2 ⇜ (1001/64 → 501/32) ⇝ 63/4 | note:F#2 gain:0.5814213562373098 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 435/28 ⇜ (1001/64 → 501/32) ⇝ 221/14 | note:70 gain:0.05814213562373099 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 435/28 ⇜ (1001/64 → 501/32) ⇝ 221/14 | note:75 gain:0.05814213562373099 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 435/28 ⇜ (1001/64 → 501/32) ⇝ 221/14 | note:76 gain:0.05814213562373099 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 435/28 ⇜ (1001/64 → 501/32) ⇝ 221/14 | note:80 gain:0.05814213562373099 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 31/2 ⇜ (501/32 → 1003/64) ⇝ 63/4 | note:F#2 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 435/28 ⇜ (501/32 → 1003/64) ⇝ 221/14 | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 435/28 ⇜ (501/32 → 1003/64) ⇝ 221/14 | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 435/28 ⇜ (501/32 → 1003/64) ⇝ 221/14 | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 435/28 ⇜ (501/32 → 1003/64) ⇝ 221/14 | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 31/2 ⇜ (1003/64 → 251/16) ⇝ 63/4 | note:F#2 gain:0.5814213562373179 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 435/28 ⇜ (1003/64 → 251/16) ⇝ 221/14 | note:70 gain:0.0581421356237318 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 435/28 ⇜ (1003/64 → 251/16) ⇝ 221/14 | note:75 gain:0.0581421356237318 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 435/28 ⇜ (1003/64 → 251/16) ⇝ 221/14 | note:76 gain:0.0581421356237318 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 435/28 ⇜ (1003/64 → 251/16) ⇝ 221/14 | note:80 gain:0.0581421356237318 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 31/2 ⇜ (251/16 → 1005/64) ⇝ 63/4 | note:F#2 gain:0.4399999999999955 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 435/28 ⇜ (251/16 → 1005/64) ⇝ 221/14 | note:70 gain:0.04399999999999955 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 435/28 ⇜ (251/16 → 1005/64) ⇝ 221/14 | note:75 gain:0.04399999999999955 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 435/28 ⇜ (251/16 → 1005/64) ⇝ 221/14 | note:76 gain:0.04399999999999955 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 435/28 ⇜ (251/16 → 1005/64) ⇝ 221/14 | note:80 gain:0.04399999999999955 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 31/2 ⇜ (1005/64 → 503/32) ⇝ 63/4 | note:F#2 gain:0.2985786437626917 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 435/28 ⇜ (1005/64 → 503/32) ⇝ 221/14 | note:70 gain:0.029857864376269173 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 435/28 ⇜ (1005/64 → 503/32) ⇝ 221/14 | note:75 gain:0.029857864376269173 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 435/28 ⇜ (1005/64 → 503/32) ⇝ 221/14 | note:76 gain:0.029857864376269173 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 435/28 ⇜ (1005/64 → 503/32) ⇝ 221/14 | note:80 gain:0.029857864376269173 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 31/2 ⇜ (503/32 → 1007/64) ⇝ 63/4 | note:F#2 gain:0.24 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 435/28 ⇜ (503/32 → 1007/64) ⇝ 221/14 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 435/28 ⇜ (503/32 → 1007/64) ⇝ 221/14 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 435/28 ⇜ (503/32 → 1007/64) ⇝ 221/14 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 435/28 ⇜ (503/32 → 1007/64) ⇝ 221/14 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 31/2 ⇜ (1007/64 → 63/4) | note:F#2 gain:0.29857864376268045 clip:1 s:piano release:0.1 pan:0.4444444444444444 ]", - "[ 435/28 ⇜ (1007/64 → 63/4) ⇝ 221/14 | note:70 gain:0.029857864376268046 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 435/28 ⇜ (1007/64 → 63/4) ⇝ 221/14 | note:75 gain:0.029857864376268046 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 435/28 ⇜ (1007/64 → 63/4) ⇝ 221/14 | note:76 gain:0.029857864376268046 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 435/28 ⇜ (1007/64 → 63/4) ⇝ 221/14 | note:80 gain:0.029857864376268046 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 435/28 ⇜ (63/4 → 1009/64) ⇝ 221/14 | note:70 gain:0.04400000000000024 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 435/28 ⇜ (63/4 → 1009/64) ⇝ 221/14 | note:75 gain:0.04400000000000024 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 435/28 ⇜ (63/4 → 1009/64) ⇝ 221/14 | note:76 gain:0.04400000000000024 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 435/28 ⇜ (63/4 → 1009/64) ⇝ 221/14 | note:80 gain:0.04400000000000024 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ (63/4 → 1009/64) ⇝ 127/8 | note:C#5 gain:0.4400000000000024 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ (63/4 → 1009/64) ⇝ 127/8 | note:G#5 gain:0.4400000000000024 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ (63/4 → 1009/64) ⇝ 127/8 | note:B5 gain:0.4400000000000024 clip:1 s:piano release:0.1 pan:0.6342592592592593 ]", - "[ (63/4 → 1009/64) ⇝ 16/1 | note:Bb3 gain:0.2200000000000012 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ (63/4 → 1009/64) ⇝ 16/1 | note:Eb4 gain:0.2200000000000012 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ (63/4 → 1009/64) ⇝ 16/1 | note:E4 gain:0.2200000000000012 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ (63/4 → 1009/64) ⇝ 16/1 | note:Ab4 gain:0.2200000000000012 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 435/28 ⇜ (1009/64 → 505/32) ⇝ 221/14 | note:70 gain:0.05814213562373069 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 435/28 ⇜ (1009/64 → 505/32) ⇝ 221/14 | note:75 gain:0.05814213562373069 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 435/28 ⇜ (1009/64 → 505/32) ⇝ 221/14 | note:76 gain:0.05814213562373069 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 435/28 ⇜ (1009/64 → 505/32) ⇝ 221/14 | note:80 gain:0.05814213562373069 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 63/4 ⇜ (1009/64 → 505/32) ⇝ 127/8 | note:C#5 gain:0.5814213562373068 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 63/4 ⇜ (1009/64 → 505/32) ⇝ 127/8 | note:G#5 gain:0.5814213562373068 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 63/4 ⇜ (1009/64 → 505/32) ⇝ 127/8 | note:B5 gain:0.5814213562373068 clip:1 s:piano release:0.1 pan:0.6342592592592593 ]", - "[ 63/4 ⇜ (1009/64 → 505/32) ⇝ 16/1 | note:Bb3 gain:0.2907106781186534 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 63/4 ⇜ (1009/64 → 505/32) ⇝ 16/1 | note:Eb4 gain:0.2907106781186534 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 63/4 ⇜ (1009/64 → 505/32) ⇝ 16/1 | note:E4 gain:0.2907106781186534 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 63/4 ⇜ (1009/64 → 505/32) ⇝ 16/1 | note:Ab4 gain:0.2907106781186534 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 435/28 ⇜ (505/32 → 221/14) | note:70 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 435/28 ⇜ (505/32 → 221/14) | note:75 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 435/28 ⇜ (505/32 → 221/14) | note:76 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 435/28 ⇜ (505/32 → 221/14) | note:80 gain:0.06400000000000002 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 63/4 ⇜ (505/32 → 1011/64) ⇝ 127/8 | note:C#5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 63/4 ⇜ (505/32 → 1011/64) ⇝ 127/8 | note:G#5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 63/4 ⇜ (505/32 → 1011/64) ⇝ 127/8 | note:B5 gain:0.6400000000000001 clip:1 s:piano release:0.1 pan:0.6342592592592593 ]", - "[ 63/4 ⇜ (505/32 → 1011/64) ⇝ 16/1 | note:Bb3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 63/4 ⇜ (505/32 → 1011/64) ⇝ 16/1 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 63/4 ⇜ (505/32 → 1011/64) ⇝ 16/1 | note:E4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 63/4 ⇜ (505/32 → 1011/64) ⇝ 16/1 | note:Ab4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 63/4 ⇜ (1011/64 → 253/16) ⇝ 127/8 | note:C#5 gain:0.581421356237321 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 63/4 ⇜ (1011/64 → 253/16) ⇝ 127/8 | note:G#5 gain:0.581421356237321 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 63/4 ⇜ (1011/64 → 253/16) ⇝ 127/8 | note:B5 gain:0.581421356237321 clip:1 s:piano release:0.1 pan:0.6342592592592593 ]", - "[ 63/4 ⇜ (1011/64 → 253/16) ⇝ 16/1 | note:Bb3 gain:0.2907106781186605 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 63/4 ⇜ (1011/64 → 253/16) ⇝ 16/1 | note:Eb4 gain:0.2907106781186605 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 63/4 ⇜ (1011/64 → 253/16) ⇝ 16/1 | note:E4 gain:0.2907106781186605 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 63/4 ⇜ (1011/64 → 253/16) ⇝ 16/1 | note:Ab4 gain:0.2907106781186605 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 63/4 ⇜ (253/16 → 1013/64) ⇝ 127/8 | note:C#5 gain:0.4399999999999998 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 63/4 ⇜ (253/16 → 1013/64) ⇝ 127/8 | note:G#5 gain:0.4399999999999998 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 63/4 ⇜ (253/16 → 1013/64) ⇝ 127/8 | note:B5 gain:0.4399999999999998 clip:1 s:piano release:0.1 pan:0.6342592592592593 ]", - "[ 63/4 ⇜ (253/16 → 1013/64) ⇝ 16/1 | note:Bb3 gain:0.2199999999999999 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 63/4 ⇜ (253/16 → 1013/64) ⇝ 16/1 | note:Eb4 gain:0.2199999999999999 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 63/4 ⇜ (253/16 → 1013/64) ⇝ 16/1 | note:E4 gain:0.2199999999999999 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 63/4 ⇜ (253/16 → 1013/64) ⇝ 16/1 | note:Ab4 gain:0.2199999999999999 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 63/4 ⇜ (1013/64 → 507/32) ⇝ 127/8 | note:C#5 gain:0.2985786437626947 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 63/4 ⇜ (1013/64 → 507/32) ⇝ 127/8 | note:G#5 gain:0.2985786437626947 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 63/4 ⇜ (1013/64 → 507/32) ⇝ 127/8 | note:B5 gain:0.2985786437626947 clip:1 s:piano release:0.1 pan:0.6342592592592593 ]", - "[ 63/4 ⇜ (1013/64 → 507/32) ⇝ 16/1 | note:Bb3 gain:0.14928932188134736 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 63/4 ⇜ (1013/64 → 507/32) ⇝ 16/1 | note:Eb4 gain:0.14928932188134736 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 63/4 ⇜ (1013/64 → 507/32) ⇝ 16/1 | note:E4 gain:0.14928932188134736 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 63/4 ⇜ (1013/64 → 507/32) ⇝ 16/1 | note:Ab4 gain:0.14928932188134736 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 63/4 ⇜ (507/32 → 1015/64) ⇝ 127/8 | note:C#5 gain:0.24 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 63/4 ⇜ (507/32 → 1015/64) ⇝ 127/8 | note:G#5 gain:0.24 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 63/4 ⇜ (507/32 → 1015/64) ⇝ 127/8 | note:B5 gain:0.24 clip:1 s:piano release:0.1 pan:0.6342592592592593 ]", - "[ 63/4 ⇜ (507/32 → 1015/64) ⇝ 16/1 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 63/4 ⇜ (507/32 → 1015/64) ⇝ 16/1 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 63/4 ⇜ (507/32 → 1015/64) ⇝ 16/1 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 63/4 ⇜ (507/32 → 1015/64) ⇝ 16/1 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 63/4 ⇜ (1015/64 → 127/8) | note:C#5 gain:0.2985786437626935 clip:1 s:piano release:0.1 pan:0.587962962962963 ]", - "[ 63/4 ⇜ (1015/64 → 127/8) | note:G#5 gain:0.2985786437626935 clip:1 s:piano release:0.1 pan:0.6203703703703703 ]", - "[ 63/4 ⇜ (1015/64 → 127/8) | note:B5 gain:0.2985786437626935 clip:1 s:piano release:0.1 pan:0.6342592592592593 ]", - "[ 63/4 ⇜ (1015/64 → 127/8) ⇝ 16/1 | note:Bb3 gain:0.14928932188134675 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 63/4 ⇜ (1015/64 → 127/8) ⇝ 16/1 | note:Eb4 gain:0.14928932188134675 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 63/4 ⇜ (1015/64 → 127/8) ⇝ 16/1 | note:E4 gain:0.14928932188134675 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 63/4 ⇜ (1015/64 → 127/8) ⇝ 16/1 | note:Ab4 gain:0.14928932188134675 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 63/4 ⇜ (127/8 → 1017/64) ⇝ 16/1 | note:Bb3 gain:0.21999999999999906 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 63/4 ⇜ (127/8 → 1017/64) ⇝ 16/1 | note:Eb4 gain:0.21999999999999906 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 63/4 ⇜ (127/8 → 1017/64) ⇝ 16/1 | note:E4 gain:0.21999999999999906 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 63/4 ⇜ (127/8 → 1017/64) ⇝ 16/1 | note:Ab4 gain:0.21999999999999906 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 63/4 ⇜ (1017/64 → 509/32) ⇝ 16/1 | note:Bb3 gain:0.29071067811865187 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 63/4 ⇜ (1017/64 → 509/32) ⇝ 16/1 | note:Eb4 gain:0.29071067811865187 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 63/4 ⇜ (1017/64 → 509/32) ⇝ 16/1 | note:E4 gain:0.29071067811865187 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 63/4 ⇜ (1017/64 → 509/32) ⇝ 16/1 | note:Ab4 gain:0.29071067811865187 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 63/4 ⇜ (509/32 → 1019/64) ⇝ 16/1 | note:Bb3 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 63/4 ⇜ (509/32 → 1019/64) ⇝ 16/1 | note:Eb4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 63/4 ⇜ (509/32 → 1019/64) ⇝ 16/1 | note:E4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 63/4 ⇜ (509/32 → 1019/64) ⇝ 16/1 | note:Ab4 gain:0.32000000000000006 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 63/4 ⇜ (1019/64 → 255/16) ⇝ 16/1 | note:Bb3 gain:0.29071067811865403 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 63/4 ⇜ (1019/64 → 255/16) ⇝ 16/1 | note:Eb4 gain:0.29071067811865403 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 63/4 ⇜ (1019/64 → 255/16) ⇝ 16/1 | note:E4 gain:0.29071067811865403 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 63/4 ⇜ (1019/64 → 255/16) ⇝ 16/1 | note:Ab4 gain:0.29071067811865403 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 63/4 ⇜ (255/16 → 1021/64) ⇝ 16/1 | note:Bb3 gain:0.22000000000000208 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 63/4 ⇜ (255/16 → 1021/64) ⇝ 16/1 | note:Eb4 gain:0.22000000000000208 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 63/4 ⇜ (255/16 → 1021/64) ⇝ 16/1 | note:E4 gain:0.22000000000000208 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 63/4 ⇜ (255/16 → 1021/64) ⇝ 16/1 | note:Ab4 gain:0.22000000000000208 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 63/4 ⇜ (1021/64 → 511/32) ⇝ 16/1 | note:Bb3 gain:0.1492893218813489 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 63/4 ⇜ (1021/64 → 511/32) ⇝ 16/1 | note:Eb4 gain:0.1492893218813489 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 63/4 ⇜ (1021/64 → 511/32) ⇝ 16/1 | note:E4 gain:0.1492893218813489 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 63/4 ⇜ (1021/64 → 511/32) ⇝ 16/1 | note:Ab4 gain:0.1492893218813489 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 63/4 ⇜ (511/32 → 1023/64) ⇝ 16/1 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 63/4 ⇜ (511/32 → 1023/64) ⇝ 16/1 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 63/4 ⇜ (511/32 → 1023/64) ⇝ 16/1 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 63/4 ⇜ (511/32 → 1023/64) ⇝ 16/1 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", - "[ 63/4 ⇜ (1023/64 → 16/1) | note:Bb3 gain:0.14928932188134522 clip:1 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 63/4 ⇜ (1023/64 → 16/1) | note:Eb4 gain:0.14928932188134522 clip:1 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 63/4 ⇜ (1023/64 → 16/1) | note:E4 gain:0.14928932188134522 clip:1 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 63/4 ⇜ (1023/64 → 16/1) | note:Ab4 gain:0.14928932188134522 clip:1 s:piano release:0.1 pan:0.5648148148148149 ]", + "[ 113/8 ⇜ (455/32 → 911/64) ⇝ 57/4 | note:F#4 gain:0.24 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 113/8 ⇜ (455/32 → 911/64) ⇝ 57/4 | note:C#5 gain:0.24 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 113/8 ⇜ (455/32 → 911/64) ⇝ 57/4 | note:E5 gain:0.24 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 14/1 ⇜ (911/64 → 57/4) | note:F#2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 393/28 ⇜ (911/64 → 57/4) ⇝ 100/7 | note:71 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 393/28 ⇜ (911/64 → 57/4) ⇝ 100/7 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 393/28 ⇜ (911/64 → 57/4) ⇝ 100/7 | note:77 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 393/28 ⇜ (911/64 → 57/4) ⇝ 100/7 | note:81 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 113/8 ⇜ (911/64 → 57/4) | note:F#4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 113/8 ⇜ (911/64 → 57/4) | note:C#5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 113/8 ⇜ (911/64 → 57/4) | note:E5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 393/28 ⇜ (57/4 → 913/64) ⇝ 100/7 | note:71 gain:0.044 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 393/28 ⇜ (57/4 → 913/64) ⇝ 100/7 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 393/28 ⇜ (57/4 → 913/64) ⇝ 100/7 | note:77 gain:0.044 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 393/28 ⇜ (57/4 → 913/64) ⇝ 100/7 | note:81 gain:0.044 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 393/28 ⇜ (913/64 → 457/32) ⇝ 100/7 | note:71 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 393/28 ⇜ (913/64 → 457/32) ⇝ 100/7 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 393/28 ⇜ (913/64 → 457/32) ⇝ 100/7 | note:77 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 393/28 ⇜ (913/64 → 457/32) ⇝ 100/7 | note:81 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ 393/28 ⇜ (457/32 → 100/7) | note:71 gain:0.064 clip:1 s:piano release:0.1 pan:0.578703703704 ]", + "[ 393/28 ⇜ (457/32 → 100/7) | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 393/28 ⇜ (457/32 → 100/7) | note:77 gain:0.064 clip:1 s:piano release:0.1 pan:0.606481481481 ]", + "[ 393/28 ⇜ (457/32 → 100/7) | note:81 gain:0.064 clip:1 s:piano release:0.1 pan:0.625 ]", + "[ (29/2 → 929/64) ⇝ 117/8 | note:C#5 gain:0.44 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ (29/2 → 929/64) ⇝ 117/8 | note:G#5 gain:0.44 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ (29/2 → 929/64) ⇝ 117/8 | note:B5 gain:0.44 clip:1 s:piano release:0.1 pan:0.634259259259 ]", + "[ (29/2 → 929/64) ⇝ 59/4 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ (29/2 → 929/64) ⇝ 59/4 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ (29/2 → 929/64) ⇝ 59/4 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (29/2 → 929/64) ⇝ 59/4 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ (29/2 → 929/64) ⇝ 59/4 | note:F#2 gain:0.44 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 29/2 ⇜ (929/64 → 465/32) ⇝ 117/8 | note:C#5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 29/2 ⇜ (929/64 → 465/32) ⇝ 117/8 | note:G#5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 29/2 ⇜ (929/64 → 465/32) ⇝ 117/8 | note:B5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.634259259259 ]", + "[ 29/2 ⇜ (929/64 → 465/32) ⇝ 59/4 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 29/2 ⇜ (929/64 → 465/32) ⇝ 59/4 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 29/2 ⇜ (929/64 → 465/32) ⇝ 59/4 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 29/2 ⇜ (929/64 → 465/32) ⇝ 59/4 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 29/2 ⇜ (929/64 → 465/32) ⇝ 59/4 | note:F#2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 29/2 ⇜ (465/32 → 931/64) ⇝ 117/8 | note:C#5 gain:0.64 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 29/2 ⇜ (465/32 → 931/64) ⇝ 117/8 | note:G#5 gain:0.64 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 29/2 ⇜ (465/32 → 931/64) ⇝ 117/8 | note:B5 gain:0.64 clip:1 s:piano release:0.1 pan:0.634259259259 ]", + "[ 29/2 ⇜ (465/32 → 931/64) ⇝ 59/4 | note:Bb3 gain:0.32 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 29/2 ⇜ (465/32 → 931/64) ⇝ 59/4 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 29/2 ⇜ (465/32 → 931/64) ⇝ 59/4 | note:E4 gain:0.32 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 29/2 ⇜ (465/32 → 931/64) ⇝ 59/4 | note:Ab4 gain:0.32 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 29/2 ⇜ (465/32 → 931/64) ⇝ 59/4 | note:F#2 gain:0.64 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 29/2 ⇜ (931/64 → 233/16) ⇝ 117/8 | note:C#5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 29/2 ⇜ (931/64 → 233/16) ⇝ 117/8 | note:G#5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 29/2 ⇜ (931/64 → 233/16) ⇝ 117/8 | note:B5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.634259259259 ]", + "[ 29/2 ⇜ (931/64 → 233/16) ⇝ 59/4 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 29/2 ⇜ (931/64 → 233/16) ⇝ 59/4 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 29/2 ⇜ (931/64 → 233/16) ⇝ 59/4 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 29/2 ⇜ (931/64 → 233/16) ⇝ 59/4 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 29/2 ⇜ (931/64 → 233/16) ⇝ 59/4 | note:F#2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 29/2 ⇜ (233/16 → 933/64) ⇝ 117/8 | note:C#5 gain:0.44 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 29/2 ⇜ (233/16 → 933/64) ⇝ 117/8 | note:G#5 gain:0.44 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 29/2 ⇜ (233/16 → 933/64) ⇝ 117/8 | note:B5 gain:0.44 clip:1 s:piano release:0.1 pan:0.634259259259 ]", + "[ 29/2 ⇜ (233/16 → 933/64) ⇝ 59/4 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 29/2 ⇜ (233/16 → 933/64) ⇝ 59/4 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 29/2 ⇜ (233/16 → 933/64) ⇝ 59/4 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 29/2 ⇜ (233/16 → 933/64) ⇝ 59/4 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 29/2 ⇜ (233/16 → 933/64) ⇝ 59/4 | note:F#2 gain:0.44 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 29/2 ⇜ (933/64 → 467/32) ⇝ 117/8 | note:C#5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 29/2 ⇜ (933/64 → 467/32) ⇝ 117/8 | note:G#5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 29/2 ⇜ (933/64 → 467/32) ⇝ 117/8 | note:B5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.634259259259 ]", + "[ 29/2 ⇜ (933/64 → 467/32) ⇝ 59/4 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 29/2 ⇜ (933/64 → 467/32) ⇝ 59/4 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 29/2 ⇜ (933/64 → 467/32) ⇝ 59/4 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 29/2 ⇜ (933/64 → 467/32) ⇝ 59/4 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 29/2 ⇜ (933/64 → 467/32) ⇝ 59/4 | note:F#2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 29/2 ⇜ (467/32 → 935/64) ⇝ 117/8 | note:C#5 gain:0.24 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 29/2 ⇜ (467/32 → 935/64) ⇝ 117/8 | note:G#5 gain:0.24 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 29/2 ⇜ (467/32 → 935/64) ⇝ 117/8 | note:B5 gain:0.24 clip:1 s:piano release:0.1 pan:0.634259259259 ]", + "[ 29/2 ⇜ (467/32 → 935/64) ⇝ 59/4 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 29/2 ⇜ (467/32 → 935/64) ⇝ 59/4 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 29/2 ⇜ (467/32 → 935/64) ⇝ 59/4 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 29/2 ⇜ (467/32 → 935/64) ⇝ 59/4 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 29/2 ⇜ (467/32 → 935/64) ⇝ 59/4 | note:F#2 gain:0.24 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 29/2 ⇜ (935/64 → 117/8) | note:C#5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 29/2 ⇜ (935/64 → 117/8) | note:G#5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 29/2 ⇜ (935/64 → 117/8) | note:B5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.634259259259 ]", + "[ 29/2 ⇜ (935/64 → 117/8) ⇝ 59/4 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 29/2 ⇜ (935/64 → 117/8) ⇝ 59/4 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 29/2 ⇜ (935/64 → 117/8) ⇝ 59/4 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 29/2 ⇜ (935/64 → 117/8) ⇝ 59/4 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 29/2 ⇜ (935/64 → 117/8) ⇝ 59/4 | note:F#2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 29/2 ⇜ (117/8 → 937/64) ⇝ 59/4 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 29/2 ⇜ (117/8 → 937/64) ⇝ 59/4 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 29/2 ⇜ (117/8 → 937/64) ⇝ 59/4 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 29/2 ⇜ (117/8 → 937/64) ⇝ 59/4 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 29/2 ⇜ (117/8 → 937/64) ⇝ 59/4 | note:F#2 gain:0.44 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 29/2 ⇜ (937/64 → 469/32) ⇝ 59/4 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 29/2 ⇜ (937/64 → 469/32) ⇝ 59/4 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 29/2 ⇜ (937/64 → 469/32) ⇝ 59/4 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 29/2 ⇜ (937/64 → 469/32) ⇝ 59/4 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 29/2 ⇜ (937/64 → 469/32) ⇝ 59/4 | note:F#2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 29/2 ⇜ (469/32 → 939/64) ⇝ 59/4 | note:Bb3 gain:0.32 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 29/2 ⇜ (469/32 → 939/64) ⇝ 59/4 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 29/2 ⇜ (469/32 → 939/64) ⇝ 59/4 | note:E4 gain:0.32 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 29/2 ⇜ (469/32 → 939/64) ⇝ 59/4 | note:Ab4 gain:0.32 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 29/2 ⇜ (469/32 → 939/64) ⇝ 59/4 | note:F#2 gain:0.64 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 29/2 ⇜ (939/64 → 235/16) ⇝ 59/4 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 29/2 ⇜ (939/64 → 235/16) ⇝ 59/4 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 29/2 ⇜ (939/64 → 235/16) ⇝ 59/4 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 29/2 ⇜ (939/64 → 235/16) ⇝ 59/4 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 29/2 ⇜ (939/64 → 235/16) ⇝ 59/4 | note:F#2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 29/2 ⇜ (235/16 → 941/64) ⇝ 59/4 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 29/2 ⇜ (235/16 → 941/64) ⇝ 59/4 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 29/2 ⇜ (235/16 → 941/64) ⇝ 59/4 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 29/2 ⇜ (235/16 → 941/64) ⇝ 59/4 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 29/2 ⇜ (235/16 → 941/64) ⇝ 59/4 | note:F#2 gain:0.44 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 29/2 ⇜ (941/64 → 471/32) ⇝ 59/4 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 29/2 ⇜ (941/64 → 471/32) ⇝ 59/4 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 29/2 ⇜ (941/64 → 471/32) ⇝ 59/4 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 29/2 ⇜ (941/64 → 471/32) ⇝ 59/4 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 29/2 ⇜ (941/64 → 471/32) ⇝ 59/4 | note:F#2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 29/2 ⇜ (471/32 → 943/64) ⇝ 59/4 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 29/2 ⇜ (471/32 → 943/64) ⇝ 59/4 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 29/2 ⇜ (471/32 → 943/64) ⇝ 59/4 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 29/2 ⇜ (471/32 → 943/64) ⇝ 59/4 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 29/2 ⇜ (471/32 → 943/64) ⇝ 59/4 | note:F#2 gain:0.24 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 29/2 ⇜ (943/64 → 59/4) | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 29/2 ⇜ (943/64 → 59/4) | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 29/2 ⇜ (943/64 → 59/4) | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 29/2 ⇜ (943/64 → 59/4) | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 29/2 ⇜ (943/64 → 59/4) | note:F#2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ (59/4 → 945/64) ⇝ 119/8 | note:F#4 gain:0.44 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ (59/4 → 945/64) ⇝ 119/8 | note:C#5 gain:0.44 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ (59/4 → 945/64) ⇝ 119/8 | note:E5 gain:0.44 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 59/4 ⇜ (945/64 → 473/32) ⇝ 119/8 | note:F#4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 59/4 ⇜ (945/64 → 473/32) ⇝ 119/8 | note:C#5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 59/4 ⇜ (945/64 → 473/32) ⇝ 119/8 | note:E5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 59/4 ⇜ (473/32 → 947/64) ⇝ 119/8 | note:F#4 gain:0.64 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 59/4 ⇜ (473/32 → 947/64) ⇝ 119/8 | note:C#5 gain:0.64 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 59/4 ⇜ (473/32 → 947/64) ⇝ 119/8 | note:E5 gain:0.64 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ (207/14 → 947/64) ⇝ 421/28 | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ (207/14 → 947/64) ⇝ 421/28 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ (207/14 → 947/64) ⇝ 421/28 | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ (207/14 → 947/64) ⇝ 421/28 | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 59/4 ⇜ (947/64 → 237/16) ⇝ 119/8 | note:F#4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 59/4 ⇜ (947/64 → 237/16) ⇝ 119/8 | note:C#5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 59/4 ⇜ (947/64 → 237/16) ⇝ 119/8 | note:E5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 207/14 ⇜ (947/64 → 237/16) ⇝ 421/28 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 207/14 ⇜ (947/64 → 237/16) ⇝ 421/28 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 207/14 ⇜ (947/64 → 237/16) ⇝ 421/28 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 207/14 ⇜ (947/64 → 237/16) ⇝ 421/28 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 59/4 ⇜ (237/16 → 949/64) ⇝ 119/8 | note:F#4 gain:0.44 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 59/4 ⇜ (237/16 → 949/64) ⇝ 119/8 | note:C#5 gain:0.44 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 59/4 ⇜ (237/16 → 949/64) ⇝ 119/8 | note:E5 gain:0.44 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 207/14 ⇜ (237/16 → 949/64) ⇝ 421/28 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 207/14 ⇜ (237/16 → 949/64) ⇝ 421/28 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 207/14 ⇜ (237/16 → 949/64) ⇝ 421/28 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 207/14 ⇜ (237/16 → 949/64) ⇝ 421/28 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 59/4 ⇜ (949/64 → 475/32) ⇝ 119/8 | note:F#4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 59/4 ⇜ (949/64 → 475/32) ⇝ 119/8 | note:C#5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 59/4 ⇜ (949/64 → 475/32) ⇝ 119/8 | note:E5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 207/14 ⇜ (949/64 → 475/32) ⇝ 421/28 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 207/14 ⇜ (949/64 → 475/32) ⇝ 421/28 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 207/14 ⇜ (949/64 → 475/32) ⇝ 421/28 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 207/14 ⇜ (949/64 → 475/32) ⇝ 421/28 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 59/4 ⇜ (475/32 → 951/64) ⇝ 119/8 | note:F#4 gain:0.24 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 59/4 ⇜ (475/32 → 951/64) ⇝ 119/8 | note:C#5 gain:0.24 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 59/4 ⇜ (475/32 → 951/64) ⇝ 119/8 | note:E5 gain:0.24 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 207/14 ⇜ (475/32 → 951/64) ⇝ 421/28 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 207/14 ⇜ (475/32 → 951/64) ⇝ 421/28 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 207/14 ⇜ (475/32 → 951/64) ⇝ 421/28 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 207/14 ⇜ (475/32 → 951/64) ⇝ 421/28 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 59/4 ⇜ (951/64 → 119/8) | note:F#4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 59/4 ⇜ (951/64 → 119/8) | note:C#5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 59/4 ⇜ (951/64 → 119/8) | note:E5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 207/14 ⇜ (951/64 → 119/8) ⇝ 421/28 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 207/14 ⇜ (951/64 → 119/8) ⇝ 421/28 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 207/14 ⇜ (951/64 → 119/8) ⇝ 421/28 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 207/14 ⇜ (951/64 → 119/8) ⇝ 421/28 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 207/14 ⇜ (119/8 → 953/64) ⇝ 421/28 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 207/14 ⇜ (119/8 → 953/64) ⇝ 421/28 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 207/14 ⇜ (119/8 → 953/64) ⇝ 421/28 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 207/14 ⇜ (119/8 → 953/64) ⇝ 421/28 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 207/14 ⇜ (953/64 → 477/32) ⇝ 421/28 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 207/14 ⇜ (953/64 → 477/32) ⇝ 421/28 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 207/14 ⇜ (953/64 → 477/32) ⇝ 421/28 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 207/14 ⇜ (953/64 → 477/32) ⇝ 421/28 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 207/14 ⇜ (477/32 → 955/64) ⇝ 421/28 | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 207/14 ⇜ (477/32 → 955/64) ⇝ 421/28 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 207/14 ⇜ (477/32 → 955/64) ⇝ 421/28 | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 207/14 ⇜ (477/32 → 955/64) ⇝ 421/28 | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 207/14 ⇜ (955/64 → 239/16) ⇝ 421/28 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 207/14 ⇜ (955/64 → 239/16) ⇝ 421/28 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 207/14 ⇜ (955/64 → 239/16) ⇝ 421/28 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 207/14 ⇜ (955/64 → 239/16) ⇝ 421/28 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 207/14 ⇜ (239/16 → 957/64) ⇝ 421/28 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 207/14 ⇜ (239/16 → 957/64) ⇝ 421/28 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 207/14 ⇜ (239/16 → 957/64) ⇝ 421/28 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 207/14 ⇜ (239/16 → 957/64) ⇝ 421/28 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 207/14 ⇜ (957/64 → 479/32) ⇝ 421/28 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 207/14 ⇜ (957/64 → 479/32) ⇝ 421/28 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 207/14 ⇜ (957/64 → 479/32) ⇝ 421/28 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 207/14 ⇜ (957/64 → 479/32) ⇝ 421/28 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 207/14 ⇜ (479/32 → 959/64) ⇝ 421/28 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 207/14 ⇜ (479/32 → 959/64) ⇝ 421/28 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 207/14 ⇜ (479/32 → 959/64) ⇝ 421/28 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 207/14 ⇜ (479/32 → 959/64) ⇝ 421/28 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 207/14 ⇜ (959/64 → 15/1) ⇝ 421/28 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 207/14 ⇜ (959/64 → 15/1) ⇝ 421/28 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 207/14 ⇜ (959/64 → 15/1) ⇝ 421/28 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 207/14 ⇜ (959/64 → 15/1) ⇝ 421/28 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 207/14 ⇜ (15/1 → 961/64) ⇝ 421/28 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 207/14 ⇜ (15/1 → 961/64) ⇝ 421/28 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 207/14 ⇜ (15/1 → 961/64) ⇝ 421/28 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 207/14 ⇜ (15/1 → 961/64) ⇝ 421/28 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ (15/1 → 961/64) ⇝ 61/4 | note:F#2 gain:0.44 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 207/14 ⇜ (961/64 → 481/32) ⇝ 421/28 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 207/14 ⇜ (961/64 → 481/32) ⇝ 421/28 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 207/14 ⇜ (961/64 → 481/32) ⇝ 421/28 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 207/14 ⇜ (961/64 → 481/32) ⇝ 421/28 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 15/1 ⇜ (961/64 → 481/32) ⇝ 61/4 | note:F#2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 207/14 ⇜ (481/32 → 421/28) | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 207/14 ⇜ (481/32 → 421/28) | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 207/14 ⇜ (481/32 → 421/28) | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 207/14 ⇜ (481/32 → 421/28) | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 15/1 ⇜ (481/32 → 963/64) ⇝ 61/4 | note:F#2 gain:0.64 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 15/1 ⇜ (963/64 → 241/16) ⇝ 61/4 | note:F#2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 15/1 ⇜ (241/16 → 965/64) ⇝ 61/4 | note:F#2 gain:0.44 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 15/1 ⇜ (965/64 → 483/32) ⇝ 61/4 | note:F#2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 15/1 ⇜ (483/32 → 967/64) ⇝ 61/4 | note:F#2 gain:0.24 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 15/1 ⇜ (967/64 → 121/8) ⇝ 61/4 | note:F#2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 15/1 ⇜ (121/8 → 969/64) ⇝ 61/4 | note:F#2 gain:0.44 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ (121/8 → 969/64) ⇝ 61/4 | note:F#4 gain:0.44 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ (121/8 → 969/64) ⇝ 61/4 | note:C#5 gain:0.44 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ (121/8 → 969/64) ⇝ 61/4 | note:E5 gain:0.44 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 15/1 ⇜ (969/64 → 485/32) ⇝ 61/4 | note:F#2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 121/8 ⇜ (969/64 → 485/32) ⇝ 61/4 | note:F#4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 121/8 ⇜ (969/64 → 485/32) ⇝ 61/4 | note:C#5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 121/8 ⇜ (969/64 → 485/32) ⇝ 61/4 | note:E5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 15/1 ⇜ (485/32 → 971/64) ⇝ 61/4 | note:F#2 gain:0.64 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 121/8 ⇜ (485/32 → 971/64) ⇝ 61/4 | note:F#4 gain:0.64 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 121/8 ⇜ (485/32 → 971/64) ⇝ 61/4 | note:C#5 gain:0.64 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 121/8 ⇜ (485/32 → 971/64) ⇝ 61/4 | note:E5 gain:0.64 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 15/1 ⇜ (971/64 → 243/16) ⇝ 61/4 | note:F#2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 121/8 ⇜ (971/64 → 243/16) ⇝ 61/4 | note:F#4 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 121/8 ⇜ (971/64 → 243/16) ⇝ 61/4 | note:C#5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 121/8 ⇜ (971/64 → 243/16) ⇝ 61/4 | note:E5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 15/1 ⇜ (243/16 → 973/64) ⇝ 61/4 | note:F#2 gain:0.44 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 121/8 ⇜ (243/16 → 973/64) ⇝ 61/4 | note:F#4 gain:0.44 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 121/8 ⇜ (243/16 → 973/64) ⇝ 61/4 | note:C#5 gain:0.44 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 121/8 ⇜ (243/16 → 973/64) ⇝ 61/4 | note:E5 gain:0.44 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 15/1 ⇜ (973/64 → 487/32) ⇝ 61/4 | note:F#2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 121/8 ⇜ (973/64 → 487/32) ⇝ 61/4 | note:F#4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 121/8 ⇜ (973/64 → 487/32) ⇝ 61/4 | note:C#5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 121/8 ⇜ (973/64 → 487/32) ⇝ 61/4 | note:E5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 15/1 ⇜ (487/32 → 975/64) ⇝ 61/4 | note:F#2 gain:0.24 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 121/8 ⇜ (487/32 → 975/64) ⇝ 61/4 | note:F#4 gain:0.24 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 121/8 ⇜ (487/32 → 975/64) ⇝ 61/4 | note:C#5 gain:0.24 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 121/8 ⇜ (487/32 → 975/64) ⇝ 61/4 | note:E5 gain:0.24 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 15/1 ⇜ (975/64 → 61/4) | note:F#2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 121/8 ⇜ (975/64 → 61/4) | note:F#4 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.555555555556 ]", + "[ 121/8 ⇜ (975/64 → 61/4) | note:C#5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 121/8 ⇜ (975/64 → 61/4) | note:E5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ (61/4 → 977/64) ⇝ 31/2 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ (61/4 → 977/64) ⇝ 31/2 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ (61/4 → 977/64) ⇝ 31/2 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (61/4 → 977/64) ⇝ 31/2 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 61/4 ⇜ (977/64 → 489/32) ⇝ 31/2 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 61/4 ⇜ (977/64 → 489/32) ⇝ 31/2 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 61/4 ⇜ (977/64 → 489/32) ⇝ 31/2 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 61/4 ⇜ (977/64 → 489/32) ⇝ 31/2 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 61/4 ⇜ (489/32 → 979/64) ⇝ 31/2 | note:Bb3 gain:0.32 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 61/4 ⇜ (489/32 → 979/64) ⇝ 31/2 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 61/4 ⇜ (489/32 → 979/64) ⇝ 31/2 | note:E4 gain:0.32 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 61/4 ⇜ (489/32 → 979/64) ⇝ 31/2 | note:Ab4 gain:0.32 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 61/4 ⇜ (979/64 → 245/16) ⇝ 31/2 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 61/4 ⇜ (979/64 → 245/16) ⇝ 31/2 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 61/4 ⇜ (979/64 → 245/16) ⇝ 31/2 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 61/4 ⇜ (979/64 → 245/16) ⇝ 31/2 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 61/4 ⇜ (245/16 → 981/64) ⇝ 31/2 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 61/4 ⇜ (245/16 → 981/64) ⇝ 31/2 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 61/4 ⇜ (245/16 → 981/64) ⇝ 31/2 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 61/4 ⇜ (245/16 → 981/64) ⇝ 31/2 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 61/4 ⇜ (981/64 → 491/32) ⇝ 31/2 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 61/4 ⇜ (981/64 → 491/32) ⇝ 31/2 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 61/4 ⇜ (981/64 → 491/32) ⇝ 31/2 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 61/4 ⇜ (981/64 → 491/32) ⇝ 31/2 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 61/4 ⇜ (491/32 → 983/64) ⇝ 31/2 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 61/4 ⇜ (491/32 → 983/64) ⇝ 31/2 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 61/4 ⇜ (491/32 → 983/64) ⇝ 31/2 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 61/4 ⇜ (491/32 → 983/64) ⇝ 31/2 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 61/4 ⇜ (983/64 → 123/8) ⇝ 31/2 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 61/4 ⇜ (983/64 → 123/8) ⇝ 31/2 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 61/4 ⇜ (983/64 → 123/8) ⇝ 31/2 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 61/4 ⇜ (983/64 → 123/8) ⇝ 31/2 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 61/4 ⇜ (123/8 → 985/64) ⇝ 31/2 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 61/4 ⇜ (123/8 → 985/64) ⇝ 31/2 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 61/4 ⇜ (123/8 → 985/64) ⇝ 31/2 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 61/4 ⇜ (123/8 → 985/64) ⇝ 31/2 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 61/4 ⇜ (985/64 → 493/32) ⇝ 31/2 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 61/4 ⇜ (985/64 → 493/32) ⇝ 31/2 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 61/4 ⇜ (985/64 → 493/32) ⇝ 31/2 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 61/4 ⇜ (985/64 → 493/32) ⇝ 31/2 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 61/4 ⇜ (493/32 → 987/64) ⇝ 31/2 | note:Bb3 gain:0.32 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 61/4 ⇜ (493/32 → 987/64) ⇝ 31/2 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 61/4 ⇜ (493/32 → 987/64) ⇝ 31/2 | note:E4 gain:0.32 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 61/4 ⇜ (493/32 → 987/64) ⇝ 31/2 | note:Ab4 gain:0.32 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 61/4 ⇜ (987/64 → 247/16) ⇝ 31/2 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 61/4 ⇜ (987/64 → 247/16) ⇝ 31/2 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 61/4 ⇜ (987/64 → 247/16) ⇝ 31/2 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 61/4 ⇜ (987/64 → 247/16) ⇝ 31/2 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 61/4 ⇜ (247/16 → 989/64) ⇝ 31/2 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 61/4 ⇜ (247/16 → 989/64) ⇝ 31/2 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 61/4 ⇜ (247/16 → 989/64) ⇝ 31/2 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 61/4 ⇜ (247/16 → 989/64) ⇝ 31/2 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 61/4 ⇜ (989/64 → 495/32) ⇝ 31/2 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 61/4 ⇜ (989/64 → 495/32) ⇝ 31/2 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 61/4 ⇜ (989/64 → 495/32) ⇝ 31/2 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 61/4 ⇜ (989/64 → 495/32) ⇝ 31/2 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 61/4 ⇜ (495/32 → 991/64) ⇝ 31/2 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 61/4 ⇜ (495/32 → 991/64) ⇝ 31/2 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 61/4 ⇜ (495/32 → 991/64) ⇝ 31/2 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 61/4 ⇜ (495/32 → 991/64) ⇝ 31/2 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 61/4 ⇜ (991/64 → 31/2) | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 61/4 ⇜ (991/64 → 31/2) | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 61/4 ⇜ (991/64 → 31/2) | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 61/4 ⇜ (991/64 → 31/2) | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ (31/2 → 993/64) ⇝ 125/8 | note:C#5 gain:0.44 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ (31/2 → 993/64) ⇝ 125/8 | note:G#5 gain:0.44 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ (31/2 → 993/64) ⇝ 125/8 | note:B5 gain:0.44 clip:1 s:piano release:0.1 pan:0.634259259259 ]", + "[ (31/2 → 993/64) ⇝ 63/4 | note:F#2 gain:0.44 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 31/2 ⇜ (993/64 → 497/32) ⇝ 125/8 | note:C#5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 31/2 ⇜ (993/64 → 497/32) ⇝ 125/8 | note:G#5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 31/2 ⇜ (993/64 → 497/32) ⇝ 125/8 | note:B5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.634259259259 ]", + "[ 31/2 ⇜ (993/64 → 497/32) ⇝ 63/4 | note:F#2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 31/2 ⇜ (497/32 → 995/64) ⇝ 125/8 | note:C#5 gain:0.64 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 31/2 ⇜ (497/32 → 995/64) ⇝ 125/8 | note:G#5 gain:0.64 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 31/2 ⇜ (497/32 → 995/64) ⇝ 125/8 | note:B5 gain:0.64 clip:1 s:piano release:0.1 pan:0.634259259259 ]", + "[ 31/2 ⇜ (497/32 → 995/64) ⇝ 63/4 | note:F#2 gain:0.64 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ (435/28 → 995/64) ⇝ 221/14 | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ (435/28 → 995/64) ⇝ 221/14 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ (435/28 → 995/64) ⇝ 221/14 | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ (435/28 → 995/64) ⇝ 221/14 | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 31/2 ⇜ (995/64 → 249/16) ⇝ 125/8 | note:C#5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 31/2 ⇜ (995/64 → 249/16) ⇝ 125/8 | note:G#5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 31/2 ⇜ (995/64 → 249/16) ⇝ 125/8 | note:B5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.634259259259 ]", + "[ 31/2 ⇜ (995/64 → 249/16) ⇝ 63/4 | note:F#2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 435/28 ⇜ (995/64 → 249/16) ⇝ 221/14 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 435/28 ⇜ (995/64 → 249/16) ⇝ 221/14 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 435/28 ⇜ (995/64 → 249/16) ⇝ 221/14 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 435/28 ⇜ (995/64 → 249/16) ⇝ 221/14 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 31/2 ⇜ (249/16 → 997/64) ⇝ 125/8 | note:C#5 gain:0.44 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 31/2 ⇜ (249/16 → 997/64) ⇝ 125/8 | note:G#5 gain:0.44 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 31/2 ⇜ (249/16 → 997/64) ⇝ 125/8 | note:B5 gain:0.44 clip:1 s:piano release:0.1 pan:0.634259259259 ]", + "[ 31/2 ⇜ (249/16 → 997/64) ⇝ 63/4 | note:F#2 gain:0.44 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 435/28 ⇜ (249/16 → 997/64) ⇝ 221/14 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 435/28 ⇜ (249/16 → 997/64) ⇝ 221/14 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 435/28 ⇜ (249/16 → 997/64) ⇝ 221/14 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 435/28 ⇜ (249/16 → 997/64) ⇝ 221/14 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 31/2 ⇜ (997/64 → 499/32) ⇝ 125/8 | note:C#5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 31/2 ⇜ (997/64 → 499/32) ⇝ 125/8 | note:G#5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 31/2 ⇜ (997/64 → 499/32) ⇝ 125/8 | note:B5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.634259259259 ]", + "[ 31/2 ⇜ (997/64 → 499/32) ⇝ 63/4 | note:F#2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 435/28 ⇜ (997/64 → 499/32) ⇝ 221/14 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 435/28 ⇜ (997/64 → 499/32) ⇝ 221/14 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 435/28 ⇜ (997/64 → 499/32) ⇝ 221/14 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 435/28 ⇜ (997/64 → 499/32) ⇝ 221/14 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 31/2 ⇜ (499/32 → 999/64) ⇝ 125/8 | note:C#5 gain:0.24 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 31/2 ⇜ (499/32 → 999/64) ⇝ 125/8 | note:G#5 gain:0.24 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 31/2 ⇜ (499/32 → 999/64) ⇝ 125/8 | note:B5 gain:0.24 clip:1 s:piano release:0.1 pan:0.634259259259 ]", + "[ 31/2 ⇜ (499/32 → 999/64) ⇝ 63/4 | note:F#2 gain:0.24 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 435/28 ⇜ (499/32 → 999/64) ⇝ 221/14 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 435/28 ⇜ (499/32 → 999/64) ⇝ 221/14 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 435/28 ⇜ (499/32 → 999/64) ⇝ 221/14 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 435/28 ⇜ (499/32 → 999/64) ⇝ 221/14 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 31/2 ⇜ (999/64 → 125/8) | note:C#5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 31/2 ⇜ (999/64 → 125/8) | note:G#5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 31/2 ⇜ (999/64 → 125/8) | note:B5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.634259259259 ]", + "[ 31/2 ⇜ (999/64 → 125/8) ⇝ 63/4 | note:F#2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 435/28 ⇜ (999/64 → 125/8) ⇝ 221/14 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 435/28 ⇜ (999/64 → 125/8) ⇝ 221/14 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 435/28 ⇜ (999/64 → 125/8) ⇝ 221/14 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 435/28 ⇜ (999/64 → 125/8) ⇝ 221/14 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 31/2 ⇜ (125/8 → 1001/64) ⇝ 63/4 | note:F#2 gain:0.44 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 435/28 ⇜ (125/8 → 1001/64) ⇝ 221/14 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 435/28 ⇜ (125/8 → 1001/64) ⇝ 221/14 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 435/28 ⇜ (125/8 → 1001/64) ⇝ 221/14 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 435/28 ⇜ (125/8 → 1001/64) ⇝ 221/14 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 31/2 ⇜ (1001/64 → 501/32) ⇝ 63/4 | note:F#2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 435/28 ⇜ (1001/64 → 501/32) ⇝ 221/14 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 435/28 ⇜ (1001/64 → 501/32) ⇝ 221/14 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 435/28 ⇜ (1001/64 → 501/32) ⇝ 221/14 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 435/28 ⇜ (1001/64 → 501/32) ⇝ 221/14 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 31/2 ⇜ (501/32 → 1003/64) ⇝ 63/4 | note:F#2 gain:0.64 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 435/28 ⇜ (501/32 → 1003/64) ⇝ 221/14 | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 435/28 ⇜ (501/32 → 1003/64) ⇝ 221/14 | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 435/28 ⇜ (501/32 → 1003/64) ⇝ 221/14 | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 435/28 ⇜ (501/32 → 1003/64) ⇝ 221/14 | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 31/2 ⇜ (1003/64 → 251/16) ⇝ 63/4 | note:F#2 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 435/28 ⇜ (1003/64 → 251/16) ⇝ 221/14 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 435/28 ⇜ (1003/64 → 251/16) ⇝ 221/14 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 435/28 ⇜ (1003/64 → 251/16) ⇝ 221/14 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 435/28 ⇜ (1003/64 → 251/16) ⇝ 221/14 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 31/2 ⇜ (251/16 → 1005/64) ⇝ 63/4 | note:F#2 gain:0.44 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 435/28 ⇜ (251/16 → 1005/64) ⇝ 221/14 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 435/28 ⇜ (251/16 → 1005/64) ⇝ 221/14 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 435/28 ⇜ (251/16 → 1005/64) ⇝ 221/14 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 435/28 ⇜ (251/16 → 1005/64) ⇝ 221/14 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 31/2 ⇜ (1005/64 → 503/32) ⇝ 63/4 | note:F#2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 435/28 ⇜ (1005/64 → 503/32) ⇝ 221/14 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 435/28 ⇜ (1005/64 → 503/32) ⇝ 221/14 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 435/28 ⇜ (1005/64 → 503/32) ⇝ 221/14 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 435/28 ⇜ (1005/64 → 503/32) ⇝ 221/14 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 31/2 ⇜ (503/32 → 1007/64) ⇝ 63/4 | note:F#2 gain:0.24 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 435/28 ⇜ (503/32 → 1007/64) ⇝ 221/14 | note:70 gain:0.024 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 435/28 ⇜ (503/32 → 1007/64) ⇝ 221/14 | note:75 gain:0.024 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 435/28 ⇜ (503/32 → 1007/64) ⇝ 221/14 | note:76 gain:0.024 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 435/28 ⇜ (503/32 → 1007/64) ⇝ 221/14 | note:80 gain:0.024 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 31/2 ⇜ (1007/64 → 63/4) | note:F#2 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.444444444444 ]", + "[ 435/28 ⇜ (1007/64 → 63/4) ⇝ 221/14 | note:70 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 435/28 ⇜ (1007/64 → 63/4) ⇝ 221/14 | note:75 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 435/28 ⇜ (1007/64 → 63/4) ⇝ 221/14 | note:76 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 435/28 ⇜ (1007/64 → 63/4) ⇝ 221/14 | note:80 gain:0.029857864376 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 435/28 ⇜ (63/4 → 1009/64) ⇝ 221/14 | note:70 gain:0.044 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 435/28 ⇜ (63/4 → 1009/64) ⇝ 221/14 | note:75 gain:0.044 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 435/28 ⇜ (63/4 → 1009/64) ⇝ 221/14 | note:76 gain:0.044 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 435/28 ⇜ (63/4 → 1009/64) ⇝ 221/14 | note:80 gain:0.044 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ (63/4 → 1009/64) ⇝ 127/8 | note:C#5 gain:0.44 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ (63/4 → 1009/64) ⇝ 127/8 | note:G#5 gain:0.44 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ (63/4 → 1009/64) ⇝ 127/8 | note:B5 gain:0.44 clip:1 s:piano release:0.1 pan:0.634259259259 ]", + "[ (63/4 → 1009/64) ⇝ 16/1 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ (63/4 → 1009/64) ⇝ 16/1 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ (63/4 → 1009/64) ⇝ 16/1 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ (63/4 → 1009/64) ⇝ 16/1 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 435/28 ⇜ (1009/64 → 505/32) ⇝ 221/14 | note:70 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 435/28 ⇜ (1009/64 → 505/32) ⇝ 221/14 | note:75 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 435/28 ⇜ (1009/64 → 505/32) ⇝ 221/14 | note:76 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 435/28 ⇜ (1009/64 → 505/32) ⇝ 221/14 | note:80 gain:0.058142135624 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 63/4 ⇜ (1009/64 → 505/32) ⇝ 127/8 | note:C#5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 63/4 ⇜ (1009/64 → 505/32) ⇝ 127/8 | note:G#5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 63/4 ⇜ (1009/64 → 505/32) ⇝ 127/8 | note:B5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.634259259259 ]", + "[ 63/4 ⇜ (1009/64 → 505/32) ⇝ 16/1 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 63/4 ⇜ (1009/64 → 505/32) ⇝ 16/1 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 63/4 ⇜ (1009/64 → 505/32) ⇝ 16/1 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 63/4 ⇜ (1009/64 → 505/32) ⇝ 16/1 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 435/28 ⇜ (505/32 → 221/14) | note:70 gain:0.064 clip:1 s:piano release:0.1 pan:0.574074074074 ]", + "[ 435/28 ⇜ (505/32 → 221/14) | note:75 gain:0.064 clip:1 s:piano release:0.1 pan:0.597222222222 ]", + "[ 435/28 ⇜ (505/32 → 221/14) | note:76 gain:0.064 clip:1 s:piano release:0.1 pan:0.601851851852 ]", + "[ 435/28 ⇜ (505/32 → 221/14) | note:80 gain:0.064 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 63/4 ⇜ (505/32 → 1011/64) ⇝ 127/8 | note:C#5 gain:0.64 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 63/4 ⇜ (505/32 → 1011/64) ⇝ 127/8 | note:G#5 gain:0.64 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 63/4 ⇜ (505/32 → 1011/64) ⇝ 127/8 | note:B5 gain:0.64 clip:1 s:piano release:0.1 pan:0.634259259259 ]", + "[ 63/4 ⇜ (505/32 → 1011/64) ⇝ 16/1 | note:Bb3 gain:0.32 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 63/4 ⇜ (505/32 → 1011/64) ⇝ 16/1 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 63/4 ⇜ (505/32 → 1011/64) ⇝ 16/1 | note:E4 gain:0.32 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 63/4 ⇜ (505/32 → 1011/64) ⇝ 16/1 | note:Ab4 gain:0.32 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 63/4 ⇜ (1011/64 → 253/16) ⇝ 127/8 | note:C#5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 63/4 ⇜ (1011/64 → 253/16) ⇝ 127/8 | note:G#5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 63/4 ⇜ (1011/64 → 253/16) ⇝ 127/8 | note:B5 gain:0.581421356237 clip:1 s:piano release:0.1 pan:0.634259259259 ]", + "[ 63/4 ⇜ (1011/64 → 253/16) ⇝ 16/1 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 63/4 ⇜ (1011/64 → 253/16) ⇝ 16/1 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 63/4 ⇜ (1011/64 → 253/16) ⇝ 16/1 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 63/4 ⇜ (1011/64 → 253/16) ⇝ 16/1 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 63/4 ⇜ (253/16 → 1013/64) ⇝ 127/8 | note:C#5 gain:0.44 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 63/4 ⇜ (253/16 → 1013/64) ⇝ 127/8 | note:G#5 gain:0.44 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 63/4 ⇜ (253/16 → 1013/64) ⇝ 127/8 | note:B5 gain:0.44 clip:1 s:piano release:0.1 pan:0.634259259259 ]", + "[ 63/4 ⇜ (253/16 → 1013/64) ⇝ 16/1 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 63/4 ⇜ (253/16 → 1013/64) ⇝ 16/1 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 63/4 ⇜ (253/16 → 1013/64) ⇝ 16/1 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 63/4 ⇜ (253/16 → 1013/64) ⇝ 16/1 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 63/4 ⇜ (1013/64 → 507/32) ⇝ 127/8 | note:C#5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 63/4 ⇜ (1013/64 → 507/32) ⇝ 127/8 | note:G#5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 63/4 ⇜ (1013/64 → 507/32) ⇝ 127/8 | note:B5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.634259259259 ]", + "[ 63/4 ⇜ (1013/64 → 507/32) ⇝ 16/1 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 63/4 ⇜ (1013/64 → 507/32) ⇝ 16/1 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 63/4 ⇜ (1013/64 → 507/32) ⇝ 16/1 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 63/4 ⇜ (1013/64 → 507/32) ⇝ 16/1 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 63/4 ⇜ (507/32 → 1015/64) ⇝ 127/8 | note:C#5 gain:0.24 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 63/4 ⇜ (507/32 → 1015/64) ⇝ 127/8 | note:G#5 gain:0.24 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 63/4 ⇜ (507/32 → 1015/64) ⇝ 127/8 | note:B5 gain:0.24 clip:1 s:piano release:0.1 pan:0.634259259259 ]", + "[ 63/4 ⇜ (507/32 → 1015/64) ⇝ 16/1 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 63/4 ⇜ (507/32 → 1015/64) ⇝ 16/1 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 63/4 ⇜ (507/32 → 1015/64) ⇝ 16/1 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 63/4 ⇜ (507/32 → 1015/64) ⇝ 16/1 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 63/4 ⇜ (1015/64 → 127/8) | note:C#5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.587962962963 ]", + "[ 63/4 ⇜ (1015/64 → 127/8) | note:G#5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.62037037037 ]", + "[ 63/4 ⇜ (1015/64 → 127/8) | note:B5 gain:0.298578643763 clip:1 s:piano release:0.1 pan:0.634259259259 ]", + "[ 63/4 ⇜ (1015/64 → 127/8) ⇝ 16/1 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 63/4 ⇜ (1015/64 → 127/8) ⇝ 16/1 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 63/4 ⇜ (1015/64 → 127/8) ⇝ 16/1 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 63/4 ⇜ (1015/64 → 127/8) ⇝ 16/1 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 63/4 ⇜ (127/8 → 1017/64) ⇝ 16/1 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 63/4 ⇜ (127/8 → 1017/64) ⇝ 16/1 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 63/4 ⇜ (127/8 → 1017/64) ⇝ 16/1 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 63/4 ⇜ (127/8 → 1017/64) ⇝ 16/1 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 63/4 ⇜ (1017/64 → 509/32) ⇝ 16/1 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 63/4 ⇜ (1017/64 → 509/32) ⇝ 16/1 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 63/4 ⇜ (1017/64 → 509/32) ⇝ 16/1 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 63/4 ⇜ (1017/64 → 509/32) ⇝ 16/1 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 63/4 ⇜ (509/32 → 1019/64) ⇝ 16/1 | note:Bb3 gain:0.32 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 63/4 ⇜ (509/32 → 1019/64) ⇝ 16/1 | note:Eb4 gain:0.32 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 63/4 ⇜ (509/32 → 1019/64) ⇝ 16/1 | note:E4 gain:0.32 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 63/4 ⇜ (509/32 → 1019/64) ⇝ 16/1 | note:Ab4 gain:0.32 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 63/4 ⇜ (1019/64 → 255/16) ⇝ 16/1 | note:Bb3 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 63/4 ⇜ (1019/64 → 255/16) ⇝ 16/1 | note:Eb4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 63/4 ⇜ (1019/64 → 255/16) ⇝ 16/1 | note:E4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 63/4 ⇜ (1019/64 → 255/16) ⇝ 16/1 | note:Ab4 gain:0.290710678119 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 63/4 ⇜ (255/16 → 1021/64) ⇝ 16/1 | note:Bb3 gain:0.22 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 63/4 ⇜ (255/16 → 1021/64) ⇝ 16/1 | note:Eb4 gain:0.22 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 63/4 ⇜ (255/16 → 1021/64) ⇝ 16/1 | note:E4 gain:0.22 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 63/4 ⇜ (255/16 → 1021/64) ⇝ 16/1 | note:Ab4 gain:0.22 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 63/4 ⇜ (1021/64 → 511/32) ⇝ 16/1 | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 63/4 ⇜ (1021/64 → 511/32) ⇝ 16/1 | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 63/4 ⇜ (1021/64 → 511/32) ⇝ 16/1 | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 63/4 ⇜ (1021/64 → 511/32) ⇝ 16/1 | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 63/4 ⇜ (511/32 → 1023/64) ⇝ 16/1 | note:Bb3 gain:0.12 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 63/4 ⇜ (511/32 → 1023/64) ⇝ 16/1 | note:Eb4 gain:0.12 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 63/4 ⇜ (511/32 → 1023/64) ⇝ 16/1 | note:E4 gain:0.12 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 63/4 ⇜ (511/32 → 1023/64) ⇝ 16/1 | note:Ab4 gain:0.12 clip:1 s:piano release:0.1 pan:0.564814814815 ]", + "[ 63/4 ⇜ (1023/64 → 16/1) | note:Bb3 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.518518518519 ]", + "[ 63/4 ⇜ (1023/64 → 16/1) | note:Eb4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.541666666667 ]", + "[ 63/4 ⇜ (1023/64 → 16/1) | note:E4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.546296296296 ]", + "[ 63/4 ⇜ (1023/64 → 16/1) | note:Ab4 gain:0.149289321881 clip:1 s:piano release:0.1 pan:0.564814814815 ]", ] `; exports[`renders tunes > tune: festivalOfFingers3 1`] = ` [ - "[ -1/2 ⇜ (0/1 → 1/6) | gain:0.125015148781768 clip:1 note:D5 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ -1/6 ⇜ (0/1 → 1/6) | clip:1 gain:0.5 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ -1/6 ⇜ (0/1 → 1/6) | clip:1 gain:0.125 note:E6 s:piano release:0.1 pan:0.6574074074074074 ]", - "[ -1/3 ⇜ (0/1 → 1/3) | gain:0.16667274737749818 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 0/1 → 1/3 | clip:1 gain:1 note:E6 s:piano release:0.1 pan:0.6574074074074074 ]", - "[ 0/1 → 1/3 | clip:1 gain:0.25 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ -3/2 ⇜ (0/1 → 1/2) | gain:0.25074164191519466 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037037 ]", - "[ -3/2 ⇜ (0/1 → 1/2) | gain:0.25074164191519466 clip:1 note:F4 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ -3/2 ⇜ (0/1 → 1/2) | gain:0.25074164191519466 clip:1 note:C5 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ -1/2 ⇜ (0/1 → 1/2) | gain:0.250030297563536 clip:1 note:D5 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ -1/2 ⇜ (0/1 → 1/2) | gain:0.125015148781768 clip:1 note:E7 s:piano release:0.1 pan:0.712962962962963 ]", - "[ -1/6 ⇜ (0/1 → 1/2) | gain:0.25000115828778147 clip:1 note:D3 s:piano release:0.1 pan:0.4814814814814815 ]", - "[ 0/1 → 2/3 | gain:0.5 clip:1 note:D2 s:piano release:0.1 pan:0.42592592592592593 ]", - "[ -1/1 ⇜ (0/1 → 1/1) | gain:0.16682060947840208 clip:1 note:D5 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ -1/1 ⇜ (0/1 → 1/1) | gain:0.16682060947840208 clip:1 note:F5 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ -1/1 ⇜ (0/1 → 1/1) | gain:0.16682060947840208 clip:1 note:C6 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ -1/2 ⇜ (0/1 → 1/1) ⇝ 3/2 | gain:0.125015148781768 clip:1 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ -1/2 ⇜ (0/1 → 1/1) ⇝ 3/2 | gain:0.125015148781768 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037037 ]", - "[ -1/2 ⇜ (0/1 → 1/1) ⇝ 3/2 | gain:0.125015148781768 clip:1 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ 0/1 → 1/1 | gain:0.5 clip:1 note:E4 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 0/1 → 1/1 | gain:0.16666666666666666 clip:1 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ (0/1 → 1/1) ⇝ 2/1 | gain:0.5 clip:1 note:D3 s:piano release:0.1 pan:0.4814814814814815 ]", - "[ (0/1 → 1/1) ⇝ 2/1 | gain:0.5 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ (0/1 → 1/1) ⇝ 2/1 | gain:0.5 clip:1 note:C4 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 1/6 → 1/2 | clip:1 gain:0.5 note:E6 s:piano release:0.1 pan:0.6574074074074074 ]", - "[ 1/6 → 1/2 | clip:1 gain:0.125 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 1/6 → 5/6 | gain:0.12500057809125337 clip:1 note:D5 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 1/3 → 2/3 | clip:1 gain:1 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 1/3 → 2/3 | clip:1 gain:0.25 note:E6 s:piano release:0.1 pan:0.6574074074074074 ]", - "[ 1/3 → 1/1 | gain:0.16667273632535057 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 1/2 → 5/6 | clip:1 gain:0.5 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 1/2 → 5/6 | clip:1 gain:0.125 note:E6 s:piano release:0.1 pan:0.6574074074074074 ]", - "[ (1/2 → 1/1) ⇝ 7/6 | gain:0.25003024249544364 clip:1 note:D3 s:piano release:0.1 pan:0.4814814814814815 ]", - "[ (1/2 → 1/1) ⇝ 3/2 | gain:0.25003024249544364 clip:1 note:E5 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ (1/2 → 1/1) ⇝ 3/2 | gain:0.12501512124772182 clip:1 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ (1/2 → 1/1) ⇝ 5/2 | gain:0.25003024249544364 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037037 ]", - "[ (1/2 → 1/1) ⇝ 5/2 | gain:0.25003024249544364 clip:1 note:F4 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ (1/2 → 1/1) ⇝ 5/2 | gain:0.25003024249544364 clip:1 note:C5 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 2/3 → 1/1 | clip:1 gain:1 note:E6 s:piano release:0.1 pan:0.6574074074074074 ]", - "[ 2/3 → 1/1 | clip:1 gain:0.25 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ (2/3 → 1/1) ⇝ 4/3 | gain:0.5001410914263706 clip:1 note:D2 s:piano release:0.1 pan:0.42592592592592593 ]", - "[ (5/6 → 1/1) ⇝ 7/6 | clip:1 gain:0.5 note:E6 s:piano release:0.1 pan:0.6574074074074074 ]", - "[ (5/6 → 1/1) ⇝ 7/6 | clip:1 gain:0.125 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ (5/6 → 1/1) ⇝ 3/2 | gain:0.12506778837733018 clip:1 note:D5 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 1/2 ⇜ (1/1 → 7/6) | gain:0.25003024249544364 clip:1 note:D3 s:piano release:0.1 pan:0.4814814814814815 ]", - "[ 5/6 ⇜ (1/1 → 7/6) | clip:1 gain:0.5 note:E6 s:piano release:0.1 pan:0.6574074074074074 ]", - "[ 5/6 ⇜ (1/1 → 7/6) | clip:1 gain:0.125 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 2/3 ⇜ (1/1 → 4/3) | gain:0.5001410914263706 clip:1 note:D2 s:piano release:0.1 pan:0.42592592592592593 ]", - "[ 1/1 → 4/3 | clip:1 gain:1 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 1/1 → 4/3 | clip:1 gain:0.25 note:E6 s:piano release:0.1 pan:0.6574074074074074 ]", - "[ -1/2 ⇜ (1/1 → 3/2) | gain:0.125015148781768 clip:1 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ -1/2 ⇜ (1/1 → 3/2) | gain:0.125015148781768 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037037 ]", - "[ -1/2 ⇜ (1/1 → 3/2) | gain:0.125015148781768 clip:1 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ 1/2 ⇜ (1/1 → 3/2) | gain:0.25003024249544364 clip:1 note:E5 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 1/2 ⇜ (1/1 → 3/2) | gain:0.12501512124772182 clip:1 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ 5/6 ⇜ (1/1 → 3/2) | gain:0.12506778837733018 clip:1 note:D5 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 1/1 → 5/3 | gain:0.16682032967580462 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 0/1 ⇜ (1/1 → 2/1) | gain:0.5 clip:1 note:D3 s:piano release:0.1 pan:0.4814814814814815 ]", - "[ 0/1 ⇜ (1/1 → 2/1) | gain:0.5 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 0/1 ⇜ (1/1 → 2/1) | gain:0.5 clip:1 note:C4 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 1/2 ⇜ (1/1 → 2/1) ⇝ 5/2 | gain:0.25003024249544364 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 1/2 ⇜ (1/1 → 2/1) ⇝ 5/2 | gain:0.25003024249544364 clip:1 note:F4 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 1/2 ⇜ (1/1 → 2/1) ⇝ 5/2 | gain:0.25003024249544364 clip:1 note:C5 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 1/1 → 2/1 | gain:0.5004609890274139 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 1/1 → 2/1 | gain:0.16682032967580462 clip:1 note:E6 s:piano release:0.1 pan:0.6574074074074074 ]", - "[ (1/1 → 2/1) ⇝ 3/1 | gain:0.16682032967580462 clip:1 note:D5 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ (1/1 → 2/1) ⇝ 3/1 | gain:0.16682032967580462 clip:1 note:F5 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ (1/1 → 2/1) ⇝ 3/1 | gain:0.16682032967580462 clip:1 note:C6 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 7/6 → 3/2 | clip:1 gain:0.5 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 7/6 → 3/2 | clip:1 gain:0.125 note:E6 s:piano release:0.1 pan:0.6574074074074074 ]", - "[ 7/6 → 11/6 | gain:0.250360063340037 clip:1 note:D3 s:piano release:0.1 pan:0.4814814814814815 ]", - "[ 4/3 → 5/3 | clip:1 gain:1 note:E6 s:piano release:0.1 pan:0.6574074074074074 ]", - "[ 4/3 → 5/3 | clip:1 gain:0.25 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 4/3 → 2/1 | gain:0.5010573244293617 clip:1 note:D2 s:piano release:0.1 pan:0.42592592592592593 ]", - "[ 3/2 → 11/6 | clip:1 gain:0.5 note:E6 s:piano release:0.1 pan:0.6574074074074074 ]", - "[ 3/2 → 11/6 | clip:1 gain:0.125 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ (3/2 → 2/1) ⇝ 13/6 | gain:0.12537014696271603 clip:1 note:D5 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ (3/2 → 2/1) ⇝ 5/2 | gain:0.25074029392543207 clip:1 note:D5 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ (3/2 → 2/1) ⇝ 5/2 | gain:0.12537014696271603 clip:1 note:E7 s:piano release:0.1 pan:0.712962962962963 ]", - "[ (3/2 → 2/1) ⇝ 7/2 | gain:0.12537014696271603 clip:1 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ (3/2 → 2/1) ⇝ 7/2 | gain:0.12537014696271603 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037037 ]", - "[ (3/2 → 2/1) ⇝ 7/2 | gain:0.12537014696271603 clip:1 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ 5/3 → 2/1 | clip:1 gain:1 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 5/3 → 2/1 | clip:1 gain:0.25 note:E6 s:piano release:0.1 pan:0.6574074074074074 ]", - "[ (5/3 → 2/1) ⇝ 7/3 | gain:0.16733239616152812 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037037 ]", - "[ (11/6 → 2/1) ⇝ 13/6 | clip:1 gain:0.5 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ (11/6 → 2/1) ⇝ 13/6 | clip:1 gain:0.125 note:E6 s:piano release:0.1 pan:0.6574074074074074 ]", - "[ (11/6 → 2/1) ⇝ 5/2 | gain:0.2513068410929158 clip:1 note:D3 s:piano release:0.1 pan:0.4814814814814815 ]", - "[ 3/2 ⇜ (2/1 → 13/6) | gain:0.12537014696271603 clip:1 note:G5 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 11/6 ⇜ (2/1 → 13/6) | clip:1 gain:0.5 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ 11/6 ⇜ (2/1 → 13/6) | clip:1 gain:0.125 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 5/3 ⇜ (2/1 → 7/3) | gain:0.16733239616152812 clip:1 note:G4 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 2/1 → 7/3 | clip:1 gain:1 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 2/1 → 7/3 | clip:1 gain:0.25 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ 1/2 ⇜ (2/1 → 5/2) | gain:0.25003024249544364 clip:1 note:G4 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 1/2 ⇜ (2/1 → 5/2) | gain:0.25003024249544364 clip:1 note:B4 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 1/2 ⇜ (2/1 → 5/2) | gain:0.25003024249544364 clip:1 note:F5 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 3/2 ⇜ (2/1 → 5/2) | gain:0.25074029392543207 clip:1 note:G5 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 3/2 ⇜ (2/1 → 5/2) | gain:0.12537014696271603 clip:1 note:A7 s:piano release:0.1 pan:0.7361111111111112 ]", - "[ 11/6 ⇜ (2/1 → 5/2) | gain:0.2513068410929158 clip:1 note:G3 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 2/1 → 8/3 | gain:0.5033359274761097 clip:1 note:G2 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 1/1 ⇜ (2/1 → 3/1) | gain:0.16682032967580462 clip:1 note:G5 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 1/1 ⇜ (2/1 → 3/1) | gain:0.16682032967580462 clip:1 note:B5 s:piano release:0.1 pan:0.6342592592592593 ]", - "[ 1/1 ⇜ (2/1 → 3/1) | gain:0.16682032967580462 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037037 ]", - "[ 3/2 ⇜ (2/1 → 3/1) ⇝ 7/2 | gain:0.12537014696271603 clip:1 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 3/2 ⇜ (2/1 → 3/1) ⇝ 7/2 | gain:0.12537014696271603 clip:1 note:B6 s:piano release:0.1 pan:0.6898148148148149 ]", - "[ 3/2 ⇜ (2/1 → 3/1) ⇝ 7/2 | gain:0.12537014696271603 clip:1 note:F7 s:piano release:0.1 pan:0.7175925925925926 ]", - "[ 2/1 → 3/1 | gain:0.5033359274761097 clip:1 note:A4 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 2/1 → 3/1 | gain:0.16777864249203656 clip:1 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ (2/1 → 3/1) ⇝ 4/1 | gain:0.5033359274761097 clip:1 note:G3 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ (2/1 → 3/1) ⇝ 4/1 | gain:0.5033359274761097 clip:1 note:B3 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ (2/1 → 3/1) ⇝ 4/1 | gain:0.5033359274761097 clip:1 note:F4 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 13/6 → 5/2 | clip:1 gain:0.5 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 13/6 → 5/2 | clip:1 gain:0.125 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ 13/6 → 17/6 | gain:0.12604227597350195 clip:1 note:G5 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 7/3 → 8/3 | clip:1 gain:1 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ 7/3 → 8/3 | clip:1 gain:0.25 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 7/3 → 3/1 | gain:0.1683725767820298 clip:1 note:G4 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/2 → 17/6 | clip:1 gain:0.5 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ 5/2 → 17/6 | clip:1 gain:0.125 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ (5/2 → 3/1) ⇝ 19/6 | gain:0.2530928417288911 clip:1 note:G3 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ (5/2 → 3/1) ⇝ 7/2 | gain:0.2530928417288911 clip:1 note:A5 s:piano release:0.1 pan:0.625 ]", - "[ (5/2 → 3/1) ⇝ 7/2 | gain:0.12654642086444556 clip:1 note:G7 s:piano release:0.1 pan:0.7268518518518519 ]", - "[ (5/2 → 3/1) ⇝ 9/2 | gain:0.2530928417288911 clip:1 note:G4 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (5/2 → 3/1) ⇝ 9/2 | gain:0.2530928417288911 clip:1 note:B4 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ (5/2 → 3/1) ⇝ 9/2 | gain:0.2530928417288911 clip:1 note:F5 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 8/3 → 3/1 | clip:1 gain:1 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 8/3 → 3/1 | clip:1 gain:0.25 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ (8/3 → 3/1) ⇝ 10/3 | gain:0.5073762159242674 clip:1 note:G2 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ (17/6 → 3/1) ⇝ 19/6 | clip:1 gain:0.5 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ (17/6 → 3/1) ⇝ 19/6 | clip:1 gain:0.125 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ (17/6 → 3/1) ⇝ 7/2 | gain:0.12717299371534235 clip:1 note:G5 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 5/2 ⇜ (3/1 → 19/6) | gain:0.2530928417288911 clip:1 note:G3 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 17/6 ⇜ (3/1 → 19/6) | clip:1 gain:0.5 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 17/6 ⇜ (3/1 → 19/6) | clip:1 gain:0.125 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ 8/3 ⇜ (3/1 → 10/3) | gain:0.5073762159242674 clip:1 note:G2 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 3/1 → 10/3 | clip:1 gain:1 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ 3/1 → 10/3 | clip:1 gain:0.25 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 3/2 ⇜ (3/1 → 7/2) | gain:0.12537014696271603 clip:1 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 3/2 ⇜ (3/1 → 7/2) | gain:0.12537014696271603 clip:1 note:B6 s:piano release:0.1 pan:0.6898148148148149 ]", - "[ 3/2 ⇜ (3/1 → 7/2) | gain:0.12537014696271603 clip:1 note:F7 s:piano release:0.1 pan:0.7175925925925926 ]", - "[ 5/2 ⇜ (3/1 → 7/2) | gain:0.2530928417288911 clip:1 note:A5 s:piano release:0.1 pan:0.625 ]", - "[ 5/2 ⇜ (3/1 → 7/2) | gain:0.12654642086444556 clip:1 note:G7 s:piano release:0.1 pan:0.7268518518518519 ]", - "[ 17/6 ⇜ (3/1 → 7/2) | gain:0.12717299371534235 clip:1 note:G5 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 3/1 → 11/3 | gain:0.17004500671881523 clip:1 note:G4 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 2/1 ⇜ (3/1 → 4/1) | gain:0.5033359274761097 clip:1 note:G3 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 2/1 ⇜ (3/1 → 4/1) | gain:0.5033359274761097 clip:1 note:B3 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 2/1 ⇜ (3/1 → 4/1) | gain:0.5033359274761097 clip:1 note:F4 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 5/2 ⇜ (3/1 → 4/1) ⇝ 9/2 | gain:0.2530928417288911 clip:1 note:G4 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 5/2 ⇜ (3/1 → 4/1) ⇝ 9/2 | gain:0.2530928417288911 clip:1 note:B4 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 5/2 ⇜ (3/1 → 4/1) ⇝ 9/2 | gain:0.2530928417288911 clip:1 note:F5 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 3/1 → 4/1 | gain:0.5101350201564457 clip:1 note:G4 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 3/1 → 4/1 | gain:0.17004500671881523 clip:1 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ (3/1 → 4/1) ⇝ 5/1 | gain:0.17004500671881523 clip:1 note:G5 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ (3/1 → 4/1) ⇝ 5/1 | gain:0.17004500671881523 clip:1 note:B5 s:piano release:0.1 pan:0.6342592592592593 ]", - "[ (3/1 → 4/1) ⇝ 5/1 | gain:0.17004500671881523 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037037 ]", - "[ 19/6 → 7/2 | clip:1 gain:0.5 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ 19/6 → 7/2 | clip:1 gain:0.125 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 19/6 → 23/6 | gain:0.25585342140963807 clip:1 note:G3 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 10/3 → 11/3 | clip:1 gain:1 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 10/3 → 11/3 | clip:1 gain:0.25 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ 10/3 → 4/1 | gain:0.5134083833329526 clip:1 note:G2 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 7/2 → 23/6 | clip:1 gain:0.5 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 7/2 → 23/6 | clip:1 gain:0.125 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ (7/2 → 4/1) ⇝ 25/6 | gain:0.12881001250119212 clip:1 note:G5 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ (7/2 → 4/1) ⇝ 9/2 | gain:0.25762002500238423 clip:1 note:G5 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ (7/2 → 4/1) ⇝ 9/2 | gain:0.12881001250119212 clip:1 note:A7 s:piano release:0.1 pan:0.7361111111111112 ]", - "[ (7/2 → 4/1) ⇝ 11/2 | gain:0.12881001250119212 clip:1 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ (7/2 → 4/1) ⇝ 11/2 | gain:0.12881001250119212 clip:1 note:B6 s:piano release:0.1 pan:0.6898148148148149 ]", - "[ (7/2 → 4/1) ⇝ 11/2 | gain:0.12881001250119212 clip:1 note:F7 s:piano release:0.1 pan:0.7175925925925926 ]", - "[ 11/3 → 4/1 | clip:1 gain:1 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ 11/3 → 4/1 | clip:1 gain:0.25 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ (11/3 → 4/1) ⇝ 13/3 | gain:0.17240057910570294 clip:1 note:G4 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (23/6 → 4/1) ⇝ 25/6 | clip:1 gain:0.5 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ (23/6 → 4/1) ⇝ 25/6 | clip:1 gain:0.125 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ (23/6 → 4/1) ⇝ 9/2 | gain:0.2596464221391696 clip:1 note:G3 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 7/2 ⇜ (4/1 → 25/6) | gain:0.12881001250119212 clip:1 note:C5 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 23/6 ⇜ (4/1 → 25/6) | clip:1 gain:0.5 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 23/6 ⇜ (4/1 → 25/6) | clip:1 gain:0.125 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ 11/3 ⇜ (4/1 → 13/3) | gain:0.17240057910570294 clip:1 note:C4 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 4/1 → 13/3 | clip:1 gain:1 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ 4/1 → 13/3 | clip:1 gain:0.25 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 5/2 ⇜ (4/1 → 9/2) | gain:0.2530928417288911 clip:1 note:C4 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 5/2 ⇜ (4/1 → 9/2) | gain:0.2530928417288911 clip:1 note:Eb4 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 5/2 ⇜ (4/1 → 9/2) | gain:0.2530928417288911 clip:1 note:Bb4 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 7/2 ⇜ (4/1 → 9/2) | gain:0.25762002500238423 clip:1 note:C5 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 7/2 ⇜ (4/1 → 9/2) | gain:0.12881001250119212 clip:1 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ 23/6 ⇜ (4/1 → 9/2) | gain:0.2596464221391696 clip:1 note:C3 s:piano release:0.1 pan:0.4722222222222222 ]", - "[ 4/1 → 14/3 | gain:0.5215122927736957 clip:1 note:C2 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 3/1 ⇜ (4/1 → 5/1) | gain:0.17004500671881523 clip:1 note:C5 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 3/1 ⇜ (4/1 → 5/1) | gain:0.17004500671881523 clip:1 note:Eb5 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 3/1 ⇜ (4/1 → 5/1) | gain:0.17004500671881523 clip:1 note:Bb5 s:piano release:0.1 pan:0.6296296296296297 ]", - "[ 7/2 ⇜ (4/1 → 5/1) ⇝ 11/2 | gain:0.12881001250119212 clip:1 note:C6 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 7/2 ⇜ (4/1 → 5/1) ⇝ 11/2 | gain:0.12881001250119212 clip:1 note:Eb6 s:piano release:0.1 pan:0.6527777777777778 ]", - "[ 7/2 ⇜ (4/1 → 5/1) ⇝ 11/2 | gain:0.12881001250119212 clip:1 note:Bb6 s:piano release:0.1 pan:0.6851851851851851 ]", - "[ 4/1 → 5/1 | gain:0.5215122927736957 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 4/1 → 5/1 | gain:0.17383743092456522 clip:1 note:C6 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ (4/1 → 5/1) ⇝ 6/1 | gain:0.5215122927736957 clip:1 note:C3 s:piano release:0.1 pan:0.4722222222222222 ]", - "[ (4/1 → 5/1) ⇝ 6/1 | gain:0.5215122927736957 clip:1 note:Eb3 s:piano release:0.1 pan:0.4861111111111111 ]", - "[ (4/1 → 5/1) ⇝ 6/1 | gain:0.5215122927736957 clip:1 note:Bb3 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 25/6 → 9/2 | clip:1 gain:0.5 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ 25/6 → 9/2 | clip:1 gain:0.125 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 25/6 → 29/6 | gain:0.1309646364790436 clip:1 note:C5 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 13/3 → 14/3 | clip:1 gain:1 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 13/3 → 14/3 | clip:1 gain:0.25 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ 13/3 → 5/1 | gain:0.17544320879914047 clip:1 note:C4 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 9/2 → 29/6 | clip:1 gain:0.5 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 9/2 → 29/6 | clip:1 gain:0.125 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ (9/2 → 5/1) ⇝ 31/6 | gain:0.26446156741931076 clip:1 note:C3 s:piano release:0.1 pan:0.4722222222222222 ]", - "[ (9/2 → 5/1) ⇝ 11/2 | gain:0.26446156741931076 clip:1 note:D5 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ (9/2 → 5/1) ⇝ 11/2 | gain:0.13223078370965538 clip:1 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ (9/2 → 5/1) ⇝ 13/2 | gain:0.26446156741931076 clip:1 note:C4 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ (9/2 → 5/1) ⇝ 13/2 | gain:0.26446156741931076 clip:1 note:Eb4 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ (9/2 → 5/1) ⇝ 13/2 | gain:0.26446156741931076 clip:1 note:Bb4 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 14/3 → 5/1 | clip:1 gain:1 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ 14/3 → 5/1 | clip:1 gain:0.25 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ (14/3 → 5/1) ⇝ 16/3 | gain:0.5316362681413888 clip:1 note:C2 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ (29/6 → 5/1) ⇝ 31/6 | clip:1 gain:0.5 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ (29/6 → 5/1) ⇝ 31/6 | clip:1 gain:0.125 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ (29/6 → 5/1) ⇝ 11/2 | gain:0.13361645945966383 clip:1 note:C5 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 9/2 ⇜ (5/1 → 31/6) | gain:0.26446156741931076 clip:1 note:C3 s:piano release:0.1 pan:0.4722222222222222 ]", - "[ 29/6 ⇜ (5/1 → 31/6) | clip:1 gain:0.5 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ 29/6 ⇜ (5/1 → 31/6) | clip:1 gain:0.125 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 14/3 ⇜ (5/1 → 16/3) | gain:0.5316362681413888 clip:1 note:C2 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 5/1 → 16/3 | clip:1 gain:1 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 5/1 → 16/3 | clip:1 gain:0.25 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ 7/2 ⇜ (5/1 → 11/2) | gain:0.12881001250119212 clip:1 note:C6 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 7/2 ⇜ (5/1 → 11/2) | gain:0.12881001250119212 clip:1 note:Eb6 s:piano release:0.1 pan:0.6527777777777778 ]", - "[ 7/2 ⇜ (5/1 → 11/2) | gain:0.12881001250119212 clip:1 note:Bb6 s:piano release:0.1 pan:0.6851851851851851 ]", - "[ 9/2 ⇜ (5/1 → 11/2) | gain:0.26446156741931076 clip:1 note:D5 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 9/2 ⇜ (5/1 → 11/2) | gain:0.13223078370965538 clip:1 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ 29/6 ⇜ (5/1 → 11/2) | gain:0.13361645945966383 clip:1 note:C5 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 5/1 → 17/3 | gain:0.17913609614852058 clip:1 note:C4 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 4/1 ⇜ (5/1 → 6/1) | gain:0.5215122927736957 clip:1 note:C3 s:piano release:0.1 pan:0.4722222222222222 ]", - "[ 4/1 ⇜ (5/1 → 6/1) | gain:0.5215122927736957 clip:1 note:Eb3 s:piano release:0.1 pan:0.4861111111111111 ]", - "[ 4/1 ⇜ (5/1 → 6/1) | gain:0.5215122927736957 clip:1 note:Bb3 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 9/2 ⇜ (5/1 → 6/1) ⇝ 13/2 | gain:0.26446156741931076 clip:1 note:C4 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 9/2 ⇜ (5/1 → 6/1) ⇝ 13/2 | gain:0.26446156741931076 clip:1 note:Eb4 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 9/2 ⇜ (5/1 → 6/1) ⇝ 13/2 | gain:0.26446156741931076 clip:1 note:Bb4 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 5/1 → 6/1 | gain:0.5374082884455618 clip:1 note:C4 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 5/1 → 6/1 | gain:0.17913609614852058 clip:1 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ (5/1 → 6/1) ⇝ 7/1 | gain:0.17913609614852058 clip:1 note:C5 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ (5/1 → 6/1) ⇝ 7/1 | gain:0.17913609614852058 clip:1 note:Eb5 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ (5/1 → 6/1) ⇝ 7/1 | gain:0.17913609614852058 clip:1 note:Bb5 s:piano release:0.1 pan:0.6296296296296297 ]", - "[ 31/6 → 11/2 | clip:1 gain:0.5 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 31/6 → 11/2 | clip:1 gain:0.125 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ 31/6 → 35/6 | gain:0.270229857905173 clip:1 note:C3 s:piano release:0.1 pan:0.4722222222222222 ]", - "[ 16/3 → 17/3 | clip:1 gain:1 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ 16/3 → 17/3 | clip:1 gain:0.25 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 16/3 → 6/1 | gain:0.5436158854652334 clip:1 note:C2 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 11/2 → 35/6 | clip:1 gain:0.5 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ 11/2 → 35/6 | clip:1 gain:0.125 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ (11/2 → 6/1) ⇝ 37/6 | gain:0.1367180627443315 clip:1 note:C5 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ (11/2 → 6/1) ⇝ 13/2 | gain:0.273436125488663 clip:1 note:C5 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ (11/2 → 6/1) ⇝ 13/2 | gain:0.1367180627443315 clip:1 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ (11/2 → 6/1) ⇝ 15/2 | gain:0.1367180627443315 clip:1 note:C6 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ (11/2 → 6/1) ⇝ 15/2 | gain:0.1367180627443315 clip:1 note:Eb6 s:piano release:0.1 pan:0.6527777777777778 ]", - "[ (11/2 → 6/1) ⇝ 15/2 | gain:0.1367180627443315 clip:1 note:Bb6 s:piano release:0.1 pan:0.6851851851851851 ]", - "[ 17/3 → 6/1 | clip:1 gain:1 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 17/3 → 6/1 | clip:1 gain:0.25 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ (17/3 → 6/1) ⇝ 19/3 | gain:0.18340799076649741 clip:1 note:C4 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ (35/6 → 6/1) ⇝ 37/6 | clip:1 gain:0.5 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ (35/6 → 6/1) ⇝ 37/6 | clip:1 gain:0.125 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ (35/6 → 6/1) ⇝ 13/2 | gain:0.2768329670606284 clip:1 note:C3 s:piano release:0.1 pan:0.4722222222222222 ]", - "[ 11/2 ⇜ (6/1 → 37/6) | gain:0.1367180627443315 clip:1 note:F5 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 35/6 ⇜ (6/1 → 37/6) | clip:1 gain:0.5 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ 35/6 ⇜ (6/1 → 37/6) | clip:1 gain:0.125 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 17/3 ⇜ (6/1 → 19/3) | gain:0.18340799076649741 clip:1 note:F4 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 6/1 → 19/3 | clip:1 gain:1 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 6/1 → 19/3 | clip:1 gain:0.25 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ 9/2 ⇜ (6/1 → 13/2) | gain:0.26446156741931076 clip:1 note:F4 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 9/2 ⇜ (6/1 → 13/2) | gain:0.26446156741931076 clip:1 note:A4 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 9/2 ⇜ (6/1 → 13/2) | gain:0.26446156741931076 clip:1 note:Eb5 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 11/2 ⇜ (6/1 → 13/2) | gain:0.273436125488663 clip:1 note:F5 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 11/2 ⇜ (6/1 → 13/2) | gain:0.1367180627443315 clip:1 note:G7 s:piano release:0.1 pan:0.7268518518518519 ]", - "[ 35/6 ⇜ (6/1 → 13/2) | gain:0.2768329670606284 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 6/1 → 20/3 | gain:0.5571927642196897 clip:1 note:F2 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 5/1 ⇜ (6/1 → 7/1) | gain:0.17913609614852058 clip:1 note:F5 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 5/1 ⇜ (6/1 → 7/1) | gain:0.17913609614852058 clip:1 note:A5 s:piano release:0.1 pan:0.625 ]", - "[ 5/1 ⇜ (6/1 → 7/1) | gain:0.17913609614852058 clip:1 note:Eb6 s:piano release:0.1 pan:0.6527777777777778 ]", - "[ 11/2 ⇜ (6/1 → 7/1) ⇝ 15/2 | gain:0.1367180627443315 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037037 ]", - "[ 11/2 ⇜ (6/1 → 7/1) ⇝ 15/2 | gain:0.1367180627443315 clip:1 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 11/2 ⇜ (6/1 → 7/1) ⇝ 15/2 | gain:0.1367180627443315 clip:1 note:Eb7 s:piano release:0.1 pan:0.7083333333333333 ]", - "[ 6/1 → 7/1 | gain:0.5571927642196897 clip:1 note:G4 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 6/1 → 7/1 | gain:0.18573092140656322 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037037 ]", - "[ (6/1 → 7/1) ⇝ 8/1 | gain:0.5571927642196897 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ (6/1 → 7/1) ⇝ 8/1 | gain:0.5571927642196897 clip:1 note:A3 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ (6/1 → 7/1) ⇝ 8/1 | gain:0.5571927642196897 clip:1 note:Eb4 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 37/6 → 13/2 | clip:1 gain:0.5 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 37/6 → 13/2 | clip:1 gain:0.125 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ 37/6 → 41/6 | gain:0.14019971295257413 clip:1 note:F5 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 19/3 → 20/3 | clip:1 gain:1 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ 19/3 → 20/3 | clip:1 gain:0.25 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 19/3 → 7/1 | gain:0.18815945529930245 clip:1 note:F4 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 13/2 → 41/6 | clip:1 gain:0.5 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ 13/2 → 41/6 | clip:1 gain:0.125 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ (13/2 → 7/1) ⇝ 43/6 | gain:0.2841126368137835 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ (13/2 → 7/1) ⇝ 15/2 | gain:0.2841126368137835 clip:1 note:G5 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ (13/2 → 7/1) ⇝ 15/2 | gain:0.14205631840689176 clip:1 note:F7 s:piano release:0.1 pan:0.7175925925925926 ]", - "[ (13/2 → 7/1) ⇝ 17/2 | gain:0.2841126368137835 clip:1 note:F4 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ (13/2 → 7/1) ⇝ 17/2 | gain:0.2841126368137835 clip:1 note:A4 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ (13/2 → 7/1) ⇝ 17/2 | gain:0.2841126368137835 clip:1 note:Eb5 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 20/3 → 7/1 | clip:1 gain:1 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 20/3 → 7/1 | clip:1 gain:0.25 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ (20/3 → 7/1) ⇝ 22/3 | gain:0.5720333586354239 clip:1 note:F2 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ (41/6 → 7/1) ⇝ 43/6 | clip:1 gain:0.5 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ (41/6 → 7/1) ⇝ 43/6 | clip:1 gain:0.125 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ (41/6 → 7/1) ⇝ 15/2 | gain:0.14397405984990516 clip:1 note:F5 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 13/2 ⇜ (7/1 → 43/6) | gain:0.2841126368137835 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 41/6 ⇜ (7/1 → 43/6) | clip:1 gain:0.5 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 41/6 ⇜ (7/1 → 43/6) | clip:1 gain:0.125 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ 20/3 ⇜ (7/1 → 22/3) | gain:0.5720333586354239 clip:1 note:F2 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 7/1 → 22/3 | clip:1 gain:1 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ 7/1 → 22/3 | clip:1 gain:0.25 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 11/2 ⇜ (7/1 → 15/2) | gain:0.1367180627443315 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037037 ]", - "[ 11/2 ⇜ (7/1 → 15/2) | gain:0.1367180627443315 clip:1 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 11/2 ⇜ (7/1 → 15/2) | gain:0.1367180627443315 clip:1 note:Eb7 s:piano release:0.1 pan:0.7083333333333333 ]", - "[ 13/2 ⇜ (7/1 → 15/2) | gain:0.2841126368137835 clip:1 note:G5 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 13/2 ⇜ (7/1 → 15/2) | gain:0.14205631840689176 clip:1 note:F7 s:piano release:0.1 pan:0.7175925925925926 ]", - "[ 41/6 ⇜ (7/1 → 15/2) | gain:0.14397405984990516 clip:1 note:F5 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 7/1 → 23/3 | gain:0.19326912919706085 clip:1 note:F4 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 6/1 ⇜ (7/1 → 8/1) | gain:0.5571927642196897 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 6/1 ⇜ (7/1 → 8/1) | gain:0.5571927642196897 clip:1 note:A3 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 6/1 ⇜ (7/1 → 8/1) | gain:0.5571927642196897 clip:1 note:Eb4 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 13/2 ⇜ (7/1 → 8/1) ⇝ 17/2 | gain:0.2841126368137835 clip:1 note:F4 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 13/2 ⇜ (7/1 → 8/1) ⇝ 17/2 | gain:0.2841126368137835 clip:1 note:A4 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 13/2 ⇜ (7/1 → 8/1) ⇝ 17/2 | gain:0.2841126368137835 clip:1 note:Eb5 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 7/1 → 8/1 | gain:0.5798073875911826 clip:1 note:F4 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 7/1 → 8/1 | gain:0.19326912919706085 clip:1 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ (7/1 → 8/1) ⇝ 9/1 | gain:0.19326912919706085 clip:1 note:F5 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ (7/1 → 8/1) ⇝ 9/1 | gain:0.19326912919706085 clip:1 note:A5 s:piano release:0.1 pan:0.625 ]", - "[ (7/1 → 8/1) ⇝ 9/1 | gain:0.19326912919706085 clip:1 note:Eb6 s:piano release:0.1 pan:0.6527777777777778 ]", - "[ 43/6 → 15/2 | clip:1 gain:0.5 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ 43/6 → 15/2 | clip:1 gain:0.125 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 43/6 → 47/6 | gain:0.29188007321245396 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 22/3 → 23/3 | clip:1 gain:1 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 22/3 → 23/3 | clip:1 gain:0.25 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ 22/3 → 8/1 | gain:0.5877477490102575 clip:1 note:F2 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 15/2 → 47/6 | clip:1 gain:0.5 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 15/2 → 47/6 | clip:1 gain:0.125 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ (15/2 → 8/1) ⇝ 49/6 | gain:0.14794083417556103 clip:1 note:F5 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ (15/2 → 8/1) ⇝ 17/2 | gain:0.29588166835112206 clip:1 note:F5 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ (15/2 → 8/1) ⇝ 17/2 | gain:0.14794083417556103 clip:1 note:G7 s:piano release:0.1 pan:0.7268518518518519 ]", - "[ (15/2 → 8/1) ⇝ 19/2 | gain:0.14794083417556103 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037037 ]", - "[ (15/2 → 8/1) ⇝ 19/2 | gain:0.14794083417556103 clip:1 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ (15/2 → 8/1) ⇝ 19/2 | gain:0.14794083417556103 clip:1 note:Eb7 s:piano release:0.1 pan:0.7083333333333333 ]", - "[ 23/3 → 8/1 | clip:1 gain:1 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ 23/3 → 8/1 | clip:1 gain:0.25 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ (23/3 → 8/1) ⇝ 25/3 | gain:0.19859999248410734 clip:1 note:F4 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ (47/6 → 8/1) ⇝ 49/6 | clip:1 gain:0.5 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ (47/6 → 8/1) ⇝ 49/6 | clip:1 gain:0.125 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ (47/6 → 8/1) ⇝ 17/2 | gain:0.2999253420796384 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 15/2 ⇜ (8/1 → 49/6) | gain:0.14794083417556103 clip:1 note:D5 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 47/6 ⇜ (8/1 → 49/6) | clip:1 gain:0.5 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 47/6 ⇜ (8/1 → 49/6) | clip:1 gain:0.125 note:E6 s:piano release:0.1 pan:0.6574074074074074 ]", - "[ 23/3 ⇜ (8/1 → 25/3) | gain:0.19859999248410734 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 8/1 → 25/3 | clip:1 gain:1 note:E6 s:piano release:0.1 pan:0.6574074074074074 ]", - "[ 8/1 → 25/3 | clip:1 gain:0.25 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 13/2 ⇜ (8/1 → 17/2) | gain:0.2841126368137835 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 13/2 ⇜ (8/1 → 17/2) | gain:0.2841126368137835 clip:1 note:F4 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 13/2 ⇜ (8/1 → 17/2) | gain:0.2841126368137835 clip:1 note:C5 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 15/2 ⇜ (8/1 → 17/2) | gain:0.29588166835112206 clip:1 note:D5 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 15/2 ⇜ (8/1 → 17/2) | gain:0.14794083417556103 clip:1 note:E7 s:piano release:0.1 pan:0.712962962962963 ]", - "[ 47/6 ⇜ (8/1 → 17/2) | gain:0.2999253420796384 clip:1 note:D3 s:piano release:0.1 pan:0.4814814814814815 ]", - "[ 8/1 → 26/3 | gain:0.6039084330201149 clip:1 note:D2 s:piano release:0.1 pan:0.42592592592592593 ]", - "[ 7/1 ⇜ (8/1 → 9/1) | gain:0.19326912919706085 clip:1 note:D5 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 7/1 ⇜ (8/1 → 9/1) | gain:0.19326912919706085 clip:1 note:F5 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 7/1 ⇜ (8/1 → 9/1) | gain:0.19326912919706085 clip:1 note:C6 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 15/2 ⇜ (8/1 → 9/1) ⇝ 19/2 | gain:0.14794083417556103 clip:1 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ 15/2 ⇜ (8/1 → 9/1) ⇝ 19/2 | gain:0.14794083417556103 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037037 ]", - "[ 15/2 ⇜ (8/1 → 9/1) ⇝ 19/2 | gain:0.14794083417556103 clip:1 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ 8/1 → 9/1 | gain:0.6039084330201149 clip:1 note:E4 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 8/1 → 9/1 | gain:0.20130281100670494 clip:1 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ (8/1 → 9/1) ⇝ 10/1 | gain:0.6039084330201149 clip:1 note:D3 s:piano release:0.1 pan:0.4814814814814815 ]", - "[ (8/1 → 9/1) ⇝ 10/1 | gain:0.6039084330201149 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ (8/1 → 9/1) ⇝ 10/1 | gain:0.6039084330201149 clip:1 note:C4 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 49/6 → 17/2 | clip:1 gain:0.5 note:E6 s:piano release:0.1 pan:0.6574074074074074 ]", - "[ 49/6 → 17/2 | clip:1 gain:0.125 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 49/6 → 53/6 | gain:0.15199154547023824 clip:1 note:D5 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 25/3 → 26/3 | clip:1 gain:1 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 25/3 → 26/3 | clip:1 gain:0.25 note:E6 s:piano release:0.1 pan:0.6574074074074074 ]", - "[ 25/3 → 9/1 | gain:0.2040056295293026 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 17/2 → 53/6 | clip:1 gain:0.5 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 17/2 → 53/6 | clip:1 gain:0.125 note:E6 s:piano release:0.1 pan:0.6574074074074074 ]", - "[ (17/2 → 9/1) ⇝ 55/6 | gain:0.3080267646689928 clip:1 note:D3 s:piano release:0.1 pan:0.4814814814814815 ]", - "[ (17/2 → 9/1) ⇝ 19/2 | gain:0.3080267646689928 clip:1 note:E5 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ (17/2 → 9/1) ⇝ 19/2 | gain:0.1540133823344964 clip:1 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ (17/2 → 9/1) ⇝ 21/2 | gain:0.3080267646689928 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037037 ]", - "[ (17/2 → 9/1) ⇝ 21/2 | gain:0.3080267646689928 clip:1 note:F4 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ (17/2 → 9/1) ⇝ 21/2 | gain:0.3080267646689928 clip:1 note:C5 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 26/3 → 9/1 | clip:1 gain:1 note:E6 s:piano release:0.1 pan:0.6574074074074074 ]", - "[ 26/3 → 9/1 | clip:1 gain:0.25 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ (26/3 → 9/1) ⇝ 28/3 | gain:0.6200691170299722 clip:1 note:D2 s:piano release:0.1 pan:0.42592592592592593 ]", - "[ (53/6 → 9/1) ⇝ 55/6 | clip:1 gain:0.5 note:E6 s:piano release:0.1 pan:0.6574074074074074 ]", - "[ (53/6 → 9/1) ⇝ 55/6 | clip:1 gain:0.125 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ (53/6 → 9/1) ⇝ 19/2 | gain:0.15601417990383046 clip:1 note:D5 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 17/2 ⇜ (9/1 → 55/6) | gain:0.3080267646689928 clip:1 note:D3 s:piano release:0.1 pan:0.4814814814814815 ]", - "[ 53/6 ⇜ (9/1 → 55/6) | clip:1 gain:0.5 note:E6 s:piano release:0.1 pan:0.6574074074074074 ]", - "[ 53/6 ⇜ (9/1 → 55/6) | clip:1 gain:0.125 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 26/3 ⇜ (9/1 → 28/3) | gain:0.6200691170299722 clip:1 note:D2 s:piano release:0.1 pan:0.42592592592592593 ]", - "[ 9/1 → 28/3 | clip:1 gain:1 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 9/1 → 28/3 | clip:1 gain:0.25 note:E6 s:piano release:0.1 pan:0.6574074074074074 ]", - "[ 15/2 ⇜ (9/1 → 19/2) | gain:0.14794083417556103 clip:1 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ 15/2 ⇜ (9/1 → 19/2) | gain:0.14794083417556103 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037037 ]", - "[ 15/2 ⇜ (9/1 → 19/2) | gain:0.14794083417556103 clip:1 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ 17/2 ⇜ (9/1 → 19/2) | gain:0.3080267646689928 clip:1 note:E5 s:piano release:0.1 pan:0.6018518518518519 ]", - "[ 17/2 ⇜ (9/1 → 19/2) | gain:0.1540133823344964 clip:1 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ 53/6 ⇜ (9/1 → 19/2) | gain:0.15601417990383046 clip:1 note:D5 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 9/1 → 29/3 | gain:0.20933649281634908 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 8/1 ⇜ (9/1 → 10/1) | gain:0.6039084330201149 clip:1 note:D3 s:piano release:0.1 pan:0.4814814814814815 ]", - "[ 8/1 ⇜ (9/1 → 10/1) | gain:0.6039084330201149 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 8/1 ⇜ (9/1 → 10/1) | gain:0.6039084330201149 clip:1 note:C4 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 17/2 ⇜ (9/1 → 10/1) ⇝ 21/2 | gain:0.3080267646689928 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 17/2 ⇜ (9/1 → 10/1) ⇝ 21/2 | gain:0.3080267646689928 clip:1 note:F4 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 17/2 ⇜ (9/1 → 10/1) ⇝ 21/2 | gain:0.3080267646689928 clip:1 note:C5 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 9/1 → 10/1 | gain:0.6280094784490473 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 9/1 → 10/1 | gain:0.20933649281634908 clip:1 note:E6 s:piano release:0.1 pan:0.6574074074074074 ]", - "[ (9/1 → 10/1) ⇝ 11/1 | gain:0.20933649281634908 clip:1 note:D5 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ (9/1 → 10/1) ⇝ 11/1 | gain:0.20933649281634908 clip:1 note:F5 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ (9/1 → 10/1) ⇝ 11/1 | gain:0.20933649281634908 clip:1 note:C6 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 55/6 → 19/2 | clip:1 gain:0.5 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 55/6 → 19/2 | clip:1 gain:0.125 note:E6 s:piano release:0.1 pan:0.6574074074074074 ]", - "[ 55/6 → 59/6 | gain:0.31596031332030455 clip:1 note:D3 s:piano release:0.1 pan:0.4814814814814815 ]", - "[ 28/3 → 29/3 | clip:1 gain:1 note:E6 s:piano release:0.1 pan:0.6574074074074074 ]", - "[ 28/3 → 29/3 | clip:1 gain:0.25 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 28/3 → 10/1 | gain:0.6357835074048058 clip:1 note:D2 s:piano release:0.1 pan:0.42592592592592593 ]", - "[ 19/2 → 59/6 | clip:1 gain:0.5 note:E6 s:piano release:0.1 pan:0.6574074074074074 ]", - "[ 19/2 → 59/6 | clip:1 gain:0.125 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ (19/2 → 10/1) ⇝ 61/6 | gain:0.1598978981031657 clip:1 note:D5 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ (19/2 → 10/1) ⇝ 21/2 | gain:0.3197957962063314 clip:1 note:D5 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ (19/2 → 10/1) ⇝ 21/2 | gain:0.1598978981031657 clip:1 note:E7 s:piano release:0.1 pan:0.712962962962963 ]", - "[ (19/2 → 10/1) ⇝ 23/2 | gain:0.1598978981031657 clip:1 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ (19/2 → 10/1) ⇝ 23/2 | gain:0.1598978981031657 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037037 ]", - "[ (19/2 → 10/1) ⇝ 23/2 | gain:0.1598978981031657 clip:1 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ 29/3 → 10/1 | clip:1 gain:1 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 29/3 → 10/1 | clip:1 gain:0.25 note:E6 s:piano release:0.1 pan:0.6574074074074074 ]", - "[ (29/3 → 10/1) ⇝ 31/3 | gain:0.21444616671410743 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037037 ]", - "[ (59/6 → 10/1) ⇝ 61/6 | clip:1 gain:0.5 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ (59/6 → 10/1) ⇝ 61/6 | clip:1 gain:0.125 note:E6 s:piano release:0.1 pan:0.6574074074074074 ]", - "[ (59/6 → 10/1) ⇝ 21/2 | gain:0.32350900711496666 clip:1 note:D3 s:piano release:0.1 pan:0.4814814814814815 ]", - "[ 19/2 ⇜ (10/1 → 61/6) | gain:0.1598978981031657 clip:1 note:G5 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 59/6 ⇜ (10/1 → 61/6) | clip:1 gain:0.5 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ 59/6 ⇜ (10/1 → 61/6) | clip:1 gain:0.125 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 29/3 ⇜ (10/1 → 31/3) | gain:0.21444616671410743 clip:1 note:G4 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 10/1 → 31/3 | clip:1 gain:1 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 10/1 → 31/3 | clip:1 gain:0.25 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ 17/2 ⇜ (10/1 → 21/2) | gain:0.3080267646689928 clip:1 note:G4 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 17/2 ⇜ (10/1 → 21/2) | gain:0.3080267646689928 clip:1 note:B4 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 17/2 ⇜ (10/1 → 21/2) | gain:0.3080267646689928 clip:1 note:F5 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 19/2 ⇜ (10/1 → 21/2) | gain:0.3197957962063314 clip:1 note:G5 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 19/2 ⇜ (10/1 → 21/2) | gain:0.1598978981031657 clip:1 note:A7 s:piano release:0.1 pan:0.7361111111111112 ]", - "[ 59/6 ⇜ (10/1 → 21/2) | gain:0.32350900711496666 clip:1 note:G3 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 10/1 → 32/3 | gain:0.6506241018205401 clip:1 note:G2 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 9/1 ⇜ (10/1 → 11/1) | gain:0.20933649281634908 clip:1 note:G5 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 9/1 ⇜ (10/1 → 11/1) | gain:0.20933649281634908 clip:1 note:B5 s:piano release:0.1 pan:0.6342592592592593 ]", - "[ 9/1 ⇜ (10/1 → 11/1) | gain:0.20933649281634908 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037037 ]", - "[ 19/2 ⇜ (10/1 → 11/1) ⇝ 23/2 | gain:0.1598978981031657 clip:1 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 19/2 ⇜ (10/1 → 11/1) ⇝ 23/2 | gain:0.1598978981031657 clip:1 note:B6 s:piano release:0.1 pan:0.6898148148148149 ]", - "[ 19/2 ⇜ (10/1 → 11/1) ⇝ 23/2 | gain:0.1598978981031657 clip:1 note:F7 s:piano release:0.1 pan:0.7175925925925926 ]", - "[ 10/1 → 11/1 | gain:0.6506241018205401 clip:1 note:A4 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 10/1 → 11/1 | gain:0.2168747006068467 clip:1 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ (10/1 → 11/1) ⇝ 12/1 | gain:0.6506241018205401 clip:1 note:G3 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ (10/1 → 11/1) ⇝ 12/1 | gain:0.6506241018205401 clip:1 note:B3 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ (10/1 → 11/1) ⇝ 12/1 | gain:0.6506241018205401 clip:1 note:F4 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 61/6 → 21/2 | clip:1 gain:0.5 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 61/6 → 21/2 | clip:1 gain:0.125 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ 61/6 → 65/6 | gain:0.16353773297974325 clip:1 note:G5 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 31/3 → 32/3 | clip:1 gain:1 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ 31/3 → 32/3 | clip:1 gain:0.25 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 31/3 → 11/1 | gain:0.21919763124691255 clip:1 note:G4 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 21/2 → 65/6 | clip:1 gain:0.5 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ 21/2 → 65/6 | clip:1 gain:0.125 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ (21/2 → 11/1) ⇝ 67/6 | gain:0.3304723075314519 clip:1 note:G3 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ (21/2 → 11/1) ⇝ 23/2 | gain:0.3304723075314519 clip:1 note:A5 s:piano release:0.1 pan:0.625 ]", - "[ (21/2 → 11/1) ⇝ 23/2 | gain:0.16523615376572595 clip:1 note:G7 s:piano release:0.1 pan:0.7268518518518519 ]", - "[ (21/2 → 11/1) ⇝ 25/2 | gain:0.3304723075314519 clip:1 note:G4 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (21/2 → 11/1) ⇝ 25/2 | gain:0.3304723075314519 clip:1 note:B4 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ (21/2 → 11/1) ⇝ 25/2 | gain:0.3304723075314519 clip:1 note:F5 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 32/3 → 11/1 | clip:1 gain:1 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 32/3 → 11/1 | clip:1 gain:0.25 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ (32/3 → 11/1) ⇝ 34/3 | gain:0.6642009805749963 clip:1 note:G2 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ (65/6 → 11/1) ⇝ 67/6 | clip:1 gain:0.5 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ (65/6 → 11/1) ⇝ 67/6 | clip:1 gain:0.125 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ (65/6 → 11/1) ⇝ 23/2 | gain:0.16683928755747093 clip:1 note:G5 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 21/2 ⇜ (11/1 → 67/6) | gain:0.3304723075314519 clip:1 note:G3 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 65/6 ⇜ (11/1 → 67/6) | clip:1 gain:0.5 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 65/6 ⇜ (11/1 → 67/6) | clip:1 gain:0.125 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ 32/3 ⇜ (11/1 → 34/3) | gain:0.6642009805749963 clip:1 note:G2 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 11/1 → 34/3 | clip:1 gain:1 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ 11/1 → 34/3 | clip:1 gain:0.25 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 19/2 ⇜ (11/1 → 23/2) | gain:0.1598978981031657 clip:1 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 19/2 ⇜ (11/1 → 23/2) | gain:0.1598978981031657 clip:1 note:B6 s:piano release:0.1 pan:0.6898148148148149 ]", - "[ 19/2 ⇜ (11/1 → 23/2) | gain:0.1598978981031657 clip:1 note:F7 s:piano release:0.1 pan:0.7175925925925926 ]", - "[ 21/2 ⇜ (11/1 → 23/2) | gain:0.3304723075314519 clip:1 note:A5 s:piano release:0.1 pan:0.625 ]", - "[ 21/2 ⇜ (11/1 → 23/2) | gain:0.16523615376572595 clip:1 note:G7 s:piano release:0.1 pan:0.7268518518518519 ]", - "[ 65/6 ⇜ (11/1 → 23/2) | gain:0.16683928755747093 clip:1 note:G5 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 11/1 → 35/3 | gain:0.22346952586488933 clip:1 note:G4 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 10/1 ⇜ (11/1 → 12/1) | gain:0.6506241018205401 clip:1 note:G3 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 10/1 ⇜ (11/1 → 12/1) | gain:0.6506241018205401 clip:1 note:B3 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 10/1 ⇜ (11/1 → 12/1) | gain:0.6506241018205401 clip:1 note:F4 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 21/2 ⇜ (11/1 → 12/1) ⇝ 25/2 | gain:0.3304723075314519 clip:1 note:G4 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 21/2 ⇜ (11/1 → 12/1) ⇝ 25/2 | gain:0.3304723075314519 clip:1 note:B4 s:piano release:0.1 pan:0.5787037037037037 ]", - "[ 21/2 ⇜ (11/1 → 12/1) ⇝ 25/2 | gain:0.3304723075314519 clip:1 note:F5 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 11/1 → 12/1 | gain:0.670408577594668 clip:1 note:G4 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 11/1 → 12/1 | gain:0.22346952586488933 clip:1 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ (11/1 → 12/1) ⇝ 13/1 | gain:0.22346952586488933 clip:1 note:G5 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ (11/1 → 12/1) ⇝ 13/1 | gain:0.22346952586488933 clip:1 note:B5 s:piano release:0.1 pan:0.6342592592592593 ]", - "[ (11/1 → 12/1) ⇝ 13/1 | gain:0.22346952586488933 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037037 ]", - "[ 67/6 → 23/2 | clip:1 gain:0.5 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ 67/6 → 23/2 | clip:1 gain:0.125 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 67/6 → 71/6 | gain:0.3366755141007872 clip:1 note:G3 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 34/3 → 35/3 | clip:1 gain:1 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 34/3 → 35/3 | clip:1 gain:0.25 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ 34/3 → 12/1 | gain:0.6761805978988411 clip:1 note:G2 s:piano release:0.1 pan:0.44907407407407407 ]", - "[ 23/2 → 71/6 | clip:1 gain:0.5 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 23/2 → 71/6 | clip:1 gain:0.125 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ (23/2 → 12/1) ⇝ 73/6 | gain:0.16972343280040209 clip:1 note:G5 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ (23/2 → 12/1) ⇝ 25/2 | gain:0.33944686560080417 clip:1 note:G5 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ (23/2 → 12/1) ⇝ 25/2 | gain:0.16972343280040209 clip:1 note:A7 s:piano release:0.1 pan:0.7361111111111112 ]", - "[ (23/2 → 12/1) ⇝ 27/2 | gain:0.16972343280040209 clip:1 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ (23/2 → 12/1) ⇝ 27/2 | gain:0.16972343280040209 clip:1 note:B6 s:piano release:0.1 pan:0.6898148148148149 ]", - "[ (23/2 → 12/1) ⇝ 27/2 | gain:0.16972343280040209 clip:1 note:F7 s:piano release:0.1 pan:0.7175925925925926 ]", - "[ 35/3 → 12/1 | clip:1 gain:1 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ 35/3 → 12/1 | clip:1 gain:0.25 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ (35/3 → 12/1) ⇝ 37/3 | gain:0.22716241321426947 clip:1 note:G4 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ (71/6 → 12/1) ⇝ 73/6 | clip:1 gain:0.5 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ (71/6 → 12/1) ⇝ 73/6 | clip:1 gain:0.125 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ (71/6 → 12/1) ⇝ 25/2 | gain:0.34197916006202767 clip:1 note:G3 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 23/2 ⇜ (12/1 → 73/6) | gain:0.16972343280040209 clip:1 note:C5 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 71/6 ⇜ (12/1 → 73/6) | clip:1 gain:0.5 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 71/6 ⇜ (12/1 → 73/6) | clip:1 gain:0.125 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ 35/3 ⇜ (12/1 → 37/3) | gain:0.22716241321426947 clip:1 note:C4 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 12/1 → 37/3 | clip:1 gain:1 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ 12/1 → 37/3 | clip:1 gain:0.25 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 21/2 ⇜ (12/1 → 25/2) | gain:0.3304723075314519 clip:1 note:C4 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 21/2 ⇜ (12/1 → 25/2) | gain:0.3304723075314519 clip:1 note:Eb4 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 21/2 ⇜ (12/1 → 25/2) | gain:0.3304723075314519 clip:1 note:Bb4 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 23/2 ⇜ (12/1 → 25/2) | gain:0.33944686560080417 clip:1 note:C5 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 23/2 ⇜ (12/1 → 25/2) | gain:0.16972343280040209 clip:1 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ 71/6 ⇜ (12/1 → 25/2) | gain:0.34197916006202767 clip:1 note:C3 s:piano release:0.1 pan:0.4722222222222222 ]", - "[ 12/1 → 38/3 | gain:0.6863045732665342 clip:1 note:C2 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 11/1 ⇜ (12/1 → 13/1) | gain:0.22346952586488933 clip:1 note:C5 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 11/1 ⇜ (12/1 → 13/1) | gain:0.22346952586488933 clip:1 note:Eb5 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 11/1 ⇜ (12/1 → 13/1) | gain:0.22346952586488933 clip:1 note:Bb5 s:piano release:0.1 pan:0.6296296296296297 ]", - "[ 23/2 ⇜ (12/1 → 13/1) ⇝ 27/2 | gain:0.16972343280040209 clip:1 note:C6 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 23/2 ⇜ (12/1 → 13/1) ⇝ 27/2 | gain:0.16972343280040209 clip:1 note:Eb6 s:piano release:0.1 pan:0.6527777777777778 ]", - "[ 23/2 ⇜ (12/1 → 13/1) ⇝ 27/2 | gain:0.16972343280040209 clip:1 note:Bb6 s:piano release:0.1 pan:0.6851851851851851 ]", - "[ 12/1 → 13/1 | gain:0.6863045732665342 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 12/1 → 13/1 | gain:0.22876819108884472 clip:1 note:C6 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ (12/1 → 13/1) ⇝ 14/1 | gain:0.6863045732665342 clip:1 note:C3 s:piano release:0.1 pan:0.4722222222222222 ]", - "[ (12/1 → 13/1) ⇝ 14/1 | gain:0.6863045732665342 clip:1 note:Eb3 s:piano release:0.1 pan:0.4861111111111111 ]", - "[ (12/1 → 13/1) ⇝ 14/1 | gain:0.6863045732665342 clip:1 note:Bb3 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 73/6 → 25/2 | clip:1 gain:0.5 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ 73/6 → 25/2 | clip:1 gain:0.125 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 73/6 → 77/6 | gain:0.17213100544047263 clip:1 note:C5 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 37/3 → 38/3 | clip:1 gain:1 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 37/3 → 38/3 | clip:1 gain:0.25 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ 37/3 → 13/1 | gain:0.230205042907707 clip:1 note:C4 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 25/2 → 77/6 | clip:1 gain:0.5 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 25/2 → 77/6 | clip:1 gain:0.125 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ (25/2 → 13/1) ⇝ 79/6 | gain:0.34628840801773064 clip:1 note:C3 s:piano release:0.1 pan:0.4722222222222222 ]", - "[ (25/2 → 13/1) ⇝ 27/2 | gain:0.34628840801773064 clip:1 note:D5 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ (25/2 → 13/1) ⇝ 27/2 | gain:0.17314420400886532 clip:1 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ (25/2 → 13/1) ⇝ 29/2 | gain:0.34628840801773064 clip:1 note:C4 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ (25/2 → 13/1) ⇝ 29/2 | gain:0.34628840801773064 clip:1 note:Eb4 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ (25/2 → 13/1) ⇝ 29/2 | gain:0.34628840801773064 clip:1 note:Bb4 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 38/3 → 13/1 | clip:1 gain:1 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ 38/3 → 13/1 | clip:1 gain:0.25 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ (38/3 → 13/1) ⇝ 40/3 | gain:0.6944084827072773 clip:1 note:C2 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ (77/6 → 13/1) ⇝ 79/6 | clip:1 gain:0.5 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ (77/6 → 13/1) ⇝ 79/6 | clip:1 gain:0.125 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ (77/6 → 13/1) ⇝ 27/2 | gain:0.17402750580523843 clip:1 note:C5 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 25/2 ⇜ (13/1 → 79/6) | gain:0.34628840801773064 clip:1 note:C3 s:piano release:0.1 pan:0.4722222222222222 ]", - "[ 77/6 ⇜ (13/1 → 79/6) | clip:1 gain:0.5 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ 77/6 ⇜ (13/1 → 79/6) | clip:1 gain:0.125 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 38/3 ⇜ (13/1 → 40/3) | gain:0.6944084827072773 clip:1 note:C2 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 13/1 → 40/3 | clip:1 gain:1 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 13/1 → 40/3 | clip:1 gain:0.25 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ 23/2 ⇜ (13/1 → 27/2) | gain:0.16972343280040209 clip:1 note:C6 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ 23/2 ⇜ (13/1 → 27/2) | gain:0.16972343280040209 clip:1 note:Eb6 s:piano release:0.1 pan:0.6527777777777778 ]", - "[ 23/2 ⇜ (13/1 → 27/2) | gain:0.16972343280040209 clip:1 note:Bb6 s:piano release:0.1 pan:0.6851851851851851 ]", - "[ 25/2 ⇜ (13/1 → 27/2) | gain:0.34628840801773064 clip:1 note:D5 s:piano release:0.1 pan:0.5925925925925926 ]", - "[ 25/2 ⇜ (13/1 → 27/2) | gain:0.17314420400886532 clip:1 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ 77/6 ⇜ (13/1 → 27/2) | gain:0.17402750580523843 clip:1 note:C5 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ 13/1 → 41/3 | gain:0.23256061529459465 clip:1 note:C4 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 12/1 ⇜ (13/1 → 14/1) | gain:0.6863045732665342 clip:1 note:C3 s:piano release:0.1 pan:0.4722222222222222 ]", - "[ 12/1 ⇜ (13/1 → 14/1) | gain:0.6863045732665342 clip:1 note:Eb3 s:piano release:0.1 pan:0.4861111111111111 ]", - "[ 12/1 ⇜ (13/1 → 14/1) | gain:0.6863045732665342 clip:1 note:Bb3 s:piano release:0.1 pan:0.5185185185185186 ]", - "[ 25/2 ⇜ (13/1 → 14/1) ⇝ 29/2 | gain:0.34628840801773064 clip:1 note:C4 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 25/2 ⇜ (13/1 → 14/1) ⇝ 29/2 | gain:0.34628840801773064 clip:1 note:Eb4 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 25/2 ⇜ (13/1 → 14/1) ⇝ 29/2 | gain:0.34628840801773064 clip:1 note:Bb4 s:piano release:0.1 pan:0.5740740740740741 ]", - "[ 13/1 → 14/1 | gain:0.697681845883784 clip:1 note:C4 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ 13/1 → 14/1 | gain:0.23256061529459465 clip:1 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ (13/1 → 14/1) ⇝ 15/1 | gain:0.23256061529459465 clip:1 note:C5 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ (13/1 → 14/1) ⇝ 15/1 | gain:0.23256061529459465 clip:1 note:Eb5 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ (13/1 → 14/1) ⇝ 15/1 | gain:0.23256061529459465 clip:1 note:Bb5 s:piano release:0.1 pan:0.6296296296296297 ]", - "[ 79/6 → 27/2 | clip:1 gain:0.5 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 79/6 → 27/2 | clip:1 gain:0.125 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ 79/6 → 83/6 | gain:0.3495624455894302 clip:1 note:C3 s:piano release:0.1 pan:0.4722222222222222 ]", - "[ 40/3 → 41/3 | clip:1 gain:1 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ 40/3 → 41/3 | clip:1 gain:0.25 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 40/3 → 14/1 | gain:0.7004406501159622 clip:1 note:C2 s:piano release:0.1 pan:0.41666666666666663 ]", - "[ 27/2 → 83/6 | clip:1 gain:0.5 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ 27/2 → 83/6 | clip:1 gain:0.125 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ (27/2 → 14/1) ⇝ 85/6 | gain:0.17540779564561187 clip:1 note:C5 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ (27/2 → 14/1) ⇝ 29/2 | gain:0.35081559129122375 clip:1 note:C5 s:piano release:0.1 pan:0.5833333333333333 ]", - "[ (27/2 → 14/1) ⇝ 29/2 | gain:0.17540779564561187 clip:1 note:D7 s:piano release:0.1 pan:0.7037037037037037 ]", - "[ (27/2 → 14/1) ⇝ 31/2 | gain:0.17540779564561187 clip:1 note:C6 s:piano release:0.1 pan:0.6388888888888888 ]", - "[ (27/2 → 14/1) ⇝ 31/2 | gain:0.17540779564561187 clip:1 note:Eb6 s:piano release:0.1 pan:0.6527777777777778 ]", - "[ (27/2 → 14/1) ⇝ 31/2 | gain:0.17540779564561187 clip:1 note:Bb6 s:piano release:0.1 pan:0.6851851851851851 ]", - "[ 41/3 → 14/1 | clip:1 gain:1 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 41/3 → 14/1 | clip:1 gain:0.25 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ (41/3 → 14/1) ⇝ 43/3 | gain:0.23423304523138017 clip:1 note:C4 s:piano release:0.1 pan:0.5277777777777778 ]", - "[ (83/6 → 14/1) ⇝ 85/6 | clip:1 gain:0.5 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ (83/6 → 14/1) ⇝ 85/6 | clip:1 gain:0.125 note:D6 s:piano release:0.1 pan:0.6481481481481481 ]", - "[ (83/6 → 14/1) ⇝ 29/2 | gain:0.3518238810731109 clip:1 note:C3 s:piano release:0.1 pan:0.4722222222222222 ]", - "[ 27/2 ⇜ (14/1 → 85/6) | gain:0.17540779564561187 clip:1 note:F5 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 83/6 ⇜ (14/1 → 85/6) | clip:1 gain:0.5 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ 83/6 ⇜ (14/1 → 85/6) | clip:1 gain:0.125 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 41/3 ⇜ (14/1 → 43/3) | gain:0.23423304523138017 clip:1 note:F4 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 14/1 → 43/3 | clip:1 gain:1 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 14/1 → 43/3 | clip:1 gain:0.25 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ 25/2 ⇜ (14/1 → 29/2) | gain:0.34628840801773064 clip:1 note:F4 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 25/2 ⇜ (14/1 → 29/2) | gain:0.34628840801773064 clip:1 note:A4 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 25/2 ⇜ (14/1 → 29/2) | gain:0.34628840801773064 clip:1 note:Eb5 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 27/2 ⇜ (14/1 → 29/2) | gain:0.35081559129122375 clip:1 note:F5 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 27/2 ⇜ (14/1 → 29/2) | gain:0.17540779564561187 clip:1 note:G7 s:piano release:0.1 pan:0.7268518518518519 ]", - "[ 83/6 ⇜ (14/1 → 29/2) | gain:0.3518238810731109 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 14/1 → 44/3 | gain:0.7044809385641202 clip:1 note:F2 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 13/1 ⇜ (14/1 → 15/1) | gain:0.23256061529459465 clip:1 note:F5 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 13/1 ⇜ (14/1 → 15/1) | gain:0.23256061529459465 clip:1 note:A5 s:piano release:0.1 pan:0.625 ]", - "[ 13/1 ⇜ (14/1 → 15/1) | gain:0.23256061529459465 clip:1 note:Eb6 s:piano release:0.1 pan:0.6527777777777778 ]", - "[ 27/2 ⇜ (14/1 → 15/1) ⇝ 31/2 | gain:0.17540779564561187 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037037 ]", - "[ 27/2 ⇜ (14/1 → 15/1) ⇝ 31/2 | gain:0.17540779564561187 clip:1 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 27/2 ⇜ (14/1 → 15/1) ⇝ 31/2 | gain:0.17540779564561187 clip:1 note:Eb7 s:piano release:0.1 pan:0.7083333333333333 ]", - "[ 14/1 → 15/1 | gain:0.7044809385641202 clip:1 note:G4 s:piano release:0.1 pan:0.5601851851851851 ]", - "[ 14/1 → 15/1 | gain:0.23482697952137338 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037037 ]", - "[ (14/1 → 15/1) ⇝ 16/1 | gain:0.7044809385641202 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ (14/1 → 15/1) ⇝ 16/1 | gain:0.7044809385641202 clip:1 note:A3 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ (14/1 → 15/1) ⇝ 16/1 | gain:0.7044809385641202 clip:1 note:Eb4 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 85/6 → 29/2 | clip:1 gain:0.5 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 85/6 → 29/2 | clip:1 gain:0.125 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ 85/6 → 89/6 | gain:0.17630079596359954 clip:1 note:F5 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 43/3 → 44/3 | clip:1 gain:1 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ 43/3 → 44/3 | clip:1 gain:0.25 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 43/3 → 15/1 | gain:0.23527322585188176 clip:1 note:F4 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 29/2 → 89/6 | clip:1 gain:0.5 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ 29/2 → 89/6 | clip:1 gain:0.125 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ (29/2 → 15/1) ⇝ 91/6 | gain:0.35316813909468286 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ (29/2 → 15/1) ⇝ 31/2 | gain:0.35316813909468286 clip:1 note:G5 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ (29/2 → 15/1) ⇝ 31/2 | gain:0.17658406954734143 clip:1 note:F7 s:piano release:0.1 pan:0.7175925925925926 ]", - "[ (29/2 → 15/1) ⇝ 33/2 | gain:0.35316813909468286 clip:1 note:F4 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ (29/2 → 15/1) ⇝ 33/2 | gain:0.35316813909468286 clip:1 note:A4 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ (29/2 → 15/1) ⇝ 33/2 | gain:0.35316813909468286 clip:1 note:Eb5 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 44/3 → 15/1 | clip:1 gain:1 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 44/3 → 15/1 | clip:1 gain:0.25 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ (44/3 → 15/1) ⇝ 46/3 | gain:0.7067595416108681 clip:1 note:F2 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ (89/6 → 15/1) ⇝ 91/6 | clip:1 gain:0.5 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ (89/6 → 15/1) ⇝ 91/6 | clip:1 gain:0.125 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ (89/6 → 15/1) ⇝ 31/2 | gain:0.17677418484003904 clip:1 note:F5 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 29/2 ⇜ (15/1 → 91/6) | gain:0.35316813909468286 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 89/6 ⇜ (15/1 → 91/6) | clip:1 gain:0.5 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 89/6 ⇜ (15/1 → 91/6) | clip:1 gain:0.125 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ 44/3 ⇜ (15/1 → 46/3) | gain:0.7067595416108681 clip:1 note:F2 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 15/1 → 46/3 | clip:1 gain:1 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ 15/1 → 46/3 | clip:1 gain:0.25 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 27/2 ⇜ (15/1 → 31/2) | gain:0.17540779564561187 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037037 ]", - "[ 27/2 ⇜ (15/1 → 31/2) | gain:0.17540779564561187 clip:1 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ 27/2 ⇜ (15/1 → 31/2) | gain:0.17540779564561187 clip:1 note:Eb7 s:piano release:0.1 pan:0.7083333333333333 ]", - "[ 29/2 ⇜ (15/1 → 31/2) | gain:0.35316813909468286 clip:1 note:G5 s:piano release:0.1 pan:0.6157407407407407 ]", - "[ 29/2 ⇜ (15/1 → 31/2) | gain:0.17658406954734143 clip:1 note:F7 s:piano release:0.1 pan:0.7175925925925926 ]", - "[ 89/6 ⇜ (15/1 → 31/2) | gain:0.17677418484003904 clip:1 note:F5 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ 15/1 → 47/3 | gain:0.23578529233760528 clip:1 note:F4 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 14/1 ⇜ (15/1 → 16/1) | gain:0.7044809385641202 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 14/1 ⇜ (15/1 → 16/1) | gain:0.7044809385641202 clip:1 note:A3 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 14/1 ⇜ (15/1 → 16/1) | gain:0.7044809385641202 clip:1 note:Eb4 s:piano release:0.1 pan:0.5416666666666667 ]", - "[ 29/2 ⇜ (15/1 → 16/1) ⇝ 33/2 | gain:0.35316813909468286 clip:1 note:F4 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 29/2 ⇜ (15/1 → 16/1) ⇝ 33/2 | gain:0.35316813909468286 clip:1 note:A4 s:piano release:0.1 pan:0.5694444444444444 ]", - "[ 29/2 ⇜ (15/1 → 16/1) ⇝ 33/2 | gain:0.35316813909468286 clip:1 note:Eb5 s:piano release:0.1 pan:0.5972222222222222 ]", - "[ 15/1 → 16/1 | gain:0.7073558770128159 clip:1 note:F4 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ 15/1 → 16/1 | gain:0.23578529233760528 clip:1 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ (15/1 → 16/1) ⇝ 17/1 | gain:0.23578529233760528 clip:1 note:F5 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ (15/1 → 16/1) ⇝ 17/1 | gain:0.23578529233760528 clip:1 note:A5 s:piano release:0.1 pan:0.625 ]", - "[ (15/1 → 16/1) ⇝ 17/1 | gain:0.23578529233760528 clip:1 note:Eb6 s:piano release:0.1 pan:0.6527777777777778 ]", - "[ 91/6 → 31/2 | clip:1 gain:0.5 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ 91/6 → 31/2 | clip:1 gain:0.125 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 91/6 → 95/6 | gain:0.35377285626545446 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037037035 ]", - "[ 46/3 → 47/3 | clip:1 gain:1 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 46/3 → 47/3 | clip:1 gain:0.25 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ 46/3 → 16/1 | gain:0.7076757746138589 clip:1 note:F2 s:piano release:0.1 pan:0.4398148148148148 ]", - "[ 31/2 → 95/6 | clip:1 gain:0.5 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ 31/2 → 95/6 | clip:1 gain:0.125 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ (31/2 → 16/1) ⇝ 97/6 | gain:0.17693909526233562 clip:1 note:F5 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ (31/2 → 16/1) ⇝ 33/2 | gain:0.35387819052467123 clip:1 note:F5 s:piano release:0.1 pan:0.6064814814814814 ]", - "[ (31/2 → 16/1) ⇝ 33/2 | gain:0.17693909526233562 clip:1 note:G7 s:piano release:0.1 pan:0.7268518518518519 ]", - "[ (31/2 → 16/1) ⇝ 35/2 | gain:0.17693909526233562 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037037 ]", - "[ (31/2 → 16/1) ⇝ 35/2 | gain:0.17693909526233562 clip:1 note:A6 s:piano release:0.1 pan:0.6805555555555556 ]", - "[ (31/2 → 16/1) ⇝ 35/2 | gain:0.17693909526233562 clip:1 note:Eb7 s:piano release:0.1 pan:0.7083333333333333 ]", - "[ 47/3 → 16/1 | clip:1 gain:1 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ 47/3 → 16/1 | clip:1 gain:0.25 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ (47/3 → 16/1) ⇝ 49/3 | gain:0.2359328856880594 clip:1 note:F4 s:piano release:0.1 pan:0.5509259259259259 ]", - "[ (95/6 → 16/1) ⇝ 97/6 | clip:1 gain:0.5 note:C7 s:piano release:0.1 pan:0.6944444444444444 ]", - "[ (95/6 → 16/1) ⇝ 97/6 | clip:1 gain:0.125 note:G6 s:piano release:0.1 pan:0.6712962962962963 ]", - "[ (95/6 → 16/1) ⇝ 33/2 | gain:0.3539072768376083 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037037035 ]", + "[ -1/2 ⇜ (0/1 → 1/6) | gain:0.125015148782 clip:1 note:D5 s:piano release:0.1 pan:0.592592592593 ]", + "[ -1/6 ⇜ (0/1 → 1/6) | clip:1 gain:0.5 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ -1/6 ⇜ (0/1 → 1/6) | clip:1 gain:0.125 note:E6 s:piano release:0.1 pan:0.657407407407 ]", + "[ -1/3 ⇜ (0/1 → 1/3) | gain:0.166672747377 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037 ]", + "[ 0/1 → 1/3 | clip:1 gain:1 note:E6 s:piano release:0.1 pan:0.657407407407 ]", + "[ 0/1 → 1/3 | clip:1 gain:0.25 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ -3/2 ⇜ (0/1 → 1/2) | gain:0.250741641915 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037 ]", + "[ -3/2 ⇜ (0/1 → 1/2) | gain:0.250741641915 clip:1 note:F4 s:piano release:0.1 pan:0.550925925926 ]", + "[ -3/2 ⇜ (0/1 → 1/2) | gain:0.250741641915 clip:1 note:C5 s:piano release:0.1 pan:0.583333333333 ]", + "[ -1/2 ⇜ (0/1 → 1/2) | gain:0.250030297564 clip:1 note:D5 s:piano release:0.1 pan:0.592592592593 ]", + "[ -1/2 ⇜ (0/1 → 1/2) | gain:0.125015148782 clip:1 note:E7 s:piano release:0.1 pan:0.712962962963 ]", + "[ -1/6 ⇜ (0/1 → 1/2) | gain:0.250001158288 clip:1 note:D3 s:piano release:0.1 pan:0.481481481481 ]", + "[ 0/1 → 2/3 | gain:0.5 clip:1 note:D2 s:piano release:0.1 pan:0.425925925926 ]", + "[ -1/1 ⇜ (0/1 → 1/1) | gain:0.166820609478 clip:1 note:D5 s:piano release:0.1 pan:0.592592592593 ]", + "[ -1/1 ⇜ (0/1 → 1/1) | gain:0.166820609478 clip:1 note:F5 s:piano release:0.1 pan:0.606481481481 ]", + "[ -1/1 ⇜ (0/1 → 1/1) | gain:0.166820609478 clip:1 note:C6 s:piano release:0.1 pan:0.638888888889 ]", + "[ -1/2 ⇜ (0/1 → 1/1) ⇝ 3/2 | gain:0.125015148782 clip:1 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ -1/2 ⇜ (0/1 → 1/1) ⇝ 3/2 | gain:0.125015148782 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037 ]", + "[ -1/2 ⇜ (0/1 → 1/1) ⇝ 3/2 | gain:0.125015148782 clip:1 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ 0/1 → 1/1 | gain:0.5 clip:1 note:E4 s:piano release:0.1 pan:0.546296296296 ]", + "[ 0/1 → 1/1 | gain:0.166666666667 clip:1 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ (0/1 → 1/1) ⇝ 2/1 | gain:0.5 clip:1 note:D3 s:piano release:0.1 pan:0.481481481481 ]", + "[ (0/1 → 1/1) ⇝ 2/1 | gain:0.5 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037 ]", + "[ (0/1 → 1/1) ⇝ 2/1 | gain:0.5 clip:1 note:C4 s:piano release:0.1 pan:0.527777777778 ]", + "[ 1/6 → 1/2 | clip:1 gain:0.5 note:E6 s:piano release:0.1 pan:0.657407407407 ]", + "[ 1/6 → 1/2 | clip:1 gain:0.125 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 1/6 → 5/6 | gain:0.125000578091 clip:1 note:D5 s:piano release:0.1 pan:0.592592592593 ]", + "[ 1/3 → 2/3 | clip:1 gain:1 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 1/3 → 2/3 | clip:1 gain:0.25 note:E6 s:piano release:0.1 pan:0.657407407407 ]", + "[ 1/3 → 1/1 | gain:0.166672736325 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037 ]", + "[ 1/2 → 5/6 | clip:1 gain:0.5 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 1/2 → 5/6 | clip:1 gain:0.125 note:E6 s:piano release:0.1 pan:0.657407407407 ]", + "[ (1/2 → 1/1) ⇝ 7/6 | gain:0.250030242495 clip:1 note:D3 s:piano release:0.1 pan:0.481481481481 ]", + "[ (1/2 → 1/1) ⇝ 3/2 | gain:0.250030242495 clip:1 note:E5 s:piano release:0.1 pan:0.601851851852 ]", + "[ (1/2 → 1/1) ⇝ 3/2 | gain:0.125015121248 clip:1 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ (1/2 → 1/1) ⇝ 5/2 | gain:0.250030242495 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037 ]", + "[ (1/2 → 1/1) ⇝ 5/2 | gain:0.250030242495 clip:1 note:F4 s:piano release:0.1 pan:0.550925925926 ]", + "[ (1/2 → 1/1) ⇝ 5/2 | gain:0.250030242495 clip:1 note:C5 s:piano release:0.1 pan:0.583333333333 ]", + "[ 2/3 → 1/1 | clip:1 gain:1 note:E6 s:piano release:0.1 pan:0.657407407407 ]", + "[ 2/3 → 1/1 | clip:1 gain:0.25 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ (2/3 → 1/1) ⇝ 4/3 | gain:0.500141091426 clip:1 note:D2 s:piano release:0.1 pan:0.425925925926 ]", + "[ (5/6 → 1/1) ⇝ 7/6 | clip:1 gain:0.5 note:E6 s:piano release:0.1 pan:0.657407407407 ]", + "[ (5/6 → 1/1) ⇝ 7/6 | clip:1 gain:0.125 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ (5/6 → 1/1) ⇝ 3/2 | gain:0.125067788377 clip:1 note:D5 s:piano release:0.1 pan:0.592592592593 ]", + "[ 1/2 ⇜ (1/1 → 7/6) | gain:0.250030242495 clip:1 note:D3 s:piano release:0.1 pan:0.481481481481 ]", + "[ 5/6 ⇜ (1/1 → 7/6) | clip:1 gain:0.5 note:E6 s:piano release:0.1 pan:0.657407407407 ]", + "[ 5/6 ⇜ (1/1 → 7/6) | clip:1 gain:0.125 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 2/3 ⇜ (1/1 → 4/3) | gain:0.500141091426 clip:1 note:D2 s:piano release:0.1 pan:0.425925925926 ]", + "[ 1/1 → 4/3 | clip:1 gain:1 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 1/1 → 4/3 | clip:1 gain:0.25 note:E6 s:piano release:0.1 pan:0.657407407407 ]", + "[ -1/2 ⇜ (1/1 → 3/2) | gain:0.125015148782 clip:1 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ -1/2 ⇜ (1/1 → 3/2) | gain:0.125015148782 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037 ]", + "[ -1/2 ⇜ (1/1 → 3/2) | gain:0.125015148782 clip:1 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ 1/2 ⇜ (1/1 → 3/2) | gain:0.250030242495 clip:1 note:E5 s:piano release:0.1 pan:0.601851851852 ]", + "[ 1/2 ⇜ (1/1 → 3/2) | gain:0.125015121248 clip:1 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ 5/6 ⇜ (1/1 → 3/2) | gain:0.125067788377 clip:1 note:D5 s:piano release:0.1 pan:0.592592592593 ]", + "[ 1/1 → 5/3 | gain:0.166820329676 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037 ]", + "[ 0/1 ⇜ (1/1 → 2/1) | gain:0.5 clip:1 note:D3 s:piano release:0.1 pan:0.481481481481 ]", + "[ 0/1 ⇜ (1/1 → 2/1) | gain:0.5 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037 ]", + "[ 0/1 ⇜ (1/1 → 2/1) | gain:0.5 clip:1 note:C4 s:piano release:0.1 pan:0.527777777778 ]", + "[ 1/2 ⇜ (1/1 → 2/1) ⇝ 5/2 | gain:0.250030242495 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037 ]", + "[ 1/2 ⇜ (1/1 → 2/1) ⇝ 5/2 | gain:0.250030242495 clip:1 note:F4 s:piano release:0.1 pan:0.550925925926 ]", + "[ 1/2 ⇜ (1/1 → 2/1) ⇝ 5/2 | gain:0.250030242495 clip:1 note:C5 s:piano release:0.1 pan:0.583333333333 ]", + "[ 1/1 → 2/1 | gain:0.500460989027 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037 ]", + "[ 1/1 → 2/1 | gain:0.166820329676 clip:1 note:E6 s:piano release:0.1 pan:0.657407407407 ]", + "[ (1/1 → 2/1) ⇝ 3/1 | gain:0.166820329676 clip:1 note:D5 s:piano release:0.1 pan:0.592592592593 ]", + "[ (1/1 → 2/1) ⇝ 3/1 | gain:0.166820329676 clip:1 note:F5 s:piano release:0.1 pan:0.606481481481 ]", + "[ (1/1 → 2/1) ⇝ 3/1 | gain:0.166820329676 clip:1 note:C6 s:piano release:0.1 pan:0.638888888889 ]", + "[ 7/6 → 3/2 | clip:1 gain:0.5 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 7/6 → 3/2 | clip:1 gain:0.125 note:E6 s:piano release:0.1 pan:0.657407407407 ]", + "[ 7/6 → 11/6 | gain:0.25036006334 clip:1 note:D3 s:piano release:0.1 pan:0.481481481481 ]", + "[ 4/3 → 5/3 | clip:1 gain:1 note:E6 s:piano release:0.1 pan:0.657407407407 ]", + "[ 4/3 → 5/3 | clip:1 gain:0.25 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 4/3 → 2/1 | gain:0.501057324429 clip:1 note:D2 s:piano release:0.1 pan:0.425925925926 ]", + "[ 3/2 → 11/6 | clip:1 gain:0.5 note:E6 s:piano release:0.1 pan:0.657407407407 ]", + "[ 3/2 → 11/6 | clip:1 gain:0.125 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ (3/2 → 2/1) ⇝ 13/6 | gain:0.125370146963 clip:1 note:D5 s:piano release:0.1 pan:0.592592592593 ]", + "[ (3/2 → 2/1) ⇝ 5/2 | gain:0.250740293925 clip:1 note:D5 s:piano release:0.1 pan:0.592592592593 ]", + "[ (3/2 → 2/1) ⇝ 5/2 | gain:0.125370146963 clip:1 note:E7 s:piano release:0.1 pan:0.712962962963 ]", + "[ (3/2 → 2/1) ⇝ 7/2 | gain:0.125370146963 clip:1 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ (3/2 → 2/1) ⇝ 7/2 | gain:0.125370146963 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037 ]", + "[ (3/2 → 2/1) ⇝ 7/2 | gain:0.125370146963 clip:1 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ 5/3 → 2/1 | clip:1 gain:1 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 5/3 → 2/1 | clip:1 gain:0.25 note:E6 s:piano release:0.1 pan:0.657407407407 ]", + "[ (5/3 → 2/1) ⇝ 7/3 | gain:0.167332396162 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037 ]", + "[ (11/6 → 2/1) ⇝ 13/6 | clip:1 gain:0.5 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ (11/6 → 2/1) ⇝ 13/6 | clip:1 gain:0.125 note:E6 s:piano release:0.1 pan:0.657407407407 ]", + "[ (11/6 → 2/1) ⇝ 5/2 | gain:0.251306841093 clip:1 note:D3 s:piano release:0.1 pan:0.481481481481 ]", + "[ 3/2 ⇜ (2/1 → 13/6) | gain:0.125370146963 clip:1 note:G5 s:piano release:0.1 pan:0.615740740741 ]", + "[ 11/6 ⇜ (2/1 → 13/6) | clip:1 gain:0.5 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ 11/6 ⇜ (2/1 → 13/6) | clip:1 gain:0.125 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 5/3 ⇜ (2/1 → 7/3) | gain:0.167332396162 clip:1 note:G4 s:piano release:0.1 pan:0.560185185185 ]", + "[ 2/1 → 7/3 | clip:1 gain:1 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 2/1 → 7/3 | clip:1 gain:0.25 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ 1/2 ⇜ (2/1 → 5/2) | gain:0.250030242495 clip:1 note:G4 s:piano release:0.1 pan:0.560185185185 ]", + "[ 1/2 ⇜ (2/1 → 5/2) | gain:0.250030242495 clip:1 note:B4 s:piano release:0.1 pan:0.578703703704 ]", + "[ 1/2 ⇜ (2/1 → 5/2) | gain:0.250030242495 clip:1 note:F5 s:piano release:0.1 pan:0.606481481481 ]", + "[ 3/2 ⇜ (2/1 → 5/2) | gain:0.250740293925 clip:1 note:G5 s:piano release:0.1 pan:0.615740740741 ]", + "[ 3/2 ⇜ (2/1 → 5/2) | gain:0.125370146963 clip:1 note:A7 s:piano release:0.1 pan:0.736111111111 ]", + "[ 11/6 ⇜ (2/1 → 5/2) | gain:0.251306841093 clip:1 note:G3 s:piano release:0.1 pan:0.50462962963 ]", + "[ 2/1 → 8/3 | gain:0.503335927476 clip:1 note:G2 s:piano release:0.1 pan:0.449074074074 ]", + "[ 1/1 ⇜ (2/1 → 3/1) | gain:0.166820329676 clip:1 note:G5 s:piano release:0.1 pan:0.615740740741 ]", + "[ 1/1 ⇜ (2/1 → 3/1) | gain:0.166820329676 clip:1 note:B5 s:piano release:0.1 pan:0.634259259259 ]", + "[ 1/1 ⇜ (2/1 → 3/1) | gain:0.166820329676 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037 ]", + "[ 3/2 ⇜ (2/1 → 3/1) ⇝ 7/2 | gain:0.125370146963 clip:1 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 3/2 ⇜ (2/1 → 3/1) ⇝ 7/2 | gain:0.125370146963 clip:1 note:B6 s:piano release:0.1 pan:0.689814814815 ]", + "[ 3/2 ⇜ (2/1 → 3/1) ⇝ 7/2 | gain:0.125370146963 clip:1 note:F7 s:piano release:0.1 pan:0.717592592593 ]", + "[ 2/1 → 3/1 | gain:0.503335927476 clip:1 note:A4 s:piano release:0.1 pan:0.569444444444 ]", + "[ 2/1 → 3/1 | gain:0.167778642492 clip:1 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ (2/1 → 3/1) ⇝ 4/1 | gain:0.503335927476 clip:1 note:G3 s:piano release:0.1 pan:0.50462962963 ]", + "[ (2/1 → 3/1) ⇝ 4/1 | gain:0.503335927476 clip:1 note:B3 s:piano release:0.1 pan:0.523148148148 ]", + "[ (2/1 → 3/1) ⇝ 4/1 | gain:0.503335927476 clip:1 note:F4 s:piano release:0.1 pan:0.550925925926 ]", + "[ 13/6 → 5/2 | clip:1 gain:0.5 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 13/6 → 5/2 | clip:1 gain:0.125 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ 13/6 → 17/6 | gain:0.126042275974 clip:1 note:G5 s:piano release:0.1 pan:0.615740740741 ]", + "[ 7/3 → 8/3 | clip:1 gain:1 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ 7/3 → 8/3 | clip:1 gain:0.25 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 7/3 → 3/1 | gain:0.168372576782 clip:1 note:G4 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/2 → 17/6 | clip:1 gain:0.5 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ 5/2 → 17/6 | clip:1 gain:0.125 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ (5/2 → 3/1) ⇝ 19/6 | gain:0.253092841729 clip:1 note:G3 s:piano release:0.1 pan:0.50462962963 ]", + "[ (5/2 → 3/1) ⇝ 7/2 | gain:0.253092841729 clip:1 note:A5 s:piano release:0.1 pan:0.625 ]", + "[ (5/2 → 3/1) ⇝ 7/2 | gain:0.126546420864 clip:1 note:G7 s:piano release:0.1 pan:0.726851851852 ]", + "[ (5/2 → 3/1) ⇝ 9/2 | gain:0.253092841729 clip:1 note:G4 s:piano release:0.1 pan:0.560185185185 ]", + "[ (5/2 → 3/1) ⇝ 9/2 | gain:0.253092841729 clip:1 note:B4 s:piano release:0.1 pan:0.578703703704 ]", + "[ (5/2 → 3/1) ⇝ 9/2 | gain:0.253092841729 clip:1 note:F5 s:piano release:0.1 pan:0.606481481481 ]", + "[ 8/3 → 3/1 | clip:1 gain:1 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 8/3 → 3/1 | clip:1 gain:0.25 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ (8/3 → 3/1) ⇝ 10/3 | gain:0.507376215924 clip:1 note:G2 s:piano release:0.1 pan:0.449074074074 ]", + "[ (17/6 → 3/1) ⇝ 19/6 | clip:1 gain:0.5 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ (17/6 → 3/1) ⇝ 19/6 | clip:1 gain:0.125 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ (17/6 → 3/1) ⇝ 7/2 | gain:0.127172993715 clip:1 note:G5 s:piano release:0.1 pan:0.615740740741 ]", + "[ 5/2 ⇜ (3/1 → 19/6) | gain:0.253092841729 clip:1 note:G3 s:piano release:0.1 pan:0.50462962963 ]", + "[ 17/6 ⇜ (3/1 → 19/6) | clip:1 gain:0.5 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 17/6 ⇜ (3/1 → 19/6) | clip:1 gain:0.125 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ 8/3 ⇜ (3/1 → 10/3) | gain:0.507376215924 clip:1 note:G2 s:piano release:0.1 pan:0.449074074074 ]", + "[ 3/1 → 10/3 | clip:1 gain:1 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ 3/1 → 10/3 | clip:1 gain:0.25 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 3/2 ⇜ (3/1 → 7/2) | gain:0.125370146963 clip:1 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 3/2 ⇜ (3/1 → 7/2) | gain:0.125370146963 clip:1 note:B6 s:piano release:0.1 pan:0.689814814815 ]", + "[ 3/2 ⇜ (3/1 → 7/2) | gain:0.125370146963 clip:1 note:F7 s:piano release:0.1 pan:0.717592592593 ]", + "[ 5/2 ⇜ (3/1 → 7/2) | gain:0.253092841729 clip:1 note:A5 s:piano release:0.1 pan:0.625 ]", + "[ 5/2 ⇜ (3/1 → 7/2) | gain:0.126546420864 clip:1 note:G7 s:piano release:0.1 pan:0.726851851852 ]", + "[ 17/6 ⇜ (3/1 → 7/2) | gain:0.127172993715 clip:1 note:G5 s:piano release:0.1 pan:0.615740740741 ]", + "[ 3/1 → 11/3 | gain:0.170045006719 clip:1 note:G4 s:piano release:0.1 pan:0.560185185185 ]", + "[ 2/1 ⇜ (3/1 → 4/1) | gain:0.503335927476 clip:1 note:G3 s:piano release:0.1 pan:0.50462962963 ]", + "[ 2/1 ⇜ (3/1 → 4/1) | gain:0.503335927476 clip:1 note:B3 s:piano release:0.1 pan:0.523148148148 ]", + "[ 2/1 ⇜ (3/1 → 4/1) | gain:0.503335927476 clip:1 note:F4 s:piano release:0.1 pan:0.550925925926 ]", + "[ 5/2 ⇜ (3/1 → 4/1) ⇝ 9/2 | gain:0.253092841729 clip:1 note:G4 s:piano release:0.1 pan:0.560185185185 ]", + "[ 5/2 ⇜ (3/1 → 4/1) ⇝ 9/2 | gain:0.253092841729 clip:1 note:B4 s:piano release:0.1 pan:0.578703703704 ]", + "[ 5/2 ⇜ (3/1 → 4/1) ⇝ 9/2 | gain:0.253092841729 clip:1 note:F5 s:piano release:0.1 pan:0.606481481481 ]", + "[ 3/1 → 4/1 | gain:0.510135020156 clip:1 note:G4 s:piano release:0.1 pan:0.560185185185 ]", + "[ 3/1 → 4/1 | gain:0.170045006719 clip:1 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ (3/1 → 4/1) ⇝ 5/1 | gain:0.170045006719 clip:1 note:G5 s:piano release:0.1 pan:0.615740740741 ]", + "[ (3/1 → 4/1) ⇝ 5/1 | gain:0.170045006719 clip:1 note:B5 s:piano release:0.1 pan:0.634259259259 ]", + "[ (3/1 → 4/1) ⇝ 5/1 | gain:0.170045006719 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037 ]", + "[ 19/6 → 7/2 | clip:1 gain:0.5 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ 19/6 → 7/2 | clip:1 gain:0.125 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 19/6 → 23/6 | gain:0.25585342141 clip:1 note:G3 s:piano release:0.1 pan:0.50462962963 ]", + "[ 10/3 → 11/3 | clip:1 gain:1 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 10/3 → 11/3 | clip:1 gain:0.25 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ 10/3 → 4/1 | gain:0.513408383333 clip:1 note:G2 s:piano release:0.1 pan:0.449074074074 ]", + "[ 7/2 → 23/6 | clip:1 gain:0.5 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 7/2 → 23/6 | clip:1 gain:0.125 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ (7/2 → 4/1) ⇝ 25/6 | gain:0.128810012501 clip:1 note:G5 s:piano release:0.1 pan:0.615740740741 ]", + "[ (7/2 → 4/1) ⇝ 9/2 | gain:0.257620025002 clip:1 note:G5 s:piano release:0.1 pan:0.615740740741 ]", + "[ (7/2 → 4/1) ⇝ 9/2 | gain:0.128810012501 clip:1 note:A7 s:piano release:0.1 pan:0.736111111111 ]", + "[ (7/2 → 4/1) ⇝ 11/2 | gain:0.128810012501 clip:1 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ (7/2 → 4/1) ⇝ 11/2 | gain:0.128810012501 clip:1 note:B6 s:piano release:0.1 pan:0.689814814815 ]", + "[ (7/2 → 4/1) ⇝ 11/2 | gain:0.128810012501 clip:1 note:F7 s:piano release:0.1 pan:0.717592592593 ]", + "[ 11/3 → 4/1 | clip:1 gain:1 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ 11/3 → 4/1 | clip:1 gain:0.25 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ (11/3 → 4/1) ⇝ 13/3 | gain:0.172400579106 clip:1 note:G4 s:piano release:0.1 pan:0.560185185185 ]", + "[ (23/6 → 4/1) ⇝ 25/6 | clip:1 gain:0.5 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ (23/6 → 4/1) ⇝ 25/6 | clip:1 gain:0.125 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ (23/6 → 4/1) ⇝ 9/2 | gain:0.259646422139 clip:1 note:G3 s:piano release:0.1 pan:0.50462962963 ]", + "[ 7/2 ⇜ (4/1 → 25/6) | gain:0.128810012501 clip:1 note:C5 s:piano release:0.1 pan:0.583333333333 ]", + "[ 23/6 ⇜ (4/1 → 25/6) | clip:1 gain:0.5 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 23/6 ⇜ (4/1 → 25/6) | clip:1 gain:0.125 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ 11/3 ⇜ (4/1 → 13/3) | gain:0.172400579106 clip:1 note:C4 s:piano release:0.1 pan:0.527777777778 ]", + "[ 4/1 → 13/3 | clip:1 gain:1 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ 4/1 → 13/3 | clip:1 gain:0.25 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 5/2 ⇜ (4/1 → 9/2) | gain:0.253092841729 clip:1 note:C4 s:piano release:0.1 pan:0.527777777778 ]", + "[ 5/2 ⇜ (4/1 → 9/2) | gain:0.253092841729 clip:1 note:Eb4 s:piano release:0.1 pan:0.541666666667 ]", + "[ 5/2 ⇜ (4/1 → 9/2) | gain:0.253092841729 clip:1 note:Bb4 s:piano release:0.1 pan:0.574074074074 ]", + "[ 7/2 ⇜ (4/1 → 9/2) | gain:0.257620025002 clip:1 note:C5 s:piano release:0.1 pan:0.583333333333 ]", + "[ 7/2 ⇜ (4/1 → 9/2) | gain:0.128810012501 clip:1 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ 23/6 ⇜ (4/1 → 9/2) | gain:0.259646422139 clip:1 note:C3 s:piano release:0.1 pan:0.472222222222 ]", + "[ 4/1 → 14/3 | gain:0.521512292774 clip:1 note:C2 s:piano release:0.1 pan:0.416666666667 ]", + "[ 3/1 ⇜ (4/1 → 5/1) | gain:0.170045006719 clip:1 note:C5 s:piano release:0.1 pan:0.583333333333 ]", + "[ 3/1 ⇜ (4/1 → 5/1) | gain:0.170045006719 clip:1 note:Eb5 s:piano release:0.1 pan:0.597222222222 ]", + "[ 3/1 ⇜ (4/1 → 5/1) | gain:0.170045006719 clip:1 note:Bb5 s:piano release:0.1 pan:0.62962962963 ]", + "[ 7/2 ⇜ (4/1 → 5/1) ⇝ 11/2 | gain:0.128810012501 clip:1 note:C6 s:piano release:0.1 pan:0.638888888889 ]", + "[ 7/2 ⇜ (4/1 → 5/1) ⇝ 11/2 | gain:0.128810012501 clip:1 note:Eb6 s:piano release:0.1 pan:0.652777777778 ]", + "[ 7/2 ⇜ (4/1 → 5/1) ⇝ 11/2 | gain:0.128810012501 clip:1 note:Bb6 s:piano release:0.1 pan:0.685185185185 ]", + "[ 4/1 → 5/1 | gain:0.521512292774 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037 ]", + "[ 4/1 → 5/1 | gain:0.173837430925 clip:1 note:C6 s:piano release:0.1 pan:0.638888888889 ]", + "[ (4/1 → 5/1) ⇝ 6/1 | gain:0.521512292774 clip:1 note:C3 s:piano release:0.1 pan:0.472222222222 ]", + "[ (4/1 → 5/1) ⇝ 6/1 | gain:0.521512292774 clip:1 note:Eb3 s:piano release:0.1 pan:0.486111111111 ]", + "[ (4/1 → 5/1) ⇝ 6/1 | gain:0.521512292774 clip:1 note:Bb3 s:piano release:0.1 pan:0.518518518519 ]", + "[ 25/6 → 9/2 | clip:1 gain:0.5 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ 25/6 → 9/2 | clip:1 gain:0.125 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 25/6 → 29/6 | gain:0.130964636479 clip:1 note:C5 s:piano release:0.1 pan:0.583333333333 ]", + "[ 13/3 → 14/3 | clip:1 gain:1 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 13/3 → 14/3 | clip:1 gain:0.25 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ 13/3 → 5/1 | gain:0.175443208799 clip:1 note:C4 s:piano release:0.1 pan:0.527777777778 ]", + "[ 9/2 → 29/6 | clip:1 gain:0.5 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 9/2 → 29/6 | clip:1 gain:0.125 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ (9/2 → 5/1) ⇝ 31/6 | gain:0.264461567419 clip:1 note:C3 s:piano release:0.1 pan:0.472222222222 ]", + "[ (9/2 → 5/1) ⇝ 11/2 | gain:0.264461567419 clip:1 note:D5 s:piano release:0.1 pan:0.592592592593 ]", + "[ (9/2 → 5/1) ⇝ 11/2 | gain:0.13223078371 clip:1 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ (9/2 → 5/1) ⇝ 13/2 | gain:0.264461567419 clip:1 note:C4 s:piano release:0.1 pan:0.527777777778 ]", + "[ (9/2 → 5/1) ⇝ 13/2 | gain:0.264461567419 clip:1 note:Eb4 s:piano release:0.1 pan:0.541666666667 ]", + "[ (9/2 → 5/1) ⇝ 13/2 | gain:0.264461567419 clip:1 note:Bb4 s:piano release:0.1 pan:0.574074074074 ]", + "[ 14/3 → 5/1 | clip:1 gain:1 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ 14/3 → 5/1 | clip:1 gain:0.25 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ (14/3 → 5/1) ⇝ 16/3 | gain:0.531636268141 clip:1 note:C2 s:piano release:0.1 pan:0.416666666667 ]", + "[ (29/6 → 5/1) ⇝ 31/6 | clip:1 gain:0.5 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ (29/6 → 5/1) ⇝ 31/6 | clip:1 gain:0.125 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ (29/6 → 5/1) ⇝ 11/2 | gain:0.13361645946 clip:1 note:C5 s:piano release:0.1 pan:0.583333333333 ]", + "[ 9/2 ⇜ (5/1 → 31/6) | gain:0.264461567419 clip:1 note:C3 s:piano release:0.1 pan:0.472222222222 ]", + "[ 29/6 ⇜ (5/1 → 31/6) | clip:1 gain:0.5 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ 29/6 ⇜ (5/1 → 31/6) | clip:1 gain:0.125 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 14/3 ⇜ (5/1 → 16/3) | gain:0.531636268141 clip:1 note:C2 s:piano release:0.1 pan:0.416666666667 ]", + "[ 5/1 → 16/3 | clip:1 gain:1 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 5/1 → 16/3 | clip:1 gain:0.25 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ 7/2 ⇜ (5/1 → 11/2) | gain:0.128810012501 clip:1 note:C6 s:piano release:0.1 pan:0.638888888889 ]", + "[ 7/2 ⇜ (5/1 → 11/2) | gain:0.128810012501 clip:1 note:Eb6 s:piano release:0.1 pan:0.652777777778 ]", + "[ 7/2 ⇜ (5/1 → 11/2) | gain:0.128810012501 clip:1 note:Bb6 s:piano release:0.1 pan:0.685185185185 ]", + "[ 9/2 ⇜ (5/1 → 11/2) | gain:0.264461567419 clip:1 note:D5 s:piano release:0.1 pan:0.592592592593 ]", + "[ 9/2 ⇜ (5/1 → 11/2) | gain:0.13223078371 clip:1 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ 29/6 ⇜ (5/1 → 11/2) | gain:0.13361645946 clip:1 note:C5 s:piano release:0.1 pan:0.583333333333 ]", + "[ 5/1 → 17/3 | gain:0.179136096149 clip:1 note:C4 s:piano release:0.1 pan:0.527777777778 ]", + "[ 4/1 ⇜ (5/1 → 6/1) | gain:0.521512292774 clip:1 note:C3 s:piano release:0.1 pan:0.472222222222 ]", + "[ 4/1 ⇜ (5/1 → 6/1) | gain:0.521512292774 clip:1 note:Eb3 s:piano release:0.1 pan:0.486111111111 ]", + "[ 4/1 ⇜ (5/1 → 6/1) | gain:0.521512292774 clip:1 note:Bb3 s:piano release:0.1 pan:0.518518518519 ]", + "[ 9/2 ⇜ (5/1 → 6/1) ⇝ 13/2 | gain:0.264461567419 clip:1 note:C4 s:piano release:0.1 pan:0.527777777778 ]", + "[ 9/2 ⇜ (5/1 → 6/1) ⇝ 13/2 | gain:0.264461567419 clip:1 note:Eb4 s:piano release:0.1 pan:0.541666666667 ]", + "[ 9/2 ⇜ (5/1 → 6/1) ⇝ 13/2 | gain:0.264461567419 clip:1 note:Bb4 s:piano release:0.1 pan:0.574074074074 ]", + "[ 5/1 → 6/1 | gain:0.537408288446 clip:1 note:C4 s:piano release:0.1 pan:0.527777777778 ]", + "[ 5/1 → 6/1 | gain:0.179136096149 clip:1 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ (5/1 → 6/1) ⇝ 7/1 | gain:0.179136096149 clip:1 note:C5 s:piano release:0.1 pan:0.583333333333 ]", + "[ (5/1 → 6/1) ⇝ 7/1 | gain:0.179136096149 clip:1 note:Eb5 s:piano release:0.1 pan:0.597222222222 ]", + "[ (5/1 → 6/1) ⇝ 7/1 | gain:0.179136096149 clip:1 note:Bb5 s:piano release:0.1 pan:0.62962962963 ]", + "[ 31/6 → 11/2 | clip:1 gain:0.5 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 31/6 → 11/2 | clip:1 gain:0.125 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ 31/6 → 35/6 | gain:0.270229857905 clip:1 note:C3 s:piano release:0.1 pan:0.472222222222 ]", + "[ 16/3 → 17/3 | clip:1 gain:1 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ 16/3 → 17/3 | clip:1 gain:0.25 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 16/3 → 6/1 | gain:0.543615885465 clip:1 note:C2 s:piano release:0.1 pan:0.416666666667 ]", + "[ 11/2 → 35/6 | clip:1 gain:0.5 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ 11/2 → 35/6 | clip:1 gain:0.125 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ (11/2 → 6/1) ⇝ 37/6 | gain:0.136718062744 clip:1 note:C5 s:piano release:0.1 pan:0.583333333333 ]", + "[ (11/2 → 6/1) ⇝ 13/2 | gain:0.273436125489 clip:1 note:C5 s:piano release:0.1 pan:0.583333333333 ]", + "[ (11/2 → 6/1) ⇝ 13/2 | gain:0.136718062744 clip:1 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ (11/2 → 6/1) ⇝ 15/2 | gain:0.136718062744 clip:1 note:C6 s:piano release:0.1 pan:0.638888888889 ]", + "[ (11/2 → 6/1) ⇝ 15/2 | gain:0.136718062744 clip:1 note:Eb6 s:piano release:0.1 pan:0.652777777778 ]", + "[ (11/2 → 6/1) ⇝ 15/2 | gain:0.136718062744 clip:1 note:Bb6 s:piano release:0.1 pan:0.685185185185 ]", + "[ 17/3 → 6/1 | clip:1 gain:1 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 17/3 → 6/1 | clip:1 gain:0.25 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ (17/3 → 6/1) ⇝ 19/3 | gain:0.183407990766 clip:1 note:C4 s:piano release:0.1 pan:0.527777777778 ]", + "[ (35/6 → 6/1) ⇝ 37/6 | clip:1 gain:0.5 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ (35/6 → 6/1) ⇝ 37/6 | clip:1 gain:0.125 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ (35/6 → 6/1) ⇝ 13/2 | gain:0.276832967061 clip:1 note:C3 s:piano release:0.1 pan:0.472222222222 ]", + "[ 11/2 ⇜ (6/1 → 37/6) | gain:0.136718062744 clip:1 note:F5 s:piano release:0.1 pan:0.606481481481 ]", + "[ 35/6 ⇜ (6/1 → 37/6) | clip:1 gain:0.5 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ 35/6 ⇜ (6/1 → 37/6) | clip:1 gain:0.125 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 17/3 ⇜ (6/1 → 19/3) | gain:0.183407990766 clip:1 note:F4 s:piano release:0.1 pan:0.550925925926 ]", + "[ 6/1 → 19/3 | clip:1 gain:1 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 6/1 → 19/3 | clip:1 gain:0.25 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ 9/2 ⇜ (6/1 → 13/2) | gain:0.264461567419 clip:1 note:F4 s:piano release:0.1 pan:0.550925925926 ]", + "[ 9/2 ⇜ (6/1 → 13/2) | gain:0.264461567419 clip:1 note:A4 s:piano release:0.1 pan:0.569444444444 ]", + "[ 9/2 ⇜ (6/1 → 13/2) | gain:0.264461567419 clip:1 note:Eb5 s:piano release:0.1 pan:0.597222222222 ]", + "[ 11/2 ⇜ (6/1 → 13/2) | gain:0.273436125489 clip:1 note:F5 s:piano release:0.1 pan:0.606481481481 ]", + "[ 11/2 ⇜ (6/1 → 13/2) | gain:0.136718062744 clip:1 note:G7 s:piano release:0.1 pan:0.726851851852 ]", + "[ 35/6 ⇜ (6/1 → 13/2) | gain:0.276832967061 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037 ]", + "[ 6/1 → 20/3 | gain:0.55719276422 clip:1 note:F2 s:piano release:0.1 pan:0.439814814815 ]", + "[ 5/1 ⇜ (6/1 → 7/1) | gain:0.179136096149 clip:1 note:F5 s:piano release:0.1 pan:0.606481481481 ]", + "[ 5/1 ⇜ (6/1 → 7/1) | gain:0.179136096149 clip:1 note:A5 s:piano release:0.1 pan:0.625 ]", + "[ 5/1 ⇜ (6/1 → 7/1) | gain:0.179136096149 clip:1 note:Eb6 s:piano release:0.1 pan:0.652777777778 ]", + "[ 11/2 ⇜ (6/1 → 7/1) ⇝ 15/2 | gain:0.136718062744 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037 ]", + "[ 11/2 ⇜ (6/1 → 7/1) ⇝ 15/2 | gain:0.136718062744 clip:1 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 11/2 ⇜ (6/1 → 7/1) ⇝ 15/2 | gain:0.136718062744 clip:1 note:Eb7 s:piano release:0.1 pan:0.708333333333 ]", + "[ 6/1 → 7/1 | gain:0.55719276422 clip:1 note:G4 s:piano release:0.1 pan:0.560185185185 ]", + "[ 6/1 → 7/1 | gain:0.185730921407 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037 ]", + "[ (6/1 → 7/1) ⇝ 8/1 | gain:0.55719276422 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037 ]", + "[ (6/1 → 7/1) ⇝ 8/1 | gain:0.55719276422 clip:1 note:A3 s:piano release:0.1 pan:0.513888888889 ]", + "[ (6/1 → 7/1) ⇝ 8/1 | gain:0.55719276422 clip:1 note:Eb4 s:piano release:0.1 pan:0.541666666667 ]", + "[ 37/6 → 13/2 | clip:1 gain:0.5 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 37/6 → 13/2 | clip:1 gain:0.125 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ 37/6 → 41/6 | gain:0.140199712953 clip:1 note:F5 s:piano release:0.1 pan:0.606481481481 ]", + "[ 19/3 → 20/3 | clip:1 gain:1 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ 19/3 → 20/3 | clip:1 gain:0.25 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 19/3 → 7/1 | gain:0.188159455299 clip:1 note:F4 s:piano release:0.1 pan:0.550925925926 ]", + "[ 13/2 → 41/6 | clip:1 gain:0.5 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ 13/2 → 41/6 | clip:1 gain:0.125 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ (13/2 → 7/1) ⇝ 43/6 | gain:0.284112636814 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037 ]", + "[ (13/2 → 7/1) ⇝ 15/2 | gain:0.284112636814 clip:1 note:G5 s:piano release:0.1 pan:0.615740740741 ]", + "[ (13/2 → 7/1) ⇝ 15/2 | gain:0.142056318407 clip:1 note:F7 s:piano release:0.1 pan:0.717592592593 ]", + "[ (13/2 → 7/1) ⇝ 17/2 | gain:0.284112636814 clip:1 note:F4 s:piano release:0.1 pan:0.550925925926 ]", + "[ (13/2 → 7/1) ⇝ 17/2 | gain:0.284112636814 clip:1 note:A4 s:piano release:0.1 pan:0.569444444444 ]", + "[ (13/2 → 7/1) ⇝ 17/2 | gain:0.284112636814 clip:1 note:Eb5 s:piano release:0.1 pan:0.597222222222 ]", + "[ 20/3 → 7/1 | clip:1 gain:1 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 20/3 → 7/1 | clip:1 gain:0.25 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ (20/3 → 7/1) ⇝ 22/3 | gain:0.572033358635 clip:1 note:F2 s:piano release:0.1 pan:0.439814814815 ]", + "[ (41/6 → 7/1) ⇝ 43/6 | clip:1 gain:0.5 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ (41/6 → 7/1) ⇝ 43/6 | clip:1 gain:0.125 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ (41/6 → 7/1) ⇝ 15/2 | gain:0.14397405985 clip:1 note:F5 s:piano release:0.1 pan:0.606481481481 ]", + "[ 13/2 ⇜ (7/1 → 43/6) | gain:0.284112636814 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037 ]", + "[ 41/6 ⇜ (7/1 → 43/6) | clip:1 gain:0.5 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 41/6 ⇜ (7/1 → 43/6) | clip:1 gain:0.125 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ 20/3 ⇜ (7/1 → 22/3) | gain:0.572033358635 clip:1 note:F2 s:piano release:0.1 pan:0.439814814815 ]", + "[ 7/1 → 22/3 | clip:1 gain:1 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ 7/1 → 22/3 | clip:1 gain:0.25 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 11/2 ⇜ (7/1 → 15/2) | gain:0.136718062744 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037 ]", + "[ 11/2 ⇜ (7/1 → 15/2) | gain:0.136718062744 clip:1 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 11/2 ⇜ (7/1 → 15/2) | gain:0.136718062744 clip:1 note:Eb7 s:piano release:0.1 pan:0.708333333333 ]", + "[ 13/2 ⇜ (7/1 → 15/2) | gain:0.284112636814 clip:1 note:G5 s:piano release:0.1 pan:0.615740740741 ]", + "[ 13/2 ⇜ (7/1 → 15/2) | gain:0.142056318407 clip:1 note:F7 s:piano release:0.1 pan:0.717592592593 ]", + "[ 41/6 ⇜ (7/1 → 15/2) | gain:0.14397405985 clip:1 note:F5 s:piano release:0.1 pan:0.606481481481 ]", + "[ 7/1 → 23/3 | gain:0.193269129197 clip:1 note:F4 s:piano release:0.1 pan:0.550925925926 ]", + "[ 6/1 ⇜ (7/1 → 8/1) | gain:0.55719276422 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037 ]", + "[ 6/1 ⇜ (7/1 → 8/1) | gain:0.55719276422 clip:1 note:A3 s:piano release:0.1 pan:0.513888888889 ]", + "[ 6/1 ⇜ (7/1 → 8/1) | gain:0.55719276422 clip:1 note:Eb4 s:piano release:0.1 pan:0.541666666667 ]", + "[ 13/2 ⇜ (7/1 → 8/1) ⇝ 17/2 | gain:0.284112636814 clip:1 note:F4 s:piano release:0.1 pan:0.550925925926 ]", + "[ 13/2 ⇜ (7/1 → 8/1) ⇝ 17/2 | gain:0.284112636814 clip:1 note:A4 s:piano release:0.1 pan:0.569444444444 ]", + "[ 13/2 ⇜ (7/1 → 8/1) ⇝ 17/2 | gain:0.284112636814 clip:1 note:Eb5 s:piano release:0.1 pan:0.597222222222 ]", + "[ 7/1 → 8/1 | gain:0.579807387591 clip:1 note:F4 s:piano release:0.1 pan:0.550925925926 ]", + "[ 7/1 → 8/1 | gain:0.193269129197 clip:1 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ (7/1 → 8/1) ⇝ 9/1 | gain:0.193269129197 clip:1 note:F5 s:piano release:0.1 pan:0.606481481481 ]", + "[ (7/1 → 8/1) ⇝ 9/1 | gain:0.193269129197 clip:1 note:A5 s:piano release:0.1 pan:0.625 ]", + "[ (7/1 → 8/1) ⇝ 9/1 | gain:0.193269129197 clip:1 note:Eb6 s:piano release:0.1 pan:0.652777777778 ]", + "[ 43/6 → 15/2 | clip:1 gain:0.5 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ 43/6 → 15/2 | clip:1 gain:0.125 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 43/6 → 47/6 | gain:0.291880073212 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037 ]", + "[ 22/3 → 23/3 | clip:1 gain:1 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 22/3 → 23/3 | clip:1 gain:0.25 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ 22/3 → 8/1 | gain:0.58774774901 clip:1 note:F2 s:piano release:0.1 pan:0.439814814815 ]", + "[ 15/2 → 47/6 | clip:1 gain:0.5 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 15/2 → 47/6 | clip:1 gain:0.125 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ (15/2 → 8/1) ⇝ 49/6 | gain:0.147940834176 clip:1 note:F5 s:piano release:0.1 pan:0.606481481481 ]", + "[ (15/2 → 8/1) ⇝ 17/2 | gain:0.295881668351 clip:1 note:F5 s:piano release:0.1 pan:0.606481481481 ]", + "[ (15/2 → 8/1) ⇝ 17/2 | gain:0.147940834176 clip:1 note:G7 s:piano release:0.1 pan:0.726851851852 ]", + "[ (15/2 → 8/1) ⇝ 19/2 | gain:0.147940834176 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037 ]", + "[ (15/2 → 8/1) ⇝ 19/2 | gain:0.147940834176 clip:1 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ (15/2 → 8/1) ⇝ 19/2 | gain:0.147940834176 clip:1 note:Eb7 s:piano release:0.1 pan:0.708333333333 ]", + "[ 23/3 → 8/1 | clip:1 gain:1 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ 23/3 → 8/1 | clip:1 gain:0.25 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ (23/3 → 8/1) ⇝ 25/3 | gain:0.198599992484 clip:1 note:F4 s:piano release:0.1 pan:0.550925925926 ]", + "[ (47/6 → 8/1) ⇝ 49/6 | clip:1 gain:0.5 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ (47/6 → 8/1) ⇝ 49/6 | clip:1 gain:0.125 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ (47/6 → 8/1) ⇝ 17/2 | gain:0.29992534208 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037 ]", + "[ 15/2 ⇜ (8/1 → 49/6) | gain:0.147940834176 clip:1 note:D5 s:piano release:0.1 pan:0.592592592593 ]", + "[ 47/6 ⇜ (8/1 → 49/6) | clip:1 gain:0.5 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 47/6 ⇜ (8/1 → 49/6) | clip:1 gain:0.125 note:E6 s:piano release:0.1 pan:0.657407407407 ]", + "[ 23/3 ⇜ (8/1 → 25/3) | gain:0.198599992484 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037 ]", + "[ 8/1 → 25/3 | clip:1 gain:1 note:E6 s:piano release:0.1 pan:0.657407407407 ]", + "[ 8/1 → 25/3 | clip:1 gain:0.25 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 13/2 ⇜ (8/1 → 17/2) | gain:0.284112636814 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037 ]", + "[ 13/2 ⇜ (8/1 → 17/2) | gain:0.284112636814 clip:1 note:F4 s:piano release:0.1 pan:0.550925925926 ]", + "[ 13/2 ⇜ (8/1 → 17/2) | gain:0.284112636814 clip:1 note:C5 s:piano release:0.1 pan:0.583333333333 ]", + "[ 15/2 ⇜ (8/1 → 17/2) | gain:0.295881668351 clip:1 note:D5 s:piano release:0.1 pan:0.592592592593 ]", + "[ 15/2 ⇜ (8/1 → 17/2) | gain:0.147940834176 clip:1 note:E7 s:piano release:0.1 pan:0.712962962963 ]", + "[ 47/6 ⇜ (8/1 → 17/2) | gain:0.29992534208 clip:1 note:D3 s:piano release:0.1 pan:0.481481481481 ]", + "[ 8/1 → 26/3 | gain:0.60390843302 clip:1 note:D2 s:piano release:0.1 pan:0.425925925926 ]", + "[ 7/1 ⇜ (8/1 → 9/1) | gain:0.193269129197 clip:1 note:D5 s:piano release:0.1 pan:0.592592592593 ]", + "[ 7/1 ⇜ (8/1 → 9/1) | gain:0.193269129197 clip:1 note:F5 s:piano release:0.1 pan:0.606481481481 ]", + "[ 7/1 ⇜ (8/1 → 9/1) | gain:0.193269129197 clip:1 note:C6 s:piano release:0.1 pan:0.638888888889 ]", + "[ 15/2 ⇜ (8/1 → 9/1) ⇝ 19/2 | gain:0.147940834176 clip:1 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ 15/2 ⇜ (8/1 → 9/1) ⇝ 19/2 | gain:0.147940834176 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037 ]", + "[ 15/2 ⇜ (8/1 → 9/1) ⇝ 19/2 | gain:0.147940834176 clip:1 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ 8/1 → 9/1 | gain:0.60390843302 clip:1 note:E4 s:piano release:0.1 pan:0.546296296296 ]", + "[ 8/1 → 9/1 | gain:0.201302811007 clip:1 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ (8/1 → 9/1) ⇝ 10/1 | gain:0.60390843302 clip:1 note:D3 s:piano release:0.1 pan:0.481481481481 ]", + "[ (8/1 → 9/1) ⇝ 10/1 | gain:0.60390843302 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037 ]", + "[ (8/1 → 9/1) ⇝ 10/1 | gain:0.60390843302 clip:1 note:C4 s:piano release:0.1 pan:0.527777777778 ]", + "[ 49/6 → 17/2 | clip:1 gain:0.5 note:E6 s:piano release:0.1 pan:0.657407407407 ]", + "[ 49/6 → 17/2 | clip:1 gain:0.125 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 49/6 → 53/6 | gain:0.15199154547 clip:1 note:D5 s:piano release:0.1 pan:0.592592592593 ]", + "[ 25/3 → 26/3 | clip:1 gain:1 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 25/3 → 26/3 | clip:1 gain:0.25 note:E6 s:piano release:0.1 pan:0.657407407407 ]", + "[ 25/3 → 9/1 | gain:0.204005629529 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037 ]", + "[ 17/2 → 53/6 | clip:1 gain:0.5 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 17/2 → 53/6 | clip:1 gain:0.125 note:E6 s:piano release:0.1 pan:0.657407407407 ]", + "[ (17/2 → 9/1) ⇝ 55/6 | gain:0.308026764669 clip:1 note:D3 s:piano release:0.1 pan:0.481481481481 ]", + "[ (17/2 → 9/1) ⇝ 19/2 | gain:0.308026764669 clip:1 note:E5 s:piano release:0.1 pan:0.601851851852 ]", + "[ (17/2 → 9/1) ⇝ 19/2 | gain:0.154013382334 clip:1 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ (17/2 → 9/1) ⇝ 21/2 | gain:0.308026764669 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037 ]", + "[ (17/2 → 9/1) ⇝ 21/2 | gain:0.308026764669 clip:1 note:F4 s:piano release:0.1 pan:0.550925925926 ]", + "[ (17/2 → 9/1) ⇝ 21/2 | gain:0.308026764669 clip:1 note:C5 s:piano release:0.1 pan:0.583333333333 ]", + "[ 26/3 → 9/1 | clip:1 gain:1 note:E6 s:piano release:0.1 pan:0.657407407407 ]", + "[ 26/3 → 9/1 | clip:1 gain:0.25 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ (26/3 → 9/1) ⇝ 28/3 | gain:0.62006911703 clip:1 note:D2 s:piano release:0.1 pan:0.425925925926 ]", + "[ (53/6 → 9/1) ⇝ 55/6 | clip:1 gain:0.5 note:E6 s:piano release:0.1 pan:0.657407407407 ]", + "[ (53/6 → 9/1) ⇝ 55/6 | clip:1 gain:0.125 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ (53/6 → 9/1) ⇝ 19/2 | gain:0.156014179904 clip:1 note:D5 s:piano release:0.1 pan:0.592592592593 ]", + "[ 17/2 ⇜ (9/1 → 55/6) | gain:0.308026764669 clip:1 note:D3 s:piano release:0.1 pan:0.481481481481 ]", + "[ 53/6 ⇜ (9/1 → 55/6) | clip:1 gain:0.5 note:E6 s:piano release:0.1 pan:0.657407407407 ]", + "[ 53/6 ⇜ (9/1 → 55/6) | clip:1 gain:0.125 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 26/3 ⇜ (9/1 → 28/3) | gain:0.62006911703 clip:1 note:D2 s:piano release:0.1 pan:0.425925925926 ]", + "[ 9/1 → 28/3 | clip:1 gain:1 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 9/1 → 28/3 | clip:1 gain:0.25 note:E6 s:piano release:0.1 pan:0.657407407407 ]", + "[ 15/2 ⇜ (9/1 → 19/2) | gain:0.147940834176 clip:1 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ 15/2 ⇜ (9/1 → 19/2) | gain:0.147940834176 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037 ]", + "[ 15/2 ⇜ (9/1 → 19/2) | gain:0.147940834176 clip:1 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ 17/2 ⇜ (9/1 → 19/2) | gain:0.308026764669 clip:1 note:E5 s:piano release:0.1 pan:0.601851851852 ]", + "[ 17/2 ⇜ (9/1 → 19/2) | gain:0.154013382334 clip:1 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ 53/6 ⇜ (9/1 → 19/2) | gain:0.156014179904 clip:1 note:D5 s:piano release:0.1 pan:0.592592592593 ]", + "[ 9/1 → 29/3 | gain:0.209336492816 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037 ]", + "[ 8/1 ⇜ (9/1 → 10/1) | gain:0.60390843302 clip:1 note:D3 s:piano release:0.1 pan:0.481481481481 ]", + "[ 8/1 ⇜ (9/1 → 10/1) | gain:0.60390843302 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037 ]", + "[ 8/1 ⇜ (9/1 → 10/1) | gain:0.60390843302 clip:1 note:C4 s:piano release:0.1 pan:0.527777777778 ]", + "[ 17/2 ⇜ (9/1 → 10/1) ⇝ 21/2 | gain:0.308026764669 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037 ]", + "[ 17/2 ⇜ (9/1 → 10/1) ⇝ 21/2 | gain:0.308026764669 clip:1 note:F4 s:piano release:0.1 pan:0.550925925926 ]", + "[ 17/2 ⇜ (9/1 → 10/1) ⇝ 21/2 | gain:0.308026764669 clip:1 note:C5 s:piano release:0.1 pan:0.583333333333 ]", + "[ 9/1 → 10/1 | gain:0.628009478449 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037 ]", + "[ 9/1 → 10/1 | gain:0.209336492816 clip:1 note:E6 s:piano release:0.1 pan:0.657407407407 ]", + "[ (9/1 → 10/1) ⇝ 11/1 | gain:0.209336492816 clip:1 note:D5 s:piano release:0.1 pan:0.592592592593 ]", + "[ (9/1 → 10/1) ⇝ 11/1 | gain:0.209336492816 clip:1 note:F5 s:piano release:0.1 pan:0.606481481481 ]", + "[ (9/1 → 10/1) ⇝ 11/1 | gain:0.209336492816 clip:1 note:C6 s:piano release:0.1 pan:0.638888888889 ]", + "[ 55/6 → 19/2 | clip:1 gain:0.5 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 55/6 → 19/2 | clip:1 gain:0.125 note:E6 s:piano release:0.1 pan:0.657407407407 ]", + "[ 55/6 → 59/6 | gain:0.31596031332 clip:1 note:D3 s:piano release:0.1 pan:0.481481481481 ]", + "[ 28/3 → 29/3 | clip:1 gain:1 note:E6 s:piano release:0.1 pan:0.657407407407 ]", + "[ 28/3 → 29/3 | clip:1 gain:0.25 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 28/3 → 10/1 | gain:0.635783507405 clip:1 note:D2 s:piano release:0.1 pan:0.425925925926 ]", + "[ 19/2 → 59/6 | clip:1 gain:0.5 note:E6 s:piano release:0.1 pan:0.657407407407 ]", + "[ 19/2 → 59/6 | clip:1 gain:0.125 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ (19/2 → 10/1) ⇝ 61/6 | gain:0.159897898103 clip:1 note:D5 s:piano release:0.1 pan:0.592592592593 ]", + "[ (19/2 → 10/1) ⇝ 21/2 | gain:0.319795796206 clip:1 note:D5 s:piano release:0.1 pan:0.592592592593 ]", + "[ (19/2 → 10/1) ⇝ 21/2 | gain:0.159897898103 clip:1 note:E7 s:piano release:0.1 pan:0.712962962963 ]", + "[ (19/2 → 10/1) ⇝ 23/2 | gain:0.159897898103 clip:1 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ (19/2 → 10/1) ⇝ 23/2 | gain:0.159897898103 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037 ]", + "[ (19/2 → 10/1) ⇝ 23/2 | gain:0.159897898103 clip:1 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ 29/3 → 10/1 | clip:1 gain:1 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 29/3 → 10/1 | clip:1 gain:0.25 note:E6 s:piano release:0.1 pan:0.657407407407 ]", + "[ (29/3 → 10/1) ⇝ 31/3 | gain:0.214446166714 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037 ]", + "[ (59/6 → 10/1) ⇝ 61/6 | clip:1 gain:0.5 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ (59/6 → 10/1) ⇝ 61/6 | clip:1 gain:0.125 note:E6 s:piano release:0.1 pan:0.657407407407 ]", + "[ (59/6 → 10/1) ⇝ 21/2 | gain:0.323509007115 clip:1 note:D3 s:piano release:0.1 pan:0.481481481481 ]", + "[ 19/2 ⇜ (10/1 → 61/6) | gain:0.159897898103 clip:1 note:G5 s:piano release:0.1 pan:0.615740740741 ]", + "[ 59/6 ⇜ (10/1 → 61/6) | clip:1 gain:0.5 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ 59/6 ⇜ (10/1 → 61/6) | clip:1 gain:0.125 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 29/3 ⇜ (10/1 → 31/3) | gain:0.214446166714 clip:1 note:G4 s:piano release:0.1 pan:0.560185185185 ]", + "[ 10/1 → 31/3 | clip:1 gain:1 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 10/1 → 31/3 | clip:1 gain:0.25 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ 17/2 ⇜ (10/1 → 21/2) | gain:0.308026764669 clip:1 note:G4 s:piano release:0.1 pan:0.560185185185 ]", + "[ 17/2 ⇜ (10/1 → 21/2) | gain:0.308026764669 clip:1 note:B4 s:piano release:0.1 pan:0.578703703704 ]", + "[ 17/2 ⇜ (10/1 → 21/2) | gain:0.308026764669 clip:1 note:F5 s:piano release:0.1 pan:0.606481481481 ]", + "[ 19/2 ⇜ (10/1 → 21/2) | gain:0.319795796206 clip:1 note:G5 s:piano release:0.1 pan:0.615740740741 ]", + "[ 19/2 ⇜ (10/1 → 21/2) | gain:0.159897898103 clip:1 note:A7 s:piano release:0.1 pan:0.736111111111 ]", + "[ 59/6 ⇜ (10/1 → 21/2) | gain:0.323509007115 clip:1 note:G3 s:piano release:0.1 pan:0.50462962963 ]", + "[ 10/1 → 32/3 | gain:0.650624101821 clip:1 note:G2 s:piano release:0.1 pan:0.449074074074 ]", + "[ 9/1 ⇜ (10/1 → 11/1) | gain:0.209336492816 clip:1 note:G5 s:piano release:0.1 pan:0.615740740741 ]", + "[ 9/1 ⇜ (10/1 → 11/1) | gain:0.209336492816 clip:1 note:B5 s:piano release:0.1 pan:0.634259259259 ]", + "[ 9/1 ⇜ (10/1 → 11/1) | gain:0.209336492816 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037 ]", + "[ 19/2 ⇜ (10/1 → 11/1) ⇝ 23/2 | gain:0.159897898103 clip:1 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 19/2 ⇜ (10/1 → 11/1) ⇝ 23/2 | gain:0.159897898103 clip:1 note:B6 s:piano release:0.1 pan:0.689814814815 ]", + "[ 19/2 ⇜ (10/1 → 11/1) ⇝ 23/2 | gain:0.159897898103 clip:1 note:F7 s:piano release:0.1 pan:0.717592592593 ]", + "[ 10/1 → 11/1 | gain:0.650624101821 clip:1 note:A4 s:piano release:0.1 pan:0.569444444444 ]", + "[ 10/1 → 11/1 | gain:0.216874700607 clip:1 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ (10/1 → 11/1) ⇝ 12/1 | gain:0.650624101821 clip:1 note:G3 s:piano release:0.1 pan:0.50462962963 ]", + "[ (10/1 → 11/1) ⇝ 12/1 | gain:0.650624101821 clip:1 note:B3 s:piano release:0.1 pan:0.523148148148 ]", + "[ (10/1 → 11/1) ⇝ 12/1 | gain:0.650624101821 clip:1 note:F4 s:piano release:0.1 pan:0.550925925926 ]", + "[ 61/6 → 21/2 | clip:1 gain:0.5 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 61/6 → 21/2 | clip:1 gain:0.125 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ 61/6 → 65/6 | gain:0.16353773298 clip:1 note:G5 s:piano release:0.1 pan:0.615740740741 ]", + "[ 31/3 → 32/3 | clip:1 gain:1 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ 31/3 → 32/3 | clip:1 gain:0.25 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 31/3 → 11/1 | gain:0.219197631247 clip:1 note:G4 s:piano release:0.1 pan:0.560185185185 ]", + "[ 21/2 → 65/6 | clip:1 gain:0.5 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ 21/2 → 65/6 | clip:1 gain:0.125 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ (21/2 → 11/1) ⇝ 67/6 | gain:0.330472307531 clip:1 note:G3 s:piano release:0.1 pan:0.50462962963 ]", + "[ (21/2 → 11/1) ⇝ 23/2 | gain:0.330472307531 clip:1 note:A5 s:piano release:0.1 pan:0.625 ]", + "[ (21/2 → 11/1) ⇝ 23/2 | gain:0.165236153766 clip:1 note:G7 s:piano release:0.1 pan:0.726851851852 ]", + "[ (21/2 → 11/1) ⇝ 25/2 | gain:0.330472307531 clip:1 note:G4 s:piano release:0.1 pan:0.560185185185 ]", + "[ (21/2 → 11/1) ⇝ 25/2 | gain:0.330472307531 clip:1 note:B4 s:piano release:0.1 pan:0.578703703704 ]", + "[ (21/2 → 11/1) ⇝ 25/2 | gain:0.330472307531 clip:1 note:F5 s:piano release:0.1 pan:0.606481481481 ]", + "[ 32/3 → 11/1 | clip:1 gain:1 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 32/3 → 11/1 | clip:1 gain:0.25 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ (32/3 → 11/1) ⇝ 34/3 | gain:0.664200980575 clip:1 note:G2 s:piano release:0.1 pan:0.449074074074 ]", + "[ (65/6 → 11/1) ⇝ 67/6 | clip:1 gain:0.5 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ (65/6 → 11/1) ⇝ 67/6 | clip:1 gain:0.125 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ (65/6 → 11/1) ⇝ 23/2 | gain:0.166839287557 clip:1 note:G5 s:piano release:0.1 pan:0.615740740741 ]", + "[ 21/2 ⇜ (11/1 → 67/6) | gain:0.330472307531 clip:1 note:G3 s:piano release:0.1 pan:0.50462962963 ]", + "[ 65/6 ⇜ (11/1 → 67/6) | clip:1 gain:0.5 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 65/6 ⇜ (11/1 → 67/6) | clip:1 gain:0.125 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ 32/3 ⇜ (11/1 → 34/3) | gain:0.664200980575 clip:1 note:G2 s:piano release:0.1 pan:0.449074074074 ]", + "[ 11/1 → 34/3 | clip:1 gain:1 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ 11/1 → 34/3 | clip:1 gain:0.25 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 19/2 ⇜ (11/1 → 23/2) | gain:0.159897898103 clip:1 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 19/2 ⇜ (11/1 → 23/2) | gain:0.159897898103 clip:1 note:B6 s:piano release:0.1 pan:0.689814814815 ]", + "[ 19/2 ⇜ (11/1 → 23/2) | gain:0.159897898103 clip:1 note:F7 s:piano release:0.1 pan:0.717592592593 ]", + "[ 21/2 ⇜ (11/1 → 23/2) | gain:0.330472307531 clip:1 note:A5 s:piano release:0.1 pan:0.625 ]", + "[ 21/2 ⇜ (11/1 → 23/2) | gain:0.165236153766 clip:1 note:G7 s:piano release:0.1 pan:0.726851851852 ]", + "[ 65/6 ⇜ (11/1 → 23/2) | gain:0.166839287557 clip:1 note:G5 s:piano release:0.1 pan:0.615740740741 ]", + "[ 11/1 → 35/3 | gain:0.223469525865 clip:1 note:G4 s:piano release:0.1 pan:0.560185185185 ]", + "[ 10/1 ⇜ (11/1 → 12/1) | gain:0.650624101821 clip:1 note:G3 s:piano release:0.1 pan:0.50462962963 ]", + "[ 10/1 ⇜ (11/1 → 12/1) | gain:0.650624101821 clip:1 note:B3 s:piano release:0.1 pan:0.523148148148 ]", + "[ 10/1 ⇜ (11/1 → 12/1) | gain:0.650624101821 clip:1 note:F4 s:piano release:0.1 pan:0.550925925926 ]", + "[ 21/2 ⇜ (11/1 → 12/1) ⇝ 25/2 | gain:0.330472307531 clip:1 note:G4 s:piano release:0.1 pan:0.560185185185 ]", + "[ 21/2 ⇜ (11/1 → 12/1) ⇝ 25/2 | gain:0.330472307531 clip:1 note:B4 s:piano release:0.1 pan:0.578703703704 ]", + "[ 21/2 ⇜ (11/1 → 12/1) ⇝ 25/2 | gain:0.330472307531 clip:1 note:F5 s:piano release:0.1 pan:0.606481481481 ]", + "[ 11/1 → 12/1 | gain:0.670408577595 clip:1 note:G4 s:piano release:0.1 pan:0.560185185185 ]", + "[ 11/1 → 12/1 | gain:0.223469525865 clip:1 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ (11/1 → 12/1) ⇝ 13/1 | gain:0.223469525865 clip:1 note:G5 s:piano release:0.1 pan:0.615740740741 ]", + "[ (11/1 → 12/1) ⇝ 13/1 | gain:0.223469525865 clip:1 note:B5 s:piano release:0.1 pan:0.634259259259 ]", + "[ (11/1 → 12/1) ⇝ 13/1 | gain:0.223469525865 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037 ]", + "[ 67/6 → 23/2 | clip:1 gain:0.5 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ 67/6 → 23/2 | clip:1 gain:0.125 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 67/6 → 71/6 | gain:0.336675514101 clip:1 note:G3 s:piano release:0.1 pan:0.50462962963 ]", + "[ 34/3 → 35/3 | clip:1 gain:1 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 34/3 → 35/3 | clip:1 gain:0.25 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ 34/3 → 12/1 | gain:0.676180597899 clip:1 note:G2 s:piano release:0.1 pan:0.449074074074 ]", + "[ 23/2 → 71/6 | clip:1 gain:0.5 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 23/2 → 71/6 | clip:1 gain:0.125 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ (23/2 → 12/1) ⇝ 73/6 | gain:0.1697234328 clip:1 note:G5 s:piano release:0.1 pan:0.615740740741 ]", + "[ (23/2 → 12/1) ⇝ 25/2 | gain:0.339446865601 clip:1 note:G5 s:piano release:0.1 pan:0.615740740741 ]", + "[ (23/2 → 12/1) ⇝ 25/2 | gain:0.1697234328 clip:1 note:A7 s:piano release:0.1 pan:0.736111111111 ]", + "[ (23/2 → 12/1) ⇝ 27/2 | gain:0.1697234328 clip:1 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ (23/2 → 12/1) ⇝ 27/2 | gain:0.1697234328 clip:1 note:B6 s:piano release:0.1 pan:0.689814814815 ]", + "[ (23/2 → 12/1) ⇝ 27/2 | gain:0.1697234328 clip:1 note:F7 s:piano release:0.1 pan:0.717592592593 ]", + "[ 35/3 → 12/1 | clip:1 gain:1 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ 35/3 → 12/1 | clip:1 gain:0.25 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ (35/3 → 12/1) ⇝ 37/3 | gain:0.227162413214 clip:1 note:G4 s:piano release:0.1 pan:0.560185185185 ]", + "[ (71/6 → 12/1) ⇝ 73/6 | clip:1 gain:0.5 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ (71/6 → 12/1) ⇝ 73/6 | clip:1 gain:0.125 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ (71/6 → 12/1) ⇝ 25/2 | gain:0.341979160062 clip:1 note:G3 s:piano release:0.1 pan:0.50462962963 ]", + "[ 23/2 ⇜ (12/1 → 73/6) | gain:0.1697234328 clip:1 note:C5 s:piano release:0.1 pan:0.583333333333 ]", + "[ 71/6 ⇜ (12/1 → 73/6) | clip:1 gain:0.5 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 71/6 ⇜ (12/1 → 73/6) | clip:1 gain:0.125 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ 35/3 ⇜ (12/1 → 37/3) | gain:0.227162413214 clip:1 note:C4 s:piano release:0.1 pan:0.527777777778 ]", + "[ 12/1 → 37/3 | clip:1 gain:1 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ 12/1 → 37/3 | clip:1 gain:0.25 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 21/2 ⇜ (12/1 → 25/2) | gain:0.330472307531 clip:1 note:C4 s:piano release:0.1 pan:0.527777777778 ]", + "[ 21/2 ⇜ (12/1 → 25/2) | gain:0.330472307531 clip:1 note:Eb4 s:piano release:0.1 pan:0.541666666667 ]", + "[ 21/2 ⇜ (12/1 → 25/2) | gain:0.330472307531 clip:1 note:Bb4 s:piano release:0.1 pan:0.574074074074 ]", + "[ 23/2 ⇜ (12/1 → 25/2) | gain:0.339446865601 clip:1 note:C5 s:piano release:0.1 pan:0.583333333333 ]", + "[ 23/2 ⇜ (12/1 → 25/2) | gain:0.1697234328 clip:1 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ 71/6 ⇜ (12/1 → 25/2) | gain:0.341979160062 clip:1 note:C3 s:piano release:0.1 pan:0.472222222222 ]", + "[ 12/1 → 38/3 | gain:0.686304573267 clip:1 note:C2 s:piano release:0.1 pan:0.416666666667 ]", + "[ 11/1 ⇜ (12/1 → 13/1) | gain:0.223469525865 clip:1 note:C5 s:piano release:0.1 pan:0.583333333333 ]", + "[ 11/1 ⇜ (12/1 → 13/1) | gain:0.223469525865 clip:1 note:Eb5 s:piano release:0.1 pan:0.597222222222 ]", + "[ 11/1 ⇜ (12/1 → 13/1) | gain:0.223469525865 clip:1 note:Bb5 s:piano release:0.1 pan:0.62962962963 ]", + "[ 23/2 ⇜ (12/1 → 13/1) ⇝ 27/2 | gain:0.1697234328 clip:1 note:C6 s:piano release:0.1 pan:0.638888888889 ]", + "[ 23/2 ⇜ (12/1 → 13/1) ⇝ 27/2 | gain:0.1697234328 clip:1 note:Eb6 s:piano release:0.1 pan:0.652777777778 ]", + "[ 23/2 ⇜ (12/1 → 13/1) ⇝ 27/2 | gain:0.1697234328 clip:1 note:Bb6 s:piano release:0.1 pan:0.685185185185 ]", + "[ 12/1 → 13/1 | gain:0.686304573267 clip:1 note:D4 s:piano release:0.1 pan:0.537037037037 ]", + "[ 12/1 → 13/1 | gain:0.228768191089 clip:1 note:C6 s:piano release:0.1 pan:0.638888888889 ]", + "[ (12/1 → 13/1) ⇝ 14/1 | gain:0.686304573267 clip:1 note:C3 s:piano release:0.1 pan:0.472222222222 ]", + "[ (12/1 → 13/1) ⇝ 14/1 | gain:0.686304573267 clip:1 note:Eb3 s:piano release:0.1 pan:0.486111111111 ]", + "[ (12/1 → 13/1) ⇝ 14/1 | gain:0.686304573267 clip:1 note:Bb3 s:piano release:0.1 pan:0.518518518519 ]", + "[ 73/6 → 25/2 | clip:1 gain:0.5 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ 73/6 → 25/2 | clip:1 gain:0.125 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 73/6 → 77/6 | gain:0.17213100544 clip:1 note:C5 s:piano release:0.1 pan:0.583333333333 ]", + "[ 37/3 → 38/3 | clip:1 gain:1 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 37/3 → 38/3 | clip:1 gain:0.25 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ 37/3 → 13/1 | gain:0.230205042908 clip:1 note:C4 s:piano release:0.1 pan:0.527777777778 ]", + "[ 25/2 → 77/6 | clip:1 gain:0.5 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 25/2 → 77/6 | clip:1 gain:0.125 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ (25/2 → 13/1) ⇝ 79/6 | gain:0.346288408018 clip:1 note:C3 s:piano release:0.1 pan:0.472222222222 ]", + "[ (25/2 → 13/1) ⇝ 27/2 | gain:0.346288408018 clip:1 note:D5 s:piano release:0.1 pan:0.592592592593 ]", + "[ (25/2 → 13/1) ⇝ 27/2 | gain:0.173144204009 clip:1 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ (25/2 → 13/1) ⇝ 29/2 | gain:0.346288408018 clip:1 note:C4 s:piano release:0.1 pan:0.527777777778 ]", + "[ (25/2 → 13/1) ⇝ 29/2 | gain:0.346288408018 clip:1 note:Eb4 s:piano release:0.1 pan:0.541666666667 ]", + "[ (25/2 → 13/1) ⇝ 29/2 | gain:0.346288408018 clip:1 note:Bb4 s:piano release:0.1 pan:0.574074074074 ]", + "[ 38/3 → 13/1 | clip:1 gain:1 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ 38/3 → 13/1 | clip:1 gain:0.25 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ (38/3 → 13/1) ⇝ 40/3 | gain:0.694408482707 clip:1 note:C2 s:piano release:0.1 pan:0.416666666667 ]", + "[ (77/6 → 13/1) ⇝ 79/6 | clip:1 gain:0.5 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ (77/6 → 13/1) ⇝ 79/6 | clip:1 gain:0.125 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ (77/6 → 13/1) ⇝ 27/2 | gain:0.174027505805 clip:1 note:C5 s:piano release:0.1 pan:0.583333333333 ]", + "[ 25/2 ⇜ (13/1 → 79/6) | gain:0.346288408018 clip:1 note:C3 s:piano release:0.1 pan:0.472222222222 ]", + "[ 77/6 ⇜ (13/1 → 79/6) | clip:1 gain:0.5 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ 77/6 ⇜ (13/1 → 79/6) | clip:1 gain:0.125 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 38/3 ⇜ (13/1 → 40/3) | gain:0.694408482707 clip:1 note:C2 s:piano release:0.1 pan:0.416666666667 ]", + "[ 13/1 → 40/3 | clip:1 gain:1 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 13/1 → 40/3 | clip:1 gain:0.25 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ 23/2 ⇜ (13/1 → 27/2) | gain:0.1697234328 clip:1 note:C6 s:piano release:0.1 pan:0.638888888889 ]", + "[ 23/2 ⇜ (13/1 → 27/2) | gain:0.1697234328 clip:1 note:Eb6 s:piano release:0.1 pan:0.652777777778 ]", + "[ 23/2 ⇜ (13/1 → 27/2) | gain:0.1697234328 clip:1 note:Bb6 s:piano release:0.1 pan:0.685185185185 ]", + "[ 25/2 ⇜ (13/1 → 27/2) | gain:0.346288408018 clip:1 note:D5 s:piano release:0.1 pan:0.592592592593 ]", + "[ 25/2 ⇜ (13/1 → 27/2) | gain:0.173144204009 clip:1 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ 77/6 ⇜ (13/1 → 27/2) | gain:0.174027505805 clip:1 note:C5 s:piano release:0.1 pan:0.583333333333 ]", + "[ 13/1 → 41/3 | gain:0.232560615295 clip:1 note:C4 s:piano release:0.1 pan:0.527777777778 ]", + "[ 12/1 ⇜ (13/1 → 14/1) | gain:0.686304573267 clip:1 note:C3 s:piano release:0.1 pan:0.472222222222 ]", + "[ 12/1 ⇜ (13/1 → 14/1) | gain:0.686304573267 clip:1 note:Eb3 s:piano release:0.1 pan:0.486111111111 ]", + "[ 12/1 ⇜ (13/1 → 14/1) | gain:0.686304573267 clip:1 note:Bb3 s:piano release:0.1 pan:0.518518518519 ]", + "[ 25/2 ⇜ (13/1 → 14/1) ⇝ 29/2 | gain:0.346288408018 clip:1 note:C4 s:piano release:0.1 pan:0.527777777778 ]", + "[ 25/2 ⇜ (13/1 → 14/1) ⇝ 29/2 | gain:0.346288408018 clip:1 note:Eb4 s:piano release:0.1 pan:0.541666666667 ]", + "[ 25/2 ⇜ (13/1 → 14/1) ⇝ 29/2 | gain:0.346288408018 clip:1 note:Bb4 s:piano release:0.1 pan:0.574074074074 ]", + "[ 13/1 → 14/1 | gain:0.697681845884 clip:1 note:C4 s:piano release:0.1 pan:0.527777777778 ]", + "[ 13/1 → 14/1 | gain:0.232560615295 clip:1 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ (13/1 → 14/1) ⇝ 15/1 | gain:0.232560615295 clip:1 note:C5 s:piano release:0.1 pan:0.583333333333 ]", + "[ (13/1 → 14/1) ⇝ 15/1 | gain:0.232560615295 clip:1 note:Eb5 s:piano release:0.1 pan:0.597222222222 ]", + "[ (13/1 → 14/1) ⇝ 15/1 | gain:0.232560615295 clip:1 note:Bb5 s:piano release:0.1 pan:0.62962962963 ]", + "[ 79/6 → 27/2 | clip:1 gain:0.5 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 79/6 → 27/2 | clip:1 gain:0.125 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ 79/6 → 83/6 | gain:0.349562445589 clip:1 note:C3 s:piano release:0.1 pan:0.472222222222 ]", + "[ 40/3 → 41/3 | clip:1 gain:1 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ 40/3 → 41/3 | clip:1 gain:0.25 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 40/3 → 14/1 | gain:0.700440650116 clip:1 note:C2 s:piano release:0.1 pan:0.416666666667 ]", + "[ 27/2 → 83/6 | clip:1 gain:0.5 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ 27/2 → 83/6 | clip:1 gain:0.125 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ (27/2 → 14/1) ⇝ 85/6 | gain:0.175407795646 clip:1 note:C5 s:piano release:0.1 pan:0.583333333333 ]", + "[ (27/2 → 14/1) ⇝ 29/2 | gain:0.350815591291 clip:1 note:C5 s:piano release:0.1 pan:0.583333333333 ]", + "[ (27/2 → 14/1) ⇝ 29/2 | gain:0.175407795646 clip:1 note:D7 s:piano release:0.1 pan:0.703703703704 ]", + "[ (27/2 → 14/1) ⇝ 31/2 | gain:0.175407795646 clip:1 note:C6 s:piano release:0.1 pan:0.638888888889 ]", + "[ (27/2 → 14/1) ⇝ 31/2 | gain:0.175407795646 clip:1 note:Eb6 s:piano release:0.1 pan:0.652777777778 ]", + "[ (27/2 → 14/1) ⇝ 31/2 | gain:0.175407795646 clip:1 note:Bb6 s:piano release:0.1 pan:0.685185185185 ]", + "[ 41/3 → 14/1 | clip:1 gain:1 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 41/3 → 14/1 | clip:1 gain:0.25 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ (41/3 → 14/1) ⇝ 43/3 | gain:0.234233045231 clip:1 note:C4 s:piano release:0.1 pan:0.527777777778 ]", + "[ (83/6 → 14/1) ⇝ 85/6 | clip:1 gain:0.5 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ (83/6 → 14/1) ⇝ 85/6 | clip:1 gain:0.125 note:D6 s:piano release:0.1 pan:0.648148148148 ]", + "[ (83/6 → 14/1) ⇝ 29/2 | gain:0.351823881073 clip:1 note:C3 s:piano release:0.1 pan:0.472222222222 ]", + "[ 27/2 ⇜ (14/1 → 85/6) | gain:0.175407795646 clip:1 note:F5 s:piano release:0.1 pan:0.606481481481 ]", + "[ 83/6 ⇜ (14/1 → 85/6) | clip:1 gain:0.5 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ 83/6 ⇜ (14/1 → 85/6) | clip:1 gain:0.125 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 41/3 ⇜ (14/1 → 43/3) | gain:0.234233045231 clip:1 note:F4 s:piano release:0.1 pan:0.550925925926 ]", + "[ 14/1 → 43/3 | clip:1 gain:1 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 14/1 → 43/3 | clip:1 gain:0.25 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ 25/2 ⇜ (14/1 → 29/2) | gain:0.346288408018 clip:1 note:F4 s:piano release:0.1 pan:0.550925925926 ]", + "[ 25/2 ⇜ (14/1 → 29/2) | gain:0.346288408018 clip:1 note:A4 s:piano release:0.1 pan:0.569444444444 ]", + "[ 25/2 ⇜ (14/1 → 29/2) | gain:0.346288408018 clip:1 note:Eb5 s:piano release:0.1 pan:0.597222222222 ]", + "[ 27/2 ⇜ (14/1 → 29/2) | gain:0.350815591291 clip:1 note:F5 s:piano release:0.1 pan:0.606481481481 ]", + "[ 27/2 ⇜ (14/1 → 29/2) | gain:0.175407795646 clip:1 note:G7 s:piano release:0.1 pan:0.726851851852 ]", + "[ 83/6 ⇜ (14/1 → 29/2) | gain:0.351823881073 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037 ]", + "[ 14/1 → 44/3 | gain:0.704480938564 clip:1 note:F2 s:piano release:0.1 pan:0.439814814815 ]", + "[ 13/1 ⇜ (14/1 → 15/1) | gain:0.232560615295 clip:1 note:F5 s:piano release:0.1 pan:0.606481481481 ]", + "[ 13/1 ⇜ (14/1 → 15/1) | gain:0.232560615295 clip:1 note:A5 s:piano release:0.1 pan:0.625 ]", + "[ 13/1 ⇜ (14/1 → 15/1) | gain:0.232560615295 clip:1 note:Eb6 s:piano release:0.1 pan:0.652777777778 ]", + "[ 27/2 ⇜ (14/1 → 15/1) ⇝ 31/2 | gain:0.175407795646 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037 ]", + "[ 27/2 ⇜ (14/1 → 15/1) ⇝ 31/2 | gain:0.175407795646 clip:1 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 27/2 ⇜ (14/1 → 15/1) ⇝ 31/2 | gain:0.175407795646 clip:1 note:Eb7 s:piano release:0.1 pan:0.708333333333 ]", + "[ 14/1 → 15/1 | gain:0.704480938564 clip:1 note:G4 s:piano release:0.1 pan:0.560185185185 ]", + "[ 14/1 → 15/1 | gain:0.234826979521 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037 ]", + "[ (14/1 → 15/1) ⇝ 16/1 | gain:0.704480938564 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037 ]", + "[ (14/1 → 15/1) ⇝ 16/1 | gain:0.704480938564 clip:1 note:A3 s:piano release:0.1 pan:0.513888888889 ]", + "[ (14/1 → 15/1) ⇝ 16/1 | gain:0.704480938564 clip:1 note:Eb4 s:piano release:0.1 pan:0.541666666667 ]", + "[ 85/6 → 29/2 | clip:1 gain:0.5 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 85/6 → 29/2 | clip:1 gain:0.125 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ 85/6 → 89/6 | gain:0.176300795964 clip:1 note:F5 s:piano release:0.1 pan:0.606481481481 ]", + "[ 43/3 → 44/3 | clip:1 gain:1 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ 43/3 → 44/3 | clip:1 gain:0.25 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 43/3 → 15/1 | gain:0.235273225852 clip:1 note:F4 s:piano release:0.1 pan:0.550925925926 ]", + "[ 29/2 → 89/6 | clip:1 gain:0.5 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ 29/2 → 89/6 | clip:1 gain:0.125 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ (29/2 → 15/1) ⇝ 91/6 | gain:0.353168139095 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037 ]", + "[ (29/2 → 15/1) ⇝ 31/2 | gain:0.353168139095 clip:1 note:G5 s:piano release:0.1 pan:0.615740740741 ]", + "[ (29/2 → 15/1) ⇝ 31/2 | gain:0.176584069547 clip:1 note:F7 s:piano release:0.1 pan:0.717592592593 ]", + "[ (29/2 → 15/1) ⇝ 33/2 | gain:0.353168139095 clip:1 note:F4 s:piano release:0.1 pan:0.550925925926 ]", + "[ (29/2 → 15/1) ⇝ 33/2 | gain:0.353168139095 clip:1 note:A4 s:piano release:0.1 pan:0.569444444444 ]", + "[ (29/2 → 15/1) ⇝ 33/2 | gain:0.353168139095 clip:1 note:Eb5 s:piano release:0.1 pan:0.597222222222 ]", + "[ 44/3 → 15/1 | clip:1 gain:1 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 44/3 → 15/1 | clip:1 gain:0.25 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ (44/3 → 15/1) ⇝ 46/3 | gain:0.706759541611 clip:1 note:F2 s:piano release:0.1 pan:0.439814814815 ]", + "[ (89/6 → 15/1) ⇝ 91/6 | clip:1 gain:0.5 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ (89/6 → 15/1) ⇝ 91/6 | clip:1 gain:0.125 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ (89/6 → 15/1) ⇝ 31/2 | gain:0.17677418484 clip:1 note:F5 s:piano release:0.1 pan:0.606481481481 ]", + "[ 29/2 ⇜ (15/1 → 91/6) | gain:0.353168139095 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037 ]", + "[ 89/6 ⇜ (15/1 → 91/6) | clip:1 gain:0.5 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 89/6 ⇜ (15/1 → 91/6) | clip:1 gain:0.125 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ 44/3 ⇜ (15/1 → 46/3) | gain:0.706759541611 clip:1 note:F2 s:piano release:0.1 pan:0.439814814815 ]", + "[ 15/1 → 46/3 | clip:1 gain:1 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ 15/1 → 46/3 | clip:1 gain:0.25 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 27/2 ⇜ (15/1 → 31/2) | gain:0.175407795646 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037 ]", + "[ 27/2 ⇜ (15/1 → 31/2) | gain:0.175407795646 clip:1 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ 27/2 ⇜ (15/1 → 31/2) | gain:0.175407795646 clip:1 note:Eb7 s:piano release:0.1 pan:0.708333333333 ]", + "[ 29/2 ⇜ (15/1 → 31/2) | gain:0.353168139095 clip:1 note:G5 s:piano release:0.1 pan:0.615740740741 ]", + "[ 29/2 ⇜ (15/1 → 31/2) | gain:0.176584069547 clip:1 note:F7 s:piano release:0.1 pan:0.717592592593 ]", + "[ 89/6 ⇜ (15/1 → 31/2) | gain:0.17677418484 clip:1 note:F5 s:piano release:0.1 pan:0.606481481481 ]", + "[ 15/1 → 47/3 | gain:0.235785292338 clip:1 note:F4 s:piano release:0.1 pan:0.550925925926 ]", + "[ 14/1 ⇜ (15/1 → 16/1) | gain:0.704480938564 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037 ]", + "[ 14/1 ⇜ (15/1 → 16/1) | gain:0.704480938564 clip:1 note:A3 s:piano release:0.1 pan:0.513888888889 ]", + "[ 14/1 ⇜ (15/1 → 16/1) | gain:0.704480938564 clip:1 note:Eb4 s:piano release:0.1 pan:0.541666666667 ]", + "[ 29/2 ⇜ (15/1 → 16/1) ⇝ 33/2 | gain:0.353168139095 clip:1 note:F4 s:piano release:0.1 pan:0.550925925926 ]", + "[ 29/2 ⇜ (15/1 → 16/1) ⇝ 33/2 | gain:0.353168139095 clip:1 note:A4 s:piano release:0.1 pan:0.569444444444 ]", + "[ 29/2 ⇜ (15/1 → 16/1) ⇝ 33/2 | gain:0.353168139095 clip:1 note:Eb5 s:piano release:0.1 pan:0.597222222222 ]", + "[ 15/1 → 16/1 | gain:0.707355877013 clip:1 note:F4 s:piano release:0.1 pan:0.550925925926 ]", + "[ 15/1 → 16/1 | gain:0.235785292338 clip:1 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ (15/1 → 16/1) ⇝ 17/1 | gain:0.235785292338 clip:1 note:F5 s:piano release:0.1 pan:0.606481481481 ]", + "[ (15/1 → 16/1) ⇝ 17/1 | gain:0.235785292338 clip:1 note:A5 s:piano release:0.1 pan:0.625 ]", + "[ (15/1 → 16/1) ⇝ 17/1 | gain:0.235785292338 clip:1 note:Eb6 s:piano release:0.1 pan:0.652777777778 ]", + "[ 91/6 → 31/2 | clip:1 gain:0.5 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ 91/6 → 31/2 | clip:1 gain:0.125 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 91/6 → 95/6 | gain:0.353772856265 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037 ]", + "[ 46/3 → 47/3 | clip:1 gain:1 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 46/3 → 47/3 | clip:1 gain:0.25 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ 46/3 → 16/1 | gain:0.707675774614 clip:1 note:F2 s:piano release:0.1 pan:0.439814814815 ]", + "[ 31/2 → 95/6 | clip:1 gain:0.5 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ 31/2 → 95/6 | clip:1 gain:0.125 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ (31/2 → 16/1) ⇝ 97/6 | gain:0.176939095262 clip:1 note:F5 s:piano release:0.1 pan:0.606481481481 ]", + "[ (31/2 → 16/1) ⇝ 33/2 | gain:0.353878190525 clip:1 note:F5 s:piano release:0.1 pan:0.606481481481 ]", + "[ (31/2 → 16/1) ⇝ 33/2 | gain:0.176939095262 clip:1 note:G7 s:piano release:0.1 pan:0.726851851852 ]", + "[ (31/2 → 16/1) ⇝ 35/2 | gain:0.176939095262 clip:1 note:F6 s:piano release:0.1 pan:0.662037037037 ]", + "[ (31/2 → 16/1) ⇝ 35/2 | gain:0.176939095262 clip:1 note:A6 s:piano release:0.1 pan:0.680555555556 ]", + "[ (31/2 → 16/1) ⇝ 35/2 | gain:0.176939095262 clip:1 note:Eb7 s:piano release:0.1 pan:0.708333333333 ]", + "[ 47/3 → 16/1 | clip:1 gain:1 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ 47/3 → 16/1 | clip:1 gain:0.25 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ (47/3 → 16/1) ⇝ 49/3 | gain:0.235932885688 clip:1 note:F4 s:piano release:0.1 pan:0.550925925926 ]", + "[ (95/6 → 16/1) ⇝ 97/6 | clip:1 gain:0.5 note:C7 s:piano release:0.1 pan:0.694444444444 ]", + "[ (95/6 → 16/1) ⇝ 97/6 | clip:1 gain:0.125 note:G6 s:piano release:0.1 pan:0.671296296296 ]", + "[ (95/6 → 16/1) ⇝ 33/2 | gain:0.353907276838 clip:1 note:F3 s:piano release:0.1 pan:0.49537037037 ]", ] `; @@ -6897,20 +6897,20 @@ exports[`renders tunes > tune: flatrave 1`] = ` [ "[ 0/1 → 1/8 | s:hh n:1 speed:0.5 delay:0.5 end:0.02 bank:RolandTR909 room:0.5 gain:0.4 ]", "[ 0/1 → 1/2 | s:bd bank:RolandTR909 ]", - "[ 1/8 → 1/4 | s:hh n:1 end:0.02000058072071123 bank:RolandTR909 room:0.5 gain:0.4 ]", - "[ 1/8 → 1/4 | s:hh n:1 end:0.02000058072071123 bank:RolandTR909 room:0.5 gain:0.4 ]", + "[ 1/8 → 1/4 | s:hh n:1 end:0.020000580721 bank:RolandTR909 room:0.5 gain:0.4 ]", + "[ 1/8 → 1/4 | s:hh n:1 end:0.020000580721 bank:RolandTR909 room:0.5 gain:0.4 ]", "[ 1/8 → 1/4 | note:G1 s:sawtooth decay:0.1 sustain:0 lpattack:0.1 lpenv:-4 cutoff:800 resonance:8 ]", - "[ 1/4 → 3/8 | s:hh n:1 end:0.02000453637431655 bank:RolandTR909 room:0.5 gain:0.4 ]", - "[ 1/4 → 3/8 | s:hh n:1 end:0.02000453637431655 bank:RolandTR909 room:0.5 gain:0.4 ]", + "[ 1/4 → 3/8 | s:hh n:1 end:0.020004536374 bank:RolandTR909 room:0.5 gain:0.4 ]", + "[ 1/4 → 3/8 | s:hh n:1 end:0.020004536374 bank:RolandTR909 room:0.5 gain:0.4 ]", "[ 1/4 → 3/8 | note:G1 s:sawtooth decay:0.1 sustain:0 lpattack:0.1 lpenv:-4 cutoff:800 resonance:8 ]", - "[ 3/8 → 1/2 | s:hh n:1 end:0.02001494577056579 bank:RolandTR909 room:0.5 gain:0.4 ]", + "[ 3/8 → 1/2 | s:hh n:1 end:0.020014945771 bank:RolandTR909 room:0.5 gain:0.4 ]", "[ 1/2 → 5/8 | note:G1 s:sawtooth decay:0.1 sustain:0 lpattack:0.1 lpenv:-4 cutoff:800 resonance:8 ]", "[ 1/2 → 1/1 | s:bd bank:RolandTR909 ]", "[ 1/2 → 1/1 | s:cp bank:RolandTR909 ]", "[ 1/2 → 1/1 | s:sd bank:RolandTR909 ]", "[ 5/8 → 3/4 | note:G1 s:sawtooth decay:0.1 sustain:0 lpattack:0.1 lpenv:-4 cutoff:800 resonance:8 ]", - "[ 7/8 → 1/1 | s:hh n:1 end:0.020171942481159617 bank:RolandTR909 room:0.5 gain:0.4 ]", - "[ 7/8 → 1/1 | s:hh n:1 end:0.020171942481159617 bank:RolandTR909 room:0.5 gain:0.4 ]", + "[ 7/8 → 1/1 | s:hh n:1 end:0.020171942481 bank:RolandTR909 room:0.5 gain:0.4 ]", + "[ 7/8 → 1/1 | s:hh n:1 end:0.020171942481 bank:RolandTR909 room:0.5 gain:0.4 ]", "[ 7/8 → 1/1 | note:G1 s:sawtooth decay:0.1 sustain:0 lpattack:0.1 lpenv:-4 cutoff:800 resonance:8 ]", ] `; @@ -7069,118 +7069,118 @@ exports[`renders tunes > tune: giantSteps 1`] = ` exports[`renders tunes > tune: goodTimes 1`] = ` [ - "[ 0/1 → 1/4 | note:52 gain:0.48 clip:2 s:piano release:0.1 pan:0.4907407407407407 ]", - "[ 1/4 → 1/2 | note:40 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.4351851851851852 ]", - "[ 1/2 → 3/4 | note:52 gain:0.48 clip:2 s:piano release:0.1 pan:0.4907407407407407 ]", - "[ 1/2 → 3/4 | note:55 gain:0.48 clip:2 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 1/2 → 3/4 | note:59 gain:0.48 clip:2 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 1/2 → 3/4 | note:40 gain:0.48 clip:2 s:piano release:0.1 pan:0.4351851851851852 ]", - "[ 1/1 → 5/4 | note:55 gain:0.48 clip:2 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 1/1 → 5/4 | note:59 gain:0.48 clip:2 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 1/1 → 5/4 | note:40 gain:0.48 clip:2 s:piano release:0.1 pan:0.4351851851851852 ]", - "[ 5/4 → 3/2 | note:52 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.4907407407407407 ]", - "[ 5/4 → 3/2 | note:40 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.4351851851851852 ]", - "[ 7/4 → 2/1 | note:55 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 7/4 → 2/1 | note:59 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 7/4 → 2/1 | note:40 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.4351851851851852 ]", + "[ 0/1 → 1/4 | note:52 gain:0.48 clip:2 s:piano release:0.1 pan:0.490740740741 ]", + "[ 1/4 → 1/2 | note:40 gain:0.56 clip:2 s:piano release:0.1 pan:0.435185185185 ]", + "[ 1/2 → 3/4 | note:52 gain:0.48 clip:2 s:piano release:0.1 pan:0.490740740741 ]", + "[ 1/2 → 3/4 | note:55 gain:0.48 clip:2 s:piano release:0.1 pan:0.50462962963 ]", + "[ 1/2 → 3/4 | note:59 gain:0.48 clip:2 s:piano release:0.1 pan:0.523148148148 ]", + "[ 1/2 → 3/4 | note:40 gain:0.48 clip:2 s:piano release:0.1 pan:0.435185185185 ]", + "[ 1/1 → 5/4 | note:55 gain:0.48 clip:2 s:piano release:0.1 pan:0.50462962963 ]", + "[ 1/1 → 5/4 | note:59 gain:0.48 clip:2 s:piano release:0.1 pan:0.523148148148 ]", + "[ 1/1 → 5/4 | note:40 gain:0.48 clip:2 s:piano release:0.1 pan:0.435185185185 ]", + "[ 5/4 → 3/2 | note:52 gain:0.56 clip:2 s:piano release:0.1 pan:0.490740740741 ]", + "[ 5/4 → 3/2 | note:40 gain:0.56 clip:2 s:piano release:0.1 pan:0.435185185185 ]", + "[ 7/4 → 2/1 | note:55 gain:0.56 clip:2 s:piano release:0.1 pan:0.50462962963 ]", + "[ 7/4 → 2/1 | note:59 gain:0.56 clip:2 s:piano release:0.1 pan:0.523148148148 ]", + "[ 7/4 → 2/1 | note:40 gain:0.56 clip:2 s:piano release:0.1 pan:0.435185185185 ]", "[ 2/1 → 9/4 | note:54 gain:0.48 clip:2 s:piano release:0.1 pan:0.5 ]", - "[ 9/4 → 5/2 | note:47 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.46759259259259256 ]", + "[ 9/4 → 5/2 | note:47 gain:0.56 clip:2 s:piano release:0.1 pan:0.467592592593 ]", "[ 5/2 → 11/4 | note:54 gain:0.48 clip:2 s:piano release:0.1 pan:0.5 ]", - "[ 5/2 → 11/4 | note:57 gain:0.48 clip:2 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 5/2 → 11/4 | note:61 gain:0.48 clip:2 s:piano release:0.1 pan:0.5324074074074074 ]", - "[ 5/2 → 11/4 | note:47 gain:0.48 clip:2 s:piano release:0.1 pan:0.46759259259259256 ]", - "[ 3/1 → 13/4 | note:57 gain:0.48 clip:2 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 3/1 → 13/4 | note:61 gain:0.48 clip:2 s:piano release:0.1 pan:0.5324074074074074 ]", - "[ 3/1 → 13/4 | note:47 gain:0.48 clip:2 s:piano release:0.1 pan:0.46759259259259256 ]", - "[ 13/4 → 7/2 | note:54 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.5 ]", - "[ 13/4 → 7/2 | note:47 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.46759259259259256 ]", - "[ 15/4 → 4/1 | note:57 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 15/4 → 4/1 | note:61 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.5324074074074074 ]", - "[ 15/4 → 4/1 | note:47 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.46759259259259256 ]", - "[ 4/1 → 17/4 | note:55 gain:0.48 clip:2 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 17/4 → 9/2 | note:40 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.4351851851851852 ]", - "[ 9/2 → 19/4 | note:55 gain:0.48 clip:2 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 9/2 → 19/4 | note:59 gain:0.48 clip:2 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 9/2 → 19/4 | note:62 gain:0.48 clip:2 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 9/2 → 19/4 | note:40 gain:0.48 clip:2 s:piano release:0.1 pan:0.4351851851851852 ]", - "[ 5/1 → 21/4 | note:59 gain:0.48 clip:2 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 5/1 → 21/4 | note:62 gain:0.48 clip:2 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 5/1 → 21/4 | note:40 gain:0.48 clip:2 s:piano release:0.1 pan:0.4351851851851852 ]", - "[ 21/4 → 11/2 | note:55 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 21/4 → 11/2 | note:40 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.4351851851851852 ]", - "[ 23/4 → 6/1 | note:59 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 23/4 → 6/1 | note:62 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 23/4 → 6/1 | note:40 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.4351851851851852 ]", - "[ 6/1 → 25/4 | note:57 gain:0.48 clip:2 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 25/4 → 13/2 | note:47 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.46759259259259256 ]", - "[ 13/2 → 27/4 | note:57 gain:0.48 clip:2 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 13/2 → 27/4 | note:61 gain:0.48 clip:2 s:piano release:0.1 pan:0.5324074074074074 ]", - "[ 13/2 → 27/4 | note:64 gain:0.48 clip:2 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 13/2 → 27/4 | note:47 gain:0.48 clip:2 s:piano release:0.1 pan:0.46759259259259256 ]", - "[ 7/1 → 29/4 | note:61 gain:0.48 clip:2 s:piano release:0.1 pan:0.5324074074074074 ]", - "[ 7/1 → 29/4 | note:64 gain:0.48 clip:2 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 7/1 → 29/4 | note:47 gain:0.48 clip:2 s:piano release:0.1 pan:0.46759259259259256 ]", - "[ 29/4 → 15/2 | note:57 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 29/4 → 15/2 | note:47 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.46759259259259256 ]", - "[ 31/4 → 8/1 | note:61 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.5324074074074074 ]", - "[ 31/4 → 8/1 | note:64 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.5462962962962963 ]", - "[ 31/4 → 8/1 | note:47 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.46759259259259256 ]", - "[ 8/1 → 33/4 | note:50 gain:0.48 clip:2 s:piano release:0.1 pan:0.4814814814814815 ]", - "[ 33/4 → 17/2 | note:38 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.42592592592592593 ]", - "[ 17/2 → 35/4 | note:50 gain:0.48 clip:2 s:piano release:0.1 pan:0.4814814814814815 ]", + "[ 5/2 → 11/4 | note:57 gain:0.48 clip:2 s:piano release:0.1 pan:0.513888888889 ]", + "[ 5/2 → 11/4 | note:61 gain:0.48 clip:2 s:piano release:0.1 pan:0.532407407407 ]", + "[ 5/2 → 11/4 | note:47 gain:0.48 clip:2 s:piano release:0.1 pan:0.467592592593 ]", + "[ 3/1 → 13/4 | note:57 gain:0.48 clip:2 s:piano release:0.1 pan:0.513888888889 ]", + "[ 3/1 → 13/4 | note:61 gain:0.48 clip:2 s:piano release:0.1 pan:0.532407407407 ]", + "[ 3/1 → 13/4 | note:47 gain:0.48 clip:2 s:piano release:0.1 pan:0.467592592593 ]", + "[ 13/4 → 7/2 | note:54 gain:0.56 clip:2 s:piano release:0.1 pan:0.5 ]", + "[ 13/4 → 7/2 | note:47 gain:0.56 clip:2 s:piano release:0.1 pan:0.467592592593 ]", + "[ 15/4 → 4/1 | note:57 gain:0.56 clip:2 s:piano release:0.1 pan:0.513888888889 ]", + "[ 15/4 → 4/1 | note:61 gain:0.56 clip:2 s:piano release:0.1 pan:0.532407407407 ]", + "[ 15/4 → 4/1 | note:47 gain:0.56 clip:2 s:piano release:0.1 pan:0.467592592593 ]", + "[ 4/1 → 17/4 | note:55 gain:0.48 clip:2 s:piano release:0.1 pan:0.50462962963 ]", + "[ 17/4 → 9/2 | note:40 gain:0.56 clip:2 s:piano release:0.1 pan:0.435185185185 ]", + "[ 9/2 → 19/4 | note:55 gain:0.48 clip:2 s:piano release:0.1 pan:0.50462962963 ]", + "[ 9/2 → 19/4 | note:59 gain:0.48 clip:2 s:piano release:0.1 pan:0.523148148148 ]", + "[ 9/2 → 19/4 | note:62 gain:0.48 clip:2 s:piano release:0.1 pan:0.537037037037 ]", + "[ 9/2 → 19/4 | note:40 gain:0.48 clip:2 s:piano release:0.1 pan:0.435185185185 ]", + "[ 5/1 → 21/4 | note:59 gain:0.48 clip:2 s:piano release:0.1 pan:0.523148148148 ]", + "[ 5/1 → 21/4 | note:62 gain:0.48 clip:2 s:piano release:0.1 pan:0.537037037037 ]", + "[ 5/1 → 21/4 | note:40 gain:0.48 clip:2 s:piano release:0.1 pan:0.435185185185 ]", + "[ 21/4 → 11/2 | note:55 gain:0.56 clip:2 s:piano release:0.1 pan:0.50462962963 ]", + "[ 21/4 → 11/2 | note:40 gain:0.56 clip:2 s:piano release:0.1 pan:0.435185185185 ]", + "[ 23/4 → 6/1 | note:59 gain:0.56 clip:2 s:piano release:0.1 pan:0.523148148148 ]", + "[ 23/4 → 6/1 | note:62 gain:0.56 clip:2 s:piano release:0.1 pan:0.537037037037 ]", + "[ 23/4 → 6/1 | note:40 gain:0.56 clip:2 s:piano release:0.1 pan:0.435185185185 ]", + "[ 6/1 → 25/4 | note:57 gain:0.48 clip:2 s:piano release:0.1 pan:0.513888888889 ]", + "[ 25/4 → 13/2 | note:47 gain:0.56 clip:2 s:piano release:0.1 pan:0.467592592593 ]", + "[ 13/2 → 27/4 | note:57 gain:0.48 clip:2 s:piano release:0.1 pan:0.513888888889 ]", + "[ 13/2 → 27/4 | note:61 gain:0.48 clip:2 s:piano release:0.1 pan:0.532407407407 ]", + "[ 13/2 → 27/4 | note:64 gain:0.48 clip:2 s:piano release:0.1 pan:0.546296296296 ]", + "[ 13/2 → 27/4 | note:47 gain:0.48 clip:2 s:piano release:0.1 pan:0.467592592593 ]", + "[ 7/1 → 29/4 | note:61 gain:0.48 clip:2 s:piano release:0.1 pan:0.532407407407 ]", + "[ 7/1 → 29/4 | note:64 gain:0.48 clip:2 s:piano release:0.1 pan:0.546296296296 ]", + "[ 7/1 → 29/4 | note:47 gain:0.48 clip:2 s:piano release:0.1 pan:0.467592592593 ]", + "[ 29/4 → 15/2 | note:57 gain:0.56 clip:2 s:piano release:0.1 pan:0.513888888889 ]", + "[ 29/4 → 15/2 | note:47 gain:0.56 clip:2 s:piano release:0.1 pan:0.467592592593 ]", + "[ 31/4 → 8/1 | note:61 gain:0.56 clip:2 s:piano release:0.1 pan:0.532407407407 ]", + "[ 31/4 → 8/1 | note:64 gain:0.56 clip:2 s:piano release:0.1 pan:0.546296296296 ]", + "[ 31/4 → 8/1 | note:47 gain:0.56 clip:2 s:piano release:0.1 pan:0.467592592593 ]", + "[ 8/1 → 33/4 | note:50 gain:0.48 clip:2 s:piano release:0.1 pan:0.481481481481 ]", + "[ 33/4 → 17/2 | note:38 gain:0.56 clip:2 s:piano release:0.1 pan:0.425925925926 ]", + "[ 17/2 → 35/4 | note:50 gain:0.48 clip:2 s:piano release:0.1 pan:0.481481481481 ]", "[ 17/2 → 35/4 | note:54 gain:0.48 clip:2 s:piano release:0.1 pan:0.5 ]", - "[ 17/2 → 35/4 | note:57 gain:0.48 clip:2 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 17/2 → 35/4 | note:38 gain:0.48 clip:2 s:piano release:0.1 pan:0.42592592592592593 ]", + "[ 17/2 → 35/4 | note:57 gain:0.48 clip:2 s:piano release:0.1 pan:0.513888888889 ]", + "[ 17/2 → 35/4 | note:38 gain:0.48 clip:2 s:piano release:0.1 pan:0.425925925926 ]", "[ 9/1 → 37/4 | note:54 gain:0.48 clip:2 s:piano release:0.1 pan:0.5 ]", - "[ 9/1 → 37/4 | note:57 gain:0.48 clip:2 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 9/1 → 37/4 | note:38 gain:0.48 clip:2 s:piano release:0.1 pan:0.42592592592592593 ]", - "[ 37/4 → 19/2 | note:50 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.4814814814814815 ]", - "[ 37/4 → 19/2 | note:38 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.42592592592592593 ]", - "[ 39/4 → 10/1 | note:54 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.5 ]", - "[ 39/4 → 10/1 | note:57 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 39/4 → 10/1 | note:38 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.42592592592592593 ]", - "[ 10/1 → 41/4 | note:52 gain:0.48 clip:2 s:piano release:0.1 pan:0.4907407407407407 ]", - "[ 41/4 → 21/2 | note:45 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.45833333333333337 ]", - "[ 21/2 → 43/4 | note:52 gain:0.48 clip:2 s:piano release:0.1 pan:0.4907407407407407 ]", - "[ 21/2 → 43/4 | note:55 gain:0.48 clip:2 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 21/2 → 43/4 | note:59 gain:0.48 clip:2 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 21/2 → 43/4 | note:45 gain:0.48 clip:2 s:piano release:0.1 pan:0.45833333333333337 ]", - "[ 11/1 → 45/4 | note:55 gain:0.48 clip:2 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 11/1 → 45/4 | note:59 gain:0.48 clip:2 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 11/1 → 45/4 | note:45 gain:0.48 clip:2 s:piano release:0.1 pan:0.45833333333333337 ]", - "[ 45/4 → 23/2 | note:52 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.4907407407407407 ]", - "[ 45/4 → 23/2 | note:45 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.45833333333333337 ]", - "[ 47/4 → 12/1 | note:55 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 47/4 → 12/1 | note:59 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 47/4 → 12/1 | note:45 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.45833333333333337 ]", + "[ 9/1 → 37/4 | note:57 gain:0.48 clip:2 s:piano release:0.1 pan:0.513888888889 ]", + "[ 9/1 → 37/4 | note:38 gain:0.48 clip:2 s:piano release:0.1 pan:0.425925925926 ]", + "[ 37/4 → 19/2 | note:50 gain:0.56 clip:2 s:piano release:0.1 pan:0.481481481481 ]", + "[ 37/4 → 19/2 | note:38 gain:0.56 clip:2 s:piano release:0.1 pan:0.425925925926 ]", + "[ 39/4 → 10/1 | note:54 gain:0.56 clip:2 s:piano release:0.1 pan:0.5 ]", + "[ 39/4 → 10/1 | note:57 gain:0.56 clip:2 s:piano release:0.1 pan:0.513888888889 ]", + "[ 39/4 → 10/1 | note:38 gain:0.56 clip:2 s:piano release:0.1 pan:0.425925925926 ]", + "[ 10/1 → 41/4 | note:52 gain:0.48 clip:2 s:piano release:0.1 pan:0.490740740741 ]", + "[ 41/4 → 21/2 | note:45 gain:0.56 clip:2 s:piano release:0.1 pan:0.458333333333 ]", + "[ 21/2 → 43/4 | note:52 gain:0.48 clip:2 s:piano release:0.1 pan:0.490740740741 ]", + "[ 21/2 → 43/4 | note:55 gain:0.48 clip:2 s:piano release:0.1 pan:0.50462962963 ]", + "[ 21/2 → 43/4 | note:59 gain:0.48 clip:2 s:piano release:0.1 pan:0.523148148148 ]", + "[ 21/2 → 43/4 | note:45 gain:0.48 clip:2 s:piano release:0.1 pan:0.458333333333 ]", + "[ 11/1 → 45/4 | note:55 gain:0.48 clip:2 s:piano release:0.1 pan:0.50462962963 ]", + "[ 11/1 → 45/4 | note:59 gain:0.48 clip:2 s:piano release:0.1 pan:0.523148148148 ]", + "[ 11/1 → 45/4 | note:45 gain:0.48 clip:2 s:piano release:0.1 pan:0.458333333333 ]", + "[ 45/4 → 23/2 | note:52 gain:0.56 clip:2 s:piano release:0.1 pan:0.490740740741 ]", + "[ 45/4 → 23/2 | note:45 gain:0.56 clip:2 s:piano release:0.1 pan:0.458333333333 ]", + "[ 47/4 → 12/1 | note:55 gain:0.56 clip:2 s:piano release:0.1 pan:0.50462962963 ]", + "[ 47/4 → 12/1 | note:59 gain:0.56 clip:2 s:piano release:0.1 pan:0.523148148148 ]", + "[ 47/4 → 12/1 | note:45 gain:0.56 clip:2 s:piano release:0.1 pan:0.458333333333 ]", "[ 12/1 → 49/4 | note:54 gain:0.48 clip:2 s:piano release:0.1 pan:0.5 ]", - "[ 49/4 → 25/2 | note:38 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.42592592592592593 ]", + "[ 49/4 → 25/2 | note:38 gain:0.56 clip:2 s:piano release:0.1 pan:0.425925925926 ]", "[ 25/2 → 51/4 | note:54 gain:0.48 clip:2 s:piano release:0.1 pan:0.5 ]", - "[ 25/2 → 51/4 | note:57 gain:0.48 clip:2 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 25/2 → 51/4 | note:61 gain:0.48 clip:2 s:piano release:0.1 pan:0.5324074074074074 ]", - "[ 25/2 → 51/4 | note:38 gain:0.48 clip:2 s:piano release:0.1 pan:0.42592592592592593 ]", - "[ 13/1 → 53/4 | note:57 gain:0.48 clip:2 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 13/1 → 53/4 | note:61 gain:0.48 clip:2 s:piano release:0.1 pan:0.5324074074074074 ]", - "[ 13/1 → 53/4 | note:38 gain:0.48 clip:2 s:piano release:0.1 pan:0.42592592592592593 ]", - "[ 53/4 → 27/2 | note:54 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.5 ]", - "[ 53/4 → 27/2 | note:38 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.42592592592592593 ]", - "[ 55/4 → 14/1 | note:57 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.5138888888888888 ]", - "[ 55/4 → 14/1 | note:61 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.5324074074074074 ]", - "[ 55/4 → 14/1 | note:38 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.42592592592592593 ]", - "[ 14/1 → 57/4 | note:55 gain:0.48 clip:2 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 57/4 → 29/2 | note:45 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.45833333333333337 ]", - "[ 29/2 → 59/4 | note:55 gain:0.48 clip:2 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 29/2 → 59/4 | note:59 gain:0.48 clip:2 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 29/2 → 59/4 | note:62 gain:0.48 clip:2 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 29/2 → 59/4 | note:45 gain:0.48 clip:2 s:piano release:0.1 pan:0.45833333333333337 ]", - "[ 15/1 → 61/4 | note:59 gain:0.48 clip:2 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 15/1 → 61/4 | note:62 gain:0.48 clip:2 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 15/1 → 61/4 | note:45 gain:0.48 clip:2 s:piano release:0.1 pan:0.45833333333333337 ]", - "[ 61/4 → 31/2 | note:55 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.5046296296296297 ]", - "[ 61/4 → 31/2 | note:45 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.45833333333333337 ]", - "[ 63/4 → 16/1 | note:59 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.5231481481481481 ]", - "[ 63/4 → 16/1 | note:62 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.537037037037037 ]", - "[ 63/4 → 16/1 | note:45 gain:0.5599999999999999 clip:2 s:piano release:0.1 pan:0.45833333333333337 ]", + "[ 25/2 → 51/4 | note:57 gain:0.48 clip:2 s:piano release:0.1 pan:0.513888888889 ]", + "[ 25/2 → 51/4 | note:61 gain:0.48 clip:2 s:piano release:0.1 pan:0.532407407407 ]", + "[ 25/2 → 51/4 | note:38 gain:0.48 clip:2 s:piano release:0.1 pan:0.425925925926 ]", + "[ 13/1 → 53/4 | note:57 gain:0.48 clip:2 s:piano release:0.1 pan:0.513888888889 ]", + "[ 13/1 → 53/4 | note:61 gain:0.48 clip:2 s:piano release:0.1 pan:0.532407407407 ]", + "[ 13/1 → 53/4 | note:38 gain:0.48 clip:2 s:piano release:0.1 pan:0.425925925926 ]", + "[ 53/4 → 27/2 | note:54 gain:0.56 clip:2 s:piano release:0.1 pan:0.5 ]", + "[ 53/4 → 27/2 | note:38 gain:0.56 clip:2 s:piano release:0.1 pan:0.425925925926 ]", + "[ 55/4 → 14/1 | note:57 gain:0.56 clip:2 s:piano release:0.1 pan:0.513888888889 ]", + "[ 55/4 → 14/1 | note:61 gain:0.56 clip:2 s:piano release:0.1 pan:0.532407407407 ]", + "[ 55/4 → 14/1 | note:38 gain:0.56 clip:2 s:piano release:0.1 pan:0.425925925926 ]", + "[ 14/1 → 57/4 | note:55 gain:0.48 clip:2 s:piano release:0.1 pan:0.50462962963 ]", + "[ 57/4 → 29/2 | note:45 gain:0.56 clip:2 s:piano release:0.1 pan:0.458333333333 ]", + "[ 29/2 → 59/4 | note:55 gain:0.48 clip:2 s:piano release:0.1 pan:0.50462962963 ]", + "[ 29/2 → 59/4 | note:59 gain:0.48 clip:2 s:piano release:0.1 pan:0.523148148148 ]", + "[ 29/2 → 59/4 | note:62 gain:0.48 clip:2 s:piano release:0.1 pan:0.537037037037 ]", + "[ 29/2 → 59/4 | note:45 gain:0.48 clip:2 s:piano release:0.1 pan:0.458333333333 ]", + "[ 15/1 → 61/4 | note:59 gain:0.48 clip:2 s:piano release:0.1 pan:0.523148148148 ]", + "[ 15/1 → 61/4 | note:62 gain:0.48 clip:2 s:piano release:0.1 pan:0.537037037037 ]", + "[ 15/1 → 61/4 | note:45 gain:0.48 clip:2 s:piano release:0.1 pan:0.458333333333 ]", + "[ 61/4 → 31/2 | note:55 gain:0.56 clip:2 s:piano release:0.1 pan:0.50462962963 ]", + "[ 61/4 → 31/2 | note:45 gain:0.56 clip:2 s:piano release:0.1 pan:0.458333333333 ]", + "[ 63/4 → 16/1 | note:59 gain:0.56 clip:2 s:piano release:0.1 pan:0.523148148148 ]", + "[ 63/4 → 16/1 | note:62 gain:0.56 clip:2 s:piano release:0.1 pan:0.537037037037 ]", + "[ 63/4 → 16/1 | note:45 gain:0.56 clip:2 s:piano release:0.1 pan:0.458333333333 ]", ] `; @@ -7205,12 +7205,12 @@ exports[`renders tunes > tune: juxUndTollerei 1`] = ` [ "[ 0/1 → 1/4 | note:c3 s:sawtooth pan:0 cutoff:1100 lpattack:0.2 lpenv:-2 decay:0.05 sustain:0 room:0.6 delay:0.5 delaytime:0.1 delayfeedback:0.4 ]", "[ 0/1 → 1/4 | note:bb3 s:sawtooth pan:1 color:green cutoff:1100 lpattack:0.2 lpenv:-2 decay:0.05 sustain:0 room:0.6 delay:0.5 delaytime:0.1 delayfeedback:0.4 ]", - "[ 1/4 → 1/2 | note:eb3 s:sawtooth pan:0 cutoff:1275.5812898145155 lpattack:0.2 lpenv:-2 decay:0.05 sustain:0 room:0.6 delay:0.5 delaytime:0.1 delayfeedback:0.4 ]", - "[ 1/4 → 1/2 | note:g3 s:sawtooth pan:1 color:green cutoff:1275.5812898145155 lpattack:0.2 lpenv:-2 decay:0.05 sustain:0 room:0.6 delay:0.5 delaytime:0.1 delayfeedback:0.4 ]", - "[ 1/2 → 3/4 | note:g3 s:sawtooth pan:0 cutoff:1444.4150891285808 lpattack:0.2 lpenv:-2 decay:0.05 sustain:0 room:0.6 delay:0.5 delaytime:0.1 delayfeedback:0.4 ]", - "[ 1/2 → 3/4 | note:eb3 s:sawtooth pan:1 color:green cutoff:1444.4150891285808 lpattack:0.2 lpenv:-2 decay:0.05 sustain:0 room:0.6 delay:0.5 delaytime:0.1 delayfeedback:0.4 ]", - "[ (101/200 → 1/1) ⇝ 201/200 | note:55 s:triangle pan:0 cutoff:1447.6776848789743 lpattack:0.2 lpenv:-2 decay:0.05 sustain:0 room:0.6 delay:0.5 delaytime:0.1 delayfeedback:0.4 ]", - "[ (101/200 → 1/1) ⇝ 201/200 | note:65 s:triangle pan:1 color:green cutoff:1447.6776848789743 lpattack:0.2 lpenv:-2 decay:0.05 sustain:0 room:0.6 delay:0.5 delaytime:0.1 delayfeedback:0.4 ]", + "[ 1/4 → 1/2 | note:eb3 s:sawtooth pan:0 cutoff:1275.581289814515 lpattack:0.2 lpenv:-2 decay:0.05 sustain:0 room:0.6 delay:0.5 delaytime:0.1 delayfeedback:0.4 ]", + "[ 1/4 → 1/2 | note:g3 s:sawtooth pan:1 color:green cutoff:1275.581289814515 lpattack:0.2 lpenv:-2 decay:0.05 sustain:0 room:0.6 delay:0.5 delaytime:0.1 delayfeedback:0.4 ]", + "[ 1/2 → 3/4 | note:g3 s:sawtooth pan:0 cutoff:1444.415089128581 lpattack:0.2 lpenv:-2 decay:0.05 sustain:0 room:0.6 delay:0.5 delaytime:0.1 delayfeedback:0.4 ]", + "[ 1/2 → 3/4 | note:eb3 s:sawtooth pan:1 color:green cutoff:1444.415089128581 lpattack:0.2 lpenv:-2 decay:0.05 sustain:0 room:0.6 delay:0.5 delaytime:0.1 delayfeedback:0.4 ]", + "[ (101/200 → 1/1) ⇝ 201/200 | note:55 s:triangle pan:0 cutoff:1447.677684878974 lpattack:0.2 lpenv:-2 decay:0.05 sustain:0 room:0.6 delay:0.5 delaytime:0.1 delayfeedback:0.4 ]", + "[ (101/200 → 1/1) ⇝ 201/200 | note:65 s:triangle pan:1 color:green cutoff:1447.677684878974 lpattack:0.2 lpenv:-2 decay:0.05 sustain:0 room:0.6 delay:0.5 delaytime:0.1 delayfeedback:0.4 ]", "[ 3/4 → 1/1 | note:bb3 s:sawtooth pan:0 cutoff:1600.013209717642 lpattack:0.2 lpenv:-2 decay:0.05 sustain:0 room:0.6 delay:0.5 delaytime:0.1 delayfeedback:0.4 ]", "[ 3/4 → 1/1 | note:c3 s:sawtooth pan:1 color:green cutoff:1600.013209717642 lpattack:0.2 lpenv:-2 decay:0.05 sustain:0 room:0.6 delay:0.5 delaytime:0.1 delayfeedback:0.4 ]", ] @@ -7248,10 +7248,10 @@ exports[`renders tunes > tune: loungeSponge 1`] = ` exports[`renders tunes > tune: meltingsubmarine 1`] = ` [ - "[ (0/1 → 1/16) ⇝ 3/16 | note:72.0716211320497 decay:0.1 sustain:0 s:triangle gain:0.0375 ]", - "[ (0/1 → 1/16) ⇝ 3/16 | note:72.1116211320497 decay:0.1 sustain:0 s:triangle gain:0.0375 ]", - "[ 0/1 → 3/16 | note:93.00417750226859 decay:0.1 sustain:0 s:triangle gain:0.075 ]", - "[ 0/1 → 3/16 | note:93.0441775022686 decay:0.1 sustain:0 s:triangle gain:0.075 ]", + "[ (0/1 → 1/16) ⇝ 3/16 | note:72.07162113205 decay:0.1 sustain:0 s:triangle gain:0.0375 ]", + "[ (0/1 → 1/16) ⇝ 3/16 | note:72.11162113205 decay:0.1 sustain:0 s:triangle gain:0.0375 ]", + "[ 0/1 → 3/16 | note:93.004177502269 decay:0.1 sustain:0 s:triangle gain:0.075 ]", + "[ 0/1 → 3/16 | note:93.044177502269 decay:0.1 sustain:0 s:triangle gain:0.075 ]", "[ (0/1 → 1/1) ⇝ 3/2 | s:bd n:5 speed:0.7 ]", "[ (0/1 → 1/1) ⇝ 3/2 | note:33 decay:0.15 sustain:0 s:sawtooth gain:0.4 cutoff:2650 lpattack:0.1 lpenv:-2 ]", "[ (0/1 → 1/1) ⇝ 3/2 | note:33.05 decay:0.15 sustain:0 s:sawtooth gain:0.4 cutoff:2650 lpattack:0.1 lpenv:-2 ]", @@ -7263,45 +7263,45 @@ exports[`renders tunes > tune: meltingsubmarine 1`] = ` "[ (0/1 → 1/1) ⇝ 3/2 | note:67.04 s:sawtooth gain:0.16 cutoff:500 attack:1 ]", "[ (0/1 → 1/1) ⇝ 3/2 | note:71 s:sawtooth gain:0.16 cutoff:500 attack:1 ]", "[ (0/1 → 1/1) ⇝ 3/2 | note:71.04 s:sawtooth gain:0.16 cutoff:500 attack:1 ]", - "[ 0/1 ⇜ (1/16 → 3/16) | note:93.0716211320497 decay:0.1 sustain:0 s:triangle gain:0.0375 ]", - "[ 0/1 ⇜ (1/16 → 3/16) | note:93.1116211320497 decay:0.1 sustain:0 s:triangle gain:0.0375 ]", - "[ 3/16 → 3/8 | note:69.00416990934514 decay:0.1 sustain:0 s:triangle gain:0.15 ]", - "[ 3/16 → 3/8 | note:69.04416990934514 decay:0.1 sustain:0 s:triangle gain:0.15 ]", - "[ 3/16 → 3/8 | note:93.00417750226859 decay:0.1 sustain:0 s:triangle gain:0.049999999999999996 ]", - "[ 3/16 → 3/8 | note:93.0441775022686 decay:0.1 sustain:0 s:triangle gain:0.049999999999999996 ]", - "[ (3/16 → 1/1) ⇝ 27/16 | note:45.00416990934514 decay:0.15 sustain:0 s:sawtooth gain:0.4 cutoff:2913.1165188427735 lpattack:0.1 lpenv:-2 ]", - "[ (3/16 → 1/1) ⇝ 27/16 | note:45.054169909345134 decay:0.15 sustain:0 s:sawtooth gain:0.4 cutoff:2913.1165188427735 lpattack:0.1 lpenv:-2 ]", - "[ (3/8 → 1/2) ⇝ 9/16 | note:69.02689036596712 decay:0.1 sustain:0 s:triangle gain:0.15 ]", - "[ (3/8 → 1/2) ⇝ 9/16 | note:69.06689036596713 decay:0.1 sustain:0 s:triangle gain:0.15 ]", - "[ 3/8 → 9/16 | note:69.00416990934514 decay:0.1 sustain:0 s:triangle gain:0.075 ]", - "[ 3/8 → 9/16 | note:69.04416990934514 decay:0.1 sustain:0 s:triangle gain:0.075 ]", - "[ 3/8 → 9/16 | note:93.00417750226859 decay:0.1 sustain:0 s:triangle gain:0.0375 ]", - "[ 3/8 → 9/16 | note:93.0441775022686 decay:0.1 sustain:0 s:triangle gain:0.0375 ]", - "[ 3/8 → 3/4 | s:hh27 speed:0.7107561463868478 ]", - "[ 3/8 ⇜ (1/2 → 9/16) | note:72.02689036596712 decay:0.1 sustain:0 s:triangle gain:0.15 ]", - "[ 3/8 ⇜ (1/2 → 9/16) | note:72.06689036596713 decay:0.1 sustain:0 s:triangle gain:0.15 ]", - "[ (9/16 → 11/16) ⇝ 3/4 | note:69.02689036596712 decay:0.1 sustain:0 s:triangle gain:0.075 ]", - "[ (9/16 → 11/16) ⇝ 3/4 | note:69.06689036596713 decay:0.1 sustain:0 s:triangle gain:0.075 ]", - "[ 9/16 → 3/4 | note:69.00416990934514 decay:0.1 sustain:0 s:triangle gain:0.049999999999999996 ]", - "[ 9/16 → 3/4 | note:69.04416990934514 decay:0.1 sustain:0 s:triangle gain:0.049999999999999996 ]", - "[ 9/16 ⇜ (11/16 → 3/4) | note:72.02689036596712 decay:0.1 sustain:0 s:triangle gain:0.075 ]", - "[ 9/16 ⇜ (11/16 → 3/4) | note:72.06689036596713 decay:0.1 sustain:0 s:triangle gain:0.075 ]", - "[ (3/4 → 7/8) ⇝ 15/16 | note:69.02689036596712 decay:0.1 sustain:0 s:triangle gain:0.049999999999999996 ]", - "[ (3/4 → 7/8) ⇝ 15/16 | note:69.06689036596713 decay:0.1 sustain:0 s:triangle gain:0.049999999999999996 ]", - "[ 3/4 → 15/16 | note:72.12988554127514 decay:0.1 sustain:0 s:triangle gain:0.15 ]", - "[ 3/4 → 15/16 | note:72.16988554127515 decay:0.1 sustain:0 s:triangle gain:0.15 ]", - "[ 3/4 → 15/16 | note:69.00416990934514 decay:0.1 sustain:0 s:triangle gain:0.0375 ]", - "[ 3/4 → 15/16 | note:69.04416990934514 decay:0.1 sustain:0 s:triangle gain:0.0375 ]", - "[ (3/4 → 1/1) ⇝ 9/8 | s:hh27 speed:0.7519542165100574 ]", - "[ (3/4 → 1/1) ⇝ 3/2 | s:sd n:1 speed:0.7519542165100574 ]", - "[ 3/4 ⇜ (7/8 → 15/16) | note:72.02689036596712 decay:0.1 sustain:0 s:triangle gain:0.049999999999999996 ]", - "[ 3/4 ⇜ (7/8 → 15/16) | note:72.06689036596713 decay:0.1 sustain:0 s:triangle gain:0.049999999999999996 ]", - "[ (15/16 → 1/1) ⇝ 9/8 | note:72.18828012727568 decay:0.1 sustain:0 s:triangle gain:0.15 ]", - "[ (15/16 → 1/1) ⇝ 9/8 | note:72.22828012727568 decay:0.1 sustain:0 s:triangle gain:0.15 ]", - "[ (15/16 → 1/1) ⇝ 9/8 | note:72.12988554127514 decay:0.1 sustain:0 s:triangle gain:0.075 ]", - "[ (15/16 → 1/1) ⇝ 9/8 | note:72.16988554127515 decay:0.1 sustain:0 s:triangle gain:0.075 ]", - "[ (15/16 → 1/1) ⇝ 9/8 | note:69.02689036596712 decay:0.1 sustain:0 s:triangle gain:0.0375 ]", - "[ (15/16 → 1/1) ⇝ 9/8 | note:69.06689036596713 decay:0.1 sustain:0 s:triangle gain:0.0375 ]", + "[ 0/1 ⇜ (1/16 → 3/16) | note:93.07162113205 decay:0.1 sustain:0 s:triangle gain:0.0375 ]", + "[ 0/1 ⇜ (1/16 → 3/16) | note:93.11162113205 decay:0.1 sustain:0 s:triangle gain:0.0375 ]", + "[ 3/16 → 3/8 | note:69.004169909345 decay:0.1 sustain:0 s:triangle gain:0.15 ]", + "[ 3/16 → 3/8 | note:69.044169909345 decay:0.1 sustain:0 s:triangle gain:0.15 ]", + "[ 3/16 → 3/8 | note:93.004177502269 decay:0.1 sustain:0 s:triangle gain:0.05 ]", + "[ 3/16 → 3/8 | note:93.044177502269 decay:0.1 sustain:0 s:triangle gain:0.05 ]", + "[ (3/16 → 1/1) ⇝ 27/16 | note:45.004169909345 decay:0.15 sustain:0 s:sawtooth gain:0.4 cutoff:2913.116518842774 lpattack:0.1 lpenv:-2 ]", + "[ (3/16 → 1/1) ⇝ 27/16 | note:45.054169909345 decay:0.15 sustain:0 s:sawtooth gain:0.4 cutoff:2913.116518842774 lpattack:0.1 lpenv:-2 ]", + "[ (3/8 → 1/2) ⇝ 9/16 | note:69.026890365967 decay:0.1 sustain:0 s:triangle gain:0.15 ]", + "[ (3/8 → 1/2) ⇝ 9/16 | note:69.066890365967 decay:0.1 sustain:0 s:triangle gain:0.15 ]", + "[ 3/8 → 9/16 | note:69.004169909345 decay:0.1 sustain:0 s:triangle gain:0.075 ]", + "[ 3/8 → 9/16 | note:69.044169909345 decay:0.1 sustain:0 s:triangle gain:0.075 ]", + "[ 3/8 → 9/16 | note:93.004177502269 decay:0.1 sustain:0 s:triangle gain:0.0375 ]", + "[ 3/8 → 9/16 | note:93.044177502269 decay:0.1 sustain:0 s:triangle gain:0.0375 ]", + "[ 3/8 → 3/4 | s:hh27 speed:0.710756146387 ]", + "[ 3/8 ⇜ (1/2 → 9/16) | note:72.026890365967 decay:0.1 sustain:0 s:triangle gain:0.15 ]", + "[ 3/8 ⇜ (1/2 → 9/16) | note:72.066890365967 decay:0.1 sustain:0 s:triangle gain:0.15 ]", + "[ (9/16 → 11/16) ⇝ 3/4 | note:69.026890365967 decay:0.1 sustain:0 s:triangle gain:0.075 ]", + "[ (9/16 → 11/16) ⇝ 3/4 | note:69.066890365967 decay:0.1 sustain:0 s:triangle gain:0.075 ]", + "[ 9/16 → 3/4 | note:69.004169909345 decay:0.1 sustain:0 s:triangle gain:0.05 ]", + "[ 9/16 → 3/4 | note:69.044169909345 decay:0.1 sustain:0 s:triangle gain:0.05 ]", + "[ 9/16 ⇜ (11/16 → 3/4) | note:72.026890365967 decay:0.1 sustain:0 s:triangle gain:0.075 ]", + "[ 9/16 ⇜ (11/16 → 3/4) | note:72.066890365967 decay:0.1 sustain:0 s:triangle gain:0.075 ]", + "[ (3/4 → 7/8) ⇝ 15/16 | note:69.026890365967 decay:0.1 sustain:0 s:triangle gain:0.05 ]", + "[ (3/4 → 7/8) ⇝ 15/16 | note:69.066890365967 decay:0.1 sustain:0 s:triangle gain:0.05 ]", + "[ 3/4 → 15/16 | note:72.129885541275 decay:0.1 sustain:0 s:triangle gain:0.15 ]", + "[ 3/4 → 15/16 | note:72.169885541275 decay:0.1 sustain:0 s:triangle gain:0.15 ]", + "[ 3/4 → 15/16 | note:69.004169909345 decay:0.1 sustain:0 s:triangle gain:0.0375 ]", + "[ 3/4 → 15/16 | note:69.044169909345 decay:0.1 sustain:0 s:triangle gain:0.0375 ]", + "[ (3/4 → 1/1) ⇝ 9/8 | s:hh27 speed:0.75195421651 ]", + "[ (3/4 → 1/1) ⇝ 3/2 | s:sd n:1 speed:0.75195421651 ]", + "[ 3/4 ⇜ (7/8 → 15/16) | note:72.026890365967 decay:0.1 sustain:0 s:triangle gain:0.05 ]", + "[ 3/4 ⇜ (7/8 → 15/16) | note:72.066890365967 decay:0.1 sustain:0 s:triangle gain:0.05 ]", + "[ (15/16 → 1/1) ⇝ 9/8 | note:72.188280127276 decay:0.1 sustain:0 s:triangle gain:0.15 ]", + "[ (15/16 → 1/1) ⇝ 9/8 | note:72.228280127276 decay:0.1 sustain:0 s:triangle gain:0.15 ]", + "[ (15/16 → 1/1) ⇝ 9/8 | note:72.129885541275 decay:0.1 sustain:0 s:triangle gain:0.075 ]", + "[ (15/16 → 1/1) ⇝ 9/8 | note:72.169885541275 decay:0.1 sustain:0 s:triangle gain:0.075 ]", + "[ (15/16 → 1/1) ⇝ 9/8 | note:69.026890365967 decay:0.1 sustain:0 s:triangle gain:0.0375 ]", + "[ (15/16 → 1/1) ⇝ 9/8 | note:69.066890365967 decay:0.1 sustain:0 s:triangle gain:0.0375 ]", ] `; @@ -7316,74 +7316,74 @@ exports[`renders tunes > tune: orbit 1`] = ` exports[`renders tunes > tune: randomBells 1`] = ` [ - "[ -9/8 ⇜ (0/1 → 3/8) | gain:0.6 note:A3 velocity:0.5989903202280402 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", - "[ -3/4 ⇜ (0/1 → 3/4) | gain:0.6 note:C5 velocity:0.8369929669424891 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", + "[ -9/8 ⇜ (0/1 → 3/8) | gain:0.6 note:A3 velocity:0.598990320228 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", + "[ -3/4 ⇜ (0/1 → 3/4) | gain:0.6 note:C5 velocity:0.836992966942 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", "[ 0/1 → 3/2 | note:F2 s:bass clip:1 gain:0.8 ]", - "[ 0/1 → 9/4 | gain:0.6 note:D3 velocity:0.5 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", - "[ 3/8 → 21/8 | gain:0.6 note:F5 velocity:0.9213038925081491 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", - "[ 3/4 → 3/1 | gain:0.6 note:C5 velocity:0.8426077850162983 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", + "[ 0/1 → 9/4 | gain:0.6 note:D3 velocity:0.5 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", + "[ 3/8 → 21/8 | gain:0.6 note:F5 velocity:0.921303892508 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", + "[ 3/4 → 3/1 | gain:0.6 note:C5 velocity:0.842607785016 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", "[ 3/2 → 9/4 | note:F2 s:bass clip:1 gain:0.8 ]", "[ 9/4 → 3/1 | note:F2 s:bass clip:1 gain:0.8 ]", - "[ 9/4 → 9/2 | gain:0.6 note:D4 velocity:0.7006962578743696 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", - "[ 21/8 → 39/8 | gain:0.6 note:C4 velocity:0.6507943943142891 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", + "[ 9/4 → 9/2 | gain:0.6 note:D4 velocity:0.700696257874 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", + "[ 21/8 → 39/8 | gain:0.6 note:C4 velocity:0.650794394314 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", "[ 3/1 → 9/2 | note:D2 s:bass clip:1 gain:0.8 ]", - "[ 3/1 → 21/4 | gain:0.6 note:C4 velocity:0.6302403081208467 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", + "[ 3/1 → 21/4 | gain:0.6 note:C4 velocity:0.630240308121 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", "[ 9/2 → 21/4 | note:D2 s:bass clip:1 gain:0.8 ]", - "[ 9/2 → 6/1 | gain:0.6 note:A3 velocity:0.597913240082562 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", - "[ (39/8 → 6/1) ⇝ 51/8 | gain:0.6 note:D5 velocity:0.8758113365620375 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", + "[ 9/2 → 6/1 | gain:0.6 note:A3 velocity:0.597913240083 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", + "[ (39/8 → 6/1) ⇝ 51/8 | gain:0.6 note:D5 velocity:0.875811336562 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", "[ 21/4 → 6/1 | note:D2 s:bass clip:1 gain:0.8 ]", - "[ (21/4 → 6/1) ⇝ 27/4 | gain:0.6 note:D4 velocity:0.6988155404105783 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", - "[ 39/8 ⇜ (6/1 → 51/8) | gain:0.6 note:D5 velocity:0.8758113365620375 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", - "[ 21/4 ⇜ (6/1 → 27/4) | gain:0.6 note:D4 velocity:0.6988155404105783 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", + "[ (21/4 → 6/1) ⇝ 27/4 | gain:0.6 note:D4 velocity:0.698815540411 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", + "[ 39/8 ⇜ (6/1 → 51/8) | gain:0.6 note:D5 velocity:0.875811336562 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", + "[ 21/4 ⇜ (6/1 → 27/4) | gain:0.6 note:D4 velocity:0.698815540411 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", "[ 6/1 → 15/2 | note:D2 s:bass clip:1 gain:0.8 ]", - "[ 6/1 → 33/4 | gain:0.6 note:G4 velocity:0.7597710825502872 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", - "[ 51/8 → 69/8 | gain:0.6 note:G4 velocity:0.7743164440616965 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", - "[ 27/4 → 9/1 | gain:0.6 note:C5 velocity:0.8362447572872043 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", + "[ 6/1 → 33/4 | gain:0.6 note:G4 velocity:0.75977108255 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", + "[ 51/8 → 69/8 | gain:0.6 note:G4 velocity:0.774316444062 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", + "[ 27/4 → 9/1 | gain:0.6 note:C5 velocity:0.836244757287 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", "[ 15/2 → 33/4 | note:D2 s:bass clip:1 gain:0.8 ]", "[ 33/4 → 9/1 | note:D2 s:bass clip:1 gain:0.8 ]", - "[ 33/4 → 21/2 | gain:0.6 note:A3 velocity:0.5914018759503961 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", - "[ 69/8 → 87/8 | gain:0.6 note:G4 velocity:0.754063542932272 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", + "[ 33/4 → 21/2 | gain:0.6 note:A3 velocity:0.59140187595 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", + "[ 69/8 → 87/8 | gain:0.6 note:G4 velocity:0.754063542932 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", "[ 9/1 → 21/2 | note:A2 s:bass clip:1 gain:0.8 ]", - "[ 9/1 → 45/4 | gain:0.6 note:A4 velocity:0.8042040374130011 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", + "[ 9/1 → 45/4 | gain:0.6 note:A4 velocity:0.804204037413 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", "[ 21/2 → 45/4 | note:A2 s:bass clip:1 gain:0.8 ]", - "[ 21/2 → 12/1 | gain:0.6 note:A3 velocity:0.6023689480498433 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", - "[ (87/8 → 12/1) ⇝ 99/8 | gain:0.6 note:F4 velocity:0.7347871446982026 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", + "[ 21/2 → 12/1 | gain:0.6 note:A3 velocity:0.60236894805 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", + "[ (87/8 → 12/1) ⇝ 99/8 | gain:0.6 note:F4 velocity:0.734787144698 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", "[ 45/4 → 12/1 | note:A2 s:bass clip:1 gain:0.8 ]", - "[ (45/4 → 12/1) ⇝ 51/4 | gain:0.6 note:A4 velocity:0.7972785895690322 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", - "[ 87/8 ⇜ (12/1 → 99/8) | gain:0.6 note:F4 velocity:0.7347871446982026 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", - "[ 45/4 ⇜ (12/1 → 51/4) | gain:0.6 note:A4 velocity:0.7972785895690322 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", + "[ (45/4 → 12/1) ⇝ 51/4 | gain:0.6 note:A4 velocity:0.797278589569 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", + "[ 87/8 ⇜ (12/1 → 99/8) | gain:0.6 note:F4 velocity:0.734787144698 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", + "[ 45/4 ⇜ (12/1 → 51/4) | gain:0.6 note:A4 velocity:0.797278589569 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", "[ 12/1 → 27/2 | note:A2 s:bass clip:1 gain:0.8 ]", - "[ 12/1 → 57/4 | gain:0.6 note:G5 velocity:0.9797635599970818 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", - "[ 99/8 → 117/8 | gain:0.6 note:C4 velocity:0.6662392104044557 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", - "[ 51/4 → 15/1 | gain:0.6 note:F5 velocity:0.9516951469704509 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", + "[ 12/1 → 57/4 | gain:0.6 note:G5 velocity:0.979763559997 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", + "[ 99/8 → 117/8 | gain:0.6 note:C4 velocity:0.666239210404 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", + "[ 51/4 → 15/1 | gain:0.6 note:F5 velocity:0.95169514697 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", "[ 27/2 → 57/4 | note:A2 s:bass clip:1 gain:0.8 ]", "[ 57/4 → 15/1 | note:A2 s:bass clip:1 gain:0.8 ]", - "[ 57/4 → 33/2 | gain:0.6 note:F5 velocity:0.9182533202692866 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", - "[ 117/8 → 135/8 | gain:0.6 note:G3 velocity:0.5711571052670479 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", + "[ 57/4 → 33/2 | gain:0.6 note:F5 velocity:0.918253320269 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", + "[ 117/8 → 135/8 | gain:0.6 note:G3 velocity:0.571157105267 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", "[ 15/1 → 33/2 | note:G2 s:bass clip:1 gain:0.8 ]", - "[ 15/1 → 69/4 | gain:0.6 note:F4 velocity:0.7293080370873213 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", + "[ 15/1 → 69/4 | gain:0.6 note:F4 velocity:0.729308037087 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", "[ 33/2 → 69/4 | note:G2 s:bass clip:1 gain:0.8 ]", - "[ 33/2 → 18/1 | gain:0.6 note:A4 velocity:0.8166163852438331 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", - "[ (135/8 → 18/1) ⇝ 147/8 | gain:0.6 note:F5 velocity:0.9456470254808664 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", + "[ 33/2 → 18/1 | gain:0.6 note:A4 velocity:0.816616385244 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", + "[ (135/8 → 18/1) ⇝ 147/8 | gain:0.6 note:F5 velocity:0.945647025481 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", "[ 69/4 → 18/1 | note:G2 s:bass clip:1 gain:0.8 ]", - "[ (69/4 → 18/1) ⇝ 75/4 | gain:0.6 note:F3 velocity:0.5081270858645439 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", - "[ 135/8 ⇜ (18/1 → 147/8) | gain:0.6 note:F5 velocity:0.9456470254808664 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", - "[ 69/4 ⇜ (18/1 → 75/4) | gain:0.6 note:F3 velocity:0.5081270858645439 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", + "[ (69/4 → 18/1) ⇝ 75/4 | gain:0.6 note:F3 velocity:0.508127085865 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", + "[ 135/8 ⇜ (18/1 → 147/8) | gain:0.6 note:F5 velocity:0.945647025481 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", + "[ 69/4 ⇜ (18/1 → 75/4) | gain:0.6 note:F3 velocity:0.508127085865 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", "[ 18/1 → 39/2 | note:G2 s:bass clip:1 gain:0.8 ]", - "[ 18/1 → 81/4 | gain:0.6 note:A3 velocity:0.6086445553228259 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", - "[ 147/8 → 165/8 | gain:0.6 note:F3 velocity:0.5062594395130873 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", - "[ 75/4 → 21/1 | gain:0.6 note:D4 velocity:0.6716219391673803 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", + "[ 18/1 → 81/4 | gain:0.6 note:A3 velocity:0.608644555323 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", + "[ 147/8 → 165/8 | gain:0.6 note:F3 velocity:0.506259439513 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", + "[ 75/4 → 21/1 | gain:0.6 note:D4 velocity:0.671621939167 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", "[ 39/2 → 81/4 | note:G2 s:bass clip:1 gain:0.8 ]", "[ 81/4 → 21/1 | note:G2 s:bass clip:1 gain:0.8 ]", - "[ 81/4 → 45/2 | gain:0.6 note:D4 velocity:0.7043459005653858 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", - "[ 165/8 → 183/8 | gain:0.6 note:D5 velocity:0.8878388572484255 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", + "[ 81/4 → 45/2 | gain:0.6 note:D4 velocity:0.704345900565 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", + "[ 165/8 → 183/8 | gain:0.6 note:D5 velocity:0.887838857248 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", "[ 21/1 → 45/2 | note:F2 s:bass clip:1 gain:0.8 ]", - "[ 21/1 → 93/4 | gain:0.6 note:D4 velocity:0.7049744073301554 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", + "[ 21/1 → 93/4 | gain:0.6 note:D4 velocity:0.70497440733 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", "[ 45/2 → 93/4 | note:F2 s:bass clip:1 gain:0.8 ]", - "[ 45/2 → 24/1 | gain:0.6 note:D5 velocity:0.9060836611315608 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", - "[ (183/8 → 24/1) ⇝ 195/8 | gain:0.6 note:G3 velocity:0.5504462849348783 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", + "[ 45/2 → 24/1 | gain:0.6 note:D5 velocity:0.906083661132 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", + "[ (183/8 → 24/1) ⇝ 195/8 | gain:0.6 note:G3 velocity:0.550446284935 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", "[ 93/4 → 24/1 | note:F2 s:bass clip:1 gain:0.8 ]", - "[ (93/4 → 24/1) ⇝ 99/4 | gain:0.6 note:C5 velocity:0.8680832693353295 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]", + "[ (93/4 → 24/1) ⇝ 99/4 | gain:0.6 note:C5 velocity:0.868083269335 s:bell delay:0.2 delaytime:0.333333333333 delayfeedback:0.8 ]", ] `; @@ -8331,84 +8331,84 @@ exports[`renders tunes > tune: swimming 1`] = ` exports[`renders tunes > tune: undergroundPlumber 1`] = ` [ "[ -15/16 ⇜ (0/1 → 3/16) ⇝ 9/16 | gain:0.4 note:G3 clip:0.1 ]", - "[ -9/16 ⇜ (0/1 → 3/16) | gain:0.06400000000000002 note:C6 clip:0.1 ]", + "[ -9/16 ⇜ (0/1 → 3/16) | gain:0.064 note:C6 clip:0.1 ]", "[ -3/16 ⇜ (0/1 → 3/16) ⇝ 9/16 | gain:0.4 note:Eb4 clip:0.1 ]", "[ 0/1 → 3/16 | s:bd gain:0.7 ]", - "[ -3/4 ⇜ (0/1 → 3/8) ⇝ 3/4 | gain:0.16000000000000003 note:G4 clip:0.1 ]", + "[ -3/4 ⇜ (0/1 → 3/8) ⇝ 3/4 | gain:0.16 note:G4 clip:0.1 ]", "[ 0/1 → 3/8 | gain:1 note:C2 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", - "[ (0/1 → 3/8) ⇝ 3/4 | gain:0.16000000000000003 note:Eb5 clip:0.1 ]", - "[ -9/16 ⇜ (0/1 → 9/16) ⇝ 15/16 | gain:0.06400000000000002 note:G5 clip:0.1 ]", + "[ (0/1 → 3/8) ⇝ 3/4 | gain:0.16 note:Eb5 clip:0.1 ]", + "[ -9/16 ⇜ (0/1 → 9/16) ⇝ 15/16 | gain:0.064 note:G5 clip:0.1 ]", "[ 0/1 → 3/4 | gain:1 note:C3 clip:0.1 ]", "[ 0/1 → 3/2 | gain:1 note:G2 clip:0.1 ]", "[ 3/16 → 3/8 | s:bd gain:0.7 ]", "[ 3/16 → 9/16 | gain:1 note:C2 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", - "[ (3/16 → 9/16) ⇝ 15/16 | gain:0.06400000000000002 note:Eb6 clip:0.1 ]", + "[ (3/16 → 9/16) ⇝ 15/16 | gain:0.064 note:Eb6 clip:0.1 ]", "[ 3/16 → 15/16 | gain:0.4 note:C4 clip:0.1 ]", "[ (3/16 → 3/2) ⇝ 27/16 | gain:0.4 note:G3 clip:0.1 ]", "[ 3/8 → 3/4 | s:hh gain:0.7 ]", "[ 3/8 → 3/4 | gain:1 note:A1 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", - "[ 3/8 → 9/8 | gain:0.16000000000000003 note:C5 clip:0.1 ]", - "[ (3/8 → 3/2) ⇝ 15/8 | gain:0.16000000000000003 note:G4 clip:0.1 ]", + "[ 3/8 → 9/8 | gain:0.16 note:C5 clip:0.1 ]", + "[ (3/8 → 3/2) ⇝ 15/8 | gain:0.16 note:G4 clip:0.1 ]", "[ 9/16 → 15/16 | gain:1 note:A1 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", - "[ 9/16 → 21/16 | gain:0.06400000000000002 note:C6 clip:0.1 ]", - "[ (9/16 → 3/2) ⇝ 33/16 | gain:0.06400000000000002 note:G5 clip:0.1 ]", + "[ 9/16 → 21/16 | gain:0.064 note:C6 clip:0.1 ]", + "[ (9/16 → 3/2) ⇝ 33/16 | gain:0.064 note:G5 clip:0.1 ]", "[ 3/4 → 9/8 | s:sn gain:0.7 ]", "[ 3/4 → 9/8 | gain:1 note:Bb1 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", "[ 3/4 → 3/2 | gain:1 note:Eb3 clip:0.1 ]", "[ 15/16 → 21/16 | gain:1 note:Bb1 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", "[ (15/16 → 3/2) ⇝ 27/16 | gain:0.4 note:Eb4 clip:0.1 ]", "[ 9/8 → 3/2 | s:hh gain:0.7 ]", - "[ (9/8 → 3/2) ⇝ 15/8 | gain:0.16000000000000003 note:Eb5 clip:0.1 ]", - "[ (21/16 → 3/2) ⇝ 33/16 | gain:0.06400000000000002 note:Eb6 clip:0.1 ]", + "[ (9/8 → 3/2) ⇝ 15/8 | gain:0.16 note:Eb5 clip:0.1 ]", + "[ (21/16 → 3/2) ⇝ 33/16 | gain:0.064 note:Eb6 clip:0.1 ]", "[ 3/16 ⇜ (3/2 → 27/16) | gain:0.4 note:G3 clip:0.1 ]", "[ 15/16 ⇜ (3/2 → 27/16) | gain:0.4 note:Eb4 clip:0.1 ]", - "[ 3/8 ⇜ (3/2 → 15/8) | gain:0.16000000000000003 note:G4 clip:0.1 ]", + "[ 3/8 ⇜ (3/2 → 15/8) | gain:0.16 note:G4 clip:0.1 ]", "[ 9/8 ⇜ (3/2 → 15/8) | gain:1 note:C3 clip:0.1 ]", - "[ 9/8 ⇜ (3/2 → 15/8) | gain:0.16000000000000003 note:Eb5 clip:0.1 ]", + "[ 9/8 ⇜ (3/2 → 15/8) | gain:0.16 note:Eb5 clip:0.1 ]", "[ 3/2 → 15/8 | s:bd gain:0.7 ]", - "[ 9/16 ⇜ (3/2 → 33/16) | gain:0.06400000000000002 note:G5 clip:0.1 ]", - "[ 21/16 ⇜ (3/2 → 33/16) | gain:0.06400000000000002 note:Eb6 clip:0.1 ]", + "[ 9/16 ⇜ (3/2 → 33/16) | gain:0.064 note:G5 clip:0.1 ]", + "[ 21/16 ⇜ (3/2 → 33/16) | gain:0.064 note:Eb6 clip:0.1 ]", "[ 9/8 ⇜ (3/2 → 21/8) | gain:1 note:G2 clip:0.1 ]", "[ 21/16 ⇜ (27/16 → 33/16) | gain:0.4 note:C4 clip:0.1 ]", "[ 21/16 ⇜ (27/16 → 45/16) | gain:0.4 note:G3 clip:0.1 ]", - "[ 3/2 ⇜ (15/8 → 9/4) | gain:0.16000000000000003 note:C5 clip:0.1 ]", + "[ 3/2 ⇜ (15/8 → 9/4) | gain:0.16 note:C5 clip:0.1 ]", "[ 15/8 → 9/4 | s:hh gain:0.7 ]", "[ 15/8 → 21/8 | gain:1 note:Eb3 clip:0.1 ]", - "[ 3/2 ⇜ (15/8 → 3/1) | gain:0.16000000000000003 note:G4 clip:0.1 ]", - "[ 27/16 ⇜ (33/16 → 39/16) | gain:0.06400000000000002 note:C6 clip:0.1 ]", + "[ 3/2 ⇜ (15/8 → 3/1) | gain:0.16 note:G4 clip:0.1 ]", + "[ 27/16 ⇜ (33/16 → 39/16) | gain:0.064 note:C6 clip:0.1 ]", "[ 33/16 → 45/16 | gain:0.4 note:Eb4 clip:0.1 ]", - "[ 27/16 ⇜ (33/16 → 3/1) ⇝ 51/16 | gain:0.06400000000000002 note:G5 clip:0.1 ]", + "[ 27/16 ⇜ (33/16 → 3/1) ⇝ 51/16 | gain:0.064 note:G5 clip:0.1 ]", "[ 9/4 → 21/8 | s:sn gain:0.7 ]", - "[ 9/4 → 3/1 | gain:0.16000000000000003 note:Eb5 clip:0.1 ]", - "[ (39/16 → 3/1) ⇝ 51/16 | gain:0.06400000000000002 note:Eb6 clip:0.1 ]", + "[ 9/4 → 3/1 | gain:0.16 note:Eb5 clip:0.1 ]", + "[ (39/16 → 3/1) ⇝ 51/16 | gain:0.064 note:Eb6 clip:0.1 ]", "[ 21/8 → 3/1 | s:hh gain:0.7 ]", "[ (21/8 → 3/1) ⇝ 27/8 | gain:1 note:C3 clip:0.1 ]", "[ (21/8 → 3/1) ⇝ 33/8 | gain:1 note:G2 clip:0.1 ]", "[ (45/16 → 3/1) ⇝ 57/16 | gain:0.4 note:C4 clip:0.1 ]", "[ (45/16 → 3/1) ⇝ 69/16 | gain:0.4 note:G3 clip:0.1 ]", - "[ 27/16 ⇜ (3/1 → 51/16) | gain:0.06400000000000002 note:G5 clip:0.1 ]", - "[ 39/16 ⇜ (3/1 → 51/16) | gain:0.06400000000000002 note:Eb6 clip:0.1 ]", + "[ 27/16 ⇜ (3/1 → 51/16) | gain:0.064 note:G5 clip:0.1 ]", + "[ 39/16 ⇜ (3/1 → 51/16) | gain:0.064 note:Eb6 clip:0.1 ]", "[ 45/16 ⇜ (3/1 → 51/16) ⇝ 57/16 | gain:0.4 note:C4 clip:0.1 ]", "[ 45/16 ⇜ (3/1 → 51/16) ⇝ 69/16 | gain:0.4 note:G3 clip:0.1 ]", "[ 3/1 → 51/16 | s:bd gain:0.7 ]", "[ 3/1 → 27/8 | gain:1 note:C2 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", - "[ (3/1 → 27/8) ⇝ 15/4 | gain:0.16000000000000003 note:C5 clip:0.1 ]", - "[ (3/1 → 27/8) ⇝ 9/2 | gain:0.16000000000000003 note:G4 clip:0.1 ]", + "[ (3/1 → 27/8) ⇝ 15/4 | gain:0.16 note:C5 clip:0.1 ]", + "[ (3/1 → 27/8) ⇝ 9/2 | gain:0.16 note:G4 clip:0.1 ]", "[ 9/4 ⇜ (3/1 → 15/4) | gain:1 note:G2 clip:0.1 ]", "[ 3/1 → 15/4 | gain:1 note:Eb3 clip:0.1 ]", "[ 51/16 → 27/8 | s:bd gain:0.7 ]", "[ 51/16 → 57/16 | gain:1 note:C2 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", - "[ (51/16 → 57/16) ⇝ 63/16 | gain:0.06400000000000002 note:C6 clip:0.1 ]", - "[ (51/16 → 57/16) ⇝ 75/16 | gain:0.06400000000000002 note:G5 clip:0.1 ]", + "[ (51/16 → 57/16) ⇝ 63/16 | gain:0.064 note:C6 clip:0.1 ]", + "[ (51/16 → 57/16) ⇝ 75/16 | gain:0.064 note:G5 clip:0.1 ]", "[ 39/16 ⇜ (51/16 → 63/16) | gain:0.4 note:G3 clip:0.1 ]", "[ 51/16 → 63/16 | gain:0.4 note:Eb4 clip:0.1 ]", "[ 27/8 → 15/4 | s:hh gain:0.7 ]", "[ 27/8 → 15/4 | gain:1 note:A1 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", - "[ 21/8 ⇜ (27/8 → 33/8) | gain:0.16000000000000003 note:G4 clip:0.1 ]", - "[ 27/8 → 33/8 | gain:0.16000000000000003 note:Eb5 clip:0.1 ]", + "[ 21/8 ⇜ (27/8 → 33/8) | gain:0.16 note:G4 clip:0.1 ]", + "[ 27/8 → 33/8 | gain:0.16 note:Eb5 clip:0.1 ]", "[ 57/16 → 63/16 | gain:1 note:A1 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", - "[ 45/16 ⇜ (57/16 → 69/16) | gain:0.06400000000000002 note:G5 clip:0.1 ]", - "[ 57/16 → 69/16 | gain:0.06400000000000002 note:Eb6 clip:0.1 ]", + "[ 45/16 ⇜ (57/16 → 69/16) | gain:0.064 note:G5 clip:0.1 ]", + "[ 57/16 → 69/16 | gain:0.064 note:Eb6 clip:0.1 ]", "[ 15/4 → 33/8 | s:sn gain:0.7 ]", "[ 15/4 → 33/8 | gain:1 note:Bb1 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", "[ 15/4 → 9/2 | gain:1 note:C3 clip:0.1 ]", @@ -8417,117 +8417,117 @@ exports[`renders tunes > tune: undergroundPlumber 1`] = ` "[ (63/16 → 9/2) ⇝ 75/16 | gain:0.4 note:C4 clip:0.1 ]", "[ (63/16 → 9/2) ⇝ 87/16 | gain:0.4 note:G3 clip:0.1 ]", "[ 33/8 → 9/2 | s:hh gain:0.7 ]", - "[ (33/8 → 9/2) ⇝ 39/8 | gain:0.16000000000000003 note:C5 clip:0.1 ]", - "[ (33/8 → 9/2) ⇝ 45/8 | gain:0.16000000000000003 note:G4 clip:0.1 ]", - "[ (69/16 → 9/2) ⇝ 81/16 | gain:0.06400000000000002 note:C6 clip:0.1 ]", - "[ (69/16 → 9/2) ⇝ 93/16 | gain:0.06400000000000002 note:G5 clip:0.1 ]", + "[ (33/8 → 9/2) ⇝ 39/8 | gain:0.16 note:C5 clip:0.1 ]", + "[ (33/8 → 9/2) ⇝ 45/8 | gain:0.16 note:G4 clip:0.1 ]", + "[ (69/16 → 9/2) ⇝ 81/16 | gain:0.064 note:C6 clip:0.1 ]", + "[ (69/16 → 9/2) ⇝ 93/16 | gain:0.064 note:G5 clip:0.1 ]", "[ 63/16 ⇜ (9/2 → 75/16) | gain:0.4 note:C4 clip:0.1 ]", "[ 63/16 ⇜ (9/2 → 75/16) ⇝ 87/16 | gain:0.4 note:G3 clip:0.1 ]", "[ 27/8 ⇜ (9/2 → 39/8) | gain:1 note:G2 clip:0.1 ]", "[ 33/8 ⇜ (9/2 → 39/8) | gain:1 note:Eb3 clip:0.1 ]", - "[ 33/8 ⇜ (9/2 → 39/8) | gain:0.16000000000000003 note:C5 clip:0.1 ]", - "[ 33/8 ⇜ (9/2 → 39/8) ⇝ 45/8 | gain:0.16000000000000003 note:G4 clip:0.1 ]", + "[ 33/8 ⇜ (9/2 → 39/8) | gain:0.16 note:C5 clip:0.1 ]", + "[ 33/8 ⇜ (9/2 → 39/8) ⇝ 45/8 | gain:0.16 note:G4 clip:0.1 ]", "[ 9/2 → 39/8 | s:bd gain:0.7 ]", - "[ 69/16 ⇜ (9/2 → 81/16) | gain:0.06400000000000002 note:C6 clip:0.1 ]", - "[ 69/16 ⇜ (9/2 → 81/16) ⇝ 93/16 | gain:0.06400000000000002 note:G5 clip:0.1 ]", + "[ 69/16 ⇜ (9/2 → 81/16) | gain:0.064 note:C6 clip:0.1 ]", + "[ 69/16 ⇜ (9/2 → 81/16) ⇝ 93/16 | gain:0.064 note:G5 clip:0.1 ]", "[ 57/16 ⇜ (75/16 → 81/16) | gain:0.4 note:G3 clip:0.1 ]", "[ 69/16 ⇜ (75/16 → 81/16) | gain:0.4 note:Eb4 clip:0.1 ]", - "[ 15/4 ⇜ (39/8 → 21/4) | gain:0.16000000000000003 note:G4 clip:0.1 ]", - "[ 9/2 ⇜ (39/8 → 21/4) | gain:0.16000000000000003 note:Eb5 clip:0.1 ]", + "[ 15/4 ⇜ (39/8 → 21/4) | gain:0.16 note:G4 clip:0.1 ]", + "[ 9/2 ⇜ (39/8 → 21/4) | gain:0.16 note:Eb5 clip:0.1 ]", "[ 39/8 → 21/4 | s:hh gain:0.7 ]", "[ 39/8 → 45/8 | gain:1 note:C3 clip:0.1 ]", "[ (39/8 → 6/1) ⇝ 51/8 | gain:1 note:G2 clip:0.1 ]", - "[ 63/16 ⇜ (81/16 → 87/16) | gain:0.06400000000000002 note:G5 clip:0.1 ]", - "[ 75/16 ⇜ (81/16 → 87/16) | gain:0.06400000000000002 note:Eb6 clip:0.1 ]", + "[ 63/16 ⇜ (81/16 → 87/16) | gain:0.064 note:G5 clip:0.1 ]", + "[ 75/16 ⇜ (81/16 → 87/16) | gain:0.064 note:Eb6 clip:0.1 ]", "[ 81/16 → 93/16 | gain:0.4 note:C4 clip:0.1 ]", "[ (81/16 → 6/1) ⇝ 105/16 | gain:0.4 note:G3 clip:0.1 ]", "[ 21/4 → 45/8 | s:sn gain:0.7 ]", - "[ 21/4 → 6/1 | gain:0.16000000000000003 note:C5 clip:0.1 ]", - "[ (21/4 → 6/1) ⇝ 27/4 | gain:0.16000000000000003 note:G4 clip:0.1 ]", - "[ (87/16 → 6/1) ⇝ 99/16 | gain:0.06400000000000002 note:C6 clip:0.1 ]", - "[ (87/16 → 6/1) ⇝ 111/16 | gain:0.06400000000000002 note:G5 clip:0.1 ]", + "[ 21/4 → 6/1 | gain:0.16 note:C5 clip:0.1 ]", + "[ (21/4 → 6/1) ⇝ 27/4 | gain:0.16 note:G4 clip:0.1 ]", + "[ (87/16 → 6/1) ⇝ 99/16 | gain:0.064 note:C6 clip:0.1 ]", + "[ (87/16 → 6/1) ⇝ 111/16 | gain:0.064 note:G5 clip:0.1 ]", "[ 45/8 → 6/1 | s:hh gain:0.7 ]", "[ (45/8 → 6/1) ⇝ 51/8 | gain:1 note:Eb3 clip:0.1 ]", "[ (93/16 → 6/1) ⇝ 105/16 | gain:0.4 note:Eb4 clip:0.1 ]", "[ 81/16 ⇜ (6/1 → 99/16) ⇝ 105/16 | gain:0.4 note:C4 clip:0.1 ]", - "[ 87/16 ⇜ (6/1 → 99/16) | gain:0.06400000000000002 note:F6 clip:0.1 ]", + "[ 87/16 ⇜ (6/1 → 99/16) | gain:0.064 note:F6 clip:0.1 ]", "[ 93/16 ⇜ (6/1 → 99/16) ⇝ 105/16 | gain:0.4 note:Ab4 clip:0.1 ]", "[ 6/1 → 99/16 | s:bd gain:0.7 ]", - "[ 21/4 ⇜ (6/1 → 51/8) ⇝ 27/4 | gain:0.16000000000000003 note:C5 clip:0.1 ]", + "[ 21/4 ⇜ (6/1 → 51/8) ⇝ 27/4 | gain:0.16 note:C5 clip:0.1 ]", "[ 6/1 → 51/8 | gain:1 note:F2 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", - "[ (6/1 → 51/8) ⇝ 27/4 | gain:0.16000000000000003 note:Ab5 clip:0.1 ]", - "[ 87/16 ⇜ (6/1 → 105/16) ⇝ 111/16 | gain:0.06400000000000002 note:C6 clip:0.1 ]", + "[ (6/1 → 51/8) ⇝ 27/4 | gain:0.16 note:Ab5 clip:0.1 ]", + "[ 87/16 ⇜ (6/1 → 105/16) ⇝ 111/16 | gain:0.064 note:C6 clip:0.1 ]", "[ 6/1 → 27/4 | gain:1 note:F3 clip:0.1 ]", "[ 6/1 → 15/2 | gain:1 note:C3 clip:0.1 ]", "[ 99/16 → 51/8 | s:bd gain:0.7 ]", "[ 99/16 → 105/16 | gain:1 note:F2 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", - "[ (99/16 → 105/16) ⇝ 111/16 | gain:0.06400000000000002 note:Ab6 clip:0.1 ]", + "[ (99/16 → 105/16) ⇝ 111/16 | gain:0.064 note:Ab6 clip:0.1 ]", "[ 99/16 → 111/16 | gain:0.4 note:F4 clip:0.1 ]", "[ (99/16 → 15/2) ⇝ 123/16 | gain:0.4 note:C4 clip:0.1 ]", "[ 51/8 → 27/4 | s:hh gain:0.7 ]", "[ 51/8 → 27/4 | gain:1 note:D2 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", - "[ 51/8 → 57/8 | gain:0.16000000000000003 note:F5 clip:0.1 ]", - "[ (51/8 → 15/2) ⇝ 63/8 | gain:0.16000000000000003 note:C5 clip:0.1 ]", + "[ 51/8 → 57/8 | gain:0.16 note:F5 clip:0.1 ]", + "[ (51/8 → 15/2) ⇝ 63/8 | gain:0.16 note:C5 clip:0.1 ]", "[ 105/16 → 111/16 | gain:1 note:D2 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", - "[ 105/16 → 117/16 | gain:0.06400000000000002 note:F6 clip:0.1 ]", - "[ (105/16 → 15/2) ⇝ 129/16 | gain:0.06400000000000002 note:C6 clip:0.1 ]", + "[ 105/16 → 117/16 | gain:0.064 note:F6 clip:0.1 ]", + "[ (105/16 → 15/2) ⇝ 129/16 | gain:0.064 note:C6 clip:0.1 ]", "[ 27/4 → 57/8 | s:sn gain:0.7 ]", "[ 27/4 → 57/8 | gain:1 note:Eb2 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", "[ 27/4 → 15/2 | gain:1 note:Ab3 clip:0.1 ]", "[ 111/16 → 117/16 | gain:1 note:Eb2 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", "[ (111/16 → 15/2) ⇝ 123/16 | gain:0.4 note:Ab4 clip:0.1 ]", "[ 57/8 → 15/2 | s:hh gain:0.7 ]", - "[ (57/8 → 15/2) ⇝ 63/8 | gain:0.16000000000000003 note:Ab5 clip:0.1 ]", - "[ (117/16 → 15/2) ⇝ 129/16 | gain:0.06400000000000002 note:Ab6 clip:0.1 ]", + "[ (57/8 → 15/2) ⇝ 63/8 | gain:0.16 note:Ab5 clip:0.1 ]", + "[ (117/16 → 15/2) ⇝ 129/16 | gain:0.064 note:Ab6 clip:0.1 ]", "[ 99/16 ⇜ (15/2 → 123/16) | gain:0.4 note:C4 clip:0.1 ]", "[ 111/16 ⇜ (15/2 → 123/16) | gain:0.4 note:Ab4 clip:0.1 ]", - "[ 51/8 ⇜ (15/2 → 63/8) | gain:0.16000000000000003 note:C5 clip:0.1 ]", + "[ 51/8 ⇜ (15/2 → 63/8) | gain:0.16 note:C5 clip:0.1 ]", "[ 57/8 ⇜ (15/2 → 63/8) | gain:1 note:F3 clip:0.1 ]", - "[ 57/8 ⇜ (15/2 → 63/8) | gain:0.16000000000000003 note:Ab5 clip:0.1 ]", + "[ 57/8 ⇜ (15/2 → 63/8) | gain:0.16 note:Ab5 clip:0.1 ]", "[ 15/2 → 63/8 | s:bd gain:0.7 ]", - "[ 105/16 ⇜ (15/2 → 129/16) | gain:0.06400000000000002 note:C6 clip:0.1 ]", - "[ 117/16 ⇜ (15/2 → 129/16) | gain:0.06400000000000002 note:Ab6 clip:0.1 ]", + "[ 105/16 ⇜ (15/2 → 129/16) | gain:0.064 note:C6 clip:0.1 ]", + "[ 117/16 ⇜ (15/2 → 129/16) | gain:0.064 note:Ab6 clip:0.1 ]", "[ 57/8 ⇜ (15/2 → 69/8) | gain:1 note:C3 clip:0.1 ]", "[ 117/16 ⇜ (123/16 → 129/16) | gain:0.4 note:F4 clip:0.1 ]", "[ 117/16 ⇜ (123/16 → 141/16) | gain:0.4 note:C4 clip:0.1 ]", - "[ 15/2 ⇜ (63/8 → 33/4) | gain:0.16000000000000003 note:F5 clip:0.1 ]", + "[ 15/2 ⇜ (63/8 → 33/4) | gain:0.16 note:F5 clip:0.1 ]", "[ 63/8 → 33/4 | s:hh gain:0.7 ]", "[ 63/8 → 69/8 | gain:1 note:Ab3 clip:0.1 ]", - "[ 15/2 ⇜ (63/8 → 9/1) | gain:0.16000000000000003 note:C5 clip:0.1 ]", - "[ 123/16 ⇜ (129/16 → 135/16) | gain:0.06400000000000002 note:F6 clip:0.1 ]", + "[ 15/2 ⇜ (63/8 → 9/1) | gain:0.16 note:C5 clip:0.1 ]", + "[ 123/16 ⇜ (129/16 → 135/16) | gain:0.064 note:F6 clip:0.1 ]", "[ 129/16 → 141/16 | gain:0.4 note:Ab4 clip:0.1 ]", - "[ 123/16 ⇜ (129/16 → 9/1) ⇝ 147/16 | gain:0.06400000000000002 note:C6 clip:0.1 ]", + "[ 123/16 ⇜ (129/16 → 9/1) ⇝ 147/16 | gain:0.064 note:C6 clip:0.1 ]", "[ 33/4 → 69/8 | s:sn gain:0.7 ]", - "[ 33/4 → 9/1 | gain:0.16000000000000003 note:Ab5 clip:0.1 ]", - "[ (135/16 → 9/1) ⇝ 147/16 | gain:0.06400000000000002 note:Ab6 clip:0.1 ]", + "[ 33/4 → 9/1 | gain:0.16 note:Ab5 clip:0.1 ]", + "[ (135/16 → 9/1) ⇝ 147/16 | gain:0.064 note:Ab6 clip:0.1 ]", "[ 69/8 → 9/1 | s:hh gain:0.7 ]", "[ (69/8 → 9/1) ⇝ 75/8 | gain:1 note:F3 clip:0.1 ]", "[ (69/8 → 9/1) ⇝ 81/8 | gain:1 note:C3 clip:0.1 ]", "[ (141/16 → 9/1) ⇝ 153/16 | gain:0.4 note:F4 clip:0.1 ]", "[ (141/16 → 9/1) ⇝ 165/16 | gain:0.4 note:C4 clip:0.1 ]", - "[ 123/16 ⇜ (9/1 → 147/16) | gain:0.06400000000000002 note:G5 clip:0.1 ]", - "[ 135/16 ⇜ (9/1 → 147/16) | gain:0.06400000000000002 note:Eb6 clip:0.1 ]", + "[ 123/16 ⇜ (9/1 → 147/16) | gain:0.064 note:G5 clip:0.1 ]", + "[ 135/16 ⇜ (9/1 → 147/16) | gain:0.064 note:Eb6 clip:0.1 ]", "[ 141/16 ⇜ (9/1 → 147/16) ⇝ 153/16 | gain:0.4 note:C4 clip:0.1 ]", "[ 141/16 ⇜ (9/1 → 147/16) ⇝ 165/16 | gain:0.4 note:G3 clip:0.1 ]", "[ 9/1 → 147/16 | s:bd gain:0.7 ]", "[ 9/1 → 75/8 | gain:1 note:C2 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", - "[ (9/1 → 75/8) ⇝ 39/4 | gain:0.16000000000000003 note:C5 clip:0.1 ]", - "[ (9/1 → 75/8) ⇝ 21/2 | gain:0.16000000000000003 note:G4 clip:0.1 ]", + "[ (9/1 → 75/8) ⇝ 39/4 | gain:0.16 note:C5 clip:0.1 ]", + "[ (9/1 → 75/8) ⇝ 21/2 | gain:0.16 note:G4 clip:0.1 ]", "[ 33/4 ⇜ (9/1 → 39/4) | gain:1 note:G2 clip:0.1 ]", "[ 9/1 → 39/4 | gain:1 note:Eb3 clip:0.1 ]", "[ 147/16 → 75/8 | s:bd gain:0.7 ]", "[ 147/16 → 153/16 | gain:1 note:C2 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", - "[ (147/16 → 153/16) ⇝ 159/16 | gain:0.06400000000000002 note:C6 clip:0.1 ]", - "[ (147/16 → 153/16) ⇝ 171/16 | gain:0.06400000000000002 note:G5 clip:0.1 ]", + "[ (147/16 → 153/16) ⇝ 159/16 | gain:0.064 note:C6 clip:0.1 ]", + "[ (147/16 → 153/16) ⇝ 171/16 | gain:0.064 note:G5 clip:0.1 ]", "[ 135/16 ⇜ (147/16 → 159/16) | gain:0.4 note:G3 clip:0.1 ]", "[ 147/16 → 159/16 | gain:0.4 note:Eb4 clip:0.1 ]", "[ 75/8 → 39/4 | s:hh gain:0.7 ]", "[ 75/8 → 39/4 | gain:1 note:A1 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", - "[ 69/8 ⇜ (75/8 → 81/8) | gain:0.16000000000000003 note:G4 clip:0.1 ]", - "[ 75/8 → 81/8 | gain:0.16000000000000003 note:Eb5 clip:0.1 ]", + "[ 69/8 ⇜ (75/8 → 81/8) | gain:0.16 note:G4 clip:0.1 ]", + "[ 75/8 → 81/8 | gain:0.16 note:Eb5 clip:0.1 ]", "[ 153/16 → 159/16 | gain:1 note:A1 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", - "[ 141/16 ⇜ (153/16 → 165/16) | gain:0.06400000000000002 note:G5 clip:0.1 ]", - "[ 153/16 → 165/16 | gain:0.06400000000000002 note:Eb6 clip:0.1 ]", + "[ 141/16 ⇜ (153/16 → 165/16) | gain:0.064 note:G5 clip:0.1 ]", + "[ 153/16 → 165/16 | gain:0.064 note:Eb6 clip:0.1 ]", "[ 39/4 → 81/8 | s:sn gain:0.7 ]", "[ 39/4 → 81/8 | gain:1 note:Bb1 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", "[ 39/4 → 21/2 | gain:1 note:C3 clip:0.1 ]", @@ -8536,117 +8536,117 @@ exports[`renders tunes > tune: undergroundPlumber 1`] = ` "[ (159/16 → 21/2) ⇝ 171/16 | gain:0.4 note:C4 clip:0.1 ]", "[ (159/16 → 21/2) ⇝ 183/16 | gain:0.4 note:G3 clip:0.1 ]", "[ 81/8 → 21/2 | s:hh gain:0.7 ]", - "[ (81/8 → 21/2) ⇝ 87/8 | gain:0.16000000000000003 note:C5 clip:0.1 ]", - "[ (81/8 → 21/2) ⇝ 93/8 | gain:0.16000000000000003 note:G4 clip:0.1 ]", - "[ (165/16 → 21/2) ⇝ 177/16 | gain:0.06400000000000002 note:C6 clip:0.1 ]", - "[ (165/16 → 21/2) ⇝ 189/16 | gain:0.06400000000000002 note:G5 clip:0.1 ]", + "[ (81/8 → 21/2) ⇝ 87/8 | gain:0.16 note:C5 clip:0.1 ]", + "[ (81/8 → 21/2) ⇝ 93/8 | gain:0.16 note:G4 clip:0.1 ]", + "[ (165/16 → 21/2) ⇝ 177/16 | gain:0.064 note:C6 clip:0.1 ]", + "[ (165/16 → 21/2) ⇝ 189/16 | gain:0.064 note:G5 clip:0.1 ]", "[ 159/16 ⇜ (21/2 → 171/16) | gain:0.4 note:C4 clip:0.1 ]", "[ 159/16 ⇜ (21/2 → 171/16) ⇝ 183/16 | gain:0.4 note:G3 clip:0.1 ]", "[ 75/8 ⇜ (21/2 → 87/8) | gain:1 note:G2 clip:0.1 ]", "[ 81/8 ⇜ (21/2 → 87/8) | gain:1 note:Eb3 clip:0.1 ]", - "[ 81/8 ⇜ (21/2 → 87/8) | gain:0.16000000000000003 note:C5 clip:0.1 ]", - "[ 81/8 ⇜ (21/2 → 87/8) ⇝ 93/8 | gain:0.16000000000000003 note:G4 clip:0.1 ]", + "[ 81/8 ⇜ (21/2 → 87/8) | gain:0.16 note:C5 clip:0.1 ]", + "[ 81/8 ⇜ (21/2 → 87/8) ⇝ 93/8 | gain:0.16 note:G4 clip:0.1 ]", "[ 21/2 → 87/8 | s:bd gain:0.7 ]", - "[ 165/16 ⇜ (21/2 → 177/16) | gain:0.06400000000000002 note:C6 clip:0.1 ]", - "[ 165/16 ⇜ (21/2 → 177/16) ⇝ 189/16 | gain:0.06400000000000002 note:G5 clip:0.1 ]", + "[ 165/16 ⇜ (21/2 → 177/16) | gain:0.064 note:C6 clip:0.1 ]", + "[ 165/16 ⇜ (21/2 → 177/16) ⇝ 189/16 | gain:0.064 note:G5 clip:0.1 ]", "[ 153/16 ⇜ (171/16 → 177/16) | gain:0.4 note:G3 clip:0.1 ]", "[ 165/16 ⇜ (171/16 → 177/16) | gain:0.4 note:Eb4 clip:0.1 ]", - "[ 39/4 ⇜ (87/8 → 45/4) | gain:0.16000000000000003 note:G4 clip:0.1 ]", - "[ 21/2 ⇜ (87/8 → 45/4) | gain:0.16000000000000003 note:Eb5 clip:0.1 ]", + "[ 39/4 ⇜ (87/8 → 45/4) | gain:0.16 note:G4 clip:0.1 ]", + "[ 21/2 ⇜ (87/8 → 45/4) | gain:0.16 note:Eb5 clip:0.1 ]", "[ 87/8 → 45/4 | s:hh gain:0.7 ]", "[ 87/8 → 93/8 | gain:1 note:C3 clip:0.1 ]", "[ (87/8 → 12/1) ⇝ 99/8 | gain:1 note:G2 clip:0.1 ]", - "[ 159/16 ⇜ (177/16 → 183/16) | gain:0.06400000000000002 note:G5 clip:0.1 ]", - "[ 171/16 ⇜ (177/16 → 183/16) | gain:0.06400000000000002 note:Eb6 clip:0.1 ]", + "[ 159/16 ⇜ (177/16 → 183/16) | gain:0.064 note:G5 clip:0.1 ]", + "[ 171/16 ⇜ (177/16 → 183/16) | gain:0.064 note:Eb6 clip:0.1 ]", "[ 177/16 → 189/16 | gain:0.4 note:C4 clip:0.1 ]", "[ (177/16 → 12/1) ⇝ 201/16 | gain:0.4 note:G3 clip:0.1 ]", "[ 45/4 → 93/8 | s:sn gain:0.7 ]", - "[ 45/4 → 12/1 | gain:0.16000000000000003 note:C5 clip:0.1 ]", - "[ (45/4 → 12/1) ⇝ 51/4 | gain:0.16000000000000003 note:G4 clip:0.1 ]", - "[ (183/16 → 12/1) ⇝ 195/16 | gain:0.06400000000000002 note:C6 clip:0.1 ]", - "[ (183/16 → 12/1) ⇝ 207/16 | gain:0.06400000000000002 note:G5 clip:0.1 ]", + "[ 45/4 → 12/1 | gain:0.16 note:C5 clip:0.1 ]", + "[ (45/4 → 12/1) ⇝ 51/4 | gain:0.16 note:G4 clip:0.1 ]", + "[ (183/16 → 12/1) ⇝ 195/16 | gain:0.064 note:C6 clip:0.1 ]", + "[ (183/16 → 12/1) ⇝ 207/16 | gain:0.064 note:G5 clip:0.1 ]", "[ 93/8 → 12/1 | s:hh gain:0.7 ]", "[ (93/8 → 12/1) ⇝ 99/8 | gain:1 note:Eb3 clip:0.1 ]", "[ (189/16 → 12/1) ⇝ 201/16 | gain:0.4 note:Eb4 clip:0.1 ]", "[ 177/16 ⇜ (12/1 → 195/16) ⇝ 201/16 | gain:0.4 note:D4 clip:0.1 ]", - "[ 183/16 ⇜ (12/1 → 195/16) | gain:0.06400000000000002 note:G6 clip:0.1 ]", + "[ 183/16 ⇜ (12/1 → 195/16) | gain:0.064 note:G6 clip:0.1 ]", "[ 189/16 ⇜ (12/1 → 195/16) ⇝ 201/16 | gain:0.4 note:Bb4 clip:0.1 ]", "[ 12/1 → 195/16 | s:bd gain:0.7 ]", - "[ 45/4 ⇜ (12/1 → 99/8) ⇝ 51/4 | gain:0.16000000000000003 note:D5 clip:0.1 ]", + "[ 45/4 ⇜ (12/1 → 99/8) ⇝ 51/4 | gain:0.16 note:D5 clip:0.1 ]", "[ 12/1 → 99/8 | gain:1 note:G2 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", - "[ (12/1 → 99/8) ⇝ 51/4 | gain:0.16000000000000003 note:Bb5 clip:0.1 ]", - "[ 183/16 ⇜ (12/1 → 201/16) ⇝ 207/16 | gain:0.06400000000000002 note:D6 clip:0.1 ]", + "[ (12/1 → 99/8) ⇝ 51/4 | gain:0.16 note:Bb5 clip:0.1 ]", + "[ 183/16 ⇜ (12/1 → 201/16) ⇝ 207/16 | gain:0.064 note:D6 clip:0.1 ]", "[ 12/1 → 51/4 | gain:1 note:G3 clip:0.1 ]", "[ 12/1 → 27/2 | gain:1 note:D3 clip:0.1 ]", "[ 195/16 → 99/8 | s:bd gain:0.7 ]", "[ 195/16 → 201/16 | gain:1 note:G2 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", - "[ (195/16 → 201/16) ⇝ 207/16 | gain:0.06400000000000002 note:Bb6 clip:0.1 ]", + "[ (195/16 → 201/16) ⇝ 207/16 | gain:0.064 note:Bb6 clip:0.1 ]", "[ 195/16 → 207/16 | gain:0.4 note:G4 clip:0.1 ]", "[ (195/16 → 27/2) ⇝ 219/16 | gain:0.4 note:D4 clip:0.1 ]", "[ 99/8 → 51/4 | s:hh gain:0.7 ]", "[ 99/8 → 51/4 | gain:1 note:E2 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", - "[ 99/8 → 105/8 | gain:0.16000000000000003 note:G5 clip:0.1 ]", - "[ (99/8 → 27/2) ⇝ 111/8 | gain:0.16000000000000003 note:D5 clip:0.1 ]", + "[ 99/8 → 105/8 | gain:0.16 note:G5 clip:0.1 ]", + "[ (99/8 → 27/2) ⇝ 111/8 | gain:0.16 note:D5 clip:0.1 ]", "[ 201/16 → 207/16 | gain:1 note:E2 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", - "[ 201/16 → 213/16 | gain:0.06400000000000002 note:G6 clip:0.1 ]", - "[ (201/16 → 27/2) ⇝ 225/16 | gain:0.06400000000000002 note:D6 clip:0.1 ]", + "[ 201/16 → 213/16 | gain:0.064 note:G6 clip:0.1 ]", + "[ (201/16 → 27/2) ⇝ 225/16 | gain:0.064 note:D6 clip:0.1 ]", "[ 51/4 → 105/8 | s:sn gain:0.7 ]", "[ 51/4 → 105/8 | gain:1 note:F2 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", "[ 51/4 → 27/2 | gain:1 note:Bb3 clip:0.1 ]", "[ 207/16 → 213/16 | gain:1 note:F2 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", "[ (207/16 → 27/2) ⇝ 219/16 | gain:0.4 note:Bb4 clip:0.1 ]", "[ 105/8 → 27/2 | s:hh gain:0.7 ]", - "[ (105/8 → 27/2) ⇝ 111/8 | gain:0.16000000000000003 note:Bb5 clip:0.1 ]", - "[ (213/16 → 27/2) ⇝ 225/16 | gain:0.06400000000000002 note:Bb6 clip:0.1 ]", + "[ (105/8 → 27/2) ⇝ 111/8 | gain:0.16 note:Bb5 clip:0.1 ]", + "[ (213/16 → 27/2) ⇝ 225/16 | gain:0.064 note:Bb6 clip:0.1 ]", "[ 195/16 ⇜ (27/2 → 219/16) | gain:0.4 note:D4 clip:0.1 ]", "[ 207/16 ⇜ (27/2 → 219/16) | gain:0.4 note:Bb4 clip:0.1 ]", - "[ 99/8 ⇜ (27/2 → 111/8) | gain:0.16000000000000003 note:D5 clip:0.1 ]", + "[ 99/8 ⇜ (27/2 → 111/8) | gain:0.16 note:D5 clip:0.1 ]", "[ 105/8 ⇜ (27/2 → 111/8) | gain:1 note:G3 clip:0.1 ]", - "[ 105/8 ⇜ (27/2 → 111/8) | gain:0.16000000000000003 note:Bb5 clip:0.1 ]", + "[ 105/8 ⇜ (27/2 → 111/8) | gain:0.16 note:Bb5 clip:0.1 ]", "[ 27/2 → 111/8 | s:bd gain:0.7 ]", - "[ 201/16 ⇜ (27/2 → 225/16) | gain:0.06400000000000002 note:D6 clip:0.1 ]", - "[ 213/16 ⇜ (27/2 → 225/16) | gain:0.06400000000000002 note:Bb6 clip:0.1 ]", + "[ 201/16 ⇜ (27/2 → 225/16) | gain:0.064 note:D6 clip:0.1 ]", + "[ 213/16 ⇜ (27/2 → 225/16) | gain:0.064 note:Bb6 clip:0.1 ]", "[ 105/8 ⇜ (27/2 → 117/8) | gain:1 note:D3 clip:0.1 ]", "[ 213/16 ⇜ (219/16 → 225/16) | gain:0.4 note:G4 clip:0.1 ]", "[ 213/16 ⇜ (219/16 → 237/16) | gain:0.4 note:D4 clip:0.1 ]", - "[ 27/2 ⇜ (111/8 → 57/4) | gain:0.16000000000000003 note:G5 clip:0.1 ]", + "[ 27/2 ⇜ (111/8 → 57/4) | gain:0.16 note:G5 clip:0.1 ]", "[ 111/8 → 57/4 | s:hh gain:0.7 ]", "[ 111/8 → 117/8 | gain:1 note:Bb3 clip:0.1 ]", - "[ 27/2 ⇜ (111/8 → 15/1) | gain:0.16000000000000003 note:D5 clip:0.1 ]", - "[ 219/16 ⇜ (225/16 → 231/16) | gain:0.06400000000000002 note:G6 clip:0.1 ]", + "[ 27/2 ⇜ (111/8 → 15/1) | gain:0.16 note:D5 clip:0.1 ]", + "[ 219/16 ⇜ (225/16 → 231/16) | gain:0.064 note:G6 clip:0.1 ]", "[ 225/16 → 237/16 | gain:0.4 note:Bb4 clip:0.1 ]", - "[ 219/16 ⇜ (225/16 → 15/1) ⇝ 243/16 | gain:0.06400000000000002 note:D6 clip:0.1 ]", + "[ 219/16 ⇜ (225/16 → 15/1) ⇝ 243/16 | gain:0.064 note:D6 clip:0.1 ]", "[ 57/4 → 117/8 | s:sn gain:0.7 ]", - "[ 57/4 → 15/1 | gain:0.16000000000000003 note:Bb5 clip:0.1 ]", - "[ (231/16 → 15/1) ⇝ 243/16 | gain:0.06400000000000002 note:Bb6 clip:0.1 ]", + "[ 57/4 → 15/1 | gain:0.16 note:Bb5 clip:0.1 ]", + "[ (231/16 → 15/1) ⇝ 243/16 | gain:0.064 note:Bb6 clip:0.1 ]", "[ 117/8 → 15/1 | s:hh gain:0.7 ]", "[ (117/8 → 15/1) ⇝ 123/8 | gain:1 note:G3 clip:0.1 ]", "[ (117/8 → 15/1) ⇝ 129/8 | gain:1 note:D3 clip:0.1 ]", "[ (237/16 → 15/1) ⇝ 249/16 | gain:0.4 note:G4 clip:0.1 ]", "[ (237/16 → 15/1) ⇝ 261/16 | gain:0.4 note:D4 clip:0.1 ]", - "[ 219/16 ⇜ (15/1 → 243/16) | gain:0.06400000000000002 note:C6 clip:0.1 ]", - "[ 231/16 ⇜ (15/1 → 243/16) | gain:0.06400000000000002 note:Ab6 clip:0.1 ]", + "[ 219/16 ⇜ (15/1 → 243/16) | gain:0.064 note:C6 clip:0.1 ]", + "[ 231/16 ⇜ (15/1 → 243/16) | gain:0.064 note:Ab6 clip:0.1 ]", "[ 237/16 ⇜ (15/1 → 243/16) ⇝ 249/16 | gain:0.4 note:F4 clip:0.1 ]", "[ 237/16 ⇜ (15/1 → 243/16) ⇝ 261/16 | gain:0.4 note:C4 clip:0.1 ]", "[ 15/1 → 243/16 | s:bd gain:0.7 ]", "[ 15/1 → 123/8 | gain:1 note:F2 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", - "[ (15/1 → 123/8) ⇝ 63/4 | gain:0.16000000000000003 note:F5 clip:0.1 ]", - "[ (15/1 → 123/8) ⇝ 33/2 | gain:0.16000000000000003 note:C5 clip:0.1 ]", + "[ (15/1 → 123/8) ⇝ 63/4 | gain:0.16 note:F5 clip:0.1 ]", + "[ (15/1 → 123/8) ⇝ 33/2 | gain:0.16 note:C5 clip:0.1 ]", "[ 57/4 ⇜ (15/1 → 63/4) | gain:1 note:C3 clip:0.1 ]", "[ 15/1 → 63/4 | gain:1 note:Ab3 clip:0.1 ]", "[ 243/16 → 123/8 | s:bd gain:0.7 ]", "[ 243/16 → 249/16 | gain:1 note:F2 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", - "[ (243/16 → 249/16) ⇝ 255/16 | gain:0.06400000000000002 note:F6 clip:0.1 ]", - "[ (243/16 → 249/16) ⇝ 267/16 | gain:0.06400000000000002 note:C6 clip:0.1 ]", + "[ (243/16 → 249/16) ⇝ 255/16 | gain:0.064 note:F6 clip:0.1 ]", + "[ (243/16 → 249/16) ⇝ 267/16 | gain:0.064 note:C6 clip:0.1 ]", "[ 231/16 ⇜ (243/16 → 255/16) | gain:0.4 note:C4 clip:0.1 ]", "[ 243/16 → 255/16 | gain:0.4 note:Ab4 clip:0.1 ]", "[ 123/8 → 63/4 | s:hh gain:0.7 ]", "[ 123/8 → 63/4 | gain:1 note:D2 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", - "[ 117/8 ⇜ (123/8 → 129/8) | gain:0.16000000000000003 note:C5 clip:0.1 ]", - "[ 123/8 → 129/8 | gain:0.16000000000000003 note:Ab5 clip:0.1 ]", + "[ 117/8 ⇜ (123/8 → 129/8) | gain:0.16 note:C5 clip:0.1 ]", + "[ 123/8 → 129/8 | gain:0.16 note:Ab5 clip:0.1 ]", "[ 249/16 → 255/16 | gain:1 note:D2 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", - "[ 237/16 ⇜ (249/16 → 261/16) | gain:0.06400000000000002 note:C6 clip:0.1 ]", - "[ 249/16 → 261/16 | gain:0.06400000000000002 note:Ab6 clip:0.1 ]", + "[ 237/16 ⇜ (249/16 → 261/16) | gain:0.064 note:C6 clip:0.1 ]", + "[ 249/16 → 261/16 | gain:0.064 note:Ab6 clip:0.1 ]", "[ 63/4 → 129/8 | s:sn gain:0.7 ]", "[ 63/4 → 129/8 | gain:1 note:Eb2 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", "[ 63/4 → 33/2 | gain:1 note:F3 clip:0.1 ]", @@ -8655,81 +8655,81 @@ exports[`renders tunes > tune: undergroundPlumber 1`] = ` "[ (255/16 → 33/2) ⇝ 267/16 | gain:0.4 note:F4 clip:0.1 ]", "[ (255/16 → 33/2) ⇝ 279/16 | gain:0.4 note:C4 clip:0.1 ]", "[ 129/8 → 33/2 | s:hh gain:0.7 ]", - "[ (129/8 → 33/2) ⇝ 135/8 | gain:0.16000000000000003 note:F5 clip:0.1 ]", - "[ (129/8 → 33/2) ⇝ 141/8 | gain:0.16000000000000003 note:C5 clip:0.1 ]", - "[ (261/16 → 33/2) ⇝ 273/16 | gain:0.06400000000000002 note:F6 clip:0.1 ]", - "[ (261/16 → 33/2) ⇝ 285/16 | gain:0.06400000000000002 note:C6 clip:0.1 ]", + "[ (129/8 → 33/2) ⇝ 135/8 | gain:0.16 note:F5 clip:0.1 ]", + "[ (129/8 → 33/2) ⇝ 141/8 | gain:0.16 note:C5 clip:0.1 ]", + "[ (261/16 → 33/2) ⇝ 273/16 | gain:0.064 note:F6 clip:0.1 ]", + "[ (261/16 → 33/2) ⇝ 285/16 | gain:0.064 note:C6 clip:0.1 ]", "[ 255/16 ⇜ (33/2 → 267/16) | gain:0.4 note:F4 clip:0.1 ]", "[ 255/16 ⇜ (33/2 → 267/16) ⇝ 279/16 | gain:0.4 note:C4 clip:0.1 ]", "[ 123/8 ⇜ (33/2 → 135/8) | gain:1 note:C3 clip:0.1 ]", "[ 129/8 ⇜ (33/2 → 135/8) | gain:1 note:Ab3 clip:0.1 ]", - "[ 129/8 ⇜ (33/2 → 135/8) | gain:0.16000000000000003 note:F5 clip:0.1 ]", - "[ 129/8 ⇜ (33/2 → 135/8) ⇝ 141/8 | gain:0.16000000000000003 note:C5 clip:0.1 ]", + "[ 129/8 ⇜ (33/2 → 135/8) | gain:0.16 note:F5 clip:0.1 ]", + "[ 129/8 ⇜ (33/2 → 135/8) ⇝ 141/8 | gain:0.16 note:C5 clip:0.1 ]", "[ 33/2 → 135/8 | s:bd gain:0.7 ]", - "[ 261/16 ⇜ (33/2 → 273/16) | gain:0.06400000000000002 note:F6 clip:0.1 ]", - "[ 261/16 ⇜ (33/2 → 273/16) ⇝ 285/16 | gain:0.06400000000000002 note:C6 clip:0.1 ]", + "[ 261/16 ⇜ (33/2 → 273/16) | gain:0.064 note:F6 clip:0.1 ]", + "[ 261/16 ⇜ (33/2 → 273/16) ⇝ 285/16 | gain:0.064 note:C6 clip:0.1 ]", "[ 249/16 ⇜ (267/16 → 273/16) | gain:0.4 note:C4 clip:0.1 ]", "[ 261/16 ⇜ (267/16 → 273/16) | gain:0.4 note:Ab4 clip:0.1 ]", - "[ 63/4 ⇜ (135/8 → 69/4) | gain:0.16000000000000003 note:C5 clip:0.1 ]", - "[ 33/2 ⇜ (135/8 → 69/4) | gain:0.16000000000000003 note:Ab5 clip:0.1 ]", + "[ 63/4 ⇜ (135/8 → 69/4) | gain:0.16 note:C5 clip:0.1 ]", + "[ 33/2 ⇜ (135/8 → 69/4) | gain:0.16 note:Ab5 clip:0.1 ]", "[ 135/8 → 69/4 | s:hh gain:0.7 ]", "[ 135/8 → 141/8 | gain:1 note:F3 clip:0.1 ]", "[ (135/8 → 18/1) ⇝ 147/8 | gain:1 note:C3 clip:0.1 ]", - "[ 255/16 ⇜ (273/16 → 279/16) | gain:0.06400000000000002 note:C6 clip:0.1 ]", - "[ 267/16 ⇜ (273/16 → 279/16) | gain:0.06400000000000002 note:Ab6 clip:0.1 ]", + "[ 255/16 ⇜ (273/16 → 279/16) | gain:0.064 note:C6 clip:0.1 ]", + "[ 267/16 ⇜ (273/16 → 279/16) | gain:0.064 note:Ab6 clip:0.1 ]", "[ 273/16 → 285/16 | gain:0.4 note:F4 clip:0.1 ]", "[ (273/16 → 18/1) ⇝ 297/16 | gain:0.4 note:C4 clip:0.1 ]", "[ 69/4 → 141/8 | s:sn gain:0.7 ]", - "[ 69/4 → 18/1 | gain:0.16000000000000003 note:F5 clip:0.1 ]", - "[ (69/4 → 18/1) ⇝ 75/4 | gain:0.16000000000000003 note:C5 clip:0.1 ]", - "[ (279/16 → 18/1) ⇝ 291/16 | gain:0.06400000000000002 note:F6 clip:0.1 ]", - "[ (279/16 → 18/1) ⇝ 303/16 | gain:0.06400000000000002 note:C6 clip:0.1 ]", + "[ 69/4 → 18/1 | gain:0.16 note:F5 clip:0.1 ]", + "[ (69/4 → 18/1) ⇝ 75/4 | gain:0.16 note:C5 clip:0.1 ]", + "[ (279/16 → 18/1) ⇝ 291/16 | gain:0.064 note:F6 clip:0.1 ]", + "[ (279/16 → 18/1) ⇝ 303/16 | gain:0.064 note:C6 clip:0.1 ]", "[ 141/8 → 18/1 | s:hh gain:0.7 ]", "[ (141/8 → 18/1) ⇝ 147/8 | gain:1 note:Ab3 clip:0.1 ]", "[ (285/16 → 18/1) ⇝ 297/16 | gain:0.4 note:Ab4 clip:0.1 ]", "[ 273/16 ⇜ (18/1 → 291/16) ⇝ 297/16 | gain:0.4 note:G3 clip:0.1 ]", - "[ 279/16 ⇜ (18/1 → 291/16) | gain:0.06400000000000002 note:C6 clip:0.1 ]", + "[ 279/16 ⇜ (18/1 → 291/16) | gain:0.064 note:C6 clip:0.1 ]", "[ 285/16 ⇜ (18/1 → 291/16) ⇝ 297/16 | gain:0.4 note:Eb4 clip:0.1 ]", "[ 18/1 → 291/16 | s:bd gain:0.7 ]", - "[ 69/4 ⇜ (18/1 → 147/8) ⇝ 75/4 | gain:0.16000000000000003 note:G4 clip:0.1 ]", + "[ 69/4 ⇜ (18/1 → 147/8) ⇝ 75/4 | gain:0.16 note:G4 clip:0.1 ]", "[ 18/1 → 147/8 | gain:1 note:C2 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", - "[ (18/1 → 147/8) ⇝ 75/4 | gain:0.16000000000000003 note:Eb5 clip:0.1 ]", - "[ 279/16 ⇜ (18/1 → 297/16) ⇝ 303/16 | gain:0.06400000000000002 note:G5 clip:0.1 ]", + "[ (18/1 → 147/8) ⇝ 75/4 | gain:0.16 note:Eb5 clip:0.1 ]", + "[ 279/16 ⇜ (18/1 → 297/16) ⇝ 303/16 | gain:0.064 note:G5 clip:0.1 ]", "[ 18/1 → 75/4 | gain:1 note:C3 clip:0.1 ]", "[ 18/1 → 39/2 | gain:1 note:G2 clip:0.1 ]", "[ 291/16 → 147/8 | s:bd gain:0.7 ]", "[ 291/16 → 297/16 | gain:1 note:C2 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", - "[ (291/16 → 297/16) ⇝ 303/16 | gain:0.06400000000000002 note:Eb6 clip:0.1 ]", + "[ (291/16 → 297/16) ⇝ 303/16 | gain:0.064 note:Eb6 clip:0.1 ]", "[ 291/16 → 303/16 | gain:0.4 note:C4 clip:0.1 ]", "[ (291/16 → 39/2) ⇝ 315/16 | gain:0.4 note:G3 clip:0.1 ]", "[ 147/8 → 75/4 | s:hh gain:0.7 ]", "[ 147/8 → 75/4 | gain:1 note:A1 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", - "[ 147/8 → 153/8 | gain:0.16000000000000003 note:C5 clip:0.1 ]", - "[ (147/8 → 39/2) ⇝ 159/8 | gain:0.16000000000000003 note:G4 clip:0.1 ]", + "[ 147/8 → 153/8 | gain:0.16 note:C5 clip:0.1 ]", + "[ (147/8 → 39/2) ⇝ 159/8 | gain:0.16 note:G4 clip:0.1 ]", "[ 297/16 → 303/16 | gain:1 note:A1 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", - "[ 297/16 → 309/16 | gain:0.06400000000000002 note:C6 clip:0.1 ]", - "[ (297/16 → 39/2) ⇝ 321/16 | gain:0.06400000000000002 note:G5 clip:0.1 ]", + "[ 297/16 → 309/16 | gain:0.064 note:C6 clip:0.1 ]", + "[ (297/16 → 39/2) ⇝ 321/16 | gain:0.064 note:G5 clip:0.1 ]", "[ 75/4 → 153/8 | s:sn gain:0.7 ]", "[ 75/4 → 153/8 | gain:1 note:Bb1 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", "[ 75/4 → 39/2 | gain:1 note:Eb3 clip:0.1 ]", "[ 303/16 → 309/16 | gain:1 note:Bb1 s:square clip:0.4 cutoff:400 decay:0.12 sustain:0 ]", "[ (303/16 → 39/2) ⇝ 315/16 | gain:0.4 note:Eb4 clip:0.1 ]", "[ 153/8 → 39/2 | s:hh gain:0.7 ]", - "[ (153/8 → 39/2) ⇝ 159/8 | gain:0.16000000000000003 note:Eb5 clip:0.1 ]", - "[ (309/16 → 39/2) ⇝ 321/16 | gain:0.06400000000000002 note:Eb6 clip:0.1 ]", + "[ (153/8 → 39/2) ⇝ 159/8 | gain:0.16 note:Eb5 clip:0.1 ]", + "[ (309/16 → 39/2) ⇝ 321/16 | gain:0.064 note:Eb6 clip:0.1 ]", "[ 291/16 ⇜ (39/2 → 315/16) | gain:0.4 note:G3 clip:0.1 ]", "[ 303/16 ⇜ (39/2 → 315/16) | gain:0.4 note:Eb4 clip:0.1 ]", - "[ 147/8 ⇜ (39/2 → 159/8) | gain:0.16000000000000003 note:G4 clip:0.1 ]", + "[ 147/8 ⇜ (39/2 → 159/8) | gain:0.16 note:G4 clip:0.1 ]", "[ 153/8 ⇜ (39/2 → 159/8) | gain:1 note:C3 clip:0.1 ]", - "[ 153/8 ⇜ (39/2 → 159/8) | gain:0.16000000000000003 note:Eb5 clip:0.1 ]", + "[ 153/8 ⇜ (39/2 → 159/8) | gain:0.16 note:Eb5 clip:0.1 ]", "[ 39/2 → 159/8 | s:bd gain:0.7 ]", - "[ 297/16 ⇜ (39/2 → 20/1) ⇝ 321/16 | gain:0.06400000000000002 note:G5 clip:0.1 ]", + "[ 297/16 ⇜ (39/2 → 20/1) ⇝ 321/16 | gain:0.064 note:G5 clip:0.1 ]", "[ 153/8 ⇜ (39/2 → 20/1) ⇝ 165/8 | gain:1 note:G2 clip:0.1 ]", - "[ 309/16 ⇜ (39/2 → 20/1) ⇝ 321/16 | gain:0.06400000000000002 note:Eb6 clip:0.1 ]", + "[ 309/16 ⇜ (39/2 → 20/1) ⇝ 321/16 | gain:0.064 note:Eb6 clip:0.1 ]", "[ 309/16 ⇜ (315/16 → 20/1) ⇝ 321/16 | gain:0.4 note:C4 clip:0.1 ]", "[ 309/16 ⇜ (315/16 → 20/1) ⇝ 333/16 | gain:0.4 note:G3 clip:0.1 ]", - "[ 39/2 ⇜ (159/8 → 20/1) ⇝ 81/4 | gain:0.16000000000000003 note:C5 clip:0.1 ]", - "[ 39/2 ⇜ (159/8 → 20/1) ⇝ 21/1 | gain:0.16000000000000003 note:G4 clip:0.1 ]", + "[ 39/2 ⇜ (159/8 → 20/1) ⇝ 81/4 | gain:0.16 note:C5 clip:0.1 ]", + "[ 39/2 ⇜ (159/8 → 20/1) ⇝ 21/1 | gain:0.16 note:G4 clip:0.1 ]", "[ (159/8 → 20/1) ⇝ 81/4 | s:hh gain:0.7 ]", "[ (159/8 → 20/1) ⇝ 165/8 | gain:1 note:Eb3 clip:0.1 ]", ] @@ -8737,22 +8737,22 @@ exports[`renders tunes > tune: undergroundPlumber 1`] = ` exports[`renders tunes > tune: waa2 1`] = ` [ - "[ -1/4 ⇜ (0/1 → 1/4) | note:48 clip:1.1023401198483869 s:sawtooth cutoff:3991.573271676344 gain:0.5 room:0.5 lpattack:0.125 lpenv:-2 vib:8 vibmod:0.125 fanchor:0.25 ]", - "[ -1/4 ⇜ (0/1 → 1/4) | note:64 clip:1.1023401198483869 s:sawtooth cutoff:3991.573271676344 gain:0.5 room:0.5 lpattack:0.125 lpenv:-2 vib:8 vibmod:0.125 fanchor:0.25 ]", + "[ -1/4 ⇜ (0/1 → 1/4) | note:48 clip:1.102340119848 s:sawtooth cutoff:3991.573271676344 gain:0.5 room:0.5 lpattack:0.125 lpenv:-2 vib:8 vibmod:0.125 fanchor:0.25 ]", + "[ -1/4 ⇜ (0/1 → 1/4) | note:64 clip:1.102340119848 s:sawtooth cutoff:3991.573271676344 gain:0.5 room:0.5 lpattack:0.125 lpenv:-2 vib:8 vibmod:0.125 fanchor:0.25 ]", "[ (0/1 → 1/4) ⇝ 1/2 | note:62 clip:1.15 s:sawtooth cutoff:4000 gain:0.5 room:0.5 lpattack:0.125 lpenv:-2 vib:8 vibmod:0.125 fanchor:0.25 ]", "[ (0/1 → 1/4) ⇝ 1/2 | note:43 clip:1.15 s:sawtooth cutoff:4000 gain:0.5 room:0.5 lpattack:0.125 lpenv:-2 vib:8 vibmod:0.125 fanchor:0.25 ]", "[ 0/1 ⇜ (1/4 → 1/2) | note:62 clip:1.15 s:square cutoff:4000 gain:0.5 room:0.5 lpattack:0.125 lpenv:-2 vib:8 vibmod:0.125 fanchor:0.25 ]", "[ 0/1 ⇜ (1/4 → 1/2) | note:43 clip:1.15 s:square cutoff:4000 gain:0.5 room:0.5 lpattack:0.125 lpenv:-2 vib:8 vibmod:0.125 fanchor:0.25 ]", - "[ (1/4 → 1/2) ⇝ 3/4 | note:74 clip:1.197659880151613 s:square cutoff:3991.5732716763446 gain:0.5 room:0.5 lpattack:0.125 lpenv:-2 vib:8 vibmod:0.125 fanchor:0.25 ]", - "[ (1/4 → 1/2) ⇝ 3/4 | note:55 clip:1.197659880151613 s:square cutoff:3991.5732716763446 gain:0.5 room:0.5 lpattack:0.125 lpenv:-2 vib:8 vibmod:0.125 fanchor:0.25 ]", - "[ 1/4 ⇜ (1/2 → 3/4) | note:74 clip:1.197659880151613 s:sawtooth cutoff:3991.5732716763446 gain:0.5 room:0.5 lpattack:0.125 lpenv:-2 vib:8 vibmod:0.125 fanchor:0.25 ]", - "[ 1/4 ⇜ (1/2 → 3/4) | note:55 clip:1.197659880151613 s:sawtooth cutoff:3991.5732716763446 gain:0.5 room:0.5 lpattack:0.125 lpenv:-2 vib:8 vibmod:0.125 fanchor:0.25 ]", - "[ 1/2 → 3/4 | note:50 clip:1.2451698046878117 s:sawtooth cutoff:3966.3742407056534 gain:0.5 room:0.5 lpattack:0.125 lpenv:-2 vib:8 vibmod:0.125 fanchor:0.25 ]", - "[ (1/2 → 3/4) ⇝ 1/1 | note:69 clip:1.2451698046878117 s:sawtooth cutoff:3966.3742407056534 gain:0.5 room:0.5 lpattack:0.125 lpenv:-2 vib:8 vibmod:0.125 fanchor:0.25 ]", - "[ 1/2 ⇜ (3/4 → 1/1) | note:69 clip:1.2451698046878117 s:square cutoff:3966.3742407056534 gain:0.5 room:0.5 lpattack:0.125 lpenv:-2 vib:8 vibmod:0.125 fanchor:0.25 ]", - "[ 3/4 → 1/1 | note:41 clip:1.292380289809026 s:square cutoff:3924.645587531366 gain:0.5 room:0.5 lpattack:0.125 lpenv:-2 vib:8 vibmod:0.125 fanchor:0.25 ]", - "[ 3/4 → 1/1 | note:62 clip:1.292380289809026 s:square cutoff:3924.645587531366 gain:0.5 room:0.5 lpattack:0.125 lpenv:-2 vib:8 vibmod:0.125 fanchor:0.25 ]", - "[ (3/4 → 1/1) ⇝ 5/4 | note:81 clip:1.292380289809026 s:square cutoff:3924.645587531366 gain:0.5 room:0.5 lpattack:0.125 lpenv:-2 vib:8 vibmod:0.125 fanchor:0.25 ]", + "[ (1/4 → 1/2) ⇝ 3/4 | note:74 clip:1.197659880152 s:square cutoff:3991.573271676345 gain:0.5 room:0.5 lpattack:0.125 lpenv:-2 vib:8 vibmod:0.125 fanchor:0.25 ]", + "[ (1/4 → 1/2) ⇝ 3/4 | note:55 clip:1.197659880152 s:square cutoff:3991.573271676345 gain:0.5 room:0.5 lpattack:0.125 lpenv:-2 vib:8 vibmod:0.125 fanchor:0.25 ]", + "[ 1/4 ⇜ (1/2 → 3/4) | note:74 clip:1.197659880152 s:sawtooth cutoff:3991.573271676345 gain:0.5 room:0.5 lpattack:0.125 lpenv:-2 vib:8 vibmod:0.125 fanchor:0.25 ]", + "[ 1/4 ⇜ (1/2 → 3/4) | note:55 clip:1.197659880152 s:sawtooth cutoff:3991.573271676345 gain:0.5 room:0.5 lpattack:0.125 lpenv:-2 vib:8 vibmod:0.125 fanchor:0.25 ]", + "[ 1/2 → 3/4 | note:50 clip:1.245169804688 s:sawtooth cutoff:3966.374240705653 gain:0.5 room:0.5 lpattack:0.125 lpenv:-2 vib:8 vibmod:0.125 fanchor:0.25 ]", + "[ (1/2 → 3/4) ⇝ 1/1 | note:69 clip:1.245169804688 s:sawtooth cutoff:3966.374240705653 gain:0.5 room:0.5 lpattack:0.125 lpenv:-2 vib:8 vibmod:0.125 fanchor:0.25 ]", + "[ 1/2 ⇜ (3/4 → 1/1) | note:69 clip:1.245169804688 s:square cutoff:3966.374240705653 gain:0.5 room:0.5 lpattack:0.125 lpenv:-2 vib:8 vibmod:0.125 fanchor:0.25 ]", + "[ 3/4 → 1/1 | note:41 clip:1.292380289809 s:square cutoff:3924.645587531366 gain:0.5 room:0.5 lpattack:0.125 lpenv:-2 vib:8 vibmod:0.125 fanchor:0.25 ]", + "[ 3/4 → 1/1 | note:62 clip:1.292380289809 s:square cutoff:3924.645587531366 gain:0.5 room:0.5 lpattack:0.125 lpenv:-2 vib:8 vibmod:0.125 fanchor:0.25 ]", + "[ (3/4 → 1/1) ⇝ 5/4 | note:81 clip:1.292380289809 s:square cutoff:3924.645587531366 gain:0.5 room:0.5 lpattack:0.125 lpenv:-2 vib:8 vibmod:0.125 fanchor:0.25 ]", ] `; diff --git a/test/tunes.test.mjs b/test/tunes.test.mjs index 7e3c346aa..94d9fae0b 100644 --- a/test/tunes.test.mjs +++ b/test/tunes.test.mjs @@ -4,11 +4,25 @@ import { describe, it } from 'vitest'; const tuneKeys = Object.keys(tunes); +// Node 24 tightened Number→string rounding; clamp decimals so snapshots stay stable across engines. +const roundFloatStrings = (input, precision = 12) => { + // if matches a decimal number ex: 12.34, -0.5, 0.123, 99.0, 1.932093850293 + const regex = /-?\d+\.\d+/g; + return input.replace(regex, (match) => { + // converts the literal to a number, performs round to nearest (ties to even) + // at the requested precision, and returns the rounded decimal string + const rounded = Number(match).toFixed(precision); + // trims trailing zeros (and a dangling dot) after rounding, so the displayed string looks tidy + return rounded.replace(/\.?0+$/, '').replace(/\.$/, ''); + }); +}; + describe('renders tunes', () => { tuneKeys.forEach((key) => { it(`tune: ${key}`, async ({ expect }) => { const haps = await queryCode(tunes[key], testCycles[key] || 1); - expect(haps).toMatchSnapshot(); + const normalized = haps.map((hap) => roundFloatStrings(hap)); + expect(normalized).toMatchSnapshot(); }); }); }); diff --git a/tools/dbpatch/package.json b/tools/dbpatch/package.json index 52f5520f8..3ee042ad9 100644 --- a/tools/dbpatch/package.json +++ b/tools/dbpatch/package.json @@ -1,5 +1,8 @@ { "dependencies": { "csv": "^6.3.11" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/website/package.json b/website/package.json index 87f4025e4..6f5539dd6 100644 --- a/website/package.json +++ b/website/package.json @@ -75,5 +75,8 @@ "sharp": "^0.33.5", "workbox-window": "^7.3.0", "vite-plugin-bundle-audioworklet": "workspace:*" + }, + "engines": { + "node": ">=18.0.0" } } From 79875ebc50f73b5adc72c1971be35e008cb3f14a Mon Sep 17 00:00:00 2001 From: "Jade (Rose) Rowland" Date: Wed, 5 Nov 2025 01:26:36 -0500 Subject: [PATCH 113/312] fix branch --- packages/xen/tunejs.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/xen/tunejs.js b/packages/xen/tunejs.js index 5806cf596..9f4253709 100644 --- a/packages/xen/tunejs.js +++ b/packages/xen/tunejs.js @@ -41,7 +41,6 @@ Tune.prototype.tonicize = function(newTonic) { this.tonic = newTonic } - /* Return data in the mode you are in (freq, ratio, or midi) */ Tune.prototype.note = function(input,octave){ From a3f82f90a9c57033df1e9bf3f6ad377626d94b00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20=C5=BD=C3=A1ra?= Date: Thu, 6 Nov 2025 08:15:55 +0100 Subject: [PATCH 114/312] test fix --- test/__snapshots__/examples.test.mjs.snap | 37 +++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index a27c5a6bc..818c0270a 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -9214,6 +9214,43 @@ exports[`runs examples > example "scale" example index 4 1`] = ` ] `; +exports[`runs examples > example "scale" example index 5 1`] = ` +[ + "[ 0/1 → 1/8 | note:C3 ]", + "[ 1/8 → 1/4 | note:C3 ]", + "[ 1/4 → 3/8 | note:D3 ]", + "[ 3/8 → 1/2 | note:Eb3 ]", + "[ 1/2 → 5/8 | note:E3 ]", + "[ 5/8 → 3/4 | note:G3 ]", + "[ 3/4 → 7/8 | note:A3 ]", + "[ 7/8 → 1/1 | note:C4 ]", + "[ 1/1 → 9/8 | note:C3 ]", + "[ 9/8 → 5/4 | note:C3 ]", + "[ 5/4 → 11/8 | note:D3 ]", + "[ 11/8 → 3/2 | note:Eb3 ]", + "[ 3/2 → 13/8 | note:E3 ]", + "[ 13/8 → 7/4 | note:G3 ]", + "[ 7/4 → 15/8 | note:A3 ]", + "[ 15/8 → 2/1 | note:C4 ]", + "[ 2/1 → 17/8 | note:C3 ]", + "[ 17/8 → 9/4 | note:C3 ]", + "[ 9/4 → 19/8 | note:D3 ]", + "[ 19/8 → 5/2 | note:Eb3 ]", + "[ 5/2 → 21/8 | note:E3 ]", + "[ 21/8 → 11/4 | note:G3 ]", + "[ 11/4 → 23/8 | note:A3 ]", + "[ 23/8 → 3/1 | note:C4 ]", + "[ 3/1 → 25/8 | note:C3 ]", + "[ 25/8 → 13/4 | note:C3 ]", + "[ 13/4 → 27/8 | note:D3 ]", + "[ 27/8 → 7/2 | note:Eb3 ]", + "[ 7/2 → 29/8 | note:E3 ]", + "[ 29/8 → 15/4 | note:G3 ]", + "[ 15/4 → 31/8 | note:A3 ]", + "[ 31/8 → 4/1 | note:C4 ]", +] +`; + exports[`runs examples > example "scaleTranspose" example index 0 1`] = ` [ "[ 0/1 → 1/2 | note:C3 ]", From 1b37f1ed1ddc5bafedbd9037369cfc446e35c4fd Mon Sep 17 00:00:00 2001 From: PepsiiMan Date: Thu, 6 Nov 2025 15:33:06 +0100 Subject: [PATCH 115/312] soundAlias example fix --- website/src/pages/learn/samples.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/src/pages/learn/samples.mdx b/website/src/pages/learn/samples.mdx index 201d57dfa..6a2f0cb95 100644 --- a/website/src/pages/learn/samples.mdx +++ b/website/src/pages/learn/samples.mdx @@ -63,7 +63,7 @@ You can also create custom aliases for existing sounds using the `soundAlias` fu From 3e7ae880430a547f6fa70ae88b392966d02d71c6 Mon Sep 17 00:00:00 2001 From: drhayes Date: Mon, 10 Nov 2025 17:02:55 +0100 Subject: [PATCH 116/312] Fix typo: 'studel' -> 'strudel' --- website/src/pages/technical-manual/project-start.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/src/pages/technical-manual/project-start.mdx b/website/src/pages/technical-manual/project-start.mdx index 4a269d1b9..b9a4ab0e6 100644 --- a/website/src/pages/technical-manual/project-start.mdx +++ b/website/src/pages/technical-manual/project-start.mdx @@ -32,7 +32,7 @@ There are 3 quick ways to embed strudel in your website: ### Inside an iframe -Using an iframe is the most easy way to embed a studel tune. +Using an iframe is the most easy way to embed a strudel tune. You can embed any pattern of your choice via an iframe and the URL of the pattern of your choice: ```html From 3c6de3be6d571bdcda0a19246d74d854fccaea22 Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 12 Nov 2025 10:48:20 -0600 Subject: [PATCH 117/312] First pass of worklets optimizations --- packages/superdough/worklets.mjs | 183 ++++++++++++++----------------- 1 file changed, 84 insertions(+), 99 deletions(-) diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index 7d7ef8e2a..b004ef3ab 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -6,13 +6,26 @@ import OLAProcessor from './ola-processor'; import FFT from './fft.js'; import { getDistortionAlgorithm } from './helpers.mjs'; +const blockSize = 128; +const PI = Math.PI; +const TWO_PI = 2 * PI; +const INVSR = 1 / sampleRate; + 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; const pv = (arr, n) => arr[n] ?? arr[0]; const frac = (x) => x - Math.floor(x); -const ffloor = (x) => x | 0; // fast floor for non-negative +// Fast integer ops for non-negative values +const ffloor = (x) => x | 0; +const fround = (x) => ffloor(x + 0.5); +const fceil = (x) => ffloor(x + 1); + +const fast_tanh = (x) => { + const x2 = x * x; + return (x * (27.0 + x2)) / (27.0 + 9.0 * x2); +}; const getUnisonDetune = (unison, detune, voiceIndex) => { if (unison < 2) { return 0; @@ -32,7 +45,6 @@ function wrapPhase(phase, maxPhase = 1) { } return phase; } -const blockSize = 128; // Smooth waveshape near discontinuities to remove frequencies above Nyquist and prevent aliasing // referenced from https://www.kvraudio.com/forum/viewtopic.php?t=375517 function polyBlep(phase, dt) { @@ -66,7 +78,7 @@ const waveshapes = { return phase / skew; }, sine(phase) { - return Math.sin(Math.PI * 2 * phase) * 0.5 + 0.5; + return Math.sin(TWO_PI * phase) * 0.5 + 0.5; }, ramp(phase) { return phase; @@ -100,12 +112,6 @@ const waveshapes = { return v - polyBlep(phase, dt); }, }; -function getParamValue(block, param) { - if (param.length > 1) { - return param[block]; - } - return param[0]; -} const waveShapeNames = Object.keys(waveshapes); class LFOProcessor extends AudioWorkletProcessor { @@ -167,7 +173,7 @@ class LFOProcessor extends AudioWorkletProcessor { if (this.phase == null) { this.phase = mod(time * frequency + phaseoffset, 1); } - const dt = frequency / sampleRate; + const dt = frequency * INVSR; for (let n = 0; n < blockSize; n++) { for (let i = 0; i < output.length; i++) { let modval = (waveshapes[shape](this.phase, skew) + dcoffset) * depth; @@ -293,8 +299,8 @@ class TwoPoleFilter { // Out of bound values can produce NaNs resonance = clamp(resonance, 0, 1); cutoff = clamp(cutoff, 0, sampleRate / 2 - 1); - const c = clamp(2 * Math.sin(cutoff * (_PI / sampleRate)), 0, 1.14); - const r = Math.pow(0.5, (resonance + 0.125) / 0.125); + const c = clamp(2 * Math.sin(cutoff * PI * INVSR), 0, 1.14); + const r = Math.pow(0.5, 8 * resonance + 1); const mrc = 1 - r * c; this.s0 = mrc * this.s0 - c * this.s1 + c * s; // bpf this.s1 = mrc * this.s1 + c * this.s0; // lpf @@ -353,11 +359,6 @@ class DJFProcessor extends AudioWorkletProcessor { } registerProcessor('djf-processor', DJFProcessor); -function fast_tanh(x) { - const x2 = x * x; - return (x * (27.0 + x2)) / (27.0 + 9.0 * x2); -} -const _PI = 3.14159265359; //adapted from https://github.com/TheBouteillacBear/webaudioworklet-wasm?tab=MIT-1-ov-file class LadderProcessor extends AudioWorkletProcessor { static get parameterDescriptors() { @@ -395,7 +396,7 @@ class LadderProcessor extends AudioWorkletProcessor { const drive = clamp(Math.exp(parameters.drive[0]), 0.1, 2000); let cutoff = parameters.frequency[0]; - cutoff = (cutoff * 2 * _PI) / sampleRate; + cutoff = cutoff * TWO_PI * INVSR; cutoff = cutoff > 1 ? 1 : cutoff; const k = Math.min(8, resonance * 0.13); @@ -545,7 +546,7 @@ class SuperSawOscillatorProcessor extends AudioWorkletProcessor { const freqVoice = applySemitoneDetuneToFrequency(freq, getUnisonDetune(voices, freqspread, n)); // We must wrap this here because it is passed into sawblep below which // has domain [0, 1] - const dt = mod(freqVoice / sampleRate, 1); + const dt = mod(freqVoice * INVSR, 1); this.phase[n] = this.phase[n] ?? Math.random(); const v = waveshapes.sawblep(this.phase[n], dt); @@ -564,12 +565,16 @@ registerProcessor('supersaw-oscillator', SuperSawOscillatorProcessor); // Phase Vocoder sourced from https://github.com/olvb/phaze/tree/master?tab=readme-ov-file const BUFFERED_BLOCK_SIZE = 2048; +const hannCache = new Map(); function genHannWindow(length) { - let win = new Float32Array(length); - for (var i = 0; i < length; i++) { - win[i] = 0.5 * (1 - Math.cos((2 * Math.PI * i) / length)); + if (!hannCache.has(length)) { + const win = new Float32Array(length); + for (let i = 0; i < length; i++) { + win[i] = 0.5 * (1 - Math.cos((TWO_PI * i) / length)); + } + hannCache.set(length, win); } - return win; + return hannCache.get(length); } class PhaseVocoderProcessor extends OLAProcessor { @@ -587,11 +592,14 @@ class PhaseVocoderProcessor extends OLAProcessor { blockSize: BUFFERED_BLOCK_SIZE, }; super(options); - - this.fftSize = this.blockSize; this.timeCursor = 0; - - this.hannWindow = genHannWindow(this.blockSize); + this.fftSize = this.blockSize; + this.invfftSize = 1 / this.fftSize; + this.hannWindow = genHannWindow(this.fftSize); + // rescale hann window (empirically sounds nicer) + for (let i = 0; i < this.hannWindow.length; i++) { + this.hannWindow[i] *= 1.62; + } // prepare FFT and pre-allocate buffers this.fft = new FFT(this.fftSize); this.freqComplexBuffer = this.fft.createComplexArray(); @@ -604,54 +612,45 @@ class PhaseVocoderProcessor extends OLAProcessor { processOLA(inputs, outputs, parameters) { // no automation, take last value - let pitchFactor = parameters.pitchFactor[parameters.pitchFactor.length - 1]; - if (pitchFactor < 0) { pitchFactor = pitchFactor * 0.25; } pitchFactor = Math.max(0, pitchFactor + 1); - - for (var i = 0; i < this.nbInputs; i++) { - for (var j = 0; j < inputs[i].length; j++) { - // big assumption here: output is symetric to input - var input = inputs[i][j]; - var output = outputs[i][j]; - + for (let i = 0; i < this.nbInputs; i++) { + for (let j = 0; j < inputs[i].length; j++) { + const input = inputs[i][j]; + const output = outputs[i][j]; this.applyHannWindow(input); - this.fft.realTransform(this.freqComplexBuffer, input); - this.computeMagnitudes(); this.findPeaks(); this.shiftPeaks(pitchFactor); - this.fft.completeSpectrum(this.freqComplexBufferShifted); this.fft.inverseTransform(this.timeComplexBuffer, this.freqComplexBufferShifted); this.fft.fromComplexArray(this.timeComplexBuffer, output); this.applyHannWindow(output); } } - this.timeCursor += this.hopSize; } /** Apply Hann window in-place */ applyHannWindow(input) { - for (var i = 0; i < this.blockSize; i++) { - input[i] = input[i] * this.hannWindow[i] * 1.62; + for (let i = 0; i < this.blockSize; i++) { + input[i] *= this.hannWindow[i]; } } /** Compute squared magnitudes for peak finding **/ computeMagnitudes() { - var i = 0, + let i = 0, j = 0; while (i < this.magnitudes.length) { - let real = this.freqComplexBuffer[j]; - let imag = this.freqComplexBuffer[j + 1]; + const real = this.freqComplexBuffer[j]; + const imag = this.freqComplexBuffer[j + 1]; // no need to sqrt for peak finding - this.magnitudes[i] = real ** 2 + imag ** 2; + this.magnitudes[i] = real * real + imag * imag; i += 1; j += 2; } @@ -660,12 +659,10 @@ class PhaseVocoderProcessor extends OLAProcessor { /** Find peaks in spectrum magnitudes **/ findPeaks() { this.nbPeaks = 0; - var i = 2; - let end = this.magnitudes.length - 2; - + let i = 2; + const end = this.magnitudes.length - 2; while (i < end) { - let mag = this.magnitudes[i]; - + const mag = this.magnitudes[i]; if (this.magnitudes[i - 1] >= mag || this.magnitudes[i - 2] >= mag) { i++; continue; @@ -674,7 +671,6 @@ class PhaseVocoderProcessor extends OLAProcessor { i++; continue; } - this.peakIndexes[this.nbPeaks] = i; this.nbPeaks++; i += 2; @@ -685,53 +681,44 @@ class PhaseVocoderProcessor extends OLAProcessor { shiftPeaks(pitchFactor) { // zero-fill new spectrum this.freqComplexBufferShifted.fill(0); - - for (var i = 0; i < this.nbPeaks; i++) { - let peakIndex = this.peakIndexes[i]; - let peakIndexShifted = Math.round(peakIndex * pitchFactor); - + for (let i = 0; i < this.nbPeaks; i++) { + const peakIndex = this.peakIndexes[i]; + const peakIndexShifted = fround(peakIndex * pitchFactor); if (peakIndexShifted > this.magnitudes.length) { break; } - // find region of influence - var startIndex = 0; - var endIndex = this.fftSize; + let startIndex = 0; + let endIndex = this.fftSize; if (i > 0) { - let peakIndexBefore = this.peakIndexes[i - 1]; - startIndex = peakIndex - Math.floor((peakIndex - peakIndexBefore) / 2); + startIndex = peakIndex - fround((peakIndex - this.peakIndexes[i - 1]) / 2); } if (i < this.nbPeaks - 1) { - let peakIndexAfter = this.peakIndexes[i + 1]; - endIndex = peakIndex + Math.ceil((peakIndexAfter - peakIndex) / 2); + endIndex = peakIndex + fceil((this.peakIndexes[i + 1] - peakIndex) / 2); } - // shift whole region of influence around peak to shifted peak - let startOffset = startIndex - peakIndex; - let endOffset = endIndex - peakIndex; - for (var j = startOffset; j < endOffset; j++) { - let binIndex = peakIndex + j; - let binIndexShifted = peakIndexShifted + j; - + const startOffset = startIndex - peakIndex; + const endOffset = endIndex - peakIndex; + const omegaDelta = TWO_PI * this.invfftSize * (binIndexShifted - binIndex); + const phaseShiftReal = Math.cos(omegaDelta * this.timeCursor); + const phaseShiftImag = Math.sin(omegaDelta * this.timeCursor); + for (let j = startOffset; j < endOffset; j++) { + const binIndex = peakIndex + j; + const binIndexShifted = peakIndexShifted + j; if (binIndexShifted >= this.magnitudes.length) { break; } - // apply phase correction - let omegaDelta = (2 * Math.PI * (binIndexShifted - binIndex)) / this.fftSize; - let phaseShiftReal = Math.cos(omegaDelta * this.timeCursor); - let phaseShiftImag = Math.sin(omegaDelta * this.timeCursor); + const indexReal = 2 * binIndex; + const indexImag = indexReal + 1; + const valueReal = this.freqComplexBuffer[indexReal]; + const valueImag = this.freqComplexBuffer[indexImag]; - let indexReal = binIndex * 2; - let indexImag = indexReal + 1; - let valueReal = this.freqComplexBuffer[indexReal]; - let valueImag = this.freqComplexBuffer[indexImag]; + const valueShiftedReal = valueReal * phaseShiftReal - valueImag * phaseShiftImag; + const valueShiftedImag = valueReal * phaseShiftImag + valueImag * phaseShiftReal; - let valueShiftedReal = valueReal * phaseShiftReal - valueImag * phaseShiftImag; - let valueShiftedImag = valueReal * phaseShiftImag + valueImag * phaseShiftReal; - - let indexShiftedReal = binIndexShifted * 2; - let indexShiftedImag = indexShiftedReal + 1; + const indexShiftedReal = 2 * binIndexShifted; + const indexShiftedImag = indexShiftedReal + 1; this.freqComplexBufferShifted[indexShiftedReal] += valueShiftedReal; this.freqComplexBufferShifted[indexShiftedImag] += valueShiftedImag; } @@ -745,11 +732,10 @@ registerProcessor('phase-vocoder-processor', PhaseVocoderProcessor); class PulseOscillatorProcessor extends AudioWorkletProcessor { constructor() { super(); - this.pi = _PI; - this.phi = -this.pi; // phase + this.phi = -PI; // phase this.Y0 = 0; // feedback memories this.Y1 = 0; - this.PW = this.pi; // pulse width + this.PW = PI; // pulse width this.B = 2.3; // feedback coefficient this.dphif = 0; // filtered phase increment this.envf = 0; // filtered envelope @@ -806,9 +792,9 @@ class PulseOscillatorProcessor extends AudioWorkletProcessor { dphi; for (let i = 0; i < (output[0].length ?? 0); i++) { - const pw = (1 - clamp(getParamValue(i, params.pulsewidth), -0.99, 0.99)) * this.pi; - const detune = getParamValue(i, params.detune); - const freq = applySemitoneDetuneToFrequency(getParamValue(i, params.frequency), detune / 100); + const pw = (1 - clamp(pv(params.pulsewidth, i), -0.99, 0.99)) * this.pi; + const detune = pv(params.detune, i); + const freq = applySemitoneDetuneToFrequency(pv(params.frequency, i), detune / 100); dphi = freq * (this.pi / (sampleRate * 0.5)); // phase increment this.dphif += 0.1 * (dphi - this.dphif); @@ -958,9 +944,9 @@ class ByteBeatProcessor extends AudioWorkletProcessor { } const output = outputs[0]; for (let i = 0; i < output[0].length; i++) { - const detune = getParamValue(i, params.detune); - const freq = applySemitoneDetuneToFrequency(getParamValue(i, params.frequency), detune / 100); - let local_t = (this.t / (sampleRate / 256)) * freq + this.initialOffset; + const detune = pv(params.detune, i); + const freq = applySemitoneDetuneToFrequency(pv(params.frequency, i), detune / 100); + let local_t = 256 * this.t * INVSR * freq + this.initialOffset; const funcValue = this.func(local_t); let signal = (funcValue & 255) / 127.5 - 1; const out = signal * 0.2; @@ -1067,7 +1053,6 @@ class WavetableOscillatorProcessor extends AudioWorkletProcessor { this.frameLen = 0; this.numFrames = 0; this.phase = []; - this.invSR = 1 / sampleRate; this.port.onmessage = (e) => { const { type, payload } = e.data || {}; @@ -1104,7 +1089,7 @@ class WavetableOscillatorProcessor extends AudioWorkletProcessor { _toBits(amt, min = 2, max = 12) { const b = max + (min - max) * amt; - return { b, n: Math.round(Math.pow(2, b)) }; + return { b, n: fround(Math.pow(2, b)) }; } _warpPhase(phase, amt, mode) { @@ -1139,7 +1124,7 @@ class WavetableOscillatorProcessor extends AudioWorkletProcessor { } case WarpMode.FOLD: { const K = 7; - const k = 1 + Math.max(1, Math.round(K * amt)); + const k = 1 + Math.max(1, fround(K * amt)); return Math.abs(frac(k * phase) - 0.5) * 2; } case WarpMode.PWM: { @@ -1175,7 +1160,7 @@ class WavetableOscillatorProcessor extends AudioWorkletProcessor { } case WarpMode.BINARY: { let { b } = this._toBits(amt, 3); - b = Math.round(b); + b = fround(b); const n = 1 << b; const idx = ffloor(phase * n); const ridx = bitReverse(idx, b); @@ -1209,7 +1194,7 @@ class WavetableOscillatorProcessor extends AudioWorkletProcessor { case WarpMode.LOGISTIC: { let x = phase; const r = 3.6 + 0.4 * amt; - const iters = 1 + Math.round(2 * amt); + const iters = 1 + fround(2 * amt); for (let i = 0; i < iters; i++) x = r * x * (1 - x); return clamp(x, 0, 1); } @@ -1296,7 +1281,7 @@ class WavetableOscillatorProcessor extends AudioWorkletProcessor { gainR = gain1; } const fVoice = applySemitoneDetuneToFrequency(f, getUnisonDetune(voices, freqspread, n)); // voice detune - const dPhase = fVoice * this.invSR; + const dPhase = fVoice * INVSR; const level = this._chooseMip(dPhase); const table = this.tables[level]; From aabf122161fbc0e2a276f0618498c26c27531bc8 Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 12 Nov 2025 11:53:38 -0600 Subject: [PATCH 118/312] Further optimizations, including detuner --- packages/superdough/worklets.mjs | 71 ++++++++++++++++---------------- 1 file changed, 36 insertions(+), 35 deletions(-) diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index b004ef3ab..46f22d979 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -21,44 +21,42 @@ const frac = (x) => x - Math.floor(x); const ffloor = (x) => x | 0; const fround = (x) => ffloor(x + 0.5); const fceil = (x) => ffloor(x + 1); +const ffrac = (x) => x - ffloor(x); const fast_tanh = (x) => { const x2 = x * x; return (x * (27.0 + x2)) / (27.0 + 9.0 * x2); }; -const getUnisonDetune = (unison, detune, voiceIndex) => { + +// Optimized per-voice detuner which precomputes constants +const getDetuner = (unison, detune) => { if (unison < 2) { - return 0; + return (_voiceIdx) => 0; } - return lerp(-detune * 0.5, detune * 0.5, voiceIndex / (unison - 1)); + const scale = detune / (unison - 1); + const center = detune * 0.5; + return (voiceIdx) => voiceIdx * scale - center; }; + const applySemitoneDetuneToFrequency = (frequency, detune) => { return frequency * Math.pow(2, detune / 12); }; -// Restrict phase to the range [0, maxPhase) via wrapping -function wrapPhase(phase, maxPhase = 1) { - if (phase >= maxPhase) { - phase -= maxPhase; - } else if (phase < 0) { - phase += maxPhase; - } - return phase; -} // Smooth waveshape near discontinuities to remove frequencies above Nyquist and prevent aliasing // referenced from https://www.kvraudio.com/forum/viewtopic.php?t=375517 function polyBlep(phase, dt) { dt = Math.min(dt, 1 - dt); + const invdt = 1 / dt; // Start of cycle if (phase < dt) { - phase /= dt; + phase *= invdt; // 2 * (phase - phase^2/2 - 0.5) return phase + phase - phase * phase - 1; } // End of cycle else if (phase > 1 - dt) { - phase = (phase - 1) / dt; + phase = (phase - 1) * invdt; // 2 * (phase^2/2 + phase + 0.5) return phase * phase + phase + phase + 1; } @@ -171,7 +169,7 @@ class LFOProcessor extends AudioWorkletProcessor { const blockSize = output[0].length ?? 0; if (this.phase == null) { - this.phase = mod(time * frequency + phaseoffset, 1); + this.phase = ffrac(time * frequency + phaseoffset); } const dt = frequency * INVSR; for (let n = 0; n < blockSize; n++) { @@ -533,6 +531,7 @@ class SuperSawOscillatorProcessor extends AudioWorkletProcessor { let freq = pv(params.frequency, i); // Main detuning freq = applySemitoneDetuneToFrequency(freq, detune / 100); + const detuner = getDetuner(voices, freqspread); for (let n = 0; n < voices; n++) { const isOdd = (n & 1) == 1; let gainL = gain1; @@ -543,17 +542,17 @@ class SuperSawOscillatorProcessor extends AudioWorkletProcessor { gainR = gain1; } // Individual voice detuning - const freqVoice = applySemitoneDetuneToFrequency(freq, getUnisonDetune(voices, freqspread, n)); + const freqVoice = applySemitoneDetuneToFrequency(freq, detuner(n)); // We must wrap this here because it is passed into sawblep below which // has domain [0, 1] - const dt = mod(freqVoice * INVSR, 1); + const dt = ffrac(freqVoice * INVSR); this.phase[n] = this.phase[n] ?? Math.random(); const v = waveshapes.sawblep(this.phase[n], dt); - output[0][i] = output[0][i] + v * gainL; - output[1][i] = output[1][i] + v * gainR; + output[0][i] += v * gainL; + output[1][i] += v * gainR; - this.phase[n] = wrapPhase(this.phase[n] + dt); + this.phase[n] = ffrac(this.phase[n] + dt); } } return true; @@ -699,7 +698,7 @@ class PhaseVocoderProcessor extends OLAProcessor { // shift whole region of influence around peak to shifted peak const startOffset = startIndex - peakIndex; const endOffset = endIndex - peakIndex; - const omegaDelta = TWO_PI * this.invfftSize * (binIndexShifted - binIndex); + const omegaDelta = TWO_PI * this.invfftSize * (peakIndexShifted - peakIndex); const phaseShiftReal = Math.cos(omegaDelta * this.timeCursor); const phaseShiftImag = Math.sin(omegaDelta * this.timeCursor); for (let j = startOffset; j < endOffset; j++) { @@ -792,11 +791,11 @@ class PulseOscillatorProcessor extends AudioWorkletProcessor { dphi; for (let i = 0; i < (output[0].length ?? 0); i++) { - const pw = (1 - clamp(pv(params.pulsewidth, i), -0.99, 0.99)) * this.pi; + const pw = (1 - clamp(pv(params.pulsewidth, i), -0.99, 0.99)) * PI; const detune = pv(params.detune, i); const freq = applySemitoneDetuneToFrequency(pv(params.frequency, i), detune / 100); - dphi = freq * (this.pi / (sampleRate * 0.5)); // phase increment + dphi = freq * (PI / (sampleRate * 0.5)); // phase increment this.dphif += 0.1 * (dphi - this.dphif); env *= 0.9998; // exponential decay envelope @@ -808,7 +807,7 @@ class PulseOscillatorProcessor extends AudioWorkletProcessor { // Waveform generation (half-Tomisawa oscillators) this.phi += this.dphif; // phase increment - if (this.phi >= this.pi) this.phi -= 2 * this.pi; // phase wrapping + if (this.phi >= PI) this.phi -= TWO_PI; // phase wrapping // First half-Tomisawa generator let out0 = Math.cos(this.phi + this.B * this.Y0); // self-phase modulation @@ -847,13 +846,13 @@ const chyx = { } }, /*sin that loops every 128 "steps", instead of every pi steps*/ sinf: function (x) { - return Math.sin(x / (128 / Math.PI)); + return Math.sin((x * PI) / 128); }, /*cos that loops every 128 "steps", instead of every pi steps*/ cosf: function (x) { - return Math.cos(x / (128 / Math.PI)); + return Math.cos((x * PI) / 128); }, /*tan that loops every 128 "steps", instead of every pi steps*/ tanf: function (x) { - return Math.tan(x / (128 / Math.PI)); + return Math.tan((x * PI) / 128); }, /*converts t into a string composed of it's bits, regex's that*/ regG: function (t, X) { return X.test(t.toString(2)); @@ -986,6 +985,7 @@ export const WarpMode = Object.freeze({ SIGMOID: 19, FRACTAL: 20, FLIP: 21, + MODULAR: 22, }); function hash32(u) { @@ -1125,7 +1125,7 @@ class WavetableOscillatorProcessor extends AudioWorkletProcessor { case WarpMode.FOLD: { const K = 7; const k = 1 + Math.max(1, fround(K * amt)); - return Math.abs(frac(k * phase) - 0.5) * 2; + return Math.abs(ffrac(k * phase) - 0.5) * 2; } case WarpMode.PWM: { const w = clamp(0.5 + 0.49 * (2 * amt - 1), 0, 1); @@ -1135,12 +1135,12 @@ class WavetableOscillatorProcessor extends AudioWorkletProcessor { case WarpMode.ORBIT: { const depth = 0.5 * amt; const n = 3; - return frac(phase + depth * Math.sin(2 * Math.PI * n * phase)); + return frac(phase + depth * Math.sin(TWO_PI * n * phase)); } case WarpMode.SPIN: { const depth = 0.5 * amt; const { n } = this._toBits(amt, 1, 6); - return frac(phase + depth * Math.sin(2 * Math.PI * n * phase)); + return frac(phase + depth * Math.sin(TWO_PI * n * phase)); } case WarpMode.CHAOS: { const r = 3.7 + 0.3 * amt; @@ -1169,8 +1169,8 @@ class WavetableOscillatorProcessor extends AudioWorkletProcessor { case WarpMode.MODULAR: { const { n } = this._toBits(amt); const depth = 0.5 * amt; - const jump = frac(phase * n) / n; - return frac(phase + depth * jump); + const jump = ffrac(phase * n) / n; + return ffrac(phase + depth * jump); } case WarpMode.BROWNIAN: { const disp = 0.25 * amt * brownian(64 * phase, 4); @@ -1207,7 +1207,7 @@ class WavetableOscillatorProcessor extends AudioWorkletProcessor { return (y - y0) / (y1 - y0); } case WarpMode.FRACTAL: { - const d = 0.5 * Math.sin(2 * Math.PI * phase) * amt; + const d = 0.5 * Math.sin(TWO_PI * phase) * amt; return frac(phase + d); } case WarpMode.FLIP: { @@ -1271,6 +1271,7 @@ class WavetableOscillatorProcessor extends AudioWorkletProcessor { let f = pv(parameters.frequency, i); f = applySemitoneDetuneToFrequency(f, detune / 100); // overall detune const normalizer = 1 / Math.sqrt(voices); + const detuner = getDetuner(voices, freqspread); for (let n = 0; n < voices; n++) { const isOdd = (n & 1) == 1; let gainL = gain1; @@ -1280,7 +1281,7 @@ class WavetableOscillatorProcessor extends AudioWorkletProcessor { gainL = gain2; gainR = gain1; } - const fVoice = applySemitoneDetuneToFrequency(f, getUnisonDetune(voices, freqspread, n)); // voice detune + const fVoice = applySemitoneDetuneToFrequency(f, detuner(n)); // voice detune const dPhase = fVoice * INVSR; const level = this._chooseMip(dPhase); const table = this.tables[level]; @@ -1296,7 +1297,7 @@ class WavetableOscillatorProcessor extends AudioWorkletProcessor { } outL[i] += s * gainL * normalizer; outR[i] += s * gainR * normalizer; - this.phase[n] = wrapPhase(this.phase[n] + dPhase); + this.phase[n] = ffrac(this.phase[n] + dPhase); } } return true; From be3a88b09c69fa92e501fc2d0ca3939fed3670ae Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 12 Nov 2025 12:23:40 -0600 Subject: [PATCH 119/312] Optimize phase wrap; make voices k-rate --- packages/superdough/worklets.mjs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index 46f22d979..06c917751 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -507,6 +507,7 @@ class SuperSawOscillatorProcessor extends AudioWorkletProcessor { name: 'voices', defaultValue: 5, min: 1, + automationRate: 'k-rate', }, ]; } @@ -518,12 +519,10 @@ class SuperSawOscillatorProcessor extends AudioWorkletProcessor { // this.port.postMessage({ type: 'onended' }); return false; } - const output = outputs[0]; - + const voices = pv(params.voices, 0); // k-rate for (let i = 0; i < output[0].length; i++) { const detune = pv(params.detune, i); - const voices = pv(params.voices, i); const freqspread = pv(params.freqspread, i); const panspread = pv(params.panspread, i) * 0.5 + 0.5; const gain1 = Math.sqrt(1 - panspread); @@ -552,7 +551,9 @@ class SuperSawOscillatorProcessor extends AudioWorkletProcessor { output[0][i] += v * gainL; output[1][i] += v * gainR; - this.phase[n] = ffrac(this.phase[n] + dt); + let pn = this.phase[n] + dt; + if (pn >= 1.0) pn -= 1.0; + this.phase[n] = pn; } } return true; From f8c9425569b252d31590ade391834ba7b5ce1211 Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 12 Nov 2025 13:13:37 -0600 Subject: [PATCH 120/312] Simplify spread --- packages/superdough/worklets.mjs | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index 06c917751..038f59697 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -525,21 +525,13 @@ class SuperSawOscillatorProcessor extends AudioWorkletProcessor { const detune = pv(params.detune, i); const freqspread = pv(params.freqspread, i); const panspread = pv(params.panspread, i) * 0.5 + 0.5; - const gain1 = Math.sqrt(1 - panspread); - const gain2 = Math.sqrt(panspread); + let gainL = Math.sqrt(1 - panspread); + let gainR = Math.sqrt(panspread); let freq = pv(params.frequency, i); // Main detuning freq = applySemitoneDetuneToFrequency(freq, detune / 100); const detuner = getDetuner(voices, freqspread); for (let n = 0; n < voices; n++) { - const isOdd = (n & 1) == 1; - let gainL = gain1; - let gainR = gain2; - // invert right and left gain - if (isOdd) { - gainL = gain2; - gainR = gain1; - } // Individual voice detuning const freqVoice = applySemitoneDetuneToFrequency(freq, detuner(n)); // We must wrap this here because it is passed into sawblep below which @@ -554,6 +546,9 @@ class SuperSawOscillatorProcessor extends AudioWorkletProcessor { let pn = this.phase[n] + dt; if (pn >= 1.0) pn -= 1.0; this.phase[n] = pn; + // invert right and left gain + gainL = gainR; + gainR = gainL; } } return true; From 157b05536ad6600fffa81aba590209f24e403a93 Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 12 Nov 2025 13:36:01 -0600 Subject: [PATCH 121/312] Final cleanup --- packages/superdough/worklets.mjs | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index 038f59697..51a025d6d 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -591,10 +591,6 @@ class PhaseVocoderProcessor extends OLAProcessor { this.fftSize = this.blockSize; this.invfftSize = 1 / this.fftSize; this.hannWindow = genHannWindow(this.fftSize); - // rescale hann window (empirically sounds nicer) - for (let i = 0; i < this.hannWindow.length; i++) { - this.hannWindow[i] *= 1.62; - } // prepare FFT and pre-allocate buffers this.fft = new FFT(this.fftSize); this.freqComplexBuffer = this.fft.createComplexArray(); @@ -633,7 +629,7 @@ class PhaseVocoderProcessor extends OLAProcessor { /** Apply Hann window in-place */ applyHannWindow(input) { for (let i = 0; i < this.blockSize; i++) { - input[i] *= this.hannWindow[i]; + input[i] *= this.hannWindow[i] * 1.62; } } @@ -791,7 +787,7 @@ class PulseOscillatorProcessor extends AudioWorkletProcessor { const detune = pv(params.detune, i); const freq = applySemitoneDetuneToFrequency(pv(params.frequency, i), detune / 100); - dphi = freq * (PI / (sampleRate * 0.5)); // phase increment + dphi = freq * TWO_PI * INVSR; // phase increment this.dphif += 0.1 * (dphi - this.dphif); env *= 0.9998; // exponential decay envelope @@ -981,7 +977,6 @@ export const WarpMode = Object.freeze({ SIGMOID: 19, FRACTAL: 20, FLIP: 21, - MODULAR: 22, }); function hash32(u) { @@ -1162,12 +1157,6 @@ class WavetableOscillatorProcessor extends AudioWorkletProcessor { const ridx = bitReverse(idx, b); return ridx / n; } - case WarpMode.MODULAR: { - const { n } = this._toBits(amt); - const depth = 0.5 * amt; - const jump = ffrac(phase * n) / n; - return ffrac(phase + depth * jump); - } case WarpMode.BROWNIAN: { const disp = 0.25 * amt * brownian(64 * phase, 4); return frac(phase + disp); From 2875814a36b4bdec88d738f191bfe494dbd3d95a Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 12 Nov 2025 13:56:14 -0600 Subject: [PATCH 122/312] Square instead of self-multiply; more voices; more cleanup --- packages/superdough/worklets.mjs | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index 51a025d6d..5a96246fe 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -24,7 +24,7 @@ const fceil = (x) => ffloor(x + 1); const ffrac = (x) => x - ffloor(x); const fast_tanh = (x) => { - const x2 = x * x; + const x2 = x ** 2; return (x * (27.0 + x2)) / (27.0 + 9.0 * x2); }; @@ -50,17 +50,13 @@ function polyBlep(phase, dt) { // Start of cycle if (phase < dt) { phase *= invdt; - // 2 * (phase - phase^2/2 - 0.5) - return phase + phase - phase * phase - 1; + return 2 * phase - phase ** 2 - 1; } - // End of cycle else if (phase > 1 - dt) { phase = (phase - 1) * invdt; - // 2 * (phase^2/2 + phase + 0.5) - return phase * phase + phase + phase + 1; + return phase ** 2 + 2 * phase + 1; } - // 0 otherwise else { return 0; @@ -520,7 +516,7 @@ class SuperSawOscillatorProcessor extends AudioWorkletProcessor { return false; } const output = outputs[0]; - const voices = pv(params.voices, 0); // k-rate + const voices = params.voices[0]; // k-rate for (let i = 0; i < output[0].length; i++) { const detune = pv(params.detune, i); const freqspread = pv(params.freqspread, i); @@ -641,7 +637,7 @@ class PhaseVocoderProcessor extends OLAProcessor { const real = this.freqComplexBuffer[j]; const imag = this.freqComplexBuffer[j + 1]; // no need to sqrt for peak finding - this.magnitudes[i] = real * real + imag * imag; + this.magnitudes[i] = real ** 2 + imag ** 2; i += 1; j += 2; } @@ -1033,7 +1029,7 @@ class WavetableOscillatorProcessor extends AudioWorkletProcessor { { name: 'position', defaultValue: 0, min: 0, max: 1 }, { name: 'warp', defaultValue: 0, min: 0, max: 1 }, { name: 'warpMode', defaultValue: 0 }, - { name: 'voices', defaultValue: 1, min: 1 }, + { name: 'voices', defaultValue: 1, min: 1, automationRate: 'k-rate' }, { name: 'panspread', defaultValue: 0.7, min: 0, max: 1 }, { name: 'phaserand', defaultValue: 0, min: 0, max: 1 }, ]; @@ -1106,7 +1102,7 @@ class WavetableOscillatorProcessor extends AudioWorkletProcessor { return amt < 0.5 ? this._warpPhase(phase, 1 - 2 * amt, 3) : this._warpPhase(phase, 2 * amt - 1, 2); } case WarpMode.SYNC: { - const syncRatio = Math.pow(16, amt * amt); + const syncRatio = Math.pow(16, amt ** 2); return (phase * syncRatio) % 1; } case WarpMode.QUANT: { @@ -1142,7 +1138,7 @@ class WavetableOscillatorProcessor extends AudioWorkletProcessor { const isPrime = (n) => { if (n < 2) return false; if (n % 2 === 0) return n === 2; - for (let d = 3; d * d <= n; d += 2) if (n % d === 0) return false; + for (let d = 3; d ** 2 <= n; d += 2) if (n % d === 0) return false; return true; }; let { n } = this._toBits(amt, 3); @@ -1239,6 +1235,7 @@ class WavetableOscillatorProcessor extends AudioWorkletProcessor { if (outR !== outL) outR.set(outL); return true; } + const voices = parameters.voices[0]; // k-rate for (let i = 0; i < outL.length; i++) { const detune = pv(parameters.detune, i); const freqspread = pv(parameters.freqspread, i); @@ -1248,7 +1245,6 @@ class WavetableOscillatorProcessor extends AudioWorkletProcessor { const frac = idx - fIdx; const warpAmount = clamp(pv(parameters.warp, i), 0, 1); const warpMode = pv(parameters.warpMode, i); - const voices = pv(parameters.voices, i); const phaseRand = clamp(pv(parameters.phaserand, i), 0, 1); const panspread = voices > 1 ? clamp(pv(parameters.panspread, i), 0, 1) : 0; const gain1 = Math.sqrt(0.5 - 0.5 * panspread); From 22807b383374b8ba3cb1048c0615252ceb2c803f Mon Sep 17 00:00:00 2001 From: Aria Date: Fri, 14 Nov 2025 16:05:09 -0600 Subject: [PATCH 123/312] Use weak references for sound sources --- packages/superdough/superdough.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index b59e3ae05..4827ffbd3 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -481,7 +481,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) // oldest audio nodes will be destroyed if maximum polyphony is exceeded for (let i = 0; i <= activeSoundSources.size - maxPolyphony; i++) { const ch = activeSoundSources.entries().next(); - const source = ch.value[1]; + const source = ch.value[1].deref(); const chainID = ch.value[0]; const endTime = t + 0.25; source?.node?.gain?.linearRampToValueAtTime(0, endTime); @@ -513,7 +513,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) if (soundHandle) { sourceNode = soundHandle.node; - activeSoundSources.set(chainID, soundHandle); + activeSoundSources.set(chainID, new WeakRef(soundHandle)); // allow GC } } else { throw new Error(`sound ${s} not found! Is it loaded?`); From 3e05525dc29666e9fc5222790dbe825f03a6b5b4 Mon Sep 17 00:00:00 2001 From: jeromew Date: Fri, 14 Nov 2025 22:06:39 +0000 Subject: [PATCH 124/312] [perf] disconnect `send` effect AudioNode when `room` is used --- packages/superdough/superdough.mjs | 3 ++- packages/superdough/superdoughoutput.mjs | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index b59e3ae05..16ae3cecc 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -708,7 +708,8 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) roomIR = await loadBuffer(url, ac, ir, 0); } orbitBus.getReverb(roomsize, roomfade, roomlp, roomdim, roomIR, irspeed, irbegin); - orbitBus.sendReverb(post, room); + const send = orbitBus.sendReverb(post, room); + audioNodes.push(send); } if (djf != null) { diff --git a/packages/superdough/superdoughoutput.mjs b/packages/superdough/superdoughoutput.mjs index afe91e71e..a4235efd0 100644 --- a/packages/superdough/superdoughoutput.mjs +++ b/packages/superdough/superdoughoutput.mjs @@ -78,7 +78,7 @@ export class Orbit { return this.reverbNode; } sendReverb(node, amount) { - effectSend(node, this.reverbNode, amount); + return effectSend(node, this.reverbNode, amount); } sendDelay(node, amount) { From 92d87093e0b0a322801238f9d10ebe2a448af678 Mon Sep 17 00:00:00 2001 From: jeromew Date: Sat, 15 Nov 2025 13:39:24 +0000 Subject: [PATCH 125/312] [perf] disconnect Offline AudioNode connections in generateReverb --- packages/superdough/reverbGen.mjs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/superdough/reverbGen.mjs b/packages/superdough/reverbGen.mjs index d2533cae4..bb050874c 100644 --- a/packages/superdough/reverbGen.mjs +++ b/packages/superdough/reverbGen.mjs @@ -104,6 +104,8 @@ var applyGradualLowpass = function (input, lpFreqStart, lpFreqEnd, lpFreqEndAt, player.start(); context.oncomplete = function (event) { callback(event.renderedBuffer); + filter.disconnect(); + player.disconnect(); }; context.startRendering(); From 91799f2014e47200575fb59e568e4d51ff20673a Mon Sep 17 00:00:00 2001 From: Tristan Mlct Date: Sat, 15 Nov 2025 15:06:44 +0100 Subject: [PATCH 126/312] README: update superdough documentation --- packages/superdough/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/superdough/README.md b/packages/superdough/README.md index f5947d83f..213ee9697 100644 --- a/packages/superdough/README.md +++ b/packages/superdough/README.md @@ -89,7 +89,7 @@ superdough({ s: 'bd', delay: 0.5 }, 0, 1); - `decay`: seconds of decay phase - `sustain`: gain of sustain phase - `release`: seconds of release phase -- `deadline`: seconds until the sound should play (0 = immediate) +- `deadline`: seconds from audio context initialization before playing the sound (getAudioContextCurrentTime() = immediate) - `duration`: seconds the sound should last. optional for one shot samples, required for synth sounds ### registerSynthSounds() From bfa8fa3c757b2b457ee6aa5ef1a55f8bf14902e2 Mon Sep 17 00:00:00 2001 From: jeromew Date: Sun, 16 Nov 2025 09:23:11 +0000 Subject: [PATCH 127/312] [perf] fix `connect leak` when .noise() is in the mix --- packages/superdough/helpers.mjs | 14 +++++++++++++- packages/superdough/noise.mjs | 3 ++- packages/superdough/synth.mjs | 23 +++++++++++++---------- 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 47161ed61..de64df0e8 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -262,7 +262,15 @@ export function drywet(dry, wet, wetAmount = 0) { let mix = ac.createGain(); dry_gain.connect(mix); wet_gain.connect(mix); - return mix; + return { + node: mix, + onended: () => { + dry_gain.disconnect(mix); + wet_gain.disconnect(mix); + dry.disconnect(dry_gain); + wet.disconnect(wet_gain); + }, + }; } let curves = ['linear', 'exponential']; @@ -297,6 +305,10 @@ export function getVibratoOscillator(param, value, t) { gain.gain.value = vibmod * 100; vibratoOscillator.connect(gain); gain.connect(param); + vibratoOscillator.onended = () => { + gain.disconnect(param); + vibratoOscillator.disconnect(gain); + }; vibratoOscillator.start(t); return vibratoOscillator; } diff --git a/packages/superdough/noise.mjs b/packages/superdough/noise.mjs index 816dd252b..3e41515df 100644 --- a/packages/superdough/noise.mjs +++ b/packages/superdough/noise.mjs @@ -65,8 +65,9 @@ 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(); return { - node: noiseMix, + node: noiseMix.node, stop: (time) => noiseOscillator?.stop(time), }; } diff --git a/packages/superdough/synth.mjs b/packages/superdough/synth.mjs index e35b98806..a9ec7975c 100644 --- a/packages/superdough/synth.mjs +++ b/packages/superdough/synth.mjs @@ -47,19 +47,17 @@ export function registerSynthSounds() { [0.001, 0.05, 0.6, 0.01], ); - let sound = getOscillator(s, t, value); - let { node: o, stop, triggerRelease } = sound; - // turn down const g = gainNode(0.3); - const { duration } = value; - - o.onended = () => { - o.disconnect(); + let sound = getOscillator(s, t, value, () => { g.disconnect(); onended(); - }; + }); + + let { node: o, stop, triggerRelease } = sound; + + const { duration } = value; const envGain = gainNode(1); let node = o.connect(g).connect(envGain); @@ -446,7 +444,7 @@ export function waveformN(partials, type) { } // expects one of waveforms as s -export function getOscillator(s, t, value) { +export function getOscillator(s, t, value, onended) { let { n: partials, duration, noise = 0 } = value; let o; // If no partials are given, use stock waveforms @@ -460,7 +458,6 @@ export function getOscillator(s, t, value) { } // set frequency o.frequency.value = getFrequencyFromValue(value); - o.start(t); let vibratoOscillator = getVibratoOscillator(o.detune, value, t); @@ -473,6 +470,12 @@ export function getOscillator(s, t, value) { noiseMix = getNoiseMix(o, noise, t); } + o.onended = () => { + noiseMix?.node.disconnect(); + onended(); + }; + o.start(t); + return { node: noiseMix?.node || o, stop: (time) => { From 3962558c094f1a1a98cacedc4f8cf94c228eb202 Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 16 Nov 2025 13:12:47 -0600 Subject: [PATCH 128/312] Some final tweaks --- packages/superdough/worklets.mjs | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index 5a96246fe..6e2b47e75 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -825,13 +825,12 @@ const chyx = { /*bit reverse*/ br: function (x, size = 8) { if (size > 32) { throw new Error('br() Size cannot be greater than 32'); - } else { - let result = 0; - for (let idx = 0; idx < size - 0; idx++) { - result += chyx.bitC(x, 2 ** idx, 2 ** (size - (idx + 1))); - } - return result; } + let result = 0; + for (let idx = 0; idx < size; idx++) { + result |= chyx.bitC(x, 1 << idx, 1 << (size - (idx + 1))); + } + return result; }, /*sin that loops every 128 "steps", instead of every pi steps*/ sinf: function (x) { return Math.sin((x * PI) / 128); @@ -842,7 +841,7 @@ const chyx = { /*tan that loops every 128 "steps", instead of every pi steps*/ tanf: function (x) { return Math.tan((x * PI) / 128); }, - /*converts t into a string composed of it's bits, regex's that*/ regG: function (t, X) { + /*converts t into a string composed of its bits; regexes that*/ regG: function (t, X) { return X.test(t.toString(2)); }, }; @@ -850,7 +849,7 @@ const chyx = { // Create shortened Math functions let mathParams, byteBeatHelperFuncs; function getByteBeatFunc(codetext) { - if ((mathParams || byteBeatHelperFuncs) == null) { + if (mathParams == null) { mathParams = Object.getOwnPropertyNames(Math); byteBeatHelperFuncs = mathParams.map((k) => Math[k]); const chyxNames = Object.getOwnPropertyNames(chyx); @@ -883,7 +882,7 @@ class ByteBeatProcessor extends AudioWorkletProcessor { this.func = getByteBeatFunc(codeText); }; - this.initialOffset = null; + this.initialOffset = 0; this.t = null; this.func = null; } @@ -930,18 +929,19 @@ class ByteBeatProcessor extends AudioWorkletProcessor { this.t = params.begin[0] * sampleRate; } const output = outputs[0]; + const scale = 256 * INVSR; for (let i = 0; i < output[0].length; i++) { const detune = pv(params.detune, i); const freq = applySemitoneDetuneToFrequency(pv(params.frequency, i), detune / 100); - let local_t = 256 * this.t * INVSR * freq + this.initialOffset; + const local_t = scale * freq * this.t + this.initialOffset; const funcValue = this.func(local_t); - let signal = (funcValue & 255) / 127.5 - 1; - const out = signal * 0.2; + const signal = (funcValue & 255) / 127.5 - 1; + //prevent speaker blowout via clipping if threshold exceeds + const out = clamp(signal * 0.2, -0.4, 0.4); for (let c = 0; c < output.length; c++) { - //prevent speaker blowout via clipping if threshold exceeds - output[c][i] = clamp(out, -0.4, 0.4); + output[c][i] = out; } - this.t = this.t + 1; + this.t++; } return true; // keep the audio processing going From fb7f686519130ed07fe66f561e6ab46cbc609a27 Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 16 Nov 2025 15:22:34 -0600 Subject: [PATCH 129/312] 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 130/312] 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 cc10122b7184d4271c4a166673a76726854ac1c7 Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 16 Nov 2025 19:20:42 -0600 Subject: [PATCH 131/312] Testing out approach to allow list patterns in partials --- packages/core/controls.mjs | 28 --------------- packages/core/pattern.mjs | 51 ++++++++++++++++++++++++++ website/src/pages/learn/synths.mdx | 57 ++++++++++++++++++++++++++---- 3 files changed, 101 insertions(+), 35 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 1d19a94b6..9a2be7f44 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -2583,31 +2583,3 @@ export const scrub = register( }, false, ); - -/** - * Scale the magnitude of the harmonics of one of the core synths ('sine', 'tri', 'saw', ..) - * - * Can also be used to create a new synth via `s('user').partials(...)` - * - * @name partials - * @param {number[] | Pattern} partials List of [0, 1] magnitudes for partials. 0th entry is the first harmonic (i.e. DC offset is skipped) - * @example - * s("user").seg(16).n(irand(8)).scale("A:major") - * .partials([1, 0, 1, 0, 0, 1]) - * @example - * s("saw").seg(8).n(irand(12)).scale("G#:minor") - * .partials(binaryL(256)) - */ -export const { partials } = registerControl('partials'); - -/** - * Rotates the harmonics of one of the core synths ('sine', 'tri', 'saw', 'user', ..) by a list of phases - * - * @name phases - * @param {number[] | Pattern} phases List of [0, 1) phases for partials. 0th entry is the first phase (i.e. DC offset is skipped) - * @example - * s("saw").seg(8).n(irand(12)).scale("G#:minor") - * .partials(binaryL(256)) - * .phases(randL(20)) - */ -export const { phases } = registerControl('phases'); diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index e29769900..f08667cf7 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -3624,3 +3624,54 @@ for (const name of distAlgoNames) { return this.distort(argsPat); }; } + +/** + * Turns a list of patterns into a single pattern which outputs list-values + * + * @name parray + * @returns Pattern + */ +export const parray = (pats) => { + const pack = (...xs) => xs; + let acc = pure(curry(pack, null, pats.length)); + for (const p of pats) acc = acc.appBoth(reify(p)); + return acc; +}; + +/** + * Scale the magnitude of the harmonics of one of the core synths ('sine', 'tri', 'saw', ..) + * + * Can also be used to create a new synth via `s('user').partials(...)` + * + * @name partials + * @param {number[] | Pattern} partials List of [0, 1] magnitudes for partials. 0th entry is the first harmonic (i.e. DC offset is skipped) + * @example + * s("user").seg(16).n(irand(8)).scale("A:major") + * .partials([1, 0, 1, 0, 0, 1]) + * @example + * s("saw").seg(8).n(irand(12)).scale("G#:minor") + * .partials(binaryL(256)) + */ +export const { partials } = register('partials', (list, pat) => { + if (Array.isArray(list)) { + list = parray(list); + } + return pat.withValue((v) => ({...v, partials: list})); +}); + +/** + * Rotates the harmonics of one of the core synths ('sine', 'tri', 'saw', 'user', ..) by a list of phases + * + * @name phases + * @param {number[] | Pattern} phases List of [0, 1) phases for partials. 0th entry is the first phase (i.e. DC offset is skipped) + * @example + * s("saw").seg(8).n(irand(12)).scale("G#:minor") + * .partials(binaryL(256)) + * .phases(randL(20)) + */ +export const { phases } = register('phases', (list, pat) => { + if (Array.isArray(list)) { + list = parray(list); + } + return pat.withValue((v) => ({...v, phases: list})); +}); diff --git a/website/src/pages/learn/synths.mdx b/website/src/pages/learn/synths.mdx index 0fcc41363..1a65568df 100644 --- a/website/src/pages/learn/synths.mdx +++ b/website/src/pages/learn/synths.mdx @@ -48,28 +48,71 @@ You can also use the `crackle` type to play some subtle noise crackles. You can ### Additive Synthesis -To tame the harsh sound of the basic waveforms, we can set the `n` control to limit the overtones of the waveform: +Waveforms are often composed of several [harmonics](https://en.wikipedia.org/wiki/Harmonic) above a fundamental frequency, lying at integer multiples. These overtones combine to give a sound its unique timbral quality. + +For the basic waveforms, we offer you control over these harmonics with the `partials` and `phases` functions. + +#### Partials + +`partials` refers to the magnitude of each harmonic relative to the fundamental frequency. They can thus be used to spectrally filter these waveforms and tame some of their harshness: >".fast(2)) .sound("sawtooth") -.n("<32 16 8 4>") +.partials([1, 1, 0, 1]) ._scope()`} /> -When the `n` control is used on a basic waveform, it defines the number of harmonic partials the sound is getting. -You can also set `n` directly in mini notation with `sound`: +`partials` can also be used to construct _new_ waveforms not present in our basic set with the 'user' sound source: >".fast(2)) -.sound("sawtooth:<32 16 8 4>") +.sound("user") +.partials([1, 0, 0.3, 0, 0.1, 0, 0, 0.3]) ._scope()`} /> -Note for tidal users: `n` in tidal is synonymous to `note` for synths only. -In strudel, this is not the case, where `n` will always change timbre, be it though different samples or different waveforms. +We may algorithmically construct lists of partials with Javascript code like: + +>".fast(2)) +.sound("user") +.partials(new Array(numHarmonics).fill(1)) +._scope()`} +/> + +This approach can act as a form of bandlimiting. `partials` is also compatible with pattern functions designed to produce lists, like `randL` or `binaryL`: + +>".fast(2)) +.sound("user") +.partials(randL(8)) +._scope()`} +/> + +Note that the first value in the `partials` array controls the magnitude of the fundamental harmonic rather than the DC offset, which is fixed at 0. + +#### Phases + +We mentioned that our sounds can be broken into a constituent set of harmonics above a fundamental frequency. These are defined by two values: their magnitude (how loud they are) and their [phase](https://en.wikipedia.org/wiki/Phase_(waves)), which can be thought of as which point in its cycle each sine wave is initialized at when we begin adding them. + +These phases too can be declared in Strudel and can give your sounds interesting depth. + +>".fast(2)) +.sound("user") +.partials(randL(8)) +.phases(randL(8).late(0.3)) +._scope()`} +/> ## Vibrato From 7a3bea6f9087105ed0be0982798b9dd26c9ed089 Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 16 Nov 2025 19:38:59 -0600 Subject: [PATCH 132/312] Working version --- packages/core/pattern.mjs | 5 +++-- website/src/pages/learn/synths.mdx | 10 ++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index f08667cf7..cd8c5871a 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -3653,10 +3653,11 @@ export const parray = (pats) => { * .partials(binaryL(256)) */ export const { partials } = register('partials', (list, pat) => { + debugger; if (Array.isArray(list)) { list = parray(list); } - return pat.withValue((v) => ({...v, partials: list})); + return pat.withValue((v) => (l) => ({...v, partials: l})).appLeft(list); }); /** @@ -3673,5 +3674,5 @@ export const { phases } = register('phases', (list, pat) => { if (Array.isArray(list)) { list = parray(list); } - return pat.withValue((v) => ({...v, phases: list})); + return pat.withValue((v) => (l) => ({...v, phases: l})).appLeft(list); }); diff --git a/website/src/pages/learn/synths.mdx b/website/src/pages/learn/synths.mdx index 1a65568df..b209dc9c0 100644 --- a/website/src/pages/learn/synths.mdx +++ b/website/src/pages/learn/synths.mdx @@ -96,6 +96,16 @@ note("c2 >".fast(2)) ._scope()`} /> +and with lists _of_ patterns: + +>".fast(4)) +.sound("user") +.partials([1, 0, "0 1", "0 1 0.3", rand]) +._scope()`} +/> + Note that the first value in the `partials` array controls the magnitude of the fundamental harmonic rather than the DC offset, which is fixed at 0. #### Phases From f5ed6dbe79a683dac229ed095ac0c4ff592c72ea Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 16 Nov 2025 20:28:22 -0600 Subject: [PATCH 133/312] Top level functions --- packages/core/pattern.mjs | 36 +++++++++++++++------ packages/core/test/pattern.test.mjs | 4 +-- website/src/components/Header/Search.css | 4 +-- website/src/pages/learn/synths.mdx | 40 +++++++++++++++--------- 4 files changed, 56 insertions(+), 28 deletions(-) diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index cd8c5871a..3c21bd1b2 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -3644,35 +3644,51 @@ export const parray = (pats) => { * Can also be used to create a new synth via `s('user').partials(...)` * * @name partials - * @param {number[] | Pattern} partials List of [0, 1] magnitudes for partials. 0th entry is the first harmonic (i.e. DC offset is skipped) + * @param {number[] | Pattern} magnitudes List of [0, 1] magnitudes for partials. 0th entry is the fundamental harmonic (i.e. DC offset is skipped) * @example * s("user").seg(16).n(irand(8)).scale("A:major") * .partials([1, 0, 1, 0, 0, 1]) * @example * s("saw").seg(8).n(irand(12)).scale("G#:minor") - * .partials(binaryL(256)) + * .partials(randL(16)) */ -export const { partials } = register('partials', (list, pat) => { - debugger; +register('partials', (list, pat) => { if (Array.isArray(list)) { list = parray(list); } - return pat.withValue((v) => (l) => ({...v, partials: l})).appLeft(list); + return pat.withValue((v) => (l) => ({ ...v, partials: l })).appLeft(list); }); +// Also create a top-level function +export const partials = (list) => { + if (Array.isArray(list)) { + list = parray(list); + } + return list.as('partials'); +}; + /** * Rotates the harmonics of one of the core synths ('sine', 'tri', 'saw', 'user', ..) by a list of phases * * @name phases - * @param {number[] | Pattern} phases List of [0, 1) phases for partials. 0th entry is the first phase (i.e. DC offset is skipped) + * @param {number[] | Pattern} phases List of [0, 1) phases for partials. 0th entry is the fundamental phase (i.e. DC offset is skipped) * @example * s("saw").seg(8).n(irand(12)).scale("G#:minor") - * .partials(binaryL(256)) - * .phases(randL(20)) + * .partials(randL(16)) + * .phases(randL(16)) */ -export const { phases } = register('phases', (list, pat) => { +register('phases', (list, pat) => { if (Array.isArray(list)) { list = parray(list); } - return pat.withValue((v) => (l) => ({...v, phases: l})).appLeft(list); + pat = pat ?? pure({}); + return pat.withValue((v) => (l) => ({ ...v, phases: l })).appLeft(list); }); + +// Also create a top-level function +export const phases = (list) => { + if (Array.isArray(list)) { + list = parray(list); + } + return list.as('phases'); +}; diff --git a/packages/core/test/pattern.test.mjs b/packages/core/test/pattern.test.mjs index 625f40756..1df5c8776 100644 --- a/packages/core/test/pattern.test.mjs +++ b/packages/core/test/pattern.test.mjs @@ -796,7 +796,7 @@ describe('Pattern', () => { }); }); describe('apply', () => { - (it('Can apply a function', () => { + it('Can apply a function', () => { expect(sequence('a', 'b').apply(fast(2)).firstCycle()).toStrictEqual(sequence('a', 'b').fast(2).firstCycle()); }), it('Can apply a pattern of functions', () => { @@ -804,7 +804,7 @@ describe('Pattern', () => { expect(sequence('a', 'b').apply(fast(2), fast(3)).firstCycle()).toStrictEqual( sequence('a', 'b').fast(2, 3).firstCycle(), ); - })); + }); }); describe('layer', () => { it('Can layer up multiple functions', () => { diff --git a/website/src/components/Header/Search.css b/website/src/components/Header/Search.css index b14146cbd..456ef9f6b 100644 --- a/website/src/components/Header/Search.css +++ b/website/src/components/Header/Search.css @@ -18,8 +18,8 @@ --docsearch-modal-background: var(--background); --docsearch-muted-color: color-mix(in srgb, var(--foreground), #fff 30%); --docsearch-key-gradient: var(--foreground); - --docsearch-key-shadow: - inset 0 -2px 0 0 var(--gutterForeground), inset 0 0 1px 1px var(--foreground), 0 1px 2px 1px var(--gutterBackground); + --docsearch-key-shadow: inset 0 -2px 0 0 var(--gutterForeground), inset 0 0 1px 1px var(--foreground), + 0 1px 2px 1px var(--gutterBackground); } .dark { --docsearch-muted-color: color-mix(in srgb, var(--foreground), #000 30%); diff --git a/website/src/pages/learn/synths.mdx b/website/src/pages/learn/synths.mdx index b209dc9c0..6fc5b6925 100644 --- a/website/src/pages/learn/synths.mdx +++ b/website/src/pages/learn/synths.mdx @@ -48,7 +48,7 @@ You can also use the `crackle` type to play some subtle noise crackles. You can ### Additive Synthesis -Waveforms are often composed of several [harmonics](https://en.wikipedia.org/wiki/Harmonic) above a fundamental frequency, lying at integer multiples. These overtones combine to give a sound its unique timbral quality. +Periodic waveforms are composed of several [harmonics](https://en.wikipedia.org/wiki/Harmonic) above a fundamental frequency, lying at integer multiples. These overtones combine to give a sound its unique timbral quality. For the basic waveforms, we offer you control over these harmonics with the `partials` and `phases` functions. @@ -60,7 +60,7 @@ For the basic waveforms, we offer you control over these harmonics with the `par client:idle tune={`note("c2 >".fast(2)) .sound("sawtooth") -.partials([1, 1, 0, 1]) +.partials([1, 1, "<1 0>", "<1 0>", "<1 0>", "<1 0>", "<1 0>"]) ._scope()`} /> @@ -74,25 +74,38 @@ For the basic waveforms, we offer you control over these harmonics with the `par ._scope()`} /> -We may algorithmically construct lists of partials with Javascript code like: +We may algorithmically construct lists of magnitudes with Javascript code like: >".fast(2)) -.sound("user") +.sound("saw") .partials(new Array(numHarmonics).fill(1)) ._scope()`} /> -This approach can act as a form of bandlimiting. `partials` is also compatible with pattern functions designed to produce lists, like `randL` or `binaryL`: +which acts as a spectral filter or >".fast(2)) + tune={`note("c2 >").fast(2) .sound("user") -.partials(randL(8)) +.partials(new Array(50).fill(0) + .map((_, idx) => ((-1) ** (idx + 1)) / (idx + 1)) +) +._scope()`} +/> + +which recovers a familiar waveform. + +`partials` is also compatible with pattern functions designed to produce lists, like `randL` or `binaryL`: + +>").fast(2) +.sound("user") +.partials(randL(10)) ._scope()`} /> @@ -110,17 +123,16 @@ Note that the first value in the `partials` array controls the magnitude of the #### Phases -We mentioned that our sounds can be broken into a constituent set of harmonics above a fundamental frequency. These are defined by two values: their magnitude (how loud they are) and their [phase](https://en.wikipedia.org/wiki/Phase_(waves)), which can be thought of as which point in its cycle each sine wave is initialized at when we begin adding them. +Earlier, we mentioned that periodic waveforms can be broken into a set of harmonics above a fundamental frequency. Each harmonic has two defining properties: its magnitude (how loud it is) and its phase, which determines where in its cycle that sine wave starts when the waveform is built. These phases too can be declared in Strudel and can give your sounds interesting depth. >".fast(2)) -.sound("user") -.partials(randL(8)) -.phases(randL(8).late(0.3)) + tune={`note("c2 >".fast(2)) +.sound("saw") +.partials(randL(100)) +.phases(randL(100)) ._scope()`} /> From 641bd2f356f16072dd69e75509697294e479ac38 Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 16 Nov 2025 22:17:53 -0600 Subject: [PATCH 134/312] Properly patternify everything --- packages/core/pattern.mjs | 45 +++--- test/__snapshots__/examples.test.mjs.snap | 160 +++++++++++++--------- website/src/pages/learn/synths.mdx | 13 +- 3 files changed, 123 insertions(+), 95 deletions(-) diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index 3c21bd1b2..4737f0db0 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -3638,6 +3638,13 @@ export const parray = (pats) => { return acc; }; +const _ensureListPattern = (list) => { + if (Array.isArray(list)) { + return parray(list); + } + return reify(list); +}; + /** * Scale the magnitude of the harmonics of one of the core synths ('sine', 'tri', 'saw', ..) * @@ -3650,21 +3657,15 @@ export const parray = (pats) => { * .partials([1, 0, 1, 0, 0, 1]) * @example * s("saw").seg(8).n(irand(12)).scale("G#:minor") - * .partials(randL(16)) + * .partials(binaryL(irand(256).add("1"))) */ -register('partials', (list, pat) => { - if (Array.isArray(list)) { - list = parray(list); - } - return pat.withValue((v) => (l) => ({ ...v, partials: l })).appLeft(list); -}); +Pattern.prototype.partials = function (list) { + return this.withValue((v) => (l) => ({ ...v, partials: l })).appLeft(_ensureListPattern(list)); +}; // Also create a top-level function export const partials = (list) => { - if (Array.isArray(list)) { - list = parray(list); - } - return list.as('partials'); + return _ensureListPattern(list).as('partials'); }; /** @@ -3673,22 +3674,16 @@ export const partials = (list) => { * @name phases * @param {number[] | Pattern} phases List of [0, 1) phases for partials. 0th entry is the fundamental phase (i.e. DC offset is skipped) * @example - * s("saw").seg(8).n(irand(12)).scale("G#:minor") - * .partials(randL(16)) - * .phases(randL(16)) + * // Phase cancellation + * s("saw").seg(8).n(irand(12)).scale("G#1:minor") + * .partials(partials([1, 1, 1])) + * .superimpose(x => x.phases([0.5, 0.5, 0.5])) */ -register('phases', (list, pat) => { - if (Array.isArray(list)) { - list = parray(list); - } - pat = pat ?? pure({}); - return pat.withValue((v) => (l) => ({ ...v, phases: l })).appLeft(list); -}); +Pattern.prototype.phases = function (list) { + return this.withValue((v) => (l) => ({ ...v, phases: l })).appLeft(_ensureListPattern(list)); +}; // Also create a top-level function export const phases = (list) => { - if (Array.isArray(list)) { - list = parray(list); - } - return list.as('phases'); + return _ensureListPattern(list).as('phases'); }; diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 4b4c36e98..32e61c31d 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -7290,38 +7290,38 @@ exports[`runs examples > example "partials" example index 0 1`] = ` exports[`runs examples > example "partials" example index 1 1`] = ` [ - "[ 0/1 → 1/8 | s:saw note:G#3 partials:[1 0 0 0 0 0 0 0 0] ]", - "[ 1/8 → 1/4 | s:saw note:A#4 partials:[1 0 0 0 0 0 0 0 0] ]", - "[ 1/4 → 3/8 | s:saw note:D#4 partials:[1 0 0 0 0 0 0 0 0] ]", - "[ 3/8 → 1/2 | s:saw note:D#4 partials:[1 0 0 0 0 0 0 0 0] ]", - "[ 1/2 → 5/8 | s:saw note:C#4 partials:[1 0 0 0 0 0 0 0 0] ]", - "[ 5/8 → 3/4 | s:saw note:A#3 partials:[1 0 0 0 0 0 0 0 0] ]", - "[ 3/4 → 7/8 | s:saw note:B3 partials:[1 0 0 0 0 0 0 0 0] ]", - "[ 7/8 → 1/1 | s:saw note:D#4 partials:[1 0 0 0 0 0 0 0 0] ]", - "[ 1/1 → 9/8 | s:saw note:F#4 partials:[1 0 0 0 0 0 0 0 0] ]", - "[ 9/8 → 5/4 | s:saw note:A#4 partials:[1 0 0 0 0 0 0 0 0] ]", - "[ 5/4 → 11/8 | s:saw note:A#4 partials:[1 0 0 0 0 0 0 0 0] ]", - "[ 11/8 → 3/2 | s:saw note:B3 partials:[1 0 0 0 0 0 0 0 0] ]", - "[ 3/2 → 13/8 | s:saw note:G#4 partials:[1 0 0 0 0 0 0 0 0] ]", - "[ 13/8 → 7/4 | s:saw note:E4 partials:[1 0 0 0 0 0 0 0 0] ]", - "[ 7/4 → 15/8 | s:saw note:B3 partials:[1 0 0 0 0 0 0 0 0] ]", - "[ 15/8 → 2/1 | s:saw note:G#4 partials:[1 0 0 0 0 0 0 0 0] ]", - "[ 2/1 → 17/8 | s:saw note:D#5 partials:[1 0 0 0 0 0 0 0 0] ]", - "[ 17/8 → 9/4 | s:saw note:C#5 partials:[1 0 0 0 0 0 0 0 0] ]", - "[ 9/4 → 19/8 | s:saw note:D#4 partials:[1 0 0 0 0 0 0 0 0] ]", - "[ 19/8 → 5/2 | s:saw note:C#5 partials:[1 0 0 0 0 0 0 0 0] ]", - "[ 5/2 → 21/8 | s:saw note:E4 partials:[1 0 0 0 0 0 0 0 0] ]", - "[ 21/8 → 11/4 | s:saw note:A#3 partials:[1 0 0 0 0 0 0 0 0] ]", - "[ 11/4 → 23/8 | s:saw note:G#4 partials:[1 0 0 0 0 0 0 0 0] ]", - "[ 23/8 → 3/1 | s:saw note:G#3 partials:[1 0 0 0 0 0 0 0 0] ]", - "[ 3/1 → 25/8 | s:saw note:B3 partials:[1 0 0 0 0 0 0 0 0] ]", - "[ 25/8 → 13/4 | s:saw note:D#4 partials:[1 0 0 0 0 0 0 0 0] ]", - "[ 13/4 → 27/8 | s:saw note:D#5 partials:[1 0 0 0 0 0 0 0 0] ]", - "[ 27/8 → 7/2 | s:saw note:D#4 partials:[1 0 0 0 0 0 0 0 0] ]", - "[ 7/2 → 29/8 | s:saw note:D#4 partials:[1 0 0 0 0 0 0 0 0] ]", - "[ 29/8 → 15/4 | s:saw note:D#5 partials:[1 0 0 0 0 0 0 0 0] ]", - "[ 15/4 → 31/8 | s:saw note:B4 partials:[1 0 0 0 0 0 0 0 0] ]", - "[ 31/8 → 4/1 | s:saw note:A#4 partials:[1 0 0 0 0 0 0 0 0] ]", + "[ 0/1 → 1/8 | s:saw note:G#3 partials:[1] ]", + "[ 1/8 → 1/4 | s:saw note:A#4 partials:[1 0 1 1 0 0 0 0] ]", + "[ 1/4 → 3/8 | s:saw note:D#4 partials:[1 0 1 1 1 1 1] ]", + "[ 3/8 → 1/2 | s:saw note:D#4 partials:[1 1 0 0 1 1 1] ]", + "[ 1/2 → 5/8 | s:saw note:C#4 partials:[1 0 0 0 0 1 1] ]", + "[ 5/8 → 3/4 | s:saw note:A#3 partials:[1 0 0 0 1 1] ]", + "[ 3/4 → 7/8 | s:saw note:B3 partials:[1 1 0 0 1 1] ]", + "[ 7/8 → 1/1 | s:saw note:D#4 partials:[1 1 0 0 1 1 0] ]", + "[ 1/1 → 9/8 | s:saw note:F#4 partials:[1 0 0 0 0 1 1 0] ]", + "[ 9/8 → 5/4 | s:saw note:A#4 partials:[1 0 1 0 1 1 0 1] ]", + "[ 5/4 → 11/8 | s:saw note:A#4 partials:[1 0 1 1 1 0 1 1] ]", + "[ 11/8 → 3/2 | s:saw note:B3 partials:[1 0 1 1 1 1] ]", + "[ 3/2 → 13/8 | s:saw note:G#4 partials:[1 0 0 1 1 1 0 0] ]", + "[ 13/8 → 7/4 | s:saw note:E4 partials:[1 0 0 0 0 0 0 0] ]", + "[ 7/4 → 15/8 | s:saw note:B3 partials:[1 1 0 1 0 1] ]", + "[ 15/8 → 2/1 | s:saw note:G#4 partials:[1 0 0 1 1 0 0 1] ]", + "[ 2/1 → 17/8 | s:saw note:D#5 partials:[1 1 1 1 0 1 1 0] ]", + "[ 17/8 → 9/4 | s:saw note:C#5 partials:[1 1 1 0 1 0 0 0] ]", + "[ 9/4 → 19/8 | s:saw note:D#4 partials:[1 0 1 1 0 0 1] ]", + "[ 19/8 → 5/2 | s:saw note:C#5 partials:[1 1 0 1 0 1 1 1] ]", + "[ 5/2 → 21/8 | s:saw note:E4 partials:[1 1 1 0 1 1 0] ]", + "[ 21/8 → 11/4 | s:saw note:A#3 partials:[1 0 1 0 1 0] ]", + "[ 11/4 → 23/8 | s:saw note:G#4 partials:[1 0 1 0 0 0 1 1] ]", + "[ 23/8 → 3/1 | s:saw note:G#3 partials:[1 0 1] ]", + "[ 3/1 → 25/8 | s:saw note:B3 partials:[1 1 1 0 0 0] ]", + "[ 25/8 → 13/4 | s:saw note:D#4 partials:[1 0 1 1 0 0 0] ]", + "[ 13/4 → 27/8 | s:saw note:D#5 partials:[1 1 1 1 1 1 1 1] ]", + "[ 27/8 → 7/2 | s:saw note:D#4 partials:[1 1 0 1 0 0 1] ]", + "[ 7/2 → 29/8 | s:saw note:D#4 partials:[1 1 0 1 0 0 1] ]", + "[ 29/8 → 15/4 | s:saw note:D#5 partials:[1 1 1 1 0 0 0 1] ]", + "[ 15/4 → 31/8 | s:saw note:B4 partials:[1 1 0 1 0 0 0 0] ]", + "[ 31/8 → 4/1 | s:saw note:A#4 partials:[1 0 1 1 1 1 0 1] ]", ] `; @@ -7580,38 +7580,70 @@ exports[`runs examples > example "phasersweep" example index 0 1`] = ` exports[`runs examples > example "phases" example index 0 1`] = ` [ - "[ 0/1 → 1/8 | s:saw note:G#3 partials:[1 0 0 0 0 0 0 0 0] phases:[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] ]", - "[ 1/8 → 1/4 | s:saw note:A#4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.6852155700325966 0.17723728902637959 0.8521428182721138 0.5022399611771107 0.9780306946486235 0.3186125475913286 0.1851645242422819 0.8495976086705923 0.9832699615508318 0.8203876558691263 0.7365445382893085 0.6727468091994524 0.4794053863734007 0.35482912696897984 0.5666771996766329 0.4527092967182398 0.5699347071349621 0.7358296867460012 0.5444891396909952 0.11270620673894882] ]", - "[ 1/4 → 3/8 | s:saw note:D#4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.36975969187915325 0.18273563869297504 0.012781793251633644 0.5423613861203194 0.12467948533594608 0.7188410349190235 0.856887087225914 0.8818203993141651 0.8917219173163176 0.110306391492486 0.07148400321602821 0.8493648078292608 0.9100127145648003 0.4820226952433586 0.037094997242093086 0.9857278112322092 0.23439379036426544 0.46701666340231895 0.15832693874835968 0.6921216659247875] ]", - "[ 3/8 → 1/2 | s:saw note:D#4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.40139251574873924 0.15799915604293346 0.9604704882949591 0.03873417526483536 0.4157217647880316 0.27756719291210175 0.8800551909953356 0.5692523363977671 0.11026228219270706 0.7190891150385141 0.404962956905365 0.50828124769032 0.9681975357234478 0.34809120930731297 0.9345223866403103 0.9851128943264484 0.11768617853522301 0.538263589143753 0.6650313660502434 0.02540053054690361] ]", - "[ 1/2 → 5/8 | s:saw note:C#4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.2604806162416935 0.3654713351279497 0.9900747090578079 0.22572625242173672 0.9328999016433954 0.5273839123547077 0.7047769222408533 0.7311522178351879 0.42673745937645435 0.7099553178995848 0.5597201306372881 0.8968746215105057 0.15695763938128948 0.3792166206985712 0.4147114269435406 0.38739512488245964 0.7585489805787802 0.3875726908445358 0.867314238101244 0.1866922564804554] ]", - "[ 5/8 → 3/4 | s:saw note:A#3 partials:[1 0 0 0 0 0 0 0 0] phases:[0.1356358677148819 0.5403102282434702 0.07321739941835403 0.9646544624119997 0.7707359045743942 0.46888123638927937 0.9489036612212658 0.366748945787549 0.5029341224581003 0.7194344792515039 0.282692551612854 0.7303404528647661 0.7155798356980085 0.637981578707695 0.39654020965099335 0.008769871667027473 0.5857728160917759 0.3513293471187353 0.43080931156873703 0.518209295347333] ]", - "[ 3/4 → 7/8 | s:saw note:B3 partials:[1 0 0 0 0 0 0 0 0] phases:[0.19582648016512394 0.0024610888212919235 0.08272589556872845 0.09592138417065144 0.9678201265633106 0.3249557167291641 0.9463537875562906 0.20766610652208328 0.19126702845096588 0.4482936095446348 0.23314787074923515 0.07724925130605698 0.8329483829438686 0.39804019033908844 0.2529231123626232 0.889951054006815 0.716364661231637 0.3905949704349041 0.990752438083291 0.275751456618309] ]", - "[ 7/8 → 1/1 | s:saw note:D#4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.3976310808211565 0.13476407527923584 0.963376859202981 0.6579397786408663 0.5203975513577461 0.865439185872674 0.5583905670791864 0.2736878804862499 0.17021040990948677 0.3456706069409847 0.5848060417920351 0.9889458417892456 0.9307208992540836 0.7148868907243013 0.7419579364359379 0.8103639334440231 0.3331365995109081 0.19130694679915905 0.03261224366724491 0.808204049244523] ]", - "[ 1/1 → 9/8 | s:saw note:F#4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.5195421651005745 0.9349692352116108 0.1718774326145649 0.9601866770535707 0.2802200373262167 0.8732441551983356 0.01810968853533268 0.42737805284559727 0.26281314715743065 0.7521175239235163 0.568607984110713 0.5046361442655325 0.03172125294804573 0.3706745784729719 0.9402780849486589 0.3995086643844843 0.35769628174602985 0.023460431024432182 0.043030962347984314 0.6526827793568373] ]", - "[ 9/8 → 5/4 | s:saw note:A#4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.6724895145744085 0.21410975232720375 0.5229047331959009 0.20957534946501255 0.7402758821845055 0.2681974694132805 0.4059371296316385 0.9422509074211121 0.6584139950573444 0.26589646376669407 0.16059227287769318 0.17166719026863575 0.6234225388616323 0.020276052877306938 0.4836352560669184 0.8991366866976023 0.1860280428081751 0.06238717399537563 0.4383583478629589 0.4902789145708084] ]", - "[ 5/4 → 11/8 | s:saw note:A#4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.7287282031029463 0.9341024849563837 0.5098182689398527 0.5608645845204592 0.6812942810356617 0.5015129633247852 0.4602120481431484 0.927369873970747 0.19313151575624943 0.5240397155284882 0.444337897002697 0.19362097792327404 0.7068767864257097 0.920799495652318 0.2648108974099159 0.9700228478759527 0.20331068895757198 0.38390261493623257 0.0038731005042791367 0.9156702514737844] ]", - "[ 11/8 → 3/2 | s:saw note:B3 partials:[1 0 0 0 0 0 0 0 0] phases:[0.18280375190079212 0.40527783520519733 0.30504362285137177 0.7622128054499626 0.842598931863904 0.053796686232089996 0.5124214049428701 0.9178454764187336 0.09979427233338356 0.8280061967670918 0.5572535842657089 0.0622002687305212 0.9205668028444052 0.7738517206162214 0.04644870012998581 0.2117986585944891 0.26436166651546955 0.26421429589390755 0.4649084359407425 0.10490566119551659] ]", - "[ 3/2 → 13/8 | s:saw note:G#4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.6084080748260021 0.4424846563488245 0.755185678601265 0.04328125901520252 0.04244415462017059 0.3994515985250473 0.787989066913724 0.3180440980941057 0.30072982981801033 0.24217353947460651 0.7830625418573618 0.7733921892940998 0.7720277719199657 0.4402343425899744 0.21046430803835392 0.38635879568755627 0.5671729445457458 0.9510521050542593 0.010756833478808403 0.5728995501995087] ]", - "[ 13/8 → 7/4 | s:saw note:E4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.49675471149384975 0.2965749856084585 0.09848833456635475 0.19172007404267788 0.22677889838814735 0.9841996673494577 0.11156083643436432 0.6079028844833374 0.9412728808820248 0.9376902114599943 0.3611182738095522 0.5901201106607914 0.26860327646136284 0.9782364591956139 0.18694544956088066 0.004641396924853325 0.42020696587860584 0.06209231913089752 0.4790260009467602 0.21088780276477337] ]", - "[ 7/4 → 15/8 | s:saw note:B3 partials:[1 0 0 0 0 0 0 0 0] phases:[0.20473789609968662 0.7480021081864834 0.30757393687963486 0.5827204789966345 0.22094514779746532 0.6370698790997267 0.16573002003133297 0.0638319905847311 0.12625465169548988 0.4565841108560562 0.46095744147896767 0.646710304543376 0.045173922553658485 0.4833248760551214 0.1326297614723444 0.5275116711854935 0.9871038906276226 0.424171743914485 0.761672617867589 0.08582597225904465] ]", - "[ 15/8 → 2/1 | s:saw note:G#4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.5945571791380644 0.3962489552795887 0.563431927934289 0.4742323160171509 0.4185752831399441 0.9703940469771624 0.5282467231154442 0.6896266285330057 0.6941124945878983 0.2423656489700079 0.225077323615551 0.5445358455181122 0.014737963676452637 0.2848400343209505 0.14955217391252518 0.9782383926212788 0.6327074971050024 0.23327310755848885 0.4324392694979906 0.4326172359287739] ]", - "[ 2/1 → 17/8 | s:saw note:D#5 partials:[1 0 0 0 0 0 0 0 0] phases:[0.9595271199941635 0.5427457969635725 0.45864437520504 0.8057199101895094 0.18388565629720688 0.17221237532794476 0.8838487900793552 0.4976818822324276 0.7543560564517975 0.34416236728429794 0.8638174068182707 0.5697487238794565 0.005243342369794846 0.6361143626272678 0.6039986703544855 0.38708674535155296 0.5463927835226059 0.5717255529016256 0.15141930803656578 0.22688637301325798] ]", - "[ 17/8 → 9/4 | s:saw note:C#5 partials:[1 0 0 0 0 0 0 0 0] phases:[0.9033902939409018 0.22919894196093082 0.8388008493930101 0.9108077362179756 0.32246968522667885 0.16122018359601498 0.31932324543595314 0.18524732999503613 0.19110161997377872 0.5346284378319979 0.38531880639493465 0.7401201985776424 0.07450124807655811 0.18417961709201336 0.5768439751118422 0.7161206863820553 0.5836263168603182 0.9591280855238438 0.7728104889392853 0.0006709620356559753] ]", - "[ 9/4 → 19/8 | s:saw note:D#4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.34548251144587994 0.30419893004000187 0.10205957666039467 0.9906709585338831 0.3156223688274622 0.3745057098567486 0.7668170686811209 0.9379972033202648 0.689277408644557 0.8690325897186995 0.36728161945939064 0.9668608456850052 0.7341883443295956 0.32575040124356747 0.8095720671117306 0.3182998225092888 0.38158727809786797 0.5534052699804306 0.5973556581884623 0.752589326351881] ]", - "[ 19/8 → 5/2 | s:saw note:C#5 partials:[1 0 0 0 0 0 0 0 0] phases:[0.8365066405385733 0.5369812995195389 0.2263860274106264 0.21759207546710968 0.2172116208821535 0.09454222768545151 0.8075542915612459 0.9017798062413931 0.46291174553334713 0.01372767798602581 0.3509599883109331 0.4871185813099146 0.3525365497916937 0.6883120182901621 0.19577431678771973 0.287217665463686 0.025726469233632088 0.11798650585114956 0.8464976660907269 0.981348654255271] ]", - "[ 5/2 → 21/8 | s:saw note:E4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.45861607417464256 0.6807645913213491 0.07009582966566086 0.1450389064848423 0.2579921595752239 0.612881500273943 0.5503941811621189 0.7027011960744858 0.681745121255517 0.24246043153107166 0.2981361001729965 0.02195165678858757 0.10680225491523743 0.9413154497742653 0.6108828671276569 0.9479686040431261 0.17599895782768726 0.6629563421010971 0.5875700414180756 0.05703482776880264] ]", - "[ 21/8 → 11/4 | s:saw note:A#3 partials:[1 0 0 0 0 0 0 0 0] phases:[0.16019348427653313 0.47758268006145954 0.9749126061797142 0.8025561925023794 0.3600110989063978 0.324309878051281 0.5655391272157431 0.13364790193736553 0.3045873437076807 0.3814875278621912 0.14350778982043266 0.6017840709537268 0.11792952008545399 0.7185723781585693 0.6789924055337906 0.43416675738990307 0.9378792773932219 0.48162082210183144 0.37555896304547787 0.4686833508312702] ]", - "[ 11/4 → 23/8 | s:saw note:G#4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.6332327704876661 0.7342763151973486 0.16935866326093674 0.4754706546664238 0.528122790157795 0.21934260986745358 0.7476693484932184 0.2995396424084902 0.46688378043472767 0.9741295631974936 0.9878341723233461 0.9837898630648851 0.15651432052254677 0.2896903567016125 0.7395600061863661 0.3490046579390764 0.014511989429593086 0.6857758145779371 0.7405510656535625 0.4224672969430685] ]", - "[ 23/8 → 3/1 | s:saw note:G#3 partials:[1 0 0 0 0 0 0 0 0] phases:[0.01625417172908783 0.28409438766539097 0.3075305689126253 0.40343056432902813 0.5556836389005184 0.6926821582019329 0.5635769125074148 0.017873913049697876 0.5601800158619881 0.28681862354278564 0.8022358678281307 0.13467839546501637 0.02351163513958454 0.1987263821065426 0.4515750799328089 0.0009761657565832138 0.11555273085832596 0.25053937546908855 0.29571316950023174 0.15751986764371395] ]", - "[ 3/1 → 25/8 | s:saw note:B3 partials:[1 0 0 0 0 0 0 0 0] phases:[0.21728911064565182 0.7605195846408606 0.11240843310952187 0.4372697602957487 0.15630115941166878 0.1653979979455471 0.5303416550159454 0.07218753732740879 0.47459222190082073 0.04051801189780235 0.8742353077977896 0.9356274232268333 0.6662059463560581 0.4364917427301407 0.4163493011146784 0.9820694588124752 0.09098831936717033 0.41974459774792194 0.05833998881280422 0.2601191997528076] ]", - "[ 25/8 → 13/4 | s:saw note:D#4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.34324387833476067 0.14098095521330833 0.012934491038322449 0.827436288818717 0.5283997394144535 0.8942463714629412 0.4924008697271347 0.9298017006367445 0.18076439201831818 0.5243716649711132 0.015810951590538025 0.7476964127272367 0.6734520178288221 0.3267945274710655 0.9760967157781124 0.9397075213491917 0.7225867230445147 0.938586825504899 0.9692913070321083 0.5398030783981085] ]", - "[ 13/4 → 27/8 | s:saw note:D#5 partials:[1 0 0 0 0 0 0 0 0] phases:[0.9923650715500116 0.7797339502722025 0.1992435697466135 0.9005183521658182 0.718992218375206 0.23745290748775005 0.28872333094477654 0.35448253713548183 0.6209003105759621 0.3761858306825161 0.019171399995684624 0.7563913837075233 0.1559751983731985 0.4236980527639389 0.08094430714845657 0.4560011047869921 0.5958948992192745 0.37061405926942825 0.18633292242884636 0.346891064196825] ]", - "[ 27/8 → 7/2 | s:saw note:D#4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.40869180113077164 0.4018078800290823 0.34696186147630215 0.9572948440909386 0.400035472586751 0.3531211093068123 0.7240961641073227 0.8125612027943134 0.3587487991899252 0.1545814611017704 0.8934940584003925 0.9094721674919128 0.2336172368377447 0.17333386465907097 0.227950319647789 0.12384821102023125 0.5896956156939268 0.3293947223573923 0.619540523737669 0.8746719229966402] ]", - "[ 7/2 → 29/8 | s:saw note:D#4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.40994881466031075 0.6455810181796551 0.35704658553004265 0.2732649203389883 0.31587288342416286 0.23243548162281513 0.22569947130978107 0.17241661623120308 0.7624858524650335 0.02111036144196987 0.6966175157576799 0.32112877257168293 0.2512516509741545 0.08602019399404526 0.16260642930865288 0.2627844326198101 0.1954369619488716 0.16302869468927383 0.4046020060777664 0.0904023926705122] ]", - "[ 29/8 → 15/4 | s:saw note:D#5 partials:[1 0 0 0 0 0 0 0 0] phases:[0.9391485787928104 0.3380728308111429 0.7723016366362572 0.998674126341939 0.7193406894803047 0.6963680125772953 0.9260678570717573 0.7829763628542423 0.42278125509619713 0.913721015676856 0.38873230293393135 0.7281809840351343 0.952108234167099 0.649707704782486 0.9456792045384645 0.4331315904855728 0.63712502643466 0.9180345926433802 0.7379776351153851 0.7914005517959595] ]", - "[ 15/4 → 31/8 | s:saw note:B4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.8121673222631216 0.25548945367336273 0.5759696904569864 0.6668333616107702 0.9233786761760712 0.11143362522125244 0.9734930321574211 0.369325939565897 0.6248745918273926 0.719582824036479 0.24051696807146072 0.20336504466831684 0.6860735435038805 0.10649923048913479 0.8736641593277454 0.042930178344249725 0.09769343212246895 0.7966452036052942 0.5882443580776453 0.8942952174693346] ]", - "[ 31/8 → 4/1 | s:saw note:A#4 partials:[1 0 0 0 0 0 0 0 0] phases:[0.7361665386706591 0.7657648548483849 0.21474426984786987 0.8228576295077801 0.5647660344839096 0.08148551359772682 0.9714624118059874 0.13992334716022015 0.9609981551766396 0.6844500284641981 0.23610286228358746 0.5974335502833128 0.20678778178989887 0.5261937081813812 0.7417268306016922 0.9810918122529984 0.8138748407363892 0.9389897901564837 0.7420910261571407 0.48839940316975117] ]", + "[ 0/1 → 1/8 | s:saw note:G#1 partials:{partials:1} ]", + "[ 0/1 → 1/8 | s:saw note:G#1 partials:{partials:1} phases:[0.5 0.5 0.5] ]", + "[ 1/8 → 1/4 | s:saw note:A#2 partials:{partials:1} ]", + "[ 1/8 → 1/4 | s:saw note:A#2 partials:{partials:1} phases:[0.5 0.5 0.5] ]", + "[ 1/4 → 3/8 | s:saw note:D#2 partials:{partials:1} ]", + "[ 1/4 → 3/8 | s:saw note:D#2 partials:{partials:1} phases:[0.5 0.5 0.5] ]", + "[ 3/8 → 1/2 | s:saw note:D#2 partials:{partials:1} ]", + "[ 3/8 → 1/2 | s:saw note:D#2 partials:{partials:1} phases:[0.5 0.5 0.5] ]", + "[ 1/2 → 5/8 | s:saw note:C#2 partials:{partials:1} ]", + "[ 1/2 → 5/8 | s:saw note:C#2 partials:{partials:1} phases:[0.5 0.5 0.5] ]", + "[ 5/8 → 3/4 | s:saw note:A#1 partials:{partials:1} ]", + "[ 5/8 → 3/4 | s:saw note:A#1 partials:{partials:1} phases:[0.5 0.5 0.5] ]", + "[ 3/4 → 7/8 | s:saw note:B1 partials:{partials:1} ]", + "[ 3/4 → 7/8 | s:saw note:B1 partials:{partials:1} phases:[0.5 0.5 0.5] ]", + "[ 7/8 → 1/1 | s:saw note:D#2 partials:{partials:1} ]", + "[ 7/8 → 1/1 | s:saw note:D#2 partials:{partials:1} phases:[0.5 0.5 0.5] ]", + "[ 1/1 → 9/8 | s:saw note:F#2 partials:{partials:1} ]", + "[ 1/1 → 9/8 | s:saw note:F#2 partials:{partials:1} phases:[0.5 0.5 0.5] ]", + "[ 9/8 → 5/4 | s:saw note:A#2 partials:{partials:1} ]", + "[ 9/8 → 5/4 | s:saw note:A#2 partials:{partials:1} phases:[0.5 0.5 0.5] ]", + "[ 5/4 → 11/8 | s:saw note:A#2 partials:{partials:1} ]", + "[ 5/4 → 11/8 | s:saw note:A#2 partials:{partials:1} phases:[0.5 0.5 0.5] ]", + "[ 11/8 → 3/2 | s:saw note:B1 partials:{partials:1} ]", + "[ 11/8 → 3/2 | s:saw note:B1 partials:{partials:1} phases:[0.5 0.5 0.5] ]", + "[ 3/2 → 13/8 | s:saw note:G#2 partials:{partials:1} ]", + "[ 3/2 → 13/8 | s:saw note:G#2 partials:{partials:1} phases:[0.5 0.5 0.5] ]", + "[ 13/8 → 7/4 | s:saw note:E2 partials:{partials:1} ]", + "[ 13/8 → 7/4 | s:saw note:E2 partials:{partials:1} phases:[0.5 0.5 0.5] ]", + "[ 7/4 → 15/8 | s:saw note:B1 partials:{partials:1} ]", + "[ 7/4 → 15/8 | s:saw note:B1 partials:{partials:1} phases:[0.5 0.5 0.5] ]", + "[ 15/8 → 2/1 | s:saw note:G#2 partials:{partials:1} ]", + "[ 15/8 → 2/1 | s:saw note:G#2 partials:{partials:1} phases:[0.5 0.5 0.5] ]", + "[ 2/1 → 17/8 | s:saw note:D#3 partials:{partials:1} ]", + "[ 2/1 → 17/8 | s:saw note:D#3 partials:{partials:1} phases:[0.5 0.5 0.5] ]", + "[ 17/8 → 9/4 | s:saw note:C#3 partials:{partials:1} ]", + "[ 17/8 → 9/4 | s:saw note:C#3 partials:{partials:1} phases:[0.5 0.5 0.5] ]", + "[ 9/4 → 19/8 | s:saw note:D#2 partials:{partials:1} ]", + "[ 9/4 → 19/8 | s:saw note:D#2 partials:{partials:1} phases:[0.5 0.5 0.5] ]", + "[ 19/8 → 5/2 | s:saw note:C#3 partials:{partials:1} ]", + "[ 19/8 → 5/2 | s:saw note:C#3 partials:{partials:1} phases:[0.5 0.5 0.5] ]", + "[ 5/2 → 21/8 | s:saw note:E2 partials:{partials:1} ]", + "[ 5/2 → 21/8 | s:saw note:E2 partials:{partials:1} phases:[0.5 0.5 0.5] ]", + "[ 21/8 → 11/4 | s:saw note:A#1 partials:{partials:1} ]", + "[ 21/8 → 11/4 | s:saw note:A#1 partials:{partials:1} phases:[0.5 0.5 0.5] ]", + "[ 11/4 → 23/8 | s:saw note:G#2 partials:{partials:1} ]", + "[ 11/4 → 23/8 | s:saw note:G#2 partials:{partials:1} phases:[0.5 0.5 0.5] ]", + "[ 23/8 → 3/1 | s:saw note:G#1 partials:{partials:1} ]", + "[ 23/8 → 3/1 | s:saw note:G#1 partials:{partials:1} phases:[0.5 0.5 0.5] ]", + "[ 3/1 → 25/8 | s:saw note:B1 partials:{partials:1} ]", + "[ 3/1 → 25/8 | s:saw note:B1 partials:{partials:1} phases:[0.5 0.5 0.5] ]", + "[ 25/8 → 13/4 | s:saw note:D#2 partials:{partials:1} ]", + "[ 25/8 → 13/4 | s:saw note:D#2 partials:{partials:1} phases:[0.5 0.5 0.5] ]", + "[ 13/4 → 27/8 | s:saw note:D#3 partials:{partials:1} ]", + "[ 13/4 → 27/8 | s:saw note:D#3 partials:{partials:1} phases:[0.5 0.5 0.5] ]", + "[ 27/8 → 7/2 | s:saw note:D#2 partials:{partials:1} ]", + "[ 27/8 → 7/2 | s:saw note:D#2 partials:{partials:1} phases:[0.5 0.5 0.5] ]", + "[ 7/2 → 29/8 | s:saw note:D#2 partials:{partials:1} ]", + "[ 7/2 → 29/8 | s:saw note:D#2 partials:{partials:1} phases:[0.5 0.5 0.5] ]", + "[ 29/8 → 15/4 | s:saw note:D#3 partials:{partials:1} ]", + "[ 29/8 → 15/4 | s:saw note:D#3 partials:{partials:1} phases:[0.5 0.5 0.5] ]", + "[ 15/4 → 31/8 | s:saw note:B2 partials:{partials:1} ]", + "[ 15/4 → 31/8 | s:saw note:B2 partials:{partials:1} phases:[0.5 0.5 0.5] ]", + "[ 31/8 → 4/1 | s:saw note:A#2 partials:{partials:1} ]", + "[ 31/8 → 4/1 | s:saw note:A#2 partials:{partials:1} phases:[0.5 0.5 0.5] ]", ] `; diff --git a/website/src/pages/learn/synths.mdx b/website/src/pages/learn/synths.mdx index 6fc5b6925..56b28c0e4 100644 --- a/website/src/pages/learn/synths.mdx +++ b/website/src/pages/learn/synths.mdx @@ -85,7 +85,7 @@ note("c2 >".fast(2)) ._scope()`} /> -which acts as a spectral filter or +which acts as a spectral filter. Or: >".fast(2)) -.sound("saw") -.partials(randL(100)) -.phases(randL(100)) -._scope()`} + tune={`s("saw").seg(16).n(irand(12)).scale("F1:minor") + .penv(48).panchor(0).pdec(0.05) + .delay(0.25).room(0.25) + .compressor(-20).vib(0.3) + .partials(randL(200)) + .phases(randL(200))`} /> ## Vibrato From 30cc46ea66a4cd3d9b5b7dca3ab6446fc76d6845 Mon Sep 17 00:00:00 2001 From: scrappy_fiddler Date: Mon, 17 Nov 2025 20:04:40 +0100 Subject: [PATCH 135/312] wchooseCycles has now notes in an example --- packages/core/signal.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/signal.mjs b/packages/core/signal.mjs index 604d1c805..62fc26ad8 100644 --- a/packages/core/signal.mjs +++ b/packages/core/signal.mjs @@ -524,7 +524,7 @@ export const wchoose = (...pairs) => wchooseWith(rand, ...pairs); * @example * wchooseCycles(["bd",10], ["hh",1], ["sd",1]).s().fast(8) * @example - * wchooseCycles(["bd bd bd",5], ["hh hh hh",3], ["sd sd sd",1]).fast(4).s() + * wchooseCycles(["c c c",5], ["a a a",3], ["f f f",1]).fast(4).note() * @example * // The probability can itself be a pattern * wchooseCycles(["bd(3,8)","<5 0>"], ["hh hh hh",3]).fast(4).s() From 99beb4454deb9099a40f355ba4dc3898f341adbe Mon Sep 17 00:00:00 2001 From: scrappy_fiddler Date: Mon, 17 Nov 2025 20:49:26 +0100 Subject: [PATCH 136/312] update snapshot with note example --- test/__snapshots__/examples.test.mjs.snap | 96 +++++++++++------------ 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 32e61c31d..31e4bddd3 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -12484,54 +12484,54 @@ exports[`runs examples > example "wchooseCycles" example index 0 1`] = ` exports[`runs examples > example "wchooseCycles" example index 1 1`] = ` [ - "[ 0/1 → 1/12 | s:bd ]", - "[ 1/12 → 1/6 | s:bd ]", - "[ 1/6 → 1/4 | s:bd ]", - "[ 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 ]", - "[ 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: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: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 ]", + "[ 0/1 → 1/12 | note:c ]", + "[ 1/12 → 1/6 | note:c ]", + "[ 1/6 → 1/4 | note:c ]", + "[ 1/4 → 1/3 | note:c ]", + "[ 1/3 → 5/12 | note:c ]", + "[ 5/12 → 1/2 | note:c ]", + "[ 1/2 → 7/12 | note:f ]", + "[ 7/12 → 2/3 | note:f ]", + "[ 2/3 → 3/4 | note:f ]", + "[ 3/4 → 5/6 | note:c ]", + "[ 5/6 → 11/12 | note:c ]", + "[ 11/12 → 1/1 | note:c ]", + "[ 1/1 → 13/12 | note:c ]", + "[ 13/12 → 7/6 | note:c ]", + "[ 7/6 → 5/4 | note:c ]", + "[ 5/4 → 4/3 | note:c ]", + "[ 4/3 → 17/12 | note:c ]", + "[ 17/12 → 3/2 | note:c ]", + "[ 3/2 → 19/12 | note:a ]", + "[ 19/12 → 5/3 | note:a ]", + "[ 5/3 → 7/4 | note:a ]", + "[ 7/4 → 11/6 | note:c ]", + "[ 11/6 → 23/12 | note:c ]", + "[ 23/12 → 2/1 | note:c ]", + "[ 2/1 → 25/12 | note:a ]", + "[ 25/12 → 13/6 | note:a ]", + "[ 13/6 → 9/4 | note:a ]", + "[ 9/4 → 7/3 | note:a ]", + "[ 7/3 → 29/12 | note:a ]", + "[ 29/12 → 5/2 | note:a ]", + "[ 5/2 → 31/12 | note:c ]", + "[ 31/12 → 8/3 | note:c ]", + "[ 8/3 → 11/4 | note:c ]", + "[ 11/4 → 17/6 | note:c ]", + "[ 17/6 → 35/12 | note:c ]", + "[ 35/12 → 3/1 | note:c ]", + "[ 3/1 → 37/12 | note:c ]", + "[ 37/12 → 19/6 | note:c ]", + "[ 19/6 → 13/4 | note:c ]", + "[ 13/4 → 10/3 | note:f ]", + "[ 10/3 → 41/12 | note:f ]", + "[ 41/12 → 7/2 | note:f ]", + "[ 7/2 → 43/12 | note:a ]", + "[ 43/12 → 11/3 | note:a ]", + "[ 11/3 → 15/4 | note:a ]", + "[ 15/4 → 23/6 | note:c ]", + "[ 23/6 → 47/12 | note:c ]", + "[ 47/12 → 4/1 | note:c ]", ] `; From 48407c309cca95b87d541e3a420659ff2f04abdd Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Mon, 17 Nov 2025 23:10:10 +0100 Subject: [PATCH 137/312] add basic dough repl --- packages/codemirror/codemirror.mjs | 6 +- website/src/components/Dough/Dough.astro | 17 +++ website/src/components/Dough/dough-mirror.mjs | 139 ++++++++++++++++++ website/src/components/Dough/dough-repl.mjs | 105 +++++++++++++ website/src/pages/dough/index.astro | 15 ++ 5 files changed, 279 insertions(+), 3 deletions(-) create mode 100644 website/src/components/Dough/Dough.astro create mode 100644 website/src/components/Dough/dough-mirror.mjs create mode 100644 website/src/components/Dough/dough-repl.mjs create mode 100644 website/src/pages/dough/index.astro diff --git a/packages/codemirror/codemirror.mjs b/packages/codemirror/codemirror.mjs index 69fce4b50..ad27fd30f 100644 --- a/packages/codemirror/codemirror.mjs +++ b/packages/codemirror/codemirror.mjs @@ -27,7 +27,7 @@ import { updateWidgets, widgetPlugin } from './widget.mjs'; export { toggleBlockComment, toggleBlockCommentByLine, toggleComment, toggleLineComment } from '@codemirror/commands'; -const extensions = { +export const extensions = { isLineWrappingEnabled: (on) => (on ? EditorView.lineWrapping : []), isBracketMatchingEnabled: (on) => (on ? bracketMatching({ brackets: '()[]{}<>' }) : []), isBracketClosingEnabled: (on) => (on ? closeBrackets() : []), @@ -48,7 +48,7 @@ const extensions = { ] : [], }; -const compartments = Object.fromEntries(Object.keys(extensions).map((key) => [key, new Compartment()])); +export const compartments = Object.fromEntries(Object.keys(extensions).map((key) => [key, new Compartment()])); export const defaultSettings = { keybindings: 'codemirror', @@ -411,7 +411,7 @@ export class StrudelMirror { } } -function parseBooleans(value) { +export function parseBooleans(value) { return { true: true, false: false }[value] ?? value; } diff --git a/website/src/components/Dough/Dough.astro b/website/src/components/Dough/Dough.astro new file mode 100644 index 000000000..91b50e07b --- /dev/null +++ b/website/src/components/Dough/Dough.astro @@ -0,0 +1,17 @@ +--- +import '../../repl/Repl.css'; +--- + +
+ + + diff --git a/website/src/components/Dough/dough-mirror.mjs b/website/src/components/Dough/dough-mirror.mjs new file mode 100644 index 000000000..f20fd2b4c --- /dev/null +++ b/website/src/components/Dough/dough-mirror.mjs @@ -0,0 +1,139 @@ +import { + initEditor, + codemirrorSettings, + flash, + compartments, + extensions, + parseBooleans, + activateTheme, + updateMiniLocations, + highlightMiniLocations, +} from '@strudel/codemirror'; +import { evalScope } from '@strudel/core'; +import { Framer } from '@strudel/draw'; +import { persistentAtom } from '@nanostores/persistent'; +import { DoughRepl } from './dough-repl.mjs'; + +const initialCode = '$: note("c a f e")'; +export const code = persistentAtom('vanilla-repl-code', initialCode, { + encode: JSON.stringify, + decode: JSON.parse, +}); + +export class DoughMirror { + constructor(options) { + const { root, initialCode = code.get(), bgFill = true } = options; + this.root = root; + this.code = initialCode; + this.repl = new DoughRepl(); + this.prebaked = this.prebake(); + + // init codemirror + this.editor = initEditor({ + root, + initialCode: this.code, + onChange: (v) => { + if (v.docChanged) { + this.code = v.state.doc.toString(); + code.set(this.code); + } + }, + onEvaluate: this.evaluate.bind(this), + onStop: () => this.stop(), + mondo: false, + }); + const settings = codemirrorSettings.get(); + this.setFontSize(settings.fontSize); + this.setFontFamily(settings.fontFamily); + + // init event highlighting + this.framer = new Framer( + () => { + const frameHaps = this.repl.processHaps(); + highlightMiniLocations(this.editor, time, frameHaps); + }, + (err) => console.log('Framer error', err), + ); + } + prebake() { + const modulesLoading = evalScope(import('@strudel/core'), import('@strudel/tonal'), import('@strudel/mini')); + return Promise.all([modulesLoading, this.repl.prebake()]); + } + async evaluate() { + this.framer.start(); + this.flash(); + await this.prebaked; + const { miniLocations } = await this.repl.evaluate(this.code); + updateMiniLocations(this.editor, miniLocations); + } + stop() { + this.repl.stop(); + this.framer.stop(); + highlightMiniLocations(this.editor, 0, []); + } + // added synonym (compared to StrudelMirror) + settings(settings = {}) { + this.updateSettings(settings); + } + + // the rest is copy pasted from StrudelMirror: + + updateSettings(settings = {}) { + settings.fontSize && this.setFontSize(settings.fontSize); + settings.fontFamily && this.setFontFamily(settings.fontFamily); + for (let key in extensions) { + if (key in settings) { + this.reconfigureExtension(key, settings[key]); + } + } + const updated = { ...codemirrorSettings.get(), ...settings }; + // console.log(updated); + codemirrorSettings.set(updated); + } + reconfigureExtension(key, value) { + if (!extensions[key]) { + console.warn(`extension ${key} is not known`); + return; + } + value = parseBooleans(value); + const newValue = extensions[key](value, this); + this.editor.dispatch({ + effects: compartments[key].reconfigure(newValue), + }); + if (key === 'theme') { + activateTheme(value); + } + } + flash(ms) { + flash(this.editor, ms); + } + setFontSize(size) { + this.root.style.fontSize = size + 'px'; + } + setFontFamily(family) { + this.root.style.fontFamily = family; + const scroller = this.root.querySelector('.cm-scroller'); + if (scroller) { + scroller.style.fontFamily = family; + } + } + setCode(code, offset = 0) { + const changes = { + from: 0, + to: this.editor.state.doc.length + offset, + insert: code, + }; + this.editor.dispatch({ changes }); + } + getCursorLocation() { + return this.editor.state.selection.main.head; + } + setCursorLocation(col) { + return this.editor.dispatch({ selection: { anchor: col } }); + } + appendCode(code) { + const cursor = this.getCursorLocation(); + this.setCode(this.code + code); + this.setCursorLocation(cursor); + } +} diff --git a/website/src/components/Dough/dough-repl.mjs b/website/src/components/Dough/dough-repl.mjs new file mode 100644 index 000000000..643647085 --- /dev/null +++ b/website/src/components/Dough/dough-repl.mjs @@ -0,0 +1,105 @@ +// import { Dough, doughsamples } from 'dough-synth'; +import { Dough, doughsamples } from 'https://unpkg.com/dough-synth@0.1.9/dough.js'; +import { Pattern, noteToMidi, evaluate } from '@strudel/core'; +// import doughUrl from 'dough-synth?url'; +import { transpiler } from '@strudel/transpiler'; +//const doughBaseUrl = doughUrl.split('/').slice(0, -1).join('/') + '/'; +const doughBaseUrl = 'https://unpkg.com/dough-synth@0.1.9/'; + +export class DoughRepl { + pattern; + latency = 0.1; + cps = 0.5; + origin; + t0; + lasttime; + strudel; + q = []; + constructor() { + this.ready = this.init(); + } + async init() { + // init dough immediately, so that it can attach the document click event to initAudio immediately + this.dough = new Dough({ + base: doughBaseUrl, + //base: "../", // local dev + onTick: ({ t0, t1 }) => { + if (!this.pattern) { + return; + } + this.origin ??= t0; + this.t0 = t0; + this.lasttime = performance.now(); + const a = (t0 - this.origin) * this.cps; + const b = (t1 - this.origin) * this.cps; + + const haps = this.pattern.queryArc(a, b).filter((hap) => hap.hasOnset()); + if (!haps.length) { + return; + } + haps.forEach((hap) => { + const time = hap.whole.begin.valueOf() / this.cps + this.origin + this.latency; + const duration = hap.duration.valueOf() / this.cps; + const event = { + dough: 'play', + ...hap.value, + time, + duration, + }; + if (event.note && typeof event.note === 'string') { + event.note = noteToMidi(event.note); + } + //console.log("event", JSON.stringify(Object.entries(event))); + this.dough.evaluate(event); + this.q.push({ event, hap }); + }); + }, + }); + // miniAllStrings(); + const setcps = (cps) => (this.cps = cps); + const setcpm = (cpm) => setcps(cpm / 60); + const replScope = { setcps, setcpm }; + Object.assign(globalThis, replScope); + } + async evaluate(code) { + await this.ready; + let patterns = []; + Pattern.prototype.p = function (id) { + if (!id.startsWith('_')) { + patterns.push(this); + } + }; + + let { meta } = await evaluate(code, transpiler, { addReturn: false, wrapAsync: true, emitWidgets: false }); + const { miniLocations } = meta; + + this.pattern = stack(...patterns); + return { miniLocations, pattern: this.pattern }; + } + stop() { + this.pattern = undefined; + this.origin = undefined; + } + prebake() { + return Promise.all([doughsamples('github:eddyflux/crate')]); + } + // tbd: move this to dough-synth + get time() { + return this.t0 + (performance.now() - this.lasttime) / 1000 + this.latency; + } + processHaps() { + const currentHaps = []; + const time = this.time; + this.q = this.q.filter(({ event, hap }) => { + const end = event.time + event.duration; + const isActive = time >= event.time && time <= end; + if (isActive) { + currentHaps.push(hap); + } + return end > time; // delete old events + // we do NOT return !isActive, because a frame might miss an event, which would cause a leak + }); + // console.log(this.q.length); // to check for leaks + return currentHaps; + } +} diff --git a/website/src/pages/dough/index.astro b/website/src/pages/dough/index.astro new file mode 100644 index 000000000..9909fc6da --- /dev/null +++ b/website/src/pages/dough/index.astro @@ -0,0 +1,15 @@ +--- +import HeadCommon from '../../components/HeadCommon.astro'; +import Dough from '../../components/Dough/Dough.astro'; +--- + + + + + Strudel Dough REPL + + + + + + From 3b1c75d3de236d942f0191d54c237c9ed950547e Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Mon, 17 Nov 2025 23:18:31 +0100 Subject: [PATCH 138/312] fix: linting errors --- website/src/components/Dough/dough-mirror.mjs | 2 +- website/src/components/Dough/dough-repl.mjs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/website/src/components/Dough/dough-mirror.mjs b/website/src/components/Dough/dough-mirror.mjs index f20fd2b4c..5cdfeb3f6 100644 --- a/website/src/components/Dough/dough-mirror.mjs +++ b/website/src/components/Dough/dough-mirror.mjs @@ -48,7 +48,7 @@ export class DoughMirror { // init event highlighting this.framer = new Framer( - () => { + (time) => { const frameHaps = this.repl.processHaps(); highlightMiniLocations(this.editor, time, frameHaps); }, diff --git a/website/src/components/Dough/dough-repl.mjs b/website/src/components/Dough/dough-repl.mjs index 643647085..ef28617e8 100644 --- a/website/src/components/Dough/dough-repl.mjs +++ b/website/src/components/Dough/dough-repl.mjs @@ -1,6 +1,6 @@ // import { Dough, doughsamples } from 'dough-synth'; import { Dough, doughsamples } from 'https://unpkg.com/dough-synth@0.1.9/dough.js'; -import { Pattern, noteToMidi, evaluate } from '@strudel/core'; +import { Pattern, noteToMidi, evaluate, stack } from '@strudel/core'; // import doughUrl from 'dough-synth?url'; import { transpiler } from '@strudel/transpiler'; //const doughBaseUrl = doughUrl.split('/').slice(0, -1).join('/') + '/'; From 654c1a86f08550586049fcef4a6b4c9ac5007755 Mon Sep 17 00:00:00 2001 From: Aria Date: Tue, 18 Nov 2025 16:02:33 -0600 Subject: [PATCH 139/312] Simplify declarations via globalThis; fix cleanup/stop --- packages/core/controls.mjs | 106 +++++--------------------------- packages/superdough/helpers.mjs | 46 +++++++++----- 2 files changed, 44 insertions(+), 108 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 02178de97..854f48ffb 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -468,7 +468,8 @@ export const { attack, att } = registerControl('attack', 'att'); * ._scope() * */ -export const { fmh, fmh1, fmh2, fmh3, fmh4, fmh5, fmh6, fmh7, fmh8 } = registerMultiControl(['fmh', 'fmi'], 8, 'fmh'); +Object.assign(globalThis, registerMultiControl(['fmh', 'fmi'], 8, 'fmh')); + /** * Sets the Frequency Modulation of the synth. * Controls the modulation index, which defines the brightness of the sound. @@ -491,8 +492,8 @@ export const { fmh, fmh1, fmh2, fmh3, fmh4, fmh5, fmh6, fmh7, fmh8 } = registerM * .fmh(1.06).fmh2(10).fmh3(0.1) * */ -export const { fmi, fmi1, fmi2, fmi3, fmi4, fmi5, fmi6, fmi7, fmi8, fm, fm1, fm2, fm3, fm4, fm5, fm6, fm7, fm8 } = - registerMultiControl(['fmi', 'fmh'], 8, 'fm'); +Object.assign(globalThis, registerMultiControl(['fmi', 'fmh'], 8, 'fm')); + // fm envelope /** * Ramp type of fm envelope. Exp might be a bit broken.. @@ -511,10 +512,8 @@ export const { fmi, fmi1, fmi2, fmi3, fmi4, fmi5, fmi6, fmi7, fmi8, fm, fm1, fm2 * ._scope() * */ -export const { fmenv, fmenv1, fmenv2, fmenv3, fmenv4, fmenv5, fmenv6, fmenv7, fmenv8 } = registerMultiControl( - 'fmenv', - 8, -); +Object.assign(globalThis, registerMultiControl('fmenv', 8)); + /** * Attack time for the FM envelope: time it takes to reach maximum modulation * @@ -531,26 +530,7 @@ export const { fmenv, fmenv1, fmenv2, fmenv3, fmenv4, fmenv5, fmenv6, fmenv7, fm * ._scope() * */ -export const { - fmattack, - fmattack1, - fmattack2, - fmattack3, - fmattack4, - fmattack5, - fmattack6, - fmattack7, - fmattack8, - fmatt, - fmatt1, - fmatt2, - fmatt3, - fmatt4, - fmatt5, - fmatt6, - fmatt7, - fmatt8, -} = registerMultiControl('fmattack', 8, 'fmatt'); +Object.assign(globalThis, registerMultiControl('fmattack', 8, 'fmatt')); /** * Waveform of the fm modulator @@ -566,10 +546,7 @@ export const { * n("0 1 2 3".fast(4)).chord("").voicing().s("sawtooth").fmwave("brown").fm(.6) * */ -export const { fmwave, fmwave1, fmwave2, fmwave3, fmwave4, fmwave5, fmwave6, fmwave7, fmwave8 } = registerMultiControl( - 'fmwave', - 8, -); +Object.assign(globalThis, registerMultiControl('fmwave', 8)); /** * Decay time for the FM envelope: seconds until the sustain level is reached after the attack phase. @@ -588,26 +565,8 @@ export const { fmwave, fmwave1, fmwave2, fmwave3, fmwave4, fmwave5, fmwave6, fmw * ._scope() * */ -export const { - fmdecay, - fmdecay1, - fmdecay2, - fmdecay3, - fmdecay4, - fmdecay5, - fmdecay6, - fmdecay7, - fmdecay8, - fmdec, - fmdec1, - fmdec2, - fmdec3, - fmdec4, - fmdec5, - fmdec6, - fmdec7, - fmdec8, -} = registerMultiControl('fmdecay', 8, 'fmdec'); +Object.assign(globalThis, registerMultiControl('fmdecay', 8, 'fmdec')); + /** * Sustain level for the FM envelope: how much modulation is applied after the decay phase * @@ -625,26 +584,8 @@ export const { * ._scope() * */ -export const { - fmsustain, - fmsustain1, - fmsustain2, - fmsustain3, - fmsustain4, - fmsustain5, - fmsustain6, - fmsustain7, - fmsustain8, - fmsus, - fmsus1, - fmsus2, - fmsus3, - fmsus4, - fmsus5, - fmsus6, - fmsus7, - fmsus8, -} = registerMultiControl('fmsustain', 8, 'fmsus'); +Object.assign(globalThis, registerMultiControl('fmsustain', 8, 'fmsus')); + /** * Release time for the FM envelope: how much modulation is applied after the note is released * @@ -656,31 +597,12 @@ export const { * @param {number | Pattern} time release time * */ -export const { - fmrelease, - fmrelease1, - fmrelease2, - fmrelease3, - fmrelease4, - fmrelease5, - fmrelease6, - fmrelease7, - fmrelease8, - fmrel, - fmrel1, - fmrel2, - fmrel3, - fmrel4, - fmrel5, - fmrel6, - fmrel7, - fmrel8, -} = registerMultiControl('fmrelease', 8, 'fmrel'); +Object.assign(globalThis, registerMultiControl('fmrelease', 8, 'fmrel')); // FM Matrix for (let i = 0; i <= 8; i++) { for (let j = 0; j <= 8; j++) { - registerControl(`fmi${i}${j}`, `fm${i}${j}`); + Object.assign(globalThis, registerControl(`fmi${i}${j}`, `fm${i}${j}`)); } } diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index b856a0d88..0ab43791d 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -336,6 +336,7 @@ export function webAudioTimeout(audioContext, onComplete, startTime, stopTime) { constantNode.stop(stopTime); return constantNode; } + const mod = (freq, type = 'sine') => { const ctx = getAudioContext(); let osc; @@ -349,10 +350,10 @@ const mod = (freq, type = 'sine') => { osc.frequency.value = freq; } osc.start(); - return { osc, stop: (t) => osc.stop(t), freq }; + return { osc, freq }; }; -const fm = (frequencyparam, harmonicityRatio, modulationIndex, wave = 'sine') => { +const fm = (frequencyparam, harmonicityRatio, wave = 'sine') => { const carrfreq = frequencyparam.value; const modfreq = carrfreq * harmonicityRatio; return mod(modfreq, wave); @@ -360,7 +361,7 @@ const fm = (frequencyparam, harmonicityRatio, modulationIndex, wave = 'sine') => export function applyFM(param, value, begin) { const ac = getAudioContext(); - let stop = (t) => {}; + const toStop = []; // fm oscillators we will expose `stop` for const fms = {}; // Matrix for (let i = 1; i <= 8; i++) { @@ -377,8 +378,8 @@ export function applyFM(param, value, begin) { if (!amt) continue; let io = []; for (let [isMod, idx] of [ - [true, i], - [false, j], + [true, i], // source + [false, j], // target ]) { if (idx === 0) { io.push(param); @@ -387,15 +388,11 @@ export function applyFM(param, value, begin) { if (!fms[idx]) { const idxS = idx === 1 ? '' : idx; const { osc, freq } = fm(param, value[`fmh${idxS}`] ?? 1, value[`fmwave${idxS}`] ?? 'sine'); - const currStop = stop; - stop = (t) => { - currStop(t); - osc.stop(t); - }; + toStop.push(osc); + const toCleanup = [osc]; // nodes we want to cleanup after oscillator `stop` const adsr = ['attack', 'decay', 'sustain', 'release'].map((s) => value[`fm${s}${idxS}`]); - if (!adsr.some((v) => v !== undefined)) { - fms[idx] = { input: osc.frequency, output: osc, freq }; - } else { + let output = osc; + if (adsr.some((v) => v !== undefined)) { const envGain = ac.createGain(); const [attack, decay, sustain, release] = getADSRValues(adsr); const holdEnd = begin + value.duration; @@ -412,12 +409,16 @@ export function applyFM(param, value, begin) { holdEnd, fmEnvelopeType === 'exp' ? 'exponential' : 'linear', ); - fms[idx] = { input: osc.frequency, output: osc.connect(envGain), freq }; + toCleanup.push(envGain); + output = osc.connect(envGain); } + fms[idx] = { input: osc.frequency, output, freq, toCleanup }; + osc.onended = () => cleanupNodes(fms[idx].toCleanup); } - const { input, output, freq } = fms[idx]; + const { input, output, freq, toCleanup } = fms[idx]; const g = gainNode(amt * freq); io.push(isMod ? output.connect(g) : input); + toCleanup.push(g); } if (!io[1]) { logger( @@ -429,7 +430,9 @@ export function applyFM(param, value, begin) { io[0].connect(io[1]); } } - return { stop }; + return { + stop: (t) => toStop.forEach((m) => m?.stop(t)), + }; } // Saturation curves @@ -549,3 +552,14 @@ export const destroyAudioWorkletNode = (node) => { node.disconnect(); node.parameters.get('end')?.setValueAtTime(0, 0); }; + +export const cleanupNode = (node, time) => { + if (node == null) return; + node.disconnect?.(); + node.parameters?.get('end')?.setValueAtTime(0, 0); + node.stop?.(time); +}; + +export const cleanupNodes = (nodes, time) => { + nodes.forEach((n) => cleanupNode(n, time)); +}; From dd2c808cd71a7f5892f7e57c0f0a6fe7540d332c Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Wed, 19 Nov 2025 21:55:35 +0100 Subject: [PATCH 140/312] hotfix: reduce sounds-tab click to play latency --- website/src/repl/components/panel/SoundsTab.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/src/repl/components/panel/SoundsTab.jsx b/website/src/repl/components/panel/SoundsTab.jsx index a9f10bf12..3d363f8a1 100644 --- a/website/src/repl/components/panel/SoundsTab.jsx +++ b/website/src/repl/components/panel/SoundsTab.jsx @@ -126,7 +126,7 @@ export function SoundsTab() { try { // Pre-load the sample by calling onTrigger with a future time // This triggers the loading but schedules playback for later - const time = ctx.currentTime + 0.5; // Give 500ms for loading + const time = ctx.currentTime + 0.05; const ref = await onTrigger(time, params, onended); trigRef.current = ref; if (ref?.node) { From 29b6729246fa45eab19e8ee0964cb4a50f002eae Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 19 Nov 2025 15:03:11 -0600 Subject: [PATCH 141/312] First pass at improving controls --- packages/core/controls.mjs | 108 +++++++++++++++++++------------------ packages/core/pattern.mjs | 61 +++++++++++++++++++++ 2 files changed, 116 insertions(+), 53 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 0555bd107..307c15f48 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -1740,29 +1740,6 @@ export const { panorient } = registerControl('panorient'); // ['pitch2'], // ['pitch3'], // ['portamento'], -/** - * Selects which LFO number to use for modulation. Multiple LFOs - * can be applied using the ':' mininotation. There are an arbitrary number - * of LFOs available -- the number is only used to share LFOs across targets - * if desired (and to conserve processing power) - * - * @name lfoNum - * @param {number | Pattern} lfoNum Index of the LFO. - * setup: note("F2").sound("supersaw") - * .lpf(100) - * .lfoDepth(1000) - * .lfoRate(0.25) - * .lfoSynced(1) - * .lfoTarget("lpf") - * .lfoParam("frequency") - * .lfoNum(2) - * - * reuse: note("F3").sound("square").lpf(50) - * .lfoTarget("lpf") - * .lfoParam("frequency") - * .lfoNum(2) // uses the same LFO - */ -export const { lfoNum } = registerControl('lfoNum'); /** * Sets the target destination for the LFO modulation. Names are typically related @@ -1770,7 +1747,8 @@ export const { lfoNum } = registerControl('lfoNum'); * and if it fails, the console will print the available options. * * @name lfoTarget - * @param {string | Pattern} lfoTarget Target identifier for modulation. + * @synonyms lfot, lfotarget + * @param {string | Pattern} target Target identifier for modulation. * note("F2").sound("supersaw") * .lpf(100) * .lfoDepth(3000) @@ -1779,7 +1757,7 @@ export const { lfoNum } = registerControl('lfoNum'); * .lfoTarget("lpf") * .lfoParam("frequency") */ -export const { lfoTarget } = registerControl('lfoTarget'); +export const { lfoTarget, lfot, lfotarget } = registerControl('lfoTarget', 'lfot', 'lfotarget'); /** * Chooses which parameter the LFO will modulate on the target. Parameter values @@ -1787,7 +1765,8 @@ export const { lfoTarget } = registerControl('lfoTarget'); * and if it fails, the console will print the available options. * * @name lfoParam - * @param {string | Pattern} lfoParam Parameter name + * @synonyms lfop, lfoparam + * @param {string | Pattern} param Parameter name * note("F2").sound("supersaw") * .lpf(100) * .lfoDepth(3000) @@ -1796,13 +1775,14 @@ export const { lfoTarget } = registerControl('lfoTarget'); * .lfoTarget("lpf") * .lfoParam("frequency") */ -export const { lfoParam } = registerControl('lfoParam'); +export const { lfoParam, lfop, lfoparam } = registerControl('lfoParam', 'lfop', 'lfoparam'); /** * Controls the speed of the LFO. * * @name lfoRate - * @param {number | Pattern} lfoRate Frequency or tempo-relative value. + * @synonyms lfor, lforate + * @param {number | Pattern} rate Frequency or tempo-relative value. * note("F2").sound("supersaw") * .lpf(100) * .lfoTarget("lpf") @@ -1810,13 +1790,14 @@ export const { lfoParam } = registerControl('lfoParam'); * .lfoDepth(3000) * .lfoRate(0.25) */ -export const { lfoRate } = registerControl('lfoRate'); +export const { lfoRate, lfor, lforate } = registerControl('lfoRate', 'lfor', 'lforate'); /** * Sets the modulation depth of the LFO. * * @name lfoDepth - * @param {number | Pattern} lfoDepth Modulation depth amount. + * @synonyms lfod, lfodepth + * @param {number | Pattern} depth Modulation depth amount. * note("F2").sound("supersaw") * .lpf(100) * .lfoTarget("lpf") @@ -1824,7 +1805,7 @@ export const { lfoRate } = registerControl('lfoRate'); * .lfoSynced(1) * .lfoDepth(5000) */ -export const { lfoDepth } = registerControl('lfoDepth'); +export const { lfoDepth, lfod, lfodepth } = registerControl('lfoDepth', 'lfod', 'lfodepth'); /** * Applies a DC offset to the LFO signal. Normally the LFO varies from @@ -1832,7 +1813,8 @@ export const { lfoDepth } = registerControl('lfoDepth'); * a bipolar LFO. * * @name lfoDCOffset - * @param {number | Pattern} lfoDCOffset Offset amount. + * @synonyms lfodc, lfodcoffset + * @param {number | Pattern} offset Offset amount. * note("F2").sound("supersaw") * .lpf(2000) * .lfoTarget("lpf") @@ -1842,7 +1824,7 @@ export const { lfoDepth } = registerControl('lfoDepth'); * .lfoSynced(1) * .lfoDCOffset(-0.5) */ -export const { lfoDCOffset } = registerControl('lfoDCOffset'); +export const { lfoDCOffset, lfodc, lfodcoffset } = registerControl('lfoDCOffset', 'lfodc', 'lfodcoffset'); /** * Selects the waveform shape of the LFO. Current options are @@ -1850,7 +1832,8 @@ export const { lfoDCOffset } = registerControl('lfoDCOffset'); * respectively). * * @name lfoShape - * @param {number | Pattern} lfoShape Waveform type identifier. + * @synonyms lfosh, lfoshape + * @param {number | Pattern} shape Waveform type identifier. * note("F2").sound("supersaw") * .lpf(100) * .lfoTarget("lpf") @@ -1860,13 +1843,14 @@ export const { lfoDCOffset } = registerControl('lfoDCOffset'); * .lfoSynced(1) * .lfoShape(3) */ -export const { lfoShape } = registerControl('lfoShape'); +export const { lfoShape, lfosh, lfoshape } = registerControl('lfoShape', 'lfosh', 'lfoshape'); /** * Skews the LFO waveform. * * @name lfoSkew - * @param {number | Pattern} lfoSkew Skew amount (between 0 and 1). + * @synonyms lfosk, lfoskew + * @param {number | Pattern} skew Skew amount (between 0 and 1). * note("F2").sound("supersaw") * .lpf(100) * .lfoTarget("lpf") @@ -1876,13 +1860,14 @@ export const { lfoShape } = registerControl('lfoShape'); * .lfoSynced(1) * .lfoSkew(0.75) */ -export const { lfoSkew } = registerControl('lfoSkew'); +export const { lfoSkew, lfosk, lfoskew } = registerControl('lfoSkew', 'lfosk', 'lfoskew'); /** * Adjusts the (exponential) curvature of the LFO waveform. * * @name lfoCurve - * @param {number | Pattern} lfoCurve Curve shaping amount. + * @synonyms lfoc, lfocurve + * @param {number | Pattern} curve Curve shaping amount. * note("F2").sound("supersaw") * .lpf(100) * .lfoTarget("lpf") @@ -1892,22 +1877,22 @@ export const { lfoSkew } = registerControl('lfoSkew'); * .lfoSynced(1) * .lfoCurve(0.95) */ -export const { lfoCurve } = registerControl('lfoCurve'); +export const { lfoCurve, lfoc, lfocurve } = registerControl('lfoCurve', 'lfoc', 'lfocurve'); /** - * Determines whether the LFO is tempo-synced. + * Sets the tempo-synced rate of the LFO * - * @name lfoSynced - * @param {number | Pattern} lfoSynced Boolean flag (0 or 1). + * @name lfoSync + * @synonyms lfos, lfosync + * @param {number | Pattern} rate Rate to be multiplied by cycles per second * note("F2").sound("supersaw") * .lpf(100) * .lfoTarget("lpf") * .lfoParam("frequency") * .lfoDepth(1000) - * .lfoShape(3).lfoRate(2) - * .lfoSynced(1) + * .lfoShape(3).lfoSync(2) */ -export const { lfoSynced } = registerControl('lfoSynced'); +export const { lfoSync, lfos, lfosync } = registerControl('lfoSync', 'lfos', 'lfosync'); /** * Sets the target destination for the envelope modulation. Names are typically related @@ -1915,6 +1900,7 @@ export const { lfoSynced } = registerControl('lfoSynced'); * and if it fails, the console will print the available options. * * @name envTarget + * @synonyms envt, envtarget * @param {number | Pattern} envTarget Target identifier for modulation. * n(irand(12).seg(8)).scale("F#3:minor").room(1) * .lpf(100) @@ -1922,7 +1908,7 @@ export const { lfoSynced } = registerControl('lfoSynced'); * .envTarget("source:lpf") * .envParam("detune:frequency") */ -export const { envTarget } = registerControl('envTarget'); +export const { envTarget, envt, envtarget } = registerControl('envTarget', 'envt', 'envtarget'); /** * Chooses which parameter the LFO will modulate on the target. Parameter values @@ -1930,6 +1916,7 @@ export const { envTarget } = registerControl('envTarget'); * and if it fails, the console will print the available options. * * @name envParam + * @synonyms envp, envparam * @param {number | Pattern} envParam Parameter index or identifier. * n(irand(12).seg(8)).scale("F#3:minor").room(1) * .lpf(100) @@ -1937,12 +1924,13 @@ export const { envTarget } = registerControl('envTarget'); * .envTarget("source:lpf") * .envParam("detune:frequency") */ -export const { envParam } = registerControl('envParam'); +export const { envParam, envp, envparam } = registerControl('envParam', 'envp', 'envparam'); /** * Controls the attack time of the envelope. * * @name envAttack + * @synonyms envatt, envattack * @param {number | Pattern} envAttack Duration of attack phase. * n(irand(12).seg(8)).scale("F#3:minor").room(1) * .lpf(500) @@ -1951,12 +1939,13 @@ export const { envParam } = registerControl('envParam'); * .envParam("detune:frequency") * .envAttack(0.5) */ -export const { envAttack } = registerControl('envAttack'); +export const { envAttack, envatt, envattack } = registerControl('envAttack', 'envatt', 'envattack'); /** * Controls the decay time of the envelope. * * @name envDecay + * @synonyms envdec, envdecay * @param {number | Pattern} envDecay Duration of decay phase. * n(irand(12).seg(8)).scale("F#3:minor").room(1) * .lpf(100) @@ -1965,12 +1954,13 @@ export const { envAttack } = registerControl('envAttack'); * .envParam("detune:frequency") * .envDecay("0.03:0.15").envCurve("exp:exp") */ -export const { envDecay } = registerControl('envDecay'); +export const { envDecay, envdec, envdecay } = registerControl('envDecay', 'envdec', 'envdecay'); /** * Sets the sustain level of the envelope. * * @name envSustain + * @synonyms envs, envsustain * @param {number | Pattern} envSustain Sustain amplitude level. * n(irand(12).seg(8)).scale("F#3:minor").room(1) * .lpf(100) @@ -1980,12 +1970,13 @@ export const { envDecay } = registerControl('envDecay'); * .envDecay("0.03:0.15").envCurve("exp:exp") * .envSustain(0.2) */ -export const { envSustain } = registerControl('envSustain'); +export const { envSustain, envs, envsustain } = registerControl('envSustain', 'envs', 'envsustain'); /** * Controls the release time of the envelope. * * @name envRelease + * @synonyms envr, envrelease * @param {number | Pattern} envRelease Duration of release phase. * @example * n(irand(12).seg(8)).scale("F#3:minor").room(1) @@ -1997,12 +1988,13 @@ export const { envSustain } = registerControl('envSustain'); * .envSustain(0.5) * .envRelease(3) */ -export const { envRelease } = registerControl('envRelease'); +export const { envRelease, envr, envrelease } = registerControl('envRelease', 'envr', 'envrelease'); /** * Selects the style of envelope: `exp` or `lin` (exponential or linear). * * @name envCurve + * @synonyms envc, envcurve * @param {string | Pattern} envCurve Envelope curve style. * @example * n(irand(12).seg(8)).scale("F#3:minor").room(1) @@ -2013,12 +2005,13 @@ export const { envRelease } = registerControl('envRelease'); * .envDecay("0.3:0.15") * .envCurve("lin:exp") */ -export const { envCurve } = registerControl('envCurve'); +export const { envCurve, envc, envcurve } = registerControl('envCurve', 'envc', 'envcurve'); /** * Sets the modulation depth of the envelope. * * @name envDepth + * @synonyms envd, envdepth * @param {number | Pattern} envDepth Modulation depth amount. * @example * n(irand(12).seg(8)).scale("F#3:minor").room(1) @@ -2027,7 +2020,7 @@ export const { envCurve } = registerControl('envCurve'); * .envParam("detune:frequency") * .envDepth("4800:400") */ -export const { envDepth } = registerControl('envDepth'); +export const { envDepth, envd, envdepth } = registerControl('envDepth', 'envd', 'envdepth'); // TODO: slide param for certain synths export const { slide } = registerControl('slide'); @@ -2400,6 +2393,15 @@ export const { clip, legato } = registerControl('clip', 'legato'); */ export const { duration, dur } = registerControl('duration', 'dur'); +/** + * Sets the ID of the pattern for later reference + * + * @name id + * @param {number | Pattern} id ID of the pattern + * + */ +export const { id } = registerControl('id'); + // ZZFX export const { zrand } = registerControl('zrand'); export const { curve } = registerControl('curve'); diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index f5b0c676e..38f9aeb39 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -3624,3 +3624,64 @@ for (const name of distAlgoNames) { return this.distort(argsPat); }; } + +/** + * Selects which LFO number to use for modulation. Multiple LFOs + * can be applied using the ':' mininotation. There are an arbitrary number + * of LFOs available -- the number is only used to share LFOs across targets + * if desired (and to conserve processing power) + * + * @name lfoNum + * @param {number | Pattern} lfoNum Index of the LFO. + * setup: note("F2").sound("supersaw") + * .lpf(100) + * .lfoDepth(1000) + * .lfoRate(0.25) + * .lfoSynced(1) + * .lfoTarget("lpf") + * .lfoParam("frequency") + * .lfoNum(2) + * + * reuse: note("F3").sound("square").lpf(50) + * .lfoTarget("lpf") + * .lfoParam("frequency") + * .lfoNum(2) // uses the same LFO + */ + +/** + * Sets the target destination for the envelope modulation. Names are typically related + * to existing controls ("source", "lpf", "vibrato", etc.). You can try a value + * and if it fails, the console will print the available options. + * + * @name envTarget + * @param {number | Pattern} envTarget Target identifier for modulation. + * n(irand(12).seg(8)).scale("F#3:minor").room(1) + * .lpf(100) + * .envDepth("4800:400") + * .envTarget("source:lpf") + * .envParam("detune:frequency") + */ + + +/** + * Establishes a signal chain. Can be called in sequence like pat.chain(...).chain(...) and so forth + * and/or in a single .chain(..., ..., etc) call. The arguments to `chain` are _patterns_ which each act like + * a self-contained pattern and follow the normal [signal chain](https://strudel.cc/learn/effects/). + * + * If multiple sound generators are present within the chain, they will be mixed in at the location where + * they are declared. + * + * @name chain + * @memberof Pattern + * @param {Pattern | Pattern[]} patterns Patterns to combine into a single chain + * @returns Pattern + */ +Pattern.prototype.chain = function (...pats) { + pats = pats.map(reify); + return this.withValue((v) => (vEff) => { + const currChain = v.chain ?? []; + return { ...v, chain: currChain.concat(vEff) }; + }).appLeft(parray(pats)); +}; + +export const chain = (pats) => pure({}).chain(pats); \ No newline at end of file From b73f62405820993ad0be28291066023279580fad Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 19 Nov 2025 15:41:29 -0600 Subject: [PATCH 142/312] Trying out alias approach --- packages/core/controls.mjs | 54 ++++++++++++++--------- packages/core/pattern.mjs | 90 ++++++++++++++++++++------------------ 2 files changed, 82 insertions(+), 62 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 6be21414b..732679d64 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -2097,7 +2097,8 @@ export const { envAttack, envatt, envattack } = registerControl('envAttack', 'en * .envDepth("4800:400") * .envTarget("source:lpf") * .envParam("detune:frequency") - * .envDecay("0.03:0.15").envCurve("exp:exp") + * .envDecay("0.03:0.15") + * .envDCurve(-0.4) */ export const { envDecay, envdec, envdecay } = registerControl('envDecay', 'envdec', 'envdecay'); @@ -2112,7 +2113,7 @@ export const { envDecay, envdec, envdecay } = registerControl('envDecay', 'envde * .envDepth("4800:400") * .envTarget("source:lpf") * .envParam("detune:frequency") - * .envDecay("0.03:0.15").envCurve("exp:exp") + * .envACurve(0.6).envDCurve(-0.2) * .envSustain(0.2) */ export const { envSustain, envs, envsustain } = registerControl('envSustain', 'envs', 'envsustain'); @@ -2129,29 +2130,12 @@ export const { envSustain, envs, envsustain } = registerControl('envSustain', 'e * .envDepth("4800:400") * .envTarget("source:lpf") * .envParam("detune:frequency") - * .envDecay("0.03:0.15").envCurve("exp:exp") + * .envDecay("0.03:0.15").envRCurve(0.5) * .envSustain(0.5) * .envRelease(3) */ export const { envRelease, envr, envrelease } = registerControl('envRelease', 'envr', 'envrelease'); -/** - * Selects the style of envelope: `exp` or `lin` (exponential or linear). - * - * @name envCurve - * @synonyms envc, envcurve - * @param {string | Pattern} envCurve Envelope curve style. - * @example - * n(irand(12).seg(8)).scale("F#3:minor").room(1) - * .lpf(100).release(2) - * .envTarget("source:lpf") - * .envParam("detune:frequency") - * .envDepth("500:4000") - * .envDecay("0.3:0.15") - * .envCurve("lin:exp") - */ -export const { envCurve, envc, envcurve } = registerControl('envCurve', 'envc', 'envcurve'); - /** * Sets the modulation depth of the envelope. * @@ -2167,6 +2151,36 @@ export const { envCurve, envc, envcurve } = registerControl('envCurve', 'envc', */ export const { envDepth, envd, envdepth } = registerControl('envDepth', 'envd', 'envdepth'); +/** + * Adjusts the curvature of the attack portion of the envelope. Positive values are snappy, + * negative values are slow + * + * @name envACurve + * @synonyms envac, envacurve + * @param {number | Pattern} envACurve Curvature amount (between -1 and 1). + */ +export const { envACurve, envac, envacurve } = registerControl('envACurve', 'envac', 'envacurve'); + +/** + * Adjusts the curvature of the decay portion of the envelope. Positive values are snappy, + * negative values are slow + * + * @name envDCurve + * @synonyms envdc, envdcurve + * @param {number | Pattern} envDCurve Curvature amount (between -1 and 1). + */ +export const { envDCurve, envdc, envdcurve } = registerControl('envDCurve', 'envdc', 'envdcurve'); + +/** + * Adjusts the curvature of the release portion of the envelope. Positive values are snappy, + * negative values are slow + * + * @name envRCurve + * @synonyms envrc, envrcurve + * @param {number | Pattern} envRCurve Curvature amount (between -1 and 1). + */ +export const { envRCurve, envrc, envrcurve } = registerControl('envRCurve', 'envrc', 'envrcurve'); + // TODO: slide param for certain synths export const { slide } = registerControl('slide'); // TODO: detune? https://tidalcycles.org/docs/patternlib/tutorials/synthesizers/#supersquare diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index ea9d0f34c..4ba24b206 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -3688,42 +3688,43 @@ export const phases = (list) => { return _ensureListPattern(list).as('phases'); }; -/** - * Selects which LFO number to use for modulation. Multiple LFOs - * can be applied using the ':' mininotation. There are an arbitrary number - * of LFOs available -- the number is only used to share LFOs across targets - * if desired (and to conserve processing power) - * - * @name lfoNum - * @param {number | Pattern} lfoNum Index of the LFO. - * setup: note("F2").sound("supersaw") - * .lpf(100) - * .lfoDepth(1000) - * .lfoRate(0.25) - * .lfoSynced(1) - * .lfoTarget("lpf") - * .lfoParam("frequency") - * .lfoNum(2) - * - * reuse: note("F3").sound("square").lpf(50) - * .lfoTarget("lpf") - * .lfoParam("frequency") - * .lfoNum(2) // uses the same LFO - */ +const configAliases = new Map(); +const addConfigAlias = (funcName, canonical, ...aliases) => { + const lowerFunc = String(funcName).toLowerCase(); + const aliasMap = configAliases.get(lowerFunc) ?? new Map(); + const allKeys = new Set([canonical, ...aliases]); + for (const alias of allKeys) { + aliasMap.set(String(alias).toLowerCase(), canonical); + } + configAliases.set(lowerFunc, aliasMap); +}; -/** - * Sets the target destination for the envelope modulation. Names are typically related - * to existing controls ("source", "lpf", "vibrato", etc.). You can try a value - * and if it fails, the console will print the available options. - * - * @name envTarget - * @param {number | Pattern} envTarget Target identifier for modulation. - * n(irand(12).seg(8)).scale("F#3:minor").room(1) - * .lpf(100) - * .envDepth("4800:400") - * .envTarget("source:lpf") - * .envParam("detune:frequency") - */ +const resolveConfigKey = (funcName, key) => { + const aliasMap = configAliases.get(String(funcName).toLowerCase()); + if (!aliasMap) return key; + const normalized = String(key).toLowerCase(); + return aliasMap.get(normalized) ?? key; +}; + +addConfigAlias('lfo', 'lfoTarget', 'lfot', 'lfotarget', 'target', 't'); +addConfigAlias('lfo', 'lfoParam', 'lfop', 'lfoparam', 'param', 'parameter', 'p'); +addConfigAlias('lfo', 'lfoRate', 'lfor', 'lforate', 'rate', 'r'); +addConfigAlias('lfo', 'lfoDepth', 'lfod', 'lfodepth', 'depth', 'd'); +addConfigAlias('lfo', 'lfoDCOffset', 'lfodc', 'lfodcoffset', 'dcoffset', 'offset', 'dc'); +addConfigAlias('lfo', 'lfoShape', 'lfosh', 'lfoshape', 'shape', 'sh'); +addConfigAlias('lfo', 'lfoSkew', 'lfosk', 'lfoskew', 'skew', 'sk'); +addConfigAlias('lfo', 'lfoCurve', 'lfoc', 'lfocurve', 'curve', 'c'); +addConfigAlias('lfo', 'lfoSync', 'lfos', 'lfosync', 'sync', 'synced', 's'); +addConfigAlias('env', 'envTarget', 'envt', 'envtarget'); +addConfigAlias('env', 'envParam', 'envp', 'envparam'); +addConfigAlias('env', 'envAttack', 'envatt', 'envattack'); +addConfigAlias('env', 'envDecay', 'envdec', 'envdecay'); +addConfigAlias('env', 'envSustain', 'envs', 'envsustain'); +addConfigAlias('env', 'envRelease', 'envr', 'envrelease'); +addConfigAlias('env', 'envDepth', 'envd', 'envdepth'); +addConfigAlias('env', 'envACurve', 'envac', 'envacurve'); +addConfigAlias('env', 'envDCurve', 'envdc', 'envdcurve'); +addConfigAlias('env', 'envRCurve', 'envrc', 'envrcurve'); /** * Establishes a signal chain. Can be called in sequence like pat.chain(...).chain(...) and so forth @@ -3738,12 +3739,17 @@ export const phases = (list) => { * @param {Pattern | Pattern[]} patterns Patterns to combine into a single chain * @returns Pattern */ -Pattern.prototype.chain = function (...pats) { - pats = pats.map(reify); - return this.withValue((v) => (vEff) => { - const currChain = v.chain ?? []; - return { ...v, chain: currChain.concat(vEff) }; - }).appLeft(parray(pats)); +Pattern.prototype.lfo = function (config) { + if (config == null || typeof config !== 'object') { + return this; + } + let output = this; + for (const [rawKey, value] of Object.entries(config)) { + const key = resolveConfigKey('lfo', rawKey); + const pat = reify(value); + output = output.set(pat.as(key)); + } + return output; }; -export const chain = (pats) => pure({}).chain(pats); +export const lfo = (config) => pure({}).lfo(config); From 7ccdefe1c69605563ff16768ea06fcb7eaffc8f8 Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 19 Nov 2025 16:33:08 -0600 Subject: [PATCH 143/312] Huge overhaul for config part 1 --- packages/core/controls.mjs | 295 ------------------------------------- packages/core/pattern.mjs | 140 +++++++++++++----- 2 files changed, 105 insertions(+), 330 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 732679d64..bcab1d1b8 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -1886,301 +1886,6 @@ export const { panorient } = registerControl('panorient'); // ['pitch3'], // ['portamento'], -/** - * Sets the target destination for the LFO modulation. Names are typically related - * to existing controls ("source", "lpf", "vibrato", etc.). You can try a value - * and if it fails, the console will print the available options. - * - * @name lfoTarget - * @synonyms lfot, lfotarget - * @param {string | Pattern} target Target identifier for modulation. - * note("F2").sound("supersaw") - * .lpf(100) - * .lfoDepth(3000) - * .lfoRate(0.25) - * .lfoSynced(1) - * .lfoTarget("lpf") - * .lfoParam("frequency") - */ -export const { lfoTarget, lfot, lfotarget } = registerControl('lfoTarget', 'lfot', 'lfotarget'); - -/** - * Chooses which parameter the LFO will modulate on the target. Parameter values - * are things like "frequency", "Q", "detune", etc. You can try a value - * and if it fails, the console will print the available options. - * - * @name lfoParam - * @synonyms lfop, lfoparam - * @param {string | Pattern} param Parameter name - * note("F2").sound("supersaw") - * .lpf(100) - * .lfoDepth(3000) - * .lfoRate(0.25) - * .lfoSynced(1) - * .lfoTarget("lpf") - * .lfoParam("frequency") - */ -export const { lfoParam, lfop, lfoparam } = registerControl('lfoParam', 'lfop', 'lfoparam'); - -/** - * Controls the speed of the LFO. - * - * @name lfoRate - * @synonyms lfor, lforate - * @param {number | Pattern} rate Frequency or tempo-relative value. - * note("F2").sound("supersaw") - * .lpf(100) - * .lfoTarget("lpf") - * .lfoParam("frequency") - * .lfoDepth(3000) - * .lfoRate(0.25) - */ -export const { lfoRate, lfor, lforate } = registerControl('lfoRate', 'lfor', 'lforate'); - -/** - * Sets the modulation depth of the LFO. - * - * @name lfoDepth - * @synonyms lfod, lfodepth - * @param {number | Pattern} depth Modulation depth amount. - * note("F2").sound("supersaw") - * .lpf(100) - * .lfoTarget("lpf") - * .lfoParam("frequency") - * .lfoSynced(1) - * .lfoDepth(5000) - */ -export const { lfoDepth, lfod, lfodepth } = registerControl('lfoDepth', 'lfod', 'lfodepth'); - -/** - * Applies a DC offset to the LFO signal. Normally the LFO varies from - * 0 to 1 (i.e. unipolar). By using an offset of -0.5, one can achieve - * a bipolar LFO. - * - * @name lfoDCOffset - * @synonyms lfodc, lfodcoffset - * @param {number | Pattern} offset Offset amount. - * note("F2").sound("supersaw") - * .lpf(2000) - * .lfoTarget("lpf") - * .lfoParam("frequency") - * .lfoDepth(1000) - * .lfoRate(4) - * .lfoSynced(1) - * .lfoDCOffset(-0.5) - */ -export const { lfoDCOffset, lfodc, lfodcoffset } = registerControl('lfoDCOffset', 'lfodc', 'lfodcoffset'); - -/** - * Selects the waveform shape of the LFO. Current options are - * triangle, square, sine, saw, ramp (corresponding to 0 through 4, - * respectively). - * - * @name lfoShape - * @synonyms lfosh, lfoshape - * @param {number | Pattern} shape Waveform type identifier. - * note("F2").sound("supersaw") - * .lpf(100) - * .lfoTarget("lpf") - * .lfoParam("frequency") - * .lfoDepth(1000) - * .lfoRate(4) - * .lfoSynced(1) - * .lfoShape(3) - */ -export const { lfoShape, lfosh, lfoshape } = registerControl('lfoShape', 'lfosh', 'lfoshape'); - -/** - * Skews the LFO waveform. - * - * @name lfoSkew - * @synonyms lfosk, lfoskew - * @param {number | Pattern} skew Skew amount (between 0 and 1). - * note("F2").sound("supersaw") - * .lpf(100) - * .lfoTarget("lpf") - * .lfoParam("frequency") - * .lfoDepth(1000) - * .lfoRate(4) - * .lfoSynced(1) - * .lfoSkew(0.75) - */ -export const { lfoSkew, lfosk, lfoskew } = registerControl('lfoSkew', 'lfosk', 'lfoskew'); - -/** - * Adjusts the (exponential) curvature of the LFO waveform. - * - * @name lfoCurve - * @synonyms lfoc, lfocurve - * @param {number | Pattern} curve Curve shaping amount. - * note("F2").sound("supersaw") - * .lpf(100) - * .lfoTarget("lpf") - * .lfoParam("frequency") - * .lfoDepth(1000) - * .lfoShape(3).lfoRate(4) - * .lfoSynced(1) - * .lfoCurve(0.95) - */ -export const { lfoCurve, lfoc, lfocurve } = registerControl('lfoCurve', 'lfoc', 'lfocurve'); - -/** - * Sets the tempo-synced rate of the LFO - * - * @name lfoSync - * @synonyms lfos, lfosync - * @param {number | Pattern} rate Rate to be multiplied by cycles per second - * note("F2").sound("supersaw") - * .lpf(100) - * .lfoTarget("lpf") - * .lfoParam("frequency") - * .lfoDepth(1000) - * .lfoShape(3).lfoSync(2) - */ -export const { lfoSync, lfos, lfosync } = registerControl('lfoSync', 'lfos', 'lfosync'); - -/** - * Sets the target destination for the envelope modulation. Names are typically related - * to existing controls ("source", "lpf", "vibrato", etc.). You can try a value - * and if it fails, the console will print the available options. - * - * @name envTarget - * @synonyms envt, envtarget - * @param {number | Pattern} envTarget Target identifier for modulation. - * n(irand(12).seg(8)).scale("F#3:minor").room(1) - * .lpf(100) - * .envDepth("4800:400") - * .envTarget("source:lpf") - * .envParam("detune:frequency") - */ -export const { envTarget, envt, envtarget } = registerControl('envTarget', 'envt', 'envtarget'); - -/** - * Chooses which parameter the LFO will modulate on the target. Parameter values - * are things like "frequency", "Q", "detune", etc. You can try a value - * and if it fails, the console will print the available options. - * - * @name envParam - * @synonyms envp, envparam - * @param {number | Pattern} envParam Parameter index or identifier. - * n(irand(12).seg(8)).scale("F#3:minor").room(1) - * .lpf(100) - * .envDepth("4800:400") - * .envTarget("source:lpf") - * .envParam("detune:frequency") - */ -export const { envParam, envp, envparam } = registerControl('envParam', 'envp', 'envparam'); - -/** - * Controls the attack time of the envelope. - * - * @name envAttack - * @synonyms envatt, envattack - * @param {number | Pattern} envAttack Duration of attack phase. - * n(irand(12).seg(8)).scale("F#3:minor").room(1) - * .lpf(500) - * .envDepth("4800:400") - * .envTarget("source:lpf") - * .envParam("detune:frequency") - * .envAttack(0.5) - */ -export const { envAttack, envatt, envattack } = registerControl('envAttack', 'envatt', 'envattack'); - -/** - * Controls the decay time of the envelope. - * - * @name envDecay - * @synonyms envdec, envdecay - * @param {number | Pattern} envDecay Duration of decay phase. - * n(irand(12).seg(8)).scale("F#3:minor").room(1) - * .lpf(100) - * .envDepth("4800:400") - * .envTarget("source:lpf") - * .envParam("detune:frequency") - * .envDecay("0.03:0.15") - * .envDCurve(-0.4) - */ -export const { envDecay, envdec, envdecay } = registerControl('envDecay', 'envdec', 'envdecay'); - -/** - * Sets the sustain level of the envelope. - * - * @name envSustain - * @synonyms envs, envsustain - * @param {number | Pattern} envSustain Sustain amplitude level. - * n(irand(12).seg(8)).scale("F#3:minor").room(1) - * .lpf(100) - * .envDepth("4800:400") - * .envTarget("source:lpf") - * .envParam("detune:frequency") - * .envACurve(0.6).envDCurve(-0.2) - * .envSustain(0.2) - */ -export const { envSustain, envs, envsustain } = registerControl('envSustain', 'envs', 'envsustain'); - -/** - * Controls the release time of the envelope. - * - * @name envRelease - * @synonyms envr, envrelease - * @param {number | Pattern} envRelease Duration of release phase. - * @example - * n(irand(12).seg(8)).scale("F#3:minor").room(1) - * .lpf(100).release(3) - * .envDepth("4800:400") - * .envTarget("source:lpf") - * .envParam("detune:frequency") - * .envDecay("0.03:0.15").envRCurve(0.5) - * .envSustain(0.5) - * .envRelease(3) - */ -export const { envRelease, envr, envrelease } = registerControl('envRelease', 'envr', 'envrelease'); - -/** - * Sets the modulation depth of the envelope. - * - * @name envDepth - * @synonyms envd, envdepth - * @param {number | Pattern} envDepth Modulation depth amount. - * @example - * n(irand(12).seg(8)).scale("F#3:minor").room(1) - * .lpf(100) - * .envTarget("source:lpf") - * .envParam("detune:frequency") - * .envDepth("4800:400") - */ -export const { envDepth, envd, envdepth } = registerControl('envDepth', 'envd', 'envdepth'); - -/** - * Adjusts the curvature of the attack portion of the envelope. Positive values are snappy, - * negative values are slow - * - * @name envACurve - * @synonyms envac, envacurve - * @param {number | Pattern} envACurve Curvature amount (between -1 and 1). - */ -export const { envACurve, envac, envacurve } = registerControl('envACurve', 'envac', 'envacurve'); - -/** - * Adjusts the curvature of the decay portion of the envelope. Positive values are snappy, - * negative values are slow - * - * @name envDCurve - * @synonyms envdc, envdcurve - * @param {number | Pattern} envDCurve Curvature amount (between -1 and 1). - */ -export const { envDCurve, envdc, envdcurve } = registerControl('envDCurve', 'envdc', 'envdcurve'); - -/** - * Adjusts the curvature of the release portion of the envelope. Positive values are snappy, - * negative values are slow - * - * @name envRCurve - * @synonyms envrc, envrcurve - * @param {number | Pattern} envRCurve Curvature amount (between -1 and 1). - */ -export const { envRCurve, envrc, envrcurve } = registerControl('envRCurve', 'envrc', 'envrcurve'); - // TODO: slide param for certain synths export const { slide } = registerControl('slide'); // TODO: detune? https://tidalcycles.org/docs/patternlib/tutorials/synthesizers/#supersquare diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index 4ba24b206..1eefa41eb 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -3706,50 +3706,120 @@ const resolveConfigKey = (funcName, key) => { return aliasMap.get(normalized) ?? key; }; -addConfigAlias('lfo', 'lfoTarget', 'lfot', 'lfotarget', 'target', 't'); -addConfigAlias('lfo', 'lfoParam', 'lfop', 'lfoparam', 'param', 'parameter', 'p'); -addConfigAlias('lfo', 'lfoRate', 'lfor', 'lforate', 'rate', 'r'); -addConfigAlias('lfo', 'lfoDepth', 'lfod', 'lfodepth', 'depth', 'd'); -addConfigAlias('lfo', 'lfoDCOffset', 'lfodc', 'lfodcoffset', 'dcoffset', 'offset', 'dc'); -addConfigAlias('lfo', 'lfoShape', 'lfosh', 'lfoshape', 'shape', 'sh'); -addConfigAlias('lfo', 'lfoSkew', 'lfosk', 'lfoskew', 'skew', 'sk'); -addConfigAlias('lfo', 'lfoCurve', 'lfoc', 'lfocurve', 'curve', 'c'); -addConfigAlias('lfo', 'lfoSync', 'lfos', 'lfosync', 'sync', 'synced', 's'); -addConfigAlias('env', 'envTarget', 'envt', 'envtarget'); -addConfigAlias('env', 'envParam', 'envp', 'envparam'); -addConfigAlias('env', 'envAttack', 'envatt', 'envattack'); -addConfigAlias('env', 'envDecay', 'envdec', 'envdecay'); -addConfigAlias('env', 'envSustain', 'envs', 'envsustain'); -addConfigAlias('env', 'envRelease', 'envr', 'envrelease'); -addConfigAlias('env', 'envDepth', 'envd', 'envdepth'); -addConfigAlias('env', 'envACurve', 'envac', 'envacurve'); -addConfigAlias('env', 'envDCurve', 'envdc', 'envdcurve'); -addConfigAlias('env', 'envRCurve', 'envrc', 'envrcurve'); +addConfigAlias('lfo', 'target', 't'); +addConfigAlias('lfo', 'param', 'p'); +addConfigAlias('lfo', 'rate', 'r'); +addConfigAlias('lfo', 'depth', 'dep', 'dp', 'd'); +addConfigAlias('lfo', 'dc'); +addConfigAlias('lfo', 'shape', 'sh'); +addConfigAlias('lfo', 'skew', 'sk'); +addConfigAlias('lfo', 'curve', 'c'); +addConfigAlias('lfo', 'sync', 's'); +addConfigAlias('env', 'target', 't'); +addConfigAlias('env', 'attack', 'att', 'a'); +addConfigAlias('env', 'decay', 'dec', 'd'); +addConfigAlias('env', 'sustain', 'sus', 's'); +addConfigAlias('env', 'release', 'rel', 'r'); +addConfigAlias('env', 'depth', 'dep', 'dp'); +addConfigAlias('env', 'acurve', 'ac'); +addConfigAlias('env', 'dcurve', 'dc'); +addConfigAlias('env', 'rcurve', 'rc'); +addConfigAlias('send', 'id'); +addConfigAlias('send', 'target', 't'); +addConfigAlias('send', 'depth', 'dep', 'dp', 'd'); +addConfigAlias('send', 'dc'); +addConfigAlias('send', 'offset', 'off', 'o'); -/** - * Establishes a signal chain. Can be called in sequence like pat.chain(...).chain(...) and so forth - * and/or in a single .chain(..., ..., etc) call. The arguments to `chain` are _patterns_ which each act like - * a self-contained pattern and follow the normal [signal chain](https://strudel.cc/learn/effects/). - * - * If multiple sound generators are present within the chain, they will be mixed in at the location where - * they are declared. - * - * @name chain - * @memberof Pattern - * @param {Pattern | Pattern[]} patterns Patterns to combine into a single chain - * @returns Pattern - */ -Pattern.prototype.lfo = function (config) { +Pattern.prototype.mod = function (type, config, idx) { if (config == null || typeof config !== 'object') { return this; } + if (!['lfo', 'send', 'env'].includes(type)) { + logger(`[core] Modulation type ${type} not found. Please use one of 'lfo', 'env', 'send'`); + return this; + } let output = this; for (const [rawKey, value] of Object.entries(config)) { - const key = resolveConfigKey('lfo', rawKey); + const key = resolveConfigKey(type, rawKey); const pat = reify(value); - output = output.set(pat.as(key)); + output = output + .fmap((v) => (c) => { + v[type] ??= []; + const t = v[type]; + idx ??= t.length; + t[idx] ??= {}; + t[idx][key] = c; + return v; + }) + .appLeft(pat); } return output; }; +/** + * Configures an LFO. Can be called in sequence like pat.lfo(...).lfo(...) to set up multiple LFOs + * + * + * @name lfo + * @memberof Pattern + * @param {Object} config LFO configuration. + * @param {string | Pattern} [config.target] Node (and parameter if specified like `lpf.frequency`) to modulate. Aliases: target, t + * @param {number | Pattern} [config.rate] Modulation rate. Aliases: rate, r + * @param {number | Pattern} [config.depth] Modulation depth. Aliases: dep, dp, d + * @param {number | Pattern} [config.dc] DC offset / bias for the waveform + * @param {number | Pattern} [config.shape] Waveform shape index. Aliases: sh + * @param {number | Pattern} [config.skew] Waveform skew amount. Aliases: sk + * @param {number | Pattern} [config.curve] Exponential curve amount. Aliases: c + * @param {number | Pattern} [config.sync] Tempo-synced modulation rate. Aliases: s + * @param {number | null} idx Index of the LFO slot to overwrite. Omit to append a new LFO + * @returns Pattern + */ +Pattern.prototype.lfo = function (config, idx) { + return this.mod('lfo', config, idx); +}; export const lfo = (config) => pure({}).lfo(config); + +/** + * Configures an envelope. Can be called in sequence like pat.env(...).env(...) to set up multiple envelopes + * + * + * @name env + * @memberof Pattern + * @param {Object} config Envelope configuration. + * @param {string | Pattern} [config.target] Node (and parameter if specified like `lpf.frequency`) to modulate. Aliases: target, t + * @param {number | Pattern} [config.depth] Modulation depth. Aliases: dep, dp + * @param {number | Pattern} [config.attack] Time to reach depth. Aliases: att, a + * @param {number | Pattern} [config.decay] Time to reach sustain. Aliases: dec, d + * @param {number | Pattern} [config.sustain] Sustain depth. Aliases: sus, s + * @param {number | Pattern} [config.release] Time to return to nominal value. Aliases: rel, r + * @param {number | Pattern} [config.acurve] Snappiness of attack curve (-1 = relaxed, 1 = snappy). Aliases: ac + * @param {number | Pattern} [config.dcurve] Snappiness of decay curve (-1 = relaxed, 1 = snappy). Aliases: dc + * @param {number | Pattern} [config.rcurve] Snappiness of release curve (-1 = relaxed, 1 = snappy). Aliases: rc + * @param {number | null} idx Index of the envelope slot to overwrite. Omit to append a new envelope + * @returns Pattern + */ +Pattern.prototype.env = function (config, idx) { + return this.mod('env', config, idx); +}; +export const env = (config) => pure({}).env(config); + +/** + * Sends the output of this pattern to a parameter on another pattern. + * Can be called in sequence like pat.send(...).send(...) to send to multiple parameters + * + * + * @name send + * @memberof Pattern + * @param {Object} config Send configuration. + * @param {string | Pattern} [config.id] Pattern id to modulate + * @param {string | Pattern} [config.target] Node (and parameter if specified like `lpf.frequency`) to modulate. Aliases: target, t + * @param {number | Pattern} [config.depth] Modulation depth. Aliases:dep, dp, d + * @param {number | Pattern} [config.dc] DC offset prior to application + * @param {number | Pattern} [config.offset] Offset to apply to the parameter. Aliases: off, o + * @param {number | null} idx Index of the send slot to overwrite. Omit to append a new send + * @returns Pattern + */ +Pattern.prototype.send = function (config, idx) { + return this.mod('send', config, idx); +}; +export const send = (config) => pure({}).send(config); From 442f4879738b7f7cb3f3f1baef8a0a5fac7cfb19 Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 19 Nov 2025 17:10:05 -0600 Subject: [PATCH 144/312] Another major cleanup 90% of first pass --- packages/superdough/superdough.mjs | 257 +++++++++++------------------ packages/superdough/worklets.mjs | 4 +- 2 files changed, 100 insertions(+), 161 deletions(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 52137c510..4cd713763 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -376,8 +376,7 @@ export function resetGlobalEffects() { controller?.reset(); analysers = {}; analysersData = {}; - lfos = {}; - nodes = {}; + idToNodes = {}; } function _getNodeParam(node, name) { @@ -409,66 +408,21 @@ function _getNodeParams(node) { return Array.from(params); } -/** - * Split parameters (which might be arrays -- implying multiple-parameter modulation -- or a single number) into independent - * objects which only account for single-parameter modulation - * - * @param {Object} params - Dictionary of modulation parameters. - * @returns {Object[]} - Array of parameter objects, one per parameter modulation - */ -function _splitParams(params) { - const num = ['num', 'target', 'param'] // names used to indicate individual parameter modulations - .map((k) => [params[k] ?? 0].flat().length) - .reduce((a, v) => Math.max(a, v), 1); - - const individualParams = []; - for (let i = 0; i < num; i++) { - const paramsI = {}; - for (const k in params) { - const flatV = [params[k]].flat(); - if (flatV.length !== num && flatV.length !== 1) { - errorLogger( - new Error( - `Could not set up modulations. We derived ${num} items, but ${k}: ${JSON.stringify(flatV)} has length ${flatV.length} (needs 1 or ${num}).`, - ), - 'superdough', - ); - return []; - } - paramsI[k] = flatV[i] ?? flatV[0]; - } - individualParams.push(paramsI); - } - return individualParams; -} - -/** - * Given a node name and the name of a parameter on that node, attempt to retrieve - * all nodes corresponding to the name and their associated parameters - * - * Note that we say nodes, plural, because some nodes have multiple sub-nodes, like a - * 24db filter which is two filters in series - * - * @param {string} targetName - Name of the node to modulate parameters on (e.g. `lpf`, `source`, etc.) - * @param {string} paramName - Name of the parameter to modulate on that node - * @returns {AudioParam[]} - Array of audio parameter objects for modulation - * - */ -function _getTargetParams(targetName, paramName) { - const targetNodes = nodes[targetName]; +function _getTargetParams(nodes, target) { + const targetNodes = nodes[target]; if (!targetNodes) { const keys = Object.keys(nodes); errorLogger( new Error( - `Could not connect to target '${targetName}' — it does not exist. Available targets: ${keys.join(', ')}`, + `Could not connect to target '${target}' — it does not exist. Available targets: ${keys.join(', ')}`, ), 'superdough', ); return []; } - const audioParams = []; targetNodes.forEach((targetNode) => { + const paramName = guessParamName(blah); const targetParam = _getNodeParam(targetNode, paramName); if (!targetParam) { const available = _getNodeParams(targetNode); @@ -485,64 +439,57 @@ function _getTargetParams(targetName, paramName) { return audioParams; } -function _setWorkletParamsAtTime(audioParams, params, time) { - for (const [name, value] of params) { - if (value == null) continue; - const p = audioParams.get(name); - if (p.cancelAndHoldAtTime) p.cancelAndHoldAtTime(time); - else p.cancelScheduledValues(time); - p.setValueAtTime(value, time); - } -} - -let lfos = {}; -function _connectLFO(params, nodeTracker) { +function connectLFO(idx, params, nodeTracker) { const { - frequency = 1, - synced = 0, - cps = 0.5, - num = 1, // default to LFO 1 + rate = 1, + sync, + cps, target, - param, - begin, ...filteredParams } = params; - filteredParams['frequency'] = synced ? frequency / cps : frequency; - let lfoNode = lfos[num]; - if (lfoNode == null) { - const ac = getAudioContext(); - lfoNode = getLfo(ac, filteredParams); - lfos[num] = lfoNode; - nodeTracker[`lfo${num}`] = [lfoNode]; - } - const targets = _getTargetParams(target, param); - targets.forEach((target) => lfoNode.connect(target)); - _setWorkletParamsAtTime(lfoNode.parameters, Object.entries(filteredParams), begin); - return lfoNode; + filteredParams['frequency'] = sync !== undefined ? sync / cps : rate; + const ac = getAudioContext(); + lfoNode = getLfo(ac, filteredParams); + nodeTracker[`lfo${idx}`] = [lfoNode]; + _getTargetParams(target).forEach(lfoNode.connect); } -function _connectEnvelope(params) { - const { target, param, envDepth, begin, end, attack, decay, sustain, release, curve, ...filteredParams } = params; - const targets = _getTargetParams(target, param); - const [att, dec, sus, rel] = getADSRValues([attack, decay, sustain, release], curve, [0.005, 0.14, 0, 0.1]); - targets.forEach((targetParam) => { - const currentValue = targetParam.value; - const min = currentValue; - const max = currentValue + envDepth; - getParamADSR(targetParam, att, dec, sus, rel, min, max, begin, end, curve); - }); +function connectEnvelope(idx, params, nodeTracker) { + const { target, ...filteredParams } = params; + const ac = getAudioContext(); + envNode = getEnvelope(ac, filteredParams); + nodeTracker[`env${idx}`] = [envNode]; + _getTargetParams(nodeTracker, target).forEach(envNode.connect); } -function connectModulators(params, modulatorType, nodeTracker) { - // We break down params specifying multiple modulators into a set of parameters for - // a single one - const individualParams = _splitParams(params); - if (modulatorType === 'lfo') { - individualParams.map((p) => _connectLFO(p, nodeTracker)); - } else if (modulatorType === 'envelope') { - individualParams.forEach(_connectEnvelope); - } - return []; +function connectSendModulator(params, signal, nodeTracker, pendingConnections) { + const dc = new ConstantSourceNode(ac, { offset: params.dc ?? 0 }); + dc.start(t); + const offset = new ConstantSourceNode(ac, { offset: params.offset ?? 0 }); + offset.start(t); + const raw = dc.connect(gainNode(1)); + const modulator = post + .connect(raw) + .connect(gainNode((params.depth ?? 1) / 0.3)) + .connect(gainNode(1)); + offset.connect(modulator); + webAudioTimeout( + ac, + () => { + _getTargetParams(nodeTracker, params.target).forEach(signal.connect);; + }, + 0, + params.begin, + ); + webAudioTimeout( + ac, + () => { + signal.disconnect(); + delete pendingConnections[params.id][chainID]; + }, + 0, + params.end + 0.05, + ); } let activeSoundSources = new Map(); @@ -552,9 +499,10 @@ function mapChannelNumbers(channels) { return (Array.isArray(channels) ? channels : [channels]).map((ch) => ch - 1); } -let nodes = {}; - +let idToNodes = {}; +let pendingConnections = {}; export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) => { + const nodes = {}; // new: t is always expected to be the absolute target onset time const ac = getAudioContext(); const audioController = getSuperdoughAudioController(); @@ -644,24 +592,6 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) compressorKnee, compressorAttack, compressorRelease, - lfoNum, - lfoTarget, - lfoParam, - lfoRate, - lfoDepth, - lfoDCOffset, - lfoShape, - lfoSkew, - lfoCurve, - lfoSynced, - envTarget, - envParam, - envAttack, - envDecay, - envSustain, - envRelease, - envCurve, - envDepth, } = value; delaytime = delaytime ?? cycleToSeconds(delaysync, cps); @@ -991,45 +921,56 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) chain.slice(1).reduce((last, current) => last.connect(current), chain[0]); audioNodes = audioNodes.concat(chain); - // finally, now that `nodes` is populated, set up LFOs and envelopes - if (lfoTarget !== undefined && lfoParam !== undefined) { - connectModulators( - { - num: lfoNum ?? 1, - target: lfoTarget, - param: lfoParam, - frequency: lfoRate, - depth: lfoDepth, - dcoffset: lfoDCOffset ?? 0, // override default value of 0.5 - shape: lfoShape, - skew: lfoSkew, - curve: lfoCurve, - persistent: 1, - begin: t, - synced: lfoSynced, - cps: cps, - }, - 'lfo', - nodes, - ); + // finally, now that `nodes` is populated, set up modulators + if (value.lfo) { + for (const [params, idx] of Object.entries(value.lfo)) { + connectLFO( + idx, + { + ...params, + cps, + begin: t, + end: endWithRelease, + }, + 'lfo', + nodes, + ); + } } - if (envTarget !== undefined && envParam !== undefined) { - connectModulators( - { - target: envTarget, - param: envParam, - envDepth, - attack: envAttack, - decay: envDecay, - sustain: envSustain, - release: envRelease, - curve: envCurve, - begin: t, - end: endWithRelease, - }, - 'envelope', - ); + if (value.env) { + for (const [params, idx] of Object.entries(value.env)) { + connectEnvelope( + idx, + { + ...params, + begin: t, + end: endWithRelease, + }, + 'envelope', + nodes, + ); + } } + if (value.id) { + idToNodes[value.id] = new WeakRef(nodes); + } + if (value.send) { + for (const p of value.env) { + const modNodes = idToNodes[p.id]; + if (!modNodes) { + logger( + `[superdough] Could not connect to pattern ${p.id} -- make sure a pattern with this name exists. Available targets: ${Object.keys(idToNodes).join(', ')}`, + ); + } else { + connectSendModulator(params, post); + pendingConnections[p.id] ??= {}; + pendingConnections[p.id][chainID] = [modulator, p.target, p.param, endWithRelease]; + } + }); + } + + if (applySends) { + }; export const superdoughTrigger = (t, hap, ct, cps) => { diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index 466055563..a098929b2 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -123,7 +123,6 @@ class LFOProcessor extends AudioWorkletProcessor { { name: 'dcoffset', defaultValue: 0 }, { name: 'min', defaultValue: 0 }, { name: 'max', defaultValue: 1 }, - { name: 'persistent', defaultValue: 0, min: 0, max: 1 }, // whether to ignore end ]; } @@ -142,8 +141,7 @@ class LFOProcessor extends AudioWorkletProcessor { process(_inputs, outputs, parameters) { const begin = parameters['begin'][0]; const end = parameters['end'][0]; - const persistent = parameters['persistent'][0]; - if (persistent < 0.5 && currentTime >= end) { + if (currentTime >= end) { return false; } if (currentTime <= begin) { From f8796d039ff90d4408068cff633cc2933617fbf9 Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 19 Nov 2025 17:18:38 -0600 Subject: [PATCH 145/312] Add param guesses --- packages/superdough/superdough.mjs | 36 +++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 4cd713763..df1090a83 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -408,7 +408,38 @@ function _getNodeParams(node) { return Array.from(params); } +const targetToParamGuess = { + source: 'detune', + lpf: 'frequency', + bpf: 'frequency', + hpf: 'frequency', + distort: 'distort', + gain: 'gain', + vowel: 'frequency', + coarse: 'coarse', + crush: 'crush', + shape: 'shape', + compressor: 'threshold', + pan: 'pan', + phaser: 'rate', + post: 'gain', + delay: 'time', + room: 'size', + djf: 'value', + lfo: 'frequency', + env: 'depth', + send: 'depth', +} + function _getTargetParams(nodes, target) { + let param; + if (target.includes('.')) { + const split = target.split('.'); + target = split[0]; + param = split[1]; + } else { + param = targetToParamGuess[target]; + } const targetNodes = nodes[target]; if (!targetNodes) { const keys = Object.keys(nodes); @@ -422,13 +453,12 @@ function _getTargetParams(nodes, target) { } const audioParams = []; targetNodes.forEach((targetNode) => { - const paramName = guessParamName(blah); - const targetParam = _getNodeParam(targetNode, paramName); + const targetParam = _getNodeParam(targetNode, param); if (!targetParam) { const available = _getNodeParams(targetNode); errorLogger( new Error( - `Could not connect to parameter '${paramName}' on '${targetName}'. Available parameters: ${available.join(', ')}`, + `Could not connect to parameter '${param}' on '${targetName}'. Available parameters: ${available.join(', ')}`, ), 'superdough', ); From 0dbca05de09a07a967318f07595829edffc1a74d Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 19 Nov 2025 17:24:33 -0600 Subject: [PATCH 146/312] Ready for testing --- packages/superdough/superdough.mjs | 50 ++++++++++++++++++------------ 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index df1090a83..1262a9261 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -423,13 +423,13 @@ const targetToParamGuess = { pan: 'pan', phaser: 'rate', post: 'gain', - delay: 'time', + delay: 'delayTime', room: 'size', djf: 'value', lfo: 'frequency', env: 'depth', send: 'depth', -} +}; function _getTargetParams(nodes, target) { let param; @@ -438,15 +438,14 @@ function _getTargetParams(nodes, target) { target = split[0]; param = split[1]; } else { - param = targetToParamGuess[target]; + const targetWithoutIndex = target.replace(/(\d+)$/, ''); + param = targetToParamGuess[targetWithoutIndex]; } const targetNodes = nodes[target]; if (!targetNodes) { const keys = Object.keys(nodes); errorLogger( - new Error( - `Could not connect to target '${target}' — it does not exist. Available targets: ${keys.join(', ')}`, - ), + new Error(`Could not connect to target '${target}' — it does not exist. Available targets: ${keys.join(', ')}`), 'superdough', ); return []; @@ -470,13 +469,7 @@ function _getTargetParams(nodes, target) { } function connectLFO(idx, params, nodeTracker) { - const { - rate = 1, - sync, - cps, - target, - ...filteredParams - } = params; + const { rate = 1, sync, cps, target, ...filteredParams } = params; filteredParams['frequency'] = sync !== undefined ? sync / cps : rate; const ac = getAudioContext(); lfoNode = getLfo(ac, filteredParams); @@ -506,7 +499,7 @@ function connectSendModulator(params, signal, nodeTracker, pendingConnections) { webAudioTimeout( ac, () => { - _getTargetParams(nodeTracker, params.target).forEach(signal.connect);; + _getTargetParams(nodeTracker, params.target).forEach(signal.connect); }, 0, params.begin, @@ -994,13 +987,32 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) } else { connectSendModulator(params, post); pendingConnections[p.id] ??= {}; - pendingConnections[p.id][chainID] = [modulator, p.target, p.param, endWithRelease]; + pendingConnections[p.id][chainID] = new WeakRef([modulator, p.target, endWithRelease]); } - }); + } + } + if (value.id in pendingConnections) { + for (const data of Object.values(pendingConnections[id])) { + const [modulator, target, end] = data.deref(); + const targets = _getTargetParams(nodes, target); + webAudioTimeout( + ac, + () => { + targets.forEach((target) => modulator.connect(target)); + }, + 0, + t, + ); + webAudioTimeout( + ac, + () => { + modulator.disconnect(); + }, + 0, + end, + ); + } } - - if (applySends) { - }; export const superdoughTrigger = (t, hap, ct, cps) => { From 8144ec46bd7eeaf1d0cfbbe5c59a54a347941aeb Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 19 Nov 2025 18:35:35 -0600 Subject: [PATCH 147/312] Attempt system for sounds tab previews --- packages/superdough/superdough.mjs | 4 +- .../src/repl/components/panel/SoundsTab.jsx | 37 +++++++++++++------ 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 65c444120..73fece4f5 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -263,8 +263,8 @@ let audioReady; export async function initAudioOnFirstClick(options) { if (!audioReady) { audioReady = new Promise((resolve) => { - document.addEventListener('click', async function listener() { - document.removeEventListener('click', listener); + document.addEventListener('mousedown', async function listener() { + document.removeEventListener('mousedown', listener); await initAudio(options); resolve(); }); diff --git a/website/src/repl/components/panel/SoundsTab.jsx b/website/src/repl/components/panel/SoundsTab.jsx index a9f10bf12..311f593e1 100644 --- a/website/src/repl/components/panel/SoundsTab.jsx +++ b/website/src/repl/components/panel/SoundsTab.jsx @@ -14,6 +14,10 @@ import { prebake } from '@src/repl/prebake.mjs'; const getSamples = (samples) => Array.isArray(samples) ? samples.length : typeof samples === 'object' ? Object.values(samples).length : 1; +function wait(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + export function SoundsTab() { const sounds = useStore(soundMap); @@ -121,19 +125,30 @@ export function SoundsTab() { sustain: 1, duration: 0.5, }; - soundPreviewIdx++; const onended = () => trigRef.current?.node?.disconnect(); - try { - // Pre-load the sample by calling onTrigger with a future time - // This triggers the loading but schedules playback for later - const time = ctx.currentTime + 0.5; // Give 500ms for loading - const ref = await onTrigger(time, params, onended); - trigRef.current = ref; - if (ref?.node) { - connectToDestination(ref.node); + // Attempt to play the sample and retry every 200ms until 10 attempts have been reached + let errMsg; + for (let attempt = 0; attempt < 10; attempt++) { + try { + // Pre-load the sample by calling onTrigger with a future time + // This triggers the loading but schedules playback for later + const time = ctx.currentTime + 0.05; // Give 50ms for loading + const ref = await onTrigger(time, params, onended); + trigRef.current = ref; + if (ref?.node) { + connectToDestination(ref.node); + soundPreviewIdx++; + break; + } + } catch (err) { + console.log(err); + errMsg = err; + } + if (attempt == 9) { + console.warn('Failed to trigger sound after 10 attempts' + (errMsg ? `: ${errMsg}` : '')); + } else { + await wait(200); } - } catch (err) { - console.warn('Failed to trigger sound:', err); } }} > From 74488f8480d28606c192379f9df8695cfd962977 Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 19 Nov 2025 18:41:56 -0600 Subject: [PATCH 148/312] Stray log message --- website/src/repl/components/panel/SoundsTab.jsx | 1 - 1 file changed, 1 deletion(-) diff --git a/website/src/repl/components/panel/SoundsTab.jsx b/website/src/repl/components/panel/SoundsTab.jsx index 311f593e1..61d4ba1ce 100644 --- a/website/src/repl/components/panel/SoundsTab.jsx +++ b/website/src/repl/components/panel/SoundsTab.jsx @@ -141,7 +141,6 @@ export function SoundsTab() { break; } } catch (err) { - console.log(err); errMsg = err; } if (attempt == 9) { From 19b710c401831f2fd67673bc725061753138ab7a Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 19 Nov 2025 19:44:02 -0600 Subject: [PATCH 149/312] Mostly working version --- packages/core/controls.mjs | 1 - packages/core/pattern.mjs | 12 +++--- packages/soundfonts/fontloader.mjs | 2 +- packages/superdough/helpers.mjs | 20 +++------ packages/superdough/sampler.mjs | 2 +- packages/superdough/superdough.mjs | 68 +++++++++++++----------------- packages/superdough/synth.mjs | 14 +++--- packages/superdough/worklets.mjs | 6 +-- packages/superdough/zzfx.mjs | 1 + 9 files changed, 56 insertions(+), 70 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index bcab1d1b8..eab904429 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -2320,7 +2320,6 @@ export const { curve } = registerControl('curve'); export const { deltaSlide } = registerControl('deltaSlide'); export const { pitchJump } = registerControl('pitchJump'); export const { pitchJumpTime } = registerControl('pitchJumpTime'); -export const { lfo, repeatTime } = registerControl('lfo', 'repeatTime'); // noise on the frequency or as bubo calls it "frequency fog" :) export const { znoise } = registerControl('znoise'); export const { zmod } = registerControl('zmod'); diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index 1eefa41eb..a15ee42e4 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -3710,7 +3710,7 @@ addConfigAlias('lfo', 'target', 't'); addConfigAlias('lfo', 'param', 'p'); addConfigAlias('lfo', 'rate', 'r'); addConfigAlias('lfo', 'depth', 'dep', 'dp', 'd'); -addConfigAlias('lfo', 'dc'); +addConfigAlias('lfo', 'dcoffset', 'dc'); addConfigAlias('lfo', 'shape', 'sh'); addConfigAlias('lfo', 'skew', 'sk'); addConfigAlias('lfo', 'curve', 'c'); @@ -3730,7 +3730,7 @@ addConfigAlias('send', 'depth', 'dep', 'dp', 'd'); addConfigAlias('send', 'dc'); addConfigAlias('send', 'offset', 'off', 'o'); -Pattern.prototype.mod = function (type, config, idx) { +Pattern.prototype.modulate = function (type, config, idx) { if (config == null || typeof config !== 'object') { return this; } @@ -3766,7 +3766,7 @@ Pattern.prototype.mod = function (type, config, idx) { * @param {string | Pattern} [config.target] Node (and parameter if specified like `lpf.frequency`) to modulate. Aliases: target, t * @param {number | Pattern} [config.rate] Modulation rate. Aliases: rate, r * @param {number | Pattern} [config.depth] Modulation depth. Aliases: dep, dp, d - * @param {number | Pattern} [config.dc] DC offset / bias for the waveform + * @param {number | Pattern} [config.dcoffset] DC offset / bias for the waveform. Aliases: dc * @param {number | Pattern} [config.shape] Waveform shape index. Aliases: sh * @param {number | Pattern} [config.skew] Waveform skew amount. Aliases: sk * @param {number | Pattern} [config.curve] Exponential curve amount. Aliases: c @@ -3775,7 +3775,7 @@ Pattern.prototype.mod = function (type, config, idx) { * @returns Pattern */ Pattern.prototype.lfo = function (config, idx) { - return this.mod('lfo', config, idx); + return this.modulate('lfo', config, idx); }; export const lfo = (config) => pure({}).lfo(config); @@ -3799,7 +3799,7 @@ export const lfo = (config) => pure({}).lfo(config); * @returns Pattern */ Pattern.prototype.env = function (config, idx) { - return this.mod('env', config, idx); + return this.modulate('env', config, idx); }; export const env = (config) => pure({}).env(config); @@ -3820,6 +3820,6 @@ export const env = (config) => pure({}).env(config); * @returns Pattern */ Pattern.prototype.send = function (config, idx) { - return this.mod('send', config, idx); + return this.modulate('send', config, idx); }; export const send = (config) => pure({}).send(config); diff --git a/packages/soundfonts/fontloader.mjs b/packages/soundfonts/fontloader.mjs index 427f57e31..9b0525ec7 100644 --- a/packages/soundfonts/fontloader.mjs +++ b/packages/soundfonts/fontloader.mjs @@ -176,7 +176,7 @@ export function registerSoundfonts() { node.disconnect(); onended(); }; - return { node, stop }; + return { node, stop, source: bufferSource }; }, { type: 'soundfont', prebake: true, fonts }, ); diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 47161ed61..00ea3883e 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -105,22 +105,16 @@ function getModulationShapeInput(val) { return { tri: 0, triangle: 0, sine: 1, ramp: 2, saw: 3, square: 4 }[val] ?? 0; } -export function getLfo(audioContext, begin, end, properties = {}) { - const { shape = 0, ...props } = properties; - const { dcoffset = -0.5, depth = 1 } = properties; +export function getEnvelope(audioContext, properties = {}) { + return getWorklet(audioContext, 'envelope-processor', properties); +} + +export function getLfo(audioContext, properties = {}) { + // Extract some params we need for deriving other params + const { begin, shape = 0, ...props } = properties; const lfoprops = { - frequency: 1, - depth, - skew: 0.5, - phaseoffset: 0, time: begin, - begin, - end, shape: getModulationShapeInput(shape), - dcoffset, - min: dcoffset * depth, - max: dcoffset * depth + depth, - curve: 1, ...props, }; diff --git a/packages/superdough/sampler.mjs b/packages/superdough/sampler.mjs index 84bac3582..a966252d7 100644 --- a/packages/superdough/sampler.mjs +++ b/packages/superdough/sampler.mjs @@ -331,7 +331,7 @@ export async function onTriggerSample(t, value, onended, bank, resolveUrl) { const stop = (endTime) => { bufferSource.stop(endTime); }; - const handle = { node: out, bufferSource, stop }; + const handle = { node: out, source: bufferSource, stop }; // cut groups if (cut !== undefined) { diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 1262a9261..b2017a9d0 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -16,13 +16,14 @@ import { getADSRValues, getCompressor, getDistortion, + getEnvelope, getLfo, getParamADSR, getWorklet, webAudioTimeout, } from './helpers.mjs'; import { map } from 'nanostores'; -import { logger } from './logger.mjs'; +import { errorLogger, logger } from './logger.mjs'; import { loadBuffer } from './sampler.mjs'; import { getAudioContext } from './audioContext.mjs'; import { SuperdoughAudioController } from './superdoughoutput.mjs'; @@ -292,18 +293,6 @@ function getSuperdoughAudioController() { return controller; } -export function getLfo(audioContext, properties = {}) { - // Extract some params we need for deriving other params - const { begin, shape = 0, ...props } = properties; - const lfoprops = { - time: begin, - shape: getModulationShapeInput(shape), - ...props, - }; - - return getWorklet(audioContext, 'lfo-processor', lfoprops); -} - export function connectToDestination(input, channels) { const controller = getSuperdoughAudioController(); controller.output.connectToDestination(input, channels); @@ -445,7 +434,7 @@ function _getTargetParams(nodes, target) { if (!targetNodes) { const keys = Object.keys(nodes); errorLogger( - new Error(`Could not connect to target '${target}' — it does not exist. Available targets: ${keys.join(', ')}`), + `Could not connect to target '${target}' — it does not exist. Available targets: ${keys.join(', ')}`, 'superdough', ); return []; @@ -456,9 +445,7 @@ function _getTargetParams(nodes, target) { if (!targetParam) { const available = _getNodeParams(targetNode); errorLogger( - new Error( - `Could not connect to parameter '${param}' on '${targetName}'. Available parameters: ${available.join(', ')}`, - ), + `Could not connect to parameter '${param}' on '${target}'. Available parameters: ${available.join(', ')}`, 'superdough', ); return; @@ -472,26 +459,27 @@ function connectLFO(idx, params, nodeTracker) { const { rate = 1, sync, cps, target, ...filteredParams } = params; filteredParams['frequency'] = sync !== undefined ? sync / cps : rate; const ac = getAudioContext(); - lfoNode = getLfo(ac, filteredParams); + const lfoNode = getLfo(ac, filteredParams); nodeTracker[`lfo${idx}`] = [lfoNode]; - _getTargetParams(target).forEach(lfoNode.connect); + _getTargetParams(nodeTracker, target).forEach((t) => lfoNode.connect(t)); } function connectEnvelope(idx, params, nodeTracker) { const { target, ...filteredParams } = params; const ac = getAudioContext(); - envNode = getEnvelope(ac, filteredParams); + const envNode = getEnvelope(ac, filteredParams); nodeTracker[`env${idx}`] = [envNode]; - _getTargetParams(nodeTracker, target).forEach(envNode.connect); + _getTargetParams(nodeTracker, target).forEach((t) => envNode.connect(t)); } -function connectSendModulator(params, signal, nodeTracker, pendingConnections) { +function connectSendModulator(params, signal, nodeTracker, chainID) { + const ac = getAudioContext(); const dc = new ConstantSourceNode(ac, { offset: params.dc ?? 0 }); - dc.start(t); + dc.start(params.begin); const offset = new ConstantSourceNode(ac, { offset: params.offset ?? 0 }); - offset.start(t); + offset.start(params.begin); const raw = dc.connect(gainNode(1)); - const modulator = post + const modulator = signal .connect(raw) .connect(gainNode((params.depth ?? 1) / 0.3)) .connect(gainNode(1)); @@ -499,7 +487,7 @@ function connectSendModulator(params, signal, nodeTracker, pendingConnections) { webAudioTimeout( ac, () => { - _getTargetParams(nodeTracker, params.target).forEach(signal.connect); + _getTargetParams(nodeTracker, params.target).forEach((t) => modulator.connect(t)); }, 0, params.begin, @@ -507,12 +495,13 @@ function connectSendModulator(params, signal, nodeTracker, pendingConnections) { webAudioTimeout( ac, () => { - signal.disconnect(); + modulator.disconnect(); delete pendingConnections[params.id][chainID]; }, 0, params.end + 0.05, ); + return modulator; } let activeSoundSources = new Map(); @@ -679,7 +668,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) if (soundHandle) { sourceNode = soundHandle.node; activeSoundSources.set(chainID, new WeakRef(soundHandle)); // allow GC - nodes['source'] = [soundHandle.oscillator]; + nodes['source'] = [soundHandle.source]; } } else { throw new Error(`sound ${s} not found! Is it loaded?`); @@ -761,7 +750,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) hpParams.type = 'highpass'; const hp1 = filt(hpParams); nodes['hpf'] = [hp1]; - chain.push(hp()); + chain.push(hp1); if (ftype === '24db') { const hp2 = filt(hpParams); nodes['hpf'].push(hp1); @@ -791,7 +780,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) const bpParams = pickAndRename(value, bpMap); bpParams.type = 'bandpass'; const bp1 = filt(bpParams); - chain.push(bp()); + chain.push(bp1); if (ftype === '24db') { const bp2 = filt(bpParams); nodes['bpf'].push(bp2); @@ -946,7 +935,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) // finally, now that `nodes` is populated, set up modulators if (value.lfo) { - for (const [params, idx] of Object.entries(value.lfo)) { + for (const [idx, params] of Object.entries(value.lfo)) { connectLFO( idx, { @@ -955,13 +944,12 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) begin: t, end: endWithRelease, }, - 'lfo', nodes, ); } } if (value.env) { - for (const [params, idx] of Object.entries(value.env)) { + for (const [idx, params] of Object.entries(value.env)) { connectEnvelope( idx, { @@ -969,7 +957,6 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) begin: t, end: endWithRelease, }, - 'envelope', nodes, ); } @@ -978,22 +965,27 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) idToNodes[value.id] = new WeakRef(nodes); } if (value.send) { - for (const p of value.env) { + for (const p of value.send) { const modNodes = idToNodes[p.id]; if (!modNodes) { logger( `[superdough] Could not connect to pattern ${p.id} -- make sure a pattern with this name exists. Available targets: ${Object.keys(idToNodes).join(', ')}`, ); } else { - connectSendModulator(params, post); + const modulator = connectSendModulator({ ...p, begin: t, end: endWithRelease }, post, nodes, chainID); pendingConnections[p.id] ??= {}; pendingConnections[p.id][chainID] = new WeakRef([modulator, p.target, endWithRelease]); } } } if (value.id in pendingConnections) { - for (const data of Object.values(pendingConnections[id])) { - const [modulator, target, end] = data.deref(); + for (const data of Object.values(pendingConnections[value.id])) { + const derefData = data.deref(); + if (!derefData) { + delete pendingConnections[value.id]; + continue; + } + const [modulator, target, end] = derefData; const targets = _getTargetParams(nodes, target); webAudioTimeout( ac, diff --git a/packages/superdough/synth.mjs b/packages/superdough/synth.mjs index ef57ece38..1b88a1e81 100644 --- a/packages/superdough/synth.mjs +++ b/packages/superdough/synth.mjs @@ -71,7 +71,7 @@ export function registerSynthSounds() { stop(envEnd); return { node, - oscillator: o, + source: o, stop: (endTime) => { stop(endTime); }, @@ -141,7 +141,7 @@ export function registerSynthSounds() { return { node, - oscillator: o, + source: o, stop: (endTime) => { o.stop(endTime); }, @@ -208,7 +208,7 @@ export function registerSynthSounds() { return { node: envGain, - oscillator: o, + source: o, stop: (time) => { timeoutNode.stop(time); }, @@ -285,7 +285,7 @@ export function registerSynthSounds() { return { node: envGain, - oscillator: o, + source: o, stop: (time) => { timeoutNode.stop(time); }, @@ -363,7 +363,7 @@ export function registerSynthSounds() { return { node: envGain, - oscillator: o, + source: o, stop: (time) => { timeoutNode.stop(time); }, @@ -409,7 +409,7 @@ export function registerSynthSounds() { stop(envEnd); return { node, - oscillator: o, + source: o, stop: (endTime) => { stop(endTime); }, @@ -503,7 +503,7 @@ export function getOscillator(s, t, value) { return { node: noiseMix?.node || o, - oscillator: o, + source: o, stop: (time) => { fmModulator.stop(time); vibratoOscillator?.stop(time); diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index a098929b2..cf8d61baf 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -964,7 +964,7 @@ class EnvelopeProcessor extends AudioWorkletProcessor { { name: 'attackCurve', defaultValue: 0, minValue: -1, maxValue: 1 }, { name: 'decayCurve', defaultValue: 0, minValue: -1, maxValue: 1 }, { name: 'releaseCurve', defaultValue: 0, minValue: -1, maxValue: 1 }, - { name: 'peak', defaultValue: 1 }, + { name: 'depth', defaultValue: 1 }, { name: 'retrigger', defaultValue: 1, minValue: 0, maxValue: 1 }, ]; } @@ -1026,7 +1026,7 @@ class EnvelopeProcessor extends AudioWorkletProcessor { const aCurve = pv(params.attackCurve, i); const dCurve = pv(params.decayCurve, i); const rCurve = pv(params.releaseCurve, i); - const peak = pv(params.peak, i); + const depth = pv(params.depth, i); const states = [ { time: Number.POSITIVE_INFINITY, start: 0, target: 0 }, // idle { time: attack, start: this.attackStart, target: 1, curve: aCurve }, @@ -1040,7 +1040,7 @@ class EnvelopeProcessor extends AudioWorkletProcessor { this.state = (this.state + 1) % states.length; time = states[this.state].time; } - out[i] = this.val * peak; + out[i] = this.val * depth; } return true; } diff --git a/packages/superdough/zzfx.mjs b/packages/superdough/zzfx.mjs index 32db0395a..c99b8b9ca 100644 --- a/packages/superdough/zzfx.mjs +++ b/packages/superdough/zzfx.mjs @@ -74,6 +74,7 @@ export const getZZFX = (value, t) => { source.start(t); return { node: source, + source, }; }; From c3ad0d1789d526e006e0d401ad9319ad6f186def Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 19 Nov 2025 20:01:17 -0600 Subject: [PATCH 150/312] Fix for curve params --- packages/superdough/superdough.mjs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index b2017a9d0..2fd74e09a 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -465,9 +465,14 @@ function connectLFO(idx, params, nodeTracker) { } function connectEnvelope(idx, params, nodeTracker) { - const { target, ...filteredParams } = params; + const { target, acurve, dcurve, rcurve, ...filteredParams } = params; const ac = getAudioContext(); - const envNode = getEnvelope(ac, filteredParams); + const envNode = getEnvelope(ac, { + ...filteredParams, + attackCurve: acurve, + decayCurve: dcurve, + releaseCurve: rcurve, + }); nodeTracker[`env${idx}`] = [envNode]; _getTargetParams(nodeTracker, target).forEach((t) => envNode.connect(t)); } From 3e118ce0a88caabce0d8cdacf7cac7e25b1eedfd Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 19 Nov 2025 20:11:02 -0600 Subject: [PATCH 151/312] Fully working version --- packages/superdough/superdough.mjs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 2fd74e09a..c005cae99 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -971,13 +971,14 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) } if (value.send) { for (const p of value.send) { - const modNodes = idToNodes[p.id]; + const modNodes = idToNodes[p.id].deref(); if (!modNodes) { logger( `[superdough] Could not connect to pattern ${p.id} -- make sure a pattern with this name exists. Available targets: ${Object.keys(idToNodes).join(', ')}`, ); + delete idToNodes[p.id]; } else { - const modulator = connectSendModulator({ ...p, begin: t, end: endWithRelease }, post, nodes, chainID); + const modulator = connectSendModulator({ ...p, begin: t, end: endWithRelease }, post, modNodes, chainID); pendingConnections[p.id] ??= {}; pendingConnections[p.id][chainID] = new WeakRef([modulator, p.target, endWithRelease]); } From 2794541dadaccfa828aa0f8c8ce27b29e802c8dd Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 19 Nov 2025 20:52:51 -0600 Subject: [PATCH 152/312] Clean up send nodes and remove offset --- packages/core/pattern.mjs | 2 - packages/superdough/superdough.mjs | 21 ++-- test/__snapshots__/examples.test.mjs.snap | 111 ---------------------- 3 files changed, 11 insertions(+), 123 deletions(-) diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index a15ee42e4..ecca31af8 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -3728,7 +3728,6 @@ addConfigAlias('send', 'id'); addConfigAlias('send', 'target', 't'); addConfigAlias('send', 'depth', 'dep', 'dp', 'd'); addConfigAlias('send', 'dc'); -addConfigAlias('send', 'offset', 'off', 'o'); Pattern.prototype.modulate = function (type, config, idx) { if (config == null || typeof config !== 'object') { @@ -3815,7 +3814,6 @@ export const env = (config) => pure({}).env(config); * @param {string | Pattern} [config.target] Node (and parameter if specified like `lpf.frequency`) to modulate. Aliases: target, t * @param {number | Pattern} [config.depth] Modulation depth. Aliases:dep, dp, d * @param {number | Pattern} [config.dc] DC offset prior to application - * @param {number | Pattern} [config.offset] Offset to apply to the parameter. Aliases: off, o * @param {number | null} idx Index of the send slot to overwrite. Omit to append a new send * @returns Pattern */ diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index c005cae99..0c3e9a719 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -481,14 +481,9 @@ function connectSendModulator(params, signal, nodeTracker, chainID) { const ac = getAudioContext(); const dc = new ConstantSourceNode(ac, { offset: params.dc ?? 0 }); dc.start(params.begin); - const offset = new ConstantSourceNode(ac, { offset: params.offset ?? 0 }); - offset.start(params.begin); - const raw = dc.connect(gainNode(1)); - const modulator = signal - .connect(raw) - .connect(gainNode((params.depth ?? 1) / 0.3)) - .connect(gainNode(1)); - offset.connect(modulator); + const shifted = dc.connect(gainNode(1)); + signal.connect(shifted); + const modulator = shifted.connect(gainNode((params.depth ?? 1) / 0.3)); webAudioTimeout( ac, () => { @@ -506,7 +501,7 @@ function connectSendModulator(params, signal, nodeTracker, chainID) { 0, params.end + 0.05, ); - return modulator; + return { modulator, nodes: [dc, shifted, modulator] }; } let activeSoundSources = new Map(); @@ -978,7 +973,13 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) ); delete idToNodes[p.id]; } else { - const modulator = connectSendModulator({ ...p, begin: t, end: endWithRelease }, post, modNodes, chainID); + const { modulator, nodes: nodesToCleanup } = connectSendModulator( + { ...p, begin: t, end: endWithRelease }, + post, + modNodes, + chainID, + ); + audioNodes = audioNodes.concat(nodesToCleanup); pendingConnections[p.id] ??= {}; pendingConnections[p.id][chainID] = new WeakRef([modulator, p.target, endWithRelease]); } diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index d0a0153ba..32e61c31d 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -3656,117 +3656,6 @@ exports[`runs examples > example "end" example index 0 1`] = ` ] `; -exports[`runs examples > example "envCurve" example index 0 1`] = ` -[ - "[ 0/1 → 1/8 | note:F#3 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", - "[ 1/8 → 1/4 | note:G#4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", - "[ 1/4 → 3/8 | note:C#4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", - "[ 3/8 → 1/2 | note:C#4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", - "[ 1/2 → 5/8 | note:B3 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", - "[ 5/8 → 3/4 | note:G#3 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", - "[ 3/4 → 7/8 | note:A3 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", - "[ 7/8 → 1/1 | note:C#4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", - "[ 1/1 → 9/8 | note:E4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", - "[ 9/8 → 5/4 | note:G#4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", - "[ 5/4 → 11/8 | note:G#4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", - "[ 11/8 → 3/2 | note:A3 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", - "[ 3/2 → 13/8 | note:F#4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", - "[ 13/8 → 7/4 | note:D4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", - "[ 7/4 → 15/8 | note:A3 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", - "[ 15/8 → 2/1 | note:F#4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", - "[ 2/1 → 17/8 | note:C#5 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", - "[ 17/8 → 9/4 | note:B4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", - "[ 9/4 → 19/8 | note:C#4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", - "[ 19/8 → 5/2 | note:B4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", - "[ 5/2 → 21/8 | note:D4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", - "[ 21/8 → 11/4 | note:G#3 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", - "[ 11/4 → 23/8 | note:F#4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", - "[ 23/8 → 3/1 | note:F#3 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", - "[ 3/1 → 25/8 | note:A3 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", - "[ 25/8 → 13/4 | note:C#4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", - "[ 13/4 → 27/8 | note:C#5 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", - "[ 27/8 → 7/2 | note:C#4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", - "[ 7/2 → 29/8 | note:C#4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", - "[ 29/8 → 15/4 | note:C#5 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", - "[ 15/4 → 31/8 | note:A4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", - "[ 31/8 → 4/1 | note:G#4 room:1 cutoff:100 release:2 envTarget:[source lpf] envParam:[detune frequency] envDepth:[500 4000] envDecay:[0.3 0.15] envCurve:[lin exp] ]", -] -`; - -exports[`runs examples > example "envDepth" example index 0 1`] = ` -[ - "[ 0/1 → 1/8 | note:F#3 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", - "[ 1/8 → 1/4 | note:G#4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", - "[ 1/4 → 3/8 | note:C#4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", - "[ 3/8 → 1/2 | note:C#4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", - "[ 1/2 → 5/8 | note:B3 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", - "[ 5/8 → 3/4 | note:G#3 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", - "[ 3/4 → 7/8 | note:A3 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", - "[ 7/8 → 1/1 | note:C#4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", - "[ 1/1 → 9/8 | note:E4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", - "[ 9/8 → 5/4 | note:G#4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", - "[ 5/4 → 11/8 | note:G#4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", - "[ 11/8 → 3/2 | note:A3 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", - "[ 3/2 → 13/8 | note:F#4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", - "[ 13/8 → 7/4 | note:D4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", - "[ 7/4 → 15/8 | note:A3 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", - "[ 15/8 → 2/1 | note:F#4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", - "[ 2/1 → 17/8 | note:C#5 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", - "[ 17/8 → 9/4 | note:B4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", - "[ 9/4 → 19/8 | note:C#4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", - "[ 19/8 → 5/2 | note:B4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", - "[ 5/2 → 21/8 | note:D4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", - "[ 21/8 → 11/4 | note:G#3 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", - "[ 11/4 → 23/8 | note:F#4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", - "[ 23/8 → 3/1 | note:F#3 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", - "[ 3/1 → 25/8 | note:A3 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", - "[ 25/8 → 13/4 | note:C#4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", - "[ 13/4 → 27/8 | note:C#5 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", - "[ 27/8 → 7/2 | note:C#4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", - "[ 7/2 → 29/8 | note:C#4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", - "[ 29/8 → 15/4 | note:C#5 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", - "[ 15/4 → 31/8 | note:A4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", - "[ 31/8 → 4/1 | note:G#4 room:1 cutoff:100 envTarget:[source lpf] envParam:[detune frequency] envDepth:[4800 400] ]", -] -`; - -exports[`runs examples > example "envRelease" example index 0 1`] = ` -[ - "[ 0/1 → 1/8 | note:F#3 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", - "[ 1/8 → 1/4 | note:G#4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", - "[ 1/4 → 3/8 | note:C#4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", - "[ 3/8 → 1/2 | note:C#4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", - "[ 1/2 → 5/8 | note:B3 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", - "[ 5/8 → 3/4 | note:G#3 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", - "[ 3/4 → 7/8 | note:A3 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", - "[ 7/8 → 1/1 | note:C#4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", - "[ 1/1 → 9/8 | note:E4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", - "[ 9/8 → 5/4 | note:G#4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", - "[ 5/4 → 11/8 | note:G#4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", - "[ 11/8 → 3/2 | note:A3 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", - "[ 3/2 → 13/8 | note:F#4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", - "[ 13/8 → 7/4 | note:D4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", - "[ 7/4 → 15/8 | note:A3 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", - "[ 15/8 → 2/1 | note:F#4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", - "[ 2/1 → 17/8 | note:C#5 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", - "[ 17/8 → 9/4 | note:B4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", - "[ 9/4 → 19/8 | note:C#4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", - "[ 19/8 → 5/2 | note:B4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", - "[ 5/2 → 21/8 | note:D4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", - "[ 21/8 → 11/4 | note:G#3 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", - "[ 11/4 → 23/8 | note:F#4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", - "[ 23/8 → 3/1 | note:F#3 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", - "[ 3/1 → 25/8 | note:A3 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", - "[ 25/8 → 13/4 | note:C#4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", - "[ 13/4 → 27/8 | note:C#5 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", - "[ 27/8 → 7/2 | note:C#4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", - "[ 7/2 → 29/8 | note:C#4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", - "[ 29/8 → 15/4 | note:C#5 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", - "[ 15/4 → 31/8 | note:A4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", - "[ 31/8 → 4/1 | note:G#4 room:1 cutoff:100 release:3 envDepth:[4800 400] envTarget:[source lpf] envParam:[detune frequency] envDecay:[0.03 0.15] envCurve:[exp exp] envSustain:0.5 envRelease:3 ]", -] -`; - exports[`runs examples > example "euclid" example index 0 1`] = ` [ "[ 0/1 → 1/8 | note:c3 ]", From 8ed72b4573503890d04fffafee50e1f28cca9990 Mon Sep 17 00:00:00 2001 From: jeromew Date: Thu, 20 Nov 2025 13:05:41 +0000 Subject: [PATCH 153/312] [perf] fix `connect-leak` in `delay` effect --- packages/superdough/superdough.mjs | 3 ++- packages/superdough/superdoughoutput.mjs | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 65c444120..c548e7396 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -692,7 +692,8 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) // delay if (delay > 0 && delaytime > 0 && delayfeedback > 0) { orbitBus.getDelay(delaytime, delayfeedback, t); - orbitBus.sendDelay(post, delay); + const send = orbitBus.sendDelay(post, delay); + audioNodes.push(send) } // reverb if (room > 0) { diff --git a/packages/superdough/superdoughoutput.mjs b/packages/superdough/superdoughoutput.mjs index a4235efd0..d8ead7d06 100644 --- a/packages/superdough/superdoughoutput.mjs +++ b/packages/superdough/superdoughoutput.mjs @@ -82,7 +82,7 @@ export class Orbit { } sendDelay(node, amount) { - effectSend(node, this.delayNode, amount); + return effectSend(node, this.delayNode, amount); } duck(t, onsettime = 0, attacktime = 0.1, depth = 1) { From d9f63b8dfa28112192ed5b6a2d2cfe7cb41cc41d Mon Sep 17 00:00:00 2001 From: jeromew Date: Sun, 16 Nov 2025 09:23:11 +0000 Subject: [PATCH 154/312] [perf] fix `connect leak` when .noise() is in the mix --- packages/superdough/helpers.mjs | 14 +++++++++++++- packages/superdough/noise.mjs | 3 ++- packages/superdough/synth.mjs | 23 +++++++++++++---------- 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 47161ed61..de64df0e8 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -262,7 +262,15 @@ export function drywet(dry, wet, wetAmount = 0) { let mix = ac.createGain(); dry_gain.connect(mix); wet_gain.connect(mix); - return mix; + return { + node: mix, + onended: () => { + dry_gain.disconnect(mix); + wet_gain.disconnect(mix); + dry.disconnect(dry_gain); + wet.disconnect(wet_gain); + }, + }; } let curves = ['linear', 'exponential']; @@ -297,6 +305,10 @@ export function getVibratoOscillator(param, value, t) { gain.gain.value = vibmod * 100; vibratoOscillator.connect(gain); gain.connect(param); + vibratoOscillator.onended = () => { + gain.disconnect(param); + vibratoOscillator.disconnect(gain); + }; vibratoOscillator.start(t); return vibratoOscillator; } diff --git a/packages/superdough/noise.mjs b/packages/superdough/noise.mjs index 816dd252b..3e41515df 100644 --- a/packages/superdough/noise.mjs +++ b/packages/superdough/noise.mjs @@ -65,8 +65,9 @@ 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(); return { - node: noiseMix, + node: noiseMix.node, stop: (time) => noiseOscillator?.stop(time), }; } diff --git a/packages/superdough/synth.mjs b/packages/superdough/synth.mjs index 10df1776b..2dc9e2be8 100644 --- a/packages/superdough/synth.mjs +++ b/packages/superdough/synth.mjs @@ -48,19 +48,17 @@ export function registerSynthSounds() { [0.001, 0.05, 0.6, 0.01], ); - let sound = getOscillator(s, t, value); - let { node: o, stop, triggerRelease } = sound; - // turn down const g = gainNode(0.3); - const { duration } = value; - - o.onended = () => { - o.disconnect(); + let sound = getOscillator(s, t, value, () => { g.disconnect(); onended(); - }; + }); + + let { node: o, stop, triggerRelease } = sound; + + const { duration } = value; const envGain = gainNode(1); let node = o.connect(g).connect(envGain); @@ -460,7 +458,7 @@ export function waveformN(partials, phases, type) { } // expects one of waveforms as s -export function getOscillator(s, t, value) { +export function getOscillator(s, t, value, onended) { const { duration, noise = 0 } = value; const partials = value.partials ?? value.n; let o; @@ -482,7 +480,6 @@ export function getOscillator(s, t, value) { } // set frequency o.frequency.value = getFrequencyFromValue(value); - o.start(t); let vibratoOscillator = getVibratoOscillator(o.detune, value, t); @@ -495,6 +492,12 @@ export function getOscillator(s, t, value) { noiseMix = getNoiseMix(o, noise, t); } + o.onended = () => { + noiseMix?.node.disconnect(); + onended(); + }; + o.start(t); + return { node: noiseMix?.node || o, stop: (time) => { From 7267990e20ed07c86b95a5c17985461e4f77f8d6 Mon Sep 17 00:00:00 2001 From: jeromew Date: Thu, 20 Nov 2025 13:35:37 +0000 Subject: [PATCH 155/312] Fix codeformat --- packages/superdough/superdough.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index c548e7396..650f9c2ce 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -693,7 +693,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) if (delay > 0 && delaytime > 0 && delayfeedback > 0) { orbitBus.getDelay(delaytime, delayfeedback, t); const send = orbitBus.sendDelay(post, delay); - audioNodes.push(send) + audioNodes.push(send); } // reverb if (room > 0) { From 0435711051ee5d890f15a11b8c2fdd0def231996 Mon Sep 17 00:00:00 2001 From: jeromew Date: Thu, 20 Nov 2025 17:36:00 +0000 Subject: [PATCH 156/312] [perf] fix `connect-leak` added by #1742 when noise() is not used --- packages/superdough/synth.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/superdough/synth.mjs b/packages/superdough/synth.mjs index 2dc9e2be8..768638f04 100644 --- a/packages/superdough/synth.mjs +++ b/packages/superdough/synth.mjs @@ -493,6 +493,7 @@ export function getOscillator(s, t, value, onended) { } o.onended = () => { + o.disconnect(); noiseMix?.node.disconnect(); onended(); }; From 907f03f3bfe35bc4b6695490030e6f4822747629 Mon Sep 17 00:00:00 2001 From: jeromew Date: Thu, 20 Nov 2025 17:40:51 +0000 Subject: [PATCH 157/312] [perf] fix `connect-leak` in fm modulation --- packages/superdough/helpers.mjs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index de64df0e8..58c4aa35e 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -362,9 +362,9 @@ const mod = (freq, range = 1, type = 'sine') => { } osc.start(); - const g = new GainNode(ctx, { gain: range }); + const g = gainNode(range); osc.connect(g); // -range, range - return { node: g, stop: (t) => osc.stop(t) }; + return { node: g, stop: (t) => osc.stop(t), osc: osc }; }; const fm = (frequencyparam, harmonicityRatio, modulationIndex, wave = 'sine') => { const carrfreq = frequencyparam.value; @@ -416,6 +416,11 @@ export function applyFM(param, value, begin) { modulator.connect(envGain); envGain.connect(param); } + fmmod.osc.onended = () => { + envGain.disconnect(); + modulator.disconnect(); + fmmod.osc.disconnect(); + }; } return { stop }; } From a929b36770ba3bdbcd76fc16f82fc89395b6929a Mon Sep 17 00:00:00 2001 From: Aria Date: Thu, 20 Nov 2025 14:06:45 -0600 Subject: [PATCH 158/312] Remove room --- packages/superdough/superdough.mjs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 0c3e9a719..5ebdd230f 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -413,7 +413,6 @@ const targetToParamGuess = { phaser: 'rate', post: 'gain', delay: 'delayTime', - room: 'size', djf: 'value', lfo: 'frequency', env: 'depth', @@ -904,8 +903,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) } roomIR = await loadBuffer(url, ac, ir, 0); } - const reverbNode = orbitBus.getReverb(roomsize, roomfade, roomlp, roomdim, roomIR, irspeed, irbegin); - nodes['room'] = [reverbNode]; + orbitBus.getReverb(roomsize, roomfade, roomlp, roomdim, roomIR, irspeed, irbegin); const reverbSend = orbitBus.sendReverb(post, room); audioNodes.push(reverbSend); } From 4758effdc6386fc6e1e38aeb0445db33a264b126 Mon Sep 17 00:00:00 2001 From: Aria Date: Thu, 20 Nov 2025 18:22:44 -0600 Subject: [PATCH 159/312] Use frac due to negative frequencies from FM --- packages/superdough/worklets.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index 359bc833a..32367b64c 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -532,7 +532,7 @@ class SuperSawOscillatorProcessor extends AudioWorkletProcessor { const freqVoice = applySemitoneDetuneToFrequency(freq, detuner(n)); // We must wrap this here because it is passed into sawblep below which // has domain [0, 1] - const dt = ffrac(freqVoice * INVSR); + const dt = frac(freqVoice * INVSR); this.phase[n] = this.phase[n] ?? Math.random(); const v = waveshapes.sawblep(this.phase[n], dt); From 21543956c6b26f3ae96dcf43f80f377e1a51e755 Mon Sep 17 00:00:00 2001 From: Aria Date: Thu, 20 Nov 2025 18:26:12 -0600 Subject: [PATCH 160/312] Also for wavetable --- packages/superdough/worklets.mjs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index 32367b64c..e60cd223e 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -1338,7 +1338,7 @@ class WavetableOscillatorProcessor extends AudioWorkletProcessor { const tablePos = clamp(pv(parameters.position, i), 0, 1); const idx = tablePos * (this.numFrames - 1); const fIdx = idx | 0; - const frac = idx - fIdx; + const interpT = idx - fIdx; const warpAmount = clamp(pv(parameters.warp, i), 0, 1); const warpMode = pv(parameters.warpMode, i); const phaseRand = clamp(pv(parameters.phaserand, i), 0, 1); @@ -1368,13 +1368,13 @@ class WavetableOscillatorProcessor extends AudioWorkletProcessor { const ph = this._warpPhase(this.phase[n], warpAmount, warpMode); const s0 = this._sampleFrame(table[fIdx], ph); const s1 = this._sampleFrame(table[Math.min(this.numFrames - 1, fIdx + 1)], ph); - let s = s0 + (s1 - s0) * frac; + let s = lerp(s0, s1, interpT); if (warpMode === WarpMode.FLIP && this.phase[n] < warpAmount) { s = -s; } outL[i] += s * gainL * normalizer; outR[i] += s * gainR * normalizer; - this.phase[n] = ffrac(this.phase[n] + dPhase); + this.phase[n] = frac(this.phase[n] + dPhase); } } return true; From f637b8b0dd0c3bbe29c53d128a943b9e6260be9b Mon Sep 17 00:00:00 2001 From: jeromew Date: Thu, 20 Nov 2025 17:40:51 +0000 Subject: [PATCH 161/312] [perf] fix `connect-leak` in fm modulation --- packages/superdough/helpers.mjs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index de64df0e8..58c4aa35e 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -362,9 +362,9 @@ const mod = (freq, range = 1, type = 'sine') => { } osc.start(); - const g = new GainNode(ctx, { gain: range }); + const g = gainNode(range); osc.connect(g); // -range, range - return { node: g, stop: (t) => osc.stop(t) }; + return { node: g, stop: (t) => osc.stop(t), osc: osc }; }; const fm = (frequencyparam, harmonicityRatio, modulationIndex, wave = 'sine') => { const carrfreq = frequencyparam.value; @@ -416,6 +416,11 @@ export function applyFM(param, value, begin) { modulator.connect(envGain); envGain.connect(param); } + fmmod.osc.onended = () => { + envGain.disconnect(); + modulator.disconnect(); + fmmod.osc.disconnect(); + }; } return { stop }; } From e72e26eb81a62bcb9a96dedfa05fb82fac857cca Mon Sep 17 00:00:00 2001 From: "Jade (Rose) Rowland" Date: Sat, 22 Nov 2025 17:11:17 -0500 Subject: [PATCH 162/312] add comment --- packages/core/repl.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/core/repl.mjs b/packages/core/repl.mjs index 6e3d97c92..bcb70eec9 100644 --- a/packages/core/repl.mjs +++ b/packages/core/repl.mjs @@ -217,6 +217,7 @@ export function repl({ let patterns = []; let soloActive = false; for (const [key, value] of Object.entries(pPatterns)) { + // handle soloed patterns ex: S$: s("bd!4") const isSolod = key.length > 1 && key.startsWith('S'); if (isSolod && soloActive === false) { // first time we see a soloed pattern, clear existing patterns From 19fd0fc649ba8b92271facd3ae9e9e5ac01ebd2c Mon Sep 17 00:00:00 2001 From: "Jade (Rose) Rowland" Date: Sat, 22 Nov 2025 17:17:41 -0500 Subject: [PATCH 163/312] rm unessecary file --- packages/draw/text.mjs | 144 ----------------------------------------- 1 file changed, 144 deletions(-) delete mode 100644 packages/draw/text.mjs diff --git a/packages/draw/text.mjs b/packages/draw/text.mjs deleted file mode 100644 index ba76df079..000000000 --- a/packages/draw/text.mjs +++ /dev/null @@ -1,144 +0,0 @@ -import { Pattern, midiToFreq, getFrequency } from '@strudel/core'; -import { getTheme, getDrawContext } from './draw.mjs'; - -const c = midiToFreq(36); - -const circlePos = (cx, cy, radius, angle) => { - angle = angle * Math.PI * 2; - const x = Math.sin(angle) * radius + cx; - const y = Math.cos(angle) * radius + cy; - return [x, y]; -}; - -const freq2angle = (freq, root) => { - return 0.5 - (Math.log2(freq / root) % 1); -}; - -export function pitchwheel({ - haps, - ctx, - id, - hapcircles = 1, - circle = 0, - edo = 12, - root = c, - thickness = 3, - hapRadius = 6, - mode = 'flake', - margin = 10, -} = {}) { - const connectdots = mode === 'polygon'; - const centerlines = mode === 'flake'; - const w = ctx.canvas.width; - const h = ctx.canvas.height; - ctx.clearRect(0, 0, w, h); - const color = getTheme().foreground; - - const size = Math.min(w, h); - const radius = size / 2 - thickness / 2 - hapRadius - margin; - const centerX = w / 2; - const centerY = h / 2; - - if (id) { - haps = haps.filter((hap) => hap.hasTag(id)); - } - ctx.strokeStyle = color; - ctx.fillStyle = color; - ctx.globalAlpha = 1; - ctx.lineWidth = thickness; - - if (circle) { - ctx.beginPath(); - ctx.arc(centerX, centerY, radius, 0, 2 * Math.PI); - ctx.stroke(); - } - - if (edo) { - Array.from({ length: edo }, (_, i) => { - const angle = freq2angle(root * Math.pow(2, i / edo), root); - const [x, y] = circlePos(centerX, centerY, radius, angle); - ctx.beginPath(); - ctx.arc(x, y, hapRadius, 0, 2 * Math.PI); - ctx.fill(); - }); - ctx.stroke(); - } - - let shape = []; - ctx.lineWidth = hapRadius; - haps.forEach((hap) => { - let freq; - try { - freq = getFrequency(hap); - } catch (err) { - return; - } - const angle = freq2angle(freq, root); - const [x, y] = circlePos(centerX, centerY, radius, angle); - const hapColor = hap.value.color || color; - ctx.strokeStyle = hapColor; - ctx.fillStyle = hapColor; - const { velocity = 1, gain = 1 } = hap.value || {}; - const alpha = velocity * gain; - ctx.globalAlpha = alpha; - shape.push([x, y, angle, hapColor, alpha]); - ctx.beginPath(); - if (hapcircles) { - ctx.moveTo(x + hapRadius, y); - ctx.arc(x, y, hapRadius, 0, 2 * Math.PI); - ctx.fill(); - } - if (centerlines) { - ctx.moveTo(centerX, centerY); - ctx.lineTo(x, y); - } - ctx.stroke(); - }); - - ctx.strokeStyle = color; - ctx.globalAlpha = 1; - if (connectdots && shape.length) { - shape = shape.sort((a, b) => a[2] - b[2]); - ctx.beginPath(); - ctx.moveTo(shape[0][0], shape[0][1]); - shape.forEach(([x, y, _, color, alpha]) => { - ctx.strokeStyle = color; - ctx.globalAlpha = alpha; - ctx.lineTo(x, y); - }); - ctx.lineTo(shape[0][0], shape[0][1]); - ctx.stroke(); - } - - return; -} - -/** - * Renders a pitch circle to visualize frequencies within one octave - * @name pitchwheel - * @param {number} hapcircles - * @param {number} circle - * @param {number} edo - * @param {string} root - * @param {number} thickness - * @param {number} hapRadius - * @param {string} mode - * @param {number} margin - * @example - * n("0 .. 12").scale("C:chromatic") - * .s("sawtooth") - * .lpf(500) - * ._pitchwheel() - */ -Pattern.prototype.pitchwheel = function (options = {}) { - let { ctx = getDrawContext(), id = 1 } = options; - return this.tag(id).onPaint((_, time, haps) => - pitchwheel({ - ...options, - time, - ctx, - haps: haps.filter((hap) => hap.isActive(time)), - id, - }), - ); -}; From 2efd56e33155096dd4454f9fe68e6b5f43bdc1e1 Mon Sep 17 00:00:00 2001 From: "Jade (Rose) Rowland" Date: Sat, 22 Nov 2025 18:10:28 -0500 Subject: [PATCH 164/312] add synonym --- packages/core/controls.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 9a2be7f44..8297746dc 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -1840,7 +1840,7 @@ export const { octave } = registerControl('octave'); * s("~ sd ~ sd").delay(.5).delaytime(.125).orbit(2) * ) */ -export const { orbit } = registerControl('orbit'); +export const { orbit } = registerControl('orbit', 'o'); // TODO: what is this? not found in tidal doc Answer: gain is limited to maximum of 2. This allows you to go over that export const { overgain } = registerControl('overgain'); // TODO: what is this? not found in tidal doc. Similar to above, but limited to 1 From 1d5f3a4f30c415b53ea1b0a5d88d31d318725631 Mon Sep 17 00:00:00 2001 From: "Jade (Rose) Rowland" Date: Sat, 22 Nov 2025 18:21:24 -0500 Subject: [PATCH 165/312] prevent filter modulation pops --- 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 de64df0e8..8e45f7bca 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -238,7 +238,7 @@ export function createFilter(context, start, end, params, cps) { if (sync != null) { rate = cps * sync; } - const lfoValues = { depth, dcoffset, skew, shape, frequency: rate }; + const lfoValues = { depth, dcoffset, skew, shape, frequency: rate, min: 10, max: 20000 }; getParamLfo(context, frequencyParam, start, end, lfoValues); return filter; } From adc3a9ac6cb780c653c843c5c296c5fbb8f106b0 Mon Sep 17 00:00:00 2001 From: Aria Date: Sat, 22 Nov 2025 20:51:30 -0600 Subject: [PATCH 166/312] Swap with temp variable --- packages/superdough/worklets.mjs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index e60cd223e..bf633a63b 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -543,8 +543,9 @@ class SuperSawOscillatorProcessor extends AudioWorkletProcessor { if (pn >= 1.0) pn -= 1.0; this.phase[n] = pn; // invert right and left gain + const tmp = gainL; gainL = gainR; - gainR = gainL; + gainR = tmp; } } return true; From 30e672a0271bf3233859230ef96cfe8b9cecc1cd Mon Sep 17 00:00:00 2001 From: "Jade (Rose) Rowland" Date: Sat, 22 Nov 2025 22:49:23 -0500 Subject: [PATCH 167/312] wip --- packages/superdough/helpers.mjs | 27 ++++++++++++++++++++++----- packages/superdough/superdough.mjs | 2 +- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 8e45f7bca..7bca637f2 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -191,8 +191,10 @@ export function applyParameterModulators(audioContext, param, start, end, envelo const lfo = getParamLfo(audioContext, param, start, end, lfoValues); return { lfo, disconnect: () => lfo?.disconnect() }; } - -export function createFilter(context, start, end, params, cps) { +function biloparExponential(x, k) { + return Math.sign(x) * 2 ** (Math.abs(x) * k); +} +export function createFilter(context, start, end, params, cps, cycle) { let { frequency, anchor, @@ -231,6 +233,7 @@ export function createFilter(context, start, end, params, cps) { const offset = envAbs * anchor; let min = clamp(2 ** -offset * frequency, 0, 20000); let max = clamp(2 ** (envAbs - offset) * frequency, 0, 20000); + if (env < 0) [min, max] = [max, min]; getParamADSR(frequencyParam, attack, decay, sustain, release, min, max, start, end, 'exponential'); } @@ -238,8 +241,22 @@ export function createFilter(context, start, end, params, cps) { if (sync != null) { rate = cps * sync; } - const lfoValues = { depth, dcoffset, skew, shape, frequency: rate, min: 10, max: 20000 }; - getParamLfo(context, frequencyParam, start, end, lfoValues); + const hasLFO = [depth, skew, shape, rate].some((v) => v !== undefined); + if (hasLFO) { + depth = depth ?? 1 + + const mag = Math.abs(depth); + const sign = Math.sign(depth); + + const shaped = 2 ** (mag * (1 - dcoffset)); + const dp = clamp((sign * shaped * frequency) - frequency, -20000, 20000); + console.info(dp) + const time = cycle / cps; + // let d = 2 ** -dcoffset + const lfoValues = { depth: dp, dcoffset, skew, shape, frequency: rate, min: 10, max: 20000, time }; + getParamLfo(context, frequencyParam, start, end, lfoValues); + } + return filter; } @@ -386,7 +403,7 @@ export function applyFM(param, value, begin) { duration, } = value; let modulator; - let stop = () => {}; + let stop = () => { }; if (fmModulationIndex) { const ac = getAudioContext(); diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 650f9c2ce..4e1a145c0 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -559,7 +559,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) }; const lpParams = pickAndRename(value, lpMap); lpParams.type = 'lowpass'; - let lp = () => createFilter(ac, t, end, lpParams, cps); + let lp = () => createFilter(ac, t, end, lpParams, cps, cycle); chain.push(lp()); if (ftype === '24db') { chain.push(lp()); From 7bbb653963ace62fdf7f5aba33600da576927d02 Mon Sep 17 00:00:00 2001 From: "Jade (Rose) Rowland" Date: Sat, 22 Nov 2025 23:42:20 -0500 Subject: [PATCH 168/312] fixed --- packages/core/controls.mjs | 7 +++++++ packages/superdough/helpers.mjs | 28 +++++++++++++--------------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 9a2be7f44..299169973 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -1294,6 +1294,8 @@ export const { fanchor } = registerControl('fanchor'); * * @name lprate * @param {number | Pattern} rate rate in hertz + * @example + * note("*16").s("sawtooth").lpf(600).lprate("<4 8 2 1>") */ export const { lprate } = registerControl('lprate'); @@ -1302,6 +1304,8 @@ export const { lprate } = registerControl('lprate'); * * @name lpsync * @param {number | Pattern} rate rate in cycles + * @example + * note("*16").s("sawtooth").lpf(600).lpsync("<4 8 2 1>") */ export const { lpsync } = registerControl('lpsync'); @@ -1310,7 +1314,10 @@ export const { lpsync } = registerControl('lpsync'); * * @name lpdepth * @param {number | Pattern} depth depth of modulation + * @example + * note("*16").s("sawtooth").lpf(600).lpdepth("<1 .5 1.8 0>") */ + export const { lpdepth } = registerControl('lpdepth'); /** diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 7bca637f2..65f5cc36d 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -191,9 +191,6 @@ export function applyParameterModulators(audioContext, param, start, end, envelo const lfo = getParamLfo(audioContext, param, start, end, lfoValues); return { lfo, disconnect: () => lfo?.disconnect() }; } -function biloparExponential(x, k) { - return Math.sign(x) * 2 ** (Math.abs(x) * k); -} export function createFilter(context, start, end, params, cps, cycle) { let { frequency, @@ -233,7 +230,6 @@ export function createFilter(context, start, end, params, cps, cycle) { const offset = envAbs * anchor; let min = clamp(2 ** -offset * frequency, 0, 20000); let max = clamp(2 ** (envAbs - offset) * frequency, 0, 20000); - if (env < 0) [min, max] = [max, min]; getParamADSR(frequencyParam, attack, decay, sustain, release, min, max, start, end, 'exponential'); } @@ -243,17 +239,19 @@ export function createFilter(context, start, end, params, cps, cycle) { } const hasLFO = [depth, skew, shape, rate].some((v) => v !== undefined); if (hasLFO) { - depth = depth ?? 1 - - const mag = Math.abs(depth); - const sign = Math.sign(depth); - - const shaped = 2 ** (mag * (1 - dcoffset)); - const dp = clamp((sign * shaped * frequency) - frequency, -20000, 20000); - console.info(dp) + depth = depth ?? 1; const time = cycle / cps; - // let d = 2 ** -dcoffset - const lfoValues = { depth: dp, dcoffset, skew, shape, frequency: rate, min: 10, max: 20000, time }; + const lfoValues = { + depth: (depth ?? 1) * frequency, + dcoffset, + skew, + shape, + frequency: rate ?? cps, + min: -frequency + 30, + max: 20000 - frequency, + time, + curve: 1, + }; getParamLfo(context, frequencyParam, start, end, lfoValues); } @@ -403,7 +401,7 @@ export function applyFM(param, value, begin) { duration, } = value; let modulator; - let stop = () => { }; + let stop = () => {}; if (fmModulationIndex) { const ac = getAudioContext(); From bde17594ceae18ed4a483715932b124638b62d72 Mon Sep 17 00:00:00 2001 From: "Jade (Rose) Rowland" Date: Sun, 23 Nov 2025 00:33:52 -0500 Subject: [PATCH 169/312] test --- test/__snapshots__/examples.test.mjs.snap | 207 ++++++++++++++++++++++ 1 file changed, 207 insertions(+) diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 31e4bddd3..4345eedbf 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -5969,6 +5969,75 @@ exports[`runs examples > example "lpdecay" example index 0 1`] = ` ] `; +exports[`runs examples > example "lpdepth" example index 0 1`] = ` +[ + "[ 0/1 → 1/16 | note:c s:sawtooth cutoff:600 lpdepth:1 ]", + "[ 1/16 → 1/8 | note:c s:sawtooth cutoff:600 lpdepth:1 ]", + "[ 1/8 → 3/16 | note:c# s:sawtooth cutoff:600 lpdepth:1 ]", + "[ 3/16 → 1/4 | note:c s:sawtooth cutoff:600 lpdepth:1 ]", + "[ 1/4 → 5/16 | note:c s:sawtooth cutoff:600 lpdepth:1 ]", + "[ 5/16 → 3/8 | note:c4 s:sawtooth cutoff:600 lpdepth:1 ]", + "[ 3/8 → 7/16 | note:c s:sawtooth cutoff:600 lpdepth:1 ]", + "[ 7/16 → 1/2 | note:c s:sawtooth cutoff:600 lpdepth:1 ]", + "[ 1/2 → 9/16 | note:c# s:sawtooth cutoff:600 lpdepth:1 ]", + "[ 9/16 → 5/8 | note:c s:sawtooth cutoff:600 lpdepth:1 ]", + "[ 5/8 → 11/16 | note:c s:sawtooth cutoff:600 lpdepth:1 ]", + "[ 11/16 → 3/4 | note:c4 s:sawtooth cutoff:600 lpdepth:1 ]", + "[ 3/4 → 13/16 | note:c s:sawtooth cutoff:600 lpdepth:1 ]", + "[ 13/16 → 7/8 | note:c s:sawtooth cutoff:600 lpdepth:1 ]", + "[ 7/8 → 15/16 | note:c# s:sawtooth cutoff:600 lpdepth:1 ]", + "[ 15/16 → 1/1 | note:c s:sawtooth cutoff:600 lpdepth:1 ]", + "[ 1/1 → 17/16 | note:c s:sawtooth cutoff:600 lpdepth:0.5 ]", + "[ 17/16 → 9/8 | note:c4 s:sawtooth cutoff:600 lpdepth:0.5 ]", + "[ 9/8 → 19/16 | note:c s:sawtooth cutoff:600 lpdepth:0.5 ]", + "[ 19/16 → 5/4 | note:c s:sawtooth cutoff:600 lpdepth:0.5 ]", + "[ 5/4 → 21/16 | note:c# s:sawtooth cutoff:600 lpdepth:0.5 ]", + "[ 21/16 → 11/8 | note:c s:sawtooth cutoff:600 lpdepth:0.5 ]", + "[ 11/8 → 23/16 | note:c s:sawtooth cutoff:600 lpdepth:0.5 ]", + "[ 23/16 → 3/2 | note:c4 s:sawtooth cutoff:600 lpdepth:0.5 ]", + "[ 3/2 → 25/16 | note:c s:sawtooth cutoff:600 lpdepth:0.5 ]", + "[ 25/16 → 13/8 | note:c s:sawtooth cutoff:600 lpdepth:0.5 ]", + "[ 13/8 → 27/16 | note:c# s:sawtooth cutoff:600 lpdepth:0.5 ]", + "[ 27/16 → 7/4 | note:c s:sawtooth cutoff:600 lpdepth:0.5 ]", + "[ 7/4 → 29/16 | note:c s:sawtooth cutoff:600 lpdepth:0.5 ]", + "[ 29/16 → 15/8 | note:c4 s:sawtooth cutoff:600 lpdepth:0.5 ]", + "[ 15/8 → 31/16 | note:c s:sawtooth cutoff:600 lpdepth:0.5 ]", + "[ 31/16 → 2/1 | note:c s:sawtooth cutoff:600 lpdepth:0.5 ]", + "[ 2/1 → 33/16 | note:c# s:sawtooth cutoff:600 lpdepth:1.8 ]", + "[ 33/16 → 17/8 | note:c s:sawtooth cutoff:600 lpdepth:1.8 ]", + "[ 17/8 → 35/16 | note:c s:sawtooth cutoff:600 lpdepth:1.8 ]", + "[ 35/16 → 9/4 | note:c4 s:sawtooth cutoff:600 lpdepth:1.8 ]", + "[ 9/4 → 37/16 | note:c s:sawtooth cutoff:600 lpdepth:1.8 ]", + "[ 37/16 → 19/8 | note:c s:sawtooth cutoff:600 lpdepth:1.8 ]", + "[ 19/8 → 39/16 | note:c# s:sawtooth cutoff:600 lpdepth:1.8 ]", + "[ 39/16 → 5/2 | note:c s:sawtooth cutoff:600 lpdepth:1.8 ]", + "[ 5/2 → 41/16 | note:c s:sawtooth cutoff:600 lpdepth:1.8 ]", + "[ 41/16 → 21/8 | note:c4 s:sawtooth cutoff:600 lpdepth:1.8 ]", + "[ 21/8 → 43/16 | note:c s:sawtooth cutoff:600 lpdepth:1.8 ]", + "[ 43/16 → 11/4 | note:c s:sawtooth cutoff:600 lpdepth:1.8 ]", + "[ 11/4 → 45/16 | note:c# s:sawtooth cutoff:600 lpdepth:1.8 ]", + "[ 45/16 → 23/8 | note:c s:sawtooth cutoff:600 lpdepth:1.8 ]", + "[ 23/8 → 47/16 | note:c s:sawtooth cutoff:600 lpdepth:1.8 ]", + "[ 47/16 → 3/1 | note:c4 s:sawtooth cutoff:600 lpdepth:1.8 ]", + "[ 3/1 → 49/16 | note:c s:sawtooth cutoff:600 lpdepth:0 ]", + "[ 49/16 → 25/8 | note:c s:sawtooth cutoff:600 lpdepth:0 ]", + "[ 25/8 → 51/16 | note:c# s:sawtooth cutoff:600 lpdepth:0 ]", + "[ 51/16 → 13/4 | note:c s:sawtooth cutoff:600 lpdepth:0 ]", + "[ 13/4 → 53/16 | note:c s:sawtooth cutoff:600 lpdepth:0 ]", + "[ 53/16 → 27/8 | note:c4 s:sawtooth cutoff:600 lpdepth:0 ]", + "[ 27/8 → 55/16 | note:c s:sawtooth cutoff:600 lpdepth:0 ]", + "[ 55/16 → 7/2 | note:c s:sawtooth cutoff:600 lpdepth:0 ]", + "[ 7/2 → 57/16 | note:c# s:sawtooth cutoff:600 lpdepth:0 ]", + "[ 57/16 → 29/8 | note:c s:sawtooth cutoff:600 lpdepth:0 ]", + "[ 29/8 → 59/16 | note:c s:sawtooth cutoff:600 lpdepth:0 ]", + "[ 59/16 → 15/4 | note:c4 s:sawtooth cutoff:600 lpdepth:0 ]", + "[ 15/4 → 61/16 | note:c s:sawtooth cutoff:600 lpdepth:0 ]", + "[ 61/16 → 31/8 | note:c s:sawtooth cutoff:600 lpdepth:0 ]", + "[ 31/8 → 63/16 | note:c# s:sawtooth cutoff:600 lpdepth:0 ]", + "[ 63/16 → 4/1 | note:c s:sawtooth cutoff:600 lpdepth:0 ]", +] +`; + exports[`runs examples > example "lpenv" example index 0 1`] = ` [ "[ 0/1 → 1/4 | note:c2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]", @@ -6157,6 +6226,75 @@ exports[`runs examples > example "lpq" example index 0 1`] = ` ] `; +exports[`runs examples > example "lprate" example index 0 1`] = ` +[ + "[ 0/1 → 1/16 | note:c s:sawtooth cutoff:600 lprate:4 ]", + "[ 1/16 → 1/8 | note:c s:sawtooth cutoff:600 lprate:4 ]", + "[ 1/8 → 3/16 | note:c# s:sawtooth cutoff:600 lprate:4 ]", + "[ 3/16 → 1/4 | note:c s:sawtooth cutoff:600 lprate:4 ]", + "[ 1/4 → 5/16 | note:c s:sawtooth cutoff:600 lprate:4 ]", + "[ 5/16 → 3/8 | note:c4 s:sawtooth cutoff:600 lprate:4 ]", + "[ 3/8 → 7/16 | note:c s:sawtooth cutoff:600 lprate:4 ]", + "[ 7/16 → 1/2 | note:c s:sawtooth cutoff:600 lprate:4 ]", + "[ 1/2 → 9/16 | note:c# s:sawtooth cutoff:600 lprate:4 ]", + "[ 9/16 → 5/8 | note:c s:sawtooth cutoff:600 lprate:4 ]", + "[ 5/8 → 11/16 | note:c s:sawtooth cutoff:600 lprate:4 ]", + "[ 11/16 → 3/4 | note:c4 s:sawtooth cutoff:600 lprate:4 ]", + "[ 3/4 → 13/16 | note:c s:sawtooth cutoff:600 lprate:4 ]", + "[ 13/16 → 7/8 | note:c s:sawtooth cutoff:600 lprate:4 ]", + "[ 7/8 → 15/16 | note:c# s:sawtooth cutoff:600 lprate:4 ]", + "[ 15/16 → 1/1 | note:c s:sawtooth cutoff:600 lprate:4 ]", + "[ 1/1 → 17/16 | note:c s:sawtooth cutoff:600 lprate:8 ]", + "[ 17/16 → 9/8 | note:c4 s:sawtooth cutoff:600 lprate:8 ]", + "[ 9/8 → 19/16 | note:c s:sawtooth cutoff:600 lprate:8 ]", + "[ 19/16 → 5/4 | note:c s:sawtooth cutoff:600 lprate:8 ]", + "[ 5/4 → 21/16 | note:c# s:sawtooth cutoff:600 lprate:8 ]", + "[ 21/16 → 11/8 | note:c s:sawtooth cutoff:600 lprate:8 ]", + "[ 11/8 → 23/16 | note:c s:sawtooth cutoff:600 lprate:8 ]", + "[ 23/16 → 3/2 | note:c4 s:sawtooth cutoff:600 lprate:8 ]", + "[ 3/2 → 25/16 | note:c s:sawtooth cutoff:600 lprate:8 ]", + "[ 25/16 → 13/8 | note:c s:sawtooth cutoff:600 lprate:8 ]", + "[ 13/8 → 27/16 | note:c# s:sawtooth cutoff:600 lprate:8 ]", + "[ 27/16 → 7/4 | note:c s:sawtooth cutoff:600 lprate:8 ]", + "[ 7/4 → 29/16 | note:c s:sawtooth cutoff:600 lprate:8 ]", + "[ 29/16 → 15/8 | note:c4 s:sawtooth cutoff:600 lprate:8 ]", + "[ 15/8 → 31/16 | note:c s:sawtooth cutoff:600 lprate:8 ]", + "[ 31/16 → 2/1 | note:c s:sawtooth cutoff:600 lprate:8 ]", + "[ 2/1 → 33/16 | note:c# s:sawtooth cutoff:600 lprate:2 ]", + "[ 33/16 → 17/8 | note:c s:sawtooth cutoff:600 lprate:2 ]", + "[ 17/8 → 35/16 | note:c s:sawtooth cutoff:600 lprate:2 ]", + "[ 35/16 → 9/4 | note:c4 s:sawtooth cutoff:600 lprate:2 ]", + "[ 9/4 → 37/16 | note:c s:sawtooth cutoff:600 lprate:2 ]", + "[ 37/16 → 19/8 | note:c s:sawtooth cutoff:600 lprate:2 ]", + "[ 19/8 → 39/16 | note:c# s:sawtooth cutoff:600 lprate:2 ]", + "[ 39/16 → 5/2 | note:c s:sawtooth cutoff:600 lprate:2 ]", + "[ 5/2 → 41/16 | note:c s:sawtooth cutoff:600 lprate:2 ]", + "[ 41/16 → 21/8 | note:c4 s:sawtooth cutoff:600 lprate:2 ]", + "[ 21/8 → 43/16 | note:c s:sawtooth cutoff:600 lprate:2 ]", + "[ 43/16 → 11/4 | note:c s:sawtooth cutoff:600 lprate:2 ]", + "[ 11/4 → 45/16 | note:c# s:sawtooth cutoff:600 lprate:2 ]", + "[ 45/16 → 23/8 | note:c s:sawtooth cutoff:600 lprate:2 ]", + "[ 23/8 → 47/16 | note:c s:sawtooth cutoff:600 lprate:2 ]", + "[ 47/16 → 3/1 | note:c4 s:sawtooth cutoff:600 lprate:2 ]", + "[ 3/1 → 49/16 | note:c s:sawtooth cutoff:600 lprate:1 ]", + "[ 49/16 → 25/8 | note:c s:sawtooth cutoff:600 lprate:1 ]", + "[ 25/8 → 51/16 | note:c# s:sawtooth cutoff:600 lprate:1 ]", + "[ 51/16 → 13/4 | note:c s:sawtooth cutoff:600 lprate:1 ]", + "[ 13/4 → 53/16 | note:c s:sawtooth cutoff:600 lprate:1 ]", + "[ 53/16 → 27/8 | note:c4 s:sawtooth cutoff:600 lprate:1 ]", + "[ 27/8 → 55/16 | note:c s:sawtooth cutoff:600 lprate:1 ]", + "[ 55/16 → 7/2 | note:c s:sawtooth cutoff:600 lprate:1 ]", + "[ 7/2 → 57/16 | note:c# s:sawtooth cutoff:600 lprate:1 ]", + "[ 57/16 → 29/8 | note:c s:sawtooth cutoff:600 lprate:1 ]", + "[ 29/8 → 59/16 | note:c s:sawtooth cutoff:600 lprate:1 ]", + "[ 59/16 → 15/4 | note:c4 s:sawtooth cutoff:600 lprate:1 ]", + "[ 15/4 → 61/16 | note:c s:sawtooth cutoff:600 lprate:1 ]", + "[ 61/16 → 31/8 | note:c s:sawtooth cutoff:600 lprate:1 ]", + "[ 31/8 → 63/16 | note:c# s:sawtooth cutoff:600 lprate:1 ]", + "[ 63/16 → 4/1 | note:c s:sawtooth cutoff:600 lprate:1 ]", +] +`; + exports[`runs examples > example "lprelease" example index 0 1`] = ` [ "[ 0/1 → 1/4 | note:c2 s:sawtooth clip:0.5 cutoff:300 lpenv:4 lprelease:0.5 release:0.5 ]", @@ -6199,6 +6337,75 @@ exports[`runs examples > example "lpsustain" example index 0 1`] = ` ] `; +exports[`runs examples > example "lpsync" example index 0 1`] = ` +[ + "[ 0/1 → 1/16 | note:c s:sawtooth cutoff:600 lpsync:4 ]", + "[ 1/16 → 1/8 | note:c s:sawtooth cutoff:600 lpsync:4 ]", + "[ 1/8 → 3/16 | note:c# s:sawtooth cutoff:600 lpsync:4 ]", + "[ 3/16 → 1/4 | note:c s:sawtooth cutoff:600 lpsync:4 ]", + "[ 1/4 → 5/16 | note:c s:sawtooth cutoff:600 lpsync:4 ]", + "[ 5/16 → 3/8 | note:c4 s:sawtooth cutoff:600 lpsync:4 ]", + "[ 3/8 → 7/16 | note:c s:sawtooth cutoff:600 lpsync:4 ]", + "[ 7/16 → 1/2 | note:c s:sawtooth cutoff:600 lpsync:4 ]", + "[ 1/2 → 9/16 | note:c# s:sawtooth cutoff:600 lpsync:4 ]", + "[ 9/16 → 5/8 | note:c s:sawtooth cutoff:600 lpsync:4 ]", + "[ 5/8 → 11/16 | note:c s:sawtooth cutoff:600 lpsync:4 ]", + "[ 11/16 → 3/4 | note:c4 s:sawtooth cutoff:600 lpsync:4 ]", + "[ 3/4 → 13/16 | note:c s:sawtooth cutoff:600 lpsync:4 ]", + "[ 13/16 → 7/8 | note:c s:sawtooth cutoff:600 lpsync:4 ]", + "[ 7/8 → 15/16 | note:c# s:sawtooth cutoff:600 lpsync:4 ]", + "[ 15/16 → 1/1 | note:c s:sawtooth cutoff:600 lpsync:4 ]", + "[ 1/1 → 17/16 | note:c s:sawtooth cutoff:600 lpsync:8 ]", + "[ 17/16 → 9/8 | note:c4 s:sawtooth cutoff:600 lpsync:8 ]", + "[ 9/8 → 19/16 | note:c s:sawtooth cutoff:600 lpsync:8 ]", + "[ 19/16 → 5/4 | note:c s:sawtooth cutoff:600 lpsync:8 ]", + "[ 5/4 → 21/16 | note:c# s:sawtooth cutoff:600 lpsync:8 ]", + "[ 21/16 → 11/8 | note:c s:sawtooth cutoff:600 lpsync:8 ]", + "[ 11/8 → 23/16 | note:c s:sawtooth cutoff:600 lpsync:8 ]", + "[ 23/16 → 3/2 | note:c4 s:sawtooth cutoff:600 lpsync:8 ]", + "[ 3/2 → 25/16 | note:c s:sawtooth cutoff:600 lpsync:8 ]", + "[ 25/16 → 13/8 | note:c s:sawtooth cutoff:600 lpsync:8 ]", + "[ 13/8 → 27/16 | note:c# s:sawtooth cutoff:600 lpsync:8 ]", + "[ 27/16 → 7/4 | note:c s:sawtooth cutoff:600 lpsync:8 ]", + "[ 7/4 → 29/16 | note:c s:sawtooth cutoff:600 lpsync:8 ]", + "[ 29/16 → 15/8 | note:c4 s:sawtooth cutoff:600 lpsync:8 ]", + "[ 15/8 → 31/16 | note:c s:sawtooth cutoff:600 lpsync:8 ]", + "[ 31/16 → 2/1 | note:c s:sawtooth cutoff:600 lpsync:8 ]", + "[ 2/1 → 33/16 | note:c# s:sawtooth cutoff:600 lpsync:2 ]", + "[ 33/16 → 17/8 | note:c s:sawtooth cutoff:600 lpsync:2 ]", + "[ 17/8 → 35/16 | note:c s:sawtooth cutoff:600 lpsync:2 ]", + "[ 35/16 → 9/4 | note:c4 s:sawtooth cutoff:600 lpsync:2 ]", + "[ 9/4 → 37/16 | note:c s:sawtooth cutoff:600 lpsync:2 ]", + "[ 37/16 → 19/8 | note:c s:sawtooth cutoff:600 lpsync:2 ]", + "[ 19/8 → 39/16 | note:c# s:sawtooth cutoff:600 lpsync:2 ]", + "[ 39/16 → 5/2 | note:c s:sawtooth cutoff:600 lpsync:2 ]", + "[ 5/2 → 41/16 | note:c s:sawtooth cutoff:600 lpsync:2 ]", + "[ 41/16 → 21/8 | note:c4 s:sawtooth cutoff:600 lpsync:2 ]", + "[ 21/8 → 43/16 | note:c s:sawtooth cutoff:600 lpsync:2 ]", + "[ 43/16 → 11/4 | note:c s:sawtooth cutoff:600 lpsync:2 ]", + "[ 11/4 → 45/16 | note:c# s:sawtooth cutoff:600 lpsync:2 ]", + "[ 45/16 → 23/8 | note:c s:sawtooth cutoff:600 lpsync:2 ]", + "[ 23/8 → 47/16 | note:c s:sawtooth cutoff:600 lpsync:2 ]", + "[ 47/16 → 3/1 | note:c4 s:sawtooth cutoff:600 lpsync:2 ]", + "[ 3/1 → 49/16 | note:c s:sawtooth cutoff:600 lpsync:1 ]", + "[ 49/16 → 25/8 | note:c s:sawtooth cutoff:600 lpsync:1 ]", + "[ 25/8 → 51/16 | note:c# s:sawtooth cutoff:600 lpsync:1 ]", + "[ 51/16 → 13/4 | note:c s:sawtooth cutoff:600 lpsync:1 ]", + "[ 13/4 → 53/16 | note:c s:sawtooth cutoff:600 lpsync:1 ]", + "[ 53/16 → 27/8 | note:c4 s:sawtooth cutoff:600 lpsync:1 ]", + "[ 27/8 → 55/16 | note:c s:sawtooth cutoff:600 lpsync:1 ]", + "[ 55/16 → 7/2 | note:c s:sawtooth cutoff:600 lpsync:1 ]", + "[ 7/2 → 57/16 | note:c# s:sawtooth cutoff:600 lpsync:1 ]", + "[ 57/16 → 29/8 | note:c s:sawtooth cutoff:600 lpsync:1 ]", + "[ 29/8 → 59/16 | note:c s:sawtooth cutoff:600 lpsync:1 ]", + "[ 59/16 → 15/4 | note:c4 s:sawtooth cutoff:600 lpsync:1 ]", + "[ 15/4 → 61/16 | note:c s:sawtooth cutoff:600 lpsync:1 ]", + "[ 61/16 → 31/8 | note:c s:sawtooth cutoff:600 lpsync:1 ]", + "[ 31/8 → 63/16 | note:c# s:sawtooth cutoff:600 lpsync:1 ]", + "[ 63/16 → 4/1 | note:c s:sawtooth cutoff:600 lpsync:1 ]", +] +`; + exports[`runs examples > example "lrate" example index 0 1`] = ` [ "[ 0/1 → 1/1 | n:0 s:supersquare leslie:1 lrate:1 ]", From cf12e3e1d8892de00d20a5c6f4e1a5a164cbc3f5 Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 23 Nov 2025 12:21:55 -0600 Subject: [PATCH 170/312] Hook up the octave control --- packages/superdough/helpers.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index de64df0e8..59608698d 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -517,7 +517,7 @@ export const getDistortion = (distort, postgain, algorithm) => { }; export const getFrequencyFromValue = (value, defaultNote = 36) => { - let { note, freq } = value; + let { note, freq, octave = 0 } = value; note = note || defaultNote; if (typeof note === 'string') { note = noteToMidi(note); // e.g. c3 => 48 @@ -526,7 +526,7 @@ export const getFrequencyFromValue = (value, defaultNote = 36) => { if (!freq && typeof note === 'number') { freq = midiToFreq(note); // + 48); } - + freq *= Math.pow(2, octave); return Number(freq); }; From 6c0d550b6b3629312eb8e65719781c28effab943 Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 23 Nov 2025 12:25:40 -0600 Subject: [PATCH 171/312] Fix example --- packages/core/controls.mjs | 3 +-- test/__snapshots__/examples.test.mjs.snap | 24 +++++++++++------------ 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 9a2be7f44..5c5883e9a 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -1822,8 +1822,7 @@ export const { nudge } = registerControl('nudge'); * @name octave * @param {number | Pattern} octave octave number * @example - * n("0,4,7").s('supersquare').octave("<3 4 5 6>").osc() - * @superDirtOnly + * n("0,4,7").scale("F:minor").s('supersaw').octave("<0 1 2 3>") */ export const { octave } = registerControl('octave'); diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 31e4bddd3..4d4da8b22 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -6888,18 +6888,18 @@ exports[`runs examples > example "nrpv" example index 0 1`] = ` exports[`runs examples > example "octave" example index 0 1`] = ` [ - "[ 0/1 → 1/1 | n:0 s:supersquare octave:3 ]", - "[ 0/1 → 1/1 | n:4 s:supersquare octave:3 ]", - "[ 0/1 → 1/1 | n:7 s:supersquare octave:3 ]", - "[ 1/1 → 2/1 | n:0 s:supersquare octave:4 ]", - "[ 1/1 → 2/1 | n:4 s:supersquare octave:4 ]", - "[ 1/1 → 2/1 | n:7 s:supersquare octave:4 ]", - "[ 2/1 → 3/1 | n:0 s:supersquare octave:5 ]", - "[ 2/1 → 3/1 | n:4 s:supersquare octave:5 ]", - "[ 2/1 → 3/1 | n:7 s:supersquare octave:5 ]", - "[ 3/1 → 4/1 | n:0 s:supersquare octave:6 ]", - "[ 3/1 → 4/1 | n:4 s:supersquare octave:6 ]", - "[ 3/1 → 4/1 | n:7 s:supersquare octave:6 ]", + "[ 0/1 → 1/1 | note:F3 s:supersaw octave:0 ]", + "[ 0/1 → 1/1 | note:C4 s:supersaw octave:0 ]", + "[ 0/1 → 1/1 | note:F4 s:supersaw octave:0 ]", + "[ 1/1 → 2/1 | note:F3 s:supersaw octave:1 ]", + "[ 1/1 → 2/1 | note:C4 s:supersaw octave:1 ]", + "[ 1/1 → 2/1 | note:F4 s:supersaw octave:1 ]", + "[ 2/1 → 3/1 | note:F3 s:supersaw octave:2 ]", + "[ 2/1 → 3/1 | note:C4 s:supersaw octave:2 ]", + "[ 2/1 → 3/1 | note:F4 s:supersaw octave:2 ]", + "[ 3/1 → 4/1 | note:F3 s:supersaw octave:3 ]", + "[ 3/1 → 4/1 | note:C4 s:supersaw octave:3 ]", + "[ 3/1 → 4/1 | note:F4 s:supersaw octave:3 ]", ] `; From 6221099af80f87e783339d46f31b685b0ce0f3ed Mon Sep 17 00:00:00 2001 From: "Jade (Rose) Rowland" Date: Sun, 23 Nov 2025 18:09:38 -0500 Subject: [PATCH 172/312] working --- packages/core/repl.mjs | 1 + .../repl/components/button/action-button.jsx | 24 ++++++++++++ .../panel/ImportPrebakeScriptButton.jsx | 39 +++++++++++++++++++ website/src/repl/components/panel/Panel.jsx | 2 +- .../src/repl/components/panel/PatternsTab.jsx | 2 +- .../src/repl/components/panel/SettingsTab.jsx | 12 ++++-- website/src/repl/prebake.mjs | 11 +++++- website/src/repl/useReplContext.jsx | 11 ++++-- website/src/settings.mjs | 3 ++ 9 files changed, 94 insertions(+), 11 deletions(-) create mode 100644 website/src/repl/components/panel/ImportPrebakeScriptButton.jsx diff --git a/packages/core/repl.mjs b/packages/core/repl.mjs index bcb70eec9..90b4fcbb8 100644 --- a/packages/core/repl.mjs +++ b/packages/core/repl.mjs @@ -147,6 +147,7 @@ export function repl({ // set pattern methods that use this repl via closure const injectPatternMethods = () => { + Pattern.prototype.p = function (id) { if (typeof id === 'string' && (id.startsWith('_') || id.endsWith('_'))) { // allows muting a pattern x with x_ or _x diff --git a/website/src/repl/components/button/action-button.jsx b/website/src/repl/components/button/action-button.jsx index d589b7bed..eb395212c 100644 --- a/website/src/repl/components/button/action-button.jsx +++ b/website/src/repl/components/button/action-button.jsx @@ -8,3 +8,27 @@ export function ActionButton({ children, label, labelIsHidden, className, ...but ); } +export function ActionInput({ label, className, ...inputProps }) { + return ( + + ); +} + +export function SpecialActionButton(props) { + const { className, ...buttonProps } = props + + return + +} +export function SpecialActionInput(props) { + const { className, ...inputProps } = props + return +} + + diff --git a/website/src/repl/components/panel/ImportPrebakeScriptButton.jsx b/website/src/repl/components/panel/ImportPrebakeScriptButton.jsx new file mode 100644 index 000000000..c521c527b --- /dev/null +++ b/website/src/repl/components/panel/ImportPrebakeScriptButton.jsx @@ -0,0 +1,39 @@ +import { errorLogger } from '@strudel/core'; +import { useSettings, storeStartupScript } from '../../../settings.mjs'; +import { SpecialActionInput } from '../button/action-button'; + +async function importScript(script) { + const reader = new FileReader() + reader.readAsText(script) + + reader.onload = () => { + const text = reader.result; + console.info(text) + storeStartupScript(text) + + }; + + reader.onerror = () => { + errorLogger(new Error('failed to import prebake script'), 'ImportPrebakeScriptButton') + } + +} +export function ImportPrebakeScriptButton() { + const settings = useSettings(); + + return importScript(e.target.files[0])} /> + + // return +} \ No newline at end of file diff --git a/website/src/repl/components/panel/Panel.jsx b/website/src/repl/components/panel/Panel.jsx index b26c2edef..1af859f81 100644 --- a/website/src/repl/components/panel/Panel.jsx +++ b/website/src/repl/components/panel/Panel.jsx @@ -127,7 +127,7 @@ function PanelContent({ context, tab }) { case tabNames.reference: return ; case tabNames.settings: - return ; + return ; case tabNames.files: return ; default: diff --git a/website/src/repl/components/panel/PatternsTab.jsx b/website/src/repl/components/panel/PatternsTab.jsx index 5e0d50e72..67585d20a 100644 --- a/website/src/repl/components/panel/PatternsTab.jsx +++ b/website/src/repl/components/panel/PatternsTab.jsx @@ -83,7 +83,7 @@ function UserPatterns({ context }) { const activePattern = useActivePattern(); const viewingPatternStore = useViewingPatternData(); const viewingPatternData = parseJSON(viewingPatternStore); - const { userPatterns, patternFilter, patternAutoStart } = useSettings(); + const { userPatterns, patternFilter, patternAutoStart, } = useSettings(); const viewingPatternID = viewingPatternData?.id; return (
diff --git a/website/src/repl/components/panel/SettingsTab.jsx b/website/src/repl/components/panel/SettingsTab.jsx index 85991f55c..2c66ed1a3 100644 --- a/website/src/repl/components/panel/SettingsTab.jsx +++ b/website/src/repl/components/panel/SettingsTab.jsx @@ -7,6 +7,8 @@ import { AudioDeviceSelector } from './AudioDeviceSelector.jsx'; import { AudioEngineTargetSelector } from './AudioEngineTargetSelector.jsx'; import { confirmDialog } from '../../util.mjs'; import { DEFAULT_MAX_POLYPHONY, setMaxPolyphony, setMultiChannelOrbits } from '@strudel/webaudio'; +import { ActionButton, SpecialActionButton } from '../button/action-button.jsx'; +import { ImportPrebakeScriptButton } from './ImportPrebakeScriptButton.jsx'; function Checkbox({ label, value, onChange, disabled = false }) { return ( @@ -86,7 +88,7 @@ const fontFamilyOptions = { const RELOAD_MSG = 'Changing this setting requires the window to reload itself. OK?'; -export function SettingsTab({ started }) { +export function SettingsTab({ started,context }) { const { theme, keybindings, @@ -113,6 +115,7 @@ export function SettingsTab({ started }) { isTabIndentationEnabled, isMultiCursorEnabled, patternAutoStart, + startupScript, } = useSettings(); const shouldAlwaysSync = isUdels(); const canChangeAudioDevice = AudioContext.prototype.setSinkId != null; @@ -204,6 +207,8 @@ export function SettingsTab({ started }) { />
+ + {/* context.editStartupScript(startupScript)}> */} Try clicking the logo in the top left! - +
); diff --git a/website/src/repl/prebake.mjs b/website/src/repl/prebake.mjs index 8a6ccc7e0..960771f05 100644 --- a/website/src/repl/prebake.mjs +++ b/website/src/repl/prebake.mjs @@ -1,14 +1,23 @@ -import { Pattern, noteToMidi, valueToMidi } from '@strudel/core'; +import { Pattern, noteToMidi, valueToMidi } from '@strudel/core'; import { aliasBank, registerSynthSounds, registerZZFXSounds, samples } from '@strudel/webaudio'; import { registerSamplesFromDB } from './idbutils.mjs'; import './piano.mjs'; import './files.mjs'; +import { settingsMap } from '@src/settings.mjs'; +import { evaluate } from '@strudel/transpiler'; const { BASE_URL } = import.meta.env; const baseNoTrailing = BASE_URL.endsWith('/') ? BASE_URL.slice(0, -1) : BASE_URL; const baseCDN = 'https://strudel.b-cdn.net'; export async function prebake() { + + // const settings = settingsMap.get() + + + // const prebakeScript = settings.startupScript || ''; + // await evaluate(prebakeScript); + // https://archive.org/details/SalamanderGrandPianoV3 // License: CC-by http://creativecommons.org/licenses/by/3.0/ Author: Alexander Holm await Promise.all([ diff --git a/website/src/repl/useReplContext.jsx b/website/src/repl/useReplContext.jsx index ac30fe342..4e8b2b946 100644 --- a/website/src/repl/useReplContext.jsx +++ b/website/src/repl/useReplContext.jsx @@ -6,7 +6,7 @@ This program is free software: you can redistribute it and/or modify it under th import { code2hash, getPerformanceTimeSeconds, logger, silence } from '@strudel/core'; import { getDrawContext } from '@strudel/draw'; -import { transpiler } from '@strudel/transpiler'; +import { evaluate, transpiler } from '@strudel/transpiler'; import { getAudioContextCurrentTime, webaudioOutput, @@ -47,6 +47,7 @@ if (typeof window !== 'undefined') { multiChannelOrbits: parseBoolean(multiChannelOrbits), }); modulesLoading = loadModules(); + // prebakeScript = evaluate(settingsMap.get().startupScript ?? '') presets = prebake(); drawContext = getDrawContext(); clearCanvas = () => drawContext.clearRect(0, 0, drawContext.canvas.height, drawContext.canvas.width); @@ -63,11 +64,10 @@ async function getModule(name) { const initialCode = `// LOADING`; export function useReplContext() { - const { isSyncEnabled, audioEngineTarget } = useSettings(); + const { isSyncEnabled, audioEngineTarget, startupScript } = useSettings(); const shouldUseWebaudio = audioEngineTarget !== audioEngineTargets.osc; const defaultOutput = shouldUseWebaudio ? webaudioOutput : superdirtOutput; const getTime = shouldUseWebaudio ? getAudioContextCurrentTime : getPerformanceTimeSeconds; - const init = useCallback(() => { const drawTime = [-2, 2]; const drawContext = getDrawContext(); @@ -84,7 +84,9 @@ export function useReplContext() { pattern: silence, drawTime, drawContext, - prebake: async () => Promise.all([modulesLoading, presets]), + prebake: async () => Promise.all([modulesLoading, presets,]).then(() => { + return evaluate(startupScript ?? '') + }), onUpdateState: (state) => { setReplState({ ...state }); }, @@ -200,6 +202,7 @@ export function useReplContext() { } }; + const handleEvaluate = () => { editorRef.current.evaluate(); }; diff --git a/website/src/settings.mjs b/website/src/settings.mjs index 7c62b0ded..1fff439be 100644 --- a/website/src/settings.mjs +++ b/website/src/settings.mjs @@ -45,6 +45,7 @@ export const defaultSettings = { isPanelOpen: true, togglePanelTrigger: 'click', //click | hover userPatterns: '{}', + startupScript: '//edit this script to run code on startup\n', audioEngineTarget: audioEngineTargets.webaudio, isButtonRowHidden: false, isCSSAnimationDisabled: false, @@ -108,6 +109,8 @@ export const setActiveFooter = (tab) => settingsMap.setKey('activeFooter', tab); export const setPanelPinned = (bool) => settingsMap.setKey('isPanelPinned', bool); export const setIsPanelOpened = (bool) => settingsMap.setKey('isPanelOpen', bool); +export const storeStartupScript = (script) => settingsMap.setKey('startupScript', script); + export const setIsZen = (active) => settingsMap.setKey('isZen', !!active); const patternSetting = (key) => From d5dfbd7aa4d4236bdf143b94b7abddf7a9fe93c5 Mon Sep 17 00:00:00 2001 From: "Jade (Rose) Rowland" Date: Sun, 23 Nov 2025 18:45:13 -0500 Subject: [PATCH 173/312] cleanup --- packages/core/repl.mjs | 1 - .../repl/components/button/action-button.jsx | 45 ++++++++++------- .../panel/ImportPrebakeScriptButton.jsx | 48 ++++++++----------- website/src/repl/components/panel/Panel.jsx | 2 +- .../src/repl/components/panel/PatternsTab.jsx | 2 +- .../src/repl/components/panel/SettingsTab.jsx | 3 +- website/src/repl/prebake.mjs | 4 +- website/src/repl/useReplContext.jsx | 8 ++-- 8 files changed, 54 insertions(+), 59 deletions(-) diff --git a/packages/core/repl.mjs b/packages/core/repl.mjs index 90b4fcbb8..bcb70eec9 100644 --- a/packages/core/repl.mjs +++ b/packages/core/repl.mjs @@ -147,7 +147,6 @@ export function repl({ // set pattern methods that use this repl via closure const injectPatternMethods = () => { - Pattern.prototype.p = function (id) { if (typeof id === 'string' && (id.startsWith('_') || id.endsWith('_'))) { // allows muting a pattern x with x_ or _x diff --git a/website/src/repl/components/button/action-button.jsx b/website/src/repl/components/button/action-button.jsx index eb395212c..7364d2af0 100644 --- a/website/src/repl/components/button/action-button.jsx +++ b/website/src/repl/components/button/action-button.jsx @@ -8,27 +8,36 @@ export function ActionButton({ children, label, labelIsHidden, className, ...but ); } -export function ActionInput({ label, className, ...inputProps }) { + +export function SpecialActionButton(props) { + const { className, ...buttonProps } = props; + return ( -
- + + + settingsMap.setKey('includePrebakeScriptInShare', cbEvent.target.checked)} + value={includePrebakeScriptInShare} + /> + + shareCode(replState.code); + const handleShare = async () => { + let code = replState.code; + if (includePrebakeScriptInShare) { + code = prebakeScript + '\n' + code; + } + shareCode(code); + }; const context = { started, pending, diff --git a/website/src/repl/util.mjs b/website/src/repl/util.mjs index ac27158f4..4a7cb26a8 100644 --- a/website/src/repl/util.mjs +++ b/website/src/repl/util.mjs @@ -1,11 +1,10 @@ -import { evalScope, hash2code, logger } from '@strudel/core'; +import { code2hash, evalScope, hash2code, logger } from '@strudel/core'; import { settingPatterns } from '../settings.mjs'; import { setVersionDefaults } from '@strudel/webaudio'; import { getMetadata } from '../metadata_parser'; import { isTauri } from '../tauri.mjs'; import './Repl.css'; import { createClient } from '@supabase/supabase-js'; -import { nanoid } from 'nanoid'; import { writeText } from '@tauri-apps/plugin-clipboard-manager'; import { $featuredPatterns /* , loadDBPatterns */ } from '@src/user_pattern_utils.mjs'; @@ -109,9 +108,8 @@ export function confirmDialog(msg) { }); } -let lastShared; - //RIP due to SPAM +// let lastShared; // export async function shareCode(codeToShare) { // // const codeToShare = activeCode || code; // if (lastShared === codeToShare) { @@ -146,9 +144,10 @@ let lastShared; // }); // } -export async function shareCode() { +export async function shareCode(codeToShare) { try { - const shareUrl = window.location.href; + const hash = '#' + code2hash(codeToShare); + const shareUrl = window.location.origin + window.location.pathname + hash; if (isTauri()) { await writeText(shareUrl); } else { diff --git a/website/src/settings.mjs b/website/src/settings.mjs index a1ddc90cb..8ec7d455a 100644 --- a/website/src/settings.mjs +++ b/website/src/settings.mjs @@ -51,6 +51,7 @@ export const defaultSettings = { isCSSAnimationDisabled: false, maxPolyphony: 128, multiChannelOrbits: false, + includePrebakeScriptInShare: true, }; let search = null; @@ -97,6 +98,7 @@ export function useSettings() { isPanelOpen: parseBoolean(state.isPanelOpen), userPatterns: userPatterns, multiChannelOrbits: parseBoolean(state.multiChannelOrbits), + includePrebakeScriptInShare: parseBoolean(state.includePrebakeScriptInShare), patternAutoStart: isUdels() ? false : state.patternAutoStart === undefined From 020a6bc75fb1467a518c32c2d132298747693d8a Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 23 Nov 2025 20:31:31 -0600 Subject: [PATCH 179/312] 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 180/312] 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 181/312] 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 182/312] 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 183/312] 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 184/312] 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 d5e5ab83ac642c23518fe6d4f7584cad0079276b Mon Sep 17 00:00:00 2001 From: "Jade (Rose) Rowland" Date: Mon, 24 Nov 2025 10:39:37 -0500 Subject: [PATCH 185/312] fix style --- website/src/repl/components/button/action-button.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/src/repl/components/button/action-button.jsx b/website/src/repl/components/button/action-button.jsx index 7364d2af0..3499fbb43 100644 --- a/website/src/repl/components/button/action-button.jsx +++ b/website/src/repl/components/button/action-button.jsx @@ -25,7 +25,7 @@ export function ActionInput({ label, className, ...props }) { From 7a4babf6e1faa50cf650a086806e5d87ea1e0958 Mon Sep 17 00:00:00 2001 From: "Jade (Rose) Rowland" Date: Mon, 24 Nov 2025 10:40:16 -0500 Subject: [PATCH 186/312] format --- website/src/repl/components/button/action-button.jsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/website/src/repl/components/button/action-button.jsx b/website/src/repl/components/button/action-button.jsx index 3499fbb43..de674b696 100644 --- a/website/src/repl/components/button/action-button.jsx +++ b/website/src/repl/components/button/action-button.jsx @@ -25,9 +25,7 @@ export function ActionInput({ label, className, ...props }) { ); } From 89a6efb69e1a1bc74e240a949fbc19c3134f0bc7 Mon Sep 17 00:00:00 2001 From: jeromew Date: Mon, 24 Nov 2025 16:10:00 +0000 Subject: [PATCH 187/312] [perf] level 5 `connect-leak` on `vowel` --- packages/superdough/vowel.mjs | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/packages/superdough/vowel.mjs b/packages/superdough/vowel.mjs index 3f30aef1e..fda0c6479 100644 --- a/packages/superdough/vowel.mjs +++ b/packages/superdough/vowel.mjs @@ -45,7 +45,8 @@ if (typeof GainNode !== 'undefined') { throw new Error('vowel: unknown vowel ' + letter); } const { gains, qs, freqs } = vowelFormant[letter]; - const makeupGain = ac.createGain(); + this.makeupGain = ac.createGain(); + this.audioNodes = []; for (let i = 0; i < 5; i++) { const gain = ac.createGain(); gain.gain.value = gains[i]; @@ -53,14 +54,25 @@ if (typeof GainNode !== 'undefined') { filter.type = 'bandpass'; filter.Q.value = qs[i]; filter.frequency.value = freqs[i]; - this.connect(filter); + super.connect(filter); filter.connect(gain); - gain.connect(makeupGain); + this.audioNodes.push(filter); + gain.connect(this.makeupGain); + this.audioNodes.push(gain); } - makeupGain.gain.value = 8; // how much makeup gain to add? - this.connect = (target) => makeupGain.connect(target); + this.makeupGain.gain.value = 8; // how much makeup gain to add? return this; } + connect(target) { + this.makeupGain.connect(target); + } + disconnect() { + this.makeupGain.disconnect(); + this.audioNodes.forEach((n) => n.disconnect()); + super.disconnect(); + this.makeupGain = null; + this.audioNodes = null; + } } AudioContext.prototype.createVowelFilter = function (letter) { From e86850b6d83a16f7a0d7e5a64648d62b0035d18f Mon Sep 17 00:00:00 2001 From: "Jade (Rose) Rowland" Date: Mon, 24 Nov 2025 11:19:49 -0500 Subject: [PATCH 188/312] frequency mod --- packages/core/controls.mjs | 40 +++++++++++++++++++++++++++++- packages/superdough/helpers.mjs | 7 ++++-- packages/superdough/superdough.mjs | 7 ++++-- 3 files changed, 49 insertions(+), 5 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 2ff2089df..a9d7cc266 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -1319,6 +1319,18 @@ export const { lpsync } = registerControl('lpsync'); */ export const { lpdepth } = registerControl('lpdepth'); +/** + * Depth of the LFO for the lowpass filter, in HZ + * + * @name lpdepthfrequency + * @synonyms + * lpdethfreq + * @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'); /** * Shape of the LFO for the lowpass filter @@ -1368,6 +1380,19 @@ export const { bpsync } = registerControl('bpsync'); */ export const { bpdepth } = registerControl('bpdepth'); +/** + * Depth of the LFO for the bandpass filter, in HZ + * + * @name bpdepthfrequency + * @synonyms + * bpdethfreq + * @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'); + /** * Shape of the LFO for the bandpass filter * @@ -1414,7 +1439,20 @@ export const { hpsync } = registerControl('hpsync'); * @name hpdepth * @param {number | Pattern} depth depth of modulation */ -export const { hpdepth } = registerControl('hpdepth'); +export const { hpdepth, hpdepthfreq } = registerControl('hpdepth'); + +/** + * Depth of the LFO for the hipass filter, in hz + * + * @name hpdepthfrequency + * @synonyms + * hpdethfreq + * @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'); /** * Shape of the LFO for the highpass filter diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 11427dc5b..ad11f595c 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -201,12 +201,14 @@ export function createFilter(context, start, end, params, cps, cycle) { q = 1, drive = 0.69, depth, + depthfrequency, dcoffset = -0.5, skew, shape, rate, sync, } = params; + let frequencyParam, filter; if (model === 'ladder') { filter = getWorklet(context, 'ladder-processor', { frequency, q, drive }); @@ -237,12 +239,13 @@ export function createFilter(context, start, end, params, cps, cycle) { if (sync != null) { rate = cps * sync; } - const hasLFO = [depth, skew, shape, rate].some((v) => v !== undefined); + const hasLFO = [depth, depthfrequency, skew, shape, rate].some((v) => v !== undefined); if (hasLFO) { depth = depth ?? 1; const time = cycle / cps; + const modDepth = depthfrequency ?? (depth ?? 1) * frequency; const lfoValues = { - depth: (depth ?? 1) * frequency, + depth: modDepth, dcoffset, skew, shape, diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 4e1a145c0..e3177c7d6 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -553,6 +553,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) rate: 'lprate', sync: 'lpsync', depth: 'lpdepth', + depthfrequency: 'lpdepthfrequency', shape: 'lpshape', dcoffset: 'lpdc', skew: 'lpskew', @@ -581,13 +582,14 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) rate: 'hprate', sync: 'hpsync', depth: 'hpdepth', + depthfrequency: 'hpdepthfrequency', shape: 'hpshape', dcoffset: 'hpdc', skew: 'hpskew', }; const hpParams = pickAndRename(value, hpMap); hpParams.type = 'highpass'; - let hp = () => createFilter(ac, t, end, hpParams, cps); + let hp = () => createFilter(ac, t, end, hpParams, cps, cycle); chain.push(hp()); if (ftype === '24db') { chain.push(hp()); @@ -609,13 +611,14 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) rate: 'bprate', sync: 'bpsync', depth: 'bpdepth', + depthfrequency: 'bpdepthfrequency', shape: 'bpshape', dcoffset: 'bpdc', skew: 'bpskew', }; const bpParams = pickAndRename(value, bpMap); bpParams.type = 'bandpass'; - let bp = () => createFilter(ac, t, end, bpParams, cps); + let bp = () => createFilter(ac, t, end, bpParams, cps, cycle); chain.push(bp()); if (ftype === '24db') { chain.push(bp()); From a3947d1ccf9d056cdc3c573b44432d7b3e05cfdc Mon Sep 17 00:00:00 2001 From: jeromew Date: Mon, 24 Nov 2025 16:33:20 +0000 Subject: [PATCH 189/312] [perf] fix `connect-leak` from audioworklet=>param in lfo/tremolo --- packages/superdough/superdough.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 650f9c2ce..a549ff68f 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -665,6 +665,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) curve: 1.5, }); lfo.connect(amGain.gain); + audioNodes.push(lfo); chain.push(amGain); } From 7ee6b933cc032c698eef1ac2bfd5f83eafc4a3ef Mon Sep 17 00:00:00 2001 From: "Jade (Rose) Rowland" Date: Mon, 24 Nov 2025 11:33:21 -0500 Subject: [PATCH 190/312] add tests --- test/__snapshots__/examples.test.mjs.snap | 207 ++++++++++++++++++++++ 1 file changed, 207 insertions(+) diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 4345eedbf..8cbee39da 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -1391,6 +1391,75 @@ exports[`runs examples > example "bpdecay" example index 0 1`] = ` ] `; +exports[`runs examples > example "bpdepthfrequency" example index 0 1`] = ` +[ + "[ 0/1 → 1/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:200 ]", + "[ 1/16 → 1/8 | note:c s:sawtooth cutoff:600 bpdepthfrequency:200 ]", + "[ 1/8 → 3/16 | note:c# s:sawtooth cutoff:600 bpdepthfrequency:200 ]", + "[ 3/16 → 1/4 | note:c s:sawtooth cutoff:600 bpdepthfrequency:200 ]", + "[ 1/4 → 5/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:200 ]", + "[ 5/16 → 3/8 | note:c4 s:sawtooth cutoff:600 bpdepthfrequency:200 ]", + "[ 3/8 → 7/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:200 ]", + "[ 7/16 → 1/2 | note:c s:sawtooth cutoff:600 bpdepthfrequency:200 ]", + "[ 1/2 → 9/16 | note:c# s:sawtooth cutoff:600 bpdepthfrequency:200 ]", + "[ 9/16 → 5/8 | note:c s:sawtooth cutoff:600 bpdepthfrequency:200 ]", + "[ 5/8 → 11/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:200 ]", + "[ 11/16 → 3/4 | note:c4 s:sawtooth cutoff:600 bpdepthfrequency:200 ]", + "[ 3/4 → 13/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:200 ]", + "[ 13/16 → 7/8 | note:c s:sawtooth cutoff:600 bpdepthfrequency:200 ]", + "[ 7/8 → 15/16 | note:c# s:sawtooth cutoff:600 bpdepthfrequency:200 ]", + "[ 15/16 → 1/1 | note:c s:sawtooth cutoff:600 bpdepthfrequency:200 ]", + "[ 1/1 → 17/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:500 ]", + "[ 17/16 → 9/8 | note:c4 s:sawtooth cutoff:600 bpdepthfrequency:500 ]", + "[ 9/8 → 19/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:500 ]", + "[ 19/16 → 5/4 | note:c s:sawtooth cutoff:600 bpdepthfrequency:500 ]", + "[ 5/4 → 21/16 | note:c# s:sawtooth cutoff:600 bpdepthfrequency:500 ]", + "[ 21/16 → 11/8 | note:c s:sawtooth cutoff:600 bpdepthfrequency:500 ]", + "[ 11/8 → 23/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:500 ]", + "[ 23/16 → 3/2 | note:c4 s:sawtooth cutoff:600 bpdepthfrequency:500 ]", + "[ 3/2 → 25/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:500 ]", + "[ 25/16 → 13/8 | note:c s:sawtooth cutoff:600 bpdepthfrequency:500 ]", + "[ 13/8 → 27/16 | note:c# s:sawtooth cutoff:600 bpdepthfrequency:500 ]", + "[ 27/16 → 7/4 | note:c s:sawtooth cutoff:600 bpdepthfrequency:500 ]", + "[ 7/4 → 29/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:500 ]", + "[ 29/16 → 15/8 | note:c4 s:sawtooth cutoff:600 bpdepthfrequency:500 ]", + "[ 15/8 → 31/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:500 ]", + "[ 31/16 → 2/1 | note:c s:sawtooth cutoff:600 bpdepthfrequency:500 ]", + "[ 2/1 → 33/16 | note:c# s:sawtooth cutoff:600 bpdepthfrequency:100 ]", + "[ 33/16 → 17/8 | note:c s:sawtooth cutoff:600 bpdepthfrequency:100 ]", + "[ 17/8 → 35/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:100 ]", + "[ 35/16 → 9/4 | note:c4 s:sawtooth cutoff:600 bpdepthfrequency:100 ]", + "[ 9/4 → 37/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:100 ]", + "[ 37/16 → 19/8 | note:c s:sawtooth cutoff:600 bpdepthfrequency:100 ]", + "[ 19/8 → 39/16 | note:c# s:sawtooth cutoff:600 bpdepthfrequency:100 ]", + "[ 39/16 → 5/2 | note:c s:sawtooth cutoff:600 bpdepthfrequency:100 ]", + "[ 5/2 → 41/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:100 ]", + "[ 41/16 → 21/8 | note:c4 s:sawtooth cutoff:600 bpdepthfrequency:100 ]", + "[ 21/8 → 43/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:100 ]", + "[ 43/16 → 11/4 | note:c s:sawtooth cutoff:600 bpdepthfrequency:100 ]", + "[ 11/4 → 45/16 | note:c# s:sawtooth cutoff:600 bpdepthfrequency:100 ]", + "[ 45/16 → 23/8 | note:c s:sawtooth cutoff:600 bpdepthfrequency:100 ]", + "[ 23/8 → 47/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:100 ]", + "[ 47/16 → 3/1 | note:c4 s:sawtooth cutoff:600 bpdepthfrequency:100 ]", + "[ 3/1 → 49/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:0 ]", + "[ 49/16 → 25/8 | note:c s:sawtooth cutoff:600 bpdepthfrequency:0 ]", + "[ 25/8 → 51/16 | note:c# s:sawtooth cutoff:600 bpdepthfrequency:0 ]", + "[ 51/16 → 13/4 | note:c s:sawtooth cutoff:600 bpdepthfrequency:0 ]", + "[ 13/4 → 53/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:0 ]", + "[ 53/16 → 27/8 | note:c4 s:sawtooth cutoff:600 bpdepthfrequency:0 ]", + "[ 27/8 → 55/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:0 ]", + "[ 55/16 → 7/2 | note:c s:sawtooth cutoff:600 bpdepthfrequency:0 ]", + "[ 7/2 → 57/16 | note:c# s:sawtooth cutoff:600 bpdepthfrequency:0 ]", + "[ 57/16 → 29/8 | note:c s:sawtooth cutoff:600 bpdepthfrequency:0 ]", + "[ 29/8 → 59/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:0 ]", + "[ 59/16 → 15/4 | note:c4 s:sawtooth cutoff:600 bpdepthfrequency:0 ]", + "[ 15/4 → 61/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:0 ]", + "[ 61/16 → 31/8 | note:c s:sawtooth cutoff:600 bpdepthfrequency:0 ]", + "[ 31/8 → 63/16 | note:c# s:sawtooth cutoff:600 bpdepthfrequency:0 ]", + "[ 63/16 → 4/1 | note:c s:sawtooth cutoff:600 bpdepthfrequency:0 ]", +] +`; + exports[`runs examples > example "bpenv" example index 0 1`] = ` [ "[ 0/1 → 1/4 | note:c2 s:sawtooth bandf:500 bpattack:0.5 bpenv:4 ]", @@ -4786,6 +4855,75 @@ exports[`runs examples > example "hpdecay" example index 0 1`] = ` ] `; +exports[`runs examples > example "hpdepthfrequency" example index 0 1`] = ` +[ + "[ 0/1 → 1/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:200 ]", + "[ 1/16 → 1/8 | note:c s:sawtooth cutoff:600 hpdepthfrequency:200 ]", + "[ 1/8 → 3/16 | note:c# s:sawtooth cutoff:600 hpdepthfrequency:200 ]", + "[ 3/16 → 1/4 | note:c s:sawtooth cutoff:600 hpdepthfrequency:200 ]", + "[ 1/4 → 5/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:200 ]", + "[ 5/16 → 3/8 | note:c4 s:sawtooth cutoff:600 hpdepthfrequency:200 ]", + "[ 3/8 → 7/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:200 ]", + "[ 7/16 → 1/2 | note:c s:sawtooth cutoff:600 hpdepthfrequency:200 ]", + "[ 1/2 → 9/16 | note:c# s:sawtooth cutoff:600 hpdepthfrequency:200 ]", + "[ 9/16 → 5/8 | note:c s:sawtooth cutoff:600 hpdepthfrequency:200 ]", + "[ 5/8 → 11/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:200 ]", + "[ 11/16 → 3/4 | note:c4 s:sawtooth cutoff:600 hpdepthfrequency:200 ]", + "[ 3/4 → 13/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:200 ]", + "[ 13/16 → 7/8 | note:c s:sawtooth cutoff:600 hpdepthfrequency:200 ]", + "[ 7/8 → 15/16 | note:c# s:sawtooth cutoff:600 hpdepthfrequency:200 ]", + "[ 15/16 → 1/1 | note:c s:sawtooth cutoff:600 hpdepthfrequency:200 ]", + "[ 1/1 → 17/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:500 ]", + "[ 17/16 → 9/8 | note:c4 s:sawtooth cutoff:600 hpdepthfrequency:500 ]", + "[ 9/8 → 19/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:500 ]", + "[ 19/16 → 5/4 | note:c s:sawtooth cutoff:600 hpdepthfrequency:500 ]", + "[ 5/4 → 21/16 | note:c# s:sawtooth cutoff:600 hpdepthfrequency:500 ]", + "[ 21/16 → 11/8 | note:c s:sawtooth cutoff:600 hpdepthfrequency:500 ]", + "[ 11/8 → 23/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:500 ]", + "[ 23/16 → 3/2 | note:c4 s:sawtooth cutoff:600 hpdepthfrequency:500 ]", + "[ 3/2 → 25/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:500 ]", + "[ 25/16 → 13/8 | note:c s:sawtooth cutoff:600 hpdepthfrequency:500 ]", + "[ 13/8 → 27/16 | note:c# s:sawtooth cutoff:600 hpdepthfrequency:500 ]", + "[ 27/16 → 7/4 | note:c s:sawtooth cutoff:600 hpdepthfrequency:500 ]", + "[ 7/4 → 29/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:500 ]", + "[ 29/16 → 15/8 | note:c4 s:sawtooth cutoff:600 hpdepthfrequency:500 ]", + "[ 15/8 → 31/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:500 ]", + "[ 31/16 → 2/1 | note:c s:sawtooth cutoff:600 hpdepthfrequency:500 ]", + "[ 2/1 → 33/16 | note:c# s:sawtooth cutoff:600 hpdepthfrequency:100 ]", + "[ 33/16 → 17/8 | note:c s:sawtooth cutoff:600 hpdepthfrequency:100 ]", + "[ 17/8 → 35/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:100 ]", + "[ 35/16 → 9/4 | note:c4 s:sawtooth cutoff:600 hpdepthfrequency:100 ]", + "[ 9/4 → 37/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:100 ]", + "[ 37/16 → 19/8 | note:c s:sawtooth cutoff:600 hpdepthfrequency:100 ]", + "[ 19/8 → 39/16 | note:c# s:sawtooth cutoff:600 hpdepthfrequency:100 ]", + "[ 39/16 → 5/2 | note:c s:sawtooth cutoff:600 hpdepthfrequency:100 ]", + "[ 5/2 → 41/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:100 ]", + "[ 41/16 → 21/8 | note:c4 s:sawtooth cutoff:600 hpdepthfrequency:100 ]", + "[ 21/8 → 43/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:100 ]", + "[ 43/16 → 11/4 | note:c s:sawtooth cutoff:600 hpdepthfrequency:100 ]", + "[ 11/4 → 45/16 | note:c# s:sawtooth cutoff:600 hpdepthfrequency:100 ]", + "[ 45/16 → 23/8 | note:c s:sawtooth cutoff:600 hpdepthfrequency:100 ]", + "[ 23/8 → 47/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:100 ]", + "[ 47/16 → 3/1 | note:c4 s:sawtooth cutoff:600 hpdepthfrequency:100 ]", + "[ 3/1 → 49/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:0 ]", + "[ 49/16 → 25/8 | note:c s:sawtooth cutoff:600 hpdepthfrequency:0 ]", + "[ 25/8 → 51/16 | note:c# s:sawtooth cutoff:600 hpdepthfrequency:0 ]", + "[ 51/16 → 13/4 | note:c s:sawtooth cutoff:600 hpdepthfrequency:0 ]", + "[ 13/4 → 53/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:0 ]", + "[ 53/16 → 27/8 | note:c4 s:sawtooth cutoff:600 hpdepthfrequency:0 ]", + "[ 27/8 → 55/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:0 ]", + "[ 55/16 → 7/2 | note:c s:sawtooth cutoff:600 hpdepthfrequency:0 ]", + "[ 7/2 → 57/16 | note:c# s:sawtooth cutoff:600 hpdepthfrequency:0 ]", + "[ 57/16 → 29/8 | note:c s:sawtooth cutoff:600 hpdepthfrequency:0 ]", + "[ 29/8 → 59/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:0 ]", + "[ 59/16 → 15/4 | note:c4 s:sawtooth cutoff:600 hpdepthfrequency:0 ]", + "[ 15/4 → 61/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:0 ]", + "[ 61/16 → 31/8 | note:c s:sawtooth cutoff:600 hpdepthfrequency:0 ]", + "[ 31/8 → 63/16 | note:c# s:sawtooth cutoff:600 hpdepthfrequency:0 ]", + "[ 63/16 → 4/1 | note:c s:sawtooth cutoff:600 hpdepthfrequency:0 ]", +] +`; + exports[`runs examples > example "hpenv" example index 0 1`] = ` [ "[ 0/1 → 1/4 | note:c2 s:sawtooth hcutoff:500 hpattack:0.5 hpenv:4 ]", @@ -6038,6 +6176,75 @@ exports[`runs examples > example "lpdepth" example index 0 1`] = ` ] `; +exports[`runs examples > example "lpdepthfrequency" example index 0 1`] = ` +[ + "[ 0/1 → 1/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:200 ]", + "[ 1/16 → 1/8 | note:c s:sawtooth cutoff:600 lpdepthfrequency:200 ]", + "[ 1/8 → 3/16 | note:c# s:sawtooth cutoff:600 lpdepthfrequency:200 ]", + "[ 3/16 → 1/4 | note:c s:sawtooth cutoff:600 lpdepthfrequency:200 ]", + "[ 1/4 → 5/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:200 ]", + "[ 5/16 → 3/8 | note:c4 s:sawtooth cutoff:600 lpdepthfrequency:200 ]", + "[ 3/8 → 7/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:200 ]", + "[ 7/16 → 1/2 | note:c s:sawtooth cutoff:600 lpdepthfrequency:200 ]", + "[ 1/2 → 9/16 | note:c# s:sawtooth cutoff:600 lpdepthfrequency:200 ]", + "[ 9/16 → 5/8 | note:c s:sawtooth cutoff:600 lpdepthfrequency:200 ]", + "[ 5/8 → 11/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:200 ]", + "[ 11/16 → 3/4 | note:c4 s:sawtooth cutoff:600 lpdepthfrequency:200 ]", + "[ 3/4 → 13/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:200 ]", + "[ 13/16 → 7/8 | note:c s:sawtooth cutoff:600 lpdepthfrequency:200 ]", + "[ 7/8 → 15/16 | note:c# s:sawtooth cutoff:600 lpdepthfrequency:200 ]", + "[ 15/16 → 1/1 | note:c s:sawtooth cutoff:600 lpdepthfrequency:200 ]", + "[ 1/1 → 17/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:500 ]", + "[ 17/16 → 9/8 | note:c4 s:sawtooth cutoff:600 lpdepthfrequency:500 ]", + "[ 9/8 → 19/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:500 ]", + "[ 19/16 → 5/4 | note:c s:sawtooth cutoff:600 lpdepthfrequency:500 ]", + "[ 5/4 → 21/16 | note:c# s:sawtooth cutoff:600 lpdepthfrequency:500 ]", + "[ 21/16 → 11/8 | note:c s:sawtooth cutoff:600 lpdepthfrequency:500 ]", + "[ 11/8 → 23/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:500 ]", + "[ 23/16 → 3/2 | note:c4 s:sawtooth cutoff:600 lpdepthfrequency:500 ]", + "[ 3/2 → 25/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:500 ]", + "[ 25/16 → 13/8 | note:c s:sawtooth cutoff:600 lpdepthfrequency:500 ]", + "[ 13/8 → 27/16 | note:c# s:sawtooth cutoff:600 lpdepthfrequency:500 ]", + "[ 27/16 → 7/4 | note:c s:sawtooth cutoff:600 lpdepthfrequency:500 ]", + "[ 7/4 → 29/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:500 ]", + "[ 29/16 → 15/8 | note:c4 s:sawtooth cutoff:600 lpdepthfrequency:500 ]", + "[ 15/8 → 31/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:500 ]", + "[ 31/16 → 2/1 | note:c s:sawtooth cutoff:600 lpdepthfrequency:500 ]", + "[ 2/1 → 33/16 | note:c# s:sawtooth cutoff:600 lpdepthfrequency:100 ]", + "[ 33/16 → 17/8 | note:c s:sawtooth cutoff:600 lpdepthfrequency:100 ]", + "[ 17/8 → 35/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:100 ]", + "[ 35/16 → 9/4 | note:c4 s:sawtooth cutoff:600 lpdepthfrequency:100 ]", + "[ 9/4 → 37/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:100 ]", + "[ 37/16 → 19/8 | note:c s:sawtooth cutoff:600 lpdepthfrequency:100 ]", + "[ 19/8 → 39/16 | note:c# s:sawtooth cutoff:600 lpdepthfrequency:100 ]", + "[ 39/16 → 5/2 | note:c s:sawtooth cutoff:600 lpdepthfrequency:100 ]", + "[ 5/2 → 41/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:100 ]", + "[ 41/16 → 21/8 | note:c4 s:sawtooth cutoff:600 lpdepthfrequency:100 ]", + "[ 21/8 → 43/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:100 ]", + "[ 43/16 → 11/4 | note:c s:sawtooth cutoff:600 lpdepthfrequency:100 ]", + "[ 11/4 → 45/16 | note:c# s:sawtooth cutoff:600 lpdepthfrequency:100 ]", + "[ 45/16 → 23/8 | note:c s:sawtooth cutoff:600 lpdepthfrequency:100 ]", + "[ 23/8 → 47/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:100 ]", + "[ 47/16 → 3/1 | note:c4 s:sawtooth cutoff:600 lpdepthfrequency:100 ]", + "[ 3/1 → 49/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:0 ]", + "[ 49/16 → 25/8 | note:c s:sawtooth cutoff:600 lpdepthfrequency:0 ]", + "[ 25/8 → 51/16 | note:c# s:sawtooth cutoff:600 lpdepthfrequency:0 ]", + "[ 51/16 → 13/4 | note:c s:sawtooth cutoff:600 lpdepthfrequency:0 ]", + "[ 13/4 → 53/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:0 ]", + "[ 53/16 → 27/8 | note:c4 s:sawtooth cutoff:600 lpdepthfrequency:0 ]", + "[ 27/8 → 55/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:0 ]", + "[ 55/16 → 7/2 | note:c s:sawtooth cutoff:600 lpdepthfrequency:0 ]", + "[ 7/2 → 57/16 | note:c# s:sawtooth cutoff:600 lpdepthfrequency:0 ]", + "[ 57/16 → 29/8 | note:c s:sawtooth cutoff:600 lpdepthfrequency:0 ]", + "[ 29/8 → 59/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:0 ]", + "[ 59/16 → 15/4 | note:c4 s:sawtooth cutoff:600 lpdepthfrequency:0 ]", + "[ 15/4 → 61/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:0 ]", + "[ 61/16 → 31/8 | note:c s:sawtooth cutoff:600 lpdepthfrequency:0 ]", + "[ 31/8 → 63/16 | note:c# s:sawtooth cutoff:600 lpdepthfrequency:0 ]", + "[ 63/16 → 4/1 | note:c s:sawtooth cutoff:600 lpdepthfrequency:0 ]", +] +`; + exports[`runs examples > example "lpenv" example index 0 1`] = ` [ "[ 0/1 → 1/4 | note:c2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]", From f0d49e0e2220a1caacdcee89017c8b54b76c134e Mon Sep 17 00:00:00 2001 From: jeromew Date: Mon, 24 Nov 2025 16:33:20 +0000 Subject: [PATCH 191/312] [perf] fix `connect-leak` from audioworklet=>param in lfo/tremolo --- packages/superdough/superdough.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 650f9c2ce..a549ff68f 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -665,6 +665,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) curve: 1.5, }); lfo.connect(amGain.gain); + audioNodes.push(lfo); chain.push(amGain); } From a278f21f1b0a8923d3d454c0e0f0b70de828845b Mon Sep 17 00:00:00 2001 From: Aria Date: Mon, 24 Nov 2025 17:52:00 -0600 Subject: [PATCH 192/312] 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 193/312] 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 194/312] 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 195/312] 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 2bc208d8f5f92bfedc0c4445cda57f5b817c485c Mon Sep 17 00:00:00 2001 From: Aria Date: Mon, 24 Nov 2025 19:05:42 -0600 Subject: [PATCH 196/312] Use errorLogger for query and tonal errors --- packages/core/pattern.mjs | 4 ++-- packages/tonal/tonal.mjs | 13 +++++++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index 4737f0db0..239195392 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -25,7 +25,7 @@ import { stringifyValues, } from './util.mjs'; import drawLine from './drawLine.mjs'; -import { logger } from './logger.mjs'; +import { errorLogger, logger } from './logger.mjs'; let stringParser; @@ -414,7 +414,7 @@ export class Pattern { try { return this.query(new State(new TimeSpan(begin, end), controls)); } catch (err) { - logger(`[query]: ${err.message}`, 'error'); + errorLogger(err, 'query'); return []; } } diff --git a/packages/tonal/tonal.mjs b/packages/tonal/tonal.mjs index 427a66f4c..951f0f7e6 100644 --- a/packages/tonal/tonal.mjs +++ b/packages/tonal/tonal.mjs @@ -5,7 +5,16 @@ This program is free software: you can redistribute it and/or modify it under th */ import { Note, Interval, Scale } from '@tonaljs/tonal'; -import { register, _mod, logger, isNote, noteToMidi, removeUndefineds, getAccidentalsOffset } from '@strudel/core'; +import { + _mod, + errorLogger, + getAccidentalsOffset, + isNote, + logger, + noteToMidi, + register, + removeUndefineds, +} from '@strudel/core'; import { stepInNamedScale, nearestNumberIndex } from './tonleiter.mjs'; const octavesInterval = (octaves) => (octaves <= 0 ? -1 : 1) + octaves * 7 + 'P'; @@ -294,7 +303,7 @@ export const scale = register( } if (offset != 0) scaleNote = Note.transpose(scaleNote, Interval.fromSemitones(offset)); } catch (err) { - logger(`[tonal] ${err.message}`, 'error'); + errorLogger(err, 'tonal'); return; // will be removed } } From 89da9bbdb04dcd71c93ba241cc76c4f29f55c076 Mon Sep 17 00:00:00 2001 From: jeromew Date: Tue, 25 Nov 2025 10:31:53 +0000 Subject: [PATCH 197/312] [perf] in `noise`, let noiseMix do the disconnect when it exists --- packages/superdough/synth.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/superdough/synth.mjs b/packages/superdough/synth.mjs index 768638f04..3b27bf6c1 100644 --- a/packages/superdough/synth.mjs +++ b/packages/superdough/synth.mjs @@ -493,7 +493,7 @@ export function getOscillator(s, t, value, onended) { } o.onended = () => { - o.disconnect(); + noiseMix || o.disconnect(); noiseMix?.node.disconnect(); onended(); }; From ab64451d65099f60e4deeb3caf4afb8e9db77b01 Mon Sep 17 00:00:00 2001 From: jeromew Date: Tue, 25 Nov 2025 10:49:30 +0000 Subject: [PATCH 198/312] [hydra] return the hydra object when await initHydra(..) is called --- packages/hydra/hydra.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/hydra/hydra.mjs b/packages/hydra/hydra.mjs index 2cb265c2f..c13410121 100644 --- a/packages/hydra/hydra.mjs +++ b/packages/hydra/hydra.mjs @@ -35,6 +35,7 @@ export async function initHydra(options = {}) { hydra.synth.s0.init({ src: canvas }); } } + return hydra; } export function clearHydra() { From 8529516c663ee8c34b8ef108a148c56c1b690fa6 Mon Sep 17 00:00:00 2001 From: Aria Date: Tue, 25 Nov 2025 13:05:27 -0600 Subject: [PATCH 199/312] Add ability to turn mini parsing off with midi-off decorator --- packages/transpiler/test/transpiler.test.mjs | 14 ++++++++ packages/transpiler/transpiler.mjs | 38 ++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/packages/transpiler/test/transpiler.test.mjs b/packages/transpiler/test/transpiler.test.mjs index 02970cf43..68bec9154 100644 --- a/packages/transpiler/test/transpiler.test.mjs +++ b/packages/transpiler/test/transpiler.test.mjs @@ -42,4 +42,18 @@ describe('transpiler', () => { [12, 14], ]); }); + it('allows disabling mini', () => { + const code = `/* mini-off */ + const randPrefix = Math.random() > 0.5 ? "b" : "s"; + const drumPat = \`\${randPrefix}d\`; + // mini-on + s(drumPat).lpf("5000 10000") // make sure mini still runs; + `; + const { output, miniLocations } = transpiler(code, { ...simple, emitMiniLocations: true }); + expect(output).not.toContain("m('b'"); + expect(output).not.toContain("m('s'"); + const cutoffIdx = code.indexOf('5000 10000'); + expect(miniLocations).toHaveLength(2); + expect(miniLocations[0][0]).toEqual(cutoffIdx); + }); }); diff --git a/packages/transpiler/transpiler.mjs b/packages/transpiler/transpiler.mjs index fea6bad4d..b394591c2 100644 --- a/packages/transpiler/transpiler.mjs +++ b/packages/transpiler/transpiler.mjs @@ -21,12 +21,15 @@ export function registerLanguage(type, config) { export function transpiler(input, options = {}) { const { wrapAsync = false, addReturn = true, emitMiniLocations = true, emitWidgets = true } = options; + const comments = []; let ast = parse(input, { ecmaVersion: 2022, allowAwaitOutsideFunction: true, locations: true, + onComment: comments, }); + const miniDisableRanges = findMiniDisableRanges(comments, input.length); let miniLocations = []; const collectMiniLocations = (value, node) => { const minilang = languages.get('minilang'); @@ -66,6 +69,9 @@ export function transpiler(input, options = {}) { return this.replace(tidalWithLocation(raw, offset)); } if (isBackTickString(node, parent)) { + if (isMiniDisabled(node.start, miniDisableRanges)) { + return; + } const { quasis } = node; const { raw } = quasis[0].value; this.skip(); @@ -73,6 +79,9 @@ export function transpiler(input, options = {}) { return this.replace(miniWithLocation(raw, node)); } if (isStringWithDoubleQuotes(node)) { + if (isMiniDisabled(node.start, miniDisableRanges)) { + return; + } const { value } = node; this.skip(); emitMiniLocations && collectMiniLocations(value, node); @@ -327,3 +336,32 @@ function languageWithLocation(name, value, offset) { optional: false, }; } + +function findMiniDisableRanges(comments, codeEnd) { + const ranges = []; + const stack = []; // used to track on/off pairs + for (const comment of comments) { + const value = comment.value.trim(); + if (value.startsWith('mini-off')) { + stack.push(comment.start); + } else if (value.startsWith('mini-on')) { + const start = stack.pop(); + ranges.push([start, comment.end]); + } + } + while (stack.length) { + // If no closing mini-on is found, just turn it off until `codeEnd` + const start = stack.pop(); + ranges.push([start, codeEnd]); + } + return ranges; +} + +function isMiniDisabled(offset, miniDisableRanges) { + for (const [start, end] of miniDisableRanges) { + if (offset >= start && offset < end) { + return true; + } + } + return false; +} From 8b427bc1dda437521c47173abc149b16ac8ebf8b Mon Sep 17 00:00:00 2001 From: Aria Date: Tue, 25 Nov 2025 13:17:57 -0600 Subject: [PATCH 200/312] Add oct synonym --- packages/core/controls.mjs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 44dc91cdc..21a6d9624 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -1865,11 +1865,12 @@ export const { nudge } = registerControl('nudge'); * Sets the default octave of a synth. * * @name octave + * @synonyms oct * @param {number | Pattern} octave octave number * @example * n("0,4,7").scale("F:minor").s('supersaw').octave("<0 1 2 3>") */ -export const { octave } = registerControl('octave'); +export const { octave, oct } = registerControl('octave', 'oct'); // ['ophatdecay'], // TODO: example From d65b908bda4784975ae8cc57f23562a68798dc2a Mon Sep 17 00:00:00 2001 From: Aria Date: Tue, 25 Nov 2025 17:27:37 -0600 Subject: [PATCH 201/312] Disconnect lfos for phaser and filters --- packages/superdough/helpers.mjs | 5 +++-- packages/superdough/superdough.mjs | 35 ++++++++++++++++++++---------- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index baa4db25e..ed2c0c448 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -240,6 +240,7 @@ export function createFilter(context, start, end, params, cps, cycle) { rate = cps * sync; } const hasLFO = [depth, depthfrequency, skew, shape, rate].some((v) => v !== undefined); + let lfo; if (hasLFO) { depth = depth ?? 1; const time = cycle / cps; @@ -255,10 +256,10 @@ export function createFilter(context, start, end, params, cps, cycle) { time, curve: 1, }; - getParamLfo(context, frequencyParam, start, end, lfoValues); + lfo = getParamLfo(context, frequencyParam, start, end, lfoValues); } - return filter; + return { filter, lfo }; } // stays 1 until .5, then fades out diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 0db41c088..110f2b31d 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -287,7 +287,7 @@ export function connectToDestination(input, channels) { function getPhaser(time, end, frequency = 1, depth = 0.5, centerFrequency = 1000, sweep = 2000) { const ac = getAudioContext(); - const lfoGain = getLfo(ac, time, end, { frequency, depth: sweep * 2 }); + const lfo = getLfo(ac, time, end, { frequency, depth: sweep * 2 }); //filters const numStages = 2; //num of filters in series @@ -300,14 +300,14 @@ function getPhaser(time, end, frequency = 1, depth = 0.5, centerFrequency = 1000 filter.frequency.value = centerFrequency + fOffset; filter.Q.value = 2 - Math.min(Math.max(depth * 2, 0), 1.9); - lfoGain.connect(filter.detune); + lfo.connect(filter.detune); fOffset += 282; if (i > 0) { filterChain[i - 1].connect(filter); } filterChain.push(filter); } - return filterChain[filterChain.length - 1]; + return { filter: filterChain[filterChain.length - 1], lfo }; } function getFilterType(ftype) { @@ -561,9 +561,13 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) const lpParams = pickAndRename(value, lpMap); lpParams.type = 'lowpass'; let lp = () => createFilter(ac, t, end, lpParams, cps, cycle); - chain.push(lp()); + const { filter: lpf1, lfo: lfo1 } = lp(); + chain.push(lpf1); + lfo1 && audioNodes.push(lfo1); if (ftype === '24db') { - chain.push(lp()); + const { filter: lpf2, lfo: lfo2 } = lp(); + chain.push(lpf2); + lfo2 && audioNodes.push(lfo2); } } @@ -590,9 +594,13 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) const hpParams = pickAndRename(value, hpMap); hpParams.type = 'highpass'; let hp = () => createFilter(ac, t, end, hpParams, cps, cycle); - chain.push(hp()); + const { filter: hpf1, lfo: lfo1 } = hp(); + chain.push(hpf1); + lfo1 && audioNodes.push(lfo1) if (ftype === '24db') { - chain.push(hp()); + const { filter: hpf2, lfo: lfo2 } = hp(); + chain.push(hpf2); + lfo2 && audioNodes.push(lfo2) } } @@ -619,9 +627,13 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) const bpParams = pickAndRename(value, bpMap); bpParams.type = 'bandpass'; let bp = () => createFilter(ac, t, end, bpParams, cps, cycle); - chain.push(bp()); + const { filter: bpf1, lfo: lfo1 } = bp(); + chain.push(bpf1); + lfo1 && audioNodes.push(lfo1) if (ftype === '24db') { - chain.push(bp()); + const { filter: bpf2, lfo: lfo2 } = hp(); + chain.push(bpf2); + lfo2 && audioNodes.push(lfo2) } } @@ -685,8 +697,9 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) } // phaser if (phaser !== undefined && phaserdepth > 0) { - const phaserFX = getPhaser(t, endWithRelease, phaser, phaserdepth, phasercenter, phasersweep); - chain.push(phaserFX); + const { phaser, lfo } = getPhaser(t, endWithRelease, phaser, phaserdepth, phasercenter, phasersweep); + audioNodes.push(lfo); + chain.push(phaser); } // last gain From 692359309f211cda7b5dd26a6cd20c208a6090b7 Mon Sep 17 00:00:00 2001 From: Aria Date: Tue, 25 Nov 2025 17:31:11 -0600 Subject: [PATCH 202/312] Typo and formatting --- packages/superdough/superdough.mjs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 110f2b31d..5a8b72806 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -596,11 +596,11 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) let hp = () => createFilter(ac, t, end, hpParams, cps, cycle); const { filter: hpf1, lfo: lfo1 } = hp(); chain.push(hpf1); - lfo1 && audioNodes.push(lfo1) + lfo1 && audioNodes.push(lfo1); if (ftype === '24db') { const { filter: hpf2, lfo: lfo2 } = hp(); chain.push(hpf2); - lfo2 && audioNodes.push(lfo2) + lfo2 && audioNodes.push(lfo2); } } @@ -629,11 +629,11 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) let bp = () => createFilter(ac, t, end, bpParams, cps, cycle); const { filter: bpf1, lfo: lfo1 } = bp(); chain.push(bpf1); - lfo1 && audioNodes.push(lfo1) + lfo1 && audioNodes.push(lfo1); if (ftype === '24db') { - const { filter: bpf2, lfo: lfo2 } = hp(); + const { filter: bpf2, lfo: lfo2 } = bp(); chain.push(bpf2); - lfo2 && audioNodes.push(lfo2) + lfo2 && audioNodes.push(lfo2); } } From af90baea33a103f3f3812220894533000d502109 Mon Sep 17 00:00:00 2001 From: W-A-James Date: Sun, 26 Oct 2025 14:28:36 -0500 Subject: [PATCH 203/312] Fix trampling of port env variable --- packages/sampler/sample-server.mjs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/sampler/sample-server.mjs b/packages/sampler/sample-server.mjs index 31b83f5a3..891ae61fe 100644 --- a/packages/sampler/sample-server.mjs +++ b/packages/sampler/sample-server.mjs @@ -9,6 +9,8 @@ import readline from 'readline'; import os from 'os'; const LOG = !!process.env.LOG || false; +// eslint-disable-next-line +const PORT = process.env.PORT || 5432; const VALID_AUDIO_EXTENSIONS = ['wav', 'mp3', 'ogg']; const isAudioFile = (f) => { @@ -54,7 +56,7 @@ async function getBanks(directory, flat = false) { banks[bank].push(subDir); return subDir; }); - banks._base = `http://localhost:5432`; + banks._base = `http://localhost:${PORT}`; return { banks, files }; } @@ -134,8 +136,6 @@ const server = http.createServer(async (req, res) => { readStream.pipe(res); }); -// eslint-disable-next-line -const PORT = process.env.PORT || 5432; const IP_ADDRESS = '0.0.0.0'; let IP; const networkInterfaces = os.networkInterfaces(); From 9fdba6374ce07dc3d210e992ff024de5ecce64bb Mon Sep 17 00:00:00 2001 From: W-A-James Date: Fri, 31 Oct 2025 15:45:27 -0500 Subject: [PATCH 204/312] remove extraneous eslint ignore directive --- packages/sampler/sample-server.mjs | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/sampler/sample-server.mjs b/packages/sampler/sample-server.mjs index 891ae61fe..dfba1394a 100644 --- a/packages/sampler/sample-server.mjs +++ b/packages/sampler/sample-server.mjs @@ -9,7 +9,6 @@ import readline from 'readline'; import os from 'os'; const LOG = !!process.env.LOG || false; -// eslint-disable-next-line const PORT = process.env.PORT || 5432; const VALID_AUDIO_EXTENSIONS = ['wav', 'mp3', 'ogg']; From d70b758065a0a5f8d500b3a09527e80c6397de6b Mon Sep 17 00:00:00 2001 From: Aria Date: Thu, 20 Nov 2025 12:46:29 -0600 Subject: [PATCH 205/312] Remove base url from sample server and properly handle url schemes --- packages/sampler/sample-server.mjs | 1 - packages/superdough/sampler.mjs | 4 ++-- packages/superdough/util.mjs | 10 ++++++++++ packages/superdough/wavetable.mjs | 7 ++++--- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/packages/sampler/sample-server.mjs b/packages/sampler/sample-server.mjs index dfba1394a..1d5a8e7a6 100644 --- a/packages/sampler/sample-server.mjs +++ b/packages/sampler/sample-server.mjs @@ -55,7 +55,6 @@ async function getBanks(directory, flat = false) { banks[bank].push(subDir); return subDir; }); - banks._base = `http://localhost:${PORT}`; return { banks, files }; } diff --git a/packages/superdough/sampler.mjs b/packages/superdough/sampler.mjs index 84bac3582..aaa1a8e48 100644 --- a/packages/superdough/sampler.mjs +++ b/packages/superdough/sampler.mjs @@ -1,4 +1,4 @@ -import { getCommonSampleInfo } from './util.mjs'; +import { getBaseURL, getCommonSampleInfo } from './util.mjs'; import { registerSound, registerWaveTable } from './index.mjs'; import { getAudioContext } from './audioContext.mjs'; import { getADSRValues, getParamADSR, getPitchEnvelope, getVibratoOscillator } from './helpers.mjs'; @@ -211,7 +211,7 @@ export async function fetchSampleMap(url) { // not a browser return; } - const base = url.split('/').slice(0, -1).join('/'); + const base = getBaseURL(url); if (typeof fetch === 'undefined') { // skip fetch when in node / testing return; diff --git a/packages/superdough/util.mjs b/packages/superdough/util.mjs index 44ec79f77..0c0660117 100644 --- a/packages/superdough/util.mjs +++ b/packages/superdough/util.mjs @@ -113,4 +113,14 @@ export function getCommonSampleInfo(hapValue, bank) { /** Selects entries from `source` and renames them via `map` */ export const pickAndRename = (source, map) => { return Object.fromEntries(Object.entries(map).map(([newKey, oldKey]) => [newKey, source[oldKey]])); +} + +export const getBaseURL = (url) => { + try { + // For real URLs + return new URL('.', new URL(url)).href.replace(/\/$/, ''); // removes trailing slash + } catch { + // For pseudo URLS + return url.split('/').slice(0, -1).join('/'); + } }; diff --git a/packages/superdough/wavetable.mjs b/packages/superdough/wavetable.mjs index 01d4eb838..83b7b497a 100644 --- a/packages/superdough/wavetable.mjs +++ b/packages/superdough/wavetable.mjs @@ -1,5 +1,5 @@ import { getAudioContext, registerSound } from './index.mjs'; -import { getCommonSampleInfo } from './util.mjs'; +import { getBaseURL, getCommonSampleInfo } from './util.mjs'; import { applyFM, applyParameterModulators, @@ -134,7 +134,7 @@ function githubPath(base, subpath = '') { return `https://raw.githubusercontent.com/${path}/${subpath}`; } -const _processTables = (json, baseUrl, frameLen, options = {}) => { +const _processTables = (json, baseUrl, frameLen) => { baseUrl = json._base || baseUrl; return Object.entries(json).forEach(([key, tables]) => { if (key === '_base') return false; @@ -190,6 +190,7 @@ export const tables = async (url, frameLen, json, options = {}) => { if (url.startsWith('local:')) { url = `http://localhost:5432`; } + const base = getBaseURL(url); if (typeof fetch !== 'function') { // not a browser return; @@ -200,7 +201,7 @@ export const tables = async (url, frameLen, json, options = {}) => { } return fetch(url) .then((res) => res.json()) - .then((json) => _processTables(json, url, frameLen, options)) + .then((json) => _processTables(json, base, frameLen, options)) .catch((error) => { console.error(error); throw new Error(`error loading "${url}"`); From a5c7fcc136f5702d83d5c613fafea9b14476d7d4 Mon Sep 17 00:00:00 2001 From: Aria Date: Tue, 25 Nov 2025 11:26:59 -0600 Subject: [PATCH 206/312] Add back options code (will resolve in another PR) --- packages/superdough/wavetable.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/superdough/wavetable.mjs b/packages/superdough/wavetable.mjs index 83b7b497a..3659edcd0 100644 --- a/packages/superdough/wavetable.mjs +++ b/packages/superdough/wavetable.mjs @@ -134,7 +134,7 @@ function githubPath(base, subpath = '') { return `https://raw.githubusercontent.com/${path}/${subpath}`; } -const _processTables = (json, baseUrl, frameLen) => { +const _processTables = (json, baseUrl, frameLen, options = {}) => { baseUrl = json._base || baseUrl; return Object.entries(json).forEach(([key, tables]) => { if (key === '_base') return false; From a126bc9b86d22674d40eddc98bd5e37bb234e917 Mon Sep 17 00:00:00 2001 From: W-A-James Date: Tue, 25 Nov 2025 22:20:55 -0500 Subject: [PATCH 207/312] Fix lint --- packages/superdough/util.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/superdough/util.mjs b/packages/superdough/util.mjs index 0c0660117..48830541a 100644 --- a/packages/superdough/util.mjs +++ b/packages/superdough/util.mjs @@ -113,7 +113,7 @@ export function getCommonSampleInfo(hapValue, bank) { /** Selects entries from `source` and renames them via `map` */ export const pickAndRename = (source, map) => { return Object.fromEntries(Object.entries(map).map(([newKey, oldKey]) => [newKey, source[oldKey]])); -} +}; export const getBaseURL = (url) => { try { From d217119391f3f189869dc01134f981887d6ea297 Mon Sep 17 00:00:00 2001 From: Peter Egger Date: Sat, 22 Nov 2025 22:31:50 +0100 Subject: [PATCH 208/312] fix(tool/dbpatch): add missing package name --- tools/dbpatch/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/dbpatch/package.json b/tools/dbpatch/package.json index 3ee042ad9..21d79e199 100644 --- a/tools/dbpatch/package.json +++ b/tools/dbpatch/package.json @@ -1,4 +1,5 @@ { + "name": "dbpatch", "dependencies": { "csv": "^6.3.11" }, From f4b1baac878d99af91916fe27174f8b268320b33 Mon Sep 17 00:00:00 2001 From: Alex McLean Date: Thu, 27 Nov 2025 15:34:18 +0000 Subject: [PATCH 209/312] add revv() for reversing whole patterns --- packages/core/pattern.mjs | 19 ++++++++++++++++++- packages/core/test/pattern.test.mjs | 12 ++++++++++++ test/__snapshots__/examples.test.mjs.snap | 13 +++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index 4737f0db0..9a9ffe98f 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -2234,7 +2234,7 @@ export const brak = register('brak', function (pat) { }); /** - * Reverse all haps in a pattern + * Reverse all cycles in a pattern. See also `revv` for reversing a whole pattern. * * @name rev * @memberof Pattern @@ -2266,6 +2266,23 @@ export const rev = register( true, ); +/** + * Reverse a whole pattern. See also `revv` for reversing each cycle. + * + * @name rev + * @memberof Pattern + * @returns Pattern + * @example + * // This is the same as `<[g e] [d c]>`. If `rev()` is used, you get + * // the same as `<[d c] [g e]>`, where each cycle reverses, but the order of + * // cycles stays the same. + * note("<[c d] [e g]>").revv() + */ +export const revv = register('revv', function (pat) { + const negateSpan = (span) => new TimeSpan(Fraction(0).sub(span.end), Fraction(0).sub(span.begin)); + return pat.withQuerySpan(negateSpan).withHapSpan(negateSpan); +}); + /** Like press, but allows you to specify the amount by which each * event is shifted. pressBy(0.5) is the same as press, while * pressBy(1/3) shifts each event by a third of its timespan. diff --git a/packages/core/test/pattern.test.mjs b/packages/core/test/pattern.test.mjs index 1df5c8776..408ff274b 100644 --- a/packages/core/test/pattern.test.mjs +++ b/packages/core/test/pattern.test.mjs @@ -586,6 +586,18 @@ describe('Pattern', () => { .map((a) => a.value), ).toStrictEqual(['c', 'b', 'a']); }); + it('Does not reverse the order of cycles', () => { + expect(fastcat('a', 'b', 'c', 'd').slow(2).rev().fast(2).sortHapsByPart().firstCycle()).toStrictEqual( + fastcat('b', 'a', 'd', 'c').firstCycle(), + ); + }); + }); + describe('revv()', () => { + it('Does reverse the order of cycles', () => { + expect(fastcat('a', 'b', 'c', 'd').slow(2).revv().fast(2).sortHapsByPart().firstCycle()).toStrictEqual( + fastcat('d', 'c', 'b', 'a').firstCycle(), + ); + }); }); describe('sequence()', () => { it('Can work like fastcat', () => { diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 4fc037b19..064f4c2d5 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -9256,6 +9256,19 @@ exports[`runs examples > example "rev" example index 0 1`] = ` ] `; +exports[`runs examples > example "rev" example index 0 2`] = ` +[ + "[ 0/1 → 1/2 | note:g ]", + "[ 1/2 → 1/1 | note:e ]", + "[ 1/1 → 3/2 | note:d ]", + "[ 3/2 → 2/1 | note:c ]", + "[ 2/1 → 5/2 | note:g ]", + "[ 5/2 → 3/1 | note:e ]", + "[ 3/1 → 7/2 | note:d ]", + "[ 7/2 → 4/1 | note:c ]", +] +`; + exports[`runs examples > example "ribbon" example index 0 1`] = ` [ "[ 0/1 → 1/1 | note:d ]", From b824c45ba40eb99e434171995b02d8541b09890e Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Thu, 27 Nov 2025 21:11:50 +0100 Subject: [PATCH 210/312] Merge remote-tracking branch 'origin/main' into glossing/sounds-tab-preview --- packages/core/controls.mjs | 56 +- packages/core/pattern.mjs | 4 +- packages/core/repl.mjs | 21 +- packages/core/signal.mjs | 2 +- packages/hydra/hydra.mjs | 1 + packages/sampler/sample-server.mjs | 4 +- packages/superdough/helpers.mjs | 53 +- packages/superdough/noise.mjs | 3 +- packages/superdough/sampler.mjs | 4 +- packages/superdough/superdough.mjs | 13 +- packages/superdough/superdoughoutput.mjs | 2 +- packages/superdough/synth.mjs | 24 +- packages/superdough/util.mjs | 10 + packages/superdough/vowel.mjs | 22 +- packages/superdough/wavetable.mjs | 5 +- packages/superdough/worklets.mjs | 11 +- packages/tonal/tonal.mjs | 13 +- test/__snapshots__/examples.test.mjs.snap | 534 ++++++++++++++++-- .../repl/components/button/action-button.jsx | 31 + .../panel/ImportPrebakeScriptButton.jsx | 29 + .../src/repl/components/panel/SettingsTab.jsx | 17 +- .../src/repl/components/panel/SoundsTab.jsx | 13 +- website/src/repl/prebake.mjs | 2 + website/src/repl/useReplContext.jsx | 20 +- website/src/repl/util.mjs | 11 +- website/src/settings.mjs | 5 + 26 files changed, 777 insertions(+), 133 deletions(-) create mode 100644 website/src/repl/components/panel/ImportPrebakeScriptButton.jsx diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 9a2be7f44..21a6d9624 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -1294,6 +1294,8 @@ export const { fanchor } = registerControl('fanchor'); * * @name lprate * @param {number | Pattern} rate rate in hertz + * @example + * note("*16").s("sawtooth").lpf(600).lprate("<4 8 2 1>") */ export const { lprate } = registerControl('lprate'); @@ -1302,6 +1304,8 @@ export const { lprate } = registerControl('lprate'); * * @name lpsync * @param {number | Pattern} rate rate in cycles + * @example + * note("*16").s("sawtooth").lpf(600).lpsync("<4 8 2 1>") */ export const { lpsync } = registerControl('lpsync'); @@ -1310,8 +1314,23 @@ export const { lpsync } = registerControl('lpsync'); * * @name lpdepth * @param {number | Pattern} depth depth of modulation + * @example + * note("*16").s("sawtooth").lpf(600).lpdepth("<1 .5 1.8 0>") */ + export const { lpdepth } = registerControl('lpdepth'); +/** + * Depth of the LFO for the lowpass filter, in HZ + * + * @name lpdepthfrequency + * @synonyms + * lpdethfreq + * @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'); /** * Shape of the LFO for the lowpass filter @@ -1361,6 +1380,19 @@ export const { bpsync } = registerControl('bpsync'); */ export const { bpdepth } = registerControl('bpdepth'); +/** + * Depth of the LFO for the bandpass filter, in HZ + * + * @name bpdepthfrequency + * @synonyms + * bpdethfreq + * @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'); + /** * Shape of the LFO for the bandpass filter * @@ -1407,7 +1439,20 @@ export const { hpsync } = registerControl('hpsync'); * @name hpdepth * @param {number | Pattern} depth depth of modulation */ -export const { hpdepth } = registerControl('hpdepth'); +export const { hpdepth, hpdepthfreq } = registerControl('hpdepth'); + +/** + * Depth of the LFO for the hipass filter, in hz + * + * @name hpdepthfrequency + * @synonyms + * hpdethfreq + * @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'); /** * Shape of the LFO for the highpass filter @@ -1820,12 +1865,12 @@ export const { nudge } = registerControl('nudge'); * Sets the default octave of a synth. * * @name octave + * @synonyms oct * @param {number | Pattern} octave octave number * @example - * n("0,4,7").s('supersquare').octave("<3 4 5 6>").osc() - * @superDirtOnly + * n("0,4,7").scale("F:minor").s('supersaw').octave("<0 1 2 3>") */ -export const { octave } = registerControl('octave'); +export const { octave, oct } = registerControl('octave', 'oct'); // ['ophatdecay'], // TODO: example @@ -1833,6 +1878,7 @@ export const { octave } = registerControl('octave'); * An `orbit` is a global parameter context for patterns. Patterns with the same orbit will share the same global effects. * * @name orbit + * @synonyms o * @param {number | Pattern} number * @example * stack( @@ -1840,7 +1886,7 @@ export const { octave } = registerControl('octave'); * s("~ sd ~ sd").delay(.5).delaytime(.125).orbit(2) * ) */ -export const { orbit } = registerControl('orbit'); +export const { orbit } = registerControl('orbit', 'o'); // TODO: what is this? not found in tidal doc Answer: gain is limited to maximum of 2. This allows you to go over that export const { overgain } = registerControl('overgain'); // TODO: what is this? not found in tidal doc. Similar to above, but limited to 1 diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index 4737f0db0..239195392 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -25,7 +25,7 @@ import { stringifyValues, } from './util.mjs'; import drawLine from './drawLine.mjs'; -import { logger } from './logger.mjs'; +import { errorLogger, logger } from './logger.mjs'; let stringParser; @@ -414,7 +414,7 @@ export class Pattern { try { return this.query(new State(new TimeSpan(begin, end), controls)); } catch (err) { - logger(`[query]: ${err.message}`, 'error'); + errorLogger(err, 'query'); return []; } } diff --git a/packages/core/repl.mjs b/packages/core/repl.mjs index 171697eb9..67028cb0c 100644 --- a/packages/core/repl.mjs +++ b/packages/core/repl.mjs @@ -152,9 +152,9 @@ export function repl({ // allows muting a pattern x with x_ or _x return silence; } - if (id === '$') { + if (id.includes('$')) { // allows adding anonymous patterns with $: - id = `$${anonymousIndex}`; + id = `${id}${anonymousIndex}`; anonymousIndex++; } pPatterns[id] = this; @@ -215,8 +215,19 @@ export function repl({ let { pattern, meta } = await _evaluate(code, transpiler, transpilerOptions); if (Object.keys(pPatterns).length) { let patterns = []; + let soloActive = false; for (const [key, value] of Object.entries(pPatterns)) { - patterns.push(value.withState((state) => state.setControls({ id: key }))); + // handle soloed patterns ex: S$: s("bd!4") + const isSolod = key.length > 1 && key.startsWith('S'); + if (isSolod && soloActive === false) { + // first time we see a soloed pattern, clear existing patterns + patterns = []; + soloActive = true; + } + if (!soloActive || (soloActive && isSolod)) { + const valWithState = value.withState((state) => state.setControls({ id: key })); + patterns.push(valWithState); + } } if (eachTransform) { // Explicit lambda so only element (not index and array) are passed @@ -227,8 +238,8 @@ export function repl({ pattern = eachTransform(pattern); } if (allTransforms.length) { - for (let i in allTransforms) { - pattern = allTransforms[i](pattern); + for (const transform of allTransforms) { + pattern = transform(pattern); } } diff --git a/packages/core/signal.mjs b/packages/core/signal.mjs index 604d1c805..62fc26ad8 100644 --- a/packages/core/signal.mjs +++ b/packages/core/signal.mjs @@ -524,7 +524,7 @@ export const wchoose = (...pairs) => wchooseWith(rand, ...pairs); * @example * wchooseCycles(["bd",10], ["hh",1], ["sd",1]).s().fast(8) * @example - * wchooseCycles(["bd bd bd",5], ["hh hh hh",3], ["sd sd sd",1]).fast(4).s() + * wchooseCycles(["c c c",5], ["a a a",3], ["f f f",1]).fast(4).note() * @example * // The probability can itself be a pattern * wchooseCycles(["bd(3,8)","<5 0>"], ["hh hh hh",3]).fast(4).s() diff --git a/packages/hydra/hydra.mjs b/packages/hydra/hydra.mjs index 2cb265c2f..c13410121 100644 --- a/packages/hydra/hydra.mjs +++ b/packages/hydra/hydra.mjs @@ -35,6 +35,7 @@ export async function initHydra(options = {}) { hydra.synth.s0.init({ src: canvas }); } } + return hydra; } export function clearHydra() { diff --git a/packages/sampler/sample-server.mjs b/packages/sampler/sample-server.mjs index 31b83f5a3..1d5a8e7a6 100644 --- a/packages/sampler/sample-server.mjs +++ b/packages/sampler/sample-server.mjs @@ -9,6 +9,7 @@ import readline from 'readline'; import os from 'os'; const LOG = !!process.env.LOG || false; +const PORT = process.env.PORT || 5432; const VALID_AUDIO_EXTENSIONS = ['wav', 'mp3', 'ogg']; const isAudioFile = (f) => { @@ -54,7 +55,6 @@ async function getBanks(directory, flat = false) { banks[bank].push(subDir); return subDir; }); - banks._base = `http://localhost:5432`; return { banks, files }; } @@ -134,8 +134,6 @@ const server = http.createServer(async (req, res) => { readStream.pipe(res); }); -// eslint-disable-next-line -const PORT = process.env.PORT || 5432; const IP_ADDRESS = '0.0.0.0'; let IP; const networkInterfaces = os.networkInterfaces(); diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 47161ed61..baa4db25e 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -191,8 +191,7 @@ export function applyParameterModulators(audioContext, param, start, end, envelo const lfo = getParamLfo(audioContext, param, start, end, lfoValues); return { lfo, disconnect: () => lfo?.disconnect() }; } - -export function createFilter(context, start, end, params, cps) { +export function createFilter(context, start, end, params, cps, cycle) { let { frequency, anchor, @@ -202,12 +201,14 @@ export function createFilter(context, start, end, params, cps) { q = 1, drive = 0.69, depth, + depthfrequency, dcoffset = -0.5, skew, shape, rate, sync, } = params; + let frequencyParam, filter; if (model === 'ladder') { filter = getWorklet(context, 'ladder-processor', { frequency, q, drive }); @@ -238,8 +239,25 @@ export function createFilter(context, start, end, params, cps) { if (sync != null) { rate = cps * sync; } - const lfoValues = { depth, dcoffset, skew, shape, frequency: rate }; - getParamLfo(context, frequencyParam, start, end, lfoValues); + const hasLFO = [depth, depthfrequency, skew, shape, rate].some((v) => v !== undefined); + if (hasLFO) { + depth = depth ?? 1; + const time = cycle / cps; + const modDepth = depthfrequency ?? (depth ?? 1) * frequency; + const lfoValues = { + depth: modDepth, + dcoffset, + skew, + shape, + frequency: rate ?? cps, + min: -frequency + 30, + max: 20000 - frequency, + time, + curve: 1, + }; + getParamLfo(context, frequencyParam, start, end, lfoValues); + } + return filter; } @@ -262,7 +280,15 @@ export function drywet(dry, wet, wetAmount = 0) { let mix = ac.createGain(); dry_gain.connect(mix); wet_gain.connect(mix); - return mix; + return { + node: mix, + onended: () => { + dry_gain.disconnect(mix); + wet_gain.disconnect(mix); + dry.disconnect(dry_gain); + wet.disconnect(wet_gain); + }, + }; } let curves = ['linear', 'exponential']; @@ -297,6 +323,10 @@ export function getVibratoOscillator(param, value, t) { gain.gain.value = vibmod * 100; vibratoOscillator.connect(gain); gain.connect(param); + vibratoOscillator.onended = () => { + gain.disconnect(param); + vibratoOscillator.disconnect(gain); + }; vibratoOscillator.start(t); return vibratoOscillator; } @@ -350,9 +380,9 @@ const mod = (freq, range = 1, type = 'sine') => { } osc.start(); - const g = new GainNode(ctx, { gain: range }); + const g = gainNode(range); osc.connect(g); // -range, range - return { node: g, stop: (t) => osc.stop(t) }; + return { node: g, stop: (t) => osc.stop(t), osc: osc }; }; const fm = (frequencyparam, harmonicityRatio, modulationIndex, wave = 'sine') => { const carrfreq = frequencyparam.value; @@ -404,6 +434,11 @@ export function applyFM(param, value, begin) { modulator.connect(envGain); envGain.connect(param); } + fmmod.osc.onended = () => { + envGain.disconnect(); + modulator.disconnect(); + fmmod.osc.disconnect(); + }; } return { stop }; } @@ -505,7 +540,7 @@ export const getDistortion = (distort, postgain, algorithm) => { }; export const getFrequencyFromValue = (value, defaultNote = 36) => { - let { note, freq } = value; + let { note, freq, octave = 0 } = value; note = note || defaultNote; if (typeof note === 'string') { note = noteToMidi(note); // e.g. c3 => 48 @@ -514,7 +549,7 @@ export const getFrequencyFromValue = (value, defaultNote = 36) => { if (!freq && typeof note === 'number') { freq = midiToFreq(note); // + 48); } - + freq *= Math.pow(2, octave); return Number(freq); }; diff --git a/packages/superdough/noise.mjs b/packages/superdough/noise.mjs index 816dd252b..3e41515df 100644 --- a/packages/superdough/noise.mjs +++ b/packages/superdough/noise.mjs @@ -65,8 +65,9 @@ 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(); return { - node: noiseMix, + node: noiseMix.node, stop: (time) => noiseOscillator?.stop(time), }; } diff --git a/packages/superdough/sampler.mjs b/packages/superdough/sampler.mjs index 84bac3582..aaa1a8e48 100644 --- a/packages/superdough/sampler.mjs +++ b/packages/superdough/sampler.mjs @@ -1,4 +1,4 @@ -import { getCommonSampleInfo } from './util.mjs'; +import { getBaseURL, getCommonSampleInfo } from './util.mjs'; import { registerSound, registerWaveTable } from './index.mjs'; import { getAudioContext } from './audioContext.mjs'; import { getADSRValues, getParamADSR, getPitchEnvelope, getVibratoOscillator } from './helpers.mjs'; @@ -211,7 +211,7 @@ export async function fetchSampleMap(url) { // not a browser return; } - const base = url.split('/').slice(0, -1).join('/'); + const base = getBaseURL(url); if (typeof fetch === 'undefined') { // skip fetch when in node / testing return; diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 73fece4f5..d4a10531b 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -553,13 +553,14 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) rate: 'lprate', sync: 'lpsync', depth: 'lpdepth', + depthfrequency: 'lpdepthfrequency', shape: 'lpshape', dcoffset: 'lpdc', skew: 'lpskew', }; const lpParams = pickAndRename(value, lpMap); lpParams.type = 'lowpass'; - let lp = () => createFilter(ac, t, end, lpParams, cps); + let lp = () => createFilter(ac, t, end, lpParams, cps, cycle); chain.push(lp()); if (ftype === '24db') { chain.push(lp()); @@ -581,13 +582,14 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) rate: 'hprate', sync: 'hpsync', depth: 'hpdepth', + depthfrequency: 'hpdepthfrequency', shape: 'hpshape', dcoffset: 'hpdc', skew: 'hpskew', }; const hpParams = pickAndRename(value, hpMap); hpParams.type = 'highpass'; - let hp = () => createFilter(ac, t, end, hpParams, cps); + let hp = () => createFilter(ac, t, end, hpParams, cps, cycle); chain.push(hp()); if (ftype === '24db') { chain.push(hp()); @@ -609,13 +611,14 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) rate: 'bprate', sync: 'bpsync', depth: 'bpdepth', + depthfrequency: 'bpdepthfrequency', shape: 'bpshape', dcoffset: 'bpdc', skew: 'bpskew', }; const bpParams = pickAndRename(value, bpMap); bpParams.type = 'bandpass'; - let bp = () => createFilter(ac, t, end, bpParams, cps); + let bp = () => createFilter(ac, t, end, bpParams, cps, cycle); chain.push(bp()); if (ftype === '24db') { chain.push(bp()); @@ -665,6 +668,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) curve: 1.5, }); lfo.connect(amGain.gain); + audioNodes.push(lfo); chain.push(amGain); } @@ -692,7 +696,8 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) // delay if (delay > 0 && delaytime > 0 && delayfeedback > 0) { orbitBus.getDelay(delaytime, delayfeedback, t); - orbitBus.sendDelay(post, delay); + const send = orbitBus.sendDelay(post, delay); + audioNodes.push(send); } // reverb if (room > 0) { diff --git a/packages/superdough/superdoughoutput.mjs b/packages/superdough/superdoughoutput.mjs index a4235efd0..d8ead7d06 100644 --- a/packages/superdough/superdoughoutput.mjs +++ b/packages/superdough/superdoughoutput.mjs @@ -82,7 +82,7 @@ export class Orbit { } sendDelay(node, amount) { - effectSend(node, this.delayNode, amount); + return effectSend(node, this.delayNode, amount); } duck(t, onsettime = 0, attacktime = 0.1, depth = 1) { diff --git a/packages/superdough/synth.mjs b/packages/superdough/synth.mjs index 10df1776b..768638f04 100644 --- a/packages/superdough/synth.mjs +++ b/packages/superdough/synth.mjs @@ -48,19 +48,17 @@ export function registerSynthSounds() { [0.001, 0.05, 0.6, 0.01], ); - let sound = getOscillator(s, t, value); - let { node: o, stop, triggerRelease } = sound; - // turn down const g = gainNode(0.3); - const { duration } = value; - - o.onended = () => { - o.disconnect(); + let sound = getOscillator(s, t, value, () => { g.disconnect(); onended(); - }; + }); + + let { node: o, stop, triggerRelease } = sound; + + const { duration } = value; const envGain = gainNode(1); let node = o.connect(g).connect(envGain); @@ -460,7 +458,7 @@ export function waveformN(partials, phases, type) { } // expects one of waveforms as s -export function getOscillator(s, t, value) { +export function getOscillator(s, t, value, onended) { const { duration, noise = 0 } = value; const partials = value.partials ?? value.n; let o; @@ -482,7 +480,6 @@ export function getOscillator(s, t, value) { } // set frequency o.frequency.value = getFrequencyFromValue(value); - o.start(t); let vibratoOscillator = getVibratoOscillator(o.detune, value, t); @@ -495,6 +492,13 @@ export function getOscillator(s, t, value) { noiseMix = getNoiseMix(o, noise, t); } + o.onended = () => { + o.disconnect(); + noiseMix?.node.disconnect(); + onended(); + }; + o.start(t); + return { node: noiseMix?.node || o, stop: (time) => { diff --git a/packages/superdough/util.mjs b/packages/superdough/util.mjs index 44ec79f77..48830541a 100644 --- a/packages/superdough/util.mjs +++ b/packages/superdough/util.mjs @@ -114,3 +114,13 @@ export function getCommonSampleInfo(hapValue, bank) { export const pickAndRename = (source, map) => { return Object.fromEntries(Object.entries(map).map(([newKey, oldKey]) => [newKey, source[oldKey]])); }; + +export const getBaseURL = (url) => { + try { + // For real URLs + return new URL('.', new URL(url)).href.replace(/\/$/, ''); // removes trailing slash + } catch { + // For pseudo URLS + return url.split('/').slice(0, -1).join('/'); + } +}; diff --git a/packages/superdough/vowel.mjs b/packages/superdough/vowel.mjs index 3f30aef1e..fda0c6479 100644 --- a/packages/superdough/vowel.mjs +++ b/packages/superdough/vowel.mjs @@ -45,7 +45,8 @@ if (typeof GainNode !== 'undefined') { throw new Error('vowel: unknown vowel ' + letter); } const { gains, qs, freqs } = vowelFormant[letter]; - const makeupGain = ac.createGain(); + this.makeupGain = ac.createGain(); + this.audioNodes = []; for (let i = 0; i < 5; i++) { const gain = ac.createGain(); gain.gain.value = gains[i]; @@ -53,14 +54,25 @@ if (typeof GainNode !== 'undefined') { filter.type = 'bandpass'; filter.Q.value = qs[i]; filter.frequency.value = freqs[i]; - this.connect(filter); + super.connect(filter); filter.connect(gain); - gain.connect(makeupGain); + this.audioNodes.push(filter); + gain.connect(this.makeupGain); + this.audioNodes.push(gain); } - makeupGain.gain.value = 8; // how much makeup gain to add? - this.connect = (target) => makeupGain.connect(target); + this.makeupGain.gain.value = 8; // how much makeup gain to add? return this; } + connect(target) { + this.makeupGain.connect(target); + } + disconnect() { + this.makeupGain.disconnect(); + this.audioNodes.forEach((n) => n.disconnect()); + super.disconnect(); + this.makeupGain = null; + this.audioNodes = null; + } } AudioContext.prototype.createVowelFilter = function (letter) { diff --git a/packages/superdough/wavetable.mjs b/packages/superdough/wavetable.mjs index 01d4eb838..3659edcd0 100644 --- a/packages/superdough/wavetable.mjs +++ b/packages/superdough/wavetable.mjs @@ -1,5 +1,5 @@ import { getAudioContext, registerSound } from './index.mjs'; -import { getCommonSampleInfo } from './util.mjs'; +import { getBaseURL, getCommonSampleInfo } from './util.mjs'; import { applyFM, applyParameterModulators, @@ -190,6 +190,7 @@ export const tables = async (url, frameLen, json, options = {}) => { if (url.startsWith('local:')) { url = `http://localhost:5432`; } + const base = getBaseURL(url); if (typeof fetch !== 'function') { // not a browser return; @@ -200,7 +201,7 @@ export const tables = async (url, frameLen, json, options = {}) => { } return fetch(url) .then((res) => res.json()) - .then((json) => _processTables(json, url, frameLen, options)) + .then((json) => _processTables(json, base, frameLen, options)) .catch((error) => { console.error(error); throw new Error(`error loading "${url}"`); diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index 359bc833a..bf633a63b 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -532,7 +532,7 @@ class SuperSawOscillatorProcessor extends AudioWorkletProcessor { const freqVoice = applySemitoneDetuneToFrequency(freq, detuner(n)); // We must wrap this here because it is passed into sawblep below which // has domain [0, 1] - const dt = ffrac(freqVoice * INVSR); + const dt = frac(freqVoice * INVSR); this.phase[n] = this.phase[n] ?? Math.random(); const v = waveshapes.sawblep(this.phase[n], dt); @@ -543,8 +543,9 @@ class SuperSawOscillatorProcessor extends AudioWorkletProcessor { if (pn >= 1.0) pn -= 1.0; this.phase[n] = pn; // invert right and left gain + const tmp = gainL; gainL = gainR; - gainR = gainL; + gainR = tmp; } } return true; @@ -1338,7 +1339,7 @@ class WavetableOscillatorProcessor extends AudioWorkletProcessor { const tablePos = clamp(pv(parameters.position, i), 0, 1); const idx = tablePos * (this.numFrames - 1); const fIdx = idx | 0; - const frac = idx - fIdx; + const interpT = idx - fIdx; const warpAmount = clamp(pv(parameters.warp, i), 0, 1); const warpMode = pv(parameters.warpMode, i); const phaseRand = clamp(pv(parameters.phaserand, i), 0, 1); @@ -1368,13 +1369,13 @@ class WavetableOscillatorProcessor extends AudioWorkletProcessor { const ph = this._warpPhase(this.phase[n], warpAmount, warpMode); const s0 = this._sampleFrame(table[fIdx], ph); const s1 = this._sampleFrame(table[Math.min(this.numFrames - 1, fIdx + 1)], ph); - let s = s0 + (s1 - s0) * frac; + let s = lerp(s0, s1, interpT); if (warpMode === WarpMode.FLIP && this.phase[n] < warpAmount) { s = -s; } outL[i] += s * gainL * normalizer; outR[i] += s * gainR * normalizer; - this.phase[n] = ffrac(this.phase[n] + dPhase); + this.phase[n] = frac(this.phase[n] + dPhase); } } return true; diff --git a/packages/tonal/tonal.mjs b/packages/tonal/tonal.mjs index 427a66f4c..951f0f7e6 100644 --- a/packages/tonal/tonal.mjs +++ b/packages/tonal/tonal.mjs @@ -5,7 +5,16 @@ This program is free software: you can redistribute it and/or modify it under th */ import { Note, Interval, Scale } from '@tonaljs/tonal'; -import { register, _mod, logger, isNote, noteToMidi, removeUndefineds, getAccidentalsOffset } from '@strudel/core'; +import { + _mod, + errorLogger, + getAccidentalsOffset, + isNote, + logger, + noteToMidi, + register, + removeUndefineds, +} from '@strudel/core'; import { stepInNamedScale, nearestNumberIndex } from './tonleiter.mjs'; const octavesInterval = (octaves) => (octaves <= 0 ? -1 : 1) + octaves * 7 + 'P'; @@ -294,7 +303,7 @@ export const scale = register( } if (offset != 0) scaleNote = Note.transpose(scaleNote, Interval.fromSemitones(offset)); } catch (err) { - logger(`[tonal] ${err.message}`, 'error'); + errorLogger(err, 'tonal'); return; // will be removed } } diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 32e61c31d..4fc037b19 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -1391,6 +1391,75 @@ exports[`runs examples > example "bpdecay" example index 0 1`] = ` ] `; +exports[`runs examples > example "bpdepthfrequency" example index 0 1`] = ` +[ + "[ 0/1 → 1/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:200 ]", + "[ 1/16 → 1/8 | note:c s:sawtooth cutoff:600 bpdepthfrequency:200 ]", + "[ 1/8 → 3/16 | note:c# s:sawtooth cutoff:600 bpdepthfrequency:200 ]", + "[ 3/16 → 1/4 | note:c s:sawtooth cutoff:600 bpdepthfrequency:200 ]", + "[ 1/4 → 5/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:200 ]", + "[ 5/16 → 3/8 | note:c4 s:sawtooth cutoff:600 bpdepthfrequency:200 ]", + "[ 3/8 → 7/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:200 ]", + "[ 7/16 → 1/2 | note:c s:sawtooth cutoff:600 bpdepthfrequency:200 ]", + "[ 1/2 → 9/16 | note:c# s:sawtooth cutoff:600 bpdepthfrequency:200 ]", + "[ 9/16 → 5/8 | note:c s:sawtooth cutoff:600 bpdepthfrequency:200 ]", + "[ 5/8 → 11/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:200 ]", + "[ 11/16 → 3/4 | note:c4 s:sawtooth cutoff:600 bpdepthfrequency:200 ]", + "[ 3/4 → 13/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:200 ]", + "[ 13/16 → 7/8 | note:c s:sawtooth cutoff:600 bpdepthfrequency:200 ]", + "[ 7/8 → 15/16 | note:c# s:sawtooth cutoff:600 bpdepthfrequency:200 ]", + "[ 15/16 → 1/1 | note:c s:sawtooth cutoff:600 bpdepthfrequency:200 ]", + "[ 1/1 → 17/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:500 ]", + "[ 17/16 → 9/8 | note:c4 s:sawtooth cutoff:600 bpdepthfrequency:500 ]", + "[ 9/8 → 19/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:500 ]", + "[ 19/16 → 5/4 | note:c s:sawtooth cutoff:600 bpdepthfrequency:500 ]", + "[ 5/4 → 21/16 | note:c# s:sawtooth cutoff:600 bpdepthfrequency:500 ]", + "[ 21/16 → 11/8 | note:c s:sawtooth cutoff:600 bpdepthfrequency:500 ]", + "[ 11/8 → 23/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:500 ]", + "[ 23/16 → 3/2 | note:c4 s:sawtooth cutoff:600 bpdepthfrequency:500 ]", + "[ 3/2 → 25/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:500 ]", + "[ 25/16 → 13/8 | note:c s:sawtooth cutoff:600 bpdepthfrequency:500 ]", + "[ 13/8 → 27/16 | note:c# s:sawtooth cutoff:600 bpdepthfrequency:500 ]", + "[ 27/16 → 7/4 | note:c s:sawtooth cutoff:600 bpdepthfrequency:500 ]", + "[ 7/4 → 29/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:500 ]", + "[ 29/16 → 15/8 | note:c4 s:sawtooth cutoff:600 bpdepthfrequency:500 ]", + "[ 15/8 → 31/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:500 ]", + "[ 31/16 → 2/1 | note:c s:sawtooth cutoff:600 bpdepthfrequency:500 ]", + "[ 2/1 → 33/16 | note:c# s:sawtooth cutoff:600 bpdepthfrequency:100 ]", + "[ 33/16 → 17/8 | note:c s:sawtooth cutoff:600 bpdepthfrequency:100 ]", + "[ 17/8 → 35/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:100 ]", + "[ 35/16 → 9/4 | note:c4 s:sawtooth cutoff:600 bpdepthfrequency:100 ]", + "[ 9/4 → 37/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:100 ]", + "[ 37/16 → 19/8 | note:c s:sawtooth cutoff:600 bpdepthfrequency:100 ]", + "[ 19/8 → 39/16 | note:c# s:sawtooth cutoff:600 bpdepthfrequency:100 ]", + "[ 39/16 → 5/2 | note:c s:sawtooth cutoff:600 bpdepthfrequency:100 ]", + "[ 5/2 → 41/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:100 ]", + "[ 41/16 → 21/8 | note:c4 s:sawtooth cutoff:600 bpdepthfrequency:100 ]", + "[ 21/8 → 43/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:100 ]", + "[ 43/16 → 11/4 | note:c s:sawtooth cutoff:600 bpdepthfrequency:100 ]", + "[ 11/4 → 45/16 | note:c# s:sawtooth cutoff:600 bpdepthfrequency:100 ]", + "[ 45/16 → 23/8 | note:c s:sawtooth cutoff:600 bpdepthfrequency:100 ]", + "[ 23/8 → 47/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:100 ]", + "[ 47/16 → 3/1 | note:c4 s:sawtooth cutoff:600 bpdepthfrequency:100 ]", + "[ 3/1 → 49/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:0 ]", + "[ 49/16 → 25/8 | note:c s:sawtooth cutoff:600 bpdepthfrequency:0 ]", + "[ 25/8 → 51/16 | note:c# s:sawtooth cutoff:600 bpdepthfrequency:0 ]", + "[ 51/16 → 13/4 | note:c s:sawtooth cutoff:600 bpdepthfrequency:0 ]", + "[ 13/4 → 53/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:0 ]", + "[ 53/16 → 27/8 | note:c4 s:sawtooth cutoff:600 bpdepthfrequency:0 ]", + "[ 27/8 → 55/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:0 ]", + "[ 55/16 → 7/2 | note:c s:sawtooth cutoff:600 bpdepthfrequency:0 ]", + "[ 7/2 → 57/16 | note:c# s:sawtooth cutoff:600 bpdepthfrequency:0 ]", + "[ 57/16 → 29/8 | note:c s:sawtooth cutoff:600 bpdepthfrequency:0 ]", + "[ 29/8 → 59/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:0 ]", + "[ 59/16 → 15/4 | note:c4 s:sawtooth cutoff:600 bpdepthfrequency:0 ]", + "[ 15/4 → 61/16 | note:c s:sawtooth cutoff:600 bpdepthfrequency:0 ]", + "[ 61/16 → 31/8 | note:c s:sawtooth cutoff:600 bpdepthfrequency:0 ]", + "[ 31/8 → 63/16 | note:c# s:sawtooth cutoff:600 bpdepthfrequency:0 ]", + "[ 63/16 → 4/1 | note:c s:sawtooth cutoff:600 bpdepthfrequency:0 ]", +] +`; + exports[`runs examples > example "bpenv" example index 0 1`] = ` [ "[ 0/1 → 1/4 | note:c2 s:sawtooth bandf:500 bpattack:0.5 bpenv:4 ]", @@ -4786,6 +4855,75 @@ exports[`runs examples > example "hpdecay" example index 0 1`] = ` ] `; +exports[`runs examples > example "hpdepthfrequency" example index 0 1`] = ` +[ + "[ 0/1 → 1/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:200 ]", + "[ 1/16 → 1/8 | note:c s:sawtooth cutoff:600 hpdepthfrequency:200 ]", + "[ 1/8 → 3/16 | note:c# s:sawtooth cutoff:600 hpdepthfrequency:200 ]", + "[ 3/16 → 1/4 | note:c s:sawtooth cutoff:600 hpdepthfrequency:200 ]", + "[ 1/4 → 5/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:200 ]", + "[ 5/16 → 3/8 | note:c4 s:sawtooth cutoff:600 hpdepthfrequency:200 ]", + "[ 3/8 → 7/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:200 ]", + "[ 7/16 → 1/2 | note:c s:sawtooth cutoff:600 hpdepthfrequency:200 ]", + "[ 1/2 → 9/16 | note:c# s:sawtooth cutoff:600 hpdepthfrequency:200 ]", + "[ 9/16 → 5/8 | note:c s:sawtooth cutoff:600 hpdepthfrequency:200 ]", + "[ 5/8 → 11/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:200 ]", + "[ 11/16 → 3/4 | note:c4 s:sawtooth cutoff:600 hpdepthfrequency:200 ]", + "[ 3/4 → 13/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:200 ]", + "[ 13/16 → 7/8 | note:c s:sawtooth cutoff:600 hpdepthfrequency:200 ]", + "[ 7/8 → 15/16 | note:c# s:sawtooth cutoff:600 hpdepthfrequency:200 ]", + "[ 15/16 → 1/1 | note:c s:sawtooth cutoff:600 hpdepthfrequency:200 ]", + "[ 1/1 → 17/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:500 ]", + "[ 17/16 → 9/8 | note:c4 s:sawtooth cutoff:600 hpdepthfrequency:500 ]", + "[ 9/8 → 19/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:500 ]", + "[ 19/16 → 5/4 | note:c s:sawtooth cutoff:600 hpdepthfrequency:500 ]", + "[ 5/4 → 21/16 | note:c# s:sawtooth cutoff:600 hpdepthfrequency:500 ]", + "[ 21/16 → 11/8 | note:c s:sawtooth cutoff:600 hpdepthfrequency:500 ]", + "[ 11/8 → 23/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:500 ]", + "[ 23/16 → 3/2 | note:c4 s:sawtooth cutoff:600 hpdepthfrequency:500 ]", + "[ 3/2 → 25/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:500 ]", + "[ 25/16 → 13/8 | note:c s:sawtooth cutoff:600 hpdepthfrequency:500 ]", + "[ 13/8 → 27/16 | note:c# s:sawtooth cutoff:600 hpdepthfrequency:500 ]", + "[ 27/16 → 7/4 | note:c s:sawtooth cutoff:600 hpdepthfrequency:500 ]", + "[ 7/4 → 29/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:500 ]", + "[ 29/16 → 15/8 | note:c4 s:sawtooth cutoff:600 hpdepthfrequency:500 ]", + "[ 15/8 → 31/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:500 ]", + "[ 31/16 → 2/1 | note:c s:sawtooth cutoff:600 hpdepthfrequency:500 ]", + "[ 2/1 → 33/16 | note:c# s:sawtooth cutoff:600 hpdepthfrequency:100 ]", + "[ 33/16 → 17/8 | note:c s:sawtooth cutoff:600 hpdepthfrequency:100 ]", + "[ 17/8 → 35/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:100 ]", + "[ 35/16 → 9/4 | note:c4 s:sawtooth cutoff:600 hpdepthfrequency:100 ]", + "[ 9/4 → 37/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:100 ]", + "[ 37/16 → 19/8 | note:c s:sawtooth cutoff:600 hpdepthfrequency:100 ]", + "[ 19/8 → 39/16 | note:c# s:sawtooth cutoff:600 hpdepthfrequency:100 ]", + "[ 39/16 → 5/2 | note:c s:sawtooth cutoff:600 hpdepthfrequency:100 ]", + "[ 5/2 → 41/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:100 ]", + "[ 41/16 → 21/8 | note:c4 s:sawtooth cutoff:600 hpdepthfrequency:100 ]", + "[ 21/8 → 43/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:100 ]", + "[ 43/16 → 11/4 | note:c s:sawtooth cutoff:600 hpdepthfrequency:100 ]", + "[ 11/4 → 45/16 | note:c# s:sawtooth cutoff:600 hpdepthfrequency:100 ]", + "[ 45/16 → 23/8 | note:c s:sawtooth cutoff:600 hpdepthfrequency:100 ]", + "[ 23/8 → 47/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:100 ]", + "[ 47/16 → 3/1 | note:c4 s:sawtooth cutoff:600 hpdepthfrequency:100 ]", + "[ 3/1 → 49/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:0 ]", + "[ 49/16 → 25/8 | note:c s:sawtooth cutoff:600 hpdepthfrequency:0 ]", + "[ 25/8 → 51/16 | note:c# s:sawtooth cutoff:600 hpdepthfrequency:0 ]", + "[ 51/16 → 13/4 | note:c s:sawtooth cutoff:600 hpdepthfrequency:0 ]", + "[ 13/4 → 53/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:0 ]", + "[ 53/16 → 27/8 | note:c4 s:sawtooth cutoff:600 hpdepthfrequency:0 ]", + "[ 27/8 → 55/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:0 ]", + "[ 55/16 → 7/2 | note:c s:sawtooth cutoff:600 hpdepthfrequency:0 ]", + "[ 7/2 → 57/16 | note:c# s:sawtooth cutoff:600 hpdepthfrequency:0 ]", + "[ 57/16 → 29/8 | note:c s:sawtooth cutoff:600 hpdepthfrequency:0 ]", + "[ 29/8 → 59/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:0 ]", + "[ 59/16 → 15/4 | note:c4 s:sawtooth cutoff:600 hpdepthfrequency:0 ]", + "[ 15/4 → 61/16 | note:c s:sawtooth cutoff:600 hpdepthfrequency:0 ]", + "[ 61/16 → 31/8 | note:c s:sawtooth cutoff:600 hpdepthfrequency:0 ]", + "[ 31/8 → 63/16 | note:c# s:sawtooth cutoff:600 hpdepthfrequency:0 ]", + "[ 63/16 → 4/1 | note:c s:sawtooth cutoff:600 hpdepthfrequency:0 ]", +] +`; + exports[`runs examples > example "hpenv" example index 0 1`] = ` [ "[ 0/1 → 1/4 | note:c2 s:sawtooth hcutoff:500 hpattack:0.5 hpenv:4 ]", @@ -5969,6 +6107,144 @@ exports[`runs examples > example "lpdecay" example index 0 1`] = ` ] `; +exports[`runs examples > example "lpdepth" example index 0 1`] = ` +[ + "[ 0/1 → 1/16 | note:c s:sawtooth cutoff:600 lpdepth:1 ]", + "[ 1/16 → 1/8 | note:c s:sawtooth cutoff:600 lpdepth:1 ]", + "[ 1/8 → 3/16 | note:c# s:sawtooth cutoff:600 lpdepth:1 ]", + "[ 3/16 → 1/4 | note:c s:sawtooth cutoff:600 lpdepth:1 ]", + "[ 1/4 → 5/16 | note:c s:sawtooth cutoff:600 lpdepth:1 ]", + "[ 5/16 → 3/8 | note:c4 s:sawtooth cutoff:600 lpdepth:1 ]", + "[ 3/8 → 7/16 | note:c s:sawtooth cutoff:600 lpdepth:1 ]", + "[ 7/16 → 1/2 | note:c s:sawtooth cutoff:600 lpdepth:1 ]", + "[ 1/2 → 9/16 | note:c# s:sawtooth cutoff:600 lpdepth:1 ]", + "[ 9/16 → 5/8 | note:c s:sawtooth cutoff:600 lpdepth:1 ]", + "[ 5/8 → 11/16 | note:c s:sawtooth cutoff:600 lpdepth:1 ]", + "[ 11/16 → 3/4 | note:c4 s:sawtooth cutoff:600 lpdepth:1 ]", + "[ 3/4 → 13/16 | note:c s:sawtooth cutoff:600 lpdepth:1 ]", + "[ 13/16 → 7/8 | note:c s:sawtooth cutoff:600 lpdepth:1 ]", + "[ 7/8 → 15/16 | note:c# s:sawtooth cutoff:600 lpdepth:1 ]", + "[ 15/16 → 1/1 | note:c s:sawtooth cutoff:600 lpdepth:1 ]", + "[ 1/1 → 17/16 | note:c s:sawtooth cutoff:600 lpdepth:0.5 ]", + "[ 17/16 → 9/8 | note:c4 s:sawtooth cutoff:600 lpdepth:0.5 ]", + "[ 9/8 → 19/16 | note:c s:sawtooth cutoff:600 lpdepth:0.5 ]", + "[ 19/16 → 5/4 | note:c s:sawtooth cutoff:600 lpdepth:0.5 ]", + "[ 5/4 → 21/16 | note:c# s:sawtooth cutoff:600 lpdepth:0.5 ]", + "[ 21/16 → 11/8 | note:c s:sawtooth cutoff:600 lpdepth:0.5 ]", + "[ 11/8 → 23/16 | note:c s:sawtooth cutoff:600 lpdepth:0.5 ]", + "[ 23/16 → 3/2 | note:c4 s:sawtooth cutoff:600 lpdepth:0.5 ]", + "[ 3/2 → 25/16 | note:c s:sawtooth cutoff:600 lpdepth:0.5 ]", + "[ 25/16 → 13/8 | note:c s:sawtooth cutoff:600 lpdepth:0.5 ]", + "[ 13/8 → 27/16 | note:c# s:sawtooth cutoff:600 lpdepth:0.5 ]", + "[ 27/16 → 7/4 | note:c s:sawtooth cutoff:600 lpdepth:0.5 ]", + "[ 7/4 → 29/16 | note:c s:sawtooth cutoff:600 lpdepth:0.5 ]", + "[ 29/16 → 15/8 | note:c4 s:sawtooth cutoff:600 lpdepth:0.5 ]", + "[ 15/8 → 31/16 | note:c s:sawtooth cutoff:600 lpdepth:0.5 ]", + "[ 31/16 → 2/1 | note:c s:sawtooth cutoff:600 lpdepth:0.5 ]", + "[ 2/1 → 33/16 | note:c# s:sawtooth cutoff:600 lpdepth:1.8 ]", + "[ 33/16 → 17/8 | note:c s:sawtooth cutoff:600 lpdepth:1.8 ]", + "[ 17/8 → 35/16 | note:c s:sawtooth cutoff:600 lpdepth:1.8 ]", + "[ 35/16 → 9/4 | note:c4 s:sawtooth cutoff:600 lpdepth:1.8 ]", + "[ 9/4 → 37/16 | note:c s:sawtooth cutoff:600 lpdepth:1.8 ]", + "[ 37/16 → 19/8 | note:c s:sawtooth cutoff:600 lpdepth:1.8 ]", + "[ 19/8 → 39/16 | note:c# s:sawtooth cutoff:600 lpdepth:1.8 ]", + "[ 39/16 → 5/2 | note:c s:sawtooth cutoff:600 lpdepth:1.8 ]", + "[ 5/2 → 41/16 | note:c s:sawtooth cutoff:600 lpdepth:1.8 ]", + "[ 41/16 → 21/8 | note:c4 s:sawtooth cutoff:600 lpdepth:1.8 ]", + "[ 21/8 → 43/16 | note:c s:sawtooth cutoff:600 lpdepth:1.8 ]", + "[ 43/16 → 11/4 | note:c s:sawtooth cutoff:600 lpdepth:1.8 ]", + "[ 11/4 → 45/16 | note:c# s:sawtooth cutoff:600 lpdepth:1.8 ]", + "[ 45/16 → 23/8 | note:c s:sawtooth cutoff:600 lpdepth:1.8 ]", + "[ 23/8 → 47/16 | note:c s:sawtooth cutoff:600 lpdepth:1.8 ]", + "[ 47/16 → 3/1 | note:c4 s:sawtooth cutoff:600 lpdepth:1.8 ]", + "[ 3/1 → 49/16 | note:c s:sawtooth cutoff:600 lpdepth:0 ]", + "[ 49/16 → 25/8 | note:c s:sawtooth cutoff:600 lpdepth:0 ]", + "[ 25/8 → 51/16 | note:c# s:sawtooth cutoff:600 lpdepth:0 ]", + "[ 51/16 → 13/4 | note:c s:sawtooth cutoff:600 lpdepth:0 ]", + "[ 13/4 → 53/16 | note:c s:sawtooth cutoff:600 lpdepth:0 ]", + "[ 53/16 → 27/8 | note:c4 s:sawtooth cutoff:600 lpdepth:0 ]", + "[ 27/8 → 55/16 | note:c s:sawtooth cutoff:600 lpdepth:0 ]", + "[ 55/16 → 7/2 | note:c s:sawtooth cutoff:600 lpdepth:0 ]", + "[ 7/2 → 57/16 | note:c# s:sawtooth cutoff:600 lpdepth:0 ]", + "[ 57/16 → 29/8 | note:c s:sawtooth cutoff:600 lpdepth:0 ]", + "[ 29/8 → 59/16 | note:c s:sawtooth cutoff:600 lpdepth:0 ]", + "[ 59/16 → 15/4 | note:c4 s:sawtooth cutoff:600 lpdepth:0 ]", + "[ 15/4 → 61/16 | note:c s:sawtooth cutoff:600 lpdepth:0 ]", + "[ 61/16 → 31/8 | note:c s:sawtooth cutoff:600 lpdepth:0 ]", + "[ 31/8 → 63/16 | note:c# s:sawtooth cutoff:600 lpdepth:0 ]", + "[ 63/16 → 4/1 | note:c s:sawtooth cutoff:600 lpdepth:0 ]", +] +`; + +exports[`runs examples > example "lpdepthfrequency" example index 0 1`] = ` +[ + "[ 0/1 → 1/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:200 ]", + "[ 1/16 → 1/8 | note:c s:sawtooth cutoff:600 lpdepthfrequency:200 ]", + "[ 1/8 → 3/16 | note:c# s:sawtooth cutoff:600 lpdepthfrequency:200 ]", + "[ 3/16 → 1/4 | note:c s:sawtooth cutoff:600 lpdepthfrequency:200 ]", + "[ 1/4 → 5/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:200 ]", + "[ 5/16 → 3/8 | note:c4 s:sawtooth cutoff:600 lpdepthfrequency:200 ]", + "[ 3/8 → 7/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:200 ]", + "[ 7/16 → 1/2 | note:c s:sawtooth cutoff:600 lpdepthfrequency:200 ]", + "[ 1/2 → 9/16 | note:c# s:sawtooth cutoff:600 lpdepthfrequency:200 ]", + "[ 9/16 → 5/8 | note:c s:sawtooth cutoff:600 lpdepthfrequency:200 ]", + "[ 5/8 → 11/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:200 ]", + "[ 11/16 → 3/4 | note:c4 s:sawtooth cutoff:600 lpdepthfrequency:200 ]", + "[ 3/4 → 13/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:200 ]", + "[ 13/16 → 7/8 | note:c s:sawtooth cutoff:600 lpdepthfrequency:200 ]", + "[ 7/8 → 15/16 | note:c# s:sawtooth cutoff:600 lpdepthfrequency:200 ]", + "[ 15/16 → 1/1 | note:c s:sawtooth cutoff:600 lpdepthfrequency:200 ]", + "[ 1/1 → 17/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:500 ]", + "[ 17/16 → 9/8 | note:c4 s:sawtooth cutoff:600 lpdepthfrequency:500 ]", + "[ 9/8 → 19/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:500 ]", + "[ 19/16 → 5/4 | note:c s:sawtooth cutoff:600 lpdepthfrequency:500 ]", + "[ 5/4 → 21/16 | note:c# s:sawtooth cutoff:600 lpdepthfrequency:500 ]", + "[ 21/16 → 11/8 | note:c s:sawtooth cutoff:600 lpdepthfrequency:500 ]", + "[ 11/8 → 23/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:500 ]", + "[ 23/16 → 3/2 | note:c4 s:sawtooth cutoff:600 lpdepthfrequency:500 ]", + "[ 3/2 → 25/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:500 ]", + "[ 25/16 → 13/8 | note:c s:sawtooth cutoff:600 lpdepthfrequency:500 ]", + "[ 13/8 → 27/16 | note:c# s:sawtooth cutoff:600 lpdepthfrequency:500 ]", + "[ 27/16 → 7/4 | note:c s:sawtooth cutoff:600 lpdepthfrequency:500 ]", + "[ 7/4 → 29/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:500 ]", + "[ 29/16 → 15/8 | note:c4 s:sawtooth cutoff:600 lpdepthfrequency:500 ]", + "[ 15/8 → 31/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:500 ]", + "[ 31/16 → 2/1 | note:c s:sawtooth cutoff:600 lpdepthfrequency:500 ]", + "[ 2/1 → 33/16 | note:c# s:sawtooth cutoff:600 lpdepthfrequency:100 ]", + "[ 33/16 → 17/8 | note:c s:sawtooth cutoff:600 lpdepthfrequency:100 ]", + "[ 17/8 → 35/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:100 ]", + "[ 35/16 → 9/4 | note:c4 s:sawtooth cutoff:600 lpdepthfrequency:100 ]", + "[ 9/4 → 37/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:100 ]", + "[ 37/16 → 19/8 | note:c s:sawtooth cutoff:600 lpdepthfrequency:100 ]", + "[ 19/8 → 39/16 | note:c# s:sawtooth cutoff:600 lpdepthfrequency:100 ]", + "[ 39/16 → 5/2 | note:c s:sawtooth cutoff:600 lpdepthfrequency:100 ]", + "[ 5/2 → 41/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:100 ]", + "[ 41/16 → 21/8 | note:c4 s:sawtooth cutoff:600 lpdepthfrequency:100 ]", + "[ 21/8 → 43/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:100 ]", + "[ 43/16 → 11/4 | note:c s:sawtooth cutoff:600 lpdepthfrequency:100 ]", + "[ 11/4 → 45/16 | note:c# s:sawtooth cutoff:600 lpdepthfrequency:100 ]", + "[ 45/16 → 23/8 | note:c s:sawtooth cutoff:600 lpdepthfrequency:100 ]", + "[ 23/8 → 47/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:100 ]", + "[ 47/16 → 3/1 | note:c4 s:sawtooth cutoff:600 lpdepthfrequency:100 ]", + "[ 3/1 → 49/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:0 ]", + "[ 49/16 → 25/8 | note:c s:sawtooth cutoff:600 lpdepthfrequency:0 ]", + "[ 25/8 → 51/16 | note:c# s:sawtooth cutoff:600 lpdepthfrequency:0 ]", + "[ 51/16 → 13/4 | note:c s:sawtooth cutoff:600 lpdepthfrequency:0 ]", + "[ 13/4 → 53/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:0 ]", + "[ 53/16 → 27/8 | note:c4 s:sawtooth cutoff:600 lpdepthfrequency:0 ]", + "[ 27/8 → 55/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:0 ]", + "[ 55/16 → 7/2 | note:c s:sawtooth cutoff:600 lpdepthfrequency:0 ]", + "[ 7/2 → 57/16 | note:c# s:sawtooth cutoff:600 lpdepthfrequency:0 ]", + "[ 57/16 → 29/8 | note:c s:sawtooth cutoff:600 lpdepthfrequency:0 ]", + "[ 29/8 → 59/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:0 ]", + "[ 59/16 → 15/4 | note:c4 s:sawtooth cutoff:600 lpdepthfrequency:0 ]", + "[ 15/4 → 61/16 | note:c s:sawtooth cutoff:600 lpdepthfrequency:0 ]", + "[ 61/16 → 31/8 | note:c s:sawtooth cutoff:600 lpdepthfrequency:0 ]", + "[ 31/8 → 63/16 | note:c# s:sawtooth cutoff:600 lpdepthfrequency:0 ]", + "[ 63/16 → 4/1 | note:c s:sawtooth cutoff:600 lpdepthfrequency:0 ]", +] +`; + exports[`runs examples > example "lpenv" example index 0 1`] = ` [ "[ 0/1 → 1/4 | note:c2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]", @@ -6157,6 +6433,75 @@ exports[`runs examples > example "lpq" example index 0 1`] = ` ] `; +exports[`runs examples > example "lprate" example index 0 1`] = ` +[ + "[ 0/1 → 1/16 | note:c s:sawtooth cutoff:600 lprate:4 ]", + "[ 1/16 → 1/8 | note:c s:sawtooth cutoff:600 lprate:4 ]", + "[ 1/8 → 3/16 | note:c# s:sawtooth cutoff:600 lprate:4 ]", + "[ 3/16 → 1/4 | note:c s:sawtooth cutoff:600 lprate:4 ]", + "[ 1/4 → 5/16 | note:c s:sawtooth cutoff:600 lprate:4 ]", + "[ 5/16 → 3/8 | note:c4 s:sawtooth cutoff:600 lprate:4 ]", + "[ 3/8 → 7/16 | note:c s:sawtooth cutoff:600 lprate:4 ]", + "[ 7/16 → 1/2 | note:c s:sawtooth cutoff:600 lprate:4 ]", + "[ 1/2 → 9/16 | note:c# s:sawtooth cutoff:600 lprate:4 ]", + "[ 9/16 → 5/8 | note:c s:sawtooth cutoff:600 lprate:4 ]", + "[ 5/8 → 11/16 | note:c s:sawtooth cutoff:600 lprate:4 ]", + "[ 11/16 → 3/4 | note:c4 s:sawtooth cutoff:600 lprate:4 ]", + "[ 3/4 → 13/16 | note:c s:sawtooth cutoff:600 lprate:4 ]", + "[ 13/16 → 7/8 | note:c s:sawtooth cutoff:600 lprate:4 ]", + "[ 7/8 → 15/16 | note:c# s:sawtooth cutoff:600 lprate:4 ]", + "[ 15/16 → 1/1 | note:c s:sawtooth cutoff:600 lprate:4 ]", + "[ 1/1 → 17/16 | note:c s:sawtooth cutoff:600 lprate:8 ]", + "[ 17/16 → 9/8 | note:c4 s:sawtooth cutoff:600 lprate:8 ]", + "[ 9/8 → 19/16 | note:c s:sawtooth cutoff:600 lprate:8 ]", + "[ 19/16 → 5/4 | note:c s:sawtooth cutoff:600 lprate:8 ]", + "[ 5/4 → 21/16 | note:c# s:sawtooth cutoff:600 lprate:8 ]", + "[ 21/16 → 11/8 | note:c s:sawtooth cutoff:600 lprate:8 ]", + "[ 11/8 → 23/16 | note:c s:sawtooth cutoff:600 lprate:8 ]", + "[ 23/16 → 3/2 | note:c4 s:sawtooth cutoff:600 lprate:8 ]", + "[ 3/2 → 25/16 | note:c s:sawtooth cutoff:600 lprate:8 ]", + "[ 25/16 → 13/8 | note:c s:sawtooth cutoff:600 lprate:8 ]", + "[ 13/8 → 27/16 | note:c# s:sawtooth cutoff:600 lprate:8 ]", + "[ 27/16 → 7/4 | note:c s:sawtooth cutoff:600 lprate:8 ]", + "[ 7/4 → 29/16 | note:c s:sawtooth cutoff:600 lprate:8 ]", + "[ 29/16 → 15/8 | note:c4 s:sawtooth cutoff:600 lprate:8 ]", + "[ 15/8 → 31/16 | note:c s:sawtooth cutoff:600 lprate:8 ]", + "[ 31/16 → 2/1 | note:c s:sawtooth cutoff:600 lprate:8 ]", + "[ 2/1 → 33/16 | note:c# s:sawtooth cutoff:600 lprate:2 ]", + "[ 33/16 → 17/8 | note:c s:sawtooth cutoff:600 lprate:2 ]", + "[ 17/8 → 35/16 | note:c s:sawtooth cutoff:600 lprate:2 ]", + "[ 35/16 → 9/4 | note:c4 s:sawtooth cutoff:600 lprate:2 ]", + "[ 9/4 → 37/16 | note:c s:sawtooth cutoff:600 lprate:2 ]", + "[ 37/16 → 19/8 | note:c s:sawtooth cutoff:600 lprate:2 ]", + "[ 19/8 → 39/16 | note:c# s:sawtooth cutoff:600 lprate:2 ]", + "[ 39/16 → 5/2 | note:c s:sawtooth cutoff:600 lprate:2 ]", + "[ 5/2 → 41/16 | note:c s:sawtooth cutoff:600 lprate:2 ]", + "[ 41/16 → 21/8 | note:c4 s:sawtooth cutoff:600 lprate:2 ]", + "[ 21/8 → 43/16 | note:c s:sawtooth cutoff:600 lprate:2 ]", + "[ 43/16 → 11/4 | note:c s:sawtooth cutoff:600 lprate:2 ]", + "[ 11/4 → 45/16 | note:c# s:sawtooth cutoff:600 lprate:2 ]", + "[ 45/16 → 23/8 | note:c s:sawtooth cutoff:600 lprate:2 ]", + "[ 23/8 → 47/16 | note:c s:sawtooth cutoff:600 lprate:2 ]", + "[ 47/16 → 3/1 | note:c4 s:sawtooth cutoff:600 lprate:2 ]", + "[ 3/1 → 49/16 | note:c s:sawtooth cutoff:600 lprate:1 ]", + "[ 49/16 → 25/8 | note:c s:sawtooth cutoff:600 lprate:1 ]", + "[ 25/8 → 51/16 | note:c# s:sawtooth cutoff:600 lprate:1 ]", + "[ 51/16 → 13/4 | note:c s:sawtooth cutoff:600 lprate:1 ]", + "[ 13/4 → 53/16 | note:c s:sawtooth cutoff:600 lprate:1 ]", + "[ 53/16 → 27/8 | note:c4 s:sawtooth cutoff:600 lprate:1 ]", + "[ 27/8 → 55/16 | note:c s:sawtooth cutoff:600 lprate:1 ]", + "[ 55/16 → 7/2 | note:c s:sawtooth cutoff:600 lprate:1 ]", + "[ 7/2 → 57/16 | note:c# s:sawtooth cutoff:600 lprate:1 ]", + "[ 57/16 → 29/8 | note:c s:sawtooth cutoff:600 lprate:1 ]", + "[ 29/8 → 59/16 | note:c s:sawtooth cutoff:600 lprate:1 ]", + "[ 59/16 → 15/4 | note:c4 s:sawtooth cutoff:600 lprate:1 ]", + "[ 15/4 → 61/16 | note:c s:sawtooth cutoff:600 lprate:1 ]", + "[ 61/16 → 31/8 | note:c s:sawtooth cutoff:600 lprate:1 ]", + "[ 31/8 → 63/16 | note:c# s:sawtooth cutoff:600 lprate:1 ]", + "[ 63/16 → 4/1 | note:c s:sawtooth cutoff:600 lprate:1 ]", +] +`; + exports[`runs examples > example "lprelease" example index 0 1`] = ` [ "[ 0/1 → 1/4 | note:c2 s:sawtooth clip:0.5 cutoff:300 lpenv:4 lprelease:0.5 release:0.5 ]", @@ -6199,6 +6544,75 @@ exports[`runs examples > example "lpsustain" example index 0 1`] = ` ] `; +exports[`runs examples > example "lpsync" example index 0 1`] = ` +[ + "[ 0/1 → 1/16 | note:c s:sawtooth cutoff:600 lpsync:4 ]", + "[ 1/16 → 1/8 | note:c s:sawtooth cutoff:600 lpsync:4 ]", + "[ 1/8 → 3/16 | note:c# s:sawtooth cutoff:600 lpsync:4 ]", + "[ 3/16 → 1/4 | note:c s:sawtooth cutoff:600 lpsync:4 ]", + "[ 1/4 → 5/16 | note:c s:sawtooth cutoff:600 lpsync:4 ]", + "[ 5/16 → 3/8 | note:c4 s:sawtooth cutoff:600 lpsync:4 ]", + "[ 3/8 → 7/16 | note:c s:sawtooth cutoff:600 lpsync:4 ]", + "[ 7/16 → 1/2 | note:c s:sawtooth cutoff:600 lpsync:4 ]", + "[ 1/2 → 9/16 | note:c# s:sawtooth cutoff:600 lpsync:4 ]", + "[ 9/16 → 5/8 | note:c s:sawtooth cutoff:600 lpsync:4 ]", + "[ 5/8 → 11/16 | note:c s:sawtooth cutoff:600 lpsync:4 ]", + "[ 11/16 → 3/4 | note:c4 s:sawtooth cutoff:600 lpsync:4 ]", + "[ 3/4 → 13/16 | note:c s:sawtooth cutoff:600 lpsync:4 ]", + "[ 13/16 → 7/8 | note:c s:sawtooth cutoff:600 lpsync:4 ]", + "[ 7/8 → 15/16 | note:c# s:sawtooth cutoff:600 lpsync:4 ]", + "[ 15/16 → 1/1 | note:c s:sawtooth cutoff:600 lpsync:4 ]", + "[ 1/1 → 17/16 | note:c s:sawtooth cutoff:600 lpsync:8 ]", + "[ 17/16 → 9/8 | note:c4 s:sawtooth cutoff:600 lpsync:8 ]", + "[ 9/8 → 19/16 | note:c s:sawtooth cutoff:600 lpsync:8 ]", + "[ 19/16 → 5/4 | note:c s:sawtooth cutoff:600 lpsync:8 ]", + "[ 5/4 → 21/16 | note:c# s:sawtooth cutoff:600 lpsync:8 ]", + "[ 21/16 → 11/8 | note:c s:sawtooth cutoff:600 lpsync:8 ]", + "[ 11/8 → 23/16 | note:c s:sawtooth cutoff:600 lpsync:8 ]", + "[ 23/16 → 3/2 | note:c4 s:sawtooth cutoff:600 lpsync:8 ]", + "[ 3/2 → 25/16 | note:c s:sawtooth cutoff:600 lpsync:8 ]", + "[ 25/16 → 13/8 | note:c s:sawtooth cutoff:600 lpsync:8 ]", + "[ 13/8 → 27/16 | note:c# s:sawtooth cutoff:600 lpsync:8 ]", + "[ 27/16 → 7/4 | note:c s:sawtooth cutoff:600 lpsync:8 ]", + "[ 7/4 → 29/16 | note:c s:sawtooth cutoff:600 lpsync:8 ]", + "[ 29/16 → 15/8 | note:c4 s:sawtooth cutoff:600 lpsync:8 ]", + "[ 15/8 → 31/16 | note:c s:sawtooth cutoff:600 lpsync:8 ]", + "[ 31/16 → 2/1 | note:c s:sawtooth cutoff:600 lpsync:8 ]", + "[ 2/1 → 33/16 | note:c# s:sawtooth cutoff:600 lpsync:2 ]", + "[ 33/16 → 17/8 | note:c s:sawtooth cutoff:600 lpsync:2 ]", + "[ 17/8 → 35/16 | note:c s:sawtooth cutoff:600 lpsync:2 ]", + "[ 35/16 → 9/4 | note:c4 s:sawtooth cutoff:600 lpsync:2 ]", + "[ 9/4 → 37/16 | note:c s:sawtooth cutoff:600 lpsync:2 ]", + "[ 37/16 → 19/8 | note:c s:sawtooth cutoff:600 lpsync:2 ]", + "[ 19/8 → 39/16 | note:c# s:sawtooth cutoff:600 lpsync:2 ]", + "[ 39/16 → 5/2 | note:c s:sawtooth cutoff:600 lpsync:2 ]", + "[ 5/2 → 41/16 | note:c s:sawtooth cutoff:600 lpsync:2 ]", + "[ 41/16 → 21/8 | note:c4 s:sawtooth cutoff:600 lpsync:2 ]", + "[ 21/8 → 43/16 | note:c s:sawtooth cutoff:600 lpsync:2 ]", + "[ 43/16 → 11/4 | note:c s:sawtooth cutoff:600 lpsync:2 ]", + "[ 11/4 → 45/16 | note:c# s:sawtooth cutoff:600 lpsync:2 ]", + "[ 45/16 → 23/8 | note:c s:sawtooth cutoff:600 lpsync:2 ]", + "[ 23/8 → 47/16 | note:c s:sawtooth cutoff:600 lpsync:2 ]", + "[ 47/16 → 3/1 | note:c4 s:sawtooth cutoff:600 lpsync:2 ]", + "[ 3/1 → 49/16 | note:c s:sawtooth cutoff:600 lpsync:1 ]", + "[ 49/16 → 25/8 | note:c s:sawtooth cutoff:600 lpsync:1 ]", + "[ 25/8 → 51/16 | note:c# s:sawtooth cutoff:600 lpsync:1 ]", + "[ 51/16 → 13/4 | note:c s:sawtooth cutoff:600 lpsync:1 ]", + "[ 13/4 → 53/16 | note:c s:sawtooth cutoff:600 lpsync:1 ]", + "[ 53/16 → 27/8 | note:c4 s:sawtooth cutoff:600 lpsync:1 ]", + "[ 27/8 → 55/16 | note:c s:sawtooth cutoff:600 lpsync:1 ]", + "[ 55/16 → 7/2 | note:c s:sawtooth cutoff:600 lpsync:1 ]", + "[ 7/2 → 57/16 | note:c# s:sawtooth cutoff:600 lpsync:1 ]", + "[ 57/16 → 29/8 | note:c s:sawtooth cutoff:600 lpsync:1 ]", + "[ 29/8 → 59/16 | note:c s:sawtooth cutoff:600 lpsync:1 ]", + "[ 59/16 → 15/4 | note:c4 s:sawtooth cutoff:600 lpsync:1 ]", + "[ 15/4 → 61/16 | note:c s:sawtooth cutoff:600 lpsync:1 ]", + "[ 61/16 → 31/8 | note:c s:sawtooth cutoff:600 lpsync:1 ]", + "[ 31/8 → 63/16 | note:c# s:sawtooth cutoff:600 lpsync:1 ]", + "[ 63/16 → 4/1 | note:c s:sawtooth cutoff:600 lpsync:1 ]", +] +`; + exports[`runs examples > example "lrate" example index 0 1`] = ` [ "[ 0/1 → 1/1 | n:0 s:supersquare leslie:1 lrate:1 ]", @@ -6888,18 +7302,18 @@ exports[`runs examples > example "nrpv" example index 0 1`] = ` exports[`runs examples > example "octave" example index 0 1`] = ` [ - "[ 0/1 → 1/1 | n:0 s:supersquare octave:3 ]", - "[ 0/1 → 1/1 | n:4 s:supersquare octave:3 ]", - "[ 0/1 → 1/1 | n:7 s:supersquare octave:3 ]", - "[ 1/1 → 2/1 | n:0 s:supersquare octave:4 ]", - "[ 1/1 → 2/1 | n:4 s:supersquare octave:4 ]", - "[ 1/1 → 2/1 | n:7 s:supersquare octave:4 ]", - "[ 2/1 → 3/1 | n:0 s:supersquare octave:5 ]", - "[ 2/1 → 3/1 | n:4 s:supersquare octave:5 ]", - "[ 2/1 → 3/1 | n:7 s:supersquare octave:5 ]", - "[ 3/1 → 4/1 | n:0 s:supersquare octave:6 ]", - "[ 3/1 → 4/1 | n:4 s:supersquare octave:6 ]", - "[ 3/1 → 4/1 | n:7 s:supersquare octave:6 ]", + "[ 0/1 → 1/1 | note:F3 s:supersaw octave:0 ]", + "[ 0/1 → 1/1 | note:C4 s:supersaw octave:0 ]", + "[ 0/1 → 1/1 | note:F4 s:supersaw octave:0 ]", + "[ 1/1 → 2/1 | note:F3 s:supersaw octave:1 ]", + "[ 1/1 → 2/1 | note:C4 s:supersaw octave:1 ]", + "[ 1/1 → 2/1 | note:F4 s:supersaw octave:1 ]", + "[ 2/1 → 3/1 | note:F3 s:supersaw octave:2 ]", + "[ 2/1 → 3/1 | note:C4 s:supersaw octave:2 ]", + "[ 2/1 → 3/1 | note:F4 s:supersaw octave:2 ]", + "[ 3/1 → 4/1 | note:F3 s:supersaw octave:3 ]", + "[ 3/1 → 4/1 | note:C4 s:supersaw octave:3 ]", + "[ 3/1 → 4/1 | note:F4 s:supersaw octave:3 ]", ] `; @@ -12484,54 +12898,54 @@ exports[`runs examples > example "wchooseCycles" example index 0 1`] = ` exports[`runs examples > example "wchooseCycles" example index 1 1`] = ` [ - "[ 0/1 → 1/12 | s:bd ]", - "[ 1/12 → 1/6 | s:bd ]", - "[ 1/6 → 1/4 | s:bd ]", - "[ 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 ]", - "[ 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: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: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 ]", + "[ 0/1 → 1/12 | note:c ]", + "[ 1/12 → 1/6 | note:c ]", + "[ 1/6 → 1/4 | note:c ]", + "[ 1/4 → 1/3 | note:c ]", + "[ 1/3 → 5/12 | note:c ]", + "[ 5/12 → 1/2 | note:c ]", + "[ 1/2 → 7/12 | note:f ]", + "[ 7/12 → 2/3 | note:f ]", + "[ 2/3 → 3/4 | note:f ]", + "[ 3/4 → 5/6 | note:c ]", + "[ 5/6 → 11/12 | note:c ]", + "[ 11/12 → 1/1 | note:c ]", + "[ 1/1 → 13/12 | note:c ]", + "[ 13/12 → 7/6 | note:c ]", + "[ 7/6 → 5/4 | note:c ]", + "[ 5/4 → 4/3 | note:c ]", + "[ 4/3 → 17/12 | note:c ]", + "[ 17/12 → 3/2 | note:c ]", + "[ 3/2 → 19/12 | note:a ]", + "[ 19/12 → 5/3 | note:a ]", + "[ 5/3 → 7/4 | note:a ]", + "[ 7/4 → 11/6 | note:c ]", + "[ 11/6 → 23/12 | note:c ]", + "[ 23/12 → 2/1 | note:c ]", + "[ 2/1 → 25/12 | note:a ]", + "[ 25/12 → 13/6 | note:a ]", + "[ 13/6 → 9/4 | note:a ]", + "[ 9/4 → 7/3 | note:a ]", + "[ 7/3 → 29/12 | note:a ]", + "[ 29/12 → 5/2 | note:a ]", + "[ 5/2 → 31/12 | note:c ]", + "[ 31/12 → 8/3 | note:c ]", + "[ 8/3 → 11/4 | note:c ]", + "[ 11/4 → 17/6 | note:c ]", + "[ 17/6 → 35/12 | note:c ]", + "[ 35/12 → 3/1 | note:c ]", + "[ 3/1 → 37/12 | note:c ]", + "[ 37/12 → 19/6 | note:c ]", + "[ 19/6 → 13/4 | note:c ]", + "[ 13/4 → 10/3 | note:f ]", + "[ 10/3 → 41/12 | note:f ]", + "[ 41/12 → 7/2 | note:f ]", + "[ 7/2 → 43/12 | note:a ]", + "[ 43/12 → 11/3 | note:a ]", + "[ 11/3 → 15/4 | note:a ]", + "[ 15/4 → 23/6 | note:c ]", + "[ 23/6 → 47/12 | note:c ]", + "[ 47/12 → 4/1 | note:c ]", ] `; diff --git a/website/src/repl/components/button/action-button.jsx b/website/src/repl/components/button/action-button.jsx index d589b7bed..de674b696 100644 --- a/website/src/repl/components/button/action-button.jsx +++ b/website/src/repl/components/button/action-button.jsx @@ -8,3 +8,34 @@ export function ActionButton({ children, label, labelIsHidden, className, ...but ); } + +export function SpecialActionButton(props) { + const { className, ...buttonProps } = props; + + return ( + + ); +} + +export function ActionInput({ label, className, ...props }) { + return ( + + ); +} + +export function SpecialActionInput({ className, ...props }) { + return ( + {props.label}} + /> + ); +} diff --git a/website/src/repl/components/panel/ImportPrebakeScriptButton.jsx b/website/src/repl/components/panel/ImportPrebakeScriptButton.jsx new file mode 100644 index 000000000..c997f6b6e --- /dev/null +++ b/website/src/repl/components/panel/ImportPrebakeScriptButton.jsx @@ -0,0 +1,29 @@ +import { errorLogger } from '@strudel/core'; +import { useSettings, storePrebakeScript } from '../../../settings.mjs'; +import { SpecialActionInput } from '../button/action-button'; + +async function importScript(script) { + const reader = new FileReader(); + reader.readAsText(script); + + reader.onload = () => { + const text = reader.result; + storePrebakeScript(text); + }; + + reader.onerror = () => { + errorLogger(new Error('failed to import prebake script'), 'importScript'); + }; +} +export function ImportPrebakeScriptButton() { + const settings = useSettings(); + + return ( + importScript(e.target.files[0])} + /> + ); +} diff --git a/website/src/repl/components/panel/SettingsTab.jsx b/website/src/repl/components/panel/SettingsTab.jsx index 85991f55c..f46fa661c 100644 --- a/website/src/repl/components/panel/SettingsTab.jsx +++ b/website/src/repl/components/panel/SettingsTab.jsx @@ -7,6 +7,8 @@ import { AudioDeviceSelector } from './AudioDeviceSelector.jsx'; import { AudioEngineTargetSelector } from './AudioEngineTargetSelector.jsx'; import { confirmDialog } from '../../util.mjs'; import { DEFAULT_MAX_POLYPHONY, setMaxPolyphony, setMultiChannelOrbits } from '@strudel/webaudio'; +import { ActionButton, SpecialActionButton } from '../button/action-button.jsx'; +import { ImportPrebakeScriptButton } from './ImportPrebakeScriptButton.jsx'; function Checkbox({ label, value, onChange, disabled = false }) { return ( @@ -113,6 +115,7 @@ export function SettingsTab({ started }) { isTabIndentationEnabled, isMultiCursorEnabled, patternAutoStart, + includePrebakeScriptInShare, } = useSettings(); const shouldAlwaysSync = isUdels(); const canChangeAudioDevice = AudioContext.prototype.setSinkId != null; @@ -204,6 +207,15 @@ export function SettingsTab({ started }) { />
+ + + settingsMap.setKey('includePrebakeScriptInShare', cbEvent.target.checked)} + value={includePrebakeScriptInShare} + /> + + Try clicking the logo in the top left! - + ); diff --git a/website/src/repl/components/panel/SoundsTab.jsx b/website/src/repl/components/panel/SoundsTab.jsx index 61d4ba1ce..d965dce89 100644 --- a/website/src/repl/components/panel/SoundsTab.jsx +++ b/website/src/repl/components/panel/SoundsTab.jsx @@ -60,6 +60,7 @@ export function SoundsTab() { // holds mutable ref to current triggered sound const trigRef = useRef(); + const numRef = useRef(0); // Used to cycle through sound previews on banks with multiple sounds let soundPreviewIdx = 0; @@ -70,6 +71,14 @@ export function SoundsTab() { trigRef.current = undefined; ref?.stop?.(getAudioContext().currentTime + 0.01); }); + useEvent('keydown', (e) => { + if (!isNaN(Number(e.key))) { + numRef.current = Number(e.key); + } + }); + useEvent('keyup', (e) => { + numRef.current = 0; + }); return (
setSearch(v)} /> @@ -119,7 +128,7 @@ export function SoundsTab() { const params = { note: ['synth', 'soundfont'].includes(data.type) ? 'a3' : undefined, s: name, - n: soundPreviewIdx, + n: numRef.current, clip: 1, release: 0.5, sustain: 1, @@ -137,7 +146,7 @@ export function SoundsTab() { trigRef.current = ref; if (ref?.node) { connectToDestination(ref.node); - soundPreviewIdx++; + // soundPreviewIdx++; break; } } catch (err) { diff --git a/website/src/repl/prebake.mjs b/website/src/repl/prebake.mjs index 8a6ccc7e0..53a2a6003 100644 --- a/website/src/repl/prebake.mjs +++ b/website/src/repl/prebake.mjs @@ -3,6 +3,8 @@ import { aliasBank, registerSynthSounds, registerZZFXSounds, samples } from '@st import { registerSamplesFromDB } from './idbutils.mjs'; import './piano.mjs'; import './files.mjs'; +import { settingsMap } from '@src/settings.mjs'; +import { evaluate } from '@strudel/transpiler'; const { BASE_URL } = import.meta.env; const baseNoTrailing = BASE_URL.endsWith('/') ? BASE_URL.slice(0, -1) : BASE_URL; diff --git a/website/src/repl/useReplContext.jsx b/website/src/repl/useReplContext.jsx index ac30fe342..8dcb6b754 100644 --- a/website/src/repl/useReplContext.jsx +++ b/website/src/repl/useReplContext.jsx @@ -6,7 +6,7 @@ This program is free software: you can redistribute it and/or modify it under th import { code2hash, getPerformanceTimeSeconds, logger, silence } from '@strudel/core'; import { getDrawContext } from '@strudel/draw'; -import { transpiler } from '@strudel/transpiler'; +import { evaluate, transpiler } from '@strudel/transpiler'; import { getAudioContextCurrentTime, webaudioOutput, @@ -63,11 +63,10 @@ async function getModule(name) { const initialCode = `// LOADING`; export function useReplContext() { - const { isSyncEnabled, audioEngineTarget } = useSettings(); + const { isSyncEnabled, audioEngineTarget, prebakeScript, includePrebakeScriptInShare } = useSettings(); const shouldUseWebaudio = audioEngineTarget !== audioEngineTargets.osc; const defaultOutput = shouldUseWebaudio ? webaudioOutput : superdirtOutput; const getTime = shouldUseWebaudio ? getAudioContextCurrentTime : getPerformanceTimeSeconds; - const init = useCallback(() => { const drawTime = [-2, 2]; const drawContext = getDrawContext(); @@ -84,7 +83,12 @@ export function useReplContext() { pattern: silence, drawTime, drawContext, - prebake: async () => Promise.all([modulesLoading, presets]), + prebake: async () => + Promise.all([modulesLoading, presets]).then(() => { + if (prebakeScript?.length) { + return evaluate(prebakeScript ?? ''); + } + }), onUpdateState: (state) => { setReplState({ ...state }); }, @@ -214,7 +218,13 @@ export function useReplContext() { editorRef.current.repl.evaluate(code); }; - const handleShare = async () => shareCode(replState.code); + const handleShare = async () => { + let code = replState.code; + if (includePrebakeScriptInShare) { + code = prebakeScript + '\n' + code; + } + shareCode(code); + }; const context = { started, pending, diff --git a/website/src/repl/util.mjs b/website/src/repl/util.mjs index ac27158f4..4a7cb26a8 100644 --- a/website/src/repl/util.mjs +++ b/website/src/repl/util.mjs @@ -1,11 +1,10 @@ -import { evalScope, hash2code, logger } from '@strudel/core'; +import { code2hash, evalScope, hash2code, logger } from '@strudel/core'; import { settingPatterns } from '../settings.mjs'; import { setVersionDefaults } from '@strudel/webaudio'; import { getMetadata } from '../metadata_parser'; import { isTauri } from '../tauri.mjs'; import './Repl.css'; import { createClient } from '@supabase/supabase-js'; -import { nanoid } from 'nanoid'; import { writeText } from '@tauri-apps/plugin-clipboard-manager'; import { $featuredPatterns /* , loadDBPatterns */ } from '@src/user_pattern_utils.mjs'; @@ -109,9 +108,8 @@ export function confirmDialog(msg) { }); } -let lastShared; - //RIP due to SPAM +// let lastShared; // export async function shareCode(codeToShare) { // // const codeToShare = activeCode || code; // if (lastShared === codeToShare) { @@ -146,9 +144,10 @@ let lastShared; // }); // } -export async function shareCode() { +export async function shareCode(codeToShare) { try { - const shareUrl = window.location.href; + const hash = '#' + code2hash(codeToShare); + const shareUrl = window.location.origin + window.location.pathname + hash; if (isTauri()) { await writeText(shareUrl); } else { diff --git a/website/src/settings.mjs b/website/src/settings.mjs index 7c62b0ded..8ec7d455a 100644 --- a/website/src/settings.mjs +++ b/website/src/settings.mjs @@ -45,11 +45,13 @@ export const defaultSettings = { isPanelOpen: true, togglePanelTrigger: 'click', //click | hover userPatterns: '{}', + prebakeScript: '', audioEngineTarget: audioEngineTargets.webaudio, isButtonRowHidden: false, isCSSAnimationDisabled: false, maxPolyphony: 128, multiChannelOrbits: false, + includePrebakeScriptInShare: true, }; let search = null; @@ -96,6 +98,7 @@ export function useSettings() { isPanelOpen: parseBoolean(state.isPanelOpen), userPatterns: userPatterns, multiChannelOrbits: parseBoolean(state.multiChannelOrbits), + includePrebakeScriptInShare: parseBoolean(state.includePrebakeScriptInShare), patternAutoStart: isUdels() ? false : state.patternAutoStart === undefined @@ -108,6 +111,8 @@ export const setActiveFooter = (tab) => settingsMap.setKey('activeFooter', tab); export const setPanelPinned = (bool) => settingsMap.setKey('isPanelPinned', bool); export const setIsPanelOpened = (bool) => settingsMap.setKey('isPanelOpen', bool); +export const storePrebakeScript = (script) => settingsMap.setKey('prebakeScript', script); + export const setIsZen = (active) => settingsMap.setKey('isZen', !!active); const patternSetting = (key) => From 3c4ba667c84a46fcdd7f423d377c8eac8876af71 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Thu, 27 Nov 2025 21:29:37 +0100 Subject: [PATCH 211/312] cleanup --- website/src/repl/components/panel/SoundsTab.jsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/website/src/repl/components/panel/SoundsTab.jsx b/website/src/repl/components/panel/SoundsTab.jsx index 44619a530..52fbf928c 100644 --- a/website/src/repl/components/panel/SoundsTab.jsx +++ b/website/src/repl/components/panel/SoundsTab.jsx @@ -62,9 +62,6 @@ export function SoundsTab() { const trigRef = useRef(); const numRef = useRef(0); - // Used to cycle through sound previews on banks with multiple sounds - let soundPreviewIdx = 0; - // stop current sound on mouseup useEvent('mouseup', () => { const ref = trigRef.current; From 405338e4f05e46be01b706aeb951a215668036d2 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Thu, 27 Nov 2025 22:25:32 +0100 Subject: [PATCH 212/312] add CHANGELOG.md + basic script to generate --- CHANGELOG.md | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++ warm.js | 14 +++++++++ 2 files changed, 102 insertions(+) create mode 100644 CHANGELOG.md create mode 100644 warm.js diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..a13e379d9 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,88 @@ +# changelog + +NOTE: you can generate this with `node warm.js`. it might still not be perfectly sorted... + +## november 2025 + +- 2025-11-27T22:03:53+01:00 [perf] in `noise`, let noiseMix do the disconnect when it exists by jeromew in: [#1783](https://codeberg.org/uzu/strudel/pulls/1783) +- 2025-11-27T22:01:01+01:00 Bug Fix: Retries for sounds tab by glossing in: [#1754](https://codeberg.org/uzu/strudel/pulls/1754) +- 2025-11-27T20:36:46+01:00 [hydra] return the hydra object when await initHydra(..) is called by jeromew in: [#1784](https://codeberg.org/uzu/strudel/pulls/1784) +- 2025-11-27T20:36:14+01:00 Use errorLogger for query and tonal errors by glossing in: [#1782](https://codeberg.org/uzu/strudel/pulls/1782) +- 2025-11-27T20:27:10+01:00 [perf] level 5 `connect-leak` on `vowel` by jeromew in: [#1779](https://codeberg.org/uzu/strudel/pulls/1779) +- 2025-11-26T08:23:38+01:00 feat: add prebake script import button for loading .strudel files by daslyfe in: [#1774](https://codeberg.org/uzu/strudel/pulls/1774) +- 2025-11-26T07:39:28+01:00 Fix Sampler port trampling by Dayglo in: [#1717](https://codeberg.org/uzu/strudel/pulls/1717) +- 2025-11-25T20:59:09+01:00 Feat: Hook up octave and fix example by glossing in: [#1773](https://codeberg.org/uzu/strudel/pulls/1773) +- 2025-11-25T20:48:09+01:00 [perf] fix `connect-leak` in `tremolo` param by jeromew in: [#1780](https://codeberg.org/uzu/strudel/pulls/1780) +- 2025-11-24T17:51:20+01:00 filter modulation improvements! by daslyfe in: [#1769](https://codeberg.org/uzu/strudel/pulls/1769) +- 2025-11-24T01:20:53+01:00 Add o as a synonym for orbit by daslyfe in: [#1766](https://codeberg.org/uzu/strudel/pulls/1766) +- 2025-11-23T22:23:26+01:00 [perf] fix `connect-leak` in `fm` modulation by jeromew in: [#1758](https://codeberg.org/uzu/strudel/pulls/1758) +- 2025-11-23T09:47:24+01:00 Fix interoperability issue between `all` and `await initHydra()` by jeromew in: [#1663](https://codeberg.org/uzu/strudel/pulls/1663) +- 2025-11-23T04:23:06+01:00 Bug fix: Swap l/r gains with temp variable by glossing in: [#1768](https://codeberg.org/uzu/strudel/pulls/1768) +- 2025-11-23T00:52:28+01:00 FIX: prevent LFO filter modulation from popping from negative values by daslyfe in: [#1767](https://codeberg.org/uzu/strudel/pulls/1767) +- 2025-11-21T01:56:11+01:00 Bug Fix: Use frac due to negative frequencies from FM by glossing in: [#1759](https://codeberg.org/uzu/strudel/pulls/1759) +- 2025-11-20T19:48:16+01:00 [perf] fix `connect-leak` added by #1742 when noise() is not used by jeromew in: [#1757](https://codeberg.org/uzu/strudel/pulls/1757) +- 2025-11-20T14:51:00+01:00 [perf] fix `connect-leak` in `delay` effect by jeromew in: [#1755](https://codeberg.org/uzu/strudel/pulls/1755) +- 2025-11-20T14:49:41+01:00 [perf] fix `connect leak` when .noise() is in the mix by jeromew in: [#1742](https://codeberg.org/uzu/strudel/pulls/1742) +- 2025-11-18T23:52:45+01:00 wchooseCycles has now notes in an example by scrappy_fiddler in: [#1748](https://codeberg.org/uzu/strudel/pulls/1748) +- 2025-11-17T05:31:54+01:00 Feature: Partials by glossing in: [#1659](https://codeberg.org/uzu/strudel/pulls/1659) +- 2025-11-16T22:06:14+01:00 README: update superdough documentation by TristanMlct in: [#1741](https://codeberg.org/uzu/strudel/pulls/1741) +- 2025-11-16T21:08:54+01:00 Worklet optimizations by glossing in: [#1730](https://codeberg.org/uzu/strudel/pulls/1730) +- 2025-11-15T14:59:30+01:00 [perf] disconnect Offline AudioNode connections in generateReverb by jeromew in: [#1740](https://codeberg.org/uzu/strudel/pulls/1740) +- 2025-11-15T14:57:47+01:00 [perf] disconnect `send` effect AudioNode when `room` is used by jeromew in: [#1736](https://codeberg.org/uzu/strudel/pulls/1736) +- 2025-11-12T21:22:34+01:00 [supradough] fix: unstable filter by froos in: [#1593](https://codeberg.org/uzu/strudel/pulls/1593) +- 2025-11-12T21:12:07+01:00 Fix link syntax in `project-start` by Kissaki in: [#1724](https://codeberg.org/uzu/strudel/pulls/1724) +- 2025-11-12T21:06:13+01:00 Fix web README sample code by Kissaki in: [#1725](https://codeberg.org/uzu/strudel/pulls/1725) +- 2025-11-12T20:59:39+01:00 Fix typo: 'studel' -> 'strudel' by drhayes in: [#1726](https://codeberg.org/uzu/strudel/pulls/1726) +- 2025-11-12T15:23:41+01:00 fix for node 24 support in tests - #1718 by ausav in: [#1719](https://codeberg.org/uzu/strudel/pulls/1719) +- 2025-11-11T09:00:49+01:00 soundAlias example fix by PepsiiMan in: [#1720](https://codeberg.org/uzu/strudel/pulls/1720) +- 2025-11-10T08:18:36+01:00 fix: Make Supradough package build by munshkr in: [#1711](https://codeberg.org/uzu/strudel/pulls/1711) +- 2025-11-10T08:18:00+01:00 added docs for spaces in scale names by ondras in: [#1715](https://codeberg.org/uzu/strudel/pulls/1715) +- 2025-11-10T02:44:01+01:00 Feature: LFOs for Filters by glossing in: [#1636](https://codeberg.org/uzu/strudel/pulls/1636) +- 2025-11-05T17:07:00+01:00 improvement: sync midi messages to audio context clock by daslyfe in: [#1708](https://codeberg.org/uzu/strudel/pulls/1708) +- 2025-11-04T19:36:14+01:00 Add stick button mappings to gamepad implementation and improve docs by kaosuryoko in: [#1696](https://codeberg.org/uzu/strudel/pulls/1696) +- 2025-11-04T19:29:35+01:00 Refactor sound stopping and triggering logic in SoundsTab component by IJOL in: [#1688](https://codeberg.org/uzu/strudel/pulls/1688) +- 2025-11-04T19:13:21+01:00 Add setting to toggle pattern auto-start on pattern change by moumar in: [#1690](https://codeberg.org/uzu/strudel/pulls/1690) +- 2025-11-04T18:58:50+01:00 Voicings JSDoc by sharkeys_lunchbox in: [#1686](https://codeberg.org/uzu/strudel/pulls/1686) +- 2025-11-01T07:50:40+01:00 FIX: Loading local samples uses too much memory by daslyfe in: [#1706](https://codeberg.org/uzu/strudel/pulls/1706) + + +## october 2025 + +- 2025-10-28T22:58:24+01:00 Bug Fix: Handle scale-for-notes when n also supplied by glossing in: [#1625](https://codeberg.org/uzu/strudel/pulls/1625) +- 2025-10-28T22:51:16+01:00 Repurpose vim shortcuts for usability by dtricks in: [#1624](https://codeberg.org/uzu/strudel/pulls/1624) +- 2025-10-28T22:35:21+01:00 Add support for euclidian in mondo with `bd&3:8` by TristanCacqueray in: [#1630](https://codeberg.org/uzu/strudel/pulls/1630) +- 2025-10-27T10:42:07+01:00 Use bunny cdn for all samples and json files by yaxu in: [#1701](https://codeberg.org/uzu/strudel/pulls/1701) +- 2025-10-26T22:52:54+01:00 degithub - switch some samples to bunnycdn by yaxu in: [#1697](https://codeberg.org/uzu/strudel/pulls/1697) +- 2025-10-26T17:09:22+01:00 Fix ZZFX example by moumar in: [#1685](https://codeberg.org/uzu/strudel/pulls/1685) +- 2025-10-23T15:56:04+02:00 Make osc port and host configurable. Changes dependencies. by yaxu in: [#1682](https://codeberg.org/uzu/strudel/pulls/1682) +- 2025-10-23T03:47:31+02:00 Adds back shape to superdough by glossing in: [#1672](https://codeberg.org/uzu/strudel/pulls/1672) +- 2025-10-22T22:15:19+02:00 Fix sampler.mjs githubPath by jeromew in: [#1684](https://codeberg.org/uzu/strudel/pulls/1684) +- 2025-10-22T16:20:50+02:00 Fix onPaint for widgets by yaxu in: [#1658](https://codeberg.org/uzu/strudel/pulls/1658) +- 2025-10-22T15:19:12+02:00 Fix a bug introduced by #4e17cfbdd6 by milliganf in: [#1679](https://codeberg.org/uzu/strudel/pulls/1679) +- 2025-10-18T04:29:20+02:00 Bug Fix: Wavetable: phase wrapping at 1 and detune by glossing in: [#1620](https://codeberg.org/uzu/strudel/pulls/1620) +- 2025-10-16T20:26:28+02:00 github samples: default to "samples" if repository is not specified by prezmop in: [#1644](https://codeberg.org/uzu/strudel/pulls/1644) +- 2025-10-16T17:33:39+02:00 Docs: add example of custom chained function by dariusk in: [#1642](https://codeberg.org/uzu/strudel/pulls/1642) +- 2025-10-14T12:39:48+02:00 textbox by yaxu in: [#1650](https://codeberg.org/uzu/strudel/pulls/1650) +- 2025-10-13T07:05:57+02:00 Feature: Wavetable FM by glossing in: [#1623](https://codeberg.org/uzu/strudel/pulls/1623) +- 2025-10-12T20:43:42+02:00 fix: repair REPL sample sources and URL concat (#1640) by erikfox in: [#1646](https://codeberg.org/uzu/strudel/pulls/1646) +- 2025-10-10T11:25:02+02:00 Add control-metadata by yaxu in: [#1634](https://codeberg.org/uzu/strudel/pulls/1634) +- 2025-10-07T22:59:39+02:00 Fix MQTT: change the trigger handler to match new hap by jurrchen in: [#1629](https://codeberg.org/uzu/strudel/pulls/1629) +- 2025-10-05T21:42:19+02:00 Fix case sensitivity for synonym search by vvolhejn in: [#1618](https://codeberg.org/uzu/strudel/pulls/1618) +- 2025-10-01T08:56:35+02:00 Optimize wavetable synth by glossing in: [#1613](https://codeberg.org/uzu/strudel/pulls/1613) +- 2025-10-01T02:02:33+02:00 fix: pattern switching by daslyfe in: [#1616](https://codeberg.org/uzu/strudel/pulls/1616) + +## September 2025 + +- 2025-09-29T02:10:54+02:00 fix wavetable JSON by daslyfe in: [#1611](https://codeberg.org/uzu/strudel/pulls/1611) +- 2025-09-28T21:28:16+02:00 rename wavetable controls to match existing naming conventions by daslyfe in: [#1610](https://codeberg.org/uzu/strudel/pulls/1610) +- 2025-09-27T23:28:13+02:00 Feature: Wavetable synth improvements by glossing in: [#1607](https://codeberg.org/uzu/strudel/pulls/1607) +- 2025-09-27T21:43:10+02:00 wavetable improvements by daslyfe in: [#1608](https://codeberg.org/uzu/strudel/pulls/1608) +- 2025-09-26T08:48:46+02:00 create orbit based DJ filter by daslyfe in: [#1603](https://codeberg.org/uzu/strudel/pulls/1603) +- 2025-09-23T13:28:20+02:00 fix: time signal by daslyfe in: [#1583](https://codeberg.org/uzu/strudel/pulls/1583) +- 2025-09-21T16:16:06+02:00 mondo: fix all + setcpm + setcps by froos in: [#1600](https://codeberg.org/uzu/strudel/pulls/1600) +- 2025-09-19T21:59:43+02:00 fix: osc error message by froos in: [#1597](https://codeberg.org/uzu/strudel/pulls/1597) +- 2025-09-18T21:09:56+02:00 osc: --debug flag to see incoming messages by froos in: [#1595](https://codeberg.org/uzu/strudel/pulls/1595) +- 2025-09-17T14:12:10+02:00 simplify osc usage by froos in: [#1588](https://codeberg.org/uzu/strudel/pulls/1588) +- 2025-09-16T16:59:58+02:00 dev: logger errors to console in dev mode by daslyfe in: [#1585](https://codeberg.org/uzu/strudel/pulls/1585) +- 2025-09-15T22:52:14+02:00 add tic80 font by froos in: [#1579](https://codeberg.org/uzu/strudel/pulls/1579) +- 2025-09-15T00:00:19+02:00 supradough: fix delay + add some jsdoc types by froos in: [#1578](https://codeberg.org/uzu/strudel/pulls/1578) \ No newline at end of file diff --git a/warm.js b/warm.js new file mode 100644 index 000000000..0d148dee9 --- /dev/null +++ b/warm.js @@ -0,0 +1,14 @@ +fetch('https://codeberg.org/api/v1/repos/uzu/strudel/pulls?state=closed&page=1') + .then((res) => res.json()) + .then((pulls) => { + const r = pulls + .filter((pull) => pull.merged) + .sort((a, b) => new Date(b.closed_at) - new Date(a.closed_at)) + .map((pull) => `${pull.closed_at} ${pull.title} by ${pull.user.login || '?'} in: [#${pull.number}](${pull.url}) `) + .join('\n'); + console.log(r); + }); + +/* + + */ From ec263925098dc168fd89834ca62d1cc9b0fd18a2 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Thu, 27 Nov 2025 22:53:38 +0100 Subject: [PATCH 213/312] fix: return silence when no pattern is returned --- packages/core/repl.mjs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/core/repl.mjs b/packages/core/repl.mjs index 67028cb0c..4d59f5990 100644 --- a/packages/core/repl.mjs +++ b/packages/core/repl.mjs @@ -244,8 +244,7 @@ export function repl({ } if (!isPattern(pattern)) { - const message = `got "${typeof evaluated}" instead of pattern`; - throw new Error(message + (typeof evaluated === 'function' ? ', did you forget to call a function?' : '.')); + pattern = silence; } logger(`[eval] code updated`); pattern = await setPattern(pattern, autostart); From a6008e270097f28e012baaa97b2c8e21bb82f944 Mon Sep 17 00:00:00 2001 From: ndr0n Date: Fri, 28 Nov 2025 04:03:48 +0000 Subject: [PATCH 214/312] added export to getSuperdoughAudioController() so that its possible to route superdough audio on external application integrations. --- packages/superdough/superdough.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 0db41c088..5e9bb59da 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -274,7 +274,7 @@ export async function initAudioOnFirstClick(options) { } let controller; -function getSuperdoughAudioController() { +export function getSuperdoughAudioController() { if (controller == null) { controller = new SuperdoughAudioController(getAudioContext()); } From d84db1e663b2d89867700b60788f3ca54ffc4081 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Fri, 28 Nov 2025 10:02:57 +0100 Subject: [PATCH 215/312] 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 18dc4944bffff559fe686395eb487731088ed2e5 Mon Sep 17 00:00:00 2001 From: Aria Date: Fri, 28 Nov 2025 12:36:23 -0600 Subject: [PATCH 216/312] Typos and cleanup --- packages/superdough/superdough.mjs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 5a8b72806..f54689acb 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -307,7 +307,7 @@ function getPhaser(time, end, frequency = 1, depth = 0.5, centerFrequency = 1000 } filterChain.push(filter); } - return { filter: filterChain[filterChain.length - 1], lfo }; + return { phaser: filterChain[filterChain.length - 1], lfo }; } function getFilterType(ftype) { @@ -413,7 +413,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) release = 0, //phaser - phaserrate: phaser, + phaserrate, phaserdepth = getDefaultValue('phaserdepth'), phasersweep, phasercenter, @@ -560,7 +560,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) }; const lpParams = pickAndRename(value, lpMap); lpParams.type = 'lowpass'; - let lp = () => createFilter(ac, t, end, lpParams, cps, cycle); + const lp = () => createFilter(ac, t, end, lpParams, cps, cycle); const { filter: lpf1, lfo: lfo1 } = lp(); chain.push(lpf1); lfo1 && audioNodes.push(lfo1); @@ -593,7 +593,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) }; const hpParams = pickAndRename(value, hpMap); hpParams.type = 'highpass'; - let hp = () => createFilter(ac, t, end, hpParams, cps, cycle); + const hp = () => createFilter(ac, t, end, hpParams, cps, cycle); const { filter: hpf1, lfo: lfo1 } = hp(); chain.push(hpf1); lfo1 && audioNodes.push(lfo1); @@ -626,7 +626,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) }; const bpParams = pickAndRename(value, bpMap); bpParams.type = 'bandpass'; - let bp = () => createFilter(ac, t, end, bpParams, cps, cycle); + const bp = () => createFilter(ac, t, end, bpParams, cps, cycle); const { filter: bpf1, lfo: lfo1 } = bp(); chain.push(bpf1); lfo1 && audioNodes.push(lfo1); @@ -696,8 +696,8 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) chain.push(panner); } // phaser - if (phaser !== undefined && phaserdepth > 0) { - const { phaser, lfo } = getPhaser(t, endWithRelease, phaser, phaserdepth, phasercenter, phasersweep); + if (phaserrate !== undefined && phaserdepth > 0) { + const { phaser, lfo } = getPhaser(t, endWithRelease, phaserrate, phaserdepth, phasercenter, phasersweep); audioNodes.push(lfo); chain.push(phaser); } From cb591815edb75dcd0d52f0ef8f63f211b1c22dad Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 28 Nov 2025 21:35:35 +0000 Subject: [PATCH 217/312] fix copy paste errors --- packages/core/pattern.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index 9a9ffe98f..88a0993c9 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -2267,9 +2267,9 @@ export const rev = register( ); /** - * Reverse a whole pattern. See also `revv` for reversing each cycle. + * Reverse a whole pattern. See also `rev` for reversing each cycle. * - * @name rev + * @name revv * @memberof Pattern * @returns Pattern * @example From 956598da18fbfd66256fbcb18e1225c31e32af30 Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 28 Nov 2025 22:03:21 +0000 Subject: [PATCH 218/312] snapshot --- test/__snapshots__/examples.test.mjs.snap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 064f4c2d5..e4b46b97f 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -9256,7 +9256,7 @@ exports[`runs examples > example "rev" example index 0 1`] = ` ] `; -exports[`runs examples > example "rev" example index 0 2`] = ` +exports[`runs examples > example "revv" example index 0 1`] = ` [ "[ 0/1 → 1/2 | note:g ]", "[ 1/2 → 1/1 | note:e ]", From b65cc2128feabf0a5909e652fe59058303aadbf1 Mon Sep 17 00:00:00 2001 From: jeromew Date: Sat, 29 Nov 2025 14:47:03 +0000 Subject: [PATCH 219/312] [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 fc74dcdb1a56e7f2122e87210be53e6a60d1ea74 Mon Sep 17 00:00:00 2001 From: Nikita Date: Fri, 24 Oct 2025 19:21:34 +0300 Subject: [PATCH 220/312] More bug fixes --- packages/webaudio/webaudio.mjs | 43 +++++++++++------------------ website/src/repl/useReplContext.jsx | 10 ++++++- 2 files changed, 25 insertions(+), 28 deletions(-) diff --git a/packages/webaudio/webaudio.mjs b/packages/webaudio/webaudio.mjs index c9b5cbda3..7c8ff648e 100644 --- a/packages/webaudio/webaudio.mjs +++ b/packages/webaudio/webaudio.mjs @@ -14,12 +14,8 @@ import { setAudioContext, initAudio, setSuperdoughAudioController, - setMaxPolyphony, - setMultiChannelOrbits, resetGlobalEffects, - errorLogger, - maxPolyphony as superdoughMaxPolyphony, - multiChannelOrbits as superdoughMultiChannelOrbits + errorLogger } from 'superdough'; import './supradough.mjs'; import { workletUrl } from 'supradough'; @@ -51,10 +47,6 @@ export async function renderPatternAudio( multiChannelOrbits, downloadName = undefined, ) { - let realtimeOptions = { - maxPolyphony: superdoughMaxPolyphony, - multiChannelOrbits: superdoughMultiChannelOrbits - } let audioContext = getAudioContext(); await audioContext.close(); audioContext = new OfflineAudioContext(2, ((end - begin) / cps) * sampleRate, sampleRate); @@ -63,28 +55,26 @@ export async function renderPatternAudio( await initAudio({ maxPolyphony, multiChannelOrbits - }); + }) logger('[webaudio] preloading'); let haps = pattern.queryArc(begin, end, { _cps: cps }); - await Promise.all( - haps.map(async (hap) => { - if (hap.hasOnset()) { - try { - await superdough( - hap2value(hap), - hap.whole.begin.valueOf() / cps, - hap.duration / cps, - cps, - hap.whole?.begin.valueOf(), - ); - } catch (err) { - errorLogger(err, 'webaudio'); - } + for (const hap of haps) { + if (hap.hasOnset()) { + try { + await superdough( + hap2value(hap), + (hap.whole.begin.valueOf() - begin) / cps, + hap.duration / cps, + cps, + (hap.whole?.begin.valueOf() - begin) / cps, + ); + } catch (err) { + errorLogger(err, 'webaudio'); } - }), - ); + } + } logger('[webaudio] start rendering'); return audioContext @@ -106,7 +96,6 @@ export async function renderPatternAudio( setAudioContext(null); setSuperdoughAudioController(null); resetGlobalEffects(); - await initAudio(realtimeOptions); }); } diff --git a/website/src/repl/useReplContext.jsx b/website/src/repl/useReplContext.jsx index 15b3fab10..361abc1d3 100644 --- a/website/src/repl/useReplContext.jsx +++ b/website/src/repl/useReplContext.jsx @@ -15,6 +15,7 @@ import { resetLoadedSounds, initAudioOnFirstClick, resetDefaults, + initAudio, } from '@strudel/webaudio'; import { setVersionDefaultsFrom } from './util.mjs'; import { StrudelMirror, defaultSettings } from '@strudel/codemirror'; @@ -217,7 +218,14 @@ export function useReplContext() { maxPolyphony, multiChannelOrbits, downloadName, - ).finally(() => { + ).finally(async () => { + const { latestCode, maxPolyphony, audioDeviceName, multiChannelOrbits } = settingsMap.get() + await initAudio({ + latestCode, + maxPolyphony, + audioDeviceName, + multiChannelOrbits + }) editorRef.current.repl.scheduler.stop(); }); }; From 91ebdd5ea62ddeb8d9a346f73d5c3dd2a06aa98b Mon Sep 17 00:00:00 2001 From: Nikita Date: Fri, 24 Oct 2025 20:55:39 +0300 Subject: [PATCH 221/312] Better progress bar UI --- website/src/repl/components/ExportModal.jsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/website/src/repl/components/ExportModal.jsx b/website/src/repl/components/ExportModal.jsx index 4bc8990ea..ad1fc5827 100644 --- a/website/src/repl/components/ExportModal.jsx +++ b/website/src/repl/components/ExportModal.jsx @@ -199,7 +199,7 @@ export default function ExportModal(Props) { disabled={exporting} onClick={async () => { setExporting(true); - setTimeout(refreshProgress, 1000); + setTimeout(refreshProgress, 2000); await handleExport(startCycle, endCycle, sampleRate, maxPolyphony, multiChannelOrbits, downloadName) .then(() => { const modal = document.getElementById('exportModal'); @@ -212,13 +212,13 @@ export default function ExportModal(Props) { }); }} > - {exporting ? 'Exporting...' : 'Export to WAV'}
+ {exporting ? 'Exporting...' : 'Export to WAV'}
From 8f9967c76dae6d053f8157f2e091d697c385a19c Mon Sep 17 00:00:00 2001 From: Nikita Date: Fri, 24 Oct 2025 20:55:56 +0300 Subject: [PATCH 222/312] Format --- packages/webaudio/webaudio.mjs | 6 +++--- website/src/repl/components/ExportModal.jsx | 6 ++---- website/src/repl/useReplContext.jsx | 6 +++--- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/packages/webaudio/webaudio.mjs b/packages/webaudio/webaudio.mjs index 7c8ff648e..9da5a411d 100644 --- a/packages/webaudio/webaudio.mjs +++ b/packages/webaudio/webaudio.mjs @@ -15,7 +15,7 @@ import { initAudio, setSuperdoughAudioController, resetGlobalEffects, - errorLogger + errorLogger, } from 'superdough'; import './supradough.mjs'; import { workletUrl } from 'supradough'; @@ -54,8 +54,8 @@ export async function renderPatternAudio( setSuperdoughAudioController(new SuperdoughAudioController(audioContext)); await initAudio({ maxPolyphony, - multiChannelOrbits - }) + multiChannelOrbits, + }); logger('[webaudio] preloading'); let haps = pattern.queryArc(begin, end, { _cps: cps }); diff --git a/website/src/repl/components/ExportModal.jsx b/website/src/repl/components/ExportModal.jsx index ad1fc5827..bac8c6b14 100644 --- a/website/src/repl/components/ExportModal.jsx +++ b/website/src/repl/components/ExportModal.jsx @@ -3,9 +3,7 @@ import cx from '@src/cx.mjs'; import NumberInput from './NumberInput'; import { useEffect, useState } from 'react'; import { Textbox } from './textbox/Textbox'; -import { - getAudioContext, -} from '@strudel/webaudio'; +import { getAudioContext } from '@strudel/webaudio'; import XMarkIcon from '@heroicons/react/24/outline/XMarkIcon'; function Checkbox({ label, value, onChange, disabled = false }) { @@ -215,7 +213,7 @@ export default function ExportModal(Props) {
{exporting ? 'Exporting...' : 'Export to WAV'} diff --git a/website/src/repl/useReplContext.jsx b/website/src/repl/useReplContext.jsx index 361abc1d3..59d86a4d6 100644 --- a/website/src/repl/useReplContext.jsx +++ b/website/src/repl/useReplContext.jsx @@ -219,13 +219,13 @@ export function useReplContext() { multiChannelOrbits, downloadName, ).finally(async () => { - const { latestCode, maxPolyphony, audioDeviceName, multiChannelOrbits } = settingsMap.get() + const { latestCode, maxPolyphony, audioDeviceName, multiChannelOrbits } = settingsMap.get(); await initAudio({ latestCode, maxPolyphony, audioDeviceName, - multiChannelOrbits - }) + multiChannelOrbits, + }); editorRef.current.repl.scheduler.stop(); }); }; From 7d890156f4c2a4a584c975e57fc8fa3e44d897df Mon Sep 17 00:00:00 2001 From: Nikita Date: Sat, 25 Oct 2025 18:53:24 +0300 Subject: [PATCH 223/312] Fix haps not being sorted by time --- packages/webaudio/webaudio.mjs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/webaudio/webaudio.mjs b/packages/webaudio/webaudio.mjs index 9da5a411d..8f18d80dc 100644 --- a/packages/webaudio/webaudio.mjs +++ b/packages/webaudio/webaudio.mjs @@ -58,7 +58,9 @@ export async function renderPatternAudio( }); logger('[webaudio] preloading'); - let haps = pattern.queryArc(begin, end, { _cps: cps }); + let haps = pattern + .queryArc(begin, end, { _cps: cps }) + .sort((a, b) => a.whole.begin.valueOf() - b.whole.begin.valueOf()); for (const hap of haps) { if (hap.hasOnset()) { From c5250d7794a2600d0aeca36885adf0e93e1d7be7 Mon Sep 17 00:00:00 2001 From: Nikita Date: Sat, 25 Oct 2025 18:59:12 +0300 Subject: [PATCH 224/312] Add info comment about ascending time order --- packages/webaudio/webaudio.mjs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/webaudio/webaudio.mjs b/packages/webaudio/webaudio.mjs index 8f18d80dc..36ee9d645 100644 --- a/packages/webaudio/webaudio.mjs +++ b/packages/webaudio/webaudio.mjs @@ -58,10 +58,11 @@ export async function renderPatternAudio( }); logger('[webaudio] preloading'); + // Calling superdough(...) in ascending onset time order is important + // for controls that depend on the audio graph state like `cut` let haps = pattern .queryArc(begin, end, { _cps: cps }) .sort((a, b) => a.whole.begin.valueOf() - b.whole.begin.valueOf()); - for (const hap of haps) { if (hap.hasOnset()) { try { From 5bddb6f48d969427d977ad807f3e7c3f0f482703 Mon Sep 17 00:00:00 2001 From: Nikita Date: Sun, 30 Nov 2025 10:09:06 +0300 Subject: [PATCH 225/312] Move export UI to the panel --- website/src/repl/components/ExportModal.jsx | 225 ------------------ website/src/repl/components/Header.jsx | 15 +- .../src/repl/components/panel/ExportTab.jsx | 197 +++++++++++++++ website/src/repl/components/panel/Panel.jsx | 4 + 4 files changed, 203 insertions(+), 238 deletions(-) delete mode 100644 website/src/repl/components/ExportModal.jsx create mode 100644 website/src/repl/components/panel/ExportTab.jsx diff --git a/website/src/repl/components/ExportModal.jsx b/website/src/repl/components/ExportModal.jsx deleted file mode 100644 index bac8c6b14..000000000 --- a/website/src/repl/components/ExportModal.jsx +++ /dev/null @@ -1,225 +0,0 @@ -import PlayCircleIcon from '@heroicons/react/20/solid/PlayCircleIcon'; -import cx from '@src/cx.mjs'; -import NumberInput from './NumberInput'; -import { useEffect, useState } from 'react'; -import { Textbox } from './textbox/Textbox'; -import { getAudioContext } from '@strudel/webaudio'; -import XMarkIcon from '@heroicons/react/24/outline/XMarkIcon'; - -function Checkbox({ label, value, onChange, disabled = false }) { - return ( - - ); -} - -function FormItem({ label, children, disabled }) { - return ( -
- - {children} -
- ); -} - -export default function ExportModal(Props) { - const { started, isEmbedded, handleExport } = Props; - - const [downloadName, setDownloadName] = useState(''); // TODO: make a form? - const [startCycle, setStartCycle] = useState(0); - const [endCycle, setEndCycle] = useState(1); - const [sampleRate, setSampleRate] = useState(48000); - const [multiChannelOrbits, setMultiChannelOrbits] = useState(true); - const [maxPolyphony, setMaxPolyphony] = useState(1024); - const [exporting, setExporting] = useState(false); - const [progress, setProgress] = useState(0); - const [length, setLength] = useState(1); - - const refreshProgress = () => { - const audioContext = getAudioContext(); - if (audioContext instanceof OfflineAudioContext) { - setProgress(audioContext.currentTime); - setLength(audioContext.length / sampleRate); - setTimeout(refreshProgress, 100); - } - }; - - return ( - <> - - - -
- - { - setDownloadName(e.target.value); - }} - onChange={(v) => { - setDownloadName(v); - }} - disabled={exporting} - placeholder="Leave empty to use current date" - className={cx('placeholder:opacity-50', exporting && 'opacity-50 border-opacity-50')} - value={downloadName ?? ''} - /> - -
- - { - let v = parseInt(e.target.value); - v = isNaN(v) ? 0 : Math.max(0, v); - setStartCycle(v); - }} - onChange={(v) => { - v = parseInt(v); - setStartCycle(v); - }} - type="number" - placeholder="" - disabled={exporting} - className={cx(exporting && 'opacity-50 border-opacity-50')} - value={startCycle ?? ''} - /> - - - { - let v = parseInt(e.target.value); - v = isNaN(v) ? Math.max(startCycle + 1, parseInt(v)) : v; - setEndCycle(v); - }} - onChange={(v) => { - v = parseInt(v); - setEndCycle(v); - }} - type="number" - placeholder="" - disabled={exporting} - className={cx(exporting && 'opacity-50 border-opacity-50')} - value={endCycle ?? ''} - /> - -
-
- - { - let v = parseInt(e.target.value); - v = isNaN(v) ? 1 : Math.max(1, v); - setSampleRate(v); - }} - onChange={(v) => { - v = parseInt(v); - setSampleRate(v); - }} - type="number" - placeholder="" - disabled={exporting} - className={cx(exporting && 'opacity-50 border-opacity-50')} - value={sampleRate ?? ''} - /> - - - { - let v = parseInt(e.target.value); - v = isNaN(v) ? Math.max(1, parseInt(v)) : v; - setMaxPolyphony(v); - }} - onChange={(v) => { - v = Math.max(1, parseInt(v)); - setMaxPolyphony(v); - }} - type="number" - placeholder="" - disabled={exporting} - className={cx(exporting && 'opacity-50 border-opacity-50')} - value={maxPolyphony ?? ''} - /> - -
-
- { - const val = cbEvent.target.checked; - setMultiChannelOrbits(val); - }} - disabled={exporting} - value={multiChannelOrbits} - /> -
- -
-
- - ); -} diff --git a/website/src/repl/components/Header.jsx b/website/src/repl/components/Header.jsx index dd9f684c1..ca4e1ecf9 100644 --- a/website/src/repl/components/Header.jsx +++ b/website/src/repl/components/Header.jsx @@ -3,23 +3,13 @@ import StopCircleIcon from '@heroicons/react/20/solid/StopCircleIcon'; import cx from '@src/cx.mjs'; import { useSettings, setIsZen } from '../../settings.mjs'; import '../Repl.css'; -import ExportModal from './ExportModal'; const { BASE_URL } = import.meta.env; const baseNoTrailing = BASE_URL.endsWith('/') ? BASE_URL.slice(0, -1) : BASE_URL; export function Header({ context, embedded = false }) { - const { - started, - pending, - isDirty, - activeCode, - handleTogglePlay, - handleEvaluate, - handleShuffle, - handleShare, - handleExport, - } = context; + const { started, pending, isDirty, activeCode, handleTogglePlay, handleEvaluate, handleShuffle, handleShare } = + context; const isEmbedded = typeof window !== 'undefined' && (embedded || window.location !== window.parent.location); const { isZen, isButtonRowHidden, isCSSAnimationDisabled, fontFamily } = useSettings(); @@ -103,7 +93,6 @@ export function Header({ context, embedded = false }) { > {!isEmbedded && update} - {/* !isEmbedded && ( +
+ + + ); +} diff --git a/website/src/repl/components/panel/Panel.jsx b/website/src/repl/components/panel/Panel.jsx index b26c2edef..cfe90ae30 100644 --- a/website/src/repl/components/panel/Panel.jsx +++ b/website/src/repl/components/panel/Panel.jsx @@ -9,6 +9,7 @@ import { useLogger } from '../useLogger'; import { WelcomeTab } from './WelcomeTab'; import { PatternsTab } from './PatternsTab'; import { ChevronLeftIcon, XMarkIcon } from '@heroicons/react/16/solid'; +import ExportTab from './ExportTab'; const TAURI = typeof window !== 'undefined' && window.__TAURI__; @@ -80,6 +81,7 @@ const tabNames = { patterns: 'patterns', sounds: 'sounds', reference: 'reference', + export: 'export', console: 'console', settings: 'settings', }; @@ -126,6 +128,8 @@ function PanelContent({ context, tab }) { return ; case tabNames.reference: return ; + case tabNames.export: + return ; case tabNames.settings: return ; case tabNames.files: From 24b69ad1bcc6861268f34f4cf01685e8f11bfeca Mon Sep 17 00:00:00 2001 From: jeromew Date: Sun, 30 Nov 2025 14:09:03 +0000 Subject: [PATCH 226/312] [perf] Add audiograph `await debugAudiograph();` tool --- website/src/repl/audiograph.mjs | 618 ++++++++++++++++++++++++++++ website/src/repl/useReplContext.jsx | 2 + 2 files changed, 620 insertions(+) create mode 100644 website/src/repl/audiograph.mjs diff --git a/website/src/repl/audiograph.mjs b/website/src/repl/audiograph.mjs new file mode 100644 index 000000000..d203496ae --- /dev/null +++ b/website/src/repl/audiograph.mjs @@ -0,0 +1,618 @@ +/* +audiograph.mjs - show a svg view of the web audio API graph built during a playback +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 . +*/ + +// main entry point is `debugAudiograph` + +import { logger } from '@strudel/core'; +import { getAudioContext, getSuperdoughAudioController, webaudioOutput } from '@strudel/webaudio'; + +let mermaid = null; +let svgPanZoom = null; + +let running = false; +let hap_count = 0; + +let cache = new Map(); +const initCache = JSON.stringify({ + connect: [], + where: [], + disconnectAll: 0, + disconnectOne: 0, + stopCount: 0, + ac: null, + creation: null, +}); + +let toggleOrig; + +function stackTrace() { + var err = new Error(); + const stacktrace = err.stack; + const lines = stacktrace.split('\n'); + let lineIndex = lines.findIndex((line) => line !== 'Error' && !line.includes('audiograph.mjs')); + if (lines[lineIndex].includes('gainNode')) lineIndex++; + if (lines[lineIndex].includes('getWorklet')) lineIndex++; + const line = lines[lineIndex].replace(/\s*at\s/, '').replace('http', '@'); + let match; + match = line.match(/([^@]*)@.*packages(\/[^:]+:\d+:\d+)/); + if (match) { + return match[1].replace(/[^.:/a-zA-Z0-9]/g, '') + '@' + match[2].replace(/[^.:/a-zA-Z0-9]/g, ''); + } + return '@'; +} + +// This captures all AudioNodes lazily +// when an `.audioid` property is called +// no solution was found to hook +// AudioNode's constructor directly +let audioid = 0; +const lazyRegister = (o) => { + Object.defineProperty(o.prototype, 'audioid', { + get: function () { + if (!this._audioid) { + this._audioid = ++audioid; + const s = JSON.parse(initCache); + s.type = this.constructor.name === 'AudiographNode' ? this.constructor._parentClassName : this.constructor.name; + s.ac = this.context?.constructor.name || 'AudioParam'; + s.creation = s.creation || stackTrace(); + cache.set(this._audioid, s); + } + return this._audioid; + }, + enumerable: false, + configurable: true, + }); +}; + +// extend a specific AudioNode's constructor +// necessary when creation is done direclty by +// calling the constructor +// eg: new GainNode(...) +const audioNodeHook = (node) => { + const name = node.prototype.constructor.name; + const PatchedNode = class AudiographNode extends node { + constructor(...args) { + super(...args); + // trigger the lazy register + this._audioid = this.audioid; + } + }; + PatchedNode._parentClassName = name; + window[name] = PatchedNode; +}; + +const drawMessage = async function (message) { + const element = document.querySelector('.strudel-mermaid'); + let gd = ''; + gd += '---\n'; + gd += 'config:\n'; + gd += ' flowchart:\n'; + gd += ' wrappingWidth: 600\n'; + gd += '---\n'; + gd += 'flowchart LR\n'; + gd += 'id[' + message.replaceAll(' ', ' ') + ']\n'; + + let { svg } = await mermaid.render('strudelSvgId', gd); + svg = svg.replace(/max-width:\s[0-9.]*px;/i, 'height: 100%'); + svg = svg.replaceAll('&nbsp;', ' '); + element.innerHTML = svg; +}; + +const drawDiagram = async function () { + const element = document.querySelector('.strudel-mermaid'); + + let code = window.strudelMirror.code; + code = code.replace(/^await debugAudiograph.*\n?/gm, ''); + code = '// date: ' + new Date().toISOString() + '\n\n' + code; + code = '// host: ' + document.location.hostname + '\n' + code; + const codeLines = code.split(/(?:\n|\r\n?)/); + const maxLineLength = codeLines.reduce((memo, line) => Math.max(memo, line.length), 0); + + // https://mermaid.js.org/syntax/flowchart.html + let gd = ''; + gd += '---\n'; + gd += 'config:\n'; + gd += ' flowchart:\n'; + gd += ' wrappingWidth: ' + 14 * maxLineLength + '\n'; + gd += '---\n'; + gd += 'flowchart TB\n'; + gd += '\tsubgraph AG[STRUDEL AUDIOGRAPH]\n'; + + // seed graph builder with all + // unconnected nodes + let lookup = []; + cache.forEach((v, k) => { + if (v.connect.length === 0) lookup.push(k); + }); + const relations = []; + let curRelations; + const zombieCount = 0; + const sourceLoc = (stack) => { + if (stack === '@') return stack; + return stack.replace('@', '\n').replace('/superdough/', '/'); + }; + const label = (s) => { + const source = s.creation ? '\n' + sourceLoc(s.creation) : ''; + let lb = '[' + '**' + s.type + '**' + source + ']'; + if (s.ac === 'OfflineAudioContext') lb = '[' + lb + ']'; + return lb; + }; + const isLeak = (s) => { + return ( + ['AudioDestinationNode', 'AudioParam'].indexOf(s.type) === -1 && + s.disconnectAll === 0 && + s.connect.length > s.disconnectOne + ); + }; + do { + curRelations = relations.length; + lookup.slice().forEach((n) => { + cache.forEach((v, k) => { + if (v.connect.indexOf(n) !== -1) { + if (lookup.indexOf(k) === -1) lookup.push(k); + gd += v.connect + .map((i) => { + if (lookup.indexOf(i) === -1) lookup.push(i); + if (relations.indexOf(k + '-' + i) === -1) { + relations.push(k + '-' + i); + return ( + '\t\tnode' + + k + + label(v) + + ' -- ' + + sourceLoc(v.where[0]) + + ' --> node' + + i + + label(cache.get(i)) + + '\n' + ); + } + }) + .join(''); + } + if (k === n) { + gd += v.connect + .map((i) => { + if (lookup.indexOf(i) === -1) lookup.push(i); + if (relations.indexOf(k + '-' + i) === -1) { + relations.push(k + '-' + i); + return ( + '\t\tnode' + + k + + label(v) + + ' -- ' + + sourceLoc(v.where[0]) + + ' --> node' + + i + + label(cache.get(i)) + + '\n' + ); + } + }) + .join(''); + } + }); + }); + } while (relations.length > curRelations /*&& lookup.length < 100*/); + + const codePlaceholder = 'm'.repeat(maxLineLength); + gd += '\tsubgraph LEGEND\n'; + gd += '\t\tlegend1[in AudioContext]\n'; + gd += '\t\tlegend2[[in OfflineAudioContext]]\n'; + gd += '\t\tlegend3[not disconnected]\n'; + gd += '\t\tlegend4[AudioParam]\n'; + gd += '\t\tlegend5[AudioDestinationNode]\n'; + gd += '\tend\n'; + gd += '\tsubgraph CODE[Strudel Code]\n'; + // we use a codePlaceholder to + // - avoid problems with special chars + // - stop mermaid to split lines on space with multiple tspans + // - force mermaid to prepare a sufficiently sized zone + gd += '\ncode[' + (codePlaceholder + '
').repeat(codeLines.length) + ']\n'; + gd += '\tend\n'; + gd += '\tend\n'; + gd += '\tclassDef audioparam fill:#6f6;\n'; + gd += '\tclassDef destination fill:#99f;\n'; + gd += '\tclassDef suspect fill:#f96,stroke:#f00,stroke-width:2px;\n'; + gd += '\tclass legend3 suspect;\n'; + gd += '\tclass legend4 audioparam;\n'; + gd += '\tclass legend5 destination;\n'; + cache.forEach((v, k) => { + if (isLeak(v)) { + gd += '\tclass node' + k + ' suspect;\n'; + } + if (v.type === 'AudioParam') { + gd += '\tclass node' + k + ' audioparam;\n'; + } + if (v.type === 'AudioDestinationNode') { + gd += '\tclass node' + k + ' destination;\n'; + } + }); + let { svg } = await mermaid.render('strudelSvgId', gd); + + // put real code in code zone + let idx = 0; + const escapeHtml = (unsafe) => { + return unsafe + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); + }; + svg = svg.replaceAll(codePlaceholder, () => escapeHtml(codeLines[idx++])); + + // improve sizing on web page + svg = svg.replace(/max-width:\s[0-9.]*px;/i, 'height: 100%'); + element.innerHTML = svg; + + // align the code lines + let svgText = document.querySelector('[id^=flowchart-code] text'); + svgText.setAttributeNS(null, 'style', 'text-anchor: start;'); + const svgElement = document.querySelector('svg'); + const svgLabel = document.querySelector('svg [id^=flowchart-code] .label'); + const transformList = svgLabel.transform.baseVal; + const svgTransform = svgElement.createSVGTransform(); + const tspans = Array.from(document.querySelectorAll('[id^=flowchart-code] tspan.text-inner-tspan')); + let tspansMaxLength = tspans.reduce((memo, tspan) => Math.max(memo, tspan.getComputedTextLength()), 0); + svgTransform.setTranslate(-tspansMaxLength / 2, 0); + transformList.appendItem(svgTransform); + + let doPan = false; + let eventsHandler; + let panZoom; + let mousepos; + + eventsHandler = { + haltEventListeners: ['mousedown', 'mousemove', 'mouseup'], + mouseDownHandler: function (ev) { + if (event.target.className == '[object SVGAnimatedString]') { + doPan = true; + mousepos = { + x: ev.clientX, + y: ev.clientY, + }; + } + }, + mouseMoveHandler: function (ev) { + if (doPan) { + panZoom.panBy({ + x: ev.clientX - mousepos.x, + y: ev.clientY - mousepos.y, + }); + mousepos = { + x: ev.clientX, + y: ev.clientY, + }; + window.getSelection().removeAllRanges(); + } + }, + mouseUpHandler: function (ev) { + doPan = false; + }, + init: function (options) { + options.svgElement.addEventListener('mousedown', this.mouseDownHandler, false); + options.svgElement.addEventListener('mousemove', this.mouseMoveHandler, false); + options.svgElement.addEventListener('mouseup', this.mouseUpHandler, false); + }, + destroy: function (options) { + options.svgElement.removeEventListener('mousedown', this.mouseDownHandler, false); + options.svgElement.removeEventListener('mousemove', this.mouseMoveHandler, false); + options.svgElement.removeEventListener('mouseup', this.mouseUpHandler, false); + }, + }; + panZoom = svgPanZoom('#strudelSvgId', { + zoomEnabled: true, + controlIconsEnabled: true, + fit: 1, + center: 1, + zoomScaleSensitivity: 0.4, + customEventsHandler: eventsHandler, + }); +}; + +const svgExport = async () => { + const a = document.createElement('a'); + document.body.appendChild(a); + a.style = 'display: none'; + + const selector = '.strudel-mermaid'; + const bbox = document.querySelector('svg g').getBBox(); + let transform, style; + // clean pan-zoom viewport + const pzViewport = document.querySelector('.svg-pan-zoom_viewport'); + if (pzViewport) { + transform = pzViewport.transform; + style = pzViewport.style; + pzViewport.setAttribute('transform', ''); + pzViewport.style = ''; + } + + const spzMin = await fetch('https://cdn.jsdelivr.net/npm/svg-pan-zoom@3.6.2/dist/svg-pan-zoom.min.js').then((res) => + res.text(), + ); + + const scriptContent = ''; + // prepare svg + const content = document + .querySelector(selector) + .innerHTML.replaceAll('
', '
') + // remove useless tags + .replace(/ { + if (k <= audioid) cache.delete(k); + }); +}; + +const postProcessing = async function () { + hap_count = 0; + await drawDiagram(); + + resetAudioOutput(audioid); +}; + +const defaultOptions = { + StopAfterHapCount: 10, + hapsBatch: 0, + maxEdges: 10000, + maxTextSize: 200000, + audioAPIBreathingRoomSec: 5, +}; + +// `StopAfterHapCount` : +// The player will auto-stop after hap count have +// been played. when StopAfterHapCount = 0, it will +// continue playing until 'stop' is clicked +// `audioAPIBreathingRoomSec` : +// how much time should we wait after 'stop' to let +// the audioAPI finish its tail of ondended calls +// `hapsBatch` : +// the AudioGraph will be displayed every hapsBatch haps +// when hapsBatch = 0, AudioGraph will only be displayed +// after and auto-stop or after 'stop' is clicked +// In hapsBatch mode you will probably see a trailing of +// non disconnected notes on the graph because the audio +// API may have some lag disconnecting them +// cf also audioAPIBreathingRoomSec +// `maxEdges` +// This is a mermaid.js config that forces a hard limit +// on the maximum number of Edges of a graph +// needs a reload to be taken into account +// `maxTextSize` +// This is a mermaid.js config that forces a hard limit +// on the maximum text size of a graph definition +// needs a reload to be taken into account + +export const debugAudiograph = async (argOptions = {}) => { + const options = Object.assign({}, defaultOptions, argOptions); + const { StopAfterHapCount, hapsBatch, maxEdges, maxTextSize, audioAPIBreathingRoomSec } = options; + const sm = window.strudelMirror; + const code = sm.code; + if (!code.match(/await\s+debugAudiograph/)) { + throw new Error('you need to call `await debugAudiograph()` for audiograph to work'); + } + const emptyOptions = /await\s+debugAudiograph\(\)/.exec(code); + if (emptyOptions) { + const cutCode = emptyOptions.index + emptyOptions[0].length - 1; + const codeOptions = JSON.stringify({ StopAfterHapCount: StopAfterHapCount }).replaceAll('"', ''); + sm.setCode(code.slice(0, cutCode) + codeOptions + code.slice(cutCode)); + } + + if (window.audiograph === undefined) { + const ag = (window.audiograph = {}); + + toggleOrig = sm.toggle; + + //////////////////////////////////////// + // step 1: web audio api instrumentation + //////////////////////////////////////// + + // path AudioNode & AudioParam + // to give them lazy ids + // this captures both `ac.createGain` + // and `new GainNode(..)` patterns + lazyRegister(AudioNode); + lazyRegister(AudioParam); + + const audioNodes = [ + AudioBufferSourceNode, + AudioWorkletNode, + AnalyserNode, + BiquadFilterNode, + ChannelMergerNode, + ChannelSplitterNode, + ConstantSourceNode, + ConvolverNode, + DelayNode, + DynamicsCompressorNode, + GainNode, + IIRFilterNode, + OscillatorNode, + PannerNode, + StereoPannerNode, + WaveShaperNode, + ]; + audioNodes.map((n) => audioNodeHook(n)); + + // patch BaseAudioContext factory methods + // to capture the source reference + Object.getOwnPropertyNames(BaseAudioContext.prototype) + .filter((n) => n.startsWith('create') && ['createBuffer'].indexOf(n) === -1) + .map((name) => { + const orig = BaseAudioContext.prototype[name]; + BaseAudioContext.prototype[name] = function (...args) { + const result = orig.call(this, ...args); + const s = cache.get(result.audioid); + s.creation = stackTrace(); + return result; + }; + }); + + const connectOrig = AudioNode.prototype.connect; + AudioNode.prototype.connect = function (destination, ...args) { + const result = connectOrig.call(this, destination, ...args); + const s = cache.get(this.audioid); + s.connect.push(destination.audioid); + s.where.push(stackTrace()); + return result; + }; + + const disconnectOrig = AudioNode.prototype.disconnect; + AudioNode.prototype.disconnect = function (destination, ...args) { + const result = disconnectOrig.call(this, destination, ...args); + const s = cache.get(this.audioid); + if (s.connect.length) { + if (destination) { + s.disconnectOne++; + } else { + s.disconnectAll++; + } + } else { + logger('WEIRD: node ' + this.audioid + 'called disconnect before any call to connect !'); + logger(new Error().stack); + console.log(cache); + } + return result; + }; + + // call reset 2 times to handle reload + 'play' + // the first reset's disconnect adds audioid tags on previous outputs + // that were not tagged (wrong cutoff) + resetAudioOutput(audioid); + // the second reset has the correct audioid cutoff + resetAudioOutput(audioid); + + //////////////////////////////////////// + // step 2: Load external modules + //////////////////////////////////////// + + const { default: mermaidModule } = await import( + 'https://cdn.jsdelivr.net/npm/mermaid@11.12.1/dist/mermaid.esm.mjs' + ); + mermaid = mermaidModule; + + mermaid.initialize({ + startOnLoad: false, + themeCSS: '.flowchart { height: 100%; }', + maxEdges: maxEdges, + maxTextSize: maxTextSize, + htmlLabels: false, + flowchart: { + htmlLabels: false, + }, + }); + + const { default: svgPanZoomModule } = await import('https://esm.sh/svg-pan-zoom'); + svgPanZoom = svgPanZoomModule; + + ////////////////////////////////////////// + // step 3: UI modifications + ////////////////////////////////////////// + + // add audiograph panel + if (!document.querySelector('.strudel-mermaid')) { + const mermaidDiv = document.createElement('div'); + mermaidDiv.className = 'strudel-mermaid'; + mermaidDiv.style = 'min-height: 600px; width: 60%'; + const referenceNode = document.querySelector('#code'); + referenceNode.parentNode.insertBefore(mermaidDiv, referenceNode.nextSibling); + } + + // add svg export button + if (!document.querySelector('button[title=svg]')) { + const exportButton = document.createElement('button'); + exportButton.innerHTML = 'ExportDiagram'; + exportButton.title = 'svg'; + exportButton.onclick = svgExport; + const updateButton = document.querySelector('button[title=update]'); + updateButton.parentNode.insertBefore(exportButton, updateButton); + } + } + + if (!running) { + running = true; + } + + if (hapsBatch === 0 || hap_count < hapsBatch) { + let msg = ''; + msg += 'Recording activity...'; + msg += '\npress stop to build diagram'; + if (StopAfterHapCount) { + msg += '\nwill stop automatically in ' + Math.max(StopAfterHapCount - hap_count, 0) + ' haps'; + } + await drawMessage(msg); + } + + sm.toggle = async () => { + running = false; + sm.toggle = toggleOrig; + // schedule `toggle` on the js main loop + // to avoid interfering with any on-flight onTick + // not doing this can lead to a phase > 0 which will + // break the next start + setTimeout(sm.toggle.bind(sm), 0); + await drawMessage('please wait ' + audioAPIBreathingRoomSec + ' seconds\n' + 'the audio API is finishing its work'); + setTimeout(postProcessing, audioAPIBreathingRoomSec * 1000); + }; + + /*global all*/ + all((pat) => + pat.onTrigger(async (hap, duration, cps, t) => { + hap_count++; + const key = Object.entries(hap.value) + .map((param) => param.join('/')) + .join('/'); + + // if we reached StopAfterHapCount, click 'stop' + if (StopAfterHapCount && hap_count > StopAfterHapCount) { + if (running) { + await sm.toggle(); + } + // stop sending haps to superdough(...) + return; + } + + await webaudioOutput(hap, t, hap.duration / cps, cps, t); + + if (hapsBatch && hap_count % hapsBatch === 0) drawDiagram(); + }), + ); +}; diff --git a/website/src/repl/useReplContext.jsx b/website/src/repl/useReplContext.jsx index 8dcb6b754..7ef86c08e 100644 --- a/website/src/repl/useReplContext.jsx +++ b/website/src/repl/useReplContext.jsx @@ -36,6 +36,7 @@ import { getRandomTune, initCode, loadModules, shareCode } from './util.mjs'; import './Repl.css'; import { setInterval, clearInterval } from 'worker-timers'; import { getMetadata } from '../metadata_parser'; +import { debugAudiograph } from './audiograph'; const { latestCode, maxPolyphony, audioDeviceName, multiChannelOrbits } = settingsMap.get(); let modulesLoading, presets, drawContext, clearCanvas, audioReady; @@ -129,6 +130,7 @@ export function useReplContext() { bgFill: false, }); window.strudelMirror = editor; + window.debugAudiograph = debugAudiograph; // init settings initCode().then(async (decoded) => { From 05ed16e15860c5ac704a9c14b88048998942c3e9 Mon Sep 17 00:00:00 2001 From: jeromew Date: Sun, 30 Nov 2025 17:50:56 +0000 Subject: [PATCH 227/312] Add `stop-leak` detection. Stoppable nodes that are not stopped --- website/src/repl/audiograph.mjs | 42 +++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/website/src/repl/audiograph.mjs b/website/src/repl/audiograph.mjs index d203496ae..52ac311a3 100644 --- a/website/src/repl/audiograph.mjs +++ b/website/src/repl/audiograph.mjs @@ -21,6 +21,7 @@ const initCache = JSON.stringify({ where: [], disconnectAll: 0, disconnectOne: 0, + hasStop: false, stopCount: 0, ac: null, creation: null, @@ -56,6 +57,7 @@ const lazyRegister = (o) => { this._audioid = ++audioid; const s = JSON.parse(initCache); s.type = this.constructor.name === 'AudiographNode' ? this.constructor._parentClassName : this.constructor.name; + s.hasStop = window[s.type].prototype instanceof AudioScheduledSourceNode; s.ac = this.context?.constructor.name || 'AudioParam'; s.creation = s.creation || stackTrace(); cache.set(this._audioid, s); @@ -103,7 +105,6 @@ const drawMessage = async function (message) { const drawDiagram = async function () { const element = document.querySelector('.strudel-mermaid'); - let code = window.strudelMirror.code; code = code.replace(/^await debugAudiograph.*\n?/gm, ''); code = '// date: ' + new Date().toISOString() + '\n\n' + code; @@ -140,13 +141,16 @@ const drawDiagram = async function () { if (s.ac === 'OfflineAudioContext') lb = '[' + lb + ']'; return lb; }; - const isLeak = (s) => { + const isConnectLeak = (s) => { return ( ['AudioDestinationNode', 'AudioParam'].indexOf(s.type) === -1 && s.disconnectAll === 0 && s.connect.length > s.disconnectOne ); }; + const isStopLeak = (s) => { + return s.hasStop && s.stopCount === 0; + }; do { curRelations = relations.length; lookup.slice().forEach((n) => { @@ -197,6 +201,13 @@ const drawDiagram = async function () { }); }); } while (relations.length > curRelations /*&& lookup.length < 100*/); + // add orphan nodes + const inRelation = '-' + relations.join('-') + '-'; + cache.forEach((v, k) => { + if (!inRelation.includes('-' + k + '-')) { + gd += '\t\tnode' + k + label(v) + '\n'; + } + }); const codePlaceholder = 'm'.repeat(maxLineLength); gd += '\tsubgraph LEGEND\n'; @@ -205,6 +216,7 @@ const drawDiagram = async function () { gd += '\t\tlegend3[not disconnected]\n'; gd += '\t\tlegend4[AudioParam]\n'; gd += '\t\tlegend5[AudioDestinationNode]\n'; + gd += '\t\tlegend6[not stopped]\n'; gd += '\tend\n'; gd += '\tsubgraph CODE[Strudel Code]\n'; // we use a codePlaceholder to @@ -216,13 +228,17 @@ const drawDiagram = async function () { gd += '\tend\n'; gd += '\tclassDef audioparam fill:#6f6;\n'; gd += '\tclassDef destination fill:#99f;\n'; - gd += '\tclassDef suspect fill:#f96,stroke:#f00,stroke-width:2px;\n'; - gd += '\tclass legend3 suspect;\n'; + gd += '\tclassDef connectleak fill:#f96,stroke:#f00,stroke-width:2px;\n'; + gd += '\tclassDef stopleak fill:#f55,stroke:#f00,stroke-width:2px;\n'; + gd += '\tclass legend3 connectleak;\n'; gd += '\tclass legend4 audioparam;\n'; gd += '\tclass legend5 destination;\n'; + gd += '\tclass legend6 stopleak;\n'; cache.forEach((v, k) => { - if (isLeak(v)) { - gd += '\tclass node' + k + ' suspect;\n'; + if (isConnectLeak(v)) { + gd += '\tclass node' + k + ' connectleak;\n'; + } else if (isStopLeak(v)) { + gd += '\tclass node' + k + ' stopleak;\n'; } if (v.type === 'AudioParam') { gd += '\tclass node' + k + ' audioparam;\n'; @@ -470,7 +486,19 @@ export const debugAudiograph = async (argOptions = {}) => { StereoPannerNode, WaveShaperNode, ]; - audioNodes.map((n) => audioNodeHook(n)); + audioNodes.map((n) => { + if (n.prototype instanceof AudioScheduledSourceNode) { + const stopOrig = n.prototype.stop; + n.prototype.stop = function (...args) { + // stop called + const result = stopOrig.call(this, ...args); + const s = cache.get(this.audioid); + s.stopCount++; + return result; + }; + } + audioNodeHook(n); + }); // patch BaseAudioContext factory methods // to capture the source reference From 68b1cb87ca32ebcc9080a25abe5cf2019ffad24d Mon Sep 17 00:00:00 2001 From: jeromew Date: Mon, 1 Dec 2025 15:29:19 +0000 Subject: [PATCH 228/312] [perf] release unused AudioBufferSourceNode + releaseAudioNode --- packages/superdough/helpers.mjs | 31 +++++++++++++++++++++++++++---- packages/superdough/sampler.mjs | 16 +++++++++------- packages/superdough/synth.mjs | 13 +++++-------- packages/superdough/wavetable.mjs | 5 ++--- packages/superdough/worklets.mjs | 9 +++++---- 5 files changed, 48 insertions(+), 26 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index ed2c0c448..3e9b81135 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -554,10 +554,33 @@ export const getFrequencyFromValue = (value, defaultNote = 36) => { return Number(freq); }; -export const destroyAudioWorkletNode = (node) => { - if (node == null) { - return; +export const releaseAudioNode = (node) => { + // check we received an AudioNode + if (!(node instanceof AudioNode)) { + throw new Error('releaseAudioNode can only release an AudioNode'); } + + // https://developer.mozilla.org/en-US/docs/Web/API/AudioNode/disconnect node.disconnect(); - node.parameters.get('end')?.setValueAtTime(0, 0); + + // make sure all AudioScheduledSourceNode is in a stopped state + // https://developer.mozilla.org/en-US/docs/Web/API/AudioScheduledSourceNode + if (node instanceof AudioScheduledSourceNode) { + try { + node.stop(); + } catch (e) { + if (e instanceof DOMException && e.name === 'InvalidStateError') { + node.start(node.context.currentTime + 5); // will never happen + node.stop(); + } + } + } + + // https://www.w3.org/TR/webaudio-1.1/#AudioNode-actively-processing + // An AudioWorkletNode is actively processing when its AudioWorkletProcessor's [[callable process]] + // 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) { + node.parameters.get('end')?.setValueAtTime(0, 0); + } }; diff --git a/packages/superdough/sampler.mjs b/packages/superdough/sampler.mjs index aaa1a8e48..e066a2606 100644 --- a/packages/superdough/sampler.mjs +++ b/packages/superdough/sampler.mjs @@ -1,7 +1,7 @@ import { getBaseURL, getCommonSampleInfo } from './util.mjs'; import { registerSound, registerWaveTable } from './index.mjs'; import { getAudioContext } from './audioContext.mjs'; -import { getADSRValues, getParamADSR, getPitchEnvelope, getVibratoOscillator } from './helpers.mjs'; +import { getADSRValues, getParamADSR, getPitchEnvelope, getVibratoOscillator, releaseAudioNode } from './helpers.mjs'; import { logger } from './logger.mjs'; const bufferCache = {}; // string: Promise @@ -286,17 +286,19 @@ export async function onTriggerSample(t, value, onended, bank, resolveUrl) { const { bufferSource, sliceDuration, offset } = await getSampleBufferSource(value, bank, resolveUrl); - // asny stuff above took too long? - if (ac.currentTime > t) { - logger(`[sampler] still loading sound "${s}:${n}"`, 'highlight'); - // console.warn('sample still loading:', s, n); - return; - } if (!bufferSource) { logger(`[sampler] could not load "${s}:${n}"`, 'error'); return; } + // async stuff above took too long? + if (ac.currentTime > t) { + logger(`[sampler] loading sound "${s}:${n}" took too long`, 'highlight'); + // AudioBufferSourceNode will never be used. discard it + releaseAudioNode(bufferSource); + return; + } + // vibrato let vibratoOscillator = getVibratoOscillator(bufferSource.detune, value, t); diff --git a/packages/superdough/synth.mjs b/packages/superdough/synth.mjs index 3b27bf6c1..d50aebae2 100644 --- a/packages/superdough/synth.mjs +++ b/packages/superdough/synth.mjs @@ -3,7 +3,6 @@ import { registerSound, soundMap } from './superdough.mjs'; import { getAudioContext } from './audioContext.mjs'; import { applyFM, - destroyAudioWorkletNode, gainNode, getADSRValues, getFrequencyFromValue, @@ -13,6 +12,7 @@ import { getVibratoOscillator, getWorklet, noises, + releaseAudioNode, webAudioTimeout, } from './helpers.mjs'; import { logger } from './logger.mjs'; @@ -192,8 +192,7 @@ export function registerSynthSounds() { let timeoutNode = webAudioTimeout( ac, () => { - destroyAudioWorkletNode(o); - envGain.disconnect(); + releaseAudioNode(o); onended(); fm?.stop(); vibratoOscillator?.stop(); @@ -270,8 +269,7 @@ export function registerSynthSounds() { let timeoutNode = webAudioTimeout( ac, () => { - destroyAudioWorkletNode(o); - envGain.disconnect(); + releaseAudioNode(o); onended(); }, begin, @@ -344,9 +342,8 @@ export function registerSynthSounds() { let timeoutNode = webAudioTimeout( ac, () => { - destroyAudioWorkletNode(o); - destroyAudioWorkletNode(lfo); - envGain.disconnect(); + releaseAudioNode(o); + lfo && releaseAudioNode(lfo); onended(); fm?.stop(); vibratoOscillator?.stop(); diff --git a/packages/superdough/wavetable.mjs b/packages/superdough/wavetable.mjs index 3659edcd0..e9d810414 100644 --- a/packages/superdough/wavetable.mjs +++ b/packages/superdough/wavetable.mjs @@ -3,13 +3,13 @@ import { getBaseURL, getCommonSampleInfo } from './util.mjs'; import { applyFM, applyParameterModulators, - destroyAudioWorkletNode, getADSRValues, getFrequencyFromValue, getParamADSR, getPitchEnvelope, getVibratoOscillator, getWorklet, + releaseAudioNode, webAudioTimeout, } from './helpers.mjs'; import { logger } from './logger.mjs'; @@ -319,10 +319,9 @@ export async function onTriggerSynth(t, value, onended, tables, cps, frameLen) { const timeoutNode = webAudioTimeout( ac, () => { - destroyAudioWorkletNode(source); + releaseAudioNode(source); vibratoOscillator?.stop(); fm?.stop(); - node.disconnect(); wtPosModulators?.disconnect(); wtWarpModulators?.disconnect(); onended(); diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index bf633a63b..2f75453b9 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -508,13 +508,14 @@ class SuperSawOscillatorProcessor extends AudioWorkletProcessor { ]; } process(_input, outputs, params) { - if (currentTime <= params.begin[0]) { - return true; - } if (currentTime >= params.end[0]) { - // this.port.postMessage({ type: 'onended' }); + // should terminate return false; } + if (currentTime <= params.begin[0]) { + // keep alive + return true; + } const output = outputs[0]; const voices = params.voices[0]; // k-rate for (let i = 0; i < output[0].length; i++) { From af7855402ff42f156758cedff87a041519a0417d Mon Sep 17 00:00:00 2001 From: jeromew Date: Mon, 1 Dec 2025 20:43:55 +0000 Subject: [PATCH 229/312] Accept non-instanciated nodes for better developer experience --- packages/superdough/helpers.mjs | 2 ++ packages/superdough/synth.mjs | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 3e9b81135..3f57d0a52 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -555,6 +555,8 @@ export const getFrequencyFromValue = (value, defaultNote = 36) => { }; export const releaseAudioNode = (node) => { + if (node == null) return; + // check we received an AudioNode if (!(node instanceof AudioNode)) { throw new Error('releaseAudioNode can only release an AudioNode'); diff --git a/packages/superdough/synth.mjs b/packages/superdough/synth.mjs index d50aebae2..b02354465 100644 --- a/packages/superdough/synth.mjs +++ b/packages/superdough/synth.mjs @@ -343,7 +343,7 @@ export function registerSynthSounds() { ac, () => { releaseAudioNode(o); - lfo && releaseAudioNode(lfo); + releaseAudioNode(lfo); onended(); fm?.stop(); vibratoOscillator?.stop(); From 0ec9826de548ac7ac0b9d22b58ae6a4f17da7b90 Mon Sep 17 00:00:00 2001 From: jeromew Date: Tue, 2 Dec 2025 09:29:50 +0000 Subject: [PATCH 230/312] onceEnded mechanism to clean audioNode.onended callbacks --- packages/soundfonts/fontloader.mjs | 5 ++-- packages/superdough/helpers.mjs | 46 ++++++++++++++++++------------ packages/superdough/sampler.mjs | 13 +++++++-- packages/superdough/zzfx.mjs | 7 +++-- 4 files changed, 45 insertions(+), 26 deletions(-) diff --git a/packages/soundfonts/fontloader.mjs b/packages/soundfonts/fontloader.mjs index 427f57e31..ca9e45d51 100644 --- a/packages/soundfonts/fontloader.mjs +++ b/packages/soundfonts/fontloader.mjs @@ -6,6 +6,7 @@ import { getADSRValues, getPitchEnvelope, getVibratoOscillator, + onceEnded, } from '@strudel/webaudio'; import gm from './gm.mjs'; @@ -170,12 +171,12 @@ export function registerSoundfonts() { bufferSource.stop(envEnd); const stop = (releaseTime) => {}; - bufferSource.onended = () => { + onceEnded(bufferSource, () => { bufferSource.disconnect(); vibratoOscillator?.stop(); node.disconnect(); onended(); - }; + }); return { node, stop }; }, { type: 'soundfont', prebake: true, fonts }, diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 3f57d0a52..219c66d6f 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -349,20 +349,11 @@ export function webAudioTimeout(audioContext, onComplete, startTime, stopTime) { constantNode.connect(zeroGain); // Schedule the `onComplete` callback to occur at `stopTime` - constantNode.onended = () => { - // Ensure garbage collection - try { - zeroGain.disconnect(); - } catch { - // pass - } - try { - constantNode.disconnect(); - } catch { - // pass - } + onceEnded(constantNode, () => { + releaseAudioNode(zeroGain); + releaseAudioNode(constantNode); onComplete(); - }; + }); constantNode.start(startTime); constantNode.stop(stopTime); return constantNode; @@ -554,6 +545,17 @@ export const getFrequencyFromValue = (value, defaultNote = 36) => { return Number(freq); }; +// This helper should be used instead of the `node.onended = callback` pattern +// It adds a mechanism to help minimize gc retention +export const onceEnded = (node, callback) => { + let onended = callback; + node.onended = function cleanup() { + onended && onended(); + onended = null; + this.onended = null; + }; +}; + export const releaseAudioNode = (node) => { if (node == null) return; @@ -565,16 +567,24 @@ export const releaseAudioNode = (node) => { // https://developer.mozilla.org/en-US/docs/Web/API/AudioNode/disconnect node.disconnect(); - // make sure all AudioScheduledSourceNode is in a stopped state + // 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') { + logger( + `[superdough] Deprecation warning: it seems your code path is setting 'node.onended = callback' instead of using the onceEnded helper`, + ); + } try { node.stop(); } catch (e) { - if (e instanceof DOMException && e.name === 'InvalidStateError') { - node.start(node.context.currentTime + 5); // will never happen - node.stop(); - } + // At the stage, `start` was not called on the node + // but an `onended` callback releasing resources may exist + // and we want it to fire : + // - we force a start/stop cycle so that `onended` gets called + // - we `lock` the node so that no-one can start it + node.start(node.context.currentTime + 5); // will never happen + node.stop(); } } diff --git a/packages/superdough/sampler.mjs b/packages/superdough/sampler.mjs index e066a2606..1e8c786bf 100644 --- a/packages/superdough/sampler.mjs +++ b/packages/superdough/sampler.mjs @@ -1,7 +1,14 @@ import { getBaseURL, getCommonSampleInfo } from './util.mjs'; import { registerSound, registerWaveTable } from './index.mjs'; import { getAudioContext } from './audioContext.mjs'; -import { getADSRValues, getParamADSR, getPitchEnvelope, getVibratoOscillator, releaseAudioNode } from './helpers.mjs'; +import { + getADSRValues, + getParamADSR, + getPitchEnvelope, + getVibratoOscillator, + onceEnded, + releaseAudioNode, +} from './helpers.mjs'; import { logger } from './logger.mjs'; const bufferCache = {}; // string: Promise @@ -321,13 +328,13 @@ 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); - bufferSource.onended = function () { + onceEnded(bufferSource, function () { bufferSource.disconnect(); vibratoOscillator?.stop(); node.disconnect(); out.disconnect(); onended(); - }; + }); let envEnd = holdEnd + release + 0.01; bufferSource.stop(envEnd); const stop = (endTime) => { diff --git a/packages/superdough/zzfx.mjs b/packages/superdough/zzfx.mjs index 32db0395a..4a4c58c9c 100644 --- a/packages/superdough/zzfx.mjs +++ b/packages/superdough/zzfx.mjs @@ -3,6 +3,7 @@ import { midiToFreq, noteToMidi } from './util.mjs'; import { registerSound } from './superdough.mjs'; import { getAudioContext } from './audioContext.mjs'; import { buildSamples } from './zzfx_fork.mjs'; +import { onceEnded, releaseAudioNode } from './helpers.mjs'; export const getZZFX = (value, t) => { let { @@ -83,10 +84,10 @@ export function registerZZFXSounds() { wave, (t, value, onended) => { const { node: o } = getZZFX({ s: wave, ...value }, t); - o.onended = () => { - o.disconnect(); + onceEnded(o, () => { + releaseAudioNode(o); onended(); - }; + }); return { node: o, stop: () => {}, From 71d1fe99e499d07f5d6a4d84bea5ea2e69b25908 Mon Sep 17 00:00:00 2001 From: jeromew Date: Tue, 2 Dec 2025 13:51:16 +0000 Subject: [PATCH 231/312] Fix special case for FeedbackDelayNode --- website/src/repl/audiograph.mjs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/website/src/repl/audiograph.mjs b/website/src/repl/audiograph.mjs index 52ac311a3..bdd379711 100644 --- a/website/src/repl/audiograph.mjs +++ b/website/src/repl/audiograph.mjs @@ -5,7 +5,6 @@ This program is free software: you can redistribute it and/or modify it under th */ // main entry point is `debugAudiograph` - import { logger } from '@strudel/core'; import { getAudioContext, getSuperdoughAudioController, webaudioOutput } from '@strudel/webaudio'; @@ -57,7 +56,12 @@ const lazyRegister = (o) => { this._audioid = ++audioid; const s = JSON.parse(initCache); s.type = this.constructor.name === 'AudiographNode' ? this.constructor._parentClassName : this.constructor.name; - s.hasStop = window[s.type].prototype instanceof AudioScheduledSourceNode; + // special case for FeedbackDelayNode + // it is a subclass of DelayNode created in superdough/feedbackdelay.mjs + // it is not an AudioScheduledSourceNode anyway + if (s.type !== 'FeedbackDelayNode') { + s.hasStop = window[s.type].prototype instanceof AudioScheduledSourceNode; + } s.ac = this.context?.constructor.name || 'AudioParam'; s.creation = s.creation || stackTrace(); cache.set(this._audioid, s); From 2db30a710b9d35047c48991cdc25d36f9a70ffd9 Mon Sep 17 00:00:00 2001 From: jeromew Date: Tue, 2 Dec 2025 13:54:27 +0000 Subject: [PATCH 232/312] Fix codeformat --- website/src/repl/audiograph.mjs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/website/src/repl/audiograph.mjs b/website/src/repl/audiograph.mjs index bdd379711..2ec75befe 100644 --- a/website/src/repl/audiograph.mjs +++ b/website/src/repl/audiograph.mjs @@ -56,10 +56,10 @@ const lazyRegister = (o) => { this._audioid = ++audioid; const s = JSON.parse(initCache); s.type = this.constructor.name === 'AudiographNode' ? this.constructor._parentClassName : this.constructor.name; - // special case for FeedbackDelayNode - // it is a subclass of DelayNode created in superdough/feedbackdelay.mjs - // it is not an AudioScheduledSourceNode anyway - if (s.type !== 'FeedbackDelayNode') { + // special case for FeedbackDelayNode + // it is a subclass of DelayNode created in superdough/feedbackdelay.mjs + // it is not an AudioScheduledSourceNode anyway + if (s.type !== 'FeedbackDelayNode') { s.hasStop = window[s.type].prototype instanceof AudioScheduledSourceNode; } s.ac = this.context?.constructor.name || 'AudioParam'; From 25c20296a1a8fba2824d8df01bcc121a25205127 Mon Sep 17 00:00:00 2001 From: jeromew Date: Tue, 2 Dec 2025 13:58:09 +0000 Subject: [PATCH 233/312] Tone down log message when a pure orphan node is found --- website/src/repl/audiograph.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/src/repl/audiograph.mjs b/website/src/repl/audiograph.mjs index 2ec75befe..fd599db79 100644 --- a/website/src/repl/audiograph.mjs +++ b/website/src/repl/audiograph.mjs @@ -539,7 +539,7 @@ export const debugAudiograph = async (argOptions = {}) => { } } else { logger('WEIRD: node ' + this.audioid + 'called disconnect before any call to connect !'); - logger(new Error().stack); + //logger(new Error().stack); console.log(cache); } return result; From 1d4f2b81d8bac8f37ed79f26ed936810f2c62627 Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 3 Dec 2025 11:12:30 -0600 Subject: [PATCH 234/312] Switch back to explicit exports and use new release mechanism --- packages/core/controls.mjs | 105 +++++++++++++++++++++++++++++--- packages/superdough/helpers.mjs | 34 ++++------- 2 files changed, 108 insertions(+), 31 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 8a848fec0..426fd7479 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -468,7 +468,7 @@ export const { attack, att } = registerControl('attack', 'att'); * ._scope() * */ -Object.assign(globalThis, registerMultiControl(['fmh', 'fmi'], 8, 'fmh')); +export const { fmh, fmh1, fmh2, fmh3, fmh4, fmh5, fmh6, fmh7, fmh8 } = registerMultiControl(['fmh', 'fmi'], 8, 'fmh'); /** * Sets the Frequency Modulation of the synth. @@ -492,7 +492,8 @@ Object.assign(globalThis, registerMultiControl(['fmh', 'fmi'], 8, 'fmh')); * .fmh(1.06).fmh2(10).fmh3(0.1) * */ -Object.assign(globalThis, registerMultiControl(['fmi', 'fmh'], 8, 'fm')); +export const { fmi, fmi1, fmi2, fmi3, fmi4, fmi5, fmi6, fmi7, fmi8, fm, fm1, fm2, fm3, fm4, fm5, fm6, fm7, fm8 } = + registerMultiControl(['fmi', 'fmh'], 8, 'fm'); // fm envelope /** @@ -512,7 +513,10 @@ Object.assign(globalThis, registerMultiControl(['fmi', 'fmh'], 8, 'fm')); * ._scope() * */ -Object.assign(globalThis, registerMultiControl('fmenv', 8)); +export const { fmenv, fmenv1, fmenv2, fmenv3, fmenv4, fmenv5, fmenv6, fmenv7, fmenv8 } = registerMultiControl( + 'fmenv', + 8, +); /** * Attack time for the FM envelope: time it takes to reach maximum modulation @@ -530,7 +534,26 @@ Object.assign(globalThis, registerMultiControl('fmenv', 8)); * ._scope() * */ -Object.assign(globalThis, registerMultiControl('fmattack', 8, 'fmatt')); +export const { + fmattack, + fmattack1, + fmattack2, + fmattack3, + fmattack4, + fmattack5, + fmattack6, + fmattack7, + fmattack8, + fmatt, + fmatt1, + fmatt2, + fmatt3, + fmatt4, + fmatt5, + fmatt6, + fmatt7, + fmatt8, +} = registerMultiControl('fmattack', 8, 'fmatt'); /** * Waveform of the fm modulator @@ -546,7 +569,10 @@ Object.assign(globalThis, registerMultiControl('fmattack', 8, 'fmatt')); * n("0 1 2 3".fast(4)).chord("").voicing().s("sawtooth").fmwave("brown").fm(.6) * */ -Object.assign(globalThis, registerMultiControl('fmwave', 8)); +export const { fmwave, fmwave1, fmwave2, fmwave3, fmwave4, fmwave5, fmwave6, fmwave7, fmwave8 } = registerMultiControl( + 'fmwave', + 8, +); /** * Decay time for the FM envelope: seconds until the sustain level is reached after the attack phase. @@ -565,7 +591,26 @@ Object.assign(globalThis, registerMultiControl('fmwave', 8)); * ._scope() * */ -Object.assign(globalThis, registerMultiControl('fmdecay', 8, 'fmdec')); +export const { + fmdecay, + fmdecay1, + fmdecay2, + fmdecay3, + fmdecay4, + fmdecay5, + fmdecay6, + fmdecay7, + fmdecay8, + fmdec, + fmdec1, + fmdec2, + fmdec3, + fmdec4, + fmdec5, + fmdec6, + fmdec7, + fmdec8, +} = registerMultiControl('fmdecay', 8, 'fmdec'); /** * Sustain level for the FM envelope: how much modulation is applied after the decay phase @@ -584,7 +629,26 @@ Object.assign(globalThis, registerMultiControl('fmdecay', 8, 'fmdec')); * ._scope() * */ -Object.assign(globalThis, registerMultiControl('fmsustain', 8, 'fmsus')); +export const { + fmsustain, + fmsustain1, + fmsustain2, + fmsustain3, + fmsustain4, + fmsustain5, + fmsustain6, + fmsustain7, + fmsustain8, + fmsus, + fmsus1, + fmsus2, + fmsus3, + fmsus4, + fmsus5, + fmsus6, + fmsus7, + fmsus8, +} = registerMultiControl('fmsustain', 8, 'fmsus'); /** * Release time for the FM envelope: how much modulation is applied after the note is released @@ -597,12 +661,35 @@ Object.assign(globalThis, registerMultiControl('fmsustain', 8, 'fmsus')); * @param {number | Pattern} time release time * */ -Object.assign(globalThis, registerMultiControl('fmrelease', 8, 'fmrel')); +export const { + fmrelease, + fmrelease1, + fmrelease2, + fmrelease3, + fmrelease4, + fmrelease5, + fmrelease6, + fmrelease7, + fmrelease8, + fmrel, + fmrel1, + fmrel2, + fmrel3, + fmrel4, + fmrel5, + fmrel6, + fmrel7, + fmrel8, +} = registerMultiControl('fmrelease', 8, 'fmrel'); // FM Matrix +// Note: we do not declare top-level exports here since it would add +// ~162 more explicit exports. This is likely fine as the most common use-case would be to at least +// declare one other FM prior to utilizing the matrix functionality, but if we ever decide we need it, +// TODO to add it explicitly / go with the globalThis approach for (let i = 0; i <= 8; i++) { for (let j = 0; j <= 8; j++) { - Object.assign(globalThis, registerControl(`fmi${i}${j}`, `fm${i}${j}`)); + registerControl(`fmi${i}${j}`, `fm${i}${j}`); } } diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 073ed00bd..2080d32ed 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -372,13 +372,13 @@ const mod = (freq, type = 'sine') => { osc.frequency.value = freq; } osc.start(); - return { osc, freq }; + return osc; }; const fm = (frequencyparam, harmonicityRatio, wave = 'sine') => { const carrfreq = frequencyparam.value; const modfreq = carrfreq * harmonicityRatio; - return mod(modfreq, wave); + return { osc: mod(modfreq, wave), freq: modfreq }; }; export function applyFM(param, value, begin) { @@ -434,13 +434,12 @@ export function applyFM(param, value, begin) { toCleanup.push(envGain); output = osc.connect(envGain); } - fms[idx] = { input: osc.frequency, output, freq, toCleanup }; - osc.onended = () => cleanupNodes(fms[idx].toCleanup); + fms[idx] = { input: osc.frequency, output, freq, osc, toCleanup }; } - const { input, output, freq, toCleanup } = fms[idx]; + const { input, output, freq, osc, toCleanup } = fms[idx]; const g = gainNode(amt * freq); io.push(isMod ? output.connect(g) : input); - toCleanup.push(g); + cleanupOnEnd(osc, [...toCleanup, g]); } if (!io[1]) { logger( @@ -451,11 +450,6 @@ export function applyFM(param, value, begin) { } io[0].connect(io[1]); } - fmmod.osc.onended = () => { - envGain.disconnect(); - modulator.disconnect(); - fmmod.osc.disconnect(); - }; } return { stop: (t) => toStop.forEach((m) => m?.stop(t)), @@ -575,10 +569,9 @@ export const getFrequencyFromValue = (value, defaultNote = 36) => { // This helper should be used instead of the `node.onended = callback` pattern // It adds a mechanism to help minimize gc retention export const onceEnded = (node, callback) => { - let onended = callback; + const onended = callback; node.onended = function cleanup() { onended && onended(); - onended = null; this.onended = null; }; }; @@ -624,13 +617,10 @@ export const releaseAudioNode = (node) => { } }; -export const cleanupNode = (node, time) => { - if (node == null) return; - node.disconnect?.(); - node.parameters?.get('end')?.setValueAtTime(0, 0); - node.stop?.(time); -}; - -export const cleanupNodes = (nodes, time) => { - nodes.forEach((n) => cleanupNode(n, time)); +// Once the `anchor` node has ended, release all nodes in `toCleanup` +export const cleanupOnEnd = (anchor, toCleanup) => { + onceEnded( + anchor, + () => toCleanup.forEach((n) => releaseAudioNode(n)), + ); }; From 196f70ab6bfa14613490dd1117d1e01ab48249c3 Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 3 Dec 2025 11:13:21 -0600 Subject: [PATCH 235/312] Formatting --- packages/superdough/helpers.mjs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 2080d32ed..0b696df9b 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -619,8 +619,5 @@ export const releaseAudioNode = (node) => { // Once the `anchor` node has ended, release all nodes in `toCleanup` export const cleanupOnEnd = (anchor, toCleanup) => { - onceEnded( - anchor, - () => toCleanup.forEach((n) => releaseAudioNode(n)), - ); + onceEnded(anchor, () => toCleanup.forEach((n) => releaseAudioNode(n))); }; From 0b711e879c767ab1c4bfba7af0c655d28da70f8c Mon Sep 17 00:00:00 2001 From: jeromew Date: Thu, 4 Dec 2025 08:23:36 +0000 Subject: [PATCH 236/312] 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 d7e240e2dcce012256fc9c8bad509818a3d80828 Mon Sep 17 00:00:00 2001 From: jeromew Date: Thu, 4 Dec 2025 12:56:54 +0000 Subject: [PATCH 237/312] Add PeriodicWave & VowelNode support --- website/src/repl/audiograph.mjs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/website/src/repl/audiograph.mjs b/website/src/repl/audiograph.mjs index fd599db79..2876388a8 100644 --- a/website/src/repl/audiograph.mjs +++ b/website/src/repl/audiograph.mjs @@ -56,10 +56,10 @@ const lazyRegister = (o) => { this._audioid = ++audioid; const s = JSON.parse(initCache); s.type = this.constructor.name === 'AudiographNode' ? this.constructor._parentClassName : this.constructor.name; - // special case for FeedbackDelayNode - // it is a subclass of DelayNode created in superdough/feedbackdelay.mjs - // it is not an AudioScheduledSourceNode anyway - if (s.type !== 'FeedbackDelayNode') { + // special case for subclassed AudioNodes + // they are implemented in superdough but hard to get a reference on here + // they are not AudioScheduledSourceNodes anyway + if (['FeedbackDelayNode', 'VowelNode'].indexOf(s.type) === -1) { s.hasStop = window[s.type].prototype instanceof AudioScheduledSourceNode; } s.ac = this.context?.constructor.name || 'AudioParam'; @@ -471,6 +471,7 @@ export const debugAudiograph = async (argOptions = {}) => { // and `new GainNode(..)` patterns lazyRegister(AudioNode); lazyRegister(AudioParam); + lazyRegister(PeriodicWave); const audioNodes = [ AudioBufferSourceNode, From 46291bf85ca0cf583568266f02f7370c6eb67e82 Mon Sep 17 00:00:00 2001 From: jeromew Date: Thu, 4 Dec 2025 13:17:20 +0000 Subject: [PATCH 238/312] 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 239/312] 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 240/312] 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 241/312] 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 ad43259353a962fb48ec2374a5363715a77e816f Mon Sep 17 00:00:00 2001 From: Aria Date: Fri, 5 Dec 2025 13:39:52 -0600 Subject: [PATCH 242/312] Switch to omod --- packages/core/pattern.mjs | 57 +++++++++---------- packages/soundfonts/fontloader.mjs | 2 +- packages/superdough/helpers.mjs | 4 +- packages/superdough/superdough.mjs | 89 +++++++----------------------- 4 files changed, 52 insertions(+), 100 deletions(-) diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index d1875a964..f1cd06535 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -3726,7 +3726,8 @@ const resolveConfigKey = (funcName, key) => { addConfigAlias('lfo', 'target', 't'); addConfigAlias('lfo', 'param', 'p'); addConfigAlias('lfo', 'rate', 'r'); -addConfigAlias('lfo', 'depth', 'dep', 'dp', 'd'); +addConfigAlias('lfo', 'depth', 'dep', 'dr'); +addConfigAlias('lfo', 'depthabs', 'da'); addConfigAlias('lfo', 'dcoffset', 'dc'); addConfigAlias('lfo', 'shape', 'sh'); addConfigAlias('lfo', 'skew', 'sk'); @@ -3737,21 +3738,23 @@ addConfigAlias('env', 'attack', 'att', 'a'); addConfigAlias('env', 'decay', 'dec', 'd'); addConfigAlias('env', 'sustain', 'sus', 's'); addConfigAlias('env', 'release', 'rel', 'r'); -addConfigAlias('env', 'depth', 'dep', 'dp'); +addConfigAlias('env', 'depth', 'dep', 'dr'); +addConfigAlias('env', 'depthabs', 'da'); addConfigAlias('env', 'acurve', 'ac'); addConfigAlias('env', 'dcurve', 'dc'); addConfigAlias('env', 'rcurve', 'rc'); -addConfigAlias('send', 'id'); -addConfigAlias('send', 'target', 't'); -addConfigAlias('send', 'depth', 'dep', 'dp', 'd'); -addConfigAlias('send', 'dc'); +addConfigAlias('omod', 'orbit', 'o'); +addConfigAlias('omod', 'target', 't'); +addConfigAlias('omod', 'depth', 'dep', 'dr'); +addConfigAlias('omod', 'depthabs', 'da'); +addConfigAlias('omod', 'dc'); Pattern.prototype.modulate = function (type, config, idx) { if (config == null || typeof config !== 'object') { return this; } - if (!['lfo', 'send', 'env'].includes(type)) { - logger(`[core] Modulation type ${type} not found. Please use one of 'lfo', 'env', 'send'`); + if (!['lfo', 'env', 'omod'].includes(type)) { + logger(`[core] Modulation type ${type} not found. Please use one of 'lfo', 'env', 'omod'`); return this; } let output = this; @@ -3775,19 +3778,18 @@ Pattern.prototype.modulate = function (type, config, idx) { /** * Configures an LFO. Can be called in sequence like pat.lfo(...).lfo(...) to set up multiple LFOs * - * * @name lfo * @memberof Pattern * @param {Object} config LFO configuration. - * @param {string | Pattern} [config.target] Node (and parameter if specified like `lpf.frequency`) to modulate. Aliases: target, t + * @param {string | Pattern} [config.target] Node (and parameter if specified like `lpf.frequency`) to modulate. Aliases: t * @param {number | Pattern} [config.rate] Modulation rate. Aliases: rate, r - * @param {number | Pattern} [config.depth] Modulation depth. Aliases: dep, dp, d + * @param {number | Pattern} [config.depth] Relative modulation depth. Aliases: dep, dr + * @param {number | Pattern} [config.depthabs] Absolute modulation depth. Aliases: da * @param {number | Pattern} [config.dcoffset] DC offset / bias for the waveform. Aliases: dc * @param {number | Pattern} [config.shape] Waveform shape index. Aliases: sh * @param {number | Pattern} [config.skew] Waveform skew amount. Aliases: sk * @param {number | Pattern} [config.curve] Exponential curve amount. Aliases: c * @param {number | Pattern} [config.sync] Tempo-synced modulation rate. Aliases: s - * @param {number | null} idx Index of the LFO slot to overwrite. Omit to append a new LFO * @returns Pattern */ Pattern.prototype.lfo = function (config, idx) { @@ -3798,12 +3800,12 @@ export const lfo = (config) => pure({}).lfo(config); /** * Configures an envelope. Can be called in sequence like pat.env(...).env(...) to set up multiple envelopes * - * * @name env * @memberof Pattern * @param {Object} config Envelope configuration. - * @param {string | Pattern} [config.target] Node (and parameter if specified like `lpf.frequency`) to modulate. Aliases: target, t - * @param {number | Pattern} [config.depth] Modulation depth. Aliases: dep, dp + * @param {string | Pattern} [config.target] Node (and parameter if specified like `lpf.frequency`) to modulate. Aliases: t + * @param {number | Pattern} [config.depth] Relative modulation depth. Aliases: dep, dr + * @param {number | Pattern} [config.depthabs] Absolute modulation depth. Aliases: da * @param {number | Pattern} [config.attack] Time to reach depth. Aliases: att, a * @param {number | Pattern} [config.decay] Time to reach sustain. Aliases: dec, d * @param {number | Pattern} [config.sustain] Sustain depth. Aliases: sus, s @@ -3811,7 +3813,6 @@ export const lfo = (config) => pure({}).lfo(config); * @param {number | Pattern} [config.acurve] Snappiness of attack curve (-1 = relaxed, 1 = snappy). Aliases: ac * @param {number | Pattern} [config.dcurve] Snappiness of decay curve (-1 = relaxed, 1 = snappy). Aliases: dc * @param {number | Pattern} [config.rcurve] Snappiness of release curve (-1 = relaxed, 1 = snappy). Aliases: rc - * @param {number | null} idx Index of the envelope slot to overwrite. Omit to append a new envelope * @returns Pattern */ Pattern.prototype.env = function (config, idx) { @@ -3820,21 +3821,21 @@ Pattern.prototype.env = function (config, idx) { export const env = (config) => pure({}).env(config); /** - * Sends the output of this pattern to a parameter on another pattern. - * Can be called in sequence like pat.send(...).send(...) to send to multiple parameters + * Modulates with the output from a given `orbit` + * Can be called in sequence like pat.obus(...).obus(...) to set up multiple modulators * - * - * @name send + * @name omod * @memberof Pattern - * @param {Object} config Send configuration. - * @param {string | Pattern} [config.id] Pattern id to modulate - * @param {string | Pattern} [config.target] Node (and parameter if specified like `lpf.frequency`) to modulate. Aliases: target, t - * @param {number | Pattern} [config.depth] Modulation depth. Aliases:dep, dp, d + * @param {Object} config Orbit bus configuration. + * @param {string | Pattern} [config.orbit] Orbit to get modulation signal from + * @param {string | Pattern} [config.target] Node (and parameter if specified like `lpf.frequency`) to modulate. Aliases: t + * @param {number | Pattern} [config.depth] Relative modulation depth. Aliases: dep, dr + * @param {number | Pattern} [config.depthabs] Absolute modulation depth. Aliases: da + * @param {number | Pattern} [config.ratio] Modulation ratio. Aliases: rat * @param {number | Pattern} [config.dc] DC offset prior to application - * @param {number | null} idx Index of the send slot to overwrite. Omit to append a new send * @returns Pattern */ -Pattern.prototype.send = function (config, idx) { - return this.modulate('send', config, idx); +Pattern.prototype.omod = function (config, idx) { + return this.modulate('omod', config, idx); }; -export const send = (config) => pure({}).send(config); +export const omod = (config) => pure({}).omod(config); diff --git a/packages/soundfonts/fontloader.mjs b/packages/soundfonts/fontloader.mjs index ea5b6818f..62ea5f806 100644 --- a/packages/soundfonts/fontloader.mjs +++ b/packages/soundfonts/fontloader.mjs @@ -176,7 +176,7 @@ export function registerSoundfonts() { vibratoOscillator?.stop(); node.disconnect(); onended(); - }; + }); return { node, stop, source: bufferSource }; }, { type: 'soundfont', prebake: true, fonts }, diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 1cd292b9d..33c5a52b4 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -111,13 +111,11 @@ export function getEnvelope(audioContext, properties = {}) { export function getLfo(audioContext, properties = {}) { // Extract some params we need for deriving other params - const { begin, shape = 0, ...props } = properties; + const { shape = 0, ...props } = properties; const lfoprops = { - time: begin, shape: getModulationShapeInput(shape), ...props, }; - return getWorklet(audioContext, 'lfo-processor', lfoprops); } diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 44304e3c3..0a091b156 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -13,12 +13,10 @@ import { createFilter, effectSend, gainNode, - getADSRValues, getCompressor, getDistortion, getEnvelope, getLfo, - getParamADSR, getWorklet, webAudioTimeout, } from './helpers.mjs'; @@ -365,7 +363,6 @@ export function resetGlobalEffects() { controller?.reset(); analysers = {}; analysersData = {}; - idToNodes = {}; } function _getNodeParam(node, name) { @@ -455,12 +452,15 @@ function _getTargetParams(nodes, target) { } function connectLFO(idx, params, nodeTracker) { - const { rate = 1, sync, cps, target, ...filteredParams } = params; + // TODO: figure out min/max values and how to handle depth and depthabs here. + const { rate = 1, sync, cps, cycle, target, ...filteredParams } = params; filteredParams['frequency'] = sync !== undefined ? sync / cps : rate; + filteredParams['time'] = cycle / cps; const ac = getAudioContext(); const lfoNode = getLfo(ac, filteredParams); nodeTracker[`lfo${idx}`] = [lfoNode]; _getTargetParams(nodeTracker, target).forEach((t) => lfoNode.connect(t)); + return lfoNode; } function connectEnvelope(idx, params, nodeTracker) { @@ -474,10 +474,12 @@ function connectEnvelope(idx, params, nodeTracker) { }); nodeTracker[`env${idx}`] = [envNode]; _getTargetParams(nodeTracker, target).forEach((t) => envNode.connect(t)); + return envNode; } -function connectSendModulator(params, signal, nodeTracker, chainID) { +function connectOrbitModulator(params, nodeTracker) { const ac = getAudioContext(); + const signal = controller.getOrbit(params.orbit).output; const dc = new ConstantSourceNode(ac, { offset: params.dc ?? 0 }); dc.start(params.begin); const shifted = dc.connect(gainNode(1)); @@ -491,15 +493,6 @@ function connectSendModulator(params, signal, nodeTracker, chainID) { 0, params.begin, ); - webAudioTimeout( - ac, - () => { - modulator.disconnect(); - delete pendingConnections[params.id][chainID]; - }, - 0, - params.end + 0.05, - ); return { modulator, nodes: [dc, shifted, modulator] }; } @@ -510,8 +503,6 @@ function mapChannelNumbers(channels) { return (Array.isArray(channels) ? channels : [channels]).map((ch) => ch - 1); } -let idToNodes = {}; -let pendingConnections = {}; export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) => { const nodes = {}; // new: t is always expected to be the absolute target onset time @@ -641,7 +632,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) activeSoundSources.delete(chainID); } - let audioNodes = []; + const audioNodes = []; if (['-', '~', '_'].includes(s)) { return; @@ -939,26 +930,28 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) // connect chain elements together chain.slice(1).reduce((last, current) => last.connect(current), chain[0]); - audioNodes = audioNodes.concat(chain); + audioNodes.push(...chain); // finally, now that `nodes` is populated, set up modulators if (value.lfo) { for (const [idx, params] of Object.entries(value.lfo)) { - connectLFO( + const lfo = connectLFO( idx, { ...params, cps, + cycle, begin: t, end: endWithRelease, }, nodes, ); + audioNodes.push(lfo); } } if (value.env) { for (const [idx, params] of Object.entries(value.env)) { - connectEnvelope( + const env = connectEnvelope( idx, { ...params, @@ -967,57 +960,17 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) }, nodes, ); + audioNodes.push(env); } } - if (value.id) { - idToNodes[value.id] = new WeakRef(nodes); - } - if (value.send) { - for (const p of value.send) { - const modNodes = idToNodes[p.id].deref(); - if (!modNodes) { - logger( - `[superdough] Could not connect to pattern ${p.id} -- make sure a pattern with this name exists. Available targets: ${Object.keys(idToNodes).join(', ')}`, - ); - delete idToNodes[p.id]; - } else { - const { modulator, nodes: nodesToCleanup } = connectSendModulator( - { ...p, begin: t, end: endWithRelease }, - post, - modNodes, - chainID, - ); - audioNodes = audioNodes.concat(nodesToCleanup); - pendingConnections[p.id] ??= {}; - pendingConnections[p.id][chainID] = new WeakRef([modulator, p.target, endWithRelease]); - } - } - } - if (value.id in pendingConnections) { - for (const data of Object.values(pendingConnections[value.id])) { - const derefData = data.deref(); - if (!derefData) { - delete pendingConnections[value.id]; - continue; - } - const [modulator, target, end] = derefData; - const targets = _getTargetParams(nodes, target); - webAudioTimeout( - ac, - () => { - targets.forEach((target) => modulator.connect(target)); - }, - 0, - t, - ); - webAudioTimeout( - ac, - () => { - modulator.disconnect(); - }, - 0, - end, + if (value.omod) { + for (const p of value.omod) { + const { nodes: nodesToCleanup } = connectOrbitModulator( + { ...p, begin: t, end: endWithRelease }, + nodes, + chainID, ); + audioNodes.push(...nodesToCleanup); } } }; From 173e359a653895d3728aac34fa839f6d89a16dbb Mon Sep 17 00:00:00 2001 From: miranda Date: Sat, 6 Dec 2025 17:46:16 +0200 Subject: [PATCH 243/312] simplify envValAtTime and remove asymmetric behavior (fix #1653) --- packages/superdough/helpers.mjs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 0b696df9b..0f29e1d62 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -42,6 +42,7 @@ export const getParamADSR = ( decay, sustain, release, + // min = value at start of attack, max = value at end of attack; it is possible that max < min min, max, begin, @@ -59,17 +60,15 @@ export const getParamADSR = ( max = max === 0 ? 0.001 : max; } const range = max - min; - const peak = max; const sustainVal = min + sustain * range; const duration = end - begin; const envValAtTime = (time) => { let val; if (attack > time) { - let slope = getSlope(min, peak, 0, attack); - val = time * slope + (min > peak ? min : 0); + val = time * getSlope(min, max, 0, attack) + min; } else { - val = (time - attack) * getSlope(peak, sustainVal, 0, decay) + peak; + val = (time - attack) * getSlope(max, sustainVal, 0, decay) + max; } if (curve === 'exponential') { val = val || 0.001; From 82ca77be9d74c5cae55fb734f3262bbe9f01c1f6 Mon Sep 17 00:00:00 2001 From: Aria Date: Sat, 6 Dec 2025 12:02:11 -0600 Subject: [PATCH 244/312] Working version --- packages/core/pattern.mjs | 13 ++- packages/superdough/superdough.mjs | 108 +++++++++++++++++++------ packages/superdough/superdoughdata.mjs | 85 +++++++++++++++++++ packages/superdough/worklets.mjs | 17 ++-- 4 files changed, 191 insertions(+), 32 deletions(-) create mode 100644 packages/superdough/superdoughdata.mjs diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index f1cd06535..986ac9af4 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -3758,19 +3758,26 @@ Pattern.prototype.modulate = function (type, config, idx) { return this; } let output = this; + let target = config.target; for (const [rawKey, value] of Object.entries(config)) { const key = resolveConfigKey(type, rawKey); - const pat = reify(value); + if (key === 'target') continue; // we will set/default it below + const valuePat = reify(value); output = output .fmap((v) => (c) => { + if (target == null) { + // default target to the control set just before this in the chain + // e.g. pat.gain(0.5).lfo({..}) will be a gain-LFO + target = Object.keys(v).at(-1); + } v[type] ??= []; const t = v[type]; idx ??= t.length; - t[idx] ??= {}; + t[idx] ??= { target }; // set target t[idx][key] = c; return v; }) - .appLeft(pat); + .appLeft(valuePat); } return output; }; diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 0a091b156..f32a17168 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -25,6 +25,7 @@ import { errorLogger, logger } from './logger.mjs'; import { loadBuffer } from './sampler.mjs'; import { getAudioContext } from './audioContext.mjs'; import { SuperdoughAudioController } from './superdoughoutput.mjs'; +import { getSuperdoughControlData } from './superdoughdata.mjs'; export const DEFAULT_MAX_POLYPHONY = 128; const DEFAULT_AUDIO_DEVICE_NAME = 'System Standard'; @@ -416,6 +417,28 @@ const targetToParamGuess = { send: 'depth', }; +const controlData = getSuperdoughControlData(); + +// TODO: We would like to use the aliases in `controls` here, but cannot as +// the modules are independent. We may want to inject that method here in situations +// where superdough/core are run in tandem +export let getControlName; +const _getMainName = (control) => getControlName?.(control) ?? control; + +function _getControlData(control) { + return controlData[_getMainName(control)]; +} + +function _getControlValue(control, value, data) { + const main = _getMainName(control); + return Number(value[main] ?? data.default); +} + +function _getControlClamp(data, currentValue) { + const { min, max } = data; + return { min: min - currentValue, max: max - currentValue }; +} + function _getTargetParams(nodes, target) { let param; if (target.includes('.')) { @@ -451,49 +474,77 @@ function _getTargetParams(nodes, target) { return audioParams; } -function connectLFO(idx, params, nodeTracker) { - // TODO: figure out min/max values and how to handle depth and depthabs here. - const { rate = 1, sync, cps, cycle, target, ...filteredParams } = params; - filteredParams['frequency'] = sync !== undefined ? sync / cps : rate; - filteredParams['time'] = cycle / cps; - const ac = getAudioContext(); - const lfoNode = getLfo(ac, filteredParams); +function _getTargetParamsForControl(control, nodes) { + const main = _getMainName(control); + const data = _getControlData(main); + const targetParams = _getTargetParams(nodes, data.param); + return { targetParams, data }; +} + +function connectLFO(idx, params, nodeTracker, value) { + const { rate = 1, sync, cps, cycle, target, depth = 1, depthabs, ...filteredParams } = params; + const { targetParams, data } = _getTargetParamsForControl(target, nodeTracker); + const currentValue = _getControlValue(target, value, data); + const { min, max } = _getControlClamp(data, currentValue); + const depthValue = depthabs != null ? depthabs : depth * currentValue; + const modParams = { + ...filteredParams, + frequency: sync !== undefined ? sync / cps : rate, + time: cycle / cps, + depth: depthValue, + min, + max, + }; + const lfoNode = getLfo(getAudioContext(), modParams); nodeTracker[`lfo${idx}`] = [lfoNode]; - _getTargetParams(nodeTracker, target).forEach((t) => lfoNode.connect(t)); + targetParams.forEach((t) => lfoNode.connect(t)); return lfoNode; } -function connectEnvelope(idx, params, nodeTracker) { - const { target, acurve, dcurve, rcurve, ...filteredParams } = params; - const ac = getAudioContext(); - const envNode = getEnvelope(ac, { +function connectEnvelope(idx, params, nodeTracker, value) { + const { target, acurve, dcurve, rcurve, depth = 1, depthabs, ...filteredParams } = params; + const { targetParams, data } = _getTargetParamsForControl(target, nodeTracker); + const currentValue = _getControlValue(target, value, data); + const { min, max } = _getControlClamp(data, currentValue); + const depthValue = depthabs != null ? depthabs : depth * currentValue; + const envNode = getEnvelope(getAudioContext(), { ...filteredParams, + depth: depthValue, + min, + max, attackCurve: acurve, decayCurve: dcurve, releaseCurve: rcurve, }); nodeTracker[`env${idx}`] = [envNode]; - _getTargetParams(nodeTracker, target).forEach((t) => envNode.connect(t)); + targetParams.forEach((t) => envNode.connect(t)); return envNode; } -function connectOrbitModulator(params, nodeTracker) { +function connectOrbitModulator(params, nodeTracker, value) { const ac = getAudioContext(); + const { target, depth = 1, depthabs } = params; const signal = controller.getOrbit(params.orbit).output; const dc = new ConstantSourceNode(ac, { offset: params.dc ?? 0 }); dc.start(params.begin); const shifted = dc.connect(gainNode(1)); signal.connect(shifted); - const modulator = shifted.connect(gainNode((params.depth ?? 1) / 0.3)); + const { targetParams, data } = _getTargetParamsForControl(target, nodeTracker); + const currentValue = _getControlValue(target, value, data); + const { min, max } = _getControlClamp(data, currentValue); + const depthValue = depthabs != null ? depthabs : depth * currentValue; + const maxAbsDepth = Math.min(Math.abs(min), Math.abs(max)); + const boundedDepth = Math.min(Math.abs(depthValue), maxAbsDepth); + const modulator = shifted.connect(gainNode((Math.sign(depthValue) * boundedDepth) / 0.3)); webAudioTimeout( ac, () => { - _getTargetParams(nodeTracker, params.target).forEach((t) => modulator.connect(t)); + targetParams.forEach((t) => modulator.connect(t)); }, 0, params.begin, ); - return { modulator, nodes: [dc, shifted, modulator] }; + return { modulator, toCleanup: [dc, shifted, modulator] }; } let activeSoundSources = new Map(); @@ -710,11 +761,13 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) lpParams.type = 'lowpass'; const { filter: lpf1, lfo: lfo1 } = filt(lpParams); nodes['lpf'] = [lpf1]; + nodes['lpf_lfo'] = [lfo1]; chain.push(lpf1); lfo1 && audioNodes.push(lfo1); if (ftype === '24db') { const { filter: lpf2, lfo: lfo2 } = filt(lpParams); nodes['lpf'].push(lpf2); + nodes['lpf_lfo'].push(lfo2); chain.push(lpf2); lfo2 && audioNodes.push(lfo2); } @@ -744,11 +797,13 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) hpParams.type = 'highpass'; const { filter: hpf1, lfo: lfo1 } = filt(hpParams); nodes['hpf'] = [hpf1]; + nodes['hpf_lfo'] = [lfo1]; lfo1 && audioNodes.push(lfo1); chain.push(hpf1); if (ftype === '24db') { const { filter: hpf2, lfo: lfo2 } = filt(hpParams); nodes['hpf'].push(hpf2); + nodes['hpf_lfo'].push(lfo2); chain.push(hpf2); lfo2 && audioNodes.push(lfo2); } @@ -777,12 +832,16 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) const bpParams = pickAndRename(value, bpMap); bpParams.type = 'bandpass'; const { filter: bpf1, lfo: lfo1 } = filt(bpParams); + nodes['bpf'] = [bpf1]; + nodes['bpf_lfo'] = [lfo1]; chain.push(bpf1); lfo1 && audioNodes.push(lfo1); if (ftype === '24db') { const { filter: bpf2, lfo: lfo2 } = filt(bpParams); nodes['bpf'].push(bpf2); + nodes['bpf_lfo'].push(lfo2); chain.push(bpf2); + lfo2 && audioNodes.push(lfo2); } } @@ -847,6 +906,8 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) begin: t, end: endWithRelease, }); + nodes['tremolo'] = [lfo]; + nodes['tremolo_gain'] = [amGain]; lfo.connect(amGain.gain); audioNodes.push(lfo); chain.push(amGain); @@ -904,7 +965,8 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) } roomIR = await loadBuffer(url, ac, ir, 0); } - orbitBus.getReverb(roomsize, roomfade, roomlp, roomdim, roomIR, irspeed, irbegin); + const roomNode = orbitBus.getReverb(roomsize, roomfade, roomlp, roomdim, roomIR, irspeed, irbegin); + nodes['room'] = [roomNode]; const reverbSend = orbitBus.sendReverb(post, room); audioNodes.push(reverbSend); } @@ -945,6 +1007,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) end: endWithRelease, }, nodes, + value, ); audioNodes.push(lfo); } @@ -959,18 +1022,15 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) end: endWithRelease, }, nodes, + value, ); audioNodes.push(env); } } if (value.omod) { for (const p of value.omod) { - const { nodes: nodesToCleanup } = connectOrbitModulator( - { ...p, begin: t, end: endWithRelease }, - nodes, - chainID, - ); - audioNodes.push(...nodesToCleanup); + const { toCleanup } = connectOrbitModulator({ ...p, begin: t, end: endWithRelease }, nodes, value); + audioNodes.push(...toCleanup); } } }; diff --git a/packages/superdough/superdoughdata.mjs b/packages/superdough/superdoughdata.mjs new file mode 100644 index 000000000..1f3235e59 --- /dev/null +++ b/packages/superdough/superdoughdata.mjs @@ -0,0 +1,85 @@ +/* +superdoughdata.mjs - Data needed for running superdough (defaults, mappings, etc.) +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 . +*/ + +const CONTROL_DATA = { + stretch: { param: 'stretch.pitchFactor', default: 1, min: -4, max: 100 }, + gain: { param: 'gain.gain', default: 0.8, min: 0, max: 10 }, + postgain: { param: 'post.gain', default: 1, min: 0, max: 10 }, + pan: { param: 'pan.pan', min: 0, max: 1 }, + tremolo: { param: 'tremolo.rate', min: 0, max: 40 }, + tremolosync: { param: 'tremolo.sync', min: 0, max: 8 }, + tremolodepth: { param: 'tremolo_gain.gain', default: 1, min: 0, max: 10 }, + tremoloskew: { param: 'tremolo.skew', min: 0, max: 1 }, + tremolophase: { param: 'tremolo.phase', default: 0, min: 0, max: 1 }, + tremoloshape: { param: 'tremolo.shape', min: 0, max: 4 }, + + // LPF + cutoff: { param: 'lpf.frequency', min: 20, max: 24000 }, + resonance: { param: 'lpf.Q', min: 0.1, max: 30 }, + lprate: { param: 'lpf_lfo.rate', min: 0, max: 40 }, + lpsync: { param: 'lpf_lfo.sync', min: 0, max: 8 }, + lpdepth: { param: 'lpf_lfo.depth', min: 20, max: 24000 }, + lpdepthfrequency: { param: 'lpf_lfo.depth', min: 20, max: 24000 }, + lpshape: { param: 'lpf_lfo.shape', min: 0, max: 4 }, + lpdc: { param: 'lpf_lfo.dcoffset', min: -1, max: 1 }, + lpskew: { param: 'lpf_lfo.skew', min: 0, max: 1 }, + + // HPF + hcutoff: { param: 'hpf.frequency', min: 20, max: 24000 }, + hresonance: { param: 'hpf.Q', min: 0.1, max: 30 }, + + // BPF + bandf: { param: 'bpf.frequency', min: 20, max: 24000 }, + bandq: { param: 'bpf.Q', min: 0.1, max: 30 }, + + // FILTERS + // fanchor: { param: ['lpf.anchor', 'hpf.anchor', 'bpf.anchor'], min: 0, max: 1 }, + // drive: { param: ['lpf.drive', 'hpf.drive', 'bpf.drive'], min: 0, max: 2 }, + // vowel: { param: 'vowel.frequency', min: 200, max: 4000 }, + + // DISTORTION + coarse: { param: 'coarse.coarse', min: 1, max: 64 }, + crush: { param: 'crush.crush', min: 1, max: 16 }, + shape: { param: 'shape.shape', min: -1, max: 0.999 }, + shapevol: { param: 'shape.postgain', default: 1, min: 0, max: 1 }, + distort: { param: 'distort.distort', min: 0, max: 5 }, + distortvol: { param: 'distort.postgain', default: 1, min: 0, max: 1 }, + // distorttype: { param: 'distort.algorithm', default: 0, min: 0, max: 4 }, + + // COMPRESSOR + compressor: { param: 'compressor.threshold', default: -3, min: -100, max: 0 }, + compressorRatio: { param: 'compressor.ratio', default: 10, min: 1, max: 20 }, + compressorKnee: { param: 'compressor.knee', default: 10, min: 0, max: 40 }, + compressorAttack: { param: 'compressor.attack', default: 0.005, min: 0, max: 1 }, + compressorRelease: { param: 'compressor.release', default: 0.05, min: 0, max: 2 }, + + // PHASER + phaserrate: { param: 'phaser.rate', min: 0, max: 40 }, + phaserdepth: { param: 'phaser.depth', default: 0.75, min: 0, max: 1 }, + phasersweep: { param: 'phaser.sweep', min: 0, max: 5000 }, + phasercenter: { param: 'phaser.frequency', min: 20, max: 24000 }, + + // ORBIT EFFECTS + // delay: { param: 'delay.delayTime', default: 0, min: 0, max: 4 }, + delaytime: { param: 'delay.delayTime', min: 0, max: 4 }, + // delayfeedback: { param: 'delay.feedback', default: 0.5, min: 0, max: 0.98 }, + // delaysync: { param: 'delay.sync', default: 3 / 16, min: 0, max: 2 }, + dry: { param: 'dry.gain', min: 0, max: 1 }, + room: { param: 'room.wet', min: 0, max: 1 }, + // roomfade: { param: 'room.fade', min: 0, max: 1 }, + roomlp: { param: 'room.lp', min: 20, max: 24000 }, + djf: { param: 'djf.value', min: 0, max: 1 }, + + // SYNTHS + detune: { param: 'source.detune', min: 0, max: 1 }, + wt: { param: 'source.position', min: 0, max: 1 }, + warp: { param: 'source.warp', min: 0, max: 1 }, + freq: { param: 'source.frequency', min: 20, max: 24000 }, +}; + +export function getSuperdoughControlData() { + return CONTROL_DATA; +} diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index 65da72bb7..bb33a24ff 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -121,8 +121,8 @@ class LFOProcessor extends AudioWorkletProcessor { { name: 'shape', defaultValue: 0 }, { name: 'curve', defaultValue: 1 }, { name: 'dcoffset', defaultValue: 0 }, - { name: 'min', defaultValue: 0 }, - { name: 'max', defaultValue: 1 }, + { name: 'min', defaultValue: -1e9 }, + { name: 'max', defaultValue: 1e9 }, ]; } @@ -160,8 +160,10 @@ class LFOProcessor extends AudioWorkletProcessor { const dcoffset = parameters['dcoffset'][0]; - const min = dcoffset * depth; - const max = dcoffset * depth + depth; + const userMin = parameters['min'][0]; + const userMax = parameters['max'][0]; + const min = Math.min(userMin, userMax); + const max = Math.max(userMin, userMax); const shape = waveShapeNames[parameters['shape'][0]]; const blockSize = output[0].length ?? 0; @@ -967,6 +969,8 @@ class EnvelopeProcessor extends AudioWorkletProcessor { { name: 'decayCurve', defaultValue: 0, minValue: -1, maxValue: 1 }, { name: 'releaseCurve', defaultValue: 0, minValue: -1, maxValue: 1 }, { name: 'depth', defaultValue: 1 }, + { name: 'min', defaultValue: -1e9 }, + { name: 'max', defaultValue: 1e9 }, { name: 'retrigger', defaultValue: 1, minValue: 0, maxValue: 1 }, ]; } @@ -1029,6 +1033,8 @@ class EnvelopeProcessor extends AudioWorkletProcessor { const dCurve = pv(params.decayCurve, i); const rCurve = pv(params.releaseCurve, i); const depth = pv(params.depth, i); + const clampMin = pv(params.min, i); + const clampMax = pv(params.max, i); const states = [ { time: Number.POSITIVE_INFINITY, start: 0, target: 0 }, // idle { time: attack, start: this.attackStart, target: 1, curve: aCurve }, @@ -1042,7 +1048,8 @@ class EnvelopeProcessor extends AudioWorkletProcessor { this.state = (this.state + 1) % states.length; time = states[this.state].time; } - out[i] = this.val * depth; + const clamped = clamp(this.val * depth, Math.min(clampMin, clampMax), Math.max(clampMin, clampMax)); + out[i] = clamped; } return true; } From 53c101005c9f4bee299842a819d7ae27a7ddc58a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 7 Dec 2025 00:12:40 +0100 Subject: [PATCH 245/312] Document "-" in mini-notation --- website/src/pages/learn/mini-notation.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/website/src/pages/learn/mini-notation.mdx b/website/src/pages/learn/mini-notation.mdx index 02ead7434..8b09f12f4 100644 --- a/website/src/pages/learn/mini-notation.mdx +++ b/website/src/pages/learn/mini-notation.mdx @@ -142,6 +142,8 @@ The "~" represents a rest, and will create silence between other events: +Alternatively, "-" can be used instead of "~". It means the same thing. + ## Parallel / polyphony Using commas, we can play chords. From 16b5faf3331ce18a9a791059a7a71995815ecb54 Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 7 Dec 2025 11:23:55 -0600 Subject: [PATCH 246/312] 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 247/312] 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 248/312] 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 249/312] 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 a79491dd16fbe10460d5263c77273abe1b305113 Mon Sep 17 00:00:00 2001 From: Aria Date: Mon, 8 Dec 2025 16:32:54 -0600 Subject: [PATCH 250/312] Update loopbegin/end to not be offset --- packages/superdough/sampler.mjs | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/packages/superdough/sampler.mjs b/packages/superdough/sampler.mjs index 2deeb4b74..8e46426d3 100644 --- a/packages/superdough/sampler.mjs +++ b/packages/superdough/sampler.mjs @@ -65,21 +65,22 @@ export const getSampleBufferSource = async (hapValue, bank, resolveUrl) => { bufferSource.playbackRate.value = playbackRate; const { loopBegin = 0, loopEnd = 1, begin = 0, end = 1 } = hapValue; + const bufferDuration = bufferSource.buffer.duration; - // "The computation of the offset into the sound is performed using the sound buffer's natural sample rate, - // rather than the current playback rate, so even if the sound is playing at twice its normal speed, - // the midway point through a 10-second audio buffer is still 5." - const offset = begin * bufferSource.buffer.duration; + // The computation of the offset into the sound is performed using the sound buffer's natural duration, + // rather than the playback duration, so that even if the sound is playing at twice its normal speed, + // the midway point through a 10-second audio buffer is still 5. + const offset = begin * bufferDuration; const loop = hapValue.loop; if (loop) { bufferSource.loop = true; - bufferSource.loopStart = loopBegin * bufferSource.buffer.duration - offset; - bufferSource.loopEnd = loopEnd * bufferSource.buffer.duration - offset; + bufferSource.loopStart = loopBegin * bufferDuration; + bufferSource.loopEnd = loopEnd * bufferDuration; } - const bufferDuration = bufferSource.buffer.duration / bufferSource.playbackRate.value; - const sliceDuration = (end - begin) * bufferDuration; - return { bufferSource, offset, bufferDuration, sliceDuration }; + const playbackDuration = bufferDuration / bufferSource.playbackRate.value; + const sliceDuration = (end - begin) * playbackDuration; + return { bufferSource, offset, bufferDuration, playbackDuration, sliceDuration }; }; export const loadBuffer = (url, ac, s, n = 0) => { From e89414e400362ebe064858e4c0b1cc3441b56dca Mon Sep 17 00:00:00 2001 From: alex Date: Wed, 10 Dec 2025 09:19:12 +0000 Subject: [PATCH 251/312] 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 252/312] 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 253/312] 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 254/312] 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 255/312] 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 256/312] 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 2aeba2e53fa3a72b12b21b97300b5fc0a724a1a0 Mon Sep 17 00:00:00 2001 From: Aria Date: Thu, 11 Dec 2025 11:37:20 -0600 Subject: [PATCH 257/312] Working version of bus --- packages/core/controls.mjs | 22 ++++++++++++++ packages/core/pattern.mjs | 32 ++++++++++---------- packages/superdough/superdough.mjs | 19 ++++++++---- packages/superdough/superdoughdata.mjs | 2 ++ packages/superdough/superdoughoutput.mjs | 24 ++++++++++++--- packages/superdough/synth.mjs | 37 +++++++++++++++++++++++- 6 files changed, 111 insertions(+), 25 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index bcbac6254..6483880b1 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -2046,6 +2046,28 @@ export const { octave, oct } = registerControl('octave', 'oct'); * ) */ export const { orbit } = registerControl('orbit', 'o'); + +/** + * A `bus` is a send which can be used for mixing patterns. It combines with.. + * s("bus") to play that bus through another pattern (for, say, applying non-linear + * effects like distortion to multiple signals) + * + * otherPat.bmod(..) (to modulate another pattern with the bus) + * + * @name bus + * @param {number | Pattern} number + */ +export const { bus } = registerControl('bus'); + +/** + * Postgain multiplier prior to sending the signal to the audio bus. + * + * @name busgain + * @synonyms bgain + * @param {number | Pattern} number + */ +export const { busgain, bgain } = registerControl('busgain', 'bgain'); + // TODO: what is this? not found in tidal doc Answer: gain is limited to maximum of 2. This allows you to go over that export const { overgain } = registerControl('overgain'); // TODO: what is this? not found in tidal doc. Similar to above, but limited to 1 diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index 986ac9af4..b0420a2e6 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -3743,18 +3743,18 @@ addConfigAlias('env', 'depthabs', 'da'); addConfigAlias('env', 'acurve', 'ac'); addConfigAlias('env', 'dcurve', 'dc'); addConfigAlias('env', 'rcurve', 'rc'); -addConfigAlias('omod', 'orbit', 'o'); -addConfigAlias('omod', 'target', 't'); -addConfigAlias('omod', 'depth', 'dep', 'dr'); -addConfigAlias('omod', 'depthabs', 'da'); -addConfigAlias('omod', 'dc'); +addConfigAlias('bmod', 'orbit', 'o'); +addConfigAlias('bmod', 'target', 't'); +addConfigAlias('bmod', 'depth', 'dep', 'dr'); +addConfigAlias('bmod', 'depthabs', 'da'); +addConfigAlias('bmod', 'dc'); Pattern.prototype.modulate = function (type, config, idx) { if (config == null || typeof config !== 'object') { return this; } - if (!['lfo', 'env', 'omod'].includes(type)) { - logger(`[core] Modulation type ${type} not found. Please use one of 'lfo', 'env', 'omod'`); + if (!['lfo', 'env', 'bmod'].includes(type)) { + logger(`[core] Modulation type ${type} not found. Please use one of 'lfo', 'env', 'bmod'`); return this; } let output = this; @@ -3828,13 +3828,15 @@ Pattern.prototype.env = function (config, idx) { export const env = (config) => pure({}).env(config); /** - * Modulates with the output from a given `orbit` - * Can be called in sequence like pat.obus(...).obus(...) to set up multiple modulators + * Modulates with the output from a given `bus`. + * Can be called in sequence like pat.bmod(...).bmod(...) to set up multiple modulators * - * @name omod + * Send to an audio bus with `otherPat.bus(..)`. + * + * @name bmod * @memberof Pattern - * @param {Object} config Orbit bus configuration. - * @param {string | Pattern} [config.orbit] Orbit to get modulation signal from + * @param {Object} config Bus modulation configuration. + * @param {string | Pattern} [config.bus] Bus to get modulation signal from * @param {string | Pattern} [config.target] Node (and parameter if specified like `lpf.frequency`) to modulate. Aliases: t * @param {number | Pattern} [config.depth] Relative modulation depth. Aliases: dep, dr * @param {number | Pattern} [config.depthabs] Absolute modulation depth. Aliases: da @@ -3842,7 +3844,7 @@ export const env = (config) => pure({}).env(config); * @param {number | Pattern} [config.dc] DC offset prior to application * @returns Pattern */ -Pattern.prototype.omod = function (config, idx) { - return this.modulate('omod', config, idx); +Pattern.prototype.bmod = function (config, idx) { + return this.modulate('bmod', config, idx); }; -export const omod = (config) => pure({}).omod(config); +export const bmod = (config) => pure({}).bmod(config); diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index f32a17168..32d7f0d63 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -163,6 +163,7 @@ let defaultDefaultValues = { distortvol: 1, distorttype: 0, delay: 0, + busgain: 1, byteBeatExpression: '0', delayfeedback: 0.5, delaysync: 3 / 16, @@ -521,10 +522,10 @@ function connectEnvelope(idx, params, nodeTracker, value) { return envNode; } -function connectOrbitModulator(params, nodeTracker, value) { +function connectBusModulator(params, nodeTracker, value) { const ac = getAudioContext(); const { target, depth = 1, depthabs } = params; - const signal = controller.getOrbit(params.orbit).output; + const signal = controller.getBus(params.bus).output; const dc = new ConstantSourceNode(ac, { offset: params.dc ?? 0 }); dc.start(params.begin); const shifted = dc.connect(gainNode(1)); @@ -628,6 +629,8 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) delaysync = getDefaultValue('delaysync'), delaytime, orbit = getDefaultValue('orbit'), + bus, + busgain = getDefaultValue('busgain'), room, roomfade, roomlp, @@ -666,6 +669,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) delay = applyGainCurve(delay); velocity = applyGainCurve(velocity); tremolodepth = applyGainCurve(tremolodepth); + busgain = applyGainCurve(busgain); gain *= velocity; // velocity currently only multiplies with gain. it might do other things in the future const end = t + hapDuration; @@ -970,6 +974,11 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) const reverbSend = orbitBus.sendReverb(post, room); audioNodes.push(reverbSend); } + if (bus != null) { + const busNode = audioController.getBus(bus); + const busSend = effectSend(post, busNode, busgain); + audioNodes.push(busSend); + } if (djf != null) { nodes['djf'] = orbitBus.getDjf(djf, t); @@ -1027,9 +1036,9 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) audioNodes.push(env); } } - if (value.omod) { - for (const p of value.omod) { - const { toCleanup } = connectOrbitModulator({ ...p, begin: t, end: endWithRelease }, nodes, value); + if (value.bmod) { + for (const p of value.bmod) { + const { toCleanup } = connectBusModulator({ ...p, begin: t, end: endWithRelease }, nodes, value); audioNodes.push(...toCleanup); } } diff --git a/packages/superdough/superdoughdata.mjs b/packages/superdough/superdoughdata.mjs index 1f3235e59..8284876e9 100644 --- a/packages/superdough/superdoughdata.mjs +++ b/packages/superdough/superdoughdata.mjs @@ -72,6 +72,8 @@ const CONTROL_DATA = { // roomfade: { param: 'room.fade', min: 0, max: 1 }, roomlp: { param: 'room.lp', min: 20, max: 24000 }, djf: { param: 'djf.value', min: 0, max: 1 }, + busgain: { param: 'bus.gain', default: 1, min: 0, max: 10 }, + bgain: { param: 'bus.gain', default: 1, min: 0, max: 10 }, // SYNTHS detune: { param: 'source.detune', min: 0, max: 1 }, diff --git a/packages/superdough/superdoughoutput.mjs b/packages/superdough/superdoughoutput.mjs index d8ead7d06..204eb62a4 100644 --- a/packages/superdough/superdoughoutput.mjs +++ b/packages/superdough/superdoughoutput.mjs @@ -2,7 +2,10 @@ import { effectSend, getWorklet, webAudioTimeout } from './helpers.mjs'; import { errorLogger } from './logger.mjs'; import { clamp } from './util.mjs'; -let hasChanged = (now, before) => now !== undefined && now !== before; +const hasChanged = (now, before) => now !== undefined && now !== before; +// Node with fixed stereo channel count to prevent clicking when the input signal +// switches from mono to stereo +const getStereoNode = (ac) => new GainNode(ac, { gain: 1, channelCount: 2, channelCountMode: 'explicit' }); export class Orbit { reverbNode; @@ -11,10 +14,11 @@ export class Orbit { summingNode; djfNode; audioContext; + constructor(audioContext) { this.audioContext = audioContext; - this.output = new GainNode(audioContext, { gain: 1, channelCount: 2, channelCountMode: 'explicit' }); - this.summingNode = new GainNode(audioContext, { gain: 1, channelCount: 2, channelCountMode: 'explicit' }); + this.output = getStereoNode(audioContext); + this.summingNode = getStereoNode(audioContext); this.summingNode.connect(this.output); } @@ -164,6 +168,7 @@ export class SuperdoughAudioController { audioContext; output; nodes = {}; + buses = {}; constructor(audioContext) { this.audioContext = audioContext; @@ -171,10 +176,14 @@ export class SuperdoughAudioController { } reset() { - Array.from(this.nodes).forEach((node) => { + Object.values(this.nodes).forEach((node) => { node.disconnect(); }); + Object.values(this.buses).forEach((bus) => { + bus.disconnect(); + }); this.nodes = {}; + this.buses = {}; this.output.reset(); } @@ -206,4 +215,11 @@ export class SuperdoughAudioController { } return this.nodes[orbitNum]; } + + getBus(busNum) { + if (this.buses[busNum] == null) { + this.buses[busNum] = getStereoNode(this.audioContext); + } + return this.buses[busNum]; + } } diff --git a/packages/superdough/synth.mjs b/packages/superdough/synth.mjs index cffbdc0ca..3686e13d1 100644 --- a/packages/superdough/synth.mjs +++ b/packages/superdough/synth.mjs @@ -1,5 +1,5 @@ import { clamp } from './util.mjs'; -import { registerSound, soundMap } from './superdough.mjs'; +import { getSuperdoughAudioController, registerSound, soundMap } from './superdough.mjs'; import { getAudioContext } from './audioContext.mjs'; import { applyFM, @@ -367,6 +367,41 @@ export function registerSynthSounds() { { prebake: true, type: 'synth' }, ); + registerSound( + 'bus', + (begin, value, onended) => { + const ac = getAudioContext(); + const [attack, decay, sustain, release] = getADSRValues( + [value.attack, value.decay, value.sustain, value.release], + 'linear', + [0.001, 0.05, 0.6, 0.01], + ); + const holdend = begin + value.duration; + const end = holdend + release + 0.01; + const bus = getSuperdoughAudioController().getBus(value.n ?? 0); + const envGain = bus.connect(gainNode(1)); + getParamADSR(envGain.gain, attack, decay, sustain, release, 0, 1, begin, holdend, 'linear'); + const timeoutNode = webAudioTimeout( + ac, + () => { + bus.disconnect(envGain); + onended(); + }, + begin, + end, + ); + + return { + node: envGain, + source: bus, + stop: (time) => { + timeoutNode.stop(time); + }, + }; + }, + { prebake: true, type: 'input' }, + ); + [...noises].forEach((s) => { registerSound( s, From 3a17aeabf3227e87d7a9126d7d886043a0ea56c7 Mon Sep 17 00:00:00 2001 From: Aria Date: Thu, 11 Dec 2025 11:41:40 -0600 Subject: [PATCH 258/312] Some cleanup --- packages/core/controls.mjs | 9 --------- packages/superdough/worklets.mjs | 6 ++---- 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 6483880b1..808babe69 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -2530,15 +2530,6 @@ export const { clip, legato } = registerControl('clip', 'legato'); */ export const { duration, dur } = registerControl('duration', 'dur'); -/** - * Sets the ID of the pattern for later reference - * - * @name id - * @param {number | Pattern} id ID of the pattern - * - */ -export const { id } = registerControl('id'); - // ZZFX export const { zrand } = registerControl('zrand'); export const { curve } = registerControl('curve'); diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index bb33a24ff..6e850b28d 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -160,10 +160,8 @@ class LFOProcessor extends AudioWorkletProcessor { const dcoffset = parameters['dcoffset'][0]; - const userMin = parameters['min'][0]; - const userMax = parameters['max'][0]; - const min = Math.min(userMin, userMax); - const max = Math.max(userMin, userMax); + const min = parameters['min'][0]; + const max = parameters['max'][0]; const shape = waveShapeNames[parameters['shape'][0]]; const blockSize = output[0].length ?? 0; From 45aa1f5384263fbf52e2be20bbca1a13203de977 Mon Sep 17 00:00:00 2001 From: Aria Date: Thu, 11 Dec 2025 12:52:40 -0600 Subject: [PATCH 259/312] Control cleanup --- packages/superdough/superdoughdata.mjs | 28 +++++++++++++++++--------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/packages/superdough/superdoughdata.mjs b/packages/superdough/superdoughdata.mjs index 8284876e9..fe9bfe46d 100644 --- a/packages/superdough/superdoughdata.mjs +++ b/packages/superdough/superdoughdata.mjs @@ -30,15 +30,26 @@ const CONTROL_DATA = { // HPF hcutoff: { param: 'hpf.frequency', min: 20, max: 24000 }, hresonance: { param: 'hpf.Q', min: 0.1, max: 30 }, + hprate: { param: 'hpf_lfo.rate', min: 0, max: 40 }, + hpsync: { param: 'hpf_lfo.sync', min: 0, max: 8 }, + hpdepth: { param: 'hpf_lfo.depth', min: 20, max: 24000 }, + hpdepthfrequency: { param: 'hpf_lfo.depth', min: 20, max: 24000 }, + hpshape: { param: 'hpf_lfo.shape', min: 0, max: 4 }, + hpdc: { param: 'hpf_lfo.dcoffset', min: -1, max: 1 }, + hpskew: { param: 'hpf_lfo.skew', min: 0, max: 1 }, // BPF bandf: { param: 'bpf.frequency', min: 20, max: 24000 }, bandq: { param: 'bpf.Q', min: 0.1, max: 30 }, + bprate: { param: 'bpf_lfo.rate', min: 0, max: 40 }, + bpsync: { param: 'bpf_lfo.sync', min: 0, max: 8 }, + bpdepth: { param: 'bpf_lfo.depth', min: 20, max: 24000 }, + bpdepthfrequency: { param: 'bpf_lfo.depth', min: 20, max: 24000 }, + bpshape: { param: 'bpf_lfo.shape', min: 0, max: 4 }, + bpdc: { param: 'bpf_lfo.dcoffset', min: -1, max: 1 }, + bpskew: { param: 'bpf_lfo.skew', min: 0, max: 1 }, - // FILTERS - // fanchor: { param: ['lpf.anchor', 'hpf.anchor', 'bpf.anchor'], min: 0, max: 1 }, - // drive: { param: ['lpf.drive', 'hpf.drive', 'bpf.drive'], min: 0, max: 2 }, - // vowel: { param: 'vowel.frequency', min: 200, max: 4000 }, + vowel: { param: 'vowel.frequency', min: 200, max: 4000 }, // DISTORTION coarse: { param: 'coarse.coarse', min: 1, max: 64 }, @@ -47,7 +58,6 @@ const CONTROL_DATA = { shapevol: { param: 'shape.postgain', default: 1, min: 0, max: 1 }, distort: { param: 'distort.distort', min: 0, max: 5 }, distortvol: { param: 'distort.postgain', default: 1, min: 0, max: 1 }, - // distorttype: { param: 'distort.algorithm', default: 0, min: 0, max: 4 }, // COMPRESSOR compressor: { param: 'compressor.threshold', default: -3, min: -100, max: 0 }, @@ -63,17 +73,15 @@ const CONTROL_DATA = { phasercenter: { param: 'phaser.frequency', min: 20, max: 24000 }, // ORBIT EFFECTS - // delay: { param: 'delay.delayTime', default: 0, min: 0, max: 4 }, delaytime: { param: 'delay.delayTime', min: 0, max: 4 }, - // delayfeedback: { param: 'delay.feedback', default: 0.5, min: 0, max: 0.98 }, - // delaysync: { param: 'delay.sync', default: 3 / 16, min: 0, max: 2 }, + delayfeedback: { param: 'delay.feedback', default: 0.5, min: 0, max: 0.98 }, + delaysync: { param: 'delay.sync', default: 3 / 16, min: 0, max: 2 }, dry: { param: 'dry.gain', min: 0, max: 1 }, room: { param: 'room.wet', min: 0, max: 1 }, - // roomfade: { param: 'room.fade', min: 0, max: 1 }, + roomfade: { param: 'room.fade', min: 0, max: 1 }, roomlp: { param: 'room.lp', min: 20, max: 24000 }, djf: { param: 'djf.value', min: 0, max: 1 }, busgain: { param: 'bus.gain', default: 1, min: 0, max: 10 }, - bgain: { param: 'bus.gain', default: 1, min: 0, max: 10 }, // SYNTHS detune: { param: 'source.detune', min: 0, max: 1 }, From e7d1613bfb4978adb498d9ccff87475c584698f5 Mon Sep 17 00:00:00 2001 From: Aria Date: Thu, 11 Dec 2025 14:42:16 -0600 Subject: [PATCH 260/312] Broken tests, but otherwise working --- packages/core/pattern.mjs | 21 ++-- packages/superdough/superdough.mjs | 113 +++++++------------ packages/superdough/superdoughdata.mjs | 144 +++++++++++++------------ packages/superdough/synth.mjs | 2 +- 4 files changed, 128 insertions(+), 152 deletions(-) diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index b0420a2e6..7d0e46138 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -26,6 +26,7 @@ import { } from './util.mjs'; import drawLine from './drawLine.mjs'; import { errorLogger, logger } from './logger.mjs'; +import { getControlName } from './controls.mjs'; let stringParser; @@ -3753,28 +3754,34 @@ Pattern.prototype.modulate = function (type, config, idx) { if (config == null || typeof config !== 'object') { return this; } - if (!['lfo', 'env', 'bmod'].includes(type)) { + const modulatorKeys = ['lfo', 'env', 'bmod']; + if (!modulatorKeys.includes(type)) { logger(`[core] Modulation type ${type} not found. Please use one of 'lfo', 'env', 'bmod'`); return this; } let output = this; - let target = config.target; + let defaultValue = {}; + let defaultSet = 'target' in config; for (const [rawKey, value] of Object.entries(config)) { const key = resolveConfigKey(type, rawKey); - if (key === 'target') continue; // we will set/default it below const valuePat = reify(value); output = output .fmap((v) => (c) => { - if (target == null) { + if (!defaultSet) { // default target to the control set just before this in the chain // e.g. pat.gain(0.5).lfo({..}) will be a gain-LFO - target = Object.keys(v).at(-1); + let control = getControlName(Object.keys(v).at(-1)); + if (modulatorKeys.includes(control)) { + control = `${control}${v[type].length - 1}`; + } + defaultValue = { target: control }; + defaultSet = true; } v[type] ??= []; const t = v[type]; idx ??= t.length; - t[idx] ??= { target }; // set target - t[idx][key] = c; + t[idx] ??= defaultValue; + t[idx][key] = key === 'target' ? getControlName(c) : c; return v; }) .appLeft(valuePat); diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 32d7f0d63..7cbc58b98 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -25,7 +25,7 @@ import { errorLogger, logger } from './logger.mjs'; import { loadBuffer } from './sampler.mjs'; import { getAudioContext } from './audioContext.mjs'; import { SuperdoughAudioController } from './superdoughoutput.mjs'; -import { getSuperdoughControlData } from './superdoughdata.mjs'; +import { getSuperdoughControlTargets } from './superdoughdata.mjs'; export const DEFAULT_MAX_POLYPHONY = 128; const DEFAULT_AUDIO_DEVICE_NAME = 'System Standard'; @@ -396,97 +396,60 @@ function _getNodeParams(node) { return Array.from(params); } -const targetToParamGuess = { - source: 'detune', - lpf: 'frequency', - bpf: 'frequency', - hpf: 'frequency', - distort: 'distort', - gain: 'gain', - vowel: 'frequency', - coarse: 'coarse', - crush: 'crush', - shape: 'shape', - compressor: 'threshold', - pan: 'pan', - phaser: 'rate', - post: 'gain', - delay: 'delayTime', - djf: 'value', - lfo: 'frequency', - env: 'depth', - send: 'depth', -}; - -const controlData = getSuperdoughControlData(); - -// TODO: We would like to use the aliases in `controls` here, but cannot as -// the modules are independent. We may want to inject that method here in situations -// where superdough/core are run in tandem -export let getControlName; -const _getMainName = (control) => getControlName?.(control) ?? control; +const controlTargets = getSuperdoughControlTargets(); +const _stripIndex = (control) => control?.replace(/\d+$/, ''); function _getControlData(control) { - return controlData[_getMainName(control)]; + return controlTargets[_stripIndex(control)]; } -function _getControlValue(control, value, data) { - const main = _getMainName(control); - return Number(value[main] ?? data.default); -} - -function _getControlClamp(data, currentValue) { - const { min, max } = data; - return { min: min - currentValue, max: max - currentValue }; -} - -function _getTargetParams(nodes, target) { - let param; - if (target.includes('.')) { - const split = target.split('.'); - target = split[0]; - param = split[1]; - } else { - const targetWithoutIndex = target.replace(/(\d+)$/, ''); - param = targetToParamGuess[targetWithoutIndex]; +function _getRangeForParam(paramName, targetParams, currentValue) { + if (paramName === 'frequency') { + const liveValue = targetParams?.[0]?.value ?? currentValue ?? 0; + return { min: 20 - liveValue, max: 24000 - liveValue }; } - const targetNodes = nodes[target]; + return { min: undefined, max: undefined }; +} + +function _getTargetParamsForControl(control, nodes, paramOverride) { + const targetInfo = _getControlData(control); + if (!targetInfo) { + errorLogger(`Could not find control data for target '${control}'`, 'superdough'); + return { targetParams: [], paramName: control }; + } + const paramName = paramOverride ?? targetInfo.param; + const nodeKey = nodes[control] ? control : targetInfo.node; + const targetNodes = nodes[nodeKey]; if (!targetNodes) { const keys = Object.keys(nodes); errorLogger( - `Could not connect to target '${target}' — it does not exist. Available targets: ${keys.join(', ')}`, + `Could not connect to target '${nodeKey}' — it does not exist. Available targets: ${keys.join(', ')}`, 'superdough', ); - return []; + return { targetParams: [], paramName }; } const audioParams = []; targetNodes.forEach((targetNode) => { - const targetParam = _getNodeParam(targetNode, param); + const targetParam = _getNodeParam(targetNode, paramName); if (!targetParam) { const available = _getNodeParams(targetNode); errorLogger( - `Could not connect to parameter '${param}' on '${target}'. Available parameters: ${available.join(', ')}`, + `Could not connect to parameter '${paramName}' on '${nodeKey}'. Available parameters: ${available.join(', ')}`, 'superdough', ); return; } audioParams.push(targetParam); }); - return audioParams; -} - -function _getTargetParamsForControl(control, nodes) { - const main = _getMainName(control); - const data = _getControlData(main); - const targetParams = _getTargetParams(nodes, data.param); - return { targetParams, data }; + return { targetParams: audioParams, paramName }; } function connectLFO(idx, params, nodeTracker, value) { - const { rate = 1, sync, cps, cycle, target, depth = 1, depthabs, ...filteredParams } = params; - const { targetParams, data } = _getTargetParamsForControl(target, nodeTracker); - const currentValue = _getControlValue(target, value, data); - const { min, max } = _getControlClamp(data, currentValue); + const { rate = 1, sync, cps, cycle, target = 'lfo', depth = 1, depthabs, param, p, ...filteredParams } = params; + const targetParam = param ?? p; + const { targetParams, paramName } = _getTargetParamsForControl(target, nodeTracker, targetParam); + const currentValue = targetParams[0].value; + const { min, max } = _getRangeForParam(paramName, targetParams, currentValue); const depthValue = depthabs != null ? depthabs : depth * currentValue; const modParams = { ...filteredParams, @@ -504,9 +467,9 @@ function connectLFO(idx, params, nodeTracker, value) { function connectEnvelope(idx, params, nodeTracker, value) { const { target, acurve, dcurve, rcurve, depth = 1, depthabs, ...filteredParams } = params; - const { targetParams, data } = _getTargetParamsForControl(target, nodeTracker); - const currentValue = _getControlValue(target, value, data); - const { min, max } = _getControlClamp(data, currentValue); + const { targetParams, paramName } = _getTargetParamsForControl(target, nodeTracker); + const currentValue = targetParams[0].value; + const { min, max } = _getRangeForParam(paramName, targetParams, currentValue); const depthValue = depthabs != null ? depthabs : depth * currentValue; const envNode = getEnvelope(getAudioContext(), { ...filteredParams, @@ -525,17 +488,17 @@ function connectEnvelope(idx, params, nodeTracker, value) { function connectBusModulator(params, nodeTracker, value) { const ac = getAudioContext(); const { target, depth = 1, depthabs } = params; - const signal = controller.getBus(params.bus).output; + const signal = controller.getBus(params.bus); const dc = new ConstantSourceNode(ac, { offset: params.dc ?? 0 }); dc.start(params.begin); const shifted = dc.connect(gainNode(1)); signal.connect(shifted); - const { targetParams, data } = _getTargetParamsForControl(target, nodeTracker); - const currentValue = _getControlValue(target, value, data); - const { min, max } = _getControlClamp(data, currentValue); + const { targetParams, paramName } = _getTargetParamsForControl(target, nodeTracker); + const currentValue = targetParams[0].value; + const { min, max } = _getRangeForParam(paramName, targetParams, currentValue); const depthValue = depthabs != null ? depthabs : depth * currentValue; const maxAbsDepth = Math.min(Math.abs(min), Math.abs(max)); - const boundedDepth = Math.min(Math.abs(depthValue), maxAbsDepth); + const boundedDepth = Math.min(Math.abs(depthValue), maxAbsDepth) || Math.abs(depthValue); const modulator = shifted.connect(gainNode((Math.sign(depthValue) * boundedDepth) / 0.3)); webAudioTimeout( ac, diff --git a/packages/superdough/superdoughdata.mjs b/packages/superdough/superdoughdata.mjs index fe9bfe46d..cc161b0ee 100644 --- a/packages/superdough/superdoughdata.mjs +++ b/packages/superdough/superdoughdata.mjs @@ -4,92 +4,98 @@ Copyright (C) 2025 Strudel contributors - see . */ -const CONTROL_DATA = { - stretch: { param: 'stretch.pitchFactor', default: 1, min: -4, max: 100 }, - gain: { param: 'gain.gain', default: 0.8, min: 0, max: 10 }, - postgain: { param: 'post.gain', default: 1, min: 0, max: 10 }, - pan: { param: 'pan.pan', min: 0, max: 1 }, - tremolo: { param: 'tremolo.rate', min: 0, max: 40 }, - tremolosync: { param: 'tremolo.sync', min: 0, max: 8 }, - tremolodepth: { param: 'tremolo_gain.gain', default: 1, min: 0, max: 10 }, - tremoloskew: { param: 'tremolo.skew', min: 0, max: 1 }, - tremolophase: { param: 'tremolo.phase', default: 0, min: 0, max: 1 }, - tremoloshape: { param: 'tremolo.shape', min: 0, max: 4 }, +const CONTROL_TARGETS = { + stretch: { node: 'stretch', param: 'pitchFactor' }, + gain: { node: 'gain', param: 'gain' }, + postgain: { node: 'post', param: 'gain' }, + pan: { node: 'pan', param: 'pan' }, + tremolo: { node: 'tremolo', param: 'rate' }, + tremolosync: { node: 'tremolo', param: 'sync' }, + tremolodepth: { node: 'tremolo_gain', param: 'gain' }, + tremoloskew: { node: 'tremolo', param: 'skew' }, + tremolophase: { node: 'tremolo', param: 'phase' }, + tremoloshape: { node: 'tremolo', param: 'shape' }, + + // MODULATORS + lfo: { node: 'lfo', param: 'frequency' }, + env: { node: 'env', param: 'depth' }, + bmod: { node: 'bmod', param: 'depth' }, // LPF - cutoff: { param: 'lpf.frequency', min: 20, max: 24000 }, - resonance: { param: 'lpf.Q', min: 0.1, max: 30 }, - lprate: { param: 'lpf_lfo.rate', min: 0, max: 40 }, - lpsync: { param: 'lpf_lfo.sync', min: 0, max: 8 }, - lpdepth: { param: 'lpf_lfo.depth', min: 20, max: 24000 }, - lpdepthfrequency: { param: 'lpf_lfo.depth', min: 20, max: 24000 }, - lpshape: { param: 'lpf_lfo.shape', min: 0, max: 4 }, - lpdc: { param: 'lpf_lfo.dcoffset', min: -1, max: 1 }, - lpskew: { param: 'lpf_lfo.skew', min: 0, max: 1 }, + cutoff: { node: 'lpf', param: 'frequency' }, + resonance: { node: 'lpf', param: 'Q' }, + lprate: { node: 'lpf_lfo', param: 'rate' }, + lpsync: { node: 'lpf_lfo', param: 'sync' }, + lpdepth: { node: 'lpf_lfo', param: 'depth' }, + lpdepthfrequency: { node: 'lpf_lfo', param: 'depth' }, + lpshape: { node: 'lpf_lfo', param: 'shape' }, + lpdc: { node: 'lpf_lfo', param: 'dcoffset' }, + lpskew: { node: 'lpf_lfo', param: 'skew' }, // HPF - hcutoff: { param: 'hpf.frequency', min: 20, max: 24000 }, - hresonance: { param: 'hpf.Q', min: 0.1, max: 30 }, - hprate: { param: 'hpf_lfo.rate', min: 0, max: 40 }, - hpsync: { param: 'hpf_lfo.sync', min: 0, max: 8 }, - hpdepth: { param: 'hpf_lfo.depth', min: 20, max: 24000 }, - hpdepthfrequency: { param: 'hpf_lfo.depth', min: 20, max: 24000 }, - hpshape: { param: 'hpf_lfo.shape', min: 0, max: 4 }, - hpdc: { param: 'hpf_lfo.dcoffset', min: -1, max: 1 }, - hpskew: { param: 'hpf_lfo.skew', min: 0, max: 1 }, + hcutoff: { node: 'hpf', param: 'frequency' }, + hresonance: { node: 'hpf', param: 'Q' }, + hprate: { node: 'hpf_lfo', param: 'rate' }, + hpsync: { node: 'hpf_lfo', param: 'sync' }, + hpdepth: { node: 'hpf_lfo', param: 'depth' }, + hpdepthfrequency: { node: 'hpf_lfo', param: 'depth' }, + hpshape: { node: 'hpf_lfo', param: 'shape' }, + hpdc: { node: 'hpf_lfo', param: 'dcoffset' }, + hpskew: { node: 'hpf_lfo', param: 'skew' }, // BPF - bandf: { param: 'bpf.frequency', min: 20, max: 24000 }, - bandq: { param: 'bpf.Q', min: 0.1, max: 30 }, - bprate: { param: 'bpf_lfo.rate', min: 0, max: 40 }, - bpsync: { param: 'bpf_lfo.sync', min: 0, max: 8 }, - bpdepth: { param: 'bpf_lfo.depth', min: 20, max: 24000 }, - bpdepthfrequency: { param: 'bpf_lfo.depth', min: 20, max: 24000 }, - bpshape: { param: 'bpf_lfo.shape', min: 0, max: 4 }, - bpdc: { param: 'bpf_lfo.dcoffset', min: -1, max: 1 }, - bpskew: { param: 'bpf_lfo.skew', min: 0, max: 1 }, + bandf: { node: 'bpf', param: 'frequency' }, + bandq: { node: 'bpf', param: 'Q' }, + bprate: { node: 'bpf_lfo', param: 'rate' }, + bpsync: { node: 'bpf_lfo', param: 'sync' }, + bpdepth: { node: 'bpf_lfo', param: 'depth' }, + bpdepthfrequency: { node: 'bpf_lfo', param: 'depth' }, + bpshape: { node: 'bpf_lfo', param: 'shape' }, + bpdc: { node: 'bpf_lfo', param: 'dcoffset' }, + bpskew: { node: 'bpf_lfo', param: 'skew' }, - vowel: { param: 'vowel.frequency', min: 200, max: 4000 }, + vowel: { node: 'vowel', param: 'frequency' }, // DISTORTION - coarse: { param: 'coarse.coarse', min: 1, max: 64 }, - crush: { param: 'crush.crush', min: 1, max: 16 }, - shape: { param: 'shape.shape', min: -1, max: 0.999 }, - shapevol: { param: 'shape.postgain', default: 1, min: 0, max: 1 }, - distort: { param: 'distort.distort', min: 0, max: 5 }, - distortvol: { param: 'distort.postgain', default: 1, min: 0, max: 1 }, + coarse: { node: 'coarse', param: 'coarse' }, + crush: { node: 'crush', param: 'crush' }, + shape: { node: 'shape', param: 'shape' }, + shapevol: { node: 'shape', param: 'postgain' }, + distort: { node: 'distort', param: 'distort' }, + distortvol: { node: 'distort', param: 'postgain' }, // COMPRESSOR - compressor: { param: 'compressor.threshold', default: -3, min: -100, max: 0 }, - compressorRatio: { param: 'compressor.ratio', default: 10, min: 1, max: 20 }, - compressorKnee: { param: 'compressor.knee', default: 10, min: 0, max: 40 }, - compressorAttack: { param: 'compressor.attack', default: 0.005, min: 0, max: 1 }, - compressorRelease: { param: 'compressor.release', default: 0.05, min: 0, max: 2 }, + compressor: { node: 'compressor', param: 'threshold' }, + compressorRatio: { node: 'compressor', param: 'ratio' }, + compressorKnee: { node: 'compressor', param: 'knee' }, + compressorAttack: { node: 'compressor', param: 'attack' }, + compressorRelease: { node: 'compressor', param: 'release' }, // PHASER - phaserrate: { param: 'phaser.rate', min: 0, max: 40 }, - phaserdepth: { param: 'phaser.depth', default: 0.75, min: 0, max: 1 }, - phasersweep: { param: 'phaser.sweep', min: 0, max: 5000 }, - phasercenter: { param: 'phaser.frequency', min: 20, max: 24000 }, + phaserrate: { node: 'phaser', param: 'rate' }, + phaserdepth: { node: 'phaser', param: 'depth' }, + phasersweep: { node: 'phaser', param: 'sweep' }, + phasercenter: { node: 'phaser', param: 'frequency' }, // ORBIT EFFECTS - delaytime: { param: 'delay.delayTime', min: 0, max: 4 }, - delayfeedback: { param: 'delay.feedback', default: 0.5, min: 0, max: 0.98 }, - delaysync: { param: 'delay.sync', default: 3 / 16, min: 0, max: 2 }, - dry: { param: 'dry.gain', min: 0, max: 1 }, - room: { param: 'room.wet', min: 0, max: 1 }, - roomfade: { param: 'room.fade', min: 0, max: 1 }, - roomlp: { param: 'room.lp', min: 20, max: 24000 }, - djf: { param: 'djf.value', min: 0, max: 1 }, - busgain: { param: 'bus.gain', default: 1, min: 0, max: 10 }, + delaytime: { node: 'delay', param: 'delayTime' }, + delayfeedback: { node: 'delay', param: 'feedback' }, + delaysync: { node: 'delay', param: 'sync' }, + dry: { node: 'dry', param: 'gain' }, + room: { node: 'room', param: 'wet' }, + roomfade: { node: 'room', param: 'fade' }, + roomlp: { node: 'room', param: 'lp' }, + djf: { node: 'djf', param: 'value' }, + busgain: { node: 'bus', param: 'gain' }, // SYNTHS - detune: { param: 'source.detune', min: 0, max: 1 }, - wt: { param: 'source.position', min: 0, max: 1 }, - warp: { param: 'source.warp', min: 0, max: 1 }, - freq: { param: 'source.frequency', min: 20, max: 24000 }, + s: { node: 'source', param: 'frequency' }, + detune: { node: 'source', param: 'detune' }, + wt: { node: 'source', param: 'position' }, + warp: { node: 'source', param: 'warp' }, + freq: { node: 'source', param: 'frequency' }, }; -export function getSuperdoughControlData() { - return CONTROL_DATA; +export function getSuperdoughControlTargets() { + return CONTROL_TARGETS; } diff --git a/packages/superdough/synth.mjs b/packages/superdough/synth.mjs index 3686e13d1..35c0bd041 100644 --- a/packages/superdough/synth.mjs +++ b/packages/superdough/synth.mjs @@ -374,7 +374,7 @@ export function registerSynthSounds() { const [attack, decay, sustain, release] = getADSRValues( [value.attack, value.decay, value.sustain, value.release], 'linear', - [0.001, 0.05, 0.6, 0.01], + [0.001, 0.05, 1, 0.01], ); const holdend = begin + value.duration; const end = holdend + release + 0.01; From 4169b764c3ce68fc638d945dc918cd77ae36d6a6 Mon Sep 17 00:00:00 2001 From: Aria Date: Thu, 11 Dec 2025 15:28:48 -0600 Subject: [PATCH 261/312] Simpler control handling --- packages/core/pattern.mjs | 31 +++++++++++++++++++----------- packages/superdough/superdough.mjs | 22 ++++++++++----------- 2 files changed, 31 insertions(+), 22 deletions(-) diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index 7d0e46138..04328ccf7 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -3724,8 +3724,8 @@ const resolveConfigKey = (funcName, key) => { return aliasMap.get(normalized) ?? key; }; -addConfigAlias('lfo', 'target', 't'); -addConfigAlias('lfo', 'param', 'p'); +addConfigAlias('lfo', 'control', 'c'); +addConfigAlias('lfo', 'subControl', 'sc'); addConfigAlias('lfo', 'rate', 'r'); addConfigAlias('lfo', 'depth', 'dep', 'dr'); addConfigAlias('lfo', 'depthabs', 'da'); @@ -3734,7 +3734,8 @@ addConfigAlias('lfo', 'shape', 'sh'); addConfigAlias('lfo', 'skew', 'sk'); addConfigAlias('lfo', 'curve', 'c'); addConfigAlias('lfo', 'sync', 's'); -addConfigAlias('env', 'target', 't'); +addConfigAlias('env', 'control', 'c'); +addConfigAlias('env', 'subControl', 'sc'); addConfigAlias('env', 'attack', 'att', 'a'); addConfigAlias('env', 'decay', 'dec', 'd'); addConfigAlias('env', 'sustain', 'sus', 's'); @@ -3745,7 +3746,8 @@ addConfigAlias('env', 'acurve', 'ac'); addConfigAlias('env', 'dcurve', 'dc'); addConfigAlias('env', 'rcurve', 'rc'); addConfigAlias('bmod', 'orbit', 'o'); -addConfigAlias('bmod', 'target', 't'); +addConfigAlias('bmod', 'control', 'c'); +addConfigAlias('bmod', 'subControl', 'sc'); addConfigAlias('bmod', 'depth', 'dep', 'dr'); addConfigAlias('bmod', 'depthabs', 'da'); addConfigAlias('bmod', 'dc'); @@ -3761,27 +3763,31 @@ Pattern.prototype.modulate = function (type, config, idx) { } let output = this; let defaultValue = {}; - let defaultSet = 'target' in config; + let defaultSet = 'control' in config; for (const [rawKey, value] of Object.entries(config)) { const key = resolveConfigKey(type, rawKey); const valuePat = reify(value); output = output .fmap((v) => (c) => { if (!defaultSet) { - // default target to the control set just before this in the chain + // default control to the control set just before this in the chain // e.g. pat.gain(0.5).lfo({..}) will be a gain-LFO let control = getControlName(Object.keys(v).at(-1)); if (modulatorKeys.includes(control)) { control = `${control}${v[type].length - 1}`; } - defaultValue = { target: control }; + defaultValue = { control }; defaultSet = true; } v[type] ??= []; const t = v[type]; idx ??= t.length; t[idx] ??= defaultValue; - t[idx][key] = key === 'target' ? getControlName(c) : c; + if (key === 'control' || key === 'subControl') { + t[idx][key] = getControlName(c); + } else { + t[idx][key] = c; + } return v; }) .appLeft(valuePat); @@ -3795,7 +3801,8 @@ Pattern.prototype.modulate = function (type, config, idx) { * @name lfo * @memberof Pattern * @param {Object} config LFO configuration. - * @param {string | Pattern} [config.target] Node (and parameter if specified like `lpf.frequency`) to modulate. Aliases: t + * @param {string | Pattern} [config.control] Node to modulate. Aliases: t + * @param {string | Pattern} [config.subControl] Sub-control name to append to the control key. Aliases: sc, p * @param {number | Pattern} [config.rate] Modulation rate. Aliases: rate, r * @param {number | Pattern} [config.depth] Relative modulation depth. Aliases: dep, dr * @param {number | Pattern} [config.depthabs] Absolute modulation depth. Aliases: da @@ -3817,7 +3824,8 @@ export const lfo = (config) => pure({}).lfo(config); * @name env * @memberof Pattern * @param {Object} config Envelope configuration. - * @param {string | Pattern} [config.target] Node (and parameter if specified like `lpf.frequency`) to modulate. Aliases: t + * @param {string | Pattern} [config.control] Node to modulate. Aliases: t + * @param {string | Pattern} [config.subControl] Sub-control name to append to the control key. Aliases: sc, p * @param {number | Pattern} [config.depth] Relative modulation depth. Aliases: dep, dr * @param {number | Pattern} [config.depthabs] Absolute modulation depth. Aliases: da * @param {number | Pattern} [config.attack] Time to reach depth. Aliases: att, a @@ -3844,7 +3852,8 @@ export const env = (config) => pure({}).env(config); * @memberof Pattern * @param {Object} config Bus modulation configuration. * @param {string | Pattern} [config.bus] Bus to get modulation signal from - * @param {string | Pattern} [config.target] Node (and parameter if specified like `lpf.frequency`) to modulate. Aliases: t + * @param {string | Pattern} [config.control] Node to modulate. Aliases: t + * @param {string | Pattern} [config.subControl] Sub-control name to append to the control key. Aliases: sc, p * @param {number | Pattern} [config.depth] Relative modulation depth. Aliases: dep, dr * @param {number | Pattern} [config.depthabs] Absolute modulation depth. Aliases: da * @param {number | Pattern} [config.ratio] Modulation ratio. Aliases: rat diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 7cbc58b98..9efc5b3ef 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -411,14 +411,15 @@ function _getRangeForParam(paramName, targetParams, currentValue) { return { min: undefined, max: undefined }; } -function _getTargetParamsForControl(control, nodes, paramOverride) { - const targetInfo = _getControlData(control); +function _getTargetParamsForControl(control, nodes, subControl) { + const lookupKey = subControl ? `${control}_${subControl}` : control; + const targetInfo = _getControlData(lookupKey) ?? _getControlData(control); if (!targetInfo) { errorLogger(`Could not find control data for target '${control}'`, 'superdough'); return { targetParams: [], paramName: control }; } - const paramName = paramOverride ?? targetInfo.param; - const nodeKey = nodes[control] ? control : targetInfo.node; + const paramName = targetInfo.param; + const nodeKey = nodes[targetInfo.node] ? targetInfo.node : control; const targetNodes = nodes[nodeKey]; if (!targetNodes) { const keys = Object.keys(nodes); @@ -445,9 +446,8 @@ function _getTargetParamsForControl(control, nodes, paramOverride) { } function connectLFO(idx, params, nodeTracker, value) { - const { rate = 1, sync, cps, cycle, target = 'lfo', depth = 1, depthabs, param, p, ...filteredParams } = params; - const targetParam = param ?? p; - const { targetParams, paramName } = _getTargetParamsForControl(target, nodeTracker, targetParam); + const { rate = 1, sync, cps, cycle, control = 'lfo', subControl, depth = 1, depthabs, ...filteredParams } = params; + const { targetParams, paramName } = _getTargetParamsForControl(control, nodeTracker, subControl); const currentValue = targetParams[0].value; const { min, max } = _getRangeForParam(paramName, targetParams, currentValue); const depthValue = depthabs != null ? depthabs : depth * currentValue; @@ -466,8 +466,8 @@ function connectLFO(idx, params, nodeTracker, value) { } function connectEnvelope(idx, params, nodeTracker, value) { - const { target, acurve, dcurve, rcurve, depth = 1, depthabs, ...filteredParams } = params; - const { targetParams, paramName } = _getTargetParamsForControl(target, nodeTracker); + const { control, subControl, acurve, dcurve, rcurve, depth = 1, depthabs, ...filteredParams } = params; + const { targetParams, paramName } = _getTargetParamsForControl(control, nodeTracker, subControl); const currentValue = targetParams[0].value; const { min, max } = _getRangeForParam(paramName, targetParams, currentValue); const depthValue = depthabs != null ? depthabs : depth * currentValue; @@ -487,13 +487,13 @@ function connectEnvelope(idx, params, nodeTracker, value) { function connectBusModulator(params, nodeTracker, value) { const ac = getAudioContext(); - const { target, depth = 1, depthabs } = params; + const { control, subControl, depth = 1, depthabs } = params; const signal = controller.getBus(params.bus); const dc = new ConstantSourceNode(ac, { offset: params.dc ?? 0 }); dc.start(params.begin); const shifted = dc.connect(gainNode(1)); signal.connect(shifted); - const { targetParams, paramName } = _getTargetParamsForControl(target, nodeTracker); + const { targetParams, paramName } = _getTargetParamsForControl(control, nodeTracker, subControl); const currentValue = targetParams[0].value; const { min, max } = _getRangeForParam(paramName, targetParams, currentValue); const depthValue = depthabs != null ? depthabs : depth * currentValue; From 415b6d5f1d41399ca208ded08ce23212662dabc7 Mon Sep 17 00:00:00 2001 From: Aria Date: Thu, 11 Dec 2025 15:48:45 -0600 Subject: [PATCH 262/312] Fix name collision and move modulators into controls to avoid circular import test failure --- packages/core/controls.mjs | 162 ++++++++++++++++++++++++++++++++++++- packages/core/pattern.mjs | 160 ------------------------------------ 2 files changed, 161 insertions(+), 161 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 808babe69..c4ae8b8de 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -4,7 +4,8 @@ Copyright (C) 2022 Strudel contributors - see . */ -import { Pattern, register, reify } from './pattern.mjs'; +import { logger } from './logger.mjs'; +import { Pattern, pure, register, reify } from './pattern.mjs'; export function createParam(names) { let isMulti = Array.isArray(names); @@ -2808,3 +2809,162 @@ export const scrub = register( }, false, ); + +const configAliases = new Map(); +const addConfigAlias = (funcName, canonical, ...aliases) => { + const lowerFunc = String(funcName).toLowerCase(); + const aliasMap = configAliases.get(lowerFunc) ?? new Map(); + const allKeys = new Set([canonical, ...aliases]); + for (const alias of allKeys) { + aliasMap.set(String(alias).toLowerCase(), canonical); + } + configAliases.set(lowerFunc, aliasMap); +}; + +const resolveConfigKey = (funcName, key) => { + const aliasMap = configAliases.get(String(funcName).toLowerCase()); + if (!aliasMap) return key; + const normalized = String(key).toLowerCase(); + return aliasMap.get(normalized) ?? key; +}; + +addConfigAlias('lfo', 'control', 'c'); +addConfigAlias('lfo', 'subControl', 'sc'); +addConfigAlias('lfo', 'rate', 'r'); +addConfigAlias('lfo', 'depth', 'dep', 'dr'); +addConfigAlias('lfo', 'depthabs', 'da'); +addConfigAlias('lfo', 'dcoffset', 'dc'); +addConfigAlias('lfo', 'shape', 'sh'); +addConfigAlias('lfo', 'skew', 'sk'); +addConfigAlias('lfo', 'curve'); +addConfigAlias('lfo', 'sync', 's'); +addConfigAlias('env', 'control', 'c'); +addConfigAlias('env', 'subControl', 'sc'); +addConfigAlias('env', 'attack', 'att', 'a'); +addConfigAlias('env', 'decay', 'dec', 'd'); +addConfigAlias('env', 'sustain', 'sus', 's'); +addConfigAlias('env', 'release', 'rel', 'r'); +addConfigAlias('env', 'depth', 'dep', 'dr'); +addConfigAlias('env', 'depthabs', 'da'); +addConfigAlias('env', 'acurve', 'ac'); +addConfigAlias('env', 'dcurve', 'dc'); +addConfigAlias('env', 'rcurve', 'rc'); +addConfigAlias('bmod', 'orbit', 'o'); +addConfigAlias('bmod', 'control', 'c'); +addConfigAlias('bmod', 'subControl', 'sc'); +addConfigAlias('bmod', 'depth', 'dep', 'dr'); +addConfigAlias('bmod', 'depthabs', 'da'); +addConfigAlias('bmod', 'dc'); + +Pattern.prototype.modulate = function (type, config, idx) { + if (config == null || typeof config !== 'object') { + return this; + } + const modulatorKeys = ['lfo', 'env', 'bmod']; + if (!modulatorKeys.includes(type)) { + logger(`[core] Modulation type ${type} not found. Please use one of 'lfo', 'env', 'bmod'`); + return this; + } + let output = this; + let defaultValue = {}; + let defaultSet = 'control' in config; + for (const [rawKey, value] of Object.entries(config)) { + const key = resolveConfigKey(type, rawKey); + const valuePat = reify(value); + output = output + .fmap((v) => (c) => { + if (!defaultSet) { + // default control to the control set just before this in the chain + // e.g. pat.gain(0.5).lfo({..}) will be a gain-LFO + let control = getControlName(Object.keys(v).at(-1)); + if (modulatorKeys.includes(control)) { + control = `${control}${v[control].length - 1}`; + } + defaultValue = { control }; + defaultSet = true; + } + v[type] ??= []; + const t = v[type]; + idx ??= t.length; + t[idx] ??= defaultValue; + if (key === 'control' || key === 'subControl') { + t[idx][key] = getControlName(c); + } else { + t[idx][key] = c; + } + return v; + }) + .appLeft(valuePat); + } + return output; +}; + +/** + * Configures an LFO. Can be called in sequence like pat.lfo(...).lfo(...) to set up multiple LFOs + * + * @name lfo + * @memberof Pattern + * @param {Object} config LFO configuration. + * @param {string | Pattern} [config.control] Node to modulate. Aliases: t + * @param {string | Pattern} [config.subControl] Sub-control name to append to the control key. Aliases: sc, p + * @param {number | Pattern} [config.rate] Modulation rate. Aliases: rate, r + * @param {number | Pattern} [config.depth] Relative modulation depth. Aliases: dep, dr + * @param {number | Pattern} [config.depthabs] Absolute modulation depth. Aliases: da + * @param {number | Pattern} [config.dcoffset] DC offset / bias for the waveform. Aliases: dc + * @param {number | Pattern} [config.shape] Waveform shape index. Aliases: sh + * @param {number | Pattern} [config.skew] Waveform skew amount. Aliases: sk + * @param {number | Pattern} [config.curve] Exponential curve amount. Aliases: c + * @param {number | Pattern} [config.sync] Tempo-synced modulation rate. Aliases: s + * @returns Pattern + */ +Pattern.prototype.lfo = function (config, idx) { + return this.modulate('lfo', config, idx); +}; +export const lfo = (config) => pure({}).lfo(config); + +/** + * Configures an envelope. Can be called in sequence like pat.env(...).env(...) to set up multiple envelopes + * + * @name env + * @memberof Pattern + * @param {Object} config Envelope configuration. + * @param {string | Pattern} [config.control] Node to modulate. Aliases: t + * @param {string | Pattern} [config.subControl] Sub-control name to append to the control key. Aliases: sc, p + * @param {number | Pattern} [config.depth] Relative modulation depth. Aliases: dep, dr + * @param {number | Pattern} [config.depthabs] Absolute modulation depth. Aliases: da + * @param {number | Pattern} [config.attack] Time to reach depth. Aliases: att, a + * @param {number | Pattern} [config.decay] Time to reach sustain. Aliases: dec, d + * @param {number | Pattern} [config.sustain] Sustain depth. Aliases: sus, s + * @param {number | Pattern} [config.release] Time to return to nominal value. Aliases: rel, r + * @param {number | Pattern} [config.acurve] Snappiness of attack curve (-1 = relaxed, 1 = snappy). Aliases: ac + * @param {number | Pattern} [config.dcurve] Snappiness of decay curve (-1 = relaxed, 1 = snappy). Aliases: dc + * @param {number | Pattern} [config.rcurve] Snappiness of release curve (-1 = relaxed, 1 = snappy). Aliases: rc + * @returns Pattern + */ +Pattern.prototype.env = function (config, idx) { + return this.modulate('env', config, idx); +}; +export const env = (config) => pure({}).env(config); + +/** + * Modulates with the output from a given `bus`. + * Can be called in sequence like pat.bmod(...).bmod(...) to set up multiple modulators + * + * Send to an audio bus with `otherPat.bus(..)`. + * + * @name bmod + * @memberof Pattern + * @param {Object} config Bus modulation configuration. + * @param {string | Pattern} [config.bus] Bus to get modulation signal from + * @param {string | Pattern} [config.control] Node to modulate. Aliases: t + * @param {string | Pattern} [config.subControl] Sub-control name to append to the control key. Aliases: sc, p + * @param {number | Pattern} [config.depth] Relative modulation depth. Aliases: dep, dr + * @param {number | Pattern} [config.depthabs] Absolute modulation depth. Aliases: da + * @param {number | Pattern} [config.ratio] Modulation ratio. Aliases: rat + * @param {number | Pattern} [config.dc] DC offset prior to application + * @returns Pattern + */ +Pattern.prototype.bmod = function (config, idx) { + return this.modulate('bmod', config, idx); +}; +export const bmod = (config) => pure({}).bmod(config); diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index 04328ccf7..c2e5ca1bc 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -26,7 +26,6 @@ import { } from './util.mjs'; import drawLine from './drawLine.mjs'; import { errorLogger, logger } from './logger.mjs'; -import { getControlName } from './controls.mjs'; let stringParser; @@ -3705,162 +3704,3 @@ Pattern.prototype.phases = function (list) { export const phases = (list) => { return _ensureListPattern(list).as('phases'); }; - -const configAliases = new Map(); -const addConfigAlias = (funcName, canonical, ...aliases) => { - const lowerFunc = String(funcName).toLowerCase(); - const aliasMap = configAliases.get(lowerFunc) ?? new Map(); - const allKeys = new Set([canonical, ...aliases]); - for (const alias of allKeys) { - aliasMap.set(String(alias).toLowerCase(), canonical); - } - configAliases.set(lowerFunc, aliasMap); -}; - -const resolveConfigKey = (funcName, key) => { - const aliasMap = configAliases.get(String(funcName).toLowerCase()); - if (!aliasMap) return key; - const normalized = String(key).toLowerCase(); - return aliasMap.get(normalized) ?? key; -}; - -addConfigAlias('lfo', 'control', 'c'); -addConfigAlias('lfo', 'subControl', 'sc'); -addConfigAlias('lfo', 'rate', 'r'); -addConfigAlias('lfo', 'depth', 'dep', 'dr'); -addConfigAlias('lfo', 'depthabs', 'da'); -addConfigAlias('lfo', 'dcoffset', 'dc'); -addConfigAlias('lfo', 'shape', 'sh'); -addConfigAlias('lfo', 'skew', 'sk'); -addConfigAlias('lfo', 'curve', 'c'); -addConfigAlias('lfo', 'sync', 's'); -addConfigAlias('env', 'control', 'c'); -addConfigAlias('env', 'subControl', 'sc'); -addConfigAlias('env', 'attack', 'att', 'a'); -addConfigAlias('env', 'decay', 'dec', 'd'); -addConfigAlias('env', 'sustain', 'sus', 's'); -addConfigAlias('env', 'release', 'rel', 'r'); -addConfigAlias('env', 'depth', 'dep', 'dr'); -addConfigAlias('env', 'depthabs', 'da'); -addConfigAlias('env', 'acurve', 'ac'); -addConfigAlias('env', 'dcurve', 'dc'); -addConfigAlias('env', 'rcurve', 'rc'); -addConfigAlias('bmod', 'orbit', 'o'); -addConfigAlias('bmod', 'control', 'c'); -addConfigAlias('bmod', 'subControl', 'sc'); -addConfigAlias('bmod', 'depth', 'dep', 'dr'); -addConfigAlias('bmod', 'depthabs', 'da'); -addConfigAlias('bmod', 'dc'); - -Pattern.prototype.modulate = function (type, config, idx) { - if (config == null || typeof config !== 'object') { - return this; - } - const modulatorKeys = ['lfo', 'env', 'bmod']; - if (!modulatorKeys.includes(type)) { - logger(`[core] Modulation type ${type} not found. Please use one of 'lfo', 'env', 'bmod'`); - return this; - } - let output = this; - let defaultValue = {}; - let defaultSet = 'control' in config; - for (const [rawKey, value] of Object.entries(config)) { - const key = resolveConfigKey(type, rawKey); - const valuePat = reify(value); - output = output - .fmap((v) => (c) => { - if (!defaultSet) { - // default control to the control set just before this in the chain - // e.g. pat.gain(0.5).lfo({..}) will be a gain-LFO - let control = getControlName(Object.keys(v).at(-1)); - if (modulatorKeys.includes(control)) { - control = `${control}${v[type].length - 1}`; - } - defaultValue = { control }; - defaultSet = true; - } - v[type] ??= []; - const t = v[type]; - idx ??= t.length; - t[idx] ??= defaultValue; - if (key === 'control' || key === 'subControl') { - t[idx][key] = getControlName(c); - } else { - t[idx][key] = c; - } - return v; - }) - .appLeft(valuePat); - } - return output; -}; - -/** - * Configures an LFO. Can be called in sequence like pat.lfo(...).lfo(...) to set up multiple LFOs - * - * @name lfo - * @memberof Pattern - * @param {Object} config LFO configuration. - * @param {string | Pattern} [config.control] Node to modulate. Aliases: t - * @param {string | Pattern} [config.subControl] Sub-control name to append to the control key. Aliases: sc, p - * @param {number | Pattern} [config.rate] Modulation rate. Aliases: rate, r - * @param {number | Pattern} [config.depth] Relative modulation depth. Aliases: dep, dr - * @param {number | Pattern} [config.depthabs] Absolute modulation depth. Aliases: da - * @param {number | Pattern} [config.dcoffset] DC offset / bias for the waveform. Aliases: dc - * @param {number | Pattern} [config.shape] Waveform shape index. Aliases: sh - * @param {number | Pattern} [config.skew] Waveform skew amount. Aliases: sk - * @param {number | Pattern} [config.curve] Exponential curve amount. Aliases: c - * @param {number | Pattern} [config.sync] Tempo-synced modulation rate. Aliases: s - * @returns Pattern - */ -Pattern.prototype.lfo = function (config, idx) { - return this.modulate('lfo', config, idx); -}; -export const lfo = (config) => pure({}).lfo(config); - -/** - * Configures an envelope. Can be called in sequence like pat.env(...).env(...) to set up multiple envelopes - * - * @name env - * @memberof Pattern - * @param {Object} config Envelope configuration. - * @param {string | Pattern} [config.control] Node to modulate. Aliases: t - * @param {string | Pattern} [config.subControl] Sub-control name to append to the control key. Aliases: sc, p - * @param {number | Pattern} [config.depth] Relative modulation depth. Aliases: dep, dr - * @param {number | Pattern} [config.depthabs] Absolute modulation depth. Aliases: da - * @param {number | Pattern} [config.attack] Time to reach depth. Aliases: att, a - * @param {number | Pattern} [config.decay] Time to reach sustain. Aliases: dec, d - * @param {number | Pattern} [config.sustain] Sustain depth. Aliases: sus, s - * @param {number | Pattern} [config.release] Time to return to nominal value. Aliases: rel, r - * @param {number | Pattern} [config.acurve] Snappiness of attack curve (-1 = relaxed, 1 = snappy). Aliases: ac - * @param {number | Pattern} [config.dcurve] Snappiness of decay curve (-1 = relaxed, 1 = snappy). Aliases: dc - * @param {number | Pattern} [config.rcurve] Snappiness of release curve (-1 = relaxed, 1 = snappy). Aliases: rc - * @returns Pattern - */ -Pattern.prototype.env = function (config, idx) { - return this.modulate('env', config, idx); -}; -export const env = (config) => pure({}).env(config); - -/** - * Modulates with the output from a given `bus`. - * Can be called in sequence like pat.bmod(...).bmod(...) to set up multiple modulators - * - * Send to an audio bus with `otherPat.bus(..)`. - * - * @name bmod - * @memberof Pattern - * @param {Object} config Bus modulation configuration. - * @param {string | Pattern} [config.bus] Bus to get modulation signal from - * @param {string | Pattern} [config.control] Node to modulate. Aliases: t - * @param {string | Pattern} [config.subControl] Sub-control name to append to the control key. Aliases: sc, p - * @param {number | Pattern} [config.depth] Relative modulation depth. Aliases: dep, dr - * @param {number | Pattern} [config.depthabs] Absolute modulation depth. Aliases: da - * @param {number | Pattern} [config.ratio] Modulation ratio. Aliases: rat - * @param {number | Pattern} [config.dc] DC offset prior to application - * @returns Pattern - */ -Pattern.prototype.bmod = function (config, idx) { - return this.modulate('bmod', config, idx); -}; -export const bmod = (config) => pure({}).bmod(config); From c6e0f0533e927a878339a9828c32d21ac9115a7c Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 11 Dec 2025 23:32:10 +0000 Subject: [PATCH 263/312] 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 264/312] 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 265/312] 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 266/312] 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 267/312] 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 268/312] 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 8baecf78b9d62cb7fabee425d1f709fc6b5a5a8b Mon Sep 17 00:00:00 2001 From: Aria Date: Sat, 13 Dec 2025 11:37:37 -0600 Subject: [PATCH 269/312] Add note --- packages/superdough/superdoughdata.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/superdough/superdoughdata.mjs b/packages/superdough/superdoughdata.mjs index cc161b0ee..a273021d0 100644 --- a/packages/superdough/superdoughdata.mjs +++ b/packages/superdough/superdoughdata.mjs @@ -94,6 +94,7 @@ const CONTROL_TARGETS = { wt: { node: 'source', param: 'position' }, warp: { node: 'source', param: 'warp' }, freq: { node: 'source', param: 'frequency' }, + note: { node: 'source', param: 'frequency' }, }; export function getSuperdoughControlTargets() { From dc5f6827f9a72f7f760f8e29d4c2b6948c463647 Mon Sep 17 00:00:00 2001 From: Aria Date: Sat, 13 Dec 2025 14:50:27 -0600 Subject: [PATCH 270/312] Change names, cleanup --- packages/core/controls.mjs | 80 +++++++++++++++++------------- packages/superdough/superdough.mjs | 2 +- 2 files changed, 47 insertions(+), 35 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index c4ae8b8de..9052d64c5 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -2810,51 +2810,63 @@ export const scrub = register( false, ); -const configAliases = new Map(); -const addConfigAlias = (funcName, canonical, ...aliases) => { +const subControlAliases = new Map(); +const registerSubControl = (funcName, main, ...aliases) => { const lowerFunc = String(funcName).toLowerCase(); - const aliasMap = configAliases.get(lowerFunc) ?? new Map(); - const allKeys = new Set([canonical, ...aliases]); + const aliasMap = subControlAliases.get(lowerFunc) ?? new Map(); + const allKeys = new Set([main, ...aliases]); for (const alias of allKeys) { - aliasMap.set(String(alias).toLowerCase(), canonical); + aliasMap.set(String(alias).toLowerCase(), main); + } + subControlAliases.set(lowerFunc, aliasMap); +}; + +const registerSubControls = (funcName, aliasGroups = []) => { + for (const [main, ...aliases] of aliasGroups) { + registerSubControl(funcName, main, ...aliases); } - configAliases.set(lowerFunc, aliasMap); }; const resolveConfigKey = (funcName, key) => { - const aliasMap = configAliases.get(String(funcName).toLowerCase()); + const aliasMap = subControlAliases.get(String(funcName).toLowerCase()); if (!aliasMap) return key; const normalized = String(key).toLowerCase(); return aliasMap.get(normalized) ?? key; }; -addConfigAlias('lfo', 'control', 'c'); -addConfigAlias('lfo', 'subControl', 'sc'); -addConfigAlias('lfo', 'rate', 'r'); -addConfigAlias('lfo', 'depth', 'dep', 'dr'); -addConfigAlias('lfo', 'depthabs', 'da'); -addConfigAlias('lfo', 'dcoffset', 'dc'); -addConfigAlias('lfo', 'shape', 'sh'); -addConfigAlias('lfo', 'skew', 'sk'); -addConfigAlias('lfo', 'curve'); -addConfigAlias('lfo', 'sync', 's'); -addConfigAlias('env', 'control', 'c'); -addConfigAlias('env', 'subControl', 'sc'); -addConfigAlias('env', 'attack', 'att', 'a'); -addConfigAlias('env', 'decay', 'dec', 'd'); -addConfigAlias('env', 'sustain', 'sus', 's'); -addConfigAlias('env', 'release', 'rel', 'r'); -addConfigAlias('env', 'depth', 'dep', 'dr'); -addConfigAlias('env', 'depthabs', 'da'); -addConfigAlias('env', 'acurve', 'ac'); -addConfigAlias('env', 'dcurve', 'dc'); -addConfigAlias('env', 'rcurve', 'rc'); -addConfigAlias('bmod', 'orbit', 'o'); -addConfigAlias('bmod', 'control', 'c'); -addConfigAlias('bmod', 'subControl', 'sc'); -addConfigAlias('bmod', 'depth', 'dep', 'dr'); -addConfigAlias('bmod', 'depthabs', 'da'); -addConfigAlias('bmod', 'dc'); +registerSubControls('lfo', [ + ['control', 'c'], + ['subControl', 'sc'], + ['rate', 'r'], + ['depth', 'dep', 'dr'], + ['depthabs', 'da'], + ['dcoffset', 'dc'], + ['shape', 'sh'], + ['skew', 'sk'], + ['curve'], + ['sync', 's'], +]); +registerSubControls('env', [ + ['control', 'c'], + ['subControl', 'sc'], + ['attack', 'att', 'a'], + ['decay', 'dec', 'd'], + ['sustain', 'sus', 's'], + ['release', 'rel', 'r'], + ['depth', 'dep', 'dr'], + ['depthabs', 'da'], + ['acurve', 'ac'], + ['dcurve', 'dc'], + ['rcurve', 'rc'], +]); +registerSubControls('bmod', [ + ['bus', 'b'], + ['control', 'c'], + ['subControl', 'sc'], + ['depth', 'dep', 'dr'], + ['depthabs', 'da'], + ['dc'], +]); Pattern.prototype.modulate = function (type, config, idx) { if (config == null || typeof config !== 'object') { diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 9efc5b3ef..86f54f13b 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -485,7 +485,7 @@ function connectEnvelope(idx, params, nodeTracker, value) { return envNode; } -function connectBusModulator(params, nodeTracker, value) { +function connectBusModulator(params, nodeTracker) { const ac = getAudioContext(); const { control, subControl, depth = 1, depthabs } = params; const signal = controller.getBus(params.bus); From ef2ee0969ade3aa331616c1b37e5daf069edcd33 Mon Sep 17 00:00:00 2001 From: Aria Date: Sat, 13 Dec 2025 14:59:14 -0600 Subject: [PATCH 271/312] Restore old lfo to avoid unifying right now --- packages/superdough/helpers.mjs | 24 +++++++++++++++++++++++- packages/superdough/superdough.mjs | 10 ++++------ 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 19064954b..3b704caea 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -109,7 +109,29 @@ export function getEnvelope(audioContext, properties = {}) { return getWorklet(audioContext, 'envelope-processor', properties); } -export function getLfo(audioContext, properties = {}) { +export function getLfo(audioContext, begin, end, properties = {}) { + const { shape = 0, ...props } = properties; + const { dcoffset = -0.5, depth = 1 } = properties; + const lfoprops = { + frequency: 1, + depth, + skew: 0.5, + phaseoffset: 0, + time: begin, + begin, + end, + shape: getModulationShapeInput(shape), + dcoffset, + min: dcoffset * depth, + max: dcoffset * depth + depth, + curve: 1, + ...props, + }; + + return getWorklet(audioContext, 'lfo-processor', lfoprops); +} + +export function getCustomLfo(audioContext, properties = {}) { // Extract some params we need for deriving other params const { shape = 0, ...props } = properties; const lfoprops = { diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 6fcc9cec7..04e383c4d 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -443,7 +443,7 @@ function _getTargetParamsForControl(control, nodes, subControl) { return { targetParams: audioParams, paramName }; } -function connectLFO(idx, params, nodeTracker, value) { +function connectLFO(idx, params, nodeTracker) { const { rate = 1, sync, cps, cycle, control = 'lfo', subControl, depth = 1, depthabs, ...filteredParams } = params; const { targetParams, paramName } = _getTargetParamsForControl(control, nodeTracker, subControl); const currentValue = targetParams[0].value; @@ -457,13 +457,13 @@ function connectLFO(idx, params, nodeTracker, value) { min, max, }; - const lfoNode = getLfo(getAudioContext(), modParams); + const lfoNode = getCustomLfo(getAudioContext(), modParams); nodeTracker[`lfo${idx}`] = [lfoNode]; targetParams.forEach((t) => lfoNode.connect(t)); return lfoNode; } -function connectEnvelope(idx, params, nodeTracker, value) { +function connectEnvelope(idx, params, nodeTracker) { const { control, subControl, acurve, dcurve, rcurve, depth = 1, depthabs, ...filteredParams } = params; const { targetParams, paramName } = _getTargetParamsForControl(control, nodeTracker, subControl); const currentValue = targetParams[0].value; @@ -997,7 +997,6 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) end: endWithRelease, }, nodes, - value, ); audioNodes.push(lfo); } @@ -1012,14 +1011,13 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) end: endWithRelease, }, nodes, - value, ); audioNodes.push(env); } } if (value.bmod) { for (const p of value.bmod) { - const { toCleanup } = connectBusModulator({ ...p, begin: t, end: endWithRelease }, nodes, value); + const { toCleanup } = connectBusModulator({ ...p, begin: t, end: endWithRelease }, nodes); audioNodes.push(...toCleanup); } } From 11e3da0552d34c230dcb0682392afe55cf928c84 Mon Sep 17 00:00:00 2001 From: Aria Date: Sat, 13 Dec 2025 15:08:48 -0600 Subject: [PATCH 272/312] Parity with other LFO (sync and dcoffset) --- packages/superdough/helpers.mjs | 3 ++- packages/superdough/superdough.mjs | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 3b704caea..b13f40498 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -132,10 +132,11 @@ export function getLfo(audioContext, begin, end, properties = {}) { } export function getCustomLfo(audioContext, properties = {}) { - // Extract some params we need for deriving other params + // Default / process certain params const { shape = 0, ...props } = properties; const lfoprops = { shape: getModulationShapeInput(shape), + dcoffset: -0.5, ...props, }; return getWorklet(audioContext, 'lfo-processor', lfoprops); diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 04e383c4d..ba84d6910 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -451,7 +451,7 @@ function connectLFO(idx, params, nodeTracker) { const depthValue = depthabs != null ? depthabs : depth * currentValue; const modParams = { ...filteredParams, - frequency: sync !== undefined ? sync / cps : rate, + frequency: sync !== undefined ? sync * cps : rate, time: cycle / cps, depth: depthValue, min, From 4b08dd8447e24216ae1caa4a317362f7f0103867 Mon Sep 17 00:00:00 2001 From: Aria Date: Sat, 13 Dec 2025 15:20:51 -0600 Subject: [PATCH 273/312] Unify lfo functions --- packages/superdough/helpers.mjs | 53 ++++++++++++++++-------------- packages/superdough/superdough.mjs | 2 +- 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index b13f40498..7b9becdf2 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -109,36 +109,39 @@ export function getEnvelope(audioContext, properties = {}) { return getWorklet(audioContext, 'envelope-processor', properties); } -export function getLfo(audioContext, begin, end, properties = {}) { - const { shape = 0, ...props } = properties; - const { dcoffset = -0.5, depth = 1 } = properties; +export function getLfo(audioContext, properties = {}) { + const { + shape = 0, + begin = 0, + end = 0, + time, + depth = 1, + dcoffset = -0.5, + frequency = 1, + skew = 0.5, + phaseoffset = 0, + curve = 1, + min, + max, + ...props + } = properties; + const lfoprops = { - frequency: 1, - depth, - skew: 0.5, - phaseoffset: 0, - time: begin, begin, end, - shape: getModulationShapeInput(shape), + time: time ?? begin, + depth, dcoffset, - min: dcoffset * depth, - max: dcoffset * depth + depth, - curve: 1, - ...props, - }; - - return getWorklet(audioContext, 'lfo-processor', lfoprops); -} - -export function getCustomLfo(audioContext, properties = {}) { - // Default / process certain params - const { shape = 0, ...props } = properties; - const lfoprops = { + frequency, + skew, + phaseoffset, + curve, shape: getModulationShapeInput(shape), - dcoffset: -0.5, + min: min ?? dcoffset * depth, + max: max ?? dcoffset * depth + depth, ...props, }; + return getWorklet(audioContext, 'lfo-processor', lfoprops); } @@ -177,7 +180,9 @@ export function getParamLfo(audioContext, param, start, end, lfoValues) { } let lfo; if (depth) { - lfo = getLfo(audioContext, start, end, { + lfo = getLfo(audioContext, { + begin: start, + end, depth, dcoffset, ...getLfoInputs, diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index ba84d6910..5ea04f89c 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -457,7 +457,7 @@ function connectLFO(idx, params, nodeTracker) { min, max, }; - const lfoNode = getCustomLfo(getAudioContext(), modParams); + const lfoNode = getLfo(getAudioContext(), modParams); nodeTracker[`lfo${idx}`] = [lfoNode]; targetParams.forEach((t) => lfoNode.connect(t)); return lfoNode; From bae5571df0547d1901a3b035b02d13ff7f86e9b3 Mon Sep 17 00:00:00 2001 From: Aria Date: Sat, 13 Dec 2025 15:32:27 -0600 Subject: [PATCH 274/312] Cleanup --- packages/core/controls.mjs | 28 ++++++++++++-------------- packages/superdough/superdoughdata.mjs | 1 + 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index d8fdd51dd..0cb78f05e 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -2814,27 +2814,25 @@ export const scrub = register( ); const subControlAliases = new Map(); -const registerSubControl = (funcName, main, ...aliases) => { - const lowerFunc = String(funcName).toLowerCase(); - const aliasMap = subControlAliases.get(lowerFunc) ?? new Map(); - const allKeys = new Set([main, ...aliases]); +const registerSubControl = (control, subControl, ...aliases) => { + const aliasMap = subControlAliases.get(control) ?? new Map(); + const allKeys = new Set([subControl, ...aliases]); for (const alias of allKeys) { - aliasMap.set(String(alias).toLowerCase(), main); + aliasMap.set(String(alias).toLowerCase(), subControl); } - subControlAliases.set(lowerFunc, aliasMap); + subControlAliases.set(control, aliasMap); }; -const registerSubControls = (funcName, aliasGroups = []) => { - for (const [main, ...aliases] of aliasGroups) { - registerSubControl(funcName, main, ...aliases); +const registerSubControls = (control, subControlAliases = []) => { + for (const [subControl, ...aliases] of subControlAliases) { + registerSubControl(control, subControl, ...aliases); } }; -const resolveConfigKey = (funcName, key) => { - const aliasMap = subControlAliases.get(String(funcName).toLowerCase()); - if (!aliasMap) return key; - const normalized = String(key).toLowerCase(); - return aliasMap.get(normalized) ?? key; +const getMainSubcontrolName = (control, subKey) => { + const aliasMap = subControlAliases.get(control); + if (!aliasMap) return subKey; + return aliasMap.get(String(subKey).toLowerCase()) ?? subKey; }; registerSubControls('lfo', [ @@ -2884,7 +2882,7 @@ Pattern.prototype.modulate = function (type, config, idx) { let defaultValue = {}; let defaultSet = 'control' in config; for (const [rawKey, value] of Object.entries(config)) { - const key = resolveConfigKey(type, rawKey); + const key = getMainSubcontrolName(type, rawKey); const valuePat = reify(value); output = output .fmap((v) => (c) => { diff --git a/packages/superdough/superdoughdata.mjs b/packages/superdough/superdoughdata.mjs index a273021d0..d3b3d40b5 100644 --- a/packages/superdough/superdoughdata.mjs +++ b/packages/superdough/superdoughdata.mjs @@ -4,6 +4,7 @@ Copyright (C) 2025 Strudel contributors - see . */ +// Mapping from control name to webaudio node and parameter const CONTROL_TARGETS = { stretch: { node: 'stretch', param: 'pitchFactor' }, gain: { node: 'gain', param: 'gain' }, From 29f7f5c1f83d00d680fa2916178cc21e3de43b47 Mon Sep 17 00:00:00 2001 From: Aria Date: Sat, 13 Dec 2025 16:06:28 -0600 Subject: [PATCH 275/312] Allow lfos to modulate other lfos without clamping --- packages/superdough/superdough.mjs | 15 ++++++++------- packages/superdough/superdoughdata.mjs | 10 ++++++++++ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 5ea04f89c..977812646 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -401,10 +401,11 @@ function _getControlData(control) { return controlTargets[_stripIndex(control)]; } -function _getRangeForParam(paramName, targetParams, currentValue) { - if (paramName === 'frequency') { - const liveValue = targetParams?.[0]?.value ?? currentValue ?? 0; - return { min: 20 - liveValue, max: 24000 - liveValue }; +function _getRangeForParam(paramName, currentValue, control) { + // For our normal oscillators / filters we want to clamp the frequency to a reasonable range + // For LFOs we allow it to be modulated freely + if (paramName === 'frequency' || control?.startsWith?.('lfo')) { + return { min: 20 - currentValue, max: 24000 - currentValue }; } return { min: undefined, max: undefined }; } @@ -447,7 +448,7 @@ function connectLFO(idx, params, nodeTracker) { const { rate = 1, sync, cps, cycle, control = 'lfo', subControl, depth = 1, depthabs, ...filteredParams } = params; const { targetParams, paramName } = _getTargetParamsForControl(control, nodeTracker, subControl); const currentValue = targetParams[0].value; - const { min, max } = _getRangeForParam(paramName, targetParams, currentValue); + const { min, max } = _getRangeForParam(paramName, currentValue, control); const depthValue = depthabs != null ? depthabs : depth * currentValue; const modParams = { ...filteredParams, @@ -467,7 +468,7 @@ function connectEnvelope(idx, params, nodeTracker) { const { control, subControl, acurve, dcurve, rcurve, depth = 1, depthabs, ...filteredParams } = params; const { targetParams, paramName } = _getTargetParamsForControl(control, nodeTracker, subControl); const currentValue = targetParams[0].value; - const { min, max } = _getRangeForParam(paramName, targetParams, currentValue); + const { min, max } = _getRangeForParam(paramName, currentValue, control); const depthValue = depthabs != null ? depthabs : depth * currentValue; const envNode = getEnvelope(getAudioContext(), { ...filteredParams, @@ -493,7 +494,7 @@ function connectBusModulator(params, nodeTracker) { signal.connect(shifted); const { targetParams, paramName } = _getTargetParamsForControl(control, nodeTracker, subControl); const currentValue = targetParams[0].value; - const { min, max } = _getRangeForParam(paramName, targetParams, currentValue); + const { min, max } = _getRangeForParam(paramName, currentValue, control); const depthValue = depthabs != null ? depthabs : depth * currentValue; const maxAbsDepth = Math.min(Math.abs(min), Math.abs(max)); const boundedDepth = Math.min(Math.abs(depthValue), maxAbsDepth) || Math.abs(depthValue); diff --git a/packages/superdough/superdoughdata.mjs b/packages/superdough/superdoughdata.mjs index d3b3d40b5..6b577889d 100644 --- a/packages/superdough/superdoughdata.mjs +++ b/packages/superdough/superdoughdata.mjs @@ -19,8 +19,18 @@ const CONTROL_TARGETS = { // MODULATORS lfo: { node: 'lfo', param: 'frequency' }, + lfo_rate: { node: 'lfo', param: 'frequency' }, + lfo_sync: { node: 'lfo', param: 'frequency' }, + lfo_depth: { node: 'lfo', param: 'depth' }, + lfo_depthabs: { node: 'lfo', param: 'depth' }, env: { node: 'env', param: 'depth' }, + env_attack: { node: 'env', param: 'attack' }, + env_decay: { node: 'env', param: 'decay' }, + env_sustain: { node: 'env', param: 'sustain' }, + env_release: { node: 'env', param: 'release' }, bmod: { node: 'bmod', param: 'depth' }, + bmod_depth: { node: 'bmod', param: 'depth' }, + bmod_depthabs: { node: 'bmod', param: 'depth' }, // LPF cutoff: { node: 'lpf', param: 'frequency' }, From dec037bed52f8ffa76bc36c57a14276b6981c137 Mon Sep 17 00:00:00 2001 From: Aria Date: Sat, 13 Dec 2025 16:23:47 -0600 Subject: [PATCH 276/312] Bus fix --- packages/superdough/superdoughdata.mjs | 1 + packages/superdough/synth.mjs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/superdough/superdoughdata.mjs b/packages/superdough/superdoughdata.mjs index 6b577889d..cab829752 100644 --- a/packages/superdough/superdoughdata.mjs +++ b/packages/superdough/superdoughdata.mjs @@ -74,6 +74,7 @@ const CONTROL_TARGETS = { shapevol: { node: 'shape', param: 'postgain' }, distort: { node: 'distort', param: 'distort' }, distortvol: { node: 'distort', param: 'postgain' }, + distorttype: { node: 'distort', param: 'distort' }, // COMPRESSOR compressor: { node: 'compressor', param: 'threshold' }, diff --git a/packages/superdough/synth.mjs b/packages/superdough/synth.mjs index 39868589e..40e62f86f 100644 --- a/packages/superdough/synth.mjs +++ b/packages/superdough/synth.mjs @@ -380,7 +380,7 @@ export function registerSynthSounds() { const holdend = begin + value.duration; const end = holdend + release + 0.01; const bus = getSuperdoughAudioController().getBus(value.n ?? 0); - const envGain = bus.connect(gainNode(1)); + const envGain = bus.connect(gainNode(0)); getParamADSR(envGain.gain, attack, decay, sustain, release, 0, 1, begin, holdend, 'linear'); const timeoutNode = webAudioTimeout( ac, From c598059dc77ee46eccf334467efc60adac2a3a60 Mon Sep 17 00:00:00 2001 From: Aria Date: Sat, 13 Dec 2025 16:26:50 -0600 Subject: [PATCH 277/312] Clean up old code --- packages/superdough/superdough.mjs | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 977812646..9312ccdae 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -381,19 +381,6 @@ function _getNodeParam(node, name) { return undefined; } -function _getNodeParams(node) { - const params = new Set(); - // Worklet case - if (node?.parameters) { - node.parameters.forEach((_v, k) => params.add(k)); - } - // Guesses based on common parameters - ['gain', 'frequency', 'detune', 'Q', 'pan', 'playbackRate', 'delayTime'].forEach((k) => { - if (node?.[k] instanceof AudioParam) params.add(k); - }); - return Array.from(params); -} - const controlTargets = getSuperdoughControlTargets(); const _stripIndex = (control) => control?.replace(/\d+$/, ''); @@ -431,14 +418,6 @@ function _getTargetParamsForControl(control, nodes, subControl) { const audioParams = []; targetNodes.forEach((targetNode) => { const targetParam = _getNodeParam(targetNode, paramName); - if (!targetParam) { - const available = _getNodeParams(targetNode); - errorLogger( - `Could not connect to parameter '${paramName}' on '${nodeKey}'. Available parameters: ${available.join(', ')}`, - 'superdough', - ); - return; - } audioParams.push(targetParam); }); return { targetParams: audioParams, paramName }; From 63de46ae96ecc8069285ad64f77489fb230547f8 Mon Sep 17 00:00:00 2001 From: Aria Date: Sat, 13 Dec 2025 16:44:36 -0600 Subject: [PATCH 278/312] Update docstrings --- packages/core/controls.mjs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 0cb78f05e..826174d8f 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -2924,8 +2924,8 @@ Pattern.prototype.modulate = function (type, config, idx) { * @param {number | Pattern} [config.depth] Relative modulation depth. Aliases: dep, dr * @param {number | Pattern} [config.depthabs] Absolute modulation depth. Aliases: da * @param {number | Pattern} [config.dcoffset] DC offset / bias for the waveform. Aliases: dc - * @param {number | Pattern} [config.shape] Waveform shape index. Aliases: sh - * @param {number | Pattern} [config.skew] Waveform skew amount. Aliases: sk + * @param {number | Pattern} [config.shape] Shape index. Aliases: sh + * @param {number | Pattern} [config.skew] Skew amount. Aliases: sk * @param {number | Pattern} [config.curve] Exponential curve amount. Aliases: c * @param {number | Pattern} [config.sync] Tempo-synced modulation rate. Aliases: s * @returns Pattern @@ -2973,7 +2973,6 @@ export const env = (config) => pure({}).env(config); * @param {string | Pattern} [config.subControl] Sub-control name to append to the control key. Aliases: sc, p * @param {number | Pattern} [config.depth] Relative modulation depth. Aliases: dep, dr * @param {number | Pattern} [config.depthabs] Absolute modulation depth. Aliases: da - * @param {number | Pattern} [config.ratio] Modulation ratio. Aliases: rat * @param {number | Pattern} [config.dc] DC offset prior to application * @returns Pattern */ From 18b3c66eb83948c0f1008ebddba75862b558f6cf Mon Sep 17 00:00:00 2001 From: Aria Date: Sat, 13 Dec 2025 17:15:06 -0600 Subject: [PATCH 279/312] Clean up error messages --- packages/superdough/superdough.mjs | 13 ++++++++----- packages/superdough/worklets.mjs | 16 +++++++++++----- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 9312ccdae..8f79e5b24 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -401,7 +401,7 @@ function _getTargetParamsForControl(control, nodes, subControl) { const lookupKey = subControl ? `${control}_${subControl}` : control; const targetInfo = _getControlData(lookupKey) ?? _getControlData(control); if (!targetInfo) { - errorLogger(`Could not find control data for target '${control}'`, 'superdough'); + errorLogger(new Error(`Could not find control data for target '${control}'`), 'superdough'); return { targetParams: [], paramName: control }; } const paramName = targetInfo.param; @@ -410,7 +410,7 @@ function _getTargetParamsForControl(control, nodes, subControl) { if (!targetNodes) { const keys = Object.keys(nodes); errorLogger( - `Could not connect to target '${nodeKey}' — it does not exist. Available targets: ${keys.join(', ')}`, + new Error(`Could not connect to target '${nodeKey}' — it does not exist. Available targets: ${keys.join(', ')}`), 'superdough', ); return { targetParams: [], paramName }; @@ -426,6 +426,7 @@ function _getTargetParamsForControl(control, nodes, subControl) { function connectLFO(idx, params, nodeTracker) { const { rate = 1, sync, cps, cycle, control = 'lfo', subControl, depth = 1, depthabs, ...filteredParams } = params; const { targetParams, paramName } = _getTargetParamsForControl(control, nodeTracker, subControl); + if (!targetParams.length) return; const currentValue = targetParams[0].value; const { min, max } = _getRangeForParam(paramName, currentValue, control); const depthValue = depthabs != null ? depthabs : depth * currentValue; @@ -446,6 +447,7 @@ function connectLFO(idx, params, nodeTracker) { function connectEnvelope(idx, params, nodeTracker) { const { control, subControl, acurve, dcurve, rcurve, depth = 1, depthabs, ...filteredParams } = params; const { targetParams, paramName } = _getTargetParamsForControl(control, nodeTracker, subControl); + if (!targetParams.length) return; const currentValue = targetParams[0].value; const { min, max } = _getRangeForParam(paramName, currentValue, control); const depthValue = depthabs != null ? depthabs : depth * currentValue; @@ -466,12 +468,13 @@ function connectEnvelope(idx, params, nodeTracker) { function connectBusModulator(params, nodeTracker) { const ac = getAudioContext(); const { control, subControl, depth = 1, depthabs } = params; + const { targetParams, paramName } = _getTargetParamsForControl(control, nodeTracker, subControl); + if (!targetParams.length) return { toCleanup: [] }; const signal = controller.getBus(params.bus); const dc = new ConstantSourceNode(ac, { offset: params.dc ?? 0 }); dc.start(params.begin); const shifted = dc.connect(gainNode(1)); signal.connect(shifted); - const { targetParams, paramName } = _getTargetParamsForControl(control, nodeTracker, subControl); const currentValue = targetParams[0].value; const { min, max } = _getRangeForParam(paramName, currentValue, control); const depthValue = depthabs != null ? depthabs : depth * currentValue; @@ -978,7 +981,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) }, nodes, ); - audioNodes.push(lfo); + lfo && audioNodes.push(lfo); } } if (value.env) { @@ -992,7 +995,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) }, nodes, ); - audioNodes.push(env); + env && audioNodes.push(env); } } if (value.bmod) { diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index 321c8b425..4523e9e89 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -1013,9 +1013,15 @@ class EnvelopeProcessor extends AudioWorkletProcessor { } process(_inputs, outputs, params) { + const begin = params['begin'][0]; + const end = params['end'][0]; + if (currentTime >= end) { + return false; + } + if (currentTime <= begin) { + return true; + } const out = outputs[0][0]; - if (!out) return true; - const begin = pv(params.begin, 0); const retrigger = pv(params.retrigger, 0) >= 0.5; // convert to bool if (begin !== this.beginTime && (this.state === 0 || retrigger)) { // triggered @@ -1034,8 +1040,8 @@ class EnvelopeProcessor extends AudioWorkletProcessor { const dCurve = pv(params.decayCurve, i); const rCurve = pv(params.releaseCurve, i); const depth = pv(params.depth, i); - const clampMin = pv(params.min, i); - const clampMax = pv(params.max, i); + const min = pv(params.min, i); + const max = pv(params.max, i); const states = [ { time: Number.POSITIVE_INFINITY, start: 0, target: 0 }, // idle { time: attack, start: this.attackStart, target: 1, curve: aCurve }, @@ -1049,7 +1055,7 @@ class EnvelopeProcessor extends AudioWorkletProcessor { this.state = (this.state + 1) % states.length; time = states[this.state].time; } - const clamped = clamp(this.val * depth, Math.min(clampMin, clampMax), Math.max(clampMin, clampMax)); + const clamped = clamp(this.val * depth, min, max); out[i] = clamped; } return true; From 4a7344595d8e72c14acb1ace5c629a1aa81e4a00 Mon Sep 17 00:00:00 2001 From: Aria Date: Sat, 13 Dec 2025 17:28:42 -0600 Subject: [PATCH 280/312] 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 281/312] 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 282/312] 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`, ); From 0de212c12f1ecb7a6905c9073b21907b88529245 Mon Sep 17 00:00:00 2001 From: Dsm0 Date: Thu, 18 Dec 2025 22:55:44 -0800 Subject: [PATCH 283/312] fix visual block mode --- packages/codemirror/keybindings.mjs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/codemirror/keybindings.mjs b/packages/codemirror/keybindings.mjs index 81dc87a52..d92e9c959 100644 --- a/packages/codemirror/keybindings.mjs +++ b/packages/codemirror/keybindings.mjs @@ -1,5 +1,5 @@ import { defaultKeymap } from '@codemirror/commands'; -import { Prec } from '@codemirror/state'; +import { Prec, EditorState } from '@codemirror/state'; import { keymap, ViewPlugin } from '@codemirror/view'; // import { searchKeymap } from '@codemirror/search'; import { emacs } from '@replit/codemirror-emacs'; @@ -133,5 +133,9 @@ const keymaps = { export function keybindings(name) { const active = keymaps[name]; - return [active ? Prec.high(active()) : []]; + const extensions = active ? [Prec.high(active())] : []; + if (name === 'vim') { + extensions.push(EditorState.allowMultipleSelections.of(true)); + } + return extensions; } From a9752fb2a45104f7101c1b9e3dd653a3dd5fab8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20Bj=C3=B6rk?= Date: Sat, 6 Dec 2025 19:54:33 +0100 Subject: [PATCH 284/312] Exposing Vim from codemirror-vim Docs for adding keybindings Only expose Vim from keybindings --- packages/codemirror/index.mjs | 1 + packages/codemirror/keybindings.mjs | 2 ++ website/src/pages/technical-manual/vim.mdx | 21 +++++++++++++++++++++ 3 files changed, 24 insertions(+) diff --git a/packages/codemirror/index.mjs b/packages/codemirror/index.mjs index 3a5f2a23c..2d5b3de21 100644 --- a/packages/codemirror/index.mjs +++ b/packages/codemirror/index.mjs @@ -4,3 +4,4 @@ export * from './flash.mjs'; export * from './slider.mjs'; export * from './themes.mjs'; export * from './widget.mjs'; +export { Vim } from './keybindings.mjs'; diff --git a/packages/codemirror/keybindings.mjs b/packages/codemirror/keybindings.mjs index d92e9c959..24437b7e1 100644 --- a/packages/codemirror/keybindings.mjs +++ b/packages/codemirror/keybindings.mjs @@ -131,6 +131,8 @@ const keymaps = { vscode: vscodeExtension, }; +export { Vim } from '@replit/codemirror-vim'; + export function keybindings(name) { const active = keymaps[name]; const extensions = active ? [Prec.high(active())] : []; diff --git a/website/src/pages/technical-manual/vim.mdx b/website/src/pages/technical-manual/vim.mdx index fa53aa550..6ec41d4a2 100644 --- a/website/src/pages/technical-manual/vim.mdx +++ b/website/src/pages/technical-manual/vim.mdx @@ -35,3 +35,24 @@ Troubleshooting - If :w logs but evaluation doesn't apply, ensure Vim keybindings are active and try again. You can also use Ctrl+Enter as a fallback. - For :q / gc, ensure focus is inside the editor. If an error occurs, reload the page to reset editor state and try again. + +## Adding custom keybindings + +To add custom keybindings the `Vim` object can be used (either from within a pattern or in a prebake script) + +Example: + +```javascript +// Map 'jk' to Escape in normal mode +Vim.map('jk', '', 'insert'); +// Map 'U' to :w (Evaluate the current code) +Vim.map('U', ':w', 'normal'); +// Map 'Q' to :q — Stop/pause playback +Vim.map('Q', ':q', 'normal'); +// Map 'J' to find next '$' (jump to next label) +Vim.map('J', '/\\$', 'normal'); +// Map 'K' to find previous '$' (jump to previous label) +Vim.map('K', '?\\$', 'normal'); +``` + +For more information on how to use the `Vim` object see [CodeMirror Vim](https://github.com/replit/codemirror-vim) From c7a2c2bb9c37a4a334747330260048742c93d683 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 7 Dec 2025 00:02:24 +0100 Subject: [PATCH 285/312] Say that @license should use SPDX identifier --- website/src/pages/learn/metadata.mdx | 34 +++++++++++++++------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/website/src/pages/learn/metadata.mdx b/website/src/pages/learn/metadata.mdx index 61db16f0e..c94257925 100644 --- a/website/src/pages/learn/metadata.mdx +++ b/website/src/pages/learn/metadata.mdx @@ -11,9 +11,9 @@ import { JsDoc } from '../../docs/JsDoc'; You can optionally add some music metadata in your Strudel code, by using tags in code comments: ```js -// @title Hey Hoo -// @by Sam Tagada -// @license CC BY-NC-SA +// @title My Cool Song +// @by John Doe +// @license CC-BY-SA-4.0 ``` Like other comments, those are ignored by Strudel, but it can be used by other tools to retrieve some information about the music. @@ -24,22 +24,22 @@ You can also use comment blocks: ```js /* -@title Hey Hoo -@by Sam Tagada -@license CC BY-NC-SA +@title My Cool Song +@by John Doe +@license CC-BY-SA-4.0 */ ``` Or define multiple tags in one line: ```js -// @title Hey Hoo @by Sam Tagada @license CC BY-NC-SA +// @title My Cool Song @by John Doe @license CC-BY-SA-4.0 ``` The `title` tag has an alternative syntax using quotes (must be defined at the very begining): ```js -// "Hey Hoo" @by Sam Tagada +// "My Cool Song" @by John Doe ``` ## Tags list @@ -48,20 +48,22 @@ Available tags are: - `@title`: music title - `@by`: music author(s), separated by comma, eventually followed with a link in `<>` (ex: `@by John Doe `) -- `@license`: music license(s), e.g. CC BY-NC-SA. Unsure? [Choose a creative commons license here](https://creativecommons.org/choose/) +- `@license`: music license(s), separated by comma. Each license should be specified by using the correct identifier in the [https://spdx.org/licenses/](SPDX License List). Example: CC-BY-SA-4.0. Unsure? [Choose a Creative Commons license here](https://creativecommons.org/choose/). - `@details`: some additional information about the music -- `@url`: web page(s) related to the music (git repo, soundcloud link, etc.) -- `@genre`: music genre(s) (pop, jazz, etc) +- `@url`: web page(s) related to the music (git repository, Soundcloud link, etc.) +- `@genre`: music genre(s) (pop, jazz, etc.) - `@album`: music album name +Note to tool authors: _Never_ trust that a song has filled those fields with syntactically correct values; make sure your software is robust enough it doesn't break if it encounters bad values + ## Multiple values Some of them accepts several values, using the comma or new line separator, or duplicating the tag: ```js /* -@by Sam Tagada - Jimmy +@by John Doe + Jane Doe @genre pop, jazz @url https://example.com @url https://example.org @@ -72,11 +74,11 @@ You can also add optional prefixes and use tags where you want: ```js /* -song @by Sam Tagada -samples @by Jimmy +song @by John Doe +samples @by Jane Doe */ ... -note("a3 c#4 e4 a4") // @by Sandy +note("a3 c#4 e4 a4") // @by Sandy Sue ``` ## Multiline From d349d2a0cd0efcce383e63ed414e3a009f872b06 Mon Sep 17 00:00:00 2001 From: JesCoding Date: Wed, 24 Dec 2025 10:38:21 +0100 Subject: [PATCH 286/312] Fix transpilation example to have same mini-notation This was introduced in https://codeberg.org/uzu/strudel/commit/66f8ca72c1b364f72f25b8cff041cac13b380432 --- website/src/pages/technical-manual/repl.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/src/pages/technical-manual/repl.mdx b/website/src/pages/technical-manual/repl.mdx index f74a4fb8b..d8a22cf55 100644 --- a/website/src/pages/technical-manual/repl.mdx +++ b/website/src/pages/technical-manual/repl.mdx @@ -41,7 +41,7 @@ note("c3 [e3 g3]*2") is transpiled to: ```strudel -note(m('c3 [e3 g3]', 5)) +note(m('c3 [e3 g3]*2', 5)) ``` Here, the string is wrapped in `m`, which will create a pattern from a mini-notation string. As the second parameter, it gets passed source code location of the string, which enables highlighting active events later. From e286ab2830f5681e1c92ad9f6bfd6913becbf3c5 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sun, 28 Dec 2025 13:10:37 +0100 Subject: [PATCH 287/312] no default samples for now + add doughsamples to scope --- website/src/components/Dough/dough-repl.mjs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/website/src/components/Dough/dough-repl.mjs b/website/src/components/Dough/dough-repl.mjs index ef28617e8..c8b47a3e8 100644 --- a/website/src/components/Dough/dough-repl.mjs +++ b/website/src/components/Dough/dough-repl.mjs @@ -6,6 +6,8 @@ import { transpiler } from '@strudel/transpiler'; //const doughBaseUrl = doughUrl.split('/').slice(0, -1).join('/') + '/'; const doughBaseUrl = 'https://unpkg.com/dough-synth@0.1.9/'; +Object.assign(globalThis, { doughsamples }); + export class DoughRepl { pattern; latency = 0.1; @@ -81,7 +83,9 @@ export class DoughRepl { this.origin = undefined; } prebake() { - return Promise.all([doughsamples('github:eddyflux/crate')]); + return Promise.all([ + // doughsamples('github:eddyflux/crate') + ]); } // tbd: move this to dough-synth get time() { From 53e49952d8942b7d78393e8626ec32a5808006a2 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sun, 28 Dec 2025 13:10:57 +0100 Subject: [PATCH 288/312] persist code in hash --- website/src/components/Dough/dough-mirror.mjs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/website/src/components/Dough/dough-mirror.mjs b/website/src/components/Dough/dough-mirror.mjs index 5cdfeb3f6..2626787ed 100644 --- a/website/src/components/Dough/dough-mirror.mjs +++ b/website/src/components/Dough/dough-mirror.mjs @@ -9,12 +9,23 @@ import { updateMiniLocations, highlightMiniLocations, } from '@strudel/codemirror'; -import { evalScope } from '@strudel/core'; +import { evalScope, hash2code } from '@strudel/core'; import { Framer } from '@strudel/draw'; import { persistentAtom } from '@nanostores/persistent'; import { DoughRepl } from './dough-repl.mjs'; -const initialCode = '$: note("c a f e")'; +let initialCode = '$: note("c a f e")'; +if (typeof window !== 'undefined') { + try { + const codeParam = window.location.href.split('#')[1] || ''; + if (codeParam) { + initialCode = hash2code(codeParam); + } + } catch (err) { + console.error('could not init code from url'); + } +} + export const code = persistentAtom('vanilla-repl-code', initialCode, { encode: JSON.stringify, decode: JSON.parse, @@ -64,6 +75,7 @@ export class DoughMirror { this.flash(); await this.prebaked; const { miniLocations } = await this.repl.evaluate(this.code); + window.location.hash = '#' + code2hash(this.code); updateMiniLocations(this.editor, miniLocations); } stop() { From 125eece2237d7fd361f731156a6f47d165ec2486 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sun, 28 Dec 2025 13:20:22 +0100 Subject: [PATCH 289/312] fix: import --- website/src/components/Dough/dough-mirror.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/src/components/Dough/dough-mirror.mjs b/website/src/components/Dough/dough-mirror.mjs index 2626787ed..b7794d2db 100644 --- a/website/src/components/Dough/dough-mirror.mjs +++ b/website/src/components/Dough/dough-mirror.mjs @@ -9,7 +9,7 @@ import { updateMiniLocations, highlightMiniLocations, } from '@strudel/codemirror'; -import { evalScope, hash2code } from '@strudel/core'; +import { evalScope, hash2code, code2hash } from '@strudel/core'; import { Framer } from '@strudel/draw'; import { persistentAtom } from '@nanostores/persistent'; import { DoughRepl } from './dough-repl.mjs'; From 300a1bbfd51dc763e0adc20ff0a6755a33fe6ff2 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sun, 28 Dec 2025 14:07:27 +0100 Subject: [PATCH 290/312] fix: actually load code from url --- website/src/components/Dough/dough-mirror.mjs | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/website/src/components/Dough/dough-mirror.mjs b/website/src/components/Dough/dough-mirror.mjs index b7794d2db..7784402e9 100644 --- a/website/src/components/Dough/dough-mirror.mjs +++ b/website/src/components/Dough/dough-mirror.mjs @@ -15,22 +15,24 @@ import { persistentAtom } from '@nanostores/persistent'; import { DoughRepl } from './dough-repl.mjs'; let initialCode = '$: note("c a f e")'; -if (typeof window !== 'undefined') { - try { - const codeParam = window.location.href.split('#')[1] || ''; - if (codeParam) { - initialCode = hash2code(codeParam); - } - } catch (err) { - console.error('could not init code from url'); - } -} export const code = persistentAtom('vanilla-repl-code', initialCode, { encode: JSON.stringify, decode: JSON.parse, }); +if (typeof window !== 'undefined') { + try { + const codeParam = window.location.href.split('#')[1] || ''; + if (codeParam) { + const codeFromHash = hash2code(codeParam); + code.set(codeFromHash); + } + } catch (err) { + console.error('could not init code from url'); + } +} + export class DoughMirror { constructor(options) { const { root, initialCode = code.get(), bgFill = true } = options; From 30fe5b47e38ec768c34186cfd348e3b891c83f4b Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sun, 28 Dec 2025 22:42:42 +0100 Subject: [PATCH 291/312] hotfix: fix scope and friends #1847 --- packages/superdough/superdough.mjs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 4fd6164dc..e98a2aa22 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -359,7 +359,9 @@ export let analysers = {}, analysersData = {}; export function getAnalyserById(id, fftSize = 1024, smoothingTimeConstant = 0.5) { - if (!analysers[id] || analysers[id].audioContext != getAudioContext()) { + // below commented out branch is hotfixing https://codeberg.org/uzu/strudel/issues/1847 + // might cause conflicts with exporting... + if (!analysers[id] /* || analysers[id].audioContext != getAudioContext() */) { // make sure this doesn't happen too often as it piles up garbage const analyserNode = getAudioContext().createAnalyser(); analyserNode.fftSize = fftSize; From 48f6a41683daf95b412ce99979b5ce933286349e Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 28 Dec 2025 20:13:15 -0500 Subject: [PATCH 292/312] Extend to FM, vibrato, etc --- packages/core/controls.mjs | 15 +++----- packages/soundfonts/fontloader.mjs | 6 +-- packages/superdough/helpers.mjs | 6 ++- packages/superdough/sampler.mjs | 6 +-- packages/superdough/superdough.mjs | 33 ++++++++-------- packages/superdough/superdoughdata.mjs | 37 ++++++++++++++++++ packages/superdough/synth.mjs | 52 +++++++++++++------------- packages/superdough/wavetable.mjs | 19 +++++++--- packages/superdough/zzfx.mjs | 2 +- 9 files changed, 112 insertions(+), 64 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 826174d8f..5cc53de60 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -2870,36 +2870,33 @@ registerSubControls('bmod', [ ]); Pattern.prototype.modulate = function (type, config, idx) { - if (config == null || typeof config !== 'object') { - return this; - } + config ??= { control: undefined }; const modulatorKeys = ['lfo', 'env', 'bmod']; if (!modulatorKeys.includes(type)) { logger(`[core] Modulation type ${type} not found. Please use one of 'lfo', 'env', 'bmod'`); return this; } let output = this; - let defaultValue = {}; - let defaultSet = 'control' in config; + let defaultValue = undefined; for (const [rawKey, value] of Object.entries(config)) { const key = getMainSubcontrolName(type, rawKey); const valuePat = reify(value); output = output .fmap((v) => (c) => { - if (!defaultSet) { + if (defaultValue === undefined) { // default control to the control set just before this in the chain // e.g. pat.gain(0.5).lfo({..}) will be a gain-LFO let control = getControlName(Object.keys(v).at(-1)); if (modulatorKeys.includes(control)) { control = `${control}${v[control].length - 1}`; } - defaultValue = { control }; - defaultSet = true; + defaultValue = control; } v[type] ??= []; const t = v[type]; idx ??= t.length; - t[idx] ??= defaultValue; + t[idx] ??= { control: defaultValue }; + if (c === undefined) return v; if (key === 'control' || key === 'subControl') { t[idx][key] = getControlName(c); } else { diff --git a/packages/soundfonts/fontloader.mjs b/packages/soundfonts/fontloader.mjs index 81b9eb508..b4ae59828 100644 --- a/packages/soundfonts/fontloader.mjs +++ b/packages/soundfonts/fontloader.mjs @@ -166,7 +166,7 @@ export function registerSoundfonts() { let envEnd = holdEnd + release + 0.01; // vibrato - let vibratoOscillator = getVibratoOscillator(bufferSource.detune, value, time); + const vibratoHandle = getVibratoOscillator(bufferSource.detune, value, time); // pitch envelope getPitchEnvelope(bufferSource.detune, value, time, holdEnd); @@ -174,10 +174,10 @@ export function registerSoundfonts() { const stop = (releaseTime) => {}; onceEnded(bufferSource, () => { releaseAudioNode(bufferSource); - releaseAudioNode(vibratoOscillator); + vibratoHandle?.stop(); onended(); }); - return { node, stop, source: bufferSource }; + return { node, stop, nodes: { source: [bufferSource], ...vibratoHandle?.nodes } }; }, { type: 'soundfont', prebake: true, fonts }, ); diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index fc7734ea3..8bd8b067b 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -351,7 +351,7 @@ export function getVibratoOscillator(param, value, t) { releaseAudioNode(vibratoOscillator); }); vibratoOscillator.start(t); - return vibratoOscillator; + return { stop: (t) => vibratoOscillator.stop(t), nodes: { vib: [vibratoOscillator], vib_gain: [gain] } }; } } @@ -407,6 +407,7 @@ export function applyFM(param, value, begin) { const ac = getAudioContext(); const toStop = []; // fm oscillators we will expose `stop` for const fms = {}; + const nodes = {}; // Matrix for (let i = 1; i <= 8; i++) { for (let j = 0; j <= 8; j++) { @@ -457,11 +458,13 @@ export function applyFM(param, value, begin) { output = osc.connect(envGain); } fms[idx] = { input: osc.frequency, output, freq, osc, toCleanup }; + nodes[`fm_${idx}`] = [osc]; } const { input, output, freq, osc, toCleanup } = fms[idx]; const g = gainNode(amt * freq); io.push(isMod ? output.connect(g) : input); cleanupOnEnd(osc, [...toCleanup, g]); + nodes[`fm_${idx}_gain`] = [g]; } if (!io[1]) { logger( @@ -474,6 +477,7 @@ export function applyFM(param, value, begin) { } } return { + nodes, stop: (t) => toStop.forEach((m) => m?.stop(t)), }; } diff --git a/packages/superdough/sampler.mjs b/packages/superdough/sampler.mjs index 55f081568..819de3c78 100644 --- a/packages/superdough/sampler.mjs +++ b/packages/superdough/sampler.mjs @@ -301,7 +301,7 @@ export async function onTriggerSample(t, value, onended, bank, resolveUrl) { } // vibrato - let vibratoOscillator = getVibratoOscillator(bufferSource.detune, value, t); + const vibratoHandle = getVibratoOscillator(bufferSource.detune, value, t); const time = t + nudge; bufferSource.start(time, offset); @@ -324,7 +324,7 @@ export async function onTriggerSample(t, value, onended, bank, resolveUrl) { node.connect(out); onceEnded(bufferSource, function () { releaseAudioNode(bufferSource); - releaseAudioNode(vibratoOscillator); + vibratoHandle?.stop(); releaseAudioNode(node); releaseAudioNode(out); onended(); @@ -334,7 +334,7 @@ export async function onTriggerSample(t, value, onended, bank, resolveUrl) { const stop = (endTime) => { bufferSource.stop(endTime); }; - const handle = { node: out, source: bufferSource, stop }; + const handle = { node: out, nodes: { source: [bufferSource], ...vibratoHandle?.nodes }, stop }; // cut groups if (cut !== undefined) { diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index fd198c788..8bca5b30c 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -532,7 +532,7 @@ function mapChannelNumbers(channels) { } export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) => { - const nodes = {}; + let nodes = {}; // new: t is always expected to be the absolute target onset time const ac = getAudioContext(); const audioController = getSuperdoughAudioController(); @@ -690,7 +690,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) if (soundHandle) { sourceNode = soundHandle.node; activeSoundSources.set(chainID, new WeakRef(soundHandle)); // allow GC - nodes['source'] = [soundHandle.source]; + nodes = { ...nodes, ...soundHandle.nodes }; } } else { throw new Error(`sound ${s} not found! Is it loaded?`); @@ -709,22 +709,23 @@ 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, - begin: t, - end: endWithRelease, - }, + if (transient !== undefined) { + const transProcessor = getWorklet( + ac, + 'transient-processor', + {}, + { + processorOptions: { + attack: transient, + sustain: transsustain, + begin: t, + end: endWithRelease, }, - ), + }, ); + chain.push(transProcessor); + nodes['transient'] = transProcessor; + } // gain stage const initialGain = gainNode(gain); diff --git a/packages/superdough/superdoughdata.mjs b/packages/superdough/superdoughdata.mjs index cab829752..2ae03101a 100644 --- a/packages/superdough/superdoughdata.mjs +++ b/packages/superdough/superdoughdata.mjs @@ -23,6 +23,9 @@ const CONTROL_TARGETS = { lfo_sync: { node: 'lfo', param: 'frequency' }, lfo_depth: { node: 'lfo', param: 'depth' }, lfo_depthabs: { node: 'lfo', param: 'depth' }, + lfo_skew: { node: 'lfo', param: 'skew' }, + lfo_curve: { node: 'lfo', param: 'curve' }, + lfo_dcoffset: { node: 'lfo', param: 'dcoffset' }, env: { node: 'env', param: 'depth' }, env_attack: { node: 'env', param: 'attack' }, env_decay: { node: 'env', param: 'decay' }, @@ -107,6 +110,40 @@ const CONTROL_TARGETS = { warp: { node: 'source', param: 'warp' }, freq: { node: 'source', param: 'frequency' }, note: { node: 'source', param: 'frequency' }, + wtdc: { node: 'wt_lfo', param: 'dc' }, + wtskew: { node: 'wt_lfo', param: 'skew' }, + wtrate: { node: 'wt_lfo', param: 'frequency' }, + wtsync: { node: 'wt_lfo', param: 'frequency' }, + wtdepth: { node: 'wt_lfo', param: 'depth' }, + warpdc: { node: 'warp_lfo', param: 'dc' }, + warpskew: { node: 'warp_lfo', param: 'skew' }, + warprate: { node: 'warp_lfo', param: 'frequency' }, + warpsync: { node: 'warp_lfo', param: 'frequency' }, + warpdepth: { node: 'warp_lfo', param: 'depth' }, + fmi: { node: 'fm_1_gain', param: 'gain' }, + fmi2: { node: 'fm_2_gain', param: 'gain' }, + fmi3: { node: 'fm_3_gain', param: 'gain' }, + fmi4: { node: 'fm_4_gain', param: 'gain' }, + fmi5: { node: 'fm_5_gain', param: 'gain' }, + fmi6: { node: 'fm_6_gain', param: 'gain' }, + fmi7: { node: 'fm_7_gain', param: 'gain' }, + fmi8: { node: 'fm_8_gain', param: 'gain' }, + fmh: { node: 'fm_1', param: 'frequency' }, + fmh2: { node: 'fm_2', param: 'frequency' }, + fmh3: { node: 'fm_3', param: 'frequency' }, + fmh4: { node: 'fm_4', param: 'frequency' }, + fmh5: { node: 'fm_5', param: 'frequency' }, + fmh6: { node: 'fm_6', param: 'frequency' }, + fmh7: { node: 'fm_7', param: 'frequency' }, + fmh8: { node: 'fm_8', param: 'frequency' }, + pw: { node: 'source', param: 'pulsewidth' }, + pwrate: { node: 'pw_lfo', param: 'frequency' }, + pwsweep: { node: 'pw_lfo', param: 'depth' }, + vib: { node: 'vib_gain', param: 'gain' }, + vibmod: { node: 'vib', param: 'frequency' }, + byteBeatStartTime: { node: 'source', param: 'byteBeatStartTime' }, + spread: { node: 'source', param: 'panspread' }, + transient: { node: 'transient', param: 'attack' }, }; export function getSuperdoughControlTargets() { diff --git a/packages/superdough/synth.mjs b/packages/superdough/synth.mjs index 40e62f86f..d20692729 100644 --- a/packages/superdough/synth.mjs +++ b/packages/superdough/synth.mjs @@ -52,17 +52,17 @@ export function registerSynthSounds() { // turn down const g = gainNode(0.3); - let sound = getOscillator(s, t, value, () => { + const sound = getOscillator(s, t, value, () => { releaseAudioNode(g); onended(); }); - let { node: o, stop, triggerRelease } = sound; + const { node: o, nodes, stop, triggerRelease } = sound; const { duration } = value; const envGain = gainNode(1); - let node = o.connect(g).connect(envGain); + const node = o.connect(g).connect(envGain); const holdEnd = t + duration; getParamADSR(node.gain, attack, decay, sustain, release, 0, 1, t, holdEnd, 'linear'); const envEnd = holdEnd + release + 0.01; @@ -70,7 +70,7 @@ export function registerSynthSounds() { stop(envEnd); return { node, - source: o, + nodes, stop: (endTime) => { stop(endTime); }, @@ -140,7 +140,7 @@ export function registerSynthSounds() { return { node, - source: o, + nodes: { source: [o] }, stop: (endTime) => { o.stop(endTime); }, @@ -185,8 +185,8 @@ export function registerSynthSounds() { const gainAdjustment = 1 / Math.sqrt(voices); getPitchEnvelope(o.parameters.get('detune'), value, begin, holdend); - const vibratoOscillator = getVibratoOscillator(o.parameters.get('detune'), value, begin); - const fm = applyFM(o.parameters.get('frequency'), value, begin); + const vibratoHandle = getVibratoOscillator(o.parameters.get('detune'), value, begin); + const fmHandle = applyFM(o.parameters.get('frequency'), value, begin); let envGain = gainNode(1); envGain = o.connect(envGain); @@ -197,8 +197,8 @@ export function registerSynthSounds() { () => { releaseAudioNode(o); onended(); - fm?.stop(); - vibratoOscillator?.stop(); + fmHandle?.stop(); + vibratoHandle?.stop(); }, begin, end, @@ -206,7 +206,7 @@ export function registerSynthSounds() { return { node: envGain, - source: o, + nodes: { source: [o], ...fmHandle?.nodes, ...vibratoHandle?.nodes }, stop: (time) => { timeoutNode.stop(time); }, @@ -333,25 +333,25 @@ export function registerSynthSounds() { ); getPitchEnvelope(o.parameters.get('detune'), value, begin, holdend); - const vibratoOscillator = getVibratoOscillator(o.parameters.get('detune'), value, begin); - const fm = applyFM(o.parameters.get('frequency'), value, begin); + const vibratoHandle = getVibratoOscillator(o.parameters.get('detune'), value, begin); + const fmHandle = applyFM(o.parameters.get('frequency'), value, begin); let envGain = gainNode(1); envGain = o.connect(envGain); getParamADSR(envGain.gain, attack, decay, sustain, release, 0, 1, begin, holdend, 'linear'); - let lfo; + let pw_lfo; if (pwsweep != 0) { - lfo = getLfo(ac, { frequency: pwrate, depth: pwsweep, begin, end }); - lfo.connect(o.parameters.get('pulsewidth')); + pw_lfo = getLfo(ac, { frequency: pwrate, depth: pwsweep, begin, end }); + pw_lfo.connect(o.parameters.get('pulsewidth')); } let timeoutNode = webAudioTimeout( ac, () => { releaseAudioNode(o); - releaseAudioNode(lfo); + releaseAudioNode(pw_lfo); onended(); - fm?.stop(); - vibratoOscillator?.stop(); + fmHandle?.stop(); + vibratoHandle?.stop(); }, begin, end, @@ -359,7 +359,7 @@ export function registerSynthSounds() { return { node: envGain, - source: o, + nodes: { source: [o], pw_lfo: [pw_lfo], ...fmHandle?.nodes, ...vibratoHandle?.nodes }, stop: (time) => { timeoutNode.stop(time); }, @@ -394,7 +394,7 @@ export function registerSynthSounds() { return { node: envGain, - source: bus, + nodes: { source: [bus] }, stop: (time) => { timeoutNode.stop(time); }, @@ -440,7 +440,7 @@ export function registerSynthSounds() { stop(envEnd); return { node, - source: o, + nodes: { source: [o] }, stop: (endTime) => { stop(endTime); }, @@ -520,11 +520,11 @@ export function getOscillator(s, t, value, onended) { // set frequency o.frequency.value = getFrequencyFromValue(value); - let vibratoOscillator = getVibratoOscillator(o.detune, value, t); + const vibratoHandle = getVibratoOscillator(o.detune, value, t); // pitch envelope getPitchEnvelope(o.detune, value, t, t + duration); - const fmModulator = applyFM(o.frequency, value, t); + const fmHandle = applyFM(o.frequency, value, t); let noiseMix; if (noise) { @@ -541,10 +541,10 @@ export function getOscillator(s, t, value, onended) { return { node: noiseMix?.node || o, - source: o, + nodes: { source: [o], ...vibratoHandle?.nodes, ...fmHandle?.nodes }, stop: (time) => { - fmModulator.stop(time); - vibratoOscillator?.stop(time); + fmHandle.stop(time); + vibratoHandle?.stop(time); noiseMix?.stop(time); o.stop(time); }, diff --git a/packages/superdough/wavetable.mjs b/packages/superdough/wavetable.mjs index ebf951a49..b4fc401f1 100644 --- a/packages/superdough/wavetable.mjs +++ b/packages/superdough/wavetable.mjs @@ -314,19 +314,28 @@ export async function onTriggerSynth(t, value, onended, tables, cps, frameLen) { dcoffset: value.warpdc ?? 0, }, ); - const vibratoOscillator = getVibratoOscillator(source.parameters.get('detune'), value, t); - const fm = applyFM(source.parameters.get('frequency'), value, t); + const vibratoHandle = getVibratoOscillator(source.parameters.get('detune'), value, t); + const fmHandle = applyFM(source.parameters.get('frequency'), value, t); const envGain = ac.createGain(); const node = source.connect(envGain); getParamADSR(node.gain, attack, decay, sustain, release, 0, 0.3, t, holdEnd, 'linear'); getPitchEnvelope(source.parameters.get('detune'), value, t, holdEnd); - const handle = { node, source }; + const handle = { + node, + nodes: { + source: [source], + wt_lfo: [wtPosModulators], + warp_lfo: [wtWarpModulators], + ...fmHandle?.nodes, + ...vibratoHandle?.nodes, + }, + }; const timeoutNode = webAudioTimeout( ac, () => { releaseAudioNode(source); - releaseAudioNode(vibratoOscillator); - fm?.stop(); + vibratoHandle?.stop(); + fmHandle?.stop(); releaseAudioNode(wtPosModulators); releaseAudioNode(wtWarpModulators); onended(); diff --git a/packages/superdough/zzfx.mjs b/packages/superdough/zzfx.mjs index 708f34503..f3dc710b1 100644 --- a/packages/superdough/zzfx.mjs +++ b/packages/superdough/zzfx.mjs @@ -75,7 +75,7 @@ export const getZZFX = (value, t) => { source.start(t); return { node: source, - source, + nodes: { source: [source] }, }; }; From b4496fcc24f8bd9f306fc1c9f0026f9d5f6b1d24 Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 28 Dec 2025 21:43:08 -0500 Subject: [PATCH 293/312] More control mapping tweaks --- packages/superdough/superdough.mjs | 5 ++++- packages/superdough/superdoughdata.mjs | 15 +++++++-------- packages/superdough/superdoughoutput.mjs | 1 + 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 8bca5b30c..980f18142 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -950,6 +950,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) const delayNode = orbitBus.getDelay(delaytime, delayfeedback, t); nodes['delay'] = [delayNode]; const delaySend = orbitBus.sendDelay(post, delay); + nodes['delay_mix'] = [delaySend]; audioNodes.push(delaySend); } // reverb @@ -968,6 +969,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) const roomNode = orbitBus.getReverb(roomsize, roomfade, roomlp, roomdim, roomIR, irspeed, irbegin); nodes['room'] = [roomNode]; const reverbSend = orbitBus.sendReverb(post, room); + nodes['room_mix'] = [reverbSend]; audioNodes.push(reverbSend); } if (bus != null) { @@ -977,7 +979,8 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) } if (djf != null) { - nodes['djf'] = orbitBus.getDjf(djf, t); + const djfNode = orbitBus.getDjf(djf, t); + nodes['djf'] = [djfNode]; } // analyser diff --git a/packages/superdough/superdoughdata.mjs b/packages/superdough/superdoughdata.mjs index 2ae03101a..f9df6ff83 100644 --- a/packages/superdough/superdoughdata.mjs +++ b/packages/superdough/superdoughdata.mjs @@ -87,25 +87,24 @@ const CONTROL_TARGETS = { compressorRelease: { node: 'compressor', param: 'release' }, // PHASER - phaserrate: { node: 'phaser', param: 'rate' }, - phaserdepth: { node: 'phaser', param: 'depth' }, - phasersweep: { node: 'phaser', param: 'sweep' }, + phaserrate: { node: 'phaser_lfo', param: 'rate' }, + phasersweep: { node: 'phaser_lfo', param: 'depth' }, phasercenter: { node: 'phaser', param: 'frequency' }, + phaserdepth: { node: 'phaser', param: 'Q' }, // ORBIT EFFECTS + delay: { node: 'delay_mix', param: 'gain' }, delaytime: { node: 'delay', param: 'delayTime' }, delayfeedback: { node: 'delay', param: 'feedback' }, - delaysync: { node: 'delay', param: 'sync' }, + delaysync: { node: 'delay', param: 'delayTime' }, dry: { node: 'dry', param: 'gain' }, - room: { node: 'room', param: 'wet' }, - roomfade: { node: 'room', param: 'fade' }, - roomlp: { node: 'room', param: 'lp' }, + room: { node: 'room_mix', param: 'gain' }, djf: { node: 'djf', param: 'value' }, busgain: { node: 'bus', param: 'gain' }, // SYNTHS s: { node: 'source', param: 'frequency' }, - detune: { node: 'source', param: 'detune' }, + detune: { node: 'source', param: 'freqspread' }, wt: { node: 'source', param: 'position' }, warp: { node: 'source', param: 'warp' }, freq: { node: 'source', param: 'frequency' }, diff --git a/packages/superdough/superdoughoutput.mjs b/packages/superdough/superdoughoutput.mjs index 204eb62a4..d3936646a 100644 --- a/packages/superdough/superdoughoutput.mjs +++ b/packages/superdough/superdoughoutput.mjs @@ -38,6 +38,7 @@ export class Orbit { } const val = this.djfNode.parameters.get('value'); val.setValueAtTime(value, t); + return this.djfNode; } getDelay(delaytime = 0, feedback = 0.5, t) { From c0f4f4715026d909cf3339e370a3298027f554a7 Mon Sep 17 00:00:00 2001 From: jeromew Date: Mon, 29 Dec 2025 14:04:40 +0000 Subject: [PATCH 294/312] Fix AudioContext change detection. Use AudioNode.context --- packages/superdough/superdough.mjs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index e98a2aa22..1ce91c835 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -359,9 +359,7 @@ export let analysers = {}, analysersData = {}; export function getAnalyserById(id, fftSize = 1024, smoothingTimeConstant = 0.5) { - // below commented out branch is hotfixing https://codeberg.org/uzu/strudel/issues/1847 - // might cause conflicts with exporting... - if (!analysers[id] /* || analysers[id].audioContext != getAudioContext() */) { + if (!analysers[id] || analysers[id].context != getAudioContext()) { // make sure this doesn't happen too often as it piles up garbage const analyserNode = getAudioContext().createAnalyser(); analyserNode.fftSize = fftSize; From 98367868ac0c7c95e44e48d294467c63c1e85dcb Mon Sep 17 00:00:00 2001 From: Aria Date: Mon, 29 Dec 2025 10:22:48 -0600 Subject: [PATCH 295/312] Handle min/max when target is LFO; fix vib and tremolo --- packages/superdough/superdough.mjs | 23 +++++++++++++---------- packages/superdough/superdoughdata.mjs | 8 ++++---- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 980f18142..13a4ef68c 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -420,10 +420,10 @@ function _getControlData(control) { return controlTargets[_stripIndex(control)]; } -function _getRangeForParam(paramName, currentValue, control) { - // For our normal oscillators / filters we want to clamp the frequency to a reasonable range - // For LFOs we allow it to be modulated freely - if (paramName === 'frequency' || control?.startsWith?.('lfo')) { +function _getRangeForParam(paramName, currentValue) { + // We clamp the frequency to a reasonable range unless the currentValue + // is low, which indicates this may be an LFO + if (paramName === 'frequency' && currentValue >= 30) { return { min: 20 - currentValue, max: 24000 - currentValue }; } return { min: undefined, max: undefined }; @@ -459,8 +459,9 @@ function connectLFO(idx, params, nodeTracker) { const { rate = 1, sync, cps, cycle, control = 'lfo', subControl, depth = 1, depthabs, ...filteredParams } = params; const { targetParams, paramName } = _getTargetParamsForControl(control, nodeTracker, subControl); if (!targetParams.length) return; - const currentValue = targetParams[0].value; - const { min, max } = _getRangeForParam(paramName, currentValue, control); + let currentValue = targetParams[0].value; + currentValue = currentValue === 0 ? 1 : currentValue; + const { min, max } = _getRangeForParam(paramName, currentValue); const depthValue = depthabs != null ? depthabs : depth * currentValue; const modParams = { ...filteredParams, @@ -480,8 +481,9 @@ function connectEnvelope(idx, params, nodeTracker) { const { control, subControl, acurve, dcurve, rcurve, depth = 1, depthabs, ...filteredParams } = params; const { targetParams, paramName } = _getTargetParamsForControl(control, nodeTracker, subControl); if (!targetParams.length) return; - const currentValue = targetParams[0].value; - const { min, max } = _getRangeForParam(paramName, currentValue, control); + let currentValue = targetParams[0].value; + currentValue = currentValue === 0 ? 1 : currentValue; + const { min, max } = _getRangeForParam(paramName, currentValue); const depthValue = depthabs != null ? depthabs : depth * currentValue; const envNode = getEnvelope(getAudioContext(), { ...filteredParams, @@ -507,8 +509,9 @@ function connectBusModulator(params, nodeTracker) { dc.start(params.begin); const shifted = dc.connect(gainNode(1)); signal.connect(shifted); - const currentValue = targetParams[0].value; - const { min, max } = _getRangeForParam(paramName, currentValue, control); + let currentValue = targetParams[0].value; + currentValue = currentValue === 0 ? 1 : currentValue; + const { min, max } = _getRangeForParam(paramName, currentValue); const depthValue = depthabs != null ? depthabs : depth * currentValue; const maxAbsDepth = Math.min(Math.abs(min), Math.abs(max)); const boundedDepth = Math.min(Math.abs(depthValue), maxAbsDepth) || Math.abs(depthValue); diff --git a/packages/superdough/superdoughdata.mjs b/packages/superdough/superdoughdata.mjs index f9df6ff83..2dac194f1 100644 --- a/packages/superdough/superdoughdata.mjs +++ b/packages/superdough/superdoughdata.mjs @@ -10,8 +10,8 @@ const CONTROL_TARGETS = { gain: { node: 'gain', param: 'gain' }, postgain: { node: 'post', param: 'gain' }, pan: { node: 'pan', param: 'pan' }, - tremolo: { node: 'tremolo', param: 'rate' }, - tremolosync: { node: 'tremolo', param: 'sync' }, + tremolo: { node: 'tremolo', param: 'frequency' }, + tremolosync: { node: 'tremolo', param: 'frequency' }, tremolodepth: { node: 'tremolo_gain', param: 'gain' }, tremoloskew: { node: 'tremolo', param: 'skew' }, tremolophase: { node: 'tremolo', param: 'phase' }, @@ -138,8 +138,8 @@ const CONTROL_TARGETS = { pw: { node: 'source', param: 'pulsewidth' }, pwrate: { node: 'pw_lfo', param: 'frequency' }, pwsweep: { node: 'pw_lfo', param: 'depth' }, - vib: { node: 'vib_gain', param: 'gain' }, - vibmod: { node: 'vib', param: 'frequency' }, + vib: { node: 'vib', param: 'frequency' }, + vibmod: { node: 'vib_gain', param: 'gain' }, byteBeatStartTime: { node: 'source', param: 'byteBeatStartTime' }, spread: { node: 'source', param: 'panspread' }, transient: { node: 'transient', param: 'attack' }, From e79b4b8ccb749b7c1a3cafbeb00e12ee66f220a6 Mon Sep 17 00:00:00 2001 From: Aria Date: Mon, 29 Dec 2025 10:41:20 -0600 Subject: [PATCH 296/312] Refactor modulators --- packages/superdough/index.mjs | 1 + packages/superdough/modulators.mjs | 141 +++++++++++++++++++++++++++++ packages/superdough/superdough.mjs | 140 +--------------------------- packages/superdough/worklets.mjs | 3 +- 4 files changed, 147 insertions(+), 138 deletions(-) create mode 100644 packages/superdough/modulators.mjs diff --git a/packages/superdough/index.mjs b/packages/superdough/index.mjs index a382bd15a..c3d2f6c52 100644 --- a/packages/superdough/index.mjs +++ b/packages/superdough/index.mjs @@ -10,6 +10,7 @@ export * from './helpers.mjs'; export * from './synth.mjs'; export * from './zzfx.mjs'; export * from './logger.mjs'; +export * from './modulators.mjs'; export * from './dspworklet.mjs'; export * from './audioContext.mjs'; export * from './wavetable.mjs'; diff --git a/packages/superdough/modulators.mjs b/packages/superdough/modulators.mjs new file mode 100644 index 000000000..3411aacb7 --- /dev/null +++ b/packages/superdough/modulators.mjs @@ -0,0 +1,141 @@ +/* +modulators.mjs - Helpers for constructing modulators (envelopes, LFOs, etc.) +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 { getAudioContext } from './audioContext.mjs'; +import { gainNode, getEnvelope, getLfo, webAudioTimeout } from './helpers.mjs'; +import { errorLogger } from './logger.mjs'; +import { getSuperdoughControlTargets } from './superdoughdata.mjs'; + +const getNodeParam = (node, name) => { + // Worklet case + if (node?.parameters) { + const p = node.parameters.get(name); + if (p instanceof AudioParam) { + return p; + } + } + // Built-in node case + const p = node?.[name]; + if (p instanceof AudioParam) { + return p; + } + return undefined; +}; + +const controlTargets = getSuperdoughControlTargets(); + +const stripIndex = (control) => control?.replace(/\d+$/, ''); +const getControlData = (control) => { + return controlTargets[stripIndex(control)]; +}; + +const getRangeForParam = (paramName, currentValue) => { + // We clamp the frequency to a reasonable range unless the currentValue + // is low, which indicates this may be an LFO + if (paramName === 'frequency' && currentValue >= 30) { + return { min: 20 - currentValue, max: 24000 - currentValue }; + } + return { min: undefined, max: undefined }; +}; + +const getTargetParamsForControl = (control, nodes, subControl) => { + const lookupKey = subControl ? `${control}_${subControl}` : control; + const targetInfo = getControlData(lookupKey) ?? getControlData(control); + if (!targetInfo) { + errorLogger(new Error(`Could not find control data for target '${control}'`), 'superdough'); + return { targetParams: [], paramName: control }; + } + const paramName = targetInfo.param; + const nodeKey = nodes[targetInfo.node] ? targetInfo.node : control; + const targetNodes = nodes[nodeKey]; + if (!targetNodes) { + const keys = Object.keys(nodes); + errorLogger( + new Error(`Could not connect to target '${nodeKey}' — it does not exist. Available targets: ${keys.join(', ')}`), + 'superdough', + ); + return { targetParams: [], paramName }; + } + const audioParams = []; + targetNodes.forEach((targetNode) => { + const targetParam = getNodeParam(targetNode, paramName); + audioParams.push(targetParam); + }); + return { targetParams: audioParams, paramName }; +}; + +export const connectLFO = (idx, params, nodeTracker) => { + const { rate = 1, sync, cps, cycle, control = 'lfo', subControl, depth = 1, depthabs, ...filteredParams } = params; + const { targetParams, paramName } = getTargetParamsForControl(control, nodeTracker, subControl); + if (!targetParams.length) return; + let currentValue = targetParams[0].value; + currentValue = currentValue === 0 ? 1 : currentValue; + const { min, max } = getRangeForParam(paramName, currentValue); + const depthValue = depthabs != null ? depthabs : depth * currentValue; + const modParams = { + ...filteredParams, + frequency: sync !== undefined ? sync * cps : rate, + time: cycle / cps, + depth: depthValue, + min, + max, + }; + const lfoNode = getLfo(getAudioContext(), modParams); + nodeTracker[`lfo${idx}`] = [lfoNode]; + targetParams.forEach((t) => lfoNode.connect(t)); + return lfoNode; +}; + +export const connectEnvelope = (idx, params, nodeTracker) => { + const { control, subControl, acurve, dcurve, rcurve, depth = 1, depthabs, ...filteredParams } = params; + const { targetParams, paramName } = getTargetParamsForControl(control, nodeTracker, subControl); + if (!targetParams.length) return; + let currentValue = targetParams[0].value; + currentValue = currentValue === 0 ? 1 : currentValue; + const { min, max } = getRangeForParam(paramName, currentValue); + const depthValue = depthabs != null ? depthabs : depth * currentValue; + const envNode = getEnvelope(getAudioContext(), { + ...filteredParams, + depth: depthValue, + min, + max, + attackCurve: acurve, + decayCurve: dcurve, + releaseCurve: rcurve, + }); + nodeTracker[`env${idx}`] = [envNode]; + targetParams.forEach((t) => envNode.connect(t)); + return envNode; +}; + +export const connectBusModulator = (params, nodeTracker, controller) => { + const ac = getAudioContext(); + const { control, subControl, depth = 1, depthabs } = params; + const { targetParams, paramName } = getTargetParamsForControl(control, nodeTracker, subControl); + if (!targetParams.length) return { toCleanup: [] }; + const signal = controller.getBus(params.bus); + const dc = new ConstantSourceNode(ac, { offset: params.dc ?? 0 }); + dc.start(params.begin); + const shifted = dc.connect(gainNode(1)); + signal.connect(shifted); + let currentValue = targetParams[0].value; + debugger; + currentValue = currentValue === 0 ? 1 : currentValue; + const { min, max } = getRangeForParam(paramName, currentValue); + const depthValue = depthabs != null ? depthabs : depth * currentValue; + const maxAbsDepth = Math.min(Math.abs(min), Math.abs(max)); + const boundedDepth = Math.min(Math.abs(depthValue), maxAbsDepth) || Math.abs(depthValue); + const modulator = shifted.connect(gainNode((Math.sign(depthValue) * boundedDepth) / 0.3)); + webAudioTimeout( + ac, + () => { + targetParams.forEach((t) => modulator.connect(t)); + }, + 0, + params.begin, + ); + return { modulator, toCleanup: [dc, shifted, modulator] }; +}; diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 13a4ef68c..517b1d3e5 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -15,18 +15,16 @@ import { gainNode, getCompressor, getDistortion, - getEnvelope, getLfo, getWorklet, releaseAudioNode, - webAudioTimeout, } from './helpers.mjs'; import { map } from 'nanostores'; -import { errorLogger, logger } from './logger.mjs'; +import { logger } from './logger.mjs'; +import { connectLFO, connectEnvelope, connectBusModulator } from './modulators.mjs'; import { loadBuffer } from './sampler.mjs'; -import { getAudioContext, setAudioContext } from './audioContext.mjs'; +import { getAudioContext } from './audioContext.mjs'; import { SuperdoughAudioController } from './superdoughoutput.mjs'; -import { getSuperdoughControlTargets } from './superdoughdata.mjs'; import { resetSeenKeys } from './wavetable.mjs'; export const DEFAULT_MAX_POLYPHONY = 128; @@ -397,136 +395,6 @@ export function resetGlobalEffects() { analysersData = {}; } -function _getNodeParam(node, name) { - // Worklet case - if (node?.parameters) { - const p = node.parameters.get(name); - if (p instanceof AudioParam) { - return p; - } - } - // Built-in node case - const p = node?.[name]; - if (p instanceof AudioParam) { - return p; - } - return undefined; -} - -const controlTargets = getSuperdoughControlTargets(); - -const _stripIndex = (control) => control?.replace(/\d+$/, ''); -function _getControlData(control) { - return controlTargets[_stripIndex(control)]; -} - -function _getRangeForParam(paramName, currentValue) { - // We clamp the frequency to a reasonable range unless the currentValue - // is low, which indicates this may be an LFO - if (paramName === 'frequency' && currentValue >= 30) { - return { min: 20 - currentValue, max: 24000 - currentValue }; - } - return { min: undefined, max: undefined }; -} - -function _getTargetParamsForControl(control, nodes, subControl) { - const lookupKey = subControl ? `${control}_${subControl}` : control; - const targetInfo = _getControlData(lookupKey) ?? _getControlData(control); - if (!targetInfo) { - errorLogger(new Error(`Could not find control data for target '${control}'`), 'superdough'); - return { targetParams: [], paramName: control }; - } - const paramName = targetInfo.param; - const nodeKey = nodes[targetInfo.node] ? targetInfo.node : control; - const targetNodes = nodes[nodeKey]; - if (!targetNodes) { - const keys = Object.keys(nodes); - errorLogger( - new Error(`Could not connect to target '${nodeKey}' — it does not exist. Available targets: ${keys.join(', ')}`), - 'superdough', - ); - return { targetParams: [], paramName }; - } - const audioParams = []; - targetNodes.forEach((targetNode) => { - const targetParam = _getNodeParam(targetNode, paramName); - audioParams.push(targetParam); - }); - return { targetParams: audioParams, paramName }; -} - -function connectLFO(idx, params, nodeTracker) { - const { rate = 1, sync, cps, cycle, control = 'lfo', subControl, depth = 1, depthabs, ...filteredParams } = params; - const { targetParams, paramName } = _getTargetParamsForControl(control, nodeTracker, subControl); - if (!targetParams.length) return; - let currentValue = targetParams[0].value; - currentValue = currentValue === 0 ? 1 : currentValue; - const { min, max } = _getRangeForParam(paramName, currentValue); - const depthValue = depthabs != null ? depthabs : depth * currentValue; - const modParams = { - ...filteredParams, - frequency: sync !== undefined ? sync * cps : rate, - time: cycle / cps, - depth: depthValue, - min, - max, - }; - const lfoNode = getLfo(getAudioContext(), modParams); - nodeTracker[`lfo${idx}`] = [lfoNode]; - targetParams.forEach((t) => lfoNode.connect(t)); - return lfoNode; -} - -function connectEnvelope(idx, params, nodeTracker) { - const { control, subControl, acurve, dcurve, rcurve, depth = 1, depthabs, ...filteredParams } = params; - const { targetParams, paramName } = _getTargetParamsForControl(control, nodeTracker, subControl); - if (!targetParams.length) return; - let currentValue = targetParams[0].value; - currentValue = currentValue === 0 ? 1 : currentValue; - const { min, max } = _getRangeForParam(paramName, currentValue); - const depthValue = depthabs != null ? depthabs : depth * currentValue; - const envNode = getEnvelope(getAudioContext(), { - ...filteredParams, - depth: depthValue, - min, - max, - attackCurve: acurve, - decayCurve: dcurve, - releaseCurve: rcurve, - }); - nodeTracker[`env${idx}`] = [envNode]; - targetParams.forEach((t) => envNode.connect(t)); - return envNode; -} - -function connectBusModulator(params, nodeTracker) { - const ac = getAudioContext(); - const { control, subControl, depth = 1, depthabs } = params; - const { targetParams, paramName } = _getTargetParamsForControl(control, nodeTracker, subControl); - if (!targetParams.length) return { toCleanup: [] }; - const signal = controller.getBus(params.bus); - const dc = new ConstantSourceNode(ac, { offset: params.dc ?? 0 }); - dc.start(params.begin); - const shifted = dc.connect(gainNode(1)); - signal.connect(shifted); - let currentValue = targetParams[0].value; - currentValue = currentValue === 0 ? 1 : currentValue; - const { min, max } = _getRangeForParam(paramName, currentValue); - const depthValue = depthabs != null ? depthabs : depth * currentValue; - const maxAbsDepth = Math.min(Math.abs(min), Math.abs(max)); - const boundedDepth = Math.min(Math.abs(depthValue), maxAbsDepth) || Math.abs(depthValue); - const modulator = shifted.connect(gainNode((Math.sign(depthValue) * boundedDepth) / 0.3)); - webAudioTimeout( - ac, - () => { - targetParams.forEach((t) => modulator.connect(t)); - }, - 0, - params.begin, - ); - return { modulator, toCleanup: [dc, shifted, modulator] }; -} - let activeSoundSources = new Map(); //music programs/audio gear usually increments inputs/outputs from 1, we need to subtract 1 from the input because the webaudio API channels start at 0 @@ -1038,7 +906,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) } if (value.bmod) { for (const p of value.bmod) { - const { toCleanup } = connectBusModulator({ ...p, begin: t, end: endWithRelease }, nodes); + const { toCleanup } = connectBusModulator({ ...p, begin: t, end: endWithRelease }, nodes, controller); audioNodes.push(...toCleanup); } } diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index 4523e9e89..8001c7da8 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -1055,8 +1055,7 @@ class EnvelopeProcessor extends AudioWorkletProcessor { this.state = (this.state + 1) % states.length; time = states[this.state].time; } - const clamped = clamp(this.val * depth, min, max); - out[i] = clamped; + out[i] = clamp(this.val * depth, min, max); } return true; } From 680b7d78ec3fb5ab89ca27c56a9695519f564cec Mon Sep 17 00:00:00 2001 From: Aria Date: Mon, 29 Dec 2025 12:59:48 -0600 Subject: [PATCH 297/312] Lots of examples; use id instead of index; waveshaper clamping; one mode for synth --- packages/core/controls.mjs | 110 ++++++++++++++++++---- packages/superdough/modulators.mjs | 35 ++++--- packages/superdough/superdough.mjs | 15 +-- packages/superdough/synth.mjs | 15 ++- test/__snapshots__/examples.test.mjs.snap | 90 ++++++++++++++++++ test/examples.test.mjs | 1 + 6 files changed, 228 insertions(+), 38 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 5cc53de60..1bf3fa85c 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -2869,8 +2869,8 @@ registerSubControls('bmod', [ ['dc'], ]); -Pattern.prototype.modulate = function (type, config, idx) { - config ??= { control: undefined }; +Pattern.prototype.modulate = function (type, config, id) { + config = { control: undefined, ...config }; const modulatorKeys = ['lfo', 'env', 'bmod']; if (!modulatorKeys.includes(type)) { logger(`[core] Modulation type ${type} not found. Please use one of 'lfo', 'env', 'bmod'`); @@ -2888,19 +2888,20 @@ Pattern.prototype.modulate = function (type, config, idx) { // e.g. pat.gain(0.5).lfo({..}) will be a gain-LFO let control = getControlName(Object.keys(v).at(-1)); if (modulatorKeys.includes(control)) { - control = `${control}${v[control].length - 1}`; + control = `${control}_${[...v[control].__ids].at(-1)}`; } defaultValue = control; } - v[type] ??= []; + v[type] ??= { __ids: new Set() }; const t = v[type]; - idx ??= t.length; - t[idx] ??= { control: defaultValue }; + id ??= t.__ids.size; + t[id] ??= { control: defaultValue }; + t.__ids.add(id); // keeps track of insertion order if (c === undefined) return v; if (key === 'control' || key === 'subControl') { - t[idx][key] = getControlName(c); + t[id][key] = getControlName(c); } else { - t[idx][key] = c; + t[id][key] = c; } return v; }) @@ -2910,10 +2911,16 @@ Pattern.prototype.modulate = function (type, config, idx) { }; /** - * Configures an LFO. Can be called in sequence like pat.lfo(...).lfo(...) to set up multiple LFOs + * Configures an LFO. Can be called in sequence like pat.lfo(...).lfo(...) to set up multiple LFOs. + * There are two ways to declare which control will be modulated: + * 1. Explicitly put `control` in the config (e.g. `lfo({ c: "lpf" })`) + * 2. If the control parameter is absent, the control _immediately before_ the `lfo` call will be used + * (e.g. `s("saw").lpf(500).lfo()` to modulate `lpf`) + * + * Modulators can be referred to by `id` so that they can be updated later e.g. inside + * a `sometimes`. See example below. * * @name lfo - * @memberof Pattern * @param {Object} config LFO configuration. * @param {string | Pattern} [config.control] Node to modulate. Aliases: t * @param {string | Pattern} [config.subControl] Sub-control name to append to the control key. Aliases: sc, p @@ -2925,18 +2932,47 @@ Pattern.prototype.modulate = function (type, config, idx) { * @param {number | Pattern} [config.skew] Skew amount. Aliases: sk * @param {number | Pattern} [config.curve] Exponential curve amount. Aliases: c * @param {number | Pattern} [config.sync] Tempo-synced modulation rate. Aliases: s + * @param {string | Pattern} id ID to use for this modulator * @returns Pattern + * + * @example + * s("saw").note("F1").lpf(500).lfo() + * + * @example + * s("saw").lfo().lpf(500).lfo({ s: 0.3 }) + * + * @example + * s("saw").lpf(500).diode(0.3) + * .lfo({ c: "lpf" }) + * + * @example + * s("pulse").lpf(500).lfo() + * .lfo({ c: "s" }) + * .diode(0.3) + * .sometimes(x => x.lfo({ s: "8" }, 1)) // lfo #1 (0-indexed) + * + * @example + * s("pulse").lpf(500).lfo({ depth: 4 }, 'lpf_mod') + * .lfo({ c: "s" }) + * .diode(0.3) + * .sometimes(x => x.lfo({ s: "8" }, 'lpf_mod')) */ -Pattern.prototype.lfo = function (config, idx) { - return this.modulate('lfo', config, idx); +Pattern.prototype.lfo = function (config, id) { + return this.modulate('lfo', config, id); }; export const lfo = (config) => pure({}).lfo(config); /** * Configures an envelope. Can be called in sequence like pat.env(...).env(...) to set up multiple envelopes + * There are two ways to declare which control will be modulated: + * 1. Explicitly put `control` in the config (e.g. `env({ c: "lpf" })`) + * 2. If the control parameter is absent, the control _immediately before_ the `env` call will be used + * (e.g. `s("saw").lpf(500).env({ a: 1 })` to modulate `lpf`) + * + * Modulators can be referred to by `id` so that they can be updated later e.g. inside + * a `sometimes`. See example below. * * @name env - * @memberof Pattern * @param {Object} config Envelope configuration. * @param {string | Pattern} [config.control] Node to modulate. Aliases: t * @param {string | Pattern} [config.subControl] Sub-control name to append to the control key. Aliases: sc, p @@ -2949,10 +2985,35 @@ export const lfo = (config) => pure({}).lfo(config); * @param {number | Pattern} [config.acurve] Snappiness of attack curve (-1 = relaxed, 1 = snappy). Aliases: ac * @param {number | Pattern} [config.dcurve] Snappiness of decay curve (-1 = relaxed, 1 = snappy). Aliases: dc * @param {number | Pattern} [config.rcurve] Snappiness of release curve (-1 = relaxed, 1 = snappy). Aliases: rc + * @param {string | Pattern} id ID to use for this modulator * @returns Pattern + * + * @example + * s("saw").note("F1").lpf(500).env({ a: 1 }) + * + * @example + * s("saw").env({ d: 1 }).note("F1") + * .lpq(4).lpf(50) + * .env({ a: 0.1, d: 1, ac: 0.8, dc: 0.3, depth: 50 }) + * + * @example + * s("saw").lpf(500).diode(0.3) + * .env({ c: "lpf", a: 0.5, d: 0.5 }) + * + * @example + * s("pulse").lpf(500).env({ a: 1 }) + * .env({ c: "s", a: 1 }) + * .diode(0.3) + * .sometimes(x => x.env({ a: "0.5" }, 1)) // envelope #1 (0-indexed) + * + * @example + * s("pulse").lpf(500).env({ a: 1 }, 'lpf_mod') + * .env({ c: "s", a: 1 }) + * .diode(0.3) + * .sometimes(x => x.env({ a: "0.5" }, 'lpf_mod')) */ -Pattern.prototype.env = function (config, idx) { - return this.modulate('env', config, idx); +Pattern.prototype.env = function (config, id) { + return this.modulate('env', config, id); }; export const env = (config) => pure({}).env(config); @@ -2962,8 +3023,15 @@ export const env = (config) => pure({}).env(config); * * Send to an audio bus with `otherPat.bus(..)`. * + * There are two ways to declare which control will be modulated: + * 1. Explicitly put `control` in the config (e.g. `bmod({ id: 2, c: "lpf" })`) + * 2. If the control parameter is absent, the control _immediately before_ the `bmod` call will be used + * (e.g. `s("saw").lpf(500).bmod({ id: 2 })` to modulate `lpf`) + * + * Modulators can be referred to by `id` so that they can be updated later e.g. inside + * a `sometimes`. See example below. + * * @name bmod - * @memberof Pattern * @param {Object} config Bus modulation configuration. * @param {string | Pattern} [config.bus] Bus to get modulation signal from * @param {string | Pattern} [config.control] Node to modulate. Aliases: t @@ -2971,10 +3039,16 @@ export const env = (config) => pure({}).env(config); * @param {number | Pattern} [config.depth] Relative modulation depth. Aliases: dep, dr * @param {number | Pattern} [config.depthabs] Absolute modulation depth. Aliases: da * @param {number | Pattern} [config.dc] DC offset prior to application + * @param {string | Pattern} id ID to use for this modulator * @returns Pattern + * + * @example + * modulator: s("one").seg(64).gain(slider(0, 0, 1)).bus(1).dry(0) + * carrier: s("saw").bmod({ b: 1 }) + * */ -Pattern.prototype.bmod = function (config, idx) { - return this.modulate('bmod', config, idx); +Pattern.prototype.bmod = function (config, id) { + return this.modulate('bmod', config, id); }; export const bmod = (config) => pure({}).bmod(config); diff --git a/packages/superdough/modulators.mjs b/packages/superdough/modulators.mjs index 3411aacb7..32ebae265 100644 --- a/packages/superdough/modulators.mjs +++ b/packages/superdough/modulators.mjs @@ -8,6 +8,7 @@ import { getAudioContext } from './audioContext.mjs'; import { gainNode, getEnvelope, getLfo, webAudioTimeout } from './helpers.mjs'; import { errorLogger } from './logger.mjs'; import { getSuperdoughControlTargets } from './superdoughdata.mjs'; +import { clamp } from './util.mjs'; const getNodeParam = (node, name) => { // Worklet case @@ -27,9 +28,8 @@ const getNodeParam = (node, name) => { const controlTargets = getSuperdoughControlTargets(); -const stripIndex = (control) => control?.replace(/\d+$/, ''); const getControlData = (control) => { - return controlTargets[stripIndex(control)]; + return controlTargets[control.split('_')[0]]; }; const getRangeForParam = (paramName, currentValue) => { @@ -41,6 +41,19 @@ const getRangeForParam = (paramName, currentValue) => { return { min: undefined, max: undefined }; }; +const clampWithWaveShaper = (modulator, min, max) => { + const ac = getAudioContext(); + const curve = new Float32Array(256); + for (let i = 0; i < curve.length; i++) { + const x = (i / (curve.length - 1)) * 2 - 1; + curve[i] = clamp(x * max, min, max); + } + const shaper = new WaveShaperNode(ac, { curve }); + const scaleGain = gainNode(1 / max); + modulator.connect(scaleGain).connect(shaper); + return { modulator, toCleanup: [shaper, scaleGain] }; +}; + const getTargetParamsForControl = (control, nodes, subControl) => { const lookupKey = subControl ? `${control}_${subControl}` : control; const targetInfo = getControlData(lookupKey) ?? getControlData(control); @@ -67,7 +80,7 @@ const getTargetParamsForControl = (control, nodes, subControl) => { return { targetParams: audioParams, paramName }; }; -export const connectLFO = (idx, params, nodeTracker) => { +export const connectLFO = (id, params, nodeTracker) => { const { rate = 1, sync, cps, cycle, control = 'lfo', subControl, depth = 1, depthabs, ...filteredParams } = params; const { targetParams, paramName } = getTargetParamsForControl(control, nodeTracker, subControl); if (!targetParams.length) return; @@ -84,12 +97,12 @@ export const connectLFO = (idx, params, nodeTracker) => { max, }; const lfoNode = getLfo(getAudioContext(), modParams); - nodeTracker[`lfo${idx}`] = [lfoNode]; + nodeTracker[`lfo_${id}`] = [lfoNode]; targetParams.forEach((t) => lfoNode.connect(t)); return lfoNode; }; -export const connectEnvelope = (idx, params, nodeTracker) => { +export const connectEnvelope = (id, params, nodeTracker) => { const { control, subControl, acurve, dcurve, rcurve, depth = 1, depthabs, ...filteredParams } = params; const { targetParams, paramName } = getTargetParamsForControl(control, nodeTracker, subControl); if (!targetParams.length) return; @@ -106,7 +119,7 @@ export const connectEnvelope = (idx, params, nodeTracker) => { decayCurve: dcurve, releaseCurve: rcurve, }); - nodeTracker[`env${idx}`] = [envNode]; + nodeTracker[`env_${id}`] = [envNode]; targetParams.forEach((t) => envNode.connect(t)); return envNode; }; @@ -122,13 +135,12 @@ export const connectBusModulator = (params, nodeTracker, controller) => { const shifted = dc.connect(gainNode(1)); signal.connect(shifted); let currentValue = targetParams[0].value; - debugger; currentValue = currentValue === 0 ? 1 : currentValue; const { min, max } = getRangeForParam(paramName, currentValue); const depthValue = depthabs != null ? depthabs : depth * currentValue; - const maxAbsDepth = Math.min(Math.abs(min), Math.abs(max)); - const boundedDepth = Math.min(Math.abs(depthValue), maxAbsDepth) || Math.abs(depthValue); - const modulator = shifted.connect(gainNode((Math.sign(depthValue) * boundedDepth) / 0.3)); + const depthGain = gainNode((Math.sign(depthValue) * Math.abs(depthValue)) / 0.3); + const unClamped = shifted.connect(depthGain); + let { modulator, toCleanup } = clampWithWaveShaper(unClamped, min, max); webAudioTimeout( ac, () => { @@ -137,5 +149,6 @@ export const connectBusModulator = (params, nodeTracker, controller) => { 0, params.begin, ); - return { modulator, toCleanup: [dc, shifted, modulator] }; + toCleanup.push(dc, shifted, depthGain); + return { modulator, toCleanup }; }; diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 517b1d3e5..ee0cec836 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -875,9 +875,10 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) // finally, now that `nodes` is populated, set up modulators if (value.lfo) { - for (const [idx, params] of Object.entries(value.lfo)) { + for (const id of value.lfo.__ids) { + const params = value.lfo[id]; const lfo = connectLFO( - idx, + id, { ...params, cps, @@ -891,9 +892,10 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) } } if (value.env) { - for (const [idx, params] of Object.entries(value.env)) { + for (const id of value.env.__ids) { + const params = value.env[id]; const env = connectEnvelope( - idx, + id, { ...params, begin: t, @@ -905,8 +907,9 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) } } if (value.bmod) { - for (const p of value.bmod) { - const { toCleanup } = connectBusModulator({ ...p, begin: t, end: endWithRelease }, nodes, controller); + for (const id of value.bmod.__ids) { + const params = value.bmod[id]; + const { toCleanup } = connectBusModulator({ ...params, begin: t, end: endWithRelease }, nodes, controller); audioNodes.push(...toCleanup); } } diff --git a/packages/superdough/synth.mjs b/packages/superdough/synth.mjs index d20692729..6c8d1fea9 100644 --- a/packages/superdough/synth.mjs +++ b/packages/superdough/synth.mjs @@ -19,7 +19,7 @@ import { import { logger } from './logger.mjs'; import { getNoiseMix, getNoiseOscillator } from './noise.mjs'; -const waveforms = ['triangle', 'square', 'sawtooth', 'sine', 'user']; +const waveforms = ['triangle', 'square', 'sawtooth', 'sine', 'user', 'one']; const waveformAliases = [ ['tri', 'triangle'], ['sqr', 'square'], @@ -508,8 +508,17 @@ export function getOscillator(s, t, value, onended) { s = 'triangle'; } s = s === 'user' && !partials ? 'triangle' : s; - // If no partials are given, use stock waveforms - if (!partials || partials?.length === 0 || s === 'sine') { + if (s === 'one') { + // Constant 1 oscillator (used for modulation) + o = new ConstantSourceNode(getAudioContext(), { offset: 1 }); + o.start(t); + return { + node: o, + nodes: { source: o }, + stop: (time) => o?.stop(time), + }; + } else if (!partials || partials?.length === 0 || s === 'sine') { + // If no partials are given, use stock waveforms o = getAudioContext().createOscillator(); o.type = s || 'triangle'; } diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 5f8133ec5..61ab11866 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -3803,6 +3803,51 @@ exports[`runs examples > example "end" example index 0 1`] = ` ] `; +exports[`runs examples > example "env" example index 0 1`] = ` +[ + "[ 0/1 → 1/1 | s:saw note:F1 cutoff:500 env:{0:{control:cutoff attack:1} __ids:{}} ]", + "[ 1/1 → 2/1 | s:saw note:F1 cutoff:500 env:{0:{control:cutoff attack:1} __ids:{}} ]", + "[ 2/1 → 3/1 | s:saw note:F1 cutoff:500 env:{0:{control:cutoff attack:1} __ids:{}} ]", + "[ 3/1 → 4/1 | s:saw note:F1 cutoff:500 env:{0:{control:cutoff attack:1} __ids:{}} ]", +] +`; + +exports[`runs examples > example "env" example index 1 1`] = ` +[ + "[ 0/1 → 1/1 | s:saw env:{0:{control:s decay:1} 1:{control:cutoff attack:0.1 decay:1 acurve:0.8 dcurve:0.3 depth:50} __ids:{}} note:F1 resonance:4 cutoff:50 ]", + "[ 1/1 → 2/1 | s:saw env:{0:{control:s decay:1} 1:{control:cutoff attack:0.1 decay:1 acurve:0.8 dcurve:0.3 depth:50} __ids:{}} note:F1 resonance:4 cutoff:50 ]", + "[ 2/1 → 3/1 | s:saw env:{0:{control:s decay:1} 1:{control:cutoff attack:0.1 decay:1 acurve:0.8 dcurve:0.3 depth:50} __ids:{}} note:F1 resonance:4 cutoff:50 ]", + "[ 3/1 → 4/1 | s:saw env:{0:{control:s decay:1} 1:{control:cutoff attack:0.1 decay:1 acurve:0.8 dcurve:0.3 depth:50} __ids:{}} note:F1 resonance:4 cutoff:50 ]", +] +`; + +exports[`runs examples > example "env" example index 2 1`] = ` +[ + "[ 0/1 → 1/1 | s:saw cutoff:500 distort:0.3 distortvol:1 distorttype:diode env:{0:{control:cutoff attack:0.5 decay:0.5} __ids:{}} ]", + "[ 1/1 → 2/1 | s:saw cutoff:500 distort:0.3 distortvol:1 distorttype:diode env:{0:{control:cutoff attack:0.5 decay:0.5} __ids:{}} ]", + "[ 2/1 → 3/1 | s:saw cutoff:500 distort:0.3 distortvol:1 distorttype:diode env:{0:{control:cutoff attack:0.5 decay:0.5} __ids:{}} ]", + "[ 3/1 → 4/1 | s:saw cutoff:500 distort:0.3 distortvol:1 distorttype:diode env:{0:{control:cutoff attack:0.5 decay:0.5} __ids:{}} ]", +] +`; + +exports[`runs examples > example "env" example index 3 1`] = ` +[ + "[ 0/1 → 1/1 | s:pulse cutoff:500 env:{0:{control:cutoff attack:1} 1:{control:s attack:0.5} __ids:{}} distort:0.3 distortvol:1 distorttype:diode ]", + "[ 1/1 → 2/1 | s:pulse cutoff:500 env:{0:{control:cutoff attack:1} 1:{control:s attack:1} __ids:{}} distort:0.3 distortvol:1 distorttype:diode ]", + "[ 2/1 → 3/1 | s:pulse cutoff:500 env:{0:{control:cutoff attack:1} 1:{control:s attack:1} __ids:{}} distort:0.3 distortvol:1 distorttype:diode ]", + "[ 3/1 → 4/1 | s:pulse cutoff:500 env:{0:{control:cutoff attack:1} 1:{control:s attack:0.5} __ids:{}} distort:0.3 distortvol:1 distorttype:diode ]", +] +`; + +exports[`runs examples > example "env" example index 4 1`] = ` +[ + "[ 0/1 → 1/1 | s:pulse cutoff:500 env:{1:{control:s attack:1} __ids:{} lpf_mod:{control:cutoff attack:0.5}} distort:0.3 distortvol:1 distorttype:diode ]", + "[ 1/1 → 2/1 | s:pulse cutoff:500 env:{1:{control:s attack:1} __ids:{} lpf_mod:{control:cutoff attack:1}} distort:0.3 distortvol:1 distorttype:diode ]", + "[ 2/1 → 3/1 | s:pulse cutoff:500 env:{1:{control:s attack:1} __ids:{} lpf_mod:{control:cutoff attack:1}} distort:0.3 distortvol:1 distorttype:diode ]", + "[ 3/1 → 4/1 | s:pulse cutoff:500 env:{1:{control:s attack:1} __ids:{} lpf_mod:{control:cutoff attack:0.5}} distort:0.3 distortvol:1 distorttype:diode ]", +] +`; + exports[`runs examples > example "euclid" example index 0 1`] = ` [ "[ 0/1 → 1/8 | note:c3 ]", @@ -6113,6 +6158,51 @@ exports[`runs examples > example "leslie" example index 0 1`] = ` ] `; +exports[`runs examples > example "lfo" example index 0 1`] = ` +[ + "[ 0/1 → 1/1 | s:saw note:F1 cutoff:500 lfo:{0:{control:cutoff} __ids:{}} ]", + "[ 1/1 → 2/1 | s:saw note:F1 cutoff:500 lfo:{0:{control:cutoff} __ids:{}} ]", + "[ 2/1 → 3/1 | s:saw note:F1 cutoff:500 lfo:{0:{control:cutoff} __ids:{}} ]", + "[ 3/1 → 4/1 | s:saw note:F1 cutoff:500 lfo:{0:{control:cutoff} __ids:{}} ]", +] +`; + +exports[`runs examples > example "lfo" example index 1 1`] = ` +[ + "[ 0/1 → 1/1 | s:saw lfo:{0:{control:s} 1:{control:cutoff sync:0.3} __ids:{}} cutoff:500 ]", + "[ 1/1 → 2/1 | s:saw lfo:{0:{control:s} 1:{control:cutoff sync:0.3} __ids:{}} cutoff:500 ]", + "[ 2/1 → 3/1 | s:saw lfo:{0:{control:s} 1:{control:cutoff sync:0.3} __ids:{}} cutoff:500 ]", + "[ 3/1 → 4/1 | s:saw lfo:{0:{control:s} 1:{control:cutoff sync:0.3} __ids:{}} cutoff:500 ]", +] +`; + +exports[`runs examples > example "lfo" example index 2 1`] = ` +[ + "[ 0/1 → 1/1 | s:saw cutoff:500 distort:0.3 distortvol:1 distorttype:diode lfo:{0:{control:cutoff} __ids:{}} ]", + "[ 1/1 → 2/1 | s:saw cutoff:500 distort:0.3 distortvol:1 distorttype:diode lfo:{0:{control:cutoff} __ids:{}} ]", + "[ 2/1 → 3/1 | s:saw cutoff:500 distort:0.3 distortvol:1 distorttype:diode lfo:{0:{control:cutoff} __ids:{}} ]", + "[ 3/1 → 4/1 | s:saw cutoff:500 distort:0.3 distortvol:1 distorttype:diode lfo:{0:{control:cutoff} __ids:{}} ]", +] +`; + +exports[`runs examples > example "lfo" example index 3 1`] = ` +[ + "[ 0/1 → 1/1 | s:pulse cutoff:500 lfo:{0:{control:cutoff} 1:{control:s sync:8} __ids:{}} distort:0.3 distortvol:1 distorttype:diode ]", + "[ 1/1 → 2/1 | s:pulse cutoff:500 lfo:{0:{control:cutoff} 1:{control:s} __ids:{}} distort:0.3 distortvol:1 distorttype:diode ]", + "[ 2/1 → 3/1 | s:pulse cutoff:500 lfo:{0:{control:cutoff} 1:{control:s} __ids:{}} distort:0.3 distortvol:1 distorttype:diode ]", + "[ 3/1 → 4/1 | s:pulse cutoff:500 lfo:{0:{control:cutoff} 1:{control:s sync:8} __ids:{}} distort:0.3 distortvol:1 distorttype:diode ]", +] +`; + +exports[`runs examples > example "lfo" example index 4 1`] = ` +[ + "[ 0/1 → 1/1 | s:pulse cutoff:500 lfo:{1:{control:s} __ids:{} lpf_mod:{control:cutoff depth:4 sync:8}} distort:0.3 distortvol:1 distorttype:diode ]", + "[ 1/1 → 2/1 | s:pulse cutoff:500 lfo:{1:{control:s} __ids:{} lpf_mod:{control:cutoff depth:4}} distort:0.3 distortvol:1 distorttype:diode ]", + "[ 2/1 → 3/1 | s:pulse cutoff:500 lfo:{1:{control:s} __ids:{} lpf_mod:{control:cutoff depth:4}} distort:0.3 distortvol:1 distorttype:diode ]", + "[ 3/1 → 4/1 | s:pulse cutoff:500 lfo:{1:{control:s} __ids:{} lpf_mod:{control:cutoff depth:4 sync:8}} distort:0.3 distortvol:1 distorttype:diode ]", +] +`; + exports[`runs examples > example "linger" example index 0 1`] = ` [ "[ 0/1 → 1/4 | s:lt ]", diff --git a/test/examples.test.mjs b/test/examples.test.mjs index 896a02f8a..ebec2252e 100644 --- a/test/examples.test.mjs +++ b/test/examples.test.mjs @@ -20,6 +20,7 @@ const skippedExamples = [ 'accelerationX', 'defaultmidimap', 'midimaps', + 'bmod', ]; describe('runs examples', () => { From 0edede106aaf44194c53348658991ccd9391af44 Mon Sep 17 00:00:00 2001 From: Aria Date: Mon, 29 Dec 2025 13:28:26 -0600 Subject: [PATCH 298/312] Fixes for zzfx and soundfonts --- packages/superdough/modulators.mjs | 6 +++++- packages/superdough/zzfx.mjs | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/superdough/modulators.mjs b/packages/superdough/modulators.mjs index 32ebae265..96c68d4bf 100644 --- a/packages/superdough/modulators.mjs +++ b/packages/superdough/modulators.mjs @@ -19,7 +19,11 @@ const getNodeParam = (node, name) => { } } // Built-in node case - const p = node?.[name]; + let p = node?.[name]; + if (p === undefined && name === 'frequency') { + // Fallbacks for source nodes without 'frequency' params (e.g. soundfonts) + p = node?.['detune'] ?? node?.['playbackRate']; + } if (p instanceof AudioParam) { return p; } diff --git a/packages/superdough/zzfx.mjs b/packages/superdough/zzfx.mjs index f3dc710b1..3d6b8e9f5 100644 --- a/packages/superdough/zzfx.mjs +++ b/packages/superdough/zzfx.mjs @@ -75,7 +75,6 @@ export const getZZFX = (value, t) => { source.start(t); return { node: source, - nodes: { source: [source] }, }; }; @@ -91,6 +90,7 @@ export function registerZZFXSounds() { }); return { node: o, + nodes: { source: [o] }, stop: () => {}, }; }, From 6051b922c065175c3c64b5ea34d736ffb16a445c Mon Sep 17 00:00:00 2001 From: Aria Date: Mon, 29 Dec 2025 14:45:49 -0600 Subject: [PATCH 299/312] Fix clamping when min/max not specified --- packages/superdough/modulators.mjs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/superdough/modulators.mjs b/packages/superdough/modulators.mjs index 96c68d4bf..7a1fe252d 100644 --- a/packages/superdough/modulators.mjs +++ b/packages/superdough/modulators.mjs @@ -144,7 +144,13 @@ export const connectBusModulator = (params, nodeTracker, controller) => { const depthValue = depthabs != null ? depthabs : depth * currentValue; const depthGain = gainNode((Math.sign(depthValue) * Math.abs(depthValue)) / 0.3); const unClamped = shifted.connect(depthGain); - let { modulator, toCleanup } = clampWithWaveShaper(unClamped, min, max); + const toCleanup = []; + let modulator = unClamped; + if (min !== undefined && max !== undefined) { + const wsData = clampWithWaveShaper(unClamped, min, max); + modulator = wsData.modulator; + toCleanup.push(...wsData.toCleanup); + } webAudioTimeout( ac, () => { From d41ebf190b6c36d6124cb5af17f78f77e056ab66 Mon Sep 17 00:00:00 2001 From: eddyflux Date: Tue, 30 Dec 2025 00:22:51 +0100 Subject: [PATCH 300/312] fix: missing punctuation --- website/src/pages/workshop/first-sounds.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/src/pages/workshop/first-sounds.mdx b/website/src/pages/workshop/first-sounds.mdx index 1d659972b..84deb0551 100644 --- a/website/src/pages/workshop/first-sounds.mdx +++ b/website/src/pages/workshop/first-sounds.mdx @@ -377,4 +377,4 @@ insect [crow metal] - -, punchcard /> -Now that we know the basics of how to make beats, let's look at how we can play [notes](/workshop/first-notes) +Now that we know the basics of how to make beats, let's look at how we can play [notes](/workshop/first-notes). From aec33710b751b84c7d65ce22caea24ed34a813c1 Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 31 Dec 2025 14:58:31 -0600 Subject: [PATCH 301/312] Working version --- packages/core/controls.mjs | 8 + packages/core/pattern.mjs | 16 + packages/superdough/feedbackdelay.mjs | 19 +- packages/superdough/modulators.mjs | 27 +- packages/superdough/reverbGen.mjs | 6 +- packages/superdough/superdough.mjs | 746 ++++++++++++++------------ 6 files changed, 472 insertions(+), 350 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 1bf3fa85c..b18a8dff6 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -2846,6 +2846,7 @@ registerSubControls('lfo', [ ['skew', 'sk'], ['curve'], ['sync', 's'], + ['fxi'], ]); registerSubControls('env', [ ['control', 'c'], @@ -2859,6 +2860,7 @@ registerSubControls('env', [ ['acurve', 'ac'], ['dcurve', 'dc'], ['rcurve', 'rc'], + ['fxi'], ]); registerSubControls('bmod', [ ['bus', 'b'], @@ -2867,6 +2869,7 @@ registerSubControls('bmod', [ ['depth', 'dep', 'dr'], ['depthabs', 'da'], ['dc'], + ['fxi'], ]); Pattern.prototype.modulate = function (type, config, id) { @@ -2932,6 +2935,7 @@ Pattern.prototype.modulate = function (type, config, id) { * @param {number | Pattern} [config.skew] Skew amount. Aliases: sk * @param {number | Pattern} [config.curve] Exponential curve amount. Aliases: c * @param {number | Pattern} [config.sync] Tempo-synced modulation rate. Aliases: s + * @param {number | Pattern} [config.fxi] FX index to target * @param {string | Pattern} id ID to use for this modulator * @returns Pattern * @@ -2985,6 +2989,7 @@ export const lfo = (config) => pure({}).lfo(config); * @param {number | Pattern} [config.acurve] Snappiness of attack curve (-1 = relaxed, 1 = snappy). Aliases: ac * @param {number | Pattern} [config.dcurve] Snappiness of decay curve (-1 = relaxed, 1 = snappy). Aliases: dc * @param {number | Pattern} [config.rcurve] Snappiness of release curve (-1 = relaxed, 1 = snappy). Aliases: rc + * @param {number | Pattern} [config.fxi] FX index to target * @param {string | Pattern} id ID to use for this modulator * @returns Pattern * @@ -3039,6 +3044,7 @@ export const env = (config) => pure({}).env(config); * @param {number | Pattern} [config.depth] Relative modulation depth. Aliases: dep, dr * @param {number | Pattern} [config.depthabs] Absolute modulation depth. Aliases: da * @param {number | Pattern} [config.dc] DC offset prior to application + * @param {number | Pattern} [config.fxi] FX index to target * @param {string | Pattern} id ID to use for this modulator * @returns Pattern * @@ -3065,3 +3071,5 @@ export const bmod = (config) => pure({}).bmod(config); * s("hh*16").bank("tr909").transient("<-1:1 1:-1>") */ export const { transient } = registerControl(['transient', 'transsustain']); + +export const { FXrelease, FXrel, FXr, fxr } = registerControl('FXrelease', 'FXrel', 'FXr', 'fxr'); diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index 6f214386f..e6169399a 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -3721,3 +3721,19 @@ Pattern.prototype.phases = function (list) { export const phases = (list) => { return _ensureListPattern(list).as('phases'); }; + +/** + * Establishes an FX chain. Can be called by chaining .FX().FX().. + * calls and/or in a single .FX(, , ..) call. The , .. are _patterns_ which + * establish the controls of the given effect. See examples. + * @name FX + * @memberof Pattern + * @returns Pattern + */ +Pattern.prototype.FX = function (...effects) { + effects = effects.map(reify); + return this.withValue((v) => (vEff) => { + const currFX = v.FX ?? []; + return { ...v, FX: currFX.concat(vEff) }; + }).appLeft(parray(effects)); +}; diff --git a/packages/superdough/feedbackdelay.mjs b/packages/superdough/feedbackdelay.mjs index b8269bc02..387176134 100644 --- a/packages/superdough/feedbackdelay.mjs +++ b/packages/superdough/feedbackdelay.mjs @@ -5,19 +5,18 @@ if (typeof DelayNode !== 'undefined') { wet = Math.abs(wet); this.delayTime.value = time; - const feedbackGain = ac.createGain(); - feedbackGain.gain.value = Math.min(Math.abs(feedback), 0.995); - this.feedback = feedbackGain.gain; + this.feedbackGain = ac.createGain(); + this.feedbackGain.gain.value = Math.min(Math.abs(feedback), 0.995); + this.feedback = this.feedbackGain.gain; - const delayGain = ac.createGain(); - delayGain.gain.value = wet; - this.delayGain = delayGain; + this.delayGain = ac.createGain(); + this.delayGain.gain.value = wet; - this.connect(feedbackGain); - this.connect(delayGain); - feedbackGain.connect(this); + this.connect(this.feedbackGain); + this.connect(this.delayGain); + this.feedbackGain.connect(this); - this.connect = (target) => delayGain.connect(target); + this.connect = (target) => this.delayGain.connect(target); return this; } start(t) { diff --git a/packages/superdough/modulators.mjs b/packages/superdough/modulators.mjs index 7a1fe252d..2b6fcf334 100644 --- a/packages/superdough/modulators.mjs +++ b/packages/superdough/modulators.mjs @@ -85,8 +85,19 @@ const getTargetParamsForControl = (control, nodes, subControl) => { }; export const connectLFO = (id, params, nodeTracker) => { - const { rate = 1, sync, cps, cycle, control = 'lfo', subControl, depth = 1, depthabs, ...filteredParams } = params; - const { targetParams, paramName } = getTargetParamsForControl(control, nodeTracker, subControl); + const { + rate = 1, + sync, + cps, + cycle, + control = 'lfo', + subControl, + fxi = 'main', + depth = 1, + depthabs, + ...filteredParams + } = params; + const { targetParams, paramName } = getTargetParamsForControl(control, nodeTracker[fxi], subControl); if (!targetParams.length) return; let currentValue = targetParams[0].value; currentValue = currentValue === 0 ? 1 : currentValue; @@ -101,14 +112,14 @@ export const connectLFO = (id, params, nodeTracker) => { max, }; const lfoNode = getLfo(getAudioContext(), modParams); - nodeTracker[`lfo_${id}`] = [lfoNode]; + nodeTracker[0][`lfo_${id}`] = [lfoNode]; targetParams.forEach((t) => lfoNode.connect(t)); return lfoNode; }; export const connectEnvelope = (id, params, nodeTracker) => { - const { control, subControl, acurve, dcurve, rcurve, depth = 1, depthabs, ...filteredParams } = params; - const { targetParams, paramName } = getTargetParamsForControl(control, nodeTracker, subControl); + const { control, subControl, acurve, dcurve, rcurve, depth = 1, depthabs, fxi = 'main', ...filteredParams } = params; + const { targetParams, paramName } = getTargetParamsForControl(control, nodeTracker[fxi], subControl); if (!targetParams.length) return; let currentValue = targetParams[0].value; currentValue = currentValue === 0 ? 1 : currentValue; @@ -123,15 +134,15 @@ export const connectEnvelope = (id, params, nodeTracker) => { decayCurve: dcurve, releaseCurve: rcurve, }); - nodeTracker[`env_${id}`] = [envNode]; + nodeTracker[0][`env_${id}`] = [envNode]; targetParams.forEach((t) => envNode.connect(t)); return envNode; }; export const connectBusModulator = (params, nodeTracker, controller) => { const ac = getAudioContext(); - const { control, subControl, depth = 1, depthabs } = params; - const { targetParams, paramName } = getTargetParamsForControl(control, nodeTracker, subControl); + const { control, subControl, depth = 1, depthabs, fxi = 'main' } = params; + const { targetParams, paramName } = getTargetParamsForControl(control, nodeTracker[fxi], subControl); if (!targetParams.length) return { toCleanup: [] }; const signal = controller.getBus(params.bus); const dc = new ConstantSourceNode(ac, { offset: params.dc ?? 0 }); diff --git a/packages/superdough/reverbGen.mjs b/packages/superdough/reverbGen.mjs index bb050874c..0949a30d5 100644 --- a/packages/superdough/reverbGen.mjs +++ b/packages/superdough/reverbGen.mjs @@ -12,6 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +import { releaseAudioNode } from './helpers.mjs'; + var reverbGen = {}; /** Generates a reverb impulse response. @@ -104,8 +106,8 @@ var applyGradualLowpass = function (input, lpFreqStart, lpFreqEnd, lpFreqEndAt, player.start(); context.oncomplete = function (event) { callback(event.renderedBuffer); - filter.disconnect(); - player.disconnect(); + releaseAudioNode(filter); + releaseAudioNode(player); }; context.startRendering(); diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 8a3e9f7b3..9e9ffa12d 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -7,7 +7,7 @@ This program is free software: you can redistribute it and/or modify it under th import './feedbackdelay.mjs'; import './reverb.mjs'; import './vowel.mjs'; -import { nanFallback, _mod, cycleToSeconds, pickAndRename } from './util.mjs'; +import { clamp, nanFallback, _mod, cycleToSeconds, pickAndRename } from './util.mjs'; import workletsUrl from './worklets.mjs?audioworklet'; import { createFilter, @@ -18,6 +18,7 @@ import { getLfo, getWorklet, releaseAudioNode, + webAudioTimeout, } from './helpers.mjs'; import { map } from 'nanostores'; import { logger } from './logger.mjs'; @@ -193,6 +194,8 @@ let defaultDefaultValues = { i: 1, velocity: 1, fft: 8, + tremolodepth: 1, + tremolophase: 0, }; const defaultDefaultDefaultValues = Object.freeze({ ...defaultDefaultValues }); @@ -402,8 +405,37 @@ function mapChannelNumbers(channels) { return (Array.isArray(channels) ? channels : [channels]).map((ch) => ch - 1); } +class Chain { + constructor(head) { + this.audioNodes = [head]; + this.tails = [head]; + } + connect(...nodes) { + nodes.forEach((node) => { + this.tails.forEach((tail) => { + tail.connect(node); + }); + }); + this.tails = nodes; + this.audioNodes.push(...nodes); + return this; + } + connectOne(idx, node) { + this.tails[idx].connect(node); + this.tails[idx] = node; + this.audioNodes.push(node); + return this; + } + releaseNodes() { + this.audioNodes.forEach((n) => releaseAudioNode(n)); + this.audioNodes = []; + this.tails = []; + } +} + export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) => { - let nodes = {}; + // mapping from main FX and numbered FX chains to nodes + const nodes = { main: {} }; // new: t is always expected to be the absolute target onset time const ac = getAudioContext(); const audioController = getSuperdoughAudioController(); @@ -432,44 +464,17 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) } // destructure let { - tremolo, - tremolosync, - tremolodepth = 1, - tremoloskew, - tremolophase = 0, - tremoloshape, s = getDefaultValue('s'), bank, source, - gain = getDefaultValue('gain'), postgain = getDefaultValue('postgain'), - density = getDefaultValue('density'), duckorbit, duckonset, duckattack, duckdepth, djf, - // filters - fanchor = getDefaultValue('fanchor'), - release = 0, - - //phaser - phaserrate, - phaserdepth = getDefaultValue('phaserdepth'), - phasersweep, - phasercenter, - // - coarse, - - crush, + release = 0.01, dry, - shape, - shapevol = getDefaultValue('shapevol'), - distort, - distortvol = getDefaultValue('distortvol'), - distorttype = getDefaultValue('distorttype'), - pan, - vowel, delay = getDefaultValue('delay'), delayfeedback = getDefaultValue('delayfeedback'), delaysync = getDefaultValue('delaysync'), @@ -486,16 +491,10 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) irspeed, irbegin, i = getDefaultValue('i'), - velocity = getDefaultValue('velocity'), analyze, // analyser wet fft = getDefaultValue('fft'), // fftSize 0 - 10 - compressor: compressorThreshold, - compressorRatio, - compressorKnee, - compressorAttack, - compressorRelease, - transient, - transsustain, + FX = [], + FXrelease, } = value; delaytime = delaytime ?? cycleToSeconds(delaysync, cps); @@ -510,18 +509,13 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) audioController.duck(duckorbit, t, duckonset, duckattack, duckdepth); } - gain = applyGainCurve(nanFallback(gain, 1)); postgain = applyGainCurve(postgain); - shapevol = applyGainCurve(shapevol); - distortvol = applyGainCurve(distortvol); delay = applyGainCurve(delay); - velocity = applyGainCurve(velocity); - tremolodepth = applyGainCurve(tremolodepth); busgain = applyGainCurve(busgain); - gain *= velocity; // velocity currently only multiplies with gain. it might do other things in the future const end = t + hapDuration; - const endWithRelease = end + release; + const fullRelease = Math.max(release, FXrelease ?? 0); + const endWithRelease = end + fullRelease; const chainID = Math.round(Math.random() * 1000000); // oldest audio nodes will be destroyed if maximum polyphony is exceeded @@ -535,8 +529,6 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) activeSoundSources.delete(chainID); } - const audioNodes = []; - if (['-', '~', '_'].includes(s)) { return; } @@ -549,19 +541,16 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) let sourceNode; if (source) { sourceNode = source(t, value, hapDuration, cps); - nodes['source'] = [sourceNode]; + nodes.main['source'] = [sourceNode]; } else if (getSound(s)) { const { onTrigger } = getSound(s); - const onEnded = () => { - audioNodes.forEach((n) => releaseAudioNode(n)); - activeSoundSources.delete(chainID); - }; + const onEnded = () => {}; const soundHandle = await onTrigger(t, value, onEnded, cps); if (soundHandle) { sourceNode = soundHandle.node; activeSoundSources.set(chainID, new WeakRef(soundHandle)); // allow GC - nodes = { ...nodes, ...soundHandle.nodes }; + nodes.main = { ...nodes.main, ...soundHandle.nodes }; } } else { throw new Error(`sound ${s} not found! Is it loaded?`); @@ -576,253 +565,339 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) logger('[webaudio] skip hap: still loading', ac.currentTime - t); return; } - const chain = []; // audio nodes that will be connected to each other sequentially - chain.push(sourceNode); - stretch !== undefined && chain.push(getWorklet(ac, 'phase-vocoder-processor', { pitchFactor: stretch })); - if (transient !== undefined) { - const transProcessor = getWorklet( - ac, - 'transient-processor', - {}, - { - processorOptions: { - attack: transient, - sustain: transsustain, - begin: t, - end: endWithRelease, + const chain = new Chain(sourceNode); // audio nodes that will be connected to each other sequentially + FX = [...FX, value]; // run through the FX chain and then run through all FX outside of it as well + for (let [idx, fx] of Object.entries(FX)) { + const key = idx == FX.length - 1 ? 'main' : idx; + nodes[key] ??= {}; + const fxNodes = nodes[key]; + let { + gain = getDefaultValue('gain'), + velocity = getDefaultValue('velocity'), + shapevol = getDefaultValue('shapevol'), + distorttype = getDefaultValue('distorttype'), + distortvol = getDefaultValue('distortvol'), + tremolodepth = getDefaultValue('tremolodepth'), + phaserdepth = getDefaultValue('phaserdepth'), + delay = getDefaultValue('delay'), + delayfeedback = getDefaultValue('delayfeedback'), + delaysync = getDefaultValue('delaysync'), + delaytime, + stretch = getDefaultValue('stretch'), + } = fx; + gain = applyGainCurve(nanFallback(gain, 1)); + shapevol = applyGainCurve(shapevol); + distortvol = applyGainCurve(distortvol); + velocity = applyGainCurve(velocity); + tremolodepth = applyGainCurve(tremolodepth); + gain *= velocity; // velocity currently only multiplies with gain. it might do other things in the future + delaytime = delaytime ?? cycleToSeconds(delaysync, cps); + + stretch !== undefined && chain.connect(getWorklet(ac, 'phase-vocoder-processor', { pitchFactor: stretch })); + + if (fx.transient !== undefined) { + const transProcessor = getWorklet( + ac, + 'transient-processor', + {}, + { + processorOptions: { + attack: fx.transient, + sustain: fx.transsustain, + begin: t, + end: endWithRelease, + }, }, - }, - ); - chain.push(transProcessor); - nodes['transient'] = transProcessor; - } + ); + chain.connect(transProcessor); + fxNodes['transient'] = transProcessor; + } - // gain stage - const initialGain = gainNode(gain); - nodes['gain'] = [initialGain]; - chain.push(initialGain); + // gain stage + const initialGain = gainNode(gain); + fxNodes['gain'] = [initialGain]; + chain.connect(initialGain); - // filter - const ftype = getFilterType(value.ftype); + // filter + const ftype = getFilterType(value.ftype); - const filt = (params) => createFilter(ac, t, end, params, cps, cycle); - if (value.cutoff !== undefined) { - const lpMap = { - frequency: 'cutoff', - q: 'resonance', - attack: 'lpattack', - decay: 'lpdecay', - sustain: 'lpsustain', - release: 'lprelease', - env: 'lpenv', - anchor: 'fanchor', - model: 'ftype', - drive: 'drive', - rate: 'lprate', - sync: 'lpsync', - depth: 'lpdepth', - depthfrequency: 'lpdepthfrequency', - shape: 'lpshape', - dcoffset: 'lpdc', - skew: 'lpskew', - }; - const lpParams = pickAndRename(value, lpMap); - lpParams.type = 'lowpass'; - const { filter: lpf1, lfo: lfo1 } = filt(lpParams); - nodes['lpf'] = [lpf1]; - nodes['lpf_lfo'] = [lfo1]; - chain.push(lpf1); - lfo1 && audioNodes.push(lfo1); - if (ftype === '24db') { - const { filter: lpf2, lfo: lfo2 } = filt(lpParams); - nodes['lpf'].push(lpf2); - nodes['lpf_lfo'].push(lfo2); - chain.push(lpf2); - lfo2 && audioNodes.push(lfo2); + const filt = (params) => createFilter(ac, t, end, params, cps, cycle); + if (fx.cutoff !== undefined) { + const lpMap = { + frequency: 'cutoff', + q: 'resonance', + attack: 'lpattack', + decay: 'lpdecay', + sustain: 'lpsustain', + release: 'lprelease', + env: 'lpenv', + anchor: 'fanchor', + model: 'ftype', + drive: 'drive', + rate: 'lprate', + sync: 'lpsync', + depth: 'lpdepth', + depthfrequency: 'lpdepthfrequency', + shape: 'lpshape', + dcoffset: 'lpdc', + skew: 'lpskew', + }; + const lpParams = pickAndRename(fx, lpMap); + lpParams.type = 'lowpass'; + const { filter: lpf1, lfo: lfo1 } = filt(lpParams); + fxNodes['lpf'] = [lpf1]; + fxNodes['lpf_lfo'] = [lfo1]; + chain.connect(lpf1); + lfo1 && chain.audioNodes.push(lfo1); + if (ftype === '24db') { + const { filter: lpf2, lfo: lfo2 } = filt(lpParams); + fxNodes['lpf'].push(lpf2); + fxNodes['lpf_lfo'].push(lfo2); + chain.connect(lpf2); + lfo2 && chain.audioNodes.push(lfo2); + } + } + + if (fx.hcutoff !== undefined) { + const hpMap = { + frequency: 'hcutoff', + q: 'hresonance', + attack: 'hpattack', + decay: 'hpdecay', + sustain: 'hpsustain', + release: 'hprelease', + env: 'hpenv', + anchor: 'fanchor', + model: 'ftype', + drive: 'drive', + rate: 'hprate', + sync: 'hpsync', + depth: 'hpdepth', + depthfrequency: 'hpdepthfrequency', + shape: 'hpshape', + dcoffset: 'hpdc', + skew: 'hpskew', + }; + const hpParams = pickAndRename(fx, hpMap); + hpParams.type = 'highpass'; + const { filter: hpf1, lfo: lfo1 } = filt(hpParams); + fxNodes['hpf'] = [hpf1]; + fxNodes['hpf_lfo'] = [lfo1]; + lfo1 && chain.audioNodes.push(lfo1); + chain.connect(hpf1); + if (ftype === '24db') { + const { filter: hpf2, lfo: lfo2 } = filt(hpParams); + fxNodes['hpf'].push(hpf2); + fxNodes['hpf_lfo'].push(lfo2); + chain.connect(hpf2); + lfo2 && chain.audioNodes.push(lfo2); + } + } + + if (fx.bandf !== undefined) { + const bpMap = { + frequency: 'bandf', + q: 'bandq', + attack: 'bpattack', + decay: 'bpdecay', + sustain: 'bpsustain', + release: 'bprelease', + env: 'bpenv', + anchor: 'fanchor', + model: 'ftype', + drive: 'drive', + rate: 'bprate', + sync: 'bpsync', + depth: 'bpdepth', + depthfrequency: 'bpdepthfrequency', + shape: 'bpshape', + dcoffset: 'bpdc', + skew: 'bpskew', + }; + const bpParams = pickAndRename(fx, bpMap); + bpParams.type = 'bandpass'; + const { filter: bpf1, lfo: lfo1 } = filt(bpParams); + fxNodes['bpf'] = [bpf1]; + fxNodes['bpf_lfo'] = [lfo1]; + chain.connect(bpf1); + lfo1 && chain.audioNodes.push(lfo1); + if (ftype === '24db') { + const { filter: bpf2, lfo: lfo2 } = filt(bpParams); + fxNodes['bpf'].push(bpf2); + fxNodes['bpf_lfo'].push(lfo2); + chain.connect(bpf2); + lfo2 && chain.audioNodes.push(lfo2); + } + } + + if (fx.vowel !== undefined) { + const vowelFilter = ac.createVowelFilter(fx.vowel); + fxNodes['vowel'] = [vowelFilter]; + chain.connect(vowelFilter); + } + + // effects + if (fx.coarse !== undefined) { + const coarseNode = getWorklet(ac, 'coarse-processor', { coarse: fx.coarse }); + fxNodes['coarse'] = [coarseNode]; + chain.connect(coarseNode); + } + if (fx.crush !== undefined) { + const crushNode = getWorklet(ac, 'crush-processor', { crush: fx.crush }); + fxNodes['crush'] = [crushNode]; + chain.connect(crushNode); + } + if (fx.shape !== undefined) { + const shapeNode = getWorklet(ac, 'shape-processor', { shape: fx.shape, postgain: shapevol }); + fxNodes['shape'] = [shapeNode]; + chain.connect(shapeNode); + } + if (fx.distort !== undefined) { + const distortNode = getDistortion(fx.distort, distortvol, distorttype); + fxNodes['distort'] = [distortNode]; + chain.connect(distortNode); + } + + let tremolo = fx.tremolo; + if (fx.tremolosync != null) { + tremolo = cps * fx.tremolosync; + } + + if (tremolo !== undefined) { + // Allow clipping of modulator for more dynamic possiblities, and to prevent speaker overload + // EX: a triangle waveform will clip like this /-\ when the depth is above 1 + const gain = Math.max(1 - tremolodepth, 0); + const amGain = new GainNode(ac, { gain }); + + const time = cycle / cps; + const lfo = getLfo(ac, { + skew: fx.tremoloskew ?? (fx.tremoloshape != null ? 0.5 : 1), + frequency: tremolo, + depth: tremolodepth, + time, + dcoffset: 0, + shape: fx.tremoloshape, + phaseoffset: fx.tremolophase, + min: 0, + max: 1, + curve: 1.5, + begin: t, + end: endWithRelease, + }); + fxNodes['tremolo'] = [lfo]; + fxNodes['tremolo_gain'] = [amGain]; + lfo.connect(amGain.gain); + chain.audioNodes.push(lfo); + chain.connect(amGain); + } + + if (fx.compressor !== undefined) { + const compressorNode = getCompressor( + ac, + fx.compressor, + fx.compressorRatio, + fx.compressorKnee, + fx.compressorAttack, + fx.compressorRelease, + ); + fxNodes['compressor'] = [compressorNode]; + chain.connect(compressorNode); + } + + // panning + if (fx.pan !== undefined) { + const panner = ac.createStereoPanner(); + panner.pan.value = 2 * fx.pan - 1; + chain.connect(panner); + } + // phaser + if (fx.phaserrate !== undefined && phaserdepth > 0) { + const { filterChain, lfo } = getPhaser( + t, + endWithRelease, + fx.phaserrate, + phaserdepth, + fx.phasercenter, + fx.phasersweep, + ); + fxNodes['phaser'] = [...filterChain]; + fxNodes['phaser_lfo'] = [lfo]; + filterChain.forEach((f) => chain.connect(f)); + chain.audioNodes.push(lfo); + } + // delay + if (delay > 0 && delaytime > 0 && delayfeedback > 0) { + const dry = gainNode(1); + delayfeedback = clamp(delayfeedback, 0, 0.98); + const delayNode = ac.createFeedbackDelay(1, delaytime, delayfeedback); + const wetDelay = gainNode(delay); + const dryDelay = gainNode(fx.dry ?? 1); + const sum = new GainNode(ac, { gain: 1, channelCount: 2, channelCountMode: 'explicit' }); + chain + .connect(dry) + .connect(dryDelay, delayNode) + .connectOne(1, wetDelay) // connect delayNode -> wetDelay + .connect(sum); + chain.audioNodes.push(delayNode.feedbackGain, delayNode.delayGain); + fxNodes['delay'] = [delayNode]; + fxNodes['delay_mix'] = [wetDelay]; + } + // reverb + if (fx.room > 0) { + let roomIR; + if (fx.ir !== undefined) { + let url; + let sample = getSound(fx.ir); + if (Array.isArray(sample)) { + url = sample.data.samples[fx.i % sample.data.samples.length]; + } else if (typeof sample === 'object') { + url = Object.values(sample.data.samples).flat()[fx.i % Object.values(sample.data.samples).length]; + } + roomIR = await loadBuffer(url, ac, fx.ir, 0); + } + const dry = gainNode(1); + const reverbNode = ac.createReverb( + fx.roomsize, + fx.roomfade, + fx.roomlp, + fx.roomdim, + roomIR, + fx.irspeed, + fx.irbegin, + ); + const wetReverb = gainNode(fx.room); + const dryReverb = gainNode(fx.dry ?? 1); + const sum = new GainNode(ac, { gain: 1, channelCount: 2, channelCountMode: 'explicit' }); + chain + .connect(dry) + .connect(dryReverb, reverbNode) + .connectOne(1, wetReverb) // connect reverbNode -> wetReverb + .connect(sum); + fxNodes['room'] = [reverbNode]; + fxNodes['room_mix'] = [wetReverb]; } } - if (value.hcutoff !== undefined) { - const hpMap = { - frequency: 'hcutoff', - q: 'hresonance', - attack: 'hpattack', - decay: 'hpdecay', - sustain: 'hpsustain', - release: 'hprelease', - env: 'hpenv', - anchor: 'fanchor', - model: 'ftype', - drive: 'drive', - rate: 'hprate', - sync: 'hpsync', - depth: 'hpdepth', - depthfrequency: 'hpdepthfrequency', - shape: 'hpshape', - dcoffset: 'hpdc', - skew: 'hpskew', - }; - const hpParams = pickAndRename(value, hpMap); - hpParams.type = 'highpass'; - const { filter: hpf1, lfo: lfo1 } = filt(hpParams); - nodes['hpf'] = [hpf1]; - nodes['hpf_lfo'] = [lfo1]; - lfo1 && audioNodes.push(lfo1); - chain.push(hpf1); - if (ftype === '24db') { - const { filter: hpf2, lfo: lfo2 } = filt(hpParams); - nodes['hpf'].push(hpf2); - nodes['hpf_lfo'].push(lfo2); - chain.push(hpf2); - lfo2 && audioNodes.push(lfo2); - } - } - - if (value.bandf !== undefined) { - const bpMap = { - frequency: 'bandf', - q: 'bandq', - attack: 'bpattack', - decay: 'bpdecay', - sustain: 'bpsustain', - release: 'bprelease', - env: 'bpenv', - anchor: 'fanchor', - model: 'ftype', - drive: 'drive', - rate: 'bprate', - sync: 'bpsync', - depth: 'bpdepth', - depthfrequency: 'bpdepthfrequency', - shape: 'bpshape', - dcoffset: 'bpdc', - skew: 'bpskew', - }; - const bpParams = pickAndRename(value, bpMap); - bpParams.type = 'bandpass'; - const { filter: bpf1, lfo: lfo1 } = filt(bpParams); - nodes['bpf'] = [bpf1]; - nodes['bpf_lfo'] = [lfo1]; - chain.push(bpf1); - lfo1 && audioNodes.push(lfo1); - if (ftype === '24db') { - const { filter: bpf2, lfo: lfo2 } = filt(bpParams); - nodes['bpf'].push(bpf2); - nodes['bpf_lfo'].push(lfo2); - chain.push(bpf2); - lfo2 && audioNodes.push(lfo2); - } - } - - if (vowel !== undefined) { - const vowelFilter = ac.createVowelFilter(vowel); - nodes['vowel'] = [vowelFilter]; - chain.push(vowelFilter); - } - - // effects - if (coarse !== undefined) { - const coarseNode = getWorklet(ac, 'coarse-processor', { coarse }); - nodes['coarse'] = [coarseNode]; - chain.push(coarseNode); - } - if (crush !== undefined) { - const crushNode = getWorklet(ac, 'crush-processor', { crush }); - nodes['crush'] = [crushNode]; - chain.push(crushNode); - } - if (shape !== undefined) { - const shapeNode = getWorklet(ac, 'shape-processor', { shape, postgain: shapevol }); - nodes['shape'] = [shapeNode]; - chain.push(shapeNode); - } - if (distort !== undefined) { - const distortNode = getDistortion(distort, distortvol, distorttype); - nodes['distort'] = [distortNode]; - chain.push(distortNode); - } - - if (tremolosync != null) { - tremolo = cps * tremolosync; - } - - if (value.wtPosSynced != null) { - value.wtPosRate /= cps; - } - - if (value.wtWarpSynced != null) { - value.wtWarpRate /= cps; - } - - if (tremolo !== undefined) { - // Allow clipping of modulator for more dynamic possiblities, and to prevent speaker overload - // EX: a triangle waveform will clip like this /-\ when the depth is above 1 - const gain = Math.max(1 - tremolodepth, 0); - const amGain = new GainNode(ac, { gain }); - - const time = cycle / cps; - const lfo = getLfo(ac, { - skew: tremoloskew ?? (tremoloshape != null ? 0.5 : 1), - frequency: tremolo, - depth: tremolodepth, - time, - dcoffset: 0, - shape: tremoloshape, - phaseoffset: tremolophase, - min: 0, - max: 1, - curve: 1.5, - begin: t, - end: endWithRelease, - }); - nodes['tremolo'] = [lfo]; - nodes['tremolo_gain'] = [amGain]; - lfo.connect(amGain.gain); - audioNodes.push(lfo); - chain.push(amGain); - } - - if (compressorThreshold !== undefined) { - const compressorNode = getCompressor( - ac, - compressorThreshold, - compressorRatio, - compressorKnee, - compressorAttack, - compressorRelease, - ); - nodes['compressor'] = [compressorNode]; - chain.push(compressorNode); - } - - // panning - if (pan !== undefined) { - const panner = ac.createStereoPanner(); - panner.pan.value = 2 * pan - 1; - chain.push(panner); - } - // phaser - if (phaserrate !== undefined && phaserdepth > 0) { - const { filterChain, lfo } = getPhaser(t, endWithRelease, phaserrate, phaserdepth, phasercenter, phasersweep); - nodes['phaser'] = [...filterChain]; - nodes['phaser_lfo'] = [lfo]; - chain.push(...filterChain); - audioNodes.push(lfo); + if (FXrelease !== undefined && FXrelease > release) { + const releaseNode = gainNode(1); + releaseNode.gain.setValueAtTime(1, end + release); + releaseNode.gain.linearRampToValueAtTime(0, endWithRelease); + chain.connect(releaseNode); } // last gain const post = new GainNode(ac, { gain: postgain }); - nodes['post'] = [post]; - chain.push(post); + nodes.main['post'] = [post]; + chain.connect(post); // delay if (delay > 0 && delaytime > 0 && delayfeedback > 0) { const delayNode = orbitBus.getDelay(delaytime, delayfeedback, t); - nodes['delay'] = [delayNode]; + nodes.main['delay'] = [delayNode]; const delaySend = orbitBus.sendDelay(post, delay); - nodes['delay_mix'] = [delaySend]; - audioNodes.push(delaySend); + nodes.main['delay_mix'] = [delaySend]; + chain.audioNodes.push(delaySend); } // reverb if (room > 0) { @@ -838,81 +913,92 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) roomIR = await loadBuffer(url, ac, ir, 0); } const roomNode = orbitBus.getReverb(roomsize, roomfade, roomlp, roomdim, roomIR, irspeed, irbegin); - nodes['room'] = [roomNode]; + nodes.main['room'] = [roomNode]; const reverbSend = orbitBus.sendReverb(post, room); - nodes['room_mix'] = [reverbSend]; - audioNodes.push(reverbSend); + nodes.main['room_mix'] = [reverbSend]; + chain.audioNodes.push(reverbSend); } if (bus != null) { const busNode = audioController.getBus(bus); const busSend = effectSend(post, busNode, busgain); - audioNodes.push(busSend); + chain.audioNodes.push(busSend); } if (djf != null) { const djfNode = orbitBus.getDjf(djf, t); - nodes['djf'] = [djfNode]; + nodes.main['djf'] = [djfNode]; } // analyser if (analyze && !(ac instanceof OfflineAudioContext)) { const analyserNode = getAnalyserById(analyze, 2 ** (fft + 5)); const analyserSend = effectSend(post, analyserNode, 1); - audioNodes.push(analyserSend); + chain.audioNodes.push(analyserSend); } if (dry != null) { dry = applyGainCurve(dry); const dryGain = new GainNode(ac, { gain: dry }); - chain.push(dryGain); + chain.connect(dryGain); orbitBus.connectToOutput(dryGain); } else { orbitBus.connectToOutput(post); } - // connect chain elements together - chain.slice(1).reduce((last, current) => last.connect(current), chain[0]); - audioNodes.push(...chain); - // finally, now that `nodes` is populated, set up modulators - if (value.lfo) { - for (const id of value.lfo.__ids) { - const params = value.lfo[id]; - const lfo = connectLFO( - id, - { - ...params, - cps, - cycle, - begin: t, - end: endWithRelease, - }, - nodes, - ); - lfo && audioNodes.push(lfo); + FX.forEach((fx, idx) => { + const key = idx === FX.length - 1 ? 'main' : idx; + if (fx.lfo) { + for (const id of fx.lfo.__ids) { + const params = fx.lfo[id]; + params.fxi ??= key; + const lfo = connectLFO( + id, + { + ...params, + cps, + cycle, + begin: t, + end: endWithRelease, + }, + nodes, + ); + lfo && chain.audioNodes.push(lfo); + } } - } - if (value.env) { - for (const id of value.env.__ids) { - const params = value.env[id]; - const env = connectEnvelope( - id, - { - ...params, - begin: t, - end: endWithRelease, - }, - nodes, - ); - env && audioNodes.push(env); + if (fx.env) { + for (const id of fx.env.__ids) { + const params = fx.env[id]; + params.fxi ??= key; + const env = connectEnvelope( + id, + { + ...params, + begin: t, + end: endWithRelease, + }, + nodes, + ); + env && chain.audioNodes.push(env); + } } - } - if (value.bmod) { - for (const id of value.bmod.__ids) { - const params = value.bmod[id]; - const { toCleanup } = connectBusModulator({ ...params, begin: t, end: endWithRelease }, nodes, controller); - audioNodes.push(...toCleanup); + if (fx.bmod) { + for (const id of fx.bmod.__ids) { + const params = fx.bmod[id]; + params.fxi ??= key; + const { toCleanup } = connectBusModulator({ ...params, begin: t, end: endWithRelease }, nodes, controller); + chain.audioNodes.push(...toCleanup); + } } - } + }); + webAudioTimeout( + ac, + () => { + chain.releaseNodes(); + activeSoundSources.delete(chainID); + }, + 0, + endWithRelease, + ); }; export const superdoughTrigger = (t, hap, ct, cps) => { From 882bcc513f12d62ab477bd336f09294ed528e2f4 Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 31 Dec 2025 15:17:06 -0600 Subject: [PATCH 302/312] Typos and some examples --- packages/core/pattern.mjs | 16 ++++++++ packages/superdough/modulators.mjs | 4 +- packages/superdough/superdough.mjs | 27 +++++++------ test/__snapshots__/examples.test.mjs.snap | 46 +++++++++++++++++++++++ 4 files changed, 79 insertions(+), 14 deletions(-) diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index e6169399a..f9c1852df 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -3729,6 +3729,22 @@ export const phases = (list) => { * @name FX * @memberof Pattern * @returns Pattern + * @example + * $: s("[sbd ]*4").dec(.4) + * .FX( + * phaser(0.5).gain(2), + * bpf(800), + * distort(1.3), + * room(0.2), + * delay(0.5).gain(1.25), + * distort(0.3), + * ).fxr(1.7) // sets release time of effects (like delay) + * @example + * $: s("saw").fm(0.5) + * .delay(0.3) // outer effects are applied *last* + * .FX(coarse(4)) // first coarse + * .FX(lpf(500).lpe(4).lpa(1).lpd(2)) // then lpf + * .FX(distort(1)) // then distort */ Pattern.prototype.FX = function (...effects) { effects = effects.map(reify); diff --git a/packages/superdough/modulators.mjs b/packages/superdough/modulators.mjs index 2b6fcf334..ea9067102 100644 --- a/packages/superdough/modulators.mjs +++ b/packages/superdough/modulators.mjs @@ -112,7 +112,7 @@ export const connectLFO = (id, params, nodeTracker) => { max, }; const lfoNode = getLfo(getAudioContext(), modParams); - nodeTracker[0][`lfo_${id}`] = [lfoNode]; + nodeTracker.main[`lfo_${id}`] = [lfoNode]; targetParams.forEach((t) => lfoNode.connect(t)); return lfoNode; }; @@ -134,7 +134,7 @@ export const connectEnvelope = (id, params, nodeTracker) => { decayCurve: dcurve, releaseCurve: rcurve, }); - nodeTracker[0][`env_${id}`] = [envNode]; + nodeTracker.main[`env_${id}`] = [envNode]; targetParams.forEach((t) => envNode.connect(t)); return envNode; }; diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 9e9ffa12d..7546bfab4 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -196,6 +196,7 @@ let defaultDefaultValues = { fft: 8, tremolodepth: 1, tremolophase: 0, + release: 0.01, }; const defaultDefaultDefaultValues = Object.freeze({ ...defaultDefaultValues }); @@ -473,7 +474,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) duckattack, duckdepth, djf, - release = 0.01, + release = getDefaultValue('release'), dry, delay = getDefaultValue('delay'), delayfeedback = getDefaultValue('delayfeedback'), @@ -544,7 +545,18 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) nodes.main['source'] = [sourceNode]; } else if (getSound(s)) { const { onTrigger } = getSound(s); - const onEnded = () => {}; + // We have to use onEnded because some sources (e.g. `sampler`) have + // an internal duration which is longer than `value.duration` + const onEnded = () => + webAudioTimeout( + ac, + () => { + chain.releaseNodes(); + activeSoundSources.delete(chainID); + }, + 0, + endWithRelease, + ); const soundHandle = await onTrigger(t, value, onEnded, cps); if (soundHandle) { @@ -566,7 +578,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) return; } - const chain = new Chain(sourceNode); // audio nodes that will be connected to each other sequentially + const chain = new Chain(sourceNode); // connection manager which tracks audio nodes for releasing FX = [...FX, value]; // run through the FX chain and then run through all FX outside of it as well for (let [idx, fx] of Object.entries(FX)) { const key = idx == FX.length - 1 ? 'main' : idx; @@ -990,15 +1002,6 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) } } }); - webAudioTimeout( - ac, - () => { - chain.releaseNodes(); - activeSoundSources.delete(chainID); - }, - 0, - endWithRelease, - ); }; export const superdoughTrigger = (t, hap, ct, cps) => { diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 61ab11866..f6547bc61 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -565,6 +565,52 @@ exports[`runs examples > example "_euclidRot" example index 20 1`] = ` ] `; +exports[`runs examples > example "FX" example index 0 1`] = ` +[ + "[ 0/1 → 1/8 | s:sbd decay:0.4 FX:[{phaserrate:0.5 gain:2} {bandf:800} {distort:1.3} {room:0.2} {delay:0.5 gain:1.25} {distort:0.3}] FXrelease:1.7 ]", + "[ 1/8 → 1/4 | s:hh decay:0.4 FX:[{phaserrate:0.5 gain:2} {bandf:800} {distort:1.3} {room:0.2} {delay:0.5 gain:1.25} {distort:0.3}] FXrelease:1.7 ]", + "[ 1/4 → 3/8 | s:sbd decay:0.4 FX:[{phaserrate:0.5 gain:2} {bandf:800} {distort:1.3} {room:0.2} {delay:0.5 gain:1.25} {distort:0.3}] FXrelease:1.7 ]", + "[ 3/8 → 1/2 | s:bd decay:0.4 FX:[{phaserrate:0.5 gain:2} {bandf:800} {distort:1.3} {room:0.2} {delay:0.5 gain:1.25} {distort:0.3}] FXrelease:1.7 ]", + "[ 1/2 → 5/8 | s:sbd decay:0.4 FX:[{phaserrate:0.5 gain:2} {bandf:800} {distort:1.3} {room:0.2} {delay:0.5 gain:1.25} {distort:0.3}] FXrelease:1.7 ]", + "[ 5/8 → 3/4 | s:hh decay:0.4 FX:[{phaserrate:0.5 gain:2} {bandf:800} {distort:1.3} {room:0.2} {delay:0.5 gain:1.25} {distort:0.3}] FXrelease:1.7 ]", + "[ 3/4 → 7/8 | s:sbd decay:0.4 FX:[{phaserrate:0.5 gain:2} {bandf:800} {distort:1.3} {room:0.2} {delay:0.5 gain:1.25} {distort:0.3}] FXrelease:1.7 ]", + "[ 7/8 → 1/1 | s:lt decay:0.4 FX:[{phaserrate:0.5 gain:2} {bandf:800} {distort:1.3} {room:0.2} {delay:0.5 gain:1.25} {distort:0.3}] FXrelease:1.7 ]", + "[ 1/1 → 9/8 | s:sbd decay:0.4 FX:[{phaserrate:0.5 gain:2} {bandf:800} {distort:1.3} {room:0.2} {delay:0.5 gain:1.25} {distort:0.3}] FXrelease:1.7 ]", + "[ 9/8 → 5/4 | s:hh decay:0.4 FX:[{phaserrate:0.5 gain:2} {bandf:800} {distort:1.3} {room:0.2} {delay:0.5 gain:1.25} {distort:0.3}] FXrelease:1.7 ]", + "[ 5/4 → 11/8 | s:sbd decay:0.4 FX:[{phaserrate:0.5 gain:2} {bandf:800} {distort:1.3} {room:0.2} {delay:0.5 gain:1.25} {distort:0.3}] FXrelease:1.7 ]", + "[ 11/8 → 3/2 | s:oh decay:0.4 FX:[{phaserrate:0.5 gain:2} {bandf:800} {distort:1.3} {room:0.2} {delay:0.5 gain:1.25} {distort:0.3}] FXrelease:1.7 ]", + "[ 3/2 → 13/8 | s:sbd decay:0.4 FX:[{phaserrate:0.5 gain:2} {bandf:800} {distort:1.3} {room:0.2} {delay:0.5 gain:1.25} {distort:0.3}] FXrelease:1.7 ]", + "[ 13/8 → 7/4 | s:hh decay:0.4 FX:[{phaserrate:0.5 gain:2} {bandf:800} {distort:1.3} {room:0.2} {delay:0.5 gain:1.25} {distort:0.3}] FXrelease:1.7 ]", + "[ 7/4 → 15/8 | s:sbd decay:0.4 FX:[{phaserrate:0.5 gain:2} {bandf:800} {distort:1.3} {room:0.2} {delay:0.5 gain:1.25} {distort:0.3}] FXrelease:1.7 ]", + "[ 15/8 → 2/1 | s:bd decay:0.4 FX:[{phaserrate:0.5 gain:2} {bandf:800} {distort:1.3} {room:0.2} {delay:0.5 gain:1.25} {distort:0.3}] FXrelease:1.7 ]", + "[ 2/1 → 17/8 | s:sbd decay:0.4 FX:[{phaserrate:0.5 gain:2} {bandf:800} {distort:1.3} {room:0.2} {delay:0.5 gain:1.25} {distort:0.3}] FXrelease:1.7 ]", + "[ 17/8 → 9/4 | s:hh decay:0.4 FX:[{phaserrate:0.5 gain:2} {bandf:800} {distort:1.3} {room:0.2} {delay:0.5 gain:1.25} {distort:0.3}] FXrelease:1.7 ]", + "[ 9/4 → 19/8 | s:sbd decay:0.4 FX:[{phaserrate:0.5 gain:2} {bandf:800} {distort:1.3} {room:0.2} {delay:0.5 gain:1.25} {distort:0.3}] FXrelease:1.7 ]", + "[ 19/8 → 5/2 | s:bd decay:0.4 FX:[{phaserrate:0.5 gain:2} {bandf:800} {distort:1.3} {room:0.2} {delay:0.5 gain:1.25} {distort:0.3}] FXrelease:1.7 ]", + "[ 5/2 → 21/8 | s:sbd decay:0.4 FX:[{phaserrate:0.5 gain:2} {bandf:800} {distort:1.3} {room:0.2} {delay:0.5 gain:1.25} {distort:0.3}] FXrelease:1.7 ]", + "[ 21/8 → 11/4 | s:hh decay:0.4 FX:[{phaserrate:0.5 gain:2} {bandf:800} {distort:1.3} {room:0.2} {delay:0.5 gain:1.25} {distort:0.3}] FXrelease:1.7 ]", + "[ 11/4 → 23/8 | s:sbd decay:0.4 FX:[{phaserrate:0.5 gain:2} {bandf:800} {distort:1.3} {room:0.2} {delay:0.5 gain:1.25} {distort:0.3}] FXrelease:1.7 ]", + "[ 23/8 → 3/1 | s:bd decay:0.4 FX:[{phaserrate:0.5 gain:2} {bandf:800} {distort:1.3} {room:0.2} {delay:0.5 gain:1.25} {distort:0.3}] FXrelease:1.7 ]", + "[ 3/1 → 25/8 | s:sbd decay:0.4 FX:[{phaserrate:0.5 gain:2} {bandf:800} {distort:1.3} {room:0.2} {delay:0.5 gain:1.25} {distort:0.3}] FXrelease:1.7 ]", + "[ 25/8 → 13/4 | s:hh decay:0.4 FX:[{phaserrate:0.5 gain:2} {bandf:800} {distort:1.3} {room:0.2} {delay:0.5 gain:1.25} {distort:0.3}] FXrelease:1.7 ]", + "[ 13/4 → 27/8 | s:sbd decay:0.4 FX:[{phaserrate:0.5 gain:2} {bandf:800} {distort:1.3} {room:0.2} {delay:0.5 gain:1.25} {distort:0.3}] FXrelease:1.7 ]", + "[ 27/8 → 7/2 | s:lt decay:0.4 FX:[{phaserrate:0.5 gain:2} {bandf:800} {distort:1.3} {room:0.2} {delay:0.5 gain:1.25} {distort:0.3}] FXrelease:1.7 ]", + "[ 7/2 → 29/8 | s:sbd decay:0.4 FX:[{phaserrate:0.5 gain:2} {bandf:800} {distort:1.3} {room:0.2} {delay:0.5 gain:1.25} {distort:0.3}] FXrelease:1.7 ]", + "[ 29/8 → 15/4 | s:hh decay:0.4 FX:[{phaserrate:0.5 gain:2} {bandf:800} {distort:1.3} {room:0.2} {delay:0.5 gain:1.25} {distort:0.3}] FXrelease:1.7 ]", + "[ 15/4 → 31/8 | s:sbd decay:0.4 FX:[{phaserrate:0.5 gain:2} {bandf:800} {distort:1.3} {room:0.2} {delay:0.5 gain:1.25} {distort:0.3}] FXrelease:1.7 ]", + "[ 31/8 → 4/1 | s:bd decay:0.4 FX:[{phaserrate:0.5 gain:2} {bandf:800} {distort:1.3} {room:0.2} {delay:0.5 gain:1.25} {distort:0.3}] FXrelease:1.7 ]", +] +`; + +exports[`runs examples > example "FX" example index 1 1`] = ` +[ + "[ 0/1 → 1/1 | s:saw fmi:0.5 delay:0.3 FX:[{coarse:4} {cutoff:500 lpenv:4 lpattack:1 lpdecay:2} {distort:1}] ]", + "[ 1/1 → 2/1 | s:saw fmi:0.5 delay:0.3 FX:[{coarse:4} {cutoff:500 lpenv:4 lpattack:1 lpdecay:2} {distort:1}] ]", + "[ 2/1 → 3/1 | s:saw fmi:0.5 delay:0.3 FX:[{coarse:4} {cutoff:500 lpenv:4 lpattack:1 lpdecay:2} {distort:1}] ]", + "[ 3/1 → 4/1 | s:saw fmi:0.5 delay:0.3 FX:[{coarse:4} {cutoff:500 lpenv:4 lpattack:1 lpdecay:2} {distort:1}] ]", +] +`; + exports[`runs examples > example "accelerate" example index 0 1`] = ` [ "[ 0/1 → 2/1 | s:sax accelerate:0 ]", From ebaf7624f98698d65e53f6706a62b8af8ac3e0aa Mon Sep 17 00:00:00 2001 From: Aria Date: Thu, 1 Jan 2026 12:02:54 -0600 Subject: [PATCH 303/312] Fix lfos for vowels, phasers; fix ir index; more informative error message --- packages/superdough/modulators.mjs | 5 ++++- packages/superdough/superdough.mjs | 13 +++++++------ packages/superdough/superdoughdata.mjs | 2 +- packages/superdough/vowel.mjs | 17 +++++++++++------ 4 files changed, 23 insertions(+), 14 deletions(-) diff --git a/packages/superdough/modulators.mjs b/packages/superdough/modulators.mjs index ea9067102..7d119a06b 100644 --- a/packages/superdough/modulators.mjs +++ b/packages/superdough/modulators.mjs @@ -62,7 +62,10 @@ const getTargetParamsForControl = (control, nodes, subControl) => { const lookupKey = subControl ? `${control}_${subControl}` : control; const targetInfo = getControlData(lookupKey) ?? getControlData(control); if (!targetInfo) { - errorLogger(new Error(`Could not find control data for target '${control}'`), 'superdough'); + errorLogger( + new Error(`Could not find control data for target '${control}'. It may not be modulatable.`), + 'superdough', + ); return { targetParams: [], paramName: control }; } const paramName = targetInfo.param; diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 7546bfab4..2e46b2d7e 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -597,6 +597,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) delaysync = getDefaultValue('delaysync'), delaytime, stretch = getDefaultValue('stretch'), + i = getDefaultValue('i'), } = fx; gain = applyGainCurve(nanFallback(gain, 1)); shapevol = applyGainCurve(shapevol); @@ -744,9 +745,9 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) } if (fx.vowel !== undefined) { - const vowelFilter = ac.createVowelFilter(fx.vowel); - fxNodes['vowel'] = [vowelFilter]; - chain.connect(vowelFilter); + const vowelNode = ac.createVowelFilter(fx.vowel); + fxNodes['vowel'] = vowelNode.filters; + chain.connect(vowelNode); } // effects @@ -839,7 +840,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) chain.audioNodes.push(lfo); } // delay - if (delay > 0 && delaytime > 0 && delayfeedback > 0) { + if (key !== 'main' && delay > 0 && delaytime > 0 && delayfeedback > 0) { const dry = gainNode(1); delayfeedback = clamp(delayfeedback, 0, 0.98); const delayNode = ac.createFeedbackDelay(1, delaytime, delayfeedback); @@ -856,7 +857,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) fxNodes['delay_mix'] = [wetDelay]; } // reverb - if (fx.room > 0) { + if (key !== 'main' && fx.room > 0) { let roomIR; if (fx.ir !== undefined) { let url; @@ -864,7 +865,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) if (Array.isArray(sample)) { url = sample.data.samples[fx.i % sample.data.samples.length]; } else if (typeof sample === 'object') { - url = Object.values(sample.data.samples).flat()[fx.i % Object.values(sample.data.samples).length]; + url = Object.values(sample.data.samples).flat()[i % Object.values(sample.data.samples).length]; } roomIR = await loadBuffer(url, ac, fx.ir, 0); } diff --git a/packages/superdough/superdoughdata.mjs b/packages/superdough/superdoughdata.mjs index 2dac194f1..e43df9eef 100644 --- a/packages/superdough/superdoughdata.mjs +++ b/packages/superdough/superdoughdata.mjs @@ -87,7 +87,7 @@ const CONTROL_TARGETS = { compressorRelease: { node: 'compressor', param: 'release' }, // PHASER - phaserrate: { node: 'phaser_lfo', param: 'rate' }, + phaserrate: { node: 'phaser_lfo', param: 'frequency' }, phasersweep: { node: 'phaser_lfo', param: 'depth' }, phasercenter: { node: 'phaser', param: 'frequency' }, phaserdepth: { node: 'phaser', param: 'Q' }, diff --git a/packages/superdough/vowel.mjs b/packages/superdough/vowel.mjs index bfc1c9fcd..8ecbf9d5c 100644 --- a/packages/superdough/vowel.mjs +++ b/packages/superdough/vowel.mjs @@ -1,3 +1,5 @@ +import { releaseAudioNode } from './helpers.mjs'; + // credits to webdirt: https://github.com/dktr0/WebDirt/blob/41342e81d6ad694a2310d491fef7b7e8b0929efe/js-src/Graph.js#L597 export var vowelFormant = { a: { freqs: [660, 1120, 2750, 3000, 3350], gains: [1, 0.5012, 0.0708, 0.0631, 0.0126], qs: [80, 90, 120, 130, 140] }, @@ -46,7 +48,8 @@ if (typeof GainNode !== 'undefined') { } const { gains, qs, freqs } = vowelFormant[letter]; this.makeupGain = ac.createGain(); - this.audioNodes = []; + this.filters = []; + this.gains = []; for (let i = 0; i < 5; i++) { const gain = ac.createGain(); gain.gain.value = gains[i]; @@ -56,9 +59,9 @@ if (typeof GainNode !== 'undefined') { filter.frequency.value = freqs[i]; super.connect(filter); filter.connect(gain); - this.audioNodes.push(filter); + this.filters.push(filter); gain.connect(this.makeupGain); - this.audioNodes.push(gain); + this.gains.push(gain); } this.makeupGain.gain.value = 8; // how much makeup gain to add? return this; @@ -67,11 +70,13 @@ if (typeof GainNode !== 'undefined') { this.makeupGain.connect(target); } disconnect() { - this.makeupGain.disconnect(); - this.audioNodes.forEach((n) => n.disconnect()); + releaseAudioNode(this.makeupGain); + this.filters.forEach(releaseAudioNode); + this.gains.forEach(releaseAudioNode); super.disconnect(); this.makeupGain = null; - this.audioNodes = null; + this.filters = null; + this.gains = null; } } From e54b9c3a32c245cd06392ba908c9974c51e2cd3b Mon Sep 17 00:00:00 2001 From: Aria Date: Thu, 1 Jan 2026 13:07:38 -0600 Subject: [PATCH 304/312] Fix formatting of docstring --- packages/core/pattern.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index f9c1852df..02cf91881 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -3723,8 +3723,8 @@ export const phases = (list) => { }; /** - * Establishes an FX chain. Can be called by chaining .FX().FX().. - * calls and/or in a single .FX(, , ..) call. The , .. are _patterns_ which + * Establishes an FX chain. Can be called by chaining .FX(fx1).FX(fx2).. + * calls and/or in a single .FX(fx1, fx2, ..) call. The fx1, .. are _patterns_ which * establish the controls of the given effect. See examples. * @name FX * @memberof Pattern From 7b1e02e8cfbc71a00777d597bb6ec2089b0cbbc4 Mon Sep 17 00:00:00 2001 From: Aria Date: Fri, 2 Jan 2026 11:43:27 -0600 Subject: [PATCH 305/312] Make pan modulatable --- packages/superdough/superdough.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 2e46b2d7e..c2515e324 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -821,6 +821,7 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) // panning if (fx.pan !== undefined) { const panner = ac.createStereoPanner(); + fxNodes['pan'] = [panner]; panner.pan.value = 2 * fx.pan - 1; chain.connect(panner); } From bf243c04b908c2ace4307fabb46396d114f14415 Mon Sep 17 00:00:00 2001 From: Aria Date: Sat, 3 Jan 2026 18:27:11 -0600 Subject: [PATCH 306/312] Make stretch modulatable --- packages/superdough/superdough.mjs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index c2515e324..33c1e404f 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -607,7 +607,11 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) gain *= velocity; // velocity currently only multiplies with gain. it might do other things in the future delaytime = delaytime ?? cycleToSeconds(delaysync, cps); - stretch !== undefined && chain.connect(getWorklet(ac, 'phase-vocoder-processor', { pitchFactor: stretch })); + if (stretch !== undefined) { + const phaseVocoder = getWorklet(ac, 'phase-vocoder-processor', { pitchFactor: stretch }); + chain.connect(phaseVocoder); + fxNodes['stretch'] = [phaseVocoder]; + } if (fx.transient !== undefined) { const transProcessor = getWorklet( From 58094973b06e3cdce02a91d17b0451b91ee08702 Mon Sep 17 00:00:00 2001 From: Forrest Cahoon Date: Sun, 4 Jan 2026 09:39:17 -0600 Subject: [PATCH 307/312] Fix doc link in @strudel/osc README.md --- packages/osc/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/osc/README.md b/packages/osc/README.md index 0a7bfedcf..c606daa59 100644 --- a/packages/osc/README.md +++ b/packages/osc/README.md @@ -46,4 +46,4 @@ all(osc) [open in repl](https://strudel.cc/#JDogcygiYmQqNCIpCgphbGwob3NjKQ%3D%3D) -You can read more about [how to use Superdirt with Strudel the Tutorial](https://strudel.cc/learn/input-output/#superdirt-api) +You can read more about [how to use Superdirt with Strudel](https://strudel.cc/learn/input-output/#oscsuperdirtstrudeldirt) in the tutorial. From b4b01944550e6f678aaa20b35237a39eb92ca02b Mon Sep 17 00:00:00 2001 From: Aria Date: Mon, 5 Jan 2026 23:17:40 -0600 Subject: [PATCH 308/312] Update docstrings and allow modulator ids to be patterns --- packages/core/controls.mjs | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index b18a8dff6..8fef91294 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -2844,7 +2844,7 @@ registerSubControls('lfo', [ ['dcoffset', 'dc'], ['shape', 'sh'], ['skew', 'sk'], - ['curve'], + ['curve', 'cu'], ['sync', 's'], ['fxi'], ]); @@ -2872,7 +2872,7 @@ registerSubControls('bmod', [ ['fxi'], ]); -Pattern.prototype.modulate = function (type, config, id) { +Pattern.prototype.modulate = function (type, config, idPat) { config = { control: undefined, ...config }; const modulatorKeys = ['lfo', 'env', 'bmod']; if (!modulatorKeys.includes(type)) { @@ -2881,11 +2881,14 @@ Pattern.prototype.modulate = function (type, config, id) { } let output = this; let defaultValue = undefined; + // Copy value into a temporary `v` container and attach a single `id` (to be shared across + // each config entry). At the output we destructure and throw away the id + output = output.fmap((v) => (id) => ({ v, id })).appLeft(reify(idPat)); for (const [rawKey, value] of Object.entries(config)) { const key = getMainSubcontrolName(type, rawKey); const valuePat = reify(value); output = output - .fmap((v) => (c) => { + .fmap(({ v, id }) => (c) => { if (defaultValue === undefined) { // default control to the control set just before this in the chain // e.g. pat.gain(0.5).lfo({..}) will be a gain-LFO @@ -2900,17 +2903,17 @@ Pattern.prototype.modulate = function (type, config, id) { id ??= t.__ids.size; t[id] ??= { control: defaultValue }; t.__ids.add(id); // keeps track of insertion order - if (c === undefined) return v; + if (c === undefined) return { v, id }; if (key === 'control' || key === 'subControl') { t[id][key] = getControlName(c); } else { t[id][key] = c; } - return v; + return { v, id }; }) .appLeft(valuePat); } - return output; + return output.fmap(({ v }) => v); }; /** @@ -2925,15 +2928,15 @@ Pattern.prototype.modulate = function (type, config, id) { * * @name lfo * @param {Object} config LFO configuration. - * @param {string | Pattern} [config.control] Node to modulate. Aliases: t - * @param {string | Pattern} [config.subControl] Sub-control name to append to the control key. Aliases: sc, p - * @param {number | Pattern} [config.rate] Modulation rate. Aliases: rate, r + * @param {string | Pattern} [config.control] Node to modulate. Aliases: c + * @param {string | Pattern} [config.subControl] Sub-control name to append to the control key. Aliases: sc + * @param {number | Pattern} [config.rate] Modulation rate. Aliases: r * @param {number | Pattern} [config.depth] Relative modulation depth. Aliases: dep, dr * @param {number | Pattern} [config.depthabs] Absolute modulation depth. Aliases: da * @param {number | Pattern} [config.dcoffset] DC offset / bias for the waveform. Aliases: dc * @param {number | Pattern} [config.shape] Shape index. Aliases: sh * @param {number | Pattern} [config.skew] Skew amount. Aliases: sk - * @param {number | Pattern} [config.curve] Exponential curve amount. Aliases: c + * @param {number | Pattern} [config.curve] Exponential curve amount. Aliases: cu * @param {number | Pattern} [config.sync] Tempo-synced modulation rate. Aliases: s * @param {number | Pattern} [config.fxi] FX index to target * @param {string | Pattern} id ID to use for this modulator @@ -2978,8 +2981,8 @@ export const lfo = (config) => pure({}).lfo(config); * * @name env * @param {Object} config Envelope configuration. - * @param {string | Pattern} [config.control] Node to modulate. Aliases: t - * @param {string | Pattern} [config.subControl] Sub-control name to append to the control key. Aliases: sc, p + * @param {string | Pattern} [config.control] Node to modulate. Aliases: c + * @param {string | Pattern} [config.subControl] Sub-control name to append to the control key. Aliases: sc * @param {number | Pattern} [config.depth] Relative modulation depth. Aliases: dep, dr * @param {number | Pattern} [config.depthabs] Absolute modulation depth. Aliases: da * @param {number | Pattern} [config.attack] Time to reach depth. Aliases: att, a @@ -3039,8 +3042,8 @@ export const env = (config) => pure({}).env(config); * @name bmod * @param {Object} config Bus modulation configuration. * @param {string | Pattern} [config.bus] Bus to get modulation signal from - * @param {string | Pattern} [config.control] Node to modulate. Aliases: t - * @param {string | Pattern} [config.subControl] Sub-control name to append to the control key. Aliases: sc, p + * @param {string | Pattern} [config.control] Node to modulate. Aliases: c + * @param {string | Pattern} [config.subControl] Sub-control name to append to the control key. Aliases: sc * @param {number | Pattern} [config.depth] Relative modulation depth. Aliases: dep, dr * @param {number | Pattern} [config.depthabs] Absolute modulation depth. Aliases: da * @param {number | Pattern} [config.dc] DC offset prior to application From 959e8ac7bc43fece46261cf6c8258fbf040bdede Mon Sep 17 00:00:00 2001 From: yaxu Date: Tue, 6 Jan 2026 16:31:51 +0100 Subject: [PATCH 309/312] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 779769d57..59e2483b3 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ Live coding patterns on the web https://strudel.cc/ +https://codeberg.org/uzu/strudel/ *(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.)* - Try it here: - Docs: From 37dd8343989d1c75ef682205189f3f01bb25c7f9 Mon Sep 17 00:00:00 2001 From: yaxu Date: Tue, 6 Jan 2026 16:33:06 +0100 Subject: [PATCH 310/312] Update README.md --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 59e2483b3..b1208e7bb 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,17 @@ # strudel Live coding patterns on the web -https://strudel.cc/ -https://codeberg.org/uzu/strudel/ *(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.)* + - Try it here: - Docs: +- Source: https://codeberg.org/uzu/strudel/ + * 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**. - Technical Blog Post: - 1 Year of Strudel Blog Post: - 2 Years of Strudel Blog Post: + ## Running Locally After cloning the project, you can run the REPL locally: From f7175c05057a75302c9b0bf0dde2357f3a4de333 Mon Sep 17 00:00:00 2001 From: Aria Date: Thu, 8 Jan 2026 19:40:50 -0600 Subject: [PATCH 311/312] Properly handle subcontrols --- packages/superdough/modulators.mjs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/superdough/modulators.mjs b/packages/superdough/modulators.mjs index 7d119a06b..05674baa0 100644 --- a/packages/superdough/modulators.mjs +++ b/packages/superdough/modulators.mjs @@ -32,8 +32,9 @@ const getNodeParam = (node, name) => { const controlTargets = getSuperdoughControlTargets(); -const getControlData = (control) => { - return controlTargets[control.split('_')[0]]; +const getControlData = (control, subControl) => { + const controlNoIdx = control.split('_')[0]; + return controlTargets[`${controlNoIdx}_${subControl}`] ?? controlTargets[controlNoIdx]; }; const getRangeForParam = (paramName, currentValue) => { @@ -59,8 +60,7 @@ const clampWithWaveShaper = (modulator, min, max) => { }; const getTargetParamsForControl = (control, nodes, subControl) => { - const lookupKey = subControl ? `${control}_${subControl}` : control; - const targetInfo = getControlData(lookupKey) ?? getControlData(control); + const targetInfo = getControlData(control, subControl); if (!targetInfo) { errorLogger( new Error(`Could not find control data for target '${control}'. It may not be modulatable.`), From f6a43f1b1019c081c321bc7dc96b73dcb6167466 Mon Sep 17 00:00:00 2001 From: Aria Date: Thu, 8 Jan 2026 20:28:53 -0600 Subject: [PATCH 312/312] Make the scaling by freq in FM a separate node so that modulators behave like the fm control --- packages/superdough/helpers.mjs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 8bd8b067b..460dd283c 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -461,10 +461,11 @@ export function applyFM(param, value, begin) { nodes[`fm_${idx}`] = [osc]; } const { input, output, freq, osc, toCleanup } = fms[idx]; - const g = gainNode(amt * freq); - io.push(isMod ? output.connect(g) : input); - cleanupOnEnd(osc, [...toCleanup, g]); - nodes[`fm_${idx}_gain`] = [g]; + const gAmt = gainNode(amt); + const gFreq = gainNode(freq); + io.push(isMod ? output.connect(gAmt).connect(gFreq) : input); + cleanupOnEnd(osc, [...toCleanup, gAmt, gFreq]); + nodes[`fm_${idx}_gain`] = [gAmt]; } if (!io[1]) { logger(