diff --git a/.eslintignore b/.eslintignore index 7d807b65..b7660415 100644 --- a/.eslintignore +++ b/.eslintignore @@ -21,4 +21,5 @@ vite.config.js /src-tauri/target/**/* reverbGen.mjs hydra.mjs -jsdoc-synonyms.js \ No newline at end of file +jsdoc-synonyms.js +packages/hs2js/src/hs2js.mjs diff --git a/.eslintrc.json b/.eslintrc.json index 71251141..cf237947 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,5 +1,6 @@ { "env": { + "node": true, "browser": true, "es2021": true }, diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f9bc117c..adb883e5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -130,20 +130,14 @@ npx lerna version --no-private # publish all packages inside /packages using pnpm! don't use lerna to publish!! pnpm --filter "./packages/**" publish --dry-run -# the last command was only a dry-run, make sure everything looks ok, if yes, run the same command without flag +# the last command was only a dry-run. if everything looks ok, run this: + +pnpm --filter "./packages/**" publish --access public ``` To manually publish a single package, increase the version in the `package.json`, then run `pnpm publish`. Important: Always publish with `pnpm`, as `npm` does not support overriding main files in `publishConfig`, which is done in all the packages. -### New Packages - -To add a new package, you have to publish it manually the first time, using: - -```sh -cd packages/ && pnpm publish --access public -``` - ## Have Fun Remember to have fun, and that this project is driven by the passion of volunteers! diff --git a/examples/buildless/headless-simple.html b/examples/buildless/headless-simple.html index 15a56161..61533447 100644 --- a/examples/buildless/headless-simple.html +++ b/examples/buildless/headless-simple.html @@ -1,9 +1,31 @@ - - - - + + + + + + + + + + + + diff --git a/examples/buildless/headless-with-samples.html b/examples/buildless/headless-with-samples.html index 18b5e379..3ac6d42e 100644 --- a/examples/buildless/headless-with-samples.html +++ b/examples/buildless/headless-with-samples.html @@ -1,16 +1,24 @@ - - - - - - + + + + + + + + + + + + + + diff --git a/examples/buildless/hs2js.html b/examples/buildless/hs2js.html new file mode 100644 index 00000000..96b53c53 --- /dev/null +++ b/examples/buildless/hs2js.html @@ -0,0 +1,9 @@ + + + diff --git a/examples/buildless/tidal.html b/examples/buildless/tidal.html new file mode 100644 index 00000000..16416b56 --- /dev/null +++ b/examples/buildless/tidal.html @@ -0,0 +1,98 @@ + + + + + + tidal.html + + + +

+    
+    
+    
+  
+
diff --git a/examples/codemirror-repl/main.js b/examples/codemirror-repl/main.js
index 815db187..5b5714fb 100644
--- a/examples/codemirror-repl/main.js
+++ b/examples/codemirror-repl/main.js
@@ -1,6 +1,7 @@
 import { StrudelMirror } from '@strudel/codemirror';
 import { funk42 } from './tunes';
-import { drawPianoroll, evalScope } from '@strudel/core';
+import { evalScope } from '@strudel/core';
+import { drawPianoroll } from '@strudel/draw';
 import './style.css';
 import { initAudioOnFirstClick } from '@strudel/webaudio';
 import { transpiler } from '@strudel/transpiler';
@@ -26,6 +27,7 @@ const editor = new StrudelMirror({
     initAudioOnFirstClick(); // needed to make the browser happy (don't await this here..)
     const loadModules = evalScope(
       import('@strudel/core'),
+      import('@strudel/draw'),
       import('@strudel/mini'),
       import('@strudel/tonal'),
       import('@strudel/webaudio'),
diff --git a/examples/codemirror-repl/package.json b/examples/codemirror-repl/package.json
index 403f34af..ec178d48 100644
--- a/examples/codemirror-repl/package.json
+++ b/examples/codemirror-repl/package.json
@@ -14,6 +14,7 @@
   "dependencies": {
     "@strudel/codemirror": "workspace:*",
     "@strudel/core": "workspace:*",
+    "@strudel/draw": "workspace:*",
     "@strudel/mini": "workspace:*",
     "@strudel/soundfonts": "workspace:*",
     "@strudel/tonal": "workspace:*",
diff --git a/examples/tidal-repl/.gitignore b/examples/tidal-repl/.gitignore
new file mode 100644
index 00000000..ce99c129
--- /dev/null
+++ b/examples/tidal-repl/.gitignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+
+public/tree-sitter.wasm
+public/tree-sitter-haskell.wasm
diff --git a/examples/tidal-repl/README.md b/examples/tidal-repl/README.md
new file mode 100644
index 00000000..8b07ac19
--- /dev/null
+++ b/examples/tidal-repl/README.md
@@ -0,0 +1,10 @@
+# @strudel/tidal
+
+This is an experiment in implementing tree-sitter for parsing haskell.
+
+```sh
+pnpm i
+cd haskell
+pnpm copy-wasm
+pnpm dev
+```
diff --git a/examples/tidal-repl/index.html b/examples/tidal-repl/index.html
new file mode 100644
index 00000000..25dc693e
--- /dev/null
+++ b/examples/tidal-repl/index.html
@@ -0,0 +1,32 @@
+
+
+  
+    
+    
+    Tree sitter test
+    
+  
+  
+    
+    

+    
+  
+
diff --git a/examples/tidal-repl/main.js b/examples/tidal-repl/main.js
new file mode 100644
index 00000000..3ce301db
--- /dev/null
+++ b/examples/tidal-repl/main.js
@@ -0,0 +1,83 @@
+import { run, parse, loadParser } from 'hs2js';
+import { initStrudel, reify, late, samples, stack } from '@strudel/web';
+
+initStrudel({
+  prebake: () => samples('github:tidalcycles/dirt-samples'),
+});
+
+const ready = loadParser();
+
+const textarea = document.getElementById('code');
+if (window.location.hash) {
+  textarea.value = atob(window.location.hash.slice(1));
+} else {
+  textarea.value = 'd1 $ s "jvbass(3,8)"';
+}
+textarea.addEventListener('input', (e) => {
+  window.location.hash = btoa(e.target.value);
+  update();
+});
+update();
+
+function getInfixOperators() {
+  let operators = {
+    '>': 'set',
+    '#': 'set',
+    '+': 'add',
+    '-': 'sub',
+    '*': 'mul',
+    '/': 'div',
+  };
+  let alignments = {
+    in: (s) => '|' + s,
+    out: (s) => s + '|',
+    mix: (s) => '|' + s + '|',
+  };
+  let ops = {};
+  Object.entries(operators).forEach(([o, name]) => {
+    // operator without alignment
+    ops[o] = (l, r) => reify(l)[name](reify(r));
+    Object.entries(alignments).forEach(([a, getSymbol]) => {
+      // get symbol with alignment
+      let symbol = getSymbol(o);
+      ops[symbol] = (l, r) => reify(l)[name][a](reify(r));
+    });
+  });
+  ops['~>'] = (l, r) => reify(l).late(reify(r));
+  ops['<~'] = (l, r) => reify(l).early(reify(r));
+  ops['<$>'] = (l, r) => reify(r).fmap(l).outerJoin(); // is this right?
+  return ops;
+}
+const ops = getInfixOperators();
+
+async function update() {
+  let result, tree;
+  await ready;
+  try {
+    tree = parse(textarea.value);
+  } catch (err) {
+    console.warn('parse error');
+    console.error(err);
+  }
+  console.log('parsed tree');
+  console.log(tree.rootNode.toString());
+  try {
+    let patterns = {};
+    window.p = (name, pattern) => {
+      patterns[name] = pattern;
+    };
+    window.d1 = (pat) => window.p(1, pat);
+    window.d2 = (pat) => window.p(2, pat);
+    window.d3 = (pat) => window.p(3, pat);
+    window.rot = late;
+    result = run(tree.rootNode, window, ops);
+    if (Object.values(patterns).length) {
+      stack(...Object.values(patterns)).play();
+    }
+  } catch (err) {
+    console.warn('eval error');
+    console.error(err);
+    result = 'ERROR: ' + err.message;
+  }
+  document.getElementById('result').innerHTML = 'Result: ' + result;
+}
diff --git a/examples/tidal-repl/package.json b/examples/tidal-repl/package.json
new file mode 100644
index 00000000..f1e1337c
--- /dev/null
+++ b/examples/tidal-repl/package.json
@@ -0,0 +1,36 @@
+{
+  "name": "tidal-repl",
+  "private": true,
+  "version": "0.0.1",
+  "type": "module",
+  "scripts": {
+    "dev": "vite",
+    "build": "pnpm copy-wasm && vite build",
+    "preview": "vite preview",
+    "copy-wasm": "cp node_modules/hs2js/dist/tree-sitter.wasm public && cp node_modules/hs2js/dist/tree-sitter-haskell.wasm public"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/tidalcycles/strudel.git"
+  },
+  "keywords": [
+    "titdalcycles",
+    "strudel",
+    "pattern",
+    "livecoding",
+    "algorave"
+  ],
+  "author": "Felix Roos ",
+  "license": "AGPL-3.0-or-later",
+  "bugs": {
+    "url": "https://github.com/tidalcycles/strudel/issues"
+  },
+  "homepage": "https://github.com/tidalcycles/strudel#readme",
+  "dependencies": {
+    "@strudel/web": "workspace:*",
+    "hs2js": "workspace:*"
+  },
+  "devDependencies": {
+    "vite": "^5.0.8"
+  }
+}
diff --git a/examples/tidal-repl/public/README.md b/examples/tidal-repl/public/README.md
new file mode 100644
index 00000000..6f8ff001
--- /dev/null
+++ b/examples/tidal-repl/public/README.md
@@ -0,0 +1,3 @@
+# public
+
+this file is just here to make sure the public folder exists
diff --git a/packages/codemirror/codemirror.mjs b/packages/codemirror/codemirror.mjs
index d28bf95d..6bb0af0a 100644
--- a/packages/codemirror/codemirror.mjs
+++ b/packages/codemirror/codemirror.mjs
@@ -1,4 +1,5 @@
 import { closeBrackets } from '@codemirror/autocomplete';
+export { toggleComment, toggleBlockComment, toggleLineComment, toggleBlockCommentByLine } from '@codemirror/commands';
 // import { search, highlightSelectionMatches } from '@codemirror/search';
 import { history } from '@codemirror/commands';
 import { javascript } from '@codemirror/lang-javascript';
@@ -140,27 +141,25 @@ export class StrudelMirror {
     this.root = root;
     this.miniLocations = [];
     this.widgets = [];
-    this.painters = [];
     this.drawTime = drawTime;
     this.drawContext = drawContext;
     this.onDraw = onDraw || this.draw;
     this.id = id || s4();
 
-    this.drawer = new Drawer((haps, time) => {
+    this.drawer = new Drawer((haps, time, _, painters) => {
       const currentFrame = haps.filter((hap) => hap.isActive(time));
       this.highlight(currentFrame, time);
-      this.onDraw(haps, time, this.painters);
+      this.onDraw(haps, time, painters);
     }, drawTime);
 
     this.prebaked = prebake();
     autodraw && this.drawFirstFrame();
-
     this.repl = repl({
       ...replOptions,
+      id,
       onToggle: (started) => {
         replOptions?.onToggle?.(started);
         if (started) {
-          this.adjustDrawTime();
           this.drawer.start(this.repl.scheduler);
           // stop other repls when this one is started
           document.dispatchEvent(
@@ -171,20 +170,11 @@ export class StrudelMirror {
         } else {
           this.drawer.stop();
           updateMiniLocations(this.editor, []);
-          cleanupDraw(false);
+          cleanupDraw(true, id);
         }
       },
       beforeEval: async () => {
-        cleanupDraw();
-        this.painters = [];
-        const self = this;
-        // this is similar to repl.mjs > injectPatternMethods
-        // maybe there is a solution without prototype hacking, but hey, it works
-        // we need to do this befor every eval to make sure it works with multiple StrudelMirror's side by side
-        Pattern.prototype.onPaint = function (onPaint) {
-          self.painters.push(onPaint);
-          return this;
-        };
+        cleanupDraw(true, id);
         await this.prebaked;
         await replOptions?.beforeEval?.();
       },
@@ -198,8 +188,11 @@ export class StrudelMirror {
         updateWidgets(this.editor, widgets);
         updateMiniLocations(this.editor, this.miniLocations);
         replOptions?.afterEval?.(options);
-        this.adjustDrawTime();
-        this.drawer.invalidate();
+        // 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
+        this.drawer.invalidate(this.repl.scheduler);
       },
     });
     this.editor = initEditor({
@@ -234,13 +227,8 @@ export class StrudelMirror {
     };
     document.addEventListener('start-repl', this.onStartRepl);
   }
-  // adjusts draw time depending on if there are painters
-  adjustDrawTime() {
-    // when no painters are set, [0,0] is enough (just highlighting)
-    this.drawer.setDrawTime(this.painters.length ? this.drawTime : [0, 0]);
-  }
-  draw(haps, time) {
-    this.painters?.forEach((painter) => painter(this.drawContext, time, haps, this.drawTime));
+  draw(haps, time, painters) {
+    painters?.forEach((painter) => painter(this.drawContext, time, haps, this.drawTime));
   }
   async drawFirstFrame() {
     if (!this.onDraw) {
@@ -252,7 +240,7 @@ export class StrudelMirror {
       await this.repl.evaluate(this.code, false);
       this.drawer.invalidate(this.repl.scheduler, -0.001);
       // draw at -0.001 to avoid haps at 0 to be visualized as active
-      this.onDraw?.(this.drawer.visibleHaps, -0.001, this.painters);
+      this.onDraw?.(this.drawer.visibleHaps, -0.001, this.drawer.painters);
     } catch (err) {
       console.warn('first frame could not be painted');
     }
@@ -345,6 +333,17 @@ export class StrudelMirror {
   clear() {
     this.onStartRepl && document.removeEventListener('start-repl', this.onStartRepl);
   }
+  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);
+  }
 }
 
 function parseBooleans(value) {
diff --git a/packages/codemirror/package.json b/packages/codemirror/package.json
index 133c4148..5ef5e73b 100644
--- a/packages/codemirror/package.json
+++ b/packages/codemirror/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@strudel/codemirror",
-  "version": "1.0.1",
+  "version": "1.1.0",
   "description": "Codemirror Extensions for Strudel",
   "main": "index.mjs",
   "publishConfig": {
diff --git a/packages/codemirror/themes/algoboy.mjs b/packages/codemirror/themes/algoboy.mjs
index eba95b98..fd7db580 100644
--- a/packages/codemirror/themes/algoboy.mjs
+++ b/packages/codemirror/themes/algoboy.mjs
@@ -12,7 +12,7 @@ export const settings = {
   gutterBackground: 'transparent',
   gutterForeground: '#0f380f',
   light: true,
-  customStyle: '.cm-line { line-height: 1 }',
+  // customStyle: '.cm-line { line-height: 1 }',
 };
 export default createTheme({
   theme: 'light',
diff --git a/packages/codemirror/themes/teletext.mjs b/packages/codemirror/themes/teletext.mjs
index ddbf7b33..630329c1 100644
--- a/packages/codemirror/themes/teletext.mjs
+++ b/packages/codemirror/themes/teletext.mjs
@@ -17,7 +17,7 @@ export const settings = {
   lineBackground: '#00000040',
   gutterBackground: 'transparent',
   gutterForeground: '#8a919966',
-  customStyle: '.cm-line { line-height: 1 }',
+  // customStyle: '.cm-line { line-height: 1 }',
 };
 
 let punctuation = colorD;
diff --git a/packages/core/clockworker.js b/packages/core/clockworker.js
index 4c33de29..bcaf2872 100644
--- a/packages/core/clockworker.js
+++ b/packages/core/clockworker.js
@@ -4,9 +4,9 @@
 // import createClock from './zyklus.mjs';
 
 function getTime() {
-  const precision = 10 ** 4;
-  const seconds = performance.now() / 1000;
-  return Math.round(seconds * precision) / precision;
+  const seconds = performance.now() * 0.001;
+  return seconds;
+  // return Math.round(seconds * precision) / precision;
 }
 
 let num_cycles_at_cps_change = 0;
@@ -24,27 +24,20 @@ const sendMessage = (type, payload) => {
 
 const sendTick = (phase, duration, tick, time) => {
   const num_seconds_since_cps_change = num_ticks_since_cps_change * duration;
-
   const tickdeadline = phase - time;
   const lastTick = time + tickdeadline;
   const num_cycles_since_cps_change = num_seconds_since_cps_change * cps;
-
   const begin = num_cycles_at_cps_change + num_cycles_since_cps_change;
   const secondsSinceLastTick = time - lastTick - duration;
-
   const eventLength = duration * cps;
   const end = begin + eventLength;
-
   const cycle = begin + secondsSinceLastTick * cps;
 
   sendMessage('tick', {
     begin,
     end,
     cps,
-    tickdeadline,
-    num_cycles_at_cps_change,
-    num_seconds_at_cps_change,
-    num_seconds_since_cps_change,
+    time,
     cycle,
   });
   num_ticks_since_cps_change++;
diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs
index d5dbef13..5a275294 100644
--- a/packages/core/controls.mjs
+++ b/packages/core/controls.mjs
@@ -191,7 +191,7 @@ export const { attack, att } = registerControl('attack', 'att');
  * note("c e g b g e")
  * .fm(4)
  * .fmh("<1 2 1.5 1.61>")
- * .scope()
+ * ._scope()
  *
  */
 export const { fmh } = registerControl(['fmh', 'fmi'], 'fmh');
@@ -205,7 +205,7 @@ export const { fmh } = registerControl(['fmh', 'fmi'], 'fmh');
  * @example
  * note("c e g b g e")
  * .fm("<0 1 2 8 32>")
- * .scope()
+ * ._scope()
  *
  */
 export const { fmi, fm } = registerControl(['fmi', 'fmh'], 'fm');
@@ -221,7 +221,7 @@ export const { fmi, fm } = registerControl(['fmi', 'fmh'], 'fm');
  * .fmdecay(.2)
  * .fmsustain(0)
  * .fmenv("")
- * .scope()
+ * ._scope()
  *
  */
 export const { fmenv } = registerControl('fmenv');
@@ -234,7 +234,7 @@ export const { fmenv } = registerControl('fmenv');
  * note("c e g b g e")
  * .fm(4)
  * .fmattack("<0 .05 .1 .2>")
- * .scope()
+ * ._scope()
  *
  */
 export const { fmattack } = registerControl('fmattack');
@@ -248,7 +248,7 @@ export const { fmattack } = registerControl('fmattack');
  * .fm(4)
  * .fmdecay("<.01 .05 .1 .2>")
  * .fmsustain(.4)
- * .scope()
+ * ._scope()
  *
  */
 export const { fmdecay } = registerControl('fmdecay');
@@ -262,7 +262,7 @@ export const { fmdecay } = registerControl('fmdecay');
  * .fm(4)
  * .fmdecay(.1)
  * .fmsustain("<1 .75 .5 0>")
- * .scope()
+ * ._scope()
  *
  */
 export const { fmsustain } = registerControl('fmsustain');
@@ -392,7 +392,7 @@ export const { loop } = registerControl('loop');
  * @synonyms loopb
  * @example
  * s("space").loop(1)
- * .loopBegin("<0 .125 .25>").scope()
+ * .loopBegin("<0 .125 .25>")._scope()
  */
 export const { loopBegin, loopb } = registerControl('loopBegin', 'loopb');
 /**
@@ -405,7 +405,7 @@ export const { loopBegin, loopb } = registerControl('loopBegin', 'loopb');
  * @synonyms loope
  * @example
  * s("space").loop(1)
- * .loopEnd("<1 .75 .5 .25>").scope()
+ * .loopEnd("<1 .75 .5 .25>")._scope()
  */
 export const { loopEnd, loope } = registerControl('loopEnd', 'loope');
 /**
@@ -430,6 +430,17 @@ export const { crush } = registerControl('crush');
  */
 export const { coarse } = registerControl('coarse');
 
+/**
+ * filter overdrive for supported filter types
+ *
+ * @name drive
+ * @param {number | Pattern} amount
+ * @example
+ * note("{f g g c d a a#}%16".sub(17)).s("supersaw").lpenv(8).lpf(150).lpq(.8).ftype('ladder').drive("<.5 4>")
+ *
+ */
+export const { drive } = registerControl('drive');
+
 /**
  * Allows you to set the output channels on the interface
  *
@@ -443,9 +454,6 @@ export const { coarse } = registerControl('coarse');
  */
 export const { channels, ch } = registerControl('channels', 'ch');
 
-// superdirt only
-export const { phaserrate, phasr } = registerControl('phaserrate', 'phasr');
-
 /**
  * Phaser audio effect that approximates popular guitar pedals.
  *
@@ -457,7 +465,11 @@ export const { phaserrate, phasr } = registerControl('phaserrate', 'phasr');
  * .phaser("<1 2 4 8>")
  *
  */
-export const { phaser, ph } = registerControl(['phaser', 'phaserdepth', 'phasercenter', 'phasersweep'], 'ph');
+export const { phaserrate, ph, phaser } = registerControl(
+  ['phaserrate', 'phaserdepth', 'phasercenter', 'phasersweep'],
+  'ph',
+  'phaser',
+);
 
 /**
  * The frequency sweep range of the lfo for the phaser effect. Defaults to 2000
@@ -542,7 +554,7 @@ export const { cutoff, ctf, lpf, lp } = registerControl(['cutoff', 'resonance',
  * @example
  * note("c2 e2 f2 g2")
  * .sound('sawtooth')
- * .lpf(500)
+ * .lpf(300)
  * .lpa(.5)
  * .lpenv("<4 2 1 0 -1 -2 -4>/4")
  */
@@ -581,7 +593,7 @@ export const { bpenv, bpe } = registerControl('bpenv', 'bpe');
  * @example
  * note("c2 e2 f2 g2")
  * .sound('sawtooth')
- * .lpf(500)
+ * .lpf(300)
  * .lpa("<.5 .25 .1 .01>/4")
  * .lpenv(4)
  */
@@ -620,9 +632,8 @@ export const { bpattack, bpa } = registerControl('bpattack', 'bpa');
  * @example
  * note("c2 e2 f2 g2")
  * .sound('sawtooth')
- * .lpf(500)
+ * .lpf(300)
  * .lpd("<.5 .25 .1 0>/4")
- * .lps(0.2)
  * .lpenv(4)
  */
 export const { lpdecay, lpd } = registerControl('lpdecay', 'lpd');
@@ -662,7 +673,7 @@ export const { bpdecay, bpd } = registerControl('bpdecay', 'bpd');
  * @example
  * note("c2 e2 f2 g2")
  * .sound('sawtooth')
- * .lpf(500)
+ * .lpf(300)
  * .lpd(.5)
  * .lps("<0 .25 .5 1>/4")
  * .lpenv(4)
@@ -705,7 +716,7 @@ export const { bpsustain, bps } = registerControl('bpsustain', 'bps');
  * note("c2 e2 f2 g2")
  * .sound('sawtooth')
  * .clip(.5)
- * .lpf(500)
+ * .lpf(300)
  * .lpenv(4)
  * .lpr("<.5 .25 .1 0>/4")
  * .release(.5)
@@ -742,17 +753,28 @@ export const { hprelease, hpr } = registerControl('hprelease', 'hpr');
  */
 export const { bprelease, bpr } = registerControl('bprelease', 'bpr');
 /**
- * Sets the filter type. The 24db filter is more aggressive. More types might be added in the future.
+ * Sets the filter type. The ladder filter is more aggressive. More types might be added in the future.
  * @name ftype
- * @param {number | Pattern} type 12db (default) or 24db
+ * @param {number | Pattern} type 12db (0), ladder (1), or 24db (2)
  * @example
- * note("c2 e2 f2 g2")
+ * note("{f g g c d a a#}%8").s("sawtooth").lpenv(4).lpf(500).ftype("<0 1 2>").lpq(1)
+ * @example
+ * note("c f g g a c d4").fast(2)
  * .sound('sawtooth')
- * .lpf(500)
- * .bpenv(4)
- * .ftype("12db 24db")
+ * .lpf(200).fanchor(0)
+ * .lpenv(3).lpq(1)
+ * .ftype("")
  */
 export const { ftype } = registerControl('ftype');
+
+/**
+ * controls the center of the filter envelope. 0 is unipolar positive, .5 is bipolar, 1 is unipolar negative
+ * @name fanchor
+ * @param {number | Pattern} center 0 to 1
+ * @example
+ * note("{f g g c d a a#}%8").s("sawtooth").lpf("{1000}%2")
+ * .lpenv(8).fanchor("<0 .5 1>")
+ */
 export const { fanchor } = registerControl('fanchor');
 /**
  * Applies the cutoff frequency of the **h**igh-**p**ass **f**ilter.
@@ -779,10 +801,12 @@ export const { fanchor } = registerControl('fanchor');
  * @example
  * note("a e")
  * .vib("<.5 1 2 4 8 16>")
+ * ._scope()
  * @example
  * // change the modulation depth with ":"
  * note("a e")
  * .vib("<.5 1 2 4 8 16>:12")
+ * ._scope()
  */
 export const { vib, vibrato, v } = registerControl(['vib', 'vibmod'], 'vibrato', 'v');
 /**
@@ -803,10 +827,12 @@ export const { noise } = registerControl('noise');
  * @example
  * note("a e").vib(4)
  * .vibmod("<.25 .5 1 2 12>")
+ * ._scope()
  * @example
  * // change the vibrato frequency with ":"
  * note("a e")
  * .vibmod("<.25 .5 1 2 12>:8")
+ * ._scope()
  */
 export const { vibmod, vmod } = registerControl(['vibmod', 'vib'], 'vmod');
 export const { hcutoff, hpf, hp } = registerControl(['hcutoff', 'hresonance', 'hpenv'], 'hpf', 'hp');
@@ -1358,6 +1384,17 @@ export const { compressorRelease } = registerControl('compressorRelease');
  *
  */
 export const { speed } = registerControl('speed');
+
+/**
+ * Changes the speed of sample playback, i.e. a cheap way of changing pitch.
+ *
+ * @name stretch
+ * @param {number | Pattern} factor -inf to inf, negative numbers play the sample backwards.
+ * @example
+ * s("gm_flute").stretch("1 2 .5")
+ *
+ */
+export const { stretch } = registerControl('stretch');
 /**
  * Used in conjunction with `speed`, accepts values of "r" (rate, default behavior), "c" (cycles), or "s" (seconds). Using `unit "c"` means `speed` will be interpreted in units of cycles, e.g. `speed "1"` means samples will be stretched to fill a cycle. Using `unit "s"` means the playback speed will be adjusted so that the duration is the number of seconds specified by `speed`.
  *
@@ -1368,6 +1405,7 @@ export const { speed } = registerControl('speed');
  * @superdirtOnly
  *
  */
+
 export const { unit } = registerControl('unit');
 /**
  * Made by Calum Gunn. Reminiscent of some weird mixture of filter, ring-modulator and pitch-shifter. The SuperCollider manual defines Squiz as:
diff --git a/packages/core/cyclist.mjs b/packages/core/cyclist.mjs
index 08b89375..472e83a8 100644
--- a/packages/core/cyclist.mjs
+++ b/packages/core/cyclist.mjs
@@ -8,8 +8,19 @@ import createClock from './zyklus.mjs';
 import { logger } from './logger.mjs';
 
 export class Cyclist {
-  constructor({ interval, onTrigger, onToggle, onError, getTime, latency = 0.1, setInterval, clearInterval }) {
+  constructor({
+    interval,
+    onTrigger,
+    onToggle,
+    onError,
+    getTime,
+    latency = 0.1,
+    setInterval,
+    clearInterval,
+    beforeStart,
+  }) {
     this.started = false;
+    this.beforeStart = beforeStart;
     this.cps = 0.5;
     this.num_ticks_since_cps_change = 0;
     this.lastTick = 0; // absolute time when last tick (clock callback) happened
@@ -82,7 +93,8 @@ export class Cyclist {
     this.started = v;
     this.onToggle?.(v);
   }
-  start() {
+  async start() {
+    await this.beforeStart?.();
     this.num_ticks_since_cps_change = 0;
     this.num_cycles_at_cps_change = 0;
     if (!this.pattern) {
@@ -103,10 +115,10 @@ export class Cyclist {
     this.lastEnd = 0;
     this.setStarted(false);
   }
-  setPattern(pat, autostart = false) {
+  async setPattern(pat, autostart = false) {
     this.pattern = pat;
     if (autostart && !this.started) {
-      this.start();
+      await this.start();
     }
   }
   setCps(cps = 0.5) {
diff --git a/packages/core/evaluate.mjs b/packages/core/evaluate.mjs
index ea63d8df..e3e73d59 100644
--- a/packages/core/evaluate.mjs
+++ b/packages/core/evaluate.mjs
@@ -4,8 +4,6 @@ Copyright (C) 2022 Strudel contributors - see .
 */
 
-import { isPattern } from './index.mjs';
-
 export const evalScope = async (...args) => {
   const results = await Promise.allSettled(args);
   const modules = results.filter((result) => result.status === 'fulfilled').map((r) => r.value);
@@ -37,11 +35,12 @@ function safeEval(str, options = {}) {
   return Function(body)();
 }
 
-export const evaluate = async (code, transpiler) => {
+export const evaluate = async (code, transpiler, transpilerOptions) => {
   let meta = {};
+
   if (transpiler) {
     // transform syntactically correct js code to semantically usable code
-    const transpiled = transpiler(code);
+    const transpiled = transpiler(code, transpilerOptions);
     code = transpiled.output;
     meta = transpiled;
   }
diff --git a/packages/core/fraction.mjs b/packages/core/fraction.mjs
index a339567f..dc7fe27a 100644
--- a/packages/core/fraction.mjs
+++ b/packages/core/fraction.mjs
@@ -119,10 +119,10 @@ export const lcm = (...fractions) => {
   if (fractions.length === 0) {
     return undefined;
   }
-
+  const x = fractions.pop();
   return fractions.reduce(
     (lcm, fraction) => (lcm === undefined || fraction === undefined ? undefined : lcm.lcm(fraction)),
-    fraction(1),
+    x,
   );
 };
 
diff --git a/packages/core/neocyclist.mjs b/packages/core/neocyclist.mjs
index 4600d0ef..ad22cf00 100644
--- a/packages/core/neocyclist.mjs
+++ b/packages/core/neocyclist.mjs
@@ -5,6 +5,7 @@ This program is free software: you can redistribute it and/or modify it under th
 */
 
 import { logger } from './logger.mjs';
+import { ClockCollator, cycleToSeconds } from './util.mjs';
 
 export class NeoCyclist {
   constructor({ onTrigger, onToggle, getTime }) {
@@ -13,79 +14,38 @@ export class NeoCyclist {
     this.lastTick = 0; // absolute time when last tick (clock callback) happened
     this.getTime = getTime; // get absolute time
     this.time_at_last_tick_message = 0;
-
-    this.num_cycles_at_cps_change = 0;
+    // the clock of the worker and the audio context clock can drift apart over time
+    // aditionally, the message time of the worker pinging the callback to process haps can be inconsistent.
+    // we need to keep a rolling average of the time difference between the worker clock and audio context clock
+    // in order to schedule events consistently.
+    this.collator = new ClockCollator({ getTargetClockTime: getTime });
     this.onToggle = onToggle;
     this.latency = 0.1; // fixed trigger time offset
     this.cycle = 0;
     this.id = Math.round(Date.now() * Math.random());
-    this.worker_time_dif;
     this.worker = new SharedWorker(new URL('./clockworker.js', import.meta.url));
     this.worker.port.start();
-
     this.channel = new BroadcastChannel('strudeltick');
-    let weight = 0; // the amount of weight that is applied to the current average when averaging a new time dif
-    const maxWeight = 20;
-    const precision = 10 ** 3; //round off time diff to prevent accumulating outliers
-
-    // the clock of the worker and the audio context clock can drift apart over time
-    // aditionally, the message time of the worker pinging the callback to process haps can be inconsistent.
-    // we need to keep a rolling weighted average of the time difference between the worker clock and audio context clock
-    // in order to schedule events consistently.
-    const setTimeReference = (num_seconds_at_cps_change, num_seconds_since_cps_change, tickdeadline) => {
-      const time_dif = getTime() - (num_seconds_at_cps_change + num_seconds_since_cps_change) + tickdeadline;
-      if (this.worker_time_dif == null) {
-        this.worker_time_dif = time_dif;
-      } else {
-        const w = 1; //weight of new time diff;
-        const new_dif =
-          Math.round(((this.worker_time_dif * weight + time_dif * w) / (weight + w)) * precision) / precision;
-
-        if (new_dif != this.worker_time_dif) {
-          // reset the weight so the clock recovers faster from an audio context freeze/dropout if it happens
-          weight = 4;
-        }
-        this.worker_time_dif = new_dif;
-      }
-      weight = Math.min(weight + 1, maxWeight);
-    };
-
     const tickCallback = (payload) => {
-      const {
-        num_cycles_at_cps_change,
-        cps,
-        num_seconds_at_cps_change,
-        num_seconds_since_cps_change,
-        begin,
-        end,
-        tickdeadline,
-        cycle,
-      } = payload;
+      const { cps, begin, end, cycle, time } = payload;
       this.cps = cps;
       this.cycle = cycle;
-
-      setTimeReference(num_seconds_at_cps_change, num_seconds_since_cps_change, tickdeadline);
-
-      processHaps(begin, end, num_cycles_at_cps_change, num_seconds_at_cps_change);
-
-      this.time_at_last_tick_message = this.getTime();
+      const currentTime = this.collator.calculateOffset(time) + time;
+      processHaps(begin, end, currentTime);
+      this.time_at_last_tick_message = currentTime;
     };
 
-    const processHaps = (begin, end, num_cycles_at_cps_change, seconds_at_cps_change) => {
+    const processHaps = (begin, end, currentTime) => {
       if (this.started === false) {
         return;
       }
 
       const haps = this.pattern.queryArc(begin, end, { _cps: this.cps });
-
       haps.forEach((hap) => {
         if (hap.hasOnset()) {
-          const targetTime =
-            (hap.whole.begin - num_cycles_at_cps_change) / this.cps +
-            seconds_at_cps_change +
-            this.latency +
-            this.worker_time_dif;
-          const duration = hap.duration / this.cps;
+          const timeUntilTrigger = cycleToSeconds(hap.whole.begin - this.cycle, this.cps);
+          const targetTime = timeUntilTrigger + currentTime + this.latency;
+          const duration = cycleToSeconds(hap.duration, this.cps);
           onTrigger?.(hap, 0, duration, this.cps, targetTime);
         }
       });
@@ -129,8 +89,8 @@ export class NeoCyclist {
     this.setStarted(true);
   }
   stop() {
-    this.worker_time_dif = null;
     logger('[cyclist] stop');
+    this.collator.reset();
     this.setStarted(false);
   }
   setPattern(pat, autostart = false) {
diff --git a/packages/core/package.json b/packages/core/package.json
index 6c95d049..8accf3c0 100644
--- a/packages/core/package.json
+++ b/packages/core/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@strudel/core",
-  "version": "1.0.1",
+  "version": "1.1.0",
   "description": "Port of Tidal Cycles to JavaScript",
   "main": "index.mjs",
   "type": "module",
diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs
index 03ce2e2d..0d3b7cbb 100644
--- a/packages/core/pattern.mjs
+++ b/packages/core/pattern.mjs
@@ -94,6 +94,14 @@ export class Pattern {
     return result;
   }
 
+  // runs func on query state
+  withState(func) {
+    return this.withHaps((haps, state) => {
+      func(state);
+      return haps;
+    });
+  }
+
   /**
    * see `withValue`
    * @noAutocomplete
@@ -378,6 +386,15 @@ export class Pattern {
     return this.fmap(func).squeezeJoin();
   }
 
+  polyJoin = function () {
+    const pp = this;
+    return pp.fmap((p) => p.s_extend(pp.tactus.div(p.tactus))).outerJoin();
+  };
+
+  polyBind(func) {
+    return this.fmap(func).polyJoin();
+  }
+
   //////////////////////////////////////////////////////////////////////
   // Utility methods mainly for internal use
 
@@ -746,6 +763,10 @@ export class Pattern {
     const otherPat = reify(other);
     return otherPat.fmap((b) => this.fmap((a) => func(a)(b))).restartJoin();
   }
+  _opPoly(other, func) {
+    const otherPat = reify(other);
+    return this.fmap((b) => otherPat.fmap((a) => func(a)(b))).polyJoin();
+  }
 
   //////////////////////////////////////////////////////////////////////
   // End-user methods.
@@ -1054,7 +1075,7 @@ function _composeOp(a, b, func) {
     func: [(a, b) => b(a)],
   };
 
-  const hows = ['In', 'Out', 'Mix', 'Squeeze', 'SqueezeOut', 'Reset', 'Restart'];
+  const hows = ['In', 'Out', 'Mix', 'Squeeze', 'SqueezeOut', 'Reset', 'Restart', 'Poly'];
 
   // generate methods to do what and how
   for (const [what, [op, preprocess]] of Object.entries(composers)) {
@@ -1409,12 +1430,45 @@ export function arrange(...sections) {
   return s_cat(...sections).slow(total);
 }
 
+/**
+ * Similarly to `arrange`, allows you to arrange multiple patterns together over multiple cycles.
+ * Unlike `arrange`, you specify a start and stop time for each pattern rather than duration, which
+ * means that patterns can overlap.
+ * @return {Pattern}
+ * @example
+seqPLoop([0, 2, "bd(3,8)"],
+         [1, 3, "cp(3,8)"]
+        )
+  .sound()
+ */
+export function seqPLoop(...parts) {
+  let total = Fraction(0);
+  const pats = [];
+  for (let part of parts) {
+    if (part.length == 2) {
+      part.unshift(total);
+    }
+    total = part[1];
+  }
+
+  return stack(
+    ...parts.map(([start, stop, pat]) =>
+      pure(reify(pat)).compress(Fraction(start).div(total), Fraction(stop).div(total)),
+    ),
+  )
+    .slow(total)
+    .innerJoin(); // or resetJoin or restartJoin ??
+}
+
 export function fastcat(...pats) {
   let result = slowcat(...pats);
   if (pats.length > 1) {
     result = result._fast(pats.length);
     result.tactus = pats.length;
   }
+  if (pats.length == 1 && pats[0].__tactus_source) {
+    pats.tactus = pats[0].tactus;
+  }
   return result;
 }
 
@@ -1558,7 +1612,11 @@ export function register(name, func, patternify = true, preserveTactus = false,
     // There are patternified args, so lets make an unpatternified
     // version, prefixed by '_'
     Pattern.prototype['_' + name] = function (...args) {
-      return func(...args, this);
+      const result = func(...args, this);
+      if (preserveTactus) {
+        result.setTactus(this.tactus);
+      }
+      return result;
     };
   }
 
@@ -2523,7 +2581,7 @@ export function _polymeterListSteps(steps, ...args) {
  * @param  {any[]} patterns one or more patterns
  * @example
  * // the same as "{c d, e f g}%4"
- * s_polymeterSteps(4, "c d", "e f g")
+ * s_polymeterSteps(4, "c d", "e f g").note()
  */
 export function s_polymeterSteps(steps, ...args) {
   if (args.length == 0) {
@@ -2541,8 +2599,8 @@ export function s_polymeterSteps(steps, ...args) {
  * *EXPERIMENTAL* - Combines the given lists of patterns with the same pulse, creating polymeters when different sized sequences are used.
  * @synonyms pm
  * @example
- * // The same as "{c eb g, c2 g2}"
- * s_polymeter("c eb g", "c2 g2")
+ * // The same as note("{c eb g, c2 g2}")
+ * s_polymeter("c eb g", "c2 g2").note()
  *
  */
 export function s_polymeter(...args) {
@@ -2571,6 +2629,8 @@ export function s_polymeter(...args) {
 /** Sequences patterns like `seq`, but each pattern has a length, relative to the whole.
  * This length can either be provided as a [length, pattern] pair, or inferred from
  * the pattern's 'tactus', generally inferred by the mininotation. Has the alias `timecat`.
+ * @name s_cat
+ * @synonyms timeCat, timecat
  * @return {Pattern}
  * @example
  * s_cat([3,"e3"],[1, "g3"]).note()
@@ -2602,8 +2662,7 @@ export function s_cat(...timepats) {
   }
   if (timepats.length == 1) {
     const result = reify(timepats[0][1]);
-    result.tactus = timepats[0][0];
-    return result;
+    return result.withTactus((_) => timepats[0][0]);
   }
 
   const total = timepats.map((a) => a[0]).reduce((a, b) => a.add(b), Fraction(0));
@@ -2696,6 +2755,10 @@ export const s_sub = stepRegister('s_sub', function (i, pat) {
   return pat.s_add(pat.tactus.sub(i));
 });
 
+export const s_cycles = stepRegister('s_extend', function (factor, pat) {
+  return pat.fast(factor).s_expand(factor);
+});
+
 export const s_expand = stepRegister('s_expand', function (factor, pat) {
   return pat.withTactus((t) => t.mul(Fraction(factor)));
 });
@@ -2794,8 +2857,16 @@ export const s_tour = function (pat, ...many) {
 export const chop = register('chop', function (n, pat) {
   const slices = Array.from({ length: n }, (x, i) => i);
   const slice_objects = slices.map((i) => ({ begin: i / n, end: (i + 1) / n }));
+  const merge = function (a, b) {
+    if ('begin' in a && 'end' in a && a.begin !== undefined && a.end !== undefined) {
+      const d = a.end - a.begin;
+      b = { begin: a.begin + b.begin * d, end: a.begin + b.end * d };
+    }
+    // return a;
+    return Object.assign({}, a, b);
+  };
   const func = function (o) {
-    return sequence(slice_objects.map((slice_o) => Object.assign({}, o, slice_o)));
+    return sequence(slice_objects.map((slice_o) => merge(o, slice_o)));
   };
   return pat.squeezeBind(func).setTactus(__tactus ? Fraction(n).mulmaybe(pat.tactus) : undefined);
 });
@@ -2901,7 +2972,8 @@ export const splice = register(
 );
 
 export const { loopAt, loopat } = register(['loopAt', 'loopat'], function (factor, pat) {
-  return new Pattern((state) => _loopAt(factor, pat, state.controls._cps).query(state));
+  const tactus = pat.tactus ? pat.tactus.div(factor) : undefined;
+  return new Pattern((state) => _loopAt(factor, pat, state.controls._cps).query(state), tactus);
 });
 
 /**
@@ -2915,11 +2987,14 @@ export const { loopAt, loopat } = register(['loopAt', 'loopat'], function (facto
 export const fit = register('fit', (pat) =>
   pat.withHaps((haps, state) =>
     haps.map((hap) =>
-      hap.withValue((v) => ({
-        ...v,
-        speed: (state.controls._cps || 1) / hap.whole.duration,
-        unit: 'c',
-      })),
+      hap.withValue((v) => {
+        const slicedur = ('end' in v ? v.end : 1) - ('begin' in v ? v.begin : 0);
+        return {
+          ...v,
+          speed: ((state.controls._cps || 1) / hap.whole.duration) * slicedur,
+          unit: 'c',
+        };
+      }),
     ),
   ),
 );
diff --git a/packages/core/repl.mjs b/packages/core/repl.mjs
index 5b7bcd71..016eca3e 100644
--- a/packages/core/repl.mjs
+++ b/packages/core/repl.mjs
@@ -10,6 +10,7 @@ export function repl({
   defaultOutput,
   onEvalError,
   beforeEval,
+  beforeStart,
   afterEval,
   getTime,
   transpiler,
@@ -19,6 +20,7 @@ export function repl({
   sync = false,
   setInterval,
   clearInterval,
+  id,
 }) {
   const state = {
     schedulerError: undefined,
@@ -32,6 +34,10 @@ export function repl({
     started: false,
   };
 
+  const transpilerOptions = {
+    id,
+  };
+
   const updateState = (update) => {
     Object.assign(state, update);
     state.isDirty = state.code !== state.activeCode;
@@ -48,6 +54,7 @@ export function repl({
     },
     setInterval,
     clearInterval,
+    beforeStart,
   };
 
   // NeoCyclist uses a shared worker to communicate between instances, which is not supported on mobile chrome
@@ -64,9 +71,10 @@ export function repl({
     return silence;
   };
 
-  const setPattern = (pattern, autostart = true) => {
+  const setPattern = async (pattern, autostart = true) => {
     pattern = editPattern?.(pattern) || pattern;
-    scheduler.setPattern(pattern, autostart);
+    await scheduler.setPattern(pattern, autostart);
+    return pattern;
   };
   setTime(() => scheduler.now()); // TODO: refactor?
 
@@ -139,9 +147,10 @@ export function repl({
     try {
       updateState({ code, pending: true });
       await injectPatternMethods();
+      setTime(() => scheduler.now()); // TODO: refactor?
       await beforeEval?.({ code });
       shouldHush && hush();
-      let { pattern, meta } = await _evaluate(code, transpiler);
+      let { pattern, meta } = await _evaluate(code, transpiler, transpilerOptions);
       if (Object.keys(pPatterns).length) {
         pattern = stack(...Object.values(pPatterns));
       }
@@ -153,7 +162,7 @@ export function repl({
         throw new Error(message + (typeof evaluated === 'function' ? ', did you forget to call a function?' : '.'));
       }
       logger(`[eval] code updated`);
-      setPattern(pattern, autostart);
+      pattern = await setPattern(pattern, autostart);
       updateState({
         miniLocations: meta?.miniLocations || [],
         widgets: meta?.widgets || [],
diff --git a/packages/core/signal.mjs b/packages/core/signal.mjs
index 375c4f67..c0637383 100644
--- a/packages/core/signal.mjs
+++ b/packages/core/signal.mjs
@@ -86,6 +86,38 @@ export const tri2 = fastcat(isaw2, saw2);
 
 export const time = signal(id);
 
+/**
+ *  The mouse's x position value ranges from 0 to 1.
+ * @name mousex
+ * @return {Pattern}
+ * @example
+ * n(mousex.segment(4).range(0,7)).scale("C:minor")
+ *
+ */
+
+/**
+ *  The mouse's y position value ranges from 0 to 1.
+ * @name mousey
+ * @return {Pattern}
+ * @example
+ * n(mousey.segment(4).range(0,7)).scale("C:minor")
+ *
+ */
+let _mouseY = 0,
+  _mouseX = 0;
+if (typeof window !== 'undefined') {
+  //document.onmousemove = (e) => {
+  document.addEventListener('mousemove', (e) => {
+    _mouseY = e.clientY / document.body.clientHeight;
+    _mouseX = e.clientX / document.body.clientWidth;
+  });
+}
+
+export const mousey = signal(() => _mouseY);
+export const mouseY = signal(() => _mouseY);
+export const mousex = signal(() => _mouseX);
+export const mouseX = signal(() => _mouseX);
+
 // random signals
 
 const xorwise = (x) => {
@@ -106,7 +138,7 @@ const timeToRand = (x) => Math.abs(intSeedToRand(timeToIntSeed(x)));
 const timeToRandsPrime = (seed, n) => {
   const result = [];
   // eslint-disable-next-line
-  for (let i = 0; i < n; ++n) {
+  for (let i = 0; i < n; ++i) {
     result.push(intSeedToRand(seed));
     seed = xorwise(seed);
   }
@@ -127,6 +159,50 @@ const timeToRands = (t, n) => timeToRandsPrime(timeToIntSeed(t), n);
  */
 export const run = (n) => saw.range(0, n).floor().segment(n);
 
+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 nums = rands
+      .map((n, i) => [n, i])
+      .sort((a, b) => a[0] > b[0] - a[0] < b[0])
+      .map((x) => x[1]);
+    const i = t.cyclePos().mul(n).floor() % n;
+    return nums[i];
+  })._segment(n);
+};
+
+const _rearrangeWith = (ipat, n, pat) => {
+  const pats = [...Array(n).keys()].map((i) => pat.zoom(Fraction(i).div(n), Fraction(i + 1).div(n)));
+  return ipat.fmap((i) => pats[i].repeatCycles(n)._fast(n)).innerJoin();
+};
+
+/**
+ * @name shuffle
+ * Slices a pattern into the given number of parts, then plays those parts in random order.
+ * Each part will be played exactly once per cycle.
+ * @example
+ * note("c d e f").sound("piano").shuffle(4)
+ * @example
+ * note("c d e f".shuffle(4), "g").sound("piano")
+ */
+export const shuffle = register('shuffle', (n, pat) => {
+  return _rearrangeWith(randrun(n), n, pat);
+});
+
+/**
+ * @name scramble
+ * Slices a pattern into the given number of parts, then plays those parts at random. Similar to `shuffle`,
+ * but parts might be played more than once, or not at all, per cycle.
+ * @example
+ * note("c d e f").sound("piano").scramble(4)
+ * @example
+ * note("c d e f".scramble(4), "g").sound("piano")
+ */
+export const scramble = register('scramble', (n, pat) => {
+  return _rearrangeWith(_irand(n)._segment(n), n, pat);
+});
+
 /**
  * A continuous pattern of random numbers, between 0 and 1.
  *
@@ -294,6 +370,13 @@ export const pickRestart = register('pickRestart', function (lookup, pat) {
  * @param {Pattern} pat
  * @param {*} xs
  * @returns {Pattern}
+ * @example
+ * "".pickRestart({
+      a: n("0 1 2 0"),
+      b: n("2 3 4 ~"),
+      c: n("[4 5] [4 3] 2 0"),
+      d: n("0 -3 0 ~")
+    }).scale("C:major").s("piano")
  */
 export const pickmodRestart = register('pickmodRestart', function (lookup, pat) {
   return _pick(lookup, pat, true).restartJoin();
diff --git a/packages/core/test/pattern.test.mjs b/packages/core/test/pattern.test.mjs
index 845ed00a..31ec4868 100644
--- a/packages/core/test/pattern.test.mjs
+++ b/packages/core/test/pattern.test.mjs
@@ -937,6 +937,9 @@ describe('Pattern', () => {
           .firstCycle(),
       );
     });
+    it('Can chop chops', () => {
+      expect(pure({ s: 'bev' }).chop(2).chop(2).firstCycle()).toStrictEqual(pure({ s: 'bev' }).chop(4).firstCycle());
+    });
   });
   describe('range', () => {
     it('Can be patterned', () => {
@@ -1209,4 +1212,45 @@ describe('Pattern', () => {
       }
     });
   });
+  describe('s_expand', () => {
+    it('can expand four things in half', () => {
+      expect(
+        sameFirst(
+          sequence(0, 1, 2, 3).s_expand(1, 0.5),
+          s_cat(sequence(0, 1, 2, 3), sequence(0, 1, 2, 3).s_expand(0.5)),
+        ),
+      );
+    });
+    it('can expand five things in half', () => {
+      expect(
+        sameFirst(
+          sequence(0, 1, 2, 3, 4).s_expand(1, 0.5),
+          s_cat(sequence(0, 1, 2, 3, 4), sequence(0, 1, 2, 3, 4).s_expand(0.5)),
+        ),
+      );
+    });
+  });
+  describe('stepJoin', () => {
+    it('can join a pattern with a tactus of 2', () => {
+      expect(
+        sameFirst(
+          sequence(pure(pure('a')), pure(pure('b').setTactus(2))).stepJoin(),
+          s_cat(pure('a'), pure('b').setTactus(2)),
+        ),
+      );
+    });
+    it('can join a pattern with a tactus of 0.5', () => {
+      expect(
+        sameFirst(
+          sequence(pure(pure('a')), pure(pure('b').setTactus(0.5))).stepJoin(),
+          s_cat(pure('a'), pure('b').setTactus(0.5)),
+        ),
+      );
+    });
+  });
+  describe('loopAt', () => {
+    it('maintains tactus', () => {
+      expect(s('bev').chop(8).loopAt(2).tactus).toStrictEqual(Fraction(4));
+    });
+  });
 });
diff --git a/packages/core/util.mjs b/packages/core/util.mjs
index 03f8b410..bc844057 100644
--- a/packages/core/util.mjs
+++ b/packages/core/util.mjs
@@ -91,6 +91,9 @@ export const midi2note = (n) => {
 // modulo that works with negative numbers e.g. _mod(-1, 3) = 2. Works on numbers (rather than patterns of numbers, as @mod@ from pattern.mjs does)
 export const _mod = (n, m) => ((n % m) + m) % m;
 
+// average numbers in an array
+export const averageArray = (arr) => arr.reduce((a, b) => a + b) / arr.length;
+
 export function nanFallback(value, fallback = 0) {
   if (isNaN(Number(value))) {
     logger(`"${value}" is not a number, falling back to ${fallback}`, 'warning');
@@ -360,6 +363,76 @@ export function objectMap(obj, fn) {
   }
   return Object.fromEntries(Object.entries(obj).map(([k, v], i) => [k, fn(v, k, i)]));
 }
+export function cycleToSeconds(cycle, cps) {
+  return cycle / cps;
+}
+
+// utility for averaging two clocks together to account for drift
+export class ClockCollator {
+  constructor({
+    getTargetClockTime = getUnixTimeSeconds,
+    weight = 16,
+    offsetDelta = 0.005,
+    checkAfterTime = 2,
+    resetAfterTime = 8,
+  }) {
+    this.offsetTime;
+    this.timeAtPrevOffsetSample;
+    this.prevOffsetTimes = [];
+    this.getTargetClockTime = getTargetClockTime;
+    this.weight = weight;
+    this.offsetDelta = offsetDelta;
+    this.checkAfterTime = checkAfterTime;
+    this.resetAfterTime = resetAfterTime;
+    this.reset = () => {
+      this.prevOffsetTimes = [];
+      this.offsetTime = null;
+      this.timeAtPrevOffsetSample = null;
+    };
+  }
+  calculateOffset(currentTime) {
+    const targetClockTime = this.getTargetClockTime();
+    const diffBetweenTimeSamples = targetClockTime - this.timeAtPrevOffsetSample;
+    const newOffsetTime = targetClockTime - currentTime;
+    // recalcuate the diff from scratch if the clock has been paused for some time.
+    if (diffBetweenTimeSamples > this.resetAfterTime) {
+      this.reset();
+    }
+
+    if (this.offsetTime == null) {
+      this.offsetTime = newOffsetTime;
+    }
+    this.prevOffsetTimes.push(newOffsetTime);
+    if (this.prevOffsetTimes.length > this.weight) {
+      this.prevOffsetTimes.shift();
+    }
+
+    // after X time has passed, the average of the previous weight offset times is calculated and used as a stable reference
+    // for calculating the timestamp
+    if (this.timeAtPrevOffsetSample == null || diffBetweenTimeSamples > this.checkAfterTime) {
+      this.timeAtPrevOffsetSample = targetClockTime;
+      const rollingOffsetTime = averageArray(this.prevOffsetTimes);
+      //when the clock offsets surpass the delta, set the new reference time
+      if (Math.abs(rollingOffsetTime - this.offsetTime) > this.offsetDelta) {
+        this.offsetTime = rollingOffsetTime;
+      }
+    }
+
+    return this.offsetTime;
+  }
+
+  calculateTimestamp(currentTime, targetTime) {
+    return this.calculateOffset(currentTime) + targetTime;
+  }
+}
+
+export function getPerformanceTimeSeconds() {
+  return performance.now() * 0.001;
+}
+
+function getUnixTimeSeconds() {
+  return Date.now() * 0.001;
+}
 
 // Floating point versions, see Fraction for rational versions
 // // greatest common divisor
diff --git a/packages/core/vite.config.js b/packages/core/vite.config.js
index 5df3edc1..718798fb 100644
--- a/packages/core/vite.config.js
+++ b/packages/core/vite.config.js
@@ -4,6 +4,7 @@ import { resolve } from 'path';
 
 // https://vitejs.dev/config/
 export default defineConfig({
+  base: './',
   plugins: [],
   build: {
     lib: {
diff --git a/packages/csound/package.json b/packages/csound/package.json
index e0811208..70967f21 100644
--- a/packages/csound/package.json
+++ b/packages/csound/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@strudel/csound",
-  "version": "1.0.1",
+  "version": "1.1.0",
   "description": "csound bindings for strudel",
   "main": "index.mjs",
   "type": "module",
diff --git a/packages/desktopbridge/oscbridge.mjs b/packages/desktopbridge/oscbridge.mjs
index 81366367..9bead6d1 100644
--- a/packages/desktopbridge/oscbridge.mjs
+++ b/packages/desktopbridge/oscbridge.mjs
@@ -1,43 +1,36 @@
-import { parseNumeral, Pattern, getEventOffsetMs } from '@strudel/core';
+import { Pattern, ClockCollator } from '@strudel/core';
+import { parseControlsFromHap } from 'node_modules/@strudel/osc/osc.mjs';
 import { Invoke } from './utils.mjs';
 
-Pattern.prototype.osc = function () {
-  return this.onTrigger(async (time, hap, currentTime, cps = 1, targetTime) => {
-    hap.ensureObjectValue();
-    const cycle = hap.wholeOrPart().begin.valueOf();
-    const delta = hap.duration.valueOf();
-    const controls = Object.assign({}, { cps, cycle, delta }, hap.value);
-    // make sure n and note are numbers
-    controls.n && (controls.n = parseNumeral(controls.n));
-    controls.note && (controls.note = parseNumeral(controls.note));
+const collator = new ClockCollator({});
 
-    const params = [];
+export async function oscTriggerTauri(t_deprecate, hap, currentTime, cps = 1, targetTime) {
+  const controls = parseControlsFromHap(hap, cps);
+  const params = [];
+  const timestamp = collator.calculateTimestamp(currentTime, targetTime);
 
-    const timestamp = Math.round(Date.now() + getEventOffsetMs(targetTime, currentTime));
+  Object.keys(controls).forEach((key) => {
+    const val = controls[key];
+    const value = typeof val === 'number' ? val.toString() : val;
 
-    Object.keys(controls).forEach((key) => {
-      const val = controls[key];
-      const value = typeof val === 'number' ? val.toString() : val;
-
-      if (value == null) {
-        return;
-      }
-      params.push({
-        name: key,
-        value,
-        valueisnumber: typeof val === 'number',
-      });
+    if (value == null) {
+      return;
+    }
+    params.push({
+      name: key,
+      value,
+      valueisnumber: typeof val === 'number',
     });
-
-    const messagesfromjs = [];
-    if (params.length) {
-      messagesfromjs.push({ target: '/dirt/play', timestamp, params });
-    }
-
-    if (messagesfromjs.length) {
-      setTimeout(() => {
-        Invoke('sendosc', { messagesfromjs });
-      });
-    }
   });
+
+  if (params.length === 0) {
+    return;
+  }
+  const message = { target: '/dirt/play', timestamp, params };
+  setTimeout(() => {
+    Invoke('sendosc', { messagesfromjs: [message] });
+  });
+}
+Pattern.prototype.osc = function () {
+  return this.onTrigger(oscTriggerTauri);
 };
diff --git a/packages/draw/draw.mjs b/packages/draw/draw.mjs
index cfd2ce75..e3737600 100644
--- a/packages/draw/draw.mjs
+++ b/packages/draw/draw.mjs
@@ -36,8 +36,8 @@ function stopAnimationFrame(id) {
     delete animationFrames[id];
   }
 }
-function stopAllAnimations() {
-  Object.keys(animationFrames).forEach((id) => stopAnimationFrame(id));
+function stopAllAnimations(replID) {
+  Object.keys(animationFrames).forEach((id) => (!replID || id.startsWith(replID)) && stopAnimationFrame(id));
 }
 
 let memory = {};
@@ -72,18 +72,25 @@ Pattern.prototype.draw = function (fn, options) {
   return this;
 };
 
-export const cleanupDraw = (clearScreen = true) => {
+export const cleanupDraw = (clearScreen = true, id) => {
   const ctx = getDrawContext();
-  clearScreen && ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.width);
-  stopAllAnimations();
-  if (window.strudelScheduler) {
-    clearInterval(window.strudelScheduler);
-  }
+  clearScreen && ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
+  stopAllAnimations(id);
 };
 
-Pattern.prototype.onPaint = function () {
-  console.warn('[draw] onPaint was not overloaded. Some drawings might not work');
-  return this;
+Pattern.prototype.onPaint = function (painter) {
+  return this.withState((state) => {
+    if (!state.controls.painters) {
+      state.controls.painters = [];
+    }
+    state.controls.painters.push(painter);
+  });
+};
+
+Pattern.prototype.getPainters = function () {
+  let painters = [];
+  this.queryArc(0, 0, { painters });
+  return painters;
 };
 
 // const round = (x) => Math.round(x * 1000) / 1000;
@@ -122,6 +129,7 @@ export class Drawer {
     this.visibleHaps = [];
     this.lastFrame = null;
     this.drawTime = drawTime;
+    this.painters = [];
     this.framer = new Framer(
       () => {
         if (!this.scheduler) {
@@ -146,7 +154,7 @@ export class Drawer {
           // add new haps with onset (think right edge bars scrolling in)
           .concat(haps.filter((h) => h.hasOnset()));
         const time = phase - lookahead;
-        onDraw(this.visibleHaps, time, this);
+        onDraw(this.visibleHaps, time, this, this.painters);
       },
       (err) => {
         console.warn('draw error', err);
@@ -164,11 +172,13 @@ export class Drawer {
     t = t ?? scheduler.now();
     this.scheduler = scheduler;
     let [_, lookahead] = this.drawTime;
+    // +0.1 = workaround for weird holes in query..
     const [begin, end] = [Math.max(t, 0), t + lookahead + 0.1];
     // remove all future haps
     this.visibleHaps = this.visibleHaps.filter((h) => h.whole.begin < t);
+    this.painters = []; // will get populated by .onPaint calls attached to the pattern
     // query future haps
-    const futureHaps = scheduler.pattern.queryArc(begin, end); // +0.1 = workaround for weird holes in query..
+    const futureHaps = scheduler.pattern.queryArc(begin, end, { painters: this.painters });
     // append future haps
     this.visibleHaps = this.visibleHaps.concat(futureHaps);
   }
@@ -191,7 +201,16 @@ export function getComputedPropertyValue(name) {
   return getComputedStyle(document.documentElement).getPropertyValue(name);
 }
 
-let theme = {};
+let theme = {
+  background: '#222',
+  foreground: '#75baff',
+  caret: '#ffcc00',
+  selection: 'rgba(128, 203, 196, 0.5)',
+  selectionMatch: '#036dd626',
+  lineHighlight: '#00000050',
+  gutterBackground: 'transparent',
+  gutterForeground: '#8a919966',
+};
 export function getTheme() {
   return theme;
 }
diff --git a/packages/draw/package.json b/packages/draw/package.json
index 346a4723..a6a88ecf 100644
--- a/packages/draw/package.json
+++ b/packages/draw/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@strudel/draw",
-  "version": "1.0.1",
+  "version": "1.1.0",
   "description": "Helpers for drawing with Strudel",
   "main": "index.mjs",
   "type": "module",
diff --git a/packages/draw/pianoroll.mjs b/packages/draw/pianoroll.mjs
index 1bdf81c4..2c6742cd 100644
--- a/packages/draw/pianoroll.mjs
+++ b/packages/draw/pianoroll.mjs
@@ -67,6 +67,7 @@ Pattern.prototype.pianoroll = function (options = {}) {
  * Displays a midi-style piano roll
  *
  * @name pianoroll
+ * @synonyms punchcard
  * @param {Object} options Object containing all the optional following parameters as key value pairs:
  * @param {integer} cycles number of cycles to be displayed at the same time - defaults to 4
  * @param {number} playhead location of the active notes on the time axis - 0 to 1, defaults to 0.5
@@ -94,7 +95,11 @@ Pattern.prototype.pianoroll = function (options = {}) {
  * @param {boolean} autorange automatically calculate the minMidi and maxMidi parameters - 0 by default
  *
  * @example
- * note("C2 A2 G2").euclid(5,8).s('piano').clip(1).color('salmon').pianoroll({vertical:1, labels:1})
+ * note("c2 a2 eb2")
+ * .euclid(5,8)
+ * .s('sawtooth')
+ * .lpenv(4).lpf(300)
+ * ._pianoroll({ labels: 1 })
  */
 export function pianoroll({
   time,
@@ -108,12 +113,12 @@ export function pianoroll({
   active = getTheme().foreground,
   background = 'transparent',
   smear = 0,
-  playheadColor = 'white',
+  playheadColor = getTheme().foreground,
   minMidi = 10,
   maxMidi = 90,
   autorange = 0,
   timeframe: timeframeProp,
-  fold = 0,
+  fold = 1,
   vertical = 0,
   labels = false,
   fill = 1,
@@ -266,7 +271,7 @@ export function getDrawOptions(drawTime, options = {}) {
   let [lookbehind, lookahead] = drawTime;
   lookbehind = Math.abs(lookbehind);
   const cycles = lookahead + lookbehind;
-  const playhead = lookbehind / cycles;
+  const playhead = cycles !== 0 ? lookbehind / cycles : 0;
   return { fold: 1, ...options, cycles, playhead };
 }
 
diff --git a/packages/draw/pitchwheel.mjs b/packages/draw/pitchwheel.mjs
index 8d3cfe61..ba76df07 100644
--- a/packages/draw/pitchwheel.mjs
+++ b/packages/draw/pitchwheel.mjs
@@ -113,6 +113,23 @@ export function pitchwheel({
   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) =>
diff --git a/packages/draw/spiral.mjs b/packages/draw/spiral.mjs
index 22f93f5d..cebf3d37 100644
--- a/packages/draw/spiral.mjs
+++ b/packages/draw/spiral.mjs
@@ -125,6 +125,33 @@ function drawSpiral(options) {
   });
 }
 
+/**
+ * Displays a spiral visual.
+ *
+ * @name spiral
+ * @param {Object} options Object containing all the optional following parameters as key value pairs:
+ * @param {number} stretch controls the rotations per cycle ratio, where 1 = 1 cycle / 360 degrees
+ * @param {number} size the diameter of the spiral
+ * @param {number} thickness line thickness
+ * @param {string} cap style of line ends: butt (default), round, square
+ * @param {string} inset number of rotations before spiral starts (default 3)
+ * @param {string} playheadColor color of playhead, defaults to white
+ * @param {number} playheadLength length of playhead in rotations, defaults to 0.02
+ * @param {number} playheadThickness thickness of playheadrotations, defaults to thickness
+ * @param {number} padding space around spiral
+ * @param {number} steady steadyness of spiral vs playhead. 1 = spiral doesn't move, playhead does.
+ * @param {number} activeColor color of active segment. defaults to foreground of theme
+ * @param {number} inactiveColor color of inactive segments. defaults to gutterForeground of theme
+ * @param {boolean} colorizeInactive wether or not to colorize inactive segments, defaults to 0
+ * @param {boolean} fade wether or not past and future should fade out. defaults to 1
+ * @param {boolean} logSpiral wether or not the spiral should be logarithmic. defaults to 0
+ * @example
+ * note("c2 a2 eb2")
+ * .euclid(5,8)
+ * .s('sawtooth')
+ * .lpenv(4).lpf(300)
+ * ._spiral({ steady: .96 })
+ */
 Pattern.prototype.spiral = function (options = {}) {
   return this.onPaint((ctx, time, haps, drawTime) => drawSpiral({ ctx, time, haps, drawTime, ...options }));
 };
diff --git a/packages/embed/package.json b/packages/embed/package.json
index 55a9f0a5..afd88788 100644
--- a/packages/embed/package.json
+++ b/packages/embed/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@strudel/embed",
-  "version": "1.0.0",
+  "version": "1.1.0",
   "description": "Embeddable Web Component to load a Strudel REPL into an iframe",
   "main": "embed.js",
   "type": "module",
diff --git a/packages/hs2js/.npmignore b/packages/hs2js/.npmignore
new file mode 100644
index 00000000..0fdbcf58
--- /dev/null
+++ b/packages/hs2js/.npmignore
@@ -0,0 +1,2 @@
+pnpm-lock.yaml
+vite.config.js
diff --git a/packages/hs2js/LICENSE b/packages/hs2js/LICENSE
new file mode 100644
index 00000000..0ad25db4
--- /dev/null
+++ b/packages/hs2js/LICENSE
@@ -0,0 +1,661 @@
+                    GNU AFFERO GENERAL PUBLIC LICENSE
+                       Version 3, 19 November 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. 
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU Affero General Public License is a free, copyleft license for
+software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+our General Public Licenses are intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  Developers that use our General Public Licenses protect your rights
+with two steps: (1) assert copyright on the software, and (2) offer
+you this License which gives you legal permission to copy, distribute
+and/or modify the software.
+
+  A secondary benefit of defending all users' freedom is that
+improvements made in alternate versions of the program, if they
+receive widespread use, become available for other developers to
+incorporate.  Many developers of free software are heartened and
+encouraged by the resulting cooperation.  However, in the case of
+software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its
+source code to the public.
+
+  The GNU Affero General Public License is designed specifically to
+ensure that, in such cases, the modified source code becomes available
+to the community.  It requires the operator of a network server to
+provide the source code of the modified version running there to the
+users of that server.  Therefore, public use of a modified version, on
+a publicly accessible server, gives the public access to the source
+code of the modified version.
+
+  An older license, called the Affero General Public License and
+published by Affero, was designed to accomplish similar goals.  This is
+a different license, not a version of the Affero GPL, but Affero has
+released a new version of the Affero GPL which permits relicensing under
+this license.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU Affero General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Remote Network Interaction; Use with the GNU General Public License.
+
+  Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users
+interacting with it remotely through a computer network (if your version
+supports such interaction) an opportunity to receive the Corresponding
+Source of your version by providing access to the Corresponding Source
+from a network server at no charge, through some standard or customary
+means of facilitating copying of software.  This Corresponding Source
+shall include the Corresponding Source for any work covered by version 3
+of the GNU General Public License that is incorporated pursuant to the
+following paragraph.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the work with which it is combined will remain governed by version
+3 of the GNU General Public License.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU Affero General Public License from time to time.  Such new versions
+will be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU Affero General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU Affero General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU Affero General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    
+    Copyright (C)   
+
+    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 .
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If your software can interact with users remotely through a computer
+network, you should also make sure that it provides a way for users to
+get its source.  For example, if your program is a web application, its
+interface could display a "Source" link that leads users to an archive
+of the code.  There are many ways you could offer source, and different
+solutions will be better for different programs; see section 13 for the
+specific requirements.
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU AGPL, see
+.
diff --git a/packages/hs2js/README.md b/packages/hs2js/README.md
new file mode 100644
index 00000000..24d9c774
--- /dev/null
+++ b/packages/hs2js/README.md
@@ -0,0 +1,127 @@
+# hs2js
+
+Experimental haskell in javascript interpreter. Many haskell features are not implemented.
+This projects mainly exists to be able to write and interpret [Tidal Cycles](https://tidalcycles.org/) code in the browser,
+as part of [Strudel](https://github.com/tidalcycles/strudel). This project could only exist thanks to [tree-sitter-haskell](https://github.com/tree-sitter/tree-sitter-haskell).
+
+## Installation
+
+### Via Script Tag
+
+You can load the library directly from a script tag via unpkg:
+
+```html
+
+
+
+```
+
+### Via npm
+
+You need to add `postinstall` to your `package.json` script to copy the parser to your `public` folder:
+
+```json
+{
+  "scripts": {
+    "postinstall": "cp node_modules/hs2js/dist/tree-sitter.wasm public && cp node_modules/hs2js/dist/tree-sitter-haskell.wasm public"
+  }
+}
+```
+
+Depending on your setup, replace `public` with the folder that will serve your assets to `/`. Then install the package:
+
+```sh
+npm i hs2js
+```
+
+and use it:
+
+```js
+import * as hs2js from 'hs2js';
+hs2js.loadParser();
+document.getElementById('hello').addEventListener('click', () => {
+  hs2js.evaluate('alert "hello from haskell!"');
+});
+```
+
+## API
+
+These are all functions exported by the package:
+
+### evaluate
+
+Evaluates a piece of haskell code
+
+- `code`: [valid](https://github.com/tree-sitter/tree-sitter-haskell?tab=readme-ov-file#supported-language-extensions) haskell code
+- `scope`: global scope, defaults to globalThis. Allows you to pass an object of your own functions / variables from JS to Haskell.
+- `ops`: mapping for custom infix operator
+
+Example:
+
+```js
+// simple
+hs2js.evaluate(`2 + 2`) // = 4
+// passing variables via scope:
+hs2js.evaluate(`a + b`, { a: 1, b: 2 }) // = 3
+// custom operator
+hs2js.evaluate(`2 |* 3`, {}, { '|*': (l, r) => l * r }) // = 6
+```
+
+### parse
+
+[Parses](https://github.com/tree-sitter/tree-sitter-haskell) a piece of haskell code, returning its AST representation.
+
+Example:
+
+```js
+const ast = hs2js.parse(`2 + 2`)
+console.log(ast.toString())
+// (haskell declarations: (declarations (top_splice (apply function: (variable) argument: (literal (integer))))))
+```
+
+### run
+
+Evaluates `rootNode` of haskell AST (used by evaluate internally).
+
+- `rootNode`: haskell AST root node, as returned by `parse`
+- `scope`: see evaluate
+- `ops`: see evaluate
+
+Example:
+
+```js
+const ast = hs2js.parse(`2 + 3`);
+const res = hs2js.run(ast.rootNode);
+console.log(res); // = 5
+```
+
+### loadParser
+
+Loads and caches the parser by fetching `tree-sitter.wasm` and `tree-sitter-haskell.wasm`.
+Make sure to call and await this function before calling `parse` or `evaluate`.
+
+```js
+hs2js.loadParser().then(() => hs2js.evaluate('alert "ready"'))
+```
+
+### setBase
+
+Sets the base path where the WASM files are expected by `loadParser`. Defaults to `/`.
+Expects `tree-sitter.wasm` and `tree-sitter-haskell.wasm` to be present.
+Can either be a relative path or a URL.
+
+```js
+hs2js.setBase('https://unpkg.com/hs2js@0.0.4/dist/');
+hs2js.loadParser(); 
+/* loads 
+- https://unpkg.com/hs2js@0.0.4/dist/tree-sitter.wasm
+- https://unpkg.com/hs2js@0.0.4/dist/tree-sitter-haskell.wasm
+*/
+```
diff --git a/packages/hs2js/package.json b/packages/hs2js/package.json
new file mode 100644
index 00000000..09bf1e05
--- /dev/null
+++ b/packages/hs2js/package.json
@@ -0,0 +1,37 @@
+{
+  "name": "hs2js",
+  "version": "0.1.0",
+  "description": "Experimental Haskell in JavaScript interpreter",
+  "main": "src/index.mjs",
+  "type": "module",
+  "publishConfig": {
+    "main": "dist/index.js",
+    "module": "dist/index.mjs"
+  },
+  "scripts": {
+    "build-wasm": "tree-sitter build-wasm node_modules/tree-sitter-haskell && mv tree-sitter-haskell.wasm ./dist/ && cp node_modules/web-tree-sitter/tree-sitter.wasm ./dist/",
+    "build": "vite build && npm run build-wasm",
+    "prepublishOnly": "npm run build"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/tidalcycles/strudel.git"
+  },
+  "keywords": [
+    "haskell",
+    "javascript"
+  ],
+  "author": "Felix Roos ",
+  "license": "AGPL-3.0-or-later",
+  "bugs": {
+    "url": "https://github.com/tidalcycles/strudel/issues"
+  },
+  "homepage": "https://github.com/tidalcycles/strudel",
+  "dependencies": {
+    "web-tree-sitter": "^0.20.8"
+  },
+  "devDependencies": {
+    "tree-sitter-haskell": "^0.21.0",
+    "vite": "^5.0.10"
+  }
+}
diff --git a/packages/hs2js/pnpm-lock.yaml b/packages/hs2js/pnpm-lock.yaml
new file mode 100644
index 00000000..9043fd41
--- /dev/null
+++ b/packages/hs2js/pnpm-lock.yaml
@@ -0,0 +1,520 @@
+lockfileVersion: '6.0'
+
+settings:
+  autoInstallPeers: true
+  excludeLinksFromLockfile: false
+
+dependencies:
+  web-tree-sitter:
+    specifier: ^0.20.8
+    version: 0.20.8
+
+devDependencies:
+  tree-sitter-haskell:
+    specifier: ^0.21.0
+    version: 0.21.0(tree-sitter@0.21.1)
+  vite:
+    specifier: ^5.0.10
+    version: 5.2.11
+
+packages:
+
+  /@esbuild/aix-ppc64@0.20.2:
+    resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [aix]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/android-arm64@0.20.2:
+    resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/android-arm@0.20.2:
+    resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/android-x64@0.20.2:
+    resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/darwin-arm64@0.20.2:
+    resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/darwin-x64@0.20.2:
+    resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/freebsd-arm64@0.20.2:
+    resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/freebsd-x64@0.20.2:
+    resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-arm64@0.20.2:
+    resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-arm@0.20.2:
+    resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-ia32@0.20.2:
+    resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-loong64@0.20.2:
+    resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==}
+    engines: {node: '>=12'}
+    cpu: [loong64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-mips64el@0.20.2:
+    resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==}
+    engines: {node: '>=12'}
+    cpu: [mips64el]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-ppc64@0.20.2:
+    resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-riscv64@0.20.2:
+    resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==}
+    engines: {node: '>=12'}
+    cpu: [riscv64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-s390x@0.20.2:
+    resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==}
+    engines: {node: '>=12'}
+    cpu: [s390x]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-x64@0.20.2:
+    resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/netbsd-x64@0.20.2:
+    resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [netbsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/openbsd-x64@0.20.2:
+    resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [openbsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/sunos-x64@0.20.2:
+    resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [sunos]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/win32-arm64@0.20.2:
+    resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/win32-ia32@0.20.2:
+    resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/win32-x64@0.20.2:
+    resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-android-arm-eabi@4.17.2:
+    resolution: {integrity: sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==}
+    cpu: [arm]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-android-arm64@4.17.2:
+    resolution: {integrity: sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==}
+    cpu: [arm64]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-darwin-arm64@4.17.2:
+    resolution: {integrity: sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==}
+    cpu: [arm64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-darwin-x64@4.17.2:
+    resolution: {integrity: sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==}
+    cpu: [x64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-linux-arm-gnueabihf@4.17.2:
+    resolution: {integrity: sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==}
+    cpu: [arm]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-linux-arm-musleabihf@4.17.2:
+    resolution: {integrity: sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==}
+    cpu: [arm]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-linux-arm64-gnu@4.17.2:
+    resolution: {integrity: sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-linux-arm64-musl@4.17.2:
+    resolution: {integrity: sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-linux-powerpc64le-gnu@4.17.2:
+    resolution: {integrity: sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==}
+    cpu: [ppc64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-linux-riscv64-gnu@4.17.2:
+    resolution: {integrity: sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==}
+    cpu: [riscv64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-linux-s390x-gnu@4.17.2:
+    resolution: {integrity: sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==}
+    cpu: [s390x]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-linux-x64-gnu@4.17.2:
+    resolution: {integrity: sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-linux-x64-musl@4.17.2:
+    resolution: {integrity: sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-win32-arm64-msvc@4.17.2:
+    resolution: {integrity: sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==}
+    cpu: [arm64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-win32-ia32-msvc@4.17.2:
+    resolution: {integrity: sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==}
+    cpu: [ia32]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-win32-x64-msvc@4.17.2:
+    resolution: {integrity: sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==}
+    cpu: [x64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@types/estree@1.0.5:
+    resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
+    dev: true
+
+  /esbuild@0.20.2:
+    resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==}
+    engines: {node: '>=12'}
+    hasBin: true
+    requiresBuild: true
+    optionalDependencies:
+      '@esbuild/aix-ppc64': 0.20.2
+      '@esbuild/android-arm': 0.20.2
+      '@esbuild/android-arm64': 0.20.2
+      '@esbuild/android-x64': 0.20.2
+      '@esbuild/darwin-arm64': 0.20.2
+      '@esbuild/darwin-x64': 0.20.2
+      '@esbuild/freebsd-arm64': 0.20.2
+      '@esbuild/freebsd-x64': 0.20.2
+      '@esbuild/linux-arm': 0.20.2
+      '@esbuild/linux-arm64': 0.20.2
+      '@esbuild/linux-ia32': 0.20.2
+      '@esbuild/linux-loong64': 0.20.2
+      '@esbuild/linux-mips64el': 0.20.2
+      '@esbuild/linux-ppc64': 0.20.2
+      '@esbuild/linux-riscv64': 0.20.2
+      '@esbuild/linux-s390x': 0.20.2
+      '@esbuild/linux-x64': 0.20.2
+      '@esbuild/netbsd-x64': 0.20.2
+      '@esbuild/openbsd-x64': 0.20.2
+      '@esbuild/sunos-x64': 0.20.2
+      '@esbuild/win32-arm64': 0.20.2
+      '@esbuild/win32-ia32': 0.20.2
+      '@esbuild/win32-x64': 0.20.2
+    dev: true
+
+  /fsevents@2.3.3:
+    resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+    engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /nanoid@3.3.7:
+    resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
+    engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+    hasBin: true
+    dev: true
+
+  /node-addon-api@8.0.0:
+    resolution: {integrity: sha512-ipO7rsHEBqa9STO5C5T10fj732ml+5kLN1cAG8/jdHd56ldQeGj3Q7+scUS+VHK/qy1zLEwC4wMK5+yM0btPvw==}
+    engines: {node: ^18 || ^20 || >= 21}
+    dev: true
+
+  /node-gyp-build@4.8.1:
+    resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==}
+    hasBin: true
+    dev: true
+
+  /picocolors@1.0.1:
+    resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==}
+    dev: true
+
+  /postcss@8.4.38:
+    resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==}
+    engines: {node: ^10 || ^12 || >=14}
+    dependencies:
+      nanoid: 3.3.7
+      picocolors: 1.0.1
+      source-map-js: 1.2.0
+    dev: true
+
+  /rollup@4.17.2:
+    resolution: {integrity: sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==}
+    engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+    hasBin: true
+    dependencies:
+      '@types/estree': 1.0.5
+    optionalDependencies:
+      '@rollup/rollup-android-arm-eabi': 4.17.2
+      '@rollup/rollup-android-arm64': 4.17.2
+      '@rollup/rollup-darwin-arm64': 4.17.2
+      '@rollup/rollup-darwin-x64': 4.17.2
+      '@rollup/rollup-linux-arm-gnueabihf': 4.17.2
+      '@rollup/rollup-linux-arm-musleabihf': 4.17.2
+      '@rollup/rollup-linux-arm64-gnu': 4.17.2
+      '@rollup/rollup-linux-arm64-musl': 4.17.2
+      '@rollup/rollup-linux-powerpc64le-gnu': 4.17.2
+      '@rollup/rollup-linux-riscv64-gnu': 4.17.2
+      '@rollup/rollup-linux-s390x-gnu': 4.17.2
+      '@rollup/rollup-linux-x64-gnu': 4.17.2
+      '@rollup/rollup-linux-x64-musl': 4.17.2
+      '@rollup/rollup-win32-arm64-msvc': 4.17.2
+      '@rollup/rollup-win32-ia32-msvc': 4.17.2
+      '@rollup/rollup-win32-x64-msvc': 4.17.2
+      fsevents: 2.3.3
+    dev: true
+
+  /source-map-js@1.2.0:
+    resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /tree-sitter-haskell@0.21.0(tree-sitter@0.21.1):
+    resolution: {integrity: sha512-b2RLegPHuYPh7nJ3YKWgkWnFYxmYlQDE8TDJuNH+iuNuBcCMYyaA9JlJlMHfCvf7DmJNPtqqbO9Kh9NXEmbatQ==}
+    requiresBuild: true
+    peerDependencies:
+      tree-sitter: ^0.21.0
+      tree_sitter: '*'
+    peerDependenciesMeta:
+      tree_sitter:
+        optional: true
+    dependencies:
+      node-addon-api: 8.0.0
+      node-gyp-build: 4.8.1
+      tree-sitter: 0.21.1
+    dev: true
+
+  /tree-sitter@0.21.1:
+    resolution: {integrity: sha512-7dxoA6kYvtgWw80265MyqJlkRl4yawIjO7S5MigytjELkX43fV2WsAXzsNfO7sBpPPCF5Gp0+XzHk0DwLCq3xQ==}
+    requiresBuild: true
+    dependencies:
+      node-addon-api: 8.0.0
+      node-gyp-build: 4.8.1
+    dev: true
+
+  /vite@5.2.11:
+    resolution: {integrity: sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==}
+    engines: {node: ^18.0.0 || >=20.0.0}
+    hasBin: true
+    peerDependencies:
+      '@types/node': ^18.0.0 || >=20.0.0
+      less: '*'
+      lightningcss: ^1.21.0
+      sass: '*'
+      stylus: '*'
+      sugarss: '*'
+      terser: ^5.4.0
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+      less:
+        optional: true
+      lightningcss:
+        optional: true
+      sass:
+        optional: true
+      stylus:
+        optional: true
+      sugarss:
+        optional: true
+      terser:
+        optional: true
+    dependencies:
+      esbuild: 0.20.2
+      postcss: 8.4.38
+      rollup: 4.17.2
+    optionalDependencies:
+      fsevents: 2.3.3
+    dev: true
+
+  /web-tree-sitter@0.20.8:
+    resolution: {integrity: sha512-weOVgZ3aAARgdnb220GqYuh7+rZU0Ka9k9yfKtGAzEYMa6GgiCzW9JjQRJyCJakvibQW+dfjJdihjInKuuCAUQ==}
+    dev: false
diff --git a/packages/hs2js/src/hs2js.mjs b/packages/hs2js/src/hs2js.mjs
new file mode 100644
index 00000000..227a42b2
--- /dev/null
+++ b/packages/hs2js/src/hs2js.mjs
@@ -0,0 +1,136 @@
+import { parse } from './parser.mjs';
+
+function runApply(node, scope, ops) {
+  if (node.children.length !== 2)
+    throw new Error(`expected 2 children for node type apply, got ${node.children.length}`);
+  const [fn, arg] = node.children.map((child) => run(child, scope, ops));
+  if (typeof fn !== 'function') {
+    throw new Error(`${node.children[0].text} is not a function`);
+  }
+  // only works if fn is curried!
+  return fn(arg);
+}
+
+function runInfix(left, symbol, right, ops) {
+  const customOp = ops[symbol];
+  if (customOp) {
+    return customOp(left, right);
+  }
+  switch (symbol) {
+    case '+':
+      return left + right;
+    case '-':
+      return left - right;
+    case '*':
+      return left * right;
+    case '/':
+      return left / right;
+    case '$':
+      return left(right);
+    case '&':
+      console.log('right', right);
+      return right(left);
+    case '.':
+      return (x) => left(right(x));
+    default:
+      throw new Error('unexpected infix operator ' + symbol);
+  }
+}
+
+function curry(patterns, body, scope, ops) {
+  const [variable, ...rest] = patterns;
+  return (arg) => {
+    let _scope = { ...scope, [variable.text]: arg };
+    if (patterns.length === 1) {
+      const result = run(body, _scope, ops);
+      return result;
+    }
+    return curry(rest, body, _scope, ops);
+  };
+}
+
+export function run(node, scope, ops = {}) {
+  let runInScope = (node, scp = scope) => run(node, scp, ops);
+  //console.log("node", node.type, node.text);
+  if (ops[node.type]) {
+    return ops[node.type](node);
+  }
+  switch (node.type) {
+    case 'ERROR':
+      throw new Error(`invalid syntax: "${node.text}"`);
+    case 'declarations':
+      let result;
+      node.children.forEach((declaration) => {
+        result = runInScope(declaration);
+      });
+      return result;
+    case 'integer':
+      return Number(node.text);
+    case 'float':
+      return Number(node.text);
+    case 'string':
+      const str = node.text.slice(1, -1);
+      return String(str);
+    case 'lambda':
+      const [_, lpatterns, __, lbody] = node.children;
+      return curry(lpatterns.children, lbody, scope, ops);
+    case 'function':
+      const [fvariable, fpatterns, fbody] = node.children;
+      scope[fvariable.text] = curry(fpatterns.children, fbody, scope, ops);
+      return scope[fvariable.text];
+    case 'list': {
+      return node.children
+        .filter((_, i) => i % 2 === 1) // elements are at odd indices
+        .map((node) => runInScope(node));
+    }
+    case 'match':
+      if (node.children[0].text !== '=' || node.children.length !== 2) {
+        throw new Error('match node so far only support simple assignments');
+      }
+      return runInScope(node.children[1]);
+    case 'bind':
+      if (node.children.length !== 2) throw new Error('expected 2 children for node type bind');
+      if (node.children[0].type !== 'variable') throw new Error('expected variable as first child of bind node');
+      if (node.children[1].type !== 'match') throw new Error('expected match as first child of bind node');
+      const [bvariable, bmatch] = node.children;
+      const value = runInScope(bmatch);
+      scope[bvariable.text] = value;
+      return value;
+    case 'variable':
+      return scope[node.text];
+    case 'infix': {
+      const [a, op, b] = node.children;
+      const symbol = op.text;
+      const [left, right] = [runInScope(a), runInScope(b)];
+      return runInfix(left, symbol, right, ops);
+    }
+    case 'apply':
+      return runApply(node, scope, ops);
+    case 'left_section': {
+      const [_, b, op] = node.children;
+      const right = runInScope(b);
+      return (left) => runInfix(left, op.text, right, ops);
+    }
+    case 'right_section': {
+      const [_, op, b] = node.children;
+      const right = runInScope(b);
+      return (left) => runInfix(left, op.text, right, ops);
+    }
+    case 'parens':
+      if (node.children.length !== 3) throw new Error('expected 3 children for node type parens');
+      return runInScope(node.children[1]);
+    default:
+      if (node.children.length === 0) {
+        throw new Error('unhandled leaf type ' + node.type);
+      }
+      if (node.children.length > 1) {
+        throw new Error('unhandled branch type ' + node.type);
+      }
+      return runInScope(node.children[0]);
+  }
+}
+
+export function evaluate(haskellCode, scope = globalThis, ops) {
+  const ast = parse(haskellCode);
+  return run(ast.rootNode, scope, ops);
+}
diff --git a/packages/hs2js/src/index.mjs b/packages/hs2js/src/index.mjs
new file mode 100644
index 00000000..c3aab230
--- /dev/null
+++ b/packages/hs2js/src/index.mjs
@@ -0,0 +1,2 @@
+export * from './hs2js.mjs';
+export * from './parser.mjs';
diff --git a/packages/hs2js/src/parser.mjs b/packages/hs2js/src/parser.mjs
new file mode 100644
index 00000000..a5b010b4
--- /dev/null
+++ b/packages/hs2js/src/parser.mjs
@@ -0,0 +1,37 @@
+import Parser from 'web-tree-sitter';
+
+let base = '/';
+export function setBase(path) {
+  base = path;
+}
+
+let isReady = false,
+  parser;
+async function _loadParser() {
+  await Parser.init({
+    locateFile(scriptName, scriptDirectory) {
+      return `${base}${scriptName}`;
+    },
+  });
+  parser = new Parser();
+  const Lang = await Parser.Language.load(`${base}tree-sitter-haskell.wasm`);
+  parser.setLanguage(Lang);
+  isReady = true;
+  return parser;
+}
+
+let parserLoaded;
+export function loadParser() {
+  if (!parserLoaded) {
+    parserLoaded = _loadParser();
+  }
+  return parserLoaded;
+}
+
+export function parse(code) {
+  if (!isReady) {
+    throw new Error('hs2js not ready. await loadParser before calling evaluate or parse functions');
+  }
+  // for some reason, the parser doesn't like new lines..
+  return parser.parse(code.replaceAll('\n\n', '~~~~').replaceAll('\n', ' ').replaceAll('~~~~', ' \n'));
+}
diff --git a/packages/hs2js/vite.config.js b/packages/hs2js/vite.config.js
new file mode 100644
index 00000000..ce715712
--- /dev/null
+++ b/packages/hs2js/vite.config.js
@@ -0,0 +1,20 @@
+import { defineConfig } from 'vite';
+import { resolve } from 'path';
+
+// https://vitejs.dev/config/
+export default defineConfig({
+  plugins: [],
+  build: {
+    lib: {
+      entry: resolve(__dirname, 'src', 'index.mjs'),
+      name: 'hs2js',
+      formats: ['es', 'iife'],
+      fileName: (ext) => ({ es: 'index.mjs', iife: 'index.js' })[ext],
+    },
+    rollupOptions: {
+      // external: [...Object.keys(dependencies)],
+      plugins: [],
+    },
+    target: 'esnext',
+  },
+});
diff --git a/packages/hydra/hydra.mjs b/packages/hydra/hydra.mjs
index 13d08de6..2cb265c2 100644
--- a/packages/hydra/hydra.mjs
+++ b/packages/hydra/hydra.mjs
@@ -1,5 +1,5 @@
 import { getDrawContext } from '@strudel/draw';
-import { controls } from '@strudel/core';
+import { controls, getTime, reify } from '@strudel/core';
 
 let latestOptions;
 let hydra;
@@ -27,6 +27,7 @@ export async function initHydra(options = {}) {
     hydraConfig.canvas = canvas;
 
     await import(/* @vite-ignore */ src);
+    /* eslint-disable-next-line */
     hydra = new Hydra(hydraConfig);
     if (feedStrudel) {
       const { canvas } = getDrawContext();
@@ -46,4 +47,4 @@ export function clearHydra() {
   globalThis.shape = controls.shape;
 }
 
-export const H = (p) => () => p.queryArc(getTime(), getTime())[0].value;
+export const H = (p) => () => reify(p).queryArc(getTime(), getTime())[0].value;
diff --git a/packages/hydra/package.json b/packages/hydra/package.json
index 77fab126..2559a167 100644
--- a/packages/hydra/package.json
+++ b/packages/hydra/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@strudel/hydra",
-  "version": "1.0.1",
+  "version": "1.1.0",
   "description": "Hydra integration for strudel",
   "main": "hydra.mjs",
   "type": "module",
diff --git a/packages/midi/package.json b/packages/midi/package.json
index 4cc2dddb..6b2d8de1 100644
--- a/packages/midi/package.json
+++ b/packages/midi/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@strudel/midi",
-  "version": "1.0.1",
+  "version": "1.1.0",
   "description": "Midi API for strudel",
   "main": "index.mjs",
   "type": "module",
diff --git a/packages/mini/krill-parser.js b/packages/mini/krill-parser.js
index 1cdd3486..0a062f46 100644
--- a/packages/mini/krill-parser.js
+++ b/packages/mini/krill-parser.js
@@ -295,13 +295,12 @@ function peg$parse(input, options) {
   var peg$f6 = function(a) { return a };
   var peg$f7 = function(s) { s.arguments_.alignment = 'polymeter_slowcat'; return s; };
   var peg$f8 = function(a) { return x => x.options_['weight'] = (x.options_['weight'] ?? 1) + (a ?? 2) - 1 };
-  var peg$f9 = function(a) { return x => {const reps = (x.options_['reps'] ?? 1) + (a ?? 2) - 1;
+  var peg$f9 = function(a) { return x => {// A bit fiddly, to support both x!4 and x!!! as equivalent..
+                 const reps = (x.options_['reps'] ?? 1) + (a ?? 2) - 1;
                  x.options_['reps'] = reps;
-                 console.log("reps: ", reps)
                  x.options_['ops'] = x.options_['ops'].filter(x => x.type_ !== "replicate");
                  x.options_['ops'].push({ type_: "replicate", arguments_ :{ amount:reps }});
                  x.options_['weight'] = reps;
-                 console.log("options: ", x.options_);
                 }
   };
   var peg$f10 = function(p, s, r) { return x => x.options_['ops'].push({ type_: "bjorklund", arguments_ :{ pulse: p, step:s, rotation:r }}) };
diff --git a/packages/mini/mini.mjs b/packages/mini/mini.mjs
index 8d2276fb..86c372b8 100644
--- a/packages/mini/mini.mjs
+++ b/packages/mini/mini.mjs
@@ -14,7 +14,7 @@ const applyOptions = (parent, enter) => (pat, i) => {
   const ast = parent.source_[i];
   const options = ast.options_;
   const ops = options?.ops;
-
+  const tactus_source = pat.__tactus_source;
   if (ops) {
     for (const op of ops) {
       switch (op.type_) {
@@ -69,7 +69,7 @@ const applyOptions = (parent, enter) => (pat, i) => {
       }
     }
   }
-
+  pat.__tactus_source = pat.__tactus_source || tactus_source;
   return pat;
 };
 
diff --git a/packages/mini/package.json b/packages/mini/package.json
index 7bd73011..5d2ce1ec 100644
--- a/packages/mini/package.json
+++ b/packages/mini/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@strudel/mini",
-  "version": "1.0.1",
+  "version": "1.1.0",
   "description": "Mini notation for strudel",
   "main": "index.mjs",
   "type": "module",
diff --git a/packages/mini/test/mini.test.mjs b/packages/mini/test/mini.test.mjs
index 92aa6c12..112edcb7 100644
--- a/packages/mini/test/mini.test.mjs
+++ b/packages/mini/test/mini.test.mjs
@@ -210,12 +210,14 @@ describe('mini', () => {
   });
   it('supports ^ tactus marking', () => {
     expect(mini('a [^b c]').tactus).toEqual(Fraction(4));
+    expect(mini('[^b c]!3').tactus).toEqual(Fraction(6));
     expect(mini('[a b c] [d [e f]]').tactus).toEqual(Fraction(2));
     expect(mini('^[a b c] [d [e f]]').tactus).toEqual(Fraction(2));
     expect(mini('[a b c] [d [^e f]]').tactus).toEqual(Fraction(8));
     expect(mini('[a b c] [^d [e f]]').tactus).toEqual(Fraction(4));
     expect(mini('[^a b c] [^d [e f]]').tactus).toEqual(Fraction(12));
     expect(mini('[^a b c] [d [^e f]]').tactus).toEqual(Fraction(24));
+    expect(mini('[^a b c d e]').tactus).toEqual(Fraction(5));
   });
 });
 
diff --git a/packages/osc/osc.mjs b/packages/osc/osc.mjs
index 422e56da..4b9ab14e 100644
--- a/packages/osc/osc.mjs
+++ b/packages/osc/osc.mjs
@@ -6,7 +6,7 @@ This program is free software: you can redistribute it and/or modify it under th
 
 import OSC from 'osc-js';
 
-import { logger, parseNumeral, Pattern, getEventOffsetMs, isNote, noteToMidi } from '@strudel/core';
+import { logger, parseNumeral, Pattern, isNote, noteToMidi, ClockCollator } from '@strudel/core';
 
 let connection; // Promise
 function connect() {
@@ -34,6 +34,44 @@ function connect() {
   return connection;
 }
 
+export function parseControlsFromHap(hap, cps) {
+  hap.ensureObjectValue();
+  const cycle = hap.wholeOrPart().begin.valueOf();
+  const delta = hap.duration.valueOf();
+  const controls = Object.assign({}, { cps, cycle, delta }, hap.value);
+  // make sure n and note are numbers
+  controls.n && (controls.n = parseNumeral(controls.n));
+  if (typeof controls.note !== 'undefined') {
+    if (isNote(controls.note)) {
+      controls.midinote = noteToMidi(controls.note, controls.octave || 3);
+    } else {
+      controls.note = parseNumeral(controls.note);
+    }
+  }
+  controls.bank && (controls.s = controls.bank + controls.s);
+  controls.roomsize && (controls.size = parseNumeral(controls.roomsize));
+  // speed adjustment for CPS is handled on the DSP side in superdirt and pattern side in Strudel,
+  // so we need to undo the adjustment before sending the message to superdirt.
+  controls.unit === 'c' && controls.speed != null && (controls.speed = controls.speed / cps);
+  const channels = controls.channels;
+  channels != undefined && (controls.channels = JSON.stringify(channels));
+  return controls;
+}
+
+const collator = new ClockCollator({});
+
+export async function oscTrigger(t_deprecate, hap, currentTime, cps = 1, targetTime) {
+  const osc = await connect();
+  const controls = parseControlsFromHap(hap, cps);
+  const keyvals = Object.entries(controls).flat();
+
+  const ts = Math.round(collator.calculateTimestamp(currentTime, targetTime) * 1000);
+  const message = new OSC.Message('/dirt/play', ...keyvals);
+  const bundle = new OSC.Bundle([message], ts);
+  bundle.timestamp(ts); // workaround for https://github.com/adzialocha/osc-js/issues/60
+  osc.send(bundle);
+}
+
 /**
  *
  * Sends each hap as an OSC message, which can be picked up by SuperCollider or any other OSC-enabled software.
@@ -44,33 +82,5 @@ function connect() {
  * @returns Pattern
  */
 Pattern.prototype.osc = function () {
-  return this.onTrigger(async (time, hap, currentTime, cps = 1, targetTime) => {
-    hap.ensureObjectValue();
-    const osc = await connect();
-    const cycle = hap.wholeOrPart().begin.valueOf();
-    const delta = hap.duration.valueOf();
-    const controls = Object.assign({}, { cps, cycle, delta }, hap.value);
-    // make sure n and note are numbers
-    controls.n && (controls.n = parseNumeral(controls.n));
-    if (typeof controls.note !== 'undefined') {
-      if (isNote(controls.note)) {
-        controls.midinote = noteToMidi(controls.note, controls.octave || 3);
-      } else {
-        controls.note = parseNumeral(controls.note);
-      }
-    }
-    controls.bank && (controls.s = controls.bank + controls.s);
-    controls.roomsize && (controls.size = parseNumeral(controls.roomsize));
-    const keyvals = Object.entries(controls).flat();
-    // time should be audio time of onset
-    // currentTime should be current time of audio context (slightly before time)
-    const offset = getEventOffsetMs(targetTime, currentTime);
-
-    // timestamp in milliseconds used to trigger the osc bundle at a precise moment
-    const ts = Math.floor(Date.now() + offset);
-    const message = new OSC.Message('/dirt/play', ...keyvals);
-    const bundle = new OSC.Bundle([message], ts);
-    bundle.timestamp(ts); // workaround for https://github.com/adzialocha/osc-js/issues/60
-    osc.send(bundle);
-  });
+  return this.onTrigger(oscTrigger);
 };
diff --git a/packages/osc/package.json b/packages/osc/package.json
index 92725cd4..98babe2a 100644
--- a/packages/osc/package.json
+++ b/packages/osc/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@strudel/osc",
-  "version": "1.0.1",
+  "version": "1.1.0",
   "description": "OSC messaging for strudel",
   "main": "osc.mjs",
   "type": "module",
diff --git a/packages/osc/superdirtoutput.js b/packages/osc/superdirtoutput.js
new file mode 100644
index 00000000..3f48e66b
--- /dev/null
+++ b/packages/osc/superdirtoutput.js
@@ -0,0 +1,10 @@
+import { oscTriggerTauri } from '../desktopbridge/oscbridge.mjs';
+import { isTauri } from '../desktopbridge/utils.mjs';
+import { oscTrigger } from './osc.mjs';
+
+const trigger = isTauri() ? oscTriggerTauri : oscTrigger;
+
+export const superdirtOutput = (hap, deadline, hapDuration, cps, targetTime) => {
+  const currentTime = performance.now() / 1000;
+  return trigger(null, hap, currentTime, cps, targetTime);
+};
diff --git a/packages/repl/package.json b/packages/repl/package.json
index 70687d1c..9ea71a69 100644
--- a/packages/repl/package.json
+++ b/packages/repl/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@strudel/repl",
-  "version": "1.0.2",
+  "version": "1.1.0",
   "description": "Strudel REPL as a Web Component",
   "module": "index.mjs",
   "publishConfig": {
diff --git a/packages/repl/vite.config.js b/packages/repl/vite.config.js
index ca209b4e..84781891 100644
--- a/packages/repl/vite.config.js
+++ b/packages/repl/vite.config.js
@@ -6,6 +6,7 @@ import replace from '@rollup/plugin-replace';
 
 // https://vitejs.dev/config/
 export default defineConfig({
+  base: './',
   plugins: [],
   build: {
     lib: {
diff --git a/packages/sampler/package.json b/packages/sampler/package.json
index 58c7db6b..252fe935 100644
--- a/packages/sampler/package.json
+++ b/packages/sampler/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@strudel/sampler",
-  "version": "0.0.9",
+  "version": "0.1.0",
   "description": "",
   "keywords": [
     "tidalcycles",
@@ -16,4 +16,4 @@
   "dependencies": {
     "cowsay": "^1.6.0"
   }
-}
\ No newline at end of file
+}
diff --git a/packages/sampler/sample-server.mjs b/packages/sampler/sample-server.mjs
index b9ae64ed..12520992 100644
--- a/packages/sampler/sample-server.mjs
+++ b/packages/sampler/sample-server.mjs
@@ -4,7 +4,7 @@ import cowsay from 'cowsay';
 import { createReadStream } from 'fs';
 import { readdir } from 'fs/promises';
 import http from 'http';
-import { join } from 'path';
+import { join, sep } from 'path';
 import os from 'os';
 
 // eslint-disable-next-line
@@ -45,15 +45,16 @@ async function getFilesInDirectory(directory) {
 }
 
 async function getBanks(directory) {
-  // const directory = resolve(__dirname, '.');
   let files = await getFilesInDirectory(directory);
   let banks = {};
-  files = files.map((url) => {
-    const [bank] = url.split('/').slice(-2);
+  directory = directory.split(sep).join('/');
+  files = files.map((path) => {
+    path = path.split(sep).join('/');
+    const [bank] = path.split('/').slice(-2);
     banks[bank] = banks[bank] || [];
-    url = url.replace(directory, '');
-    banks[bank].push(url);
-    return url;
+    const relativeUrl = path.replace(directory, '');
+    banks[bank].push(relativeUrl);
+    return relativeUrl;
   });
   banks._base = `http://localhost:5432`;
   return { banks, files };
@@ -74,7 +75,7 @@ const server = http.createServer(async (req, res) => {
     res.end('File not found');
     return;
   }
-  const filePath = join(directory, subpath);
+  const filePath = join(directory, subpath.split('/').join(sep));
   const readStream = createReadStream(filePath);
   readStream.on('error', (err) => {
     res.statusCode = 500;
diff --git a/packages/serial/package.json b/packages/serial/package.json
index 9a98a253..02418df3 100644
--- a/packages/serial/package.json
+++ b/packages/serial/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@strudel/serial",
-  "version": "1.0.1",
+  "version": "1.1.0",
   "description": "Webserial API for strudel",
   "main": "serial.mjs",
   "type": "module",
diff --git a/packages/soundfonts/package.json b/packages/soundfonts/package.json
index db8370c3..82696312 100644
--- a/packages/soundfonts/package.json
+++ b/packages/soundfonts/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@strudel/soundfonts",
-  "version": "1.0.1",
+  "version": "1.1.0",
   "description": "Soundsfont support for strudel",
   "main": "index.mjs",
   "publishConfig": {
diff --git a/packages/superdough/fft.js b/packages/superdough/fft.js
new file mode 100644
index 00000000..38294952
--- /dev/null
+++ b/packages/superdough/fft.js
@@ -0,0 +1,488 @@
+'use strict';
+// sourced from https://github.com/indutny/fft.js/
+// LICENSE
+// This software is licensed under the MIT License.
+// Copyright Fedor Indutny, 2017.
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+export default class FFT {
+  constructor(size) {
+    this.size = size | 0;
+    if (this.size <= 1 || (this.size & (this.size - 1)) !== 0)
+      throw new Error('FFT size must be a power of two and bigger than 1');
+
+    this._csize = size << 1;
+
+    // NOTE: Use of `var` is intentional for old V8 versions
+    var table = new Array(this.size * 2);
+    for (var i = 0; i < table.length; i += 2) {
+      const angle = (Math.PI * i) / this.size;
+      table[i] = Math.cos(angle);
+      table[i + 1] = -Math.sin(angle);
+    }
+    this.table = table;
+
+    // Find size's power of two
+    var power = 0;
+    for (var t = 1; this.size > t; t <<= 1) power++;
+
+    // Calculate initial step's width:
+    //   * If we are full radix-4 - it is 2x smaller to give inital len=8
+    //   * Otherwise it is the same as `power` to give len=4
+    this._width = power % 2 === 0 ? power - 1 : power;
+
+    // Pre-compute bit-reversal patterns
+    this._bitrev = new Array(1 << this._width);
+    for (var j = 0; j < this._bitrev.length; j++) {
+      this._bitrev[j] = 0;
+      for (var shift = 0; shift < this._width; shift += 2) {
+        var revShift = this._width - shift - 2;
+        this._bitrev[j] |= ((j >>> shift) & 3) << revShift;
+      }
+    }
+
+    this._out = null;
+    this._data = null;
+    this._inv = 0;
+  }
+  fromComplexArray(complex, storage) {
+    var res = storage || new Array(complex.length >>> 1);
+    for (var i = 0; i < complex.length; i += 2) res[i >>> 1] = complex[i];
+    return res;
+  }
+  createComplexArray() {
+    const res = new Array(this._csize);
+    for (var i = 0; i < res.length; i++) res[i] = 0;
+    return res;
+  }
+  toComplexArray(input, storage) {
+    var res = storage || this.createComplexArray();
+    for (var i = 0; i < res.length; i += 2) {
+      res[i] = input[i >>> 1];
+      res[i + 1] = 0;
+    }
+    return res;
+  }
+  completeSpectrum(spectrum) {
+    var size = this._csize;
+    var half = size >>> 1;
+    for (var i = 2; i < half; i += 2) {
+      spectrum[size - i] = spectrum[i];
+      spectrum[size - i + 1] = -spectrum[i + 1];
+    }
+  }
+  transform(out, data) {
+    if (out === data) throw new Error('Input and output buffers must be different');
+
+    this._out = out;
+    this._data = data;
+    this._inv = 0;
+    this._transform4();
+    this._out = null;
+    this._data = null;
+  }
+  realTransform(out, data) {
+    if (out === data) throw new Error('Input and output buffers must be different');
+
+    this._out = out;
+    this._data = data;
+    this._inv = 0;
+    this._realTransform4();
+    this._out = null;
+    this._data = null;
+  }
+  inverseTransform(out, data) {
+    if (out === data) throw new Error('Input and output buffers must be different');
+
+    this._out = out;
+    this._data = data;
+    this._inv = 1;
+    this._transform4();
+    for (var i = 0; i < out.length; i++) out[i] /= this.size;
+    this._out = null;
+    this._data = null;
+  }
+  // radix-4 implementation
+  //
+  // NOTE: Uses of `var` are intentional for older V8 version that do not
+  // support both `let compound assignments` and `const phi`
+  _transform4() {
+    var out = this._out;
+    var size = this._csize;
+
+    // Initial step (permute and transform)
+    var width = this._width;
+    var step = 1 << width;
+    var len = (size / step) << 1;
+
+    var outOff;
+    var t;
+    var bitrev = this._bitrev;
+    if (len === 4) {
+      for (outOff = 0, t = 0; outOff < size; outOff += len, t++) {
+        const off = bitrev[t];
+        this._singleTransform2(outOff, off, step);
+      }
+    } else {
+      // len === 8
+      for (outOff = 0, t = 0; outOff < size; outOff += len, t++) {
+        const off = bitrev[t];
+        this._singleTransform4(outOff, off, step);
+      }
+    }
+
+    // Loop through steps in decreasing order
+    var inv = this._inv ? -1 : 1;
+    var table = this.table;
+    for (step >>= 2; step >= 2; step >>= 2) {
+      len = (size / step) << 1;
+      var quarterLen = len >>> 2;
+
+      // Loop through offsets in the data
+      for (outOff = 0; outOff < size; outOff += len) {
+        // Full case
+        var limit = outOff + quarterLen;
+        for (var i = outOff, k = 0; i < limit; i += 2, k += step) {
+          const A = i;
+          const B = A + quarterLen;
+          const C = B + quarterLen;
+          const D = C + quarterLen;
+
+          // Original values
+          const Ar = out[A];
+          const Ai = out[A + 1];
+          const Br = out[B];
+          const Bi = out[B + 1];
+          const Cr = out[C];
+          const Ci = out[C + 1];
+          const Dr = out[D];
+          const Di = out[D + 1];
+
+          // Middle values
+          const MAr = Ar;
+          const MAi = Ai;
+
+          const tableBr = table[k];
+          const tableBi = inv * table[k + 1];
+          const MBr = Br * tableBr - Bi * tableBi;
+          const MBi = Br * tableBi + Bi * tableBr;
+
+          const tableCr = table[2 * k];
+          const tableCi = inv * table[2 * k + 1];
+          const MCr = Cr * tableCr - Ci * tableCi;
+          const MCi = Cr * tableCi + Ci * tableCr;
+
+          const tableDr = table[3 * k];
+          const tableDi = inv * table[3 * k + 1];
+          const MDr = Dr * tableDr - Di * tableDi;
+          const MDi = Dr * tableDi + Di * tableDr;
+
+          // Pre-Final values
+          const T0r = MAr + MCr;
+          const T0i = MAi + MCi;
+          const T1r = MAr - MCr;
+          const T1i = MAi - MCi;
+          const T2r = MBr + MDr;
+          const T2i = MBi + MDi;
+          const T3r = inv * (MBr - MDr);
+          const T3i = inv * (MBi - MDi);
+
+          // Final values
+          const FAr = T0r + T2r;
+          const FAi = T0i + T2i;
+
+          const FCr = T0r - T2r;
+          const FCi = T0i - T2i;
+
+          const FBr = T1r + T3i;
+          const FBi = T1i - T3r;
+
+          const FDr = T1r - T3i;
+          const FDi = T1i + T3r;
+
+          out[A] = FAr;
+          out[A + 1] = FAi;
+          out[B] = FBr;
+          out[B + 1] = FBi;
+          out[C] = FCr;
+          out[C + 1] = FCi;
+          out[D] = FDr;
+          out[D + 1] = FDi;
+        }
+      }
+    }
+  }
+  // radix-2 implementation
+  //
+  // NOTE: Only called for len=4
+  _singleTransform2(outOff, off, step) {
+    const out = this._out;
+    const data = this._data;
+
+    const evenR = data[off];
+    const evenI = data[off + 1];
+    const oddR = data[off + step];
+    const oddI = data[off + step + 1];
+
+    const leftR = evenR + oddR;
+    const leftI = evenI + oddI;
+    const rightR = evenR - oddR;
+    const rightI = evenI - oddI;
+
+    out[outOff] = leftR;
+    out[outOff + 1] = leftI;
+    out[outOff + 2] = rightR;
+    out[outOff + 3] = rightI;
+  }
+  // radix-4
+  //
+  // NOTE: Only called for len=8
+  _singleTransform4(outOff, off, step) {
+    const out = this._out;
+    const data = this._data;
+    const inv = this._inv ? -1 : 1;
+    const step2 = step * 2;
+    const step3 = step * 3;
+
+    // Original values
+    const Ar = data[off];
+    const Ai = data[off + 1];
+    const Br = data[off + step];
+    const Bi = data[off + step + 1];
+    const Cr = data[off + step2];
+    const Ci = data[off + step2 + 1];
+    const Dr = data[off + step3];
+    const Di = data[off + step3 + 1];
+
+    // Pre-Final values
+    const T0r = Ar + Cr;
+    const T0i = Ai + Ci;
+    const T1r = Ar - Cr;
+    const T1i = Ai - Ci;
+    const T2r = Br + Dr;
+    const T2i = Bi + Di;
+    const T3r = inv * (Br - Dr);
+    const T3i = inv * (Bi - Di);
+
+    // Final values
+    const FAr = T0r + T2r;
+    const FAi = T0i + T2i;
+
+    const FBr = T1r + T3i;
+    const FBi = T1i - T3r;
+
+    const FCr = T0r - T2r;
+    const FCi = T0i - T2i;
+
+    const FDr = T1r - T3i;
+    const FDi = T1i + T3r;
+
+    out[outOff] = FAr;
+    out[outOff + 1] = FAi;
+    out[outOff + 2] = FBr;
+    out[outOff + 3] = FBi;
+    out[outOff + 4] = FCr;
+    out[outOff + 5] = FCi;
+    out[outOff + 6] = FDr;
+    out[outOff + 7] = FDi;
+  }
+  // Real input radix-4 implementation
+  _realTransform4() {
+    var out = this._out;
+    var size = this._csize;
+
+    // Initial step (permute and transform)
+    var width = this._width;
+    var step = 1 << width;
+    var len = (size / step) << 1;
+
+    var outOff;
+    var t;
+    var bitrev = this._bitrev;
+    if (len === 4) {
+      for (outOff = 0, t = 0; outOff < size; outOff += len, t++) {
+        const off = bitrev[t];
+        this._singleRealTransform2(outOff, off >>> 1, step >>> 1);
+      }
+    } else {
+      // len === 8
+      for (outOff = 0, t = 0; outOff < size; outOff += len, t++) {
+        const off = bitrev[t];
+        this._singleRealTransform4(outOff, off >>> 1, step >>> 1);
+      }
+    }
+
+    // Loop through steps in decreasing order
+    var inv = this._inv ? -1 : 1;
+    var table = this.table;
+    for (step >>= 2; step >= 2; step >>= 2) {
+      len = (size / step) << 1;
+      var halfLen = len >>> 1;
+      var quarterLen = halfLen >>> 1;
+      var hquarterLen = quarterLen >>> 1;
+
+      // Loop through offsets in the data
+      for (outOff = 0; outOff < size; outOff += len) {
+        for (var i = 0, k = 0; i <= hquarterLen; i += 2, k += step) {
+          var A = outOff + i;
+          var B = A + quarterLen;
+          var C = B + quarterLen;
+          var D = C + quarterLen;
+
+          // Original values
+          var Ar = out[A];
+          var Ai = out[A + 1];
+          var Br = out[B];
+          var Bi = out[B + 1];
+          var Cr = out[C];
+          var Ci = out[C + 1];
+          var Dr = out[D];
+          var Di = out[D + 1];
+
+          // Middle values
+          var MAr = Ar;
+          var MAi = Ai;
+
+          var tableBr = table[k];
+          var tableBi = inv * table[k + 1];
+          var MBr = Br * tableBr - Bi * tableBi;
+          var MBi = Br * tableBi + Bi * tableBr;
+
+          var tableCr = table[2 * k];
+          var tableCi = inv * table[2 * k + 1];
+          var MCr = Cr * tableCr - Ci * tableCi;
+          var MCi = Cr * tableCi + Ci * tableCr;
+
+          var tableDr = table[3 * k];
+          var tableDi = inv * table[3 * k + 1];
+          var MDr = Dr * tableDr - Di * tableDi;
+          var MDi = Dr * tableDi + Di * tableDr;
+
+          // Pre-Final values
+          var T0r = MAr + MCr;
+          var T0i = MAi + MCi;
+          var T1r = MAr - MCr;
+          var T1i = MAi - MCi;
+          var T2r = MBr + MDr;
+          var T2i = MBi + MDi;
+          var T3r = inv * (MBr - MDr);
+          var T3i = inv * (MBi - MDi);
+
+          // Final values
+          var FAr = T0r + T2r;
+          var FAi = T0i + T2i;
+
+          var FBr = T1r + T3i;
+          var FBi = T1i - T3r;
+
+          out[A] = FAr;
+          out[A + 1] = FAi;
+          out[B] = FBr;
+          out[B + 1] = FBi;
+
+          // Output final middle point
+          if (i === 0) {
+            var FCr = T0r - T2r;
+            var FCi = T0i - T2i;
+            out[C] = FCr;
+            out[C + 1] = FCi;
+            continue;
+          }
+
+          // Do not overwrite ourselves
+          if (i === hquarterLen) continue;
+
+          // In the flipped case:
+          // MAi = -MAi
+          // MBr=-MBi, MBi=-MBr
+          // MCr=-MCr
+          // MDr=MDi, MDi=MDr
+          var ST0r = T1r;
+          var ST0i = -T1i;
+          var ST1r = T0r;
+          var ST1i = -T0i;
+          var ST2r = -inv * T3i;
+          var ST2i = -inv * T3r;
+          var ST3r = -inv * T2i;
+          var ST3i = -inv * T2r;
+
+          var SFAr = ST0r + ST2r;
+          var SFAi = ST0i + ST2i;
+
+          var SFBr = ST1r + ST3i;
+          var SFBi = ST1i - ST3r;
+
+          var SA = outOff + quarterLen - i;
+          var SB = outOff + halfLen - i;
+
+          out[SA] = SFAr;
+          out[SA + 1] = SFAi;
+          out[SB] = SFBr;
+          out[SB + 1] = SFBi;
+        }
+      }
+    }
+  }
+  // radix-2 implementation
+  //
+  // NOTE: Only called for len=4
+  _singleRealTransform2(outOff, off, step) {
+    const out = this._out;
+    const data = this._data;
+
+    const evenR = data[off];
+    const oddR = data[off + step];
+
+    const leftR = evenR + oddR;
+    const rightR = evenR - oddR;
+
+    out[outOff] = leftR;
+    out[outOff + 1] = 0;
+    out[outOff + 2] = rightR;
+    out[outOff + 3] = 0;
+  }
+  // radix-4
+  //
+  // NOTE: Only called for len=8
+  _singleRealTransform4(outOff, off, step) {
+    const out = this._out;
+    const data = this._data;
+    const inv = this._inv ? -1 : 1;
+    const step2 = step * 2;
+    const step3 = step * 3;
+
+    // Original values
+    const Ar = data[off];
+    const Br = data[off + step];
+    const Cr = data[off + step2];
+    const Dr = data[off + step3];
+
+    // Pre-Final values
+    const T0r = Ar + Cr;
+    const T1r = Ar - Cr;
+    const T2r = Br + Dr;
+    const T3r = inv * (Br - Dr);
+
+    // Final values
+    const FAr = T0r + T2r;
+
+    const FBr = T1r;
+    const FBi = -T3r;
+
+    const FCr = T0r - T2r;
+
+    const FDr = T1r;
+    const FDi = T3r;
+
+    out[outOff] = FAr;
+    out[outOff + 1] = 0;
+    out[outOff + 2] = FBr;
+    out[outOff + 3] = FBi;
+    out[outOff + 4] = FCr;
+    out[outOff + 5] = 0;
+    out[outOff + 6] = FDr;
+    out[outOff + 7] = FDi;
+  }
+}
diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs
index f5f3ad68..e51156fe 100644
--- a/packages/superdough/helpers.mjs
+++ b/packages/superdough/helpers.mjs
@@ -14,6 +14,15 @@ const getSlope = (y1, y2, x1, x2) => {
   }
   return (y2 - y1) / (x2 - x1);
 };
+
+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;
+  });
+  return node;
+}
+
 export const getParamADSR = (
   param,
   attack,
@@ -103,14 +112,22 @@ 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 createFilter(context, type, frequency, Q, att, dec, sus, rel, fenv, start, end, fanchor) {
+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]);
-  const filter = context.createBiquadFilter();
+  let filter;
+  let frequencyParam;
+  if (model === 'ladder') {
+    filter = getWorklet(context, 'ladder-processor', { frequency, q: Q, drive });
+    frequencyParam = filter.parameters.get('frequency');
+  } else {
+    filter = context.createBiquadFilter();
+    filter.type = type;
+    filter.Q.value = Q;
+    filter.frequency.value = frequency;
+    frequencyParam = filter.frequency;
+  }
 
-  filter.type = type;
-  filter.Q.value = Q;
-  filter.frequency.value = frequency;
   // envelope is active when any of these values is set
   const hasEnvelope = att ?? dec ?? sus ?? rel ?? fenv;
   // Apply ADSR to filter frequency
@@ -122,7 +139,7 @@ export function createFilter(context, type, frequency, Q, att, dec, sus, rel, fe
     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(filter.frequency, attack, decay, sustain, release, min, max, start, end, curve);
+    getParamADSR(frequencyParam, attack, decay, sustain, release, min, max, start, end, curve);
     return filter;
   }
   return filter;
diff --git a/packages/superdough/ola-processor.js b/packages/superdough/ola-processor.js
new file mode 100644
index 00000000..38d45a25
--- /dev/null
+++ b/packages/superdough/ola-processor.js
@@ -0,0 +1,185 @@
+'use strict';
+
+// sourced from https://github.com/olvb/phaze/tree/master?tab=readme-ov-file
+const WEBAUDIO_BLOCK_SIZE = 128;
+
+/** Overlap-Add Node */
+class OLAProcessor extends AudioWorkletProcessor {
+  constructor(options) {
+    super(options);
+    this.started = false;
+    this.nbInputs = options.numberOfInputs;
+    this.nbOutputs = options.numberOfOutputs;
+
+    this.blockSize = options.processorOptions.blockSize;
+    // TODO for now, the only support hop size is the size of a web audio block
+    this.hopSize = WEBAUDIO_BLOCK_SIZE;
+
+    this.nbOverlaps = this.blockSize / this.hopSize;
+
+    // pre-allocate input buffers (will be reallocated if needed)
+    this.inputBuffers = new Array(this.nbInputs);
+    this.inputBuffersHead = new Array(this.nbInputs);
+    this.inputBuffersToSend = new Array(this.nbInputs);
+    // default to 1 channel per input until we know more
+    for (let i = 0; i < this.nbInputs; i++) {
+      this.allocateInputChannels(i, 1);
+    }
+    // pre-allocate input buffers (will be reallocated if needed)
+    this.outputBuffers = new Array(this.nbOutputs);
+    this.outputBuffersToRetrieve = new Array(this.nbOutputs);
+    // default to 1 channel per output until we know more
+    for (let i = 0; i < this.nbOutputs; i++) {
+      this.allocateOutputChannels(i, 1);
+    }
+  }
+
+  /** Handles dynamic reallocation of input/output channels buffer
+     (channel numbers may lety during lifecycle) **/
+  reallocateChannelsIfNeeded(inputs, outputs) {
+    for (let i = 0; i < this.nbInputs; i++) {
+      let nbChannels = inputs[i].length;
+      if (nbChannels != this.inputBuffers[i].length) {
+        this.allocateInputChannels(i, nbChannels);
+      }
+    }
+
+    for (let i = 0; i < this.nbOutputs; i++) {
+      let nbChannels = outputs[i].length;
+      if (nbChannels != this.outputBuffers[i].length) {
+        this.allocateOutputChannels(i, nbChannels);
+      }
+    }
+  }
+
+  allocateInputChannels(inputIndex, nbChannels) {
+    // allocate input buffers
+
+    this.inputBuffers[inputIndex] = new Array(nbChannels);
+    for (let i = 0; i < nbChannels; i++) {
+      this.inputBuffers[inputIndex][i] = new Float32Array(this.blockSize + WEBAUDIO_BLOCK_SIZE);
+      this.inputBuffers[inputIndex][i].fill(0);
+    }
+
+    // allocate input buffers to send and head pointers to copy from
+    // (cannot directly send a pointer/subarray because input may be modified)
+    this.inputBuffersHead[inputIndex] = new Array(nbChannels);
+    this.inputBuffersToSend[inputIndex] = new Array(nbChannels);
+    for (let i = 0; i < nbChannels; i++) {
+      this.inputBuffersHead[inputIndex][i] = this.inputBuffers[inputIndex][i].subarray(0, this.blockSize);
+      this.inputBuffersToSend[inputIndex][i] = new Float32Array(this.blockSize);
+    }
+  }
+
+  allocateOutputChannels(outputIndex, nbChannels) {
+    // allocate output buffers
+    this.outputBuffers[outputIndex] = new Array(nbChannels);
+    for (let i = 0; i < nbChannels; i++) {
+      this.outputBuffers[outputIndex][i] = new Float32Array(this.blockSize);
+      this.outputBuffers[outputIndex][i].fill(0);
+    }
+
+    // allocate output buffers to retrieve
+    // (cannot send a pointer/subarray because new output has to be add to exising output)
+    this.outputBuffersToRetrieve[outputIndex] = new Array(nbChannels);
+    for (let i = 0; i < nbChannels; i++) {
+      this.outputBuffersToRetrieve[outputIndex][i] = new Float32Array(this.blockSize);
+      this.outputBuffersToRetrieve[outputIndex][i].fill(0);
+    }
+  }
+
+  /** Read next web audio block to input buffers **/
+  readInputs(inputs) {
+    // when playback is paused, we may stop receiving new samples
+    if (inputs[0].length && inputs[0][0].length == 0) {
+      for (let i = 0; i < this.nbInputs; i++) {
+        for (let j = 0; j < this.inputBuffers[i].length; j++) {
+          this.inputBuffers[i][j].fill(0, this.blockSize);
+        }
+      }
+      return;
+    }
+
+    for (let i = 0; i < this.nbInputs; i++) {
+      for (let j = 0; j < this.inputBuffers[i].length; j++) {
+        let webAudioBlock = inputs[i][j];
+        this.inputBuffers[i][j].set(webAudioBlock, this.blockSize);
+      }
+    }
+  }
+
+  /** Write next web audio block from output buffers **/
+  writeOutputs(outputs) {
+    for (let i = 0; i < this.nbInputs; i++) {
+      for (let j = 0; j < this.inputBuffers[i].length; j++) {
+        let webAudioBlock = this.outputBuffers[i][j].subarray(0, WEBAUDIO_BLOCK_SIZE);
+        outputs[i][j].set(webAudioBlock);
+      }
+    }
+  }
+
+  /** Shift left content of input buffers to receive new web audio block **/
+  shiftInputBuffers() {
+    for (let i = 0; i < this.nbInputs; i++) {
+      for (let j = 0; j < this.inputBuffers[i].length; j++) {
+        this.inputBuffers[i][j].copyWithin(0, WEBAUDIO_BLOCK_SIZE);
+      }
+    }
+  }
+
+  /** Shift left content of output buffers to receive new web audio block **/
+  shiftOutputBuffers() {
+    for (let i = 0; i < this.nbOutputs; i++) {
+      for (let j = 0; j < this.outputBuffers[i].length; j++) {
+        this.outputBuffers[i][j].copyWithin(0, WEBAUDIO_BLOCK_SIZE);
+        this.outputBuffers[i][j].subarray(this.blockSize - WEBAUDIO_BLOCK_SIZE).fill(0);
+      }
+    }
+  }
+
+  /** Copy contents of input buffers to buffer actually sent to process **/
+  prepareInputBuffersToSend() {
+    for (let i = 0; i < this.nbInputs; i++) {
+      for (let j = 0; j < this.inputBuffers[i].length; j++) {
+        this.inputBuffersToSend[i][j].set(this.inputBuffersHead[i][j]);
+      }
+    }
+  }
+
+  /** Add contents of output buffers just processed to output buffers **/
+  handleOutputBuffersToRetrieve() {
+    for (let i = 0; i < this.nbOutputs; i++) {
+      for (let j = 0; j < this.outputBuffers[i].length; j++) {
+        for (let k = 0; k < this.blockSize; k++) {
+          this.outputBuffers[i][j][k] += this.outputBuffersToRetrieve[i][j][k] / this.nbOverlaps;
+        }
+      }
+    }
+  }
+
+  process(inputs, outputs, params) {
+    const input = inputs[0];
+    const hasInput = !(input[0] === undefined);
+    if (this.started && !hasInput) {
+      return false;
+    }
+    this.started = hasInput;
+    this.reallocateChannelsIfNeeded(inputs, outputs);
+
+    this.readInputs(inputs);
+    this.shiftInputBuffers();
+    this.prepareInputBuffersToSend();
+    this.processOLA(this.inputBuffersToSend, this.outputBuffersToRetrieve, params);
+    this.handleOutputBuffersToRetrieve();
+    this.writeOutputs(outputs);
+    this.shiftOutputBuffers();
+
+    return true;
+  }
+
+  processOLA(inputs, outputs, params) {
+    console.assert(false, 'Not overriden');
+  }
+}
+
+export default OLAProcessor;
diff --git a/packages/superdough/package.json b/packages/superdough/package.json
index f1abd95b..685ab9c5 100644
--- a/packages/superdough/package.json
+++ b/packages/superdough/package.json
@@ -1,6 +1,6 @@
 {
   "name": "superdough",
-  "version": "1.0.1",
+  "version": "1.1.0",
   "description": "simple web audio synth and sampler intended for live coding. inspired by superdirt and webdirt.",
   "main": "index.mjs",
   "type": "module",
diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs
index ebb54863..7d57b5bb 100644
--- a/packages/superdough/superdough.mjs
+++ b/packages/superdough/superdough.mjs
@@ -7,9 +7,9 @@ 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 { clamp, nanFallback } from './util.mjs';
-import workletsUrl from './worklets.mjs?url';
-import { createFilter, gainNode, getCompressor } from './helpers.mjs';
+import { clamp, nanFallback, _mod } from './util.mjs';
+import workletsUrl from './worklets.mjs?worker&url';
+import { createFilter, gainNode, getCompressor, getWorklet } from './helpers.mjs';
 import { map } from 'nanostores';
 import { logger } from './logger.mjs';
 import { loadBuffer } from './sampler.mjs';
@@ -24,6 +24,52 @@ export function getSound(s) {
   return soundMap.get()[s];
 }
 
+const defaultDefaultValues = {
+  s: 'triangle',
+  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,
+  distortvol: 1,
+  delay: 0,
+  delayfeedback: 0.5,
+  delaytime: 0.25,
+  orbit: 1,
+  i: 1,
+  velocity: 1,
+  fft: 8,
+};
+
+let defaultControls = new Map(Object.entries(defaultDefaultValues));
+
+export function setDefaultValue(key, value) {
+  defaultControls.set(key, value);
+}
+export function getDefaultValue(key) {
+  return defaultControls.get(key);
+}
+export function setDefaultValues(defaultsobj) {
+  Object.keys(defaultsobj).forEach((key) => {
+    setDefaultValue(key, defaultsobj[key]);
+  });
+}
+export function resetDefaultValues() {
+  defaultControls = new Map(Object.entries(defaultDefaultValues));
+}
+export function setVersionDefaults(version) {
+  resetDefaultValues();
+  if (version === '1.0') {
+    setDefaultValue('fanchor', 0.5);
+  }
+}
+
 export const resetLoadedSounds = () => soundMap.set({});
 
 let audioContext;
@@ -37,50 +83,53 @@ export const getAudioContext = () => {
   if (!audioContext) {
     return setDefaultAudioContext();
   }
+
   return audioContext;
 };
 
-let workletsLoading;
-
-function loadWorklets() {
-  if (workletsLoading) {
-    return workletsLoading;
-  }
-  workletsLoading = getAudioContext().audioWorklet.addModule(workletsUrl);
-  return workletsLoading;
+export function getAudioContextCurrentTime() {
+  return getAudioContext().currentTime;
 }
 
-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;
-  });
-  return node;
+let workletsLoading;
+function loadWorklets() {
+  if (!workletsLoading) {
+    workletsLoading = getAudioContext().audioWorklet.addModule(workletsUrl);
+  }
+  return workletsLoading;
 }
 
 // this function should be called on first user interaction (to avoid console warning)
 export async function initAudio(options = {}) {
   const { disableWorklets = false } = options;
-  if (typeof window !== 'undefined') {
-    await getAudioContext().resume();
-    if (!disableWorklets) {
-      await loadWorklets().catch((err) => {
-        console.warn('could not load AudioWorklet effects coarse, crush and shape', err);
-      });
-    } else {
-      console.log('disableWorklets: AudioWorklet effects coarse, crush and shape are skipped!');
-    }
+  if (typeof window === 'undefined') {
+    return;
   }
+  await getAudioContext().resume();
+  if (disableWorklets) {
+    logger('[superdough]: AudioWorklets disabled with disableWorklets');
+    return;
+  }
+  try {
+    await loadWorklets();
+    logger('[superdough] AudioWorklets loaded');
+  } catch (err) {
+    console.warn('could not load AudioWorklet effects', err);
+  }
+  logger('[superdough] ready');
 }
-
+let audioReady;
 export async function initAudioOnFirstClick(options) {
-  return new Promise((resolve) => {
-    document.addEventListener('click', async function listener() {
-      await initAudio(options);
-      resolve();
-      document.removeEventListener('click', listener);
+  if (!audioReady) {
+    audioReady = new Promise((resolve) => {
+      document.addEventListener('click', async function listener() {
+        document.removeEventListener('click', listener);
+        await initAudio(options);
+        resolve();
+      });
     });
-  });
+  }
+  return audioReady;
 }
 
 let delays = {};
@@ -144,26 +193,25 @@ function getDelay(orbit, delaytime, delayfeedback, t) {
   return delays[orbit];
 }
 
-// each orbit will have its own lfo
-const phaserLFOs = {};
-function getPhaser(orbit, t, speed = 1, depth = 0.5, centerFrequency = 1000, sweep = 2000) {
+function getPhaser(time, end, frequency = 1, depth = 0.5, centerFrequency = 1000, sweep = 2000) {
   //gain
   const ac = getAudioContext();
   const lfoGain = ac.createGain();
-  lfoGain.gain.value = sweep;
+  lfoGain.gain.value = sweep * 2;
+  // centerFrequency = centerFrequency * 2;
+  // sweep = sweep * 1.5;
 
-  //LFO
-  if (phaserLFOs[orbit] == null) {
-    phaserLFOs[orbit] = ac.createOscillator();
-    phaserLFOs[orbit].frequency.value = speed;
-    phaserLFOs[orbit].type = 'sine';
-    phaserLFOs[orbit].start();
-  }
-
-  phaserLFOs[orbit].connect(lfoGain);
-  if (phaserLFOs[orbit].frequency.value != speed) {
-    phaserLFOs[orbit].frequency.setValueAtTime(speed, t);
-  }
+  const lfo = getWorklet(ac, 'lfo-processor', {
+    frequency,
+    depth: 1,
+    skew: 0,
+    phaseoffset: 0,
+    time,
+    end,
+    shape: 1,
+    dcoffset: -0.5,
+  });
+  lfo.connect(lfoGain);
 
   //filters
   const numStages = 2; //num of filters in series
@@ -186,10 +234,14 @@ function getPhaser(orbit, t, speed = 1, depth = 0.5, centerFrequency = 1000, swe
   return filterChain[filterChain.length - 1];
 }
 
+function getFilterType(ftype) {
+  ftype = ftype ?? 0;
+  const filterTypes = ['12db', 'ladder', '24db'];
+  return typeof ftype === 'number' ? filterTypes[Math.floor(_mod(ftype, filterTypes.length))] : ftype;
+}
+
 let reverbs = {};
-
 let hasChanged = (now, before) => now !== undefined && now !== before;
-
 function getReverb(orbit, duration, fade, lp, dim, ir) {
   // If no reverb has been created for a given orbit, create one
   if (!reverbs[orbit]) {
@@ -261,6 +313,13 @@ export function resetGlobalEffects() {
 }
 
 export const superdough = async (value, t, hapDuration) => {
+  t = typeof t === 'string' && t.startsWith('=') ? Number(t.slice(1)) : ac.currentTime + t;
+  let { stretch } = value;
+  if (stretch != null) {
+    //account for phase vocoder latency
+    const latency = 0.04;
+    t = t - latency;
+  }
   const ac = getAudioContext();
   if (typeof value !== 'object') {
     throw new Error(
@@ -272,7 +331,7 @@ export const superdough = async (value, t, hapDuration) => {
   // duration is passed as value too..
   value.duration = hapDuration;
   // calculate absolute time
-  t = typeof t === 'string' && t.startsWith('=') ? Number(t.slice(1)) : ac.currentTime + t;
+
   if (t < ac.currentTime) {
     console.warn(
       `[superdough]: cannot schedule sounds in the past (target: ${t.toFixed(2)}, now: ${ac.currentTime.toFixed(2)})`,
@@ -281,15 +340,15 @@ export const superdough = async (value, t, hapDuration) => {
   }
   // destructure
   let {
-    s = 'triangle',
+    s = getDefaultValue('s'),
     bank,
     source,
-    gain = 0.8,
-    postgain = 1,
-    density = 0.03,
+    gain = getDefaultValue('gain'),
+    postgain = getDefaultValue('postgain'),
+    density = getDefaultValue('density'),
     // filters
-    ftype = '12db',
-    fanchor = 0.5,
+    fanchor = getDefaultValue('fanchor'),
+    drive = 0.69,
     // low pass
     cutoff,
     lpenv,
@@ -297,7 +356,7 @@ export const superdough = async (value, t, hapDuration) => {
     lpdecay,
     lpsustain,
     lprelease,
-    resonance = 1,
+    resonance = getDefaultValue('resonance'),
     // high pass
     hpenv,
     hcutoff,
@@ -305,7 +364,7 @@ export const superdough = async (value, t, hapDuration) => {
     hpdecay,
     hpsustain,
     hprelease,
-    hresonance = 1,
+    hresonance = getDefaultValue('hresonance'),
     // band pass
     bpenv,
     bandf,
@@ -313,36 +372,36 @@ export const superdough = async (value, t, hapDuration) => {
     bpdecay,
     bpsustain,
     bprelease,
-    bandq = 1,
-    channels = [1, 2],
+    bandq = getDefaultValue('bandq'),
+    channels = getDefaultValue('channels'),
     //phaser
-    phaser,
-    phaserdepth = 0.75,
+    phaserrate: phaser,
+    phaserdepth = getDefaultValue('phaserdepth'),
     phasersweep,
     phasercenter,
     //
     coarse,
     crush,
     shape,
-    shapevol = 1,
+    shapevol = getDefaultValue('shapevol'),
     distort,
-    distortvol = 1,
+    distortvol = getDefaultValue('distortvol'),
     pan,
     vowel,
-    delay = 0,
-    delayfeedback = 0.5,
-    delaytime = 0.25,
-    orbit = 1,
+    delay = getDefaultValue('delay'),
+    delayfeedback = getDefaultValue('delayfeedback'),
+    delaytime = getDefaultValue('delaytime'),
+    orbit = getDefaultValue('orbit'),
     room,
     roomfade,
     roomlp,
     roomdim,
     roomsize,
     ir,
-    i = 0,
-    velocity = 1,
+    i = getDefaultValue('i'),
+    velocity = getDefaultValue('velocity'),
     analyze, // analyser wet
-    fft = 8, // fftSize 0 - 10
+    fft = getDefaultValue('fft'), // fftSize 0 - 10
     compressor: compressorThreshold,
     compressorRatio,
     compressorKnee,
@@ -391,10 +450,13 @@ export const superdough = async (value, t, hapDuration) => {
   }
   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 }));
 
   // gain stage
   chain.push(gainNode(gain));
 
+  //filter
+  const ftype = getFilterType(value.ftype);
   if (cutoff !== undefined) {
     let lp = () =>
       createFilter(
@@ -410,6 +472,8 @@ export const superdough = async (value, t, hapDuration) => {
         t,
         t + hapDuration,
         fanchor,
+        ftype,
+        drive,
       );
     chain.push(lp());
     if (ftype === '24db') {
@@ -485,7 +549,7 @@ export const superdough = async (value, t, hapDuration) => {
   }
   // phaser
   if (phaser !== undefined && phaserdepth > 0) {
-    const phaserFX = getPhaser(orbit, t, phaser, phaserdepth, phasercenter, phasersweep);
+    const phaserFX = getPhaser(t, t + hapDuration, phaser, phaserdepth, phasercenter, phasersweep);
     chain.push(phaserFX);
   }
 
@@ -533,4 +597,6 @@ export const superdough = async (value, t, hapDuration) => {
   toDisconnect = chain.concat([delaySend, reverbSend, analyserSend]);
 };
 
-export const superdoughTrigger = (t, hap, ct, cps) => superdough(hap, t - ct, hap.duration / cps, cps);
+export const superdoughTrigger = (t, hap, ct, cps) => {
+  superdough(hap, t - ct, hap.duration / cps, cps);
+};
diff --git a/packages/superdough/synth.mjs b/packages/superdough/synth.mjs
index 55ecc83f..621a6e59 100644
--- a/packages/superdough/synth.mjs
+++ b/packages/superdough/synth.mjs
@@ -1,5 +1,5 @@
 import { clamp, midiToFreq, noteToMidi } from './util.mjs';
-import { registerSound, getAudioContext, getWorklet } from './superdough.mjs';
+import { registerSound, getAudioContext } from './superdough.mjs';
 import {
   applyFM,
   gainNode,
@@ -8,6 +8,7 @@ import {
   getPitchEnvelope,
   getVibratoOscillator,
   webAudioTimeout,
+  getWorklet,
 } from './helpers.mjs';
 import { getNoiseMix, getNoiseOscillator } from './noise.mjs';
 
diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs
index a1f524ca..a2b7828c 100644
--- a/packages/superdough/worklets.mjs
+++ b/packages/superdough/worklets.mjs
@@ -1,7 +1,145 @@
 // coarse, crush, and shape processors adapted from dktr0's webdirt: https://github.com/dktr0/WebDirt/blob/5ce3d698362c54d6e1b68acc47eb2955ac62c793/dist/AudioWorklets.js
 // LICENSE GNU General Public License v3.0 see https://github.com/dktr0/WebDirt/blob/main/LICENSE
+// TOFIX: THIS FILE DOES NOT SUPPORT IMPORTS ON DEPOLYMENT
+
+import OLAProcessor from './ola-processor';
+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 blockSize = 128;
+// adjust waveshape to remove frequencies above nyquist to prevent aliasing
+// referenced from https://www.kvraudio.com/forum/viewtopic.php?t=375517
+function polyBlep(phase, dt) {
+  // 0 <= phase < 1
+  if (phase < dt) {
+    phase /= dt;
+    // 2 * (phase - phase^2/2 - 0.5)
+    return phase + phase - phase * phase - 1;
+  }
+
+  // -1 < phase < 0
+  else if (phase > 1 - dt) {
+    phase = (phase - 1) / dt;
+    // 2 * (phase^2/2 + phase + 0.5)
+    return phase * phase + phase + phase + 1;
+  }
+
+  // 0 otherwise
+  else {
+    return 0;
+  }
+}
+
+const waveshapes = {
+  tri(phase, skew = 0.5) {
+    const x = 1 - skew;
+    if (phase >= skew) {
+      return 1 / x - phase / x;
+    }
+    return phase / skew;
+  },
+  sine(phase) {
+    return Math.sin(Math.PI * 2 * phase) * 0.5 + 0.5;
+  },
+  ramp(phase) {
+    return phase;
+  },
+  saw(phase) {
+    return 1 - phase;
+  },
+
+  square(phase, skew = 0.5) {
+    if (phase >= skew) {
+      return 0;
+    }
+    return 1;
+  },
+  custom(phase, values = [0, 1]) {
+    const numParts = values.length - 1;
+    const currPart = Math.floor(phase * numParts);
+
+    const partLength = 1 / numParts;
+    const startVal = clamp(values[currPart], 0, 1);
+    const endVal = clamp(values[currPart + 1], 0, 1);
+    const y2 = endVal;
+    const y1 = startVal;
+    const x1 = 0;
+    const x2 = partLength;
+    const slope = (y2 - y1) / (x2 - x1);
+    return slope * (phase - partLength * currPart) + startVal;
+  },
+  sawblep(phase, dt) {
+    const v = 2 * phase - 1;
+    return v - polyBlep(phase, dt);
+  },
+};
+
+const waveShapeNames = Object.keys(waveshapes);
+class LFOProcessor extends AudioWorkletProcessor {
+  static get parameterDescriptors() {
+    return [
+      { name: 'time', defaultValue: 0 },
+      { name: 'end', defaultValue: 0 },
+      { name: 'frequency', defaultValue: 0.5 },
+      { name: 'skew', defaultValue: 0.5 },
+      { name: 'depth', defaultValue: 1 },
+      { name: 'phaseoffset', defaultValue: 0 },
+      { name: 'shape', defaultValue: 0 },
+      { name: 'dcoffset', defaultValue: 0 },
+    ];
+  }
+
+  constructor() {
+    super();
+    this.phase;
+  }
+
+  incrementPhase(dt) {
+    this.phase += dt;
+    if (this.phase > 1.0) {
+      this.phase = this.phase - 1;
+    }
+  }
+
+  process(inputs, outputs, parameters) {
+    // eslint-disable-next-line no-undef
+    if (currentTime >= parameters.end[0]) {
+      return false;
+    }
+
+    const output = outputs[0];
+    const frequency = parameters['frequency'][0];
+
+    const time = parameters['time'][0];
+    const depth = parameters['depth'][0];
+    const skew = parameters['skew'][0];
+    const phaseoffset = parameters['phaseoffset'][0];
+
+    const dcoffset = parameters['dcoffset'][0];
+    const shape = waveShapeNames[parameters['shape'][0]];
+
+    const blockSize = output[0].length ?? 0;
+
+    if (this.phase == null) {
+      this.phase = _mod(time * frequency + phaseoffset, 1);
+    }
+    // eslint-disable-next-line no-undef
+    const dt = frequency / sampleRate;
+    for (let n = 0; n < blockSize; n++) {
+      for (let i = 0; i < output.length; i++) {
+        const modval = (waveshapes[shape](this.phase, skew) + dcoffset) * depth;
+        output[i][n] = modval;
+      }
+      this.incrementPhase(dt);
+    }
+
+    return true;
+  }
+}
+registerProcessor('lfo-processor', LFOProcessor);
+
 class CoarseProcessor extends AudioWorkletProcessor {
   static get parameterDescriptors() {
     return [{ name: 'coarse', defaultValue: 1 }];
@@ -106,6 +244,77 @@ class ShapeProcessor extends AudioWorkletProcessor {
 }
 registerProcessor('shape-processor', ShapeProcessor);
 
+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() {
+    return [
+      { name: 'frequency', defaultValue: 500 },
+      { name: 'q', defaultValue: 1 },
+      { name: 'drive', defaultValue: 0.69 },
+    ];
+  }
+
+  constructor() {
+    super();
+    this.started = false;
+    this.p0 = [0, 0];
+    this.p1 = [0, 0];
+    this.p2 = [0, 0];
+    this.p3 = [0, 0];
+    this.p32 = [0, 0];
+    this.p33 = [0, 0];
+    this.p34 = [0, 0];
+  }
+
+  process(inputs, outputs, parameters) {
+    const input = inputs[0];
+    const output = outputs[0];
+
+    const hasInput = !(input[0] === undefined);
+    if (this.started && !hasInput) {
+      return false;
+    }
+
+    this.started = hasInput;
+
+    const resonance = parameters.q[0];
+    const drive = clamp(Math.exp(parameters.drive[0]), 0.1, 2000);
+
+    let cutoff = parameters.frequency[0];
+    // eslint-disable-next-line no-undef
+    cutoff = (cutoff * 2 * _PI) / sampleRate;
+    cutoff = cutoff > 1 ? 1 : cutoff;
+
+    const k = Math.min(8, resonance * 0.4);
+    //               drive makeup  * resonance volume loss makeup
+    let makeupgain = (1 / drive) * Math.min(1.75, 1 + k);
+
+    for (let n = 0; n < blockSize; n++) {
+      for (let i = 0; i < input.length; i++) {
+        const out = this.p3[i] * 0.360891 + this.p32[i] * 0.41729 + this.p33[i] * 0.177896 + this.p34[i] * 0.0439725;
+
+        this.p34[i] = this.p33[i];
+        this.p33[i] = this.p32[i];
+        this.p32[i] = this.p3[i];
+
+        this.p0[i] += (fast_tanh(input[i][n] * drive - k * out) - fast_tanh(this.p0[i])) * cutoff;
+        this.p1[i] += (fast_tanh(this.p0[i]) - fast_tanh(this.p1[i])) * cutoff;
+        this.p2[i] += (fast_tanh(this.p1[i]) - fast_tanh(this.p2[i])) * cutoff;
+        this.p3[i] += (fast_tanh(this.p2[i]) - fast_tanh(this.p3[i])) * cutoff;
+
+        output[i][n] = out * makeupgain;
+      }
+    }
+    return true;
+  }
+}
+registerProcessor('ladder-processor', LadderProcessor);
+
 class DistortProcessor extends AudioWorkletProcessor {
   static get parameterDescriptors() {
     return [
@@ -142,34 +351,7 @@ class DistortProcessor extends AudioWorkletProcessor {
 }
 registerProcessor('distort-processor', DistortProcessor);
 
-// adjust waveshape to remove frequencies above nyquist to prevent aliasing
-// referenced from https://www.kvraudio.com/forum/viewtopic.php?t=375517
-const polyBlep = (phase, dt) => {
-  // 0 <= phase < 1
-  if (phase < dt) {
-    phase /= dt;
-    // 2 * (phase - phase^2/2 - 0.5)
-    return phase + phase - phase * phase - 1;
-  }
-
-  // -1 < phase < 0
-  else if (phase > 1 - dt) {
-    phase = (phase - 1) / dt;
-    // 2 * (phase^2/2 + phase + 0.5)
-    return phase * phase + phase + phase + 1;
-  }
-
-  // 0 otherwise
-  else {
-    return 0;
-  }
-};
-
-const saw = (phase, dt) => {
-  const v = 2 * phase - 1;
-  return v - polyBlep(phase, dt);
-};
-
+// SUPERSAW
 function lerp(a, b, n) {
   return n * (b - a) + a;
 }
@@ -269,7 +451,7 @@ class SuperSawOscillatorProcessor extends AudioWorkletProcessor {
 
       for (let i = 0; i < output[0].length; i++) {
         this.phase[n] = this.phase[n] ?? Math.random();
-        const v = saw(this.phase[n], dt);
+        const v = waveshapes.sawblep(this.phase[n], dt);
 
         output[0][i] = output[0][i] + v * gainL;
         output[1][i] = output[1][i] + v * gainR;
@@ -286,3 +468,183 @@ class SuperSawOscillatorProcessor extends AudioWorkletProcessor {
 }
 
 registerProcessor('supersaw-oscillator', SuperSawOscillatorProcessor);
+
+// Phase Vocoder sourced from // sourced from https://github.com/olvb/phaze/tree/master?tab=readme-ov-file
+const BUFFERED_BLOCK_SIZE = 2048;
+
+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));
+  }
+  return win;
+}
+
+class PhaseVocoderProcessor extends OLAProcessor {
+  static get parameterDescriptors() {
+    return [
+      {
+        name: 'pitchFactor',
+        defaultValue: 1.0,
+      },
+    ];
+  }
+
+  constructor(options) {
+    options.processorOptions = {
+      blockSize: BUFFERED_BLOCK_SIZE,
+    };
+    super(options);
+
+    this.fftSize = this.blockSize;
+    this.timeCursor = 0;
+
+    this.hannWindow = genHannWindow(this.blockSize);
+    // prepare FFT and pre-allocate buffers
+    this.fft = new FFT(this.fftSize);
+    this.freqComplexBuffer = this.fft.createComplexArray();
+    this.freqComplexBufferShifted = this.fft.createComplexArray();
+    this.timeComplexBuffer = this.fft.createComplexArray();
+    this.magnitudes = new Float32Array(this.fftSize / 2 + 1);
+    this.peakIndexes = new Int32Array(this.magnitudes.length);
+    this.nbPeaks = 0;
+  }
+
+  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];
+
+        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;
+    }
+  }
+
+  /** Compute squared magnitudes for peak finding **/
+  computeMagnitudes() {
+    var i = 0,
+      j = 0;
+    while (i < this.magnitudes.length) {
+      let real = this.freqComplexBuffer[j];
+      let imag = this.freqComplexBuffer[j + 1];
+      // no need to sqrt for peak finding
+      this.magnitudes[i] = real ** 2 + imag ** 2;
+      i += 1;
+      j += 2;
+    }
+  }
+
+  /** Find peaks in spectrum magnitudes **/
+  findPeaks() {
+    this.nbPeaks = 0;
+    var i = 2;
+    let end = this.magnitudes.length - 2;
+
+    while (i < end) {
+      let mag = this.magnitudes[i];
+
+      if (this.magnitudes[i - 1] >= mag || this.magnitudes[i - 2] >= mag) {
+        i++;
+        continue;
+      }
+      if (this.magnitudes[i + 1] >= mag || this.magnitudes[i + 2] >= mag) {
+        i++;
+        continue;
+      }
+
+      this.peakIndexes[this.nbPeaks] = i;
+      this.nbPeaks++;
+      i += 2;
+    }
+  }
+
+  /** Shift peaks and regions of influence by pitchFactor into new specturm */
+  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);
+
+      if (peakIndexShifted > this.magnitudes.length) {
+        break;
+      }
+
+      // find region of influence
+      var startIndex = 0;
+      var endIndex = this.fftSize;
+      if (i > 0) {
+        let peakIndexBefore = this.peakIndexes[i - 1];
+        startIndex = peakIndex - Math.floor((peakIndex - peakIndexBefore) / 2);
+      }
+      if (i < this.nbPeaks - 1) {
+        let peakIndexAfter = this.peakIndexes[i + 1];
+        endIndex = peakIndex + Math.ceil((peakIndexAfter - 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;
+
+        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);
+
+        let indexReal = binIndex * 2;
+        let indexImag = indexReal + 1;
+        let valueReal = this.freqComplexBuffer[indexReal];
+        let valueImag = this.freqComplexBuffer[indexImag];
+
+        let valueShiftedReal = valueReal * phaseShiftReal - valueImag * phaseShiftImag;
+        let valueShiftedImag = valueReal * phaseShiftImag + valueImag * phaseShiftReal;
+
+        let indexShiftedReal = binIndexShifted * 2;
+        let indexShiftedImag = indexShiftedReal + 1;
+        this.freqComplexBufferShifted[indexShiftedReal] += valueShiftedReal;
+        this.freqComplexBufferShifted[indexShiftedImag] += valueShiftedImag;
+      }
+    }
+  }
+}
+
+registerProcessor('phase-vocoder-processor', PhaseVocoderProcessor);
diff --git a/packages/tidal/package.json b/packages/tidal/package.json
new file mode 100644
index 00000000..051c6143
--- /dev/null
+++ b/packages/tidal/package.json
@@ -0,0 +1,28 @@
+{
+  "name": "@strudel/tidal",
+  "version": "0.1.0",
+  "description": "Experimental Tidal Code interpreter",
+  "module": "tidal.mjs",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/felixroos/hs2js.git"
+  },
+  "keywords": [
+    "haskell",
+    "javascript"
+  ],
+  "author": "Felix Roos ",
+  "license": "AGPL-3.0-or-later",
+  "bugs": {
+    "url": "https://github.com/tidalcycles/strudel/issues"
+  },
+  "homepage": "https://github.com/tidalcycles/strudel/tree/main/packages/hs2js",
+  "dependencies": {
+    "@strudel/core": "workspace:*",
+    "@strudel/mini": "workspace:*",
+    "hs2js": "workspace:*"
+  },
+  "devDependencies": {
+    "vite": "^5.0.10"
+  }
+}
diff --git a/packages/tidal/tidal.mjs b/packages/tidal/tidal.mjs
new file mode 100644
index 00000000..576d7814
--- /dev/null
+++ b/packages/tidal/tidal.mjs
@@ -0,0 +1,73 @@
+import { reify } from '@strudel/core';
+import { m } from '@strudel/mini';
+import { loadParser, evaluate } from 'hs2js';
+
+function getInfixOperators() {
+  let operators = {
+    '>': 'set',
+    '#': 'set',
+    '+': 'add',
+    '-': 'sub',
+    '*': 'mul',
+    '/': 'div',
+  };
+  let alignments = {
+    in: (s) => '|' + s,
+    out: (s) => s + '|',
+    mix: (s) => '|' + s + '|',
+  };
+  let ops = {};
+  Object.entries(operators).forEach(([o, name]) => {
+    // operator without alignment
+    ops[o] = (l, r) => reify(l)[name](reify(r));
+    Object.entries(alignments).forEach(([a, getSymbol]) => {
+      // get symbol with alignment
+      let symbol = getSymbol(o);
+      ops[symbol] = (l, r) => reify(l)[name][a](reify(r));
+    });
+  });
+  ops['~>'] = (l, r) => reify(l).late(reify(r));
+  ops['<~'] = (l, r) => reify(l).early(reify(r));
+  ops['<$>'] = (l, r) => reify(r).fmap(l).outerJoin(); // is this right?
+  return ops;
+}
+const ops = getInfixOperators();
+
+export async function initTidal() {
+  // TODO: implement this in regular land
+  window.d1 = (pat) => pat.p('d1');
+  window.d2 = (pat) => pat.p('d2');
+  window.d3 = (pat) => pat.p('d3');
+  window.d4 = (pat) => pat.p('d4');
+  window.d5 = (pat) => pat.p('d5');
+  window.d6 = (pat) => pat.p('d6');
+  window.d7 = (pat) => pat.p('d7');
+  window.d8 = (pat) => pat.p('d8');
+  window.d9 = (pat) => pat.p('d9');
+  return loadParser();
+}
+
+// offset is expected to be passed in from transpiler
+/* 
+1. acorn parses JS to find location of tidal call
+2. haskell-tree-sitter calls "string" function with node (including location)
+3. m function sets locations for individual mini notation atom
+
+so the location for a mini notation atom is:
+
+js offset + hs offset + atom offset
+*/
+export function tidal(code, offset = 0) {
+  if (Array.isArray(code)) {
+    code = code.join('');
+  }
+  return evaluate(code, window, {
+    ...ops,
+    string: (node) => {
+      // parses strings as mini notation and passes location
+      const str = node.text.slice(1, -1);
+      const col = node.startIndex + offset;
+      return m(str, col);
+    },
+  });
+}
diff --git a/packages/tonal/package.json b/packages/tonal/package.json
index e4418228..dba7f804 100644
--- a/packages/tonal/package.json
+++ b/packages/tonal/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@strudel/tonal",
-  "version": "1.0.1",
+  "version": "1.1.0",
   "description": "Tonal functions for strudel",
   "main": "index.mjs",
   "publishConfig": {
diff --git a/packages/transpiler/package.json b/packages/transpiler/package.json
index 12038fc4..d216716d 100644
--- a/packages/transpiler/package.json
+++ b/packages/transpiler/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@strudel/transpiler",
-  "version": "1.0.1",
+  "version": "1.1.0",
   "description": "Transpiler for strudel user code. Converts syntactically correct but semantically meaningless JS into evaluatable strudel code.",
   "main": "index.mjs",
   "type": "module",
diff --git a/packages/transpiler/transpiler.mjs b/packages/transpiler/transpiler.mjs
index 95156664..2e566305 100644
--- a/packages/transpiler/transpiler.mjs
+++ b/packages/transpiler/transpiler.mjs
@@ -26,6 +26,16 @@ export function transpiler(input, options = {}) {
 
   walk(ast, {
     enter(node, parent /* , prop, index */) {
+      if (isTidalTeplateLiteral(node)) {
+        const raw = node.quasi.quasis[0].value.raw;
+        const offset = node.quasi.start + 1;
+        if (emitMiniLocations) {
+          const stringLocs = collectHaskellMiniLocations(raw, offset);
+          miniLocations = miniLocations.concat(stringLocs);
+        }
+        this.skip();
+        return this.replace(tidalWithLocation(raw, offset));
+      }
       if (isBackTickString(node, parent)) {
         const { quasis } = node;
         const { raw } = quasis[0].value;
@@ -59,6 +69,7 @@ export function transpiler(input, options = {}) {
           to: node.end,
           index,
           type,
+          id: options.id,
         };
         emitWidgets && widgets.push(widgetConfig);
         return this.replace(widgetWithLocation(node, widgetConfig));
@@ -152,7 +163,7 @@ export function getWidgetID(widgetConfig) {
   // that means, if we use the index index of line position as id, less garbage is generated
   // return `widget_${widgetConfig.to}`; // more gargabe
   //return `widget_${widgetConfig.index}_${widgetConfig.to}`; // also more garbage
-  return `widget_${widgetConfig.type}_${widgetConfig.index}`; // less garbage
+  return `${widgetConfig.id || ''}_widget_${widgetConfig.type}_${widgetConfig.index}`; // less garbage
 }
 
 function widgetWithLocation(node, widgetConfig) {
@@ -207,3 +218,47 @@ function labelToP(node) {
     },
   };
 }
+
+// tidal highlighting
+// this feels kind of stupid, when we also know the location inside the string op (tidal.mjs)
+// but maybe it's the only way
+
+function isTidalTeplateLiteral(node) {
+  return node.type === 'TaggedTemplateExpression' && node.tag.name === 'tidal';
+}
+
+function collectHaskellMiniLocations(haskellCode, offset) {
+  return haskellCode
+    .split('')
+    .reduce((acc, char, i) => {
+      if (char !== '"') {
+        return acc;
+      }
+      if (!acc.length || acc[acc.length - 1].length > 1) {
+        acc.push([i + 1]);
+      } else {
+        acc[acc.length - 1].push(i);
+      }
+      return acc;
+    }, [])
+    .map(([start, end]) => {
+      const miniString = haskellCode.slice(start, end);
+      return getLeafLocations(`"${miniString}"`, offset + start - 1);
+    })
+    .flat();
+}
+
+function tidalWithLocation(value, offset) {
+  return {
+    type: 'CallExpression',
+    callee: {
+      type: 'Identifier',
+      name: 'tidal',
+    },
+    arguments: [
+      { type: 'Literal', value },
+      { type: 'Literal', value: offset },
+    ],
+    optional: false,
+  };
+}
diff --git a/packages/web/README.md b/packages/web/README.md
index 8b567729..659c8271 100644
--- a/packages/web/README.md
+++ b/packages/web/README.md
@@ -72,7 +72,13 @@ document.getElementById('play').addEventListener('stop',
 There is a tiny difference between the [Strudel REPL](https://strudel.cc/) and `@strudel/web`.
 In the REPL you can use 'single quotes' for regular JS strings and "double quotes" for mini notation patterns.
 In `@strudel/web`, it does not matter which types of quotes you're using.
-There will probably be an escapte hatch for that in the future.
+
+This difference means that you cannot call pattern methods on raw strings, for example `"1 2 3".slow(2)`.
+To make it work you can either:
+
+1. Use the `evaluate` function, which behaves exactly like the Strudel REPL, interpreting double quoted strings as mini notation.
+2. wrap the string with `m`: `m("1 2 3").slow(2)`
+3. wrap the string in a control function: `n("1 2 3").slow(2)` depending on your context.
 
 ## More Examples
 
diff --git a/packages/web/package.json b/packages/web/package.json
index d70e84c8..17dd49cb 100644
--- a/packages/web/package.json
+++ b/packages/web/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@strudel/web",
-  "version": "1.0.3",
+  "version": "1.1.0",
   "description": "Easy to setup, opiniated bundle of Strudel for the browser.",
   "module": "web.mjs",
   "publishConfig": {
@@ -40,7 +40,7 @@
     "@strudel/webaudio": "workspace:*"
   },
   "devDependencies": {
-    "vite": "^5.0.10",
-    "@rollup/plugin-replace": "^5.0.5"
+    "@rollup/plugin-replace": "^5.0.5",
+    "vite": "^5.0.10"
   }
 }
diff --git a/packages/web/vite.config.js b/packages/web/vite.config.js
index bd14f5a9..99b93956 100644
--- a/packages/web/vite.config.js
+++ b/packages/web/vite.config.js
@@ -5,6 +5,7 @@ import replace from '@rollup/plugin-replace';
 
 // https://vitejs.dev/config/
 export default defineConfig({
+  base: './',
   plugins: [],
   build: {
     lib: {
diff --git a/packages/web/web.mjs b/packages/web/web.mjs
index 660acf26..2e2df84d 100644
--- a/packages/web/web.mjs
+++ b/packages/web/web.mjs
@@ -5,10 +5,10 @@ export * from '@strudel/transpiler';
 export * from '@strudel/mini';
 export * from '@strudel/tonal';
 export * from '@strudel/webaudio';
-import { Pattern, evalScope } from '@strudel/core';
-import { initAudioOnFirstClick, registerSynthSounds, webaudioScheduler } from '@strudel/webaudio';
+import { Pattern, evalScope, setTime } from '@strudel/core';
+import { initAudioOnFirstClick, registerSynthSounds, webaudioRepl } from '@strudel/webaudio';
 // import { registerSoundfonts } from '@strudel/soundfonts';
-import { evaluate as _evaluate } from '@strudel/transpiler';
+import { evaluate as _evaluate, transpiler } from '@strudel/transpiler';
 import { miniAllStrings } from '@strudel/mini';
 
 // init logic
@@ -27,39 +27,40 @@ export async function defaultPrebake() {
 // when this function finishes, everything is initialized
 let initDone;
 
-let scheduler;
+let repl;
 export function initStrudel(options = {}) {
   initAudioOnFirstClick();
-  miniAllStrings();
-  const { prebake, ...schedulerOptions } = options;
-
+  options.miniAllStrings !== false && miniAllStrings();
+  const { prebake, ...replOptions } = options;
+  repl = webaudioRepl({ ...replOptions, transpiler });
   initDone = (async () => {
     await defaultPrebake();
     await prebake?.();
+    return repl;
   })();
-  scheduler = webaudioScheduler(schedulerOptions);
+  setTime(() => repl.scheduler.now());
+  return initDone;
 }
 
 window.initStrudel = initStrudel;
 
 // this method will play the pattern on the default scheduler
 Pattern.prototype.play = function () {
-  if (!scheduler) {
-    throw new Error('.play: no scheduler found. Have you called init?');
+  if (!repl) {
+    throw new Error('.play: no repl found. Have you called initStrudel?');
   }
   initDone.then(() => {
-    scheduler.setPattern(this, true);
+    repl.setPattern(this, true);
   });
   return this;
 };
 
 // stop playback
 export function hush() {
-  scheduler.stop();
+  repl.stop();
 }
 
 // evaluate and play the given code using the transpiler
 export async function evaluate(code, autoplay = true) {
-  const { pattern } = await _evaluate(code);
-  autoplay && pattern.play();
+  return repl.evaluate(code, autoplay);
 }
diff --git a/packages/webaudio/package.json b/packages/webaudio/package.json
index f9cd7cc7..019768c1 100644
--- a/packages/webaudio/package.json
+++ b/packages/webaudio/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@strudel/webaudio",
-  "version": "1.0.1",
+  "version": "1.1.0",
   "description": "Web Audio helpers for Strudel",
   "main": "index.mjs",
   "type": "module",
diff --git a/packages/webaudio/scope.mjs b/packages/webaudio/scope.mjs
index fbf4c8fc..e423b20f 100644
--- a/packages/webaudio/scope.mjs
+++ b/packages/webaudio/scope.mjs
@@ -130,7 +130,7 @@ Pattern.prototype.fscope = function (config = {}) {
  * @param {number} pos y-position relative to screen height. 0 = top, 1 = bottom of screen
  * @param {number} trigger amplitude value that is used to align the scope. defaults to 0.
  * @example
- * s("sawtooth").scope()
+ * s("sawtooth")._scope()
  */
 let latestColor = {};
 Pattern.prototype.tscope = function (config = {}) {
diff --git a/packages/webaudio/webaudio.mjs b/packages/webaudio/webaudio.mjs
index f82a436a..44a68348 100644
--- a/packages/webaudio/webaudio.mjs
+++ b/packages/webaudio/webaudio.mjs
@@ -6,7 +6,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 } from 'superdough';
-const { Pattern, logger } = strudel;
+const { Pattern, logger, repl } = strudel;
 
 setLogger(logger);
 
@@ -24,17 +24,13 @@ Pattern.prototype.webaudio = function () {
   return this.onTrigger(webaudioOutputTrigger);
 };
 
-export function webaudioScheduler(options = {}) {
+export function webaudioRepl(options = {}) {
   options = {
     getTime: () => getAudioContext().currentTime,
     defaultOutput: webaudioOutput,
     ...options,
   };
-  const { defaultOutput, getTime } = options;
-  return new strudel.Cyclist({
-    ...options,
-    onTrigger: strudel.getTrigger({ defaultOutput, getTime }),
-  });
+  return repl(options);
 }
 
 Pattern.prototype.dough = function () {
diff --git a/packages/xen/package.json b/packages/xen/package.json
index 8ee5d8a3..7101ea0c 100644
--- a/packages/xen/package.json
+++ b/packages/xen/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@strudel/xen",
-  "version": "1.0.1",
+  "version": "1.1.0",
   "description": "Xenharmonic API for strudel",
   "main": "index.mjs",
   "type": "module",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 74697ee6..a07618b8 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -78,6 +78,9 @@ importers:
       '@strudel/core':
         specifier: workspace:*
         version: link:../../packages/core
+      '@strudel/draw':
+        specifier: workspace:*
+        version: link:../../packages/draw
       '@strudel/mini':
         specifier: workspace:*
         version: link:../../packages/mini
@@ -140,6 +143,19 @@ importers:
         specifier: ^5.0.10
         version: 5.0.10
 
+  examples/tidal-repl:
+    dependencies:
+      '@strudel/web':
+        specifier: workspace:*
+        version: link:../../packages/web
+      hs2js:
+        specifier: workspace:*
+        version: link:../../packages/hs2js
+    devDependencies:
+      vite:
+        specifier: ^5.0.8
+        version: 5.2.2(@types/node@20.10.6)
+
   packages/codemirror:
     dependencies:
       '@codemirror/autocomplete':
@@ -251,6 +267,19 @@ importers:
 
   packages/embed: {}
 
+  packages/hs2js:
+    dependencies:
+      web-tree-sitter:
+        specifier: ^0.20.8
+        version: 0.20.8
+    devDependencies:
+      tree-sitter-haskell:
+        specifier: ^0.21.0
+        version: 0.21.0(tree-sitter@0.21.1)
+      vite:
+        specifier: ^5.0.10
+        version: 5.2.2(@types/node@20.10.6)
+
   packages/hydra:
     dependencies:
       '@strudel/core':
@@ -409,6 +438,22 @@ importers:
         specifier: ^5.0.10
         version: 5.0.10
 
+  packages/tidal:
+    dependencies:
+      '@strudel/core':
+        specifier: workspace:*
+        version: link:../core
+      '@strudel/mini':
+        specifier: workspace:*
+        version: link:../mini
+      hs2js:
+        specifier: workspace:*
+        version: link:../hs2js
+    devDependencies:
+      vite:
+        specifier: ^5.0.10
+        version: 5.2.2(@types/node@20.10.6)
+
   packages/tonal:
     dependencies:
       '@strudel/core':
@@ -587,6 +632,9 @@ importers:
       '@strudel/soundfonts':
         specifier: workspace:*
         version: link:../packages/soundfonts
+      '@strudel/tidal':
+        specifier: workspace:*
+        version: link:../packages/tidal
       '@strudel/tonal':
         specifier: workspace:*
         version: link:../packages/tonal
@@ -629,6 +677,9 @@ importers:
       date-fns:
         specifier: ^3.2.0
         version: 3.2.0
+      hs2js:
+        specifier: 0.0.8
+        version: 0.0.8
       nanoid:
         specifier: ^5.0.4
         version: 5.0.4
@@ -8474,6 +8525,12 @@ packages:
       lru-cache: 10.1.0
     dev: true
 
+  /hs2js@0.0.8:
+    resolution: {integrity: sha512-wFSenhY2MB1ACuwaJq0QyDk6yZiYwha/yOgAa2scsLvqEJTdHY2KXhsy8uZw+G2oVxQGyXs0OPf5gXN7HkP9mA==}
+    dependencies:
+      web-tree-sitter: 0.20.8
+    dev: false
+
   /html-escaper@3.0.3:
     resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==}
 
@@ -10637,6 +10694,11 @@ packages:
       semver: 7.5.4
     dev: true
 
+  /node-addon-api@8.0.0:
+    resolution: {integrity: sha512-ipO7rsHEBqa9STO5C5T10fj732ml+5kLN1cAG8/jdHd56ldQeGj3Q7+scUS+VHK/qy1zLEwC4wMK5+yM0btPvw==}
+    engines: {node: ^18 || ^20 || >= 21}
+    dev: true
+
   /node-domexception@1.0.0:
     resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
     engines: {node: '>=10.5.0'}
@@ -10680,6 +10742,11 @@ packages:
     engines: {node: '>= 0.6.0'}
     dev: false
 
+  /node-gyp-build@4.8.1:
+    resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==}
+    hasBin: true
+    dev: true
+
   /node-gyp@10.0.1:
     resolution: {integrity: sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==}
     engines: {node: ^16.14.0 || >=18.0.0}
@@ -13392,6 +13459,29 @@ packages:
       punycode: 2.3.1
     dev: true
 
+  /tree-sitter-haskell@0.21.0(tree-sitter@0.21.1):
+    resolution: {integrity: sha512-b2RLegPHuYPh7nJ3YKWgkWnFYxmYlQDE8TDJuNH+iuNuBcCMYyaA9JlJlMHfCvf7DmJNPtqqbO9Kh9NXEmbatQ==}
+    requiresBuild: true
+    peerDependencies:
+      tree-sitter: ^0.21.0
+      tree_sitter: '*'
+    peerDependenciesMeta:
+      tree_sitter:
+        optional: true
+    dependencies:
+      node-addon-api: 8.0.0
+      node-gyp-build: 4.8.1
+      tree-sitter: 0.21.1
+    dev: true
+
+  /tree-sitter@0.21.1:
+    resolution: {integrity: sha512-7dxoA6kYvtgWw80265MyqJlkRl4yawIjO7S5MigytjELkX43fV2WsAXzsNfO7sBpPPCF5Gp0+XzHk0DwLCq3xQ==}
+    requiresBuild: true
+    dependencies:
+      node-addon-api: 8.0.0
+      node-gyp-build: 4.8.1
+    dev: true
+
   /trim-lines@3.0.1:
     resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
 
@@ -14186,6 +14276,10 @@ packages:
     engines: {node: '>= 8'}
     dev: true
 
+  /web-tree-sitter@0.20.8:
+    resolution: {integrity: sha512-weOVgZ3aAARgdnb220GqYuh7+rZU0Ka9k9yfKtGAzEYMa6GgiCzW9JjQRJyCJakvibQW+dfjJdihjInKuuCAUQ==}
+    dev: false
+
   /webidl-conversions@3.0.1:
     resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
 
diff --git a/src-tauri/src/oscbridge.rs b/src-tauri/src/oscbridge.rs
index c8dcf03a..f6ac84a7 100644
--- a/src-tauri/src/oscbridge.rs
+++ b/src-tauri/src/oscbridge.rs
@@ -6,13 +6,13 @@ use std::net::UdpSocket;
 use serde::Deserialize;
 use std::sync::Arc;
 use std::thread::sleep;
-use std::time::Duration;
+use std::time::{Duration};
 use tokio::sync::{mpsc, Mutex};
 
 use crate::loggerbridge::Logger;
 pub struct OscMsg {
     pub msg_buf: Vec,
-    pub timestamp: u64,
+    pub timestamp: f64,
 }
 
 pub struct AsyncInputTransmit {
@@ -106,7 +106,7 @@ pub struct Param {
 #[derive(Deserialize)]
 pub struct MessageFromJS {
     params: Vec,
-    timestamp: u64,
+    timestamp: f64,
     target: String,
 }
 // Called from JS
@@ -127,9 +127,11 @@ pub async fn sendosc(
                 args.push(OscType::String(p.value));
             }
         }
+        // let start = SystemTime::now().duration_since(UNIX_EPOCH).unwrap();
 
+        let time_delay = Duration::from_secs_f64(m.timestamp);
         let duration_since_epoch =
-            Duration::from_millis(m.timestamp) + Duration::new(UNIX_OFFSET, 0);
+        time_delay + Duration::new(UNIX_OFFSET, 0);
 
         let seconds = u32::try_from(duration_since_epoch.as_secs())
             .map_err(|_| "bit conversion failed for osc message timetag")?;
diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap
index 30db05a2..da326b76 100644
--- a/test/__snapshots__/examples.test.mjs.snap
+++ b/test/__snapshots__/examples.test.mjs.snap
@@ -2197,6 +2197,75 @@ exports[`runs examples > example "djf" example index 0 1`] = `
 
 exports[`runs examples > example "drawLine" example index 0 1`] = `[]`;
 
+exports[`runs examples > example "drive" example index 0 1`] = `
+[
+  "[ 0/1 → 1/16 | note:36 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:0.5 ]",
+  "[ 1/16 → 1/8 | note:38 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:0.5 ]",
+  "[ 1/8 → 3/16 | note:38 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:0.5 ]",
+  "[ 3/16 → 1/4 | note:31 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:0.5 ]",
+  "[ 1/4 → 5/16 | note:33 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:0.5 ]",
+  "[ 5/16 → 3/8 | note:40 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:0.5 ]",
+  "[ 3/8 → 7/16 | note:41 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:0.5 ]",
+  "[ 7/16 → 1/2 | note:36 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:0.5 ]",
+  "[ 1/2 → 9/16 | note:38 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:0.5 ]",
+  "[ 9/16 → 5/8 | note:38 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:0.5 ]",
+  "[ 5/8 → 11/16 | note:31 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:0.5 ]",
+  "[ 11/16 → 3/4 | note:33 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:0.5 ]",
+  "[ 3/4 → 13/16 | note:40 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:0.5 ]",
+  "[ 13/16 → 7/8 | note:41 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:0.5 ]",
+  "[ 7/8 → 15/16 | note:36 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:0.5 ]",
+  "[ 15/16 → 1/1 | note:38 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:0.5 ]",
+  "[ 1/1 → 17/16 | note:38 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:4 ]",
+  "[ 17/16 → 9/8 | note:31 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:4 ]",
+  "[ 9/8 → 19/16 | note:33 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:4 ]",
+  "[ 19/16 → 5/4 | note:40 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:4 ]",
+  "[ 5/4 → 21/16 | note:41 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:4 ]",
+  "[ 21/16 → 11/8 | note:36 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:4 ]",
+  "[ 11/8 → 23/16 | note:38 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:4 ]",
+  "[ 23/16 → 3/2 | note:38 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:4 ]",
+  "[ 3/2 → 25/16 | note:31 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:4 ]",
+  "[ 25/16 → 13/8 | note:33 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:4 ]",
+  "[ 13/8 → 27/16 | note:40 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:4 ]",
+  "[ 27/16 → 7/4 | note:41 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:4 ]",
+  "[ 7/4 → 29/16 | note:36 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:4 ]",
+  "[ 29/16 → 15/8 | note:38 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:4 ]",
+  "[ 15/8 → 31/16 | note:38 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:4 ]",
+  "[ 31/16 → 2/1 | note:31 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:4 ]",
+  "[ 2/1 → 33/16 | note:33 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:0.5 ]",
+  "[ 33/16 → 17/8 | note:40 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:0.5 ]",
+  "[ 17/8 → 35/16 | note:41 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:0.5 ]",
+  "[ 35/16 → 9/4 | note:36 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:0.5 ]",
+  "[ 9/4 → 37/16 | note:38 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:0.5 ]",
+  "[ 37/16 → 19/8 | note:38 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:0.5 ]",
+  "[ 19/8 → 39/16 | note:31 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:0.5 ]",
+  "[ 39/16 → 5/2 | note:33 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:0.5 ]",
+  "[ 5/2 → 41/16 | note:40 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:0.5 ]",
+  "[ 41/16 → 21/8 | note:41 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:0.5 ]",
+  "[ 21/8 → 43/16 | note:36 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:0.5 ]",
+  "[ 43/16 → 11/4 | note:38 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:0.5 ]",
+  "[ 11/4 → 45/16 | note:38 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:0.5 ]",
+  "[ 45/16 → 23/8 | note:31 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:0.5 ]",
+  "[ 23/8 → 47/16 | note:33 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:0.5 ]",
+  "[ 47/16 → 3/1 | note:40 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:0.5 ]",
+  "[ 3/1 → 49/16 | note:41 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:4 ]",
+  "[ 49/16 → 25/8 | note:36 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:4 ]",
+  "[ 25/8 → 51/16 | note:38 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:4 ]",
+  "[ 51/16 → 13/4 | note:38 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:4 ]",
+  "[ 13/4 → 53/16 | note:31 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:4 ]",
+  "[ 53/16 → 27/8 | note:33 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:4 ]",
+  "[ 27/8 → 55/16 | note:40 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:4 ]",
+  "[ 55/16 → 7/2 | note:41 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:4 ]",
+  "[ 7/2 → 57/16 | note:36 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:4 ]",
+  "[ 57/16 → 29/8 | note:38 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:4 ]",
+  "[ 29/8 → 59/16 | note:38 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:4 ]",
+  "[ 59/16 → 15/4 | note:31 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:4 ]",
+  "[ 15/4 → 61/16 | note:33 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:4 ]",
+  "[ 61/16 → 31/8 | note:40 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:4 ]",
+  "[ 31/8 → 63/16 | note:41 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:4 ]",
+  "[ 63/16 → 4/1 | note:36 s:supersaw lpenv:8 cutoff:150 resonance:0.8 ftype:ladder drive:4 ]",
+]
+`;
+
 exports[`runs examples > example "dry" example index 0 1`] = `
 [
   "[ 0/1 → 1/8 | n:0 s:superpiano room:0.7 dry:0 ]",
@@ -2493,6 +2562,43 @@ exports[`runs examples > example "every" example index 0 1`] = `
 ]
 `;
 
+exports[`runs examples > example "fanchor" example index 0 1`] = `
+[
+  "[ 0/1 → 1/8 | note:f s:sawtooth cutoff:1000 lpenv:8 fanchor:0 ]",
+  "[ 1/8 → 1/4 | note:g s:sawtooth cutoff:1000 lpenv:8 fanchor:0 ]",
+  "[ 1/4 → 3/8 | note:g s:sawtooth cutoff:1000 lpenv:8 fanchor:0 ]",
+  "[ 3/8 → 1/2 | note:c s:sawtooth cutoff:1000 lpenv:8 fanchor:0 ]",
+  "[ 1/2 → 5/8 | note:d s:sawtooth cutoff:1000 lpenv:8 fanchor:0 ]",
+  "[ 5/8 → 3/4 | note:a s:sawtooth cutoff:1000 lpenv:8 fanchor:0 ]",
+  "[ 3/4 → 7/8 | note:a# s:sawtooth cutoff:1000 lpenv:8 fanchor:0 ]",
+  "[ 7/8 → 1/1 | note:f s:sawtooth cutoff:1000 lpenv:8 fanchor:0 ]",
+  "[ 1/1 → 9/8 | note:g s:sawtooth cutoff:1000 lpenv:8 fanchor:0.5 ]",
+  "[ 9/8 → 5/4 | note:g s:sawtooth cutoff:1000 lpenv:8 fanchor:0.5 ]",
+  "[ 5/4 → 11/8 | note:c s:sawtooth cutoff:1000 lpenv:8 fanchor:0.5 ]",
+  "[ 11/8 → 3/2 | note:d s:sawtooth cutoff:1000 lpenv:8 fanchor:0.5 ]",
+  "[ 3/2 → 13/8 | note:a s:sawtooth cutoff:1000 lpenv:8 fanchor:0.5 ]",
+  "[ 13/8 → 7/4 | note:a# s:sawtooth cutoff:1000 lpenv:8 fanchor:0.5 ]",
+  "[ 7/4 → 15/8 | note:f s:sawtooth cutoff:1000 lpenv:8 fanchor:0.5 ]",
+  "[ 15/8 → 2/1 | note:g s:sawtooth cutoff:1000 lpenv:8 fanchor:0.5 ]",
+  "[ 2/1 → 17/8 | note:g s:sawtooth cutoff:1000 lpenv:8 fanchor:1 ]",
+  "[ 17/8 → 9/4 | note:c s:sawtooth cutoff:1000 lpenv:8 fanchor:1 ]",
+  "[ 9/4 → 19/8 | note:d s:sawtooth cutoff:1000 lpenv:8 fanchor:1 ]",
+  "[ 19/8 → 5/2 | note:a s:sawtooth cutoff:1000 lpenv:8 fanchor:1 ]",
+  "[ 5/2 → 21/8 | note:a# s:sawtooth cutoff:1000 lpenv:8 fanchor:1 ]",
+  "[ 21/8 → 11/4 | note:f s:sawtooth cutoff:1000 lpenv:8 fanchor:1 ]",
+  "[ 11/4 → 23/8 | note:g s:sawtooth cutoff:1000 lpenv:8 fanchor:1 ]",
+  "[ 23/8 → 3/1 | note:g s:sawtooth cutoff:1000 lpenv:8 fanchor:1 ]",
+  "[ 3/1 → 25/8 | note:c s:sawtooth cutoff:1000 lpenv:8 fanchor:0 ]",
+  "[ 25/8 → 13/4 | note:d s:sawtooth cutoff:1000 lpenv:8 fanchor:0 ]",
+  "[ 13/4 → 27/8 | note:a s:sawtooth cutoff:1000 lpenv:8 fanchor:0 ]",
+  "[ 27/8 → 7/2 | note:a# s:sawtooth cutoff:1000 lpenv:8 fanchor:0 ]",
+  "[ 7/2 → 29/8 | note:f s:sawtooth cutoff:1000 lpenv:8 fanchor:0 ]",
+  "[ 29/8 → 15/4 | note:g s:sawtooth cutoff:1000 lpenv:8 fanchor:0 ]",
+  "[ 15/4 → 31/8 | note:g s:sawtooth cutoff:1000 lpenv:8 fanchor:0 ]",
+  "[ 31/8 → 4/1 | note:c s:sawtooth cutoff:1000 lpenv:8 fanchor:0 ]",
+]
+`;
+
 exports[`runs examples > example "fast" example index 0 1`] = `
 [
   "[ 0/1 → 1/8 | s:bd ]",
@@ -2611,175 +2717,175 @@ 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 analyze:1 ]",
-  "[ 1/6 → 1/3 | note:e fmi:0 analyze:1 ]",
-  "[ 1/3 → 1/2 | note:g fmi:0 analyze:1 ]",
-  "[ 1/2 → 2/3 | note:b fmi:0 analyze:1 ]",
-  "[ 2/3 → 5/6 | note:g fmi:0 analyze:1 ]",
-  "[ 5/6 → 1/1 | note:e fmi:0 analyze:1 ]",
-  "[ 1/1 → 7/6 | note:c fmi:1 analyze:1 ]",
-  "[ 7/6 → 4/3 | note:e fmi:1 analyze:1 ]",
-  "[ 4/3 → 3/2 | note:g fmi:1 analyze:1 ]",
-  "[ 3/2 → 5/3 | note:b fmi:1 analyze:1 ]",
-  "[ 5/3 → 11/6 | note:g fmi:1 analyze:1 ]",
-  "[ 11/6 → 2/1 | note:e fmi:1 analyze:1 ]",
-  "[ 2/1 → 13/6 | note:c fmi:2 analyze:1 ]",
-  "[ 13/6 → 7/3 | note:e fmi:2 analyze:1 ]",
-  "[ 7/3 → 5/2 | note:g fmi:2 analyze:1 ]",
-  "[ 5/2 → 8/3 | note:b fmi:2 analyze:1 ]",
-  "[ 8/3 → 17/6 | note:g fmi:2 analyze:1 ]",
-  "[ 17/6 → 3/1 | note:e fmi:2 analyze:1 ]",
-  "[ 3/1 → 19/6 | note:c fmi:8 analyze:1 ]",
-  "[ 19/6 → 10/3 | note:e fmi:8 analyze:1 ]",
-  "[ 10/3 → 7/2 | note:g fmi:8 analyze:1 ]",
-  "[ 7/2 → 11/3 | note:b fmi:8 analyze:1 ]",
-  "[ 11/3 → 23/6 | note:g fmi:8 analyze:1 ]",
-  "[ 23/6 → 4/1 | note:e fmi:8 analyze: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 analyze:1 ]",
-  "[ 1/6 → 1/3 | note:e fmi:4 fmattack:0 analyze:1 ]",
-  "[ 1/3 → 1/2 | note:g fmi:4 fmattack:0 analyze:1 ]",
-  "[ 1/2 → 2/3 | note:b fmi:4 fmattack:0 analyze:1 ]",
-  "[ 2/3 → 5/6 | note:g fmi:4 fmattack:0 analyze:1 ]",
-  "[ 5/6 → 1/1 | note:e fmi:4 fmattack:0 analyze:1 ]",
-  "[ 1/1 → 7/6 | note:c fmi:4 fmattack:0.05 analyze:1 ]",
-  "[ 7/6 → 4/3 | note:e fmi:4 fmattack:0.05 analyze:1 ]",
-  "[ 4/3 → 3/2 | note:g fmi:4 fmattack:0.05 analyze:1 ]",
-  "[ 3/2 → 5/3 | note:b fmi:4 fmattack:0.05 analyze:1 ]",
-  "[ 5/3 → 11/6 | note:g fmi:4 fmattack:0.05 analyze:1 ]",
-  "[ 11/6 → 2/1 | note:e fmi:4 fmattack:0.05 analyze:1 ]",
-  "[ 2/1 → 13/6 | note:c fmi:4 fmattack:0.1 analyze:1 ]",
-  "[ 13/6 → 7/3 | note:e fmi:4 fmattack:0.1 analyze:1 ]",
-  "[ 7/3 → 5/2 | note:g fmi:4 fmattack:0.1 analyze:1 ]",
-  "[ 5/2 → 8/3 | note:b fmi:4 fmattack:0.1 analyze:1 ]",
-  "[ 8/3 → 17/6 | note:g fmi:4 fmattack:0.1 analyze:1 ]",
-  "[ 17/6 → 3/1 | note:e fmi:4 fmattack:0.1 analyze:1 ]",
-  "[ 3/1 → 19/6 | note:c fmi:4 fmattack:0.2 analyze:1 ]",
-  "[ 19/6 → 10/3 | note:e fmi:4 fmattack:0.2 analyze:1 ]",
-  "[ 10/3 → 7/2 | note:g fmi:4 fmattack:0.2 analyze:1 ]",
-  "[ 7/2 → 11/3 | note:b fmi:4 fmattack:0.2 analyze:1 ]",
-  "[ 11/3 → 23/6 | note:g fmi:4 fmattack:0.2 analyze:1 ]",
-  "[ 23/6 → 4/1 | note:e fmi:4 fmattack:0.2 analyze:1 ]",
+  "[ 0/1 → 1/6 | note:c fmi:4 fmattack:0 ]",
+  "[ 1/6 → 1/3 | note:e fmi:4 fmattack:0 ]",
+  "[ 1/3 → 1/2 | note:g fmi:4 fmattack:0 ]",
+  "[ 1/2 → 2/3 | note:b fmi:4 fmattack:0 ]",
+  "[ 2/3 → 5/6 | note:g fmi:4 fmattack:0 ]",
+  "[ 5/6 → 1/1 | note:e fmi:4 fmattack:0 ]",
+  "[ 1/1 → 7/6 | note:c fmi:4 fmattack:0.05 ]",
+  "[ 7/6 → 4/3 | note:e fmi:4 fmattack:0.05 ]",
+  "[ 4/3 → 3/2 | note:g fmi:4 fmattack:0.05 ]",
+  "[ 3/2 → 5/3 | note:b fmi:4 fmattack:0.05 ]",
+  "[ 5/3 → 11/6 | note:g fmi:4 fmattack:0.05 ]",
+  "[ 11/6 → 2/1 | note:e fmi:4 fmattack:0.05 ]",
+  "[ 2/1 → 13/6 | note:c fmi:4 fmattack:0.1 ]",
+  "[ 13/6 → 7/3 | note:e fmi:4 fmattack:0.1 ]",
+  "[ 7/3 → 5/2 | note:g fmi:4 fmattack:0.1 ]",
+  "[ 5/2 → 8/3 | note:b fmi:4 fmattack:0.1 ]",
+  "[ 8/3 → 17/6 | note:g fmi:4 fmattack:0.1 ]",
+  "[ 17/6 → 3/1 | note:e fmi:4 fmattack:0.1 ]",
+  "[ 3/1 → 19/6 | note:c fmi:4 fmattack:0.2 ]",
+  "[ 19/6 → 10/3 | note:e fmi:4 fmattack:0.2 ]",
+  "[ 10/3 → 7/2 | note:g fmi:4 fmattack:0.2 ]",
+  "[ 7/2 → 11/3 | note:b fmi:4 fmattack:0.2 ]",
+  "[ 11/3 → 23/6 | note:g fmi:4 fmattack:0.2 ]",
+  "[ 23/6 → 4/1 | note:e fmi:4 fmattack:0.2 ]",
 ]
 `;
 
 exports[`runs examples > example "fmdecay" example index 0 1`] = `
 [
-  "[ 0/1 → 1/6 | note:c fmi:4 fmdecay:0.01 fmsustain:0.4 analyze:1 ]",
-  "[ 1/6 → 1/3 | note:e fmi:4 fmdecay:0.01 fmsustain:0.4 analyze:1 ]",
-  "[ 1/3 → 1/2 | note:g fmi:4 fmdecay:0.01 fmsustain:0.4 analyze:1 ]",
-  "[ 1/2 → 2/3 | note:b fmi:4 fmdecay:0.01 fmsustain:0.4 analyze:1 ]",
-  "[ 2/3 → 5/6 | note:g fmi:4 fmdecay:0.01 fmsustain:0.4 analyze:1 ]",
-  "[ 5/6 → 1/1 | note:e fmi:4 fmdecay:0.01 fmsustain:0.4 analyze:1 ]",
-  "[ 1/1 → 7/6 | note:c fmi:4 fmdecay:0.05 fmsustain:0.4 analyze:1 ]",
-  "[ 7/6 → 4/3 | note:e fmi:4 fmdecay:0.05 fmsustain:0.4 analyze:1 ]",
-  "[ 4/3 → 3/2 | note:g fmi:4 fmdecay:0.05 fmsustain:0.4 analyze:1 ]",
-  "[ 3/2 → 5/3 | note:b fmi:4 fmdecay:0.05 fmsustain:0.4 analyze:1 ]",
-  "[ 5/3 → 11/6 | note:g fmi:4 fmdecay:0.05 fmsustain:0.4 analyze:1 ]",
-  "[ 11/6 → 2/1 | note:e fmi:4 fmdecay:0.05 fmsustain:0.4 analyze:1 ]",
-  "[ 2/1 → 13/6 | note:c fmi:4 fmdecay:0.1 fmsustain:0.4 analyze:1 ]",
-  "[ 13/6 → 7/3 | note:e fmi:4 fmdecay:0.1 fmsustain:0.4 analyze:1 ]",
-  "[ 7/3 → 5/2 | note:g fmi:4 fmdecay:0.1 fmsustain:0.4 analyze:1 ]",
-  "[ 5/2 → 8/3 | note:b fmi:4 fmdecay:0.1 fmsustain:0.4 analyze:1 ]",
-  "[ 8/3 → 17/6 | note:g fmi:4 fmdecay:0.1 fmsustain:0.4 analyze:1 ]",
-  "[ 17/6 → 3/1 | note:e fmi:4 fmdecay:0.1 fmsustain:0.4 analyze:1 ]",
-  "[ 3/1 → 19/6 | note:c fmi:4 fmdecay:0.2 fmsustain:0.4 analyze:1 ]",
-  "[ 19/6 → 10/3 | note:e fmi:4 fmdecay:0.2 fmsustain:0.4 analyze:1 ]",
-  "[ 10/3 → 7/2 | note:g fmi:4 fmdecay:0.2 fmsustain:0.4 analyze:1 ]",
-  "[ 7/2 → 11/3 | note:b fmi:4 fmdecay:0.2 fmsustain:0.4 analyze:1 ]",
-  "[ 11/3 → 23/6 | note:g fmi:4 fmdecay:0.2 fmsustain:0.4 analyze:1 ]",
-  "[ 23/6 → 4/1 | note:e fmi:4 fmdecay:0.2 fmsustain:0.4 analyze:1 ]",
+  "[ 0/1 → 1/6 | note:c fmi:4 fmdecay:0.01 fmsustain:0.4 ]",
+  "[ 1/6 → 1/3 | note:e fmi:4 fmdecay:0.01 fmsustain:0.4 ]",
+  "[ 1/3 → 1/2 | note:g fmi:4 fmdecay:0.01 fmsustain:0.4 ]",
+  "[ 1/2 → 2/3 | note:b fmi:4 fmdecay:0.01 fmsustain:0.4 ]",
+  "[ 2/3 → 5/6 | note:g fmi:4 fmdecay:0.01 fmsustain:0.4 ]",
+  "[ 5/6 → 1/1 | note:e fmi:4 fmdecay:0.01 fmsustain:0.4 ]",
+  "[ 1/1 → 7/6 | note:c fmi:4 fmdecay:0.05 fmsustain:0.4 ]",
+  "[ 7/6 → 4/3 | note:e fmi:4 fmdecay:0.05 fmsustain:0.4 ]",
+  "[ 4/3 → 3/2 | note:g fmi:4 fmdecay:0.05 fmsustain:0.4 ]",
+  "[ 3/2 → 5/3 | note:b fmi:4 fmdecay:0.05 fmsustain:0.4 ]",
+  "[ 5/3 → 11/6 | note:g fmi:4 fmdecay:0.05 fmsustain:0.4 ]",
+  "[ 11/6 → 2/1 | note:e fmi:4 fmdecay:0.05 fmsustain:0.4 ]",
+  "[ 2/1 → 13/6 | note:c fmi:4 fmdecay:0.1 fmsustain:0.4 ]",
+  "[ 13/6 → 7/3 | note:e fmi:4 fmdecay:0.1 fmsustain:0.4 ]",
+  "[ 7/3 → 5/2 | note:g fmi:4 fmdecay:0.1 fmsustain:0.4 ]",
+  "[ 5/2 → 8/3 | note:b fmi:4 fmdecay:0.1 fmsustain:0.4 ]",
+  "[ 8/3 → 17/6 | note:g fmi:4 fmdecay:0.1 fmsustain:0.4 ]",
+  "[ 17/6 → 3/1 | note:e fmi:4 fmdecay:0.1 fmsustain:0.4 ]",
+  "[ 3/1 → 19/6 | note:c fmi:4 fmdecay:0.2 fmsustain:0.4 ]",
+  "[ 19/6 → 10/3 | note:e fmi:4 fmdecay:0.2 fmsustain:0.4 ]",
+  "[ 10/3 → 7/2 | note:g fmi:4 fmdecay:0.2 fmsustain:0.4 ]",
+  "[ 7/2 → 11/3 | note:b fmi:4 fmdecay:0.2 fmsustain:0.4 ]",
+  "[ 11/3 → 23/6 | note:g fmi:4 fmdecay:0.2 fmsustain:0.4 ]",
+  "[ 23/6 → 4/1 | note:e fmi:4 fmdecay:0.2 fmsustain:0.4 ]",
 ]
 `;
 
 exports[`runs examples > example "fmenv" example index 0 1`] = `
 [
-  "[ 0/1 → 1/6 | note:c fmi:4 fmdecay:0.2 fmsustain:0 fmenv:exp analyze:1 ]",
-  "[ 1/6 → 1/3 | note:e fmi:4 fmdecay:0.2 fmsustain:0 fmenv:exp analyze:1 ]",
-  "[ 1/3 → 1/2 | note:g fmi:4 fmdecay:0.2 fmsustain:0 fmenv:exp analyze:1 ]",
-  "[ 1/2 → 2/3 | note:b fmi:4 fmdecay:0.2 fmsustain:0 fmenv:exp analyze:1 ]",
-  "[ 2/3 → 5/6 | note:g fmi:4 fmdecay:0.2 fmsustain:0 fmenv:exp analyze:1 ]",
-  "[ 5/6 → 1/1 | note:e fmi:4 fmdecay:0.2 fmsustain:0 fmenv:exp analyze:1 ]",
-  "[ 1/1 → 7/6 | note:c fmi:4 fmdecay:0.2 fmsustain:0 fmenv:lin analyze:1 ]",
-  "[ 7/6 → 4/3 | note:e fmi:4 fmdecay:0.2 fmsustain:0 fmenv:lin analyze:1 ]",
-  "[ 4/3 → 3/2 | note:g fmi:4 fmdecay:0.2 fmsustain:0 fmenv:lin analyze:1 ]",
-  "[ 3/2 → 5/3 | note:b fmi:4 fmdecay:0.2 fmsustain:0 fmenv:lin analyze:1 ]",
-  "[ 5/3 → 11/6 | note:g fmi:4 fmdecay:0.2 fmsustain:0 fmenv:lin analyze:1 ]",
-  "[ 11/6 → 2/1 | note:e fmi:4 fmdecay:0.2 fmsustain:0 fmenv:lin analyze:1 ]",
-  "[ 2/1 → 13/6 | note:c fmi:4 fmdecay:0.2 fmsustain:0 fmenv:exp analyze:1 ]",
-  "[ 13/6 → 7/3 | note:e fmi:4 fmdecay:0.2 fmsustain:0 fmenv:exp analyze:1 ]",
-  "[ 7/3 → 5/2 | note:g fmi:4 fmdecay:0.2 fmsustain:0 fmenv:exp analyze:1 ]",
-  "[ 5/2 → 8/3 | note:b fmi:4 fmdecay:0.2 fmsustain:0 fmenv:exp analyze:1 ]",
-  "[ 8/3 → 17/6 | note:g fmi:4 fmdecay:0.2 fmsustain:0 fmenv:exp analyze:1 ]",
-  "[ 17/6 → 3/1 | note:e fmi:4 fmdecay:0.2 fmsustain:0 fmenv:exp analyze:1 ]",
-  "[ 3/1 → 19/6 | note:c fmi:4 fmdecay:0.2 fmsustain:0 fmenv:lin analyze:1 ]",
-  "[ 19/6 → 10/3 | note:e fmi:4 fmdecay:0.2 fmsustain:0 fmenv:lin analyze:1 ]",
-  "[ 10/3 → 7/2 | note:g fmi:4 fmdecay:0.2 fmsustain:0 fmenv:lin analyze:1 ]",
-  "[ 7/2 → 11/3 | note:b fmi:4 fmdecay:0.2 fmsustain:0 fmenv:lin analyze:1 ]",
-  "[ 11/3 → 23/6 | note:g fmi:4 fmdecay:0.2 fmsustain:0 fmenv:lin analyze:1 ]",
-  "[ 23/6 → 4/1 | note:e fmi:4 fmdecay:0.2 fmsustain:0 fmenv:lin analyze:1 ]",
+  "[ 0/1 → 1/6 | note:c fmi:4 fmdecay:0.2 fmsustain:0 fmenv:exp ]",
+  "[ 1/6 → 1/3 | note:e fmi:4 fmdecay:0.2 fmsustain:0 fmenv:exp ]",
+  "[ 1/3 → 1/2 | note:g fmi:4 fmdecay:0.2 fmsustain:0 fmenv:exp ]",
+  "[ 1/2 → 2/3 | note:b fmi:4 fmdecay:0.2 fmsustain:0 fmenv:exp ]",
+  "[ 2/3 → 5/6 | note:g fmi:4 fmdecay:0.2 fmsustain:0 fmenv:exp ]",
+  "[ 5/6 → 1/1 | note:e fmi:4 fmdecay:0.2 fmsustain:0 fmenv:exp ]",
+  "[ 1/1 → 7/6 | note:c fmi:4 fmdecay:0.2 fmsustain:0 fmenv:lin ]",
+  "[ 7/6 → 4/3 | note:e fmi:4 fmdecay:0.2 fmsustain:0 fmenv:lin ]",
+  "[ 4/3 → 3/2 | note:g fmi:4 fmdecay:0.2 fmsustain:0 fmenv:lin ]",
+  "[ 3/2 → 5/3 | note:b fmi:4 fmdecay:0.2 fmsustain:0 fmenv:lin ]",
+  "[ 5/3 → 11/6 | note:g fmi:4 fmdecay:0.2 fmsustain:0 fmenv:lin ]",
+  "[ 11/6 → 2/1 | note:e fmi:4 fmdecay:0.2 fmsustain:0 fmenv:lin ]",
+  "[ 2/1 → 13/6 | note:c fmi:4 fmdecay:0.2 fmsustain:0 fmenv:exp ]",
+  "[ 13/6 → 7/3 | note:e fmi:4 fmdecay:0.2 fmsustain:0 fmenv:exp ]",
+  "[ 7/3 → 5/2 | note:g fmi:4 fmdecay:0.2 fmsustain:0 fmenv:exp ]",
+  "[ 5/2 → 8/3 | note:b fmi:4 fmdecay:0.2 fmsustain:0 fmenv:exp ]",
+  "[ 8/3 → 17/6 | note:g fmi:4 fmdecay:0.2 fmsustain:0 fmenv:exp ]",
+  "[ 17/6 → 3/1 | note:e fmi:4 fmdecay:0.2 fmsustain:0 fmenv:exp ]",
+  "[ 3/1 → 19/6 | note:c fmi:4 fmdecay:0.2 fmsustain:0 fmenv:lin ]",
+  "[ 19/6 → 10/3 | note:e fmi:4 fmdecay:0.2 fmsustain:0 fmenv:lin ]",
+  "[ 10/3 → 7/2 | note:g fmi:4 fmdecay:0.2 fmsustain:0 fmenv:lin ]",
+  "[ 7/2 → 11/3 | note:b fmi:4 fmdecay:0.2 fmsustain:0 fmenv:lin ]",
+  "[ 11/3 → 23/6 | note:g fmi:4 fmdecay:0.2 fmsustain:0 fmenv:lin ]",
+  "[ 23/6 → 4/1 | note:e fmi:4 fmdecay:0.2 fmsustain:0 fmenv:lin ]",
 ]
 `;
 
 exports[`runs examples > example "fmh" example index 0 1`] = `
 [
-  "[ 0/1 → 1/6 | note:c fmi:4 fmh:1 analyze:1 ]",
-  "[ 1/6 → 1/3 | note:e fmi:4 fmh:1 analyze:1 ]",
-  "[ 1/3 → 1/2 | note:g fmi:4 fmh:1 analyze:1 ]",
-  "[ 1/2 → 2/3 | note:b fmi:4 fmh:1 analyze:1 ]",
-  "[ 2/3 → 5/6 | note:g fmi:4 fmh:1 analyze:1 ]",
-  "[ 5/6 → 1/1 | note:e fmi:4 fmh:1 analyze:1 ]",
-  "[ 1/1 → 7/6 | note:c fmi:4 fmh:2 analyze:1 ]",
-  "[ 7/6 → 4/3 | note:e fmi:4 fmh:2 analyze:1 ]",
-  "[ 4/3 → 3/2 | note:g fmi:4 fmh:2 analyze:1 ]",
-  "[ 3/2 → 5/3 | note:b fmi:4 fmh:2 analyze:1 ]",
-  "[ 5/3 → 11/6 | note:g fmi:4 fmh:2 analyze:1 ]",
-  "[ 11/6 → 2/1 | note:e fmi:4 fmh:2 analyze:1 ]",
-  "[ 2/1 → 13/6 | note:c fmi:4 fmh:1.5 analyze:1 ]",
-  "[ 13/6 → 7/3 | note:e fmi:4 fmh:1.5 analyze:1 ]",
-  "[ 7/3 → 5/2 | note:g fmi:4 fmh:1.5 analyze:1 ]",
-  "[ 5/2 → 8/3 | note:b fmi:4 fmh:1.5 analyze:1 ]",
-  "[ 8/3 → 17/6 | note:g fmi:4 fmh:1.5 analyze:1 ]",
-  "[ 17/6 → 3/1 | note:e fmi:4 fmh:1.5 analyze:1 ]",
-  "[ 3/1 → 19/6 | note:c fmi:4 fmh:1.61 analyze:1 ]",
-  "[ 19/6 → 10/3 | note:e fmi:4 fmh:1.61 analyze:1 ]",
-  "[ 10/3 → 7/2 | note:g fmi:4 fmh:1.61 analyze:1 ]",
-  "[ 7/2 → 11/3 | note:b fmi:4 fmh:1.61 analyze:1 ]",
-  "[ 11/3 → 23/6 | note:g fmi:4 fmh:1.61 analyze:1 ]",
-  "[ 23/6 → 4/1 | note:e fmi:4 fmh:1.61 analyze:1 ]",
+  "[ 0/1 → 1/6 | note:c fmi:4 fmh:1 ]",
+  "[ 1/6 → 1/3 | note:e fmi:4 fmh:1 ]",
+  "[ 1/3 → 1/2 | note:g fmi:4 fmh:1 ]",
+  "[ 1/2 → 2/3 | note:b fmi:4 fmh:1 ]",
+  "[ 2/3 → 5/6 | note:g fmi:4 fmh:1 ]",
+  "[ 5/6 → 1/1 | note:e fmi:4 fmh:1 ]",
+  "[ 1/1 → 7/6 | note:c fmi:4 fmh:2 ]",
+  "[ 7/6 → 4/3 | note:e fmi:4 fmh:2 ]",
+  "[ 4/3 → 3/2 | note:g fmi:4 fmh:2 ]",
+  "[ 3/2 → 5/3 | note:b fmi:4 fmh:2 ]",
+  "[ 5/3 → 11/6 | note:g fmi:4 fmh:2 ]",
+  "[ 11/6 → 2/1 | note:e fmi:4 fmh:2 ]",
+  "[ 2/1 → 13/6 | note:c fmi:4 fmh:1.5 ]",
+  "[ 13/6 → 7/3 | note:e fmi:4 fmh:1.5 ]",
+  "[ 7/3 → 5/2 | note:g fmi:4 fmh:1.5 ]",
+  "[ 5/2 → 8/3 | note:b fmi:4 fmh:1.5 ]",
+  "[ 8/3 → 17/6 | note:g fmi:4 fmh:1.5 ]",
+  "[ 17/6 → 3/1 | note:e fmi:4 fmh:1.5 ]",
+  "[ 3/1 → 19/6 | note:c fmi:4 fmh:1.61 ]",
+  "[ 19/6 → 10/3 | note:e fmi:4 fmh:1.61 ]",
+  "[ 10/3 → 7/2 | note:g fmi:4 fmh:1.61 ]",
+  "[ 7/2 → 11/3 | note:b fmi:4 fmh:1.61 ]",
+  "[ 11/3 → 23/6 | note:g fmi:4 fmh:1.61 ]",
+  "[ 23/6 → 4/1 | note:e fmi:4 fmh:1.61 ]",
 ]
 `;
 
 exports[`runs examples > example "fmsustain" example index 0 1`] = `
 [
-  "[ 0/1 → 1/6 | note:c fmi:4 fmdecay:0.1 fmsustain:1 analyze:1 ]",
-  "[ 1/6 → 1/3 | note:e fmi:4 fmdecay:0.1 fmsustain:1 analyze:1 ]",
-  "[ 1/3 → 1/2 | note:g fmi:4 fmdecay:0.1 fmsustain:1 analyze:1 ]",
-  "[ 1/2 → 2/3 | note:b fmi:4 fmdecay:0.1 fmsustain:1 analyze:1 ]",
-  "[ 2/3 → 5/6 | note:g fmi:4 fmdecay:0.1 fmsustain:1 analyze:1 ]",
-  "[ 5/6 → 1/1 | note:e fmi:4 fmdecay:0.1 fmsustain:1 analyze:1 ]",
-  "[ 1/1 → 7/6 | note:c fmi:4 fmdecay:0.1 fmsustain:0.75 analyze:1 ]",
-  "[ 7/6 → 4/3 | note:e fmi:4 fmdecay:0.1 fmsustain:0.75 analyze:1 ]",
-  "[ 4/3 → 3/2 | note:g fmi:4 fmdecay:0.1 fmsustain:0.75 analyze:1 ]",
-  "[ 3/2 → 5/3 | note:b fmi:4 fmdecay:0.1 fmsustain:0.75 analyze:1 ]",
-  "[ 5/3 → 11/6 | note:g fmi:4 fmdecay:0.1 fmsustain:0.75 analyze:1 ]",
-  "[ 11/6 → 2/1 | note:e fmi:4 fmdecay:0.1 fmsustain:0.75 analyze:1 ]",
-  "[ 2/1 → 13/6 | note:c fmi:4 fmdecay:0.1 fmsustain:0.5 analyze:1 ]",
-  "[ 13/6 → 7/3 | note:e fmi:4 fmdecay:0.1 fmsustain:0.5 analyze:1 ]",
-  "[ 7/3 → 5/2 | note:g fmi:4 fmdecay:0.1 fmsustain:0.5 analyze:1 ]",
-  "[ 5/2 → 8/3 | note:b fmi:4 fmdecay:0.1 fmsustain:0.5 analyze:1 ]",
-  "[ 8/3 → 17/6 | note:g fmi:4 fmdecay:0.1 fmsustain:0.5 analyze:1 ]",
-  "[ 17/6 → 3/1 | note:e fmi:4 fmdecay:0.1 fmsustain:0.5 analyze:1 ]",
-  "[ 3/1 → 19/6 | note:c fmi:4 fmdecay:0.1 fmsustain:0 analyze:1 ]",
-  "[ 19/6 → 10/3 | note:e fmi:4 fmdecay:0.1 fmsustain:0 analyze:1 ]",
-  "[ 10/3 → 7/2 | note:g fmi:4 fmdecay:0.1 fmsustain:0 analyze:1 ]",
-  "[ 7/2 → 11/3 | note:b fmi:4 fmdecay:0.1 fmsustain:0 analyze:1 ]",
-  "[ 11/3 → 23/6 | note:g fmi:4 fmdecay:0.1 fmsustain:0 analyze:1 ]",
-  "[ 23/6 → 4/1 | note:e fmi:4 fmdecay:0.1 fmsustain:0 analyze:1 ]",
+  "[ 0/1 → 1/6 | note:c fmi:4 fmdecay:0.1 fmsustain:1 ]",
+  "[ 1/6 → 1/3 | note:e fmi:4 fmdecay:0.1 fmsustain:1 ]",
+  "[ 1/3 → 1/2 | note:g fmi:4 fmdecay:0.1 fmsustain:1 ]",
+  "[ 1/2 → 2/3 | note:b fmi:4 fmdecay:0.1 fmsustain:1 ]",
+  "[ 2/3 → 5/6 | note:g fmi:4 fmdecay:0.1 fmsustain:1 ]",
+  "[ 5/6 → 1/1 | note:e fmi:4 fmdecay:0.1 fmsustain:1 ]",
+  "[ 1/1 → 7/6 | note:c fmi:4 fmdecay:0.1 fmsustain:0.75 ]",
+  "[ 7/6 → 4/3 | note:e fmi:4 fmdecay:0.1 fmsustain:0.75 ]",
+  "[ 4/3 → 3/2 | note:g fmi:4 fmdecay:0.1 fmsustain:0.75 ]",
+  "[ 3/2 → 5/3 | note:b fmi:4 fmdecay:0.1 fmsustain:0.75 ]",
+  "[ 5/3 → 11/6 | note:g fmi:4 fmdecay:0.1 fmsustain:0.75 ]",
+  "[ 11/6 → 2/1 | note:e fmi:4 fmdecay:0.1 fmsustain:0.75 ]",
+  "[ 2/1 → 13/6 | note:c fmi:4 fmdecay:0.1 fmsustain:0.5 ]",
+  "[ 13/6 → 7/3 | note:e fmi:4 fmdecay:0.1 fmsustain:0.5 ]",
+  "[ 7/3 → 5/2 | note:g fmi:4 fmdecay:0.1 fmsustain:0.5 ]",
+  "[ 5/2 → 8/3 | note:b fmi:4 fmdecay:0.1 fmsustain:0.5 ]",
+  "[ 8/3 → 17/6 | note:g fmi:4 fmdecay:0.1 fmsustain:0.5 ]",
+  "[ 17/6 → 3/1 | note:e fmi:4 fmdecay:0.1 fmsustain:0.5 ]",
+  "[ 3/1 → 19/6 | note:c fmi:4 fmdecay:0.1 fmsustain:0 ]",
+  "[ 19/6 → 10/3 | note:e fmi:4 fmdecay:0.1 fmsustain:0 ]",
+  "[ 10/3 → 7/2 | note:g fmi:4 fmdecay:0.1 fmsustain:0 ]",
+  "[ 7/2 → 11/3 | note:b fmi:4 fmdecay:0.1 fmsustain:0 ]",
+  "[ 11/3 → 23/6 | note:g fmi:4 fmdecay:0.1 fmsustain:0 ]",
+  "[ 23/6 → 4/1 | note:e fmi:4 fmdecay:0.1 fmsustain:0 ]",
 ]
 `;
 
@@ -2877,22 +2983,99 @@ exports[`runs examples > example "fscope" example index 0 1`] = `
 
 exports[`runs examples > example "ftype" example index 0 1`] = `
 [
-  "[ 0/1 → 1/4 | note:c2 s:sawtooth cutoff:500 bpenv:4 ftype:12db ]",
-  "[ 1/4 → 1/2 | note:e2 s:sawtooth cutoff:500 bpenv:4 ftype:12db ]",
-  "[ 1/2 → 3/4 | note:f2 s:sawtooth cutoff:500 bpenv:4 ftype:24db ]",
-  "[ 3/4 → 1/1 | note:g2 s:sawtooth cutoff:500 bpenv:4 ftype:24db ]",
-  "[ 1/1 → 5/4 | note:c2 s:sawtooth cutoff:500 bpenv:4 ftype:12db ]",
-  "[ 5/4 → 3/2 | note:e2 s:sawtooth cutoff:500 bpenv:4 ftype:12db ]",
-  "[ 3/2 → 7/4 | note:f2 s:sawtooth cutoff:500 bpenv:4 ftype:24db ]",
-  "[ 7/4 → 2/1 | note:g2 s:sawtooth cutoff:500 bpenv:4 ftype:24db ]",
-  "[ 2/1 → 9/4 | note:c2 s:sawtooth cutoff:500 bpenv:4 ftype:12db ]",
-  "[ 9/4 → 5/2 | note:e2 s:sawtooth cutoff:500 bpenv:4 ftype:12db ]",
-  "[ 5/2 → 11/4 | note:f2 s:sawtooth cutoff:500 bpenv:4 ftype:24db ]",
-  "[ 11/4 → 3/1 | note:g2 s:sawtooth cutoff:500 bpenv:4 ftype:24db ]",
-  "[ 3/1 → 13/4 | note:c2 s:sawtooth cutoff:500 bpenv:4 ftype:12db ]",
-  "[ 13/4 → 7/2 | note:e2 s:sawtooth cutoff:500 bpenv:4 ftype:12db ]",
-  "[ 7/2 → 15/4 | note:f2 s:sawtooth cutoff:500 bpenv:4 ftype:24db ]",
-  "[ 15/4 → 4/1 | note:g2 s:sawtooth cutoff:500 bpenv:4 ftype:24db ]",
+  "[ 0/1 → 1/8 | note:f s:sawtooth lpenv:4 cutoff:500 ftype:0 resonance:1 ]",
+  "[ 1/8 → 1/4 | note:g s:sawtooth lpenv:4 cutoff:500 ftype:0 resonance:1 ]",
+  "[ 1/4 → 3/8 | note:g s:sawtooth lpenv:4 cutoff:500 ftype:0 resonance:1 ]",
+  "[ 3/8 → 1/2 | note:c s:sawtooth lpenv:4 cutoff:500 ftype:0 resonance:1 ]",
+  "[ 1/2 → 5/8 | note:d s:sawtooth lpenv:4 cutoff:500 ftype:0 resonance:1 ]",
+  "[ 5/8 → 3/4 | note:a s:sawtooth lpenv:4 cutoff:500 ftype:0 resonance:1 ]",
+  "[ 3/4 → 7/8 | note:a# s:sawtooth lpenv:4 cutoff:500 ftype:0 resonance:1 ]",
+  "[ 7/8 → 1/1 | note:f s:sawtooth lpenv:4 cutoff:500 ftype:0 resonance:1 ]",
+  "[ 1/1 → 9/8 | note:g s:sawtooth lpenv:4 cutoff:500 ftype:1 resonance:1 ]",
+  "[ 9/8 → 5/4 | note:g s:sawtooth lpenv:4 cutoff:500 ftype:1 resonance:1 ]",
+  "[ 5/4 → 11/8 | note:c s:sawtooth lpenv:4 cutoff:500 ftype:1 resonance:1 ]",
+  "[ 11/8 → 3/2 | note:d s:sawtooth lpenv:4 cutoff:500 ftype:1 resonance:1 ]",
+  "[ 3/2 → 13/8 | note:a s:sawtooth lpenv:4 cutoff:500 ftype:1 resonance:1 ]",
+  "[ 13/8 → 7/4 | note:a# s:sawtooth lpenv:4 cutoff:500 ftype:1 resonance:1 ]",
+  "[ 7/4 → 15/8 | note:f s:sawtooth lpenv:4 cutoff:500 ftype:1 resonance:1 ]",
+  "[ 15/8 → 2/1 | note:g s:sawtooth lpenv:4 cutoff:500 ftype:1 resonance:1 ]",
+  "[ 2/1 → 17/8 | note:g s:sawtooth lpenv:4 cutoff:500 ftype:2 resonance:1 ]",
+  "[ 17/8 → 9/4 | note:c s:sawtooth lpenv:4 cutoff:500 ftype:2 resonance:1 ]",
+  "[ 9/4 → 19/8 | note:d s:sawtooth lpenv:4 cutoff:500 ftype:2 resonance:1 ]",
+  "[ 19/8 → 5/2 | note:a s:sawtooth lpenv:4 cutoff:500 ftype:2 resonance:1 ]",
+  "[ 5/2 → 21/8 | note:a# s:sawtooth lpenv:4 cutoff:500 ftype:2 resonance:1 ]",
+  "[ 21/8 → 11/4 | note:f s:sawtooth lpenv:4 cutoff:500 ftype:2 resonance:1 ]",
+  "[ 11/4 → 23/8 | note:g s:sawtooth lpenv:4 cutoff:500 ftype:2 resonance:1 ]",
+  "[ 23/8 → 3/1 | note:g s:sawtooth lpenv:4 cutoff:500 ftype:2 resonance:1 ]",
+  "[ 3/1 → 25/8 | note:c s:sawtooth lpenv:4 cutoff:500 ftype:0 resonance:1 ]",
+  "[ 25/8 → 13/4 | note:d s:sawtooth lpenv:4 cutoff:500 ftype:0 resonance:1 ]",
+  "[ 13/4 → 27/8 | note:a s:sawtooth lpenv:4 cutoff:500 ftype:0 resonance:1 ]",
+  "[ 27/8 → 7/2 | note:a# s:sawtooth lpenv:4 cutoff:500 ftype:0 resonance:1 ]",
+  "[ 7/2 → 29/8 | note:f s:sawtooth lpenv:4 cutoff:500 ftype:0 resonance:1 ]",
+  "[ 29/8 → 15/4 | note:g s:sawtooth lpenv:4 cutoff:500 ftype:0 resonance:1 ]",
+  "[ 15/4 → 31/8 | note:g s:sawtooth lpenv:4 cutoff:500 ftype:0 resonance:1 ]",
+  "[ 31/8 → 4/1 | note:c s:sawtooth lpenv:4 cutoff:500 ftype:0 resonance:1 ]",
+]
+`;
+
+exports[`runs examples > example "ftype" example index 1 1`] = `
+[
+  "[ 0/1 → 1/14 | note:c s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:ladder ]",
+  "[ 1/14 → 1/7 | note:f s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:ladder ]",
+  "[ 1/7 → 3/14 | note:g s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:ladder ]",
+  "[ 3/14 → 2/7 | note:g s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:ladder ]",
+  "[ 2/7 → 5/14 | note:a s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:ladder ]",
+  "[ 5/14 → 3/7 | note:c s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:ladder ]",
+  "[ 3/7 → 1/2 | note:d4 s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:ladder ]",
+  "[ 1/2 → 4/7 | note:c s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:ladder ]",
+  "[ 4/7 → 9/14 | note:f s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:ladder ]",
+  "[ 9/14 → 5/7 | note:g s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:ladder ]",
+  "[ 5/7 → 11/14 | note:g s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:ladder ]",
+  "[ 11/14 → 6/7 | note:a s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:ladder ]",
+  "[ 6/7 → 13/14 | note:c s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:ladder ]",
+  "[ 13/14 → 1/1 | note:d4 s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:ladder ]",
+  "[ 1/1 → 15/14 | note:c s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:12db ]",
+  "[ 15/14 → 8/7 | note:f s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:12db ]",
+  "[ 8/7 → 17/14 | note:g s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:12db ]",
+  "[ 17/14 → 9/7 | note:g s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:12db ]",
+  "[ 9/7 → 19/14 | note:a s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:12db ]",
+  "[ 19/14 → 10/7 | note:c s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:12db ]",
+  "[ 10/7 → 3/2 | note:d4 s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:12db ]",
+  "[ 3/2 → 11/7 | note:c s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:12db ]",
+  "[ 11/7 → 23/14 | note:f s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:12db ]",
+  "[ 23/14 → 12/7 | note:g s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:12db ]",
+  "[ 12/7 → 25/14 | note:g s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:12db ]",
+  "[ 25/14 → 13/7 | note:a s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:12db ]",
+  "[ 13/7 → 27/14 | note:c s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:12db ]",
+  "[ 27/14 → 2/1 | note:d4 s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:12db ]",
+  "[ 2/1 → 29/14 | note:c s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:24db ]",
+  "[ 29/14 → 15/7 | note:f s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:24db ]",
+  "[ 15/7 → 31/14 | note:g s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:24db ]",
+  "[ 31/14 → 16/7 | note:g s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:24db ]",
+  "[ 16/7 → 33/14 | note:a s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:24db ]",
+  "[ 33/14 → 17/7 | note:c s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:24db ]",
+  "[ 17/7 → 5/2 | note:d4 s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:24db ]",
+  "[ 5/2 → 18/7 | note:c s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:24db ]",
+  "[ 18/7 → 37/14 | note:f s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:24db ]",
+  "[ 37/14 → 19/7 | note:g s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:24db ]",
+  "[ 19/7 → 39/14 | note:g s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:24db ]",
+  "[ 39/14 → 20/7 | note:a s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:24db ]",
+  "[ 20/7 → 41/14 | note:c s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:24db ]",
+  "[ 41/14 → 3/1 | note:d4 s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:24db ]",
+  "[ 3/1 → 43/14 | note:c s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:ladder ]",
+  "[ 43/14 → 22/7 | note:f s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:ladder ]",
+  "[ 22/7 → 45/14 | note:g s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:ladder ]",
+  "[ 45/14 → 23/7 | note:g s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:ladder ]",
+  "[ 23/7 → 47/14 | note:a s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:ladder ]",
+  "[ 47/14 → 24/7 | note:c s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:ladder ]",
+  "[ 24/7 → 7/2 | note:d4 s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:ladder ]",
+  "[ 7/2 → 25/7 | note:c s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:ladder ]",
+  "[ 25/7 → 51/14 | note:f s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:ladder ]",
+  "[ 51/14 → 26/7 | note:g s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:ladder ]",
+  "[ 26/7 → 53/14 | note:g s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:ladder ]",
+  "[ 53/14 → 27/7 | note:a s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:ladder ]",
+  "[ 27/7 → 55/14 | note:c s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:ladder ]",
+  "[ 55/14 → 4/1 | note:d4 s:sawtooth cutoff:200 fanchor:0 lpenv:3 resonance:1 ftype:ladder ]",
 ]
 `;
 
@@ -3859,82 +4042,82 @@ exports[`runs examples > example "loopAtCps" example index 0 1`] = `
 
 exports[`runs examples > example "loopBegin" example index 0 1`] = `
 [
-  "[ 0/1 → 1/1 | s:space loop:1 loopBegin:0 analyze:1 ]",
-  "[ 1/1 → 2/1 | s:space loop:1 loopBegin:0.125 analyze:1 ]",
-  "[ 2/1 → 3/1 | s:space loop:1 loopBegin:0.25 analyze:1 ]",
-  "[ 3/1 → 4/1 | s:space loop:1 loopBegin:0 analyze:1 ]",
+  "[ 0/1 → 1/1 | s:space loop:1 loopBegin:0 ]",
+  "[ 1/1 → 2/1 | s:space loop:1 loopBegin:0.125 ]",
+  "[ 2/1 → 3/1 | s:space loop:1 loopBegin:0.25 ]",
+  "[ 3/1 → 4/1 | s:space loop:1 loopBegin:0 ]",
 ]
 `;
 
 exports[`runs examples > example "loopEnd" example index 0 1`] = `
 [
-  "[ 0/1 → 1/1 | s:space loop:1 loopEnd:1 analyze:1 ]",
-  "[ 1/1 → 2/1 | s:space loop:1 loopEnd:0.75 analyze:1 ]",
-  "[ 2/1 → 3/1 | s:space loop:1 loopEnd:0.5 analyze:1 ]",
-  "[ 3/1 → 4/1 | s:space loop:1 loopEnd:0.25 analyze:1 ]",
+  "[ 0/1 → 1/1 | s:space loop:1 loopEnd:1 ]",
+  "[ 1/1 → 2/1 | s:space loop:1 loopEnd:0.75 ]",
+  "[ 2/1 → 3/1 | s:space loop:1 loopEnd:0.5 ]",
+  "[ 3/1 → 4/1 | s:space loop:1 loopEnd:0.25 ]",
 ]
 `;
 
 exports[`runs examples > example "lpattack" example index 0 1`] = `
 [
-  "[ 0/1 → 1/4 | note:c2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]",
-  "[ 1/4 → 1/2 | note:e2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]",
-  "[ 1/2 → 3/4 | note:f2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]",
-  "[ 3/4 → 1/1 | note:g2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]",
-  "[ 1/1 → 5/4 | note:c2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]",
-  "[ 5/4 → 3/2 | note:e2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]",
-  "[ 3/2 → 7/4 | note:f2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]",
-  "[ 7/4 → 2/1 | note:g2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]",
-  "[ 2/1 → 9/4 | note:c2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]",
-  "[ 9/4 → 5/2 | note:e2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]",
-  "[ 5/2 → 11/4 | note:f2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]",
-  "[ 11/4 → 3/1 | note:g2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]",
-  "[ 3/1 → 13/4 | note:c2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]",
-  "[ 13/4 → 7/2 | note:e2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]",
-  "[ 7/2 → 15/4 | note:f2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]",
-  "[ 15/4 → 4/1 | note:g2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]",
+  "[ 0/1 → 1/4 | note:c2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]",
+  "[ 1/4 → 1/2 | note:e2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]",
+  "[ 1/2 → 3/4 | note:f2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]",
+  "[ 3/4 → 1/1 | note:g2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]",
+  "[ 1/1 → 5/4 | note:c2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]",
+  "[ 5/4 → 3/2 | note:e2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]",
+  "[ 3/2 → 7/4 | note:f2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]",
+  "[ 7/4 → 2/1 | note:g2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]",
+  "[ 2/1 → 9/4 | note:c2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]",
+  "[ 9/4 → 5/2 | note:e2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]",
+  "[ 5/2 → 11/4 | note:f2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]",
+  "[ 11/4 → 3/1 | note:g2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]",
+  "[ 3/1 → 13/4 | note:c2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]",
+  "[ 13/4 → 7/2 | note:e2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]",
+  "[ 7/2 → 15/4 | note:f2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]",
+  "[ 15/4 → 4/1 | note:g2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]",
 ]
 `;
 
 exports[`runs examples > example "lpdecay" example index 0 1`] = `
 [
-  "[ 0/1 → 1/4 | note:c2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0.2 lpenv:4 ]",
-  "[ 1/4 → 1/2 | note:e2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0.2 lpenv:4 ]",
-  "[ 1/2 → 3/4 | note:f2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0.2 lpenv:4 ]",
-  "[ 3/4 → 1/1 | note:g2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0.2 lpenv:4 ]",
-  "[ 1/1 → 5/4 | note:c2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0.2 lpenv:4 ]",
-  "[ 5/4 → 3/2 | note:e2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0.2 lpenv:4 ]",
-  "[ 3/2 → 7/4 | note:f2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0.2 lpenv:4 ]",
-  "[ 7/4 → 2/1 | note:g2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0.2 lpenv:4 ]",
-  "[ 2/1 → 9/4 | note:c2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0.2 lpenv:4 ]",
-  "[ 9/4 → 5/2 | note:e2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0.2 lpenv:4 ]",
-  "[ 5/2 → 11/4 | note:f2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0.2 lpenv:4 ]",
-  "[ 11/4 → 3/1 | note:g2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0.2 lpenv:4 ]",
-  "[ 3/1 → 13/4 | note:c2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0.2 lpenv:4 ]",
-  "[ 13/4 → 7/2 | note:e2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0.2 lpenv:4 ]",
-  "[ 7/2 → 15/4 | note:f2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0.2 lpenv:4 ]",
-  "[ 15/4 → 4/1 | note:g2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0.2 lpenv:4 ]",
+  "[ 0/1 → 1/4 | note:c2 s:sawtooth cutoff:300 lpdecay:0.5 lpenv:4 ]",
+  "[ 1/4 → 1/2 | note:e2 s:sawtooth cutoff:300 lpdecay:0.5 lpenv:4 ]",
+  "[ 1/2 → 3/4 | note:f2 s:sawtooth cutoff:300 lpdecay:0.5 lpenv:4 ]",
+  "[ 3/4 → 1/1 | note:g2 s:sawtooth cutoff:300 lpdecay:0.5 lpenv:4 ]",
+  "[ 1/1 → 5/4 | note:c2 s:sawtooth cutoff:300 lpdecay:0.5 lpenv:4 ]",
+  "[ 5/4 → 3/2 | note:e2 s:sawtooth cutoff:300 lpdecay:0.5 lpenv:4 ]",
+  "[ 3/2 → 7/4 | note:f2 s:sawtooth cutoff:300 lpdecay:0.5 lpenv:4 ]",
+  "[ 7/4 → 2/1 | note:g2 s:sawtooth cutoff:300 lpdecay:0.5 lpenv:4 ]",
+  "[ 2/1 → 9/4 | note:c2 s:sawtooth cutoff:300 lpdecay:0.5 lpenv:4 ]",
+  "[ 9/4 → 5/2 | note:e2 s:sawtooth cutoff:300 lpdecay:0.5 lpenv:4 ]",
+  "[ 5/2 → 11/4 | note:f2 s:sawtooth cutoff:300 lpdecay:0.5 lpenv:4 ]",
+  "[ 11/4 → 3/1 | note:g2 s:sawtooth cutoff:300 lpdecay:0.5 lpenv:4 ]",
+  "[ 3/1 → 13/4 | note:c2 s:sawtooth cutoff:300 lpdecay:0.5 lpenv:4 ]",
+  "[ 13/4 → 7/2 | note:e2 s:sawtooth cutoff:300 lpdecay:0.5 lpenv:4 ]",
+  "[ 7/2 → 15/4 | note:f2 s:sawtooth cutoff:300 lpdecay:0.5 lpenv:4 ]",
+  "[ 15/4 → 4/1 | note:g2 s:sawtooth cutoff:300 lpdecay:0.5 lpenv:4 ]",
 ]
 `;
 
 exports[`runs examples > example "lpenv" example index 0 1`] = `
 [
-  "[ 0/1 → 1/4 | note:c2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]",
-  "[ 1/4 → 1/2 | note:e2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]",
-  "[ 1/2 → 3/4 | note:f2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]",
-  "[ 3/4 → 1/1 | note:g2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]",
-  "[ 1/1 → 5/4 | note:c2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]",
-  "[ 5/4 → 3/2 | note:e2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]",
-  "[ 3/2 → 7/4 | note:f2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]",
-  "[ 7/4 → 2/1 | note:g2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]",
-  "[ 2/1 → 9/4 | note:c2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]",
-  "[ 9/4 → 5/2 | note:e2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]",
-  "[ 5/2 → 11/4 | note:f2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]",
-  "[ 11/4 → 3/1 | note:g2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]",
-  "[ 3/1 → 13/4 | note:c2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]",
-  "[ 13/4 → 7/2 | note:e2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]",
-  "[ 7/2 → 15/4 | note:f2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]",
-  "[ 15/4 → 4/1 | note:g2 s:sawtooth cutoff:500 lpattack:0.5 lpenv:4 ]",
+  "[ 0/1 → 1/4 | note:c2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]",
+  "[ 1/4 → 1/2 | note:e2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]",
+  "[ 1/2 → 3/4 | note:f2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]",
+  "[ 3/4 → 1/1 | note:g2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]",
+  "[ 1/1 → 5/4 | note:c2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]",
+  "[ 5/4 → 3/2 | note:e2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]",
+  "[ 3/2 → 7/4 | note:f2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]",
+  "[ 7/4 → 2/1 | note:g2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]",
+  "[ 2/1 → 9/4 | note:c2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]",
+  "[ 9/4 → 5/2 | note:e2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]",
+  "[ 5/2 → 11/4 | note:f2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]",
+  "[ 11/4 → 3/1 | note:g2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]",
+  "[ 3/1 → 13/4 | note:c2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]",
+  "[ 13/4 → 7/2 | note:e2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]",
+  "[ 7/2 → 15/4 | note:f2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]",
+  "[ 15/4 → 4/1 | note:g2 s:sawtooth cutoff:300 lpattack:0.5 lpenv:4 ]",
 ]
 `;
 
@@ -4107,43 +4290,43 @@ exports[`runs examples > example "lpq" example index 0 1`] = `
 
 exports[`runs examples > example "lprelease" example index 0 1`] = `
 [
-  "[ 0/1 → 1/4 | note:c2 s:sawtooth clip:0.5 cutoff:500 lpenv:4 lprelease:0.5 release:0.5 ]",
-  "[ 1/4 → 1/2 | note:e2 s:sawtooth clip:0.5 cutoff:500 lpenv:4 lprelease:0.5 release:0.5 ]",
-  "[ 1/2 → 3/4 | note:f2 s:sawtooth clip:0.5 cutoff:500 lpenv:4 lprelease:0.5 release:0.5 ]",
-  "[ 3/4 → 1/1 | note:g2 s:sawtooth clip:0.5 cutoff:500 lpenv:4 lprelease:0.5 release:0.5 ]",
-  "[ 1/1 → 5/4 | note:c2 s:sawtooth clip:0.5 cutoff:500 lpenv:4 lprelease:0.5 release:0.5 ]",
-  "[ 5/4 → 3/2 | note:e2 s:sawtooth clip:0.5 cutoff:500 lpenv:4 lprelease:0.5 release:0.5 ]",
-  "[ 3/2 → 7/4 | note:f2 s:sawtooth clip:0.5 cutoff:500 lpenv:4 lprelease:0.5 release:0.5 ]",
-  "[ 7/4 → 2/1 | note:g2 s:sawtooth clip:0.5 cutoff:500 lpenv:4 lprelease:0.5 release:0.5 ]",
-  "[ 2/1 → 9/4 | note:c2 s:sawtooth clip:0.5 cutoff:500 lpenv:4 lprelease:0.5 release:0.5 ]",
-  "[ 9/4 → 5/2 | note:e2 s:sawtooth clip:0.5 cutoff:500 lpenv:4 lprelease:0.5 release:0.5 ]",
-  "[ 5/2 → 11/4 | note:f2 s:sawtooth clip:0.5 cutoff:500 lpenv:4 lprelease:0.5 release:0.5 ]",
-  "[ 11/4 → 3/1 | note:g2 s:sawtooth clip:0.5 cutoff:500 lpenv:4 lprelease:0.5 release:0.5 ]",
-  "[ 3/1 → 13/4 | note:c2 s:sawtooth clip:0.5 cutoff:500 lpenv:4 lprelease:0.5 release:0.5 ]",
-  "[ 13/4 → 7/2 | note:e2 s:sawtooth clip:0.5 cutoff:500 lpenv:4 lprelease:0.5 release:0.5 ]",
-  "[ 7/2 → 15/4 | note:f2 s:sawtooth clip:0.5 cutoff:500 lpenv:4 lprelease:0.5 release:0.5 ]",
-  "[ 15/4 → 4/1 | note:g2 s:sawtooth clip:0.5 cutoff:500 lpenv:4 lprelease:0.5 release:0.5 ]",
+  "[ 0/1 → 1/4 | note:c2 s:sawtooth clip:0.5 cutoff:300 lpenv:4 lprelease:0.5 release:0.5 ]",
+  "[ 1/4 → 1/2 | note:e2 s:sawtooth clip:0.5 cutoff:300 lpenv:4 lprelease:0.5 release:0.5 ]",
+  "[ 1/2 → 3/4 | note:f2 s:sawtooth clip:0.5 cutoff:300 lpenv:4 lprelease:0.5 release:0.5 ]",
+  "[ 3/4 → 1/1 | note:g2 s:sawtooth clip:0.5 cutoff:300 lpenv:4 lprelease:0.5 release:0.5 ]",
+  "[ 1/1 → 5/4 | note:c2 s:sawtooth clip:0.5 cutoff:300 lpenv:4 lprelease:0.5 release:0.5 ]",
+  "[ 5/4 → 3/2 | note:e2 s:sawtooth clip:0.5 cutoff:300 lpenv:4 lprelease:0.5 release:0.5 ]",
+  "[ 3/2 → 7/4 | note:f2 s:sawtooth clip:0.5 cutoff:300 lpenv:4 lprelease:0.5 release:0.5 ]",
+  "[ 7/4 → 2/1 | note:g2 s:sawtooth clip:0.5 cutoff:300 lpenv:4 lprelease:0.5 release:0.5 ]",
+  "[ 2/1 → 9/4 | note:c2 s:sawtooth clip:0.5 cutoff:300 lpenv:4 lprelease:0.5 release:0.5 ]",
+  "[ 9/4 → 5/2 | note:e2 s:sawtooth clip:0.5 cutoff:300 lpenv:4 lprelease:0.5 release:0.5 ]",
+  "[ 5/2 → 11/4 | note:f2 s:sawtooth clip:0.5 cutoff:300 lpenv:4 lprelease:0.5 release:0.5 ]",
+  "[ 11/4 → 3/1 | note:g2 s:sawtooth clip:0.5 cutoff:300 lpenv:4 lprelease:0.5 release:0.5 ]",
+  "[ 3/1 → 13/4 | note:c2 s:sawtooth clip:0.5 cutoff:300 lpenv:4 lprelease:0.5 release:0.5 ]",
+  "[ 13/4 → 7/2 | note:e2 s:sawtooth clip:0.5 cutoff:300 lpenv:4 lprelease:0.5 release:0.5 ]",
+  "[ 7/2 → 15/4 | note:f2 s:sawtooth clip:0.5 cutoff:300 lpenv:4 lprelease:0.5 release:0.5 ]",
+  "[ 15/4 → 4/1 | note:g2 s:sawtooth clip:0.5 cutoff:300 lpenv:4 lprelease:0.5 release:0.5 ]",
 ]
 `;
 
 exports[`runs examples > example "lpsustain" example index 0 1`] = `
 [
-  "[ 0/1 → 1/4 | note:c2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0 lpenv:4 ]",
-  "[ 1/4 → 1/2 | note:e2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0 lpenv:4 ]",
-  "[ 1/2 → 3/4 | note:f2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0 lpenv:4 ]",
-  "[ 3/4 → 1/1 | note:g2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0 lpenv:4 ]",
-  "[ 1/1 → 5/4 | note:c2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0 lpenv:4 ]",
-  "[ 5/4 → 3/2 | note:e2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0 lpenv:4 ]",
-  "[ 3/2 → 7/4 | note:f2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0 lpenv:4 ]",
-  "[ 7/4 → 2/1 | note:g2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0 lpenv:4 ]",
-  "[ 2/1 → 9/4 | note:c2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0 lpenv:4 ]",
-  "[ 9/4 → 5/2 | note:e2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0 lpenv:4 ]",
-  "[ 5/2 → 11/4 | note:f2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0 lpenv:4 ]",
-  "[ 11/4 → 3/1 | note:g2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0 lpenv:4 ]",
-  "[ 3/1 → 13/4 | note:c2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0 lpenv:4 ]",
-  "[ 13/4 → 7/2 | note:e2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0 lpenv:4 ]",
-  "[ 7/2 → 15/4 | note:f2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0 lpenv:4 ]",
-  "[ 15/4 → 4/1 | note:g2 s:sawtooth cutoff:500 lpdecay:0.5 lpsustain:0 lpenv:4 ]",
+  "[ 0/1 → 1/4 | note:c2 s:sawtooth cutoff:300 lpdecay:0.5 lpsustain:0 lpenv:4 ]",
+  "[ 1/4 → 1/2 | note:e2 s:sawtooth cutoff:300 lpdecay:0.5 lpsustain:0 lpenv:4 ]",
+  "[ 1/2 → 3/4 | note:f2 s:sawtooth cutoff:300 lpdecay:0.5 lpsustain:0 lpenv:4 ]",
+  "[ 3/4 → 1/1 | note:g2 s:sawtooth cutoff:300 lpdecay:0.5 lpsustain:0 lpenv:4 ]",
+  "[ 1/1 → 5/4 | note:c2 s:sawtooth cutoff:300 lpdecay:0.5 lpsustain:0 lpenv:4 ]",
+  "[ 5/4 → 3/2 | note:e2 s:sawtooth cutoff:300 lpdecay:0.5 lpsustain:0 lpenv:4 ]",
+  "[ 3/2 → 7/4 | note:f2 s:sawtooth cutoff:300 lpdecay:0.5 lpsustain:0 lpenv:4 ]",
+  "[ 7/4 → 2/1 | note:g2 s:sawtooth cutoff:300 lpdecay:0.5 lpsustain:0 lpenv:4 ]",
+  "[ 2/1 → 9/4 | note:c2 s:sawtooth cutoff:300 lpdecay:0.5 lpsustain:0 lpenv:4 ]",
+  "[ 9/4 → 5/2 | note:e2 s:sawtooth cutoff:300 lpdecay:0.5 lpsustain:0 lpenv:4 ]",
+  "[ 5/2 → 11/4 | note:f2 s:sawtooth cutoff:300 lpdecay:0.5 lpsustain:0 lpenv:4 ]",
+  "[ 11/4 → 3/1 | note:g2 s:sawtooth cutoff:300 lpdecay:0.5 lpsustain:0 lpenv:4 ]",
+  "[ 3/1 → 13/4 | note:c2 s:sawtooth cutoff:300 lpdecay:0.5 lpsustain:0 lpenv:4 ]",
+  "[ 13/4 → 7/2 | note:e2 s:sawtooth cutoff:300 lpdecay:0.5 lpsustain:0 lpenv:4 ]",
+  "[ 7/2 → 15/4 | note:f2 s:sawtooth cutoff:300 lpdecay:0.5 lpsustain:0 lpenv:4 ]",
+  "[ 15/4 → 4/1 | note:g2 s:sawtooth cutoff:300 lpdecay:0.5 lpsustain:0 lpenv:4 ]",
 ]
 `;
 
@@ -4204,6 +4387,48 @@ exports[`runs examples > example "mask" example index 0 1`] = `
 ]
 `;
 
+exports[`runs examples > example "mousex" example index 0 1`] = `
+[
+  "[ 0/1 → 1/4 | note:C3 ]",
+  "[ 1/4 → 1/2 | note:C3 ]",
+  "[ 1/2 → 3/4 | note:C3 ]",
+  "[ 3/4 → 1/1 | note:C3 ]",
+  "[ 1/1 → 5/4 | note:C3 ]",
+  "[ 5/4 → 3/2 | note:C3 ]",
+  "[ 3/2 → 7/4 | note:C3 ]",
+  "[ 7/4 → 2/1 | note:C3 ]",
+  "[ 2/1 → 9/4 | note:C3 ]",
+  "[ 9/4 → 5/2 | note:C3 ]",
+  "[ 5/2 → 11/4 | note:C3 ]",
+  "[ 11/4 → 3/1 | note:C3 ]",
+  "[ 3/1 → 13/4 | note:C3 ]",
+  "[ 13/4 → 7/2 | note:C3 ]",
+  "[ 7/2 → 15/4 | note:C3 ]",
+  "[ 15/4 → 4/1 | note:C3 ]",
+]
+`;
+
+exports[`runs examples > example "mousey" example index 0 1`] = `
+[
+  "[ 0/1 → 1/4 | note:C3 ]",
+  "[ 1/4 → 1/2 | note:C3 ]",
+  "[ 1/2 → 3/4 | note:C3 ]",
+  "[ 3/4 → 1/1 | note:C3 ]",
+  "[ 1/1 → 5/4 | note:C3 ]",
+  "[ 5/4 → 3/2 | note:C3 ]",
+  "[ 3/2 → 7/4 | note:C3 ]",
+  "[ 7/4 → 2/1 | note:C3 ]",
+  "[ 2/1 → 9/4 | note:C3 ]",
+  "[ 9/4 → 5/2 | note:C3 ]",
+  "[ 5/2 → 11/4 | note:C3 ]",
+  "[ 11/4 → 3/1 | note:C3 ]",
+  "[ 3/1 → 13/4 | note:C3 ]",
+  "[ 13/4 → 7/2 | note:C3 ]",
+  "[ 7/2 → 15/4 | note:C3 ]",
+  "[ 15/4 → 4/1 | note:C3 ]",
+]
+`;
+
 exports[`runs examples > example "mul" example index 0 1`] = `
 [
   "[ 0/1 → 1/4 | freq:150 ]",
@@ -4712,182 +4937,182 @@ exports[`runs examples > example "perlin" example index 0 1`] = `
 
 exports[`runs examples > example "phaser" example index 0 1`] = `
 [
-  "[ 0/1 → 1/8 | note:D3 s:sawtooth release:0.5 phaser:1 ]",
-  "[ 1/8 → 1/4 | note:E3 s:sawtooth release:0.5 phaser:1 ]",
-  "[ 1/4 → 3/8 | note:F#3 s:sawtooth release:0.5 phaser:1 ]",
-  "[ 3/8 → 1/2 | note:A3 s:sawtooth release:0.5 phaser:1 ]",
-  "[ 1/2 → 5/8 | note:B3 s:sawtooth release:0.5 phaser:1 ]",
-  "[ 5/8 → 3/4 | note:D4 s:sawtooth release:0.5 phaser:1 ]",
-  "[ 3/4 → 7/8 | note:E4 s:sawtooth release:0.5 phaser:1 ]",
-  "[ 7/8 → 1/1 | note:F#4 s:sawtooth release:0.5 phaser:1 ]",
-  "[ 1/1 → 9/8 | note:D3 s:sawtooth release:0.5 phaser:2 ]",
-  "[ 9/8 → 5/4 | note:E3 s:sawtooth release:0.5 phaser:2 ]",
-  "[ 5/4 → 11/8 | note:F#3 s:sawtooth release:0.5 phaser:2 ]",
-  "[ 11/8 → 3/2 | note:A3 s:sawtooth release:0.5 phaser:2 ]",
-  "[ 3/2 → 13/8 | note:B3 s:sawtooth release:0.5 phaser:2 ]",
-  "[ 13/8 → 7/4 | note:D4 s:sawtooth release:0.5 phaser:2 ]",
-  "[ 7/4 → 15/8 | note:E4 s:sawtooth release:0.5 phaser:2 ]",
-  "[ 15/8 → 2/1 | note:F#4 s:sawtooth release:0.5 phaser:2 ]",
-  "[ 2/1 → 17/8 | note:D3 s:sawtooth release:0.5 phaser:4 ]",
-  "[ 17/8 → 9/4 | note:E3 s:sawtooth release:0.5 phaser:4 ]",
-  "[ 9/4 → 19/8 | note:F#3 s:sawtooth release:0.5 phaser:4 ]",
-  "[ 19/8 → 5/2 | note:A3 s:sawtooth release:0.5 phaser:4 ]",
-  "[ 5/2 → 21/8 | note:B3 s:sawtooth release:0.5 phaser:4 ]",
-  "[ 21/8 → 11/4 | note:D4 s:sawtooth release:0.5 phaser:4 ]",
-  "[ 11/4 → 23/8 | note:E4 s:sawtooth release:0.5 phaser:4 ]",
-  "[ 23/8 → 3/1 | note:F#4 s:sawtooth release:0.5 phaser:4 ]",
-  "[ 3/1 → 25/8 | note:D3 s:sawtooth release:0.5 phaser:8 ]",
-  "[ 25/8 → 13/4 | note:E3 s:sawtooth release:0.5 phaser:8 ]",
-  "[ 13/4 → 27/8 | note:F#3 s:sawtooth release:0.5 phaser:8 ]",
-  "[ 27/8 → 7/2 | note:A3 s:sawtooth release:0.5 phaser:8 ]",
-  "[ 7/2 → 29/8 | note:B3 s:sawtooth release:0.5 phaser:8 ]",
-  "[ 29/8 → 15/4 | note:D4 s:sawtooth release:0.5 phaser:8 ]",
-  "[ 15/4 → 31/8 | note:E4 s:sawtooth release:0.5 phaser:8 ]",
-  "[ 31/8 → 4/1 | note:F#4 s:sawtooth release:0.5 phaser:8 ]",
+  "[ 0/1 → 1/8 | note:D3 s:sawtooth release:0.5 phaserrate:1 ]",
+  "[ 1/8 → 1/4 | note:E3 s:sawtooth release:0.5 phaserrate:1 ]",
+  "[ 1/4 → 3/8 | note:F#3 s:sawtooth release:0.5 phaserrate:1 ]",
+  "[ 3/8 → 1/2 | note:A3 s:sawtooth release:0.5 phaserrate:1 ]",
+  "[ 1/2 → 5/8 | note:B3 s:sawtooth release:0.5 phaserrate:1 ]",
+  "[ 5/8 → 3/4 | note:D4 s:sawtooth release:0.5 phaserrate:1 ]",
+  "[ 3/4 → 7/8 | note:E4 s:sawtooth release:0.5 phaserrate:1 ]",
+  "[ 7/8 → 1/1 | note:F#4 s:sawtooth release:0.5 phaserrate:1 ]",
+  "[ 1/1 → 9/8 | note:D3 s:sawtooth release:0.5 phaserrate:2 ]",
+  "[ 9/8 → 5/4 | note:E3 s:sawtooth release:0.5 phaserrate:2 ]",
+  "[ 5/4 → 11/8 | note:F#3 s:sawtooth release:0.5 phaserrate:2 ]",
+  "[ 11/8 → 3/2 | note:A3 s:sawtooth release:0.5 phaserrate:2 ]",
+  "[ 3/2 → 13/8 | note:B3 s:sawtooth release:0.5 phaserrate:2 ]",
+  "[ 13/8 → 7/4 | note:D4 s:sawtooth release:0.5 phaserrate:2 ]",
+  "[ 7/4 → 15/8 | note:E4 s:sawtooth release:0.5 phaserrate:2 ]",
+  "[ 15/8 → 2/1 | note:F#4 s:sawtooth release:0.5 phaserrate:2 ]",
+  "[ 2/1 → 17/8 | note:D3 s:sawtooth release:0.5 phaserrate:4 ]",
+  "[ 17/8 → 9/4 | note:E3 s:sawtooth release:0.5 phaserrate:4 ]",
+  "[ 9/4 → 19/8 | note:F#3 s:sawtooth release:0.5 phaserrate:4 ]",
+  "[ 19/8 → 5/2 | note:A3 s:sawtooth release:0.5 phaserrate:4 ]",
+  "[ 5/2 → 21/8 | note:B3 s:sawtooth release:0.5 phaserrate:4 ]",
+  "[ 21/8 → 11/4 | note:D4 s:sawtooth release:0.5 phaserrate:4 ]",
+  "[ 11/4 → 23/8 | note:E4 s:sawtooth release:0.5 phaserrate:4 ]",
+  "[ 23/8 → 3/1 | note:F#4 s:sawtooth release:0.5 phaserrate:4 ]",
+  "[ 3/1 → 25/8 | note:D3 s:sawtooth release:0.5 phaserrate:8 ]",
+  "[ 25/8 → 13/4 | note:E3 s:sawtooth release:0.5 phaserrate:8 ]",
+  "[ 13/4 → 27/8 | note:F#3 s:sawtooth release:0.5 phaserrate:8 ]",
+  "[ 27/8 → 7/2 | note:A3 s:sawtooth release:0.5 phaserrate:8 ]",
+  "[ 7/2 → 29/8 | note:B3 s:sawtooth release:0.5 phaserrate:8 ]",
+  "[ 29/8 → 15/4 | note:D4 s:sawtooth release:0.5 phaserrate:8 ]",
+  "[ 15/4 → 31/8 | note:E4 s:sawtooth release:0.5 phaserrate:8 ]",
+  "[ 31/8 → 4/1 | note:F#4 s:sawtooth release:0.5 phaserrate:8 ]",
 ]
 `;
 
 exports[`runs examples > example "phasercenter" example index 0 1`] = `
 [
-  "[ 0/1 → 1/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasercenter:800 ]",
-  "[ 1/8 → 1/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasercenter:800 ]",
-  "[ 1/4 → 3/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasercenter:800 ]",
-  "[ 3/8 → 1/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasercenter:800 ]",
-  "[ 1/2 → 5/8 | note:B3 s:sawtooth release:0.5 phaser:2 phasercenter:800 ]",
-  "[ 5/8 → 3/4 | note:D4 s:sawtooth release:0.5 phaser:2 phasercenter:800 ]",
-  "[ 3/4 → 7/8 | note:E4 s:sawtooth release:0.5 phaser:2 phasercenter:800 ]",
-  "[ 7/8 → 1/1 | note:F#4 s:sawtooth release:0.5 phaser:2 phasercenter:800 ]",
-  "[ 1/1 → 9/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]",
-  "[ 9/8 → 5/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]",
-  "[ 5/4 → 11/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]",
-  "[ 11/8 → 3/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]",
-  "[ 3/2 → 13/8 | note:B3 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]",
-  "[ 13/8 → 7/4 | note:D4 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]",
-  "[ 7/4 → 15/8 | note:E4 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]",
-  "[ 15/8 → 2/1 | note:F#4 s:sawtooth release:0.5 phaser:2 phasercenter:2000 ]",
-  "[ 2/1 → 17/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasercenter:4000 ]",
-  "[ 17/8 → 9/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasercenter:4000 ]",
-  "[ 9/4 → 19/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasercenter:4000 ]",
-  "[ 19/8 → 5/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasercenter:4000 ]",
-  "[ 5/2 → 21/8 | note:B3 s:sawtooth release:0.5 phaser:2 phasercenter:4000 ]",
-  "[ 21/8 → 11/4 | note:D4 s:sawtooth release:0.5 phaser:2 phasercenter:4000 ]",
-  "[ 11/4 → 23/8 | note:E4 s:sawtooth release:0.5 phaser:2 phasercenter:4000 ]",
-  "[ 23/8 → 3/1 | note:F#4 s:sawtooth release:0.5 phaser:2 phasercenter:4000 ]",
-  "[ 3/1 → 25/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasercenter:800 ]",
-  "[ 25/8 → 13/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasercenter:800 ]",
-  "[ 13/4 → 27/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasercenter:800 ]",
-  "[ 27/8 → 7/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasercenter:800 ]",
-  "[ 7/2 → 29/8 | note:B3 s:sawtooth release:0.5 phaser:2 phasercenter:800 ]",
-  "[ 29/8 → 15/4 | note:D4 s:sawtooth release:0.5 phaser:2 phasercenter:800 ]",
-  "[ 15/4 → 31/8 | note:E4 s:sawtooth release:0.5 phaser:2 phasercenter:800 ]",
-  "[ 31/8 → 4/1 | note:F#4 s:sawtooth release:0.5 phaser:2 phasercenter:800 ]",
+  "[ 0/1 → 1/8 | note:D3 s:sawtooth release:0.5 phaserrate:2 phasercenter:800 ]",
+  "[ 1/8 → 1/4 | note:E3 s:sawtooth release:0.5 phaserrate:2 phasercenter:800 ]",
+  "[ 1/4 → 3/8 | note:F#3 s:sawtooth release:0.5 phaserrate:2 phasercenter:800 ]",
+  "[ 3/8 → 1/2 | note:A3 s:sawtooth release:0.5 phaserrate:2 phasercenter:800 ]",
+  "[ 1/2 → 5/8 | note:B3 s:sawtooth release:0.5 phaserrate:2 phasercenter:800 ]",
+  "[ 5/8 → 3/4 | note:D4 s:sawtooth release:0.5 phaserrate:2 phasercenter:800 ]",
+  "[ 3/4 → 7/8 | note:E4 s:sawtooth release:0.5 phaserrate:2 phasercenter:800 ]",
+  "[ 7/8 → 1/1 | note:F#4 s:sawtooth release:0.5 phaserrate:2 phasercenter:800 ]",
+  "[ 1/1 → 9/8 | note:D3 s:sawtooth release:0.5 phaserrate:2 phasercenter:2000 ]",
+  "[ 9/8 → 5/4 | note:E3 s:sawtooth release:0.5 phaserrate:2 phasercenter:2000 ]",
+  "[ 5/4 → 11/8 | note:F#3 s:sawtooth release:0.5 phaserrate:2 phasercenter:2000 ]",
+  "[ 11/8 → 3/2 | note:A3 s:sawtooth release:0.5 phaserrate:2 phasercenter:2000 ]",
+  "[ 3/2 → 13/8 | note:B3 s:sawtooth release:0.5 phaserrate:2 phasercenter:2000 ]",
+  "[ 13/8 → 7/4 | note:D4 s:sawtooth release:0.5 phaserrate:2 phasercenter:2000 ]",
+  "[ 7/4 → 15/8 | note:E4 s:sawtooth release:0.5 phaserrate:2 phasercenter:2000 ]",
+  "[ 15/8 → 2/1 | note:F#4 s:sawtooth release:0.5 phaserrate:2 phasercenter:2000 ]",
+  "[ 2/1 → 17/8 | note:D3 s:sawtooth release:0.5 phaserrate:2 phasercenter:4000 ]",
+  "[ 17/8 → 9/4 | note:E3 s:sawtooth release:0.5 phaserrate:2 phasercenter:4000 ]",
+  "[ 9/4 → 19/8 | note:F#3 s:sawtooth release:0.5 phaserrate:2 phasercenter:4000 ]",
+  "[ 19/8 → 5/2 | note:A3 s:sawtooth release:0.5 phaserrate:2 phasercenter:4000 ]",
+  "[ 5/2 → 21/8 | note:B3 s:sawtooth release:0.5 phaserrate:2 phasercenter:4000 ]",
+  "[ 21/8 → 11/4 | note:D4 s:sawtooth release:0.5 phaserrate:2 phasercenter:4000 ]",
+  "[ 11/4 → 23/8 | note:E4 s:sawtooth release:0.5 phaserrate:2 phasercenter:4000 ]",
+  "[ 23/8 → 3/1 | note:F#4 s:sawtooth release:0.5 phaserrate:2 phasercenter:4000 ]",
+  "[ 3/1 → 25/8 | note:D3 s:sawtooth release:0.5 phaserrate:2 phasercenter:800 ]",
+  "[ 25/8 → 13/4 | note:E3 s:sawtooth release:0.5 phaserrate:2 phasercenter:800 ]",
+  "[ 13/4 → 27/8 | note:F#3 s:sawtooth release:0.5 phaserrate:2 phasercenter:800 ]",
+  "[ 27/8 → 7/2 | note:A3 s:sawtooth release:0.5 phaserrate:2 phasercenter:800 ]",
+  "[ 7/2 → 29/8 | note:B3 s:sawtooth release:0.5 phaserrate:2 phasercenter:800 ]",
+  "[ 29/8 → 15/4 | note:D4 s:sawtooth release:0.5 phaserrate:2 phasercenter:800 ]",
+  "[ 15/4 → 31/8 | note:E4 s:sawtooth release:0.5 phaserrate:2 phasercenter:800 ]",
+  "[ 31/8 → 4/1 | note:F#4 s:sawtooth release:0.5 phaserrate:2 phasercenter:800 ]",
 ]
 `;
 
 exports[`runs examples > example "phaserdepth" example index 0 1`] = `
 [
-  "[ 0/1 → 1/8 | note:D3 s:sawtooth release:0.5 phaser:2 phaserdepth:0 ]",
-  "[ 1/8 → 1/4 | note:E3 s:sawtooth release:0.5 phaser:2 phaserdepth:0 ]",
-  "[ 1/4 → 3/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phaserdepth:0 ]",
-  "[ 3/8 → 1/2 | note:A3 s:sawtooth release:0.5 phaser:2 phaserdepth:0 ]",
-  "[ 1/2 → 5/8 | note:B3 s:sawtooth release:0.5 phaser:2 phaserdepth:0 ]",
-  "[ 5/8 → 3/4 | note:D4 s:sawtooth release:0.5 phaser:2 phaserdepth:0 ]",
-  "[ 3/4 → 7/8 | note:E4 s:sawtooth release:0.5 phaser:2 phaserdepth:0 ]",
-  "[ 7/8 → 1/1 | note:F#4 s:sawtooth release:0.5 phaser:2 phaserdepth:0 ]",
-  "[ 1/1 → 9/8 | note:D3 s:sawtooth release:0.5 phaser:2 phaserdepth:0.5 ]",
-  "[ 9/8 → 5/4 | note:E3 s:sawtooth release:0.5 phaser:2 phaserdepth:0.5 ]",
-  "[ 5/4 → 11/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phaserdepth:0.5 ]",
-  "[ 11/8 → 3/2 | note:A3 s:sawtooth release:0.5 phaser:2 phaserdepth:0.5 ]",
-  "[ 3/2 → 13/8 | note:B3 s:sawtooth release:0.5 phaser:2 phaserdepth:0.5 ]",
-  "[ 13/8 → 7/4 | note:D4 s:sawtooth release:0.5 phaser:2 phaserdepth:0.5 ]",
-  "[ 7/4 → 15/8 | note:E4 s:sawtooth release:0.5 phaser:2 phaserdepth:0.5 ]",
-  "[ 15/8 → 2/1 | note:F#4 s:sawtooth release:0.5 phaser:2 phaserdepth:0.5 ]",
-  "[ 2/1 → 17/8 | note:D3 s:sawtooth release:0.5 phaser:2 phaserdepth:0.75 ]",
-  "[ 17/8 → 9/4 | note:E3 s:sawtooth release:0.5 phaser:2 phaserdepth:0.75 ]",
-  "[ 9/4 → 19/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phaserdepth:0.75 ]",
-  "[ 19/8 → 5/2 | note:A3 s:sawtooth release:0.5 phaser:2 phaserdepth:0.75 ]",
-  "[ 5/2 → 21/8 | note:B3 s:sawtooth release:0.5 phaser:2 phaserdepth:0.75 ]",
-  "[ 21/8 → 11/4 | note:D4 s:sawtooth release:0.5 phaser:2 phaserdepth:0.75 ]",
-  "[ 11/4 → 23/8 | note:E4 s:sawtooth release:0.5 phaser:2 phaserdepth:0.75 ]",
-  "[ 23/8 → 3/1 | note:F#4 s:sawtooth release:0.5 phaser:2 phaserdepth:0.75 ]",
-  "[ 3/1 → 25/8 | note:D3 s:sawtooth release:0.5 phaser:2 phaserdepth:1 ]",
-  "[ 25/8 → 13/4 | note:E3 s:sawtooth release:0.5 phaser:2 phaserdepth:1 ]",
-  "[ 13/4 → 27/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phaserdepth:1 ]",
-  "[ 27/8 → 7/2 | note:A3 s:sawtooth release:0.5 phaser:2 phaserdepth:1 ]",
-  "[ 7/2 → 29/8 | note:B3 s:sawtooth release:0.5 phaser:2 phaserdepth:1 ]",
-  "[ 29/8 → 15/4 | note:D4 s:sawtooth release:0.5 phaser:2 phaserdepth:1 ]",
-  "[ 15/4 → 31/8 | note:E4 s:sawtooth release:0.5 phaser:2 phaserdepth:1 ]",
-  "[ 31/8 → 4/1 | note:F#4 s:sawtooth release:0.5 phaser:2 phaserdepth:1 ]",
+  "[ 0/1 → 1/8 | note:D3 s:sawtooth release:0.5 phaserrate:2 phaserdepth:0 ]",
+  "[ 1/8 → 1/4 | note:E3 s:sawtooth release:0.5 phaserrate:2 phaserdepth:0 ]",
+  "[ 1/4 → 3/8 | note:F#3 s:sawtooth release:0.5 phaserrate:2 phaserdepth:0 ]",
+  "[ 3/8 → 1/2 | note:A3 s:sawtooth release:0.5 phaserrate:2 phaserdepth:0 ]",
+  "[ 1/2 → 5/8 | note:B3 s:sawtooth release:0.5 phaserrate:2 phaserdepth:0 ]",
+  "[ 5/8 → 3/4 | note:D4 s:sawtooth release:0.5 phaserrate:2 phaserdepth:0 ]",
+  "[ 3/4 → 7/8 | note:E4 s:sawtooth release:0.5 phaserrate:2 phaserdepth:0 ]",
+  "[ 7/8 → 1/1 | note:F#4 s:sawtooth release:0.5 phaserrate:2 phaserdepth:0 ]",
+  "[ 1/1 → 9/8 | note:D3 s:sawtooth release:0.5 phaserrate:2 phaserdepth:0.5 ]",
+  "[ 9/8 → 5/4 | note:E3 s:sawtooth release:0.5 phaserrate:2 phaserdepth:0.5 ]",
+  "[ 5/4 → 11/8 | note:F#3 s:sawtooth release:0.5 phaserrate:2 phaserdepth:0.5 ]",
+  "[ 11/8 → 3/2 | note:A3 s:sawtooth release:0.5 phaserrate:2 phaserdepth:0.5 ]",
+  "[ 3/2 → 13/8 | note:B3 s:sawtooth release:0.5 phaserrate:2 phaserdepth:0.5 ]",
+  "[ 13/8 → 7/4 | note:D4 s:sawtooth release:0.5 phaserrate:2 phaserdepth:0.5 ]",
+  "[ 7/4 → 15/8 | note:E4 s:sawtooth release:0.5 phaserrate:2 phaserdepth:0.5 ]",
+  "[ 15/8 → 2/1 | note:F#4 s:sawtooth release:0.5 phaserrate:2 phaserdepth:0.5 ]",
+  "[ 2/1 → 17/8 | note:D3 s:sawtooth release:0.5 phaserrate:2 phaserdepth:0.75 ]",
+  "[ 17/8 → 9/4 | note:E3 s:sawtooth release:0.5 phaserrate:2 phaserdepth:0.75 ]",
+  "[ 9/4 → 19/8 | note:F#3 s:sawtooth release:0.5 phaserrate:2 phaserdepth:0.75 ]",
+  "[ 19/8 → 5/2 | note:A3 s:sawtooth release:0.5 phaserrate:2 phaserdepth:0.75 ]",
+  "[ 5/2 → 21/8 | note:B3 s:sawtooth release:0.5 phaserrate:2 phaserdepth:0.75 ]",
+  "[ 21/8 → 11/4 | note:D4 s:sawtooth release:0.5 phaserrate:2 phaserdepth:0.75 ]",
+  "[ 11/4 → 23/8 | note:E4 s:sawtooth release:0.5 phaserrate:2 phaserdepth:0.75 ]",
+  "[ 23/8 → 3/1 | note:F#4 s:sawtooth release:0.5 phaserrate:2 phaserdepth:0.75 ]",
+  "[ 3/1 → 25/8 | note:D3 s:sawtooth release:0.5 phaserrate:2 phaserdepth:1 ]",
+  "[ 25/8 → 13/4 | note:E3 s:sawtooth release:0.5 phaserrate:2 phaserdepth:1 ]",
+  "[ 13/4 → 27/8 | note:F#3 s:sawtooth release:0.5 phaserrate:2 phaserdepth:1 ]",
+  "[ 27/8 → 7/2 | note:A3 s:sawtooth release:0.5 phaserrate:2 phaserdepth:1 ]",
+  "[ 7/2 → 29/8 | note:B3 s:sawtooth release:0.5 phaserrate:2 phaserdepth:1 ]",
+  "[ 29/8 → 15/4 | note:D4 s:sawtooth release:0.5 phaserrate:2 phaserdepth:1 ]",
+  "[ 15/4 → 31/8 | note:E4 s:sawtooth release:0.5 phaserrate:2 phaserdepth:1 ]",
+  "[ 31/8 → 4/1 | note:F#4 s:sawtooth release:0.5 phaserrate:2 phaserdepth:1 ]",
 ]
 `;
 
 exports[`runs examples > example "phasersweep" example index 0 1`] = `
 [
-  "[ 0/1 → 1/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]",
-  "[ 1/8 → 1/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]",
-  "[ 1/4 → 3/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]",
-  "[ 3/8 → 1/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]",
-  "[ 1/2 → 5/8 | note:B3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]",
-  "[ 5/8 → 3/4 | note:D4 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]",
-  "[ 3/4 → 7/8 | note:E4 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]",
-  "[ 7/8 → 1/1 | note:F#4 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]",
-  "[ 1/1 → 9/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasersweep:2000 ]",
-  "[ 9/8 → 5/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasersweep:2000 ]",
-  "[ 5/4 → 11/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasersweep:2000 ]",
-  "[ 11/8 → 3/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasersweep:2000 ]",
-  "[ 3/2 → 13/8 | note:B3 s:sawtooth release:0.5 phaser:2 phasersweep:2000 ]",
-  "[ 13/8 → 7/4 | note:D4 s:sawtooth release:0.5 phaser:2 phasersweep:2000 ]",
-  "[ 7/4 → 15/8 | note:E4 s:sawtooth release:0.5 phaser:2 phasersweep:2000 ]",
-  "[ 15/8 → 2/1 | note:F#4 s:sawtooth release:0.5 phaser:2 phasersweep:2000 ]",
-  "[ 2/1 → 17/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasersweep:4000 ]",
-  "[ 17/8 → 9/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasersweep:4000 ]",
-  "[ 9/4 → 19/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasersweep:4000 ]",
-  "[ 19/8 → 5/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasersweep:4000 ]",
-  "[ 5/2 → 21/8 | note:B3 s:sawtooth release:0.5 phaser:2 phasersweep:4000 ]",
-  "[ 21/8 → 11/4 | note:D4 s:sawtooth release:0.5 phaser:2 phasersweep:4000 ]",
-  "[ 11/4 → 23/8 | note:E4 s:sawtooth release:0.5 phaser:2 phasersweep:4000 ]",
-  "[ 23/8 → 3/1 | note:F#4 s:sawtooth release:0.5 phaser:2 phasersweep:4000 ]",
-  "[ 3/1 → 25/8 | note:D3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]",
-  "[ 25/8 → 13/4 | note:E3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]",
-  "[ 13/4 → 27/8 | note:F#3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]",
-  "[ 27/8 → 7/2 | note:A3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]",
-  "[ 7/2 → 29/8 | note:B3 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]",
-  "[ 29/8 → 15/4 | note:D4 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]",
-  "[ 15/4 → 31/8 | note:E4 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]",
-  "[ 31/8 → 4/1 | note:F#4 s:sawtooth release:0.5 phaser:2 phasersweep:800 ]",
+  "[ 0/1 → 1/8 | note:D3 s:sawtooth release:0.5 phaserrate:2 phasersweep:800 ]",
+  "[ 1/8 → 1/4 | note:E3 s:sawtooth release:0.5 phaserrate:2 phasersweep:800 ]",
+  "[ 1/4 → 3/8 | note:F#3 s:sawtooth release:0.5 phaserrate:2 phasersweep:800 ]",
+  "[ 3/8 → 1/2 | note:A3 s:sawtooth release:0.5 phaserrate:2 phasersweep:800 ]",
+  "[ 1/2 → 5/8 | note:B3 s:sawtooth release:0.5 phaserrate:2 phasersweep:800 ]",
+  "[ 5/8 → 3/4 | note:D4 s:sawtooth release:0.5 phaserrate:2 phasersweep:800 ]",
+  "[ 3/4 → 7/8 | note:E4 s:sawtooth release:0.5 phaserrate:2 phasersweep:800 ]",
+  "[ 7/8 → 1/1 | note:F#4 s:sawtooth release:0.5 phaserrate:2 phasersweep:800 ]",
+  "[ 1/1 → 9/8 | note:D3 s:sawtooth release:0.5 phaserrate:2 phasersweep:2000 ]",
+  "[ 9/8 → 5/4 | note:E3 s:sawtooth release:0.5 phaserrate:2 phasersweep:2000 ]",
+  "[ 5/4 → 11/8 | note:F#3 s:sawtooth release:0.5 phaserrate:2 phasersweep:2000 ]",
+  "[ 11/8 → 3/2 | note:A3 s:sawtooth release:0.5 phaserrate:2 phasersweep:2000 ]",
+  "[ 3/2 → 13/8 | note:B3 s:sawtooth release:0.5 phaserrate:2 phasersweep:2000 ]",
+  "[ 13/8 → 7/4 | note:D4 s:sawtooth release:0.5 phaserrate:2 phasersweep:2000 ]",
+  "[ 7/4 → 15/8 | note:E4 s:sawtooth release:0.5 phaserrate:2 phasersweep:2000 ]",
+  "[ 15/8 → 2/1 | note:F#4 s:sawtooth release:0.5 phaserrate:2 phasersweep:2000 ]",
+  "[ 2/1 → 17/8 | note:D3 s:sawtooth release:0.5 phaserrate:2 phasersweep:4000 ]",
+  "[ 17/8 → 9/4 | note:E3 s:sawtooth release:0.5 phaserrate:2 phasersweep:4000 ]",
+  "[ 9/4 → 19/8 | note:F#3 s:sawtooth release:0.5 phaserrate:2 phasersweep:4000 ]",
+  "[ 19/8 → 5/2 | note:A3 s:sawtooth release:0.5 phaserrate:2 phasersweep:4000 ]",
+  "[ 5/2 → 21/8 | note:B3 s:sawtooth release:0.5 phaserrate:2 phasersweep:4000 ]",
+  "[ 21/8 → 11/4 | note:D4 s:sawtooth release:0.5 phaserrate:2 phasersweep:4000 ]",
+  "[ 11/4 → 23/8 | note:E4 s:sawtooth release:0.5 phaserrate:2 phasersweep:4000 ]",
+  "[ 23/8 → 3/1 | note:F#4 s:sawtooth release:0.5 phaserrate:2 phasersweep:4000 ]",
+  "[ 3/1 → 25/8 | note:D3 s:sawtooth release:0.5 phaserrate:2 phasersweep:800 ]",
+  "[ 25/8 → 13/4 | note:E3 s:sawtooth release:0.5 phaserrate:2 phasersweep:800 ]",
+  "[ 13/4 → 27/8 | note:F#3 s:sawtooth release:0.5 phaserrate:2 phasersweep:800 ]",
+  "[ 27/8 → 7/2 | note:A3 s:sawtooth release:0.5 phaserrate:2 phasersweep:800 ]",
+  "[ 7/2 → 29/8 | note:B3 s:sawtooth release:0.5 phaserrate:2 phasersweep:800 ]",
+  "[ 29/8 → 15/4 | note:D4 s:sawtooth release:0.5 phaserrate:2 phasersweep:800 ]",
+  "[ 15/4 → 31/8 | note:E4 s:sawtooth release:0.5 phaserrate:2 phasersweep:800 ]",
+  "[ 31/8 → 4/1 | note:F#4 s:sawtooth release:0.5 phaserrate:2 phasersweep:800 ]",
 ]
 `;
 
 exports[`runs examples > example "pianoroll" example index 0 1`] = `
 [
-  "[ 0/1 → 1/8 | note:C2 s:piano clip:1 color:salmon ]",
-  "[ (1/4 → 1/3) ⇝ 3/8 | note:C2 s:piano clip:1 color:salmon ]",
-  "[ 1/4 ⇜ (1/3 → 3/8) | note:A2 s:piano clip:1 color:salmon ]",
-  "[ 3/8 → 1/2 | note:A2 s:piano clip:1 color:salmon ]",
-  "[ (5/8 → 2/3) ⇝ 3/4 | note:A2 s:piano clip:1 color:salmon ]",
-  "[ 5/8 ⇜ (2/3 → 3/4) | note:G2 s:piano clip:1 color:salmon ]",
-  "[ 3/4 → 7/8 | note:G2 s:piano clip:1 color:salmon ]",
-  "[ 1/1 → 9/8 | note:C2 s:piano clip:1 color:salmon ]",
-  "[ (5/4 → 4/3) ⇝ 11/8 | note:C2 s:piano clip:1 color:salmon ]",
-  "[ 5/4 ⇜ (4/3 → 11/8) | note:A2 s:piano clip:1 color:salmon ]",
-  "[ 11/8 → 3/2 | note:A2 s:piano clip:1 color:salmon ]",
-  "[ (13/8 → 5/3) ⇝ 7/4 | note:A2 s:piano clip:1 color:salmon ]",
-  "[ 13/8 ⇜ (5/3 → 7/4) | note:G2 s:piano clip:1 color:salmon ]",
-  "[ 7/4 → 15/8 | note:G2 s:piano clip:1 color:salmon ]",
-  "[ 2/1 → 17/8 | note:C2 s:piano clip:1 color:salmon ]",
-  "[ (9/4 → 7/3) ⇝ 19/8 | note:C2 s:piano clip:1 color:salmon ]",
-  "[ 9/4 ⇜ (7/3 → 19/8) | note:A2 s:piano clip:1 color:salmon ]",
-  "[ 19/8 → 5/2 | note:A2 s:piano clip:1 color:salmon ]",
-  "[ (21/8 → 8/3) ⇝ 11/4 | note:A2 s:piano clip:1 color:salmon ]",
-  "[ 21/8 ⇜ (8/3 → 11/4) | note:G2 s:piano clip:1 color:salmon ]",
-  "[ 11/4 → 23/8 | note:G2 s:piano clip:1 color:salmon ]",
-  "[ 3/1 → 25/8 | note:C2 s:piano clip:1 color:salmon ]",
-  "[ (13/4 → 10/3) ⇝ 27/8 | note:C2 s:piano clip:1 color:salmon ]",
-  "[ 13/4 ⇜ (10/3 → 27/8) | note:A2 s:piano clip:1 color:salmon ]",
-  "[ 27/8 → 7/2 | note:A2 s:piano clip:1 color:salmon ]",
-  "[ (29/8 → 11/3) ⇝ 15/4 | note:A2 s:piano clip:1 color:salmon ]",
-  "[ 29/8 ⇜ (11/3 → 15/4) | note:G2 s:piano clip:1 color:salmon ]",
-  "[ 15/4 → 31/8 | note:G2 s:piano clip:1 color:salmon ]",
+  "[ 0/1 → 1/8 | note:c2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ (1/4 → 1/3) ⇝ 3/8 | note:c2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 1/4 ⇜ (1/3 → 3/8) | note:a2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 3/8 → 1/2 | note:a2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ (5/8 → 2/3) ⇝ 3/4 | note:a2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 5/8 ⇜ (2/3 → 3/4) | note:eb2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 3/4 → 7/8 | note:eb2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 1/1 → 9/8 | note:c2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ (5/4 → 4/3) ⇝ 11/8 | note:c2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 5/4 ⇜ (4/3 → 11/8) | note:a2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 11/8 → 3/2 | note:a2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ (13/8 → 5/3) ⇝ 7/4 | note:a2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 13/8 ⇜ (5/3 → 7/4) | note:eb2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 7/4 → 15/8 | note:eb2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 2/1 → 17/8 | note:c2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ (9/4 → 7/3) ⇝ 19/8 | note:c2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 9/4 ⇜ (7/3 → 19/8) | note:a2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 19/8 → 5/2 | note:a2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ (21/8 → 8/3) ⇝ 11/4 | note:a2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 21/8 ⇜ (8/3 → 11/4) | note:eb2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 11/4 → 23/8 | note:eb2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 3/1 → 25/8 | note:c2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ (13/4 → 10/3) ⇝ 27/8 | note:c2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 13/4 ⇜ (10/3 → 27/8) | note:a2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 27/8 → 7/2 | note:a2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ (29/8 → 11/3) ⇝ 15/4 | note:a2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 29/8 ⇜ (11/3 → 15/4) | note:eb2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 15/4 → 31/8 | note:eb2 s:sawtooth lpenv:4 cutoff:300 ]",
 ]
 `;
 
@@ -5009,6 +5234,82 @@ exports[`runs examples > example "pickF" example index 1 1`] = `
 ]
 `;
 
+exports[`runs examples > example "pickmodRestart" example index 0 1`] = `
+[
+  "[ 0/1 → 1/4 | note:C3 s:piano ]",
+  "[ 1/4 → 1/2 | note:D3 s:piano ]",
+  "[ 1/2 → 3/4 | note:E3 s:piano ]",
+  "[ 3/4 → 1/1 | note:C3 s:piano ]",
+  "[ 1/1 → 5/4 | note:C3 s:piano ]",
+  "[ 5/4 → 3/2 | note:D3 s:piano ]",
+  "[ 3/2 → 7/4 | note:E3 s:piano ]",
+  "[ 7/4 → 2/1 | note:C3 s:piano ]",
+  "[ 2/1 → 9/4 | note:E3 s:piano ]",
+  "[ 9/4 → 5/2 | note:F3 s:piano ]",
+  "[ 5/2 → 11/4 | note:G3 s:piano ]",
+  "[ 3/1 → 13/4 | note:E3 s:piano ]",
+  "[ 13/4 → 7/2 | note:F3 s:piano ]",
+  "[ 7/2 → 15/4 | note:G3 s:piano ]",
+]
+`;
+
+exports[`runs examples > example "pitchwheel" example index 0 1`] = `
+[
+  "[ 0/1 → 1/13 | note:C3 s:sawtooth cutoff:500 ]",
+  "[ 1/13 → 2/13 | note:Db3 s:sawtooth cutoff:500 ]",
+  "[ 2/13 → 3/13 | note:D3 s:sawtooth cutoff:500 ]",
+  "[ 3/13 → 4/13 | note:Eb3 s:sawtooth cutoff:500 ]",
+  "[ 4/13 → 5/13 | note:E3 s:sawtooth cutoff:500 ]",
+  "[ 5/13 → 6/13 | note:F3 s:sawtooth cutoff:500 ]",
+  "[ 6/13 → 7/13 | note:Gb3 s:sawtooth cutoff:500 ]",
+  "[ 7/13 → 8/13 | note:G3 s:sawtooth cutoff:500 ]",
+  "[ 8/13 → 9/13 | note:Ab3 s:sawtooth cutoff:500 ]",
+  "[ 9/13 → 10/13 | note:A3 s:sawtooth cutoff:500 ]",
+  "[ 10/13 → 11/13 | note:Bb3 s:sawtooth cutoff:500 ]",
+  "[ 11/13 → 12/13 | note:B3 s:sawtooth cutoff:500 ]",
+  "[ 12/13 → 1/1 | note:C4 s:sawtooth cutoff:500 ]",
+  "[ 1/1 → 14/13 | note:C3 s:sawtooth cutoff:500 ]",
+  "[ 14/13 → 15/13 | note:Db3 s:sawtooth cutoff:500 ]",
+  "[ 15/13 → 16/13 | note:D3 s:sawtooth cutoff:500 ]",
+  "[ 16/13 → 17/13 | note:Eb3 s:sawtooth cutoff:500 ]",
+  "[ 17/13 → 18/13 | note:E3 s:sawtooth cutoff:500 ]",
+  "[ 18/13 → 19/13 | note:F3 s:sawtooth cutoff:500 ]",
+  "[ 19/13 → 20/13 | note:Gb3 s:sawtooth cutoff:500 ]",
+  "[ 20/13 → 21/13 | note:G3 s:sawtooth cutoff:500 ]",
+  "[ 21/13 → 22/13 | note:Ab3 s:sawtooth cutoff:500 ]",
+  "[ 22/13 → 23/13 | note:A3 s:sawtooth cutoff:500 ]",
+  "[ 23/13 → 24/13 | note:Bb3 s:sawtooth cutoff:500 ]",
+  "[ 24/13 → 25/13 | note:B3 s:sawtooth cutoff:500 ]",
+  "[ 25/13 → 2/1 | note:C4 s:sawtooth cutoff:500 ]",
+  "[ 2/1 → 27/13 | note:C3 s:sawtooth cutoff:500 ]",
+  "[ 27/13 → 28/13 | note:Db3 s:sawtooth cutoff:500 ]",
+  "[ 28/13 → 29/13 | note:D3 s:sawtooth cutoff:500 ]",
+  "[ 29/13 → 30/13 | note:Eb3 s:sawtooth cutoff:500 ]",
+  "[ 30/13 → 31/13 | note:E3 s:sawtooth cutoff:500 ]",
+  "[ 31/13 → 32/13 | note:F3 s:sawtooth cutoff:500 ]",
+  "[ 32/13 → 33/13 | note:Gb3 s:sawtooth cutoff:500 ]",
+  "[ 33/13 → 34/13 | note:G3 s:sawtooth cutoff:500 ]",
+  "[ 34/13 → 35/13 | note:Ab3 s:sawtooth cutoff:500 ]",
+  "[ 35/13 → 36/13 | note:A3 s:sawtooth cutoff:500 ]",
+  "[ 36/13 → 37/13 | note:Bb3 s:sawtooth cutoff:500 ]",
+  "[ 37/13 → 38/13 | note:B3 s:sawtooth cutoff:500 ]",
+  "[ 38/13 → 3/1 | note:C4 s:sawtooth cutoff:500 ]",
+  "[ 3/1 → 40/13 | note:C3 s:sawtooth cutoff:500 ]",
+  "[ 40/13 → 41/13 | note:Db3 s:sawtooth cutoff:500 ]",
+  "[ 41/13 → 42/13 | note:D3 s:sawtooth cutoff:500 ]",
+  "[ 42/13 → 43/13 | note:Eb3 s:sawtooth cutoff:500 ]",
+  "[ 43/13 → 44/13 | note:E3 s:sawtooth cutoff:500 ]",
+  "[ 44/13 → 45/13 | note:F3 s:sawtooth cutoff:500 ]",
+  "[ 45/13 → 46/13 | note:Gb3 s:sawtooth cutoff:500 ]",
+  "[ 46/13 → 47/13 | note:G3 s:sawtooth cutoff:500 ]",
+  "[ 47/13 → 48/13 | note:Ab3 s:sawtooth cutoff:500 ]",
+  "[ 48/13 → 49/13 | note:A3 s:sawtooth cutoff:500 ]",
+  "[ 49/13 → 50/13 | note:Bb3 s:sawtooth cutoff:500 ]",
+  "[ 50/13 → 51/13 | note:B3 s:sawtooth cutoff:500 ]",
+  "[ 51/13 → 4/1 | note:C4 s:sawtooth cutoff:500 ]",
+]
+`;
+
 exports[`runs examples > example "ply" example index 0 1`] = `
 [
   "[ 0/1 → 1/4 | s:bd ]",
@@ -5035,72 +5336,6 @@ exports[`runs examples > example "ply" example index 0 1`] = `
 ]
 `;
 
-exports[`runs examples > example "polymeter" example index 0 1`] = `
-[
-  "[ 0/1 → 1/3 | c ]",
-  "[ 0/1 → 1/3 | c2 ]",
-  "[ 1/3 → 2/3 | eb ]",
-  "[ 1/3 → 2/3 | g2 ]",
-  "[ 2/3 → 1/1 | g ]",
-  "[ 2/3 → 1/1 | c2 ]",
-  "[ 1/1 → 4/3 | c ]",
-  "[ 1/1 → 4/3 | g2 ]",
-  "[ 4/3 → 5/3 | eb ]",
-  "[ 4/3 → 5/3 | c2 ]",
-  "[ 5/3 → 2/1 | g ]",
-  "[ 5/3 → 2/1 | g2 ]",
-  "[ 2/1 → 7/3 | c ]",
-  "[ 2/1 → 7/3 | c2 ]",
-  "[ 7/3 → 8/3 | eb ]",
-  "[ 7/3 → 8/3 | g2 ]",
-  "[ 8/3 → 3/1 | g ]",
-  "[ 8/3 → 3/1 | c2 ]",
-  "[ 3/1 → 10/3 | c ]",
-  "[ 3/1 → 10/3 | g2 ]",
-  "[ 10/3 → 11/3 | eb ]",
-  "[ 10/3 → 11/3 | c2 ]",
-  "[ 11/3 → 4/1 | g ]",
-  "[ 11/3 → 4/1 | g2 ]",
-]
-`;
-
-exports[`runs examples > example "polymeterSteps" example index 0 1`] = `
-[
-  "[ 0/1 → 1/4 | c ]",
-  "[ 0/1 → 1/4 | e ]",
-  "[ 1/4 → 1/2 | d ]",
-  "[ 1/4 → 1/2 | f ]",
-  "[ 1/2 → 3/4 | c ]",
-  "[ 1/2 → 3/4 | g ]",
-  "[ 3/4 → 1/1 | d ]",
-  "[ 3/4 → 1/1 | e ]",
-  "[ 1/1 → 5/4 | c ]",
-  "[ 1/1 → 5/4 | f ]",
-  "[ 5/4 → 3/2 | d ]",
-  "[ 5/4 → 3/2 | g ]",
-  "[ 3/2 → 7/4 | c ]",
-  "[ 3/2 → 7/4 | e ]",
-  "[ 7/4 → 2/1 | d ]",
-  "[ 7/4 → 2/1 | f ]",
-  "[ 2/1 → 9/4 | c ]",
-  "[ 2/1 → 9/4 | g ]",
-  "[ 9/4 → 5/2 | d ]",
-  "[ 9/4 → 5/2 | e ]",
-  "[ 5/2 → 11/4 | c ]",
-  "[ 5/2 → 11/4 | f ]",
-  "[ 11/4 → 3/1 | d ]",
-  "[ 11/4 → 3/1 | g ]",
-  "[ 3/1 → 13/4 | c ]",
-  "[ 3/1 → 13/4 | e ]",
-  "[ 13/4 → 7/2 | d ]",
-  "[ 13/4 → 7/2 | f ]",
-  "[ 7/2 → 15/4 | c ]",
-  "[ 7/2 → 15/4 | g ]",
-  "[ 15/4 → 4/1 | d ]",
-  "[ 15/4 → 4/1 | e ]",
-]
-`;
-
 exports[`runs examples > example "postgain" example index 0 1`] = `
 [
   "[ 0/1 → 1/8 | s:hh compressor:-20 compressorRatio:20 compressorKnee:10 compressorAttack:0.002 compressorRelease:0.02 postgain:1.5 ]",
@@ -6037,67 +6272,67 @@ exports[`runs examples > example "s_cat" example index 1 1`] = `
 
 exports[`runs examples > example "s_polymeter" example index 0 1`] = `
 [
-  "[ 0/1 → 1/3 | c ]",
-  "[ 0/1 → 1/3 | c2 ]",
-  "[ 1/3 → 2/3 | eb ]",
-  "[ 1/3 → 2/3 | g2 ]",
-  "[ 2/3 → 1/1 | g ]",
-  "[ 2/3 → 1/1 | c2 ]",
-  "[ 1/1 → 4/3 | c ]",
-  "[ 1/1 → 4/3 | g2 ]",
-  "[ 4/3 → 5/3 | eb ]",
-  "[ 4/3 → 5/3 | c2 ]",
-  "[ 5/3 → 2/1 | g ]",
-  "[ 5/3 → 2/1 | g2 ]",
-  "[ 2/1 → 7/3 | c ]",
-  "[ 2/1 → 7/3 | c2 ]",
-  "[ 7/3 → 8/3 | eb ]",
-  "[ 7/3 → 8/3 | g2 ]",
-  "[ 8/3 → 3/1 | g ]",
-  "[ 8/3 → 3/1 | c2 ]",
-  "[ 3/1 → 10/3 | c ]",
-  "[ 3/1 → 10/3 | g2 ]",
-  "[ 10/3 → 11/3 | eb ]",
-  "[ 10/3 → 11/3 | c2 ]",
-  "[ 11/3 → 4/1 | g ]",
-  "[ 11/3 → 4/1 | g2 ]",
+  "[ 0/1 → 1/3 | note:c ]",
+  "[ 0/1 → 1/3 | note:c2 ]",
+  "[ 1/3 → 2/3 | note:eb ]",
+  "[ 1/3 → 2/3 | note:g2 ]",
+  "[ 2/3 → 1/1 | note:g ]",
+  "[ 2/3 → 1/1 | note:c2 ]",
+  "[ 1/1 → 4/3 | note:c ]",
+  "[ 1/1 → 4/3 | note:g2 ]",
+  "[ 4/3 → 5/3 | note:eb ]",
+  "[ 4/3 → 5/3 | note:c2 ]",
+  "[ 5/3 → 2/1 | note:g ]",
+  "[ 5/3 → 2/1 | note:g2 ]",
+  "[ 2/1 → 7/3 | note:c ]",
+  "[ 2/1 → 7/3 | note:c2 ]",
+  "[ 7/3 → 8/3 | note:eb ]",
+  "[ 7/3 → 8/3 | note:g2 ]",
+  "[ 8/3 → 3/1 | note:g ]",
+  "[ 8/3 → 3/1 | note:c2 ]",
+  "[ 3/1 → 10/3 | note:c ]",
+  "[ 3/1 → 10/3 | note:g2 ]",
+  "[ 10/3 → 11/3 | note:eb ]",
+  "[ 10/3 → 11/3 | note:c2 ]",
+  "[ 11/3 → 4/1 | note:g ]",
+  "[ 11/3 → 4/1 | note:g2 ]",
 ]
 `;
 
 exports[`runs examples > example "s_polymeterSteps" example index 0 1`] = `
 [
-  "[ 0/1 → 1/4 | c ]",
-  "[ 0/1 → 1/4 | e ]",
-  "[ 1/4 → 1/2 | d ]",
-  "[ 1/4 → 1/2 | f ]",
-  "[ 1/2 → 3/4 | c ]",
-  "[ 1/2 → 3/4 | g ]",
-  "[ 3/4 → 1/1 | d ]",
-  "[ 3/4 → 1/1 | e ]",
-  "[ 1/1 → 5/4 | c ]",
-  "[ 1/1 → 5/4 | f ]",
-  "[ 5/4 → 3/2 | d ]",
-  "[ 5/4 → 3/2 | g ]",
-  "[ 3/2 → 7/4 | c ]",
-  "[ 3/2 → 7/4 | e ]",
-  "[ 7/4 → 2/1 | d ]",
-  "[ 7/4 → 2/1 | f ]",
-  "[ 2/1 → 9/4 | c ]",
-  "[ 2/1 → 9/4 | g ]",
-  "[ 9/4 → 5/2 | d ]",
-  "[ 9/4 → 5/2 | e ]",
-  "[ 5/2 → 11/4 | c ]",
-  "[ 5/2 → 11/4 | f ]",
-  "[ 11/4 → 3/1 | d ]",
-  "[ 11/4 → 3/1 | g ]",
-  "[ 3/1 → 13/4 | c ]",
-  "[ 3/1 → 13/4 | e ]",
-  "[ 13/4 → 7/2 | d ]",
-  "[ 13/4 → 7/2 | f ]",
-  "[ 7/2 → 15/4 | c ]",
-  "[ 7/2 → 15/4 | g ]",
-  "[ 15/4 → 4/1 | d ]",
-  "[ 15/4 → 4/1 | e ]",
+  "[ 0/1 → 1/4 | note:c ]",
+  "[ 0/1 → 1/4 | note:e ]",
+  "[ 1/4 → 1/2 | note:d ]",
+  "[ 1/4 → 1/2 | note:f ]",
+  "[ 1/2 → 3/4 | note:c ]",
+  "[ 1/2 → 3/4 | note:g ]",
+  "[ 3/4 → 1/1 | note:d ]",
+  "[ 3/4 → 1/1 | note:e ]",
+  "[ 1/1 → 5/4 | note:c ]",
+  "[ 1/1 → 5/4 | note:f ]",
+  "[ 5/4 → 3/2 | note:d ]",
+  "[ 5/4 → 3/2 | note:g ]",
+  "[ 3/2 → 7/4 | note:c ]",
+  "[ 3/2 → 7/4 | note:e ]",
+  "[ 7/4 → 2/1 | note:d ]",
+  "[ 7/4 → 2/1 | note:f ]",
+  "[ 2/1 → 9/4 | note:c ]",
+  "[ 2/1 → 9/4 | note:g ]",
+  "[ 9/4 → 5/2 | note:d ]",
+  "[ 9/4 → 5/2 | note:e ]",
+  "[ 5/2 → 11/4 | note:c ]",
+  "[ 5/2 → 11/4 | note:f ]",
+  "[ 11/4 → 3/1 | note:d ]",
+  "[ 11/4 → 3/1 | note:g ]",
+  "[ 3/1 → 13/4 | note:c ]",
+  "[ 3/1 → 13/4 | note:e ]",
+  "[ 13/4 → 7/2 | note:d ]",
+  "[ 13/4 → 7/2 | note:f ]",
+  "[ 7/2 → 15/4 | note:c ]",
+  "[ 7/2 → 15/4 | note:g ]",
+  "[ 15/4 → 4/1 | note:d ]",
+  "[ 15/4 → 4/1 | note:e ]",
 ]
 `;
 
@@ -6395,10 +6630,60 @@ exports[`runs examples > example "scaleTranspose" example index 0 1`] = `
 
 exports[`runs examples > example "scope" example index 0 1`] = `
 [
-  "[ 0/1 → 1/1 | s:sawtooth analyze:1 ]",
-  "[ 1/1 → 2/1 | s:sawtooth analyze:1 ]",
-  "[ 2/1 → 3/1 | s:sawtooth analyze:1 ]",
-  "[ 3/1 → 4/1 | s:sawtooth analyze:1 ]",
+  "[ 0/1 → 1/1 | s:sawtooth ]",
+  "[ 1/1 → 2/1 | s:sawtooth ]",
+  "[ 2/1 → 3/1 | s:sawtooth ]",
+  "[ 3/1 → 4/1 | s:sawtooth ]",
+]
+`;
+
+exports[`runs examples > example "scramble
+Slices a pattern into the given number of parts, then plays those parts at random. Similar to \`shuffle\`,
+but parts might be played more than once, or not at all, per cycle." example index 0 1`] = `
+[
+  "[ 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:d s:piano ]",
+  "[ 1/1 → 5/4 | note:e s:piano ]",
+  "[ 5/4 → 3/2 | note:c s:piano ]",
+  "[ 3/2 → 7/4 | note:d s:piano ]",
+  "[ 7/4 → 2/1 | note:e s:piano ]",
+  "[ 2/1 → 9/4 | note:f s:piano ]",
+  "[ 9/4 → 5/2 | note:f s:piano ]",
+  "[ 5/2 → 11/4 | note:c s:piano ]",
+  "[ 11/4 → 3/1 | note:c s:piano ]",
+  "[ 3/1 → 13/4 | note:d 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 ]",
+]
+`;
+
+exports[`runs examples > example "scramble
+Slices a pattern into the given number of parts, then plays those parts at random. Similar to \`shuffle\`,
+but parts might be played more than once, or not at all, per cycle." example index 1 1`] = `
+[
+  "[ 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:d s:piano ]",
+  "[ 1/2 → 1/1 | note:g s:piano ]",
+  "[ 1/1 → 9/8 | note:e s:piano ]",
+  "[ 9/8 → 5/4 | note:c 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:f s:piano ]",
+  "[ 17/8 → 9/4 | note:f s:piano ]",
+  "[ 9/4 → 19/8 | note:c s:piano ]",
+  "[ 19/8 → 5/2 | note:c 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:f s:piano ]",
+  "[ 27/8 → 7/2 | note:e s:piano ]",
+  "[ 7/2 → 4/1 | note:g s:piano ]",
 ]
 `;
 
@@ -6565,6 +6850,26 @@ exports[`runs examples > example "seq" example index 0 2`] = `
 ]
 `;
 
+exports[`runs examples > example "seqPLoop" example index 0 1`] = `
+[
+  "[ 0/1 → 1/8 | s:bd ]",
+  "[ 3/8 → 1/2 | s:bd ]",
+  "[ 3/4 → 7/8 | s:bd ]",
+  "[ 1/1 → 9/8 | s:bd ]",
+  "[ 1/1 → 9/8 | s:cp ]",
+  "[ 11/8 → 3/2 | s:bd ]",
+  "[ 11/8 → 3/2 | s:cp ]",
+  "[ 7/4 → 15/8 | s:bd ]",
+  "[ 7/4 → 15/8 | s:cp ]",
+  "[ 2/1 → 17/8 | s:cp ]",
+  "[ 19/8 → 5/2 | s:cp ]",
+  "[ 11/4 → 23/8 | s:cp ]",
+  "[ 3/1 → 25/8 | s:bd ]",
+  "[ 27/8 → 7/2 | s:bd ]",
+  "[ 15/4 → 31/8 | s:bd ]",
+]
+`;
+
 exports[`runs examples > example "shape" example index 0 1`] = `
 [
   "[ 0/1 → 1/8 | s:hh shape:0 ]",
@@ -6618,6 +6923,56 @@ exports[`runs examples > example "shape" example index 0 1`] = `
 ]
 `;
 
+exports[`runs examples > example "shuffle
+Slices a pattern into the given number of parts, then plays those parts in random order.
+Each part will be played exactly once per cycle." example index 0 1`] = `
+[
+  "[ 0/1 → 1/4 | note:c s:piano ]",
+  "[ 1/4 → 1/2 | note:d s:piano ]",
+  "[ 1/2 → 3/4 | note:e s:piano ]",
+  "[ 3/4 → 1/1 | note:f s:piano ]",
+  "[ 1/1 → 5/4 | note:c s:piano ]",
+  "[ 5/4 → 3/2 | note:d s:piano ]",
+  "[ 3/2 → 7/4 | note:e s:piano ]",
+  "[ 7/4 → 2/1 | note:f s:piano ]",
+  "[ 2/1 → 9/4 | note:c s:piano ]",
+  "[ 9/4 → 5/2 | note:d 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:d s:piano ]",
+  "[ 7/2 → 15/4 | note:e s:piano ]",
+  "[ 15/4 → 4/1 | note:f s:piano ]",
+]
+`;
+
+exports[`runs examples > example "shuffle
+Slices a pattern into the given number of parts, then plays those parts in random order.
+Each part will be played exactly once per cycle." example index 1 1`] = `
+[
+  "[ 0/1 → 1/8 | note:c s:piano ]",
+  "[ 1/8 → 1/4 | note:d s:piano ]",
+  "[ 1/4 → 3/8 | note:e s:piano ]",
+  "[ 3/8 → 1/2 | note:f s:piano ]",
+  "[ 1/2 → 1/1 | note:g s:piano ]",
+  "[ 1/1 → 9/8 | note:c s:piano ]",
+  "[ 9/8 → 5/4 | note:d s:piano ]",
+  "[ 5/4 → 11/8 | note:e s:piano ]",
+  "[ 11/8 → 3/2 | note:f s:piano ]",
+  "[ 3/2 → 2/1 | note:g s:piano ]",
+  "[ 2/1 → 17/8 | note:c s:piano ]",
+  "[ 17/8 → 9/4 | note:d 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:c s:piano ]",
+  "[ 25/8 → 13/4 | note:d s:piano ]",
+  "[ 13/4 → 27/8 | note:e s:piano ]",
+  "[ 27/8 → 7/2 | note:f s:piano ]",
+  "[ 7/2 → 4/1 | note:g s:piano ]",
+]
+`;
+
 exports[`runs examples > example "silence" example index 0 1`] = `[]`;
 
 exports[`runs examples > example "sine" example index 0 1`] = `
@@ -6999,6 +7354,39 @@ exports[`runs examples > example "speed" example index 1 1`] = `
 ]
 `;
 
+exports[`runs examples > example "spiral" example index 0 1`] = `
+[
+  "[ 0/1 → 1/8 | note:c2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ (1/4 → 1/3) ⇝ 3/8 | note:c2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 1/4 ⇜ (1/3 → 3/8) | note:a2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 3/8 → 1/2 | note:a2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ (5/8 → 2/3) ⇝ 3/4 | note:a2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 5/8 ⇜ (2/3 → 3/4) | note:eb2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 3/4 → 7/8 | note:eb2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 1/1 → 9/8 | note:c2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ (5/4 → 4/3) ⇝ 11/8 | note:c2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 5/4 ⇜ (4/3 → 11/8) | note:a2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 11/8 → 3/2 | note:a2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ (13/8 → 5/3) ⇝ 7/4 | note:a2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 13/8 ⇜ (5/3 → 7/4) | note:eb2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 7/4 → 15/8 | note:eb2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 2/1 → 17/8 | note:c2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ (9/4 → 7/3) ⇝ 19/8 | note:c2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 9/4 ⇜ (7/3 → 19/8) | note:a2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 19/8 → 5/2 | note:a2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ (21/8 → 8/3) ⇝ 11/4 | note:a2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 21/8 ⇜ (8/3 → 11/4) | note:eb2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 11/4 → 23/8 | note:eb2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 3/1 → 25/8 | note:c2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ (13/4 → 10/3) ⇝ 27/8 | note:c2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 13/4 ⇜ (10/3 → 27/8) | note:a2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 27/8 → 7/2 | note:a2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ (29/8 → 11/3) ⇝ 15/4 | note:a2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 29/8 ⇜ (11/3 → 15/4) | note:eb2 s:sawtooth lpenv:4 cutoff:300 ]",
+  "[ 15/4 → 31/8 | note:eb2 s:sawtooth lpenv:4 cutoff:300 ]",
+]
+`;
+
 exports[`runs examples > example "splice" example index 0 1`] = `
 [
   "[ 0/1 → 1/8 | speed:1 unit:c begin:0 end:0.125 _slices:8 s:breaks165 ]",
@@ -7216,31 +7604,6 @@ exports[`runs examples > example "stack" example index 0 2`] = `
 ]
 `;
 
-exports[`runs examples > example "stepcat" example index 0 1`] = `
-[
-  "[ 0/1 → 1/5 | s:bd ]",
-  "[ 1/5 → 2/5 | s:cp ]",
-  "[ 2/5 → 3/5 | s:bd ]",
-  "[ 3/5 → 4/5 | s:mt ]",
-  "[ 4/5 → 1/1 | s:bd ]",
-  "[ 1/1 → 6/5 | s:bd ]",
-  "[ 6/5 → 7/5 | s:cp ]",
-  "[ 7/5 → 8/5 | s:bd ]",
-  "[ 8/5 → 9/5 | s:mt ]",
-  "[ 9/5 → 2/1 | s:bd ]",
-  "[ 2/1 → 11/5 | s:bd ]",
-  "[ 11/5 → 12/5 | s:cp ]",
-  "[ 12/5 → 13/5 | s:bd ]",
-  "[ 13/5 → 14/5 | s:mt ]",
-  "[ 14/5 → 3/1 | s:bd ]",
-  "[ 3/1 → 16/5 | s:bd ]",
-  "[ 16/5 → 17/5 | s:cp ]",
-  "[ 17/5 → 18/5 | s:bd ]",
-  "[ 18/5 → 19/5 | s:mt ]",
-  "[ 19/5 → 4/1 | s:bd ]",
-]
-`;
-
 exports[`runs examples > example "steps" example index 0 1`] = `
 [
   "[ 0/1 → 1/4 | s:bd ]",
@@ -7262,6 +7625,23 @@ exports[`runs examples > example "steps" example index 0 1`] = `
 ]
 `;
 
+exports[`runs examples > example "stretch" example index 0 1`] = `
+[
+  "[ (0/1 → 1/3) ⇝ 1/1 | s:gm_flute stretch:1 ]",
+  "[ 0/1 ⇜ (1/3 → 2/3) ⇝ 1/1 | s:gm_flute stretch:2 ]",
+  "[ 0/1 ⇜ (2/3 → 1/1) | s:gm_flute stretch:0.5 ]",
+  "[ (1/1 → 4/3) ⇝ 2/1 | s:gm_flute stretch:1 ]",
+  "[ 1/1 ⇜ (4/3 → 5/3) ⇝ 2/1 | s:gm_flute stretch:2 ]",
+  "[ 1/1 ⇜ (5/3 → 2/1) | s:gm_flute stretch:0.5 ]",
+  "[ (2/1 → 7/3) ⇝ 3/1 | s:gm_flute stretch:1 ]",
+  "[ 2/1 ⇜ (7/3 → 8/3) ⇝ 3/1 | s:gm_flute stretch:2 ]",
+  "[ 2/1 ⇜ (8/3 → 3/1) | s:gm_flute stretch:0.5 ]",
+  "[ (3/1 → 10/3) ⇝ 4/1 | s:gm_flute stretch:1 ]",
+  "[ 3/1 ⇜ (10/3 → 11/3) ⇝ 4/1 | s:gm_flute stretch:2 ]",
+  "[ 3/1 ⇜ (11/3 → 4/1) | s:gm_flute stretch:0.5 ]",
+]
+`;
+
 exports[`runs examples > example "striate" example index 0 1`] = `
 [
   "[ 0/1 → 1/6 | s:numbers n:0 begin:0 end:0.16666666666666666 ]",
@@ -7554,65 +7934,6 @@ exports[`runs examples > example "swingBy" example index 0 1`] = `
 ]
 `;
 
-exports[`runs examples > example "timecat" example index 0 1`] = `
-[
-  "[ 0/1 → 3/4 | note:e3 ]",
-  "[ 3/4 → 1/1 | note:g3 ]",
-  "[ 1/1 → 7/4 | note:e3 ]",
-  "[ 7/4 → 2/1 | note:g3 ]",
-  "[ 2/1 → 11/4 | note:e3 ]",
-  "[ 11/4 → 3/1 | note:g3 ]",
-  "[ 3/1 → 15/4 | note:e3 ]",
-  "[ 15/4 → 4/1 | note:g3 ]",
-]
-`;
-
-exports[`runs examples > example "timecat" example index 1 1`] = `
-[
-  "[ 0/1 → 1/5 | s:bd ]",
-  "[ 1/5 → 2/5 | s:sd ]",
-  "[ 2/5 → 3/5 | s:cp ]",
-  "[ 3/5 → 4/5 | s:hh ]",
-  "[ 4/5 → 1/1 | s:hh ]",
-  "[ 1/1 → 6/5 | s:bd ]",
-  "[ 6/5 → 7/5 | s:sd ]",
-  "[ 7/5 → 8/5 | s:cp ]",
-  "[ 8/5 → 9/5 | s:hh ]",
-  "[ 9/5 → 2/1 | s:hh ]",
-  "[ 2/1 → 11/5 | s:bd ]",
-  "[ 11/5 → 12/5 | s:sd ]",
-  "[ 12/5 → 13/5 | s:cp ]",
-  "[ 13/5 → 14/5 | s:hh ]",
-  "[ 14/5 → 3/1 | s:hh ]",
-  "[ 3/1 → 16/5 | s:bd ]",
-  "[ 16/5 → 17/5 | s:sd ]",
-  "[ 17/5 → 18/5 | s:cp ]",
-  "[ 18/5 → 19/5 | s:hh ]",
-  "[ 19/5 → 4/1 | s:hh ]",
-]
-`;
-
-exports[`runs examples > example "toTactus" example index 0 1`] = `
-[
-  "[ 0/1 → 1/4 | s:bd ]",
-  "[ 1/4 → 1/2 | s:sd ]",
-  "[ 1/2 → 3/4 | s:cp ]",
-  "[ 3/4 → 1/1 | s:bd ]",
-  "[ 1/1 → 5/4 | s:sd ]",
-  "[ 5/4 → 3/2 | s:cp ]",
-  "[ 3/2 → 7/4 | s:bd ]",
-  "[ 7/4 → 2/1 | s:sd ]",
-  "[ 2/1 → 9/4 | s:cp ]",
-  "[ 9/4 → 5/2 | s:bd ]",
-  "[ 5/2 → 11/4 | s:sd ]",
-  "[ 11/4 → 3/1 | s:cp ]",
-  "[ 3/1 → 13/4 | s:bd ]",
-  "[ 13/4 → 7/2 | s:sd ]",
-  "[ 7/2 → 15/4 | s:cp ]",
-  "[ 15/4 → 4/1 | s:bd ]",
-]
-`;
-
 exports[`runs examples > example "transpose" example index 0 1`] = `
 [
   "[ 0/1 → 1/4 | note:C2 ]",
diff --git a/test/__snapshots__/shared.test.mjs.snap b/test/__snapshots__/shared.test.mjs.snap
deleted file mode 100644
index 383bcded..00000000
--- a/test/__snapshots__/shared.test.mjs.snap
+++ /dev/null
@@ -1,6928 +0,0 @@
-// Vitest Snapshot v1
-
-exports[`renders shared tunes > shared tune 10 https://strudel.cc/?nLsPXvEPTcQF 1`] = `
-[
-  "0/1 -> 3/2: {\\"s\\":\\"bd\\",\\"speed\\":0.7519542165100574}",
-  "3/4 -> 3/2: {\\"s\\":\\"sd\\",\\"speed\\":0.7931522866332671}",
-  "3/8 -> 3/4: {\\"s\\":\\"hh\\",\\"speed\\":0.7285963821098448}",
-  "3/4 -> 9/8: {\\"s\\":\\"hh\\",\\"speed\\":0.77531205091027}",
-  "0/1 -> 3/2: {\\"n\\":33.129885541275144,\\"decay\\":0.15,\\"sustain\\":0,\\"s\\":\\"sawtooth\\",\\"gain\\":0.4,\\"cutoff\\":3669.6267869262615}",
-  "0/1 -> 3/2: {\\"n\\":33.17988554127514,\\"decay\\":0.15,\\"sustain\\":0,\\"s\\":\\"sawtooth\\",\\"gain\\":0.4,\\"cutoff\\":3669.6267869262615}",
-  "0/1 -> 3/2: {\\"n\\":55.129885541275144,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":59.129885541275144,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":60.129885541275144,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":64.12988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":55.16988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":59.16988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":60.16988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":64.16988554127515,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "3/16 -> 3/8: {\\"n\\":69.01266877519555,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/8 -> 9/16: {\\"n\\":69.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/8 -> 9/16: {\\"n\\":72.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/4 -> 15/16: {\\"n\\":72.16001184806132,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "15/16 -> 9/8: {\\"n\\":72.21301072199333,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/16 -> 3/8: {\\"n\\":69.05266877519557,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/8 -> 9/16: {\\"n\\":69.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/8 -> 9/16: {\\"n\\":72.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/4 -> 15/16: {\\"n\\":72.20001184806131,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "15/16 -> 9/8: {\\"n\\":72.25301072199335,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "0/1 -> 3/16: {\\"n\\":93.00057728554401,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "0/1 -> 3/16: {\\"n\\":93.04057728554402,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "3/8 -> 9/16: {\\"n\\":69.01266877519555,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "9/16 -> 3/4: {\\"n\\":69.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "9/16 -> 3/4: {\\"n\\":72.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "15/16 -> 9/8: {\\"n\\":72.16001184806132,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "3/8 -> 9/16: {\\"n\\":69.05266877519557,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "9/16 -> 3/4: {\\"n\\":69.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "9/16 -> 3/4: {\\"n\\":72.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "15/16 -> 9/8: {\\"n\\":72.20001184806131,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "3/16 -> 3/8: {\\"n\\":93.00057728554401,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "3/16 -> 3/8: {\\"n\\":93.04057728554402,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "9/16 -> 3/4: {\\"n\\":69.01266877519555,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "3/4 -> 15/16: {\\"n\\":69.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "3/4 -> 15/16: {\\"n\\":72.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "9/16 -> 3/4: {\\"n\\":69.05266877519557,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "3/4 -> 15/16: {\\"n\\":69.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "3/4 -> 15/16: {\\"n\\":72.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "0/1 -> 3/16: {\\"n\\":72.0468455057745,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "0/1 -> 3/16: {\\"n\\":93.0468455057745,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "3/8 -> 9/16: {\\"n\\":93.00057728554401,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "0/1 -> 3/16: {\\"n\\":72.0868455057745,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "0/1 -> 3/16: {\\"n\\":93.0868455057745,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "3/8 -> 9/16: {\\"n\\":93.04057728554402,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "3/4 -> 15/16: {\\"n\\":69.01266877519555,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "15/16 -> 9/8: {\\"n\\":69.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "3/4 -> 15/16: {\\"n\\":69.05266877519557,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "15/16 -> 9/8: {\\"n\\":69.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 11 https://strudel.cc/?ac7iGrXwBA_D 1`] = `
-[
-  "0/1 -> 3/2: {\\"s\\":\\"bd\\",\\"speed\\":0.7519542165100574}",
-  "3/4 -> 3/2: {\\"s\\":\\"sd\\",\\"speed\\":0.7931522866332671}",
-  "3/8 -> 3/4: {\\"s\\":\\"hh\\",\\"speed\\":0.7285963821098448}",
-  "3/4 -> 9/8: {\\"s\\":\\"hh\\",\\"speed\\":0.77531205091027}",
-  "0/1 -> 3/2: {\\"n\\":33.129885541275144,\\"decay\\":0.15,\\"sustain\\":0,\\"s\\":\\"sawtooth\\",\\"gain\\":0.4,\\"cutoff\\":3669.6267869262615}",
-  "0/1 -> 3/2: {\\"n\\":33.17988554127514,\\"decay\\":0.15,\\"sustain\\":0,\\"s\\":\\"sawtooth\\",\\"gain\\":0.4,\\"cutoff\\":3669.6267869262615}",
-  "0/1 -> 3/2: {\\"n\\":55.129885541275144,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":59.129885541275144,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":60.129885541275144,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":64.12988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":55.16988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":59.16988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":60.16988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":64.16988554127515,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "3/16 -> 3/8: {\\"n\\":69.01266877519555,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/8 -> 9/16: {\\"n\\":69.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/8 -> 9/16: {\\"n\\":72.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/4 -> 15/16: {\\"n\\":72.16001184806132,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "15/16 -> 9/8: {\\"n\\":72.21301072199333,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/16 -> 3/8: {\\"n\\":69.05266877519557,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/8 -> 9/16: {\\"n\\":69.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/8 -> 9/16: {\\"n\\":72.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/4 -> 15/16: {\\"n\\":72.20001184806131,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "15/16 -> 9/8: {\\"n\\":72.25301072199335,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "0/1 -> 3/16: {\\"n\\":93.00057728554401,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "0/1 -> 3/16: {\\"n\\":93.04057728554402,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "3/8 -> 9/16: {\\"n\\":69.01266877519555,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "9/16 -> 3/4: {\\"n\\":69.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "9/16 -> 3/4: {\\"n\\":72.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "15/16 -> 9/8: {\\"n\\":72.16001184806132,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "3/8 -> 9/16: {\\"n\\":69.05266877519557,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "9/16 -> 3/4: {\\"n\\":69.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "9/16 -> 3/4: {\\"n\\":72.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "15/16 -> 9/8: {\\"n\\":72.20001184806131,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "3/16 -> 3/8: {\\"n\\":93.00057728554401,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "3/16 -> 3/8: {\\"n\\":93.04057728554402,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "9/16 -> 3/4: {\\"n\\":69.01266877519555,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "3/4 -> 15/16: {\\"n\\":69.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "3/4 -> 15/16: {\\"n\\":72.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "9/16 -> 3/4: {\\"n\\":69.05266877519557,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "3/4 -> 15/16: {\\"n\\":69.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "3/4 -> 15/16: {\\"n\\":72.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "0/1 -> 3/16: {\\"n\\":72.0468455057745,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "0/1 -> 3/16: {\\"n\\":93.0468455057745,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "3/8 -> 9/16: {\\"n\\":93.00057728554401,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "0/1 -> 3/16: {\\"n\\":72.0868455057745,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "0/1 -> 3/16: {\\"n\\":93.0868455057745,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "3/8 -> 9/16: {\\"n\\":93.04057728554402,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "3/4 -> 15/16: {\\"n\\":69.01266877519555,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "15/16 -> 9/8: {\\"n\\":69.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "3/4 -> 15/16: {\\"n\\":69.05266877519557,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "15/16 -> 9/8: {\\"n\\":69.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 12 https://strudel.cc/?0l5OmIwd4Xhc 1`] = `
-[
-  "0/1 -> 3/1: {\\"n\\":\\"B3\\",\\"s\\":\\"0040_FluidR3_GM_sf2_file\\",\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.7,\\"cutoff\\":1111.7252990603447,\\"gain\\":0.3}",
-  "0/1 -> 3/1: {\\"n\\":\\"D4\\",\\"s\\":\\"0040_FluidR3_GM_sf2_file\\",\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.7,\\"cutoff\\":1111.7252990603447,\\"gain\\":0.3}",
-  "0/1 -> 3/1: {\\"n\\":\\"E4\\",\\"s\\":\\"0040_FluidR3_GM_sf2_file\\",\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.7,\\"cutoff\\":1111.7252990603447,\\"gain\\":0.3}",
-  "0/1 -> 3/1: {\\"n\\":\\"G4\\",\\"s\\":\\"0040_FluidR3_GM_sf2_file\\",\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.7,\\"cutoff\\":1111.7252990603447,\\"gain\\":0.3}",
-  "0/1 -> 9/2: {\\"n\\":\\"C5\\",\\"s\\":\\"0040_FluidR3_GM_sf2_file\\",\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.7,\\"cutoff\\":1111.7252990603447,\\"gain\\":0.3}",
-  "0/1 -> 3/4: {\\"n\\":\\"C2\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.7,\\"cutoff\\":864.536878321087,\\"gain\\":0.3}",
-  "0/1 -> 3/4: {\\"s\\":\\"bd\\",\\"speed\\":0.9107561463868479,\\"n\\":3}",
-  "3/4 -> 3/2: {\\"s\\":\\"sd\\",\\"speed\\":0.9931522866332672,\\"n\\":3}",
-  "0/1 -> 1/2: {\\"s\\":\\"hh\\",\\"speed\\":0.9036881079621337,\\"n\\":3}",
-  "1/2 -> 1/1: {\\"s\\":\\"hh\\",\\"speed\\":0.9519542165100575,\\"n\\":3}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 13 https://strudel.cc/?a5zB31-92Q7M 1`] = `
-[
-  "0/1 -> 1/1: {\\"s\\":\\"bd\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 14 https://strudel.cc/?ZNO6a_vBjz65 1`] = `
-[
-  "0/1 -> 2/3: F3",
-  "2/3 -> 1/1: Ab3",
-  "0/1 -> 2/3: Ab3",
-  "2/3 -> 1/1: C4",
-  "1/3 -> 5/12: Eb4",
-  "1/2 -> 7/12: Eb4",
-  "1/3 -> 5/12: G4",
-  "1/2 -> 7/12: G4",
-  "241/675 -> 49/75: F1",
-  "0/1 -> 2/3: c2",
-  "2/3 -> 4/3: c2",
-  "2/3 -> 4/3: c2",
-  "0/1 -> 1/3: c4",
-  "1/3 -> 2/3: c4",
-  "2/3 -> 1/1: c4",
-]
-`;
-
-exports[`renders shared tunes > shared tune 15 https://strudel.cc/?8sxdCCcYKcvp 1`] = `
-[
-  "0/1 -> 1/8: {\\"note\\":\\"A2\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2206.5338497506646,\\"resonance\\":10,\\"clip\\":1}",
-  "3/8 -> 1/2: {\\"note\\":\\"A2\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2827.098521493671,\\"resonance\\":10,\\"clip\\":1}",
-  "3/4 -> 7/8: {\\"note\\":\\"A2\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3366.0584981088073,\\"resonance\\":10,\\"clip\\":1}",
-  "0/1 -> 1/4: {\\"note\\":\\"A3\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2312.732504596285,\\"resonance\\":10,\\"clip\\":1}",
-  "3/4 -> 1/1: {\\"note\\":\\"A3\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3443.5028842544402,\\"resonance\\":10,\\"clip\\":1}",
-  "-7/4 -> 1/4: {\\"note\\":\\"C4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2312.732504596285,\\"resonance\\":10,\\"clip\\":1}",
-  "-7/4 -> 1/4: {\\"note\\":\\"E4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2312.732504596285,\\"resonance\\":10,\\"clip\\":1}",
-  "1/4 -> 1/2: {\\"note\\":\\"C4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "1/4 -> 1/2: {\\"note\\":\\"E4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/2 -> 1/2: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2522.789774516997,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/2 -> 1/2: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2522.789774516997,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/2 -> 1/2: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2522.789774516997,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/2 -> 1/2: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2522.789774516997,\\"resonance\\":10,\\"clip\\":1}",
-  "1/2 -> 3/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3110.8609453791396,\\"resonance\\":10,\\"clip\\":1}",
-  "1/2 -> 3/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3110.8609453791396,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "3/4 -> 1/1: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3443.5028842544402,\\"resonance\\":10,\\"clip\\":1}",
-  "3/4 -> 1/1: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3443.5028842544402,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/4 -> 5/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/4 -> 5/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/4 -> 5/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/4 -> 5/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 16 https://strudel.cc/?PIG8q54uhQ5h 1`] = `
-[
-  "0/1 -> 3/1: {\\"n\\":\\"B3\\",\\"s\\":\\"0040_FluidR3_GM_sf2_file\\",\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.7,\\"cutoff\\":1111.7252990603447,\\"gain\\":0.3}",
-  "0/1 -> 3/1: {\\"n\\":\\"D4\\",\\"s\\":\\"0040_FluidR3_GM_sf2_file\\",\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.7,\\"cutoff\\":1111.7252990603447,\\"gain\\":0.3}",
-  "0/1 -> 3/1: {\\"n\\":\\"E4\\",\\"s\\":\\"0040_FluidR3_GM_sf2_file\\",\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.7,\\"cutoff\\":1111.7252990603447,\\"gain\\":0.3}",
-  "0/1 -> 3/1: {\\"n\\":\\"G4\\",\\"s\\":\\"0040_FluidR3_GM_sf2_file\\",\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.7,\\"cutoff\\":1111.7252990603447,\\"gain\\":0.3}",
-  "0/1 -> 9/2: {\\"n\\":\\"C5\\",\\"s\\":\\"0040_FluidR3_GM_sf2_file\\",\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.7,\\"cutoff\\":1111.7252990603447,\\"gain\\":0.3}",
-  "0/1 -> 3/4: {\\"n\\":\\"C2\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.7,\\"cutoff\\":864.536878321087,\\"gain\\":0.3}",
-  "0/1 -> 3/4: {\\"s\\":\\"bd\\",\\"speed\\":0.9107561463868479,\\"n\\":3}",
-  "3/4 -> 3/2: {\\"s\\":\\"sd\\",\\"speed\\":0.9931522866332672,\\"n\\":3}",
-  "0/1 -> 1/2: {\\"s\\":\\"hh\\",\\"speed\\":0.9036881079621337,\\"n\\":3}",
-  "1/2 -> 1/1: {\\"s\\":\\"hh\\",\\"speed\\":0.9519542165100575,\\"n\\":3}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 18 https://strudel.cc/?RyZi9bqqcQku 1`] = `
-[
-  "0/1 -> 4/3: B4",
-  "0/1 -> 1/3: C3",
-  "1/3 -> 2/3: G3",
-  "2/3 -> 2/1: E4",
-]
-`;
-
-exports[`renders shared tunes > shared tune 19 https://strudel.cc/?83h9X6BCipLc 1`] = `
-[
-  "0/1 -> 3/4: F4",
-  "0/1 -> 3/4: Bb4",
-  "0/1 -> 3/4: D5",
-  "3/4 -> 5/4: D4",
-  "3/4 -> 5/4: G4",
-  "3/4 -> 5/4: Bb4",
-  "0/1 -> 3/4: G3",
-  "3/4 -> 3/2: G3",
-]
-`;
-
-exports[`renders shared tunes > shared tune 20 https://strudel.cc/?Ii6-cLJkxdw9 1`] = `
-[
-  "0/1 -> 1/10: C3",
-  "0/1 -> 1/10: E3",
-  "0/1 -> 1/10: G3",
-  "1/4 -> 7/20: B3",
-  "1/4 -> 7/20: E4",
-  "1/4 -> 7/20: E3",
-  "1/2 -> 3/5: C3",
-  "1/2 -> 3/5: A2",
-  "1/2 -> 3/5: C3",
-  "3/4 -> 17/20: E3",
-  "3/4 -> 17/20: G3",
-  "3/4 -> 17/20: B3",
-  "0/1 -> 1/5: C2",
-  "1/2 -> 7/10: E2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 21 https://strudel.cc/?-QCLFGNo4Q3J 1`] = `
-[
-  "0/1 -> 1/4: {\\"n\\":62,\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000}",
-  "1/2 -> 5/8: {\\"n\\":50,\\"s\\":\\"square\\",\\"cutoff\\":2000}",
-  "3/4 -> 7/8: {\\"n\\":41,\\"s\\":\\"square\\",\\"cutoff\\":2000}",
-  "1/4 -> 1/2: {\\"n\\":74,\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000}",
-  "3/4 -> 7/8: {\\"n\\":62,\\"s\\":\\"square\\",\\"cutoff\\":2000}",
-  "0/1 -> 1/4: {\\"n\\":43,\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000}",
-  "1/2 -> 3/4: {\\"n\\":69,\\"s\\":\\"square\\",\\"cutoff\\":2000}",
-  "1/4 -> 1/2: {\\"n\\":55,\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000}",
-  "3/4 -> 1/1: {\\"n\\":81,\\"s\\":\\"square\\",\\"cutoff\\":2000}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 22 https://strudel.cc/?vwau_1P_anLs 1`] = `
-[
-  "1/8 -> 1/4: {\\"n\\":\\"D1\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1699.6897509708342}",
-  "1/8 -> 1/4: {\\"n\\":\\"D1\\",\\"s\\":\\"square\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1699.6897509708342}",
-  "3/8 -> 1/2: {\\"n\\":\\"D2\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1765.826371664994}",
-  "3/8 -> 1/2: {\\"n\\":\\"D2\\",\\"s\\":\\"square\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1765.826371664994}",
-  "1/2 -> 5/8: {\\"n\\":\\"D1\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1798.799979846742}",
-  "1/2 -> 5/8: {\\"n\\":\\"D1\\",\\"s\\":\\"square\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1798.799979846742}",
-  "3/4 -> 7/8: {\\"n\\":\\"D3\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1864.4584935007128}",
-  "3/4 -> 7/8: {\\"n\\":\\"D3\\",\\"s\\":\\"square\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1864.4584935007128}",
-  "7/8 -> 1/1: {\\"n\\":\\"D3\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1897.1038487394403}",
-  "7/8 -> 1/1: {\\"n\\":\\"D3\\",\\"s\\":\\"square\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1897.1038487394403}",
-  "-3/8 -> 1/8: {\\"n\\":\\"G3\\",\\"s\\":\\"square\\",\\"gain\\":0.7,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0,\\"cutoff\\":1666.5665766857219}",
-  "-3/8 -> 1/8: {\\"n\\":\\"B3\\",\\"s\\":\\"square\\",\\"gain\\":0.7,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0,\\"cutoff\\":1666.5665766857219}",
-  "-1/4 -> 1/4: {\\"n\\":\\"G3\\",\\"s\\":\\"square\\",\\"gain\\":0.7,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0,\\"cutoff\\":1683.1306585059317}",
-  "-1/4 -> 1/4: {\\"n\\":\\"B3\\",\\"s\\":\\"square\\",\\"gain\\":0.7,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0,\\"cutoff\\":1683.1306585059317}",
-  "-1/8 -> 3/8: {\\"n\\":\\"G3\\",\\"s\\":\\"square\\",\\"gain\\":0.7,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0,\\"cutoff\\":1699.6897509708342}",
-  "-1/8 -> 3/8: {\\"n\\":\\"B3\\",\\"s\\":\\"square\\",\\"gain\\":0.7,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0,\\"cutoff\\":1699.6897509708342}",
-  "0/1 -> 3/8: {\\"n\\":\\"C#6\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.26103468453995016,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5998.072590601808,\\"cutoff\\":4000}",
-  "0/1 -> 3/8: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.26103468453995016,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5998.072590601808,\\"cutoff\\":4000}",
-  "0/1 -> 3/8: {\\"n\\":\\"E5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.26103468453995016,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5998.072590601808,\\"cutoff\\":4000}",
-  "0/1 -> 3/8: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.26103468453995016,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5998.072590601808,\\"cutoff\\":4000}",
-  "3/8 -> 3/4: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2828651860235305,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5982.671142387316,\\"cutoff\\":4000}",
-  "3/8 -> 3/4: {\\"n\\":\\"F#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2828651860235305,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5982.671142387316,\\"cutoff\\":4000}",
-  "3/8 -> 3/4: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2828651860235305,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5982.671142387316,\\"cutoff\\":4000}",
-  "3/8 -> 3/4: {\\"n\\":\\"A4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2828651860235305,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5982.671142387316,\\"cutoff\\":4000}",
-  "3/4 -> 1/1: {\\"n\\":\\"F#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.300533478008833,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5958.137268909887,\\"cutoff\\":4000}",
-  "3/4 -> 1/1: {\\"n\\":\\"A4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.300533478008833,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5958.137268909887,\\"cutoff\\":4000}",
-  "1/4 -> 5/8: {\\"n\\":\\"C#6\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2756442833140452,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5989.512318936654,\\"cutoff\\":4000}",
-  "1/4 -> 5/8: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2756442833140452,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5989.512318936654,\\"cutoff\\":4000}",
-  "1/4 -> 5/8: {\\"n\\":\\"E5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2756442833140452,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5989.512318936654,\\"cutoff\\":4000}",
-  "1/4 -> 5/8: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2756442833140452,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5989.512318936654,\\"cutoff\\":4000}",
-  "5/8 -> 1/1: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.29705226105983373,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5963.890147645195,\\"cutoff\\":4000}",
-  "5/8 -> 1/1: {\\"n\\":\\"F#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.29705226105983373,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5963.890147645195,\\"cutoff\\":4000}",
-  "5/8 -> 1/1: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.29705226105983373,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5963.890147645195,\\"cutoff\\":4000}",
-  "5/8 -> 1/1: {\\"n\\":\\"A4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.29705226105983373,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5963.890147645195,\\"cutoff\\":4000}",
-  "1/2 -> 7/8: {\\"n\\":\\"C#6\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.29000691362123476,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5974.128467049176,\\"cutoff\\":4000}",
-  "1/2 -> 7/8: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.29000691362123476,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5974.128467049176,\\"cutoff\\":4000}",
-  "1/2 -> 7/8: {\\"n\\":\\"E5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.29000691362123476,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5974.128467049176,\\"cutoff\\":4000}",
-  "1/2 -> 7/8: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.29000691362123476,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5974.128467049176,\\"cutoff\\":4000}",
-  "7/8 -> 5/4: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.3107861971007485,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5938.355801271282,\\"cutoff\\":4000}",
-  "7/8 -> 5/4: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.3107861971007485,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5938.355801271282,\\"cutoff\\":4000}",
-  "3/4 -> 9/8: {\\"n\\":\\"C#6\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.30398425548024827,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5951.963201008076,\\"cutoff\\":4000}",
-  "3/4 -> 9/8: {\\"n\\":\\"E5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.30398425548024827,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5951.963201008076,\\"cutoff\\":4000}",
-  "0/1 -> 1/4: {\\"n\\":\\"F#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2573601511491127,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.143312438893,\\"cutoff\\":4000}",
-  "0/1 -> 1/4: {\\"n\\":\\"A4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2573601511491127,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.143312438893,\\"cutoff\\":4000}",
-  "-1/8 -> 1/4: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2573601511491127,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.143312438893,\\"cutoff\\":4000}",
-  "-1/8 -> 1/4: {\\"n\\":\\"F#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2573601511491127,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.143312438893,\\"cutoff\\":4000}",
-  "-1/8 -> 1/4: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2573601511491127,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.143312438893,\\"cutoff\\":4000}",
-  "-1/8 -> 1/4: {\\"n\\":\\"A4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2573601511491127,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.143312438893,\\"cutoff\\":4000}",
-  "1/4 -> 1/2: {\\"n\\":\\"F#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.27200957116830426,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5992.29333433282,\\"cutoff\\":4000}",
-  "1/4 -> 1/2: {\\"n\\":\\"A4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.27200957116830426,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5992.29333433282,\\"cutoff\\":4000}",
-  "-1/4 -> 1/8: {\\"n\\":\\"C#6\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2536811842784369,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.785818935017,\\"cutoff\\":4000}",
-  "-1/4 -> 1/8: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2536811842784369,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.785818935017,\\"cutoff\\":4000}",
-  "-1/4 -> 1/8: {\\"n\\":\\"E5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2536811842784369,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.785818935017,\\"cutoff\\":4000}",
-  "-1/4 -> 1/8: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2536811842784369,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.785818935017,\\"cutoff\\":4000}",
-  "1/8 -> 1/2: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.26836160127988246,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5994.647308096509,\\"cutoff\\":4000}",
-  "1/8 -> 1/2: {\\"n\\":\\"F#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.26836160127988246,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5994.647308096509,\\"cutoff\\":4000}",
-  "1/8 -> 1/2: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.26836160127988246,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5994.647308096509,\\"cutoff\\":4000}",
-  "1/8 -> 1/2: {\\"n\\":\\"A4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.26836160127988246,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5994.647308096509,\\"cutoff\\":4000}",
-  "1/2 -> 3/4: {\\"n\\":\\"F#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.28644702698548963,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5978.612153434527,\\"cutoff\\":4000}",
-  "1/2 -> 3/4: {\\"n\\":\\"A4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.28644702698548963,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5978.612153434527,\\"cutoff\\":4000}",
-  "0/1 -> 1/4: bd",
-  "1/2 -> 3/4: bd",
-  "1/2 -> 1/1: sn",
-  "1/4 -> 1/2: hh3",
-  "3/4 -> 1/1: hh3",
-]
-`;
-
-exports[`renders shared tunes > shared tune 23 https://strudel.cc/?wVExAEFBUPQB 1`] = `
-[
-  "0/1 -> 1/4: {\\"note\\":\\"F3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.49537037037037035}",
-  "0/1 -> 1/4: {\\"note\\":\\"A3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5138888888888888}",
-  "0/1 -> 1/4: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "0/1 -> 1/4: {\\"note\\":\\"E4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5462962962962963}",
-  "3/4 -> 1/1: {\\"note\\":\\"F3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.49537037037037035}",
-  "3/4 -> 1/1: {\\"note\\":\\"A3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5138888888888888}",
-  "3/4 -> 1/1: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "3/4 -> 1/1: {\\"note\\":\\"E4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5462962962962963}",
-  "0/1 -> 19/20: {\\"note\\":\\"D2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.42592592592592593}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 24 https://strudel.cc/?C8mMgTmvsnue 1`] = `
-[
-  "0/1 -> 1/10: C3",
-  "0/1 -> 1/10: E3",
-  "0/1 -> 1/10: G3",
-  "1/4 -> 7/20: B3",
-  "1/4 -> 7/20: E4",
-  "1/4 -> 7/20: E3",
-  "1/2 -> 3/5: C3",
-  "1/2 -> 3/5: A2",
-  "1/2 -> 3/5: C3",
-  "3/4 -> 17/20: E3",
-  "3/4 -> 17/20: G3",
-  "3/4 -> 17/20: B3",
-  "0/1 -> 1/5: C2",
-  "1/2 -> 7/10: E2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 25 https://strudel.cc/?EeNsQ8hdNZwN 1`] = `
-[
-  "0/1 -> 1/10: C3",
-  "0/1 -> 1/10: E3",
-  "0/1 -> 1/10: G3",
-  "1/4 -> 7/20: B3",
-  "1/4 -> 7/20: E4",
-  "1/4 -> 7/20: E3",
-  "1/2 -> 3/5: C3",
-  "1/2 -> 3/5: A2",
-  "1/2 -> 3/5: C3",
-  "3/4 -> 17/20: E3",
-  "3/4 -> 17/20: G3",
-  "3/4 -> 17/20: B3",
-  "0/1 -> 1/5: C2",
-  "1/2 -> 7/10: E2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 26 https://strudel.cc/?AoWRw1oZkytb 1`] = `
-[
-  "0/1 -> 1/2: e5",
-  "1/2 -> 3/4: b4",
-  "3/4 -> 1/1: c5",
-  "0/1 -> 1/4: e2",
-  "1/4 -> 1/2: e3",
-  "1/2 -> 3/4: e2",
-  "3/4 -> 1/1: e3",
-]
-`;
-
-exports[`renders shared tunes > shared tune 27 https://strudel.cc/?UaTcY5YrOahl 1`] = `
-[
-  "-1666666666666667/7500000000000000 -> 2/9: G3",
-  "0/1 -> 4/3: E3",
-  "0/1 -> 4/3: A3",
-  "0/1 -> 4/3: D4",
-  "0/1 -> 4/3: G4",
-  "0/1 -> 4/3: B4",
-  "0/1 -> 2/3: D2",
-  "2/3 -> 7/9: D2",
-  "8/9 -> 1/1: D2",
-  "0/1 -> 2/9: c1",
-  "2/9 -> 4/9: c1",
-  "4/9 -> 2/3: c1",
-  "2/3 -> 8/9: c1",
-  "8/9 -> 10/9: c1",
-  "2/3 -> 4/3: c3",
-  "0/1 -> 10/9: c1",
-  "0/1 -> 16/3: F3",
-  "0/1 -> 16/3: A3",
-]
-`;
-
-exports[`renders shared tunes > shared tune 28 https://strudel.cc/?YPLI4xhBDMpV 1`] = `
-[
-  "0/1 -> 1/1: bd",
-  "0/1 -> 1/4: hh",
-  "1/4 -> 1/2: hh",
-  "1/2 -> 3/4: hh",
-  "3/4 -> 1/1: hh",
-  "1/2 -> 1/1: sn",
-]
-`;
-
-exports[`renders shared tunes > shared tune 29 https://strudel.cc/?amB31Tm55hnv 1`] = `
-[
-  "0/1 -> 1/4: B3",
-  "0/1 -> 1/4: D4",
-  "0/1 -> 1/4: E4",
-  "0/1 -> 1/4: G4",
-  "1/4 -> 1/2: C4",
-  "1/4 -> 1/2: E4",
-  "1/4 -> 1/2: F4",
-  "1/4 -> 1/2: A4",
-  "1/2 -> 3/4: A3",
-  "1/2 -> 3/4: C4",
-  "1/2 -> 3/4: E4",
-  "1/2 -> 3/4: G4",
-  "3/4 -> 1/1: B3",
-  "3/4 -> 1/1: E4",
-  "3/4 -> 1/1: F4",
-  "3/4 -> 1/1: A4",
-  "0/1 -> 1/2: C2",
-  "1/2 -> 1/1: D2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 30 https://strudel.cc/?8OyCVeBYuqru 1`] = `
-[
-  "0/1 -> 4/3: B4",
-  "0/1 -> 1/3: C3",
-  "1/3 -> 2/3: G3",
-  "2/3 -> 2/1: E4",
-]
-`;
-
-exports[`renders shared tunes > shared tune 31 https://strudel.cc/?lzjNrzv5qXL2 1`] = `
-[
-  "0/1 -> 1/3: bd",
-  "1/3 -> 2/3: hh",
-  "2/3 -> 1/1: sn",
-  "0/1 -> 1/20: G4",
-  "1/6 -> 13/60: G4",
-  "1/3 -> 23/60: B3",
-  "1/2 -> 11/20: B3",
-  "1/3 -> 23/60: E4",
-  "1/2 -> 11/20: E4",
-  "2/3 -> 43/60: G3",
-  "5/6 -> 53/60: G3",
-  "0/1 -> 4/3: c2",
-  "0/1 -> 4/3: c2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 32 https://strudel.cc/?b5ZZnwaI-UuT 1`] = `
-[
-  "0/1 -> 7/5: {\\"s\\":\\"bd\\",\\"speed\\":0.7779313247650861}",
-  "7/10 -> 7/5: {\\"s\\":\\"sd\\",\\"speed\\":0.8397284299499006}",
-  "0/1 -> 7/20: {\\"s\\":\\"hh\\",\\"speed\\":0.7025019456070822}",
-  "7/20 -> 7/10: {\\"s\\":\\"hh\\",\\"speed\\":0.7428945731647673}",
-  "7/10 -> 21/20: {\\"s\\":\\"hh\\",\\"speed\\":0.812968076365405}",
-  "0/1 -> 7/5: {\\"n\\":33.129885541275144,\\"decay\\":0.15,\\"sustain\\":0,\\"s\\":\\"sawtooth\\",\\"gain\\":0.4,\\"cutoff\\":3669.6267869262615}",
-  "0/1 -> 7/5: {\\"n\\":33.17988554127514,\\"decay\\":0.15,\\"sustain\\":0,\\"s\\":\\"sawtooth\\",\\"gain\\":0.4,\\"cutoff\\":3669.6267869262615}",
-  "0/1 -> 7/5: {\\"n\\":55.129885541275144,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 7/5: {\\"n\\":59.129885541275144,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 7/5: {\\"n\\":60.129885541275144,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 7/5: {\\"n\\":64.12988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 7/5: {\\"n\\":55.16988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 7/5: {\\"n\\":59.16988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 7/5: {\\"n\\":60.16988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 7/5: {\\"n\\":64.16988554127515,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "7/40 -> 7/20: {\\"n\\":69.01266877519555,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "7/20 -> 21/40: {\\"n\\":69.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "7/20 -> 21/40: {\\"n\\":72.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "7/10 -> 7/8: {\\"n\\":72.16001184806132,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "7/8 -> 21/20: {\\"n\\":72.21301072199333,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "7/8 -> 21/20: {\\"n\\":88.21301072199333,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "7/40 -> 7/20: {\\"n\\":69.05266877519557,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "7/20 -> 21/40: {\\"n\\":69.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "7/20 -> 21/40: {\\"n\\":72.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "7/10 -> 7/8: {\\"n\\":72.20001184806131,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "7/8 -> 21/20: {\\"n\\":72.25301072199335,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "7/8 -> 21/20: {\\"n\\":88.25301072199335,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "0/1 -> 7/40: {\\"n\\":93.00057728554401,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "0/1 -> 7/40: {\\"n\\":93.04057728554402,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "7/20 -> 21/40: {\\"n\\":69.01266877519555,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "21/40 -> 7/10: {\\"n\\":69.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "21/40 -> 7/10: {\\"n\\":72.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "7/8 -> 21/20: {\\"n\\":72.16001184806132,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "7/20 -> 21/40: {\\"n\\":69.05266877519557,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "21/40 -> 7/10: {\\"n\\":69.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "21/40 -> 7/10: {\\"n\\":72.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "7/8 -> 21/20: {\\"n\\":72.20001184806131,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "7/40 -> 7/20: {\\"n\\":93.00057728554401,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "7/40 -> 7/20: {\\"n\\":93.04057728554402,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "21/40 -> 7/10: {\\"n\\":69.01266877519555,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "7/10 -> 7/8: {\\"n\\":69.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "7/10 -> 7/8: {\\"n\\":72.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "21/40 -> 7/10: {\\"n\\":69.05266877519557,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "7/10 -> 7/8: {\\"n\\":69.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "7/10 -> 7/8: {\\"n\\":72.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "0/1 -> 7/40: {\\"n\\":72.0468455057745,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "0/1 -> 7/40: {\\"n\\":93.0468455057745,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "7/20 -> 21/40: {\\"n\\":93.00057728554401,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "0/1 -> 7/40: {\\"n\\":72.0868455057745,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "0/1 -> 7/40: {\\"n\\":93.0868455057745,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "7/20 -> 21/40: {\\"n\\":93.04057728554402,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "7/10 -> 7/8: {\\"n\\":69.01266877519555,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "7/8 -> 21/20: {\\"n\\":69.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "7/8 -> 21/20: {\\"n\\":72.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "7/10 -> 7/8: {\\"n\\":69.05266877519557,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "7/8 -> 21/20: {\\"n\\":69.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "7/8 -> 21/20: {\\"n\\":72.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 33 https://strudel.cc/?YZksJ_k4TsrS 1`] = `
-[
-  "0/1 -> 5/8: F#5",
-  "5/8 -> 5/4: D5",
-  "0/1 -> 5/8: A#3",
-  "0/1 -> 5/8: C#4",
-  "0/1 -> 5/8: D#4",
-  "0/1 -> 5/8: F#4",
-  "5/8 -> 5/4: F#3",
-  "5/8 -> 5/4: B3",
-  "5/8 -> 5/4: C4",
-  "5/8 -> 5/4: E4",
-  "0/1 -> 5/8: B2",
-  "5/8 -> 5/4: D2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 34 https://strudel.cc/?e9-pyQN6vY8E 1`] = `
-[
-  "0/1 -> 2/1: {\\"note\\":\\"D3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.4814814814814815}",
-  "0/1 -> 2/1: {\\"note\\":\\"D3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.4814814814814815}",
-  "0/1 -> 1/3: {\\"note\\":\\"C#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5324074074074074}",
-  "1/6 -> 1/2: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/3 -> 2/3: {\\"note\\":\\"C#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5324074074074074}",
-  "1/2 -> 5/6: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "2/3 -> 1/1: {\\"note\\":\\"C#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5324074074074074}",
-  "5/6 -> 7/6: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "5/6 -> 7/6: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "0/1 -> 2/1: {\\"note\\":\\"A3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5138888888888888}",
-  "0/1 -> 2/1: {\\"note\\":\\"A3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5138888888888888}",
-  "0/1 -> 2/1: {\\"note\\":\\"G3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5046296296296297}",
-  "0/1 -> 2/1: {\\"note\\":\\"G3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5046296296296297}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 35 https://strudel.cc/?ar2sdYnjIBLm 1`] = `
-[
-  "0/1 -> 5/8: F#5",
-  "5/8 -> 5/4: D5",
-  "0/1 -> 5/8: A#3",
-  "0/1 -> 5/8: C#4",
-  "0/1 -> 5/8: D#4",
-  "0/1 -> 5/8: F#4",
-  "5/8 -> 5/4: F#3",
-  "5/8 -> 5/4: B3",
-  "5/8 -> 5/4: C4",
-  "5/8 -> 5/4: E4",
-  "0/1 -> 5/8: B2",
-  "5/8 -> 5/4: D2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 38 https://strudel.cc/?RDyvc3SOo6kX 1`] = `[]`;
-
-exports[`renders shared tunes > shared tune 39 https://strudel.cc/?E9HzjWmePz3x 1`] = `
-[
-  "0/1 -> 1/2: c1",
-  "1/2 -> 1/1: c1",
-  "1/2 -> 1/1: x",
-  "1/4 -> 1/2: c4",
-  "3/4 -> 1/1: c4",
-  "0/1 -> 1/2: B1",
-  "3/4 -> 1/1: B1",
-  "1/4 -> 13/44: A3",
-  "1/4 -> 13/44: C#4",
-  "1/4 -> 13/44: D4",
-  "1/4 -> 13/44: F#4",
-]
-`;
-
-exports[`renders shared tunes > shared tune 40 https://strudel.cc/?qk6JW1Bmi26s 1`] = `
-[
-  "0/1 -> 1/1: {\\"n\\":\\"C2\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":500}",
-  "1/2 -> 3/5: {\\"note\\":\\"Bb3\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000,\\"gain\\":0.6}",
-  "1/2 -> 3/5: {\\"note\\":\\"D4\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000,\\"gain\\":0.6}",
-  "1/2 -> 3/5: {\\"note\\":\\"Eb4\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000,\\"gain\\":0.6}",
-  "1/2 -> 3/5: {\\"note\\":\\"G4\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000,\\"gain\\":0.6}",
-  "-3/8 -> -11/40: {\\"note\\":\\"B3\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000,\\"gain\\":0.6}",
-  "-3/8 -> -11/40: {\\"note\\":\\"Eb4\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000,\\"gain\\":0.6}",
-  "-3/8 -> -11/40: {\\"note\\":\\"F4\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000,\\"gain\\":0.6}",
-  "-3/8 -> -11/40: {\\"note\\":\\"Ab4\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000,\\"gain\\":0.6}",
-  "5/8 -> 29/40: {\\"note\\":\\"Bb3\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000,\\"gain\\":0.6}",
-  "5/8 -> 29/40: {\\"note\\":\\"D4\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000,\\"gain\\":0.6}",
-  "5/8 -> 29/40: {\\"note\\":\\"Eb4\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000,\\"gain\\":0.6}",
-  "5/8 -> 29/40: {\\"note\\":\\"G4\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000,\\"gain\\":0.6}",
-  "-1/4 -> -3/20: {\\"note\\":\\"B3\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000,\\"gain\\":0.6}",
-  "-1/4 -> -3/20: {\\"note\\":\\"Eb4\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000,\\"gain\\":0.6}",
-  "-1/4 -> -3/20: {\\"note\\":\\"F4\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000,\\"gain\\":0.6}",
-  "-1/4 -> -3/20: {\\"note\\":\\"Ab4\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000,\\"gain\\":0.6}",
-  "3/4 -> 17/20: {\\"note\\":\\"Bb3\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000,\\"gain\\":0.6}",
-  "3/4 -> 17/20: {\\"note\\":\\"D4\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000,\\"gain\\":0.6}",
-  "3/4 -> 17/20: {\\"note\\":\\"Eb4\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000,\\"gain\\":0.6}",
-  "3/4 -> 17/20: {\\"note\\":\\"G4\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000,\\"gain\\":0.6}",
-  "-1/8 -> -1/40: {\\"note\\":\\"B3\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000,\\"gain\\":0.6}",
-  "-1/8 -> -1/40: {\\"note\\":\\"Eb4\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000,\\"gain\\":0.6}",
-  "-1/8 -> -1/40: {\\"note\\":\\"F4\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000,\\"gain\\":0.6}",
-  "-1/8 -> -1/40: {\\"note\\":\\"Ab4\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000,\\"gain\\":0.6}",
-  "7/8 -> 39/40: {\\"note\\":\\"Bb3\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000,\\"gain\\":0.6}",
-  "7/8 -> 39/40: {\\"note\\":\\"D4\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000,\\"gain\\":0.6}",
-  "7/8 -> 39/40: {\\"note\\":\\"Eb4\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000,\\"gain\\":0.6}",
-  "7/8 -> 39/40: {\\"note\\":\\"G4\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000,\\"gain\\":0.6}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 41 https://strudel.cc/?c59geCmbANy8 1`] = `
-[
-  "0/1 -> 1/3: C3",
-  "1/3 -> 2/3: E3",
-  "2/3 -> 1/1: G3",
-]
-`;
-
-exports[`renders shared tunes > shared tune 42 https://strudel.cc/?WD53HbM4B3Xf 1`] = `
-[
-  "0/1 -> 1/3: C3",
-  "1/3 -> 2/3: E3",
-  "2/3 -> 1/1: G3",
-  "-1/12 -> 1/4: F6",
-  "1/4 -> 7/12: C3",
-  "7/12 -> 11/12: E3",
-  "11/12 -> 5/4: G3",
-  "-1/6 -> 1/6: C6",
-  "1/6 -> 1/2: F6",
-  "1/2 -> 5/6: C3",
-  "5/6 -> 7/6: E3",
-  "-1/4 -> 1/12: A5",
-  "1/12 -> 5/12: C6",
-  "5/12 -> 3/4: F6",
-  "3/4 -> 13/12: C3",
-]
-`;
-
-exports[`renders shared tunes > shared tune 43 https://strudel.cc/?g7c_nZZ1fVJS 1`] = `
-[
-  "0/1 -> 1/3: C3",
-  "1/3 -> 2/3: E3",
-  "2/3 -> 1/1: G3",
-  "-1/12 -> 1/4: F6",
-  "1/4 -> 7/12: C3",
-  "7/12 -> 11/12: E3",
-  "11/12 -> 5/4: G3",
-  "-1/6 -> 1/6: C6",
-  "1/6 -> 1/2: F6",
-  "1/2 -> 5/6: C3",
-  "5/6 -> 7/6: E3",
-  "-1/4 -> 1/12: A5",
-  "1/12 -> 5/12: C6",
-  "5/12 -> 3/4: F6",
-  "3/4 -> 13/12: C3",
-]
-`;
-
-exports[`renders shared tunes > shared tune 44 https://strudel.cc/?Don6HOPD2Wwc 1`] = `
-[
-  "0/1 -> 1/3: C3",
-  "1/3 -> 2/3: E3",
-  "2/3 -> 1/1: G3",
-  "1/20 -> 3/20: C5",
-  "3/20 -> 1/4: C5",
-  "1/20 -> 3/20: F5",
-  "3/20 -> 1/4: F5",
-  "1/20 -> 3/20: A5",
-  "3/20 -> 1/4: A5",
-  "1/20 -> 3/20: C6",
-  "3/20 -> 1/4: C6",
-  "1/20 -> 3/20: F6",
-  "3/20 -> 1/4: F6",
-  "1/4 -> 7/12: C3",
-  "7/12 -> 11/12: E3",
-  "11/12 -> 5/4: G3",
-  "3/10 -> 2/5: C5",
-  "2/5 -> 1/2: C5",
-  "3/10 -> 2/5: F5",
-  "2/5 -> 1/2: F5",
-  "3/10 -> 2/5: A5",
-  "2/5 -> 1/2: A5",
-  "3/10 -> 2/5: C6",
-  "2/5 -> 1/2: C6",
-  "3/10 -> 2/5: F6",
-  "2/5 -> 1/2: F6",
-  "1/2 -> 5/6: C3",
-  "5/6 -> 7/6: E3",
-  "11/20 -> 13/20: C5",
-  "13/20 -> 3/4: C5",
-  "11/20 -> 13/20: F5",
-  "13/20 -> 3/4: F5",
-  "11/20 -> 13/20: A5",
-  "13/20 -> 3/4: A5",
-  "11/20 -> 13/20: C6",
-  "13/20 -> 3/4: C6",
-  "11/20 -> 13/20: F6",
-  "13/20 -> 3/4: F6",
-  "3/4 -> 13/12: C3",
-  "4/5 -> 9/10: C5",
-  "9/10 -> 1/1: C5",
-  "4/5 -> 9/10: F5",
-  "9/10 -> 1/1: F5",
-  "4/5 -> 9/10: A5",
-  "9/10 -> 1/1: A5",
-  "4/5 -> 9/10: C6",
-  "9/10 -> 1/1: C6",
-  "4/5 -> 9/10: F6",
-  "9/10 -> 1/1: F6",
-  "-1/12 -> 1/4: F6",
-]
-`;
-
-exports[`renders shared tunes > shared tune 45 https://strudel.cc/?T8n8F1Fvew9g 1`] = `
-[
-  "0/1 -> 1/3: C3",
-  "1/3 -> 2/3: E3",
-  "2/3 -> 1/1: G3",
-  "0/1 -> 1/8: C5",
-  "1/8 -> 1/4: C5",
-  "0/1 -> 1/8: F5",
-  "1/8 -> 1/4: F5",
-  "0/1 -> 1/8: A5",
-  "1/8 -> 1/4: A5",
-  "0/1 -> 1/8: C6",
-  "1/8 -> 1/4: C6",
-  "0/1 -> 1/8: F6",
-  "1/8 -> 1/4: F6",
-  "1/4 -> 7/12: C3",
-  "7/12 -> 11/12: E3",
-  "11/12 -> 5/4: G3",
-  "1/4 -> 3/8: C5",
-  "3/8 -> 1/2: C5",
-  "1/4 -> 3/8: F5",
-  "3/8 -> 1/2: F5",
-  "1/4 -> 3/8: A5",
-  "3/8 -> 1/2: A5",
-  "1/4 -> 3/8: C6",
-  "3/8 -> 1/2: C6",
-  "1/4 -> 3/8: F6",
-  "3/8 -> 1/2: F6",
-  "1/2 -> 5/6: C3",
-  "5/6 -> 7/6: E3",
-  "1/2 -> 5/8: C5",
-  "5/8 -> 3/4: C5",
-  "1/2 -> 5/8: F5",
-  "5/8 -> 3/4: F5",
-  "1/2 -> 5/8: A5",
-  "5/8 -> 3/4: A5",
-  "1/2 -> 5/8: C6",
-  "5/8 -> 3/4: C6",
-  "1/2 -> 5/8: F6",
-  "5/8 -> 3/4: F6",
-  "3/4 -> 13/12: C3",
-  "3/4 -> 7/8: C5",
-  "7/8 -> 1/1: C5",
-  "3/4 -> 7/8: F5",
-  "7/8 -> 1/1: F5",
-  "3/4 -> 7/8: A5",
-  "7/8 -> 1/1: A5",
-  "3/4 -> 7/8: C6",
-  "7/8 -> 1/1: C6",
-  "3/4 -> 7/8: F6",
-  "7/8 -> 1/1: F6",
-  "-1/12 -> 1/4: F6",
-]
-`;
-
-exports[`renders shared tunes > shared tune 46 https://strudel.cc/?wj1_oPJEGjUu 1`] = `
-[
-  "1/2 -> 1/1: a4",
-  "3/4 -> 1/1: a1",
-  "1/2 -> 3/4: a2",
-  "1/4 -> 1/2: a1",
-  "0/1 -> 1/4: a2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 47 https://strudel.cc/?0KNPD8AmV-ms 1`] = `
-[
-  "0/1 -> 1/3: {\\"note\\":\\"c2\\"}",
-  "0/1 -> 1/3: {\\"note\\":\\"d2\\"}",
-  "1/3 -> 2/3: {\\"note\\":\\"d2\\"}",
-  "1/3 -> 2/3: {\\"note\\":\\"e2\\"}",
-  "2/3 -> 7/9: {\\"note\\":\\"e2\\"}",
-  "7/9 -> 8/9: {\\"note\\":\\"e2\\"}",
-  "8/9 -> 1/1: {\\"note\\":\\"e2\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 48 https://strudel.cc/?Y5DZt5A66Jj- 1`] = `
-[
-  "0/1 -> 1/1: F2",
-  "0/1 -> 1/1: F3",
-  "0/1 -> 1/1: C4",
-  "0/1 -> 1/1: Ab4",
-]
-`;
-
-exports[`renders shared tunes > shared tune 49 https://strudel.cc/?RnD3yO0e31p- 1`] = `
-[
-  "0/1 -> 1/1: F2",
-  "0/1 -> 1/1: F3",
-  "0/1 -> 1/1: C4",
-  "0/1 -> 1/1: Ab4",
-]
-`;
-
-exports[`renders shared tunes > shared tune 50 https://strudel.cc/?PQfKr5ac-4x0 1`] = `
-[
-  "0/1 -> 1/2: c1",
-  "1/2 -> 1/1: c1",
-  "1/2 -> 1/1: x",
-  "1/4 -> 1/2: c4",
-  "3/4 -> 1/1: c4",
-  "0/1 -> 1/2: B1",
-  "3/4 -> 1/1: B1",
-  "1/4 -> 13/44: A3",
-  "1/4 -> 13/44: C#4",
-  "1/4 -> 13/44: D4",
-  "1/4 -> 13/44: F#4",
-]
-`;
-
-exports[`renders shared tunes > shared tune 51 https://strudel.cc/?qbyqK2VN_6if 1`] = `
-[
-  "0/1 -> 2/1: {\\"note\\":\\"C3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.4722222222222222}",
-  "0/1 -> 2/1: {\\"note\\":\\"E3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.4907407407407407}",
-  "0/1 -> 1/1: {\\"note\\":\\"B3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5231481481481481}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 52 https://strudel.cc/?0H0ym5HypMyj 1`] = `
-[
-  "0/1 -> 1/2: {\\"note\\":\\"D3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.4814814814814815}",
-  "1/4 -> 3/4: {\\"note\\":\\"F3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.49537037037037035}",
-  "0/1 -> 1/4: {\\"note\\":\\"F4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5509259259259259}",
-  "1/2 -> 1/1: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "1/4 -> 1/2: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "3/4 -> 5/4: {\\"note\\":\\"E4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5462962962962963}",
-  "-1/8 -> 1/8: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "-1/8 -> 1/8: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "1/8 -> 5/8: {\\"note\\":\\"D3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.4814814814814815}",
-  "3/8 -> 7/8: {\\"note\\":\\"F3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.49537037037037035}",
-  "1/8 -> 3/8: {\\"note\\":\\"F4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5509259259259259}",
-  "5/8 -> 9/8: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "3/8 -> 5/8: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "7/8 -> 11/8: {\\"note\\":\\"E4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5462962962962963}",
-  "0/1 -> 1/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "0/1 -> 1/4: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "1/4 -> 3/4: {\\"note\\":\\"D3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.4814814814814815}",
-  "1/2 -> 1/1: {\\"note\\":\\"F3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.49537037037037035}",
-  "1/4 -> 1/2: {\\"note\\":\\"F4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5509259259259259}",
-  "3/4 -> 5/4: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "1/2 -> 3/4: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "-1/8 -> 1/8: {\\"note\\":\\"G3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5046296296296297}",
-  "1/8 -> 3/8: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "-1/8 -> 1/8: {\\"note\\":\\"F4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5509259259259259}",
-  "1/8 -> 3/8: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "3/8 -> 7/8: {\\"note\\":\\"D3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.4814814814814815}",
-  "5/8 -> 9/8: {\\"note\\":\\"F3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.49537037037037035}",
-  "3/8 -> 5/8: {\\"note\\":\\"F4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5509259259259259}",
-  "7/8 -> 11/8: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "5/8 -> 7/8: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 53 https://strudel.cc/?YAB9YoUpJwaj 1`] = `
-[
-  "0/1 -> 1/2: c2",
-  "1/2 -> 1/1: g2",
-  "0/1 -> 1/3: B3",
-  "0/1 -> 1/3: D4",
-  "0/1 -> 1/3: E4",
-  "0/1 -> 1/3: G4",
-  "1/3 -> 1/2: B3",
-  "1/3 -> 1/2: D4",
-  "1/3 -> 1/2: E4",
-  "1/3 -> 1/2: G4",
-  "5/6 -> 1/1: B3",
-  "5/6 -> 1/1: D4",
-  "5/6 -> 1/1: E4",
-  "5/6 -> 1/1: G4",
-]
-`;
-
-exports[`renders shared tunes > shared tune 54 https://strudel.cc/?-fdVyijf3Fk0 1`] = `
-[
-  "0/1 -> 1/2: {\\"note\\":\\"c2\\"}",
-  "1/2 -> 1/1: {\\"note\\":\\"g2\\"}",
-  "0/1 -> 1/3: {\\"note\\":\\"B3\\"}",
-  "0/1 -> 1/3: {\\"note\\":\\"D4\\"}",
-  "0/1 -> 1/3: {\\"note\\":\\"E4\\"}",
-  "0/1 -> 1/3: {\\"note\\":\\"G4\\"}",
-  "1/3 -> 1/2: {\\"note\\":\\"B3\\"}",
-  "1/3 -> 1/2: {\\"note\\":\\"D4\\"}",
-  "1/3 -> 1/2: {\\"note\\":\\"E4\\"}",
-  "1/3 -> 1/2: {\\"note\\":\\"G4\\"}",
-  "5/6 -> 1/1: {\\"note\\":\\"B3\\"}",
-  "5/6 -> 1/1: {\\"note\\":\\"D4\\"}",
-  "5/6 -> 1/1: {\\"note\\":\\"E4\\"}",
-  "5/6 -> 1/1: {\\"note\\":\\"G4\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 55 https://strudel.cc/?ODAzfGV0ZcbI 1`] = `
-[
-  "0/1 -> 1/2: Bb2",
-  "0/1 -> 1/2: F3",
-  "0/1 -> 1/2: Bb3",
-  "1/2 -> 1/1: Bb2",
-  "1/2 -> 1/1: Bb2",
-  "1/2 -> 1/1: F3",
-  "1/2 -> 1/1: F3",
-  "1/2 -> 1/1: Bb3",
-  "1/2 -> 1/1: Bb3",
-  "0/1 -> 1/2: Bb1",
-  "1/2 -> 5/8: Bb1",
-  "3/4 -> 7/8: Bb1",
-  "0/1 -> 1/2: c1",
-  "1/2 -> 1/1: c1",
-  "1/2 -> 1/1: c3",
-  "0/1 -> 1/4: C1",
-  "1/4 -> 1/2: C3",
-  "1/2 -> 3/4: C1",
-  "3/4 -> 1/1: C3",
-]
-`;
-
-exports[`renders shared tunes > shared tune 56 https://strudel.cc/?86BPLjJUsUlY 1`] = `
-[
-  "0/1 -> 1/2: Bb2",
-  "0/1 -> 1/2: F3",
-  "0/1 -> 1/2: Bb3",
-  "1/2 -> 1/1: Bb2",
-  "1/2 -> 1/1: Bb2",
-  "1/2 -> 1/1: F3",
-  "1/2 -> 1/1: F3",
-  "1/2 -> 1/1: Bb3",
-  "1/2 -> 1/1: Bb3",
-  "0/1 -> 1/2: Bb1",
-  "1/2 -> 5/8: Bb1",
-  "3/4 -> 7/8: Bb1",
-  "0/1 -> 1/2: c1",
-  "1/2 -> 1/1: c1",
-  "1/2 -> 1/1: c3",
-  "0/1 -> 1/4: C1",
-  "1/4 -> 1/2: C3",
-  "1/2 -> 3/4: C1",
-  "3/4 -> 1/1: C3",
-]
-`;
-
-exports[`renders shared tunes > shared tune 57 https://strudel.cc/?a6p9WTalyHea 1`] = `
-[
-  "0/1 -> 1/2: c1",
-  "1/2 -> 1/1: c1",
-  "1/2 -> 1/1: x",
-  "1/4 -> 1/2: c4",
-  "3/4 -> 1/1: c4",
-]
-`;
-
-exports[`renders shared tunes > shared tune 58 https://strudel.cc/?ciNbEjRKpC5T 1`] = `
-[
-  "0/1 -> 1/2: c1",
-  "1/2 -> 1/1: c1",
-  "1/2 -> 1/1: x",
-  "1/4 -> 1/2: c4",
-  "3/4 -> 1/1: c4",
-]
-`;
-
-exports[`renders shared tunes > shared tune 59 https://strudel.cc/?pLhCIXogckDD 1`] = `
-[
-  "0/1 -> 1/4: B3",
-  "0/1 -> 1/4: D4",
-  "0/1 -> 1/4: E4",
-  "0/1 -> 1/4: G4",
-  "1/4 -> 1/2: C4",
-  "1/4 -> 1/2: E4",
-  "1/4 -> 1/2: F4",
-  "1/4 -> 1/2: A4",
-  "1/2 -> 3/4: A3",
-  "1/2 -> 3/4: C4",
-  "1/2 -> 3/4: E4",
-  "1/2 -> 3/4: G4",
-  "3/4 -> 1/1: B3",
-  "3/4 -> 1/1: E4",
-  "3/4 -> 1/1: F4",
-  "3/4 -> 1/1: A4",
-  "0/1 -> 1/2: C2",
-  "1/2 -> 1/1: D2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 60 https://strudel.cc/?hJFGyCmtF36W 1`] = `
-[
-  "0/1 -> 1/4: B3",
-  "0/1 -> 1/4: D4",
-  "0/1 -> 1/4: E4",
-  "0/1 -> 1/4: G4",
-  "1/4 -> 1/2: C4",
-  "1/4 -> 1/2: E4",
-  "1/4 -> 1/2: F4",
-  "1/4 -> 1/2: A4",
-  "1/2 -> 3/4: A3",
-  "1/2 -> 3/4: C4",
-  "1/2 -> 3/4: E4",
-  "1/2 -> 3/4: G4",
-  "3/4 -> 1/1: B3",
-  "3/4 -> 1/1: E4",
-  "3/4 -> 1/1: F4",
-  "3/4 -> 1/1: A4",
-  "0/1 -> 1/2: C2",
-  "1/2 -> 1/1: D2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 61 https://strudel.cc/?4HtBUNn4xAAA 1`] = `
-[
-  "0/1 -> 3053185/4904046: {\\"n\\":62,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3986.9405734726183}",
-  "0/1 -> 3053185/4904046: {\\"n\\":62,\\"s\\":\\"square\\",\\"cutoff\\":3986.9405734726183}",
-  "0/1 -> 3053185/4904046: {\\"n\\":62,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3986.9405734726183}",
-  "1/2 -> 7957231/9808092: {\\"n\\":50,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3942.3145276351606}",
-  "1/2 -> 7957231/9808092: {\\"n\\":50,\\"s\\":\\"square\\",\\"cutoff\\":3942.3145276351606}",
-  "3/4 -> 5204627/4904046: {\\"n\\":41,\\"s\\":\\"square\\",\\"cutoff\\":3897.7021140702864}",
-  "3/4 -> 5204627/4904046: {\\"n\\":41,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3858.612673535166}",
-  "0/1 -> 3053185/4904046: {\\"n\\":43,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3986.9405734726183}",
-  "0/1 -> 3053185/4904046: {\\"n\\":43,\\"s\\":\\"square\\",\\"cutoff\\":3986.9405734726183}",
-  "0/1 -> 3053185/4904046: {\\"n\\":43,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3986.9405734726183}",
-  "1/2 -> 2752604/2452023: {\\"n\\":69,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3924.645587531366}",
-  "1/2 -> 2752604/2452023: {\\"n\\":69,\\"s\\":\\"square\\",\\"cutoff\\":3924.645587531366}",
-  "1/2 -> 2752604/2452023: {\\"n\\":69,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3850.2031844444546}",
-  "-1/4 -> 3654347/9808092: {\\"n\\":48,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3995.31915093835}",
-  "-1/4 -> 3654347/9808092: {\\"n\\":48,\\"s\\":\\"square\\",\\"cutoff\\":3995.31915093835}",
-  "1/4 -> 8558393/9808092: {\\"n\\":74,\\"s\\":\\"square\\",\\"cutoff\\":3957.6603580168244}",
-  "1/4 -> 8558393/9808092: {\\"n\\":74,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3957.6603580168244}",
-  "1/4 -> 8558393/9808092: {\\"n\\":74,\\"s\\":\\"square\\",\\"cutoff\\":3957.6603580168244}",
-  "3/4 -> 5204627/4904046: {\\"n\\":62,\\"s\\":\\"square\\",\\"cutoff\\":3897.7021140702864}",
-  "3/4 -> 5204627/4904046: {\\"n\\":62,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3858.612673535166}",
-  "-1/4 -> 3654347/9808092: {\\"n\\":64,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3995.31915093835}",
-  "-1/4 -> 3654347/9808092: {\\"n\\":64,\\"s\\":\\"square\\",\\"cutoff\\":3995.31915093835}",
-  "1/4 -> 8558393/9808092: {\\"n\\":55,\\"s\\":\\"square\\",\\"cutoff\\":3957.6603580168244}",
-  "1/4 -> 8558393/9808092: {\\"n\\":55,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3957.6603580168244}",
-  "1/4 -> 8558393/9808092: {\\"n\\":55,\\"s\\":\\"square\\",\\"cutoff\\":3957.6603580168244}",
-  "3/4 -> 13462439/9808092: {\\"n\\":81,\\"s\\":\\"square\\",\\"cutoff\\":3897.7021140702864}",
-  "3/4 -> 13462439/9808092: {\\"n\\":81,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3813.515463898106}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 62 https://strudel.cc/?o6VENTMBn_Fo 1`] = `
-[
-  "0/1 -> 1/5: F#1",
-  "1/5 -> 2/5: F#1",
-  "2/5 -> 1/2: G#1",
-  "1/2 -> 3/5: C#2",
-  "3/5 -> 4/5: B1",
-  "4/5 -> 1/1: E2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 63 https://strudel.cc/?2MtjoYELsyy6 1`] = `
-[
-  "0/1 -> 2867650/6103323: {\\"note\\":\\"B1\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41203703703703703}",
-  "0/1 -> 2681020/6741463: {\\"note\\":\\"B1\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41203703703703703}",
-  "446428571428571/9375000000000000 -> 4553064403854419/13264137201096312: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "446428571428571/9375000000000000 -> 4553064403854419/13264137201096312: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "446428571428571/9375000000000000 -> 4553064403854419/13264137201096312: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/9375000000000000 -> 4553064403854419/13264137201096312: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "0/1 -> 1821896/6162503: {\\"note\\":\\"B1\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41203703703703703}",
-  "446428571428571/9375000000000000 -> 8824552566910673/32550699877411690: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "446428571428571/9375000000000000 -> 8824552566910673/32550699877411690: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "446428571428571/9375000000000000 -> 8824552566910673/32550699877411690: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/9375000000000000 -> 8824552566910673/32550699877411690: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "0/1 -> 5069600/22684527: {\\"note\\":\\"B1\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41203703703703703}",
-  "446428571428571/9375000000000000 -> 8824552566910673/32550699877411690: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "446428571428571/9375000000000000 -> 8824552566910673/32550699877411690: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "446428571428571/9375000000000000 -> 8824552566910673/32550699877411690: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/9375000000000000 -> 8824552566910673/32550699877411690: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "0/1 -> 5069600/22684527: {\\"note\\":\\"B1\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41203703703703703}",
-  "446428571428571/9375000000000000 -> 4553064403854419/13264137201096312: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "446428571428571/9375000000000000 -> 4553064403854419/13264137201096312: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "446428571428571/9375000000000000 -> 4553064403854419/13264137201096312: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/9375000000000000 -> 4553064403854419/13264137201096312: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "0/1 -> 1821896/6162503: {\\"note\\":\\"B1\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41203703703703703}",
-  "446428571428571/9375000000000000 -> 3230789307776333/7255143743387577: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "446428571428571/9375000000000000 -> 3230789307776333/7255143743387577: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "446428571428571/9375000000000000 -> 3230789307776333/7255143743387577: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/9375000000000000 -> 3230789307776333/7255143743387577: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "0/1 -> 2681020/6741463: {\\"note\\":\\"B1\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41203703703703703}",
-  "446428571428571/9375000000000000 -> 3625532718823936/7006271198968491: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "446428571428571/9375000000000000 -> 3625532718823936/7006271198968491: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "446428571428571/9375000000000000 -> 3625532718823936/7006271198968491: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/9375000000000000 -> 3625532718823936/7006271198968491: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "0/1 -> 2867650/6103323: {\\"note\\":\\"B1\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41203703703703703}",
-  "446428571428571/9375000000000000 -> 3625532718823936/7006271198968491: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "446428571428571/9375000000000000 -> 3625532718823936/7006271198968491: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "446428571428571/9375000000000000 -> 3625532718823936/7006271198968491: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/9375000000000000 -> 3625532718823936/7006271198968491: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "0/1 -> 2867650/6103323: {\\"note\\":\\"B1\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41203703703703703}",
-  "1/6 -> 4902091/12206646: {\\"note\\":\\"B3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5231481481481481}",
-  "1/6 -> 4902091/12206646: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "446428571428571/9375000000000000 -> 3230789307776333/7255143743387577: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "446428571428571/9375000000000000 -> 3230789307776333/7255143743387577: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "446428571428571/9375000000000000 -> 3230789307776333/7255143743387577: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/9375000000000000 -> 3230789307776333/7255143743387577: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "0/1 -> 2681020/6741463: {\\"note\\":\\"B1\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41203703703703703}",
-  "1/6 -> 14784523/40448778: {\\"note\\":\\"B3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5231481481481481}",
-  "1/6 -> 14784523/40448778: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "446428571428571/9375000000000000 -> 4553064403854419/13264137201096312: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "446428571428571/9375000000000000 -> 4553064403854419/13264137201096312: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "446428571428571/9375000000000000 -> 4553064403854419/13264137201096312: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/9375000000000000 -> 4553064403854419/13264137201096312: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "0/1 -> 1821896/6162503: {\\"note\\":\\"B1\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41203703703703703}",
-  "1/6 -> 11628191/36975018: {\\"note\\":\\"B3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5231481481481481}",
-  "1/6 -> 11628191/36975018: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "446428571428571/9375000000000000 -> 8824552566910673/32550699877411690: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "446428571428571/9375000000000000 -> 8824552566910673/32550699877411690: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "446428571428571/9375000000000000 -> 8824552566910673/32550699877411690: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/9375000000000000 -> 8824552566910673/32550699877411690: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "1/6 -> 12631109/45369054: {\\"note\\":\\"B3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5231481481481481}",
-  "1/6 -> 12631109/45369054: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "446428571428571/9375000000000000 -> 8824552566910673/32550699877411690: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "446428571428571/9375000000000000 -> 8824552566910673/32550699877411690: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "446428571428571/9375000000000000 -> 8824552566910673/32550699877411690: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/9375000000000000 -> 8824552566910673/32550699877411690: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "1/6 -> 12631109/45369054: {\\"note\\":\\"B3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5231481481481481}",
-  "1/6 -> 12631109/45369054: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "446428571428571/9375000000000000 -> 4553064403854419/13264137201096312: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "446428571428571/9375000000000000 -> 4553064403854419/13264137201096312: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "446428571428571/9375000000000000 -> 4553064403854419/13264137201096312: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/9375000000000000 -> 4553064403854419/13264137201096312: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "0/1 -> 1821896/6162503: {\\"note\\":\\"B1\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41203703703703703}",
-  "1/6 -> 11628191/36975018: {\\"note\\":\\"B3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5231481481481481}",
-  "1/6 -> 11628191/36975018: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "446428571428571/9375000000000000 -> 3230789307776333/7255143743387577: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "446428571428571/9375000000000000 -> 3230789307776333/7255143743387577: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "446428571428571/9375000000000000 -> 3230789307776333/7255143743387577: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/9375000000000000 -> 3230789307776333/7255143743387577: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "0/1 -> 2681020/6741463: {\\"note\\":\\"B1\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41203703703703703}",
-  "1/6 -> 14784523/40448778: {\\"note\\":\\"B3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5231481481481481}",
-  "1/6 -> 14784523/40448778: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "446428571428571/9375000000000000 -> 3625532718823936/7006271198968491: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "446428571428571/9375000000000000 -> 3625532718823936/7006271198968491: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "446428571428571/9375000000000000 -> 3625532718823936/7006271198968491: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/9375000000000000 -> 3625532718823936/7006271198968491: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "0/1 -> 2867650/6103323: {\\"note\\":\\"B1\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41203703703703703}",
-  "1/6 -> 4902091/12206646: {\\"note\\":\\"B3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5231481481481481}",
-  "1/6 -> 4902091/12206646: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "446428571428571/9375000000000000 -> 3625532718823936/7006271198968491: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "446428571428571/9375000000000000 -> 3625532718823936/7006271198968491: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "446428571428571/9375000000000000 -> 3625532718823936/7006271198968491: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/9375000000000000 -> 3625532718823936/7006271198968491: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "446428571428571/9375000000000000 -> 3230789307776333/7255143743387577: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "446428571428571/9375000000000000 -> 3230789307776333/7255143743387577: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "446428571428571/9375000000000000 -> 3230789307776333/7255143743387577: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/9375000000000000 -> 3230789307776333/7255143743387577: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "2/3 -> 6936532/6103323: {\\"note\\":\\"A3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5138888888888888}",
-  "2/3 -> 6936532/6103323: {\\"note\\":\\"C#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5324074074074074}",
-  "2/3 -> 6936532/6103323: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "2/3 -> 6936532/6103323: {\\"note\\":\\"F#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5555555555555556}",
-  "2/3 -> 6936532/6103323: {\\"note\\":\\"B1\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41203703703703703}",
-  "2/3 -> 5502707/6103323: {\\"note\\":\\"F#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5555555555555556}",
-  "2/3 -> 5502707/6103323: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "2/3 -> 21525986/20224389: {\\"note\\":\\"A3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5138888888888888}",
-  "2/3 -> 21525986/20224389: {\\"note\\":\\"C#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5324074074074074}",
-  "2/3 -> 21525986/20224389: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "2/3 -> 21525986/20224389: {\\"note\\":\\"F#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5555555555555556}",
-  "2/3 -> 21525986/20224389: {\\"note\\":\\"B1\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41203703703703703}",
-  "2/3 -> 17504456/20224389: {\\"note\\":\\"F#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5555555555555556}",
-  "2/3 -> 17504456/20224389: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "2/3 -> 17790694/18487509: {\\"note\\":\\"A3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5138888888888888}",
-  "2/3 -> 17790694/18487509: {\\"note\\":\\"C#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5324074074074074}",
-  "2/3 -> 17790694/18487509: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "2/3 -> 17790694/18487509: {\\"note\\":\\"F#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5555555555555556}",
-  "2/3 -> 17790694/18487509: {\\"note\\":\\"B1\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41203703703703703}",
-  "2/3 -> 15057850/18487509: {\\"note\\":\\"F#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5555555555555556}",
-  "2/3 -> 15057850/18487509: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "2/3 -> 20192618/22684527: {\\"note\\":\\"A3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5138888888888888}",
-  "2/3 -> 20192618/22684527: {\\"note\\":\\"C#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5324074074074074}",
-  "2/3 -> 20192618/22684527: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "2/3 -> 20192618/22684527: {\\"note\\":\\"F#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5555555555555556}",
-  "2/3 -> 20192618/22684527: {\\"note\\":\\"B1\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41203703703703703}",
-  "2/3 -> 17657818/22684527: {\\"note\\":\\"F#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5555555555555556}",
-  "2/3 -> 17657818/22684527: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "2/3 -> 20192618/22684527: {\\"note\\":\\"A3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5138888888888888}",
-  "2/3 -> 20192618/22684527: {\\"note\\":\\"C#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5324074074074074}",
-  "2/3 -> 20192618/22684527: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "2/3 -> 20192618/22684527: {\\"note\\":\\"F#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5555555555555556}",
-  "2/3 -> 20192618/22684527: {\\"note\\":\\"B1\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41203703703703703}",
-  "2/3 -> 17657818/22684527: {\\"note\\":\\"F#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5555555555555556}",
-  "2/3 -> 17657818/22684527: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "2/3 -> 17790694/18487509: {\\"note\\":\\"A3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5138888888888888}",
-  "2/3 -> 17790694/18487509: {\\"note\\":\\"C#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5324074074074074}",
-  "2/3 -> 17790694/18487509: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "2/3 -> 17790694/18487509: {\\"note\\":\\"F#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5555555555555556}",
-  "2/3 -> 17790694/18487509: {\\"note\\":\\"B1\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41203703703703703}",
-  "2/3 -> 15057850/18487509: {\\"note\\":\\"F#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5555555555555556}",
-  "2/3 -> 15057850/18487509: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "2/3 -> 21525986/20224389: {\\"note\\":\\"A3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5138888888888888}",
-  "2/3 -> 21525986/20224389: {\\"note\\":\\"C#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5324074074074074}",
-  "2/3 -> 21525986/20224389: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "2/3 -> 21525986/20224389: {\\"note\\":\\"F#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5555555555555556}",
-  "2/3 -> 21525986/20224389: {\\"note\\":\\"B1\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41203703703703703}",
-  "2/3 -> 17504456/20224389: {\\"note\\":\\"F#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5555555555555556}",
-  "2/3 -> 17504456/20224389: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "2/3 -> 6936532/6103323: {\\"note\\":\\"A3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5138888888888888}",
-  "2/3 -> 6936532/6103323: {\\"note\\":\\"C#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5324074074074074}",
-  "2/3 -> 6936532/6103323: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "2/3 -> 6936532/6103323: {\\"note\\":\\"F#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5555555555555556}",
-  "2/3 -> 6936532/6103323: {\\"note\\":\\"B1\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41203703703703703}",
-  "2/3 -> 5502707/6103323: {\\"note\\":\\"F#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5555555555555556}",
-  "2/3 -> 5502707/6103323: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "2/3 -> 6936532/6103323: {\\"note\\":\\"A3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5138888888888888}",
-  "2/3 -> 6936532/6103323: {\\"note\\":\\"C#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5324074074074074}",
-  "2/3 -> 6936532/6103323: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "2/3 -> 6936532/6103323: {\\"note\\":\\"F#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5555555555555556}",
-  "2/3 -> 6936532/6103323: {\\"note\\":\\"B1\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41203703703703703}",
-  "2/3 -> 21525986/20224389: {\\"note\\":\\"A3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5138888888888888}",
-  "2/3 -> 21525986/20224389: {\\"note\\":\\"C#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5324074074074074}",
-  "2/3 -> 21525986/20224389: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "2/3 -> 21525986/20224389: {\\"note\\":\\"F#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5555555555555556}",
-  "2/3 -> 21525986/20224389: {\\"note\\":\\"B1\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41203703703703703}",
-  "2/3 -> 17790694/18487509: {\\"note\\":\\"A3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5138888888888888}",
-  "2/3 -> 17790694/18487509: {\\"note\\":\\"C#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5324074074074074}",
-  "2/3 -> 17790694/18487509: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "2/3 -> 17790694/18487509: {\\"note\\":\\"F#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5555555555555556}",
-  "2/3 -> 17790694/18487509: {\\"note\\":\\"B1\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41203703703703703}",
-  "2/3 -> 17790694/18487509: {\\"note\\":\\"A3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5138888888888888}",
-  "2/3 -> 17790694/18487509: {\\"note\\":\\"C#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5324074074074074}",
-  "2/3 -> 17790694/18487509: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "2/3 -> 17790694/18487509: {\\"note\\":\\"F#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5555555555555556}",
-  "2/3 -> 17790694/18487509: {\\"note\\":\\"B1\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41203703703703703}",
-  "2/3 -> 21525986/20224389: {\\"note\\":\\"A3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5138888888888888}",
-  "2/3 -> 21525986/20224389: {\\"note\\":\\"C#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5324074074074074}",
-  "2/3 -> 21525986/20224389: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "2/3 -> 21525986/20224389: {\\"note\\":\\"F#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5555555555555556}",
-  "2/3 -> 21525986/20224389: {\\"note\\":\\"B1\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41203703703703703}",
-  "2/3 -> 6936532/6103323: {\\"note\\":\\"A3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5138888888888888}",
-  "2/3 -> 6936532/6103323: {\\"note\\":\\"C#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5324074074074074}",
-  "2/3 -> 6936532/6103323: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "2/3 -> 6936532/6103323: {\\"note\\":\\"F#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5555555555555556}",
-  "2/3 -> 6936532/6103323: {\\"note\\":\\"B1\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41203703703703703}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 64 https://strudel.cc/?vJ2KTtZo20cu 1`] = `
-[
-  "0/1 -> 1/2: Bb2",
-  "0/1 -> 1/2: F3",
-  "0/1 -> 1/2: Bb3",
-  "1/2 -> 1/1: Bb2",
-  "1/2 -> 1/1: Bb2",
-  "1/2 -> 1/1: F3",
-  "1/2 -> 1/1: F3",
-  "1/2 -> 1/1: Bb3",
-  "1/2 -> 1/1: Bb3",
-  "0/1 -> 1/2: Bb1",
-  "1/2 -> 5/8: Bb1",
-  "3/4 -> 7/8: Bb1",
-  "0/1 -> 1/2: c1",
-  "1/2 -> 1/1: c1",
-  "1/2 -> 1/1: c3",
-  "0/1 -> 1/4: C1",
-  "1/4 -> 1/2: C3",
-  "1/2 -> 3/4: C1",
-  "3/4 -> 1/1: C3",
-]
-`;
-
-exports[`renders shared tunes > shared tune 65 https://strudel.cc/?DhWsebFhaaI9 1`] = `
-[
-  "0/1 -> 1/2: Bb2",
-  "0/1 -> 1/2: F3",
-  "0/1 -> 1/2: Bb3",
-  "1/2 -> 1/1: Bb2",
-  "1/2 -> 1/1: Bb2",
-  "1/2 -> 1/1: F3",
-  "1/2 -> 1/1: F3",
-  "1/2 -> 1/1: Bb3",
-  "1/2 -> 1/1: Bb3",
-  "0/1 -> 1/2: Bb1",
-  "1/2 -> 5/8: Bb1",
-  "3/4 -> 7/8: Bb1",
-  "0/1 -> 1/2: c1",
-  "1/2 -> 1/1: c1",
-  "1/2 -> 1/1: c3",
-  "0/1 -> 1/4: C1",
-  "1/4 -> 1/2: C3",
-  "1/2 -> 3/4: C1",
-  "3/4 -> 1/1: C3",
-]
-`;
-
-exports[`renders shared tunes > shared tune 66 https://strudel.cc/?TpZLuyJCkYlW 1`] = `
-[
-  "0/1 -> 1/4: c4",
-  "1/4 -> 1/2: e3",
-  "1/2 -> 3/4: c4",
-  "3/4 -> 1/1: c4",
-]
-`;
-
-exports[`renders shared tunes > shared tune 67 https://strudel.cc/?pQKoHsxS2h84 1`] = `
-[
-  "0/1 -> 1/4: {\\"n\\":62,\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000}",
-  "1/2 -> 5/8: {\\"n\\":50,\\"s\\":\\"square\\",\\"cutoff\\":2000}",
-  "3/4 -> 7/8: {\\"n\\":41,\\"s\\":\\"square\\",\\"cutoff\\":2000}",
-  "1/4 -> 1/2: {\\"n\\":74,\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000}",
-  "3/4 -> 7/8: {\\"n\\":62,\\"s\\":\\"square\\",\\"cutoff\\":2000}",
-  "0/1 -> 1/4: {\\"n\\":43,\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000}",
-  "1/2 -> 3/4: {\\"n\\":69,\\"s\\":\\"square\\",\\"cutoff\\":2000}",
-  "1/4 -> 1/2: {\\"n\\":55,\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000}",
-  "3/4 -> 1/1: {\\"n\\":81,\\"s\\":\\"square\\",\\"cutoff\\":2000}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 68 https://strudel.cc/?gL4HMl9q43o6 1`] = `
-[
-  "0/1 -> 1/4: c4",
-  "1/4 -> 1/2: e3",
-  "1/2 -> 3/4: e3",
-  "3/4 -> 1/1: c4",
-]
-`;
-
-exports[`renders shared tunes > shared tune 69 https://strudel.cc/?QoKBBsdDBQro 1`] = `
-[
-  "0/1 -> 1/4: c4",
-  "1/4 -> 1/2: e3",
-  "1/2 -> 3/4: e3",
-  "3/4 -> 1/1: c4",
-]
-`;
-
-exports[`renders shared tunes > shared tune 70 https://strudel.cc/?TGp3R_6-qmvY 1`] = `
-[
-  "0/1 -> 1/8: c3",
-  "1/8 -> 1/4: e3",
-  "1/4 -> 1/2: c4",
-  "1/2 -> 3/4: c4",
-  "3/4 -> 1/1: e3",
-]
-`;
-
-exports[`renders shared tunes > shared tune 71 https://strudel.cc/?Oais65XPBeAV 1`] = `
-[
-  "0/1 -> 1/3: {\\"note\\":\\"c9\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.75}",
-  "1/3 -> 2/3: {\\"note\\":\\"c9\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.75}",
-  "2/3 -> 1/1: {\\"note\\":\\"c9\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.75}",
-  "0/1 -> 1/2: {\\"note\\":\\"c8\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.75}",
-  "1/2 -> 1/1: {\\"note\\":\\"c8\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.75}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 72 https://strudel.cc/?ldZPCC8_189H 1`] = `
-[
-  "0/1 -> 1/3: {\\"note\\":\\"c9\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.75}",
-  "1/3 -> 2/3: {\\"note\\":\\"c9\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.75}",
-  "2/3 -> 1/1: {\\"note\\":\\"c9\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.75}",
-  "0/1 -> 1/2: {\\"note\\":\\"c8\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.75}",
-  "1/2 -> 1/1: {\\"note\\":\\"c8\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.75}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 73 https://strudel.cc/?D--IwyHBNn0a 1`] = `[]`;
-
-exports[`renders shared tunes > shared tune 74 https://strudel.cc/?gRGnC9U7CLgh 1`] = `[]`;
-
-exports[`renders shared tunes > shared tune 75 https://strudel.cc/?rr1DhAIFVsNf 1`] = `[]`;
-
-exports[`renders shared tunes > shared tune 76 https://strudel.cc/?AnRyPR-aJRnM 1`] = `[]`;
-
-exports[`renders shared tunes > shared tune 77 https://strudel.cc/?CpHjU1-jPeGv 1`] = `[]`;
-
-exports[`renders shared tunes > shared tune 78 https://strudel.cc/?LgsIpYacgnRK 1`] = `[]`;
-
-exports[`renders shared tunes > shared tune 79 https://strudel.cc/?faC6ykfIhu1j 1`] = `
-[
-  "0/1 -> 1/1: F2",
-  "0/1 -> 1/1: F3",
-  "0/1 -> 1/1: C4",
-  "0/1 -> 1/1: Ab4",
-]
-`;
-
-exports[`renders shared tunes > shared tune 80 https://strudel.cc/?5_NKdDWsFCk1 1`] = `[]`;
-
-exports[`renders shared tunes > shared tune 81 https://strudel.cc/?kH7LV63mXASH 1`] = `[]`;
-
-exports[`renders shared tunes > shared tune 82 https://strudel.cc/?l7FO1TzD3yBA 1`] = `[]`;
-
-exports[`renders shared tunes > shared tune 83 https://strudel.cc/?3hSnOnJz8aPZ 1`] = `
-[
-  "0/1 -> 1/10: C3",
-  "0/1 -> 1/10: E3",
-  "0/1 -> 1/10: G3",
-  "1/4 -> 7/20: B3",
-  "1/4 -> 7/20: E4",
-  "1/4 -> 7/20: E3",
-  "1/2 -> 3/5: C3",
-  "1/2 -> 3/5: A2",
-  "1/2 -> 3/5: C3",
-  "3/4 -> 17/20: E3",
-  "3/4 -> 17/20: G3",
-  "3/4 -> 17/20: B3",
-  "0/1 -> 1/5: C2",
-  "1/2 -> 7/10: E2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 84 https://strudel.cc/?J3ClL0wQCBr_ 1`] = `
-[
-  "0/1 -> 1/8: {\\"note\\":\\"A2\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2206.5338497506646,\\"resonance\\":10,\\"clip\\":1}",
-  "3/8 -> 1/2: {\\"note\\":\\"A2\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2827.098521493671,\\"resonance\\":10,\\"clip\\":1}",
-  "3/4 -> 7/8: {\\"note\\":\\"A2\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3366.0584981088073,\\"resonance\\":10,\\"clip\\":1}",
-  "0/1 -> 1/4: {\\"note\\":\\"A3\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2312.732504596285,\\"resonance\\":10,\\"clip\\":1}",
-  "3/4 -> 1/1: {\\"note\\":\\"A3\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3443.5028842544402,\\"resonance\\":10,\\"clip\\":1}",
-  "-7/4 -> 1/4: {\\"note\\":\\"C4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2312.732504596285,\\"resonance\\":10,\\"clip\\":1}",
-  "-7/4 -> 1/4: {\\"note\\":\\"E4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2312.732504596285,\\"resonance\\":10,\\"clip\\":1}",
-  "1/4 -> 1/2: {\\"note\\":\\"C4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "1/4 -> 1/2: {\\"note\\":\\"E4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/2 -> 1/2: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2522.789774516997,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/2 -> 1/2: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2522.789774516997,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/2 -> 1/2: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2522.789774516997,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/2 -> 1/2: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2522.789774516997,\\"resonance\\":10,\\"clip\\":1}",
-  "1/2 -> 3/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3110.8609453791396,\\"resonance\\":10,\\"clip\\":1}",
-  "1/2 -> 3/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3110.8609453791396,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "3/4 -> 1/1: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3443.5028842544402,\\"resonance\\":10,\\"clip\\":1}",
-  "3/4 -> 1/1: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3443.5028842544402,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/4 -> 5/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/4 -> 5/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/4 -> 5/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/4 -> 5/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "0/1 -> 1/2: {\\"s\\":\\"bd:1\\"}",
-  "1/2 -> 1/1: {\\"s\\":\\"bd:1\\"}",
-  "1/2 -> 1/1: {\\"s\\":\\"sd:0\\"}",
-  "1/4 -> 1/2: {\\"s\\":\\"hh:0\\"}",
-  "3/4 -> 1/1: {\\"s\\":\\"hh:0\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 85 https://strudel.cc/?YC1KlrX1fOyP 1`] = `
-[
-  "0/1 -> 1/3: {\\"note\\":\\"D3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.4814814814814815}",
-  "1/3 -> 1/2: {\\"note\\":\\"Eb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.4861111111111111}",
-  "1/2 -> 2/3: {\\"note\\":\\"F3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.49537037037037035}",
-  "2/3 -> 1/1: {\\"note\\":\\"G3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5046296296296297}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 86 https://strudel.cc/?YD2MRLffOCRV 1`] = `
-[
-  "1/2 -> 1/1: e4",
-  "1/4 -> 1/2: c3",
-  "1/2 -> 3/4: c3",
-]
-`;
-
-exports[`renders shared tunes > shared tune 87 https://strudel.cc/?XxvYG4XK-I5G 1`] = `
-[
-  "0/1 -> 1/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "0/1 -> 1/4: {\\"note\\":\\"B4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5787037037037037}",
-  "0/1 -> 1/4: {\\"note\\":\\"C5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5833333333333333}",
-  "0/1 -> 1/4: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "3/4 -> 1/1: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "3/4 -> 1/1: {\\"note\\":\\"B4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5787037037037037}",
-  "3/4 -> 1/1: {\\"note\\":\\"C5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5833333333333333}",
-  "3/4 -> 1/1: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "0/1 -> 1/2: {\\"note\\":\\"A2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.45833333333333337}",
-  "1/2 -> 1/1: {\\"note\\":\\"A2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.45833333333333337}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 88 https://strudel.cc/?FHXCltSQwouU 1`] = `
-[
-  "0/1 -> 3/4: c3",
-  "3/4 -> 1/1: eb3",
-  "3/4 -> 1/1: g3",
-  "3/4 -> 1/1: c4",
-  "0/1 -> 1/2: c2",
-  "1/2 -> 1/1: g2",
-  "0/1 -> 5/2: eb4",
-]
-`;
-
-exports[`renders shared tunes > shared tune 89 https://strudel.cc/?Hg6JP2F6ufl1 1`] = `
-[
-  "0/1 -> 1/3: c3",
-  "1/3 -> 2/3: e3",
-  "2/3 -> 1/1: g3",
-  "0/1 -> 1/2: c2",
-  "1/2 -> 1/1: g2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 90 https://strudel.cc/?lNxLnMcpieR3 1`] = `
-[
-  "0/1 -> 1/3: c3",
-  "1/3 -> 2/3: e3",
-  "2/3 -> 1/1: g3",
-  "0/1 -> 1/2: c2",
-  "1/2 -> 1/1: g2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 91 https://strudel.cc/?78PHBhVZovgo 1`] = `
-[
-  "0/1 -> 1/4: c3",
-  "1/5 -> 9/20: c3",
-  "9/20 -> 7/10: c3",
-  "17/40 -> 27/40: c3",
-  "27/40 -> 37/40: c3",
-  "13/20 -> 9/10: c3",
-  "9/10 -> 23/20: c3",
-]
-`;
-
-exports[`renders shared tunes > shared tune 92 https://strudel.cc/?rXBp8MOz1iNw 1`] = `
-[
-  "0/1 -> 19/80: e5",
-  "1/2 -> 79/120: d5",
-  "2/3 -> 179/240: c5",
-  "11/12 -> 239/240: e5",
-  "1/4 -> 1/2: g4",
-  "3/4 -> 1/1: g4",
-  "0/1 -> 1/4: c3",
-  "1/2 -> 3/4: c3",
-]
-`;
-
-exports[`renders shared tunes > shared tune 93 https://strudel.cc/?bbPVlOzXxAxn 1`] = `
-[
-  "-3761101961531/150000000000000 -> 2912966012823/50000000000000: F4",
-  "2912966012823/50000000000000 -> 141592653589793/1000000000000000: G4",
-  "141592653589793/1000000000000000 -> 33738898038469/150000000000000: C3",
-  "33738898038469/150000000000000 -> 15412966012823/50000000000000: D3",
-  "15412966012823/50000000000000 -> 391592653589793/1000000000000000: E3",
-  "391592653589793/1000000000000000 -> 71238898038469/150000000000000: F3",
-  "71238898038469/150000000000000 -> 27912966012823/50000000000000: G3",
-  "27912966012823/50000000000000 -> 641592653589793/1000000000000000: A3",
-  "641592653589793/1000000000000000 -> 108738898038469/150000000000000: B3",
-  "108738898038469/150000000000000 -> 40412966012823/50000000000000: C4",
-  "40412966012823/50000000000000 -> 891592653589793/1000000000000000: D4",
-  "891592653589793/1000000000000000 -> 146238898038469/150000000000000: E4",
-  "146238898038469/150000000000000 -> 52912966012823/50000000000000: F4",
-]
-`;
-
-exports[`renders shared tunes > shared tune 94 https://strudel.cc/?dZSKPnJiPMAz 1`] = `
-[
-  "-3761101961531/150000000000000 -> 2912966012823/50000000000000: E3",
-  "2912966012823/50000000000000 -> 141592653589793/1000000000000000: A3",
-  "141592653589793/1000000000000000 -> 33738898038469/150000000000000: D4",
-  "33738898038469/150000000000000 -> 15412966012823/50000000000000: G4",
-  "15412966012823/50000000000000 -> 391592653589793/1000000000000000: A4",
-  "391592653589793/1000000000000000 -> 71238898038469/150000000000000: A4",
-  "71238898038469/150000000000000 -> 27912966012823/50000000000000: G4",
-  "27912966012823/50000000000000 -> 641592653589793/1000000000000000: D4",
-  "641592653589793/1000000000000000 -> 108738898038469/150000000000000: A3",
-  "108738898038469/150000000000000 -> 40412966012823/50000000000000: E3",
-  "40412966012823/50000000000000 -> 891592653589793/1000000000000000: D3",
-  "891592653589793/1000000000000000 -> 146238898038469/150000000000000: D3",
-  "146238898038469/150000000000000 -> 52912966012823/50000000000000: E3",
-]
-`;
-
-exports[`renders shared tunes > shared tune 95 https://strudel.cc/?l-zyGmnM6g_q 1`] = `
-[
-  "0/1 -> 1/8: {\\"note\\":\\"A2\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2206.5338497506646,\\"resonance\\":10,\\"clip\\":1}",
-  "3/8 -> 1/2: {\\"note\\":\\"A2\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2827.098521493671,\\"resonance\\":10,\\"clip\\":1}",
-  "3/4 -> 7/8: {\\"note\\":\\"A2\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3366.0584981088073,\\"resonance\\":10,\\"clip\\":1}",
-  "0/1 -> 1/4: {\\"note\\":\\"A3\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2312.732504596285,\\"resonance\\":10,\\"clip\\":1}",
-  "3/4 -> 1/1: {\\"note\\":\\"A3\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3443.5028842544402,\\"resonance\\":10,\\"clip\\":1}",
-  "-7/4 -> 1/4: {\\"note\\":\\"C4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2312.732504596285,\\"resonance\\":10,\\"clip\\":1}",
-  "-7/4 -> 1/4: {\\"note\\":\\"E4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2312.732504596285,\\"resonance\\":10,\\"clip\\":1}",
-  "1/4 -> 1/2: {\\"note\\":\\"C4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "1/4 -> 1/2: {\\"note\\":\\"E4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/2 -> 1/2: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2522.789774516997,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/2 -> 1/2: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2522.789774516997,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/2 -> 1/2: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2522.789774516997,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/2 -> 1/2: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2522.789774516997,\\"resonance\\":10,\\"clip\\":1}",
-  "1/2 -> 3/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3110.8609453791396,\\"resonance\\":10,\\"clip\\":1}",
-  "1/2 -> 3/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3110.8609453791396,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "3/4 -> 1/1: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3443.5028842544402,\\"resonance\\":10,\\"clip\\":1}",
-  "3/4 -> 1/1: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3443.5028842544402,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/4 -> 5/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/4 -> 5/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/4 -> 5/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/4 -> 5/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "0/1 -> 1/2: {\\"s\\":\\"bd:1\\"}",
-  "1/2 -> 1/1: {\\"s\\":\\"bd:1\\"}",
-  "1/2 -> 1/1: {\\"s\\":\\"sd:0\\"}",
-  "1/4 -> 1/2: {\\"s\\":\\"hh:0\\"}",
-  "3/4 -> 1/1: {\\"s\\":\\"hh:0\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 96 https://strudel.cc/?vEpJhDLHycD8 1`] = `
-[
-  "0/1 -> 3/20: 0",
-  "0/1 -> 3/20: 3",
-  "3/4 -> 9/10: 1",
-  "3/4 -> 9/10: 4",
-  "0/1 -> 3/10: -8",
-  "3/8 -> 27/40: -8",
-  "3/4 -> 21/20: -7",
-  "0/1 -> 3/200: 12",
-  "3/4 -> 153/200: 11",
-  "0/1 -> 3/20: c2",
-  "747/1000 -> 1497/1000: c1",
-  "0/1 -> 3/8: c2",
-  "3/8 -> 3/4: c2",
-  "3/4 -> 9/8: c2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 97 https://strudel.cc/?DHUbrEloJxMd 1`] = `
-[
-  "0/1 -> 19/80: {\\"note\\":\\"E4\\"}",
-  "1/2 -> 79/120: {\\"note\\":\\"D4\\"}",
-  "2/3 -> 179/240: {\\"note\\":\\"C4\\"}",
-  "11/12 -> 239/240: {\\"note\\":\\"E4\\"}",
-  "1/4 -> 1/2: {\\"note\\":\\"G3\\"}",
-  "3/4 -> 1/1: {\\"note\\":\\"G3\\"}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\"}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 98 https://strudel.cc/?-YW3kIKIGR8j 1`] = `
-[
-  "1/8 -> 1/4: {\\"n\\":\\"D1\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1699.6897509708342}",
-  "1/8 -> 1/4: {\\"n\\":\\"D1\\",\\"s\\":\\"square\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1699.6897509708342}",
-  "3/8 -> 1/2: {\\"n\\":\\"D2\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1765.826371664994}",
-  "3/8 -> 1/2: {\\"n\\":\\"D2\\",\\"s\\":\\"square\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1765.826371664994}",
-  "1/2 -> 5/8: {\\"n\\":\\"D1\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1798.799979846742}",
-  "1/2 -> 5/8: {\\"n\\":\\"D1\\",\\"s\\":\\"square\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1798.799979846742}",
-  "3/4 -> 7/8: {\\"n\\":\\"D3\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1864.4584935007128}",
-  "3/4 -> 7/8: {\\"n\\":\\"D3\\",\\"s\\":\\"square\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1864.4584935007128}",
-  "7/8 -> 1/1: {\\"n\\":\\"D3\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1897.1038487394403}",
-  "7/8 -> 1/1: {\\"n\\":\\"D3\\",\\"s\\":\\"square\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1897.1038487394403}",
-  "-3/8 -> 1/8: {\\"n\\":\\"G3\\",\\"s\\":\\"square\\",\\"gain\\":0.7,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0,\\"cutoff\\":1666.5665766857219}",
-  "-3/8 -> 1/8: {\\"n\\":\\"B3\\",\\"s\\":\\"square\\",\\"gain\\":0.7,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0,\\"cutoff\\":1666.5665766857219}",
-  "-1/4 -> 1/4: {\\"n\\":\\"G3\\",\\"s\\":\\"square\\",\\"gain\\":0.7,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0,\\"cutoff\\":1683.1306585059317}",
-  "-1/4 -> 1/4: {\\"n\\":\\"B3\\",\\"s\\":\\"square\\",\\"gain\\":0.7,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0,\\"cutoff\\":1683.1306585059317}",
-  "-1/8 -> 3/8: {\\"n\\":\\"G3\\",\\"s\\":\\"square\\",\\"gain\\":0.7,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0,\\"cutoff\\":1699.6897509708342}",
-  "-1/8 -> 3/8: {\\"n\\":\\"B3\\",\\"s\\":\\"square\\",\\"gain\\":0.7,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0,\\"cutoff\\":1699.6897509708342}",
-  "0/1 -> 3/8: {\\"n\\":\\"C#6\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.26103468453995016,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5998.072590601808,\\"cutoff\\":4000}",
-  "0/1 -> 3/8: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.26103468453995016,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5998.072590601808,\\"cutoff\\":4000}",
-  "0/1 -> 3/8: {\\"n\\":\\"E5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.26103468453995016,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5998.072590601808,\\"cutoff\\":4000}",
-  "0/1 -> 3/8: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.26103468453995016,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5998.072590601808,\\"cutoff\\":4000}",
-  "3/8 -> 3/4: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2828651860235305,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5982.671142387316,\\"cutoff\\":4000}",
-  "3/8 -> 3/4: {\\"n\\":\\"F#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2828651860235305,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5982.671142387316,\\"cutoff\\":4000}",
-  "3/8 -> 3/4: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2828651860235305,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5982.671142387316,\\"cutoff\\":4000}",
-  "3/8 -> 3/4: {\\"n\\":\\"A4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2828651860235305,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5982.671142387316,\\"cutoff\\":4000}",
-  "3/4 -> 1/1: {\\"n\\":\\"F#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.300533478008833,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5958.137268909887,\\"cutoff\\":4000}",
-  "3/4 -> 1/1: {\\"n\\":\\"A4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.300533478008833,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5958.137268909887,\\"cutoff\\":4000}",
-  "1/4 -> 5/8: {\\"n\\":\\"C#6\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2756442833140452,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5989.512318936654,\\"cutoff\\":4000}",
-  "1/4 -> 5/8: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2756442833140452,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5989.512318936654,\\"cutoff\\":4000}",
-  "1/4 -> 5/8: {\\"n\\":\\"E5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2756442833140452,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5989.512318936654,\\"cutoff\\":4000}",
-  "1/4 -> 5/8: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2756442833140452,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5989.512318936654,\\"cutoff\\":4000}",
-  "5/8 -> 1/1: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.29705226105983373,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5963.890147645195,\\"cutoff\\":4000}",
-  "5/8 -> 1/1: {\\"n\\":\\"F#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.29705226105983373,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5963.890147645195,\\"cutoff\\":4000}",
-  "5/8 -> 1/1: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.29705226105983373,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5963.890147645195,\\"cutoff\\":4000}",
-  "5/8 -> 1/1: {\\"n\\":\\"A4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.29705226105983373,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5963.890147645195,\\"cutoff\\":4000}",
-  "1/2 -> 7/8: {\\"n\\":\\"C#6\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.29000691362123476,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5974.128467049176,\\"cutoff\\":4000}",
-  "1/2 -> 7/8: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.29000691362123476,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5974.128467049176,\\"cutoff\\":4000}",
-  "1/2 -> 7/8: {\\"n\\":\\"E5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.29000691362123476,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5974.128467049176,\\"cutoff\\":4000}",
-  "1/2 -> 7/8: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.29000691362123476,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5974.128467049176,\\"cutoff\\":4000}",
-  "7/8 -> 5/4: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.3107861971007485,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5938.355801271282,\\"cutoff\\":4000}",
-  "7/8 -> 5/4: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.3107861971007485,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5938.355801271282,\\"cutoff\\":4000}",
-  "3/4 -> 9/8: {\\"n\\":\\"C#6\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.30398425548024827,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5951.963201008076,\\"cutoff\\":4000}",
-  "3/4 -> 9/8: {\\"n\\":\\"E5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.30398425548024827,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5951.963201008076,\\"cutoff\\":4000}",
-  "0/1 -> 1/4: {\\"n\\":\\"F#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2573601511491127,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.143312438893,\\"cutoff\\":4000}",
-  "0/1 -> 1/4: {\\"n\\":\\"A4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2573601511491127,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.143312438893,\\"cutoff\\":4000}",
-  "-1/8 -> 1/4: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2573601511491127,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.143312438893,\\"cutoff\\":4000}",
-  "-1/8 -> 1/4: {\\"n\\":\\"F#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2573601511491127,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.143312438893,\\"cutoff\\":4000}",
-  "-1/8 -> 1/4: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2573601511491127,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.143312438893,\\"cutoff\\":4000}",
-  "-1/8 -> 1/4: {\\"n\\":\\"A4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2573601511491127,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.143312438893,\\"cutoff\\":4000}",
-  "1/4 -> 1/2: {\\"n\\":\\"F#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.27200957116830426,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5992.29333433282,\\"cutoff\\":4000}",
-  "1/4 -> 1/2: {\\"n\\":\\"A4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.27200957116830426,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5992.29333433282,\\"cutoff\\":4000}",
-  "-1/4 -> 1/8: {\\"n\\":\\"C#6\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2536811842784369,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.785818935017,\\"cutoff\\":4000}",
-  "-1/4 -> 1/8: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2536811842784369,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.785818935017,\\"cutoff\\":4000}",
-  "-1/4 -> 1/8: {\\"n\\":\\"E5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2536811842784369,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.785818935017,\\"cutoff\\":4000}",
-  "-1/4 -> 1/8: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2536811842784369,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.785818935017,\\"cutoff\\":4000}",
-  "1/8 -> 1/2: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.26836160127988246,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5994.647308096509,\\"cutoff\\":4000}",
-  "1/8 -> 1/2: {\\"n\\":\\"F#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.26836160127988246,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5994.647308096509,\\"cutoff\\":4000}",
-  "1/8 -> 1/2: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.26836160127988246,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5994.647308096509,\\"cutoff\\":4000}",
-  "1/8 -> 1/2: {\\"n\\":\\"A4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.26836160127988246,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5994.647308096509,\\"cutoff\\":4000}",
-  "1/2 -> 3/4: {\\"n\\":\\"F#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.28644702698548963,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5978.612153434527,\\"cutoff\\":4000}",
-  "1/2 -> 3/4: {\\"n\\":\\"A4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.28644702698548963,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5978.612153434527,\\"cutoff\\":4000}",
-  "0/1 -> 1/4: bd",
-  "1/2 -> 3/4: bd",
-  "1/2 -> 1/1: sn",
-  "1/4 -> 1/2: hh3",
-  "3/4 -> 1/1: hh3",
-]
-`;
-
-exports[`renders shared tunes > shared tune 99 https://strudel.cc/?iw5ossp4Sti1 1`] = `
-[
-  "0/1 -> 3/20: 0",
-  "0/1 -> 3/20: 3",
-  "3/4 -> 9/10: 1",
-  "3/4 -> 9/10: 4",
-  "0/1 -> 3/10: -8",
-  "3/8 -> 27/40: -8",
-  "3/4 -> 21/20: -7",
-  "0/1 -> 3/200: 12",
-  "3/4 -> 153/200: 11",
-  "0/1 -> 3/20: c2",
-  "747/1000 -> 1497/1000: c1",
-  "0/1 -> 3/8: c2",
-  "3/8 -> 3/4: c2",
-  "3/4 -> 9/8: c2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 101 https://strudel.cc/?ISMZvMGByNst 1`] = `
-[
-  "0/1 -> 1/3: bd",
-  "1/3 -> 2/3: hh",
-  "2/3 -> 1/1: sn",
-  "0/1 -> 1/20: G4",
-  "1/6 -> 13/60: G4",
-  "1/3 -> 23/60: B3",
-  "1/2 -> 11/20: B3",
-  "1/3 -> 23/60: E4",
-  "1/2 -> 11/20: E4",
-  "2/3 -> 43/60: G3",
-  "5/6 -> 53/60: G3",
-  "0/1 -> 4/3: c2",
-  "0/1 -> 4/3: c2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 102 https://strudel.cc/?PDjOPOnV3JR6 1`] = `
-[
-  "0/1 -> 1/2: {\\"note\\":\\"G1\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":1500}",
-  "1/2 -> 1/1: {\\"note\\":\\"G1\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":1500}",
-  "1/2 -> 3/5: {\\"note\\":\\"G3\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":1530.954945061934}",
-  "1/2 -> 3/5: {\\"note\\":\\"Bb3\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":1530.954945061934}",
-  "1/2 -> 3/5: {\\"note\\":\\"D4\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":1530.954945061934}",
-  "5/8 -> 29/40: {\\"note\\":\\"G3\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":1530.954945061934}",
-  "5/8 -> 29/40: {\\"note\\":\\"Bb3\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":1530.954945061934}",
-  "5/8 -> 29/40: {\\"note\\":\\"D4\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":1530.954945061934}",
-  "0/1 -> 1/20: {\\"note\\":\\"F4\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":1132.6741512198269}",
-  "3/4 -> 17/20: {\\"note\\":\\"G3\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":1530.954945061934}",
-  "3/4 -> 17/20: {\\"note\\":\\"Bb3\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":1530.954945061934}",
-  "3/4 -> 17/20: {\\"note\\":\\"D4\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":1530.954945061934}",
-  "1/8 -> 7/40: {\\"note\\":\\"F4\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":1132.6741512198269}",
-  "7/8 -> 39/40: {\\"note\\":\\"G3\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":1530.954945061934}",
-  "7/8 -> 39/40: {\\"note\\":\\"Bb3\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":1530.954945061934}",
-  "7/8 -> 39/40: {\\"note\\":\\"D4\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":1530.954945061934}",
-  "0/1 -> 1/2: {\\"s\\":\\"bd\\"}",
-  "1/2 -> 1/1: {\\"s\\":\\"bd\\"}",
-  "1/4 -> 3/8: {\\"s\\":\\"hh\\"}",
-  "3/8 -> 1/2: {\\"s\\":\\"hh\\"}",
-  "3/4 -> 7/8: {\\"s\\":\\"hh\\"}",
-  "7/8 -> 1/1: {\\"s\\":\\"hh\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 103 https://strudel.cc/?u7qAdlwp3Qig 1`] = `
-[
-  "1/2 -> 1/1: {\\"note\\":\\"F3\\"}",
-  "1/2 -> 1/1: {\\"note\\":\\"C4\\"}",
-  "0/1 -> 1/1: {\\"note\\":\\"D4\\"}",
-  "0/1 -> 2/1: {\\"note\\":\\"D3\\"}",
-  "-3/4 -> 1/4: {\\"note\\":\\"A4\\"}",
-  "1/4 -> 9/4: {\\"note\\":\\"D4\\"}",
-  "0/1 -> 1/8: {\\"note\\":\\"c3\\"}",
-  "3/8 -> 1/2: {\\"note\\":\\"c3\\"}",
-  "3/4 -> 7/8: {\\"note\\":\\"c3\\"}",
-  "0/1 -> 1/4: {\\"note\\":\\"e4\\"}",
-  "1/4 -> 1/2: {\\"note\\":\\"f3\\"}",
-  "1/2 -> 3/4: {\\"note\\":\\"d4\\"}",
-  "3/4 -> 7/8: {\\"note\\":\\"f3\\"}",
-  "7/8 -> 1/1: {\\"note\\":\\"f3\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 104 https://strudel.cc/?OhjceF8ZvYk8 1`] = `
-[
-  "1/8 -> 1/4: {\\"n\\":\\"D1\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1699.6897509708342}",
-  "1/8 -> 1/4: {\\"n\\":\\"D1\\",\\"s\\":\\"square\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1699.6897509708342}",
-  "3/8 -> 1/2: {\\"n\\":\\"D2\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1765.826371664994}",
-  "3/8 -> 1/2: {\\"n\\":\\"D2\\",\\"s\\":\\"square\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1765.826371664994}",
-  "1/2 -> 5/8: {\\"n\\":\\"D1\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1798.799979846742}",
-  "1/2 -> 5/8: {\\"n\\":\\"D1\\",\\"s\\":\\"square\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1798.799979846742}",
-  "3/4 -> 7/8: {\\"n\\":\\"D3\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1864.4584935007128}",
-  "3/4 -> 7/8: {\\"n\\":\\"D3\\",\\"s\\":\\"square\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1864.4584935007128}",
-  "7/8 -> 1/1: {\\"n\\":\\"D3\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1897.1038487394403}",
-  "7/8 -> 1/1: {\\"n\\":\\"D3\\",\\"s\\":\\"square\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1897.1038487394403}",
-  "-3/8 -> 1/8: {\\"n\\":\\"G3\\",\\"s\\":\\"square\\",\\"gain\\":0.7,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0,\\"cutoff\\":1666.5665766857219}",
-  "-3/8 -> 1/8: {\\"n\\":\\"B3\\",\\"s\\":\\"square\\",\\"gain\\":0.7,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0,\\"cutoff\\":1666.5665766857219}",
-  "-1/4 -> 1/4: {\\"n\\":\\"G3\\",\\"s\\":\\"square\\",\\"gain\\":0.7,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0,\\"cutoff\\":1683.1306585059317}",
-  "-1/4 -> 1/4: {\\"n\\":\\"B3\\",\\"s\\":\\"square\\",\\"gain\\":0.7,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0,\\"cutoff\\":1683.1306585059317}",
-  "-1/8 -> 3/8: {\\"n\\":\\"G3\\",\\"s\\":\\"square\\",\\"gain\\":0.7,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0,\\"cutoff\\":1699.6897509708342}",
-  "-1/8 -> 3/8: {\\"n\\":\\"B3\\",\\"s\\":\\"square\\",\\"gain\\":0.7,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0,\\"cutoff\\":1699.6897509708342}",
-  "0/1 -> 3/8: {\\"n\\":\\"C#6\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.26103468453995016,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5998.072590601808,\\"cutoff\\":4000}",
-  "0/1 -> 3/8: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.26103468453995016,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5998.072590601808,\\"cutoff\\":4000}",
-  "0/1 -> 3/8: {\\"n\\":\\"E5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.26103468453995016,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5998.072590601808,\\"cutoff\\":4000}",
-  "0/1 -> 3/8: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.26103468453995016,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5998.072590601808,\\"cutoff\\":4000}",
-  "3/8 -> 3/4: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2828651860235305,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5982.671142387316,\\"cutoff\\":4000}",
-  "3/8 -> 3/4: {\\"n\\":\\"F#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2828651860235305,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5982.671142387316,\\"cutoff\\":4000}",
-  "3/8 -> 3/4: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2828651860235305,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5982.671142387316,\\"cutoff\\":4000}",
-  "3/8 -> 3/4: {\\"n\\":\\"A4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2828651860235305,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5982.671142387316,\\"cutoff\\":4000}",
-  "3/4 -> 1/1: {\\"n\\":\\"F#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.300533478008833,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5958.137268909887,\\"cutoff\\":4000}",
-  "3/4 -> 1/1: {\\"n\\":\\"A4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.300533478008833,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5958.137268909887,\\"cutoff\\":4000}",
-  "1/4 -> 5/8: {\\"n\\":\\"C#6\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2756442833140452,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5989.512318936654,\\"cutoff\\":4000}",
-  "1/4 -> 5/8: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2756442833140452,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5989.512318936654,\\"cutoff\\":4000}",
-  "1/4 -> 5/8: {\\"n\\":\\"E5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2756442833140452,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5989.512318936654,\\"cutoff\\":4000}",
-  "1/4 -> 5/8: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2756442833140452,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5989.512318936654,\\"cutoff\\":4000}",
-  "5/8 -> 1/1: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.29705226105983373,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5963.890147645195,\\"cutoff\\":4000}",
-  "5/8 -> 1/1: {\\"n\\":\\"F#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.29705226105983373,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5963.890147645195,\\"cutoff\\":4000}",
-  "5/8 -> 1/1: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.29705226105983373,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5963.890147645195,\\"cutoff\\":4000}",
-  "5/8 -> 1/1: {\\"n\\":\\"A4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.29705226105983373,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5963.890147645195,\\"cutoff\\":4000}",
-  "1/2 -> 7/8: {\\"n\\":\\"C#6\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.29000691362123476,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5974.128467049176,\\"cutoff\\":4000}",
-  "1/2 -> 7/8: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.29000691362123476,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5974.128467049176,\\"cutoff\\":4000}",
-  "1/2 -> 7/8: {\\"n\\":\\"E5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.29000691362123476,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5974.128467049176,\\"cutoff\\":4000}",
-  "1/2 -> 7/8: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.29000691362123476,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5974.128467049176,\\"cutoff\\":4000}",
-  "7/8 -> 5/4: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.3107861971007485,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5938.355801271282,\\"cutoff\\":4000}",
-  "7/8 -> 5/4: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.3107861971007485,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5938.355801271282,\\"cutoff\\":4000}",
-  "3/4 -> 9/8: {\\"n\\":\\"C#6\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.30398425548024827,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5951.963201008076,\\"cutoff\\":4000}",
-  "3/4 -> 9/8: {\\"n\\":\\"E5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.30398425548024827,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5951.963201008076,\\"cutoff\\":4000}",
-  "0/1 -> 1/4: {\\"n\\":\\"F#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2573601511491127,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.143312438893,\\"cutoff\\":4000}",
-  "0/1 -> 1/4: {\\"n\\":\\"A4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2573601511491127,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.143312438893,\\"cutoff\\":4000}",
-  "-1/8 -> 1/4: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2573601511491127,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.143312438893,\\"cutoff\\":4000}",
-  "-1/8 -> 1/4: {\\"n\\":\\"F#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2573601511491127,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.143312438893,\\"cutoff\\":4000}",
-  "-1/8 -> 1/4: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2573601511491127,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.143312438893,\\"cutoff\\":4000}",
-  "-1/8 -> 1/4: {\\"n\\":\\"A4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2573601511491127,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.143312438893,\\"cutoff\\":4000}",
-  "1/4 -> 1/2: {\\"n\\":\\"F#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.27200957116830426,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5992.29333433282,\\"cutoff\\":4000}",
-  "1/4 -> 1/2: {\\"n\\":\\"A4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.27200957116830426,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5992.29333433282,\\"cutoff\\":4000}",
-  "-1/4 -> 1/8: {\\"n\\":\\"C#6\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2536811842784369,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.785818935017,\\"cutoff\\":4000}",
-  "-1/4 -> 1/8: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2536811842784369,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.785818935017,\\"cutoff\\":4000}",
-  "-1/4 -> 1/8: {\\"n\\":\\"E5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2536811842784369,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.785818935017,\\"cutoff\\":4000}",
-  "-1/4 -> 1/8: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2536811842784369,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.785818935017,\\"cutoff\\":4000}",
-  "1/8 -> 1/2: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.26836160127988246,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5994.647308096509,\\"cutoff\\":4000}",
-  "1/8 -> 1/2: {\\"n\\":\\"F#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.26836160127988246,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5994.647308096509,\\"cutoff\\":4000}",
-  "1/8 -> 1/2: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.26836160127988246,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5994.647308096509,\\"cutoff\\":4000}",
-  "1/8 -> 1/2: {\\"n\\":\\"A4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.26836160127988246,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5994.647308096509,\\"cutoff\\":4000}",
-  "1/2 -> 3/4: {\\"n\\":\\"F#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.28644702698548963,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5978.612153434527,\\"cutoff\\":4000}",
-  "1/2 -> 3/4: {\\"n\\":\\"A4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.28644702698548963,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5978.612153434527,\\"cutoff\\":4000}",
-  "0/1 -> 1/4: bd",
-  "1/2 -> 3/4: bd",
-  "1/2 -> 1/1: sn",
-  "1/4 -> 1/2: hh3",
-  "3/4 -> 1/1: hh3",
-]
-`;
-
-exports[`renders shared tunes > shared tune 105 https://strudel.cc/?4yn-ch_d1hnA 1`] = `
-[
-  "0/1 -> 1/4: C3",
-  "0/1 -> 1/4: G3",
-  "0/1 -> 1/4: C4",
-  "1/2 -> 3/4: C3",
-  "1/2 -> 3/4: G3",
-  "1/2 -> 3/4: C4",
-  "0/1 -> 1/2: c2",
-  "1/2 -> 5/8: c2",
-  "3/4 -> 7/8: c2",
-  "0/1 -> 1/2: c1",
-  "1/2 -> 1/1: c1",
-]
-`;
-
-exports[`renders shared tunes > shared tune 106 https://strudel.cc/?2M1kLwRf6d-Q 1`] = `
-[
-  "0/1 -> 1/4: C3",
-  "0/1 -> 1/4: G3",
-  "0/1 -> 1/4: C4",
-  "1/2 -> 3/4: C3",
-  "1/2 -> 3/4: G3",
-  "1/2 -> 3/4: C4",
-  "0/1 -> 1/2: c2",
-  "1/2 -> 5/8: c2",
-  "3/4 -> 7/8: c2",
-  "0/1 -> 1/2: c1",
-  "1/2 -> 1/1: c1",
-]
-`;
-
-exports[`renders shared tunes > shared tune 107 https://strudel.cc/?XggCKeAH5uLK 1`] = `
-[
-  "0/1 -> 1/4: C3",
-  "0/1 -> 1/4: G3",
-  "0/1 -> 1/4: C4",
-  "1/2 -> 3/4: C3",
-  "1/2 -> 3/4: G3",
-  "1/2 -> 3/4: C4",
-  "0/1 -> 1/2: c2",
-  "1/2 -> 5/8: c2",
-  "3/4 -> 7/8: c2",
-  "0/1 -> 1/2: c1",
-  "1/2 -> 1/1: c1",
-]
-`;
-
-exports[`renders shared tunes > shared tune 108 https://strudel.cc/?BH_o1f7vPxd3 1`] = `
-[
-  "0/1 -> 3/4: c3",
-  "3/4 -> 1/1: eb3",
-  "3/4 -> 1/1: g3",
-  "3/4 -> 1/1: c4",
-  "0/1 -> 1/2: c2",
-  "1/2 -> 1/1: g2",
-  "0/1 -> 5/2: eb4",
-]
-`;
-
-exports[`renders shared tunes > shared tune 109 https://strudel.cc/?OdgRkOYpGrgF 1`] = `
-[
-  "0/1 -> 3/20: 0",
-  "0/1 -> 3/20: 3",
-  "3/4 -> 9/10: 1",
-  "3/4 -> 9/10: 4",
-  "0/1 -> 3/10: -8",
-  "3/8 -> 27/40: -8",
-  "3/4 -> 21/20: -7",
-  "0/1 -> 3/200: 12",
-  "3/4 -> 153/200: 11",
-  "0/1 -> 3/20: c2",
-  "747/1000 -> 1497/1000: c1",
-  "0/1 -> 3/8: c2",
-  "3/8 -> 3/4: c2",
-  "3/4 -> 9/8: c2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 110 https://strudel.cc/?Yizg74mNj_6L 1`] = `[]`;
-
-exports[`renders shared tunes > shared tune 113 https://strudel.cc/?X7Vln6QqABL2 1`] = `
-[
-  "0/1 -> 1/3: {\\"value\\":0,\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":null}",
-  "1/3 -> 2/3: {\\"value\\":5,\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":null}",
-  "2/3 -> 1/1: {\\"value\\":7,\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":null}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 114 https://strudel.cc/?ILwq_zKFMNN5 1`] = `
-[
-  "0/1 -> 1/3: bd",
-  "1/3 -> 2/3: hh",
-  "2/3 -> 1/1: sn",
-  "0/1 -> 1/20: G4",
-  "1/6 -> 13/60: G4",
-  "1/3 -> 23/60: B3",
-  "1/2 -> 11/20: B3",
-  "1/3 -> 23/60: E4",
-  "1/2 -> 11/20: E4",
-  "2/3 -> 43/60: G3",
-  "5/6 -> 53/60: G3",
-  "0/1 -> 4/3: c2",
-  "0/1 -> 4/3: c2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 115 https://strudel.cc/?CSzelQFTGerr 1`] = `
-[
-  "0/1 -> 63/220: f#6",
-  "7/22 -> 133/220: f#6",
-  "7/11 -> 203/220: f#6",
-  "21/22 -> 609/440: f#6",
-  "0/1 -> 21/88: 71",
-  "0/1 -> 21/88: 75",
-  "0/1 -> 21/88: 78",
-  "21/44 -> 63/88: 71",
-  "21/44 -> 63/88: 75",
-  "21/44 -> 63/88: 78",
-  "21/22 -> 105/88: 71",
-  "21/22 -> 105/88: 75",
-  "21/22 -> 105/88: 78",
-]
-`;
-
-exports[`renders shared tunes > shared tune 116 https://strudel.cc/?j5oC-CSjk7Kq 1`] = `
-[
-  "0/1 -> 1/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "0/1 -> 1/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "0/1 -> 1/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "0/1 -> 1/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 5/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 5/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 5/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 5/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "0/1 -> 1/2: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "3/4 -> 7/8: {\\"note\\":\\"G2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.44907407407407407}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 117 https://strudel.cc/?waoDkqtNx0Xe 1`] = `
-[
-  "0/1 -> 1/2: c1",
-  "1/2 -> 1/1: c1",
-  "1/2 -> 1/1: x",
-  "1/4 -> 1/2: c4",
-  "3/4 -> 1/1: c4",
-  "0/1 -> 1/2: B1",
-  "3/4 -> 1/1: B1",
-  "1/4 -> 13/44: A3",
-  "1/4 -> 13/44: C#4",
-  "1/4 -> 13/44: D4",
-  "1/4 -> 13/44: F#4",
-]
-`;
-
-exports[`renders shared tunes > shared tune 118 https://strudel.cc/?hHssvZuQ9eU- 1`] = `
-[
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/8 -> 1/4: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "1/8 -> 1/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/8 -> 1/4: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "1/8 -> 1/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/8 -> 1/4: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "1/8 -> 1/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/8 -> 1/4: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "1/8 -> 1/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/8 -> 1/4: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "1/8 -> 1/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/8 -> 1/4: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "1/8 -> 1/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/8 -> 1/4: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "1/8 -> 1/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/8 -> 1/4: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "1/8 -> 1/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 5/8: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 5/8: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 5/8: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 5/8: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 5/8: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 5/8: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 5/8: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 5/8: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 5/8: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 5/8: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 5/8: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 5/8: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 5/8: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 5/8: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 5/8: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 5/8: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "3/4 -> 7/8: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "3/4 -> 7/8: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "3/4 -> 7/8: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "3/4 -> 7/8: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "3/4 -> 7/8: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "3/4 -> 7/8: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "3/4 -> 7/8: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "3/4 -> 7/8: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "3/4 -> 7/8: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "3/4 -> 7/8: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "3/4 -> 7/8: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "3/4 -> 7/8: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "3/4 -> 7/8: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "3/4 -> 7/8: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "3/4 -> 7/8: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "3/4 -> 7/8: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 119 https://strudel.cc/?YjCJ3DhT9u4M 1`] = `[]`;
-
-exports[`renders shared tunes > shared tune 121 https://strudel.cc/?wrcmJLYiesgF 1`] = `
-[
-  "0/1 -> 19/80: e5",
-  "1/2 -> 79/120: d5",
-  "2/3 -> 179/240: c5",
-  "11/12 -> 239/240: e5",
-  "1/4 -> 1/2: g4",
-  "3/4 -> 1/1: g4",
-  "0/1 -> 1/4: c3",
-  "1/2 -> 3/4: c3",
-]
-`;
-
-exports[`renders shared tunes > shared tune 122 https://strudel.cc/?tiYDzBGIFjYV 1`] = `
-[
-  "0/1 -> 2/1: {\\"note\\":\\"C3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.4722222222222222}",
-  "0/1 -> 2/1: {\\"note\\":\\"E3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.4907407407407407}",
-  "0/1 -> 1/1: {\\"note\\":\\"B3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5231481481481481}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 123 https://strudel.cc/?Y1nz8H0a10CF 1`] = `
-[
-  "-1666666666666667/7500000000000000 -> 2/9: G3",
-  "0/1 -> 4/3: E3",
-  "0/1 -> 4/3: A3",
-  "0/1 -> 4/3: D4",
-  "0/1 -> 4/3: G4",
-  "0/1 -> 4/3: B4",
-  "0/1 -> 2/3: D2",
-  "2/3 -> 7/9: D2",
-  "8/9 -> 1/1: D2",
-  "0/1 -> 2/9: c1",
-  "2/9 -> 4/9: c1",
-  "4/9 -> 2/3: c1",
-  "2/3 -> 8/9: c1",
-  "8/9 -> 10/9: c1",
-  "2/3 -> 4/3: c3",
-  "0/1 -> 10/9: c1",
-  "0/1 -> 16/3: F3",
-  "0/1 -> 16/3: A3",
-]
-`;
-
-exports[`renders shared tunes > shared tune 124 https://strudel.cc/?SZDwdxhme28o 1`] = `
-[
-  "11/32 -> 1/2: {\\"n\\":\\"Bb3\\",\\"cutoff\\":1625,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.931367192988896}",
-  "11/32 -> 1/2: {\\"n\\":\\"D4\\",\\"cutoff\\":1625,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.931367192988896}",
-  "11/32 -> 1/2: {\\"n\\":\\"Eb4\\",\\"cutoff\\":1625,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.931367192988896}",
-  "11/32 -> 1/2: {\\"n\\":\\"G4\\",\\"cutoff\\":1625,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.931367192988896}",
-  "27/32 -> 1/1: {\\"n\\":\\"Bb3\\",\\"cutoff\\":1625,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.7003744165515706}",
-  "27/32 -> 1/1: {\\"n\\":\\"D4\\",\\"cutoff\\":1625,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.7003744165515706}",
-  "27/32 -> 1/1: {\\"n\\":\\"Eb4\\",\\"cutoff\\":1625,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.7003744165515706}",
-  "27/32 -> 1/1: {\\"n\\":\\"G4\\",\\"cutoff\\":1625,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.7003744165515706}",
-  "7/160 -> 1/5: {\\"n\\":\\"A3\\",\\"cutoff\\":875,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.9941475200179347}",
-  "7/160 -> 1/5: {\\"n\\":\\"C#4\\",\\"cutoff\\":875,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.9941475200179347}",
-  "7/160 -> 1/5: {\\"n\\":\\"D4\\",\\"cutoff\\":875,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.9941475200179347}",
-  "7/160 -> 1/5: {\\"n\\":\\"F#4\\",\\"cutoff\\":875,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.9941475200179347}",
-  "87/160 -> 7/10: {\\"n\\":\\"Bb3\\",\\"cutoff\\":1625,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.8549390618276451}",
-  "87/160 -> 7/10: {\\"n\\":\\"D4\\",\\"cutoff\\":1625,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.8549390618276451}",
-  "87/160 -> 7/10: {\\"n\\":\\"Eb4\\",\\"cutoff\\":1625,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.8549390618276451}",
-  "87/160 -> 7/10: {\\"n\\":\\"G4\\",\\"cutoff\\":1625,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.8549390618276451}",
-  "39/160 -> 2/5: {\\"n\\":\\"A3\\",\\"cutoff\\":875,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.959653570669591}",
-  "39/160 -> 2/5: {\\"n\\":\\"C#4\\",\\"cutoff\\":875,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.959653570669591}",
-  "39/160 -> 2/5: {\\"n\\":\\"D4\\",\\"cutoff\\":875,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.959653570669591}",
-  "39/160 -> 2/5: {\\"n\\":\\"F#4\\",\\"cutoff\\":875,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.959653570669591}",
-  "119/160 -> 9/10: {\\"n\\":\\"Bb3\\",\\"cutoff\\":1625,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.7562088040372065}",
-  "119/160 -> 9/10: {\\"n\\":\\"D4\\",\\"cutoff\\":1625,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.7562088040372065}",
-  "119/160 -> 9/10: {\\"n\\":\\"Eb4\\",\\"cutoff\\":1625,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.7562088040372065}",
-  "119/160 -> 9/10: {\\"n\\":\\"G4\\",\\"cutoff\\":1625,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.7562088040372065}",
-  "0/1 -> 1/16: {\\"n\\":\\"c2\\",\\"decay\\":0.1,\\"gain\\":0.5,\\"sustain\\":0.8,\\"cutoff\\":1416.8907004672358,\\"value\\":\\"x\\",\\"s\\":\\"sawtooth\\"}",
-  "3/16 -> 1/4: {\\"n\\":\\"c2\\",\\"decay\\":0.1,\\"gain\\":0.5,\\"sustain\\":0.8,\\"cutoff\\":1416.8907004672358,\\"value\\":\\"x\\",\\"s\\":\\"sawtooth\\"}",
-  "3/8 -> 7/16: {\\"n\\":\\"c2\\",\\"decay\\":0.1,\\"gain\\":0.5,\\"sustain\\":0.8,\\"cutoff\\":1416.8907004672358,\\"value\\":\\"x\\",\\"s\\":\\"sawtooth\\"}",
-  "1/2 -> 9/16: {\\"n\\":\\"eb2\\",\\"decay\\":0.1,\\"gain\\":0.5,\\"sustain\\":0.8,\\"cutoff\\":1717.61735139405,\\"value\\":\\"x\\",\\"s\\":\\"sawtooth\\"}",
-  "11/16 -> 3/4: {\\"n\\":\\"eb2\\",\\"decay\\":0.1,\\"gain\\":0.5,\\"sustain\\":0.8,\\"cutoff\\":1717.61735139405,\\"value\\":\\"x\\",\\"s\\":\\"sawtooth\\"}",
-  "7/8 -> 15/16: {\\"n\\":\\"eb2\\",\\"decay\\":0.1,\\"gain\\":0.5,\\"sustain\\":0.8,\\"cutoff\\":1717.61735139405,\\"value\\":\\"x\\",\\"s\\":\\"sawtooth\\"}",
-  "0/1 -> 1/6: {\\"s\\":\\"bd\\"}",
-  "1/2 -> 1/1: {\\"s\\":\\"sd\\"}",
-  "0/1 -> 11/32: {\\"s\\":\\"hh\\"}",
-  "1/2 -> 27/32: {\\"s\\":\\"hh\\"}",
-  "11/32 -> 1/2: {\\"s\\":\\"hh\\"}",
-  "27/32 -> 1/1: {\\"s\\":\\"hh\\"}",
-  "0/1 -> 1/4: {\\"n\\":\\"C5\\",\\"decay\\":0.05,\\"sustain\\":0,\\"gain\\":0.5,\\"pan\\":0.5782172325201155}",
-  "-3/16 -> 1/16: {\\"n\\":\\"D6\\",\\"decay\\":0.05,\\"sustain\\":0,\\"gain\\":0.5,\\"pan\\":0.5196299078795343}",
-  "13/16 -> 17/16: {\\"n\\":\\"D6\\",\\"decay\\":0.05,\\"sustain\\":0,\\"gain\\":0.5,\\"pan\\":0.9540715869125407}",
-  "-1/20 -> 1/5: {\\"n\\":\\"Bb5\\",\\"decay\\":0.05,\\"sustain\\":0,\\"gain\\":0.5,\\"pan\\":0.5626666167821521}",
-  "-19/80 -> 1/80: {\\"n\\":\\"A5\\",\\"decay\\":0.05,\\"sustain\\":0,\\"gain\\":0.5,\\"pan\\":0.5039269504443556}",
-  "1/80 -> 21/80: {\\"n\\":\\"D6\\",\\"decay\\":0.05,\\"sustain\\":0,\\"gain\\":0.5,\\"pan\\":0.5859645501397047}",
-  "1/5 -> 9/20: {\\"n\\":\\"C5\\",\\"decay\\":0.05,\\"sustain\\":0,\\"gain\\":0.5,\\"pan\\":0.6985739453173903}",
-  "1/80 -> 21/80: {\\"n\\":\\"D6\\",\\"decay\\":0.05,\\"sustain\\":0,\\"gain\\":0.5,\\"pan\\":0.5859645501397047}",
-  "3/20 -> 2/5: {\\"n\\":\\"Bb5\\",\\"decay\\":0.05,\\"sustain\\":0,\\"gain\\":0.5,\\"pan\\":0.6693689601226457}",
-  "-3/80 -> 17/80: {\\"n\\":\\"A5\\",\\"decay\\":0.05,\\"sustain\\":0,\\"gain\\":0.5,\\"pan\\":0.5665606692632762}",
-  "17/80 -> 37/80: {\\"n\\":\\"D6\\",\\"decay\\":0.05,\\"sustain\\":0,\\"gain\\":0.5,\\"pan\\":0.7057571793025544}",
-  "2/5 -> 13/20: {\\"n\\":\\"C5\\",\\"decay\\":0.05,\\"sustain\\":0,\\"gain\\":0.5,\\"pan\\":0.8064535268264882}",
-  "17/80 -> 37/80: {\\"n\\":\\"D6\\",\\"decay\\":0.05,\\"sustain\\":0,\\"gain\\":0.5,\\"pan\\":0.7057571793025544}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 125 https://strudel.cc/?m7Uyh34tQwqi 1`] = `
-[
-  "11/32 -> 1/2: {\\"n\\":\\"Bb3\\",\\"cutoff\\":1625,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.931367192988896}",
-  "11/32 -> 1/2: {\\"n\\":\\"D4\\",\\"cutoff\\":1625,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.931367192988896}",
-  "11/32 -> 1/2: {\\"n\\":\\"Eb4\\",\\"cutoff\\":1625,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.931367192988896}",
-  "11/32 -> 1/2: {\\"n\\":\\"G4\\",\\"cutoff\\":1625,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.931367192988896}",
-  "27/32 -> 1/1: {\\"n\\":\\"Bb3\\",\\"cutoff\\":1625,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.7003744165515706}",
-  "27/32 -> 1/1: {\\"n\\":\\"D4\\",\\"cutoff\\":1625,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.7003744165515706}",
-  "27/32 -> 1/1: {\\"n\\":\\"Eb4\\",\\"cutoff\\":1625,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.7003744165515706}",
-  "27/32 -> 1/1: {\\"n\\":\\"G4\\",\\"cutoff\\":1625,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.7003744165515706}",
-  "7/160 -> 1/5: {\\"n\\":\\"A3\\",\\"cutoff\\":875,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.9941475200179347}",
-  "7/160 -> 1/5: {\\"n\\":\\"C#4\\",\\"cutoff\\":875,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.9941475200179347}",
-  "7/160 -> 1/5: {\\"n\\":\\"D4\\",\\"cutoff\\":875,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.9941475200179347}",
-  "7/160 -> 1/5: {\\"n\\":\\"F#4\\",\\"cutoff\\":875,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.9941475200179347}",
-  "87/160 -> 7/10: {\\"n\\":\\"Bb3\\",\\"cutoff\\":1625,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.8549390618276451}",
-  "87/160 -> 7/10: {\\"n\\":\\"D4\\",\\"cutoff\\":1625,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.8549390618276451}",
-  "87/160 -> 7/10: {\\"n\\":\\"Eb4\\",\\"cutoff\\":1625,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.8549390618276451}",
-  "87/160 -> 7/10: {\\"n\\":\\"G4\\",\\"cutoff\\":1625,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.8549390618276451}",
-  "39/160 -> 2/5: {\\"n\\":\\"A3\\",\\"cutoff\\":875,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.959653570669591}",
-  "39/160 -> 2/5: {\\"n\\":\\"C#4\\",\\"cutoff\\":875,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.959653570669591}",
-  "39/160 -> 2/5: {\\"n\\":\\"D4\\",\\"cutoff\\":875,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.959653570669591}",
-  "39/160 -> 2/5: {\\"n\\":\\"F#4\\",\\"cutoff\\":875,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.959653570669591}",
-  "119/160 -> 9/10: {\\"n\\":\\"Bb3\\",\\"cutoff\\":1625,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.7562088040372065}",
-  "119/160 -> 9/10: {\\"n\\":\\"D4\\",\\"cutoff\\":1625,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.7562088040372065}",
-  "119/160 -> 9/10: {\\"n\\":\\"Eb4\\",\\"cutoff\\":1625,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.7562088040372065}",
-  "119/160 -> 9/10: {\\"n\\":\\"G4\\",\\"cutoff\\":1625,\\"s\\":\\"square\\",\\"decay\\":0.1,\\"sustain\\":0,\\"resonance\\":16,\\"gain\\":0.2,\\"pan\\":0.7562088040372065}",
-  "0/1 -> 1/16: {\\"n\\":\\"c2\\",\\"decay\\":0.1,\\"gain\\":0.5,\\"sustain\\":0.8,\\"cutoff\\":1416.8907004672358,\\"value\\":\\"x\\",\\"s\\":\\"sawtooth\\"}",
-  "3/16 -> 1/4: {\\"n\\":\\"c2\\",\\"decay\\":0.1,\\"gain\\":0.5,\\"sustain\\":0.8,\\"cutoff\\":1416.8907004672358,\\"value\\":\\"x\\",\\"s\\":\\"sawtooth\\"}",
-  "3/8 -> 7/16: {\\"n\\":\\"c2\\",\\"decay\\":0.1,\\"gain\\":0.5,\\"sustain\\":0.8,\\"cutoff\\":1416.8907004672358,\\"value\\":\\"x\\",\\"s\\":\\"sawtooth\\"}",
-  "1/2 -> 9/16: {\\"n\\":\\"eb2\\",\\"decay\\":0.1,\\"gain\\":0.5,\\"sustain\\":0.8,\\"cutoff\\":1717.61735139405,\\"value\\":\\"x\\",\\"s\\":\\"sawtooth\\"}",
-  "11/16 -> 3/4: {\\"n\\":\\"eb2\\",\\"decay\\":0.1,\\"gain\\":0.5,\\"sustain\\":0.8,\\"cutoff\\":1717.61735139405,\\"value\\":\\"x\\",\\"s\\":\\"sawtooth\\"}",
-  "7/8 -> 15/16: {\\"n\\":\\"eb2\\",\\"decay\\":0.1,\\"gain\\":0.5,\\"sustain\\":0.8,\\"cutoff\\":1717.61735139405,\\"value\\":\\"x\\",\\"s\\":\\"sawtooth\\"}",
-  "0/1 -> 1/6: {\\"s\\":\\"bd\\"}",
-  "1/2 -> 1/1: {\\"s\\":\\"sd\\"}",
-  "0/1 -> 11/32: {\\"s\\":\\"hh\\"}",
-  "1/2 -> 27/32: {\\"s\\":\\"hh\\"}",
-  "11/32 -> 1/2: {\\"s\\":\\"hh\\"}",
-  "27/32 -> 1/1: {\\"s\\":\\"hh\\"}",
-  "0/1 -> 1/4: {\\"n\\":\\"C5\\",\\"decay\\":0.05,\\"sustain\\":0,\\"gain\\":0.5,\\"pan\\":0.5782172325201155}",
-  "-3/16 -> 1/16: {\\"n\\":\\"D6\\",\\"decay\\":0.05,\\"sustain\\":0,\\"gain\\":0.5,\\"pan\\":0.5196299078795343}",
-  "13/16 -> 17/16: {\\"n\\":\\"D6\\",\\"decay\\":0.05,\\"sustain\\":0,\\"gain\\":0.5,\\"pan\\":0.9540715869125407}",
-  "-1/20 -> 1/5: {\\"n\\":\\"Bb5\\",\\"decay\\":0.05,\\"sustain\\":0,\\"gain\\":0.5,\\"pan\\":0.5626666167821521}",
-  "-19/80 -> 1/80: {\\"n\\":\\"A5\\",\\"decay\\":0.05,\\"sustain\\":0,\\"gain\\":0.5,\\"pan\\":0.5039269504443556}",
-  "1/80 -> 21/80: {\\"n\\":\\"D6\\",\\"decay\\":0.05,\\"sustain\\":0,\\"gain\\":0.5,\\"pan\\":0.5859645501397047}",
-  "1/5 -> 9/20: {\\"n\\":\\"C5\\",\\"decay\\":0.05,\\"sustain\\":0,\\"gain\\":0.5,\\"pan\\":0.6985739453173903}",
-  "1/80 -> 21/80: {\\"n\\":\\"D6\\",\\"decay\\":0.05,\\"sustain\\":0,\\"gain\\":0.5,\\"pan\\":0.5859645501397047}",
-  "3/20 -> 2/5: {\\"n\\":\\"Bb5\\",\\"decay\\":0.05,\\"sustain\\":0,\\"gain\\":0.5,\\"pan\\":0.6693689601226457}",
-  "-3/80 -> 17/80: {\\"n\\":\\"A5\\",\\"decay\\":0.05,\\"sustain\\":0,\\"gain\\":0.5,\\"pan\\":0.5665606692632762}",
-  "17/80 -> 37/80: {\\"n\\":\\"D6\\",\\"decay\\":0.05,\\"sustain\\":0,\\"gain\\":0.5,\\"pan\\":0.7057571793025544}",
-  "2/5 -> 13/20: {\\"n\\":\\"C5\\",\\"decay\\":0.05,\\"sustain\\":0,\\"gain\\":0.5,\\"pan\\":0.8064535268264882}",
-  "17/80 -> 37/80: {\\"n\\":\\"D6\\",\\"decay\\":0.05,\\"sustain\\":0,\\"gain\\":0.5,\\"pan\\":0.7057571793025544}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 126 https://strudel.cc/?P9d8_AXWM7ef 1`] = `
-[
-  "0/1 -> 3/4: c3",
-  "3/4 -> 1/1: eb3",
-  "3/4 -> 1/1: g3",
-  "3/4 -> 1/1: c4",
-  "0/1 -> 1/2: c2",
-  "1/2 -> 1/1: g2",
-  "0/1 -> 5/4: eb4",
-]
-`;
-
-exports[`renders shared tunes > shared tune 127 https://strudel.cc/?FM1koCTLh1IM 1`] = `
-[
-  "0/1 -> 1/10: C3",
-  "0/1 -> 1/10: E3",
-  "0/1 -> 1/10: G3",
-  "1/4 -> 7/20: B3",
-  "1/4 -> 7/20: E4",
-  "1/4 -> 7/20: E3",
-  "1/2 -> 3/5: C3",
-  "1/2 -> 3/5: A2",
-  "1/2 -> 3/5: C3",
-  "3/4 -> 17/20: E3",
-  "3/4 -> 17/20: G3",
-  "3/4 -> 17/20: B3",
-  "0/1 -> 1/5: C2",
-  "1/2 -> 7/10: E2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 128 https://strudel.cc/?1SAqiKiVI8r- 1`] = `
-[
-  "0/1 -> 3/20: 0",
-  "0/1 -> 3/20: 3",
-  "3/4 -> 9/10: 1",
-  "3/4 -> 9/10: 4",
-  "0/1 -> 3/10: -8",
-  "3/8 -> 27/40: -8",
-  "3/4 -> 21/20: -7",
-  "0/1 -> 3/200: 12",
-  "3/4 -> 153/200: 11",
-  "0/1 -> 3/20: c2",
-  "747/1000 -> 1497/1000: c1",
-  "0/1 -> 3/8: c2",
-  "3/8 -> 3/4: c2",
-  "3/4 -> 9/8: c2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 129 https://strudel.cc/?Pds79yD4qQKJ 1`] = `
-[
-  "0/1 -> 1/5: e4",
-  "2/5 -> 3/5: e3",
-  "3/5 -> 4/5: d4",
-]
-`;
-
-exports[`renders shared tunes > shared tune 130 https://strudel.cc/?DYJx5C-3NrV7 1`] = `
-[
-  "0/1 -> 5/26: {\\"note\\":\\"B2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.46759259259259256}",
-  "5/13 -> 15/26: {\\"note\\":\\"B2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.46759259259259256}",
-  "10/13 -> 155/156: {\\"note\\":\\"B2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.46759259259259256}",
-  "155/156 -> 15/13: {\\"note\\":\\"A2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.45833333333333337}",
-  "0/1 -> 15/26: {\\"note\\":\\"B3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5231481481481481}",
-  "5/52 -> 35/52: {\\"note\\":\\"C#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5324074074074074}",
-  "5/26 -> 10/13: {\\"note\\":\\"D#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "15/52 -> 45/52: {\\"note\\":\\"F4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5509259259259259}",
-  "5/13 -> 25/26: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "25/52 -> 55/52: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "15/26 -> 15/13: {\\"note\\":\\"B4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5787037037037037}",
-  "35/52 -> 5/4: {\\"note\\":\\"C#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.587962962962963}",
-  "5/13 -> 25/26: {\\"note\\":\\"B3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5231481481481481}",
-  "25/52 -> 55/52: {\\"note\\":\\"C#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5324074074074074}",
-  "15/26 -> 15/13: {\\"note\\":\\"D#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "35/52 -> 5/4: {\\"note\\":\\"F4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5509259259259259}",
-  "10/13 -> 35/26: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "45/52 -> 75/52: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "25/26 -> 20/13: {\\"note\\":\\"B4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5787037037037037}",
-  "10/13 -> 35/26: {\\"note\\":\\"B3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5231481481481481}",
-  "45/52 -> 75/52: {\\"note\\":\\"C#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5324074074074074}",
-  "25/26 -> 20/13: {\\"note\\":\\"D#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "0/1 -> 80/13: {\\"s\\":\\"mad\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 131 https://strudel.cc/?9_BPqHIO4rPv 1`] = `
-[
-  "0/1 -> 27/40: {\\"note\\":\\"Db4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5324074074074074}",
-  "0/1 -> 27/40: {\\"note\\":\\"Ab4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5648148148148149}",
-  "0/1 -> 27/40: {\\"note\\":\\"Db4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5324074074074074}",
-  "0/1 -> 27/40: {\\"note\\":\\"Ab4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5648148148148149}",
-  "0/1 -> 27/40: {\\"note\\":\\"Db4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5324074074074074}",
-  "0/1 -> 27/40: {\\"note\\":\\"Ab4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5648148148148149}",
-  "0/1 -> 27/40: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "0/1 -> 27/40: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "0/1 -> 27/40: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "0/1 -> 27/40: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "0/1 -> 27/40: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "0/1 -> 27/40: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "0/1 -> 27/40: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "0/1 -> 27/40: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "0/1 -> 27/40: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "0/1 -> 27/40: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "0/1 -> 27/40: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "0/1 -> 27/40: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "0/1 -> 27/40: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "0/1 -> 27/40: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "0/1 -> 27/40: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "0/1 -> 27/40: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "0/1 -> 27/40: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "0/1 -> 27/40: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "0/1 -> 27/40: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "0/1 -> 27/40: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "0/1 -> 27/40: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "0/1 -> 27/40: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "0/1 -> 27/40: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "0/1 -> 27/40: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "0/1 -> 171/160: {\\"note\\":\\"Bb2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.46296296296296297}",
-  "3/4 -> 33/40: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "3/4 -> 33/40: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "3/4 -> 33/40: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "3/4 -> 33/40: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "0/1 -> 171/160: {\\"note\\":\\"Bb2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.46296296296296297}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 132 https://strudel.cc/?FwkQ0EG3Kkwm 1`] = `
-[
-  "0/1 -> 1/2: Bb2",
-  "0/1 -> 1/2: F3",
-  "0/1 -> 1/2: Bb3",
-  "1/2 -> 1/1: Bb2",
-  "1/2 -> 1/1: Bb2",
-  "1/2 -> 1/1: F3",
-  "1/2 -> 1/1: F3",
-  "1/2 -> 1/1: Bb3",
-  "1/2 -> 1/1: Bb3",
-  "0/1 -> 1/2: Bb1",
-  "1/2 -> 5/8: Bb1",
-  "3/4 -> 7/8: Bb1",
-  "0/1 -> 1/2: c1",
-  "1/2 -> 1/1: c1",
-  "1/2 -> 1/1: c3",
-  "0/1 -> 1/4: C1",
-  "1/4 -> 1/2: C3",
-  "1/2 -> 3/4: C1",
-  "3/4 -> 1/1: C3",
-]
-`;
-
-exports[`renders shared tunes > shared tune 133 https://strudel.cc/?Cb_YrHpHKkJN 1`] = `
-[
-  "0/1 -> 1/8: {\\"note\\":\\"A2\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2206.5338497506646,\\"resonance\\":10,\\"clip\\":1}",
-  "3/8 -> 1/2: {\\"note\\":\\"A2\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2827.098521493671,\\"resonance\\":10,\\"clip\\":1}",
-  "3/4 -> 7/8: {\\"note\\":\\"A2\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3366.0584981088073,\\"resonance\\":10,\\"clip\\":1}",
-  "0/1 -> 1/4: {\\"note\\":\\"A3\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2312.732504596285,\\"resonance\\":10,\\"clip\\":1}",
-  "3/4 -> 1/1: {\\"note\\":\\"A3\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3443.5028842544402,\\"resonance\\":10,\\"clip\\":1}",
-  "-7/4 -> 1/4: {\\"note\\":\\"C4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2312.732504596285,\\"resonance\\":10,\\"clip\\":1}",
-  "-7/4 -> 1/4: {\\"note\\":\\"E4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2312.732504596285,\\"resonance\\":10,\\"clip\\":1}",
-  "1/4 -> 1/2: {\\"note\\":\\"C4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "1/4 -> 1/2: {\\"note\\":\\"E4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/2 -> 1/2: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2522.789774516997,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/2 -> 1/2: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2522.789774516997,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/2 -> 1/2: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2522.789774516997,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/2 -> 1/2: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2522.789774516997,\\"resonance\\":10,\\"clip\\":1}",
-  "1/2 -> 3/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3110.8609453791396,\\"resonance\\":10,\\"clip\\":1}",
-  "1/2 -> 3/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3110.8609453791396,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "3/4 -> 1/1: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3443.5028842544402,\\"resonance\\":10,\\"clip\\":1}",
-  "3/4 -> 1/1: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3443.5028842544402,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/4 -> 5/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/4 -> 5/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/4 -> 5/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/4 -> 5/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "0/1 -> 1/2: {\\"s\\":\\"bd:1\\"}",
-  "1/2 -> 1/1: {\\"s\\":\\"bd:1\\"}",
-  "1/2 -> 1/1: {\\"s\\":\\"sd:0\\"}",
-  "1/4 -> 1/2: {\\"s\\":\\"hh:0\\"}",
-  "3/4 -> 1/1: {\\"s\\":\\"hh:0\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 134 https://strudel.cc/?SkqbkK705Olu 1`] = `
-[
-  "7/8 -> 1/1: {\\"s\\":\\"hi\\"}",
-  "5/8 -> 3/4: {\\"s\\":\\"lo\\"}",
-  "3/8 -> 1/2: {\\"s\\":\\"hi\\"}",
-  "3/16 -> 1/4: {\\"s\\":\\"hi\\"}",
-  "0/1 -> 1/8: {\\"s\\":\\"hi\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 135 https://strudel.cc/?-hyad472v8by 1`] = `
-[
-  "0/1 -> 3/8: {\\"gain\\":1,\\"s\\":\\"lo\\",\\"speed\\":2}",
-  "3/8 -> 3/4: {\\"gain\\":0.5,\\"s\\":\\"lo\\",\\"speed\\":2}",
-  "3/4 -> 15/16: {\\"gain\\":1,\\"s\\":\\"lo\\",\\"speed\\":2}",
-  "15/16 -> 9/8: {\\"gain\\":1,\\"s\\":\\"lo\\",\\"speed\\":2}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 136 https://strudel.cc/?BApYR1gphKJ7 1`] = `
-[
-  "0/1 -> 3/8: {\\"gain\\":1,\\"s\\":\\"lo\\",\\"speed\\":2,\\"release\\":0.2,\\"clip\\":1}",
-  "3/8 -> 3/4: {\\"gain\\":0.5,\\"s\\":\\"lo\\",\\"speed\\":2,\\"release\\":0.2,\\"clip\\":1}",
-  "3/4 -> 15/16: {\\"gain\\":1,\\"s\\":\\"lo\\",\\"speed\\":2,\\"release\\":0.2,\\"clip\\":1}",
-  "15/16 -> 9/8: {\\"gain\\":1,\\"s\\":\\"lo\\",\\"speed\\":2,\\"release\\":0.2,\\"clip\\":1}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 137 https://strudel.cc/?wK1UQcYoYpoD 1`] = `
-[
-  "0/1 -> 3/16: {\\"gain\\":1,\\"s\\":\\"lo\\",\\"speed\\":1,\\"hcutoff\\":1000,\\"resonance\\":0.2}",
-  "3/16 -> 3/8: {\\"gain\\":0.5,\\"s\\":\\"lo\\",\\"speed\\":1,\\"hcutoff\\":1000,\\"resonance\\":0.2}",
-  "3/8 -> 15/32: {\\"gain\\":1,\\"s\\":\\"lo\\",\\"speed\\":1,\\"hcutoff\\":1000,\\"resonance\\":0.2}",
-  "15/32 -> 9/16: {\\"gain\\":1,\\"s\\":\\"lo\\",\\"speed\\":1,\\"hcutoff\\":1000,\\"resonance\\":0.2}",
-  "15/32 -> 9/16: {\\"gain\\":1,\\"s\\":\\"lo\\",\\"speed\\":1.2,\\"hcutoff\\":1000,\\"resonance\\":0.2}",
-  "9/16 -> 3/4: {\\"gain\\":0.2,\\"s\\":\\"lo\\",\\"speed\\":1.2,\\"hcutoff\\":1000,\\"resonance\\":0.2}",
-  "0/1 -> 3/16: {\\"gain\\":1,\\"s\\":\\"lo\\",\\"speed\\":1,\\"n\\":2,\\"hcutoff\\":1000,\\"resonance\\":0.2}",
-  "3/16 -> 3/8: {\\"gain\\":0.2,\\"s\\":\\"lo\\",\\"speed\\":1,\\"n\\":2,\\"hcutoff\\":1000,\\"resonance\\":0.2}",
-  "3/8 -> 9/16: {\\"gain\\":1,\\"s\\":\\"lo\\",\\"speed\\":1,\\"n\\":2,\\"hcutoff\\":1000,\\"resonance\\":0.2}",
-  "9/16 -> 3/4: {\\"gain\\":0.5,\\"s\\":\\"lo\\",\\"speed\\":1,\\"n\\":2,\\"hcutoff\\":1000,\\"resonance\\":0.2}",
-  "3/4 -> 15/16: {\\"gain\\":1,\\"s\\":\\"lo\\",\\"speed\\":1}",
-  "15/16 -> 9/8: {\\"gain\\":1,\\"s\\":\\"lo\\",\\"speed\\":1}",
-  "3/4 -> 9/8: {\\"gain\\":1,\\"s\\":\\"lo\\",\\"speed\\":1,\\"n\\":2}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 138 https://strudel.cc/?lB2HuXEXyTex 1`] = `
-[
-  "0/1 -> 6275565/1452119: A3",
-  "-9/8 -> 20400609/11616952: G4",
-  "3/8 -> 54560877/11616952: D4",
-  "-3/4 -> 12378483/5808476: F5",
-  "3/4 -> 29458617/5808476: G4",
-  "0/1 -> 3/2: D2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 139 https://strudel.cc/?WUxQVJIu27Nz 1`] = `
-[
-  "0/1 -> 1/1: {\\"gain\\":1,\\"s\\":\\"lo\\",\\"cps\\":1.1}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 140 https://strudel.cc/?ZQ-ce-Qj-nuP 1`] = `
-[
-  "0/1 -> 1/2: {\\"note\\":\\"F3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.49537037037037035}",
-  "1/4 -> 3/4: {\\"note\\":\\"F2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.4398148148148148}",
-  "1/2 -> 1/1: {\\"note\\":\\"F3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.49537037037037035}",
-  "1/2 -> 1/1: {\\"note\\":\\"Ab3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5092592592592593}",
-  "1/2 -> 1/1: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "1/2 -> 1/1: {\\"note\\":\\"F2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.4398148148148148}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 141 https://strudel.cc/?tBPkuxuje0iY 1`] = `
-[
-  "0/1 -> 1/3: bd",
-  "1/3 -> 2/3: hh",
-  "2/3 -> 1/1: sn",
-  "0/1 -> 1/20: G4",
-  "1/6 -> 13/60: G4",
-  "1/3 -> 23/60: B3",
-  "1/2 -> 11/20: B3",
-  "1/3 -> 23/60: E4",
-  "1/2 -> 11/20: E4",
-  "2/3 -> 43/60: G3",
-  "5/6 -> 53/60: G3",
-  "0/1 -> 4/3: c2",
-  "0/1 -> 4/3: c2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 142 https://strudel.cc/?ak6ZpErh0hl1 1`] = `
-[
-  "0/1 -> 1/8: {\\"note\\":\\"A2\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2206.5338497506646,\\"resonance\\":10,\\"clip\\":1}",
-  "3/8 -> 1/2: {\\"note\\":\\"A2\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2827.098521493671,\\"resonance\\":10,\\"clip\\":1}",
-  "3/4 -> 7/8: {\\"note\\":\\"A2\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3366.0584981088073,\\"resonance\\":10,\\"clip\\":1}",
-  "0/1 -> 1/4: {\\"note\\":\\"A3\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2312.732504596285,\\"resonance\\":10,\\"clip\\":1}",
-  "3/4 -> 1/1: {\\"note\\":\\"A3\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3443.5028842544402,\\"resonance\\":10,\\"clip\\":1}",
-  "-7/4 -> 1/4: {\\"note\\":\\"C4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2312.732504596285,\\"resonance\\":10,\\"clip\\":1}",
-  "-7/4 -> 1/4: {\\"note\\":\\"E4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2312.732504596285,\\"resonance\\":10,\\"clip\\":1}",
-  "1/4 -> 1/2: {\\"note\\":\\"C4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "1/4 -> 1/2: {\\"note\\":\\"E4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/2 -> 1/2: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2522.789774516997,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/2 -> 1/2: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2522.789774516997,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/2 -> 1/2: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2522.789774516997,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/2 -> 1/2: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2522.789774516997,\\"resonance\\":10,\\"clip\\":1}",
-  "1/2 -> 3/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3110.8609453791396,\\"resonance\\":10,\\"clip\\":1}",
-  "1/2 -> 3/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3110.8609453791396,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "3/4 -> 1/1: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3443.5028842544402,\\"resonance\\":10,\\"clip\\":1}",
-  "3/4 -> 1/1: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3443.5028842544402,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/4 -> 5/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/4 -> 5/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/4 -> 5/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/4 -> 5/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "0/1 -> 1/2: {\\"s\\":\\"bd:1\\"}",
-  "1/2 -> 1/1: {\\"s\\":\\"bd:1\\"}",
-  "1/2 -> 1/1: {\\"s\\":\\"sd:0\\"}",
-  "1/4 -> 1/2: {\\"s\\":\\"hh:0\\"}",
-  "3/4 -> 1/1: {\\"s\\":\\"hh:0\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 143 https://strudel.cc/?U9J_c-Insgbc 1`] = `
-[
-  "0/1 -> 63/220: f#6",
-  "7/22 -> 133/220: f#6",
-  "7/11 -> 203/220: f#6",
-  "21/22 -> 609/440: f#6",
-  "0/1 -> 21/88: 71",
-  "0/1 -> 21/88: 75",
-  "0/1 -> 21/88: 78",
-  "21/44 -> 63/88: 71",
-  "21/44 -> 63/88: 75",
-  "21/44 -> 63/88: 78",
-  "21/22 -> 105/88: 71",
-  "21/22 -> 105/88: 75",
-  "21/22 -> 105/88: 78",
-]
-`;
-
-exports[`renders shared tunes > shared tune 144 https://strudel.cc/?y2FS3Xvqv68d 1`] = `
-[
-  "0/1 -> 63/220: {\\"note\\":\\"f#6\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6666666666666667}",
-  "7/22 -> 133/220: {\\"note\\":\\"f#6\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6666666666666667}",
-  "7/11 -> 203/220: {\\"note\\":\\"f#6\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6666666666666667}",
-  "21/22 -> 609/440: {\\"note\\":\\"f#6\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6666666666666667}",
-  "0/1 -> 21/88: {\\"note\\":71,\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5787037037037037}",
-  "0/1 -> 21/88: {\\"note\\":75,\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "0/1 -> 21/88: {\\"note\\":78,\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6111111111111112}",
-  "21/44 -> 63/88: {\\"note\\":71,\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5787037037037037}",
-  "21/44 -> 63/88: {\\"note\\":75,\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "21/44 -> 63/88: {\\"note\\":78,\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6111111111111112}",
-  "21/22 -> 105/88: {\\"note\\":71,\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5787037037037037}",
-  "21/22 -> 105/88: {\\"note\\":75,\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "21/22 -> 105/88: {\\"note\\":78,\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6111111111111112}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 145 https://strudel.cc/?d7-gUjyRbKP9 1`] = `
-[
-  "0/1 -> 6/25: {\\"note\\":60,\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "0/1 -> 6/25: {\\"note\\":63,\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "0/1 -> 6/25: {\\"note\\":67,\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "12/25 -> 18/25: {\\"note\\":60,\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "12/25 -> 18/25: {\\"note\\":63,\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "12/25 -> 18/25: {\\"note\\":67,\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "24/25 -> 6/5: {\\"note\\":60,\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "24/25 -> 6/5: {\\"note\\":63,\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "24/25 -> 6/5: {\\"note\\":67,\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 146 https://strudel.cc/?lqXKPxgm_j0a 1`] = `
-[
-  "-38/5 -> 2/5: db3",
-  "-38/5 -> 2/5: eb3",
-  "-38/5 -> 2/5: e3",
-  "-38/5 -> 2/5: eb3",
-  "-38/5 -> 2/5: g3",
-  "-38/5 -> 2/5: a3",
-  "-38/5 -> 2/5: bb3",
-  "-38/5 -> 2/5: c3",
-  "-38/5 -> 2/5: db3",
-  "2/5 -> 22/5: db3",
-  "2/5 -> 22/5: f3",
-  "2/5 -> 22/5: eb3",
-  "2/5 -> 22/5: fb3",
-  "2/5 -> 22/5: a3",
-  "2/5 -> 22/5: b3",
-  "2/5 -> 22/5: c3",
-  "2/5 -> 22/5: d3",
-  "2/5 -> 22/5: db3",
-  "0/1 -> 4/1: Dracula?",
-]
-`;
-
-exports[`renders shared tunes > shared tune 147 https://strudel.cc/?5obY2LrCcbZI 1`] = `
-[
-  "1/3 -> 59/120: {\\"n\\":\\"c5\\",\\"s\\":\\"Oboe: Reed\\"}",
-  "1/2 -> 49/60: {\\"n\\":\\"d5\\",\\"s\\":\\"Oboe: Reed\\"}",
-  "5/6 -> 119/120: {\\"n\\":\\"eb5\\",\\"s\\":\\"Oboe: Reed\\"}",
-  "0/1 -> 1/2: {\\"n\\":60,\\"s\\":\\"Acoustic Grand Piano: Piano\\"}",
-  "0/1 -> 1/2: {\\"n\\":63,\\"s\\":\\"Acoustic Grand Piano: Piano\\"}",
-  "0/1 -> 1/2: {\\"n\\":67,\\"s\\":\\"Acoustic Grand Piano: Piano\\"}",
-  "1/2 -> 1/1: {\\"n\\":60,\\"s\\":\\"Acoustic Grand Piano: Piano\\"}",
-  "1/2 -> 1/1: {\\"n\\":63,\\"s\\":\\"Acoustic Grand Piano: Piano\\"}",
-  "1/2 -> 1/1: {\\"n\\":67,\\"s\\":\\"Acoustic Grand Piano: Piano\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 148 https://strudel.cc/?8262D2qsUNtO 1`] = `
-[
-  "0/1 -> 1/4: {\\"n\\":\\"c3\\",\\"s\\":\\"Oboe: Reed\\",\\"gain\\":0.5,\\"cutoff\\":1275.5812898145155}",
-  "1/4 -> 1/2: {\\"n\\":\\"eb3\\",\\"s\\":\\"Oboe: Reed\\",\\"gain\\":0.5,\\"cutoff\\":1600.013209717642}",
-  "1/2 -> 3/4: {\\"n\\":\\"g3\\",\\"s\\":\\"Oboe: Reed\\",\\"gain\\":0.5,\\"cutoff\\":1848.322651072291}",
-  "3/4 -> 1/1: {\\"n\\":\\"c4\\",\\"s\\":\\"Oboe: Reed\\",\\"gain\\":0.5,\\"cutoff\\":1982.7067523629073}",
-  "-1/8 -> 1/8: {\\"n\\":67,\\"s\\":\\"Oboe: Reed\\",\\"gain\\":0.5,\\"cutoff\\":1188.2154262966046}",
-  "1/8 -> 3/8: {\\"n\\":55,\\"s\\":\\"Oboe: Reed\\",\\"gain\\":0.5,\\"cutoff\\":1444.4150891285808}",
-  "3/8 -> 5/8: {\\"n\\":58,\\"s\\":\\"Oboe: Reed\\",\\"gain\\":0.5,\\"cutoff\\":1736.3961030678927}",
-  "5/8 -> 7/8: {\\"n\\":62,\\"s\\":\\"Oboe: Reed\\",\\"gain\\":0.5,\\"cutoff\\":1931.491579260158}",
-  "7/8 -> 9/8: {\\"n\\":67,\\"s\\":\\"Oboe: Reed\\",\\"gain\\":0.5,\\"cutoff\\":1995.666254004977}",
-  "0/1 -> 1/4: {\\"n\\":72,\\"s\\":\\"Oboe: Reed\\",\\"gain\\":0.5,\\"cutoff\\":1275.5812898145155}",
-  "1/4 -> 1/2: {\\"n\\":60,\\"s\\":\\"Oboe: Reed\\",\\"gain\\":0.5,\\"cutoff\\":1600.013209717642}",
-  "1/2 -> 3/4: {\\"n\\":63,\\"s\\":\\"Oboe: Reed\\",\\"gain\\":0.5,\\"cutoff\\":1848.322651072291}",
-  "3/4 -> 1/1: {\\"n\\":67,\\"s\\":\\"Oboe: Reed\\",\\"gain\\":0.5,\\"cutoff\\":1982.7067523629073}",
-  "-1/8 -> 1/8: {\\"n\\":74,\\"s\\":\\"Oboe: Reed\\",\\"gain\\":0.5,\\"cutoff\\":1188.2154262966046}",
-  "1/8 -> 3/8: {\\"n\\":79,\\"s\\":\\"Oboe: Reed\\",\\"gain\\":0.5,\\"cutoff\\":1444.4150891285808}",
-  "1/8 -> 3/8: {\\"n\\":79,\\"s\\":\\"Oboe: Reed\\",\\"gain\\":0.5,\\"cutoff\\":1444.4150891285808}",
-  "3/8 -> 5/8: {\\"n\\":67,\\"s\\":\\"Oboe: Reed\\",\\"gain\\":0.5,\\"cutoff\\":1736.3961030678927}",
-  "5/8 -> 7/8: {\\"n\\":70,\\"s\\":\\"Oboe: Reed\\",\\"gain\\":0.5,\\"cutoff\\":1931.491579260158}",
-  "7/8 -> 9/8: {\\"n\\":74,\\"s\\":\\"Oboe: Reed\\",\\"gain\\":0.5,\\"cutoff\\":1995.666254004977}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 149 https://strudel.cc/?9PUNz9fqWo2F 1`] = `
-[
-  "15/41 -> 177/328: {\\"n\\":\\"c5\\",\\"s\\":\\"Oboe: Reed\\",\\"gain\\":0.4}",
-  "45/82 -> 147/164: {\\"n\\":\\"d5\\",\\"s\\":\\"Oboe: Reed\\",\\"gain\\":0.4}",
-  "75/82 -> 357/328: {\\"n\\":\\"eb5\\",\\"s\\":\\"Oboe: Reed\\",\\"gain\\":0.4}",
-  "0/1 -> 45/82: {\\"n\\":60,\\"s\\":\\"Acoustic Grand Piano: Piano\\",\\"gain\\":0.25}",
-  "0/1 -> 45/82: {\\"n\\":63,\\"s\\":\\"Acoustic Grand Piano: Piano\\",\\"gain\\":0.25}",
-  "0/1 -> 45/82: {\\"n\\":55,\\"s\\":\\"Acoustic Grand Piano: Piano\\",\\"gain\\":0.25}",
-  "45/82 -> 45/41: {\\"n\\":60,\\"s\\":\\"Acoustic Grand Piano: Piano\\",\\"gain\\":0.25}",
-  "45/82 -> 45/41: {\\"n\\":63,\\"s\\":\\"Acoustic Grand Piano: Piano\\",\\"gain\\":0.25}",
-  "45/82 -> 45/41: {\\"n\\":55,\\"s\\":\\"Acoustic Grand Piano: Piano\\",\\"gain\\":0.25}",
-  "0/1 -> 45/82: {\\"n\\":60,\\"s\\":\\"Church Organ: Organ\\",\\"gain\\":0.2}",
-  "0/1 -> 45/82: {\\"n\\":63,\\"s\\":\\"Church Organ: Organ\\",\\"gain\\":0.2}",
-  "0/1 -> 45/82: {\\"n\\":55,\\"s\\":\\"Church Organ: Organ\\",\\"gain\\":0.2}",
-  "45/82 -> 45/41: {\\"n\\":60,\\"s\\":\\"Church Organ: Organ\\",\\"gain\\":0.2}",
-  "45/82 -> 45/41: {\\"n\\":63,\\"s\\":\\"Church Organ: Organ\\",\\"gain\\":0.2}",
-  "45/82 -> 45/41: {\\"n\\":55,\\"s\\":\\"Church Organ: Organ\\",\\"gain\\":0.2}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 150 https://strudel.cc/?wkDHhKIUtwY_ 1`] = `
-[
-  "0/1 -> 65/12: {\\"n\\":\\"d#5\\",\\"s\\":\\"Piccolo: Pipe\\",\\"gain\\":0.35}",
-  "0/1 -> 65/12: {\\"n\\":56,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.15}",
-  "0/1 -> 65/12: {\\"n\\":60,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.15}",
-  "0/1 -> 65/12: {\\"n\\":63,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.15}",
-  "0/1 -> 65/12: {\\"n\\":56,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.1}",
-  "0/1 -> 65/12: {\\"n\\":60,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.1}",
-  "0/1 -> 65/12: {\\"n\\":51,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.1}",
-  "0/1 -> 39/128: {\\"n\\":\\"G#1\\",\\"s\\":\\"Electric Bass (finger): Bass\\",\\"gain\\":0.3}",
-  "65/192 -> 247/384: {\\"n\\":\\"G#1\\",\\"s\\":\\"Electric Bass (finger): Bass\\",\\"gain\\":0.3}",
-  "65/96 -> 377/384: {\\"n\\":\\"G#1\\",\\"s\\":\\"Electric Bass (finger): Bass\\",\\"gain\\":0.3}",
-  "0/1 -> 65/192: {\\"s\\":\\"bd\\",\\"gain\\":0.2}",
-  "65/192 -> 65/96: {\\"s\\":\\"bd\\",\\"gain\\":0.2}",
-  "65/96 -> 65/48: {\\"s\\":\\"sn\\",\\"gain\\":0.2}",
-  "0/1 -> 65/96: {\\"s\\":\\"hh\\",\\"gain\\":0.2}",
-  "65/96 -> 65/48: {\\"s\\":\\"hh\\",\\"gain\\":0.2}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 151 https://strudel.cc/?Zj9qfA1PhcDS 1`] = `
-[
-  "0/1 -> 65/12: {\\"n\\":\\"d#5\\",\\"s\\":\\"Piccolo: Pipe\\",\\"gain\\":0.35}",
-  "0/1 -> 65/12: {\\"n\\":56,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.15}",
-  "0/1 -> 65/12: {\\"n\\":60,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.15}",
-  "0/1 -> 65/12: {\\"n\\":63,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.15}",
-  "0/1 -> 65/12: {\\"n\\":68,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.15}",
-  "0/1 -> 65/12: {\\"n\\":72,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.15}",
-  "0/1 -> 65/12: {\\"n\\":63,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.15}",
-  "0/1 -> 39/128: {\\"n\\":\\"G#1\\",\\"s\\":\\"Electric Bass (finger): Bass\\",\\"gain\\":0.3}",
-  "65/192 -> 247/384: {\\"n\\":\\"G#1\\",\\"s\\":\\"Electric Bass (finger): Bass\\",\\"gain\\":0.3}",
-  "65/96 -> 377/384: {\\"n\\":\\"G#1\\",\\"s\\":\\"Electric Bass (finger): Bass\\",\\"gain\\":0.3}",
-  "0/1 -> 65/192: {\\"s\\":\\"bd\\",\\"gain\\":0.2}",
-  "65/192 -> 65/96: {\\"s\\":\\"bd\\",\\"gain\\":0.2}",
-  "65/96 -> 65/48: {\\"s\\":\\"sn\\",\\"gain\\":0.2}",
-  "0/1 -> 65/96: {\\"s\\":\\"hh\\",\\"gain\\":0.2}",
-  "65/96 -> 65/48: {\\"s\\":\\"hh\\",\\"gain\\":0.2}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 152 https://strudel.cc/?p_G-4ZB295BP 1`] = `
-[
-  "0/1 -> 1/8: {\\"note\\":\\"A2\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2206.5338497506646,\\"resonance\\":10,\\"clip\\":1}",
-  "3/8 -> 1/2: {\\"note\\":\\"A2\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2827.098521493671,\\"resonance\\":10,\\"clip\\":1}",
-  "3/4 -> 7/8: {\\"note\\":\\"A2\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3366.0584981088073,\\"resonance\\":10,\\"clip\\":1}",
-  "0/1 -> 1/4: {\\"note\\":\\"A3\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2312.732504596285,\\"resonance\\":10,\\"clip\\":1}",
-  "3/4 -> 1/1: {\\"note\\":\\"A3\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3443.5028842544402,\\"resonance\\":10,\\"clip\\":1}",
-  "-7/4 -> 1/4: {\\"note\\":\\"C4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2312.732504596285,\\"resonance\\":10,\\"clip\\":1}",
-  "-7/4 -> 1/4: {\\"note\\":\\"E4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2312.732504596285,\\"resonance\\":10,\\"clip\\":1}",
-  "1/4 -> 1/2: {\\"note\\":\\"C4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "1/4 -> 1/2: {\\"note\\":\\"E4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/2 -> 1/2: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2522.789774516997,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/2 -> 1/2: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2522.789774516997,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/2 -> 1/2: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2522.789774516997,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/2 -> 1/2: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2522.789774516997,\\"resonance\\":10,\\"clip\\":1}",
-  "1/2 -> 3/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3110.8609453791396,\\"resonance\\":10,\\"clip\\":1}",
-  "1/2 -> 3/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3110.8609453791396,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "-5/4 -> 3/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2727.5302177148174,\\"resonance\\":10,\\"clip\\":1}",
-  "3/4 -> 1/1: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3443.5028842544402,\\"resonance\\":10,\\"clip\\":1}",
-  "3/4 -> 1/1: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":3443.5028842544402,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-1/1 -> 1/1: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/4 -> 5/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/4 -> 5/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/4 -> 5/4: {\\"note\\":\\"A4\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "-3/4 -> 5/4: {\\"note\\":\\"C5\\",\\"s\\":\\"flbass\\",\\"n\\":0,\\"gain\\":0.3,\\"cutoff\\":2924.3791043233605,\\"resonance\\":10,\\"clip\\":1}",
-  "0/1 -> 1/2: {\\"s\\":\\"bd:1\\"}",
-  "1/2 -> 1/1: {\\"s\\":\\"bd:1\\"}",
-  "1/2 -> 1/1: {\\"s\\":\\"sd:0\\"}",
-  "1/4 -> 1/2: {\\"s\\":\\"hh:0\\"}",
-  "3/4 -> 1/1: {\\"s\\":\\"hh:0\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 153 https://strudel.cc/?NWLKF4C7o4EX 1`] = `
-[
-  "0/1 -> 1/2: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "0/1 -> 1/2: {\\"note\\":\\"B4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5787037037037037}",
-  "0/1 -> 1/2: {\\"note\\":\\"C5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5833333333333333}",
-  "0/1 -> 1/2: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "3/4 -> 1/1: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "3/4 -> 1/1: {\\"note\\":\\"B4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5787037037037037}",
-  "3/4 -> 1/1: {\\"note\\":\\"C5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5833333333333333}",
-  "3/4 -> 1/1: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "0/1 -> 1/2: {\\"note\\":\\"A2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.45833333333333337}",
-  "1/2 -> 1/1: {\\"note\\":\\"A2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.45833333333333337}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 154 https://strudel.cc/?XhNBCyuzIVOD 1`] = `
-[
-  "0/1 -> 1457/3000: {\\"n\\":\\"c#6\\",\\"s\\":\\"Overdriven Guitar: Guitar\\",\\"gain\\":0.18}",
-  "47/90 -> 13771/18000: {\\"n\\":\\"f5\\",\\"s\\":\\"Overdriven Guitar: Guitar\\",\\"gain\\":0.18}",
-  "47/60 -> 9071/6000: {\\"n\\":\\"c6\\",\\"s\\":\\"Overdriven Guitar: Guitar\\",\\"gain\\":0.18}",
-  "0/1 -> 47/60: {\\"n\\":61,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.24}",
-  "0/1 -> 47/60: {\\"n\\":65,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.24}",
-  "0/1 -> 47/60: {\\"n\\":56,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.24}",
-  "47/60 -> 47/30: {\\"n\\":63,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.24}",
-  "47/60 -> 47/30: {\\"n\\":67,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.24}",
-  "47/60 -> 47/30: {\\"n\\":58,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.24}",
-  "0/1 -> 141/200: {\\"n\\":\\"C#2\\",\\"s\\":\\"Electric Bass (finger): Bass\\",\\"gain\\":0.3}",
-  "47/60 -> 893/600: {\\"n\\":\\"D#2\\",\\"s\\":\\"Electric Bass (finger): Bass\\",\\"gain\\":0.3}",
-  "0/1 -> 47/180: {\\"s\\":\\"bd\\",\\"gain\\":0.2}",
-  "47/90 -> 47/60: {\\"s\\":\\"bd\\",\\"gain\\":0.2}",
-  "47/60 -> 47/45: {\\"s\\":\\"sn\\",\\"gain\\":0.2}",
-  "0/1 -> 47/180: {\\"s\\":\\"hh\\",\\"gain\\":0.2}",
-  "47/180 -> 47/90: {\\"s\\":\\"hh\\",\\"gain\\":0.2}",
-  "47/90 -> 47/60: {\\"s\\":\\"hh\\",\\"gain\\":0.2}",
-  "47/60 -> 47/45: {\\"s\\":\\"hh\\",\\"gain\\":0.2}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 155 https://strudel.cc/?AL73np8C7Fe7 1`] = `
-[
-  "0/1 -> 589/1200: {\\"n\\":\\"C#5\\",\\"s\\":\\"Overdriven Guitar: Guitar\\",\\"gain\\":0.2}",
-  "19/36 -> 5567/7200: {\\"n\\":\\"F4\\",\\"s\\":\\"Overdriven Guitar: Guitar\\",\\"gain\\":0.2}",
-  "19/24 -> 3667/2400: {\\"n\\":\\"C5\\",\\"s\\":\\"Overdriven Guitar: Guitar\\",\\"gain\\":0.2}",
-  "0/1 -> 589/1200: {\\"n\\":\\"c#6\\",\\"s\\":\\"Overdriven Guitar: Guitar\\",\\"gain\\":0.1}",
-  "19/36 -> 5567/7200: {\\"n\\":\\"f5\\",\\"s\\":\\"Overdriven Guitar: Guitar\\",\\"gain\\":0.1}",
-  "19/24 -> 3667/2400: {\\"n\\":\\"c6\\",\\"s\\":\\"Overdriven Guitar: Guitar\\",\\"gain\\":0.1}",
-  "0/1 -> 19/24: {\\"n\\":61,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.25}",
-  "0/1 -> 19/24: {\\"n\\":65,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.25}",
-  "0/1 -> 19/24: {\\"n\\":56,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.25}",
-  "19/24 -> 19/12: {\\"n\\":63,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.25}",
-  "19/24 -> 19/12: {\\"n\\":67,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.25}",
-  "19/24 -> 19/12: {\\"n\\":58,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.25}",
-  "0/1 -> 57/80: {\\"n\\":\\"C#2\\",\\"s\\":\\"Electric Bass (finger): Bass\\",\\"gain\\":0.3}",
-  "19/24 -> 361/240: {\\"n\\":\\"D#2\\",\\"s\\":\\"Electric Bass (finger): Bass\\",\\"gain\\":0.3}",
-  "0/1 -> 125832027859158/476837158203125: {\\"s\\":\\"bd\\",\\"gain\\":0.25}",
-  "251664055718316/476837158203125 -> 19/24: {\\"s\\":\\"bd\\",\\"gain\\":0.25}",
-  "19/24 -> 2922870840145583/2769035532769500: {\\"s\\":\\"sn\\",\\"gain\\":0.25}",
-  "0/1 -> 125832027859158/476837158203125: {\\"s\\":\\"hh\\",\\"gain\\":0.25}",
-  "125832027859158/476837158203125 -> 251664055718316/476837158203125: {\\"s\\":\\"hh\\",\\"gain\\":0.25}",
-  "251664055718316/476837158203125 -> 19/24: {\\"s\\":\\"hh\\",\\"gain\\":0.25}",
-  "19/24 -> 2922870840145583/2769035532769500: {\\"s\\":\\"hh\\",\\"gain\\":0.25}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 156 https://strudel.cc/?89gJxIK34OPK 1`] = `
-[
-  "0/1 -> 3/2: {\\"s\\":\\"bd\\",\\"speed\\":0.7519542165100574}",
-  "3/4 -> 3/2: {\\"s\\":\\"sd\\",\\"speed\\":0.7931522866332671}",
-  "3/8 -> 3/4: {\\"s\\":\\"hh\\",\\"speed\\":0.7285963821098448}",
-  "3/4 -> 9/8: {\\"s\\":\\"hh\\",\\"speed\\":0.77531205091027}",
-  "0/1 -> 3/2: {\\"n\\":33.129885541275144,\\"decay\\":0.15,\\"sustain\\":0,\\"s\\":\\"sawtooth\\",\\"gain\\":0.4,\\"cutoff\\":3669.6267869262615}",
-  "0/1 -> 3/2: {\\"n\\":33.17988554127514,\\"decay\\":0.15,\\"sustain\\":0,\\"s\\":\\"sawtooth\\",\\"gain\\":0.4,\\"cutoff\\":3669.6267869262615}",
-  "0/1 -> 3/2: {\\"n\\":55.129885541275144,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":59.129885541275144,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":60.129885541275144,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":64.12988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":55.16988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":59.16988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":60.16988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":64.16988554127515,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "3/16 -> 3/8: {\\"n\\":69.01266877519555,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/8 -> 9/16: {\\"n\\":69.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/8 -> 9/16: {\\"n\\":72.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/4 -> 15/16: {\\"n\\":72.16001184806132,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "15/16 -> 9/8: {\\"n\\":72.21301072199333,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/16 -> 3/8: {\\"n\\":69.05266877519557,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/8 -> 9/16: {\\"n\\":69.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/8 -> 9/16: {\\"n\\":72.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/4 -> 15/16: {\\"n\\":72.20001184806131,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "15/16 -> 9/8: {\\"n\\":72.25301072199335,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "0/1 -> 3/16: {\\"n\\":93.00057728554401,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "0/1 -> 3/16: {\\"n\\":93.04057728554402,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "3/8 -> 9/16: {\\"n\\":69.01266877519555,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "9/16 -> 3/4: {\\"n\\":69.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "9/16 -> 3/4: {\\"n\\":72.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "15/16 -> 9/8: {\\"n\\":72.16001184806132,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "3/8 -> 9/16: {\\"n\\":69.05266877519557,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "9/16 -> 3/4: {\\"n\\":69.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "9/16 -> 3/4: {\\"n\\":72.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "15/16 -> 9/8: {\\"n\\":72.20001184806131,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "3/16 -> 3/8: {\\"n\\":93.00057728554401,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "3/16 -> 3/8: {\\"n\\":93.04057728554402,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "9/16 -> 3/4: {\\"n\\":69.01266877519555,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "3/4 -> 15/16: {\\"n\\":69.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "3/4 -> 15/16: {\\"n\\":72.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "9/16 -> 3/4: {\\"n\\":69.05266877519557,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "3/4 -> 15/16: {\\"n\\":69.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "3/4 -> 15/16: {\\"n\\":72.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "0/1 -> 3/16: {\\"n\\":72.0468455057745,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "0/1 -> 3/16: {\\"n\\":93.0468455057745,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "3/8 -> 9/16: {\\"n\\":93.00057728554401,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "0/1 -> 3/16: {\\"n\\":72.0868455057745,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "0/1 -> 3/16: {\\"n\\":93.0868455057745,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "3/8 -> 9/16: {\\"n\\":93.04057728554402,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "3/4 -> 15/16: {\\"n\\":69.01266877519555,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "15/16 -> 9/8: {\\"n\\":69.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "3/4 -> 15/16: {\\"n\\":69.05266877519557,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "15/16 -> 9/8: {\\"n\\":69.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 157 https://strudel.cc/?8g4oMFkLYMXZ 1`] = `
-[
-  "0/1 -> 1/10: C3",
-  "0/1 -> 1/10: E3",
-  "0/1 -> 1/10: G3",
-  "1/4 -> 7/20: B3",
-  "1/4 -> 7/20: E4",
-  "1/4 -> 7/20: E3",
-  "1/2 -> 3/5: C3",
-  "1/2 -> 3/5: A2",
-  "1/2 -> 3/5: C3",
-  "3/4 -> 17/20: E3",
-  "3/4 -> 17/20: G3",
-  "3/4 -> 17/20: B3",
-  "0/1 -> 1/5: C2",
-  "1/2 -> 7/10: E2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 158 https://strudel.cc/?NIQF-VGYdB83 1`] = `
-[
-  "0/1 -> 1/2: c1",
-  "1/2 -> 1/1: c1",
-  "1/2 -> 1/1: x",
-  "1/4 -> 1/2: c4",
-  "3/4 -> 1/1: c4",
-  "0/1 -> 1/2: B1",
-  "3/4 -> 1/1: B1",
-  "1/4 -> 13/44: A3",
-  "1/4 -> 13/44: C#4",
-  "1/4 -> 13/44: D4",
-  "1/4 -> 13/44: F#4",
-]
-`;
-
-exports[`renders shared tunes > shared tune 159 https://strudel.cc/?KOAtvzaJcmmY 1`] = `
-[
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/8 -> 1/4: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "1/8 -> 1/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/8 -> 1/4: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "1/8 -> 1/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/8 -> 1/4: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "1/8 -> 1/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/8 -> 1/4: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "1/8 -> 1/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/8 -> 1/4: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "1/8 -> 1/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/8 -> 1/4: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "1/8 -> 1/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/8 -> 1/4: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "1/8 -> 1/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/8 -> 1/4: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "1/8 -> 1/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 5/8: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 5/8: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 5/8: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 5/8: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 5/8: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 5/8: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 5/8: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 5/8: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 5/8: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 5/8: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 5/8: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 5/8: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 5/8: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 5/8: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 5/8: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 5/8: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "3/4 -> 7/8: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "3/4 -> 7/8: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "3/4 -> 7/8: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "3/4 -> 7/8: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "3/4 -> 7/8: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "3/4 -> 7/8: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "3/4 -> 7/8: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "3/4 -> 7/8: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "3/4 -> 7/8: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "3/4 -> 7/8: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "3/4 -> 7/8: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "3/4 -> 7/8: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "3/4 -> 7/8: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "3/4 -> 7/8: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "3/4 -> 7/8: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "3/4 -> 7/8: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 160 https://strudel.cc/?pK517-FAktOc 1`] = `
-[
-  "0/1 -> 4/3: B4",
-  "0/1 -> 1/3: C3",
-  "1/3 -> 2/3: G3",
-  "2/3 -> 2/1: E4",
-]
-`;
-
-exports[`renders shared tunes > shared tune 161 https://strudel.cc/?H3BbA0AovtKs 1`] = `
-[
-  "0/1 -> 5/26: {\\"note\\":\\"B2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.46759259259259256}",
-  "5/13 -> 15/26: {\\"note\\":\\"B2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.46759259259259256}",
-  "10/13 -> 155/156: {\\"note\\":\\"B2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.46759259259259256}",
-  "155/156 -> 15/13: {\\"note\\":\\"A2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.45833333333333337}",
-  "0/1 -> 15/26: {\\"note\\":\\"B3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5231481481481481}",
-  "5/52 -> 35/52: {\\"note\\":\\"C#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5324074074074074}",
-  "5/26 -> 10/13: {\\"note\\":\\"D#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "15/52 -> 45/52: {\\"note\\":\\"F4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5509259259259259}",
-  "5/13 -> 25/26: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "25/52 -> 55/52: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "15/26 -> 15/13: {\\"note\\":\\"B4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5787037037037037}",
-  "35/52 -> 5/4: {\\"note\\":\\"C#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.587962962962963}",
-  "5/13 -> 25/26: {\\"note\\":\\"B3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5231481481481481}",
-  "25/52 -> 55/52: {\\"note\\":\\"C#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5324074074074074}",
-  "15/26 -> 15/13: {\\"note\\":\\"D#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "35/52 -> 5/4: {\\"note\\":\\"F4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5509259259259259}",
-  "10/13 -> 35/26: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "45/52 -> 75/52: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "25/26 -> 20/13: {\\"note\\":\\"B4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5787037037037037}",
-  "10/13 -> 35/26: {\\"note\\":\\"B3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5231481481481481}",
-  "45/52 -> 75/52: {\\"note\\":\\"C#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5324074074074074}",
-  "25/26 -> 20/13: {\\"note\\":\\"D#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "0/1 -> 80/13: {\\"s\\":\\"mad\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 162 https://strudel.cc/?Y9RZADkxt8UL 1`] = `
-[
-  "0/1 -> 65/12: {\\"n\\":\\"d#5\\",\\"s\\":\\"Piccolo: Pipe\\",\\"gain\\":0.35}",
-  "0/1 -> 65/12: {\\"n\\":56,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.15}",
-  "0/1 -> 65/12: {\\"n\\":60,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.15}",
-  "0/1 -> 65/12: {\\"n\\":63,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.15}",
-  "0/1 -> 65/12: {\\"n\\":68,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.15}",
-  "0/1 -> 65/12: {\\"n\\":72,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.15}",
-  "0/1 -> 65/12: {\\"n\\":63,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.15}",
-  "0/1 -> 39/128: {\\"n\\":\\"G#1\\",\\"s\\":\\"Electric Bass (finger): Bass\\",\\"gain\\":0.3}",
-  "65/192 -> 247/384: {\\"n\\":\\"G#1\\",\\"s\\":\\"Electric Bass (finger): Bass\\",\\"gain\\":0.3}",
-  "65/96 -> 377/384: {\\"n\\":\\"G#1\\",\\"s\\":\\"Electric Bass (finger): Bass\\",\\"gain\\":0.3}",
-  "0/1 -> 65/192: {\\"s\\":\\"bd\\",\\"gain\\":0.2}",
-  "65/192 -> 65/96: {\\"s\\":\\"bd\\",\\"gain\\":0.2}",
-  "65/96 -> 65/48: {\\"s\\":\\"sn\\",\\"gain\\":0.2}",
-  "0/1 -> 65/96: {\\"s\\":\\"hh\\",\\"gain\\":0.2}",
-  "65/96 -> 65/48: {\\"s\\":\\"hh\\",\\"gain\\":0.2}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 163 https://strudel.cc/?bxwipc2kqreB 1`] = `
-[
-  "1/2 -> 1/1: a4",
-  "3/4 -> 1/1: a1",
-  "1/2 -> 3/4: a2",
-  "1/4 -> 1/2: a1",
-  "0/1 -> 1/4: a2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 164 https://strudel.cc/?qGimkQi_nszY 1`] = `
-[
-  "47/60 -> 6157/6000: {\\"n\\":\\"c#5\\",\\"s\\":\\"Overdriven Guitar: Guitar\\",\\"gain\\":0.18}",
-  "47/90 -> 13771/18000: {\\"n\\":\\"d#5\\",\\"s\\":\\"Overdriven Guitar: Guitar\\",\\"gain\\":0.18}",
-  "47/180 -> 9071/18000: {\\"n\\":\\"f5\\",\\"s\\":\\"Overdriven Guitar: Guitar\\",\\"gain\\":0.18}",
-  "0/1 -> 1457/6000: {\\"n\\":\\"g5\\",\\"s\\":\\"Overdriven Guitar: Guitar\\",\\"gain\\":0.18}",
-  "47/60 -> 47/30: {\\"n\\":57,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.24}",
-  "47/60 -> 47/30: {\\"n\\":61,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.24}",
-  "47/60 -> 47/30: {\\"n\\":52,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.24}",
-  "0/1 -> 47/60: {\\"n\\":59,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.24}",
-  "0/1 -> 47/60: {\\"n\\":63,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.24}",
-  "0/1 -> 47/60: {\\"n\\":54,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.24}",
-  "47/60 -> 893/600: {\\"n\\":\\"A1\\",\\"s\\":\\"Electric Bass (finger): Bass\\",\\"gain\\":0.3}",
-  "0/1 -> 141/200: {\\"n\\":\\"B1\\",\\"s\\":\\"Electric Bass (finger): Bass\\",\\"gain\\":0.3}",
-  "47/60 -> 47/45: {\\"s\\":\\"bd\\",\\"gain\\":0.2}",
-  "47/90 -> 47/60: {\\"s\\":\\"sn\\",\\"gain\\":0.2}",
-  "0/1 -> 47/180: {\\"s\\":\\"bd\\",\\"gain\\":0.2}",
-  "47/60 -> 47/45: {\\"s\\":\\"hh\\",\\"gain\\":0.2}",
-  "47/90 -> 47/60: {\\"s\\":\\"hh\\",\\"gain\\":0.2}",
-  "47/180 -> 47/90: {\\"s\\":\\"hh\\",\\"gain\\":0.2}",
-  "0/1 -> 47/180: {\\"s\\":\\"hh\\",\\"gain\\":0.2}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 165 https://strudel.cc/?DVESSaRggtn_ 1`] = `
-[
-  "0/1 -> 6275565/1452119: A3",
-  "-9/8 -> 20400609/11616952: G4",
-  "3/8 -> 54560877/11616952: D4",
-  "-3/4 -> 12378483/5808476: F5",
-  "3/4 -> 29458617/5808476: G4",
-  "0/1 -> 3/2: D2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 166 https://strudel.cc/?CHh9ZGJxiWnm 1`] = `
-[
-  "1/8 -> 1/4: {\\"n\\":\\"D1\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1699.6897509708342}",
-  "1/8 -> 1/4: {\\"n\\":\\"D1\\",\\"s\\":\\"square\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1699.6897509708342}",
-  "3/8 -> 1/2: {\\"n\\":\\"D2\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1765.826371664994}",
-  "3/8 -> 1/2: {\\"n\\":\\"D2\\",\\"s\\":\\"square\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1765.826371664994}",
-  "1/2 -> 5/8: {\\"n\\":\\"D1\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1798.799979846742}",
-  "1/2 -> 5/8: {\\"n\\":\\"D1\\",\\"s\\":\\"square\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1798.799979846742}",
-  "3/4 -> 7/8: {\\"n\\":\\"D3\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1864.4584935007128}",
-  "3/4 -> 7/8: {\\"n\\":\\"D3\\",\\"s\\":\\"square\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1864.4584935007128}",
-  "7/8 -> 1/1: {\\"n\\":\\"D3\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1897.1038487394403}",
-  "7/8 -> 1/1: {\\"n\\":\\"D3\\",\\"s\\":\\"square\\",\\"gain\\":0.3,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.5,\\"cutoff\\":1897.1038487394403}",
-  "-3/8 -> 1/8: {\\"n\\":\\"G3\\",\\"s\\":\\"square\\",\\"gain\\":0.7,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0,\\"cutoff\\":1666.5665766857219}",
-  "-3/8 -> 1/8: {\\"n\\":\\"B3\\",\\"s\\":\\"square\\",\\"gain\\":0.7,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0,\\"cutoff\\":1666.5665766857219}",
-  "-1/4 -> 1/4: {\\"n\\":\\"G3\\",\\"s\\":\\"square\\",\\"gain\\":0.7,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0,\\"cutoff\\":1683.1306585059317}",
-  "-1/4 -> 1/4: {\\"n\\":\\"B3\\",\\"s\\":\\"square\\",\\"gain\\":0.7,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0,\\"cutoff\\":1683.1306585059317}",
-  "-1/8 -> 3/8: {\\"n\\":\\"G3\\",\\"s\\":\\"square\\",\\"gain\\":0.7,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0,\\"cutoff\\":1699.6897509708342}",
-  "-1/8 -> 3/8: {\\"n\\":\\"B3\\",\\"s\\":\\"square\\",\\"gain\\":0.7,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0,\\"cutoff\\":1699.6897509708342}",
-  "0/1 -> 3/8: {\\"n\\":\\"C#6\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.26103468453995016,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5998.072590601808,\\"cutoff\\":4000}",
-  "0/1 -> 3/8: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.26103468453995016,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5998.072590601808,\\"cutoff\\":4000}",
-  "0/1 -> 3/8: {\\"n\\":\\"E5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.26103468453995016,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5998.072590601808,\\"cutoff\\":4000}",
-  "0/1 -> 3/8: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.26103468453995016,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5998.072590601808,\\"cutoff\\":4000}",
-  "3/8 -> 3/4: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2828651860235305,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5982.671142387316,\\"cutoff\\":4000}",
-  "3/8 -> 3/4: {\\"n\\":\\"F#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2828651860235305,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5982.671142387316,\\"cutoff\\":4000}",
-  "3/8 -> 3/4: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2828651860235305,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5982.671142387316,\\"cutoff\\":4000}",
-  "3/8 -> 3/4: {\\"n\\":\\"A4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2828651860235305,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5982.671142387316,\\"cutoff\\":4000}",
-  "3/4 -> 1/1: {\\"n\\":\\"F#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.300533478008833,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5958.137268909887,\\"cutoff\\":4000}",
-  "3/4 -> 1/1: {\\"n\\":\\"A4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.300533478008833,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5958.137268909887,\\"cutoff\\":4000}",
-  "1/4 -> 5/8: {\\"n\\":\\"C#6\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2756442833140452,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5989.512318936654,\\"cutoff\\":4000}",
-  "1/4 -> 5/8: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2756442833140452,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5989.512318936654,\\"cutoff\\":4000}",
-  "1/4 -> 5/8: {\\"n\\":\\"E5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2756442833140452,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5989.512318936654,\\"cutoff\\":4000}",
-  "1/4 -> 5/8: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2756442833140452,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5989.512318936654,\\"cutoff\\":4000}",
-  "5/8 -> 1/1: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.29705226105983373,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5963.890147645195,\\"cutoff\\":4000}",
-  "5/8 -> 1/1: {\\"n\\":\\"F#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.29705226105983373,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5963.890147645195,\\"cutoff\\":4000}",
-  "5/8 -> 1/1: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.29705226105983373,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5963.890147645195,\\"cutoff\\":4000}",
-  "5/8 -> 1/1: {\\"n\\":\\"A4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.29705226105983373,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5963.890147645195,\\"cutoff\\":4000}",
-  "1/2 -> 7/8: {\\"n\\":\\"C#6\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.29000691362123476,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5974.128467049176,\\"cutoff\\":4000}",
-  "1/2 -> 7/8: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.29000691362123476,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5974.128467049176,\\"cutoff\\":4000}",
-  "1/2 -> 7/8: {\\"n\\":\\"E5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.29000691362123476,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5974.128467049176,\\"cutoff\\":4000}",
-  "1/2 -> 7/8: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.29000691362123476,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5974.128467049176,\\"cutoff\\":4000}",
-  "7/8 -> 5/4: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.3107861971007485,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5938.355801271282,\\"cutoff\\":4000}",
-  "7/8 -> 5/4: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.3107861971007485,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5938.355801271282,\\"cutoff\\":4000}",
-  "3/4 -> 9/8: {\\"n\\":\\"C#6\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.30398425548024827,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5951.963201008076,\\"cutoff\\":4000}",
-  "3/4 -> 9/8: {\\"n\\":\\"E5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.30398425548024827,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5951.963201008076,\\"cutoff\\":4000}",
-  "0/1 -> 1/4: {\\"n\\":\\"F#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2573601511491127,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.143312438893,\\"cutoff\\":4000}",
-  "0/1 -> 1/4: {\\"n\\":\\"A4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2573601511491127,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.143312438893,\\"cutoff\\":4000}",
-  "-1/8 -> 1/4: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2573601511491127,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.143312438893,\\"cutoff\\":4000}",
-  "-1/8 -> 1/4: {\\"n\\":\\"F#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2573601511491127,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.143312438893,\\"cutoff\\":4000}",
-  "-1/8 -> 1/4: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2573601511491127,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.143312438893,\\"cutoff\\":4000}",
-  "-1/8 -> 1/4: {\\"n\\":\\"A4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2573601511491127,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.143312438893,\\"cutoff\\":4000}",
-  "1/4 -> 1/2: {\\"n\\":\\"F#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.27200957116830426,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5992.29333433282,\\"cutoff\\":4000}",
-  "1/4 -> 1/2: {\\"n\\":\\"A4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.27200957116830426,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5992.29333433282,\\"cutoff\\":4000}",
-  "-1/4 -> 1/8: {\\"n\\":\\"C#6\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2536811842784369,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.785818935017,\\"cutoff\\":4000}",
-  "-1/4 -> 1/8: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2536811842784369,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.785818935017,\\"cutoff\\":4000}",
-  "-1/4 -> 1/8: {\\"n\\":\\"E5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2536811842784369,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.785818935017,\\"cutoff\\":4000}",
-  "-1/4 -> 1/8: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.2536811842784369,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5999.785818935017,\\"cutoff\\":4000}",
-  "1/8 -> 1/2: {\\"n\\":\\"A5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.26836160127988246,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5994.647308096509,\\"cutoff\\":4000}",
-  "1/8 -> 1/2: {\\"n\\":\\"F#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.26836160127988246,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5994.647308096509,\\"cutoff\\":4000}",
-  "1/8 -> 1/2: {\\"n\\":\\"C#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.26836160127988246,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5994.647308096509,\\"cutoff\\":4000}",
-  "1/8 -> 1/2: {\\"n\\":\\"A4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.26836160127988246,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5994.647308096509,\\"cutoff\\":4000}",
-  "1/2 -> 3/4: {\\"n\\":\\"F#5\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.28644702698548963,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5978.612153434527,\\"cutoff\\":4000}",
-  "1/2 -> 3/4: {\\"n\\":\\"A4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.28644702698548963,\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":0,\\"hcutoff\\":5978.612153434527,\\"cutoff\\":4000}",
-  "0/1 -> 1/4: bd",
-  "1/2 -> 3/4: bd",
-  "1/2 -> 1/1: sn",
-  "1/4 -> 1/2: hh3",
-  "3/4 -> 1/1: hh3",
-]
-`;
-
-exports[`renders shared tunes > shared tune 167 https://strudel.cc/?7C7fQJ7ENNd3 1`] = `
-[
-  "0/1 -> 1/4: {\\"s\\":\\"hh\\"}",
-  "1/4 -> 1/2: {\\"s\\":\\"hh\\"}",
-  "1/2 -> 3/4: {\\"s\\":\\"hh\\"}",
-  "3/4 -> 1/1: {\\"s\\":\\"hh\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 168 https://strudel.cc/?VGsjmHzmkMz0 1`] = `
-[
-  "1/4 -> 1/2: {\\"s\\":\\"bd\\"}",
-  "0/1 -> 1/4: {\\"s\\":\\"hh\\"}",
-  "1/2 -> 3/4: {\\"s\\":\\"hh\\"}",
-  "3/4 -> 1/1: {\\"s\\":\\"hh\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 169 https://strudel.cc/?4QSBDxgdgAIr 1`] = `
-[
-  "1/4 -> 1/2: {\\"s\\":\\"bd\\"}",
-  "0/1 -> 1/12: {\\"s\\":\\"hh\\"}",
-  "1/12 -> 1/6: {\\"s\\":\\"hh\\"}",
-  "1/6 -> 1/4: {\\"s\\":\\"hh\\"}",
-  "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\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 170 https://strudel.cc/?_1ClWbH9kSKC 1`] = `
-[
-  "0/1 -> 2/9: {\\"s\\":\\"hh\\"}",
-  "2/9 -> 4/9: {\\"s\\":\\"hh\\"}",
-  "4/9 -> 2/3: {\\"s\\":\\"hh\\"}",
-  "2/3 -> 7/9: {\\"s\\":\\"hh\\"}",
-  "7/9 -> 8/9: {\\"s\\":\\"hh\\"}",
-  "8/9 -> 1/1: {\\"s\\":\\"hh\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 171 https://strudel.cc/?nmwsMPG16O1L 1`] = `
-[
-  "0/1 -> 1/4: 83.8125",
-  "3/4 -> 1/1: 82.6875",
-  "0/1 -> 5/2: f3",
-  "3/8 -> 23/8: f3",
-  "3/4 -> 13/4: f3",
-  "0/1 -> 40/1: a1",
-  "1/2 -> 1/1: 2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 172 https://strudel.cc/?DBp75NUfSxIn 1`] = `
-[
-  "0/1 -> 1/4: {\\"note\\":57}",
-  "0/1 -> 1/4: {\\"note\\":61}",
-  "0/1 -> 1/4: {\\"note\\":64}",
-  "3/4 -> 1/1: {\\"note\\":57}",
-  "3/4 -> 1/1: {\\"note\\":61}",
-  "3/4 -> 1/1: {\\"note\\":64}",
-  "0/1 -> 1/1: {\\"note\\":45}",
-  "1/4 -> 1/2: 2",
-  "3/4 -> 7/8: 2",
-  "0/1 -> 1/4: c1",
-  "1/2 -> 3/4: c1",
-  "1/2 -> 1/1: x",
-]
-`;
-
-exports[`renders shared tunes > shared tune 173 https://strudel.cc/?bdsxEcjr7fkg 1`] = `
-[
-  "0/1 -> 1/1: {\\"n\\":\\"a1\\",\\"decay\\":0.25,\\"sustain\\":0,\\"s\\":\\"sawtooth\\",\\"gain\\":0.4,\\"vowel\\":\\"a\\"}",
-  "-3/8 -> 1/8: {\\"n\\":52,\\"decay\\":0.25,\\"sustain\\":0,\\"s\\":\\"sawtooth\\",\\"gain\\":0.4,\\"vowel\\":\\"a\\"}",
-  "0/1 -> 1/1: {\\"n\\":33.05,\\"decay\\":0.25,\\"sustain\\":0,\\"s\\":\\"sawtooth\\",\\"gain\\":0.4,\\"vowel\\":\\"a\\"}",
-  "-3/8 -> 1/8: {\\"n\\":52.05,\\"decay\\":0.25,\\"sustain\\":0,\\"s\\":\\"sawtooth\\",\\"gain\\":0.4,\\"vowel\\":\\"a\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 174 https://strudel.cc/?IuUGlGkdiPX- 1`] = `
-[
-  "1/4 -> 1/2: {\\"s\\":\\"hh\\",\\"coarse\\":16,\\"speed\\":0.7285963821098448}",
-  "3/4 -> 1/1: {\\"s\\":\\"hh\\",\\"coarse\\":16,\\"shape\\":0.8,\\"speed\\":0.80224046928206}",
-  "0/1 -> 1/1: {\\"s\\":\\"bd\\",\\"coarse\\":16,\\"shape\\":0.8,\\"crush\\":8,\\"gain\\":0.2,\\"speed\\":0.7519542165100574}",
-  "1/2 -> 1/1: {\\"s\\":\\"sd\\",\\"coarse\\":16,\\"shape\\":0.8,\\"crush\\":8,\\"gain\\":0.2,\\"speed\\":0.7931522866332671}",
-  "1/2 -> 3/4: {\\"s\\":\\"hh\\",\\"coarse\\":16,\\"shape\\":0.8,\\"crush\\":8,\\"gain\\":0.2,\\"speed\\":0.77531205091027}",
-  "0/1 -> 1/8: {\\"note\\":\\"g1\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":622.4281788948767,\\"coarse\\":2,\\"speed\\":0.7002304945137069}",
-  "3/8 -> 1/2: {\\"note\\":\\"g1\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":753.073372946036,\\"coarse\\":4,\\"speed\\":0.7399036937955912}",
-  "3/4 -> 7/8: {\\"note\\":\\"g1\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":866.5386311808015,\\"coarse\\":7,\\"speed\\":0.798840922941892}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 175 https://strudel.cc/?1QH3HPhZ1uad 1`] = `
-[
-  "0/1 -> 1/2: c1",
-  "1/2 -> 1/1: c1",
-  "1/2 -> 1/1: x",
-  "1/4 -> 1/2: c4",
-  "3/4 -> 1/1: c4",
-  "0/1 -> 1/2: B1",
-  "3/4 -> 1/1: B1",
-  "1/4 -> 13/44: A3",
-  "1/4 -> 13/44: C#4",
-  "1/4 -> 13/44: D4",
-  "1/4 -> 13/44: F#4",
-]
-`;
-
-exports[`renders shared tunes > shared tune 176 https://strudel.cc/?hxJZG7SS71HP 1`] = `
-[
-  "0/1 -> 1/2: {\\"note\\":\\"F3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.49537037037037035}",
-  "1/4 -> 3/4: {\\"note\\":\\"F2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.4398148148148148}",
-  "1/2 -> 1/1: {\\"note\\":\\"F3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.49537037037037035}",
-  "1/2 -> 1/1: {\\"note\\":\\"Ab3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5092592592592593}",
-  "1/2 -> 1/1: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "1/2 -> 1/1: {\\"note\\":\\"F2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.4398148148148148}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 177 https://strudel.cc/?EoVX7HjwHB8r 1`] = `
-[
-  "0/1 -> 1/2: Bb2",
-  "0/1 -> 1/2: F3",
-  "0/1 -> 1/2: Bb3",
-  "1/2 -> 1/1: Bb2",
-  "1/2 -> 1/1: Bb2",
-  "1/2 -> 1/1: F3",
-  "1/2 -> 1/1: F3",
-  "1/2 -> 1/1: Bb3",
-  "1/2 -> 1/1: Bb3",
-  "0/1 -> 1/2: Bb1",
-  "1/2 -> 5/8: Bb1",
-  "3/4 -> 7/8: Bb1",
-  "0/1 -> 1/2: c1",
-  "1/2 -> 1/1: c1",
-  "1/2 -> 1/1: c3",
-  "0/1 -> 1/4: C1",
-  "1/4 -> 1/2: C3",
-  "1/2 -> 3/4: C1",
-  "3/4 -> 1/1: C3",
-]
-`;
-
-exports[`renders shared tunes > shared tune 178 https://strudel.cc/?tVIePZOlbUFE 1`] = `
-[
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/8 -> 1/4: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "1/8 -> 1/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/8 -> 1/4: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "1/8 -> 1/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/8 -> 1/4: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "1/8 -> 1/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/8 -> 1/4: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "1/8 -> 1/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/8 -> 1/4: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "1/8 -> 1/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/8 -> 1/4: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "1/8 -> 1/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/8 -> 1/4: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "1/8 -> 1/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/8 -> 1/4: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "1/8 -> 1/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"A#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"D#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "446428571428571/12500000000000000 -> 3571428571428571/12500000000000000: {\\"note\\":\\"G#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6203703703703703}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 5/8: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 5/8: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 5/8: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 5/8: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 5/8: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 5/8: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 5/8: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 5/8: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 5/8: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 5/8: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 5/8: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 5/8: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 5/8: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 5/8: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 5/8: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 5/8: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "1/2 -> 3/4: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "1/2 -> 3/4: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "1/2 -> 3/4: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/2 -> 3/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-  "3/4 -> 7/8: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "3/4 -> 7/8: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "3/4 -> 7/8: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "3/4 -> 7/8: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "3/4 -> 7/8: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "3/4 -> 7/8: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "3/4 -> 7/8: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "3/4 -> 7/8: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "3/4 -> 7/8: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "3/4 -> 7/8: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "3/4 -> 7/8: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "3/4 -> 7/8: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "3/4 -> 7/8: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "3/4 -> 7/8: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "3/4 -> 7/8: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "3/4 -> 7/8: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"D5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5925925925925926}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"Eb5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5972222222222222}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-  "2455357142857143/3125000000000000 -> 3236607142857143/3125000000000000: {\\"note\\":\\"G5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6157407407407407}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 179 https://strudel.cc/?P_Fi2yRHrXHj 1`] = `
-[
-  "0/1 -> 1/8: {\\"freq\\":55.33,\\"s\\":\\"sawtooth\\"}",
-  "0/1 -> 1/8: {\\"freq\\":54.725,\\"s\\":\\"sawtooth\\"}",
-  "3/8 -> 1/2: {\\"freq\\":110.66,\\"s\\":\\"sawtooth\\"}",
-  "3/8 -> 1/2: {\\"freq\\":109.45,\\"s\\":\\"sawtooth\\"}",
-  "3/8 -> 1/2: {\\"freq\\":165.99,\\"s\\":\\"sawtooth\\"}",
-  "3/8 -> 1/2: {\\"freq\\":164.175,\\"s\\":\\"sawtooth\\"}",
-  "3/4 -> 7/8: {\\"freq\\":221.32,\\"s\\":\\"sawtooth\\"}",
-  "3/4 -> 7/8: {\\"freq\\":218.9,\\"s\\":\\"sawtooth\\"}",
-  "3/4 -> 7/8: {\\"freq\\":276.65,\\"s\\":\\"sawtooth\\"}",
-  "3/4 -> 7/8: {\\"freq\\":273.625,\\"s\\":\\"sawtooth\\"}",
-  "1/8 -> 59/400: {\\"freq\\":440,\\"gain\\":0.206361035083454,\\"s\\":\\"sawtooth\\"}",
-  "1/4 -> 109/400: {\\"freq\\":440,\\"gain\\":0.2360775017902398,\\"s\\":\\"sawtooth\\"}",
-  "1/2 -> 209/400: {\\"freq\\":440,\\"gain\\":0.3624358861780295,\\"s\\":\\"sawtooth\\"}",
-  "5/8 -> 259/400: {\\"freq\\":440,\\"gain\\":0.4316442271311083,\\"s\\":\\"sawtooth\\"}",
-  "7/8 -> 359/400: {\\"freq\\":440,\\"gain\\":0.5078844826422588,\\"s\\":\\"sawtooth\\"}",
-  "0/1 -> 1/8: {\\"s\\":\\"bd\\"}",
-  "3/8 -> 1/2: {\\"s\\":\\"bd\\"}",
-  "3/4 -> 7/8: {\\"s\\":\\"bd\\"}",
-  "0/1 -> 1/4: {\\"s\\":\\"hh\\"}",
-  "1/4 -> 1/2: {\\"s\\":\\"hh\\"}",
-  "1/2 -> 3/4: {\\"s\\":\\"hh\\"}",
-  "3/4 -> 1/1: {\\"s\\":\\"hh\\"}",
-  "1/2 -> 1/1: {\\"s\\":\\"sd\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 180 https://strudel.cc/?brh8FpBbbH-- 1`] = `
-[
-  "0/1 -> 1/1: {\\"s\\":\\"bd\\"}",
-  "1/2 -> 1/1: {\\"s\\":\\"sd\\"}",
-  "1/4 -> 1/2: {\\"s\\":\\"hh\\"}",
-  "1/2 -> 3/4: {\\"s\\":\\"hh\\"}",
-  "3/4 -> 1/1: {\\"s\\":\\"hh\\"}",
-  "0/1 -> 1/2: {\\"note\\":\\"A2\\",\\"s\\":\\"sawtooth\\"}",
-  "1/2 -> 3/4: {\\"note\\":\\"G2\\",\\"s\\":\\"sawtooth\\"}",
-  "3/4 -> 1/1: {\\"note\\":\\"F2\\",\\"s\\":\\"sawtooth\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 181 https://strudel.cc/?Uw7K4l1pIVUt 1`] = `
-[
-  "0/1 -> 1/3: bd",
-  "1/3 -> 2/3: hh",
-  "2/3 -> 1/1: sn",
-  "0/1 -> 1/20: G4",
-  "1/6 -> 13/60: G4",
-  "1/3 -> 23/60: B3",
-  "1/2 -> 11/20: B3",
-  "1/3 -> 23/60: E4",
-  "1/2 -> 11/20: E4",
-  "2/3 -> 43/60: G3",
-  "5/6 -> 53/60: G3",
-  "0/1 -> 4/3: c2",
-  "0/1 -> 4/3: c2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 182 https://strudel.cc/?dhBbMccpPgg8 1`] = `
-[
-  "0/1 -> 1/2: A3",
-  "1/2 -> 3/4: D4",
-  "3/4 -> 1/1: E4",
-  "0/1 -> 1/2: D4",
-  "1/2 -> 3/4: G4",
-  "3/4 -> 1/1: A4",
-]
-`;
-
-exports[`renders shared tunes > shared tune 183 https://strudel.cc/?U5sIL_DhqTip 1`] = `
-[
-  "-1666666666666667/7500000000000000 -> 2/9: G3",
-  "0/1 -> 4/3: E3",
-  "0/1 -> 4/3: A3",
-  "0/1 -> 4/3: D4",
-  "0/1 -> 4/3: G4",
-  "0/1 -> 4/3: B4",
-  "0/1 -> 2/3: D2",
-  "2/3 -> 7/9: D2",
-  "8/9 -> 1/1: D2",
-  "0/1 -> 2/9: c1",
-  "2/9 -> 4/9: c1",
-  "4/9 -> 2/3: c1",
-  "2/3 -> 8/9: c1",
-  "8/9 -> 10/9: c1",
-  "2/3 -> 4/3: c3",
-  "0/1 -> 10/9: c1",
-  "0/1 -> 16/3: F3",
-  "0/1 -> 16/3: A3",
-]
-`;
-
-exports[`renders shared tunes > shared tune 184 https://strudel.cc/?irMD_KH0ICbf 1`] = `
-[
-  "0/1 -> 27/40: {\\"note\\":\\"Db4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5324074074074074}",
-  "0/1 -> 27/40: {\\"note\\":\\"Ab4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5648148148148149}",
-  "0/1 -> 27/40: {\\"note\\":\\"Db4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5324074074074074}",
-  "0/1 -> 27/40: {\\"note\\":\\"Ab4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5648148148148149}",
-  "0/1 -> 27/40: {\\"note\\":\\"Db4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5324074074074074}",
-  "0/1 -> 27/40: {\\"note\\":\\"Ab4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5648148148148149}",
-  "0/1 -> 27/40: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "0/1 -> 27/40: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "0/1 -> 27/40: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "0/1 -> 27/40: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "0/1 -> 27/40: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "0/1 -> 27/40: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "0/1 -> 27/40: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "0/1 -> 27/40: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "0/1 -> 27/40: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "0/1 -> 27/40: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "0/1 -> 27/40: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "0/1 -> 27/40: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "0/1 -> 27/40: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "0/1 -> 27/40: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "0/1 -> 27/40: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "0/1 -> 27/40: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "0/1 -> 27/40: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "0/1 -> 27/40: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "0/1 -> 27/40: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "0/1 -> 27/40: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "0/1 -> 27/40: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "0/1 -> 27/40: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "0/1 -> 27/40: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "0/1 -> 27/40: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "0/1 -> 171/160: {\\"note\\":\\"Bb2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.46296296296296297}",
-  "3/4 -> 33/40: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "3/4 -> 33/40: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "3/4 -> 33/40: {\\"note\\":\\"Eb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "3/4 -> 33/40: {\\"note\\":\\"Bb4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5740740740740741}",
-  "0/1 -> 171/160: {\\"note\\":\\"Bb2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.46296296296296297}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 185 https://strudel.cc/?A6Mqjuhn1Wpr 1`] = `[]`;
-
-exports[`renders shared tunes > shared tune 186 https://strudel.cc/?2-JbRPIoRj7X 1`] = `[]`;
-
-exports[`renders shared tunes > shared tune 187 https://strudel.cc/?wVDgPVVgbrSK 1`] = `[]`;
-
-exports[`renders shared tunes > shared tune 188 https://strudel.cc/?z0OoCML7DPQb 1`] = `
-[
-  "0/1 -> 1/1: bd",
-  "0/1 -> 1/4: hh",
-  "1/4 -> 1/2: hh",
-  "1/2 -> 3/4: hh",
-  "3/4 -> 1/1: hh",
-  "1/2 -> 1/1: sn",
-]
-`;
-
-exports[`renders shared tunes > shared tune 189 https://strudel.cc/?SWekIFXDlrLE 1`] = `
-[
-  "0/1 -> 1/4: {\\"note\\":\\"e4\\"}",
-  "1/4 -> 1/2: {\\"note\\":\\"c4\\"}",
-  "1/2 -> 3/4: {\\"note\\":\\"a4\\"}",
-  "3/4 -> 1/1: {\\"note\\":\\"c4\\"}",
-  "0/1 -> 1/2: {\\"note\\":\\"c1\\"}",
-  "1/2 -> 1/1: {\\"note\\":\\"c1\\"}",
-  "1/2 -> 1/1: {\\"note\\":\\"x\\"}",
-  "1/4 -> 1/2: {\\"note\\":\\"c4\\"}",
-  "3/4 -> 1/1: {\\"note\\":\\"c4\\"}",
-  "0/1 -> 2/1: {\\"note\\":\\"B1\\"}",
-  "0/1 -> 4/1: {\\"note\\":\\"A3\\"}",
-  "0/1 -> 4/1: {\\"note\\":\\"C4\\"}",
-  "0/1 -> 4/1: {\\"note\\":\\"E4\\"}",
-  "0/1 -> 4/1: {\\"note\\":\\"A5\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 190 https://strudel.cc/?70M98P_ZVSJe 1`] = `
-[
-  "0/1 -> 1/2: {\\"s\\":\\"hh\\",\\"begin\\":0,\\"end\\":0.25}",
-  "1/2 -> 1/1: {\\"s\\":\\"hh\\",\\"begin\\":0.25,\\"end\\":0.5}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 191 https://strudel.cc/?SB-hFm0uROHV 1`] = `
-[
-  "0/1 -> 1/1: {\\"s\\":\\"hh\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 192 https://strudel.cc/?t2KXoS_qssjD 1`] = `
-[
-  "0/1 -> 1/4: {\\"s\\":\\"p\\",\\"begin\\":0,\\"end\\":0.0078125,\\"speed\\":0.03125,\\"unit\\":\\"c\\",\\"pan\\":0,\\"shape\\":0.5}",
-  "1/4 -> 1/2: {\\"s\\":\\"p\\",\\"begin\\":0.0078125,\\"end\\":0.015625,\\"speed\\":0.03125,\\"unit\\":\\"c\\",\\"pan\\":0,\\"shape\\":0.5}",
-  "1/2 -> 3/4: {\\"s\\":\\"p\\",\\"begin\\":0.015625,\\"end\\":0.0234375,\\"speed\\":0.03125,\\"unit\\":\\"c\\",\\"pan\\":0,\\"shape\\":0.5}",
-  "3/4 -> 1/1: {\\"s\\":\\"p\\",\\"begin\\":0.0234375,\\"end\\":0.03125,\\"speed\\":0.03125,\\"unit\\":\\"c\\",\\"pan\\":0,\\"shape\\":0.5}",
-  "3/4 -> 1/1: {\\"s\\":\\"p\\",\\"begin\\":0,\\"end\\":0.0078125,\\"speed\\":0.03125,\\"unit\\":\\"c\\",\\"pan\\":1,\\"shape\\":0.5}",
-  "1/2 -> 3/4: {\\"s\\":\\"p\\",\\"begin\\":0.0078125,\\"end\\":0.015625,\\"speed\\":0.03125,\\"unit\\":\\"c\\",\\"pan\\":1,\\"shape\\":0.5}",
-  "1/4 -> 1/2: {\\"s\\":\\"p\\",\\"begin\\":0.015625,\\"end\\":0.0234375,\\"speed\\":0.03125,\\"unit\\":\\"c\\",\\"pan\\":1,\\"shape\\":0.5}",
-  "0/1 -> 1/4: {\\"s\\":\\"p\\",\\"begin\\":0.0234375,\\"end\\":0.03125,\\"speed\\":0.03125,\\"unit\\":\\"c\\",\\"pan\\":1,\\"shape\\":0.5}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 193 https://strudel.cc/?k0435I3IQEH4 1`] = `
-[
-  "0/1 -> 3/4: F3",
-  "3/4 -> 9/8: Ab3",
-  "0/1 -> 3/4: Ab3",
-  "3/4 -> 9/8: C4",
-  "3/8 -> 15/32: Eb4",
-  "9/16 -> 21/32: Eb4",
-  "3/8 -> 15/32: G4",
-  "9/16 -> 21/32: G4",
-  "241/600 -> 147/200: F1",
-  "0/1 -> 3/4: c2",
-  "3/4 -> 3/2: c2",
-  "3/4 -> 3/2: c2",
-  "0/1 -> 3/8: c4",
-  "3/8 -> 3/4: c4",
-  "3/4 -> 9/8: c4",
-]
-`;
-
-exports[`renders shared tunes > shared tune 194 https://strudel.cc/?vDsUyH8IUJn6 1`] = `
-[
-  "0/1 -> 6/1: F3",
-  "0/1 -> 6/1: Ab3",
-  "0/1 -> 6/1: c2",
-  "0/1 -> 3/1: c4",
-]
-`;
-
-exports[`renders shared tunes > shared tune 195 https://strudel.cc/?YJ2iESN49BD6 1`] = `
-[
-  "0/1 -> 3/16: {\\"s\\":\\"bd\\",\\"gain\\":0.7}",
-  "3/16 -> 3/8: {\\"s\\":\\"bd\\",\\"gain\\":0.7}",
-  "3/8 -> 3/4: {\\"s\\":\\"hh\\",\\"gain\\":0.7}",
-  "3/4 -> 9/8: {\\"s\\":\\"sn\\",\\"gain\\":0.7}",
-  "0/1 -> 3/20: {\\"note\\":\\"C2\\",\\"s\\":\\"square\\",\\"cutoff\\":400,\\"decay\\":0.12,\\"sustain\\":0}",
-  "3/8 -> 21/40: {\\"note\\":\\"A1\\",\\"s\\":\\"square\\",\\"cutoff\\":400,\\"decay\\":0.12,\\"sustain\\":0}",
-  "3/4 -> 9/10: {\\"note\\":\\"Bb1\\",\\"s\\":\\"square\\",\\"cutoff\\":400,\\"decay\\":0.12,\\"sustain\\":0}",
-  "3/16 -> 27/80: {\\"note\\":\\"C2\\",\\"s\\":\\"square\\",\\"cutoff\\":400,\\"decay\\":0.12,\\"sustain\\":0}",
-  "9/16 -> 57/80: {\\"note\\":\\"A1\\",\\"s\\":\\"square\\",\\"cutoff\\":400,\\"decay\\":0.12,\\"sustain\\":0}",
-  "15/16 -> 87/80: {\\"note\\":\\"Bb1\\",\\"s\\":\\"square\\",\\"cutoff\\":400,\\"decay\\":0.12,\\"sustain\\":0}",
-  "0/1 -> 3/20: {\\"note\\":\\"G2\\"}",
-  "0/1 -> 3/40: {\\"note\\":\\"C3\\"}",
-  "3/4 -> 33/40: {\\"note\\":\\"Eb3\\"}",
-  "-15/16 -> -63/80: {\\"note\\":\\"G3\\"}",
-  "-3/16 -> -9/80: {\\"note\\":\\"Eb4\\"}",
-  "3/16 -> 27/80: {\\"note\\":\\"G3\\"}",
-  "3/16 -> 21/80: {\\"note\\":\\"C4\\"}",
-  "15/16 -> 81/80: {\\"note\\":\\"Eb4\\"}",
-  "-3/4 -> -3/5: {\\"note\\":\\"G4\\"}",
-  "0/1 -> 3/40: {\\"note\\":\\"Eb5\\"}",
-  "3/8 -> 21/40: {\\"note\\":\\"G4\\"}",
-  "3/8 -> 9/20: {\\"note\\":\\"C5\\"}",
-  "-9/16 -> -33/80: {\\"note\\":\\"G5\\"}",
-  "-9/16 -> -39/80: {\\"note\\":\\"C6\\"}",
-  "3/16 -> 21/80: {\\"note\\":\\"Eb6\\"}",
-  "9/16 -> 57/80: {\\"note\\":\\"G5\\"}",
-  "9/16 -> 51/80: {\\"note\\":\\"C6\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 196 https://strudel.cc/?Z6fHLg-51AUc 1`] = `
-[
-  "0/1 -> 1/4: C3",
-  "0/1 -> 1/4: G3",
-  "0/1 -> 1/4: C4",
-  "1/2 -> 3/4: C3",
-  "1/2 -> 3/4: G3",
-  "1/2 -> 3/4: C4",
-  "0/1 -> 1/2: c2",
-  "1/2 -> 5/8: c2",
-  "3/4 -> 7/8: c2",
-  "0/1 -> 1/2: c1",
-  "1/2 -> 1/1: c1",
-]
-`;
-
-exports[`renders shared tunes > shared tune 197 https://strudel.cc/?GW0d4wRtDmED 1`] = `
-[
-  "0/1 -> 1/2: c1",
-  "1/2 -> 1/1: c1",
-  "1/2 -> 1/1: c3",
-  "0/1 -> 1/4: C1",
-  "1/4 -> 1/2: C3",
-  "1/2 -> 3/4: C1",
-  "3/4 -> 1/1: C3",
-]
-`;
-
-exports[`renders shared tunes > shared tune 198 https://strudel.cc/?iliL_rgeboIg 1`] = `
-[
-  "0/1 -> 1/3: bd",
-  "1/3 -> 2/3: hh",
-  "2/3 -> 1/1: sn",
-  "0/1 -> 1/20: G4",
-  "1/6 -> 13/60: G4",
-  "1/3 -> 23/60: B3",
-  "1/2 -> 11/20: B3",
-  "1/3 -> 23/60: E4",
-  "1/2 -> 11/20: E4",
-  "2/3 -> 43/60: G3",
-  "5/6 -> 53/60: G3",
-  "0/1 -> 4/3: c2",
-  "0/1 -> 4/3: c2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 199 https://strudel.cc/?IVv5q7W4BDiN 1`] = `
-[
-  "0/1 -> 1/32: {\\"note\\":48.07362922971432,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "1/32 -> 1/16: {\\"note\\":48.220843337648155,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "1/16 -> 3/32: {\\"note\\":48.36792441781325,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "3/32 -> 1/8: {\\"note\\":48.51478387406664,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "1/8 -> 5/32: {\\"note\\":48.661333243763295,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "5/32 -> 3/16: {\\"note\\":48.80748425104276,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "3/16 -> 7/32: {\\"note\\":48.95314886000317,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "7/32 -> 1/4: {\\"note\\":49.098239327730845,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "1/4 -> 9/32: {\\"note\\":49.24266825715331,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "9/32 -> 5/16: {\\"note\\":49.386348649684024,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "5/16 -> 11/32: {\\"note\\":49.529193957627086,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "11/32 -> 3/8: {\\"note\\":49.67111813631032,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "3/8 -> 13/32: {\\"note\\":49.81203569591537,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "13/32 -> 7/16: {\\"note\\":49.95186175297358,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "7/16 -> 15/32: {\\"note\\":50.09051208149661,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "15/32 -> 1/2: {\\"note\\":50.22790316371103,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "1/2 -> 17/32: {\\"note\\":50.36395224036629,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "17/32 -> 9/16: {\\"note\\":50.49857736058583,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "9/16 -> 19/32: {\\"note\\":50.63169743123117,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "19/32 -> 5/8: {\\"note\\":50.76323226574944,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "5/8 -> 21/32: {\\"note\\":50.893102632474736,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "21/32 -> 11/16: {\\"note\\":51.021230302354304,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "11/16 -> 23/32: {\\"note\\":51.14753809607082,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "23/32 -> 3/4: {\\"note\\":51.27194993053228,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "3/4 -> 25/32: {\\"note\\":51.39439086470168,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "25/32 -> 13/16: {\\"note\\":51.514787144738634,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "13/16 -> 27/32: {\\"note\\":51.633066248425955,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "27/32 -> 7/8: {\\"note\\":51.74915692885432,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "7/8 -> 29/32: {\\"note\\":51.86298925733875,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "29/32 -> 15/16: {\\"note\\":51.97449466554103,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "15/16 -> 31/32: {\\"note\\":52.08360598677272,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "31/32 -> 1/1: {\\"note\\":52.19025749645384,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 200 https://strudel.cc/?N6kOKngern0Y 1`] = `
-[
-  "0/1 -> 1/32: {\\"note\\":56.147247371137475,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "1/32 -> 1/16: {\\"note\\":56.441387381598005,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "1/16 -> 3/32: {\\"note\\":56.734464051195296,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "3/32 -> 1/8: {\\"note\\":57.02577133256181,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "1/8 -> 5/32: {\\"note\\":57.31460744094122,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "5/32 -> 3/16: {\\"note\\":57.60027654484939,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "3/16 -> 7/32: {\\"note\\":57.88209044239335,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "7/32 -> 1/4: {\\"note\\":58.15937021920993,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "1/4 -> 9/32: {\\"note\\":58.431447884029936,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "9/32 -> 5/16: {\\"note\\":58.69766797792764,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "5/16 -> 11/32: {\\"note\\":58.9573891533787,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "11/32 -> 3/8: {\\"note\\":59.20998571932258,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "3/8 -> 13/32: {\\"note\\":59.45484914850707,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "13/32 -> 7/16: {\\"note\\":59.69138954348376,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "7/16 -> 15/32: {\\"note\\":59.91903705772266,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "15/32 -> 1/2: {\\"note\\":60.1372432684224,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "1/2 -> 17/32: {\\"note\\":60.3454824977088,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "17/32 -> 9/16: {\\"note\\":60.543253079038905,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "9/16 -> 19/32: {\\"note\\":60.73007856575964,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "19/32 -> 5/8: {\\"note\\":60.9055088789095,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "5/8 -> 21/32: {\\"note\\":61.06912139149824,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "21/32 -> 11/16: {\\"note\\":61.22052194665227,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "11/16 -> 23/32: {\\"note\\":61.35934580717309,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "23/32 -> 3/4: {\\"note\\":61.48525853422119,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "3/4 -> 25/32: {\\"note\\":61.597956793008436,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "25/32 -> 13/16: {\\"note\\":61.69716908355822,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "13/16 -> 27/32: {\\"note\\":61.782656394772644,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "27/32 -> 7/8: {\\"note\\":61.85421278023117,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "7/8 -> 29/32: {\\"note\\":61.91166585433365,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "29/32 -> 15/16: {\\"note\\":61.95487720759226,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "15/16 -> 31/32: {\\"note\\":61.983742740072145,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "31/32 -> 1/1: {\\"note\\":61.998192912177224,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 201 https://strudel.cc/?wIjKrvTVPfgZ 1`] = `
-[
-  "0/1 -> 1/16: {\\"note\\":47.370882377028465,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "1/16 -> 1/8: {\\"note\\":47.10302542895079,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "1/8 -> 3/16: {\\"note\\":49.174072265625,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "3/16 -> 1/4: {\\"note\\":49.72477217763662,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "1/4 -> 5/16: {\\"note\\":50.367317005991936,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "5/16 -> 3/8: {\\"note\\":46.19376839697361,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "3/8 -> 7/16: {\\"note\\":51.18686657398939,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "7/16 -> 1/2: {\\"note\\":50.02532958984375,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "1/2 -> 9/16: {\\"note\\":52.08789586275816,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "9/16 -> 5/8: {\\"note\\":52.430519320070744,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "5/8 -> 11/16: {\\"note\\":47.17999421060085,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "11/16 -> 3/4: {\\"note\\":42.378508776426315,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "3/4 -> 13/16: {\\"note\\":42.11755297333002,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "13/16 -> 7/8: {\\"note\\":44.461274698376656,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "7/8 -> 15/16: {\\"note\\":52.89178837090731,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-  "15/16 -> 1/1: {\\"note\\":49.39466518163681,\\"attack\\":0,\\"release\\":0,\\"s\\":\\"triangle\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 202 https://strudel.cc/?iqZ-ex573FFd 1`] = `
-[
-  "0/1 -> 4/25: 52",
-  "4/25 -> 8/25: 57",
-  "8/25 -> 12/25: 61",
-  "12/25 -> 16/25: 52",
-  "16/25 -> 4/5: 57",
-  "4/5 -> 24/25: 61",
-  "24/25 -> 28/25: 52",
-]
-`;
-
-exports[`renders shared tunes > shared tune 203 https://strudel.cc/?0nlMXAIzgsdw 1`] = `
-[
-  "4/5 -> 16/15: {\\"note\\":\\"a6\\",\\"s\\":\\"piano\\"}",
-  "0/1 -> 4/5: {\\"note\\":\\"ab5\\",\\"s\\":\\"piano\\"}",
-  "0/1 -> 4/5: {\\"note\\":\\"e5\\",\\"s\\":\\"piano\\"}",
-  "0/1 -> 4/5: {\\"note\\":\\"c5\\",\\"s\\":\\"piano\\"}",
-  "0/1 -> 4/5: {\\"note\\":\\"Ab5\\",\\"s\\":\\"piano\\"}",
-  "4/5 -> 8/5: {\\"note\\":\\"Db5\\",\\"s\\":\\"piano\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 204 https://strudel.cc/?-4PvWekokc4W 1`] = `
-[
-  "0/1 -> 1/8: {\\"s\\":\\"p\\",\\"speed\\":0.03125,\\"unit\\":\\"c\\",\\"begin\\":0,\\"end\\":0.0078125,\\"pan\\":0,\\"shape\\":0.4,\\"decay\\":0.1,\\"sustain\\":0.4}",
-  "1/8 -> 1/4: {\\"s\\":\\"p\\",\\"speed\\":0.03125,\\"unit\\":\\"c\\",\\"begin\\":0,\\"end\\":0.0078125,\\"pan\\":0,\\"shape\\":0.4,\\"decay\\":0.1,\\"sustain\\":0.4}",
-  "1/4 -> 3/8: {\\"s\\":\\"p\\",\\"speed\\":0.03125,\\"unit\\":\\"c\\",\\"begin\\":0.0078125,\\"end\\":0.015625,\\"pan\\":0,\\"shape\\":0.4,\\"decay\\":0.1,\\"sustain\\":0.4}",
-  "3/8 -> 1/2: {\\"s\\":\\"p\\",\\"speed\\":0.03125,\\"unit\\":\\"c\\",\\"begin\\":0.0078125,\\"end\\":0.015625,\\"pan\\":0,\\"shape\\":0.4,\\"decay\\":0.1,\\"sustain\\":0.4}",
-  "1/2 -> 5/8: {\\"s\\":\\"p\\",\\"speed\\":0.03125,\\"unit\\":\\"c\\",\\"begin\\":0.015625,\\"end\\":0.0234375,\\"pan\\":0,\\"shape\\":0.4,\\"decay\\":0.1,\\"sustain\\":0.4}",
-  "5/8 -> 3/4: {\\"s\\":\\"p\\",\\"speed\\":0.03125,\\"unit\\":\\"c\\",\\"begin\\":0.015625,\\"end\\":0.0234375,\\"pan\\":0,\\"shape\\":0.4,\\"decay\\":0.1,\\"sustain\\":0.4}",
-  "3/4 -> 7/8: {\\"s\\":\\"p\\",\\"speed\\":0.03125,\\"unit\\":\\"c\\",\\"begin\\":0.0234375,\\"end\\":0.03125,\\"pan\\":0,\\"shape\\":0.4,\\"decay\\":0.1,\\"sustain\\":0.4}",
-  "7/8 -> 1/1: {\\"s\\":\\"p\\",\\"speed\\":0.03125,\\"unit\\":\\"c\\",\\"begin\\":0.0234375,\\"end\\":0.03125,\\"pan\\":0,\\"shape\\":0.4,\\"decay\\":0.1,\\"sustain\\":0.4}",
-  "7/8 -> 1/1: {\\"s\\":\\"p\\",\\"speed\\":0.03125,\\"unit\\":\\"c\\",\\"begin\\":0,\\"end\\":0.0078125,\\"pan\\":1,\\"shape\\":0.4,\\"decay\\":0.1,\\"sustain\\":0.4}",
-  "3/4 -> 7/8: {\\"s\\":\\"p\\",\\"speed\\":0.03125,\\"unit\\":\\"c\\",\\"begin\\":0,\\"end\\":0.0078125,\\"pan\\":1,\\"shape\\":0.4,\\"decay\\":0.1,\\"sustain\\":0.4}",
-  "5/8 -> 3/4: {\\"s\\":\\"p\\",\\"speed\\":0.03125,\\"unit\\":\\"c\\",\\"begin\\":0.0078125,\\"end\\":0.015625,\\"pan\\":1,\\"shape\\":0.4,\\"decay\\":0.1,\\"sustain\\":0.4}",
-  "1/2 -> 5/8: {\\"s\\":\\"p\\",\\"speed\\":0.03125,\\"unit\\":\\"c\\",\\"begin\\":0.0078125,\\"end\\":0.015625,\\"pan\\":1,\\"shape\\":0.4,\\"decay\\":0.1,\\"sustain\\":0.4}",
-  "3/8 -> 1/2: {\\"s\\":\\"p\\",\\"speed\\":0.03125,\\"unit\\":\\"c\\",\\"begin\\":0.015625,\\"end\\":0.0234375,\\"pan\\":1,\\"shape\\":0.4,\\"decay\\":0.1,\\"sustain\\":0.4}",
-  "1/4 -> 3/8: {\\"s\\":\\"p\\",\\"speed\\":0.03125,\\"unit\\":\\"c\\",\\"begin\\":0.015625,\\"end\\":0.0234375,\\"pan\\":1,\\"shape\\":0.4,\\"decay\\":0.1,\\"sustain\\":0.4}",
-  "1/8 -> 1/4: {\\"s\\":\\"p\\",\\"speed\\":0.03125,\\"unit\\":\\"c\\",\\"begin\\":0.0234375,\\"end\\":0.03125,\\"pan\\":1,\\"shape\\":0.4,\\"decay\\":0.1,\\"sustain\\":0.4}",
-  "0/1 -> 1/8: {\\"s\\":\\"p\\",\\"speed\\":0.03125,\\"unit\\":\\"c\\",\\"begin\\":0.0234375,\\"end\\":0.03125,\\"pan\\":1,\\"shape\\":0.4,\\"decay\\":0.1,\\"sustain\\":0.4}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 205 https://strudel.cc/?norqcTA-uOs0 1`] = `
-[
-  "0/1 -> 44/75: {\\"note\\":78,\\"s\\":\\"piano\\"}",
-  "44/75 -> 88/75: {\\"note\\":71,\\"s\\":\\"piano\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 206 https://strudel.cc/?WrN_Cv-hQMo0 1`] = `
-[
-  "0/1 -> 1/4: {\\"n\\":\\"c3\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":0.9}",
-  "1/4 -> 1/2: {\\"n\\":\\"eb3\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":0.9}",
-  "1/2 -> 3/4: {\\"n\\":\\"g3\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":0.9}",
-  "3/4 -> 1/1: {\\"n\\":\\"g2\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":0.9}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 207 https://strudel.cc/?YFbUtVxvA82E 1`] = `
-[
-  "0/1 -> 1/1: {\\"n\\":\\"[object Object][object Object]\\",\\"s\\":\\"sawtooth\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 208 https://strudel.cc/?SHdla152eDum 1`] = `
-[
-  "0/1 -> 3/13: {\\"n\\":\\"c3\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.1,\\"sustain\\":0.4,\\"release\\":1}",
-  "3/13 -> 6/13: {\\"n\\":\\"eb3\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.1,\\"sustain\\":0.4,\\"release\\":1}",
-  "6/13 -> 9/13: {\\"n\\":\\"g3\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.1,\\"sustain\\":0.4,\\"release\\":1}",
-  "9/13 -> 12/13: {\\"n\\":\\"f3\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.1,\\"sustain\\":0.4,\\"release\\":1}",
-  "12/13 -> 15/13: {\\"n\\":\\"ab3\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.1,\\"sustain\\":0.4,\\"release\\":1}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 209 https://strudel.cc/?Jk_4KtRME5zL 1`] = `
-[
-  "0/1 -> 1/10: {\\"n\\":\\"c3\\",\\"s\\":\\"sawtooth\\"}",
-  "1/10 -> 1/5: {\\"n\\":\\"eb3\\",\\"s\\":\\"sawtooth\\"}",
-  "1/5 -> 3/10: {\\"n\\":\\"g3\\",\\"s\\":\\"sawtooth\\"}",
-  "3/10 -> 2/5: {\\"n\\":\\"g2\\",\\"s\\":\\"sawtooth\\"}",
-  "2/5 -> 1/2: {\\"n\\":\\"g3\\",\\"s\\":\\"sawtooth\\"}",
-  "1/2 -> 3/5: {\\"n\\":\\"f3\\",\\"s\\":\\"sawtooth\\"}",
-  "3/5 -> 7/10: {\\"n\\":\\"ab3\\",\\"s\\":\\"sawtooth\\"}",
-  "7/10 -> 4/5: {\\"n\\":\\"b2\\",\\"s\\":\\"sawtooth\\"}",
-  "4/5 -> 9/10: {\\"n\\":\\"ab3\\",\\"s\\":\\"sawtooth\\"}",
-  "9/10 -> 1/1: {\\"n\\":\\"f3\\",\\"s\\":\\"sawtooth\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 210 https://strudel.cc/?xHaKTd1kTpCn 1`] = `
-[
-  "-1/8 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":0,\\"cut\\":1,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":4}",
-  "-1/8 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":0,\\"cut\\":1,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":1,\\"value\\":4}",
-  "-1/8 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":0,\\"cut\\":0,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":1,\\"value\\":4}",
-  "-1/8 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":0,\\"cut\\":0,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":4}",
-  "-1/8 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":0,\\"cut\\":1,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":4}",
-  "-1/8 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":0,\\"cut\\":1,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":4}",
-  "-1/8 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":0,\\"cut\\":1,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0,\\"value\\":4}",
-  "-1/8 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":0,\\"cut\\":0,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0,\\"value\\":4}",
-  "-1/8 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":0,\\"cut\\":0,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0,\\"value\\":4}",
-  "-1/8 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":1,\\"cut\\":0,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0,\\"value\\":4}",
-  "-1/8 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":1,\\"cut\\":0,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":4}",
-  "-1/8 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":4}",
-  "-1/8 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":4}",
-  "-1/8 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":4}",
-  "-1/8 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":4}",
-  "-1/8 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":4}",
-  "3/4 -> 1/1: {\\"s\\":\\"hh\\",\\"note\\":44,\\"n\\":0,\\"cut\\":1,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":4}",
-  "3/4 -> 1/1: {\\"s\\":\\"hh\\",\\"note\\":44,\\"n\\":0,\\"cut\\":1,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":1,\\"value\\":4}",
-  "3/4 -> 1/1: {\\"s\\":\\"hh\\",\\"note\\":44,\\"n\\":0,\\"cut\\":0,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":1,\\"value\\":4}",
-  "1/2 -> 3/4: {\\"s\\":\\"lt\\",\\"note\\":44,\\"n\\":0,\\"cut\\":0,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":1,\\"value\\":4}",
-  "1/2 -> 3/4: {\\"s\\":\\"lt\\",\\"note\\":44,\\"n\\":0,\\"cut\\":0,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":4}",
-  "1/2 -> 3/4: {\\"s\\":\\"lt\\",\\"note\\":44,\\"n\\":0,\\"cut\\":1,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":4}",
-  "1/4 -> 1/2: {\\"s\\":\\"hh\\",\\"note\\":44,\\"n\\":0,\\"cut\\":1,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":4}",
-  "1/4 -> 1/2: {\\"s\\":\\"hh\\",\\"note\\":44,\\"n\\":0,\\"cut\\":1,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0,\\"value\\":4}",
-  "1/4 -> 1/2: {\\"s\\":\\"hh\\",\\"note\\":44,\\"n\\":0,\\"cut\\":0,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0,\\"value\\":4}",
-  "1/4 -> 1/2: {\\"s\\":\\"hh\\",\\"note\\":44,\\"n\\":0,\\"cut\\":0,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0,\\"value\\":4}",
-  "1/4 -> 1/2: {\\"s\\":\\"hh\\",\\"note\\":44,\\"n\\":1,\\"cut\\":0,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0,\\"value\\":4}",
-  "0/1 -> 1/4: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":1,\\"cut\\":0,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":4}",
-  "0/1 -> 1/4: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":4}",
-  "0/1 -> 1/4: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":4}",
-  "0/1 -> 1/4: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":4}",
-  "0/1 -> 1/4: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":4}",
-  "0/1 -> 1/4: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":4}",
-  "9/16 -> 9/8: {\\"s\\":\\"misc\\",\\"note\\":44,\\"n\\":0,\\"cut\\":2,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "9/16 -> 9/8: {\\"s\\":\\"misc\\",\\"note\\":44,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":5}",
-  "0/1 -> 9/8: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":0,\\"cut\\":2,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "0/1 -> 9/8: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":5}",
-  "7/8 -> 9/8: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":0,\\"cut\\":2,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "7/8 -> 9/8: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":5}",
-  "9/16 -> 9/8: {\\"s\\":\\"misc\\",\\"note\\":44,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":1,\\"value\\":5}",
-  "9/16 -> 9/8: {\\"s\\":\\"misc\\",\\"note\\":44,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":1,\\"value\\":5}",
-  "9/16 -> 9/8: {\\"s\\":\\"misc\\",\\"note\\":44,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "9/16 -> 9/8: {\\"s\\":\\"misc\\",\\"note\\":44,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "9/16 -> 9/8: {\\"s\\":\\"misc\\",\\"note\\":44,\\"n\\":1,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "9/16 -> 9/8: {\\"s\\":\\"misc\\",\\"note\\":44,\\"n\\":1,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "0/1 -> 9/16: {\\"s\\":\\"misc\\",\\"note\\":44,\\"n\\":1,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0,\\"value\\":5}",
-  "0/1 -> 9/16: {\\"s\\":\\"misc\\",\\"note\\":30,\\"n\\":1,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0,\\"value\\":5}",
-  "0/1 -> 9/16: {\\"s\\":\\"misc\\",\\"note\\":30,\\"n\\":1,\\"cut\\":0,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0,\\"value\\":5}",
-  "0/1 -> 9/16: {\\"s\\":\\"misc\\",\\"note\\":30,\\"n\\":1,\\"cut\\":0,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "0/1 -> 9/16: {\\"s\\":\\"misc\\",\\"note\\":30,\\"n\\":2,\\"cut\\":0,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "0/1 -> 9/16: {\\"s\\":\\"misc\\",\\"note\\":30,\\"n\\":2,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "0/1 -> 9/16: {\\"s\\":\\"misc\\",\\"note\\":30,\\"n\\":2,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":5}",
-  "0/1 -> 9/16: {\\"s\\":\\"misc\\",\\"note\\":30,\\"n\\":2,\\"cut\\":1,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":5}",
-  "0/1 -> 9/16: {\\"s\\":\\"misc\\",\\"note\\":30,\\"n\\":2,\\"cut\\":0,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":5}",
-  "0/1 -> 9/8: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":1,\\"value\\":5}",
-  "0/1 -> 9/8: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":1,\\"value\\":5}",
-  "0/1 -> 9/8: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "0/1 -> 9/8: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "0/1 -> 9/8: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":1,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "0/1 -> 9/8: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":1,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "0/1 -> 9/8: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":1,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0,\\"value\\":5}",
-  "0/1 -> 9/8: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":1,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0,\\"value\\":5}",
-  "0/1 -> 9/8: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":1,\\"cut\\":0,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0,\\"value\\":5}",
-  "0/1 -> 9/8: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":1,\\"cut\\":0,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "0/1 -> 9/8: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":2,\\"cut\\":0,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "0/1 -> 9/8: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":2,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "0/1 -> 9/8: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":2,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":5}",
-  "0/1 -> 9/8: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":2,\\"cut\\":1,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":5}",
-  "0/1 -> 9/8: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":2,\\"cut\\":0,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":5}",
-  "5/8 -> 7/8: {\\"s\\":\\"hh\\",\\"note\\":44,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":1,\\"value\\":5}",
-  "5/8 -> 7/8: {\\"s\\":\\"hh\\",\\"note\\":44,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":1,\\"value\\":5}",
-  "5/8 -> 7/8: {\\"s\\":\\"hh\\",\\"note\\":44,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "5/8 -> 7/8: {\\"s\\":\\"hh\\",\\"note\\":44,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "3/8 -> 5/8: {\\"s\\":\\"lt\\",\\"note\\":44,\\"n\\":1,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "3/8 -> 5/8: {\\"s\\":\\"lt\\",\\"note\\":44,\\"n\\":1,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "3/8 -> 5/8: {\\"s\\":\\"lt\\",\\"note\\":44,\\"n\\":1,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0,\\"value\\":5}",
-  "3/8 -> 5/8: {\\"s\\":\\"lt\\",\\"note\\":30,\\"n\\":1,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0,\\"value\\":5}",
-  "3/8 -> 5/8: {\\"s\\":\\"lt\\",\\"note\\":30,\\"n\\":1,\\"cut\\":0,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0,\\"value\\":5}",
-  "1/8 -> 3/8: {\\"s\\":\\"hh\\",\\"note\\":30,\\"n\\":1,\\"cut\\":0,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "1/8 -> 3/8: {\\"s\\":\\"hh\\",\\"note\\":30,\\"n\\":2,\\"cut\\":0,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "1/8 -> 3/8: {\\"s\\":\\"hh\\",\\"note\\":30,\\"n\\":2,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "1/8 -> 3/8: {\\"s\\":\\"hh\\",\\"note\\":30,\\"n\\":2,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":5}",
-  "-1/8 -> 1/8: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":2,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":5}",
-  "-1/8 -> 1/8: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":2,\\"cut\\":1,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":5}",
-  "-1/8 -> 1/8: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":2,\\"cut\\":0,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":5}",
-  "1/8 -> 5/4: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":6}",
-  "1/8 -> 5/4: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":6}",
-  "1/8 -> 5/4: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-  "1/8 -> 5/4: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":2,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-  "3/4 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":6}",
-  "3/4 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":6}",
-  "3/4 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-  "3/4 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":2,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-  "1/8 -> 5/4: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":2,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-  "1/8 -> 5/4: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":2,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0,\\"value\\":6}",
-  "1/8 -> 5/4: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0,\\"value\\":6}",
-  "1/8 -> 5/4: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-  "1/8 -> 5/4: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-  "1/8 -> 5/4: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-  "1/8 -> 5/4: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":1,\\"value\\":6}",
-  "1/8 -> 5/4: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":2,\\"cut\\":1,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":6}",
-  "1/8 -> 5/4: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":2,\\"cut\\":1,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":6}",
-  "1/8 -> 5/4: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":3,\\"cut\\":1,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":6}",
-  "-1/1 -> 1/8: {\\"s\\":\\"birds\\",\\"note\\":30,\\"n\\":3,\\"cut\\":1,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-  "-1/1 -> 1/8: {\\"s\\":\\"birds\\",\\"note\\":30,\\"n\\":3,\\"cut\\":0,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-  "1/2 -> 3/4: {\\"s\\":\\"hh\\",\\"note\\":30,\\"n\\":2,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-  "1/2 -> 3/4: {\\"s\\":\\"hh\\",\\"note\\":30,\\"n\\":2,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0,\\"value\\":6}",
-  "1/2 -> 3/4: {\\"s\\":\\"hh\\",\\"note\\":30,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0,\\"value\\":6}",
-  "1/4 -> 1/2: {\\"s\\":\\"lt\\",\\"note\\":30,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-  "1/4 -> 1/2: {\\"s\\":\\"lt\\",\\"note\\":30,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-  "1/4 -> 1/2: {\\"s\\":\\"lt\\",\\"note\\":30,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-  "1/4 -> 1/2: {\\"s\\":\\"lt\\",\\"note\\":30,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":1,\\"value\\":6}",
-  "0/1 -> 1/4: {\\"s\\":\\"hh\\",\\"note\\":30,\\"n\\":2,\\"cut\\":1,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":6}",
-  "0/1 -> 1/4: {\\"s\\":\\"hh\\",\\"note\\":30,\\"n\\":2,\\"cut\\":1,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":6}",
-  "0/1 -> 1/4: {\\"s\\":\\"hh\\",\\"note\\":30,\\"n\\":3,\\"cut\\":1,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":6}",
-  "0/1 -> 1/4: {\\"s\\":\\"hh\\",\\"note\\":30,\\"n\\":3,\\"cut\\":1,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-  "0/1 -> 1/4: {\\"s\\":\\"hh\\",\\"note\\":30,\\"n\\":3,\\"cut\\":0,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 211 https://strudel.cc/?o5LLePbx8kiQ 1`] = `
-[
-  "-1/8 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":0,\\"cut\\":1,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":4}",
-  "-1/8 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":0,\\"cut\\":1,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":1,\\"value\\":4}",
-  "-1/8 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":0,\\"cut\\":0,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":1,\\"value\\":4}",
-  "-1/8 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":0,\\"cut\\":0,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":1,\\"value\\":4}",
-  "-1/8 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":0,\\"cut\\":0,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":4}",
-  "-1/8 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":0,\\"cut\\":1,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":4}",
-  "-1/8 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":0,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":4}",
-  "-1/8 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":0,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":4}",
-  "-1/8 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":0,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0,\\"value\\":4}",
-  "-1/8 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":0,\\"cut\\":0,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0,\\"value\\":4}",
-  "-1/8 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":0,\\"cut\\":0,\\"attack\\":0.05,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0,\\"value\\":4}",
-  "-1/8 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":1,\\"cut\\":0,\\"attack\\":0.05,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0,\\"value\\":4}",
-  "-1/8 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":1,\\"cut\\":0,\\"attack\\":0.05,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":4}",
-  "-1/8 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":4}",
-  "-1/8 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":1,\\"cut\\":2,\\"attack\\":0,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":4}",
-  "-1/8 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":1,\\"cut\\":2,\\"attack\\":0,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":4}",
-  "-1/8 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":1,\\"cut\\":2,\\"attack\\":0,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":4}",
-  "-1/8 -> 1/1: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":1,\\"cut\\":2,\\"attack\\":0,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":4}",
-  "3/4 -> 1/1: {\\"s\\":\\"hh\\",\\"note\\":44,\\"n\\":0,\\"cut\\":1,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":4}",
-  "3/4 -> 1/1: {\\"s\\":\\"hh\\",\\"note\\":44,\\"n\\":0,\\"cut\\":1,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":1,\\"value\\":4}",
-  "3/4 -> 1/1: {\\"s\\":\\"hh\\",\\"note\\":44,\\"n\\":0,\\"cut\\":0,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":1,\\"value\\":4}",
-  "1/2 -> 3/4: {\\"s\\":\\"lt\\",\\"note\\":44,\\"n\\":0,\\"cut\\":0,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":1,\\"value\\":4}",
-  "1/2 -> 3/4: {\\"s\\":\\"lt\\",\\"note\\":44,\\"n\\":0,\\"cut\\":0,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":1,\\"value\\":4}",
-  "1/2 -> 3/4: {\\"s\\":\\"lt\\",\\"note\\":44,\\"n\\":0,\\"cut\\":0,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":4}",
-  "1/2 -> 3/4: {\\"s\\":\\"lt\\",\\"note\\":44,\\"n\\":0,\\"cut\\":1,\\"attack\\":0.01,\\"decay\\":0.01,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":4}",
-  "1/2 -> 3/4: {\\"s\\":\\"lt\\",\\"note\\":44,\\"n\\":0,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":4}",
-  "1/4 -> 1/2: {\\"s\\":\\"hh\\",\\"note\\":44,\\"n\\":0,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":4}",
-  "1/4 -> 1/2: {\\"s\\":\\"hh\\",\\"note\\":44,\\"n\\":0,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0,\\"value\\":4}",
-  "1/4 -> 1/2: {\\"s\\":\\"hh\\",\\"note\\":44,\\"n\\":0,\\"cut\\":0,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0,\\"value\\":4}",
-  "1/4 -> 1/2: {\\"s\\":\\"hh\\",\\"note\\":44,\\"n\\":0,\\"cut\\":0,\\"attack\\":0.05,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0,\\"value\\":4}",
-  "1/4 -> 1/2: {\\"s\\":\\"hh\\",\\"note\\":44,\\"n\\":1,\\"cut\\":0,\\"attack\\":0.05,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0,\\"value\\":4}",
-  "0/1 -> 1/4: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":1,\\"cut\\":0,\\"attack\\":0.05,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":4}",
-  "0/1 -> 1/4: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":4}",
-  "0/1 -> 1/4: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":1,\\"cut\\":2,\\"attack\\":0,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":4}",
-  "0/1 -> 1/4: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":1,\\"cut\\":2,\\"attack\\":0,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":4}",
-  "0/1 -> 1/4: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":1,\\"cut\\":2,\\"attack\\":0,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":4}",
-  "0/1 -> 1/4: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":1,\\"cut\\":2,\\"attack\\":0,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":4}",
-  "5/8 -> 7/4: {\\"s\\":\\"breaks125\\",\\"note\\":51,\\"n\\":3,\\"cut\\":2,\\"attack\\":0,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "5/8 -> 7/4: {\\"s\\":\\"breaks125\\",\\"note\\":51,\\"n\\":3,\\"cut\\":2,\\"attack\\":0,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "7/8 -> 9/8: {\\"s\\":\\"hh\\",\\"note\\":51,\\"n\\":3,\\"cut\\":2,\\"attack\\":0,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "7/8 -> 9/8: {\\"s\\":\\"hh\\",\\"note\\":51,\\"n\\":3,\\"cut\\":2,\\"attack\\":0,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "1/2 -> 17/16: {\\"s\\":\\"ht\\",\\"note\\":30,\\"n\\":1,\\"cut\\":0,\\"attack\\":0,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "1/2 -> 17/16: {\\"s\\":\\"ht\\",\\"note\\":30,\\"n\\":2,\\"cut\\":0,\\"attack\\":0,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "1/2 -> 17/16: {\\"s\\":\\"ht\\",\\"note\\":30,\\"n\\":2,\\"cut\\":1,\\"attack\\":0,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "1/2 -> 17/16: {\\"s\\":\\"ht\\",\\"note\\":30,\\"n\\":2,\\"cut\\":1,\\"attack\\":0,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "1/2 -> 17/16: {\\"s\\":\\"ht\\",\\"note\\":30,\\"n\\":2,\\"cut\\":1,\\"attack\\":0,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":5}",
-  "1/2 -> 17/16: {\\"s\\":\\"ht\\",\\"note\\":30,\\"n\\":2,\\"cut\\":1,\\"attack\\":0.01,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":5}",
-  "1/2 -> 17/16: {\\"s\\":\\"ht\\",\\"note\\":30,\\"n\\":2,\\"cut\\":0,\\"attack\\":0.01,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":5}",
-  "1/2 -> 13/8: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":1,\\"cut\\":0,\\"attack\\":0,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "1/2 -> 13/8: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":2,\\"cut\\":0,\\"attack\\":0,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "1/2 -> 13/8: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":2,\\"cut\\":1,\\"attack\\":0,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "1/2 -> 13/8: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":2,\\"cut\\":1,\\"attack\\":0,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "1/2 -> 13/8: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":2,\\"cut\\":1,\\"attack\\":0,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":5}",
-  "1/2 -> 13/8: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":2,\\"cut\\":1,\\"attack\\":0.01,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":5}",
-  "1/2 -> 13/8: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":2,\\"cut\\":0,\\"attack\\":0.01,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":5}",
-  "-5/8 -> 1/2: {\\"s\\":\\"breaks125\\",\\"note\\":30,\\"n\\":2,\\"cut\\":0,\\"attack\\":0.01,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "5/8 -> 7/8: {\\"s\\":\\"hh\\",\\"note\\":30,\\"n\\":1,\\"cut\\":0,\\"attack\\":0,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "5/8 -> 7/8: {\\"s\\":\\"hh\\",\\"note\\":30,\\"n\\":2,\\"cut\\":0,\\"attack\\":0,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "5/8 -> 7/8: {\\"s\\":\\"hh\\",\\"note\\":30,\\"n\\":2,\\"cut\\":1,\\"attack\\":0,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "5/8 -> 7/8: {\\"s\\":\\"hh\\",\\"note\\":30,\\"n\\":2,\\"cut\\":1,\\"attack\\":0,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "5/8 -> 7/8: {\\"s\\":\\"hh\\",\\"note\\":30,\\"n\\":2,\\"cut\\":1,\\"attack\\":0,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":5}",
-  "3/8 -> 5/8: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":2,\\"cut\\":1,\\"attack\\":0,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":5}",
-  "3/8 -> 5/8: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":2,\\"cut\\":1,\\"attack\\":0.01,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":5}",
-  "3/8 -> 5/8: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":2,\\"cut\\":0,\\"attack\\":0.01,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":5}",
-  "3/8 -> 5/8: {\\"s\\":\\"bd\\",\\"note\\":30,\\"n\\":2,\\"cut\\":0,\\"attack\\":0.01,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "-5/8 -> 1/2: {\\"s\\":\\"breaks125\\",\\"note\\":30,\\"n\\":2,\\"cut\\":0,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "-5/8 -> 1/2: {\\"s\\":\\"breaks125\\",\\"note\\":30,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "-5/8 -> 1/2: {\\"s\\":\\"breaks125\\",\\"note\\":30,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0,\\"value\\":5}",
-  "-5/8 -> 1/2: {\\"s\\":\\"breaks125\\",\\"note\\":30,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0,\\"value\\":5}",
-  "-5/8 -> 1/2: {\\"s\\":\\"breaks125\\",\\"note\\":51,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0,\\"value\\":5}",
-  "-5/8 -> 1/2: {\\"s\\":\\"breaks125\\",\\"note\\":51,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0,\\"value\\":5}",
-  "-5/8 -> 1/2: {\\"s\\":\\"breaks125\\",\\"note\\":51,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "-5/8 -> 1/2: {\\"s\\":\\"breaks125\\",\\"note\\":51,\\"n\\":3,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "-5/8 -> 1/2: {\\"s\\":\\"breaks125\\",\\"note\\":51,\\"n\\":3,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "1/8 -> 3/8: {\\"s\\":\\"hh\\",\\"note\\":30,\\"n\\":2,\\"cut\\":0,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "1/8 -> 3/8: {\\"s\\":\\"hh\\",\\"note\\":30,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "1/8 -> 3/8: {\\"s\\":\\"hh\\",\\"note\\":30,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0,\\"value\\":5}",
-  "1/8 -> 3/8: {\\"s\\":\\"hh\\",\\"note\\":30,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0,\\"value\\":5}",
-  "1/8 -> 3/8: {\\"s\\":\\"hh\\",\\"note\\":51,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0,\\"value\\":5}",
-  "1/8 -> 3/8: {\\"s\\":\\"hh\\",\\"note\\":51,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0,\\"value\\":5}",
-  "-1/8 -> 1/8: {\\"s\\":\\"lt\\",\\"note\\":51,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "-1/8 -> 1/8: {\\"s\\":\\"lt\\",\\"note\\":51,\\"n\\":3,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "-1/8 -> 1/8: {\\"s\\":\\"lt\\",\\"note\\":51,\\"n\\":3,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":5}",
-  "11/16 -> 5/4: {\\"s\\":\\"misc\\",\\"note\\":44,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":1,\\"value\\":6}",
-  "11/16 -> 5/4: {\\"s\\":\\"misc\\",\\"note\\":44,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":1,\\"value\\":6}",
-  "11/16 -> 5/4: {\\"s\\":\\"misc\\",\\"note\\":44,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-  "1/8 -> 5/4: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":1,\\"value\\":6}",
-  "1/8 -> 5/4: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":1,\\"value\\":6}",
-  "1/8 -> 5/4: {\\"s\\":\\"bd\\",\\"note\\":44,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-  "3/4 -> 1/1: {\\"s\\":\\"hh\\",\\"note\\":44,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":1,\\"value\\":6}",
-  "3/4 -> 1/1: {\\"s\\":\\"hh\\",\\"note\\":44,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":1,\\"value\\":6}",
-  "3/4 -> 1/1: {\\"s\\":\\"hh\\",\\"note\\":44,\\"n\\":1,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-  "-1/4 -> 7/8: {\\"s\\":\\"breaks125\\",\\"note\\":30,\\"n\\":2,\\"cut\\":0,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-  "-1/4 -> 7/8: {\\"s\\":\\"breaks125\\",\\"note\\":30,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-  "-1/4 -> 7/8: {\\"s\\":\\"breaks125\\",\\"note\\":30,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0,\\"value\\":6}",
-  "-1/4 -> 7/8: {\\"s\\":\\"breaks125\\",\\"note\\":30,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0,\\"value\\":6}",
-  "-1/4 -> 7/8: {\\"s\\":\\"breaks125\\",\\"note\\":51,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0,\\"value\\":6}",
-  "-1/4 -> 7/8: {\\"s\\":\\"breaks125\\",\\"note\\":51,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0,\\"value\\":6}",
-  "-1/4 -> 7/8: {\\"s\\":\\"breaks125\\",\\"note\\":51,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-  "-1/4 -> 7/8: {\\"s\\":\\"breaks125\\",\\"note\\":51,\\"n\\":3,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-  "-1/4 -> 7/8: {\\"s\\":\\"breaks125\\",\\"note\\":51,\\"n\\":3,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-  "-1/4 -> 7/8: {\\"s\\":\\"breaks125\\",\\"note\\":51,\\"n\\":3,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-  "-1/4 -> 7/8: {\\"s\\":\\"breaks125\\",\\"note\\":51,\\"n\\":3,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":1,\\"value\\":6}",
-  "-1/4 -> 7/8: {\\"s\\":\\"breaks125\\",\\"note\\":51,\\"n\\":3,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":6}",
-  "-1/4 -> 7/8: {\\"s\\":\\"breaks125\\",\\"note\\":51,\\"n\\":3,\\"cut\\":1,\\"attack\\":0,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":6}",
-  "-1/4 -> 7/8: {\\"s\\":\\"breaks125\\",\\"note\\":51,\\"n\\":3,\\"cut\\":2,\\"attack\\":0,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":6}",
-  "-1/4 -> 7/8: {\\"s\\":\\"breaks125\\",\\"note\\":51,\\"n\\":3,\\"cut\\":2,\\"attack\\":0,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-  "-1/4 -> 7/8: {\\"s\\":\\"breaks125\\",\\"note\\":51,\\"n\\":3,\\"cut\\":2,\\"attack\\":0,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-  "1/2 -> 3/4: {\\"s\\":\\"hh\\",\\"note\\":30,\\"n\\":2,\\"cut\\":0,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-  "1/2 -> 3/4: {\\"s\\":\\"hh\\",\\"note\\":30,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-  "1/2 -> 3/4: {\\"s\\":\\"hh\\",\\"note\\":30,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0,\\"value\\":6}",
-  "1/2 -> 3/4: {\\"s\\":\\"hh\\",\\"note\\":30,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.01,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0,\\"value\\":6}",
-  "1/2 -> 3/4: {\\"s\\":\\"hh\\",\\"note\\":51,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0,\\"value\\":6}",
-  "1/2 -> 3/4: {\\"s\\":\\"hh\\",\\"note\\":51,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0,\\"value\\":6}",
-  "1/4 -> 1/2: {\\"s\\":\\"lt\\",\\"note\\":51,\\"n\\":2,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-  "1/4 -> 1/2: {\\"s\\":\\"lt\\",\\"note\\":51,\\"n\\":3,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-  "1/4 -> 1/2: {\\"s\\":\\"lt\\",\\"note\\":51,\\"n\\":3,\\"cut\\":2,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-  "1/4 -> 1/2: {\\"s\\":\\"lt\\",\\"note\\":51,\\"n\\":3,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-  "1/4 -> 1/2: {\\"s\\":\\"lt\\",\\"note\\":51,\\"n\\":3,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.2,\\"release\\":2,\\"pan\\":1,\\"value\\":6}",
-  "0/1 -> 1/4: {\\"s\\":\\"hh\\",\\"note\\":51,\\"n\\":3,\\"cut\\":1,\\"attack\\":0.05,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":6}",
-  "0/1 -> 1/4: {\\"s\\":\\"hh\\",\\"note\\":51,\\"n\\":3,\\"cut\\":1,\\"attack\\":0,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":6}",
-  "0/1 -> 1/4: {\\"s\\":\\"hh\\",\\"note\\":51,\\"n\\":3,\\"cut\\":2,\\"attack\\":0,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":1,\\"value\\":6}",
-  "0/1 -> 1/4: {\\"s\\":\\"hh\\",\\"note\\":51,\\"n\\":3,\\"cut\\":2,\\"attack\\":0,\\"decay\\":0.01,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-  "0/1 -> 1/4: {\\"s\\":\\"hh\\",\\"note\\":51,\\"n\\":3,\\"cut\\":2,\\"attack\\":0,\\"decay\\":0.9,\\"sustain\\":0.6,\\"release\\":2,\\"pan\\":0.5,\\"value\\":6}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 212 https://strudel.cc/?QJdSFHrNzFlO 1`] = `
-[
-  "0/1 -> 1/2: {\\"s\\":\\"bd\\",\\"delay\\":0.5,\\"delaytime\\":0.33,\\"delayfeedback\\":0.6}",
-  "1/2 -> 1/1: {\\"s\\":\\"sd\\",\\"delay\\":0.5,\\"delaytime\\":0.33,\\"delayfeedback\\":0.6}",
-  "0/1 -> 1/2: {\\"s\\":\\"hh\\",\\"delay\\":0.8,\\"delaytime\\":0.08,\\"delayfeedback\\":0.7,\\"orbit\\":2}",
-  "1/2 -> 1/1: {\\"s\\":\\"hh\\",\\"delay\\":0.8,\\"delaytime\\":0.08,\\"delayfeedback\\":0.7,\\"orbit\\":2}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 213 https://strudel.cc/?Nkv2L01eF62W 1`] = `
-[
-  "0/1 -> 1/2: {\\"s\\":\\"bd\\",\\"delay\\":0.5,\\"delaytime\\":0.33,\\"delayfeedback\\":0.6,\\"speed\\":-1}",
-  "1/2 -> 1/1: {\\"s\\":\\"sd\\",\\"delay\\":0.5,\\"delaytime\\":0.33,\\"delayfeedback\\":0.6,\\"speed\\":-1}",
-  "0/1 -> 1/2: {\\"s\\":\\"hh\\",\\"delay\\":0.8,\\"delaytime\\":0.08,\\"delayfeedback\\":0.7,\\"orbit\\":2,\\"speed\\":-1}",
-  "1/2 -> 1/1: {\\"s\\":\\"hh\\",\\"delay\\":0.8,\\"delaytime\\":0.08,\\"delayfeedback\\":0.7,\\"orbit\\":2,\\"speed\\":-1}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 214 https://strudel.cc/?fWCYi76JTGuA 1`] = `
-[
-  "0/1 -> 1/2: {\\"s\\":\\"bd\\",\\"delay\\":0,\\"delaytime\\":0.16,\\"delayfeedback\\":0.6,\\"speed\\":-1}",
-  "1/2 -> 1/1: {\\"s\\":\\"sd\\",\\"delay\\":0,\\"delaytime\\":0.16,\\"delayfeedback\\":0.6,\\"speed\\":-1}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 215 https://strudel.cc/?yJ-qOjgrjkMk 1`] = `
-[
-  "0/1 -> 1/2: c1",
-  "1/2 -> 1/1: c1",
-  "1/2 -> 1/1: c3",
-  "0/1 -> 1/4: C1",
-  "1/4 -> 1/2: C3",
-  "1/2 -> 3/4: C1",
-  "3/4 -> 1/1: C3",
-]
-`;
-
-exports[`renders shared tunes > shared tune 216 https://strudel.cc/?UPVdAQhVNgbc 1`] = `
-[
-  "0/1 -> 1/6: {\\"note\\":\\"g3\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":4000,\\"crush\\":16}",
-  "1/6 -> 1/3: {\\"note\\":\\"g3\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":4000,\\"crush\\":16}",
-  "1/3 -> 1/2: {\\"note\\":\\"g3\\",\\"s\\":\\"triangle\\",\\"cutoff\\":4000,\\"crush\\":16}",
-  "1/2 -> 2/3: {\\"note\\":\\"g3\\",\\"s\\":\\"triangle\\",\\"cutoff\\":4000,\\"crush\\":16}",
-  "2/3 -> 5/6: {\\"note\\":\\"g3\\",\\"s\\":\\"triangle\\",\\"cutoff\\":4000,\\"crush\\":16}",
-  "5/6 -> 1/1: {\\"note\\":\\"g3\\",\\"s\\":\\"triangle\\",\\"cutoff\\":4000,\\"crush\\":16}",
-  "0/1 -> 1/6: {\\"note\\":\\"b3\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":4000,\\"crush\\":16}",
-  "1/6 -> 1/3: {\\"note\\":\\"b3\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":4000,\\"crush\\":16}",
-  "1/3 -> 1/2: {\\"note\\":\\"b3\\",\\"s\\":\\"triangle\\",\\"cutoff\\":4000,\\"crush\\":16}",
-  "1/2 -> 2/3: {\\"note\\":\\"b3\\",\\"s\\":\\"triangle\\",\\"cutoff\\":4000,\\"crush\\":16}",
-  "2/3 -> 5/6: {\\"note\\":\\"b3\\",\\"s\\":\\"triangle\\",\\"cutoff\\":4000,\\"crush\\":16}",
-  "5/6 -> 1/1: {\\"note\\":\\"b3\\",\\"s\\":\\"triangle\\",\\"cutoff\\":4000,\\"crush\\":16}",
-  "0/1 -> 1/6: {\\"note\\":\\"e4\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":4000,\\"crush\\":16}",
-  "1/6 -> 1/3: {\\"note\\":\\"e4\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":4000,\\"crush\\":16}",
-  "1/3 -> 1/2: {\\"note\\":\\"e4\\",\\"s\\":\\"triangle\\",\\"cutoff\\":4000,\\"crush\\":16}",
-  "1/2 -> 2/3: {\\"note\\":\\"e4\\",\\"s\\":\\"triangle\\",\\"cutoff\\":4000,\\"crush\\":16}",
-  "2/3 -> 5/6: {\\"note\\":\\"e4\\",\\"s\\":\\"triangle\\",\\"cutoff\\":4000,\\"crush\\":16}",
-  "5/6 -> 1/1: {\\"note\\":\\"e4\\",\\"s\\":\\"triangle\\",\\"cutoff\\":4000,\\"crush\\":16}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 217 https://strudel.cc/?WDuiXaMhRRx5 1`] = `
-[
-  "0/1 -> 8/5: {\\"note\\":85,\\"s\\":\\"piano\\",\\"cutoff\\":\\"500\\"}",
-  "0/1 -> 8/5: {\\"note\\":81,\\"s\\":\\"piano\\",\\"cutoff\\":\\"500\\"}",
-  "0/1 -> 8/5: {\\"note\\":77,\\"s\\":\\"piano\\",\\"cutoff\\":\\"500\\"}",
-  "4/5 -> 16/15: {\\"note\\":98,\\"s\\":\\"piano\\",\\"cutoff\\":\\"500\\"}",
-  "0/1 -> 4/5: {\\"note\\":85,\\"s\\":\\"piano\\",\\"cutoff\\":\\"500\\"}",
-  "0/1 -> 4/5: {\\"note\\":81,\\"s\\":\\"piano\\",\\"cutoff\\":\\"500\\"}",
-  "0/1 -> 4/5: {\\"note\\":77,\\"s\\":\\"piano\\",\\"cutoff\\":\\"500\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 218 https://strudel.cc/?sOP6EO9TO4HO 1`] = `
-[
-  "0/1 -> 1/1: B3",
-  "0/1 -> 1/1: D4",
-  "0/1 -> 1/1: E4",
-  "0/1 -> 1/1: G4",
-  "0/1 -> 1/1: C3",
-]
-`;
-
-exports[`renders shared tunes > shared tune 219 https://strudel.cc/?ddiSv-lz2_cp 1`] = `
-[
-  "0/1 -> 1/6: {\\"note\\":53,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":507.8125,\\"gain\\":0.9166666666666666}",
-  "0/1 -> 1/6: {\\"note\\":57,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":507.8125,\\"gain\\":0.9166666666666666}",
-  "0/1 -> 1/6: {\\"note\\":60,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":507.8125,\\"gain\\":0.9166666666666666}",
-  "0/1 -> 1/6: {\\"note\\":64,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":507.8125,\\"gain\\":0.9166666666666666}",
-  "0/1 -> 1/6: {\\"note\\":53.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":507.8125,\\"gain\\":0.9166666666666666}",
-  "0/1 -> 1/6: {\\"note\\":57.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":507.8125,\\"gain\\":0.9166666666666666}",
-  "0/1 -> 1/6: {\\"note\\":60.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":507.8125,\\"gain\\":0.9166666666666666}",
-  "0/1 -> 1/6: {\\"note\\":64.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":507.8125,\\"gain\\":0.9166666666666666}",
-  "1/6 -> 1/3: {\\"note\\":53,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":523.4375,\\"gain\\":0.75}",
-  "1/6 -> 1/3: {\\"note\\":57,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":523.4375,\\"gain\\":0.75}",
-  "1/6 -> 1/3: {\\"note\\":60,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":523.4375,\\"gain\\":0.75}",
-  "1/6 -> 1/3: {\\"note\\":64,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":523.4375,\\"gain\\":0.75}",
-  "1/6 -> 1/3: {\\"note\\":53.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":523.4375,\\"gain\\":0.75}",
-  "1/6 -> 1/3: {\\"note\\":57.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":523.4375,\\"gain\\":0.75}",
-  "1/6 -> 1/3: {\\"note\\":60.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":523.4375,\\"gain\\":0.75}",
-  "1/6 -> 1/3: {\\"note\\":64.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":523.4375,\\"gain\\":0.75}",
-  "1/3 -> 1/2: {\\"note\\":53,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":539.0625,\\"gain\\":0.5833333333333333}",
-  "1/3 -> 1/2: {\\"note\\":57,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":539.0625,\\"gain\\":0.5833333333333333}",
-  "1/3 -> 1/2: {\\"note\\":60,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":539.0625,\\"gain\\":0.5833333333333333}",
-  "1/3 -> 1/2: {\\"note\\":64,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":539.0625,\\"gain\\":0.5833333333333333}",
-  "1/3 -> 1/2: {\\"note\\":53.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":539.0625,\\"gain\\":0.5833333333333333}",
-  "1/3 -> 1/2: {\\"note\\":57.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":539.0625,\\"gain\\":0.5833333333333333}",
-  "1/3 -> 1/2: {\\"note\\":60.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":539.0625,\\"gain\\":0.5833333333333333}",
-  "1/3 -> 1/2: {\\"note\\":64.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":539.0625,\\"gain\\":0.5833333333333333}",
-  "1/2 -> 2/3: {\\"note\\":53,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":554.6875,\\"gain\\":0.41666666666666663}",
-  "1/2 -> 2/3: {\\"note\\":57,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":554.6875,\\"gain\\":0.41666666666666663}",
-  "1/2 -> 2/3: {\\"note\\":60,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":554.6875,\\"gain\\":0.41666666666666663}",
-  "1/2 -> 2/3: {\\"note\\":64,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":554.6875,\\"gain\\":0.41666666666666663}",
-  "1/2 -> 2/3: {\\"note\\":53.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":554.6875,\\"gain\\":0.41666666666666663}",
-  "1/2 -> 2/3: {\\"note\\":57.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":554.6875,\\"gain\\":0.41666666666666663}",
-  "1/2 -> 2/3: {\\"note\\":60.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":554.6875,\\"gain\\":0.41666666666666663}",
-  "1/2 -> 2/3: {\\"note\\":64.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":554.6875,\\"gain\\":0.41666666666666663}",
-  "2/3 -> 5/6: {\\"note\\":53,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":570.3125,\\"gain\\":0.25}",
-  "2/3 -> 5/6: {\\"note\\":57,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":570.3125,\\"gain\\":0.25}",
-  "2/3 -> 5/6: {\\"note\\":60,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":570.3125,\\"gain\\":0.25}",
-  "2/3 -> 5/6: {\\"note\\":64,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":570.3125,\\"gain\\":0.25}",
-  "2/3 -> 5/6: {\\"note\\":53.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":570.3125,\\"gain\\":0.25}",
-  "2/3 -> 5/6: {\\"note\\":57.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":570.3125,\\"gain\\":0.25}",
-  "2/3 -> 5/6: {\\"note\\":60.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":570.3125,\\"gain\\":0.25}",
-  "2/3 -> 5/6: {\\"note\\":64.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":570.3125,\\"gain\\":0.25}",
-  "5/6 -> 1/1: {\\"note\\":53,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":585.9375,\\"gain\\":0.08333333333333337}",
-  "5/6 -> 1/1: {\\"note\\":57,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":585.9375,\\"gain\\":0.08333333333333337}",
-  "5/6 -> 1/1: {\\"note\\":60,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":585.9375,\\"gain\\":0.08333333333333337}",
-  "5/6 -> 1/1: {\\"note\\":64,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":585.9375,\\"gain\\":0.08333333333333337}",
-  "5/6 -> 1/1: {\\"note\\":53.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":585.9375,\\"gain\\":0.08333333333333337}",
-  "5/6 -> 1/1: {\\"note\\":57.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":585.9375,\\"gain\\":0.08333333333333337}",
-  "5/6 -> 1/1: {\\"note\\":60.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":585.9375,\\"gain\\":0.08333333333333337}",
-  "5/6 -> 1/1: {\\"note\\":64.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":585.9375,\\"gain\\":0.08333333333333337}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 220 https://strudel.cc/?cpVS2-bO1LzP 1`] = `
-[
-  "0/1 -> 1/6: {\\"note\\":53,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":507.8125,\\"gain\\":0.9166666666666666}",
-  "0/1 -> 1/6: {\\"note\\":57,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":507.8125,\\"gain\\":0.9166666666666666}",
-  "0/1 -> 1/6: {\\"note\\":60,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":507.8125,\\"gain\\":0.9166666666666666}",
-  "0/1 -> 1/6: {\\"note\\":64,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":507.8125,\\"gain\\":0.9166666666666666}",
-  "0/1 -> 1/6: {\\"note\\":53.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":507.8125,\\"gain\\":0.9166666666666666}",
-  "0/1 -> 1/6: {\\"note\\":57.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":507.8125,\\"gain\\":0.9166666666666666}",
-  "0/1 -> 1/6: {\\"note\\":60.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":507.8125,\\"gain\\":0.9166666666666666}",
-  "0/1 -> 1/6: {\\"note\\":64.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":507.8125,\\"gain\\":0.9166666666666666}",
-  "1/6 -> 1/3: {\\"note\\":53,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":523.4375,\\"gain\\":0.75}",
-  "1/6 -> 1/3: {\\"note\\":57,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":523.4375,\\"gain\\":0.75}",
-  "1/6 -> 1/3: {\\"note\\":60,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":523.4375,\\"gain\\":0.75}",
-  "1/6 -> 1/3: {\\"note\\":64,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":523.4375,\\"gain\\":0.75}",
-  "1/6 -> 1/3: {\\"note\\":53.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":523.4375,\\"gain\\":0.75}",
-  "1/6 -> 1/3: {\\"note\\":57.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":523.4375,\\"gain\\":0.75}",
-  "1/6 -> 1/3: {\\"note\\":60.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":523.4375,\\"gain\\":0.75}",
-  "1/6 -> 1/3: {\\"note\\":64.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":523.4375,\\"gain\\":0.75}",
-  "1/3 -> 1/2: {\\"note\\":53,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":539.0625,\\"gain\\":0.5833333333333333}",
-  "1/3 -> 1/2: {\\"note\\":57,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":539.0625,\\"gain\\":0.5833333333333333}",
-  "1/3 -> 1/2: {\\"note\\":60,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":539.0625,\\"gain\\":0.5833333333333333}",
-  "1/3 -> 1/2: {\\"note\\":64,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":539.0625,\\"gain\\":0.5833333333333333}",
-  "1/3 -> 1/2: {\\"note\\":53.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":539.0625,\\"gain\\":0.5833333333333333}",
-  "1/3 -> 1/2: {\\"note\\":57.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":539.0625,\\"gain\\":0.5833333333333333}",
-  "1/3 -> 1/2: {\\"note\\":60.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":539.0625,\\"gain\\":0.5833333333333333}",
-  "1/3 -> 1/2: {\\"note\\":64.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":539.0625,\\"gain\\":0.5833333333333333}",
-  "1/2 -> 2/3: {\\"note\\":53,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":554.6875,\\"gain\\":0.41666666666666663}",
-  "1/2 -> 2/3: {\\"note\\":57,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":554.6875,\\"gain\\":0.41666666666666663}",
-  "1/2 -> 2/3: {\\"note\\":60,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":554.6875,\\"gain\\":0.41666666666666663}",
-  "1/2 -> 2/3: {\\"note\\":64,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":554.6875,\\"gain\\":0.41666666666666663}",
-  "1/2 -> 2/3: {\\"note\\":53.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":554.6875,\\"gain\\":0.41666666666666663}",
-  "1/2 -> 2/3: {\\"note\\":57.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":554.6875,\\"gain\\":0.41666666666666663}",
-  "1/2 -> 2/3: {\\"note\\":60.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":554.6875,\\"gain\\":0.41666666666666663}",
-  "1/2 -> 2/3: {\\"note\\":64.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":554.6875,\\"gain\\":0.41666666666666663}",
-  "2/3 -> 5/6: {\\"note\\":53,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":570.3125,\\"gain\\":0.25}",
-  "2/3 -> 5/6: {\\"note\\":57,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":570.3125,\\"gain\\":0.25}",
-  "2/3 -> 5/6: {\\"note\\":60,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":570.3125,\\"gain\\":0.25}",
-  "2/3 -> 5/6: {\\"note\\":64,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":570.3125,\\"gain\\":0.25}",
-  "2/3 -> 5/6: {\\"note\\":53.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":570.3125,\\"gain\\":0.25}",
-  "2/3 -> 5/6: {\\"note\\":57.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":570.3125,\\"gain\\":0.25}",
-  "2/3 -> 5/6: {\\"note\\":60.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":570.3125,\\"gain\\":0.25}",
-  "2/3 -> 5/6: {\\"note\\":64.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":570.3125,\\"gain\\":0.25}",
-  "5/6 -> 1/1: {\\"note\\":53,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":585.9375,\\"gain\\":0.08333333333333337}",
-  "5/6 -> 1/1: {\\"note\\":57,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":585.9375,\\"gain\\":0.08333333333333337}",
-  "5/6 -> 1/1: {\\"note\\":60,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":585.9375,\\"gain\\":0.08333333333333337}",
-  "5/6 -> 1/1: {\\"note\\":64,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":585.9375,\\"gain\\":0.08333333333333337}",
-  "5/6 -> 1/1: {\\"note\\":53.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":585.9375,\\"gain\\":0.08333333333333337}",
-  "5/6 -> 1/1: {\\"note\\":57.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":585.9375,\\"gain\\":0.08333333333333337}",
-  "5/6 -> 1/1: {\\"note\\":60.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":585.9375,\\"gain\\":0.08333333333333337}",
-  "5/6 -> 1/1: {\\"note\\":64.07793132476509,\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.05,\\"sustain\\":0.2,\\"cutoff\\":585.9375,\\"gain\\":0.08333333333333337}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 221 https://strudel.cc/?IPOyuRRkZaNr 1`] = `
-[
-  "0/1 -> 3/20: 0",
-  "0/1 -> 3/20: 3",
-  "3/4 -> 9/10: 1",
-  "3/4 -> 9/10: 4",
-  "0/1 -> 3/10: -8",
-  "3/8 -> 27/40: -8",
-  "3/4 -> 21/20: -7",
-  "0/1 -> 3/200: 12",
-  "3/4 -> 153/200: 11",
-  "0/1 -> 3/20: c2",
-  "747/1000 -> 1497/1000: c1",
-  "0/1 -> 3/8: c2",
-  "3/8 -> 3/4: c2",
-  "3/4 -> 9/8: c2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 222 https://strudel.cc/?fGbP7VOtCWWU 1`] = `
-[
-  "0/1 -> 1/8: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "0/1 -> 1/8: {\\"note\\":\\"B4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5787037037037037}",
-  "0/1 -> 1/8: {\\"note\\":\\"C5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5833333333333333}",
-  "0/1 -> 1/8: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "1/4 -> 3/8: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "1/4 -> 3/8: {\\"note\\":\\"B4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5787037037037037}",
-  "1/4 -> 3/8: {\\"note\\":\\"C5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5833333333333333}",
-  "1/4 -> 3/8: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "3/8 -> 1/2: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "3/8 -> 1/2: {\\"note\\":\\"B4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5787037037037037}",
-  "3/8 -> 1/2: {\\"note\\":\\"C5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5833333333333333}",
-  "3/8 -> 1/2: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "1/2 -> 5/8: {\\"note\\":\\"F4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5509259259259259}",
-  "1/2 -> 5/8: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "1/2 -> 5/8: {\\"note\\":\\"C5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5833333333333333}",
-  "1/2 -> 5/8: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "3/4 -> 7/8: {\\"note\\":\\"F4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5509259259259259}",
-  "3/4 -> 7/8: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "3/4 -> 7/8: {\\"note\\":\\"C5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5833333333333333}",
-  "3/4 -> 7/8: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "7/8 -> 1/1: {\\"note\\":\\"F4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5509259259259259}",
-  "7/8 -> 1/1: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "7/8 -> 1/1: {\\"note\\":\\"C5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5833333333333333}",
-  "7/8 -> 1/1: {\\"note\\":\\"E5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6018518518518519}",
-  "0/1 -> 1/24: {\\"note\\":\\"A2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.45833333333333337}",
-  "1/6 -> 5/24: {\\"note\\":\\"A2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.45833333333333337}",
-  "1/3 -> 3/8: {\\"note\\":\\"A2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.45833333333333337}",
-  "1/2 -> 13/24: {\\"note\\":\\"D2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.42592592592592593}",
-  "2/3 -> 17/24: {\\"note\\":\\"D2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.42592592592592593}",
-  "5/6 -> 7/8: {\\"note\\":\\"D2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.42592592592592593}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 223 https://strudel.cc/?4YKibw76FrRb 1`] = `
-[
-  "0/1 -> 1/2: {\\"note\\":\\"G3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5046296296296297}",
-  "0/1 -> 1/2: {\\"note\\":\\"B3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5231481481481481}",
-  "0/1 -> 1/2: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "0/1 -> 1/2: {\\"note\\":\\"E4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5462962962962963}",
-  "0/1 -> 1/16: {\\"note\\":\\"A2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.45833333333333337}",
-  "1/4 -> 5/16: {\\"note\\":\\"A2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.45833333333333337}",
-  "1/2 -> 9/16: {\\"note\\":\\"F2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.4398148148148148}",
-  "3/4 -> 13/16: {\\"note\\":\\"F2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.4398148148148148}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 224 https://strudel.cc/?7UmR7rJMSvWq 1`] = `
-[
-  "0/1 -> 1/2: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "0/1 -> 1/2: {\\"note\\":\\"D4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.537037037037037}",
-  "0/1 -> 1/2: {\\"note\\":\\"E4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5462962962962963}",
-  "0/1 -> 1/2: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "0/1 -> 1/4: {\\"note\\":\\"C2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.41666666666666663}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 225 https://strudel.cc/?N0a4wkk96WWE 1`] = `
-[
-  "0/1 -> 8/19: {\\"note\\":\\"C5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5833333333333333}",
-  "8/19 -> 16/19: {\\"note\\":\\"f5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6064814814814814}",
-  "16/19 -> 24/19: {\\"note\\":\\"f5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.6064814814814814}",
-  "0/1 -> 4/1: {\\"note\\":\\"c3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.4722222222222222}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 226 https://strudel.cc/?s8HiRvW_Rngj 1`] = `
-[
-  "0/1 -> 3053185/4904046: {\\"n\\":62,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3986.9405734726183}",
-  "0/1 -> 3053185/4904046: {\\"n\\":62,\\"s\\":\\"square\\",\\"cutoff\\":3986.9405734726183}",
-  "0/1 -> 3053185/4904046: {\\"n\\":62,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3986.9405734726183}",
-  "1/2 -> 7957231/9808092: {\\"n\\":50,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3942.3145276351606}",
-  "1/2 -> 7957231/9808092: {\\"n\\":50,\\"s\\":\\"square\\",\\"cutoff\\":3942.3145276351606}",
-  "3/4 -> 5204627/4904046: {\\"n\\":41,\\"s\\":\\"square\\",\\"cutoff\\":3897.7021140702864}",
-  "3/4 -> 5204627/4904046: {\\"n\\":41,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3858.612673535166}",
-  "0/1 -> 3053185/4904046: {\\"n\\":43,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3986.9405734726183}",
-  "0/1 -> 3053185/4904046: {\\"n\\":43,\\"s\\":\\"square\\",\\"cutoff\\":3986.9405734726183}",
-  "0/1 -> 3053185/4904046: {\\"n\\":43,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3986.9405734726183}",
-  "1/2 -> 2752604/2452023: {\\"n\\":69,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3924.645587531366}",
-  "1/2 -> 2752604/2452023: {\\"n\\":69,\\"s\\":\\"square\\",\\"cutoff\\":3924.645587531366}",
-  "1/2 -> 2752604/2452023: {\\"n\\":69,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3850.2031844444546}",
-  "-1/4 -> 3654347/9808092: {\\"n\\":48,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3995.31915093835}",
-  "-1/4 -> 3654347/9808092: {\\"n\\":48,\\"s\\":\\"square\\",\\"cutoff\\":3995.31915093835}",
-  "1/4 -> 8558393/9808092: {\\"n\\":74,\\"s\\":\\"square\\",\\"cutoff\\":3957.6603580168244}",
-  "1/4 -> 8558393/9808092: {\\"n\\":74,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3957.6603580168244}",
-  "1/4 -> 8558393/9808092: {\\"n\\":74,\\"s\\":\\"square\\",\\"cutoff\\":3957.6603580168244}",
-  "3/4 -> 5204627/4904046: {\\"n\\":62,\\"s\\":\\"square\\",\\"cutoff\\":3897.7021140702864}",
-  "3/4 -> 5204627/4904046: {\\"n\\":62,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3858.612673535166}",
-  "-1/4 -> 3654347/9808092: {\\"n\\":64,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3995.31915093835}",
-  "-1/4 -> 3654347/9808092: {\\"n\\":64,\\"s\\":\\"square\\",\\"cutoff\\":3995.31915093835}",
-  "1/4 -> 8558393/9808092: {\\"n\\":55,\\"s\\":\\"square\\",\\"cutoff\\":3957.6603580168244}",
-  "1/4 -> 8558393/9808092: {\\"n\\":55,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3957.6603580168244}",
-  "1/4 -> 8558393/9808092: {\\"n\\":55,\\"s\\":\\"square\\",\\"cutoff\\":3957.6603580168244}",
-  "3/4 -> 13462439/9808092: {\\"n\\":81,\\"s\\":\\"square\\",\\"cutoff\\":3897.7021140702864}",
-  "3/4 -> 13462439/9808092: {\\"n\\":81,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3813.515463898106}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 227 https://strudel.cc/?Z1ywkDoR6Tca 1`] = `
-[
-  "5833/7200 -> 19/18: {\\"n\\":\\"C#4\\",\\"s\\":\\"Overdriven Guitar: Guitar\\",\\"gain\\":0.2}",
-  "437/800 -> 19/24: {\\"n\\":\\"D#4\\",\\"s\\":\\"Overdriven Guitar: Guitar\\",\\"gain\\":0.2}",
-  "2033/7200 -> 19/36: {\\"n\\":\\"F4\\",\\"s\\":\\"Overdriven Guitar: Guitar\\",\\"gain\\":0.2}",
-  "133/7200 -> 19/72: {\\"n\\":\\"G4\\",\\"s\\":\\"Overdriven Guitar: Guitar\\",\\"gain\\":0.2}",
-  "5833/7200 -> 19/18: {\\"n\\":\\"c#5\\",\\"s\\":\\"Overdriven Guitar: Guitar\\",\\"gain\\":0.1}",
-  "437/800 -> 19/24: {\\"n\\":\\"d#5\\",\\"s\\":\\"Overdriven Guitar: Guitar\\",\\"gain\\":0.1}",
-  "2033/7200 -> 19/36: {\\"n\\":\\"f5\\",\\"s\\":\\"Overdriven Guitar: Guitar\\",\\"gain\\":0.1}",
-  "133/7200 -> 19/72: {\\"n\\":\\"g5\\",\\"s\\":\\"Overdriven Guitar: Guitar\\",\\"gain\\":0.1}",
-  "19/24 -> 19/12: {\\"n\\":57,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.25}",
-  "19/24 -> 19/12: {\\"n\\":61,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.25}",
-  "19/24 -> 19/12: {\\"n\\":52,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.25}",
-  "0/1 -> 19/24: {\\"n\\":59,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.25}",
-  "0/1 -> 19/24: {\\"n\\":63,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.25}",
-  "0/1 -> 19/24: {\\"n\\":54,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.25}",
-  "209/240 -> 19/12: {\\"n\\":\\"A1\\",\\"s\\":\\"Electric Bass (finger): Bass\\",\\"gain\\":0.3}",
-  "19/240 -> 19/24: {\\"n\\":\\"B1\\",\\"s\\":\\"Electric Bass (finger): Bass\\",\\"gain\\":0.3}",
-  "19/24 -> 19/18: {\\"s\\":\\"sn\\",\\"gain\\":0.25}",
-  "19/36 -> 19/24: {\\"s\\":\\"sn\\",\\"gain\\":0.25}",
-  "19/72 -> 19/36: {\\"s\\":\\"sn\\",\\"gain\\":0.25}",
-  "0/1 -> 19/72: {\\"s\\":\\"sn\\",\\"gain\\":0.25}",
-  "19/24 -> 19/18: {\\"s\\":\\"hh\\",\\"gain\\":0.25}",
-  "19/36 -> 19/24: {\\"s\\":\\"hh\\",\\"gain\\":0.25}",
-  "19/72 -> 19/36: {\\"s\\":\\"hh\\",\\"gain\\":0.25}",
-  "0/1 -> 19/72: {\\"s\\":\\"hh\\",\\"gain\\":0.25}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 228 https://strudel.cc/?eXyJ5cvdMxIl 1`] = `
-[
-  "0/1 -> 1/1: {\\"n\\":69,\\"s\\":\\"Church Organ: Organ\\",\\"gain\\":0.2}",
-  "0/1 -> 1/1: {\\"n\\":72,\\"s\\":\\"Church Organ: Organ\\",\\"gain\\":0.2}",
-  "0/1 -> 1/1: {\\"n\\":76,\\"s\\":\\"Church Organ: Organ\\",\\"gain\\":0.2}",
-  "0/1 -> 1/4: {\\"s\\":\\"bd\\",\\"gain\\":0.25}",
-  "1/4 -> 1/2: {\\"s\\":\\"bd\\",\\"gain\\":0.25}",
-  "1/2 -> 5/8: {\\"s\\":\\"cp\\",\\"gain\\":0.25}",
-  "7/8 -> 1/1: {\\"s\\":\\"cp\\",\\"gain\\":0.25}",
-  "0/1 -> 1/4: {\\"s\\":\\"hh\\",\\"gain\\":0.25}",
-  "1/4 -> 1/2: {\\"s\\":\\"hh\\",\\"gain\\":0.25}",
-  "1/2 -> 3/4: {\\"s\\":\\"hh\\",\\"gain\\":0.25}",
-  "3/4 -> 1/1: {\\"s\\":\\"hh\\",\\"gain\\":0.25}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 229 https://strudel.cc/?YSgSSFCioxs0 1`] = `
-[
-  "0/1 -> 1/1: {\\"n\\":69,\\"s\\":\\"Church Organ: Organ\\",\\"gain\\":0.2}",
-  "0/1 -> 1/1: {\\"n\\":72,\\"s\\":\\"Church Organ: Organ\\",\\"gain\\":0.2}",
-  "0/1 -> 1/1: {\\"n\\":76,\\"s\\":\\"Church Organ: Organ\\",\\"gain\\":0.2}",
-  "0/1 -> 1/4: {\\"s\\":\\"bd\\",\\"gain\\":0.25}",
-  "1/4 -> 1/2: {\\"s\\":\\"bd\\",\\"gain\\":0.25}",
-  "1/2 -> 5/8: {\\"s\\":\\"cp\\",\\"gain\\":0.25}",
-  "7/8 -> 1/1: {\\"s\\":\\"cp\\",\\"gain\\":0.25}",
-  "0/1 -> 1/4: {\\"s\\":\\"hh\\",\\"gain\\":0.25}",
-  "1/4 -> 1/2: {\\"s\\":\\"hh\\",\\"gain\\":0.25}",
-  "1/2 -> 3/4: {\\"s\\":\\"hh\\",\\"gain\\":0.25}",
-  "3/4 -> 1/1: {\\"s\\":\\"hh\\",\\"gain\\":0.25}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 230 https://strudel.cc/?lAIAC1TOD3zB 1`] = `
-[
-  "0/1 -> 1/2: c1",
-  "1/2 -> 1/1: c1",
-  "1/2 -> 1/1: c3",
-  "0/1 -> 1/4: C1",
-  "1/4 -> 1/2: C3",
-  "1/2 -> 3/4: C1",
-  "3/4 -> 1/1: C3",
-]
-`;
-
-exports[`renders shared tunes > shared tune 231 https://strudel.cc/?LZ-aTB2xiaZ8 1`] = `
-[
-  "0/1 -> 3053185/4904046: {\\"n\\":62,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3986.9405734726183}",
-  "0/1 -> 3053185/4904046: {\\"n\\":62,\\"s\\":\\"square\\",\\"cutoff\\":3986.9405734726183}",
-  "0/1 -> 3053185/4904046: {\\"n\\":62,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3986.9405734726183}",
-  "1/2 -> 7957231/9808092: {\\"n\\":50,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3942.3145276351606}",
-  "1/2 -> 7957231/9808092: {\\"n\\":50,\\"s\\":\\"square\\",\\"cutoff\\":3942.3145276351606}",
-  "3/4 -> 5204627/4904046: {\\"n\\":41,\\"s\\":\\"square\\",\\"cutoff\\":3897.7021140702864}",
-  "3/4 -> 5204627/4904046: {\\"n\\":41,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3858.612673535166}",
-  "0/1 -> 3053185/4904046: {\\"n\\":43,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3986.9405734726183}",
-  "0/1 -> 3053185/4904046: {\\"n\\":43,\\"s\\":\\"square\\",\\"cutoff\\":3986.9405734726183}",
-  "0/1 -> 3053185/4904046: {\\"n\\":43,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3986.9405734726183}",
-  "1/2 -> 2752604/2452023: {\\"n\\":69,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3924.645587531366}",
-  "1/2 -> 2752604/2452023: {\\"n\\":69,\\"s\\":\\"square\\",\\"cutoff\\":3924.645587531366}",
-  "1/2 -> 2752604/2452023: {\\"n\\":69,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3850.2031844444546}",
-  "-1/4 -> 3654347/9808092: {\\"n\\":48,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3995.31915093835}",
-  "-1/4 -> 3654347/9808092: {\\"n\\":48,\\"s\\":\\"square\\",\\"cutoff\\":3995.31915093835}",
-  "1/4 -> 8558393/9808092: {\\"n\\":74,\\"s\\":\\"square\\",\\"cutoff\\":3957.6603580168244}",
-  "1/4 -> 8558393/9808092: {\\"n\\":74,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3957.6603580168244}",
-  "1/4 -> 8558393/9808092: {\\"n\\":74,\\"s\\":\\"square\\",\\"cutoff\\":3957.6603580168244}",
-  "3/4 -> 5204627/4904046: {\\"n\\":62,\\"s\\":\\"square\\",\\"cutoff\\":3897.7021140702864}",
-  "3/4 -> 5204627/4904046: {\\"n\\":62,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3858.612673535166}",
-  "-1/4 -> 3654347/9808092: {\\"n\\":64,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3995.31915093835}",
-  "-1/4 -> 3654347/9808092: {\\"n\\":64,\\"s\\":\\"square\\",\\"cutoff\\":3995.31915093835}",
-  "1/4 -> 8558393/9808092: {\\"n\\":55,\\"s\\":\\"square\\",\\"cutoff\\":3957.6603580168244}",
-  "1/4 -> 8558393/9808092: {\\"n\\":55,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3957.6603580168244}",
-  "1/4 -> 8558393/9808092: {\\"n\\":55,\\"s\\":\\"square\\",\\"cutoff\\":3957.6603580168244}",
-  "3/4 -> 13462439/9808092: {\\"n\\":81,\\"s\\":\\"square\\",\\"cutoff\\":3897.7021140702864}",
-  "3/4 -> 13462439/9808092: {\\"n\\":81,\\"s\\":\\"sawtooth\\",\\"cutoff\\":3813.515463898106}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 232 https://strudel.cc/?_zhepg-kT6fD 1`] = `
-[
-  "0/1 -> 3/8: {\\"s\\":\\"bd\\",\\"gain\\":0.14}",
-  "3/8 -> 3/4: {\\"s\\":\\"bd\\",\\"gain\\":0.14}",
-  "3/4 -> 3/2: {\\"s\\":\\"hh\\",\\"gain\\":0.14}",
-  "0/1 -> 3/20: {\\"note\\":\\"C2\\",\\"s\\":\\"square\\",\\"cutoff\\":400,\\"decay\\":0.12,\\"sustain\\":0}",
-  "3/8 -> 21/40: {\\"note\\":\\"A1\\",\\"s\\":\\"square\\",\\"cutoff\\":400,\\"decay\\":0.12,\\"sustain\\":0}",
-  "3/4 -> 9/10: {\\"note\\":\\"Bb1\\",\\"s\\":\\"square\\",\\"cutoff\\":400,\\"decay\\":0.12,\\"sustain\\":0}",
-  "3/16 -> 27/80: {\\"note\\":\\"C2\\",\\"s\\":\\"square\\",\\"cutoff\\":400,\\"decay\\":0.12,\\"sustain\\":0}",
-  "9/16 -> 57/80: {\\"note\\":\\"A1\\",\\"s\\":\\"square\\",\\"cutoff\\":400,\\"decay\\":0.12,\\"sustain\\":0}",
-  "15/16 -> 87/80: {\\"note\\":\\"Bb1\\",\\"s\\":\\"square\\",\\"cutoff\\":400,\\"decay\\":0.12,\\"sustain\\":0}",
-  "0/1 -> 3/20: {\\"note\\":\\"G2\\"}",
-  "0/1 -> 3/40: {\\"note\\":\\"C3\\"}",
-  "3/4 -> 33/40: {\\"note\\":\\"Eb3\\"}",
-  "-15/16 -> -63/80: {\\"note\\":\\"Db\\"}",
-  "-3/16 -> -9/80: {\\"note\\":\\"A\\"}",
-  "3/16 -> 27/80: {\\"note\\":\\"Db\\"}",
-  "3/16 -> 21/80: {\\"note\\":\\"Gb\\"}",
-  "15/16 -> 81/80: {\\"note\\":\\"A\\"}",
-  "-3/4 -> -3/5: {\\"note\\":\\"G\\"}",
-  "0/1 -> 3/40: {\\"note\\":\\"Eb\\"}",
-  "3/8 -> 21/40: {\\"note\\":\\"G\\"}",
-  "3/8 -> 9/20: {\\"note\\":\\"C\\"}",
-  "-9/16 -> -33/80: {\\"note\\":\\"Db\\"}",
-  "-9/16 -> -39/80: {\\"note\\":\\"Gb\\"}",
-  "3/16 -> 21/80: {\\"note\\":\\"A\\"}",
-  "9/16 -> 57/80: {\\"note\\":\\"Db\\"}",
-  "9/16 -> 51/80: {\\"note\\":\\"Gb\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 234 https://strudel.cc/?1moEu58ZjMF4 1`] = `
-[
-  "0/1 -> 1/2: {\\"note\\":\\"c2\\",\\"s\\":\\"square\\",\\"attack\\":0.1,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":0.1}",
-  "1/2 -> 1/1: {\\"note\\":\\"eb2\\",\\"s\\":\\"square\\",\\"attack\\":0.1,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":0.1}",
-  "0/1 -> 1/2: {\\"s\\":\\"bd\\",\\"crush\\":16}",
-  "0/1 -> 1/2: {\\"s\\":\\"bd\\",\\"crush\\":8}",
-  "0/1 -> 1/4: {\\"s\\":\\"hh\\",\\"crush\\":16}",
-  "1/4 -> 1/2: {\\"s\\":\\"hh\\",\\"crush\\":8}",
-  "1/2 -> 1/1: {\\"s\\":\\"sd\\",\\"crush\\":7}",
-  "1/2 -> 1/1: {\\"s\\":\\"sd\\",\\"crush\\":6}",
-  "1/2 -> 3/4: {\\"s\\":\\"hh\\",\\"crush\\":7}",
-  "3/4 -> 1/1: {\\"s\\":\\"hh\\",\\"crush\\":6}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 235 https://strudel.cc/?1W8nlZAFzi5T 1`] = `
-[
-  "0/1 -> 1/1: {\\"note\\":\\"c2\\",\\"s\\":\\"square\\",\\"attack\\":0.1,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":0.1}",
-  "0/1 -> 1/2: {\\"s\\":\\"bd\\",\\"crush\\":16}",
-  "0/1 -> 1/2: {\\"s\\":\\"bd\\",\\"crush\\":8}",
-  "0/1 -> 1/4: {\\"s\\":\\"hh\\",\\"crush\\":16}",
-  "1/4 -> 1/2: {\\"s\\":\\"hh\\",\\"crush\\":8}",
-  "1/2 -> 1/1: {\\"s\\":\\"sd\\",\\"crush\\":7}",
-  "1/2 -> 1/1: {\\"s\\":\\"sd\\",\\"crush\\":6}",
-  "1/2 -> 3/4: {\\"s\\":\\"hh\\",\\"crush\\":7}",
-  "3/4 -> 1/1: {\\"s\\":\\"hh\\",\\"crush\\":6}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 236 https://strudel.cc/?exwhYw9VYVQz 1`] = `
-[
-  "0/1 -> 1/1: {\\"note\\":\\"c2\\",\\"s\\":\\"square\\",\\"attack\\":0.1,\\"decay\\":0.1,\\"sustain\\":0.2,\\"release\\":0.1}",
-  "0/1 -> 1/2: {\\"s\\":\\"bd\\",\\"crush\\":16}",
-  "0/1 -> 1/2: {\\"s\\":\\"bd\\",\\"crush\\":8}",
-  "0/1 -> 1/4: {\\"s\\":\\"hh\\",\\"crush\\":16}",
-  "1/4 -> 1/2: {\\"s\\":\\"hh\\",\\"crush\\":8}",
-  "1/2 -> 1/1: {\\"s\\":\\"sd\\",\\"crush\\":7}",
-  "1/2 -> 1/1: {\\"s\\":\\"sd\\",\\"crush\\":6}",
-  "1/2 -> 3/4: {\\"s\\":\\"hh\\",\\"crush\\":7}",
-  "3/4 -> 1/1: {\\"s\\":\\"hh\\",\\"crush\\":6}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 237 https://strudel.cc/?z4zPoaRLF6Vs 1`] = `
-[
-  "0/1 -> 2/5: {\\"note\\":\\"c3\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.2,\\"sustain\\":0.3,\\"release\\":0.1,\\"bandf\\":500,\\"bandq\\":1}",
-  "2/5 -> 4/5: {\\"note\\":\\"c3\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.2,\\"sustain\\":0.3,\\"release\\":0.1,\\"bandf\\":500,\\"bandq\\":1}",
-  "4/5 -> 8/5: {\\"note\\":\\"g3\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.2,\\"sustain\\":0.3,\\"release\\":0.1,\\"bandf\\":500,\\"bandq\\":1}",
-  "0/1 -> 4/1: {\\"note\\":\\"c2\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.2,\\"sustain\\":0.3,\\"release\\":0.1,\\"bandf\\":500,\\"bandq\\":1}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 238 https://strudel.cc/?VzJokumWaip_ 1`] = `
-[
-  "3/4 -> 1/1: {\\"s\\":\\"bd\\"}",
-  "1/2 -> 3/4: {\\"s\\":\\"bd\\"}",
-  "1/4 -> 1/2: {\\"s\\":\\"bd\\"}",
-  "1/8 -> 1/4: {\\"s\\":\\"bd\\"}",
-  "0/1 -> 1/8: {\\"s\\":\\"bd\\"}",
-  "3/4 -> 1/1: {\\"s\\":\\"hh\\"}",
-  "1/2 -> 3/4: {\\"s\\":\\"hh\\"}",
-  "3/8 -> 1/2: {\\"s\\":\\"hh\\"}",
-  "1/4 -> 3/8: {\\"s\\":\\"hh\\"}",
-  "1/8 -> 1/4: {\\"s\\":\\"hh\\"}",
-  "0/1 -> 1/8: {\\"s\\":\\"hh\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 239 https://strudel.cc/?gb4pffOZyATk 1`] = `
-[
-  "4/5 -> 1/1: {\\"s\\":\\"bd\\",\\"cutoff\\":200,\\"resonance\\":30}",
-  "4/5 -> 1/1: {\\"s\\":\\"bd\\",\\"cutoff\\":100,\\"resonance\\":30}",
-  "2/5 -> 4/5: {\\"s\\":\\"bd\\",\\"cutoff\\":1000,\\"resonance\\":10}",
-  "2/5 -> 4/5: {\\"s\\":\\"bd\\",\\"cutoff\\":500,\\"resonance\\":20}",
-  "2/5 -> 4/5: {\\"s\\":\\"bd\\",\\"cutoff\\":200,\\"resonance\\":20}",
-  "2/5 -> 4/5: {\\"s\\":\\"bd\\",\\"cutoff\\":200,\\"resonance\\":30}",
-  "1/5 -> 2/5: {\\"s\\":\\"bd\\",\\"cutoff\\":2000,\\"resonance\\":0}",
-  "1/5 -> 2/5: {\\"s\\":\\"bd\\",\\"cutoff\\":2000,\\"resonance\\":10}",
-  "1/5 -> 2/5: {\\"s\\":\\"bd\\",\\"cutoff\\":1000,\\"resonance\\":10}",
-  "1/10 -> 1/5: {\\"s\\":\\"bd\\",\\"cutoff\\":4000,\\"resonance\\":0}",
-  "1/10 -> 1/5: {\\"s\\":\\"bd\\",\\"cutoff\\":2000,\\"resonance\\":0}",
-  "0/1 -> 1/10: {\\"s\\":\\"bd\\",\\"cutoff\\":4000,\\"resonance\\":0}",
-  "3/4 -> 1/1: {\\"s\\":\\"hh\\",\\"cutoff\\":200,\\"resonance\\":30}",
-  "3/4 -> 1/1: {\\"s\\":\\"hh\\",\\"cutoff\\":100,\\"resonance\\":30}",
-  "1/2 -> 3/4: {\\"s\\":\\"hh\\",\\"cutoff\\":500,\\"resonance\\":20}",
-  "1/2 -> 3/4: {\\"s\\":\\"hh\\",\\"cutoff\\":200,\\"resonance\\":20}",
-  "3/8 -> 1/2: {\\"s\\":\\"hh\\",\\"cutoff\\":1000,\\"resonance\\":10}",
-  "1/4 -> 3/8: {\\"s\\":\\"hh\\",\\"cutoff\\":2000,\\"resonance\\":10}",
-  "1/4 -> 3/8: {\\"s\\":\\"hh\\",\\"cutoff\\":1000,\\"resonance\\":10}",
-  "1/8 -> 1/4: {\\"s\\":\\"hh\\",\\"cutoff\\":4000,\\"resonance\\":0}",
-  "1/8 -> 1/4: {\\"s\\":\\"hh\\",\\"cutoff\\":2000,\\"resonance\\":0}",
-  "0/1 -> 1/8: {\\"s\\":\\"hh\\",\\"cutoff\\":4000,\\"resonance\\":0}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 240 https://strudel.cc/?C6vcsMx8UtjJ 1`] = `
-[
-  "0/1 -> 1/8: C2",
-  "1/8 -> 1/4: D2",
-  "1/4 -> 3/8: D2",
-  "3/8 -> 1/2: E2",
-  "1/2 -> 5/8: F2",
-  "5/8 -> 3/4: A2",
-  "3/4 -> 7/8: D3",
-  "7/8 -> 1/1: B3",
-]
-`;
-
-exports[`renders shared tunes > shared tune 241 https://strudel.cc/?jyNjgy-bZ0X7 1`] = `
-[
-  "0/1 -> 3/16: {\\"s\\":\\"bd\\",\\"gain\\":0.7}",
-  "3/16 -> 3/8: {\\"s\\":\\"bd\\",\\"gain\\":0.7}",
-  "3/8 -> 3/4: {\\"s\\":\\"hh\\",\\"gain\\":0.7}",
-  "3/4 -> 9/8: {\\"s\\":\\"sn\\",\\"gain\\":0.7}",
-  "0/1 -> 3/20: {\\"note\\":\\"C2\\",\\"s\\":\\"square\\",\\"cutoff\\":400,\\"decay\\":0.12,\\"sustain\\":0}",
-  "3/8 -> 21/40: {\\"note\\":\\"A1\\",\\"s\\":\\"square\\",\\"cutoff\\":400,\\"decay\\":0.12,\\"sustain\\":0}",
-  "3/4 -> 9/10: {\\"note\\":\\"Bb1\\",\\"s\\":\\"square\\",\\"cutoff\\":400,\\"decay\\":0.12,\\"sustain\\":0}",
-  "3/16 -> 27/80: {\\"note\\":\\"C2\\",\\"s\\":\\"square\\",\\"cutoff\\":400,\\"decay\\":0.12,\\"sustain\\":0}",
-  "9/16 -> 57/80: {\\"note\\":\\"A1\\",\\"s\\":\\"square\\",\\"cutoff\\":400,\\"decay\\":0.12,\\"sustain\\":0}",
-  "15/16 -> 87/80: {\\"note\\":\\"Bb1\\",\\"s\\":\\"square\\",\\"cutoff\\":400,\\"decay\\":0.12,\\"sustain\\":0}",
-  "0/1 -> 3/20: {\\"note\\":\\"G2\\"}",
-  "0/1 -> 3/40: {\\"note\\":\\"C3\\"}",
-  "3/4 -> 33/40: {\\"note\\":\\"Eb3\\"}",
-  "-15/16 -> -63/80: {\\"note\\":\\"G3\\"}",
-  "-3/16 -> -9/80: {\\"note\\":\\"Eb4\\"}",
-  "3/16 -> 27/80: {\\"note\\":\\"G3\\"}",
-  "3/16 -> 21/80: {\\"note\\":\\"C4\\"}",
-  "15/16 -> 81/80: {\\"note\\":\\"Eb4\\"}",
-  "-3/4 -> -3/5: {\\"note\\":\\"G4\\"}",
-  "0/1 -> 3/40: {\\"note\\":\\"Eb5\\"}",
-  "3/8 -> 21/40: {\\"note\\":\\"G4\\"}",
-  "3/8 -> 9/20: {\\"note\\":\\"C5\\"}",
-  "-9/16 -> -33/80: {\\"note\\":\\"G5\\"}",
-  "-9/16 -> -39/80: {\\"note\\":\\"C6\\"}",
-  "3/16 -> 21/80: {\\"note\\":\\"Eb6\\"}",
-  "9/16 -> 57/80: {\\"note\\":\\"G5\\"}",
-  "9/16 -> 51/80: {\\"note\\":\\"C6\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 242 https://strudel.cc/?MPVT_kG6Yni7 1`] = `
-[
-  "0/1 -> 2/1: {\\"note\\":\\"c1\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.2,\\"sustain\\":0.3,\\"release\\":0.1,\\"bandf\\":500,\\"bandq\\":1,\\"gain\\":3}",
-  "1/3 -> 1/1: {\\"s\\":\\"bd\\"}",
-  "0/1 -> 1/3: {\\"s\\":\\"bd\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 243 https://strudel.cc/?Ul_u7MyAGKXb 1`] = `
-[
-  "0/1 -> 1/40: {\\"n\\":62,\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000}",
-  "1/4 -> 21/80: {\\"n\\":51,\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000}",
-  "3/8 -> 31/80: {\\"n\\":41,\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000}",
-  "1/2 -> 21/40: {\\"n\\":50,\\"s\\":\\"square\\",\\"cutoff\\":2000}",
-  "3/4 -> 31/40: {\\"n\\":40,\\"s\\":\\"square\\",\\"cutoff\\":2000}",
-  "1/8 -> 3/20: {\\"n\\":83,\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000}",
-  "3/8 -> 31/80: {\\"n\\":72,\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000}",
-  "1/2 -> 41/80: {\\"n\\":62,\\"s\\":\\"square\\",\\"cutoff\\":2000}",
-  "5/8 -> 13/20: {\\"n\\":71,\\"s\\":\\"square\\",\\"cutoff\\":2000}",
-  "7/8 -> 9/10: {\\"n\\":61,\\"s\\":\\"square\\",\\"cutoff\\":2000}",
-  "0/1 -> 1/40: {\\"n\\":47,\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000}",
-  "1/4 -> 11/40: {\\"n\\":65,\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000}",
-  "1/2 -> 41/80: {\\"n\\":54,\\"s\\":\\"square\\",\\"cutoff\\":2000}",
-  "5/8 -> 51/80: {\\"n\\":44,\\"s\\":\\"square\\",\\"cutoff\\":2000}",
-  "3/4 -> 31/40: {\\"n\\":53,\\"s\\":\\"square\\",\\"cutoff\\":2000}",
-  "1/8 -> 3/20: {\\"n\\":68,\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000}",
-  "3/8 -> 2/5: {\\"n\\":86,\\"s\\":\\"sawtooth\\",\\"cutoff\\":2000}",
-  "5/8 -> 51/80: {\\"n\\":75,\\"s\\":\\"square\\",\\"cutoff\\":2000}",
-  "3/4 -> 61/80: {\\"n\\":65,\\"s\\":\\"square\\",\\"cutoff\\":2000}",
-  "7/8 -> 9/10: {\\"n\\":74,\\"s\\":\\"square\\",\\"cutoff\\":2000}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 244 https://strudel.cc/?6geTqvPlUvv4 1`] = `
-[
-  "0/1 -> 3/80: {\\"n\\":62,\\"s\\":\\"sine\\",\\"cutoff\\":1500}",
-  "1/4 -> 43/160: {\\"n\\":51,\\"s\\":\\"sine\\",\\"cutoff\\":1500}",
-  "3/8 -> 63/160: {\\"n\\":41,\\"s\\":\\"sine\\",\\"cutoff\\":1500}",
-  "1/2 -> 43/80: {\\"n\\":50,\\"s\\":\\"sine\\",\\"cutoff\\":1500}",
-  "3/4 -> 63/80: {\\"n\\":40,\\"s\\":\\"sine\\",\\"cutoff\\":1500}",
-  "1/8 -> 13/80: {\\"n\\":83,\\"s\\":\\"sine\\",\\"cutoff\\":1500}",
-  "3/8 -> 63/160: {\\"n\\":72,\\"s\\":\\"sine\\",\\"cutoff\\":1500}",
-  "1/2 -> 83/160: {\\"n\\":62,\\"s\\":\\"sine\\",\\"cutoff\\":1500}",
-  "5/8 -> 53/80: {\\"n\\":71,\\"s\\":\\"sine\\",\\"cutoff\\":1500}",
-  "7/8 -> 73/80: {\\"n\\":61,\\"s\\":\\"sine\\",\\"cutoff\\":1500}",
-  "0/1 -> 3/80: {\\"n\\":47,\\"s\\":\\"sine\\",\\"cutoff\\":1500}",
-  "1/4 -> 23/80: {\\"n\\":65,\\"s\\":\\"sine\\",\\"cutoff\\":1500}",
-  "1/2 -> 83/160: {\\"n\\":54,\\"s\\":\\"sine\\",\\"cutoff\\":1500}",
-  "5/8 -> 103/160: {\\"n\\":44,\\"s\\":\\"sine\\",\\"cutoff\\":1500}",
-  "3/4 -> 63/80: {\\"n\\":53,\\"s\\":\\"sine\\",\\"cutoff\\":1500}",
-  "1/8 -> 13/80: {\\"n\\":68,\\"s\\":\\"sine\\",\\"cutoff\\":1500}",
-  "3/8 -> 33/80: {\\"n\\":86,\\"s\\":\\"sine\\",\\"cutoff\\":1500}",
-  "5/8 -> 103/160: {\\"n\\":75,\\"s\\":\\"sine\\",\\"cutoff\\":1500}",
-  "3/4 -> 123/160: {\\"n\\":65,\\"s\\":\\"sine\\",\\"cutoff\\":1500}",
-  "7/8 -> 73/80: {\\"n\\":74,\\"s\\":\\"sine\\",\\"cutoff\\":1500}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 245 https://strudel.cc/?5-NpsIAJqGJX 1`] = `
-[
-  "0/1 -> 3/20: 0",
-  "0/1 -> 3/20: 3",
-  "3/4 -> 9/10: 1",
-  "3/4 -> 9/10: 4",
-  "0/1 -> 3/10: -8",
-  "3/8 -> 27/40: -8",
-  "3/4 -> 21/20: -7",
-  "0/1 -> 3/200: 12",
-  "3/4 -> 153/200: 11",
-  "0/1 -> 3/20: c2",
-  "747/1000 -> 1497/1000: c1",
-  "0/1 -> 3/8: c2",
-  "3/8 -> 3/4: c2",
-  "3/4 -> 9/8: c2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 248 https://strudel.cc/?FavmsfMCEJh9 1`] = `
-[
-  "0/1 -> 1/4: {\\"note\\":\\"C3\\"}",
-  "1/4 -> 1/2: {\\"note\\":\\"Eb3\\"}",
-  "1/2 -> 3/4: {\\"note\\":\\"G3\\"}",
-  "3/4 -> 1/1: {\\"note\\":\\"D4\\"}",
-  "0/1 -> 1/4: {\\"note\\":\\"Eb3\\"}",
-  "1/4 -> 1/2: {\\"note\\":\\"G3\\"}",
-  "1/2 -> 3/4: {\\"note\\":\\"Bb3\\"}",
-  "3/4 -> 1/1: {\\"note\\":\\"F4\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 249 https://strudel.cc/?KEJD5r4Q7zZo 1`] = `
-[
-  "0/1 -> 3/4: F4",
-  "0/1 -> 3/4: Bb4",
-  "0/1 -> 3/4: D5",
-  "3/4 -> 5/4: D4",
-  "3/4 -> 5/4: G4",
-  "3/4 -> 5/4: Bb4",
-  "0/1 -> 3/4: G3",
-  "3/4 -> 3/2: G3",
-]
-`;
-
-exports[`renders shared tunes > shared tune 250 https://strudel.cc/?JzQ_9QyLrKhy 1`] = `
-[
-  "0/1 -> 1/3: bd",
-  "1/3 -> 2/3: hh",
-  "2/3 -> 1/1: sn",
-  "0/1 -> 1/20: G4",
-  "1/6 -> 13/60: G4",
-  "1/3 -> 23/60: B3",
-  "1/2 -> 11/20: B3",
-  "1/3 -> 23/60: E4",
-  "1/2 -> 11/20: E4",
-  "2/3 -> 43/60: G3",
-  "5/6 -> 53/60: G3",
-  "0/1 -> 4/3: c2",
-  "0/1 -> 4/3: c2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 251 https://strudel.cc/?H9-8RjyncjzI 1`] = `
-[
-  "0/1 -> 1/1: B3",
-  "0/1 -> 1/1: D4",
-  "0/1 -> 1/1: E4",
-  "0/1 -> 1/1: G4",
-  "0/1 -> 1/1: C3",
-]
-`;
-
-exports[`renders shared tunes > shared tune 252 https://strudel.cc/?CG9iByv5zHY- 1`] = `
-[
-  "0/1 -> 1/3: 48",
-  "1/3 -> 2/3: 51",
-  "2/3 -> 1/1: 55",
-]
-`;
-
-exports[`renders shared tunes > shared tune 253 https://strudel.cc/?FgUTcaG_XKGK 1`] = `
-[
-  "0/1 -> 1/4: 48",
-  "1/4 -> 1/2: 51",
-  "1/2 -> 3/4: 55",
-  "3/4 -> 1/1: 36",
-]
-`;
-
-exports[`renders shared tunes > shared tune 254 https://strudel.cc/?CmY3ebvIfYEG 1`] = `
-[
-  "0/1 -> 1/10: C3",
-  "0/1 -> 1/10: E3",
-  "0/1 -> 1/10: G3",
-  "1/4 -> 7/20: B3",
-  "1/4 -> 7/20: E4",
-  "1/4 -> 7/20: E3",
-  "1/2 -> 3/5: C3",
-  "1/2 -> 3/5: A2",
-  "1/2 -> 3/5: C3",
-  "3/4 -> 17/20: E3",
-  "3/4 -> 17/20: G3",
-  "3/4 -> 17/20: B3",
-  "0/1 -> 1/5: C2",
-  "1/2 -> 7/10: E2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 255 https://strudel.cc/?yNx4koGpPrSH 1`] = `
-[
-  "0/1 -> 6275565/1452119: A3",
-  "-9/8 -> 20400609/11616952: G4",
-  "3/8 -> 54560877/11616952: D4",
-  "-3/4 -> 12378483/5808476: F5",
-  "3/4 -> 29458617/5808476: G4",
-  "0/1 -> 3/2: D2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 256 https://strudel.cc/?oBtcxYrbZlNG 1`] = `
-[
-  "0/1 -> 1/2: {\\"note\\":\\"D3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.4814814814814815}",
-  "1/4 -> 3/4: {\\"note\\":\\"F3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.49537037037037035}",
-  "0/1 -> 1/4: {\\"note\\":\\"F4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5509259259259259}",
-  "1/2 -> 1/1: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "1/4 -> 1/2: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "3/4 -> 5/4: {\\"note\\":\\"E4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5462962962962963}",
-  "-1/8 -> 1/8: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "-1/8 -> 1/8: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "1/8 -> 5/8: {\\"note\\":\\"D3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.4814814814814815}",
-  "3/8 -> 7/8: {\\"note\\":\\"F3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.49537037037037035}",
-  "1/8 -> 3/8: {\\"note\\":\\"F4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5509259259259259}",
-  "5/8 -> 9/8: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "3/8 -> 5/8: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "7/8 -> 11/8: {\\"note\\":\\"E4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5462962962962963}",
-  "0/1 -> 1/4: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "0/1 -> 1/4: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "1/4 -> 3/4: {\\"note\\":\\"D3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.4814814814814815}",
-  "1/2 -> 1/1: {\\"note\\":\\"F3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.49537037037037035}",
-  "1/4 -> 1/2: {\\"note\\":\\"F4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5509259259259259}",
-  "3/4 -> 5/4: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "1/2 -> 3/4: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "-1/8 -> 1/8: {\\"note\\":\\"G3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5046296296296297}",
-  "1/8 -> 3/8: {\\"note\\":\\"Bb3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5185185185185186}",
-  "-1/8 -> 1/8: {\\"note\\":\\"F4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5509259259259259}",
-  "1/8 -> 3/8: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "3/8 -> 7/8: {\\"note\\":\\"D3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.4814814814814815}",
-  "5/8 -> 9/8: {\\"note\\":\\"F3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.49537037037037035}",
-  "3/8 -> 5/8: {\\"note\\":\\"F4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5509259259259259}",
-  "7/8 -> 11/8: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "5/8 -> 7/8: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 257 https://strudel.cc/?eCz4nyUk3TnN 1`] = `
-[
-  "0/1 -> 3/1: {\\"n\\":\\"B3\\",\\"s\\":\\"0040_FluidR3_GM_sf2_file\\",\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.7,\\"cutoff\\":1111.7252990603447,\\"gain\\":0.3}",
-  "0/1 -> 3/1: {\\"n\\":\\"D4\\",\\"s\\":\\"0040_FluidR3_GM_sf2_file\\",\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.7,\\"cutoff\\":1111.7252990603447,\\"gain\\":0.3}",
-  "0/1 -> 3/1: {\\"n\\":\\"E4\\",\\"s\\":\\"0040_FluidR3_GM_sf2_file\\",\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.7,\\"cutoff\\":1111.7252990603447,\\"gain\\":0.3}",
-  "0/1 -> 3/1: {\\"n\\":\\"G4\\",\\"s\\":\\"0040_FluidR3_GM_sf2_file\\",\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.7,\\"cutoff\\":1111.7252990603447,\\"gain\\":0.3}",
-  "0/1 -> 9/2: {\\"n\\":\\"C5\\",\\"s\\":\\"0040_FluidR3_GM_sf2_file\\",\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.7,\\"cutoff\\":1111.7252990603447,\\"gain\\":0.3}",
-  "0/1 -> 3/4: {\\"n\\":\\"C2\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0.05,\\"decay\\":0.1,\\"sustain\\":0.7,\\"cutoff\\":864.536878321087,\\"gain\\":0.3}",
-  "0/1 -> 3/4: {\\"s\\":\\"bd\\",\\"speed\\":0.9107561463868479,\\"n\\":3}",
-  "3/4 -> 3/2: {\\"s\\":\\"sd\\",\\"speed\\":0.9931522866332672,\\"n\\":3}",
-  "0/1 -> 1/2: {\\"s\\":\\"hh\\",\\"speed\\":0.9036881079621337,\\"n\\":3}",
-  "1/2 -> 1/1: {\\"s\\":\\"hh\\",\\"speed\\":0.9519542165100575,\\"n\\":3}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 259 https://strudel.cc/?J3FcQgOeZ3cV 1`] = `
-[
-  "0/1 -> 5/26: {\\"note\\":\\"B2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.46759259259259256}",
-  "5/13 -> 15/26: {\\"note\\":\\"B2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.46759259259259256}",
-  "10/13 -> 155/156: {\\"note\\":\\"B2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.46759259259259256}",
-  "155/156 -> 15/13: {\\"note\\":\\"A2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.45833333333333337}",
-  "0/1 -> 15/26: {\\"note\\":\\"B3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5231481481481481}",
-  "5/52 -> 35/52: {\\"note\\":\\"C#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5324074074074074}",
-  "5/26 -> 10/13: {\\"note\\":\\"D#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "15/52 -> 45/52: {\\"note\\":\\"F4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5509259259259259}",
-  "5/13 -> 25/26: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "25/52 -> 55/52: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "15/26 -> 15/13: {\\"note\\":\\"B4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5787037037037037}",
-  "35/52 -> 5/4: {\\"note\\":\\"C#5\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.587962962962963}",
-  "5/13 -> 25/26: {\\"note\\":\\"B3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5231481481481481}",
-  "25/52 -> 55/52: {\\"note\\":\\"C#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5324074074074074}",
-  "15/26 -> 15/13: {\\"note\\":\\"D#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "35/52 -> 5/4: {\\"note\\":\\"F4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5509259259259259}",
-  "10/13 -> 35/26: {\\"note\\":\\"G4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5601851851851851}",
-  "45/52 -> 75/52: {\\"note\\":\\"A4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5694444444444444}",
-  "25/26 -> 20/13: {\\"note\\":\\"B4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5787037037037037}",
-  "10/13 -> 35/26: {\\"note\\":\\"B3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5231481481481481}",
-  "45/52 -> 75/52: {\\"note\\":\\"C#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5324074074074074}",
-  "25/26 -> 20/13: {\\"note\\":\\"D#4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5416666666666667}",
-  "0/1 -> 80/13: {\\"s\\":\\"mad\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 260 https://strudel.cc/?tTlyA1JzHklU 1`] = `
-[
-  "0/1 -> 4/3: B4",
-  "0/1 -> 1/3: C3",
-  "1/3 -> 2/3: G3",
-  "2/3 -> 2/1: E4",
-]
-`;
-
-exports[`renders shared tunes > shared tune 261 https://strudel.cc/?hIhmX2R9gtwL 1`] = `
-[
-  "0/1 -> 1/8: {\\"note\\":\\"c2\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"release\\":0.3,\\"vowel\\":\\"a\\"}",
-  "1/2 -> 5/8: {\\"note\\":\\"c2\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"release\\":0.3,\\"vowel\\":\\"o\\"}",
-  "0/1 -> 1/8: {\\"note\\":\\"c3\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"release\\":0.3,\\"vowel\\":\\"a\\"}",
-  "3/8 -> 1/2: {\\"note\\":\\"c3\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"release\\":0.3,\\"vowel\\":\\"a\\"}",
-  "3/4 -> 7/8: {\\"note\\":\\"c3\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"release\\":0.3,\\"vowel\\":\\"o\\"}",
-  "0/1 -> 3/8: {\\"note\\":\\"C1\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0,\\"release\\":0.3,\\"cutoff\\":200}",
-  "0/1 -> 3/8: {\\"note\\":\\"C1\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0,\\"release\\":0.3,\\"cutoff\\":300}",
-  "3/8 -> 3/4: {\\"note\\":\\"G2\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0,\\"release\\":0.3,\\"cutoff\\":300}",
-  "3/8 -> 3/4: {\\"note\\":\\"G2\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0,\\"release\\":0.3,\\"cutoff\\":100}",
-  "1/6 -> 1/3: {\\"note\\":\\"c2\\",\\"s\\":\\"sd\\"}",
-  "1/6 -> 1/3: {\\"note\\":\\"c2\\",\\"s\\":\\"bd\\"}",
-  "1/3 -> 1/2: {\\"note\\":\\"c2\\",\\"s\\":\\"bd\\"}",
-  "1/3 -> 1/2: {\\"note\\":\\"c2\\",\\"s\\":\\"sd\\"}",
-  "5/6 -> 1/1: {\\"note\\":\\"c#2\\",\\"s\\":\\"bd\\"}",
-  "1/12 -> 1/6: {\\"note\\":\\"c2\\",\\"s\\":\\"hh\\"}",
-  "1/6 -> 1/4: {\\"note\\":\\"c2\\",\\"s\\":\\"hh\\"}",
-  "2/3 -> 3/4: {\\"note\\":\\"c2\\",\\"s\\":\\"oh\\"}",
-  "3/4 -> 5/6: {\\"note\\":\\"c2\\",\\"s\\":\\"oh\\"}",
-  "1/4 -> 1/3: {\\"note\\":\\"c2\\",\\"s\\":\\"hh\\",\\"speed\\":0.5}",
-  "7/12 -> 2/3: {\\"note\\":\\"c2\\",\\"s\\":\\"oh\\",\\"speed\\":0.5}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 262 https://strudel.cc/?NIL21RJTmuAa 1`] = `
-[
-  "0/1 -> 1/2: Bb2",
-  "0/1 -> 1/2: F3",
-  "0/1 -> 1/2: Bb3",
-  "1/2 -> 1/1: Bb2",
-  "1/2 -> 1/1: Bb2",
-  "1/2 -> 1/1: F3",
-  "1/2 -> 1/1: F3",
-  "1/2 -> 1/1: Bb3",
-  "1/2 -> 1/1: Bb3",
-  "0/1 -> 1/2: Bb1",
-  "1/2 -> 5/8: Bb1",
-  "3/4 -> 7/8: Bb1",
-  "0/1 -> 1/2: c1",
-  "1/2 -> 1/1: c1",
-  "1/2 -> 1/1: c3",
-  "0/1 -> 1/4: C1",
-  "1/4 -> 1/2: C3",
-  "1/2 -> 3/4: C1",
-  "3/4 -> 1/1: C3",
-]
-`;
-
-exports[`renders shared tunes > shared tune 263 https://strudel.cc/?CGh4oLKu9tOp 1`] = `
-[
-  "0/1 -> 4/3: B4",
-  "0/1 -> 1/3: C3",
-  "1/3 -> 2/3: G3",
-  "2/3 -> 2/1: E4",
-]
-`;
-
-exports[`renders shared tunes > shared tune 264 https://strudel.cc/?N486QfFJ2NvV 1`] = `
-[
-  "0/1 -> 1/8: {\\"freq\\":55.33,\\"s\\":\\"sawtooth\\"}",
-  "0/1 -> 1/8: {\\"freq\\":54.725,\\"s\\":\\"sawtooth\\"}",
-  "3/8 -> 1/2: {\\"freq\\":110.66,\\"s\\":\\"sawtooth\\"}",
-  "3/8 -> 1/2: {\\"freq\\":109.45,\\"s\\":\\"sawtooth\\"}",
-  "3/8 -> 1/2: {\\"freq\\":165.99,\\"s\\":\\"sawtooth\\"}",
-  "3/8 -> 1/2: {\\"freq\\":164.175,\\"s\\":\\"sawtooth\\"}",
-  "3/4 -> 7/8: {\\"freq\\":221.32,\\"s\\":\\"sawtooth\\"}",
-  "3/4 -> 7/8: {\\"freq\\":218.9,\\"s\\":\\"sawtooth\\"}",
-  "3/4 -> 7/8: {\\"freq\\":276.65,\\"s\\":\\"sawtooth\\"}",
-  "3/4 -> 7/8: {\\"freq\\":273.625,\\"s\\":\\"sawtooth\\"}",
-  "1/8 -> 59/400: {\\"freq\\":440,\\"gain\\":0.206361035083454,\\"s\\":\\"sawtooth\\"}",
-  "1/4 -> 109/400: {\\"freq\\":440,\\"gain\\":0.2360775017902398,\\"s\\":\\"sawtooth\\"}",
-  "1/2 -> 209/400: {\\"freq\\":440,\\"gain\\":0.3624358861780295,\\"s\\":\\"sawtooth\\"}",
-  "5/8 -> 259/400: {\\"freq\\":440,\\"gain\\":0.4316442271311083,\\"s\\":\\"sawtooth\\"}",
-  "7/8 -> 359/400: {\\"freq\\":440,\\"gain\\":0.5078844826422588,\\"s\\":\\"sawtooth\\"}",
-  "0/1 -> 1/8: {\\"s\\":\\"bd\\"}",
-  "3/8 -> 1/2: {\\"s\\":\\"bd\\"}",
-  "3/4 -> 7/8: {\\"s\\":\\"bd\\"}",
-  "0/1 -> 1/4: {\\"s\\":\\"hh\\"}",
-  "1/4 -> 1/2: {\\"s\\":\\"hh\\"}",
-  "1/2 -> 3/4: {\\"s\\":\\"hh\\"}",
-  "3/4 -> 1/1: {\\"s\\":\\"hh\\"}",
-  "1/2 -> 1/1: {\\"s\\":\\"sd\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 265 https://strudel.cc/?Njas64Vf03LO 1`] = `
-[
-  "0/1 -> 5/11: {\\"note\\":\\"c2\\",\\"s\\":\\"sawtooth\\",\\"vowel\\":\\"a\\",\\"gain\\":1.1882154262966047,\\"delay\\":0.1}",
-  "5/11 -> 15/11: {\\"note\\":\\"eb2\\",\\"s\\":\\"sawtooth\\",\\"vowel\\":\\"a\\",\\"gain\\":1.361256209529016,\\"delay\\":0.1}",
-  "10/11 -> 15/11: {\\"note\\":\\"c2\\",\\"s\\":\\"square\\",\\"vowel\\":\\"e\\",\\"gain\\":1.5242570631433978,\\"delay\\":0.1}",
-  "0/1 -> 5/11: {\\"note\\":\\"c1\\",\\"s\\":\\"sine\\",\\"shape\\":0.7,\\"gain\\":1.590884651807325,\\"delay\\":0.1}",
-  "5/11 -> 10/11: {\\"note\\":\\"eb1\\",\\"s\\":\\"sine\\",\\"shape\\":0.7,\\"gain\\":1.5196152422706635,\\"delay\\":0.1}",
-  "10/11 -> 15/11: {\\"note\\":\\"c1\\",\\"s\\":\\"sine\\",\\"shape\\":0.7,\\"gain\\":1.385672565811924,\\"delay\\":0.1}",
-  "0/1 -> 5/44: {\\"s\\":\\"hh\\",\\"pan\\":0.5,\\"gain\\":0.2,\\"delay\\":0.1}",
-  "5/44 -> 5/22: {\\"s\\":\\"hh\\",\\"pan\\":0.5,\\"speed\\":0.9,\\"gain\\":0.2,\\"delay\\":0.1}",
-  "5/22 -> 15/44: {\\"s\\":\\"hh\\",\\"pan\\":0.5,\\"speed\\":0.9,\\"gain\\":0.5,\\"delay\\":0.1}",
-  "15/44 -> 5/11: {\\"s\\":\\"hh\\",\\"pan\\":0.5,\\"speed\\":0.9,\\"gain\\":0.5,\\"delay\\":0.1}",
-  "5/11 -> 15/22: {\\"s\\":\\"hh\\",\\"pan\\":0.5,\\"speed\\":1.1,\\"gain\\":0.6,\\"delay\\":0.1}",
-  "15/22 -> 10/11: {\\"s\\":\\"hh\\",\\"pan\\":0.5,\\"speed\\":1.1,\\"gain\\":0.4,\\"delay\\":0.1}",
-  "10/11 -> 45/44: {\\"s\\":\\"hh\\",\\"pan\\":0.5,\\"speed\\":0.9,\\"gain\\":0.2,\\"delay\\":0.1}",
-  "0/1 -> 8/11: {\\"s\\":\\"bd\\",\\"delay\\":0.1}",
-  "8/11 -> 16/11: {\\"s\\":\\"bd\\",\\"delay\\":0.1}",
-  "8/11 -> 16/11: {\\"s\\":\\"bd\\",\\"delay\\":0.1}",
-  "0/1 -> 20/11: {\\"s\\":\\"misc\\",\\"n\\":13,\\"delay\\":0.1}",
-  "0/1 -> 20/11: {\\"s\\":\\"misc\\",\\"n\\":13,\\"delay\\":0.1}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 266 https://strudel.cc/?-qcqwVsJXv8J 1`] = `
-[
-  "0/1 -> 1/1: bd",
-  "0/1 -> 1/4: hh",
-  "1/4 -> 1/2: hh",
-  "1/2 -> 3/4: hh",
-  "3/4 -> 1/1: hh",
-  "1/2 -> 1/1: sn",
-]
-`;
-
-exports[`renders shared tunes > shared tune 267 https://strudel.cc/?Q2WQMrJVFb46 1`] = `
-[
-  "0/1 -> 5/11: {\\"note\\":\\"c2\\",\\"s\\":\\"sawtooth\\",\\"vowel\\":\\"a\\",\\"gain\\":0.2000348432426738,\\"delay\\":0.1}",
-  "5/11 -> 15/11: {\\"note\\":\\"eb2\\",\\"s\\":\\"sawtooth\\",\\"vowel\\":\\"a\\",\\"gain\\":0.20089674623394735,\\"delay\\":0.1}",
-  "10/11 -> 15/11: {\\"note\\":\\"c2\\",\\"s\\":\\"square\\",\\"vowel\\":\\"e\\",\\"gain\\":0.20395302623820533,\\"delay\\":0.1}",
-  "0/1 -> 5/11: {\\"note\\":\\"c1\\",\\"s\\":\\"sine\\",\\"shape\\":0.7,\\"gain\\":0.40012812116863894,\\"delay\\":0.1}",
-  "5/11 -> 10/11: {\\"note\\":\\"eb1\\",\\"s\\":\\"sine\\",\\"shape\\":0.7,\\"gain\\":0.40317197328808513,\\"delay\\":0.1}",
-  "10/11 -> 15/11: {\\"note\\":\\"c1\\",\\"s\\":\\"sine\\",\\"shape\\":0.7,\\"gain\\":0.4134168413561418,\\"delay\\":0.1}",
-  "0/1 -> 5/44: {\\"s\\":\\"hh\\",\\"pan\\":0.0011524725685347903,\\"gain\\":0.2,\\"delay\\":0.1}",
-  "5/44 -> 5/22: {\\"s\\":\\"hh\\",\\"pan\\":0.025337550391114405,\\"speed\\":0.9,\\"gain\\":0.2,\\"delay\\":0.1}",
-  "5/22 -> 15/44: {\\"s\\":\\"hh\\",\\"pan\\":0.09352072111390441,\\"speed\\":0.9,\\"gain\\":0.5,\\"delay\\":0.1}",
-  "15/44 -> 5/11: {\\"s\\":\\"hh\\",\\"pan\\":0.19951846897795633,\\"speed\\":0.9,\\"gain\\":0.5,\\"delay\\":0.1}",
-  "5/11 -> 15/22: {\\"s\\":\\"hh\\",\\"pan\\":0.3765602545513502,\\"speed\\":1.1,\\"gain\\":0.6,\\"delay\\":0.1}",
-  "15/22 -> 10/11: {\\"s\\":\\"hh\\",\\"pan\\":0.5112023464103004,\\"speed\\":1.1,\\"gain\\":0.4,\\"delay\\":0.1}",
-  "10/11 -> 45/44: {\\"s\\":\\"hh\\",\\"pan\\":0.5205181601692033,\\"speed\\":0.9,\\"gain\\":0.2,\\"delay\\":0.1}",
-  "0/1 -> 8/11: {\\"s\\":\\"bd:4\\",\\"delay\\":0.1}",
-  "8/11 -> 16/11: {\\"s\\":\\"bd:4\\",\\"delay\\":0.1}",
-  "8/11 -> 16/11: {\\"s\\":\\"bd:4\\",\\"delay\\":0.1}",
-  "0/1 -> 8/11: {\\"s\\":\\"bd:7\\",\\"delay\\":0.1}",
-  "0/1 -> 40/11: {\\"s\\":\\"misc\\",\\"n\\":13,\\"delay\\":0.1}",
-  "0/1 -> 40/11: {\\"s\\":\\"misc\\",\\"n\\":13,\\"delay\\":0.1}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 268 https://strudel.cc/?IV4pDyaLUMB0 1`] = `
-[
-  "0/1 -> 1/2: c1",
-  "1/2 -> 1/1: c1",
-  "1/2 -> 1/1: c3",
-  "0/1 -> 1/4: C1",
-  "1/4 -> 1/2: C3",
-  "1/2 -> 3/4: C1",
-  "3/4 -> 1/1: C3",
-]
-`;
-
-exports[`renders shared tunes > shared tune 269 https://strudel.cc/?XQ_uhshhjEYw 1`] = `
-[
-  "-18/5 -> 2/5: c3",
-  "-18/5 -> 2/5: e3",
-  "-18/5 -> 2/5: g3",
-  "2/5 -> 12/5: g3",
-  "2/5 -> 12/5: bb3",
-  "2/5 -> 12/5: d4",
-  "0/1 -> 4/1: Baker man",
-]
-`;
-
-exports[`renders shared tunes > shared tune 270 https://strudel.cc/?XDCsI7uPtnav 1`] = `
-[
-  "0/1 -> 2/1: {\\"note\\":\\"C3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.4722222222222222}",
-  "0/1 -> 2/1: {\\"note\\":\\"E3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.4907407407407407}",
-  "0/1 -> 1/1: {\\"note\\":\\"B3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5231481481481481}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 271 https://strudel.cc/?2t_PSStoDUhV 1`] = `
-[
-  "0/1 -> 5/11: {\\"note\\":\\"c2\\",\\"s\\":\\"sawtooth\\",\\"vowel\\":\\"a\\",\\"gain\\":0.2000348432426738,\\"delay\\":0.1}",
-  "5/11 -> 15/11: {\\"note\\":\\"eb2\\",\\"s\\":\\"sawtooth\\",\\"vowel\\":\\"a\\",\\"gain\\":0.20089674623394735,\\"delay\\":0.1}",
-  "10/11 -> 15/11: {\\"note\\":\\"c2\\",\\"s\\":\\"square\\",\\"vowel\\":\\"e\\",\\"gain\\":0.20395302623820533,\\"delay\\":0.1}",
-  "0/1 -> 5/11: {\\"note\\":\\"c1\\",\\"s\\":\\"sine\\",\\"shape\\":0.7,\\"gain\\":0.40012812116863894,\\"delay\\":0.1}",
-  "5/11 -> 10/11: {\\"note\\":\\"eb1\\",\\"s\\":\\"sine\\",\\"shape\\":0.7,\\"gain\\":0.40317197328808513,\\"delay\\":0.1}",
-  "10/11 -> 15/11: {\\"note\\":\\"c1\\",\\"s\\":\\"sine\\",\\"shape\\":0.7,\\"gain\\":0.4134168413561418,\\"delay\\":0.1}",
-  "0/1 -> 5/44: {\\"s\\":\\"hh\\",\\"pan\\":0.0011524725685347903,\\"gain\\":0.2,\\"delay\\":0.1}",
-  "5/44 -> 5/22: {\\"s\\":\\"hh\\",\\"pan\\":0.025337550391114405,\\"speed\\":0.9,\\"gain\\":0.2,\\"delay\\":0.1}",
-  "5/22 -> 15/44: {\\"s\\":\\"hh\\",\\"pan\\":0.09352072111390441,\\"speed\\":0.9,\\"gain\\":0.5,\\"delay\\":0.1}",
-  "15/44 -> 5/11: {\\"s\\":\\"hh\\",\\"pan\\":0.19951846897795633,\\"speed\\":0.9,\\"gain\\":0.5,\\"delay\\":0.1}",
-  "5/11 -> 15/22: {\\"s\\":\\"hh\\",\\"pan\\":0.3765602545513502,\\"speed\\":1.1,\\"gain\\":0.6,\\"delay\\":0.1}",
-  "15/22 -> 10/11: {\\"s\\":\\"hh\\",\\"pan\\":0.5112023464103004,\\"speed\\":1.1,\\"gain\\":0.4,\\"delay\\":0.1}",
-  "10/11 -> 45/44: {\\"s\\":\\"hh\\",\\"pan\\":0.5205181601692033,\\"speed\\":0.9,\\"gain\\":0.2,\\"delay\\":0.1}",
-  "0/1 -> 20/33: {\\"s\\":\\"bd:4\\",\\"delay\\":0.1}",
-  "20/33 -> 50/33: {\\"s\\":\\"bd:4\\",\\"delay\\":0.1}",
-  "20/33 -> 50/33: {\\"s\\":\\"bd:4\\",\\"delay\\":0.1}",
-  "0/1 -> 8/11: {\\"s\\":\\"bd:7\\",\\"delay\\":0.1}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 272 https://strudel.cc/?J4419vLymh08 1`] = `
-[
-  "5/6 -> 5/3: {\\"note\\":\\"eb4\\",\\"s\\":\\"piano\\",\\"cutoff\\":1275.348281040755,\\"resonance\\":0,\\"delay\\":0.1}",
-  "0/1 -> 5/6: {\\"value\\":\\"\\",\\"s\\":\\"sawtooth\\",\\"vowel\\":\\"a\\",\\"gain\\":1.8000302424954437,\\"hcutoff\\":800,\\"cutoff\\":770.1250948828399,\\"resonance\\":0,\\"delay\\":0.1}",
-  "5/6 -> 5/3: {\\"value\\":\\"\\",\\"s\\":\\"sawtooth\\",\\"vowel\\":\\"e\\",\\"gain\\":1.800740293925432,\\"hcutoff\\":800,\\"cutoff\\":1275.348281040755,\\"resonance\\":0,\\"delay\\":0.1}",
-  "0/1 -> 5/12: {\\"value\\":\\"\\",\\"s\\":\\"sine\\",\\"shape\\":0.31075614638684784,\\"gain\\":0.32689036596711957,\\"cutoff\\":550.2814374985721,\\"resonance\\":0,\\"delay\\":0.1}",
-  "5/6 -> 5/4: {\\"value\\":\\"\\",\\"s\\":\\"sine\\",\\"shape\\":0.41301749653939623,\\"gain\\":0.5825437413484906,\\"cutoff\\":1275.348281040755,\\"resonance\\":0,\\"delay\\":0.1}",
-  "0/1 -> 5/48: {\\"s\\":\\"hh:4\\",\\"pan\\":0.0011524725685347903,\\"gain\\":0.20023049451370697,\\"cutoff\\":501.01682565995276,\\"delay\\":0.1}",
-  "5/8 -> 35/48: {\\"s\\":\\"hh:4\\",\\"pan\\":0.4942046147094601,\\"gain\\":0.298840922941892,\\"cutoff\\":1127.589313362064,\\"delay\\":0.1}",
-  "5/48 -> 5/24: {\\"s\\":\\"hh:4\\",\\"pan\\":0.025337550391114405,\\"speed\\":0.8,\\"gain\\":0.20506751007822288,\\"cutoff\\":523.1963129666834,\\"delay\\":0.1}",
-  "5/24 -> 5/16: {\\"s\\":\\"hh:4\\",\\"pan\\":0.09352072111390441,\\"speed\\":0.8,\\"gain\\":0.2187041442227809,\\"cutoff\\":589.4695471856543,\\"delay\\":0.1}",
-  "5/16 -> 5/12: {\\"s\\":\\"hh:4\\",\\"pan\\":0.19951846897795633,\\"speed\\":0.8,\\"gain\\":0.2399036937955913,\\"cutoff\\":701.2472529547128,\\"delay\\":0.1}",
-  "5/12 -> 25/48: {\\"s\\":\\"hh:4\\",\\"pan\\":0.32002369612261816,\\"speed\\":0.8,\\"gain\\":0.26400473922452367,\\"cutoff\\":844.1125126334155,\\"delay\\":0.1}",
-  "25/48 -> 5/8: {\\"s\\":\\"hh:4\\",\\"pan\\":0.4260214439866701,\\"speed\\":0.8,\\"gain\\":0.28520428879733406,\\"cutoff\\":994.7023499022843,\\"delay\\":0.1}",
-  "35/48 -> 5/6: {\\"s\\":\\"hh:4\\",\\"pan\\":0.5183896925320397,\\"speed\\":0.8,\\"gain\\":0.30367793850640795,\\"cutoff\\":1222.1630601329798,\\"delay\\":0.1}",
-  "5/6 -> 15/16: {\\"s\\":\\"hh:4\\",\\"pan\\":0.5205181601692033,\\"speed\\":0.9,\\"gain\\":0.30410363203384067,\\"cutoff\\":1269.511939453993,\\"delay\\":0.1}",
-  "0/1 -> 2/3: {\\"s\\":\\"bd:7\\",\\"cutoff\\":663.5595704946253,\\"delay\\":0.1}",
-  "0/1 -> 2/3: {\\"s\\":\\"bd:7\\",\\"cutoff\\":663.5595704946253,\\"delay\\":0.1}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 273 https://strudel.cc/?hGG0rEr1zC3A 1`] = `
-[
-  "0/1 -> 5/4: {\\"value\\":\\"\\",\\"s\\":\\"sawtooth\\",\\"vowel\\":\\"a\\",\\"gain\\":1.8000302424954437,\\"hcutoff\\":800,\\"cutoff\\":889.6566238254309,\\"resonance\\":0,\\"delay\\":0.1}",
-  "0/1 -> 5/8: {\\"value\\":\\"\\",\\"s\\":\\"sine\\",\\"shape\\":0.31075614638684784,\\"gain\\":0.32689036596711957,\\"cutoff\\":640.2810816708566,\\"resonance\\":0,\\"delay\\":0.1}",
-  "0/1 -> 5/32: {\\"s\\":\\"hh:4\\",\\"pan\\":0.0011524725685347903,\\"gain\\":0.20023049451370697,\\"cutoff\\":503.29418853183773,\\"delay\\":0.1}",
-  "15/16 -> 35/32: {\\"s\\":\\"hh:4\\",\\"pan\\":0.4942046147094601,\\"gain\\":0.298840922941892,\\"cutoff\\":1279.0864289350343,\\"delay\\":0.1}",
-  "5/32 -> 5/16: {\\"s\\":\\"hh:4\\",\\"pan\\":0.025337550391114405,\\"speed\\":0.8,\\"gain\\":0.20506751007822288,\\"cutoff\\":568.3668865859811,\\"delay\\":0.1}",
-  "5/16 -> 15/32: {\\"s\\":\\"hh:4\\",\\"pan\\":0.09352072111390441,\\"speed\\":0.8,\\"gain\\":0.2187041442227809,\\"cutoff\\":734.8617615476446,\\"delay\\":0.1}",
-  "15/32 -> 5/8: {\\"s\\":\\"hh:4\\",\\"pan\\":0.19951846897795633,\\"speed\\":0.8,\\"gain\\":0.2399036937955913,\\"cutoff\\":957.7506764815016,\\"delay\\":0.1}",
-  "5/8 -> 25/32: {\\"s\\":\\"hh:4\\",\\"pan\\":0.32002369612261816,\\"speed\\":0.8,\\"gain\\":0.26400473922452367,\\"cutoff\\":1155.4255766324245,\\"delay\\":0.1}",
-  "25/32 -> 15/16: {\\"s\\":\\"hh:4\\",\\"pan\\":0.4260214439866701,\\"speed\\":0.8,\\"gain\\":0.28520428879733406,\\"cutoff\\":1261.9555148823424,\\"delay\\":0.1}",
-  "0/1 -> 1/1: {\\"s\\":\\"bd:7\\",\\"cutoff\\":889.6566238254309,\\"delay\\":0.1}",
-  "0/1 -> 1/1: {\\"s\\":\\"bd:7\\",\\"cutoff\\":889.6566238254309,\\"delay\\":0.1}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 274 https://strudel.cc/?ahkvgPdMeapI 1`] = `
-[
-  "0/1 -> 1/2: {\\"note\\":\\"F3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.49537037037037035}",
-  "1/4 -> 3/4: {\\"note\\":\\"F2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.4398148148148148}",
-  "1/2 -> 1/1: {\\"note\\":\\"F3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.49537037037037035}",
-  "1/2 -> 1/1: {\\"note\\":\\"Ab3\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5092592592592593}",
-  "1/2 -> 1/1: {\\"note\\":\\"C4\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.5277777777777778}",
-  "1/2 -> 1/1: {\\"note\\":\\"F2\\",\\"clip\\":1,\\"s\\":\\"piano\\",\\"release\\":0.1,\\"pan\\":0.4398148148148148}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 275 https://strudel.cc/?um_AAxJMJr5U 1`] = `
-[
-  "0/1 -> 1/1: {\\"note\\":\\"c4\\",\\"s\\":\\"piano\\",\\"gain\\":0.5}",
-  "0/1 -> 1/1: {\\"note\\":\\"e4\\",\\"s\\":\\"piano\\",\\"gain\\":0.5}",
-  "0/1 -> 1/1: {\\"note\\":\\"g4\\",\\"s\\":\\"piano\\",\\"gain\\":0.5}",
-  "0/1 -> 1/8: {\\"s\\":\\"hh:4\\",\\"pan\\":0.0011524725685347903,\\"gain\\":0.5,\\"cutoff\\":1010.3722531168131}",
-  "3/4 -> 7/8: {\\"s\\":\\"hh:4\\",\\"pan\\":0.4942046147094601,\\"gain\\":0.5,\\"cutoff\\":5447.84153238514}",
-  "1/8 -> 1/4: {\\"s\\":\\"hh:4\\",\\"pan\\":0.025337550391114405,\\"speed\\":0.8,\\"gain\\":0.5,\\"cutoff\\":1228.0379535200295}",
-  "1/4 -> 3/8: {\\"s\\":\\"hh:4\\",\\"pan\\":0.09352072111390441,\\"speed\\":0.8,\\"gain\\":0.5,\\"cutoff\\":1841.6864900251398}",
-  "3/8 -> 1/2: {\\"s\\":\\"hh:4\\",\\"pan\\":0.19951846897795633,\\"speed\\":0.8,\\"gain\\":0.5,\\"cutoff\\":2795.666220801607}",
-  "1/2 -> 5/8: {\\"s\\":\\"hh:4\\",\\"pan\\":0.32002369612261816,\\"speed\\":0.8,\\"gain\\":0.5,\\"cutoff\\":3880.2132651035636}",
-  "5/8 -> 3/4: {\\"s\\":\\"hh:4\\",\\"pan\\":0.4260214439866701,\\"speed\\":0.8,\\"gain\\":0.5,\\"cutoff\\":4834.19299588003}",
-  "7/8 -> 1/1: {\\"s\\":\\"hh:4\\",\\"pan\\":0.5183896925320397,\\"speed\\":0.8,\\"gain\\":0.5,\\"cutoff\\":5665.507232788357}",
-  "0/1 -> 4/5: {\\"s\\":\\"bd:7\\",\\"cutoff\\":300,\\"gain\\":0.5}",
-  "0/1 -> 4/5: {\\"s\\":\\"bd:7\\",\\"cutoff\\":1000,\\"gain\\":0.5}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 276 https://strudel.cc/?UxSJbzL1d05O 1`] = `
-[
-  "0/1 -> 5/4: {\\"note\\":\\"c4\\",\\"s\\":\\"piano\\",\\"gain\\":0.5}",
-  "0/1 -> 5/4: {\\"note\\":\\"eb4\\",\\"s\\":\\"piano\\",\\"gain\\":0.5}",
-  "0/1 -> 5/4: {\\"note\\":\\"g4\\",\\"s\\":\\"piano\\",\\"gain\\":0.5}",
-  "0/1 -> 5/4: {\\"note\\":\\"c4\\",\\"s\\":\\"square\\",\\"vowel\\":\\"a\\",\\"gain\\":0.5}",
-  "0/1 -> 5/4: {\\"note\\":\\"eb4\\",\\"s\\":\\"square\\",\\"vowel\\":\\"a\\",\\"gain\\":0.5}",
-  "0/1 -> 5/4: {\\"note\\":\\"g4\\",\\"s\\":\\"square\\",\\"vowel\\":\\"a\\",\\"gain\\":0.5}",
-  "0/1 -> 5/8: {\\"s\\":\\"hh:1\\",\\"pan\\":0.05378073193423916,\\"speed\\":0.9,\\"gain\\":0.5,\\"cutoff\\":1484.0265874081524}",
-  "5/8 -> 5/4: {\\"s\\":\\"hh:1\\",\\"pan\\":0.46576143316633534,\\"speed\\":0.9,\\"gain\\":0.5,\\"cutoff\\":5191.852898497018}",
-  "0/1 -> 5/32: {\\"s\\":\\"hh:4\\",\\"pan\\":0.8426077850162983,\\"gain\\":0.5,\\"cutoff\\":1010.3722531168131}",
-  "15/16 -> 35/32: {\\"s\\":\\"hh:4\\",\\"pan\\":0.7516226731240749,\\"gain\\":0.5,\\"cutoff\\":5447.84153238514}",
-  "5/32 -> 5/16: {\\"s\\":\\"hh:4\\",\\"pan\\":0.20066574029624462,\\"speed\\":0.8,\\"gain\\":0.5,\\"cutoff\\":1228.0379535200295}",
-  "5/8 -> 25/32: {\\"s\\":\\"hh:4\\",\\"pan\\":0.16399178467690945,\\"speed\\":0.8,\\"gain\\":0.5,\\"cutoff\\":3880.2132651035636}",
-  "25/32 -> 15/16: {\\"s\\":\\"hh:4\\",\\"pan\\":0.408811716362834,\\"speed\\":0.8,\\"gain\\":0.5,\\"cutoff\\":4834.19299588003}",
-  "0/1 -> 1/1: {\\"s\\":\\"bd:7\\",\\"cutoff\\":300,\\"gain\\":0.5}",
-  "0/1 -> 1/1: {\\"s\\":\\"bd:7\\",\\"cutoff\\":1000,\\"gain\\":0.5}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 277 https://strudel.cc/?90drkbxdBr2- 1`] = `
-[
-  "0/1 -> 5/4: {\\"note\\":\\"c4\\",\\"s\\":\\"piano\\",\\"gain\\":0.5}",
-  "0/1 -> 5/4: {\\"note\\":\\"eb4\\",\\"s\\":\\"piano\\",\\"gain\\":0.5}",
-  "0/1 -> 5/4: {\\"note\\":\\"g4\\",\\"s\\":\\"piano\\",\\"gain\\":0.5}",
-  "0/1 -> 5/4: {\\"note\\":\\"c4\\",\\"s\\":\\"square\\",\\"vowel\\":\\"a\\",\\"gain\\":0.5}",
-  "0/1 -> 5/4: {\\"note\\":\\"eb4\\",\\"s\\":\\"square\\",\\"vowel\\":\\"a\\",\\"gain\\":0.5}",
-  "0/1 -> 5/4: {\\"note\\":\\"g4\\",\\"s\\":\\"square\\",\\"vowel\\":\\"a\\",\\"gain\\":0.5}",
-  "0/1 -> 5/8: {\\"s\\":\\"hh:1\\",\\"pan\\":0.05378073193423916,\\"speed\\":0.9,\\"gain\\":0.5,\\"cutoff\\":1484.0265874081524}",
-  "5/8 -> 5/4: {\\"s\\":\\"hh:1\\",\\"pan\\":0.46576143316633534,\\"speed\\":0.9,\\"gain\\":0.5,\\"cutoff\\":5191.852898497018}",
-  "0/1 -> 5/32: {\\"s\\":\\"hh:4\\",\\"pan\\":0.8426077850162983,\\"gain\\":0.5,\\"cutoff\\":1010.3722531168131}",
-  "15/16 -> 35/32: {\\"s\\":\\"hh:4\\",\\"pan\\":0.7516226731240749,\\"gain\\":0.5,\\"cutoff\\":5447.84153238514}",
-  "5/32 -> 5/16: {\\"s\\":\\"hh:4\\",\\"pan\\":0.20066574029624462,\\"speed\\":0.8,\\"gain\\":0.5,\\"cutoff\\":1228.0379535200295}",
-  "5/16 -> 15/32: {\\"s\\":\\"hh:4\\",\\"pan\\":0.5675661638379097,\\"speed\\":0.8,\\"gain\\":0.5,\\"cutoff\\":1841.6864900251398}",
-  "15/32 -> 5/8: {\\"s\\":\\"hh:4\\",\\"pan\\":0.3015887886285782,\\"speed\\":0.8,\\"gain\\":0.5,\\"cutoff\\":2795.666220801607}",
-  "5/8 -> 25/32: {\\"s\\":\\"hh:4\\",\\"pan\\":0.16399178467690945,\\"speed\\":0.8,\\"gain\\":0.5,\\"cutoff\\":3880.2132651035636}",
-  "25/32 -> 15/16: {\\"s\\":\\"hh:4\\",\\"pan\\":0.408811716362834,\\"speed\\":0.8,\\"gain\\":0.5,\\"cutoff\\":4834.19299588003}",
-  "0/1 -> 1/1: {\\"s\\":\\"bd:7\\",\\"cutoff\\":300,\\"gain\\":0.5}",
-  "0/1 -> 1/1: {\\"s\\":\\"bd:7\\",\\"cutoff\\":1000,\\"gain\\":0.5}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 278 https://strudel.cc/?aGtqNXDNRxdA 1`] = `
-[
-  "0/1 -> 3/2: {\\"s\\":\\"bd\\",\\"speed\\":0.7519542165100574}",
-  "3/4 -> 3/2: {\\"s\\":\\"sd\\",\\"speed\\":0.7931522866332671}",
-  "3/8 -> 3/4: {\\"s\\":\\"hh\\",\\"speed\\":0.7285963821098448}",
-  "3/4 -> 9/8: {\\"s\\":\\"hh\\",\\"speed\\":0.77531205091027}",
-  "0/1 -> 3/2: {\\"n\\":33.129885541275144,\\"decay\\":0.15,\\"sustain\\":0,\\"s\\":\\"sawtooth\\",\\"gain\\":0.4,\\"cutoff\\":3669.6267869262615}",
-  "0/1 -> 3/2: {\\"n\\":33.17988554127514,\\"decay\\":0.15,\\"sustain\\":0,\\"s\\":\\"sawtooth\\",\\"gain\\":0.4,\\"cutoff\\":3669.6267869262615}",
-  "0/1 -> 3/2: {\\"n\\":55.129885541275144,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":59.129885541275144,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":60.129885541275144,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":64.12988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":55.16988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":59.16988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":60.16988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":64.16988554127515,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "3/16 -> 3/8: {\\"n\\":69.01266877519555,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/8 -> 9/16: {\\"n\\":69.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/8 -> 9/16: {\\"n\\":72.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/4 -> 15/16: {\\"n\\":72.16001184806132,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "15/16 -> 9/8: {\\"n\\":72.21301072199333,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/16 -> 3/8: {\\"n\\":69.05266877519557,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/8 -> 9/16: {\\"n\\":69.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/8 -> 9/16: {\\"n\\":72.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/4 -> 15/16: {\\"n\\":72.20001184806131,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "15/16 -> 9/8: {\\"n\\":72.25301072199335,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "0/1 -> 3/16: {\\"n\\":93.00057728554401,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "0/1 -> 3/16: {\\"n\\":93.04057728554402,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "3/8 -> 9/16: {\\"n\\":69.01266877519555,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "9/16 -> 3/4: {\\"n\\":69.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "9/16 -> 3/4: {\\"n\\":72.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "15/16 -> 9/8: {\\"n\\":72.16001184806132,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "3/8 -> 9/16: {\\"n\\":69.05266877519557,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "9/16 -> 3/4: {\\"n\\":69.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "9/16 -> 3/4: {\\"n\\":72.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "15/16 -> 9/8: {\\"n\\":72.20001184806131,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "3/16 -> 3/8: {\\"n\\":93.00057728554401,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "3/16 -> 3/8: {\\"n\\":93.04057728554402,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "9/16 -> 3/4: {\\"n\\":69.01266877519555,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "3/4 -> 15/16: {\\"n\\":69.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "3/4 -> 15/16: {\\"n\\":72.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "9/16 -> 3/4: {\\"n\\":69.05266877519557,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "3/4 -> 15/16: {\\"n\\":69.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "3/4 -> 15/16: {\\"n\\":72.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "0/1 -> 3/16: {\\"n\\":72.0468455057745,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "0/1 -> 3/16: {\\"n\\":93.0468455057745,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "3/8 -> 9/16: {\\"n\\":93.00057728554401,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "0/1 -> 3/16: {\\"n\\":72.0868455057745,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "0/1 -> 3/16: {\\"n\\":93.0868455057745,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "3/8 -> 9/16: {\\"n\\":93.04057728554402,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "3/4 -> 15/16: {\\"n\\":69.01266877519555,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "15/16 -> 9/8: {\\"n\\":69.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "3/4 -> 15/16: {\\"n\\":69.05266877519557,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "15/16 -> 9/8: {\\"n\\":69.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 279 https://strudel.cc/?N3UBBhj_uwxd 1`] = `
-[
-  "0/1 -> 1/10: C3",
-  "0/1 -> 1/10: E3",
-  "0/1 -> 1/10: G3",
-  "1/4 -> 7/20: B3",
-  "1/4 -> 7/20: E4",
-  "1/4 -> 7/20: E3",
-  "1/2 -> 3/5: C3",
-  "1/2 -> 3/5: A2",
-  "1/2 -> 3/5: C3",
-  "3/4 -> 17/20: E3",
-  "3/4 -> 17/20: G3",
-  "3/4 -> 17/20: B3",
-  "0/1 -> 1/5: C2",
-  "1/2 -> 7/10: E2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 280 https://strudel.cc/?wF7a24BViyqU 1`] = `
-[
-  "0/1 -> 3/4: F3",
-  "3/4 -> 9/8: Ab3",
-  "0/1 -> 3/4: Ab3",
-  "3/4 -> 9/8: C4",
-  "3/8 -> 15/32: Eb4",
-  "9/16 -> 21/32: Eb4",
-  "3/8 -> 15/32: G4",
-  "9/16 -> 21/32: G4",
-  "241/600 -> 147/200: F1",
-  "0/1 -> 3/4: c2",
-  "3/4 -> 3/2: c2",
-  "3/4 -> 3/2: c2",
-  "0/1 -> 3/8: c4",
-  "3/8 -> 3/4: c4",
-  "3/4 -> 9/8: c4",
-]
-`;
-
-exports[`renders shared tunes > shared tune 281 https://strudel.cc/?h87w26zgMJ0L 1`] = `
-[
-  "0/1 -> 5/6: {\\"note\\":\\"c4\\",\\"s\\":\\"piano\\",\\"gain\\":0.5}",
-  "0/1 -> 5/6: {\\"note\\":\\"eb4\\",\\"s\\":\\"piano\\",\\"gain\\":0.5}",
-  "0/1 -> 5/6: {\\"note\\":\\"g4\\",\\"s\\":\\"piano\\",\\"gain\\":0.5}",
-  "5/6 -> 5/3: {\\"note\\":\\"f4\\",\\"s\\":\\"piano\\",\\"gain\\":0.5}",
-  "5/6 -> 5/3: {\\"note\\":\\"ab4\\",\\"s\\":\\"piano\\",\\"gain\\":0.5}",
-  "5/6 -> 5/3: {\\"note\\":\\"d4\\",\\"s\\":\\"piano\\",\\"gain\\":0.5}",
-  "0/1 -> 5/6: {\\"value\\":\\"C5\\",\\"s\\":\\"square\\",\\"vowel\\":\\"a\\",\\"gain\\":0.5}",
-  "0/1 -> 5/6: {\\"value\\":\\"Eb5\\",\\"s\\":\\"square\\",\\"vowel\\":\\"a\\",\\"gain\\":0.5}",
-  "0/1 -> 5/6: {\\"value\\":\\"G5\\",\\"s\\":\\"square\\",\\"vowel\\":\\"a\\",\\"gain\\":0.5}",
-  "5/6 -> 5/3: {\\"value\\":\\"F5\\",\\"s\\":\\"square\\",\\"vowel\\":\\"e\\",\\"gain\\":0.5}",
-  "5/6 -> 5/3: {\\"value\\":\\"Ab5\\",\\"s\\":\\"square\\",\\"vowel\\":\\"e\\",\\"gain\\":0.5}",
-  "5/6 -> 5/3: {\\"value\\":\\"D5\\",\\"s\\":\\"square\\",\\"vowel\\":\\"e\\",\\"gain\\":0.5}",
-  "0/1 -> 5/12: {\\"s\\":\\"hh:1\\",\\"pan\\":0.05378073193423916,\\"speed\\":0.9,\\"gain\\":0.5,\\"cutoff\\":1484.0265874081524}",
-  "5/12 -> 5/6: {\\"s\\":\\"hh:1\\",\\"pan\\":0.46576143316633534,\\"speed\\":0.9,\\"gain\\":0.5,\\"cutoff\\":5191.852898497018}",
-  "5/6 -> 5/4: {\\"s\\":\\"hh:1\\",\\"pan\\":0.5650874826969812,\\"speed\\":1.1,\\"gain\\":0.5,\\"cutoff\\":6085.7873442728305}",
-  "0/1 -> 5/48: {\\"s\\":\\"hh:4\\",\\"pan\\":0.8426077850162983,\\"gain\\":0.5,\\"cutoff\\":1010.3722531168131}",
-  "5/8 -> 35/48: {\\"s\\":\\"hh:4\\",\\"pan\\":0.7516226731240749,\\"gain\\":0.5,\\"cutoff\\":5447.84153238514}",
-  "5/48 -> 5/24: {\\"s\\":\\"hh:4\\",\\"pan\\":0.20066574029624462,\\"speed\\":0.8,\\"gain\\":0.5,\\"cutoff\\":1228.0379535200295}",
-  "5/24 -> 5/16: {\\"s\\":\\"hh:4\\",\\"pan\\":0.5675661638379097,\\"speed\\":0.8,\\"gain\\":0.5,\\"cutoff\\":1841.6864900251398}",
-  "5/16 -> 5/12: {\\"s\\":\\"hh:4\\",\\"pan\\":0.3015887886285782,\\"speed\\":0.8,\\"gain\\":0.5,\\"cutoff\\":2795.666220801607}",
-  "5/12 -> 25/48: {\\"s\\":\\"hh:4\\",\\"pan\\":0.16399178467690945,\\"speed\\":0.8,\\"gain\\":0.5,\\"cutoff\\":3880.2132651035636}",
-  "25/48 -> 5/8: {\\"s\\":\\"hh:4\\",\\"pan\\":0.408811716362834,\\"speed\\":0.8,\\"gain\\":0.5,\\"cutoff\\":4834.19299588003}",
-  "35/48 -> 5/6: {\\"s\\":\\"hh:4\\",\\"pan\\":0.7029578909277916,\\"speed\\":0.8,\\"gain\\":0.5,\\"cutoff\\":5665.507232788357}",
-  "5/6 -> 15/16: {\\"s\\":\\"hh:4\\",\\"pan\\":0.5486328881233931,\\"speed\\":0.9,\\"gain\\":0.5,\\"cutoff\\":5684.663441522829}",
-  "15/16 -> 25/24: {\\"s\\":\\"hh:4\\",\\"pan\\":0.08174665085971355,\\"speed\\":0.9,\\"gain\\":0.5,\\"cutoff\\":5868.998111174235}",
-  "0/1 -> 2/3: {\\"s\\":\\"bd:7\\",\\"cutoff\\":300,\\"gain\\":0.5}",
-  "0/1 -> 2/3: {\\"s\\":\\"bd:7\\",\\"cutoff\\":1000,\\"gain\\":0.5}",
-  "0/1 -> 5/12: {\\"value\\":\\"c1\\",\\"s\\":\\"sine\\",\\"shape\\":0.31075614638684784,\\"gain\\":0.5}",
-  "5/6 -> 5/4: {\\"value\\":\\"c1\\",\\"s\\":\\"sine\\",\\"shape\\":0.41301749653939623,\\"gain\\":0.5}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 282 https://strudel.cc/?fwBxQjt9aVhx 1`] = `
-[
-  "5833/7200 -> 19/18: {\\"n\\":\\"C#4\\",\\"s\\":\\"Overdriven Guitar: Guitar\\",\\"gain\\":0.19}",
-  "437/800 -> 19/24: {\\"n\\":\\"D#4\\",\\"s\\":\\"Overdriven Guitar: Guitar\\",\\"gain\\":0.19}",
-  "2033/7200 -> 19/36: {\\"n\\":\\"F4\\",\\"s\\":\\"Overdriven Guitar: Guitar\\",\\"gain\\":0.19}",
-  "133/7200 -> 19/72: {\\"n\\":\\"G4\\",\\"s\\":\\"Overdriven Guitar: Guitar\\",\\"gain\\":0.19}",
-  "5833/7200 -> 19/18: {\\"n\\":\\"c#5\\",\\"s\\":\\"Overdriven Guitar: Guitar\\",\\"gain\\":0.09}",
-  "437/800 -> 19/24: {\\"n\\":\\"d#5\\",\\"s\\":\\"Overdriven Guitar: Guitar\\",\\"gain\\":0.09}",
-  "2033/7200 -> 19/36: {\\"n\\":\\"f5\\",\\"s\\":\\"Overdriven Guitar: Guitar\\",\\"gain\\":0.09}",
-  "133/7200 -> 19/72: {\\"n\\":\\"g5\\",\\"s\\":\\"Overdriven Guitar: Guitar\\",\\"gain\\":0.09}",
-  "19/24 -> 19/12: {\\"n\\":57,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.25}",
-  "19/24 -> 19/12: {\\"n\\":61,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.25}",
-  "19/24 -> 19/12: {\\"n\\":52,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.25}",
-  "0/1 -> 19/24: {\\"n\\":59,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.25}",
-  "0/1 -> 19/24: {\\"n\\":63,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.25}",
-  "0/1 -> 19/24: {\\"n\\":54,\\"s\\":\\"Choir Aahs: Ensemble\\",\\"gain\\":0.25}",
-  "209/240 -> 19/12: {\\"n\\":\\"A1\\",\\"s\\":\\"Electric Bass (finger): Bass\\",\\"gain\\":0.3}",
-  "19/240 -> 19/24: {\\"n\\":\\"B1\\",\\"s\\":\\"Electric Bass (finger): Bass\\",\\"gain\\":0.3}",
-  "19/24 -> 19/18: {\\"s\\":\\"sn\\",\\"gain\\":0.25}",
-  "19/36 -> 19/24: {\\"s\\":\\"sn\\",\\"gain\\":0.25}",
-  "19/72 -> 19/36: {\\"s\\":\\"sn\\",\\"gain\\":0.25}",
-  "0/1 -> 19/72: {\\"s\\":\\"sn\\",\\"gain\\":0.25}",
-  "19/24 -> 19/18: {\\"s\\":\\"hh\\",\\"gain\\":0.25}",
-  "19/36 -> 19/24: {\\"s\\":\\"hh\\",\\"gain\\":0.25}",
-  "19/72 -> 19/36: {\\"s\\":\\"hh\\",\\"gain\\":0.25}",
-  "0/1 -> 19/72: {\\"s\\":\\"hh\\",\\"gain\\":0.25}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 283 https://strudel.cc/?3rnmA7q0g2i- 1`] = `
-[
-  "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}",
-  "5/8 -> 5/4: {\\"s\\":\\"hh\\",\\"room\\":0,\\"end\\":0.04483079938329212}",
-  "0/1 -> 5/16: {\\"s\\":\\"mt\\",\\"gain\\":0.5,\\"room\\":0.5}",
-  "15/16 -> 5/4: {\\"s\\":\\"lt\\",\\"gain\\":0.5,\\"room\\":0.5}",
-  "0/1 -> 5/1: {\\"s\\":\\"misc:2\\",\\"speed\\":1,\\"delay\\":0.5,\\"delaytime\\":0.3333333333333333,\\"gain\\":0.4}",
-  "5/8 -> 5/4: {\\"note\\":\\"Bb3\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.5,\\"cutoff\\":400.16785462816676,\\"decay\\":0.05380063255866716,\\"sustain\\":0,\\"delay\\":0.9,\\"room\\":1}",
-  "5/8 -> 5/4: {\\"note\\":\\"D4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.5,\\"cutoff\\":400.16785462816676,\\"decay\\":0.05380063255866716,\\"sustain\\":0,\\"delay\\":0.9,\\"room\\":1}",
-  "5/8 -> 5/4: {\\"note\\":\\"F4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.5,\\"cutoff\\":400.16785462816676,\\"decay\\":0.05380063255866716,\\"sustain\\":0,\\"delay\\":0.9,\\"room\\":1}",
-  "5/8 -> 5/4: {\\"note\\":\\"A4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.5,\\"cutoff\\":400.16785462816676,\\"decay\\":0.05380063255866716,\\"sustain\\":0,\\"delay\\":0.9,\\"room\\":1}",
-  "5/8 -> 5/4: {\\"note\\":58.1,\\"s\\":\\"sawtooth\\",\\"gain\\":0.5,\\"cutoff\\":400.16785462816676,\\"decay\\":0.05380063255866716,\\"sustain\\":0,\\"delay\\":0.9,\\"room\\":1}",
-  "5/8 -> 5/4: {\\"note\\":62.1,\\"s\\":\\"sawtooth\\",\\"gain\\":0.5,\\"cutoff\\":400.16785462816676,\\"decay\\":0.05380063255866716,\\"sustain\\":0,\\"delay\\":0.9,\\"room\\":1}",
-  "5/8 -> 5/4: {\\"note\\":65.1,\\"s\\":\\"sawtooth\\",\\"gain\\":0.5,\\"cutoff\\":400.16785462816676,\\"decay\\":0.05380063255866716,\\"sustain\\":0,\\"delay\\":0.9,\\"room\\":1}",
-  "5/8 -> 5/4: {\\"note\\":69.1,\\"s\\":\\"sawtooth\\",\\"gain\\":0.5,\\"cutoff\\":400.16785462816676,\\"decay\\":0.05380063255866716,\\"sustain\\":0,\\"delay\\":0.9,\\"room\\":1}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 284 https://strudel.cc/?w1af5xWyhwNm 1`] = `
-[
-  "0/1 -> 8/1: {\\"s\\":\\"bass\\",\\"speed\\":0.125,\\"unit\\":\\"c\\",\\"clip\\":1}",
-  "0/1 -> 1/2: {\\"s\\":\\"bd\\"}",
-  "1/2 -> 1/1: {\\"s\\":\\"bd\\"}",
-  "1/2 -> 1/1: {\\"s\\":\\"sd\\"}",
-  "0/1 -> 1/4: {\\"s\\":\\"hh\\"}",
-  "1/4 -> 1/2: {\\"s\\":\\"hh\\"}",
-  "1/2 -> 3/4: {\\"s\\":\\"hh\\"}",
-  "3/4 -> 1/1: {\\"s\\":\\"hh\\"}",
-  "1/4 -> 1/2: {\\"note\\":\\"Gb3\\"}",
-  "1/4 -> 1/2: {\\"note\\":\\"Bb3\\"}",
-  "1/4 -> 1/2: {\\"note\\":\\"Cb4\\"}",
-  "1/4 -> 1/2: {\\"note\\":\\"Eb4\\"}",
-  "0/1 -> 1/4: {\\"note\\":\\"Ab4\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":1239.2541394619345,\\"gain\\":0.8,\\"decay\\":0.05125097280354112,\\"sustain\\":0,\\"delay\\":0.2561353071307281,\\"room\\":1}",
-  "0/1 -> 1/4: {\\"note\\":68.1,\\"s\\":\\"sawtooth\\",\\"cutoff\\":1239.2541394619345,\\"gain\\":0.8,\\"decay\\":0.05125097280354112,\\"sustain\\":0,\\"delay\\":0.2561353071307281,\\"room\\":1}",
-  "1/4 -> 1/2: {\\"note\\":83,\\"s\\":\\"sawtooth\\",\\"cutoff\\":1317.3843795642892,\\"gain\\":0.8,\\"decay\\":0.07144728658238364,\\"sustain\\":0,\\"delay\\":0.26839114089991684,\\"room\\":1}",
-  "1/4 -> 1/2: {\\"note\\":83.1,\\"s\\":\\"sawtooth\\",\\"cutoff\\":1317.3843795642892,\\"gain\\":0.8,\\"decay\\":0.07144728658238364,\\"sustain\\":0,\\"delay\\":0.26839114089991684,\\"room\\":1}",
-  "0/1 -> 8/1: {\\"note\\":\\"b4\\",\\"s\\":\\"dino\\",\\"delay\\":0.8,\\"room\\":0.5}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 285 https://strudel.cc/?Ne_BJMKKDCO_ 1`] = `
-[
-  "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}",
-  "5/8 -> 5/4: {\\"s\\":\\"hh\\",\\"room\\":0,\\"end\\":0.04483079938329212}",
-  "0/1 -> 5/16: {\\"s\\":\\"mt\\",\\"gain\\":0.5,\\"room\\":1}",
-  "15/16 -> 5/4: {\\"s\\":\\"lt\\",\\"gain\\":0.5,\\"room\\":1}",
-  "0/1 -> 5/1: {\\"s\\":\\"misc:2\\",\\"speed\\":1,\\"delay\\":0.5,\\"delaytime\\":0.3333333333333333,\\"gain\\":0.4}",
-  "5/8 -> 5/4: {\\"note\\":\\"Bb3\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.5,\\"cutoff\\":400.16785462816676,\\"decay\\":0.05380063255866716,\\"sustain\\":0,\\"delay\\":0.9,\\"room\\":1}",
-  "5/8 -> 5/4: {\\"note\\":\\"D4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.5,\\"cutoff\\":400.16785462816676,\\"decay\\":0.05380063255866716,\\"sustain\\":0,\\"delay\\":0.9,\\"room\\":1}",
-  "5/8 -> 5/4: {\\"note\\":\\"F4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.5,\\"cutoff\\":400.16785462816676,\\"decay\\":0.05380063255866716,\\"sustain\\":0,\\"delay\\":0.9,\\"room\\":1}",
-  "5/8 -> 5/4: {\\"note\\":\\"A4\\",\\"s\\":\\"sawtooth\\",\\"gain\\":0.5,\\"cutoff\\":400.16785462816676,\\"decay\\":0.05380063255866716,\\"sustain\\":0,\\"delay\\":0.9,\\"room\\":1}",
-  "5/8 -> 5/4: {\\"note\\":58.1,\\"s\\":\\"sawtooth\\",\\"gain\\":0.5,\\"cutoff\\":400.16785462816676,\\"decay\\":0.05380063255866716,\\"sustain\\":0,\\"delay\\":0.9,\\"room\\":1}",
-  "5/8 -> 5/4: {\\"note\\":62.1,\\"s\\":\\"sawtooth\\",\\"gain\\":0.5,\\"cutoff\\":400.16785462816676,\\"decay\\":0.05380063255866716,\\"sustain\\":0,\\"delay\\":0.9,\\"room\\":1}",
-  "5/8 -> 5/4: {\\"note\\":65.1,\\"s\\":\\"sawtooth\\",\\"gain\\":0.5,\\"cutoff\\":400.16785462816676,\\"decay\\":0.05380063255866716,\\"sustain\\":0,\\"delay\\":0.9,\\"room\\":1}",
-  "5/8 -> 5/4: {\\"note\\":69.1,\\"s\\":\\"sawtooth\\",\\"gain\\":0.5,\\"cutoff\\":400.16785462816676,\\"decay\\":0.05380063255866716,\\"sustain\\":0,\\"delay\\":0.9,\\"room\\":1}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 286 https://strudel.cc/?G2H5FM0Fc94a 1`] = `
-[
-  "0/1 -> 1/4: {\\"s\\":\\"woodblock:1\\"}",
-  "1/4 -> 3/8: {\\"s\\":\\"woodblock:2\\"}",
-  "0/1 -> 1/8: {\\"s\\":\\"brakedrum:1\\"}",
-  "3/4 -> 7/8: {\\"s\\":\\"brakedrum:1\\"}",
-  "3/8 -> 1/2: {\\"s\\":\\"woodblock:2\\",\\"speed\\":2}",
-  "1/2 -> 1/1: {\\"s\\":\\"snare_rim:0\\",\\"speed\\":2}",
-  "0/1 -> 8/1: {\\"s\\":\\"gong\\",\\"speed\\":2}",
-  "3/8 -> 1/2: {\\"s\\":\\"brakedrum:1\\",\\"speed\\":2}",
-  "3/4 -> 1/1: {\\"s\\":\\"cowbell:3\\",\\"speed\\":2}",
-  "-3/4 -> 1/4: {\\"note\\":\\"Bb3\\",\\"s\\":\\"clavisynth\\",\\"gain\\":0.2,\\"delay\\":0.25,\\"pan\\":0}",
-  "3/4 -> 7/4: {\\"note\\":\\"Bb3\\",\\"s\\":\\"clavisynth\\",\\"gain\\":0.2,\\"delay\\":0.25,\\"pan\\":1}",
-  "-1/4 -> 3/4: {\\"note\\":\\"F3\\",\\"s\\":\\"clavisynth\\",\\"gain\\":0.2,\\"delay\\":0.25,\\"pan\\":1}",
-  "0/1 -> 3/1: {\\"note\\":\\"D1\\",\\"s\\":\\"psaltery_pluck\\",\\"gain\\":0.6,\\"clip\\":1,\\"release\\":0.1,\\"room\\":0.5}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 287 https://strudel.cc/?EPFzAz99hwZW 1`] = `
-[
-  "0/1 -> 1/4: {\\"note\\":48,\\"s\\":\\"ocarina_vib\\",\\"clip\\":1,\\"release\\":0.1,\\"room\\":1,\\"gain\\":0.2}",
-  "1/4 -> 9/32: {\\"note\\":51,\\"s\\":\\"ocarina_vib\\",\\"clip\\":1,\\"release\\":0.1,\\"room\\":1,\\"gain\\":0.2}",
-  "11/32 -> 3/8: {\\"note\\":51,\\"s\\":\\"ocarina_vib\\",\\"clip\\":1,\\"release\\":0.1,\\"room\\":1,\\"gain\\":0.2}",
-  "7/16 -> 15/32: {\\"note\\":51,\\"s\\":\\"ocarina_vib\\",\\"clip\\":1,\\"release\\":0.1,\\"room\\":1,\\"gain\\":0.2}",
-  "1/2 -> 1/1: {\\"note\\":60,\\"s\\":\\"ocarina_vib\\",\\"clip\\":1,\\"release\\":0.1,\\"room\\":1,\\"gain\\":0.2}",
-  "3/4 -> 7/8: {\\"note\\":55,\\"s\\":\\"ocarina_vib\\",\\"clip\\":1,\\"release\\":0.1,\\"room\\":1,\\"gain\\":0.2}",
-  "7/8 -> 1/1: {\\"note\\":55,\\"s\\":\\"ocarina_vib\\",\\"clip\\":1,\\"release\\":0.1,\\"room\\":1,\\"gain\\":0.2}",
-  "0/1 -> 1/2: {\\"note\\":60,\\"s\\":\\"ocarina_vib\\",\\"clip\\":1,\\"release\\":0.1,\\"room\\":1,\\"gain\\":0.2}",
-  "1/2 -> 9/16: {\\"note\\":63,\\"s\\":\\"ocarina_vib\\",\\"clip\\":1,\\"release\\":0.1,\\"room\\":1,\\"gain\\":0.2}",
-  "11/16 -> 3/4: {\\"note\\":63,\\"s\\":\\"ocarina_vib\\",\\"clip\\":1,\\"release\\":0.1,\\"room\\":1,\\"gain\\":0.2}",
-  "7/8 -> 15/16: {\\"note\\":63,\\"s\\":\\"ocarina_vib\\",\\"clip\\":1,\\"release\\":0.1,\\"room\\":1,\\"gain\\":0.2}",
-  "0/1 -> 1/1: {\\"note\\":43,\\"s\\":\\"ocarina_vib\\",\\"clip\\":1,\\"release\\":0.1,\\"room\\":1,\\"gain\\":0.2}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 288 https://strudel.cc/?DSvgYUzEgx6n 1`] = `
-[
-  "0/1 -> 1/2: {\\"s\\":\\"bd\\",\\"bank\\":\\"RolandTR909\\"}",
-  "1/2 -> 1/1: {\\"s\\":\\"bd\\",\\"bank\\":\\"RolandTR909\\"}",
-  "1/2 -> 1/1: {\\"s\\":\\"cp\\",\\"bank\\":\\"RolandTR909\\"}",
-  "1/2 -> 1/1: {\\"s\\":\\"sd\\",\\"bank\\":\\"RolandTR909\\"}",
-  "0/1 -> 1/4: {\\"s\\":\\"hh:1\\",\\"end\\":0.02000058072071123,\\"bank\\":\\"RolandTR909\\",\\"room\\":0.5,\\"gain\\":0.4}",
-  "0/1 -> 1/4: {\\"s\\":\\"hh:1\\",\\"end\\":0.02000058072071123,\\"bank\\":\\"RolandTR909\\",\\"room\\":0.5,\\"gain\\":0.4}",
-  "1/4 -> 3/8: {\\"s\\":\\"hh:1\\",\\"end\\":0.02000875429921906,\\"bank\\":\\"RolandTR909\\",\\"room\\":0.5,\\"gain\\":0.4}",
-  "1/4 -> 3/8: {\\"s\\":\\"hh:1\\",\\"end\\":0.02000875429921906,\\"bank\\":\\"RolandTR909\\",\\"room\\":0.5,\\"gain\\":0.4}",
-  "3/8 -> 1/2: {\\"s\\":\\"hh:1\\",\\"end\\":0.020023446730265706,\\"bank\\":\\"RolandTR909\\",\\"room\\":0.5,\\"gain\\":0.4}",
-  "5/8 -> 3/4: {\\"s\\":\\"hh:1\\",\\"end\\":0.020086608138500644,\\"bank\\":\\"RolandTR909\\",\\"room\\":0.5,\\"gain\\":0.4}",
-  "5/8 -> 3/4: {\\"s\\":\\"hh:1\\",\\"end\\":0.020086608138500644,\\"bank\\":\\"RolandTR909\\",\\"room\\":0.5,\\"gain\\":0.4}",
-  "3/4 -> 7/8: {\\"s\\":\\"hh:1\\",\\"end\\":0.02013941880355398,\\"bank\\":\\"RolandTR909\\",\\"room\\":0.5,\\"gain\\":0.4}",
-  "1/8 -> 1/4: {\\"s\\":\\"hh:1\\",\\"speed\\":0.5,\\"delay\\":0.5,\\"end\\":0.020001936784171157,\\"bank\\":\\"RolandTR909\\",\\"room\\":0.5,\\"gain\\":0.4}",
-  "1/8 -> 1/4: {\\"s\\":\\"hh:1\\",\\"speed\\":0.5,\\"delay\\":0.5,\\"end\\":0.020001936784171157,\\"bank\\":\\"RolandTR909\\",\\"room\\":0.5,\\"gain\\":0.4}",
-  "1/8 -> 1/4: {\\"note\\":\\"G1\\",\\"s\\":\\"sawtooth\\",\\"decay\\":0.1,\\"sustain\\":0}",
-  "1/4 -> 3/8: {\\"note\\":\\"G1\\",\\"s\\":\\"sawtooth\\",\\"decay\\":0.1,\\"sustain\\":0}",
-  "1/2 -> 5/8: {\\"note\\":\\"G1\\",\\"s\\":\\"sawtooth\\",\\"decay\\":0.1,\\"sustain\\":0}",
-  "5/8 -> 3/4: {\\"note\\":\\"G1\\",\\"s\\":\\"sawtooth\\",\\"decay\\":0.1,\\"sustain\\":0}",
-  "7/8 -> 1/1: {\\"note\\":\\"G1\\",\\"s\\":\\"sawtooth\\",\\"decay\\":0.1,\\"sustain\\":0}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 289 https://strudel.cc/?cRvfurHbl4jo 1`] = `
-[
-  "0/1 -> 1/2: {\\"s\\":\\"bd\\",\\"delay\\":0,\\"delaytime\\":0.33,\\"delayfeedback\\":0.8,\\"speed\\":-1}",
-  "1/2 -> 1/1: {\\"s\\":\\"sd\\",\\"delay\\":0,\\"delaytime\\":0.33,\\"delayfeedback\\":0.8,\\"speed\\":-1}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 290 https://strudel.cc/?DGHGUqRXr5pe 1`] = `
-[
-  "0/1 -> 1/4: {\\"s\\":\\"jvbass:7\\",\\"cutoff\\":1000,\\"gain\\":0.6740862280130386,\\"room\\":1}",
-  "1/4 -> 1/2: {\\"s\\":\\"jvbass:2\\",\\"cutoff\\":1000,\\"gain\\":0.5605570062994958,\\"room\\":1}",
-  "0/1 -> 1/4: {\\"s\\":\\"bd\\",\\"cutoff\\":1000,\\"gain\\":0.6740862280130386,\\"room\\":1}",
-  "1/4 -> 1/2: {\\"s\\":\\"hh\\",\\"cutoff\\":1000,\\"gain\\":0.5605570062994958,\\"room\\":1}",
-  "0/1 -> 1/2: {\\"s\\":\\"psr\\",\\"cutoff\\":1000,\\"gain\\":0.5479038767516613,\\"room\\":1}",
-  "3/4 -> 1/1: {\\"s\\":\\"jvbass:3\\",\\"cutoff\\":1000,\\"gain\\":0.5590524323284627,\\"room\\":1}",
-  "3/4 -> 1/1: {\\"s\\":\\"hh\\",\\"cutoff\\":1000,\\"gain\\":0.5590524323284627,\\"room\\":1}",
-  "-1/8 -> 1/8: {\\"s\\":\\"jvbass:3\\",\\"delay\\":0.5,\\"cutoff\\":1000,\\"gain\\":0.7370431140065193,\\"room\\":1}",
-  "-1/8 -> 1/8: {\\"s\\":\\"hh\\",\\"delay\\":0.5,\\"cutoff\\":1000,\\"gain\\":0.7370431140065193,\\"room\\":1}",
-  "-3/8 -> 1/8: {\\"s\\":\\"psr\\",\\"delay\\":0.5,\\"cutoff\\":1000,\\"gain\\":0.7370431140065193,\\"room\\":1}",
-  "1/8 -> 3/8: {\\"s\\":\\"jvbass:7\\",\\"delay\\":0.5,\\"cutoff\\":1000,\\"gain\\":0.5479038767516613,\\"room\\":1}",
-  "3/8 -> 5/8: {\\"s\\":\\"jvbass:2\\",\\"delay\\":0.5,\\"cutoff\\":1000,\\"gain\\":0.5041922464966775,\\"room\\":1}",
-  "1/8 -> 3/8: {\\"s\\":\\"bd\\",\\"delay\\":0.5,\\"cutoff\\":1000,\\"gain\\":0.5479038767516613,\\"room\\":1}",
-  "3/8 -> 5/8: {\\"s\\":\\"hh\\",\\"delay\\":0.5,\\"cutoff\\":1000,\\"gain\\":0.5041922464966775,\\"room\\":1}",
-  "1/8 -> 5/8: {\\"s\\":\\"psr\\",\\"delay\\":0.5,\\"cutoff\\":1000,\\"gain\\":0.5605570062994958,\\"room\\":1}",
-  "7/8 -> 9/8: {\\"s\\":\\"jvbass:3\\",\\"delay\\":0.5,\\"cutoff\\":1000,\\"gain\\":0.6811831563711166,\\"room\\":1}",
-  "7/8 -> 9/8: {\\"s\\":\\"hh\\",\\"delay\\":0.5,\\"cutoff\\":1000,\\"gain\\":0.6811831563711166,\\"room\\":1}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 291 https://strudel.cc/?RBaWr8-15Guk 1`] = `
-[
-  "0/1 -> 1/6: {\\"s\\":\\"hh\\",\\"gain\\":0.6339596770703793,\\"room\\":0.6,\\"pan\\":0}",
-  "8/9 -> 17/18: {\\"s\\":\\"jvbass:7\\",\\"cutoff\\":1000,\\"gain\\":0.7514234818518162,\\"room\\":0.6,\\"pan\\":0}",
-  "2/3 -> 13/18: {\\"s\\":\\"jvbass:7\\",\\"cutoff\\":1000,\\"gain\\":0.7182912312448025,\\"room\\":0.6,\\"pan\\":0}",
-  "0/1 -> 1/1: {\\"s\\":\\"bd\\",\\"cutoff\\":1000,\\"gain\\":0.5041922464966775,\\"room\\":0.6,\\"pan\\":0}",
-  "-1/1 -> 1/1: {\\"s\\":\\"psr\\",\\"cutoff\\":1000,\\"gain\\":0.5041922464966775,\\"room\\":0.6,\\"pan\\":0}",
-  "5/6 -> 1/1: {\\"s\\":\\"hh\\",\\"gain\\":0.6339596770703793,\\"room\\":0.6,\\"pan\\":1}",
-  "1/18 -> 1/9: {\\"s\\":\\"jvbass:7\\",\\"cutoff\\":1000,\\"gain\\":0.7514234818518162,\\"room\\":0.6,\\"pan\\":1}",
-  "5/18 -> 1/3: {\\"s\\":\\"jvbass:7\\",\\"cutoff\\":1000,\\"gain\\":0.7182912312448025,\\"room\\":0.6,\\"pan\\":1}",
-  "0/1 -> 1/1: {\\"s\\":\\"bd\\",\\"cutoff\\":1000,\\"gain\\":0.5041922464966775,\\"room\\":0.6,\\"pan\\":1}",
-  "0/1 -> 2/1: {\\"s\\":\\"psr\\",\\"cutoff\\":1000,\\"gain\\":0.5041922464966775,\\"room\\":0.6,\\"pan\\":1}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 292 https://strudel.cc/?c41h3Z1fwqTB 1`] = `
-[
-  "0/1 -> 1/6: {\\"s\\":\\"hh\\",\\"gain\\":0.6339596770703793,\\"room\\":0.6,\\"pan\\":0}",
-  "8/9 -> 17/18: {\\"s\\":\\"jvbass:7\\",\\"cutoff\\":1000,\\"gain\\":0.7514234818518162,\\"room\\":0.6,\\"pan\\":0}",
-  "2/3 -> 13/18: {\\"s\\":\\"jvbass:7\\",\\"cutoff\\":1000,\\"gain\\":0.7182912312448025,\\"room\\":0.6,\\"pan\\":0}",
-  "0/1 -> 1/1: {\\"s\\":\\"bd\\",\\"cutoff\\":1000,\\"gain\\":0.5041922464966775,\\"room\\":0.6,\\"pan\\":0}",
-  "-1/1 -> 1/1: {\\"s\\":\\"psr\\",\\"cutoff\\":1000,\\"gain\\":0.5041922464966775,\\"room\\":0.6,\\"pan\\":0}",
-  "5/6 -> 1/1: {\\"s\\":\\"hh\\",\\"gain\\":0.6339596770703793,\\"room\\":0.6,\\"pan\\":1}",
-  "1/18 -> 1/9: {\\"s\\":\\"jvbass:7\\",\\"cutoff\\":1000,\\"gain\\":0.7514234818518162,\\"room\\":0.6,\\"pan\\":1}",
-  "5/18 -> 1/3: {\\"s\\":\\"jvbass:7\\",\\"cutoff\\":1000,\\"gain\\":0.7182912312448025,\\"room\\":0.6,\\"pan\\":1}",
-  "0/1 -> 1/1: {\\"s\\":\\"bd\\",\\"cutoff\\":1000,\\"gain\\":0.5041922464966775,\\"room\\":0.6,\\"pan\\":1}",
-  "0/1 -> 2/1: {\\"s\\":\\"psr\\",\\"cutoff\\":1000,\\"gain\\":0.5041922464966775,\\"room\\":0.6,\\"pan\\":1}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 293 https://strudel.cc/?lvF3fzHrDbyx 1`] = `
-[
-  "0/1 -> 1/2: {\\"s\\":\\"bev\\",\\"begin\\":0,\\"end\\":0.015625,\\"pan\\":0,\\"speed\\":0.5,\\"room\\":0.9}",
-  "0/1 -> 1/2: {\\"s\\":\\"bev\\",\\"begin\\":0.046875,\\"end\\":0.0625,\\"pan\\":1,\\"speed\\":0.5,\\"room\\":0.9}",
-  "1/4 -> 1/2: {\\"s\\":\\"bev\\",\\"begin\\":0.015625,\\"end\\":0.03125,\\"pan\\":0,\\"room\\":0.9}",
-  "1/2 -> 3/4: {\\"s\\":\\"bev\\",\\"begin\\":0.03125,\\"end\\":0.046875,\\"pan\\":0,\\"room\\":0.9}",
-  "3/4 -> 1/1: {\\"s\\":\\"bev\\",\\"begin\\":0.046875,\\"end\\":0.0625,\\"pan\\":0,\\"room\\":0.9}",
-  "3/4 -> 1/1: {\\"s\\":\\"bev\\",\\"begin\\":0,\\"end\\":0.015625,\\"pan\\":1,\\"room\\":0.9}",
-  "1/2 -> 3/4: {\\"s\\":\\"bev\\",\\"begin\\":0.015625,\\"end\\":0.03125,\\"pan\\":1,\\"room\\":0.9}",
-  "1/4 -> 1/2: {\\"s\\":\\"bev\\",\\"begin\\":0.03125,\\"end\\":0.046875,\\"pan\\":1,\\"room\\":0.9}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 294 https://strudel.cc/?vqqfVtY-n1Z6 1`] = `
-[
-  "0/1 -> 1/6: {\\"s\\":\\"hh\\",\\"gain\\":0.6339596770703793,\\"room\\":0.6,\\"pan\\":0}",
-  "8/9 -> 17/18: {\\"s\\":\\"jvbass:7\\",\\"cutoff\\":1000,\\"gain\\":0.7514234818518162,\\"room\\":0.6,\\"pan\\":0}",
-  "2/3 -> 13/18: {\\"s\\":\\"jvbass:7\\",\\"cutoff\\":1000,\\"gain\\":0.7182912312448025,\\"room\\":0.6,\\"pan\\":0}",
-  "0/1 -> 1/1: {\\"s\\":\\"bd\\",\\"cutoff\\":1000,\\"gain\\":0.5041922464966775,\\"room\\":0.6,\\"pan\\":0}",
-  "-1/1 -> 1/1: {\\"s\\":\\"bottle\\",\\"cutoff\\":1000,\\"gain\\":0.5041922464966775,\\"room\\":0.6,\\"pan\\":0}",
-  "5/6 -> 1/1: {\\"s\\":\\"hh\\",\\"gain\\":0.6339596770703793,\\"room\\":0.6,\\"pan\\":1}",
-  "1/18 -> 1/9: {\\"s\\":\\"jvbass:7\\",\\"cutoff\\":1000,\\"gain\\":0.7514234818518162,\\"room\\":0.6,\\"pan\\":1}",
-  "5/18 -> 1/3: {\\"s\\":\\"jvbass:7\\",\\"cutoff\\":1000,\\"gain\\":0.7182912312448025,\\"room\\":0.6,\\"pan\\":1}",
-  "0/1 -> 1/1: {\\"s\\":\\"bd\\",\\"cutoff\\":1000,\\"gain\\":0.5041922464966775,\\"room\\":0.6,\\"pan\\":1}",
-  "0/1 -> 2/1: {\\"s\\":\\"bottle\\",\\"cutoff\\":1000,\\"gain\\":0.5041922464966775,\\"room\\":0.6,\\"pan\\":1}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 295 https://strudel.cc/?C7PwKmsYAOJL 1`] = `
-[
-  "0/1 -> 1/64: {\\"s\\":\\"future:2\\",\\"begin\\":0,\\"end\\":0.0625,\\"speed\\":2,\\"pan\\":0,\\"room\\":0.6}",
-  "1/64 -> 1/32: {\\"s\\":\\"future:2\\",\\"begin\\":0.0625,\\"end\\":0.125,\\"speed\\":2,\\"pan\\":0,\\"room\\":0.6}",
-  "1/32 -> 3/64: {\\"s\\":\\"future:2\\",\\"begin\\":0.125,\\"end\\":0.1875,\\"speed\\":2,\\"pan\\":0,\\"room\\":0.6}",
-  "3/64 -> 1/16: {\\"s\\":\\"future:2\\",\\"begin\\":0.1875,\\"end\\":0.25,\\"speed\\":2,\\"pan\\":0,\\"room\\":0.6}",
-  "1/16 -> 5/64: {\\"s\\":\\"future:2\\",\\"begin\\":0.25,\\"end\\":0.3125,\\"speed\\":2,\\"pan\\":0,\\"room\\":0.6}",
-  "5/64 -> 3/32: {\\"s\\":\\"future:2\\",\\"begin\\":0.3125,\\"end\\":0.375,\\"speed\\":2,\\"pan\\":0,\\"room\\":0.6}",
-  "3/32 -> 7/64: {\\"s\\":\\"future:2\\",\\"begin\\":0.375,\\"end\\":0.4375,\\"speed\\":2,\\"pan\\":0,\\"room\\":0.6}",
-  "7/64 -> 1/8: {\\"s\\":\\"future:2\\",\\"begin\\":0.4375,\\"end\\":0.5,\\"speed\\":2,\\"pan\\":0,\\"room\\":0.6}",
-  "1/8 -> 9/64: {\\"s\\":\\"future:2\\",\\"begin\\":0.5,\\"end\\":0.5625,\\"speed\\":2,\\"pan\\":0,\\"room\\":0.6}",
-  "9/64 -> 5/32: {\\"s\\":\\"future:2\\",\\"begin\\":0.5625,\\"end\\":0.625,\\"speed\\":2,\\"pan\\":0,\\"room\\":0.6}",
-  "5/32 -> 11/64: {\\"s\\":\\"future:2\\",\\"begin\\":0.625,\\"end\\":0.6875,\\"speed\\":2,\\"pan\\":0,\\"room\\":0.6}",
-  "11/64 -> 3/16: {\\"s\\":\\"future:2\\",\\"begin\\":0.6875,\\"end\\":0.75,\\"speed\\":2,\\"pan\\":0,\\"room\\":0.6}",
-  "3/16 -> 13/64: {\\"s\\":\\"future:2\\",\\"begin\\":0.75,\\"end\\":0.8125,\\"speed\\":2,\\"pan\\":0,\\"room\\":0.6}",
-  "13/64 -> 7/32: {\\"s\\":\\"future:2\\",\\"begin\\":0.8125,\\"end\\":0.875,\\"speed\\":2,\\"pan\\":0,\\"room\\":0.6}",
-  "7/32 -> 15/64: {\\"s\\":\\"future:2\\",\\"begin\\":0.875,\\"end\\":0.9375,\\"speed\\":2,\\"pan\\":0,\\"room\\":0.6}",
-  "15/64 -> 1/4: {\\"s\\":\\"future:2\\",\\"begin\\":0.9375,\\"end\\":1,\\"speed\\":2,\\"pan\\":0,\\"room\\":0.6}",
-  "1/4 -> 17/64: {\\"s\\":\\"future:3\\",\\"begin\\":0,\\"end\\":0.0625,\\"speed\\":2,\\"pan\\":0,\\"room\\":0.6}",
-  "17/64 -> 9/32: {\\"s\\":\\"future:3\\",\\"begin\\":0.0625,\\"end\\":0.125,\\"speed\\":2,\\"pan\\":0,\\"room\\":0.6}",
-  "9/32 -> 19/64: {\\"s\\":\\"future:3\\",\\"begin\\":0.125,\\"end\\":0.1875,\\"speed\\":2,\\"pan\\":0,\\"room\\":0.6}",
-  "19/64 -> 5/16: {\\"s\\":\\"future:3\\",\\"begin\\":0.1875,\\"end\\":0.25,\\"speed\\":2,\\"pan\\":0,\\"room\\":0.6}",
-  "5/16 -> 21/64: {\\"s\\":\\"future:3\\",\\"begin\\":0.25,\\"end\\":0.3125,\\"speed\\":2,\\"pan\\":0,\\"room\\":0.6}",
-  "21/64 -> 11/32: {\\"s\\":\\"future:3\\",\\"begin\\":0.3125,\\"end\\":0.375,\\"speed\\":2,\\"pan\\":0,\\"room\\":0.6}",
-  "11/32 -> 23/64: {\\"s\\":\\"future:3\\",\\"begin\\":0.375,\\"end\\":0.4375,\\"speed\\":2,\\"pan\\":0,\\"room\\":0.6}",
-  "23/64 -> 3/8: {\\"s\\":\\"future:3\\",\\"begin\\":0.4375,\\"end\\":0.5,\\"speed\\":2,\\"pan\\":0,\\"room\\":0.6}",
-  "3/8 -> 25/64: {\\"s\\":\\"future:3\\",\\"begin\\":0.5,\\"end\\":0.5625,\\"speed\\":2,\\"pan\\":0,\\"room\\":0.6}",
-  "25/64 -> 13/32: {\\"s\\":\\"future:3\\",\\"begin\\":0.5625,\\"end\\":0.625,\\"speed\\":2,\\"pan\\":0,\\"room\\":0.6}",
-  "13/32 -> 27/64: {\\"s\\":\\"future:3\\",\\"begin\\":0.625,\\"end\\":0.6875,\\"speed\\":2,\\"pan\\":0,\\"room\\":0.6}",
-  "27/64 -> 7/16: {\\"s\\":\\"future:3\\",\\"begin\\":0.6875,\\"end\\":0.75,\\"speed\\":2,\\"pan\\":0,\\"room\\":0.6}",
-  "7/16 -> 29/64: {\\"s\\":\\"future:3\\",\\"begin\\":0.75,\\"end\\":0.8125,\\"speed\\":2,\\"pan\\":0,\\"room\\":0.6}",
-  "29/64 -> 15/32: {\\"s\\":\\"future:3\\",\\"begin\\":0.8125,\\"end\\":0.875,\\"speed\\":2,\\"pan\\":0,\\"room\\":0.6}",
-  "15/32 -> 31/64: {\\"s\\":\\"future:3\\",\\"begin\\":0.875,\\"end\\":0.9375,\\"speed\\":2,\\"pan\\":0,\\"room\\":0.6}",
-  "31/64 -> 1/2: {\\"s\\":\\"future:3\\",\\"begin\\":0.9375,\\"end\\":1,\\"speed\\":2,\\"pan\\":0,\\"room\\":0.6}",
-  "1/2 -> 17/32: {\\"s\\":\\"sd\\",\\"begin\\":0,\\"end\\":0.0625,\\"pan\\":0,\\"room\\":0.6}",
-  "17/32 -> 9/16: {\\"s\\":\\"sd\\",\\"begin\\":0.0625,\\"end\\":0.125,\\"pan\\":0,\\"room\\":0.6}",
-  "9/16 -> 19/32: {\\"s\\":\\"sd\\",\\"begin\\":0.125,\\"end\\":0.1875,\\"pan\\":0,\\"room\\":0.6}",
-  "19/32 -> 5/8: {\\"s\\":\\"sd\\",\\"begin\\":0.1875,\\"end\\":0.25,\\"pan\\":0,\\"room\\":0.6}",
-  "5/8 -> 21/32: {\\"s\\":\\"sd\\",\\"begin\\":0.25,\\"end\\":0.3125,\\"pan\\":0,\\"room\\":0.6}",
-  "21/32 -> 11/16: {\\"s\\":\\"sd\\",\\"begin\\":0.3125,\\"end\\":0.375,\\"pan\\":0,\\"room\\":0.6}",
-  "11/16 -> 23/32: {\\"s\\":\\"sd\\",\\"begin\\":0.375,\\"end\\":0.4375,\\"pan\\":0,\\"room\\":0.6}",
-  "23/32 -> 3/4: {\\"s\\":\\"sd\\",\\"begin\\":0.4375,\\"end\\":0.5,\\"pan\\":0,\\"room\\":0.6}",
-  "3/4 -> 25/32: {\\"s\\":\\"sd\\",\\"begin\\":0.5,\\"end\\":0.5625,\\"pan\\":0,\\"room\\":0.6}",
-  "25/32 -> 13/16: {\\"s\\":\\"sd\\",\\"begin\\":0.5625,\\"end\\":0.625,\\"pan\\":0,\\"room\\":0.6}",
-  "13/16 -> 27/32: {\\"s\\":\\"sd\\",\\"begin\\":0.625,\\"end\\":0.6875,\\"pan\\":0,\\"room\\":0.6}",
-  "27/32 -> 7/8: {\\"s\\":\\"sd\\",\\"begin\\":0.6875,\\"end\\":0.75,\\"pan\\":0,\\"room\\":0.6}",
-  "7/8 -> 29/32: {\\"s\\":\\"sd\\",\\"begin\\":0.75,\\"end\\":0.8125,\\"pan\\":0,\\"room\\":0.6}",
-  "29/32 -> 15/16: {\\"s\\":\\"sd\\",\\"begin\\":0.8125,\\"end\\":0.875,\\"pan\\":0,\\"room\\":0.6}",
-  "15/16 -> 31/32: {\\"s\\":\\"sd\\",\\"begin\\":0.875,\\"end\\":0.9375,\\"pan\\":0,\\"room\\":0.6}",
-  "31/32 -> 1/1: {\\"s\\":\\"sd\\",\\"begin\\":0.9375,\\"end\\":1,\\"pan\\":0,\\"room\\":0.6}",
-  "63/64 -> 1/1: {\\"s\\":\\"future:2\\",\\"begin\\":0,\\"end\\":0.0625,\\"speed\\":2,\\"pan\\":1,\\"room\\":0.6}",
-  "31/32 -> 63/64: {\\"s\\":\\"future:2\\",\\"begin\\":0.0625,\\"end\\":0.125,\\"speed\\":2,\\"pan\\":1,\\"room\\":0.6}",
-  "61/64 -> 31/32: {\\"s\\":\\"future:2\\",\\"begin\\":0.125,\\"end\\":0.1875,\\"speed\\":2,\\"pan\\":1,\\"room\\":0.6}",
-  "15/16 -> 61/64: {\\"s\\":\\"future:2\\",\\"begin\\":0.1875,\\"end\\":0.25,\\"speed\\":2,\\"pan\\":1,\\"room\\":0.6}",
-  "59/64 -> 15/16: {\\"s\\":\\"future:2\\",\\"begin\\":0.25,\\"end\\":0.3125,\\"speed\\":2,\\"pan\\":1,\\"room\\":0.6}",
-  "29/32 -> 59/64: {\\"s\\":\\"future:2\\",\\"begin\\":0.3125,\\"end\\":0.375,\\"speed\\":2,\\"pan\\":1,\\"room\\":0.6}",
-  "57/64 -> 29/32: {\\"s\\":\\"future:2\\",\\"begin\\":0.375,\\"end\\":0.4375,\\"speed\\":2,\\"pan\\":1,\\"room\\":0.6}",
-  "7/8 -> 57/64: {\\"s\\":\\"future:2\\",\\"begin\\":0.4375,\\"end\\":0.5,\\"speed\\":2,\\"pan\\":1,\\"room\\":0.6}",
-  "55/64 -> 7/8: {\\"s\\":\\"future:2\\",\\"begin\\":0.5,\\"end\\":0.5625,\\"speed\\":2,\\"pan\\":1,\\"room\\":0.6}",
-  "27/32 -> 55/64: {\\"s\\":\\"future:2\\",\\"begin\\":0.5625,\\"end\\":0.625,\\"speed\\":2,\\"pan\\":1,\\"room\\":0.6}",
-  "53/64 -> 27/32: {\\"s\\":\\"future:2\\",\\"begin\\":0.625,\\"end\\":0.6875,\\"speed\\":2,\\"pan\\":1,\\"room\\":0.6}",
-  "13/16 -> 53/64: {\\"s\\":\\"future:2\\",\\"begin\\":0.6875,\\"end\\":0.75,\\"speed\\":2,\\"pan\\":1,\\"room\\":0.6}",
-  "51/64 -> 13/16: {\\"s\\":\\"future:2\\",\\"begin\\":0.75,\\"end\\":0.8125,\\"speed\\":2,\\"pan\\":1,\\"room\\":0.6}",
-  "25/32 -> 51/64: {\\"s\\":\\"future:2\\",\\"begin\\":0.8125,\\"end\\":0.875,\\"speed\\":2,\\"pan\\":1,\\"room\\":0.6}",
-  "49/64 -> 25/32: {\\"s\\":\\"future:2\\",\\"begin\\":0.875,\\"end\\":0.9375,\\"speed\\":2,\\"pan\\":1,\\"room\\":0.6}",
-  "3/4 -> 49/64: {\\"s\\":\\"future:2\\",\\"begin\\":0.9375,\\"end\\":1,\\"speed\\":2,\\"pan\\":1,\\"room\\":0.6}",
-  "47/64 -> 3/4: {\\"s\\":\\"future:3\\",\\"begin\\":0,\\"end\\":0.0625,\\"speed\\":2,\\"pan\\":1,\\"room\\":0.6}",
-  "23/32 -> 47/64: {\\"s\\":\\"future:3\\",\\"begin\\":0.0625,\\"end\\":0.125,\\"speed\\":2,\\"pan\\":1,\\"room\\":0.6}",
-  "45/64 -> 23/32: {\\"s\\":\\"future:3\\",\\"begin\\":0.125,\\"end\\":0.1875,\\"speed\\":2,\\"pan\\":1,\\"room\\":0.6}",
-  "11/16 -> 45/64: {\\"s\\":\\"future:3\\",\\"begin\\":0.1875,\\"end\\":0.25,\\"speed\\":2,\\"pan\\":1,\\"room\\":0.6}",
-  "43/64 -> 11/16: {\\"s\\":\\"future:3\\",\\"begin\\":0.25,\\"end\\":0.3125,\\"speed\\":2,\\"pan\\":1,\\"room\\":0.6}",
-  "21/32 -> 43/64: {\\"s\\":\\"future:3\\",\\"begin\\":0.3125,\\"end\\":0.375,\\"speed\\":2,\\"pan\\":1,\\"room\\":0.6}",
-  "41/64 -> 21/32: {\\"s\\":\\"future:3\\",\\"begin\\":0.375,\\"end\\":0.4375,\\"speed\\":2,\\"pan\\":1,\\"room\\":0.6}",
-  "5/8 -> 41/64: {\\"s\\":\\"future:3\\",\\"begin\\":0.4375,\\"end\\":0.5,\\"speed\\":2,\\"pan\\":1,\\"room\\":0.6}",
-  "39/64 -> 5/8: {\\"s\\":\\"future:3\\",\\"begin\\":0.5,\\"end\\":0.5625,\\"speed\\":2,\\"pan\\":1,\\"room\\":0.6}",
-  "19/32 -> 39/64: {\\"s\\":\\"future:3\\",\\"begin\\":0.5625,\\"end\\":0.625,\\"speed\\":2,\\"pan\\":1,\\"room\\":0.6}",
-  "37/64 -> 19/32: {\\"s\\":\\"future:3\\",\\"begin\\":0.625,\\"end\\":0.6875,\\"speed\\":2,\\"pan\\":1,\\"room\\":0.6}",
-  "9/16 -> 37/64: {\\"s\\":\\"future:3\\",\\"begin\\":0.6875,\\"end\\":0.75,\\"speed\\":2,\\"pan\\":1,\\"room\\":0.6}",
-  "35/64 -> 9/16: {\\"s\\":\\"future:3\\",\\"begin\\":0.75,\\"end\\":0.8125,\\"speed\\":2,\\"pan\\":1,\\"room\\":0.6}",
-  "17/32 -> 35/64: {\\"s\\":\\"future:3\\",\\"begin\\":0.8125,\\"end\\":0.875,\\"speed\\":2,\\"pan\\":1,\\"room\\":0.6}",
-  "33/64 -> 17/32: {\\"s\\":\\"future:3\\",\\"begin\\":0.875,\\"end\\":0.9375,\\"speed\\":2,\\"pan\\":1,\\"room\\":0.6}",
-  "1/2 -> 33/64: {\\"s\\":\\"future:3\\",\\"begin\\":0.9375,\\"end\\":1,\\"speed\\":2,\\"pan\\":1,\\"room\\":0.6}",
-  "15/32 -> 1/2: {\\"s\\":\\"sd\\",\\"begin\\":0,\\"end\\":0.0625,\\"pan\\":1,\\"room\\":0.6}",
-  "7/16 -> 15/32: {\\"s\\":\\"sd\\",\\"begin\\":0.0625,\\"end\\":0.125,\\"pan\\":1,\\"room\\":0.6}",
-  "13/32 -> 7/16: {\\"s\\":\\"sd\\",\\"begin\\":0.125,\\"end\\":0.1875,\\"pan\\":1,\\"room\\":0.6}",
-  "3/8 -> 13/32: {\\"s\\":\\"sd\\",\\"begin\\":0.1875,\\"end\\":0.25,\\"pan\\":1,\\"room\\":0.6}",
-  "11/32 -> 3/8: {\\"s\\":\\"sd\\",\\"begin\\":0.25,\\"end\\":0.3125,\\"pan\\":1,\\"room\\":0.6}",
-  "5/16 -> 11/32: {\\"s\\":\\"sd\\",\\"begin\\":0.3125,\\"end\\":0.375,\\"pan\\":1,\\"room\\":0.6}",
-  "9/32 -> 5/16: {\\"s\\":\\"sd\\",\\"begin\\":0.375,\\"end\\":0.4375,\\"pan\\":1,\\"room\\":0.6}",
-  "1/4 -> 9/32: {\\"s\\":\\"sd\\",\\"begin\\":0.4375,\\"end\\":0.5,\\"pan\\":1,\\"room\\":0.6}",
-  "7/32 -> 1/4: {\\"s\\":\\"sd\\",\\"begin\\":0.5,\\"end\\":0.5625,\\"pan\\":1,\\"room\\":0.6}",
-  "3/16 -> 7/32: {\\"s\\":\\"sd\\",\\"begin\\":0.5625,\\"end\\":0.625,\\"pan\\":1,\\"room\\":0.6}",
-  "5/32 -> 3/16: {\\"s\\":\\"sd\\",\\"begin\\":0.625,\\"end\\":0.6875,\\"pan\\":1,\\"room\\":0.6}",
-  "1/8 -> 5/32: {\\"s\\":\\"sd\\",\\"begin\\":0.6875,\\"end\\":0.75,\\"pan\\":1,\\"room\\":0.6}",
-  "3/32 -> 1/8: {\\"s\\":\\"sd\\",\\"begin\\":0.75,\\"end\\":0.8125,\\"pan\\":1,\\"room\\":0.6}",
-  "1/16 -> 3/32: {\\"s\\":\\"sd\\",\\"begin\\":0.8125,\\"end\\":0.875,\\"pan\\":1,\\"room\\":0.6}",
-  "1/32 -> 1/16: {\\"s\\":\\"sd\\",\\"begin\\":0.875,\\"end\\":0.9375,\\"pan\\":1,\\"room\\":0.6}",
-  "0/1 -> 1/32: {\\"s\\":\\"sd\\",\\"begin\\":0.9375,\\"end\\":1,\\"pan\\":1,\\"room\\":0.6}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 296 https://strudel.cc/?Z1mqx-eU-KcX 1`] = `
-[
-  "0/1 -> 831675/814544: {\\"note\\":\\"D0\\",\\"s\\":\\"bell\\",\\"gain\\":0.6,\\"delay\\":0.2,\\"delaytime\\":0.3333333333333333,\\"delayfeedback\\":0.8}",
-  "3/4 -> 1442583/814544: {\\"note\\":\\"A-1\\",\\"s\\":\\"bell\\",\\"gain\\":0.6,\\"delay\\":0.2,\\"delaytime\\":0.3333333333333333,\\"delayfeedback\\":0.8}",
-  "-3/8 -> 62249/203636: {\\"note\\":\\"C4\\",\\"s\\":\\"bell\\",\\"gain\\":0.6,\\"delay\\":0.2,\\"delaytime\\":0.3333333333333333,\\"delayfeedback\\":0.8}",
-  "1/8 -> 933493/814544: {\\"note\\":\\"A1\\",\\"s\\":\\"bell\\",\\"gain\\":0.6,\\"delay\\":0.2,\\"delaytime\\":0.3333333333333333,\\"delayfeedback\\":0.8}",
-  "7/8 -> 1544401/814544: {\\"note\\":\\"G-1\\",\\"s\\":\\"bell\\",\\"gain\\":0.6,\\"delay\\":0.2,\\"delaytime\\":0.3333333333333333,\\"delayfeedback\\":0.8}",
-  "-1/4 -> 175407/407272: {\\"note\\":\\"G6\\",\\"s\\":\\"bell\\",\\"gain\\":0.6,\\"delay\\":0.2,\\"delaytime\\":0.3333333333333333,\\"delayfeedback\\":0.8}",
-  "1/4 -> 1035311/814544: {\\"note\\":\\"C4\\",\\"s\\":\\"bell\\",\\"gain\\":0.6,\\"delay\\":0.2,\\"delaytime\\":0.3333333333333333,\\"delayfeedback\\":0.8}",
-  "0/1 -> 1/2: {\\"note\\":\\"D2\\",\\"s\\":\\"bass\\",\\"clip\\":1,\\"gain\\":0.8}",
-  "1/2 -> 3/4: {\\"note\\":\\"D2\\",\\"s\\":\\"bass\\",\\"clip\\":1,\\"gain\\":0.8}",
-  "3/4 -> 1/1: {\\"note\\":\\"D2\\",\\"s\\":\\"bass\\",\\"clip\\":1,\\"gain\\":0.8}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 297 https://strudel.cc/?Ypr_TlVFjVV5 1`] = `
-[
-  "0/1 -> 1/4: {\\"s\\":\\"p\\",\\"speed\\":0.03125,\\"unit\\":\\"c\\",\\"begin\\":0,\\"end\\":0.0078125,\\"pan\\":0,\\"shape\\":0.4,\\"decay\\":0.1,\\"sustain\\":0.6}",
-  "1/4 -> 1/2: {\\"s\\":\\"p\\",\\"speed\\":0.03125,\\"unit\\":\\"c\\",\\"begin\\":0.0078125,\\"end\\":0.015625,\\"pan\\":0,\\"shape\\":0.4,\\"decay\\":0.1,\\"sustain\\":0.6}",
-  "1/2 -> 3/4: {\\"s\\":\\"p\\",\\"speed\\":0.03125,\\"unit\\":\\"c\\",\\"begin\\":0.015625,\\"end\\":0.0234375,\\"pan\\":0,\\"shape\\":0.4,\\"decay\\":0.1,\\"sustain\\":0.6}",
-  "3/4 -> 1/1: {\\"s\\":\\"p\\",\\"speed\\":0.03125,\\"unit\\":\\"c\\",\\"begin\\":0.0234375,\\"end\\":0.03125,\\"pan\\":0,\\"shape\\":0.4,\\"decay\\":0.1,\\"sustain\\":0.6}",
-  "3/4 -> 1/1: {\\"s\\":\\"p\\",\\"speed\\":0.03125,\\"unit\\":\\"c\\",\\"begin\\":0,\\"end\\":0.0078125,\\"pan\\":1,\\"shape\\":0.4,\\"decay\\":0.1,\\"sustain\\":0.6}",
-  "1/2 -> 3/4: {\\"s\\":\\"p\\",\\"speed\\":0.03125,\\"unit\\":\\"c\\",\\"begin\\":0.0078125,\\"end\\":0.015625,\\"pan\\":1,\\"shape\\":0.4,\\"decay\\":0.1,\\"sustain\\":0.6}",
-  "1/4 -> 1/2: {\\"s\\":\\"p\\",\\"speed\\":0.03125,\\"unit\\":\\"c\\",\\"begin\\":0.015625,\\"end\\":0.0234375,\\"pan\\":1,\\"shape\\":0.4,\\"decay\\":0.1,\\"sustain\\":0.6}",
-  "0/1 -> 1/4: {\\"s\\":\\"p\\",\\"speed\\":0.03125,\\"unit\\":\\"c\\",\\"begin\\":0.0234375,\\"end\\":0.03125,\\"pan\\":1,\\"shape\\":0.4,\\"decay\\":0.1,\\"sustain\\":0.6}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 298 https://strudel.cc/?5pmvveRR-gKc 1`] = `
-[
-  "0/1 -> 1/1: D3",
-  "0/1 -> 2/1: E3",
-  "0/1 -> 4/1: D2",
-  "0/1 -> 1/2: B3",
-  "-1/1 -> 1/1: C#3",
-  "0/1 -> 2/1: C#3",
-  "0/1 -> 1/4: E2",
-  "-1/1 -> 1/1: B2",
-  "0/1 -> 1/1: D3",
-  "0/1 -> 2/1: E3",
-  "0/1 -> 4/1: D2",
-  "0/1 -> 1/2: B3",
-  "-1/1 -> 1/1: C#3",
-  "0/1 -> 2/1: C#3",
-  "0/1 -> 1/4: E2",
-  "-1/1 -> 1/1: B2",
-  "0/1 -> 1/1: D3",
-  "0/1 -> 2/1: E3",
-  "0/1 -> 4/1: D2",
-  "0/1 -> 1/2: B3",
-  "-1/1 -> 1/1: C#3",
-  "0/1 -> 2/1: C#3",
-  "0/1 -> 1/4: E2",
-  "-1/1 -> 1/1: B2",
-  "0/1 -> 1/1: D3",
-  "0/1 -> 2/1: E3",
-  "0/1 -> 4/1: D2",
-  "0/1 -> 1/2: B3",
-  "-1/1 -> 1/1: C#3",
-  "0/1 -> 2/1: C#3",
-  "-1/1 -> 1/1: B2",
-  "0/1 -> 1/1: D3",
-  "0/1 -> 2/1: E3",
-  "0/1 -> 4/1: D2",
-  "0/1 -> 1/2: B3",
-  "-1/1 -> 1/1: C#3",
-  "0/1 -> 2/1: C#3",
-  "-1/1 -> 1/1: B2",
-  "0/1 -> 1/1: D3",
-  "0/1 -> 2/1: E3",
-  "0/1 -> 4/1: D2",
-  "0/1 -> 1/2: B3",
-  "-1/1 -> 1/1: C#3",
-  "0/1 -> 2/1: C#3",
-  "-1/1 -> 1/1: B2",
-  "1/2 -> 1/1: B2",
-  "0/1 -> 1/1: D3",
-  "0/1 -> 2/1: E3",
-  "0/1 -> 4/1: D2",
-  "-1/1 -> 1/1: C#3",
-  "0/1 -> 2/1: C#3",
-  "-1/1 -> 1/1: B2",
-  "1/2 -> 1/1: B2",
-  "0/1 -> 1/1: D3",
-  "0/1 -> 2/1: E3",
-  "0/1 -> 4/1: D2",
-  "-1/1 -> 1/1: C#3",
-  "0/1 -> 2/1: C#3",
-  "3/4 -> 1/1: G2",
-  "-1/1 -> 1/1: B2",
-  "1/2 -> 1/1: B2",
-  "0/1 -> 1/1: D3",
-  "0/1 -> 2/1: E3",
-  "0/1 -> 4/1: D2",
-  "-1/1 -> 1/1: C#3",
-  "0/1 -> 2/1: C#3",
-  "3/4 -> 1/1: G2",
-  "-1/1 -> 1/1: B2",
-  "1/2 -> 1/1: B2",
-  "0/1 -> 1/1: D3",
-  "0/1 -> 2/1: E3",
-  "0/1 -> 4/1: D2",
-  "-1/1 -> 1/1: C#3",
-  "0/1 -> 2/1: C#3",
-  "3/4 -> 1/1: G2",
-  "-1/1 -> 1/1: B2",
-  "1/2 -> 1/1: B2",
-  "0/1 -> 1/1: D3",
-  "0/1 -> 2/1: E3",
-  "0/1 -> 4/1: D2",
-  "-1/1 -> 1/1: C#3",
-  "0/1 -> 2/1: C#3",
-  "3/4 -> 1/1: G2",
-  "-1/1 -> 1/1: B2",
-  "1/2 -> 1/1: B2",
-]
-`;
-
-exports[`renders shared tunes > shared tune 299 https://strudel.cc/?rGJ0heffHHl4 1`] = `
-[
-  "0/1 -> 1/2: {\\"s\\":\\"bd\\",\\"gain\\":0.8}",
-  "1/2 -> 1/1: {\\"s\\":\\"bd\\",\\"gain\\":0.8}",
-  "1/2 -> 1/1: {\\"s\\":\\"sd\\",\\"gain\\":0.5}",
-  "1/4 -> 1/2: {\\"s\\":\\"hh\\",\\"delay\\":0.3,\\"delayfeedback\\":0.5,\\"delaytime\\":0.125,\\"gain\\":0.4}",
-  "3/4 -> 1/1: {\\"s\\":\\"hh\\",\\"delay\\":0.3,\\"delayfeedback\\":0.5,\\"delaytime\\":0.125,\\"gain\\":0.4}",
-  "0/1 -> 1/2: {\\"note\\":\\"B1\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":1,\\"cutoff\\":500}",
-  "3/4 -> 1/1: {\\"note\\":\\"B1\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0.001,\\"decay\\":0.2,\\"sustain\\":1,\\"cutoff\\":500}",
-  "1/4 -> 1/3: {\\"note\\":\\"A3\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":1200,\\"gain\\":0.5,\\"attack\\":0,\\"decay\\":0.16,\\"sustain\\":0,\\"release\\":0.1,\\"delay\\":0.4,\\"delaytime\\":0.12}",
-  "1/4 -> 1/3: {\\"note\\":\\"C#4\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":1200,\\"gain\\":0.5,\\"attack\\":0,\\"decay\\":0.16,\\"sustain\\":0,\\"release\\":0.1,\\"delay\\":0.4,\\"delaytime\\":0.12}",
-  "1/4 -> 1/3: {\\"note\\":\\"D4\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":1200,\\"gain\\":0.5,\\"attack\\":0,\\"decay\\":0.16,\\"sustain\\":0,\\"release\\":0.1,\\"delay\\":0.4,\\"delaytime\\":0.12}",
-  "1/4 -> 1/3: {\\"note\\":\\"F#4\\",\\"s\\":\\"sawtooth\\",\\"cutoff\\":1200,\\"gain\\":0.5,\\"attack\\":0,\\"decay\\":0.16,\\"sustain\\":0,\\"release\\":0.1,\\"delay\\":0.4,\\"delaytime\\":0.12}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 300 https://strudel.cc/?Z7Nxzf3lmgTN 1`] = `
-[
-  "0/1 -> 8/1: {\\"note\\":\\"e3\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.2,\\"sustain\\":0.3,\\"release\\":0.1,\\"bandf\\":100,\\"bandq\\":1,\\"gain\\":3}",
-  "0/1 -> 8/1: {\\"note\\":\\"b4\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.2,\\"sustain\\":0.3,\\"release\\":0.1,\\"bandf\\":100,\\"bandq\\":1,\\"gain\\":3}",
-  "0/1 -> 8/1: {\\"note\\":\\"d4\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.2,\\"sustain\\":0.3,\\"release\\":0.1,\\"bandf\\":100,\\"bandq\\":1,\\"gain\\":3}",
-  "0/1 -> 8/1: {\\"note\\":\\"a4\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.2,\\"sustain\\":0.3,\\"release\\":0.1,\\"bandf\\":100,\\"bandq\\":1,\\"gain\\":3}",
-  "2/3 -> 1/1: {\\"s\\":\\"hh\\"}",
-  "1/2 -> 2/3: {\\"s\\":\\"hh\\"}",
-  "1/3 -> 1/2: {\\"s\\":\\"hh\\"}",
-  "1/6 -> 1/3: {\\"s\\":\\"hh\\"}",
-  "1/12 -> 1/6: {\\"s\\":\\"hh\\"}",
-  "0/1 -> 1/12: {\\"s\\":\\"hh\\"}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 301 https://strudel.cc/?e63x61eOPPvl 1`] = `
-[
-  "0/1 -> 8/1: {\\"note\\":\\"e3\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.2,\\"sustain\\":0.3,\\"release\\":0.1,\\"bandf\\":100,\\"bandq\\":1,\\"gain\\":3}",
-  "0/1 -> 8/1: {\\"note\\":\\"b4\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.2,\\"sustain\\":0.3,\\"release\\":0.1,\\"bandf\\":100,\\"bandq\\":1,\\"gain\\":3}",
-  "0/1 -> 8/1: {\\"note\\":\\"a4\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.2,\\"sustain\\":0.3,\\"release\\":0.1,\\"bandf\\":100,\\"bandq\\":1,\\"gain\\":3}",
-  "0/1 -> 8/1: {\\"note\\":\\"g#4\\",\\"s\\":\\"sawtooth\\",\\"attack\\":0.1,\\"decay\\":0.2,\\"sustain\\":0.3,\\"release\\":0.1,\\"bandf\\":100,\\"bandq\\":1,\\"gain\\":3}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 302 https://strudel.cc/?bUd8QxyN4kvJ 1`] = `
-[
-  "0/1 -> 1/8: {\\"note\\":\\"g4\\",\\"s\\":\\"xx\\",\\"cutoff\\":2348.1232826650858,\\"room\\":0.8,\\"pan\\":0,\\"gain\\":0.5}",
-  "3/8 -> 1/2: {\\"note\\":\\"g4\\",\\"s\\":\\"xx\\",\\"cutoff\\":2919.6960066389074,\\"room\\":0.8,\\"pan\\":0,\\"gain\\":0.5}",
-  "3/4 -> 7/8: {\\"note\\":\\"g4\\",\\"s\\":\\"xx\\",\\"cutoff\\":3416.106511416007,\\"room\\":0.8,\\"pan\\":0,\\"gain\\":0.5}",
-  "-1/4 -> 1/4: {\\"note\\":\\"c5\\",\\"n\\":7,\\"s\\":\\"xx\\",\\"cutoff\\":2445.9378331807884,\\"room\\":0.8,\\"pan\\":0,\\"gain\\":0.5}",
-  "1/4 -> 3/8: {\\"note\\":\\"g4\\",\\"n\\":7,\\"s\\":\\"xx\\",\\"cutoff\\":2734.462144993486,\\"room\\":0.8,\\"pan\\":0,\\"gain\\":0.5}",
-  "5/8 -> 3/4: {\\"note\\":\\"g4\\",\\"n\\":7,\\"s\\":\\"xx\\",\\"cutoff\\":3262.67476831466,\\"room\\":0.8,\\"pan\\":0,\\"gain\\":0.5}",
-  "-3/8 -> 1/8: {\\"note\\":\\"c5\\",\\"n\\":12,\\"s\\":\\"xx\\",\\"cutoff\\":2348.1232826650858,\\"room\\":0.8,\\"pan\\":0,\\"gain\\":0.5}",
-  "1/8 -> 1/4: {\\"note\\":\\"g4\\",\\"n\\":12,\\"s\\":\\"xx\\",\\"cutoff\\":2543.1358907832887,\\"room\\":0.8,\\"pan\\":0,\\"gain\\":0.5}",
-  "1/2 -> 5/8: {\\"note\\":\\"g4\\",\\"n\\":12,\\"s\\":\\"xx\\",\\"cutoff\\":3096.5080524341697,\\"room\\":0.8,\\"pan\\":0,\\"gain\\":0.5}",
-  "7/8 -> 1/1: {\\"note\\":\\"g4\\",\\"n\\":12,\\"s\\":\\"xx\\",\\"cutoff\\":3554.87378854554,\\"room\\":0.8,\\"pan\\":0,\\"gain\\":0.5}",
-  "-1/8 -> 3/8: {\\"note\\":\\"c5\\",\\"n\\":19,\\"s\\":\\"xx\\",\\"cutoff\\":2543.1358907832887,\\"room\\":0.8,\\"pan\\":0,\\"gain\\":0.5}",
-  "-1/8 -> 3/8: {\\"note\\":\\"c5\\",\\"n\\":19,\\"s\\":\\"xx\\",\\"cutoff\\":2543.1358907832887,\\"room\\":0.8,\\"pan\\":0,\\"gain\\":0.5}",
-  "3/8 -> 1/2: {\\"note\\":\\"g4\\",\\"n\\":19,\\"s\\":\\"xx\\",\\"cutoff\\":2919.6960066389074,\\"room\\":0.8,\\"pan\\":0,\\"gain\\":0.5}",
-  "3/4 -> 7/8: {\\"note\\":\\"g4\\",\\"n\\":19,\\"s\\":\\"xx\\",\\"cutoff\\":3416.106511416007,\\"room\\":0.8,\\"pan\\":0,\\"gain\\":0.5}",
-  "7/8 -> 1/1: {\\"note\\":\\"g4\\",\\"s\\":\\"xx\\",\\"cutoff\\":2348.1232826650858,\\"room\\":0.8,\\"pan\\":1,\\"gain\\":0.5}",
-  "1/2 -> 5/8: {\\"note\\":\\"g4\\",\\"s\\":\\"xx\\",\\"cutoff\\":2919.6960066389074,\\"room\\":0.8,\\"pan\\":1,\\"gain\\":0.5}",
-  "1/8 -> 1/4: {\\"note\\":\\"g4\\",\\"s\\":\\"xx\\",\\"cutoff\\":3416.106511416007,\\"room\\":0.8,\\"pan\\":1,\\"gain\\":0.5}",
-  "3/4 -> 5/4: {\\"note\\":\\"c5\\",\\"n\\":7,\\"s\\":\\"xx\\",\\"cutoff\\":2445.9378331807884,\\"room\\":0.8,\\"pan\\":1,\\"gain\\":0.5}",
-  "5/8 -> 3/4: {\\"note\\":\\"g4\\",\\"n\\":7,\\"s\\":\\"xx\\",\\"cutoff\\":2734.462144993486,\\"room\\":0.8,\\"pan\\":1,\\"gain\\":0.5}",
-  "1/4 -> 3/8: {\\"note\\":\\"g4\\",\\"n\\":7,\\"s\\":\\"xx\\",\\"cutoff\\":3262.67476831466,\\"room\\":0.8,\\"pan\\":1,\\"gain\\":0.5}",
-  "7/8 -> 11/8: {\\"note\\":\\"c5\\",\\"n\\":12,\\"s\\":\\"xx\\",\\"cutoff\\":2348.1232826650858,\\"room\\":0.8,\\"pan\\":1,\\"gain\\":0.5}",
-  "3/4 -> 7/8: {\\"note\\":\\"g4\\",\\"n\\":12,\\"s\\":\\"xx\\",\\"cutoff\\":2543.1358907832887,\\"room\\":0.8,\\"pan\\":1,\\"gain\\":0.5}",
-  "3/8 -> 1/2: {\\"note\\":\\"g4\\",\\"n\\":12,\\"s\\":\\"xx\\",\\"cutoff\\":3096.5080524341697,\\"room\\":0.8,\\"pan\\":1,\\"gain\\":0.5}",
-  "0/1 -> 1/8: {\\"note\\":\\"g4\\",\\"n\\":12,\\"s\\":\\"xx\\",\\"cutoff\\":3554.87378854554,\\"room\\":0.8,\\"pan\\":1,\\"gain\\":0.5}",
-  "5/8 -> 9/8: {\\"note\\":\\"c5\\",\\"n\\":19,\\"s\\":\\"xx\\",\\"cutoff\\":2543.1358907832887,\\"room\\":0.8,\\"pan\\":1,\\"gain\\":0.5}",
-  "5/8 -> 9/8: {\\"note\\":\\"c5\\",\\"n\\":19,\\"s\\":\\"xx\\",\\"cutoff\\":2543.1358907832887,\\"room\\":0.8,\\"pan\\":1,\\"gain\\":0.5}",
-  "1/2 -> 5/8: {\\"note\\":\\"g4\\",\\"n\\":19,\\"s\\":\\"xx\\",\\"cutoff\\":2919.6960066389074,\\"room\\":0.8,\\"pan\\":1,\\"gain\\":0.5}",
-  "1/8 -> 1/4: {\\"note\\":\\"g4\\",\\"n\\":19,\\"s\\":\\"xx\\",\\"cutoff\\":3416.106511416007,\\"room\\":0.8,\\"pan\\":1,\\"gain\\":0.5}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 303 https://strudel.cc/?y5PdLktz5gnb 1`] = `
-[
-  "0/1 -> 1/4: {\\"note\\":\\"e3\\",\\"s\\":\\"sawtooth\\",\\"decay\\":0.1,\\"sustain\\":0.1,\\"bandf\\":50,\\"bandq\\":0.5,\\"gain\\":3.8519497029047303}",
-  "1/4 -> 1/2: {\\"note\\":\\"e3\\",\\"s\\":\\"sawtooth\\",\\"decay\\":0.1,\\"sustain\\":0.1,\\"bandf\\":50,\\"bandq\\":0.5,\\"gain\\":2.22836140246614}",
-  "1/2 -> 3/4: {\\"note\\":\\"e3\\",\\"s\\":\\"sawtooth\\",\\"decay\\":0.1,\\"sustain\\":0.1,\\"bandf\\":50,\\"bandq\\":0.5,\\"gain\\":2.22836140246614}",
-  "3/4 -> 1/1: {\\"note\\":\\"e3\\",\\"s\\":\\"sawtooth\\",\\"decay\\":0.1,\\"sustain\\":0.1,\\"bandf\\":50,\\"bandq\\":0.5,\\"gain\\":3.8519497029047303}",
-  "0/1 -> 1/4: {\\"note\\":\\"b4\\",\\"s\\":\\"sawtooth\\",\\"decay\\":0.1,\\"sustain\\":0.1,\\"bandf\\":50,\\"bandq\\":0.5,\\"gain\\":3.8519497029047303}",
-  "1/4 -> 1/2: {\\"note\\":\\"b4\\",\\"s\\":\\"sawtooth\\",\\"decay\\":0.1,\\"sustain\\":0.1,\\"bandf\\":50,\\"bandq\\":0.5,\\"gain\\":2.22836140246614}",
-  "1/2 -> 3/4: {\\"note\\":\\"b4\\",\\"s\\":\\"sawtooth\\",\\"decay\\":0.1,\\"sustain\\":0.1,\\"bandf\\":50,\\"bandq\\":0.5,\\"gain\\":2.22836140246614}",
-  "3/4 -> 1/1: {\\"note\\":\\"b4\\",\\"s\\":\\"sawtooth\\",\\"decay\\":0.1,\\"sustain\\":0.1,\\"bandf\\":50,\\"bandq\\":0.5,\\"gain\\":3.8519497029047303}",
-  "0/1 -> 1/4: {\\"note\\":\\"a4\\",\\"s\\":\\"sawtooth\\",\\"decay\\":0.1,\\"sustain\\":0.1,\\"bandf\\":50,\\"bandq\\":0.5,\\"gain\\":3.8519497029047303}",
-  "1/4 -> 1/2: {\\"note\\":\\"a4\\",\\"s\\":\\"sawtooth\\",\\"decay\\":0.1,\\"sustain\\":0.1,\\"bandf\\":50,\\"bandq\\":0.5,\\"gain\\":2.22836140246614}",
-  "1/2 -> 3/4: {\\"note\\":\\"a4\\",\\"s\\":\\"sawtooth\\",\\"decay\\":0.1,\\"sustain\\":0.1,\\"bandf\\":50,\\"bandq\\":0.5,\\"gain\\":2.22836140246614}",
-  "3/4 -> 1/1: {\\"note\\":\\"a4\\",\\"s\\":\\"sawtooth\\",\\"decay\\":0.1,\\"sustain\\":0.1,\\"bandf\\":50,\\"bandq\\":0.5,\\"gain\\":3.8519497029047303}",
-  "0/1 -> 1/4: {\\"note\\":\\"g#4\\",\\"s\\":\\"sawtooth\\",\\"decay\\":0.1,\\"sustain\\":0.1,\\"bandf\\":50,\\"bandq\\":0.5,\\"gain\\":3.8519497029047303}",
-  "1/4 -> 1/2: {\\"note\\":\\"g#4\\",\\"s\\":\\"sawtooth\\",\\"decay\\":0.1,\\"sustain\\":0.1,\\"bandf\\":50,\\"bandq\\":0.5,\\"gain\\":2.22836140246614}",
-  "1/2 -> 3/4: {\\"note\\":\\"g#4\\",\\"s\\":\\"sawtooth\\",\\"decay\\":0.1,\\"sustain\\":0.1,\\"bandf\\":50,\\"bandq\\":0.5,\\"gain\\":2.22836140246614}",
-  "3/4 -> 1/1: {\\"note\\":\\"g#4\\",\\"s\\":\\"sawtooth\\",\\"decay\\":0.1,\\"sustain\\":0.1,\\"bandf\\":50,\\"bandq\\":0.5,\\"gain\\":3.8519497029047303}",
-  "0/1 -> 2/1: {\\"s\\":\\"bd\\",\\"decay\\":0.1}",
-  "3/4 -> 1/1: {\\"s\\":\\"hh\\",\\"gain\\":0.4}",
-  "1/2 -> 3/4: {\\"s\\":\\"hh\\",\\"gain\\":1}",
-  "1/4 -> 1/2: {\\"s\\":\\"hh\\",\\"gain\\":0.4}",
-  "0/1 -> 1/4: {\\"s\\":\\"hh\\",\\"gain\\":1}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 304 https://strudel.cc/?BpChMc3nxrYv 1`] = `
-[
-  "0/1 -> 3/2: {\\"s\\":\\"bd\\",\\"speed\\":0.7519542165100574}",
-  "3/4 -> 3/2: {\\"s\\":\\"sd\\",\\"speed\\":0.7931522866332671}",
-  "3/8 -> 3/4: {\\"s\\":\\"hh\\",\\"speed\\":0.7285963821098448}",
-  "3/4 -> 9/8: {\\"s\\":\\"hh\\",\\"speed\\":0.77531205091027}",
-  "0/1 -> 3/2: {\\"n\\":33.129885541275144,\\"decay\\":0.15,\\"sustain\\":0,\\"s\\":\\"sawtooth\\",\\"gain\\":0.4,\\"cutoff\\":3669.6267869262615}",
-  "0/1 -> 3/2: {\\"n\\":33.17988554127514,\\"decay\\":0.15,\\"sustain\\":0,\\"s\\":\\"sawtooth\\",\\"gain\\":0.4,\\"cutoff\\":3669.6267869262615}",
-  "0/1 -> 3/2: {\\"n\\":55.129885541275144,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":59.129885541275144,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":60.129885541275144,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":64.12988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":55.16988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":59.16988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":60.16988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":64.16988554127515,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "3/16 -> 3/8: {\\"n\\":69.01266877519555,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/8 -> 9/16: {\\"n\\":69.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/8 -> 9/16: {\\"n\\":72.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/4 -> 15/16: {\\"n\\":72.16001184806132,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "15/16 -> 9/8: {\\"n\\":72.21301072199333,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/16 -> 3/8: {\\"n\\":69.05266877519557,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/8 -> 9/16: {\\"n\\":69.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/8 -> 9/16: {\\"n\\":72.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/4 -> 15/16: {\\"n\\":72.20001184806131,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "15/16 -> 9/8: {\\"n\\":72.25301072199335,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "0/1 -> 3/16: {\\"n\\":93.00057728554401,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "0/1 -> 3/16: {\\"n\\":93.04057728554402,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "3/8 -> 9/16: {\\"n\\":69.01266877519555,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "9/16 -> 3/4: {\\"n\\":69.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "9/16 -> 3/4: {\\"n\\":72.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "15/16 -> 9/8: {\\"n\\":72.16001184806132,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "3/8 -> 9/16: {\\"n\\":69.05266877519557,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "9/16 -> 3/4: {\\"n\\":69.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "9/16 -> 3/4: {\\"n\\":72.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "15/16 -> 9/8: {\\"n\\":72.20001184806131,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "3/16 -> 3/8: {\\"n\\":93.00057728554401,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "3/16 -> 3/8: {\\"n\\":93.04057728554402,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "9/16 -> 3/4: {\\"n\\":69.01266877519555,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "3/4 -> 15/16: {\\"n\\":69.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "3/4 -> 15/16: {\\"n\\":72.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "9/16 -> 3/4: {\\"n\\":69.05266877519557,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "3/4 -> 15/16: {\\"n\\":69.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "3/4 -> 15/16: {\\"n\\":72.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "0/1 -> 3/16: {\\"n\\":72.0468455057745,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "0/1 -> 3/16: {\\"n\\":93.0468455057745,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "3/8 -> 9/16: {\\"n\\":93.00057728554401,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "0/1 -> 3/16: {\\"n\\":72.0868455057745,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "0/1 -> 3/16: {\\"n\\":93.0868455057745,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "3/8 -> 9/16: {\\"n\\":93.04057728554402,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "3/4 -> 15/16: {\\"n\\":69.01266877519555,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "15/16 -> 9/8: {\\"n\\":69.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "3/4 -> 15/16: {\\"n\\":69.05266877519557,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "15/16 -> 9/8: {\\"n\\":69.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 305 https://strudel.cc/?Swuvt887AOe1 1`] = `
-[
-  "0/1 -> 3/2: {\\"s\\":\\"bd\\",\\"speed\\":0.7519542165100574}",
-  "3/4 -> 3/2: {\\"s\\":\\"sd\\",\\"speed\\":0.7931522866332671}",
-  "3/8 -> 3/4: {\\"s\\":\\"hh\\",\\"speed\\":0.7285963821098448}",
-  "3/4 -> 9/8: {\\"s\\":\\"hh\\",\\"speed\\":0.77531205091027}",
-  "0/1 -> 3/2: {\\"n\\":33.129885541275144,\\"decay\\":0.15,\\"sustain\\":0,\\"s\\":\\"sawtooth\\",\\"gain\\":0.4,\\"cutoff\\":3669.6267869262615}",
-  "0/1 -> 3/2: {\\"n\\":33.17988554127514,\\"decay\\":0.15,\\"sustain\\":0,\\"s\\":\\"sawtooth\\",\\"gain\\":0.4,\\"cutoff\\":3669.6267869262615}",
-  "0/1 -> 3/2: {\\"n\\":55.129885541275144,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":59.129885541275144,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":60.129885541275144,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":64.12988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":55.16988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":59.16988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":60.16988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 3/2: {\\"n\\":64.16988554127515,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "3/16 -> 3/8: {\\"n\\":69.01266877519555,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/8 -> 9/16: {\\"n\\":69.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/8 -> 9/16: {\\"n\\":72.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/4 -> 15/16: {\\"n\\":72.16001184806132,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "15/16 -> 9/8: {\\"n\\":72.21301072199333,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/16 -> 3/8: {\\"n\\":69.05266877519557,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/8 -> 9/16: {\\"n\\":69.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/8 -> 9/16: {\\"n\\":72.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "3/4 -> 15/16: {\\"n\\":72.20001184806131,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "15/16 -> 9/8: {\\"n\\":72.25301072199335,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "0/1 -> 3/16: {\\"n\\":93.00057728554401,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "0/1 -> 3/16: {\\"n\\":93.04057728554402,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "3/8 -> 9/16: {\\"n\\":69.01266877519555,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "9/16 -> 3/4: {\\"n\\":69.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "9/16 -> 3/4: {\\"n\\":72.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "15/16 -> 9/8: {\\"n\\":72.16001184806132,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "3/8 -> 9/16: {\\"n\\":69.05266877519557,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "9/16 -> 3/4: {\\"n\\":69.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "9/16 -> 3/4: {\\"n\\":72.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "15/16 -> 9/8: {\\"n\\":72.20001184806131,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "3/16 -> 3/8: {\\"n\\":93.00057728554401,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "3/16 -> 3/8: {\\"n\\":93.04057728554402,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "9/16 -> 3/4: {\\"n\\":69.01266877519555,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "3/4 -> 15/16: {\\"n\\":69.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "3/4 -> 15/16: {\\"n\\":72.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "9/16 -> 3/4: {\\"n\\":69.05266877519557,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "3/4 -> 15/16: {\\"n\\":69.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "3/4 -> 15/16: {\\"n\\":72.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "0/1 -> 3/16: {\\"n\\":72.0468455057745,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "0/1 -> 3/16: {\\"n\\":93.0468455057745,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "3/8 -> 9/16: {\\"n\\":93.00057728554401,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "0/1 -> 3/16: {\\"n\\":72.0868455057745,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "0/1 -> 3/16: {\\"n\\":93.0868455057745,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "3/8 -> 9/16: {\\"n\\":93.04057728554402,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "3/4 -> 15/16: {\\"n\\":69.01266877519555,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "15/16 -> 9/8: {\\"n\\":69.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "3/4 -> 15/16: {\\"n\\":69.05266877519557,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "15/16 -> 9/8: {\\"n\\":69.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 306 https://strudel.cc/?UboMuFOnT0hy 1`] = `
-[
-  "0/1 -> 1/3: {\\"s\\":\\"bd\\"}",
-  "1/3 -> 2/3: {\\"s\\":\\"hh\\"}",
-  "2/3 -> 1/1: {\\"s\\":\\"sn\\"}",
-  "0/1 -> 1/20: {\\"note\\":\\"G4\\",\\"s\\":\\"rhodes\\",\\"clip\\":1,\\"room\\":0.5,\\"delay\\":0.3,\\"delayfeedback\\":0.4,\\"delaytime\\":0.08333333333333333,\\"gain\\":0.5}",
-  "1/6 -> 13/60: {\\"note\\":\\"G4\\",\\"s\\":\\"rhodes\\",\\"clip\\":1,\\"room\\":0.5,\\"delay\\":0.3,\\"delayfeedback\\":0.4,\\"delaytime\\":0.08333333333333333,\\"gain\\":0.5}",
-  "1/3 -> 23/60: {\\"note\\":\\"B3\\",\\"s\\":\\"rhodes\\",\\"clip\\":1,\\"room\\":0.5,\\"delay\\":0.3,\\"delayfeedback\\":0.4,\\"delaytime\\":0.08333333333333333,\\"gain\\":0.5}",
-  "1/2 -> 11/20: {\\"note\\":\\"B3\\",\\"s\\":\\"rhodes\\",\\"clip\\":1,\\"room\\":0.5,\\"delay\\":0.3,\\"delayfeedback\\":0.4,\\"delaytime\\":0.08333333333333333,\\"gain\\":0.5}",
-  "1/3 -> 23/60: {\\"note\\":\\"E4\\",\\"s\\":\\"rhodes\\",\\"clip\\":1,\\"room\\":0.5,\\"delay\\":0.3,\\"delayfeedback\\":0.4,\\"delaytime\\":0.08333333333333333,\\"gain\\":0.5}",
-  "1/2 -> 11/20: {\\"note\\":\\"E4\\",\\"s\\":\\"rhodes\\",\\"clip\\":1,\\"room\\":0.5,\\"delay\\":0.3,\\"delayfeedback\\":0.4,\\"delaytime\\":0.08333333333333333,\\"gain\\":0.5}",
-  "2/3 -> 43/60: {\\"note\\":\\"G3\\",\\"s\\":\\"rhodes\\",\\"clip\\":1,\\"room\\":0.5,\\"delay\\":0.3,\\"delayfeedback\\":0.4,\\"delaytime\\":0.08333333333333333,\\"gain\\":0.5}",
-  "5/6 -> 53/60: {\\"note\\":\\"G3\\",\\"s\\":\\"rhodes\\",\\"clip\\":1,\\"room\\":0.5,\\"delay\\":0.3,\\"delayfeedback\\":0.4,\\"delaytime\\":0.08333333333333333,\\"gain\\":0.5}",
-  "0/1 -> 4/3: {\\"note\\":\\"c2\\",\\"gain\\":0.3,\\"s\\":\\"sawtooth\\",\\"cutoff\\":600}",
-  "0/1 -> 4/3: {\\"note\\":\\"c2\\",\\"gain\\":0.3,\\"s\\":\\"sawtooth\\",\\"cutoff\\":600}",
-  "0/1 -> 4/3: {\\"note\\":36.02,\\"gain\\":0.3,\\"s\\":\\"sawtooth\\",\\"cutoff\\":600}",
-  "0/1 -> 4/3: {\\"note\\":36.02,\\"gain\\":0.3,\\"s\\":\\"sawtooth\\",\\"cutoff\\":600}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 307 https://strudel.cc/?vYFGpZ6XObVG 1`] = `
-[
-  "0/1 -> 1/3: {\\"s\\":\\"bd\\"}",
-  "1/3 -> 2/3: {\\"s\\":\\"hh\\"}",
-  "2/3 -> 1/1: {\\"s\\":\\"sn\\"}",
-  "0/1 -> 1/20: {\\"note\\":\\"G4\\",\\"s\\":\\"rhodes\\",\\"clip\\":1,\\"room\\":0.5,\\"delay\\":0.3,\\"delayfeedback\\":0.4,\\"delaytime\\":0.08333333333333333,\\"gain\\":0.5}",
-  "1/6 -> 13/60: {\\"note\\":\\"G4\\",\\"s\\":\\"rhodes\\",\\"clip\\":1,\\"room\\":0.5,\\"delay\\":0.3,\\"delayfeedback\\":0.4,\\"delaytime\\":0.08333333333333333,\\"gain\\":0.5}",
-  "1/3 -> 23/60: {\\"note\\":\\"B3\\",\\"s\\":\\"rhodes\\",\\"clip\\":1,\\"room\\":0.5,\\"delay\\":0.3,\\"delayfeedback\\":0.4,\\"delaytime\\":0.08333333333333333,\\"gain\\":0.5}",
-  "1/2 -> 11/20: {\\"note\\":\\"B3\\",\\"s\\":\\"rhodes\\",\\"clip\\":1,\\"room\\":0.5,\\"delay\\":0.3,\\"delayfeedback\\":0.4,\\"delaytime\\":0.08333333333333333,\\"gain\\":0.5}",
-  "1/3 -> 23/60: {\\"note\\":\\"E4\\",\\"s\\":\\"rhodes\\",\\"clip\\":1,\\"room\\":0.5,\\"delay\\":0.3,\\"delayfeedback\\":0.4,\\"delaytime\\":0.08333333333333333,\\"gain\\":0.5}",
-  "1/2 -> 11/20: {\\"note\\":\\"E4\\",\\"s\\":\\"rhodes\\",\\"clip\\":1,\\"room\\":0.5,\\"delay\\":0.3,\\"delayfeedback\\":0.4,\\"delaytime\\":0.08333333333333333,\\"gain\\":0.5}",
-  "2/3 -> 43/60: {\\"note\\":\\"G3\\",\\"s\\":\\"rhodes\\",\\"clip\\":1,\\"room\\":0.5,\\"delay\\":0.3,\\"delayfeedback\\":0.4,\\"delaytime\\":0.08333333333333333,\\"gain\\":0.5}",
-  "5/6 -> 53/60: {\\"note\\":\\"G3\\",\\"s\\":\\"rhodes\\",\\"clip\\":1,\\"room\\":0.5,\\"delay\\":0.3,\\"delayfeedback\\":0.4,\\"delaytime\\":0.08333333333333333,\\"gain\\":0.5}",
-  "0/1 -> 4/3: {\\"note\\":\\"c2\\",\\"gain\\":0.3,\\"s\\":\\"sawtooth\\",\\"cutoff\\":600}",
-  "0/1 -> 4/3: {\\"note\\":\\"c2\\",\\"gain\\":0.3,\\"s\\":\\"sawtooth\\",\\"cutoff\\":600}",
-  "0/1 -> 4/3: {\\"note\\":36.02,\\"gain\\":0.3,\\"s\\":\\"sawtooth\\",\\"cutoff\\":600}",
-  "0/1 -> 4/3: {\\"note\\":36.02,\\"gain\\":0.3,\\"s\\":\\"sawtooth\\",\\"cutoff\\":600}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 308 https://strudel.cc/?TUw_9DfBSsiW 1`] = `
-[
-  "0/1 -> 2/3: {\\"s\\":\\"bd\\",\\"speed\\":0.7519542165100574}",
-  "1/3 -> 2/3: {\\"s\\":\\"sd\\",\\"speed\\":0.7931522866332671}",
-  "1/6 -> 1/3: {\\"s\\":\\"hh\\",\\"speed\\":0.7285963821098448}",
-  "1/3 -> 1/2: {\\"s\\":\\"hh\\",\\"speed\\":0.77531205091027}",
-  "1/2 -> 2/3: {\\"s\\":\\"hh\\",\\"speed\\":0.80224046928206}",
-  "2/3 -> 4/3: {\\"s\\":\\"bd\\",\\"speed\\":0.8479069285094738}",
-  "5/6 -> 1/1: {\\"s\\":\\"hh\\",\\"speed\\":0.8281258666335816}",
-  "0/1 -> 2/3: {\\"n\\":33.129885541275144,\\"decay\\":0.15,\\"sustain\\":0,\\"s\\":\\"sawtooth\\",\\"gain\\":0.4,\\"cutoff\\":3669.6267869262615}",
-  "2/3 -> 1/1: {\\"n\\":35.28254374134849,\\"decay\\":0.15,\\"sustain\\":0,\\"s\\":\\"sawtooth\\",\\"gain\\":0.4,\\"cutoff\\":4767.276839570684}",
-  "0/1 -> 2/3: {\\"n\\":33.17988554127514,\\"decay\\":0.15,\\"sustain\\":0,\\"s\\":\\"sawtooth\\",\\"gain\\":0.4,\\"cutoff\\":3669.6267869262615}",
-  "2/3 -> 1/1: {\\"n\\":35.33254374134849,\\"decay\\":0.15,\\"sustain\\":0,\\"s\\":\\"sawtooth\\",\\"gain\\":0.4,\\"cutoff\\":4767.276839570684}",
-  "0/1 -> 2/3: {\\"n\\":55.129885541275144,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 2/3: {\\"n\\":55.129885541275144,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 2/3: {\\"n\\":59.129885541275144,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 2/3: {\\"n\\":59.129885541275144,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 2/3: {\\"n\\":60.129885541275144,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 2/3: {\\"n\\":60.129885541275144,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 2/3: {\\"n\\":64.12988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 2/3: {\\"n\\":64.12988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "2/3 -> 4/3: {\\"n\\":55.369767321273685,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "2/3 -> 4/3: {\\"n\\":55.369767321273685,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "2/3 -> 4/3: {\\"n\\":59.369767321273685,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "2/3 -> 4/3: {\\"n\\":59.369767321273685,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "2/3 -> 4/3: {\\"n\\":60.369767321273685,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "2/3 -> 4/3: {\\"n\\":60.369767321273685,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "2/3 -> 4/3: {\\"n\\":64.36976732127368,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "2/3 -> 4/3: {\\"n\\":64.36976732127368,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 2/3: {\\"n\\":55.16988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 2/3: {\\"n\\":55.16988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 2/3: {\\"n\\":59.16988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 2/3: {\\"n\\":59.16988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 2/3: {\\"n\\":60.16988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 2/3: {\\"n\\":60.16988554127514,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 2/3: {\\"n\\":64.16988554127515,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "0/1 -> 2/3: {\\"n\\":64.16988554127515,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "2/3 -> 4/3: {\\"n\\":55.409767321273684,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "2/3 -> 4/3: {\\"n\\":55.409767321273684,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "2/3 -> 4/3: {\\"n\\":59.409767321273684,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "2/3 -> 4/3: {\\"n\\":59.409767321273684,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "2/3 -> 4/3: {\\"n\\":60.409767321273684,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "2/3 -> 4/3: {\\"n\\":60.409767321273684,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "2/3 -> 4/3: {\\"n\\":64.40976732127369,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "2/3 -> 4/3: {\\"n\\":64.40976732127369,\\"s\\":\\"sawtooth\\",\\"gain\\":0.16,\\"cutoff\\":500,\\"attack\\":1}",
-  "1/12 -> 1/6: {\\"n\\":69.01266877519555,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "1/6 -> 1/4: {\\"n\\":69.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "1/6 -> 1/4: {\\"n\\":72.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "1/3 -> 5/12: {\\"n\\":72.16001184806132,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "5/12 -> 1/2: {\\"n\\":72.21301072199333,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "5/12 -> 1/2: {\\"n\\":88.21301072199333,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "7/12 -> 2/3: {\\"n\\":88.25919484626601,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "1/12 -> 1/6: {\\"n\\":69.05266877519557,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "1/6 -> 1/4: {\\"n\\":69.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "1/6 -> 1/4: {\\"n\\":72.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "1/3 -> 5/12: {\\"n\\":72.20001184806131,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "5/12 -> 1/2: {\\"n\\":72.25301072199335,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "5/12 -> 1/2: {\\"n\\":88.25301072199335,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "7/12 -> 2/3: {\\"n\\":88.29919484626603,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.15}",
-  "0/1 -> 1/12: {\\"n\\":93.00057728554401,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "0/1 -> 1/12: {\\"n\\":93.04057728554402,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "1/6 -> 1/4: {\\"n\\":69.01266877519555,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "1/4 -> 1/3: {\\"n\\":69.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "1/4 -> 1/3: {\\"n\\":72.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "5/12 -> 1/2: {\\"n\\":72.16001184806132,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "1/2 -> 7/12: {\\"n\\":72.21301072199333,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "1/2 -> 7/12: {\\"n\\":88.21301072199333,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "1/6 -> 1/4: {\\"n\\":69.05266877519557,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "1/4 -> 1/3: {\\"n\\":69.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "1/4 -> 1/3: {\\"n\\":72.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "5/12 -> 1/2: {\\"n\\":72.20001184806131,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "1/2 -> 7/12: {\\"n\\":72.25301072199335,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "1/2 -> 7/12: {\\"n\\":88.25301072199335,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "1/12 -> 1/6: {\\"n\\":93.00057728554401,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "1/12 -> 1/6: {\\"n\\":93.04057728554402,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "1/4 -> 1/3: {\\"n\\":69.01266877519555,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "1/3 -> 5/12: {\\"n\\":69.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "1/3 -> 5/12: {\\"n\\":72.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "1/2 -> 7/12: {\\"n\\":72.16001184806132,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "7/12 -> 2/3: {\\"n\\":72.21301072199333,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "7/12 -> 2/3: {\\"n\\":88.21301072199333,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "1/4 -> 1/3: {\\"n\\":69.05266877519557,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "1/3 -> 5/12: {\\"n\\":69.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "1/3 -> 5/12: {\\"n\\":72.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "1/2 -> 7/12: {\\"n\\":72.20001184806131,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "7/12 -> 2/3: {\\"n\\":72.25301072199335,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "7/12 -> 2/3: {\\"n\\":88.25301072199335,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "0/1 -> 1/12: {\\"n\\":72.0468455057745,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "0/1 -> 1/12: {\\"n\\":93.0468455057745,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "1/6 -> 1/4: {\\"n\\":93.00057728554401,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "0/1 -> 1/12: {\\"n\\":72.0868455057745,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "0/1 -> 1/12: {\\"n\\":93.0868455057745,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "1/6 -> 1/4: {\\"n\\":93.04057728554402,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "1/3 -> 5/12: {\\"n\\":69.01266877519555,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "5/12 -> 1/2: {\\"n\\":69.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "5/12 -> 1/2: {\\"n\\":72.04676036055696,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "7/12 -> 2/3: {\\"n\\":72.16001184806132,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "1/3 -> 5/12: {\\"n\\":69.05266877519557,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "5/12 -> 1/2: {\\"n\\":69.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "5/12 -> 1/2: {\\"n\\":72.08676036055695,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "7/12 -> 2/3: {\\"n\\":72.20001184806131,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "2/3 -> 3/4: {\\"n\\":88.25919484626601,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "2/3 -> 3/4: {\\"n\\":88.29919484626603,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.075}",
-  "3/4 -> 5/6: {\\"n\\":88.25919484626601,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "3/4 -> 5/6: {\\"n\\":88.29919484626603,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.049999999999999996}",
-  "2/3 -> 3/4: {\\"n\\":72.21301072199333,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "2/3 -> 3/4: {\\"n\\":88.21301072199333,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "5/6 -> 11/12: {\\"n\\":88.25919484626601,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "2/3 -> 3/4: {\\"n\\":72.25301072199335,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "2/3 -> 3/4: {\\"n\\":88.25301072199335,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-  "5/6 -> 11/12: {\\"n\\":88.29919484626603,\\"decay\\":0.1,\\"sustain\\":0,\\"s\\":\\"triangle\\",\\"gain\\":0.0375}",
-]
-`;
-
-exports[`renders shared tunes > shared tune 309 https://strudel.cc/?ctHqwq-97t6X 1`] = `
-[
-  "0/1 -> 1/2: {\\"s\\":\\"bd\\",\\"delay\\":0.5,\\"delaytime\\":0.33,\\"delayfeedback\\":0.6,\\"speed\\":-1}",
-  "1/2 -> 1/1: {\\"s\\":\\"sd\\",\\"delay\\":0.5,\\"delaytime\\":0.33,\\"delayfeedback\\":0.6,\\"speed\\":-1}",
-  "0/1 -> 1/2: {\\"s\\":\\"hh\\",\\"delay\\":0.8,\\"delaytime\\":0.08,\\"delayfeedback\\":0.7,\\"orbit\\":2,\\"speed\\":-1}",
-  "1/2 -> 1/1: {\\"s\\":\\"hh\\",\\"delay\\":0.8,\\"delaytime\\":0.08,\\"delayfeedback\\":0.7,\\"orbit\\":2,\\"speed\\":-1}",
-]
-`;
diff --git a/test/runtime.mjs b/test/runtime.mjs
index f14e18e2..19b71627 100644
--- a/test/runtime.mjs
+++ b/test/runtime.mjs
@@ -122,6 +122,19 @@ strudel.Pattern.prototype.midi = function () {
   return this;
 };
 
+strudel.Pattern.prototype._scope = function () {
+  return this;
+};
+strudel.Pattern.prototype._spiral = function () {
+  return this;
+};
+strudel.Pattern.prototype._pitchwheel = function () {
+  return this;
+};
+strudel.Pattern.prototype._pianoroll = function () {
+  return this;
+};
+
 const uiHelpersMocked = {
   backgroundImage: id,
 };
@@ -178,6 +191,7 @@ evalScope(
   },
 );
 
+// TBD: use transpiler to support labeled statements
 export const queryCode = async (code, cycles = 1) => {
   const { pattern } = await evaluate(code);
   const haps = pattern.sortHapsByPart().queryArc(0, cycles);
diff --git a/undocumented.json b/undocumented.json
index 63f5d36b..8a38f205 100644
--- a/undocumented.json
+++ b/undocumented.json
@@ -649,7 +649,7 @@
   "/packages/webaudio/webaudio.mjs": [
     "webaudioOutputTrigger",
     "webaudioOutput",
-    "webaudioScheduler"
+    "webaudioRepl"
   ],
   "/packages/webaudio/scope.mjs": [
     "drawTimeScope",
diff --git a/website/.gitignore b/website/.gitignore
index 02f6e50b..60c587b1 100644
--- a/website/.gitignore
+++ b/website/.gitignore
@@ -17,3 +17,6 @@ pnpm-debug.log*
 
 # macOS-specific files
 .DS_Store
+
+public/tree-sitter.wasm
+public/tree-sitter-haskell.wasm
\ No newline at end of file
diff --git a/website/package.json b/website/package.json
index bf56d983..942fee9c 100644
--- a/website/package.json
+++ b/website/package.json
@@ -9,7 +9,8 @@
     "check": "astro check && tsc",
     "build": "astro build",
     "preview": "astro preview --port 3009 --host 0.0.0.0",
-    "astro": "astro"
+    "astro": "astro",
+    "postinstall": "cp node_modules/hs2js/dist/tree-sitter.wasm public && cp node_modules/hs2js/dist/tree-sitter-haskell.wasm public"
   },
   "dependencies": {
     "@algolia/client-search": "^4.22.0",
@@ -39,6 +40,7 @@
     "@strudel/transpiler": "workspace:*",
     "@strudel/webaudio": "workspace:*",
     "@strudel/xen": "workspace:*",
+    "@strudel/tidal": "workspace:*",
     "@supabase/supabase-js": "^2.39.1",
     "@tailwindcss/forms": "^0.5.7",
     "@tailwindcss/typography": "^0.5.10",
@@ -49,6 +51,7 @@
     "astro": "^4.0.8",
     "claviature": "^0.1.0",
     "date-fns": "^3.2.0",
+    "hs2js": "0.0.8",
     "nanoid": "^5.0.4",
     "nanostores": "^0.9.5",
     "react": "^18.2.0",
diff --git a/website/src/components/Oven/Oven.jsx b/website/src/components/Oven/Oven.jsx
index a4199b5e..eb3c8692 100644
--- a/website/src/components/Oven/Oven.jsx
+++ b/website/src/components/Oven/Oven.jsx
@@ -1,7 +1,7 @@
 import { useState, useEffect } from 'react';
 import { loadFeaturedPatterns, loadPublicPatterns } from '@src/user_pattern_utils.mjs';
 import { MiniRepl } from '@src/docs/MiniRepl';
-import { PatternLabel } from '@src/repl/panel/PatternsTab';
+import { PatternLabel } from '@src/repl/components/panel/PatternsTab';
 
 function PatternList({ patterns }) {
   return (
diff --git a/website/src/components/Udels/UdelFrame.jsx b/website/src/components/Udels/UdelFrame.jsx
new file mode 100644
index 00000000..8bbbe14e
--- /dev/null
+++ b/website/src/components/Udels/UdelFrame.jsx
@@ -0,0 +1,32 @@
+import { useRef } from 'react';
+
+export function UdelFrame({ onEvaluate, hash, instance }) {
+  const ref = useRef();
+  window.addEventListener('message', (message) => {
+    const childWindow = ref?.current?.contentWindow;
+    if (message == null || message.source !== childWindow) {
+      return; // Skip message in this event listener
+    }
+    onEvaluate(message.data);
+  });
+
+  const url = new URL(window.location.origin);
+  url.hash = hash;
+  url.searchParams.append('instance', instance);
+  const source = url.toString();
+
+  return (
+    
+  );
+}
diff --git a/website/src/components/Udels/Udels.jsx b/website/src/components/Udels/Udels.jsx
new file mode 100644
index 00000000..4a5f404f
--- /dev/null
+++ b/website/src/components/Udels/Udels.jsx
@@ -0,0 +1,72 @@
+import { code2hash } from '@strudel/core';
+
+import { UdelFrame } from './UdelFrame';
+import { useState } from 'react';
+import UdelsHeader from './UdelsHeader';
+
+const defaultHash = 'c3RhY2soCiAgCik%3D';
+
+const getHashesFromUrl = () => {
+  return window.location.hash?.slice(1).split(',');
+};
+const updateURLHashes = (hashes) => {
+  const newHash = '#' + hashes.join(',');
+  window.location.hash = newHash;
+};
+export function Udels() {
+  const hashes = getHashesFromUrl();
+
+  const [numWindows, setNumWindows] = useState(hashes?.length ?? 1);
+  const numWindowsOnChange = (num) => {
+    setNumWindows(num);
+    const hashes = getHashesFromUrl();
+    const newHashes = [];
+    for (let i = 0; i < num; i++) {
+      newHashes[i] = hashes[i] ?? defaultHash;
+    }
+    updateURLHashes(newHashes);
+  };
+
+  const onEvaluate = (key, code) => {
+    const hashes = getHashesFromUrl();
+    hashes[key] = code2hash(code);
+
+    updateURLHashes(hashes);
+  };
+
+  return (
+    
+ +
+ {hashes.map((hash, key) => { + return ( + { + onEvaluate(key, code); + }} + hash={hash} + key={key} + /> + ); + })} +
+
+ ); +} diff --git a/website/src/components/Udels/UdelsEditor.jsx b/website/src/components/Udels/UdelsEditor.jsx new file mode 100644 index 00000000..2d05640f --- /dev/null +++ b/website/src/components/Udels/UdelsEditor.jsx @@ -0,0 +1,26 @@ +import Loader from '@src/repl/components/Loader'; +import { Panel } from '@src/repl/components/panel/Panel'; +import { Code } from '@src/repl/components/Code'; +import BigPlayButton from '@src/repl/components/BigPlayButton'; +import UserFacingErrorMessage from '@src/repl/components/UserFacingErrorMessage'; + +// type Props = { +// context: replcontext, +// } + +export default function UdelsEditor(Props) { + const { context } = Props; + const { containerRef, editorRef, error, init, pending, started, handleTogglePlay } = context; + + return ( +
+ + +
+ +
+ + +
+ ); +} diff --git a/website/src/components/Udels/UdelsHeader.jsx b/website/src/components/Udels/UdelsHeader.jsx new file mode 100644 index 00000000..d56f3a1d --- /dev/null +++ b/website/src/components/Udels/UdelsHeader.jsx @@ -0,0 +1,20 @@ +import NumberInput from '@src/repl/components/NumberInput'; + +export default function UdelsHeader(Props) { + const { numWindows, setNumWindows } = Props; + + return ( + + ); +} diff --git a/website/src/config.ts b/website/src/config.ts index 9dee2aac..dd003c18 100644 --- a/website/src/config.ts +++ b/website/src/config.ts @@ -78,6 +78,7 @@ export const SIDEBAR: Sidebar = { More: [ { text: 'Recipes', link: 'recipes/recipes' }, { text: 'Mini-Notation', link: 'learn/mini-notation' }, + { text: 'Visual Feedback', link: 'learn/visual-feedback' }, { text: 'Offline', link: 'learn/pwa' }, { text: 'Patterns', link: 'technical-manual/patterns' }, { text: 'Music metadata', link: 'learn/metadata' }, diff --git a/website/src/content/blog/release-0.0.2-schwindlig.mdx b/website/src/content/blog/release-0.0.2-schwindlig.mdx index 49e5319a..cf4bc19d 100644 --- a/website/src/content/blog/release-0.0.2-schwindlig.mdx +++ b/website/src/content/blog/release-0.0.2-schwindlig.mdx @@ -26,7 +26,7 @@ author: froos - fix: 💄 Enhance visualisation of the Tutorial on mobile by @puria in https://github.com/tidalcycles/strudel/pull/19 - Stateful queries and events (WIP) by @yaxu in https://github.com/tidalcycles/strudel/pull/14 - Fix resolveState by @yaxu in https://github.com/tidalcycles/strudel/pull/22 -- added \_asNumber + interprete numbers as midi by @felixroos in https://github.com/tidalcycles/strudel/pull/21 +- added \_asNumber + interpret numbers as midi by @felixroos in https://github.com/tidalcycles/strudel/pull/21 - Update package.json by @ChiakiUehira in https://github.com/tidalcycles/strudel/pull/23 - packaging by @felixroos in https://github.com/tidalcycles/strudel/pull/24 diff --git a/website/src/content/blog/release-0.6.0-zimtschnecke.mdx b/website/src/content/blog/release-0.6.0-zimtschnecke.mdx index 80dbc145..2736974b 100644 --- a/website/src/content/blog/release-0.6.0-zimtschnecke.mdx +++ b/website/src/content/blog/release-0.6.0-zimtschnecke.mdx @@ -28,7 +28,7 @@ author: froos - support freq in pianoroll by @felixroos in https://github.com/tidalcycles/strudel/pull/308 - ICLC2023 paper WIP by @yaxu in https://github.com/tidalcycles/strudel/pull/306 -- fix: copy share link to clipboard was broken for some browers by @felixroos in https://github.com/tidalcycles/strudel/pull/311 +- fix: copy share link to clipboard was broken for some browsers by @felixroos in https://github.com/tidalcycles/strudel/pull/311 - Jsdoc component by @felixroos in https://github.com/tidalcycles/strudel/pull/312 - object support for .scale by @felixroos in https://github.com/tidalcycles/strudel/pull/307 - Astro build by @felixroos in https://github.com/tidalcycles/strudel/pull/315 diff --git a/website/src/content/blog/release-1.0.0-geburtstagskuchen.mdx b/website/src/content/blog/release-1.0.0-geburtstagskuchen.mdx index 70176ad9..5784fe52 100644 --- a/website/src/content/blog/release-1.0.0-geburtstagskuchen.mdx +++ b/website/src/content/blog/release-1.0.0-geburtstagskuchen.mdx @@ -138,7 +138,7 @@ Plenty of things have been added to the docs, including a [showcase of what peop - Export patterns + ui tweaks by @felixroos in https://github.com/tidalcycles/strudel/pull/855 - Pattern organization by @felixroos in https://github.com/tidalcycles/strudel/pull/858 - Sound Import from local file system by @daslyfe in https://github.com/tidalcycles/strudel/pull/839 -- bugfix: suspend and close exisiting audio context when changing interface by @daslyfe in https://github.com/tidalcycles/strudel/pull/882 +- bugfix: suspend and close existing audio context when changing interface by @daslyfe in https://github.com/tidalcycles/strudel/pull/882 - add root mode for voicings by @felixroos in https://github.com/tidalcycles/strudel/pull/887 - scales can now be anchored by @felixroos in https://github.com/tidalcycles/strudel/pull/888 - add dough function for raw dsp by @felixroos in https://github.com/tidalcycles/strudel/pull/707 (experimental) @@ -195,7 +195,7 @@ Plenty of things have been added to the docs, including a [showcase of what peop - Update tauri.yml workflow file by @vasilymilovidov in https://github.com/tidalcycles/strudel/pull/705 - vite-vanilla-repl readme fix by @felixroos in https://github.com/tidalcycles/strudel/pull/737 - completely revert config mess by @felixroos in https://github.com/tidalcycles/strudel/pull/745 -- hopefully fix trainling slashes bug by @felixroos in https://github.com/tidalcycles/strudel/pull/753 +- hopefully fix trailing slashes bug by @felixroos in https://github.com/tidalcycles/strudel/pull/753 - Update vite pwa by @felixroos in https://github.com/tidalcycles/strudel/pull/772 - Update to Astro 3 by @felixroos in https://github.com/tidalcycles/strudel/pull/775 - support multiple named serial connections, change default baudrate by @yaxu in https://github.com/tidalcycles/strudel/pull/551 diff --git a/website/src/docs/MiniRepl.jsx b/website/src/docs/MiniRepl.jsx index cadebcb3..0884786e 100644 --- a/website/src/docs/MiniRepl.jsx +++ b/website/src/docs/MiniRepl.jsx @@ -1,20 +1,21 @@ import { useState, useRef, useCallback, useMemo, useEffect } from 'react'; import { Icon } from './Icon'; import { silence, noteToMidi, _mod } from '@strudel/core'; -import { getPunchcardPainter } from '@strudel/draw'; +import { clearHydra } from '@strudel/hydra'; +import { getDrawContext, getPunchcardPainter } from '@strudel/draw'; import { transpiler } from '@strudel/transpiler'; import { getAudioContext, webaudioOutput, initAudioOnFirstClick } from '@strudel/webaudio'; import { StrudelMirror } from '@strudel/codemirror'; import { prebake } from '../repl/prebake.mjs'; -import { loadModules } from '../repl/util.mjs'; +import { loadModules, setVersionDefaultsFrom } from '../repl/util.mjs'; import Claviature from '@components/Claviature'; import useClient from '@src/useClient.mjs'; -let prebaked, modulesLoading, audioLoading; +let prebaked, modulesLoading, audioReady; if (typeof window !== 'undefined') { prebaked = prebake(); modulesLoading = loadModules(); - audioLoading = initAudioOnFirstClick(); + audioReady = initAudioOnFirstClick(); } export function MiniRepl({ @@ -28,24 +29,29 @@ export function MiniRepl({ claviature, claviatureLabels, maxHeight, + autodraw, + drawTime, }) { const code = tunes ? tunes[0] : tune; const id = useMemo(() => s4(), []); - const canvasId = useMemo(() => `canvas-${id}`, [id]); - const shouldDraw = !!punchcard || !!claviature; const shouldShowCanvas = !!punchcard; - const drawTime = punchcard ? [0, 4] : [0, 0]; + const canvasId = shouldShowCanvas ? useMemo(() => `canvas-${id}`, [id]) : null; + autodraw = !!punchcard || !!claviature || !!autodraw; + drawTime = drawTime ?? punchcard ? [0, 4] : [-2, 2]; + if (claviature) { + drawTime = [0, 0]; + } const [activeNotes, setActiveNotes] = useState([]); - const init = useCallback(({ code, shouldDraw }) => { - const drawContext = shouldDraw ? document.querySelector('#' + canvasId)?.getContext('2d') : null; + const init = useCallback(({ code, autodraw }) => { + const drawContext = canvasId ? document.querySelector('#' + canvasId)?.getContext('2d') : getDrawContext(); const editor = new StrudelMirror({ id, defaultOutput: webaudioOutput, getTime: () => getAudioContext().currentTime, transpiler, - autodraw: !!shouldDraw, + autodraw, root: containerRef.current, initialCode: '// LOADING', pattern: silence, @@ -56,7 +62,7 @@ export function MiniRepl({ pat = pat.onTrigger(onTrigger, false); } if (claviature) { - editor?.painters.push((ctx, time, haps, drawTime) => { + pat = pat.onPaint((ctx, time, haps, drawTime) => { const active = haps .map((hap) => hap.value.note) .filter(Boolean) @@ -65,14 +71,21 @@ export function MiniRepl({ }); } if (punchcard) { - editor?.painters.push(getPunchcardPainter({ labels: !!punchcardLabels })); + pat = pat.punchcard({ labels: !!punchcardLabels }); } return pat; }, - prebake: async () => Promise.all([modulesLoading, prebaked, audioLoading]), + prebake: async () => Promise.all([modulesLoading, prebaked]), onUpdateState: (state) => { setReplState({ ...state }); }, + onToggle: (playing) => { + if (!playing) { + // clearHydra(); // TBD: doesn't work with multiple MiniRepl's on a page + } + }, + beforeStart: () => audioReady, + afterEval: ({ code }) => setVersionDefaultsFrom(code), }); // init settings editor.setCode(code); @@ -150,7 +163,7 @@ export function MiniRepl({ ref={(el) => { if (!editorRef.current) { containerRef.current = el; - init({ code, shouldDraw }); + init({ code, autodraw }); } }} > diff --git a/website/src/examples.mjs b/website/src/examples.mjs index 61132dfa..83c77a9c 100644 --- a/website/src/examples.mjs +++ b/website/src/examples.mjs @@ -1,5 +1,6 @@ export const examples = [ `// "coastline" @by eddyflux +// @version 1.0 samples('github:eddyflux/crate') setcps(.75) let chords = chord("/4").dict('ireal') @@ -18,7 +19,7 @@ stack( n("<0!3 1*2>").set(chords).mode("root:g2") .voicing().s("gm_acoustic_bass"), chords.n("[0 <4 3 <2 5>>*2](<3 5>,8)") - .set(x).anchor("D5").voicing() + .anchor("D5").voicing() .segment(4).clip(rand.range(.4,.8)) .room(.75).shape(.3).delay(.25) .fm(sine.range(3,8).slow(8)) @@ -29,6 +30,7 @@ stack( ) .late("[0 .01]*4").late("[0 .01]*2").size(4)`, `// "broken cut 1" @by froos +// @version 1.0 samples('github:tidalcycles/dirt-samples') samples({ @@ -56,6 +58,7 @@ note("[c2 ~](3,8)*2,eb,g,bb,d").s("sawtooth") s("?").delay(".8:.1:.8").room(2).slow(8).cut(2), ).reset("".late(2))`, `// "acidic tooth" @by eddyflux +// @version 1.0 setcps(1) stack( note("[/8](<3 5>,8)") diff --git a/website/src/layouts/MainLayout.astro b/website/src/layouts/MainLayout.astro index 49952a7e..c6f6653c 100644 --- a/website/src/layouts/MainLayout.astro +++ b/website/src/layouts/MainLayout.astro @@ -30,7 +30,7 @@ const githubEditUrl = `${CONFIG.GITHUB_EDIT_URL}/${currentFile}`; - +
diff --git a/website/src/pages/de/workshop/pattern-effects.mdx b/website/src/pages/de/workshop/pattern-effects.mdx index c76c831d..3cf8fee6 100644 --- a/website/src/pages/de/workshop/pattern-effects.mdx +++ b/website/src/pages/de/workshop/pattern-effects.mdx @@ -147,7 +147,7 @@ Probier `ply` mit einem pattern zu automatisieren, z.b. `"<1 2 1 3>"` .off(1/8, x=>x.add(4)) //.off(1/4, x=>x.add(7)) ).scale("/4") -.s("triangle").room(.5).ds(".1:0").delay(.5)`} +.s("triangle").room(.5).dec(.1).delay(.5)`} punchcard /> diff --git a/website/src/pages/index.astro b/website/src/pages/index.astro index 760cf448..29cf2fad 100644 --- a/website/src/pages/index.astro +++ b/website/src/pages/index.astro @@ -3,12 +3,12 @@ import HeadCommon from '../components/HeadCommon.astro'; import { Repl } from '../repl/Repl'; --- - + Strudel REPL - + diff --git a/website/src/pages/learn/effects.mdx b/website/src/pages/learn/effects.mdx index 03ef6ef3..39f52e9f 100644 --- a/website/src/pages/learn/effects.mdx +++ b/website/src/pages/learn/effects.mdx @@ -94,7 +94,7 @@ Each filter can receive an additional filter envelope controlling the cutoff val client:idle tune={`note("[c eb g ](3,8,<0 1>)".sub(12)) .s("/64") - .lpf(sine.range(500,3000).slow(16)) + .lpf(sine.range(300,2000).slow(16)) .lpa(0.005) .lpd(perlin.range(.02,.2)) .lps(perlin.range(0,.5).slow(3)) @@ -106,7 +106,7 @@ Each filter can receive an additional filter envelope controlling the cutoff val .juxBy(.5,rev) .sometimes(add(note(12))) .stack(s("bd*2").bank('RolandTR909')) - .gain(.5)`} + .gain(.5).fast(2)`} /> There is one filter envelope for each filter type and thus one set of envelope filter parameters preceded either by `lp`, `hp` or `bp`: diff --git a/website/src/pages/learn/factories.mdx b/website/src/pages/learn/factories.mdx index 0d93fb21..a823bfed 100644 --- a/website/src/pages/learn/factories.mdx +++ b/website/src/pages/learn/factories.mdx @@ -11,15 +11,15 @@ import { JsDoc } from '../../docs/JsDoc'; The following functions will return a pattern. These are the equivalents used by the Mini Notation: -| function | mini | -| ------------------------------ | ---------------- | -| `cat(x, y)` | `""` | -| `seq(x, y)` | `"x y"` | -| `stack(x, y)` | `"x,y"` | -| `timeCat([3,x],[2,y])` | `"x@3 y@2"` | -| `polymeter([a, b, c], [x, y])` | `"{a b c, x y}"` | -| `polymeterSteps(2, x, y, z)` | `"{x y z}%2"` | -| `silence` | `"~"` | +| function | mini | +| -------------------------------- | ---------------- | +| `cat(x, y)` | `""` | +| `seq(x, y)` | `"x y"` | +| `stack(x, y)` | `"x,y"` | +| `s_cat([3,x],[2,y])` | `"x@3 y@2"` | +| `s_polymeter([a, b, c], [x, y])` | `"{a b c, x y}"` | +| `s_polymeterSteps(2, x, y, z)` | `"{x y z}%2"` | +| `silence` | `"~"` | ## cat @@ -45,21 +45,21 @@ As a chained function: -## timeCat +## s_cat - + ## arrange -## polymeter +## s_polymeter - + -## polymeterSteps +## s_polymeterSteps - + ## silence diff --git a/website/src/pages/learn/hydra.mdx b/website/src/pages/learn/hydra.mdx index d7a692dd..2bf5fab4 100644 --- a/website/src/pages/learn/hydra.mdx +++ b/website/src/pages/learn/hydra.mdx @@ -90,11 +90,13 @@ src(s0).kaleid(H("<4 5 6>")) .modulateScale(osc(2,-0.25,1)) .out() // -stack( - s("bd*4,[hh:0:<.5 1>]*8,~ rim").bank("RolandTR909").speed(.9), - note("[>>]*3").s("sawtooth") - .room(.75).sometimes(add(note(12))).clip(.3) - .lpa(.05).lpenv(-4).lpf(2000).lpq(8).ftype('24db') -).fft(4) - .scope({pos:0,smear:.95})`} + +$: s("bd*4,[hh:0:<.5 1>]*8,~ rim").bank("RolandTR909").speed(.9) + +$: note("[>>]\*3").s("sawtooth") + +.room(.75).sometimes(add(note(12))).clip(.3) +.lpa(.05).lpenv(-4).lpf(2000).lpq(8).ftype('24db') + +all(x=>x.fft(4).scope({pos:0,smear:.95}))`} /> diff --git a/website/src/pages/learn/input-output.mdx b/website/src/pages/learn/input-output.mdx index de44b4f9..93cbfdc5 100644 --- a/website/src/pages/learn/input-output.mdx +++ b/website/src/pages/learn/input-output.mdx @@ -20,11 +20,7 @@ Strudel also supports midi via [webmidi](https://npmjs.com/package/webmidi). Either connect a midi device or use the IAC Driver (Mac) or Midi Through Port (Linux) for internal midi messages. If no outputName is given, it uses the first midi output it finds. -".voicings('lefthand'), "").note() - .midi()`} -/> +").voicing().midi()`} /> In the console, you will see a log of the available MIDI devices as soon as you run the code, e.g. `Midi connected! Using "Midi Through Port-0".` @@ -45,13 +41,11 @@ But you can also control cc messages separately like this: -# SuperDirt API +# OSC/SuperDirt API In mainline tidal, the actual sound is generated via [SuperDirt](https://github.com/musikinformatik/SuperDirt/), which runs inside SuperCollider. Strudel also supports using [SuperDirt](https://github.com/musikinformatik/SuperDirt/) as a backend, although it requires some developer tooling to run. @@ -79,16 +73,14 @@ Now you're all set! If you now hear sound, congratulations! If not, you can get help on the [#strudel channel in the TidalCycles discord](https://discord.com/invite/HGEdXmRkzT). +Note: if you have the 'Audio Engine Target' in settings set to 'OSC', you do not need to add .osc() to the end of your pattern. + ### Pattern.osc ## SuperDirt Params -The following functions can be used with [SuperDirt](https://github.com/musikinformatik/SuperDirt/): - -`s n note freq channel orbit cutoff resonance hcutoff hresonance bandf bandq djf vowel cut begin end loop fadeTime speed unitA gain amp accelerate crush coarse delay lock leslie lrate lsize pan panspan pansplay room size dry shape squiz waveloss attack decay octave detune tremolodepth` - Please refer to [Tidal Docs](https://tidalcycles.org/) for more info.
diff --git a/website/src/pages/learn/samples.mdx b/website/src/pages/learn/samples.mdx index c2c166b3..44259617 100644 --- a/website/src/pages/learn/samples.mdx +++ b/website/src/pages/learn/samples.mdx @@ -268,11 +268,10 @@ With it, you can enter any sample name(s) to query from [freesound.org](https:// You can also generate artificial voice samples with any text, in multiple languages. @@ -282,10 +281,9 @@ Note that the language code and the gender parameters are optional and default t client:idle tune={`samples('shabda/speech:the_drum,forever') samples('shabda/speech/fr-FR/m:magnifique') -stack( - s("the_drum*2").chop(16).speed(rand.range(0.85,1.1)), - s("forever magnifique").slow(4).late(0.125) -)`} + +$: s("the_drum*2").chop(16).speed(rand.range(0.85,1.1)) +$: s("forever magnifique").slow(4).late(0.125)`} /> # Sampler Effects diff --git a/website/src/pages/learn/signals.mdx b/website/src/pages/learn/signals.mdx index 7c9d69df..527e42be 100644 --- a/website/src/pages/learn/signals.mdx +++ b/website/src/pages/learn/signals.mdx @@ -55,4 +55,12 @@ There is also `saw2`, `sine2`, `cosine2`, `tri2`, `square2` and `rand2` which ha +## mouseX + + + +## mouseY + + + Next up: [Random Modifiers](/learn/random-modifiers) diff --git a/website/src/pages/learn/strudel-vs-tidal.mdx b/website/src/pages/learn/strudel-vs-tidal.mdx index 0c7213c7..40ea188f 100644 --- a/website/src/pages/learn/strudel-vs-tidal.mdx +++ b/website/src/pages/learn/strudel-vs-tidal.mdx @@ -112,29 +112,14 @@ Also, samples are always loaded from a URL rather than from the disk, although [ ## Evaluation The Strudel REPL does not support [block based evaluation](https://github.com/tidalcycles/strudel/issues/34) yet. -You can use the following "workaround" to create multiple patterns that can be turned on and off: +You can use labeled statements and `_` to mute: -``` -let a = note("c a f e") + ## Tempo diff --git a/website/src/pages/learn/synths.mdx b/website/src/pages/learn/synths.mdx index 36385d54..21a9b917 100644 --- a/website/src/pages/learn/synths.mdx +++ b/website/src/pages/learn/synths.mdx @@ -18,7 +18,7 @@ The basic waveforms are `sine`, `sawtooth`, `square` and `triangle`, which can b client:idle tune={`note("c2 >".fast(2)) .sound("") -.scope()`} +._scope()`} /> If you don't set a `sound` but a `note` the default value for `sound` is `triangle`! @@ -28,23 +28,23 @@ If you don't set a `sound` but a `note` the default value for `sound` is `triang You can also use noise as a source by setting the waveform to: `white`, `pink` or `brown`. These are different flavours of noise, here written from hard to soft. -").scope()`} /> +")._scope()`} /> Here's a more musical example of how to use noise for hihats: *8") -.decay(.04).sustain(0).scope()`} +.decay(.04).sustain(0)._scope()`} /> Some amount of pink noise can also be added to any oscillator by using the `noise` paremeter: -").scope()`} /> +")._scope()`} /> You can also use the `crackle` type to play some subtle noise crackles. You can control noise amount by using the `density` parameter: -".slow(2)).scope()`} /> +".slow(2))._scope()`} /> ### Additive Synthesis @@ -55,7 +55,7 @@ To tame the harsh sound of the basic waveforms, we can set the `n` control to li tune={`note("c2 >".fast(2)) .sound("sawtooth") .n("<32 16 8 4>") -.scope()`} +._scope()`} /> When the `n` control is used on a basic waveform, it defines the number of harmonic partials the sound is getting. @@ -65,7 +65,7 @@ You can also set `n` directly in mini notation with `sound`: client:idle tune={`note("c2 >".fast(2)) .sound("sawtooth:<32 16 8 4>") -.scope()`} +._scope()`} /> Note for tidal users: `n` in tidal is synonymous to `note` for synths only. @@ -119,13 +119,14 @@ Any sample preceded by the `wt_` prefix will be loaded as a wavetable. This mean ") .n("<1 2 3 4 5 6 7 8 9 10>/2").room(0.5).size(0.9) .s('wt_flute').velocity(0.25).often(n => n.ply(2)) .release(0.125).decay("<0.1 0.25 0.3 0.4>").sustain(0) -.cutoff(2000).scope({}).cutoff("<1000 2000 4000>").fast(4)`} +.cutoff(2000).cutoff("<1000 2000 4000>").fast(4) +._scope() +`} /> ## ZZFX @@ -159,7 +160,7 @@ It has 20 parameters in total, here is a snippet that uses all: .tremolo(0) // 0-1 lfo volume modulation amount //.duration(.2) // overwrite strudel event duration //.gain(1) // change volume - .scope() // vizualise waveform (not zzfx related) + ._scope() // vizualise waveform (not zzfx related) `} /> diff --git a/website/src/pages/learn/tonal.mdx b/website/src/pages/learn/tonal.mdx index a5a02508..202b8481 100644 --- a/website/src/pages/learn/tonal.mdx +++ b/website/src/pages/learn/tonal.mdx @@ -55,20 +55,6 @@ Transposes notes inside the scale by the number of steps: .note()`} /> -### voicings(range?) - -Turns chord symbols into voicings, using the smoothest voice leading possible: - -".voicings('lefthand'), - "" -).note()`} -/> - -Note: This function might be removed, as `voicing` (without s) is a newer implementation. - ### rootNotes(octave = 2) Turns chord symbols into root notes of chords in given octave. diff --git a/website/src/pages/learn/visual-feedback.mdx b/website/src/pages/learn/visual-feedback.mdx new file mode 100644 index 00000000..25eae30c --- /dev/null +++ b/website/src/pages/learn/visual-feedback.mdx @@ -0,0 +1,100 @@ +--- +title: Visual Feedback +layout: ../../layouts/MainLayout.astro +--- + +import { MiniRepl } from '../../docs/MiniRepl'; +import { JsDoc } from '../../docs/JsDoc'; + +# Visual Feedback + +There are several function that add visual feedback to your patterns. + +## Mini Notation Highlighting + +When you write mini notation with "double quotes" or \`backticks\`, the active parts of the mini notation will be highlighted: + +*8") +.scale("/4:minor:pentatonic") +.s("supersaw").lpf(300).lpenv("<4 3 2>\*4")`} +/> + +You can change the color as well, even pattern it: + +*8") +.scale("/4:minor:pentatonic") +.s("supersaw").lpf(300).lpenv("<4 3 2>*4") +.color("cyan magenta")`} +/> + +## Global vs Inline Visuals + +The following functions all come with in 2 variants. + +**Without prefix**: renders the visual to the background of the page: + + + +**With `_` prefix**: renders the visual inside the code. Allows for multiple visuals + + + +Here we see the 2 variants for `punchcard`. The same goes for all others below. +To improve readability the following demos will all use the inline variant. + +## Punchcard / Pianoroll + +These 2 functions render a pianoroll style visual. +The only difference between the 2 is that `pianoroll` will render the pattern directly, +while `punchcard` will also take the transformations into account that occur afterwards: + + + +Here, the `color` is still visible in the visual, even if it is applied after `_punchcard`. +On the contrary, the color is not visible when using `_pianoroll`: + + + +import Box from '@components/Box.astro'; + +
+ + + +`punchcard` is less resource intensive because it uses the same data as used for the mini notation highlighting. + + + +The visual can be customized by passing options. Those options are the same for both functions. + +What follows is the API doc of all the options you can pass: + + + +## Spiral + + + +## Scope + + + +## Pitchwheel + + diff --git a/website/src/pages/recipes/recipes.mdx b/website/src/pages/recipes/recipes.mdx index 057743cb..dd195443 100644 --- a/website/src/pages/recipes/recipes.mdx +++ b/website/src/pages/recipes/recipes.mdx @@ -308,7 +308,7 @@ Running through different wavetables can also give interesting variations: ...adding a filter envelope + reverb: @@ -317,6 +317,6 @@ note("c2*8").s("wt_dbass").n(run(8))`} client:visible tune={`samples('github:bubobubobubobubo/dough-waveforms') note("c2*8").s("wt_dbass").n(run(8)) -.lpf(perlin.range(200,2000).slow(8)) -.lpenv(-3).lpa(.1).room(.5)`} +.lpf(perlin.range(100,1000).slow(8)) +.lpenv(-3).lpa(.1).room(.5).fast(2)`} /> diff --git a/website/src/pages/udels/index.astro b/website/src/pages/udels/index.astro new file mode 100644 index 00000000..4ab699e7 --- /dev/null +++ b/website/src/pages/udels/index.astro @@ -0,0 +1,12 @@ +--- +import { Udels } from '../../components/Udels/Udels.jsx'; + + +const { BASE_URL } = import.meta.env; +const baseNoTrailing = BASE_URL.endsWith('/') ? BASE_URL.slice(0, -1) : BASE_URL; +--- + + + + + \ No newline at end of file diff --git a/website/src/pages/workshop/first-effects.mdx b/website/src/pages/workshop/first-effects.mdx index 3450e78f..99e72a13 100644 --- a/website/src/pages/workshop/first-effects.mdx +++ b/website/src/pages/workshop/first-effects.mdx @@ -60,11 +60,10 @@ We will learn how to automate with waves later... @@ -76,31 +75,21 @@ Rhythm is all about dynamics! -**stacks within stacks** - Let's combine all of the above into a little tune: ") -.sound("sawtooth").lpf("200 1000 200 1000"), -note("<[c3,g3,e4] [bb2,f3,d4] [a2,f3,c4] [bb2,g3,eb4]>") -.sound("sawtooth").vowel("") -)`} + tune={`$: sound("hh*8").gain("[.25 1]*4") + +$: sound("bd*4,[~ sd:1]*2") + +$: note("<[c2 c3]*4 [bb1 bb2]*4 [f2 f3]*4 [eb2 eb3]*4>") +.sound("sawtooth").lpf("200 1000 200 1000") + +$: note("<[c3,g3,e4] [bb2,f3,d4] [a2,f3,c4] [bb2,g3,eb4]>") +.sound("sawtooth").vowel("")`} /> - - -Try to identify the individual parts of the stacks, pay attention to where the commas are. -The 3 parts (drums, bassline, chords) are exactly as earlier, just stacked together, separated by comma. - - - **shape the sound with an adsr envelope** ~]]*2") -.sound("gm_electric_guitar_muted"), -sound("").bank("RolandTR707") -).delay(".5")`} + tune={`$: note("[~ [<[d3,a3,f4]!2 [d3,bb3,g4]!2> ~]]*2") + .sound("gm_electric_guitar_muted").delay(.5) + +$: sound("bd rim").bank("RolandTR707").delay(".5")`} /> @@ -199,31 +187,32 @@ Add a delay too! ~]]*2") -.sound("gm_electric_guitar_muted").delay(.5), -sound("").bank("RolandTR707").delay(.5), -n("<4 [3@3 4] [<2 0> ~@16] ~>") + tune={`$: note("[~ [<[d3,a3,f4]!2 [d3,bb3,g4]!2> ~]]*2") +.sound("gm_electric_guitar_muted").delay(.5) + +$: sound("bd rim").bank("RolandTR707").delay(.5) + +$: n("<4 [3@3 4] [<2 0> ~@16] ~>") .scale("D4:minor").sound("gm_accordion:2") -room(2).gain(.5) -)`} +.room(2).gain(.5)`} /> Let's add a bass to make this complete: ~]]*2") -.sound("gm_electric_guitar_muted").delay(.5), -sound("").bank("RolandTR707").delay(.5), -n("<4 [3@3 4] [<2 0> ~@16] ~>") + tune={`$: note("[~ [<[d3,a3,f4]!2 [d3,bb3,g4]!2> ~]]*2") +.sound("gm_electric_guitar_muted").delay(.5) + +$: sound("bd rim").bank("RolandTR707").delay(.5) + +$: n("<4 [3@3 4] [<2 0> ~@16] ~>") .scale("D4:minor").sound("gm_accordion:2") -.room(2).gain(.4), -n("[0 [~ 0] 4 [3 2] [0 ~] [0 ~] <0 2> ~]/2") +.room(2).gain(.4) + +$: n("[0 [~ 0] 4 [3 2] [0 ~] [0 ~] <0 2> ~]/2") .scale("D2:minor") -.sound("sawtooth,triangle").lpf(800) -)`} +.sound("sawtooth,triangle").lpf(800)`} /> @@ -262,11 +251,11 @@ By the way, inside Mini-Notation, `fast` is `*` and `slow` is `/`. ")`} /> -## automation with signals +## modulation with signals Instead of changing values stepwise, we can also control them with signals: - + @@ -290,7 +279,7 @@ What happens if you flip the range values? -We can change the automation speed with slow / fast: +We can change the modulation speed with slow / fast: -The whole automation will now take 8 cycles to repeat. +The whole modulation will now take 8 cycles to repeat. diff --git a/website/src/pages/workshop/first-notes.mdx b/website/src/pages/workshop/first-notes.mdx index 71a21764..f3d74ddc 100644 --- a/website/src/pages/workshop/first-notes.mdx +++ b/website/src/pages/workshop/first-notes.mdx @@ -314,11 +314,11 @@ Let's recap what we've learned in this chapter: New functions: -| Name | Description | Example | -| ----- | ----------------------------------- | --------------------------------------------------------------------------------- | -| note | set pitch as number or letter | | -| scale | interpret `n` as scale degree | | -| stack | play patterns in parallel (read on) | | +| Name | Description | Example | +| ----- | ----------------------------- | --------------------------------------------------------------------------------- | +| note | set pitch as number or letter | | +| scale | interpret `n` as scale degree | | +| $: | play patterns in parallel | | ## Examples @@ -356,25 +356,35 @@ New functions: -It's called `stack` 😙 +You can use `$:` 😙 +## Playing multiple patterns + +If you want to play multiple patterns at the same time, make sure to write `$:` before each: + ") - .sound("gm_synth_bass_1").lpf(800), - n(\`< + tune={`$: note("<[c2 c3]*4 [bb1 bb2]*4 [f2 f3]*4 [eb2 eb3]*4>") + .sound("gm_synth_bass_1").lpf(800) + +$: n(\`< [~ 0] 2 [0 2] [~ 2] [~ 0] 1 [0 1] [~ 1] [~ 0] 3 [0 3] [~ 3] [~ 0] 2 [0 2] [~ 2] >*4\`).scale("C4:minor") - .sound("gm_synth_strings_1"), - sound("bd*4, [~ ]*2, [~ hh]*4") - .bank("RolandTR909") -)`} + .sound("gm_synth_strings_1") + +$: sound("bd*4, [~ ]*2, [~ hh]*4") +.bank("RolandTR909")`} /> + + +Try changing `$` to `_$` to mute a part! + + + This is starting to sound like actual music! We have sounds, we have notes, now the last piece of the puzzle is missing: [effects](/workshop/first-effects) diff --git a/website/src/pages/workshop/pattern-effects.mdx b/website/src/pages/workshop/pattern-effects.mdx index 5afe862c..c9cb7b46 100644 --- a/website/src/pages/workshop/pattern-effects.mdx +++ b/website/src/pages/workshop/pattern-effects.mdx @@ -25,20 +25,16 @@ This is the same as: Let's visualize what happens here: @@ -56,11 +52,9 @@ This is like doing @@ -110,17 +104,15 @@ We can add as often as we like: [~ <4 1>]".add("<0 [0,2,4]>")) + tune={`$: n("0 [2 4] <3 5> [~ <4 1>]".add("<0 [0,2,4]>")) .scale("C5:minor") .sound("gm_xylophone") - .room(.4).delay(.125), - note("c2 [eb3,g3]".add("<0 <1 -1>>")) + .room(.4).delay(.125) +$: note("c2 [eb3,g3]".add("<0 <1 -1>>")) .adsr("[.1 0]:.2:[1 0]") .sound("gm_acoustic_bass") - .room(.5), - n("0 1 [2 3] 2").sound("jazz").jux(rev) -)`} + .room(.5) +$: n("0 1 [2 3] 2").sound("jazz").jux(rev)`} /> **ply** @@ -145,13 +137,17 @@ Try patterning the `ply` function, for example using `"<1 2 1 3>"` .off(1/16, x=>x.add(4)) //.off(1/8, x=>x.add(7)) ).scale("/2") -.s("triangle").room(.5).ds(".1:0").delay(.5)`} +.s("triangle").room(.5).dec(.1)`} punchcard /> -In the notation `x=>x.`, the `x` is the shifted pattern, which where modifying. +In the notation `.off(1/16, x=>x.add(4))`, says: + +- take the original pattern named as `x` +- modify `x` with `.add(4)`, and +- play it offset to the original pattern by `1/16` of a cycle. @@ -161,7 +157,7 @@ off is also useful for modifying other sounds, and can even be nested: client:visible tune={`s("bd sd [rim bd] sd,[~ hh]*4").bank("CasioRZ1") .off(2/16, x=>x.speed(1.5).gain(.25) - .off(3/16, y=>y.vowel("*8")))`} + .off(3/16, y=>y.vowel("*8")))`} /> | name | description | example | diff --git a/website/src/pages/workshop/recap.mdx b/website/src/pages/workshop/recap.mdx index fda7a171..e2b661f5 100644 --- a/website/src/pages/workshop/recap.mdx +++ b/website/src/pages/workshop/recap.mdx @@ -39,7 +39,7 @@ This page is just a listing of all functions covered in the workshop! | --------- | ----------------------------- | --------------------------------------------------------------------------------- | | note | set pitch as number or letter | | | n + scale | set note in scale | | -| stack | play patterns in parallel | | +| $: | play patterns in parallel | | ## Audio Effects diff --git a/website/src/repl/Repl.jsx b/website/src/repl/Repl.jsx index d709d058..9032be28 100644 --- a/website/src/repl/Repl.jsx +++ b/website/src/repl/Repl.jsx @@ -4,264 +4,15 @@ Copyright (C) 2022 Strudel contributors - see . */ -import { code2hash, logger, silence } from '@strudel/core'; -import { getDrawContext } from '@strudel/draw'; -import cx from '@src/cx.mjs'; -import { transpiler } from '@strudel/transpiler'; -import { - getAudioContext, - initAudioOnFirstClick, - webaudioOutput, - resetGlobalEffects, - resetLoadedSounds, -} from '@strudel/webaudio'; -import { defaultAudioDeviceName } from '../settings.mjs'; -import { getAudioDevices, setAudioDevice } from './util.mjs'; -import { StrudelMirror, defaultSettings } from '@strudel/codemirror'; -import { clearHydra } from '@strudel/hydra'; -import { useCallback, useEffect, useRef, useState } from 'react'; -import { settingsMap, useSettings } from '../settings.mjs'; -import { - setActivePattern, - setLatestCode, - createPatternID, - userPattern, - getViewingPatternData, - setViewingPatternData, -} from '../user_pattern_utils.mjs'; -import { Header } from './Header'; -import Loader from './Loader'; -import { Panel } from './panel/Panel'; -import { useStore } from '@nanostores/react'; -import { prebake } from './prebake.mjs'; -import { getRandomTune, initCode, loadModules, shareCode, ReplContext } from './util.mjs'; -import PlayCircleIcon from '@heroicons/react/20/solid/PlayCircleIcon'; -import './Repl.css'; -import { setInterval, clearInterval } from 'worker-timers'; -import { getMetadata } from '../metadata_parser'; - -const { latestCode } = settingsMap.get(); - -let modulesLoading, presets, drawContext, clearCanvas, isIframe; -if (typeof window !== 'undefined') { - initAudioOnFirstClick(); - modulesLoading = loadModules(); - presets = prebake(); - drawContext = getDrawContext(); - clearCanvas = () => drawContext.clearRect(0, 0, drawContext.canvas.height, drawContext.canvas.width); - isIframe = window.location !== window.parent.location; -} - -async function getModule(name) { - if (!modulesLoading) { - return; - } - const modules = await modulesLoading; - return modules.find((m) => m.packageName === name); -} +import { isIframe, isUdels } from './util.mjs'; +import UdelsEditor from '@components/Udels/UdelsEditor'; +import ReplEditor from './components/ReplEditor'; +import EmbeddedReplEditor from './components/EmbeddedReplEditor'; +import { useReplContext } from './useReplContext'; export function Repl({ embedded = false }) { - const isEmbedded = embedded || isIframe; - const { panelPosition, isZen, isSyncEnabled } = useSettings(); - const init = useCallback(() => { - const drawTime = [-2, 2]; - const drawContext = getDrawContext(); - const editor = new StrudelMirror({ - sync: isSyncEnabled, - defaultOutput: webaudioOutput, - getTime: () => getAudioContext().currentTime, - setInterval, - clearInterval, - transpiler, - autodraw: false, - root: containerRef.current, - initialCode: '// LOADING', - pattern: silence, - drawTime, - drawContext, - prebake: async () => Promise.all([modulesLoading, presets]), - onUpdateState: (state) => { - setReplState({ ...state }); - }, - onToggle: (playing) => { - if (!playing) { - clearHydra(); - } - }, - afterEval: (all) => { - const { code } = all; - setLatestCode(code); - window.location.hash = '#' + code2hash(code); - setDocumentTitle(code); - const viewingPatternData = getViewingPatternData(); - const data = { ...viewingPatternData, code }; - let id = data.id; - const isExamplePattern = viewingPatternData.collection !== userPattern.collection; - - if (isExamplePattern) { - const codeHasChanged = code !== viewingPatternData.code; - if (codeHasChanged) { - // fork example - const newPattern = userPattern.duplicate(data); - id = newPattern.id; - setViewingPatternData(newPattern.data); - } - } else { - id = userPattern.isValidID(id) ? id : createPatternID(); - setViewingPatternData(userPattern.update(id, data).data); - } - setActivePattern(id); - }, - bgFill: false, - }); - - // init settings - - initCode().then(async (decoded) => { - let code, msg; - if (decoded) { - code = decoded; - msg = `I have loaded the code from the URL.`; - } else if (latestCode) { - code = latestCode; - msg = `Your last session has been loaded!`; - } else { - const { code: randomTune, name } = await getRandomTune(); - code = randomTune; - msg = `A random code snippet named "${name}" has been loaded!`; - } - editor.setCode(code); - setDocumentTitle(code); - logger(`Welcome to Strudel! ${msg} Press play or hit ctrl+enter to run it!`, 'highlight'); - }); - - editorRef.current = editor; - }, []); - - const [replState, setReplState] = useState({}); - const { started, isDirty, error, activeCode, pending } = replState; - const editorRef = useRef(); - const containerRef = useRef(); - - // this can be simplified once SettingsTab has been refactored to change codemirrorSettings directly! - // this will be the case when the main repl is being replaced - const _settings = useStore(settingsMap, { keys: Object.keys(defaultSettings) }); - useEffect(() => { - let editorSettings = {}; - Object.keys(defaultSettings).forEach((key) => { - if (_settings.hasOwnProperty(key)) { - editorSettings[key] = _settings[key]; - } - }); - editorRef.current?.updateSettings(editorSettings); - }, [_settings]); - - // on first load, set stored audio device if possible - useEffect(() => { - const { audioDeviceName } = _settings; - if (audioDeviceName !== defaultAudioDeviceName) { - getAudioDevices().then((devices) => { - const deviceID = devices.get(audioDeviceName); - if (deviceID == null) { - return; - } - setAudioDevice(deviceID); - }); - } - }, []); - - // - // UI Actions - // - - const setDocumentTitle = (code) => { - const meta = getMetadata(code); - document.title = (meta.title ? `${meta.title} - ` : '') + 'Strudel REPL'; - }; - - const handleTogglePlay = async () => { - editorRef.current?.toggle(); - }; - - const resetEditor = async () => { - (await getModule('@strudel/tonal'))?.resetVoicings(); - resetGlobalEffects(); - clearCanvas(); - clearHydra(); - resetLoadedSounds(); - editorRef.current.repl.setCps(0.5); - await prebake(); // declare default samples - }; - - const handleUpdate = async (patternData, reset = false) => { - setViewingPatternData(patternData); - editorRef.current.setCode(patternData.code); - if (reset) { - await resetEditor(); - handleEvaluate(); - } - }; - - const handleEvaluate = () => { - editorRef.current.evaluate(); - }; - const handleShuffle = async () => { - const patternData = await getRandomTune(); - const code = patternData.code; - logger(`[repl] ✨ loading random tune "${patternData.id}"`); - setActivePattern(patternData.id); - setViewingPatternData(patternData); - await resetEditor(); - editorRef.current.setCode(code); - editorRef.current.repl.evaluate(code); - }; - - const handleShare = async () => shareCode(replState.code); - const context = { - embedded, - started, - pending, - isDirty, - activeCode, - handleTogglePlay, - handleUpdate, - handleShuffle, - handleShare, - handleEvaluate, - }; - - return ( - -
- -
- {isEmbedded && !started && ( - - )} -
-
{ - containerRef.current = el; - if (!editorRef.current) { - init(); - } - }} - >
- {panelPosition === 'right' && !isEmbedded && } -
- {error && ( -
{error.message || 'Unknown Error :-/'}
- )} - {panelPosition === 'bottom' && !isEmbedded && } -
-
- ); + const isEmbedded = embedded || isIframe(); + const Editor = isUdels() ? UdelsEditor : isEmbedded ? EmbeddedReplEditor : ReplEditor; + const context = useReplContext(); + return ; } diff --git a/website/src/repl/components/BigPlayButton.jsx b/website/src/repl/components/BigPlayButton.jsx new file mode 100644 index 00000000..80a4d345 --- /dev/null +++ b/website/src/repl/components/BigPlayButton.jsx @@ -0,0 +1,22 @@ +import PlayCircleIcon from '@heroicons/react/20/solid/PlayCircleIcon'; + +// type Props = { +// started: boolean; +// handleTogglePlay: () => void; +// }; +export default function BigPlayButton(Props) { + const { started, handleTogglePlay } = Props; + if (started) { + return; + } + + return ( + + ); +} diff --git a/website/src/repl/components/Code.jsx b/website/src/repl/components/Code.jsx new file mode 100644 index 00000000..8481cc27 --- /dev/null +++ b/website/src/repl/components/Code.jsx @@ -0,0 +1,21 @@ +// type Props = { +// containerRef: React.MutableRefObject, +// editorRef: React.MutableRefObject, +// init: () => void +// } +export function Code(Props) { + const { editorRef, containerRef, init } = Props; + + return ( +
{ + containerRef.current = el; + if (!editorRef.current) { + init(); + } + }} + >
+ ); +} diff --git a/website/src/repl/components/EmbeddedReplEditor.jsx b/website/src/repl/components/EmbeddedReplEditor.jsx new file mode 100644 index 00000000..06d9c2c1 --- /dev/null +++ b/website/src/repl/components/EmbeddedReplEditor.jsx @@ -0,0 +1,25 @@ +import Loader from '@src/repl/components/Loader'; +import { Code } from '@src/repl/components/Code'; +import BigPlayButton from '@src/repl/components/BigPlayButton'; +import UserFacingErrorMessage from '@src/repl/components/UserFacingErrorMessage'; +import { Header } from './Header'; + +// type Props = { +// context: replcontext, +// } + +export default function EmbeddedReplEditor(Props) { + const { context } = Props; + const { pending, started, handleTogglePlay, containerRef, editorRef, error, init } = context; + return ( +
+ +
+ +
+ +
+ +
+ ); +} diff --git a/website/src/repl/Header.jsx b/website/src/repl/components/Header.jsx similarity index 93% rename from website/src/repl/Header.jsx rename to website/src/repl/components/Header.jsx index 748b84e4..c513f451 100644 --- a/website/src/repl/Header.jsx +++ b/website/src/repl/components/Header.jsx @@ -5,24 +5,15 @@ import PlayCircleIcon from '@heroicons/react/20/solid/PlayCircleIcon'; import SparklesIcon from '@heroicons/react/20/solid/SparklesIcon'; import StopCircleIcon from '@heroicons/react/20/solid/StopCircleIcon'; import cx from '@src/cx.mjs'; -import { useSettings, setIsZen } from '../settings.mjs'; -// import { ReplContext } from './Repl'; -import './Repl.css'; +import { useSettings, setIsZen } from '../../settings.mjs'; +import '../Repl.css'; + const { BASE_URL } = import.meta.env; const baseNoTrailing = BASE_URL.endsWith('/') ? BASE_URL.slice(0, -1) : BASE_URL; -export function Header({ context }) { - const { - embedded, - started, - pending, - isDirty, - activeCode, - handleTogglePlay, - handleEvaluate, - handleShuffle, - handleShare, - } = context; +export function Header({ context, embedded = false }) { + const { started, pending, isDirty, activeCode, handleTogglePlay, handleEvaluate, handleShuffle, handleShare } = + context; const isEmbedded = typeof window !== 'undefined' && (embedded || window.location !== window.parent.location); const { isZen } = useSettings(); diff --git a/website/src/repl/Loader.jsx b/website/src/repl/components/Loader.jsx similarity index 100% rename from website/src/repl/Loader.jsx rename to website/src/repl/components/Loader.jsx diff --git a/website/src/repl/components/NumberInput.jsx b/website/src/repl/components/NumberInput.jsx new file mode 100644 index 00000000..0c3e7e53 --- /dev/null +++ b/website/src/repl/components/NumberInput.jsx @@ -0,0 +1,54 @@ +function Button(Props) { + const { children, onClick } = Props; + + return ( + + ); +} +export default function NumberInput(Props) { + const { value = 0, setValue, max, min } = Props; + + return ( +
+ + setValue(e.target.value)} + /> + +
+ ); +} diff --git a/website/src/repl/components/ReplEditor.jsx b/website/src/repl/components/ReplEditor.jsx new file mode 100644 index 00000000..83317bf3 --- /dev/null +++ b/website/src/repl/components/ReplEditor.jsx @@ -0,0 +1,30 @@ +import Loader from '@src/repl/components/Loader'; +import { Panel } from '@src/repl/components/panel/Panel'; +import { Code } from '@src/repl/components/Code'; +import UserFacingErrorMessage from '@src/repl/components/UserFacingErrorMessage'; +import { Header } from './Header'; +import { useSettings } from '@src/settings.mjs'; + +// type Props = { +// context: replcontext, +// } + +export default function ReplEditor(Props) { + const { context } = Props; + const { containerRef, editorRef, error, init, pending } = context; + const settings = useSettings(); + const { panelPosition } = settings; + + return ( +
+ +
+
+ + {panelPosition === 'right' && } +
+ + {panelPosition === 'bottom' && } +
+ ); +} diff --git a/website/src/repl/components/UserFacingErrorMessage.jsx b/website/src/repl/components/UserFacingErrorMessage.jsx new file mode 100644 index 00000000..ec8d8be3 --- /dev/null +++ b/website/src/repl/components/UserFacingErrorMessage.jsx @@ -0,0 +1,8 @@ +// type Props = { error: Error | null }; +export default function UserFacingErrorMessage(Props) { + const { error } = Props; + if (error == null) { + return; + } + return
{error.message || 'Unknown Error :-/'}
; +} diff --git a/website/src/repl/panel/AudioDeviceSelector.jsx b/website/src/repl/components/panel/AudioDeviceSelector.jsx similarity index 94% rename from website/src/repl/panel/AudioDeviceSelector.jsx rename to website/src/repl/components/panel/AudioDeviceSelector.jsx index 969bf387..d1f13c22 100644 --- a/website/src/repl/panel/AudioDeviceSelector.jsx +++ b/website/src/repl/components/panel/AudioDeviceSelector.jsx @@ -1,5 +1,5 @@ import React, { useState } from 'react'; -import { getAudioDevices, setAudioDevice } from '../util.mjs'; +import { getAudioDevices, setAudioDevice } from '../../util.mjs'; import { SelectInput } from './SelectInput'; const initdevices = new Map(); diff --git a/website/src/repl/components/panel/AudioEngineTargetSelector.jsx b/website/src/repl/components/panel/AudioEngineTargetSelector.jsx new file mode 100644 index 00000000..ecf5d817 --- /dev/null +++ b/website/src/repl/components/panel/AudioEngineTargetSelector.jsx @@ -0,0 +1,29 @@ +import React from 'react'; +import { audioEngineTargets } from '../../../settings.mjs'; +import { SelectInput } from './SelectInput'; + +// Allows the user to select an audio interface for Strudel to play through +export function AudioEngineTargetSelector({ target, onChange, isDisabled }) { + const onTargetChange = (target) => { + onChange(target); + }; + const options = new Map([ + [audioEngineTargets.webaudio, audioEngineTargets.webaudio], + [audioEngineTargets.osc, audioEngineTargets.osc], + ]); + return ( +
+ ); +} diff --git a/website/src/repl/panel/ConsoleTab.jsx b/website/src/repl/components/panel/ConsoleTab.jsx similarity index 100% rename from website/src/repl/panel/ConsoleTab.jsx rename to website/src/repl/components/panel/ConsoleTab.jsx diff --git a/website/src/repl/panel/FilesTab.jsx b/website/src/repl/components/panel/FilesTab.jsx similarity index 97% rename from website/src/repl/panel/FilesTab.jsx rename to website/src/repl/components/panel/FilesTab.jsx index d78ec1ec..2e121fb5 100644 --- a/website/src/repl/panel/FilesTab.jsx +++ b/website/src/repl/components/panel/FilesTab.jsx @@ -1,6 +1,6 @@ import { Fragment, useEffect } from 'react'; import React, { useMemo, useState } from 'react'; -import { isAudioFile, readDir, dir, playFile } from '../files.mjs'; +import { isAudioFile, readDir, dir, playFile } from '../../files.mjs'; export function FilesTab() { const [path, setPath] = useState([]); diff --git a/website/src/repl/panel/Forms.jsx b/website/src/repl/components/panel/Forms.jsx similarity index 100% rename from website/src/repl/panel/Forms.jsx rename to website/src/repl/components/panel/Forms.jsx diff --git a/website/src/repl/panel/ImportSoundsButton.jsx b/website/src/repl/components/panel/ImportSoundsButton.jsx similarity index 92% rename from website/src/repl/panel/ImportSoundsButton.jsx rename to website/src/repl/components/panel/ImportSoundsButton.jsx index 20a1d5e3..7862b766 100644 --- a/website/src/repl/panel/ImportSoundsButton.jsx +++ b/website/src/repl/components/panel/ImportSoundsButton.jsx @@ -1,5 +1,5 @@ import React, { useCallback, useState } from 'react'; -import { registerSamplesFromDB, uploadSamplesToDB, userSamplesDBConfig } from '../idbutils.mjs'; +import { registerSamplesFromDB, uploadSamplesToDB, userSamplesDBConfig } from '../../idbutils.mjs'; //choose a directory to locally import samples export default function ImportSoundsButton({ onComplete }) { @@ -10,6 +10,7 @@ export default function ImportSoundsButton({ onComplete }) { return; } setIsUploading(true); + await uploadSamplesToDB(userSamplesDBConfig, fileUploadRef.current.files).then(() => { registerSamplesFromDB(userSamplesDBConfig, () => { onComplete(); @@ -32,7 +33,7 @@ export default function ImportSoundsButton({ onComplete }) { directory="" webkitdirectory="" multiple - accept="audio/*" + accept="audio/*, .wav, .mp3, .m4a, .flac, .aac, .ogg" onChange={() => { onChange(); }} diff --git a/website/src/repl/panel/Panel.jsx b/website/src/repl/components/panel/Panel.jsx similarity index 98% rename from website/src/repl/panel/Panel.jsx rename to website/src/repl/components/panel/Panel.jsx index 7d35f0e4..a7bb6a83 100644 --- a/website/src/repl/panel/Panel.jsx +++ b/website/src/repl/components/panel/Panel.jsx @@ -4,7 +4,7 @@ import useEvent from '@src/useEvent.mjs'; import cx from '@src/cx.mjs'; import { nanoid } from 'nanoid'; import { useCallback, useLayoutEffect, useEffect, useRef, useState } from 'react'; -import { setActiveFooter, useSettings } from '../../settings.mjs'; +import { setActiveFooter, useSettings } from '../../../settings.mjs'; import { ConsoleTab } from './ConsoleTab'; import { FilesTab } from './FilesTab'; import { Reference } from './Reference'; diff --git a/website/src/repl/panel/PatternsTab.jsx b/website/src/repl/components/panel/PatternsTab.jsx similarity index 94% rename from website/src/repl/panel/PatternsTab.jsx rename to website/src/repl/components/panel/PatternsTab.jsx index f6499d79..5e9119b1 100644 --- a/website/src/repl/panel/PatternsTab.jsx +++ b/website/src/repl/components/panel/PatternsTab.jsx @@ -5,13 +5,13 @@ import { useActivePattern, useViewingPatternData, userPattern, -} from '../../user_pattern_utils.mjs'; +} from '../../../user_pattern_utils.mjs'; import { useMemo } from 'react'; -import { getMetadata } from '../../metadata_parser'; -import { useExamplePatterns } from '../useExamplePatterns'; -import { parseJSON } from '../util.mjs'; +import { getMetadata } from '../../../metadata_parser.js'; +import { useExamplePatterns } from '../../useExamplePatterns.jsx'; +import { parseJSON, isUdels } from '../../util.mjs'; import { ButtonGroup } from './Forms.jsx'; -import { settingsMap, useSettings } from '../../settings.mjs'; +import { settingsMap, useSettings } from '../../../settings.mjs'; function classNames(...classes) { return classes.filter(Boolean).join(' '); @@ -99,7 +99,7 @@ export function PatternsTab({ context }) { }; const viewingPatternID = viewingPatternData?.id; - const autoResetPatternOnChange = !window.parent?.location.pathname.includes('oodles'); + const autoResetPatternOnChange = !isUdels(); return (
diff --git a/website/src/repl/panel/Reference.jsx b/website/src/repl/components/panel/Reference.jsx similarity index 76% rename from website/src/repl/panel/Reference.jsx rename to website/src/repl/components/panel/Reference.jsx index 9483e9c5..6411ea7b 100644 --- a/website/src/repl/panel/Reference.jsx +++ b/website/src/repl/components/panel/Reference.jsx @@ -1,5 +1,7 @@ -import jsdocJson from '../../../../doc.json'; -const visibleFunctions = jsdocJson.docs +import { useMemo, useState } from 'react'; + +import jsdocJson from '../../../../../doc.json'; +const availableFunctions = jsdocJson.docs .filter(({ name, description }) => name && !name.startsWith('_') && !!description) .sort((a, b) => /* a.meta.filename.localeCompare(b.meta.filename) + */ a.name.localeCompare(b.name)); @@ -10,9 +12,29 @@ const getInnerText = (html) => { }; export function Reference() { + const [search, setSearch] = useState(''); + + const visibleFunctions = useMemo(() => { + return availableFunctions.filter((entry) => { + if (!search) { + return true; + } + + return entry.name.includes(search) || (entry.synonyms?.some((s) => s.includes(search)) ?? false); + }); + }, [search]); + return (
+
+ setSearch(event.target.value)} + /> +
{visibleFunctions.map((entry, i) => ( - + {' ' + label} ); @@ -77,6 +80,8 @@ const fontFamilyOptions = { galactico: 'galactico', }; +const RELOAD_MSG = 'Changing this setting requires the window to reload itself. OK?'; + export function SettingsTab({ started }) { const { theme, @@ -95,19 +100,41 @@ export function SettingsTab({ started }) { fontFamily, panelPosition, audioDeviceName, + audioEngineTarget, } = useSettings(); - + const shouldAlwaysSync = isUdels(); + const canChangeAudioDevice = AudioContext.prototype.setSinkId != null; return (
- {AudioContext.prototype.setSinkId != null && ( + {canChangeAudioDevice && ( settingsMap.setKey('audioDeviceName', audioDeviceName)} + onChange={(audioDeviceName) => { + confirmDialog(RELOAD_MSG).then((r) => { + if (r == true) { + settingsMap.setKey('audioDeviceName', audioDeviceName); + return window.location.reload(); + } + }); + }} /> )} + + { + confirmDialog(RELOAD_MSG).then((r) => { + if (r == true) { + settingsMap.setKey('audioEngineTarget', target); + return window.location.reload(); + } + }); + }} + /> + settingsMap.setKey('theme', theme)} /> @@ -192,11 +219,15 @@ export function SettingsTab({ started }) { { - if (confirm('Changing this setting requires the window to reload itself. OK?')) { - settingsMap.setKey('isSyncEnabled', cbEvent.target.checked); - window.location.reload(); - } + const newVal = cbEvent.target.checked; + confirmDialog(RELOAD_MSG).then((r) => { + if (r) { + settingsMap.setKey('isSyncEnabled', newVal); + window.location.reload(); + } + }); }} + disabled={shouldAlwaysSync} value={isSyncEnabled} /> @@ -205,9 +236,11 @@ export function SettingsTab({ started }) {