diff --git a/my-patterns/README.md b/my-patterns/README.md index 2f8544be..b7f416c6 100644 --- a/my-patterns/README.md +++ b/my-patterns/README.md @@ -3,18 +3,60 @@ This directory can be used to save your own patterns, which then get made into a pattern swatch. -0. fork and clone the strudel repository -1. run `npm run setup` in the strudel folder -1. Save one or more .txt files in this folder -2. run `npm run repl` in the top-level strudel folder -3. open `http://localhost:3000/swatch/` ! +Example: ## deploy -1. in your fork, go to settings -> pages and select "Github Actions" as source -2. edit `website/public/CNAME` to contain `.github.io/strudel` -3. edit `website/astro.config.mjs` to use site: `https://.github.io` and base `/strudel` -4. go to Actions -> `Build and Deploy` and click `Run workflow` -5. view your patterns at `.github.io/strudel/swatch/` +### 1. fork the [strudel repo on github](https://github.com/tidalcycles/strudel.git) + +### 2. clone your fork to your machine `git clone https://github.com//strudel.git strudel && cd strudel` + +### 3. create a separate branch like `git branch patternuary && git checkout patternuary` + +### 4. save one or more .txt files in the my-patterns folder + +### 5. edit `website/public/CNAME` to contain `.github.io/strudel` + +### 6. edit `website/astro.config.mjs` to use site: `https://.github.io` and base `/strudel`, like this + +```js +export default defineConfig({ + /* ... rest of config ... */ + site: 'https://.github.io', + base: '/strudel', +}); +``` + +### 7. commit & push the changes + +```sh +git add . && git commit -m "site config" && git push --set-upstream origin +``` + +### 8. deploy to github pages + +- go to settings -> pages and select "Github Actions" as source +- go to settings -> environments -> github-pages and press the edit button next to `main` and type in `patternuary` (under "Deployment branches") +- go to Actions -> `Build and Deploy` and click `Run workflow` with branch `patternuary` + +### 9. view your patterns at `.github.io/strudel/swatch/` Alternatively, github pages allows you to use a custom domain, like https://mycooldomain.org/swatch/. [See their documentation for details](https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-github-pages-site). + +### 10. optional: automatic deployment + +If you want to automatically deploy your site on push, go to `deploy.yml` and change `workflow_dispatch` to `push`. + +## running locally + +- install dependencies with `npm run setup` +- run dev server with `npm run repl` and open `http://localhost:3000/strudel/swatch/` + +## tests fail? + +Your tests might fail if the code does not follow prettiers format. +In that case, run `npm run codeformat`. To disable that, remove `npm run format-check` from `test.yml` + +## updating your fork + +To update your fork, you can pull the main branch and merge it into your `patternuary` branch. diff --git a/packages/core/animate.mjs b/packages/core/animate.mjs index 4ebb71ff..80e8501b 100644 --- a/packages/core/animate.mjs +++ b/packages/core/animate.mjs @@ -22,11 +22,11 @@ Pattern.prototype.animate = function ({ callback, sync = false, smear = 0.5 } = ctx.fillStyle = clearColor; ctx.fillRect(0, 0, ww, wh); frame.forEach((f) => { - let { x, y, w, h, s, r, a = 0, fill = 'darkseagreen' } = f.value; + let { x, y, w, h, s, r, angle = 0, fill = 'darkseagreen' } = f.value; w *= ww; h *= wh; - if (r !== undefined && a !== undefined) { - const radians = a * 2 * Math.PI; + if (r !== undefined && angle !== undefined) { + const radians = angle * 2 * Math.PI; const [cx, cy] = [(ww - w) / 2, (wh - h) / 2]; x = cx + Math.cos(radians) * r * cx; y = cy + Math.sin(radians) * r * cy; @@ -51,7 +51,7 @@ Pattern.prototype.animate = function ({ callback, sync = false, smear = 0.5 } = return silence; }; -export const { x, y, w, h, a, r, fill, smear } = createParams('x', 'y', 'w', 'h', 'a', 'r', 'fill', 'smear'); +export const { x, y, w, h, angle, r, fill, smear } = createParams('x', 'y', 'w', 'h', 'angle', 'r', 'fill', 'smear'); export const rescale = register('rescale', function (f, pat) { return pat.mul(x(f).w(f).y(f).h(f)); diff --git a/packages/core/draw.mjs b/packages/core/draw.mjs index 7260e654..4bfd3257 100644 --- a/packages/core/draw.mjs +++ b/packages/core/draw.mjs @@ -59,3 +59,9 @@ export const cleanupDraw = (clearScreen = true) => { clearInterval(window.strudelScheduler); } }; + +Pattern.prototype.onPaint = function (onPaint) { + // this is evil! TODO: add pattern.context + this.context = { onPaint }; + return this; +}; diff --git a/packages/core/euclid.mjs b/packages/core/euclid.mjs index 6aa2283d..d8560c8e 100644 --- a/packages/core/euclid.mjs +++ b/packages/core/euclid.mjs @@ -46,7 +46,7 @@ const _bjork = function (n, x) { return Math.min(ons, offs) <= 1 ? [n, x] : _bjork(...(ons > offs ? left(n, x) : right(n, x))); }; -const bjork = function (ons, steps) { +export const bjork = function (ons, steps) { const offs = steps - ons; const x = Array(ons).fill([1]); const y = Array(offs).fill([0]); diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index a11841a6..c12cf2b0 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -334,7 +334,12 @@ export class Pattern { * silence */ queryArc(begin, end) { - return this.query(new State(new TimeSpan(begin, end))); + try { + return this.query(new State(new TimeSpan(begin, end))); + } catch (err) { + logger(`[query]: ${err.message}`, 'error'); + return []; + } } /** @@ -2060,6 +2065,7 @@ export const velocity = register('velocity', function (velocity, pat) { */ // TODO - fix export const legato = register('legato', function (value, pat) { + value = Fraction(value); return pat.withHapSpan((span) => new TimeSpan(span.begin, span.begin.add(span.end.sub(span.begin).mul(value)))); }); diff --git a/packages/core/pianoroll.mjs b/packages/core/pianoroll.mjs index 34ce1d4b..eecb274f 100644 --- a/packages/core/pianoroll.mjs +++ b/packages/core/pianoroll.mjs @@ -283,3 +283,15 @@ export function pianoroll({ ctx.stroke(); return this; } + +function getOptions(drawTime, options = {}) { + let [lookbehind, lookahead] = drawTime; + lookbehind = Math.abs(lookbehind); + const cycles = lookahead + lookbehind; + const playhead = lookbehind / cycles; + return { fold: 1, ...options, cycles, playhead }; +} + +Pattern.prototype.punchcard = function (options) { + return this.onPaint((ctx, time, haps, drawTime) => pianoroll({ ctx, time, haps, ...getOptions(drawTime, options) })); +}; diff --git a/packages/core/repl.mjs b/packages/core/repl.mjs index c71019ac..045f2102 100644 --- a/packages/core/repl.mjs +++ b/packages/core/repl.mjs @@ -12,8 +12,8 @@ export function repl({ afterEval, getTime, transpiler, - editPattern, onToggle, + editPattern, }) { const scheduler = new Cyclist({ interval, @@ -35,7 +35,7 @@ export function repl({ getTime, onToggle, }); - setTime(() => scheduler.getPhase()); // TODO: refactor? + setTime(() => scheduler.now()); // TODO: refactor? const evaluate = async (code, autostart = true) => { if (!code) { throw new Error('no code to evaluate'); diff --git a/packages/core/signal.mjs b/packages/core/signal.mjs index bd6815e2..7309a19f 100644 --- a/packages/core/signal.mjs +++ b/packages/core/signal.mjs @@ -114,6 +114,14 @@ const timeToRands = (t, n) => timeToRandsPrime(timeToIntSeed(t), n); * */ +/** + * A discrete pattern of numbers from 0 to n-1 + * @example + * run(4).scale('C4 major').note() + * // "0 1 2 3".scale('C4 major').note() + */ +export const run = (n) => saw.range(0, n).floor().segment(n); + /** * A continuous pattern of random numbers, between 0 and 1. * diff --git a/packages/core/test/pattern.test.mjs b/packages/core/test/pattern.test.mjs index 2a91e142..a4c04e80 100644 --- a/packages/core/test/pattern.test.mjs +++ b/packages/core/test/pattern.test.mjs @@ -44,6 +44,7 @@ import { ply, rev, time, + run, } from '../index.mjs'; import { steady } from '../signal.mjs'; @@ -908,6 +909,11 @@ describe('Pattern', () => { ); }); }); + describe('run', () => { + it('Can run', () => { + expect(run(4).firstCycle()).toStrictEqual(sequence(0, 1, 2, 3).firstCycle()); + }); + }); describe('linger', () => { it('Can linger on the first quarter of a cycle', () => { expect(sequence(0, 1, 2, 3, 4, 5, 6, 7).linger(0.25).firstCycle()).toStrictEqual( diff --git a/packages/react/dist/index.cjs.js b/packages/react/dist/index.cjs.js index 5e9d79dc..6837f4d8 100644 --- a/packages/react/dist/index.cjs.js +++ b/packages/react/dist/index.cjs.js @@ -1 +1 @@ -"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t=require("react"),ee=require("@uiw/react-codemirror"),E=require("@codemirror/view"),H=require("@codemirror/state"),te=require("@codemirror/lang-javascript"),i=require("@lezer/highlight"),re=require("@uiw/codemirror-themes"),B=require("@strudel.cycles/core"),W=require("@strudel.cycles/webaudio"),ae=require("react-hook-inview"),oe=require("@strudel.cycles/transpiler"),$=e=>e&&typeof e=="object"&&"default"in e?e:{default:e},u=$(t),ne=$(ee),se=re.createTheme({theme:"dark",settings:{background:"#222",foreground:"#75baff",caret:"#ffcc00",selection:"rgba(128, 203, 196, 0.5)",selectionMatch:"#036dd626",lineHighlight:"#00000050",gutterBackground:"transparent",gutterForeground:"#8a919966"},styles:[{tag:i.tags.keyword,color:"#c792ea"},{tag:i.tags.operator,color:"#89ddff"},{tag:i.tags.special(i.tags.variableName),color:"#eeffff"},{tag:i.tags.typeName,color:"#c3e88d"},{tag:i.tags.atom,color:"#f78c6c"},{tag:i.tags.number,color:"#c3e88d"},{tag:i.tags.definition(i.tags.variableName),color:"#82aaff"},{tag:i.tags.string,color:"#c3e88d"},{tag:i.tags.special(i.tags.string),color:"#c3e88d"},{tag:i.tags.comment,color:"#7d8799"},{tag:i.tags.variableName,color:"#c792ea"},{tag:i.tags.tagName,color:"#c3e88d"},{tag:i.tags.bracket,color:"#525154"},{tag:i.tags.meta,color:"#ffcb6b"},{tag:i.tags.attributeName,color:"#c792ea"},{tag:i.tags.propertyName,color:"#c792ea"},{tag:i.tags.className,color:"#decb6b"},{tag:i.tags.invalid,color:"#ffffff"}]});const j=H.StateEffect.define(),ce=H.StateField.define({create(){return E.Decoration.none},update(e,a){try{for(let r of a.effects)if(r.is(j))if(r.value){const s=E.Decoration.mark({attributes:{style:"background-color: #FFCA2880"}});e=E.Decoration.set([s.range(0,a.newDoc.length)])}else e=E.Decoration.set([]);return e}catch(r){return console.warn("flash error",r),e}},provide:e=>E.EditorView.decorations.from(e)}),J=e=>{e.dispatch({effects:j.of(!0)}),setTimeout(()=>{e.dispatch({effects:j.of(!1)})},200)},P=H.StateEffect.define(),ie=H.StateField.define({create(){return E.Decoration.none},update(e,a){try{for(let r of a.effects)if(r.is(P)){const s=r.value.map(n=>(n.context.locations||[]).map(({start:l,end:d})=>{const m=n.context.color||"#FFCA28";let o=a.newDoc.line(l.line).from+l.column,f=a.newDoc.line(d.line).from+d.column;const b=a.newDoc.length;return o>b||f>b?void 0:E.Decoration.mark({attributes:{style:`outline: 1.5px solid ${m};`}}).range(o,f)})).flat().filter(Boolean)||[];e=E.Decoration.set(s,!0)}return e}catch{return E.Decoration.set([])}},provide:e=>E.EditorView.decorations.from(e)}),le=[te.javascript(),se,ie,ce];function G({value:e,onChange:a,onViewChanged:r,onSelectionChange:s,options:n,editorDidMount:l}){const d=t.useCallback(f=>{a?.(f)},[a]),m=t.useCallback(f=>{r?.(f)},[r]),o=t.useCallback(f=>{f.selectionSet&&s&&s?.(f.state.selection)},[s]);return u.default.createElement(u.default.Fragment,null,u.default.createElement(ne.default,{value:e,onChange:d,onCreateEditor:m,onUpdate:o,extensions:le}))}function O(...e){return e.filter(Boolean).join(" ")}function Q({view:e,pattern:a,active:r,getTime:s}){const n=t.useRef([]),l=t.useRef();t.useEffect(()=>{if(e)if(a&&r){let d=requestAnimationFrame(function m(){try{const o=s(),b=[Math.max(l.current||o,o-1/10,0),o+1/60];l.current=b[1],n.current=n.current.filter(p=>p.whole.end>o);const v=a.queryArc(...b).filter(p=>p.hasOnset());n.current=n.current.concat(v),e.dispatch({effects:P.of(n.current)})}catch{e.dispatch({effects:P.of([])})}d=requestAnimationFrame(m)});return()=>{cancelAnimationFrame(d)}}else n.current=[],e.dispatch({effects:P.of([])})},[a,r,e])}function ue(e,a=!1){const r=t.useRef(),s=t.useRef(),n=m=>{if(s.current!==void 0){const o=m-s.current;e(m,o)}s.current=m,r.current=requestAnimationFrame(n)},l=()=>{r.current=requestAnimationFrame(n)},d=()=>{r.current&&cancelAnimationFrame(r.current),delete r.current};return t.useEffect(()=>{r.current&&(d(),l())},[e]),t.useEffect(()=>(a&&l(),d),[]),{start:l,stop:d}}function de({pattern:e,started:a,getTime:r,onDraw:s}){let n=t.useRef([]),l=t.useRef(null);const{start:d,stop:m}=ue(t.useCallback(()=>{const o=r();if(l.current===null){l.current=o;return}const f=e.queryArc(Math.max(l.current,o-1/10),o),b=4;l.current=o,n.current=(n.current||[]).filter(v=>v.whole.end>o-b).concat(f.filter(v=>v.hasOnset())),s(o,n.current)},[e]));t.useEffect(()=>{a?d():(n.current=[],m())},[a])}function X(e){return t.useEffect(()=>(window.addEventListener("message",e),()=>window.removeEventListener("message",e)),[e]),t.useCallback(a=>window.postMessage(a,"*"),[])}function Y({defaultOutput:e,interval:a,getTime:r,evalOnMount:s=!1,initialCode:n="",autolink:l=!1,beforeEval:d,afterEval:m,editPattern:o,onEvalError:f,onToggle:b,canvasId:v}){const p=t.useMemo(()=>fe(),[]);v=v||`canvas-${p}`;const[k,D]=t.useState(),[q,F]=t.useState(),[w,N]=t.useState(n),[C,T]=t.useState(),[z,R]=t.useState(),[S,V]=t.useState(!1),x=w!==C,{scheduler:M,evaluate:c,start:g,stop:_,pause:I}=t.useMemo(()=>B.repl({interval:a,defaultOutput:e,onSchedulerError:D,onEvalError:h=>{F(h),f?.(h)},getTime:r,transpiler:oe.transpiler,beforeEval:({code:h})=>{N(h),d?.()},editPattern:o?h=>o(h,p):void 0,afterEval:({pattern:h,code:L})=>{T(L),R(h),F(),D(),l&&(window.location.hash="#"+encodeURIComponent(btoa(L))),m?.()},onToggle:h=>{V(h),b?.(h)}}),[e,a,r]),Z=X(({data:{from:h,type:L}})=>{L==="start"&&h!==p&&_()}),A=t.useCallback(async(h=!0)=>{await c(w,h),Z({type:"start",from:p})},[c,w]),K=t.useRef();return t.useEffect(()=>{!K.current&&s&&w&&(K.current=!0,A())},[A,s,w]),t.useEffect(()=>()=>{M.stop()},[M]),{id:p,canvasId:v,code:w,setCode:N,error:k||q,schedulerError:k,scheduler:M,evalError:q,evaluate:c,activateCode:A,activeCode:C,isDirty:x,pattern:z,started:S,start:g,stop:_,pause:I,togglePlay:async()=>{S?M.pause():await A()}}}function fe(){return Math.floor((1+Math.random())*65536).toString(16).substring(1)}function U({type:e}){return u.default.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",className:"sc-h-5 sc-w-5",viewBox:"0 0 20 20",fill:"currentColor"},{refresh:u.default.createElement("path",{fillRule:"evenodd",d:"M4 2a1 1 0 011 1v2.101a7.002 7.002 0 0111.601 2.566 1 1 0 11-1.885.666A5.002 5.002 0 005.999 7H9a1 1 0 010 2H4a1 1 0 01-1-1V3a1 1 0 011-1zm.008 9.057a1 1 0 011.276.61A5.002 5.002 0 0014.001 13H11a1 1 0 110-2h5a1 1 0 011 1v5a1 1 0 11-2 0v-2.101a7.002 7.002 0 01-11.601-2.566 1 1 0 01.61-1.276z",clipRule:"evenodd"}),play:u.default.createElement("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zM9.555 7.168A1 1 0 008 8v4a1 1 0 001.555.832l3-2a1 1 0 000-1.664l-3-2z",clipRule:"evenodd"}),pause:u.default.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zM7 8a1 1 0 012 0v4a1 1 0 11-2 0V8zm5-1a1 1 0 00-1 1v4a1 1 0 102 0V8a1 1 0 00-1-1z",clipRule:"evenodd"})}[e])}const ge="_container_3i85k_1",me="_header_3i85k_5",he="_buttons_3i85k_9",pe="_button_3i85k_9",ve="_buttonDisabled_3i85k_17",be="_error_3i85k_21",Ee="_body_3i85k_25",y={container:ge,header:me,buttons:he,button:pe,buttonDisabled:ve,error:be,body:Ee},we=()=>W.getAudioContext().currentTime;function ye({tune:e,hideOutsideView:a=!1,enableKeyboard:r,withCanvas:s=!1,canvasHeight:n=200}){const{code:l,setCode:d,evaluate:m,activateCode:o,error:f,isDirty:b,activeCode:v,pattern:p,started:k,scheduler:D,togglePlay:q,stop:F,canvasId:w,id:N}=Y({initialCode:e,defaultOutput:W.webaudioOutput,getTime:we,editPattern:(c,g)=>c.withContext(_=>({..._,id:g}))});de({pattern:p,started:s&&k,getTime:()=>D.now(),onDraw:(c,g)=>{const _=document.querySelector("#"+w).getContext("2d");B.pianoroll({ctx:_,time:c,haps:g,autorange:1,fold:1,playhead:1})}});const[C,T]=t.useState(),[z,R]=ae.useInView({threshold:.01}),S=t.useRef(),V=t.useMemo(()=>((R||!a)&&(S.current=!0),R||S.current),[R,a]);Q({view:C,pattern:p,active:k&&!v?.includes("strudel disable-highlighting"),getTime:()=>D.getPhase()}),t.useLayoutEffect(()=>{if(r){const c=async g=>{(g.ctrlKey||g.altKey)&&(g.code==="Enter"?(g.preventDefault(),J(C),await o()):g.code==="Period"&&(F(),g.preventDefault()))};return window.addEventListener("keydown",c,!0),()=>window.removeEventListener("keydown",c,!0)}},[r,p,l,m,F,C]);const[x,M]=t.useState([]);return ke(t.useCallback(c=>{const{data:g}=c.detail;g?.hap?.context?.id===N&&M(I=>I.concat([c.detail]).slice(-10))},[])),u.default.createElement("div",{className:y.container,ref:z},u.default.createElement("div",{className:y.header},u.default.createElement("div",{className:y.buttons},u.default.createElement("button",{className:O(y.button,k?"sc-animate-pulse":""),onClick:()=>q()},u.default.createElement(U,{type:k?"pause":"play"})),u.default.createElement("button",{className:O(b?y.button:y.buttonDisabled),onClick:()=>o()},u.default.createElement(U,{type:"refresh"}))),f&&u.default.createElement("div",{className:y.error},f.message)),u.default.createElement("div",{className:y.body},V&&u.default.createElement(G,{value:l,onChange:d,onViewChanged:T})),s&&u.default.createElement("canvas",{id:w,className:"w-full pointer-events-none",height:n,ref:c=>{c&&c.width!==c.clientWidth&&(c.width=c.clientWidth)}}),!!x.length&&u.default.createElement("div",{className:"sc-bg-gray-800 sc-rounded-md sc-p-2"},x.map(({message:c},g)=>u.default.createElement("div",{key:g},c))))}function ke(e){_e(B.logger.key,e)}function _e(e,a,r=!1){t.useEffect(()=>(document.addEventListener(e,a,r),()=>{document.removeEventListener(e,a,r)}),[a])}const Ce=e=>t.useLayoutEffect(()=>(window.addEventListener("keydown",e,!0),()=>window.removeEventListener("keydown",e,!0)),[e]);exports.CodeMirror=G;exports.MiniRepl=ye;exports.cx=O;exports.flash=J;exports.useHighlighting=Q;exports.useKeydown=Ce;exports.usePostMessage=X;exports.useStrudel=Y; +"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t=require("react"),de=require("@uiw/react-codemirror"),w=require("@codemirror/view"),V=require("@codemirror/state"),fe=require("@codemirror/lang-javascript"),d=require("@lezer/highlight"),ge=require("@uiw/codemirror-themes"),Z=require("@strudel.cycles/webaudio"),me=require("react-hook-inview"),T=require("@strudel.cycles/core"),he=require("@strudel.cycles/transpiler"),ee=e=>e&&typeof e=="object"&&"default"in e?e:{default:e},f=ee(t),pe=ee(de),ve=ge.createTheme({theme:"dark",settings:{background:"#222",foreground:"#75baff",caret:"#ffcc00",selection:"rgba(128, 203, 196, 0.5)",selectionMatch:"#036dd626",lineHighlight:"#00000050",gutterBackground:"transparent",gutterForeground:"#8a919966"},styles:[{tag:d.tags.keyword,color:"#c792ea"},{tag:d.tags.operator,color:"#89ddff"},{tag:d.tags.special(d.tags.variableName),color:"#eeffff"},{tag:d.tags.typeName,color:"#c3e88d"},{tag:d.tags.atom,color:"#f78c6c"},{tag:d.tags.number,color:"#c3e88d"},{tag:d.tags.definition(d.tags.variableName),color:"#82aaff"},{tag:d.tags.string,color:"#c3e88d"},{tag:d.tags.special(d.tags.string),color:"#c3e88d"},{tag:d.tags.comment,color:"#7d8799"},{tag:d.tags.variableName,color:"#c792ea"},{tag:d.tags.tagName,color:"#c3e88d"},{tag:d.tags.bracket,color:"#525154"},{tag:d.tags.meta,color:"#ffcb6b"},{tag:d.tags.attributeName,color:"#c792ea"},{tag:d.tags.propertyName,color:"#c792ea"},{tag:d.tags.className,color:"#decb6b"},{tag:d.tags.invalid,color:"#ffffff"}]});const J=V.StateEffect.define(),be=V.StateField.define({create(){return w.Decoration.none},update(e,r){try{for(let o of r.effects)if(o.is(J))if(o.value){const n=w.Decoration.mark({attributes:{style:"background-color: #FFCA2880"}});e=w.Decoration.set([n.range(0,r.newDoc.length)])}else e=w.Decoration.set([]);return e}catch(o){return console.warn("flash error",o),e}},provide:e=>w.EditorView.decorations.from(e)}),te=e=>{e.dispatch({effects:J.of(!0)}),setTimeout(()=>{e.dispatch({effects:J.of(!1)})},200)},z=V.StateEffect.define(),Ee=V.StateField.define({create(){return w.Decoration.none},update(e,r){try{for(let o of r.effects)if(o.is(z)){const n=o.value.map(u=>(u.context.locations||[]).map(({start:m,end:g})=>{const s=u.context.color||"#FFCA28";let l=r.newDoc.line(m.line).from+m.column,p=r.newDoc.line(g.line).from+g.column;const E=r.newDoc.length;return l>E||p>E?void 0:w.Decoration.mark({attributes:{style:`outline: 1.5px solid ${s};`}}).range(l,p)})).flat().filter(Boolean)||[];e=w.Decoration.set(n,!0)}return e}catch{return w.Decoration.set([])}},provide:e=>w.EditorView.decorations.from(e)}),ye=[fe.javascript(),ve,Ee,be];function re({value:e,onChange:r,onViewChanged:o,onSelectionChange:n,options:u,editorDidMount:m}){const g=t.useCallback(p=>{r?.(p)},[r]),s=t.useCallback(p=>{o?.(p)},[o]),l=t.useCallback(p=>{p.selectionSet&&n&&n?.(p.state.selection)},[n]);return f.default.createElement(f.default.Fragment,null,f.default.createElement(pe.default,{value:e,onChange:g,onCreateEditor:s,onUpdate:l,extensions:ye}))}function G(...e){return e.filter(Boolean).join(" ")}function oe({view:e,pattern:r,active:o,getTime:n}){const u=t.useRef([]),m=t.useRef(0);t.useEffect(()=>{if(e)if(r&&o){m.current=0;let g=requestAnimationFrame(function s(){try{const l=n(),E=[Math.max(m.current??l,l-1/10,-.01),l+1/60];m.current=E[1],u.current=u.current.filter(h=>h.whole.end>l);const i=r.queryArc(...E).filter(h=>h.hasOnset());u.current=u.current.concat(i),e.dispatch({effects:z.of(u.current)})}catch{e.dispatch({effects:z.of([])})}g=requestAnimationFrame(s)});return()=>{cancelAnimationFrame(g)}}else u.current=[],e.dispatch({effects:z.of([])})},[r,o,e])}function we(e,r=!1){const o=t.useRef(),n=t.useRef(),u=s=>{if(n.current!==void 0){const l=s-n.current;e(s,l)}n.current=s,o.current=requestAnimationFrame(u)},m=()=>{o.current=requestAnimationFrame(u)},g=()=>{o.current&&cancelAnimationFrame(o.current),delete o.current};return t.useEffect(()=>{o.current&&(g(),m())},[e]),t.useEffect(()=>(r&&m(),g),[]),{start:m,stop:g}}function ke({pattern:e,started:r,getTime:o,onDraw:n,drawTime:u=[-2,2]}){let[m,g]=u;m=Math.abs(m);let s=t.useRef([]),l=t.useRef(null);t.useEffect(()=>{if(e&&r){const i=o(),h=e.queryArc(Math.max(i,0),i+g+.1);s.current=s.current.filter(v=>v.whole.begin{const i=o()+g;if(l.current===null){l.current=i;return}const h=e.queryArc(Math.max(l.current,i-1/10),i);l.current=i,s.current=(s.current||[]).filter(v=>v.whole.end>=i-m-g).concat(h.filter(v=>v.hasOnset())),n(e,i-g,s.current,u)},[e]));return t.useEffect(()=>{r?p():(s.current=[],E())},[r]),{clear:()=>{s.current=[]}}}function ne(e){return t.useEffect(()=>(window.addEventListener("message",e),()=>window.removeEventListener("message",e)),[e]),t.useCallback(r=>window.postMessage(r,"*"),[])}function ae({defaultOutput:e,interval:r,getTime:o,evalOnMount:n=!1,initialCode:u="",autolink:m=!1,beforeEval:g,afterEval:s,editPattern:l,onEvalError:p,onToggle:E,canvasId:i,drawContext:h,drawTime:v=[-2,2]}){const F=t.useMemo(()=>_e(),[]);i=i||`canvas-${F}`;const[S,D]=t.useState(),[N,x]=t.useState(),[y,L]=t.useState(u),[P,A]=t.useState(),[R,O]=t.useState(),[M,H]=t.useState(!1),j=y!==P,q=t.useCallback(c=>!!(c?.context?.onPaint&&h),[h]),{scheduler:C,evaluate:a,start:b,stop:B,pause:I}=t.useMemo(()=>T.repl({interval:r,defaultOutput:e,onSchedulerError:D,onEvalError:c=>{x(c),p?.(c)},getTime:o,drawContext:h,transpiler:he.transpiler,editPattern:l,beforeEval:({code:c})=>{L(c),g?.()},afterEval:({pattern:c,code:k})=>{A(k),O(c),x(),D(),m&&(window.location.hash="#"+encodeURIComponent(btoa(k))),s?.()},onToggle:c=>{H(c),E?.(c)}}),[e,r,o]),se=ne(({data:{from:c,type:k}})=>{k==="start"&&c!==F&&B()}),Q=t.useCallback(async(c=!0)=>{const k=await a(y,c);return se({type:"start",from:F}),k},[a,y]),K=t.useCallback((c,k,W,$)=>{const{onPaint:ie}=c.context||{},ue=typeof h=="function"?h(i):h;ie?.(ue,k,W,$)},[h,i]),U=t.useCallback(c=>{if(q(c)){const[k,W]=v,$=c.queryArc(0,W);K(c,-.001,$,v)}},[v,K,q]),X=t.useRef();t.useEffect(()=>{!X.current&&n&&y&&(X.current=!0,a(y,!1).then(c=>U(c)))},[n,y,a,U]),t.useEffect(()=>()=>{C.stop()},[C]);const ce=async()=>{M?(C.stop(),U(R)):await Q()},le=S||N;return ke({pattern:R,started:q(R)&&M,getTime:()=>C.now(),drawTime:v,onDraw:K}),{id:F,canvasId:i,code:y,setCode:L,error:le,schedulerError:S,scheduler:C,evalError:N,evaluate:a,activateCode:Q,activeCode:P,isDirty:j,pattern:R,started:M,start:b,stop:B,pause:I,togglePlay:ce}}function _e(){return Math.floor((1+Math.random())*65536).toString(16).substring(1)}function Y({type:e}){return f.default.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",className:"sc-h-5 sc-w-5",viewBox:"0 0 20 20",fill:"currentColor"},{refresh:f.default.createElement("path",{fillRule:"evenodd",d:"M4 2a1 1 0 011 1v2.101a7.002 7.002 0 0111.601 2.566 1 1 0 11-1.885.666A5.002 5.002 0 005.999 7H9a1 1 0 010 2H4a1 1 0 01-1-1V3a1 1 0 011-1zm.008 9.057a1 1 0 011.276.61A5.002 5.002 0 0014.001 13H11a1 1 0 110-2h5a1 1 0 011 1v5a1 1 0 11-2 0v-2.101a7.002 7.002 0 01-11.601-2.566 1 1 0 01.61-1.276z",clipRule:"evenodd"}),play:f.default.createElement("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zM9.555 7.168A1 1 0 008 8v4a1 1 0 001.555.832l3-2a1 1 0 000-1.664l-3-2z",clipRule:"evenodd"}),pause:f.default.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zM7 8a1 1 0 012 0v4a1 1 0 11-2 0V8zm5-1a1 1 0 00-1 1v4a1 1 0 102 0V8a1 1 0 00-1-1z",clipRule:"evenodd"}),stop:f.default.createElement("path",{fillRule:"evenodd",d:"M2 10a8 8 0 1116 0 8 8 0 01-16 0zm5-2.25A.75.75 0 017.75 7h4.5a.75.75 0 01.75.75v4.5a.75.75 0 01-.75.75h-4.5a.75.75 0 01-.75-.75v-4.5z",clipRule:"evenodd"})}[e])}const Me="_container_3i85k_1",Ce="_header_3i85k_5",Fe="_buttons_3i85k_9",De="_button_3i85k_9",Re="_buttonDisabled_3i85k_17",qe="_error_3i85k_21",Se="_body_3i85k_25",_={container:Me,header:Ce,buttons:Fe,button:De,buttonDisabled:Re,error:qe,body:Se},Ae=()=>Z.getAudioContext().currentTime;function Ne({tune:e,hideOutsideView:r=!1,enableKeyboard:o,drawTime:n,punchcard:u,canvasHeight:m=200}){n=n||(u?[0,4]:void 0);const g=!!n,s=t.useCallback(n?a=>document.querySelector("#"+a)?.getContext("2d"):null,[n]),{code:l,setCode:p,evaluate:E,activateCode:i,error:h,isDirty:v,activeCode:F,pattern:S,started:D,scheduler:N,togglePlay:x,stop:y,canvasId:L,id:P}=ae({initialCode:e,defaultOutput:Z.webaudioOutput,editPattern:a=>u?a.punchcard():a,getTime:Ae,evalOnMount:g,drawContext:s,drawTime:n}),[A,R]=t.useState(),[O,M]=me.useInView({threshold:.01}),H=t.useRef(),j=t.useMemo(()=>((M||!r)&&(H.current=!0),M||H.current),[M,r]);oe({view:A,pattern:S,active:D&&!F?.includes("strudel disable-highlighting"),getTime:()=>N.now()}),t.useLayoutEffect(()=>{if(o){const a=async b=>{(b.ctrlKey||b.altKey)&&(b.code==="Enter"?(b.preventDefault(),te(A),await i()):b.code==="Period"&&(y(),b.preventDefault()))};return window.addEventListener("keydown",a,!0),()=>window.removeEventListener("keydown",a,!0)}},[o,S,l,E,y,A]);const[q,C]=t.useState([]);return xe(t.useCallback(a=>{const{data:b}=a.detail;b?.hap?.context?.id===P&&C(I=>I.concat([a.detail]).slice(-10))},[])),f.default.createElement("div",{className:_.container,ref:O},f.default.createElement("div",{className:_.header},f.default.createElement("div",{className:_.buttons},f.default.createElement("button",{className:G(_.button,D?"sc-animate-pulse":""),onClick:()=>x()},f.default.createElement(Y,{type:D?"stop":"play"})),f.default.createElement("button",{className:G(v?_.button:_.buttonDisabled),onClick:()=>i()},f.default.createElement(Y,{type:"refresh"}))),h&&f.default.createElement("div",{className:_.error},h.message)),f.default.createElement("div",{className:_.body},j&&f.default.createElement(re,{value:l,onChange:p,onViewChanged:R})),n&&f.default.createElement("canvas",{id:L,className:"w-full pointer-events-none",height:m,ref:a=>{a&&a.width!==a.clientWidth&&(a.width=a.clientWidth)}}),!!q.length&&f.default.createElement("div",{className:"sc-bg-gray-800 sc-rounded-md sc-p-2"},q.map(({message:a},b)=>f.default.createElement("div",{key:b},a))))}function xe(e){Le(T.logger.key,e)}function Le(e,r,o=!1){t.useEffect(()=>(document.addEventListener(e,r,o),()=>{document.removeEventListener(e,r,o)}),[r])}const Pe=e=>t.useLayoutEffect(()=>(window.addEventListener("keydown",e,!0),()=>window.removeEventListener("keydown",e,!0)),[e]);exports.CodeMirror=re;exports.MiniRepl=Ne;exports.cx=G;exports.flash=te;exports.useHighlighting=oe;exports.useKeydown=Pe;exports.usePostMessage=ne;exports.useStrudel=ae; diff --git a/packages/react/dist/index.es.js b/packages/react/dist/index.es.js index d0027424..4aecb645 100644 --- a/packages/react/dist/index.es.js +++ b/packages/react/dist/index.es.js @@ -1,15 +1,15 @@ -import l, { useCallback as N, useRef as k, useEffect as _, useMemo as K, useState as w, useLayoutEffect as G } from "react"; -import Z from "@uiw/react-codemirror"; -import { Decoration as y, EditorView as J } from "@codemirror/view"; -import { StateEffect as Q, StateField as X } from "@codemirror/state"; -import { javascript as ee } from "@codemirror/lang-javascript"; -import { tags as s } from "@lezer/highlight"; -import { createTheme as te } from "@uiw/codemirror-themes"; -import { repl as re, logger as ne, pianoroll as oe } from "@strudel.cycles/core"; -import { webaudioOutput as ae, getAudioContext as ce } from "@strudel.cycles/webaudio"; -import { useInView as se } from "react-hook-inview"; -import { transpiler as ie } from "@strudel.cycles/transpiler"; -const le = te({ +import d, { useCallback as E, useRef as A, useEffect as k, useMemo as Q, useState as _, useLayoutEffect as te } from "react"; +import ue from "@uiw/react-codemirror"; +import { Decoration as M, EditorView as re } from "@codemirror/view"; +import { StateEffect as ne, StateField as oe } from "@codemirror/state"; +import { javascript as de } from "@codemirror/lang-javascript"; +import { tags as u } from "@lezer/highlight"; +import { createTheme as fe } from "@uiw/codemirror-themes"; +import { webaudioOutput as me, getAudioContext as he } from "@strudel.cycles/webaudio"; +import { useInView as ge } from "react-hook-inview"; +import { repl as pe, logger as ve } from "@strudel.cycles/core"; +import { transpiler as be } from "@strudel.cycles/transpiler"; +const Ee = fe({ theme: "dark", settings: { background: "#222", @@ -22,380 +22,421 @@ const le = te({ gutterForeground: "#8a919966" }, styles: [ - { tag: s.keyword, color: "#c792ea" }, - { tag: s.operator, color: "#89ddff" }, - { tag: s.special(s.variableName), color: "#eeffff" }, - { tag: s.typeName, color: "#c3e88d" }, - { tag: s.atom, color: "#f78c6c" }, - { tag: s.number, color: "#c3e88d" }, - { tag: s.definition(s.variableName), color: "#82aaff" }, - { tag: s.string, color: "#c3e88d" }, - { tag: s.special(s.string), color: "#c3e88d" }, - { tag: s.comment, color: "#7d8799" }, - { tag: s.variableName, color: "#c792ea" }, - { tag: s.tagName, color: "#c3e88d" }, - { tag: s.bracket, color: "#525154" }, - { tag: s.meta, color: "#ffcb6b" }, - { tag: s.attributeName, color: "#c792ea" }, - { tag: s.propertyName, color: "#c792ea" }, - { tag: s.className, color: "#decb6b" }, - { tag: s.invalid, color: "#ffffff" } + { tag: u.keyword, color: "#c792ea" }, + { tag: u.operator, color: "#89ddff" }, + { tag: u.special(u.variableName), color: "#eeffff" }, + { tag: u.typeName, color: "#c3e88d" }, + { tag: u.atom, color: "#f78c6c" }, + { tag: u.number, color: "#c3e88d" }, + { tag: u.definition(u.variableName), color: "#82aaff" }, + { tag: u.string, color: "#c3e88d" }, + { tag: u.special(u.string), color: "#c3e88d" }, + { tag: u.comment, color: "#7d8799" }, + { tag: u.variableName, color: "#c792ea" }, + { tag: u.tagName, color: "#c3e88d" }, + { tag: u.bracket, color: "#525154" }, + { tag: u.meta, color: "#ffcb6b" }, + { tag: u.attributeName, color: "#c792ea" }, + { tag: u.propertyName, color: "#c792ea" }, + { tag: u.className, color: "#decb6b" }, + { tag: u.invalid, color: "#ffffff" } ] }); -const j = Q.define(), ue = X.define({ +const X = ne.define(), ye = oe.define({ create() { - return y.none; + return M.none; }, - update(e, r) { + update(e, t) { try { - for (let t of r.effects) - if (t.is(j)) - if (t.value) { - const a = y.mark({ attributes: { style: "background-color: #FFCA2880" } }); - e = y.set([a.range(0, r.newDoc.length)]); + for (let r of t.effects) + if (r.is(X)) + if (r.value) { + const n = M.mark({ attributes: { style: "background-color: #FFCA2880" } }); + e = M.set([n.range(0, t.newDoc.length)]); } else - e = y.set([]); + e = M.set([]); return e; - } catch (t) { - return console.warn("flash error", t), e; + } catch (r) { + return console.warn("flash error", r), e; } }, - provide: (e) => J.decorations.from(e) -}), de = (e) => { - e.dispatch({ effects: j.of(!0) }), setTimeout(() => { - e.dispatch({ effects: j.of(!1) }); + provide: (e) => re.decorations.from(e) +}), we = (e) => { + e.dispatch({ effects: X.of(!0) }), setTimeout(() => { + e.dispatch({ effects: X.of(!1) }); }, 200); -}, z = Q.define(), fe = X.define({ +}, B = ne.define(), ke = oe.define({ create() { - return y.none; + return M.none; }, - update(e, r) { + update(e, t) { try { - for (let t of r.effects) - if (t.is(z)) { - const a = t.value.map( - (o) => (o.context.locations || []).map(({ start: i, end: u }) => { - const m = o.context.color || "#FFCA28"; - let n = r.newDoc.line(i.line).from + i.column, d = r.newDoc.line(u.line).from + u.column; - const v = r.newDoc.length; - return n > v || d > v ? void 0 : y.mark({ attributes: { style: `outline: 1.5px solid ${m};` } }).range(n, d); + for (let r of t.effects) + if (r.is(B)) { + const n = r.value.map( + (l) => (l.context.locations || []).map(({ start: m, end: f }) => { + const c = l.context.color || "#FFCA28"; + let s = t.newDoc.line(m.line).from + m.column, g = t.newDoc.line(f.line).from + f.column; + const b = t.newDoc.length; + return s > b || g > b ? void 0 : M.mark({ attributes: { style: `outline: 1.5px solid ${c};` } }).range(s, g); }) ).flat().filter(Boolean) || []; - e = y.set(a, !0); + e = M.set(n, !0); } return e; } catch { - return y.set([]); + return M.set([]); } }, - provide: (e) => J.decorations.from(e) -}), me = [ee(), le, fe, ue]; -function ge({ value: e, onChange: r, onViewChanged: t, onSelectionChange: a, options: o, editorDidMount: i }) { - const u = N( - (d) => { - r?.(d); - }, - [r] - ), m = N( - (d) => { - t?.(d); + provide: (e) => re.decorations.from(e) +}), Fe = [de(), Ee, ke, ye]; +function _e({ value: e, onChange: t, onViewChanged: r, onSelectionChange: n, options: l, editorDidMount: m }) { + const f = E( + (g) => { + t?.(g); }, [t] - ), n = N( - (d) => { - d.selectionSet && a && a?.(d.state.selection); + ), c = E( + (g) => { + r?.(g); }, - [a] + [r] + ), s = E( + (g) => { + g.selectionSet && n && n?.(g.state.selection); + }, + [n] ); - return /* @__PURE__ */ l.createElement(l.Fragment, null, /* @__PURE__ */ l.createElement(Z, { + return /* @__PURE__ */ d.createElement(d.Fragment, null, /* @__PURE__ */ d.createElement(ue, { value: e, - onChange: u, - onCreateEditor: m, - onUpdate: n, - extensions: me + onChange: f, + onCreateEditor: c, + onUpdate: s, + extensions: Fe })); } -function W(...e) { +function T(...e) { return e.filter(Boolean).join(" "); } -function pe({ view: e, pattern: r, active: t, getTime: a }) { - const o = k([]), i = k(); - _(() => { +function Me({ view: e, pattern: t, active: r, getTime: n }) { + const l = A([]), m = A(0); + k(() => { if (e) - if (r && t) { - let u = requestAnimationFrame(function m() { + if (t && r) { + m.current = 0; + let f = requestAnimationFrame(function c() { try { - const n = a(), v = [Math.max(i.current || n, n - 1 / 10, 0), n + 1 / 60]; - i.current = v[1], o.current = o.current.filter((p) => p.whole.end > n); - const h = r.queryArc(...v).filter((p) => p.hasOnset()); - o.current = o.current.concat(h), e.dispatch({ effects: z.of(o.current) }); + const s = n(), b = [Math.max(m.current ?? s, s - 1 / 10, -0.01), s + 1 / 60]; + m.current = b[1], l.current = l.current.filter((h) => h.whole.end > s); + const i = t.queryArc(...b).filter((h) => h.hasOnset()); + l.current = l.current.concat(i), e.dispatch({ effects: B.of(l.current) }); } catch { - e.dispatch({ effects: z.of([]) }); + e.dispatch({ effects: B.of([]) }); } - u = requestAnimationFrame(m); + f = requestAnimationFrame(c); }); return () => { - cancelAnimationFrame(u); + cancelAnimationFrame(f); }; } else - o.current = [], e.dispatch({ effects: z.of([]) }); - }, [r, t, e]); + l.current = [], e.dispatch({ effects: B.of([]) }); + }, [t, r, e]); } -function he(e, r = !1) { - const t = k(), a = k(), o = (m) => { - if (a.current !== void 0) { - const n = m - a.current; - e(m, n); +function Ae(e, t = !1) { + const r = A(), n = A(), l = (c) => { + if (n.current !== void 0) { + const s = c - n.current; + e(c, s); } - a.current = m, t.current = requestAnimationFrame(o); - }, i = () => { - t.current = requestAnimationFrame(o); - }, u = () => { - t.current && cancelAnimationFrame(t.current), delete t.current; + n.current = c, r.current = requestAnimationFrame(l); + }, m = () => { + r.current = requestAnimationFrame(l); + }, f = () => { + r.current && cancelAnimationFrame(r.current), delete r.current; }; - return _(() => { - t.current && (u(), i()); - }, [e]), _(() => (r && i(), u), []), { - start: i, - stop: u + return k(() => { + r.current && (f(), m()); + }, [e]), k(() => (t && m(), f), []), { + start: m, + stop: f }; } -function ve({ pattern: e, started: r, getTime: t, onDraw: a }) { - let o = k([]), i = k(null); - const { start: u, stop: m } = he( - N(() => { - const n = t(); - if (i.current === null) { - i.current = n; +function Ne({ pattern: e, started: t, getTime: r, onDraw: n, drawTime: l = [-2, 2] }) { + let [m, f] = l; + m = Math.abs(m); + let c = A([]), s = A(null); + k(() => { + if (e && t) { + const i = r(), h = e.queryArc(Math.max(i, 0), i + f + 0.1); + c.current = c.current.filter((p) => p.whole.begin < i), c.current = c.current.concat(h); + } + }, [e, t]); + const { start: g, stop: b } = Ae( + E(() => { + const i = r() + f; + if (s.current === null) { + s.current = i; return; } - const d = e.queryArc(Math.max(i.current, n - 1 / 10), n), v = 4; - i.current = n, o.current = (o.current || []).filter((h) => h.whole.end > n - v).concat(d.filter((h) => h.hasOnset())), a(n, o.current); + const h = e.queryArc(Math.max(s.current, i - 1 / 10), i); + s.current = i, c.current = (c.current || []).filter((p) => p.whole.end >= i - m - f).concat(h.filter((p) => p.hasOnset())), n(e, i - f, c.current, l); }, [e]) ); - _(() => { - r ? u() : (o.current = [], m()); - }, [r]); -} -function be(e) { - return _(() => (window.addEventListener("message", e), () => window.removeEventListener("message", e)), [e]), N((r) => window.postMessage(r, "*"), []); -} -function Ee({ - defaultOutput: e, - interval: r, - getTime: t, - evalOnMount: a = !1, - initialCode: o = "", - autolink: i = !1, - beforeEval: u, - afterEval: m, - editPattern: n, - onEvalError: d, - onToggle: v, - canvasId: h -}) { - const p = K(() => we(), []); - h = h || `canvas-${p}`; - const [F, A] = w(), [P, D] = w(), [b, q] = w(o), [x, V] = w(), [I, R] = w(), [L, B] = w(!1), H = b !== x, { scheduler: M, evaluate: c, start: f, stop: C, pause: O } = K( - () => re({ - interval: r, - defaultOutput: e, - onSchedulerError: A, - onEvalError: (g) => { - D(g), d?.(g); - }, - getTime: t, - transpiler: ie, - beforeEval: ({ code: g }) => { - q(g), u?.(); - }, - editPattern: n ? (g) => n(g, p) : void 0, - afterEval: ({ pattern: g, code: T }) => { - V(T), R(g), D(), A(), i && (window.location.hash = "#" + encodeURIComponent(btoa(T))), m?.(); - }, - onToggle: (g) => { - B(g), v?.(g); - } - }), - [e, r, t] - ), Y = be(({ data: { from: g, type: T } }) => { - T === "start" && g !== p && C(); - }), S = N( - async (g = !0) => { - await c(b, g), Y({ type: "start", from: p }); - }, - [c, b] - ), U = k(); - return _(() => { - !U.current && a && b && (U.current = !0, S()); - }, [S, a, b]), _(() => () => { - M.stop(); - }, [M]), { - id: p, - canvasId: h, - code: b, - setCode: q, - error: F || P, - schedulerError: F, - scheduler: M, - evalError: P, - evaluate: c, - activateCode: S, - activeCode: x, - isDirty: H, - pattern: I, - started: L, - start: f, - stop: C, - pause: O, - togglePlay: async () => { - L ? M.pause() : await S(); + return k(() => { + t ? g() : (c.current = [], b()); + }, [t]), { + clear: () => { + c.current = []; } }; } -function we() { +function Ce(e) { + return k(() => (window.addEventListener("message", e), () => window.removeEventListener("message", e)), [e]), E((t) => window.postMessage(t, "*"), []); +} +function De({ + defaultOutput: e, + interval: t, + getTime: r, + evalOnMount: n = !1, + initialCode: l = "", + autolink: m = !1, + beforeEval: f, + afterEval: c, + editPattern: s, + onEvalError: g, + onToggle: b, + canvasId: i, + drawContext: h, + drawTime: p = [-2, 2] +}) { + const D = Q(() => Re(), []); + i = i || `canvas-${D}`; + const [P, R] = _(), [z, H] = _(), [y, S] = _(l), [V, q] = _(), [x, I] = _(), [N, O] = _(!1), K = y !== V, L = E((a) => !!(a?.context?.onPaint && h), [h]), { scheduler: C, evaluate: o, start: v, stop: j, pause: U } = Q( + () => pe({ + interval: t, + defaultOutput: e, + onSchedulerError: R, + onEvalError: (a) => { + H(a), g?.(a); + }, + getTime: r, + drawContext: h, + transpiler: be, + editPattern: s, + beforeEval: ({ code: a }) => { + S(a), f?.(); + }, + afterEval: ({ pattern: a, code: w }) => { + q(w), I(a), H(), R(), m && (window.location.hash = "#" + encodeURIComponent(btoa(w))), c?.(); + }, + onToggle: (a) => { + O(a), b?.(a); + } + }), + [e, t, r] + ), ce = Ce(({ data: { from: a, type: w } }) => { + w === "start" && a !== D && j(); + }), Y = E( + async (a = !0) => { + const w = await o(y, a); + return ce({ type: "start", from: D }), w; + }, + [o, y] + ), W = E( + (a, w, G, J) => { + const { onPaint: ie } = a.context || {}, le = typeof h == "function" ? h(i) : h; + ie?.(le, w, G, J); + }, + [h, i] + ), $ = E( + (a) => { + if (L(a)) { + const [w, G] = p, J = a.queryArc(0, G); + W(a, -1e-3, J, p); + } + }, + [p, W, L] + ), Z = A(); + k(() => { + !Z.current && n && y && (Z.current = !0, o(y, !1).then((a) => $(a))); + }, [n, y, o, $]), k(() => () => { + C.stop(); + }, [C]); + const ae = async () => { + N ? (C.stop(), $(x)) : await Y(); + }, se = P || z; + return Ne({ + pattern: x, + started: L(x) && N, + getTime: () => C.now(), + drawTime: p, + onDraw: W + }), { + id: D, + canvasId: i, + code: y, + setCode: S, + error: se, + schedulerError: P, + scheduler: C, + evalError: z, + evaluate: o, + activateCode: Y, + activeCode: V, + isDirty: K, + pattern: x, + started: N, + start: v, + stop: j, + pause: U, + togglePlay: ae + }; +} +function Re() { return Math.floor((1 + Math.random()) * 65536).toString(16).substring(1); } -function $({ type: e }) { - return /* @__PURE__ */ l.createElement("svg", { +function ee({ type: e }) { + return /* @__PURE__ */ d.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "sc-h-5 sc-w-5", viewBox: "0 0 20 20", fill: "currentColor" }, { - refresh: /* @__PURE__ */ l.createElement("path", { + refresh: /* @__PURE__ */ d.createElement("path", { fillRule: "evenodd", d: "M4 2a1 1 0 011 1v2.101a7.002 7.002 0 0111.601 2.566 1 1 0 11-1.885.666A5.002 5.002 0 005.999 7H9a1 1 0 010 2H4a1 1 0 01-1-1V3a1 1 0 011-1zm.008 9.057a1 1 0 011.276.61A5.002 5.002 0 0014.001 13H11a1 1 0 110-2h5a1 1 0 011 1v5a1 1 0 11-2 0v-2.101a7.002 7.002 0 01-11.601-2.566 1 1 0 01.61-1.276z", clipRule: "evenodd" }), - play: /* @__PURE__ */ l.createElement("path", { + play: /* @__PURE__ */ d.createElement("path", { fillRule: "evenodd", d: "M10 18a8 8 0 100-16 8 8 0 000 16zM9.555 7.168A1 1 0 008 8v4a1 1 0 001.555.832l3-2a1 1 0 000-1.664l-3-2z", clipRule: "evenodd" }), - pause: /* @__PURE__ */ l.createElement("path", { + pause: /* @__PURE__ */ d.createElement("path", { fillRule: "evenodd", d: "M18 10a8 8 0 11-16 0 8 8 0 0116 0zM7 8a1 1 0 012 0v4a1 1 0 11-2 0V8zm5-1a1 1 0 00-1 1v4a1 1 0 102 0V8a1 1 0 00-1-1z", clipRule: "evenodd" + }), + stop: /* @__PURE__ */ d.createElement("path", { + fillRule: "evenodd", + d: "M2 10a8 8 0 1116 0 8 8 0 01-16 0zm5-2.25A.75.75 0 017.75 7h4.5a.75.75 0 01.75.75v4.5a.75.75 0 01-.75.75h-4.5a.75.75 0 01-.75-.75v-4.5z", + clipRule: "evenodd" }) }[e]); } -const ye = "_container_3i85k_1", ke = "_header_3i85k_5", _e = "_buttons_3i85k_9", Fe = "_button_3i85k_9", Ce = "_buttonDisabled_3i85k_17", Ne = "_error_3i85k_21", xe = "_body_3i85k_25", E = { - container: ye, - header: ke, - buttons: _e, - button: Fe, - buttonDisabled: Ce, - error: Ne, - body: xe -}, Me = () => ce().currentTime; -function je({ tune: e, hideOutsideView: r = !1, enableKeyboard: t, withCanvas: a = !1, canvasHeight: o = 200 }) { - const { - code: i, - setCode: u, - evaluate: m, - activateCode: n, - error: d, - isDirty: v, - activeCode: h, - pattern: p, - started: F, - scheduler: A, - togglePlay: P, - stop: D, - canvasId: b, - id: q - } = Ee({ +const xe = "_container_3i85k_1", Le = "_header_3i85k_5", Pe = "_buttons_3i85k_9", qe = "_button_3i85k_9", ze = "_buttonDisabled_3i85k_17", He = "_error_3i85k_21", Se = "_body_3i85k_25", F = { + container: xe, + header: Le, + buttons: Pe, + button: qe, + buttonDisabled: ze, + error: He, + body: Se +}, Ve = () => he().currentTime; +function Ze({ tune: e, hideOutsideView: t = !1, enableKeyboard: r, drawTime: n, punchcard: l, canvasHeight: m = 200 }) { + n = n || (l ? [0, 4] : void 0); + const f = !!n, c = E( + n ? (o) => document.querySelector("#" + o)?.getContext("2d") : null, + [n] + ), { + code: s, + setCode: g, + evaluate: b, + activateCode: i, + error: h, + isDirty: p, + activeCode: D, + pattern: P, + started: R, + scheduler: z, + togglePlay: H, + stop: y, + canvasId: S, + id: V + } = De({ initialCode: e, - defaultOutput: ae, - getTime: Me, - editPattern: (c, f) => c.withContext((C) => ({ ...C, id: f })) - }); - ve({ - pattern: p, - started: a && F, - getTime: () => A.now(), - onDraw: (c, f) => { - const C = document.querySelector("#" + b).getContext("2d"); - oe({ ctx: C, time: c, haps: f, autorange: 1, fold: 1, playhead: 1 }); - } - }); - const [x, V] = w(), [I, R] = se({ + defaultOutput: me, + editPattern: (o) => l ? o.punchcard() : o, + getTime: Ve, + evalOnMount: f, + drawContext: c, + drawTime: n + }), [q, x] = _(), [I, N] = ge({ threshold: 0.01 - }), L = k(), B = K(() => ((R || !r) && (L.current = !0), R || L.current), [R, r]); - pe({ - view: x, - pattern: p, - active: F && !h?.includes("strudel disable-highlighting"), - getTime: () => A.getPhase() - }), G(() => { - if (t) { - const c = async (f) => { - (f.ctrlKey || f.altKey) && (f.code === "Enter" ? (f.preventDefault(), de(x), await n()) : f.code === "Period" && (D(), f.preventDefault())); + }), O = A(), K = Q(() => ((N || !t) && (O.current = !0), N || O.current), [N, t]); + Me({ + view: q, + pattern: P, + active: R && !D?.includes("strudel disable-highlighting"), + getTime: () => z.now() + }), te(() => { + if (r) { + const o = async (v) => { + (v.ctrlKey || v.altKey) && (v.code === "Enter" ? (v.preventDefault(), we(q), await i()) : v.code === "Period" && (y(), v.preventDefault())); }; - return window.addEventListener("keydown", c, !0), () => window.removeEventListener("keydown", c, !0); + return window.addEventListener("keydown", o, !0), () => window.removeEventListener("keydown", o, !0); } - }, [t, p, i, m, D, x]); - const [H, M] = w([]); - return Ae( - N((c) => { - const { data: f } = c.detail; - f?.hap?.context?.id === q && M((O) => O.concat([c.detail]).slice(-10)); + }, [r, P, s, b, y, q]); + const [L, C] = _([]); + return Oe( + E((o) => { + const { data: v } = o.detail; + v?.hap?.context?.id === V && C((U) => U.concat([o.detail]).slice(-10)); }, []) - ), /* @__PURE__ */ l.createElement("div", { - className: E.container, + ), /* @__PURE__ */ d.createElement("div", { + className: F.container, ref: I - }, /* @__PURE__ */ l.createElement("div", { - className: E.header - }, /* @__PURE__ */ l.createElement("div", { - className: E.buttons - }, /* @__PURE__ */ l.createElement("button", { - className: W(E.button, F ? "sc-animate-pulse" : ""), - onClick: () => P() - }, /* @__PURE__ */ l.createElement($, { - type: F ? "pause" : "play" - })), /* @__PURE__ */ l.createElement("button", { - className: W(v ? E.button : E.buttonDisabled), - onClick: () => n() - }, /* @__PURE__ */ l.createElement($, { + }, /* @__PURE__ */ d.createElement("div", { + className: F.header + }, /* @__PURE__ */ d.createElement("div", { + className: F.buttons + }, /* @__PURE__ */ d.createElement("button", { + className: T(F.button, R ? "sc-animate-pulse" : ""), + onClick: () => H() + }, /* @__PURE__ */ d.createElement(ee, { + type: R ? "stop" : "play" + })), /* @__PURE__ */ d.createElement("button", { + className: T(p ? F.button : F.buttonDisabled), + onClick: () => i() + }, /* @__PURE__ */ d.createElement(ee, { type: "refresh" - }))), d && /* @__PURE__ */ l.createElement("div", { - className: E.error - }, d.message)), /* @__PURE__ */ l.createElement("div", { - className: E.body - }, B && /* @__PURE__ */ l.createElement(ge, { - value: i, - onChange: u, - onViewChanged: V - })), a && /* @__PURE__ */ l.createElement("canvas", { - id: b, + }))), h && /* @__PURE__ */ d.createElement("div", { + className: F.error + }, h.message)), /* @__PURE__ */ d.createElement("div", { + className: F.body + }, K && /* @__PURE__ */ d.createElement(_e, { + value: s, + onChange: g, + onViewChanged: x + })), n && /* @__PURE__ */ d.createElement("canvas", { + id: S, className: "w-full pointer-events-none", - height: o, - ref: (c) => { - c && c.width !== c.clientWidth && (c.width = c.clientWidth); + height: m, + ref: (o) => { + o && o.width !== o.clientWidth && (o.width = o.clientWidth); } - }), !!H.length && /* @__PURE__ */ l.createElement("div", { + }), !!L.length && /* @__PURE__ */ d.createElement("div", { className: "sc-bg-gray-800 sc-rounded-md sc-p-2" - }, H.map(({ message: c }, f) => /* @__PURE__ */ l.createElement("div", { - key: f - }, c)))); + }, L.map(({ message: o }, v) => /* @__PURE__ */ d.createElement("div", { + key: v + }, o)))); } -function Ae(e) { - De(ne.key, e); +function Oe(e) { + Be(ve.key, e); } -function De(e, r, t = !1) { - _(() => (document.addEventListener(e, r, t), () => { - document.removeEventListener(e, r, t); - }), [r]); +function Be(e, t, r = !1) { + k(() => (document.addEventListener(e, t, r), () => { + document.removeEventListener(e, t, r); + }), [t]); } -const Ue = (e) => G(() => (window.addEventListener("keydown", e, !0), () => window.removeEventListener("keydown", e, !0)), [e]); +const Te = (e) => te(() => (window.addEventListener("keydown", e, !0), () => window.removeEventListener("keydown", e, !0)), [e]); export { - ge as CodeMirror, - je as MiniRepl, - W as cx, - de as flash, - pe as useHighlighting, - Ue as useKeydown, - be as usePostMessage, - Ee as useStrudel + _e as CodeMirror, + Ze as MiniRepl, + T as cx, + we as flash, + Me as useHighlighting, + Te as useKeydown, + Ce as usePostMessage, + De as useStrudel }; diff --git a/packages/react/src/components/Icon.tsx b/packages/react/src/components/Icon.tsx index 0ae722a3..28a8a374 100644 --- a/packages/react/src/components/Icon.tsx +++ b/packages/react/src/components/Icon.tsx @@ -26,6 +26,13 @@ export function Icon({ type }) { clipRule="evenodd" /> ), + stop: ( + + ), }[type] } diff --git a/packages/react/src/components/MiniRepl.jsx b/packages/react/src/components/MiniRepl.jsx index 70ebe22c..6b647dfb 100644 --- a/packages/react/src/components/MiniRepl.jsx +++ b/packages/react/src/components/MiniRepl.jsx @@ -1,11 +1,9 @@ -import { pianoroll } from '@strudel.cycles/core'; import { getAudioContext, webaudioOutput } from '@strudel.cycles/webaudio'; import React, { useLayoutEffect, useMemo, useRef, useState, useCallback, useEffect } from 'react'; import { useInView } from 'react-hook-inview'; import 'tailwindcss/tailwind.css'; import cx from '../cx'; import useHighlighting from '../hooks/useHighlighting.mjs'; -import usePatternFrame from '../hooks/usePatternFrame.mjs'; import useStrudel from '../hooks/useStrudel.mjs'; import CodeMirror6, { flash } from './CodeMirror6'; import { Icon } from './Icon'; @@ -15,7 +13,13 @@ import { logger } from '@strudel.cycles/core'; const getTime = () => getAudioContext().currentTime; -export function MiniRepl({ tune, hideOutsideView = false, enableKeyboard, withCanvas = false, canvasHeight = 200 }) { +export function MiniRepl({ tune, hideOutsideView = false, enableKeyboard, drawTime, punchcard, canvasHeight = 200 }) { + drawTime = drawTime || (punchcard ? [0, 4] : undefined); + const evalOnMount = !!drawTime; + const drawContext = useCallback( + !!drawTime ? (canvasId) => document.querySelector('#' + canvasId)?.getContext('2d') : null, + [drawTime], + ); const { code, setCode, @@ -34,25 +38,13 @@ export function MiniRepl({ tune, hideOutsideView = false, enableKeyboard, withCa } = useStrudel({ initialCode: tune, defaultOutput: webaudioOutput, + editPattern: (pat) => (punchcard ? pat.punchcard() : pat), getTime, - editPattern: (pat, id) => { - return pat.withContext((ctx) => ({ ...ctx, id })); - }, + evalOnMount, + drawContext, + drawTime, }); - usePatternFrame({ - pattern, - started: withCanvas && started, - getTime: () => scheduler.now(), - onDraw: (time, haps) => { - const ctx = document.querySelector('#' + canvasId).getContext('2d'); - pianoroll({ ctx, time, haps, autorange: 1, fold: 1, playhead: 1 }); - }, - }); - - /* useEffect(() => { - init && activateCode(); - }, [init, activateCode]); */ const [view, setView] = useState(); const [ref, isVisible] = useInView({ threshold: 0.01, @@ -68,7 +60,7 @@ export function MiniRepl({ tune, hideOutsideView = false, enableKeyboard, withCa view, pattern, active: started && !activeCode?.includes('strudel disable-highlighting'), - getTime: () => scheduler.getPhase(), + getTime: () => scheduler.now(), }); // set active pattern on ctrl+enter @@ -110,7 +102,7 @@ export function MiniRepl({ tune, hideOutsideView = false, enableKeyboard, withCa togglePlay()}> - + activateCode()}> @@ -121,7 +113,7 @@ export function MiniRepl({ tune, hideOutsideView = false, enableKeyboard, withCa {show && } - {withCanvas && ( + {drawTime && ( { if (view) { if (pattern && active) { + lastEnd.current = 0; let frame = requestAnimationFrame(function updateHighlights() { try { const audioTime = getTime(); // force min framerate of 10 fps => fixes crash on tab refocus, where lastEnd could be far away // see https://github.com/tidalcycles/strudel/issues/108 - const begin = Math.max(lastEnd.current || audioTime, audioTime - 1 / 10, 0); // negative time seems buggy + const begin = Math.max(lastEnd.current ?? audioTime, audioTime - 1 / 10, -0.01); // negative time seems buggy const span = [begin, audioTime + 1 / 60]; lastEnd.current = span[1]; highlights.current = highlights.current.filter((hap) => hap.whole.end > audioTime); // keep only highlights that are still active diff --git a/packages/react/src/hooks/usePatternFrame.mjs b/packages/react/src/hooks/usePatternFrame.mjs index 53981ca5..065c6ba7 100644 --- a/packages/react/src/hooks/usePatternFrame.mjs +++ b/packages/react/src/hooks/usePatternFrame.mjs @@ -2,23 +2,32 @@ import { useCallback, useEffect, useRef } from 'react'; import 'tailwindcss/tailwind.css'; import useFrame from '../hooks/useFrame.mjs'; -function usePatternFrame({ pattern, started, getTime, onDraw }) { +function usePatternFrame({ pattern, started, getTime, onDraw, drawTime = [-2, 2] }) { + let [lookbehind, lookahead] = drawTime; + lookbehind = Math.abs(lookbehind); let visibleHaps = useRef([]); let lastFrame = useRef(null); + useEffect(() => { + if (pattern && started) { + const t = getTime(); + const futureHaps = pattern.queryArc(Math.max(t, 0), t + lookahead + 0.1); // +0.1 = workaround for weird holes in query.. + visibleHaps.current = visibleHaps.current.filter((h) => h.whole.begin < t); + visibleHaps.current = visibleHaps.current.concat(futureHaps); + } + }, [pattern, started]); const { start: startFrame, stop: stopFrame } = useFrame( useCallback(() => { - const phase = getTime(); + const phase = getTime() + lookahead; if (lastFrame.current === null) { lastFrame.current = phase; return; } const haps = pattern.queryArc(Math.max(lastFrame.current, phase - 1 / 10), phase); - const cycles = 4; lastFrame.current = phase; visibleHaps.current = (visibleHaps.current || []) - .filter((h) => h.whole.end > phase - cycles) // in frame + .filter((h) => h.whole.end >= phase - lookbehind - lookahead) // in frame .concat(haps.filter((h) => h.hasOnset())); - onDraw(phase, visibleHaps.current); + onDraw(pattern, phase - lookahead, visibleHaps.current, drawTime); }, [pattern]), ); useEffect(() => { @@ -29,6 +38,11 @@ function usePatternFrame({ pattern, started, getTime, onDraw }) { stopFrame(); } }, [started]); + return { + clear: () => { + visibleHaps.current = []; + }, + }; } export default usePatternFrame; diff --git a/packages/react/src/hooks/useStrudel.mjs b/packages/react/src/hooks/useStrudel.mjs index 6308cf5e..527aa708 100644 --- a/packages/react/src/hooks/useStrudel.mjs +++ b/packages/react/src/hooks/useStrudel.mjs @@ -1,6 +1,7 @@ import { useRef, useCallback, useEffect, useMemo, useState } from 'react'; import { repl } from '@strudel.cycles/core'; import { transpiler } from '@strudel.cycles/transpiler'; +import usePatternFrame from './usePatternFrame'; import usePostMessage from './usePostMessage.mjs'; function useStrudel({ @@ -16,6 +17,8 @@ function useStrudel({ onEvalError, onToggle, canvasId, + drawContext, + drawTime = [-2, 2], }) { const id = useMemo(() => s4(), []); canvasId = canvasId || `canvas-${id}`; @@ -27,6 +30,7 @@ function useStrudel({ const [pattern, setPattern] = useState(); const [started, setStarted] = useState(false); const isDirty = code !== activeCode; + const shouldPaint = useCallback((pat) => !!(pat?.context?.onPaint && drawContext), [drawContext]); // TODO: make sure this hook reruns when scheduler.started changes const { scheduler, evaluate, start, stop, pause } = useMemo( @@ -40,12 +44,13 @@ function useStrudel({ onEvalError?.(err); }, getTime, + drawContext, transpiler, + editPattern, beforeEval: ({ code }) => { setCode(code); beforeEval?.(); }, - editPattern: editPattern ? (pat) => editPattern(pat, id) : undefined, afterEval: ({ pattern: _pattern, code }) => { setActiveCode(code); setPattern(_pattern); @@ -71,19 +76,41 @@ function useStrudel({ }); const activateCode = useCallback( async (autostart = true) => { - await evaluate(code, autostart); + const res = await evaluate(code, autostart); broadcast({ type: 'start', from: id }); + return res; }, [evaluate, code], ); + const onDraw = useCallback( + (pattern, time, haps, drawTime) => { + const { onPaint } = pattern.context || {}; + const ctx = typeof drawContext === 'function' ? drawContext(canvasId) : drawContext; + onPaint?.(ctx, time, haps, drawTime); + }, + [drawContext, canvasId], + ); + + const drawFirstFrame = useCallback( + (pat) => { + if (shouldPaint(pat)) { + const [_, lookahead] = drawTime; + const haps = pat.queryArc(0, lookahead); + // draw at -0.001 to avoid activating haps at 0 + onDraw(pat, -0.001, haps, drawTime); + } + }, + [drawTime, onDraw, shouldPaint], + ); + const inited = useRef(); useEffect(() => { if (!inited.current && evalOnMount && code) { inited.current = true; - activateCode(); + evaluate(code, false).then((pat) => drawFirstFrame(pat)); } - }, [activateCode, evalOnMount, code]); + }, [evalOnMount, code, evaluate, drawFirstFrame]); // this will stop the scheduler when hot reloading in development useEffect(() => { @@ -94,12 +121,22 @@ function useStrudel({ const togglePlay = async () => { if (started) { - scheduler.pause(); + scheduler.stop(); + drawFirstFrame(pattern); } else { await activateCode(); } }; const error = schedulerError || evalError; + + usePatternFrame({ + pattern, + started: shouldPaint(pattern) && started, + getTime: () => scheduler.now(), + drawTime, + onDraw, + }); + return { id, canvasId, diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index a0c792a4..f9156bc3 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -1736,27 +1736,6 @@ exports[`runs examples > example "fastGap" example index 0 1`] = ` ] `; -exports[`runs examples > example "fastcat" example index 0 1`] = ` -[ - "[ 0/1 → 1/3 | e5 ]", - "[ 1/3 → 2/3 | b4 ]", - "[ 2/3 → 5/6 | d5 ]", - "[ 5/6 → 1/1 | c5 ]", - "[ 1/1 → 4/3 | e5 ]", - "[ 4/3 → 5/3 | b4 ]", - "[ 5/3 → 11/6 | d5 ]", - "[ 11/6 → 2/1 | c5 ]", - "[ 2/1 → 7/3 | e5 ]", - "[ 7/3 → 8/3 | b4 ]", - "[ 8/3 → 17/6 | d5 ]", - "[ 17/6 → 3/1 | c5 ]", - "[ 3/1 → 10/3 | e5 ]", - "[ 10/3 → 11/3 | b4 ]", - "[ 11/3 → 23/6 | d5 ]", - "[ 23/6 → 4/1 | c5 ]", -] -`; - exports[`runs examples > example "firstOf" example index 0 1`] = ` [ "[ 3/4 → 1/1 | note:c3 ]", @@ -3139,6 +3118,27 @@ exports[`runs examples > example "round" example index 0 1`] = ` ] `; +exports[`runs examples > example "run" example index 0 1`] = ` +[ + "[ 0/1 → 1/4 | note:C4 ]", + "[ 1/4 → 1/2 | note:D4 ]", + "[ 1/2 → 3/4 | note:E4 ]", + "[ 3/4 → 1/1 | note:F4 ]", + "[ 1/1 → 5/4 | note:C4 ]", + "[ 5/4 → 3/2 | note:D4 ]", + "[ 3/2 → 7/4 | note:E4 ]", + "[ 7/4 → 2/1 | note:F4 ]", + "[ 2/1 → 9/4 | note:C4 ]", + "[ 9/4 → 5/2 | note:D4 ]", + "[ 5/2 → 11/4 | note:E4 ]", + "[ 11/4 → 3/1 | note:F4 ]", + "[ 3/1 → 13/4 | note:C4 ]", + "[ 13/4 → 7/2 | note:D4 ]", + "[ 7/2 → 15/4 | note:E4 ]", + "[ 15/4 → 4/1 | note:F4 ]", +] +`; + exports[`runs examples > example "s" example index 0 1`] = ` [ "[ 0/1 → 1/2 | s:bd ]", @@ -3484,19 +3484,6 @@ exports[`runs examples > example "sine" example index 0 1`] = ` ] `; -exports[`runs examples > example "size" example index 0 1`] = ` -[ - "[ 0/1 → 1/2 | s:bd room:0.8 size:0 ]", - "[ 1/2 → 1/1 | s:sd room:0.8 size:0 ]", - "[ 1/1 → 3/2 | s:bd room:0.8 size:1 ]", - "[ 3/2 → 2/1 | s:sd room:0.8 size:1 ]", - "[ 2/1 → 5/2 | s:bd room:0.8 size:2 ]", - "[ 5/2 → 3/1 | s:sd room:0.8 size:2 ]", - "[ 3/1 → 7/2 | s:bd room:0.8 size:4 ]", - "[ 7/2 → 4/1 | s:sd room:0.8 size:4 ]", -] -`; - exports[`runs examples > example "slow" example index 0 1`] = ` [ "[ 0/1 → 1/1 | s:bd ]", diff --git a/test/__snapshots__/tunes.test.mjs.snap b/test/__snapshots__/tunes.test.mjs.snap index beda5f0d..5a0bb2db 100644 --- a/test/__snapshots__/tunes.test.mjs.snap +++ b/test/__snapshots__/tunes.test.mjs.snap @@ -7415,663 +7415,663 @@ exports[`renders tunes > tune: holyflute 1`] = ` exports[`renders tunes > tune: hyperpop 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 ⇜ (0/1 → 1/8) | n:G3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:1666.5665766857219 ]", - "[ -3/8 ⇜ (0/1 → 1/8) | n:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:1666.5665766857219 ]", - "[ -1/4 ⇜ (0/1 → 1/4) | n:G3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:1683.1306585059317 ]", - "[ -1/4 ⇜ (0/1 → 1/4) | n:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:1683.1306585059317 ]", - "[ -1/8 ⇜ (0/1 → 3/8) | n:G3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:1699.6897509708342 ]", - "[ -1/8 ⇜ (0/1 → 3/8) | n:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:1699.6897509708342 ]", - "[ (0/1 → 1/3) ⇝ 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 ⇜ (1/3 → 3/8) | n:A5 s:sawtooth gain:0.26103468453995016 attack:0.001 decay:0.2 sustain:0 hcutoff:5998.072590601808 cutoff:4000 ]", - "[ (0/1 → 1/3) ⇝ 3/8 | n:E5 s:sawtooth gain:0.26103468453995016 attack:0.001 decay:0.2 sustain:0 hcutoff:5998.072590601808 cutoff:4000 ]", - "[ 0/1 ⇜ (1/3 → 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 → 2/3) ⇝ 3/4 | n:A5 s:sawtooth gain:0.2828651860235305 attack:0.001 decay:0.2 sustain:0 hcutoff:5982.671142387316 cutoff:4000 ]", - "[ 3/8 ⇜ (2/3 → 3/4) | n:F#5 s:sawtooth gain:0.2828651860235305 attack:0.001 decay:0.2 sustain:0 hcutoff:5982.671142387316 cutoff:4000 ]", - "[ (3/8 → 2/3) ⇝ 3/4 | n:C#5 s:sawtooth gain:0.2828651860235305 attack:0.001 decay:0.2 sustain:0 hcutoff:5982.671142387316 cutoff:4000 ]", - "[ 3/8 ⇜ (2/3 → 3/4) | 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 → 7/12) ⇝ 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 ⇜ (7/12 → 5/8) | n:A5 s:sawtooth gain:0.2756442833140452 attack:0.001 decay:0.2 sustain:0 hcutoff:5989.512318936654 cutoff:4000 ]", - "[ (1/4 → 7/12) ⇝ 5/8 | n:E5 s:sawtooth gain:0.2756442833140452 attack:0.001 decay:0.2 sustain:0 hcutoff:5989.512318936654 cutoff:4000 ]", - "[ 1/4 ⇜ (7/12 → 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 → 11/12) ⇝ 1/1 | n:A5 s:sawtooth gain:0.29705226105983373 attack:0.001 decay:0.2 sustain:0 hcutoff:5963.890147645195 cutoff:4000 ]", - "[ 5/8 ⇜ (11/12 → 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 → 11/12) ⇝ 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 ⇜ (11/12 → 1/1) | n:A4 s:sawtooth gain:0.29705226105983373 attack:0.001 decay:0.2 sustain:0 hcutoff:5963.890147645195 cutoff:4000 ]", - "[ (1/2 → 5/6) ⇝ 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 ⇜ (5/6 → 7/8) | n:A5 s:sawtooth gain:0.29000691362123476 attack:0.001 decay:0.2 sustain:0 hcutoff:5974.128467049176 cutoff:4000 ]", - "[ (1/2 → 5/6) ⇝ 7/8 | n:E5 s:sawtooth gain:0.29000691362123476 attack:0.001 decay:0.2 sustain:0 hcutoff:5974.128467049176 cutoff:4000 ]", - "[ 1/2 ⇜ (5/6 → 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 → 1/1) ⇝ 5/4 | n:A5 s:sawtooth gain:0.3107861971007485 attack:0.001 decay:0.2 sustain:0 hcutoff:5938.355801271282 cutoff:4000 ]", - "[ (7/8 → 1/1) ⇝ 5/4 | n:C#5 s:sawtooth gain:0.3107861971007485 attack:0.001 decay:0.2 sustain:0 hcutoff:5938.355801271282 cutoff:4000 ]", - "[ (3/4 → 1/1) ⇝ 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 → 1/1) ⇝ 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 ⇜ (0/1 → 1/6) ⇝ 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/6 → 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 ⇜ (0/1 → 1/6) ⇝ 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/6 → 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 ⇜ (0/1 → 1/12) ⇝ 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/12 → 1/8) | n:A5 s:sawtooth gain:0.2536811842784369 attack:0.001 decay:0.2 sustain:0 hcutoff:5999.785818935017 cutoff:4000 ]", - "[ -1/4 ⇜ (0/1 → 1/12) ⇝ 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/12 → 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 → 5/12) ⇝ 1/2 | n:A5 s:sawtooth gain:0.26836160127988246 attack:0.001 decay:0.2 sustain:0 hcutoff:5994.647308096509 cutoff:4000 ]", - "[ 1/8 ⇜ (5/12 → 1/2) | n:F#5 s:sawtooth gain:0.26836160127988246 attack:0.001 decay:0.2 sustain:0 hcutoff:5994.647308096509 cutoff:4000 ]", - "[ (1/8 → 5/12) ⇝ 1/2 | n:C#5 s:sawtooth gain:0.26836160127988246 attack:0.001 decay:0.2 sustain:0 hcutoff:5994.647308096509 cutoff:4000 ]", - "[ 1/8 ⇜ (5/12 → 1/2) | 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 ]", + "[ 1/8 → 1/4 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1699.6897509708342 ]", + "[ 1/8 → 1/4 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1699.6897509708342 ]", + "[ 3/8 → 1/2 | note:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1765.826371664994 ]", + "[ 3/8 → 1/2 | note:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1765.826371664994 ]", + "[ 1/2 → 5/8 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1798.799979846742 ]", + "[ 1/2 → 5/8 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1798.799979846742 ]", + "[ 3/4 → 7/8 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1864.4584935007128 ]", + "[ 3/4 → 7/8 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1864.4584935007128 ]", + "[ 7/8 → 1/1 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1897.1038487394403 ]", + "[ 7/8 → 1/1 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1897.1038487394403 ]", + "[ -3/8 ⇜ (0/1 → 1/8) | note:G3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:1666.5665766857219 ]", + "[ -3/8 ⇜ (0/1 → 1/8) | note:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:1666.5665766857219 ]", + "[ -1/4 ⇜ (0/1 → 1/4) | note:G3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:1683.1306585059317 ]", + "[ -1/4 ⇜ (0/1 → 1/4) | note:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:1683.1306585059317 ]", + "[ -1/8 ⇜ (0/1 → 3/8) | note:G3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:1699.6897509708342 ]", + "[ -1/8 ⇜ (0/1 → 3/8) | note:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:1699.6897509708342 ]", + "[ (0/1 → 1/3) ⇝ 3/8 | note:C#6 s:sawtooth gain:0.26103468453995016 attack:0.001 decay:0.2 sustain:0 hcutoff:5998.072590601808 cutoff:4000 ]", + "[ 0/1 ⇜ (1/3 → 3/8) | note:A5 s:sawtooth gain:0.26103468453995016 attack:0.001 decay:0.2 sustain:0 hcutoff:5998.072590601808 cutoff:4000 ]", + "[ (0/1 → 1/3) ⇝ 3/8 | note:E5 s:sawtooth gain:0.26103468453995016 attack:0.001 decay:0.2 sustain:0 hcutoff:5998.072590601808 cutoff:4000 ]", + "[ 0/1 ⇜ (1/3 → 3/8) | note:C#5 s:sawtooth gain:0.26103468453995016 attack:0.001 decay:0.2 sustain:0 hcutoff:5998.072590601808 cutoff:4000 ]", + "[ (3/8 → 2/3) ⇝ 3/4 | note:A5 s:sawtooth gain:0.2828651860235305 attack:0.001 decay:0.2 sustain:0 hcutoff:5982.671142387316 cutoff:4000 ]", + "[ 3/8 ⇜ (2/3 → 3/4) | note:F#5 s:sawtooth gain:0.2828651860235305 attack:0.001 decay:0.2 sustain:0 hcutoff:5982.671142387316 cutoff:4000 ]", + "[ (3/8 → 2/3) ⇝ 3/4 | note:C#5 s:sawtooth gain:0.2828651860235305 attack:0.001 decay:0.2 sustain:0 hcutoff:5982.671142387316 cutoff:4000 ]", + "[ 3/8 ⇜ (2/3 → 3/4) | note:A4 s:sawtooth gain:0.2828651860235305 attack:0.001 decay:0.2 sustain:0 hcutoff:5982.671142387316 cutoff:4000 ]", + "[ 3/4 → 1/1 | note:F#5 s:sawtooth gain:0.300533478008833 attack:0.001 decay:0.2 sustain:0 hcutoff:5958.137268909887 cutoff:4000 ]", + "[ 3/4 → 1/1 | note:A4 s:sawtooth gain:0.300533478008833 attack:0.001 decay:0.2 sustain:0 hcutoff:5958.137268909887 cutoff:4000 ]", + "[ (1/4 → 7/12) ⇝ 5/8 | note:C#6 s:sawtooth gain:0.2756442833140452 attack:0.001 decay:0.2 sustain:0 hcutoff:5989.512318936654 cutoff:4000 ]", + "[ 1/4 ⇜ (7/12 → 5/8) | note:A5 s:sawtooth gain:0.2756442833140452 attack:0.001 decay:0.2 sustain:0 hcutoff:5989.512318936654 cutoff:4000 ]", + "[ (1/4 → 7/12) ⇝ 5/8 | note:E5 s:sawtooth gain:0.2756442833140452 attack:0.001 decay:0.2 sustain:0 hcutoff:5989.512318936654 cutoff:4000 ]", + "[ 1/4 ⇜ (7/12 → 5/8) | note:C#5 s:sawtooth gain:0.2756442833140452 attack:0.001 decay:0.2 sustain:0 hcutoff:5989.512318936654 cutoff:4000 ]", + "[ (5/8 → 11/12) ⇝ 1/1 | note:A5 s:sawtooth gain:0.29705226105983373 attack:0.001 decay:0.2 sustain:0 hcutoff:5963.890147645195 cutoff:4000 ]", + "[ 5/8 ⇜ (11/12 → 1/1) | note:F#5 s:sawtooth gain:0.29705226105983373 attack:0.001 decay:0.2 sustain:0 hcutoff:5963.890147645195 cutoff:4000 ]", + "[ (5/8 → 11/12) ⇝ 1/1 | note:C#5 s:sawtooth gain:0.29705226105983373 attack:0.001 decay:0.2 sustain:0 hcutoff:5963.890147645195 cutoff:4000 ]", + "[ 5/8 ⇜ (11/12 → 1/1) | note:A4 s:sawtooth gain:0.29705226105983373 attack:0.001 decay:0.2 sustain:0 hcutoff:5963.890147645195 cutoff:4000 ]", + "[ (1/2 → 5/6) ⇝ 7/8 | note:C#6 s:sawtooth gain:0.29000691362123476 attack:0.001 decay:0.2 sustain:0 hcutoff:5974.128467049176 cutoff:4000 ]", + "[ 1/2 ⇜ (5/6 → 7/8) | note:A5 s:sawtooth gain:0.29000691362123476 attack:0.001 decay:0.2 sustain:0 hcutoff:5974.128467049176 cutoff:4000 ]", + "[ (1/2 → 5/6) ⇝ 7/8 | note:E5 s:sawtooth gain:0.29000691362123476 attack:0.001 decay:0.2 sustain:0 hcutoff:5974.128467049176 cutoff:4000 ]", + "[ 1/2 ⇜ (5/6 → 7/8) | note:C#5 s:sawtooth gain:0.29000691362123476 attack:0.001 decay:0.2 sustain:0 hcutoff:5974.128467049176 cutoff:4000 ]", + "[ (7/8 → 1/1) ⇝ 5/4 | note:A5 s:sawtooth gain:0.3107861971007485 attack:0.001 decay:0.2 sustain:0 hcutoff:5938.355801271282 cutoff:4000 ]", + "[ (7/8 → 1/1) ⇝ 5/4 | note:C#5 s:sawtooth gain:0.3107861971007485 attack:0.001 decay:0.2 sustain:0 hcutoff:5938.355801271282 cutoff:4000 ]", + "[ (3/4 → 1/1) ⇝ 9/8 | note:C#6 s:sawtooth gain:0.30398425548024827 attack:0.001 decay:0.2 sustain:0 hcutoff:5951.963201008076 cutoff:4000 ]", + "[ (3/4 → 1/1) ⇝ 9/8 | note:E5 s:sawtooth gain:0.30398425548024827 attack:0.001 decay:0.2 sustain:0 hcutoff:5951.963201008076 cutoff:4000 ]", + "[ 0/1 → 1/4 | note:F#5 s:sawtooth gain:0.2573601511491127 attack:0.001 decay:0.2 sustain:0 hcutoff:5999.143312438893 cutoff:4000 ]", + "[ 0/1 → 1/4 | note:A4 s:sawtooth gain:0.2573601511491127 attack:0.001 decay:0.2 sustain:0 hcutoff:5999.143312438893 cutoff:4000 ]", + "[ -1/8 ⇜ (0/1 → 1/6) ⇝ 1/4 | note:A5 s:sawtooth gain:0.2573601511491127 attack:0.001 decay:0.2 sustain:0 hcutoff:5999.143312438893 cutoff:4000 ]", + "[ -1/8 ⇜ (1/6 → 1/4) | note:F#5 s:sawtooth gain:0.2573601511491127 attack:0.001 decay:0.2 sustain:0 hcutoff:5999.143312438893 cutoff:4000 ]", + "[ -1/8 ⇜ (0/1 → 1/6) ⇝ 1/4 | note:C#5 s:sawtooth gain:0.2573601511491127 attack:0.001 decay:0.2 sustain:0 hcutoff:5999.143312438893 cutoff:4000 ]", + "[ -1/8 ⇜ (1/6 → 1/4) | note:A4 s:sawtooth gain:0.2573601511491127 attack:0.001 decay:0.2 sustain:0 hcutoff:5999.143312438893 cutoff:4000 ]", + "[ 1/4 → 1/2 | note:F#5 s:sawtooth gain:0.27200957116830426 attack:0.001 decay:0.2 sustain:0 hcutoff:5992.29333433282 cutoff:4000 ]", + "[ 1/4 → 1/2 | note:A4 s:sawtooth gain:0.27200957116830426 attack:0.001 decay:0.2 sustain:0 hcutoff:5992.29333433282 cutoff:4000 ]", + "[ -1/4 ⇜ (0/1 → 1/12) ⇝ 1/8 | note:C#6 s:sawtooth gain:0.2536811842784369 attack:0.001 decay:0.2 sustain:0 hcutoff:5999.785818935017 cutoff:4000 ]", + "[ -1/4 ⇜ (1/12 → 1/8) | note:A5 s:sawtooth gain:0.2536811842784369 attack:0.001 decay:0.2 sustain:0 hcutoff:5999.785818935017 cutoff:4000 ]", + "[ -1/4 ⇜ (0/1 → 1/12) ⇝ 1/8 | note:E5 s:sawtooth gain:0.2536811842784369 attack:0.001 decay:0.2 sustain:0 hcutoff:5999.785818935017 cutoff:4000 ]", + "[ -1/4 ⇜ (1/12 → 1/8) | note:C#5 s:sawtooth gain:0.2536811842784369 attack:0.001 decay:0.2 sustain:0 hcutoff:5999.785818935017 cutoff:4000 ]", + "[ (1/8 → 5/12) ⇝ 1/2 | note:A5 s:sawtooth gain:0.26836160127988246 attack:0.001 decay:0.2 sustain:0 hcutoff:5994.647308096509 cutoff:4000 ]", + "[ 1/8 ⇜ (5/12 → 1/2) | note:F#5 s:sawtooth gain:0.26836160127988246 attack:0.001 decay:0.2 sustain:0 hcutoff:5994.647308096509 cutoff:4000 ]", + "[ (1/8 → 5/12) ⇝ 1/2 | note:C#5 s:sawtooth gain:0.26836160127988246 attack:0.001 decay:0.2 sustain:0 hcutoff:5994.647308096509 cutoff:4000 ]", + "[ 1/8 ⇜ (5/12 → 1/2) | note:A4 s:sawtooth gain:0.26836160127988246 attack:0.001 decay:0.2 sustain:0 hcutoff:5994.647308096509 cutoff:4000 ]", + "[ 1/2 → 3/4 | note:F#5 s:sawtooth gain:0.28644702698548963 attack:0.001 decay:0.2 sustain:0 hcutoff:5978.612153434527 cutoff:4000 ]", + "[ 1/2 → 3/4 | note:A4 s:sawtooth gain:0.28644702698548963 attack:0.001 decay:0.2 sustain:0 hcutoff:5978.612153434527 cutoff:4000 ]", "[ 0/1 → 1/4 | s:bd gain:0.7 ]", "[ 1/2 → 3/4 | s:bd gain:0.7 ]", "[ 1/2 → 1/1 | s:sn gain:0.7 ]", "[ 1/4 → 1/2 | s:hh3 gain:0.7 ]", "[ 3/4 → 1/1 | s:hh3 gain:0.7 ]", - "[ 9/8 → 5/4 | n:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1961.928446178906 ]", - "[ 9/8 → 5/4 | n:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1961.928446178906 ]", - "[ 11/8 → 3/2 | n:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2026.0015806698216 ]", - "[ 11/8 → 3/2 | n:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2026.0015806698216 ]", - "[ 3/2 → 13/8 | n:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2057.708031580958 ]", - "[ 3/2 → 13/8 | n:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2057.708031580958 ]", - "[ 7/4 → 15/8 | n:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2120.3652183367367 ]", - "[ 7/4 → 15/8 | n:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2120.3652183367367 ]", - "[ 15/8 → 2/1 | n:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2151.2782118349805 ]", - "[ 15/8 → 2/1 | n:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2151.2782118349805 ]", - "[ 3/2 → 2/1 | n:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2104.801302079497 ]", - "[ 3/2 → 2/1 | n:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2104.801302079497 ]", - "[ (13/8 → 2/1) ⇝ 17/8 | n:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2120.3652183367367 ]", - "[ (13/8 → 2/1) ⇝ 17/8 | n:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2120.3652183367367 ]", - "[ (7/4 → 2/1) ⇝ 9/4 | n:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2135.8582993222344 ]", - "[ (7/4 → 2/1) ⇝ 9/4 | n:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2135.8582993222344 ]", - "[ (15/8 → 2/1) ⇝ 19/8 | n:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2151.2782118349805 ]", - "[ (15/8 → 2/1) ⇝ 19/8 | n:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2151.2782118349805 ]", - "[ 1/1 → 5/4 | n:F#5 s:sawtooth gain:0.31413326401454233 attack:0.001 decay:0.2 sustain:0 hcutoff:5930.924800994192 cutoff:4000 ]", - "[ 1/1 → 5/4 | n:A4 s:sawtooth gain:0.31413326401454233 attack:0.001 decay:0.2 sustain:0 hcutoff:5930.924800994192 cutoff:4000 ]", - "[ 7/8 ⇜ (1/1 → 7/6) ⇝ 5/4 | n:A5 s:sawtooth gain:0.3107861971007485 attack:0.001 decay:0.2 sustain:0 hcutoff:5938.355801271282 cutoff:4000 ]", - "[ 7/8 ⇜ (7/6 → 5/4) | n:F#5 s:sawtooth gain:0.3107861971007485 attack:0.001 decay:0.2 sustain:0 hcutoff:5938.355801271282 cutoff:4000 ]", - "[ 7/8 ⇜ (1/1 → 7/6) ⇝ 5/4 | n:C#5 s:sawtooth gain:0.3107861971007485 attack:0.001 decay:0.2 sustain:0 hcutoff:5938.355801271282 cutoff:4000 ]", - "[ 7/8 ⇜ (7/6 → 5/4) | n:A4 s:sawtooth gain:0.3107861971007485 attack:0.001 decay:0.2 sustain:0 hcutoff:5938.355801271282 cutoff:4000 ]", - "[ 5/4 → 3/2 | n:F#5 s:sawtooth gain:0.3271154116289833 attack:0.001 decay:0.2 sustain:0 hcutoff:5897.049337170482 cutoff:4000 ]", - "[ 5/4 → 3/2 | n:A4 s:sawtooth gain:0.3271154116289833 attack:0.001 decay:0.2 sustain:0 hcutoff:5897.049337170482 cutoff:4000 ]", - "[ 3/4 ⇜ (1/1 → 13/12) ⇝ 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 ⇜ (13/12 → 9/8) | n:A5 s:sawtooth gain:0.30398425548024827 attack:0.001 decay:0.2 sustain:0 hcutoff:5951.963201008076 cutoff:4000 ]", - "[ 3/4 ⇜ (1/1 → 13/12) ⇝ 9/8 | n:E5 s:sawtooth gain:0.30398425548024827 attack:0.001 decay:0.2 sustain:0 hcutoff:5951.963201008076 cutoff:4000 ]", - "[ 3/4 ⇜ (13/12 → 9/8) | n:C#5 s:sawtooth gain:0.30398425548024827 attack:0.001 decay:0.2 sustain:0 hcutoff:5951.963201008076 cutoff:4000 ]", - "[ (9/8 → 17/12) ⇝ 3/2 | n:A5 s:sawtooth gain:0.3239347288344676 attack:0.001 decay:0.2 sustain:0 hcutoff:5906.1380911341175 cutoff:4000 ]", - "[ 9/8 ⇜ (17/12 → 3/2) | n:F#5 s:sawtooth gain:0.3239347288344676 attack:0.001 decay:0.2 sustain:0 hcutoff:5906.1380911341175 cutoff:4000 ]", - "[ (9/8 → 17/12) ⇝ 3/2 | n:C#5 s:sawtooth gain:0.3239347288344676 attack:0.001 decay:0.2 sustain:0 hcutoff:5906.1380911341175 cutoff:4000 ]", - "[ 9/8 ⇜ (17/12 → 3/2) | n:A4 s:sawtooth gain:0.3239347288344676 attack:0.001 decay:0.2 sustain:0 hcutoff:5906.1380911341175 cutoff:4000 ]", - "[ 3/2 → 7/4 | n:F#5 s:sawtooth gain:0.339354895673865 attack:0.001 decay:0.2 sustain:0 hcutoff:5856.603727730447 cutoff:4000 ]", - "[ 3/2 → 7/4 | n:A4 s:sawtooth gain:0.339354895673865 attack:0.001 decay:0.2 sustain:0 hcutoff:5856.603727730447 cutoff:4000 ]", - "[ (1/1 → 4/3) ⇝ 11/8 | n:C#6 s:sawtooth gain:0.317441699448191 attack:0.001 decay:0.2 sustain:0 hcutoff:5923.077274266886 cutoff:4000 ]", - "[ 1/1 ⇜ (4/3 → 11/8) | n:A5 s:sawtooth gain:0.317441699448191 attack:0.001 decay:0.2 sustain:0 hcutoff:5923.077274266886 cutoff:4000 ]", - "[ (1/1 → 4/3) ⇝ 11/8 | n:E5 s:sawtooth gain:0.317441699448191 attack:0.001 decay:0.2 sustain:0 hcutoff:5923.077274266886 cutoff:4000 ]", - "[ 1/1 ⇜ (4/3 → 11/8) | n:C#5 s:sawtooth gain:0.317441699448191 attack:0.001 decay:0.2 sustain:0 hcutoff:5923.077274266886 cutoff:4000 ]", - "[ (11/8 → 5/3) ⇝ 7/4 | n:A5 s:sawtooth gain:0.3363712287126769 attack:0.001 decay:0.2 sustain:0 hcutoff:5867.325323737765 cutoff:4000 ]", - "[ 11/8 ⇜ (5/3 → 7/4) | n:F#5 s:sawtooth gain:0.3363712287126769 attack:0.001 decay:0.2 sustain:0 hcutoff:5867.325323737765 cutoff:4000 ]", - "[ (11/8 → 5/3) ⇝ 7/4 | n:C#5 s:sawtooth gain:0.3363712287126769 attack:0.001 decay:0.2 sustain:0 hcutoff:5867.325323737765 cutoff:4000 ]", - "[ 11/8 ⇜ (5/3 → 7/4) | n:A4 s:sawtooth gain:0.3363712287126769 attack:0.001 decay:0.2 sustain:0 hcutoff:5867.325323737765 cutoff:4000 ]", - "[ 7/4 → 2/1 | n:F#5 s:sawtooth gain:0.3507338432270528 attack:0.001 decay:0.2 sustain:0 hcutoff:5809.698831278217 cutoff:4000 ]", - "[ 7/4 → 2/1 | n:A4 s:sawtooth gain:0.3507338432270528 attack:0.001 decay:0.2 sustain:0 hcutoff:5809.698831278217 cutoff:4000 ]", - "[ (5/4 → 19/12) ⇝ 13/8 | n:C#6 s:sawtooth gain:0.3302496429830646 attack:0.001 decay:0.2 sustain:0 hcutoff:5887.549861142967 cutoff:4000 ]", - "[ 5/4 ⇜ (19/12 → 13/8) | n:A5 s:sawtooth gain:0.3302496429830646 attack:0.001 decay:0.2 sustain:0 hcutoff:5887.549861142967 cutoff:4000 ]", - "[ (5/4 → 19/12) ⇝ 13/8 | n:E5 s:sawtooth gain:0.3302496429830646 attack:0.001 decay:0.2 sustain:0 hcutoff:5887.549861142967 cutoff:4000 ]", - "[ 5/4 ⇜ (19/12 → 13/8) | n:C#5 s:sawtooth gain:0.3302496429830646 attack:0.001 decay:0.2 sustain:0 hcutoff:5887.549861142967 cutoff:4000 ]", - "[ (13/8 → 23/12) ⇝ 2/1 | n:A5 s:sawtooth gain:0.3479759264430665 attack:0.001 decay:0.2 sustain:0 hcutoff:5822.02388217981 cutoff:4000 ]", - "[ 13/8 ⇜ (23/12 → 2/1) | n:F#5 s:sawtooth gain:0.3479759264430665 attack:0.001 decay:0.2 sustain:0 hcutoff:5822.02388217981 cutoff:4000 ]", - "[ (13/8 → 23/12) ⇝ 2/1 | n:C#5 s:sawtooth gain:0.3479759264430665 attack:0.001 decay:0.2 sustain:0 hcutoff:5822.02388217981 cutoff:4000 ]", - "[ 13/8 ⇜ (23/12 → 2/1) | n:A4 s:sawtooth gain:0.3479759264430665 attack:0.001 decay:0.2 sustain:0 hcutoff:5822.02388217981 cutoff:4000 ]", - "[ (3/2 → 11/6) ⇝ 15/8 | n:C#6 s:sawtooth gain:0.3422847385870941 attack:0.001 decay:0.2 sustain:0 hcutoff:5845.47833980621 cutoff:4000 ]", - "[ 3/2 ⇜ (11/6 → 15/8) | n:A5 s:sawtooth gain:0.3422847385870941 attack:0.001 decay:0.2 sustain:0 hcutoff:5845.47833980621 cutoff:4000 ]", - "[ (3/2 → 11/6) ⇝ 15/8 | n:E5 s:sawtooth gain:0.3422847385870941 attack:0.001 decay:0.2 sustain:0 hcutoff:5845.47833980621 cutoff:4000 ]", - "[ 3/2 ⇜ (11/6 → 15/8) | n:C#5 s:sawtooth gain:0.3422847385870941 attack:0.001 decay:0.2 sustain:0 hcutoff:5845.47833980621 cutoff:4000 ]", - "[ (15/8 → 2/1) ⇝ 9/4 | n:A5 s:sawtooth gain:0.35343108171056004 attack:0.001 decay:0.2 sustain:0 hcutoff:5796.978025372246 cutoff:4000 ]", - "[ (15/8 → 2/1) ⇝ 9/4 | n:C#5 s:sawtooth gain:0.35343108171056004 attack:0.001 decay:0.2 sustain:0 hcutoff:5796.978025372246 cutoff:4000 ]", - "[ (7/4 → 2/1) ⇝ 17/8 | n:C#6 s:sawtooth gain:0.3507338432270528 attack:0.001 decay:0.2 sustain:0 hcutoff:5809.698831278217 cutoff:4000 ]", - "[ (7/4 → 2/1) ⇝ 17/8 | n:E5 s:sawtooth gain:0.3507338432270528 attack:0.001 decay:0.2 sustain:0 hcutoff:5809.698831278217 cutoff:4000 ]", + "[ 9/8 → 5/4 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1961.928446178906 ]", + "[ 9/8 → 5/4 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:1961.928446178906 ]", + "[ 11/8 → 3/2 | note:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2026.0015806698216 ]", + "[ 11/8 → 3/2 | note:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2026.0015806698216 ]", + "[ 3/2 → 13/8 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2057.708031580958 ]", + "[ 3/2 → 13/8 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2057.708031580958 ]", + "[ 7/4 → 15/8 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2120.3652183367367 ]", + "[ 7/4 → 15/8 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2120.3652183367367 ]", + "[ 15/8 → 2/1 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2151.2782118349805 ]", + "[ 15/8 → 2/1 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2151.2782118349805 ]", + "[ 3/2 → 2/1 | note:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2104.801302079497 ]", + "[ 3/2 → 2/1 | note:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2104.801302079497 ]", + "[ (13/8 → 2/1) ⇝ 17/8 | note:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2120.3652183367367 ]", + "[ (13/8 → 2/1) ⇝ 17/8 | note:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2120.3652183367367 ]", + "[ (7/4 → 2/1) ⇝ 9/4 | note:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2135.8582993222344 ]", + "[ (7/4 → 2/1) ⇝ 9/4 | note:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2135.8582993222344 ]", + "[ (15/8 → 2/1) ⇝ 19/8 | note:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2151.2782118349805 ]", + "[ (15/8 → 2/1) ⇝ 19/8 | note:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2151.2782118349805 ]", + "[ 1/1 → 5/4 | note:F#5 s:sawtooth gain:0.31413326401454233 attack:0.001 decay:0.2 sustain:0 hcutoff:5930.924800994192 cutoff:4000 ]", + "[ 1/1 → 5/4 | note:A4 s:sawtooth gain:0.31413326401454233 attack:0.001 decay:0.2 sustain:0 hcutoff:5930.924800994192 cutoff:4000 ]", + "[ 7/8 ⇜ (1/1 → 7/6) ⇝ 5/4 | note:A5 s:sawtooth gain:0.3107861971007485 attack:0.001 decay:0.2 sustain:0 hcutoff:5938.355801271282 cutoff:4000 ]", + "[ 7/8 ⇜ (7/6 → 5/4) | note:F#5 s:sawtooth gain:0.3107861971007485 attack:0.001 decay:0.2 sustain:0 hcutoff:5938.355801271282 cutoff:4000 ]", + "[ 7/8 ⇜ (1/1 → 7/6) ⇝ 5/4 | note:C#5 s:sawtooth gain:0.3107861971007485 attack:0.001 decay:0.2 sustain:0 hcutoff:5938.355801271282 cutoff:4000 ]", + "[ 7/8 ⇜ (7/6 → 5/4) | note:A4 s:sawtooth gain:0.3107861971007485 attack:0.001 decay:0.2 sustain:0 hcutoff:5938.355801271282 cutoff:4000 ]", + "[ 5/4 → 3/2 | note:F#5 s:sawtooth gain:0.3271154116289833 attack:0.001 decay:0.2 sustain:0 hcutoff:5897.049337170482 cutoff:4000 ]", + "[ 5/4 → 3/2 | note:A4 s:sawtooth gain:0.3271154116289833 attack:0.001 decay:0.2 sustain:0 hcutoff:5897.049337170482 cutoff:4000 ]", + "[ 3/4 ⇜ (1/1 → 13/12) ⇝ 9/8 | note:C#6 s:sawtooth gain:0.30398425548024827 attack:0.001 decay:0.2 sustain:0 hcutoff:5951.963201008076 cutoff:4000 ]", + "[ 3/4 ⇜ (13/12 → 9/8) | note:A5 s:sawtooth gain:0.30398425548024827 attack:0.001 decay:0.2 sustain:0 hcutoff:5951.963201008076 cutoff:4000 ]", + "[ 3/4 ⇜ (1/1 → 13/12) ⇝ 9/8 | note:E5 s:sawtooth gain:0.30398425548024827 attack:0.001 decay:0.2 sustain:0 hcutoff:5951.963201008076 cutoff:4000 ]", + "[ 3/4 ⇜ (13/12 → 9/8) | note:C#5 s:sawtooth gain:0.30398425548024827 attack:0.001 decay:0.2 sustain:0 hcutoff:5951.963201008076 cutoff:4000 ]", + "[ (9/8 → 17/12) ⇝ 3/2 | note:A5 s:sawtooth gain:0.3239347288344676 attack:0.001 decay:0.2 sustain:0 hcutoff:5906.1380911341175 cutoff:4000 ]", + "[ 9/8 ⇜ (17/12 → 3/2) | note:F#5 s:sawtooth gain:0.3239347288344676 attack:0.001 decay:0.2 sustain:0 hcutoff:5906.1380911341175 cutoff:4000 ]", + "[ (9/8 → 17/12) ⇝ 3/2 | note:C#5 s:sawtooth gain:0.3239347288344676 attack:0.001 decay:0.2 sustain:0 hcutoff:5906.1380911341175 cutoff:4000 ]", + "[ 9/8 ⇜ (17/12 → 3/2) | note:A4 s:sawtooth gain:0.3239347288344676 attack:0.001 decay:0.2 sustain:0 hcutoff:5906.1380911341175 cutoff:4000 ]", + "[ 3/2 → 7/4 | note:F#5 s:sawtooth gain:0.339354895673865 attack:0.001 decay:0.2 sustain:0 hcutoff:5856.603727730447 cutoff:4000 ]", + "[ 3/2 → 7/4 | note:A4 s:sawtooth gain:0.339354895673865 attack:0.001 decay:0.2 sustain:0 hcutoff:5856.603727730447 cutoff:4000 ]", + "[ (1/1 → 4/3) ⇝ 11/8 | note:C#6 s:sawtooth gain:0.317441699448191 attack:0.001 decay:0.2 sustain:0 hcutoff:5923.077274266886 cutoff:4000 ]", + "[ 1/1 ⇜ (4/3 → 11/8) | note:A5 s:sawtooth gain:0.317441699448191 attack:0.001 decay:0.2 sustain:0 hcutoff:5923.077274266886 cutoff:4000 ]", + "[ (1/1 → 4/3) ⇝ 11/8 | note:E5 s:sawtooth gain:0.317441699448191 attack:0.001 decay:0.2 sustain:0 hcutoff:5923.077274266886 cutoff:4000 ]", + "[ 1/1 ⇜ (4/3 → 11/8) | note:C#5 s:sawtooth gain:0.317441699448191 attack:0.001 decay:0.2 sustain:0 hcutoff:5923.077274266886 cutoff:4000 ]", + "[ (11/8 → 5/3) ⇝ 7/4 | note:A5 s:sawtooth gain:0.3363712287126769 attack:0.001 decay:0.2 sustain:0 hcutoff:5867.325323737765 cutoff:4000 ]", + "[ 11/8 ⇜ (5/3 → 7/4) | note:F#5 s:sawtooth gain:0.3363712287126769 attack:0.001 decay:0.2 sustain:0 hcutoff:5867.325323737765 cutoff:4000 ]", + "[ (11/8 → 5/3) ⇝ 7/4 | note:C#5 s:sawtooth gain:0.3363712287126769 attack:0.001 decay:0.2 sustain:0 hcutoff:5867.325323737765 cutoff:4000 ]", + "[ 11/8 ⇜ (5/3 → 7/4) | note:A4 s:sawtooth gain:0.3363712287126769 attack:0.001 decay:0.2 sustain:0 hcutoff:5867.325323737765 cutoff:4000 ]", + "[ 7/4 → 2/1 | note:F#5 s:sawtooth gain:0.3507338432270528 attack:0.001 decay:0.2 sustain:0 hcutoff:5809.698831278217 cutoff:4000 ]", + "[ 7/4 → 2/1 | note:A4 s:sawtooth gain:0.3507338432270528 attack:0.001 decay:0.2 sustain:0 hcutoff:5809.698831278217 cutoff:4000 ]", + "[ (5/4 → 19/12) ⇝ 13/8 | note:C#6 s:sawtooth gain:0.3302496429830646 attack:0.001 decay:0.2 sustain:0 hcutoff:5887.549861142967 cutoff:4000 ]", + "[ 5/4 ⇜ (19/12 → 13/8) | note:A5 s:sawtooth gain:0.3302496429830646 attack:0.001 decay:0.2 sustain:0 hcutoff:5887.549861142967 cutoff:4000 ]", + "[ (5/4 → 19/12) ⇝ 13/8 | note:E5 s:sawtooth gain:0.3302496429830646 attack:0.001 decay:0.2 sustain:0 hcutoff:5887.549861142967 cutoff:4000 ]", + "[ 5/4 ⇜ (19/12 → 13/8) | note:C#5 s:sawtooth gain:0.3302496429830646 attack:0.001 decay:0.2 sustain:0 hcutoff:5887.549861142967 cutoff:4000 ]", + "[ (13/8 → 23/12) ⇝ 2/1 | note:A5 s:sawtooth gain:0.3479759264430665 attack:0.001 decay:0.2 sustain:0 hcutoff:5822.02388217981 cutoff:4000 ]", + "[ 13/8 ⇜ (23/12 → 2/1) | note:F#5 s:sawtooth gain:0.3479759264430665 attack:0.001 decay:0.2 sustain:0 hcutoff:5822.02388217981 cutoff:4000 ]", + "[ (13/8 → 23/12) ⇝ 2/1 | note:C#5 s:sawtooth gain:0.3479759264430665 attack:0.001 decay:0.2 sustain:0 hcutoff:5822.02388217981 cutoff:4000 ]", + "[ 13/8 ⇜ (23/12 → 2/1) | note:A4 s:sawtooth gain:0.3479759264430665 attack:0.001 decay:0.2 sustain:0 hcutoff:5822.02388217981 cutoff:4000 ]", + "[ (3/2 → 11/6) ⇝ 15/8 | note:C#6 s:sawtooth gain:0.3422847385870941 attack:0.001 decay:0.2 sustain:0 hcutoff:5845.47833980621 cutoff:4000 ]", + "[ 3/2 ⇜ (11/6 → 15/8) | note:A5 s:sawtooth gain:0.3422847385870941 attack:0.001 decay:0.2 sustain:0 hcutoff:5845.47833980621 cutoff:4000 ]", + "[ (3/2 → 11/6) ⇝ 15/8 | note:E5 s:sawtooth gain:0.3422847385870941 attack:0.001 decay:0.2 sustain:0 hcutoff:5845.47833980621 cutoff:4000 ]", + "[ 3/2 ⇜ (11/6 → 15/8) | note:C#5 s:sawtooth gain:0.3422847385870941 attack:0.001 decay:0.2 sustain:0 hcutoff:5845.47833980621 cutoff:4000 ]", + "[ (15/8 → 2/1) ⇝ 9/4 | note:A5 s:sawtooth gain:0.35343108171056004 attack:0.001 decay:0.2 sustain:0 hcutoff:5796.978025372246 cutoff:4000 ]", + "[ (15/8 → 2/1) ⇝ 9/4 | note:C#5 s:sawtooth gain:0.35343108171056004 attack:0.001 decay:0.2 sustain:0 hcutoff:5796.978025372246 cutoff:4000 ]", + "[ (7/4 → 2/1) ⇝ 17/8 | note:C#6 s:sawtooth gain:0.3507338432270528 attack:0.001 decay:0.2 sustain:0 hcutoff:5809.698831278217 cutoff:4000 ]", + "[ (7/4 → 2/1) ⇝ 17/8 | note:E5 s:sawtooth gain:0.3507338432270528 attack:0.001 decay:0.2 sustain:0 hcutoff:5809.698831278217 cutoff:4000 ]", "[ 1/1 → 5/4 | s:bd gain:0.7 ]", "[ 3/2 → 7/4 | s:bd gain:0.7 ]", "[ 3/2 → 2/1 | s:sn gain:0.7 ]", "[ 5/4 → 3/2 | s:hh3 gain:0.7 ]", "[ 7/4 → 2/1 | s:hh3 gain:0.7 ]", - "[ 17/8 → 9/4 | n:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2212.17990613181 ]", - "[ 17/8 → 9/4 | n:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2212.17990613181 ]", - "[ 19/8 → 5/2 | n:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2271.727259793624 ]", - "[ 19/8 → 5/2 | n:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2271.727259793624 ]", - "[ 5/2 → 21/8 | n:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2300.948092306816 ]", - "[ 5/2 → 21/8 | n:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2300.948092306816 ]", - "[ 11/4 → 23/8 | n:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2358.1960716159333 ]", - "[ 11/4 → 23/8 | n:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2358.1960716159333 ]", - "[ 23/8 → 3/1 | n:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2386.1887343697626 ]", - "[ 23/8 → 3/1 | n:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2386.1887343697626 ]", - "[ 13/8 ⇜ (2/1 → 17/8) | n:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2181.889254082415 ]", - "[ 13/8 ⇜ (2/1 → 17/8) | n:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2181.889254082415 ]", - "[ 7/4 ⇜ (2/1 → 9/4) | n:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2197.0757739067362 ]", - "[ 7/4 ⇜ (2/1 → 9/4) | n:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2197.0757739067362 ]", - "[ 15/8 ⇜ (2/1 → 19/8) | n:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2212.17990613181 ]", - "[ 15/8 ⇜ (2/1 → 19/8) | n:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2212.17990613181 ]", - "[ 2/1 → 9/4 | n:F#5 s:sawtooth gain:0.36114266880324397 attack:0.001 decay:0.2 sustain:0 hcutoff:5756.463210874651 cutoff:4000 ]", - "[ 2/1 → 9/4 | n:A4 s:sawtooth gain:0.36114266880324397 attack:0.001 decay:0.2 sustain:0 hcutoff:5756.463210874651 cutoff:4000 ]", - "[ 15/8 ⇜ (2/1 → 13/6) ⇝ 9/4 | n:A5 s:sawtooth gain:0.36114266880324397 attack:0.001 decay:0.2 sustain:0 hcutoff:5756.463210874651 cutoff:4000 ]", - "[ 15/8 ⇜ (13/6 → 9/4) | n:F#5 s:sawtooth gain:0.36114266880324397 attack:0.001 decay:0.2 sustain:0 hcutoff:5756.463210874651 cutoff:4000 ]", - "[ 15/8 ⇜ (2/1 → 13/6) ⇝ 9/4 | n:C#5 s:sawtooth gain:0.36114266880324397 attack:0.001 decay:0.2 sustain:0 hcutoff:5756.463210874651 cutoff:4000 ]", - "[ 15/8 ⇜ (13/6 → 9/4) | n:A4 s:sawtooth gain:0.36114266880324397 attack:0.001 decay:0.2 sustain:0 hcutoff:5756.463210874651 cutoff:4000 ]", - "[ 9/4 → 5/2 | n:F#5 s:sawtooth gain:0.3704811297220968 attack:0.001 decay:0.2 sustain:0 hcutoff:5697.042781654914 cutoff:4000 ]", - "[ 9/4 → 5/2 | n:A4 s:sawtooth gain:0.3704811297220968 attack:0.001 decay:0.2 sustain:0 hcutoff:5697.042781654914 cutoff:4000 ]", - "[ 7/4 ⇜ (2/1 → 25/12) ⇝ 17/8 | n:C#6 s:sawtooth gain:0.3586370624427201 attack:0.001 decay:0.2 sustain:0 hcutoff:5770.357934562703 cutoff:4000 ]", - "[ 7/4 ⇜ (25/12 → 17/8) | n:A5 s:sawtooth gain:0.3586370624427201 attack:0.001 decay:0.2 sustain:0 hcutoff:5770.357934562703 cutoff:4000 ]", - "[ 7/4 ⇜ (2/1 → 25/12) ⇝ 17/8 | n:E5 s:sawtooth gain:0.3586370624427201 attack:0.001 decay:0.2 sustain:0 hcutoff:5770.357934562703 cutoff:4000 ]", - "[ 7/4 ⇜ (25/12 → 17/8) | n:C#5 s:sawtooth gain:0.3586370624427201 attack:0.001 decay:0.2 sustain:0 hcutoff:5770.357934562703 cutoff:4000 ]", - "[ (17/8 → 29/12) ⇝ 5/2 | n:A5 s:sawtooth gain:0.368251964143991 attack:0.001 decay:0.2 sustain:0 hcutoff:5712.469093657604 cutoff:4000 ]", - "[ 17/8 ⇜ (29/12 → 5/2) | n:F#5 s:sawtooth gain:0.368251964143991 attack:0.001 decay:0.2 sustain:0 hcutoff:5712.469093657604 cutoff:4000 ]", - "[ (17/8 → 29/12) ⇝ 5/2 | n:C#5 s:sawtooth gain:0.368251964143991 attack:0.001 decay:0.2 sustain:0 hcutoff:5712.469093657604 cutoff:4000 ]", - "[ 17/8 ⇜ (29/12 → 5/2) | n:A4 s:sawtooth gain:0.368251964143991 attack:0.001 decay:0.2 sustain:0 hcutoff:5712.469093657604 cutoff:4000 ]", - "[ 5/2 → 11/4 | n:F#5 s:sawtooth gain:0.37865929150004085 attack:0.001 decay:0.2 sustain:0 hcutoff:5631.60041088523 cutoff:4000 ]", - "[ 5/2 → 11/4 | n:A4 s:sawtooth gain:0.37865929150004085 attack:0.001 decay:0.2 sustain:0 hcutoff:5631.60041088523 cutoff:4000 ]", - "[ (2/1 → 7/3) ⇝ 19/8 | n:C#6 s:sawtooth gain:0.3635813269759728 attack:0.001 decay:0.2 sustain:0 hcutoff:5742.18185383172 cutoff:4000 ]", - "[ 2/1 ⇜ (7/3 → 19/8) | n:A5 s:sawtooth gain:0.3635813269759728 attack:0.001 decay:0.2 sustain:0 hcutoff:5742.18185383172 cutoff:4000 ]", - "[ (2/1 → 7/3) ⇝ 19/8 | n:E5 s:sawtooth gain:0.3635813269759728 attack:0.001 decay:0.2 sustain:0 hcutoff:5742.18185383172 cutoff:4000 ]", - "[ 2/1 ⇜ (7/3 → 19/8) | n:C#5 s:sawtooth gain:0.3635813269759728 attack:0.001 decay:0.2 sustain:0 hcutoff:5742.18185383172 cutoff:4000 ]", - "[ (19/8 → 8/3) ⇝ 11/4 | n:A5 s:sawtooth gain:0.3767280347874561 attack:0.001 decay:0.2 sustain:0 hcutoff:5648.516028753632 cutoff:4000 ]", - "[ 19/8 ⇜ (8/3 → 11/4) | n:F#5 s:sawtooth gain:0.3767280347874561 attack:0.001 decay:0.2 sustain:0 hcutoff:5648.516028753632 cutoff:4000 ]", - "[ (19/8 → 8/3) ⇝ 11/4 | n:C#5 s:sawtooth gain:0.3767280347874561 attack:0.001 decay:0.2 sustain:0 hcutoff:5648.516028753632 cutoff:4000 ]", - "[ 19/8 ⇜ (8/3 → 11/4) | n:A4 s:sawtooth gain:0.3767280347874561 attack:0.001 decay:0.2 sustain:0 hcutoff:5648.516028753632 cutoff:4000 ]", - "[ 11/4 → 3/1 | n:F#5 s:sawtooth gain:0.3855983939685166 attack:0.001 decay:0.2 sustain:0 hcutoff:5560.31547155504 cutoff:4000 ]", - "[ 11/4 → 3/1 | n:A4 s:sawtooth gain:0.3855983939685166 attack:0.001 decay:0.2 sustain:0 hcutoff:5560.31547155504 cutoff:4000 ]", - "[ (9/4 → 31/12) ⇝ 21/8 | n:C#6 s:sawtooth gain:0.3726377219727376 attack:0.001 decay:0.2 sustain:0 hcutoff:5681.240017681994 cutoff:4000 ]", - "[ 9/4 ⇜ (31/12 → 21/8) | n:A5 s:sawtooth gain:0.3726377219727376 attack:0.001 decay:0.2 sustain:0 hcutoff:5681.240017681994 cutoff:4000 ]", - "[ (9/4 → 31/12) ⇝ 21/8 | n:E5 s:sawtooth gain:0.3726377219727376 attack:0.001 decay:0.2 sustain:0 hcutoff:5681.240017681994 cutoff:4000 ]", - "[ 9/4 ⇜ (31/12 → 21/8) | n:C#5 s:sawtooth gain:0.3726377219727376 attack:0.001 decay:0.2 sustain:0 hcutoff:5681.240017681994 cutoff:4000 ]", - "[ (21/8 → 35/12) ⇝ 3/1 | n:A5 s:sawtooth gain:0.38398364517932737 attack:0.001 decay:0.2 sustain:0 hcutoff:5578.674030756363 cutoff:4000 ]", - "[ 21/8 ⇜ (35/12 → 3/1) | n:F#5 s:sawtooth gain:0.38398364517932737 attack:0.001 decay:0.2 sustain:0 hcutoff:5578.674030756363 cutoff:4000 ]", - "[ (21/8 → 35/12) ⇝ 3/1 | n:C#5 s:sawtooth gain:0.38398364517932737 attack:0.001 decay:0.2 sustain:0 hcutoff:5578.674030756363 cutoff:4000 ]", - "[ 21/8 ⇜ (35/12 → 3/1) | n:A4 s:sawtooth gain:0.38398364517932737 attack:0.001 decay:0.2 sustain:0 hcutoff:5578.674030756363 cutoff:4000 ]", - "[ (5/2 → 17/6) ⇝ 23/8 | n:C#6 s:sawtooth gain:0.38051304866630675 attack:0.001 decay:0.2 sustain:0 hcutoff:5614.319554259933 cutoff:4000 ]", - "[ 5/2 ⇜ (17/6 → 23/8) | n:A5 s:sawtooth gain:0.38051304866630675 attack:0.001 decay:0.2 sustain:0 hcutoff:5614.319554259933 cutoff:4000 ]", - "[ (5/2 → 17/6) ⇝ 23/8 | n:E5 s:sawtooth gain:0.38051304866630675 attack:0.001 decay:0.2 sustain:0 hcutoff:5614.319554259933 cutoff:4000 ]", - "[ 5/2 ⇜ (17/6 → 23/8) | n:C#5 s:sawtooth gain:0.38051304866630675 attack:0.001 decay:0.2 sustain:0 hcutoff:5614.319554259933 cutoff:4000 ]", - "[ (23/8 → 3/1) ⇝ 13/4 | n:A5 s:sawtooth gain:0.38994891982521085 attack:0.001 decay:0.2 sustain:0 hcutoff:5503.134531727652 cutoff:4000 ]", - "[ (23/8 → 3/1) ⇝ 13/4 | n:C#5 s:sawtooth gain:0.38994891982521085 attack:0.001 decay:0.2 sustain:0 hcutoff:5503.134531727652 cutoff:4000 ]", - "[ (11/4 → 3/1) ⇝ 25/8 | n:C#6 s:sawtooth gain:0.3871314633555296 attack:0.001 decay:0.2 sustain:0 hcutoff:5541.603887904197 cutoff:4000 ]", - "[ (11/4 → 3/1) ⇝ 25/8 | n:E5 s:sawtooth gain:0.3871314633555296 attack:0.001 decay:0.2 sustain:0 hcutoff:5541.603887904197 cutoff:4000 ]", + "[ 17/8 → 9/4 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2212.17990613181 ]", + "[ 17/8 → 9/4 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2212.17990613181 ]", + "[ 19/8 → 5/2 | note:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2271.727259793624 ]", + "[ 19/8 → 5/2 | note:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2271.727259793624 ]", + "[ 5/2 → 21/8 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2300.948092306816 ]", + "[ 5/2 → 21/8 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2300.948092306816 ]", + "[ 11/4 → 23/8 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2358.1960716159333 ]", + "[ 11/4 → 23/8 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2358.1960716159333 ]", + "[ 23/8 → 3/1 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2386.1887343697626 ]", + "[ 23/8 → 3/1 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2386.1887343697626 ]", + "[ 13/8 ⇜ (2/1 → 17/8) | note:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2181.889254082415 ]", + "[ 13/8 ⇜ (2/1 → 17/8) | note:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2181.889254082415 ]", + "[ 7/4 ⇜ (2/1 → 9/4) | note:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2197.0757739067362 ]", + "[ 7/4 ⇜ (2/1 → 9/4) | note:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2197.0757739067362 ]", + "[ 15/8 ⇜ (2/1 → 19/8) | note:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2212.17990613181 ]", + "[ 15/8 ⇜ (2/1 → 19/8) | note:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2212.17990613181 ]", + "[ 2/1 → 9/4 | note:F#5 s:sawtooth gain:0.36114266880324397 attack:0.001 decay:0.2 sustain:0 hcutoff:5756.463210874651 cutoff:4000 ]", + "[ 2/1 → 9/4 | note:A4 s:sawtooth gain:0.36114266880324397 attack:0.001 decay:0.2 sustain:0 hcutoff:5756.463210874651 cutoff:4000 ]", + "[ 15/8 ⇜ (2/1 → 13/6) ⇝ 9/4 | note:A5 s:sawtooth gain:0.36114266880324397 attack:0.001 decay:0.2 sustain:0 hcutoff:5756.463210874651 cutoff:4000 ]", + "[ 15/8 ⇜ (13/6 → 9/4) | note:F#5 s:sawtooth gain:0.36114266880324397 attack:0.001 decay:0.2 sustain:0 hcutoff:5756.463210874651 cutoff:4000 ]", + "[ 15/8 ⇜ (2/1 → 13/6) ⇝ 9/4 | note:C#5 s:sawtooth gain:0.36114266880324397 attack:0.001 decay:0.2 sustain:0 hcutoff:5756.463210874651 cutoff:4000 ]", + "[ 15/8 ⇜ (13/6 → 9/4) | note:A4 s:sawtooth gain:0.36114266880324397 attack:0.001 decay:0.2 sustain:0 hcutoff:5756.463210874651 cutoff:4000 ]", + "[ 9/4 → 5/2 | note:F#5 s:sawtooth gain:0.3704811297220968 attack:0.001 decay:0.2 sustain:0 hcutoff:5697.042781654914 cutoff:4000 ]", + "[ 9/4 → 5/2 | note:A4 s:sawtooth gain:0.3704811297220968 attack:0.001 decay:0.2 sustain:0 hcutoff:5697.042781654914 cutoff:4000 ]", + "[ 7/4 ⇜ (2/1 → 25/12) ⇝ 17/8 | note:C#6 s:sawtooth gain:0.3586370624427201 attack:0.001 decay:0.2 sustain:0 hcutoff:5770.357934562703 cutoff:4000 ]", + "[ 7/4 ⇜ (25/12 → 17/8) | note:A5 s:sawtooth gain:0.3586370624427201 attack:0.001 decay:0.2 sustain:0 hcutoff:5770.357934562703 cutoff:4000 ]", + "[ 7/4 ⇜ (2/1 → 25/12) ⇝ 17/8 | note:E5 s:sawtooth gain:0.3586370624427201 attack:0.001 decay:0.2 sustain:0 hcutoff:5770.357934562703 cutoff:4000 ]", + "[ 7/4 ⇜ (25/12 → 17/8) | note:C#5 s:sawtooth gain:0.3586370624427201 attack:0.001 decay:0.2 sustain:0 hcutoff:5770.357934562703 cutoff:4000 ]", + "[ (17/8 → 29/12) ⇝ 5/2 | note:A5 s:sawtooth gain:0.368251964143991 attack:0.001 decay:0.2 sustain:0 hcutoff:5712.469093657604 cutoff:4000 ]", + "[ 17/8 ⇜ (29/12 → 5/2) | note:F#5 s:sawtooth gain:0.368251964143991 attack:0.001 decay:0.2 sustain:0 hcutoff:5712.469093657604 cutoff:4000 ]", + "[ (17/8 → 29/12) ⇝ 5/2 | note:C#5 s:sawtooth gain:0.368251964143991 attack:0.001 decay:0.2 sustain:0 hcutoff:5712.469093657604 cutoff:4000 ]", + "[ 17/8 ⇜ (29/12 → 5/2) | note:A4 s:sawtooth gain:0.368251964143991 attack:0.001 decay:0.2 sustain:0 hcutoff:5712.469093657604 cutoff:4000 ]", + "[ 5/2 → 11/4 | note:F#5 s:sawtooth gain:0.37865929150004085 attack:0.001 decay:0.2 sustain:0 hcutoff:5631.60041088523 cutoff:4000 ]", + "[ 5/2 → 11/4 | note:A4 s:sawtooth gain:0.37865929150004085 attack:0.001 decay:0.2 sustain:0 hcutoff:5631.60041088523 cutoff:4000 ]", + "[ (2/1 → 7/3) ⇝ 19/8 | note:C#6 s:sawtooth gain:0.3635813269759728 attack:0.001 decay:0.2 sustain:0 hcutoff:5742.18185383172 cutoff:4000 ]", + "[ 2/1 ⇜ (7/3 → 19/8) | note:A5 s:sawtooth gain:0.3635813269759728 attack:0.001 decay:0.2 sustain:0 hcutoff:5742.18185383172 cutoff:4000 ]", + "[ (2/1 → 7/3) ⇝ 19/8 | note:E5 s:sawtooth gain:0.3635813269759728 attack:0.001 decay:0.2 sustain:0 hcutoff:5742.18185383172 cutoff:4000 ]", + "[ 2/1 ⇜ (7/3 → 19/8) | note:C#5 s:sawtooth gain:0.3635813269759728 attack:0.001 decay:0.2 sustain:0 hcutoff:5742.18185383172 cutoff:4000 ]", + "[ (19/8 → 8/3) ⇝ 11/4 | note:A5 s:sawtooth gain:0.3767280347874561 attack:0.001 decay:0.2 sustain:0 hcutoff:5648.516028753632 cutoff:4000 ]", + "[ 19/8 ⇜ (8/3 → 11/4) | note:F#5 s:sawtooth gain:0.3767280347874561 attack:0.001 decay:0.2 sustain:0 hcutoff:5648.516028753632 cutoff:4000 ]", + "[ (19/8 → 8/3) ⇝ 11/4 | note:C#5 s:sawtooth gain:0.3767280347874561 attack:0.001 decay:0.2 sustain:0 hcutoff:5648.516028753632 cutoff:4000 ]", + "[ 19/8 ⇜ (8/3 → 11/4) | note:A4 s:sawtooth gain:0.3767280347874561 attack:0.001 decay:0.2 sustain:0 hcutoff:5648.516028753632 cutoff:4000 ]", + "[ 11/4 → 3/1 | note:F#5 s:sawtooth gain:0.3855983939685166 attack:0.001 decay:0.2 sustain:0 hcutoff:5560.31547155504 cutoff:4000 ]", + "[ 11/4 → 3/1 | note:A4 s:sawtooth gain:0.3855983939685166 attack:0.001 decay:0.2 sustain:0 hcutoff:5560.31547155504 cutoff:4000 ]", + "[ (9/4 → 31/12) ⇝ 21/8 | note:C#6 s:sawtooth gain:0.3726377219727376 attack:0.001 decay:0.2 sustain:0 hcutoff:5681.240017681994 cutoff:4000 ]", + "[ 9/4 ⇜ (31/12 → 21/8) | note:A5 s:sawtooth gain:0.3726377219727376 attack:0.001 decay:0.2 sustain:0 hcutoff:5681.240017681994 cutoff:4000 ]", + "[ (9/4 → 31/12) ⇝ 21/8 | note:E5 s:sawtooth gain:0.3726377219727376 attack:0.001 decay:0.2 sustain:0 hcutoff:5681.240017681994 cutoff:4000 ]", + "[ 9/4 ⇜ (31/12 → 21/8) | note:C#5 s:sawtooth gain:0.3726377219727376 attack:0.001 decay:0.2 sustain:0 hcutoff:5681.240017681994 cutoff:4000 ]", + "[ (21/8 → 35/12) ⇝ 3/1 | note:A5 s:sawtooth gain:0.38398364517932737 attack:0.001 decay:0.2 sustain:0 hcutoff:5578.674030756363 cutoff:4000 ]", + "[ 21/8 ⇜ (35/12 → 3/1) | note:F#5 s:sawtooth gain:0.38398364517932737 attack:0.001 decay:0.2 sustain:0 hcutoff:5578.674030756363 cutoff:4000 ]", + "[ (21/8 → 35/12) ⇝ 3/1 | note:C#5 s:sawtooth gain:0.38398364517932737 attack:0.001 decay:0.2 sustain:0 hcutoff:5578.674030756363 cutoff:4000 ]", + "[ 21/8 ⇜ (35/12 → 3/1) | note:A4 s:sawtooth gain:0.38398364517932737 attack:0.001 decay:0.2 sustain:0 hcutoff:5578.674030756363 cutoff:4000 ]", + "[ (5/2 → 17/6) ⇝ 23/8 | note:C#6 s:sawtooth gain:0.38051304866630675 attack:0.001 decay:0.2 sustain:0 hcutoff:5614.319554259933 cutoff:4000 ]", + "[ 5/2 ⇜ (17/6 → 23/8) | note:A5 s:sawtooth gain:0.38051304866630675 attack:0.001 decay:0.2 sustain:0 hcutoff:5614.319554259933 cutoff:4000 ]", + "[ (5/2 → 17/6) ⇝ 23/8 | note:E5 s:sawtooth gain:0.38051304866630675 attack:0.001 decay:0.2 sustain:0 hcutoff:5614.319554259933 cutoff:4000 ]", + "[ 5/2 ⇜ (17/6 → 23/8) | note:C#5 s:sawtooth gain:0.38051304866630675 attack:0.001 decay:0.2 sustain:0 hcutoff:5614.319554259933 cutoff:4000 ]", + "[ (23/8 → 3/1) ⇝ 13/4 | note:A5 s:sawtooth gain:0.38994891982521085 attack:0.001 decay:0.2 sustain:0 hcutoff:5503.134531727652 cutoff:4000 ]", + "[ (23/8 → 3/1) ⇝ 13/4 | note:C#5 s:sawtooth gain:0.38994891982521085 attack:0.001 decay:0.2 sustain:0 hcutoff:5503.134531727652 cutoff:4000 ]", + "[ (11/4 → 3/1) ⇝ 25/8 | note:C#6 s:sawtooth gain:0.3871314633555296 attack:0.001 decay:0.2 sustain:0 hcutoff:5541.603887904197 cutoff:4000 ]", + "[ (11/4 → 3/1) ⇝ 25/8 | note:E5 s:sawtooth gain:0.3871314633555296 attack:0.001 decay:0.2 sustain:0 hcutoff:5541.603887904197 cutoff:4000 ]", "[ 2/1 → 9/4 | s:bd gain:0.7 ]", "[ 5/2 → 11/4 | s:bd gain:0.7 ]", "[ 5/2 → 3/1 | s:sn gain:0.7 ]", "[ 9/4 → 5/2 | s:hh3 gain:0.7 ]", "[ 11/4 → 3/1 | s:hh3 gain:0.7 ]", - "[ 25/8 → 13/4 | n:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2440.8271075661924 ]", - "[ 25/8 → 13/4 | n:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2440.8271075661924 ]", - "[ 27/8 → 7/2 | n:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2493.5603089922215 ]", - "[ 27/8 → 7/2 | n:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2493.5603089922215 ]", - "[ 7/2 → 29/8 | n:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2519.1725829012184 ]", - "[ 7/2 → 29/8 | n:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2519.1725829012184 ]", - "[ 15/4 → 31/8 | n:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2568.811347023862 ]", - "[ 15/4 → 31/8 | n:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2568.811347023862 ]", - "[ 31/8 → 4/1 | n:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2592.8079367021132 ]", - "[ 31/8 → 4/1 | n:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2592.8079367021132 ]", - "[ 7/2 → 4/1 | n:G3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2556.604589043475 ]", - "[ 7/2 → 4/1 | n:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2556.604589043475 ]", - "[ (29/8 → 4/1) ⇝ 33/8 | n:G3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2568.811347023862 ]", - "[ (29/8 → 4/1) ⇝ 33/8 | n:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2568.811347023862 ]", - "[ (15/4 → 4/1) ⇝ 17/4 | n:G3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2580.8797353950404 ]", - "[ (15/4 → 4/1) ⇝ 17/4 | n:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2580.8797353950404 ]", - "[ (31/8 → 4/1) ⇝ 35/8 | n:G3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2592.8079367021132 ]", - "[ (31/8 → 4/1) ⇝ 35/8 | n:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2592.8079367021132 ]", - "[ 3/1 → 13/4 | n:F#5 s:sawtooth gain:0.3912316097774532 attack:0.001 decay:0.2 sustain:0 hcutoff:5483.383350728088 cutoff:4000 ]", - "[ 3/1 → 13/4 | n:A4 s:sawtooth gain:0.3912316097774532 attack:0.001 decay:0.2 sustain:0 hcutoff:5483.383350728088 cutoff:4000 ]", - "[ 23/8 ⇜ (3/1 → 19/6) ⇝ 13/4 | n:A5 s:sawtooth gain:0.38994891982521085 attack:0.001 decay:0.2 sustain:0 hcutoff:5503.134531727652 cutoff:4000 ]", - "[ 23/8 ⇜ (19/6 → 13/4) | n:F#5 s:sawtooth gain:0.38994891982521085 attack:0.001 decay:0.2 sustain:0 hcutoff:5503.134531727652 cutoff:4000 ]", - "[ 23/8 ⇜ (3/1 → 19/6) ⇝ 13/4 | n:C#5 s:sawtooth gain:0.38994891982521085 attack:0.001 decay:0.2 sustain:0 hcutoff:5503.134531727652 cutoff:4000 ]", - "[ 23/8 ⇜ (19/6 → 13/4) | n:A4 s:sawtooth gain:0.38994891982521085 attack:0.001 decay:0.2 sustain:0 hcutoff:5503.134531727652 cutoff:4000 ]", - "[ 13/4 → 7/2 | n:F#5 s:sawtooth gain:0.3955046879791817 attack:0.001 decay:0.2 sustain:0 hcutoff:5401.014914000078 cutoff:4000 ]", - "[ 13/4 → 7/2 | n:A4 s:sawtooth gain:0.3955046879791817 attack:0.001 decay:0.2 sustain:0 hcutoff:5401.014914000078 cutoff:4000 ]", - "[ 11/4 ⇜ (3/1 → 37/12) ⇝ 25/8 | n:C#6 s:sawtooth gain:0.3871314633555296 attack:0.001 decay:0.2 sustain:0 hcutoff:5541.603887904197 cutoff:4000 ]", - "[ 11/4 ⇜ (37/12 → 25/8) | n:A5 s:sawtooth gain:0.3871314633555296 attack:0.001 decay:0.2 sustain:0 hcutoff:5541.603887904197 cutoff:4000 ]", - "[ 11/4 ⇜ (3/1 → 37/12) ⇝ 25/8 | n:E5 s:sawtooth gain:0.3871314633555296 attack:0.001 decay:0.2 sustain:0 hcutoff:5541.603887904197 cutoff:4000 ]", - "[ 11/4 ⇜ (37/12 → 25/8) | n:C#5 s:sawtooth gain:0.3871314633555296 attack:0.001 decay:0.2 sustain:0 hcutoff:5541.603887904197 cutoff:4000 ]", - "[ (25/8 → 41/12) ⇝ 7/2 | n:A5 s:sawtooth gain:0.394566409869316 attack:0.001 decay:0.2 sustain:0 hcutoff:5422.104580183649 cutoff:4000 ]", - "[ 25/8 ⇜ (41/12 → 7/2) | n:F#5 s:sawtooth gain:0.394566409869316 attack:0.001 decay:0.2 sustain:0 hcutoff:5422.104580183649 cutoff:4000 ]", - "[ (25/8 → 41/12) ⇝ 7/2 | n:C#5 s:sawtooth gain:0.394566409869316 attack:0.001 decay:0.2 sustain:0 hcutoff:5422.104580183649 cutoff:4000 ]", - "[ 25/8 ⇜ (41/12 → 7/2) | n:A4 s:sawtooth gain:0.394566409869316 attack:0.001 decay:0.2 sustain:0 hcutoff:5422.104580183649 cutoff:4000 ]", - "[ 7/2 → 15/4 | n:F#5 s:sawtooth gain:0.3983764764947172 attack:0.001 decay:0.2 sustain:0 hcutoff:5313.435927530719 cutoff:4000 ]", - "[ 7/2 → 15/4 | n:A4 s:sawtooth gain:0.3983764764947172 attack:0.001 decay:0.2 sustain:0 hcutoff:5313.435927530719 cutoff:4000 ]", - "[ (3/1 → 10/3) ⇝ 27/8 | n:C#6 s:sawtooth gain:0.39242922708895556 attack:0.001 decay:0.2 sustain:0 hcutoff:5463.2923272018625 cutoff:4000 ]", - "[ 3/1 ⇜ (10/3 → 27/8) | n:A5 s:sawtooth gain:0.39242922708895556 attack:0.001 decay:0.2 sustain:0 hcutoff:5463.2923272018625 cutoff:4000 ]", - "[ (3/1 → 10/3) ⇝ 27/8 | n:E5 s:sawtooth gain:0.39242922708895556 attack:0.001 decay:0.2 sustain:0 hcutoff:5463.2923272018625 cutoff:4000 ]", - "[ 3/1 ⇜ (10/3 → 27/8) | n:C#5 s:sawtooth gain:0.39242922708895556 attack:0.001 decay:0.2 sustain:0 hcutoff:5463.2923272018625 cutoff:4000 ]", - "[ (27/8 → 11/3) ⇝ 15/4 | n:A5 s:sawtooth gain:0.3977916463583412 attack:0.001 decay:0.2 sustain:0 hcutoff:5335.806273589214 cutoff:4000 ]", - "[ 27/8 ⇜ (11/3 → 15/4) | n:F#5 s:sawtooth gain:0.3977916463583412 attack:0.001 decay:0.2 sustain:0 hcutoff:5335.806273589214 cutoff:4000 ]", - "[ (27/8 → 11/3) ⇝ 15/4 | n:C#5 s:sawtooth gain:0.3977916463583412 attack:0.001 decay:0.2 sustain:0 hcutoff:5335.806273589214 cutoff:4000 ]", - "[ 27/8 ⇜ (11/3 → 15/4) | n:A4 s:sawtooth gain:0.3977916463583412 attack:0.001 decay:0.2 sustain:0 hcutoff:5335.806273589214 cutoff:4000 ]", - "[ 15/4 → 4/1 | n:F#5 s:sawtooth gain:0.3998193184307759 attack:0.001 decay:0.2 sustain:0 hcutoff:5220.886439234386 cutoff:4000 ]", - "[ 15/4 → 4/1 | n:A4 s:sawtooth gain:0.3998193184307759 attack:0.001 decay:0.2 sustain:0 hcutoff:5220.886439234386 cutoff:4000 ]", - "[ (13/4 → 43/12) ⇝ 29/8 | n:C#6 s:sawtooth gain:0.3963553195057793 attack:0.001 decay:0.2 sustain:0 hcutoff:5379.599518697443 cutoff:4000 ]", - "[ 13/4 ⇜ (43/12 → 29/8) | n:A5 s:sawtooth gain:0.3963553195057793 attack:0.001 decay:0.2 sustain:0 hcutoff:5379.599518697443 cutoff:4000 ]", - "[ (13/4 → 43/12) ⇝ 29/8 | n:E5 s:sawtooth gain:0.3963553195057793 attack:0.001 decay:0.2 sustain:0 hcutoff:5379.599518697443 cutoff:4000 ]", - "[ 13/4 ⇜ (43/12 → 29/8) | n:C#5 s:sawtooth gain:0.3963553195057793 attack:0.001 decay:0.2 sustain:0 hcutoff:5379.599518697443 cutoff:4000 ]", - "[ (29/8 → 47/12) ⇝ 4/1 | n:A5 s:sawtooth gain:0.3995935685018036 attack:0.001 decay:0.2 sustain:0 hcutoff:5244.4761496042 cutoff:4000 ]", - "[ 29/8 ⇜ (47/12 → 4/1) | n:F#5 s:sawtooth gain:0.3995935685018036 attack:0.001 decay:0.2 sustain:0 hcutoff:5244.4761496042 cutoff:4000 ]", - "[ (29/8 → 47/12) ⇝ 4/1 | n:C#5 s:sawtooth gain:0.3995935685018036 attack:0.001 decay:0.2 sustain:0 hcutoff:5244.4761496042 cutoff:4000 ]", - "[ 29/8 ⇜ (47/12 → 4/1) | n:A4 s:sawtooth gain:0.3995935685018036 attack:0.001 decay:0.2 sustain:0 hcutoff:5244.4761496042 cutoff:4000 ]", - "[ (7/2 → 23/6) ⇝ 31/8 | n:C#6 s:sawtooth gain:0.3988719301898066 attack:0.001 decay:0.2 sustain:0 hcutoff:5290.754858561636 cutoff:4000 ]", - "[ 7/2 ⇜ (23/6 → 31/8) | n:A5 s:sawtooth gain:0.3988719301898066 attack:0.001 decay:0.2 sustain:0 hcutoff:5290.754858561636 cutoff:4000 ]", - "[ (7/2 → 23/6) ⇝ 31/8 | n:E5 s:sawtooth gain:0.3988719301898066 attack:0.001 decay:0.2 sustain:0 hcutoff:5290.754858561636 cutoff:4000 ]", - "[ 7/2 ⇜ (23/6 → 31/8) | n:C#5 s:sawtooth gain:0.3988719301898066 attack:0.001 decay:0.2 sustain:0 hcutoff:5290.754858561636 cutoff:4000 ]", - "[ (31/8 → 4/1) ⇝ 17/4 | n:A5 s:sawtooth gain:0.3999548228044306 attack:0.001 decay:0.2 sustain:0 hcutoff:5197.0018638323545 cutoff:4000 ]", - "[ (31/8 → 4/1) ⇝ 17/4 | n:C#5 s:sawtooth gain:0.3999548228044306 attack:0.001 decay:0.2 sustain:0 hcutoff:5197.0018638323545 cutoff:4000 ]", - "[ (15/4 → 4/1) ⇝ 33/8 | n:C#6 s:sawtooth gain:0.3998193184307759 attack:0.001 decay:0.2 sustain:0 hcutoff:5220.886439234386 cutoff:4000 ]", - "[ (15/4 → 4/1) ⇝ 33/8 | n:E5 s:sawtooth gain:0.3998193184307759 attack:0.001 decay:0.2 sustain:0 hcutoff:5220.886439234386 cutoff:4000 ]", + "[ 25/8 → 13/4 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2440.8271075661924 ]", + "[ 25/8 → 13/4 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2440.8271075661924 ]", + "[ 27/8 → 7/2 | note:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2493.5603089922215 ]", + "[ 27/8 → 7/2 | note:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2493.5603089922215 ]", + "[ 7/2 → 29/8 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2519.1725829012184 ]", + "[ 7/2 → 29/8 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2519.1725829012184 ]", + "[ 15/4 → 31/8 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2568.811347023862 ]", + "[ 15/4 → 31/8 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2568.811347023862 ]", + "[ 31/8 → 4/1 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2592.8079367021132 ]", + "[ 31/8 → 4/1 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2592.8079367021132 ]", + "[ 7/2 → 4/1 | note:G3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2556.604589043475 ]", + "[ 7/2 → 4/1 | note:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2556.604589043475 ]", + "[ (29/8 → 4/1) ⇝ 33/8 | note:G3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2568.811347023862 ]", + "[ (29/8 → 4/1) ⇝ 33/8 | note:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2568.811347023862 ]", + "[ (15/4 → 4/1) ⇝ 17/4 | note:G3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2580.8797353950404 ]", + "[ (15/4 → 4/1) ⇝ 17/4 | note:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2580.8797353950404 ]", + "[ (31/8 → 4/1) ⇝ 35/8 | note:G3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2592.8079367021132 ]", + "[ (31/8 → 4/1) ⇝ 35/8 | note:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2592.8079367021132 ]", + "[ 3/1 → 13/4 | note:F#5 s:sawtooth gain:0.3912316097774532 attack:0.001 decay:0.2 sustain:0 hcutoff:5483.383350728088 cutoff:4000 ]", + "[ 3/1 → 13/4 | note:A4 s:sawtooth gain:0.3912316097774532 attack:0.001 decay:0.2 sustain:0 hcutoff:5483.383350728088 cutoff:4000 ]", + "[ 23/8 ⇜ (3/1 → 19/6) ⇝ 13/4 | note:A5 s:sawtooth gain:0.38994891982521085 attack:0.001 decay:0.2 sustain:0 hcutoff:5503.134531727652 cutoff:4000 ]", + "[ 23/8 ⇜ (19/6 → 13/4) | note:F#5 s:sawtooth gain:0.38994891982521085 attack:0.001 decay:0.2 sustain:0 hcutoff:5503.134531727652 cutoff:4000 ]", + "[ 23/8 ⇜ (3/1 → 19/6) ⇝ 13/4 | note:C#5 s:sawtooth gain:0.38994891982521085 attack:0.001 decay:0.2 sustain:0 hcutoff:5503.134531727652 cutoff:4000 ]", + "[ 23/8 ⇜ (19/6 → 13/4) | note:A4 s:sawtooth gain:0.38994891982521085 attack:0.001 decay:0.2 sustain:0 hcutoff:5503.134531727652 cutoff:4000 ]", + "[ 13/4 → 7/2 | note:F#5 s:sawtooth gain:0.3955046879791817 attack:0.001 decay:0.2 sustain:0 hcutoff:5401.014914000078 cutoff:4000 ]", + "[ 13/4 → 7/2 | note:A4 s:sawtooth gain:0.3955046879791817 attack:0.001 decay:0.2 sustain:0 hcutoff:5401.014914000078 cutoff:4000 ]", + "[ 11/4 ⇜ (3/1 → 37/12) ⇝ 25/8 | note:C#6 s:sawtooth gain:0.3871314633555296 attack:0.001 decay:0.2 sustain:0 hcutoff:5541.603887904197 cutoff:4000 ]", + "[ 11/4 ⇜ (37/12 → 25/8) | note:A5 s:sawtooth gain:0.3871314633555296 attack:0.001 decay:0.2 sustain:0 hcutoff:5541.603887904197 cutoff:4000 ]", + "[ 11/4 ⇜ (3/1 → 37/12) ⇝ 25/8 | note:E5 s:sawtooth gain:0.3871314633555296 attack:0.001 decay:0.2 sustain:0 hcutoff:5541.603887904197 cutoff:4000 ]", + "[ 11/4 ⇜ (37/12 → 25/8) | note:C#5 s:sawtooth gain:0.3871314633555296 attack:0.001 decay:0.2 sustain:0 hcutoff:5541.603887904197 cutoff:4000 ]", + "[ (25/8 → 41/12) ⇝ 7/2 | note:A5 s:sawtooth gain:0.394566409869316 attack:0.001 decay:0.2 sustain:0 hcutoff:5422.104580183649 cutoff:4000 ]", + "[ 25/8 ⇜ (41/12 → 7/2) | note:F#5 s:sawtooth gain:0.394566409869316 attack:0.001 decay:0.2 sustain:0 hcutoff:5422.104580183649 cutoff:4000 ]", + "[ (25/8 → 41/12) ⇝ 7/2 | note:C#5 s:sawtooth gain:0.394566409869316 attack:0.001 decay:0.2 sustain:0 hcutoff:5422.104580183649 cutoff:4000 ]", + "[ 25/8 ⇜ (41/12 → 7/2) | note:A4 s:sawtooth gain:0.394566409869316 attack:0.001 decay:0.2 sustain:0 hcutoff:5422.104580183649 cutoff:4000 ]", + "[ 7/2 → 15/4 | note:F#5 s:sawtooth gain:0.3983764764947172 attack:0.001 decay:0.2 sustain:0 hcutoff:5313.435927530719 cutoff:4000 ]", + "[ 7/2 → 15/4 | note:A4 s:sawtooth gain:0.3983764764947172 attack:0.001 decay:0.2 sustain:0 hcutoff:5313.435927530719 cutoff:4000 ]", + "[ (3/1 → 10/3) ⇝ 27/8 | note:C#6 s:sawtooth gain:0.39242922708895556 attack:0.001 decay:0.2 sustain:0 hcutoff:5463.2923272018625 cutoff:4000 ]", + "[ 3/1 ⇜ (10/3 → 27/8) | note:A5 s:sawtooth gain:0.39242922708895556 attack:0.001 decay:0.2 sustain:0 hcutoff:5463.2923272018625 cutoff:4000 ]", + "[ (3/1 → 10/3) ⇝ 27/8 | note:E5 s:sawtooth gain:0.39242922708895556 attack:0.001 decay:0.2 sustain:0 hcutoff:5463.2923272018625 cutoff:4000 ]", + "[ 3/1 ⇜ (10/3 → 27/8) | note:C#5 s:sawtooth gain:0.39242922708895556 attack:0.001 decay:0.2 sustain:0 hcutoff:5463.2923272018625 cutoff:4000 ]", + "[ (27/8 → 11/3) ⇝ 15/4 | note:A5 s:sawtooth gain:0.3977916463583412 attack:0.001 decay:0.2 sustain:0 hcutoff:5335.806273589214 cutoff:4000 ]", + "[ 27/8 ⇜ (11/3 → 15/4) | note:F#5 s:sawtooth gain:0.3977916463583412 attack:0.001 decay:0.2 sustain:0 hcutoff:5335.806273589214 cutoff:4000 ]", + "[ (27/8 → 11/3) ⇝ 15/4 | note:C#5 s:sawtooth gain:0.3977916463583412 attack:0.001 decay:0.2 sustain:0 hcutoff:5335.806273589214 cutoff:4000 ]", + "[ 27/8 ⇜ (11/3 → 15/4) | note:A4 s:sawtooth gain:0.3977916463583412 attack:0.001 decay:0.2 sustain:0 hcutoff:5335.806273589214 cutoff:4000 ]", + "[ 15/4 → 4/1 | note:F#5 s:sawtooth gain:0.3998193184307759 attack:0.001 decay:0.2 sustain:0 hcutoff:5220.886439234386 cutoff:4000 ]", + "[ 15/4 → 4/1 | note:A4 s:sawtooth gain:0.3998193184307759 attack:0.001 decay:0.2 sustain:0 hcutoff:5220.886439234386 cutoff:4000 ]", + "[ (13/4 → 43/12) ⇝ 29/8 | note:C#6 s:sawtooth gain:0.3963553195057793 attack:0.001 decay:0.2 sustain:0 hcutoff:5379.599518697443 cutoff:4000 ]", + "[ 13/4 ⇜ (43/12 → 29/8) | note:A5 s:sawtooth gain:0.3963553195057793 attack:0.001 decay:0.2 sustain:0 hcutoff:5379.599518697443 cutoff:4000 ]", + "[ (13/4 → 43/12) ⇝ 29/8 | note:E5 s:sawtooth gain:0.3963553195057793 attack:0.001 decay:0.2 sustain:0 hcutoff:5379.599518697443 cutoff:4000 ]", + "[ 13/4 ⇜ (43/12 → 29/8) | note:C#5 s:sawtooth gain:0.3963553195057793 attack:0.001 decay:0.2 sustain:0 hcutoff:5379.599518697443 cutoff:4000 ]", + "[ (29/8 → 47/12) ⇝ 4/1 | note:A5 s:sawtooth gain:0.3995935685018036 attack:0.001 decay:0.2 sustain:0 hcutoff:5244.4761496042 cutoff:4000 ]", + "[ 29/8 ⇜ (47/12 → 4/1) | note:F#5 s:sawtooth gain:0.3995935685018036 attack:0.001 decay:0.2 sustain:0 hcutoff:5244.4761496042 cutoff:4000 ]", + "[ (29/8 → 47/12) ⇝ 4/1 | note:C#5 s:sawtooth gain:0.3995935685018036 attack:0.001 decay:0.2 sustain:0 hcutoff:5244.4761496042 cutoff:4000 ]", + "[ 29/8 ⇜ (47/12 → 4/1) | note:A4 s:sawtooth gain:0.3995935685018036 attack:0.001 decay:0.2 sustain:0 hcutoff:5244.4761496042 cutoff:4000 ]", + "[ (7/2 → 23/6) ⇝ 31/8 | note:C#6 s:sawtooth gain:0.3988719301898066 attack:0.001 decay:0.2 sustain:0 hcutoff:5290.754858561636 cutoff:4000 ]", + "[ 7/2 ⇜ (23/6 → 31/8) | note:A5 s:sawtooth gain:0.3988719301898066 attack:0.001 decay:0.2 sustain:0 hcutoff:5290.754858561636 cutoff:4000 ]", + "[ (7/2 → 23/6) ⇝ 31/8 | note:E5 s:sawtooth gain:0.3988719301898066 attack:0.001 decay:0.2 sustain:0 hcutoff:5290.754858561636 cutoff:4000 ]", + "[ 7/2 ⇜ (23/6 → 31/8) | note:C#5 s:sawtooth gain:0.3988719301898066 attack:0.001 decay:0.2 sustain:0 hcutoff:5290.754858561636 cutoff:4000 ]", + "[ (31/8 → 4/1) ⇝ 17/4 | note:A5 s:sawtooth gain:0.3999548228044306 attack:0.001 decay:0.2 sustain:0 hcutoff:5197.0018638323545 cutoff:4000 ]", + "[ (31/8 → 4/1) ⇝ 17/4 | note:C#5 s:sawtooth gain:0.3999548228044306 attack:0.001 decay:0.2 sustain:0 hcutoff:5197.0018638323545 cutoff:4000 ]", + "[ (15/4 → 4/1) ⇝ 33/8 | note:C#6 s:sawtooth gain:0.3998193184307759 attack:0.001 decay:0.2 sustain:0 hcutoff:5220.886439234386 cutoff:4000 ]", + "[ (15/4 → 4/1) ⇝ 33/8 | note:E5 s:sawtooth gain:0.3998193184307759 attack:0.001 decay:0.2 sustain:0 hcutoff:5220.886439234386 cutoff:4000 ]", "[ 3/1 → 13/4 | s:bd gain:0.7 ]", "[ 7/2 → 15/4 | s:bd gain:0.7 ]", "[ 31/8 → 4/1 | s:bd gain:0.7 ]", "[ 7/2 → 4/1 | s:sn gain:0.7 ]", "[ 13/4 → 7/2 | s:hh3 gain:0.7 ]", "[ 15/4 → 4/1 | s:hh3 gain:0.7 ]", - "[ 33/8 → 17/4 | n:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2639.083266757757 ]", - "[ 33/8 → 17/4 | n:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2639.083266757757 ]", - "[ 35/8 → 9/2 | n:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2682.97580859032 ]", - "[ 35/8 → 9/2 | n:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2682.97580859032 ]", - "[ 9/2 → 37/8 | n:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2703.995258572327 ]", - "[ 9/2 → 37/8 | n:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2703.995258572327 ]", - "[ 19/4 → 39/8 | n:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2744.1172176410028 ]", - "[ 19/4 → 39/8 | n:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2744.1172176410028 ]", - "[ 39/8 → 5/1 | n:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2763.195558759784 ]", - "[ 39/8 → 5/1 | n:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2763.195558759784 ]", - "[ 29/8 ⇜ (4/1 → 33/8) | n:G3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2616.236614133155 ]", - "[ 29/8 ⇜ (4/1 → 33/8) | n:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2616.236614133155 ]", - "[ 15/4 ⇜ (4/1 → 17/4) | n:G3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2627.7335619844803 ]", - "[ 15/4 ⇜ (4/1 → 17/4) | n:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2627.7335619844803 ]", - "[ 31/8 ⇜ (4/1 → 35/8) | n:G3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2639.083266757757 ]", - "[ 31/8 ⇜ (4/1 → 35/8) | n:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2639.083266757757 ]", - "[ 4/1 → 17/4 | n:F#5 s:sawtooth gain:0.3998193184307759 attack:0.001 decay:0.2 sustain:0 hcutoff:5123.62012082546 cutoff:4000 ]", - "[ 4/1 → 17/4 | n:A4 s:sawtooth gain:0.3998193184307759 attack:0.001 decay:0.2 sustain:0 hcutoff:5123.62012082546 cutoff:4000 ]", - "[ 31/8 ⇜ (4/1 → 25/6) ⇝ 17/4 | n:A5 s:sawtooth gain:0.3998193184307759 attack:0.001 decay:0.2 sustain:0 hcutoff:5123.62012082546 cutoff:4000 ]", - "[ 31/8 ⇜ (25/6 → 17/4) | n:F#5 s:sawtooth gain:0.3998193184307759 attack:0.001 decay:0.2 sustain:0 hcutoff:5123.62012082546 cutoff:4000 ]", - "[ 31/8 ⇜ (4/1 → 25/6) ⇝ 17/4 | n:C#5 s:sawtooth gain:0.3998193184307759 attack:0.001 decay:0.2 sustain:0 hcutoff:5123.62012082546 cutoff:4000 ]", - "[ 31/8 ⇜ (25/6 → 17/4) | n:A4 s:sawtooth gain:0.3998193184307759 attack:0.001 decay:0.2 sustain:0 hcutoff:5123.62012082546 cutoff:4000 ]", - "[ 17/4 → 9/2 | n:F#5 s:sawtooth gain:0.3983764764947172 attack:0.001 decay:0.2 sustain:0 hcutoff:5021.903572521802 cutoff:4000 ]", - "[ 17/4 → 9/2 | n:A4 s:sawtooth gain:0.3983764764947172 attack:0.001 decay:0.2 sustain:0 hcutoff:5021.903572521802 cutoff:4000 ]", - "[ 15/4 ⇜ (4/1 → 49/12) ⇝ 33/8 | n:C#6 s:sawtooth gain:0.3999548228044306 attack:0.001 decay:0.2 sustain:0 hcutoff:5148.3645377501725 cutoff:4000 ]", - "[ 15/4 ⇜ (49/12 → 33/8) | n:A5 s:sawtooth gain:0.3999548228044306 attack:0.001 decay:0.2 sustain:0 hcutoff:5148.3645377501725 cutoff:4000 ]", - "[ 15/4 ⇜ (4/1 → 49/12) ⇝ 33/8 | n:E5 s:sawtooth gain:0.3999548228044306 attack:0.001 decay:0.2 sustain:0 hcutoff:5148.3645377501725 cutoff:4000 ]", - "[ 15/4 ⇜ (49/12 → 33/8) | n:C#5 s:sawtooth gain:0.3999548228044306 attack:0.001 decay:0.2 sustain:0 hcutoff:5148.3645377501725 cutoff:4000 ]", - "[ (33/8 → 53/12) ⇝ 9/2 | n:A5 s:sawtooth gain:0.3988719301898066 attack:0.001 decay:0.2 sustain:0 hcutoff:5047.734873274585 cutoff:4000 ]", - "[ 33/8 ⇜ (53/12 → 9/2) | n:F#5 s:sawtooth gain:0.3988719301898066 attack:0.001 decay:0.2 sustain:0 hcutoff:5047.734873274585 cutoff:4000 ]", - "[ (33/8 → 53/12) ⇝ 9/2 | n:C#5 s:sawtooth gain:0.3988719301898066 attack:0.001 decay:0.2 sustain:0 hcutoff:5047.734873274585 cutoff:4000 ]", - "[ 33/8 ⇜ (53/12 → 9/2) | n:A4 s:sawtooth gain:0.3988719301898066 attack:0.001 decay:0.2 sustain:0 hcutoff:5047.734873274585 cutoff:4000 ]", - "[ 9/2 → 19/4 | n:F#5 s:sawtooth gain:0.3955046879791817 attack:0.001 decay:0.2 sustain:0 hcutoff:4916.015592312082 cutoff:4000 ]", - "[ 9/2 → 19/4 | n:A4 s:sawtooth gain:0.3955046879791817 attack:0.001 decay:0.2 sustain:0 hcutoff:4916.015592312082 cutoff:4000 ]", - "[ (4/1 → 13/3) ⇝ 35/8 | n:C#6 s:sawtooth gain:0.3995935685018036 attack:0.001 decay:0.2 sustain:0 hcutoff:5098.597504951462 cutoff:4000 ]", - "[ 4/1 ⇜ (13/3 → 35/8) | n:A5 s:sawtooth gain:0.3995935685018036 attack:0.001 decay:0.2 sustain:0 hcutoff:5098.597504951462 cutoff:4000 ]", - "[ (4/1 → 13/3) ⇝ 35/8 | n:E5 s:sawtooth gain:0.3995935685018036 attack:0.001 decay:0.2 sustain:0 hcutoff:5098.597504951462 cutoff:4000 ]", - "[ 4/1 ⇜ (13/3 → 35/8) | n:C#5 s:sawtooth gain:0.3995935685018036 attack:0.001 decay:0.2 sustain:0 hcutoff:5098.597504951462 cutoff:4000 ]", - "[ (35/8 → 14/3) ⇝ 19/4 | n:A5 s:sawtooth gain:0.3963553195057793 attack:0.001 decay:0.2 sustain:0 hcutoff:4942.862975093085 cutoff:4000 ]", - "[ 35/8 ⇜ (14/3 → 19/4) | n:F#5 s:sawtooth gain:0.3963553195057793 attack:0.001 decay:0.2 sustain:0 hcutoff:4942.862975093085 cutoff:4000 ]", - "[ (35/8 → 14/3) ⇝ 19/4 | n:C#5 s:sawtooth gain:0.3963553195057793 attack:0.001 decay:0.2 sustain:0 hcutoff:4942.862975093085 cutoff:4000 ]", - "[ 35/8 ⇜ (14/3 → 19/4) | n:A4 s:sawtooth gain:0.3963553195057793 attack:0.001 decay:0.2 sustain:0 hcutoff:4942.862975093085 cutoff:4000 ]", - "[ 19/4 → 5/1 | n:F#5 s:sawtooth gain:0.3912316097774532 attack:0.001 decay:0.2 sustain:0 hcutoff:4806.246411789873 cutoff:4000 ]", - "[ 19/4 → 5/1 | n:A4 s:sawtooth gain:0.3912316097774532 attack:0.001 decay:0.2 sustain:0 hcutoff:4806.246411789873 cutoff:4000 ]", - "[ (17/4 → 55/12) ⇝ 37/8 | n:C#6 s:sawtooth gain:0.3977916463583412 attack:0.001 decay:0.2 sustain:0 hcutoff:4995.811501426648 cutoff:4000 ]", - "[ 17/4 ⇜ (55/12 → 37/8) | n:A5 s:sawtooth gain:0.3977916463583412 attack:0.001 decay:0.2 sustain:0 hcutoff:4995.811501426648 cutoff:4000 ]", - "[ (17/4 → 55/12) ⇝ 37/8 | n:E5 s:sawtooth gain:0.3977916463583412 attack:0.001 decay:0.2 sustain:0 hcutoff:4995.811501426648 cutoff:4000 ]", - "[ 17/4 ⇜ (55/12 → 37/8) | n:C#5 s:sawtooth gain:0.3977916463583412 attack:0.001 decay:0.2 sustain:0 hcutoff:4995.811501426648 cutoff:4000 ]", - "[ (37/8 → 59/12) ⇝ 5/1 | n:A5 s:sawtooth gain:0.39242922708895556 attack:0.001 decay:0.2 sustain:0 hcutoff:4834.036289789029 cutoff:4000 ]", - "[ 37/8 ⇜ (59/12 → 5/1) | n:F#5 s:sawtooth gain:0.39242922708895556 attack:0.001 decay:0.2 sustain:0 hcutoff:4834.036289789029 cutoff:4000 ]", - "[ (37/8 → 59/12) ⇝ 5/1 | n:C#5 s:sawtooth gain:0.39242922708895556 attack:0.001 decay:0.2 sustain:0 hcutoff:4834.036289789029 cutoff:4000 ]", - "[ 37/8 ⇜ (59/12 → 5/1) | n:A4 s:sawtooth gain:0.39242922708895556 attack:0.001 decay:0.2 sustain:0 hcutoff:4834.036289789029 cutoff:4000 ]", - "[ (9/2 → 29/6) ⇝ 39/8 | n:C#6 s:sawtooth gain:0.394566409869316 attack:0.001 decay:0.2 sustain:0 hcutoff:4888.925582549005 cutoff:4000 ]", - "[ 9/2 ⇜ (29/6 → 39/8) | n:A5 s:sawtooth gain:0.394566409869316 attack:0.001 decay:0.2 sustain:0 hcutoff:4888.925582549005 cutoff:4000 ]", - "[ (9/2 → 29/6) ⇝ 39/8 | n:E5 s:sawtooth gain:0.394566409869316 attack:0.001 decay:0.2 sustain:0 hcutoff:4888.925582549005 cutoff:4000 ]", - "[ 9/2 ⇜ (29/6 → 39/8) | n:C#5 s:sawtooth gain:0.394566409869316 attack:0.001 decay:0.2 sustain:0 hcutoff:4888.925582549005 cutoff:4000 ]", - "[ (39/8 → 5/1) ⇝ 21/4 | n:A5 s:sawtooth gain:0.3871314633555296 attack:0.001 decay:0.2 sustain:0 hcutoff:4721.553103742387 cutoff:4000 ]", - "[ (39/8 → 5/1) ⇝ 21/4 | n:C#5 s:sawtooth gain:0.3871314633555296 attack:0.001 decay:0.2 sustain:0 hcutoff:4721.553103742387 cutoff:4000 ]", - "[ (19/4 → 5/1) ⇝ 41/8 | n:C#6 s:sawtooth gain:0.38994891982521085 attack:0.001 decay:0.2 sustain:0 hcutoff:4778.23271519263 cutoff:4000 ]", - "[ (19/4 → 5/1) ⇝ 41/8 | n:E5 s:sawtooth gain:0.38994891982521085 attack:0.001 decay:0.2 sustain:0 hcutoff:4778.23271519263 cutoff:4000 ]", + "[ 33/8 → 17/4 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2639.083266757757 ]", + "[ 33/8 → 17/4 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2639.083266757757 ]", + "[ 35/8 → 9/2 | note:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2682.97580859032 ]", + "[ 35/8 → 9/2 | note:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2682.97580859032 ]", + "[ 9/2 → 37/8 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2703.995258572327 ]", + "[ 9/2 → 37/8 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2703.995258572327 ]", + "[ 19/4 → 39/8 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2744.1172176410028 ]", + "[ 19/4 → 39/8 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2744.1172176410028 ]", + "[ 39/8 → 5/1 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2763.195558759784 ]", + "[ 39/8 → 5/1 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2763.195558759784 ]", + "[ 29/8 ⇜ (4/1 → 33/8) | note:G3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2616.236614133155 ]", + "[ 29/8 ⇜ (4/1 → 33/8) | note:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2616.236614133155 ]", + "[ 15/4 ⇜ (4/1 → 17/4) | note:G3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2627.7335619844803 ]", + "[ 15/4 ⇜ (4/1 → 17/4) | note:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2627.7335619844803 ]", + "[ 31/8 ⇜ (4/1 → 35/8) | note:G3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2639.083266757757 ]", + "[ 31/8 ⇜ (4/1 → 35/8) | note:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2639.083266757757 ]", + "[ 4/1 → 17/4 | note:F#5 s:sawtooth gain:0.3998193184307759 attack:0.001 decay:0.2 sustain:0 hcutoff:5123.62012082546 cutoff:4000 ]", + "[ 4/1 → 17/4 | note:A4 s:sawtooth gain:0.3998193184307759 attack:0.001 decay:0.2 sustain:0 hcutoff:5123.62012082546 cutoff:4000 ]", + "[ 31/8 ⇜ (4/1 → 25/6) ⇝ 17/4 | note:A5 s:sawtooth gain:0.3998193184307759 attack:0.001 decay:0.2 sustain:0 hcutoff:5123.62012082546 cutoff:4000 ]", + "[ 31/8 ⇜ (25/6 → 17/4) | note:F#5 s:sawtooth gain:0.3998193184307759 attack:0.001 decay:0.2 sustain:0 hcutoff:5123.62012082546 cutoff:4000 ]", + "[ 31/8 ⇜ (4/1 → 25/6) ⇝ 17/4 | note:C#5 s:sawtooth gain:0.3998193184307759 attack:0.001 decay:0.2 sustain:0 hcutoff:5123.62012082546 cutoff:4000 ]", + "[ 31/8 ⇜ (25/6 → 17/4) | note:A4 s:sawtooth gain:0.3998193184307759 attack:0.001 decay:0.2 sustain:0 hcutoff:5123.62012082546 cutoff:4000 ]", + "[ 17/4 → 9/2 | note:F#5 s:sawtooth gain:0.3983764764947172 attack:0.001 decay:0.2 sustain:0 hcutoff:5021.903572521802 cutoff:4000 ]", + "[ 17/4 → 9/2 | note:A4 s:sawtooth gain:0.3983764764947172 attack:0.001 decay:0.2 sustain:0 hcutoff:5021.903572521802 cutoff:4000 ]", + "[ 15/4 ⇜ (4/1 → 49/12) ⇝ 33/8 | note:C#6 s:sawtooth gain:0.3999548228044306 attack:0.001 decay:0.2 sustain:0 hcutoff:5148.3645377501725 cutoff:4000 ]", + "[ 15/4 ⇜ (49/12 → 33/8) | note:A5 s:sawtooth gain:0.3999548228044306 attack:0.001 decay:0.2 sustain:0 hcutoff:5148.3645377501725 cutoff:4000 ]", + "[ 15/4 ⇜ (4/1 → 49/12) ⇝ 33/8 | note:E5 s:sawtooth gain:0.3999548228044306 attack:0.001 decay:0.2 sustain:0 hcutoff:5148.3645377501725 cutoff:4000 ]", + "[ 15/4 ⇜ (49/12 → 33/8) | note:C#5 s:sawtooth gain:0.3999548228044306 attack:0.001 decay:0.2 sustain:0 hcutoff:5148.3645377501725 cutoff:4000 ]", + "[ (33/8 → 53/12) ⇝ 9/2 | note:A5 s:sawtooth gain:0.3988719301898066 attack:0.001 decay:0.2 sustain:0 hcutoff:5047.734873274585 cutoff:4000 ]", + "[ 33/8 ⇜ (53/12 → 9/2) | note:F#5 s:sawtooth gain:0.3988719301898066 attack:0.001 decay:0.2 sustain:0 hcutoff:5047.734873274585 cutoff:4000 ]", + "[ (33/8 → 53/12) ⇝ 9/2 | note:C#5 s:sawtooth gain:0.3988719301898066 attack:0.001 decay:0.2 sustain:0 hcutoff:5047.734873274585 cutoff:4000 ]", + "[ 33/8 ⇜ (53/12 → 9/2) | note:A4 s:sawtooth gain:0.3988719301898066 attack:0.001 decay:0.2 sustain:0 hcutoff:5047.734873274585 cutoff:4000 ]", + "[ 9/2 → 19/4 | note:F#5 s:sawtooth gain:0.3955046879791817 attack:0.001 decay:0.2 sustain:0 hcutoff:4916.015592312082 cutoff:4000 ]", + "[ 9/2 → 19/4 | note:A4 s:sawtooth gain:0.3955046879791817 attack:0.001 decay:0.2 sustain:0 hcutoff:4916.015592312082 cutoff:4000 ]", + "[ (4/1 → 13/3) ⇝ 35/8 | note:C#6 s:sawtooth gain:0.3995935685018036 attack:0.001 decay:0.2 sustain:0 hcutoff:5098.597504951462 cutoff:4000 ]", + "[ 4/1 ⇜ (13/3 → 35/8) | note:A5 s:sawtooth gain:0.3995935685018036 attack:0.001 decay:0.2 sustain:0 hcutoff:5098.597504951462 cutoff:4000 ]", + "[ (4/1 → 13/3) ⇝ 35/8 | note:E5 s:sawtooth gain:0.3995935685018036 attack:0.001 decay:0.2 sustain:0 hcutoff:5098.597504951462 cutoff:4000 ]", + "[ 4/1 ⇜ (13/3 → 35/8) | note:C#5 s:sawtooth gain:0.3995935685018036 attack:0.001 decay:0.2 sustain:0 hcutoff:5098.597504951462 cutoff:4000 ]", + "[ (35/8 → 14/3) ⇝ 19/4 | note:A5 s:sawtooth gain:0.3963553195057793 attack:0.001 decay:0.2 sustain:0 hcutoff:4942.862975093085 cutoff:4000 ]", + "[ 35/8 ⇜ (14/3 → 19/4) | note:F#5 s:sawtooth gain:0.3963553195057793 attack:0.001 decay:0.2 sustain:0 hcutoff:4942.862975093085 cutoff:4000 ]", + "[ (35/8 → 14/3) ⇝ 19/4 | note:C#5 s:sawtooth gain:0.3963553195057793 attack:0.001 decay:0.2 sustain:0 hcutoff:4942.862975093085 cutoff:4000 ]", + "[ 35/8 ⇜ (14/3 → 19/4) | note:A4 s:sawtooth gain:0.3963553195057793 attack:0.001 decay:0.2 sustain:0 hcutoff:4942.862975093085 cutoff:4000 ]", + "[ 19/4 → 5/1 | note:F#5 s:sawtooth gain:0.3912316097774532 attack:0.001 decay:0.2 sustain:0 hcutoff:4806.246411789873 cutoff:4000 ]", + "[ 19/4 → 5/1 | note:A4 s:sawtooth gain:0.3912316097774532 attack:0.001 decay:0.2 sustain:0 hcutoff:4806.246411789873 cutoff:4000 ]", + "[ (17/4 → 55/12) ⇝ 37/8 | note:C#6 s:sawtooth gain:0.3977916463583412 attack:0.001 decay:0.2 sustain:0 hcutoff:4995.811501426648 cutoff:4000 ]", + "[ 17/4 ⇜ (55/12 → 37/8) | note:A5 s:sawtooth gain:0.3977916463583412 attack:0.001 decay:0.2 sustain:0 hcutoff:4995.811501426648 cutoff:4000 ]", + "[ (17/4 → 55/12) ⇝ 37/8 | note:E5 s:sawtooth gain:0.3977916463583412 attack:0.001 decay:0.2 sustain:0 hcutoff:4995.811501426648 cutoff:4000 ]", + "[ 17/4 ⇜ (55/12 → 37/8) | note:C#5 s:sawtooth gain:0.3977916463583412 attack:0.001 decay:0.2 sustain:0 hcutoff:4995.811501426648 cutoff:4000 ]", + "[ (37/8 → 59/12) ⇝ 5/1 | note:A5 s:sawtooth gain:0.39242922708895556 attack:0.001 decay:0.2 sustain:0 hcutoff:4834.036289789029 cutoff:4000 ]", + "[ 37/8 ⇜ (59/12 → 5/1) | note:F#5 s:sawtooth gain:0.39242922708895556 attack:0.001 decay:0.2 sustain:0 hcutoff:4834.036289789029 cutoff:4000 ]", + "[ (37/8 → 59/12) ⇝ 5/1 | note:C#5 s:sawtooth gain:0.39242922708895556 attack:0.001 decay:0.2 sustain:0 hcutoff:4834.036289789029 cutoff:4000 ]", + "[ 37/8 ⇜ (59/12 → 5/1) | note:A4 s:sawtooth gain:0.39242922708895556 attack:0.001 decay:0.2 sustain:0 hcutoff:4834.036289789029 cutoff:4000 ]", + "[ (9/2 → 29/6) ⇝ 39/8 | note:C#6 s:sawtooth gain:0.394566409869316 attack:0.001 decay:0.2 sustain:0 hcutoff:4888.925582549005 cutoff:4000 ]", + "[ 9/2 ⇜ (29/6 → 39/8) | note:A5 s:sawtooth gain:0.394566409869316 attack:0.001 decay:0.2 sustain:0 hcutoff:4888.925582549005 cutoff:4000 ]", + "[ (9/2 → 29/6) ⇝ 39/8 | note:E5 s:sawtooth gain:0.394566409869316 attack:0.001 decay:0.2 sustain:0 hcutoff:4888.925582549005 cutoff:4000 ]", + "[ 9/2 ⇜ (29/6 → 39/8) | note:C#5 s:sawtooth gain:0.394566409869316 attack:0.001 decay:0.2 sustain:0 hcutoff:4888.925582549005 cutoff:4000 ]", + "[ (39/8 → 5/1) ⇝ 21/4 | note:A5 s:sawtooth gain:0.3871314633555296 attack:0.001 decay:0.2 sustain:0 hcutoff:4721.553103742387 cutoff:4000 ]", + "[ (39/8 → 5/1) ⇝ 21/4 | note:C#5 s:sawtooth gain:0.3871314633555296 attack:0.001 decay:0.2 sustain:0 hcutoff:4721.553103742387 cutoff:4000 ]", + "[ (19/4 → 5/1) ⇝ 41/8 | note:C#6 s:sawtooth gain:0.38994891982521085 attack:0.001 decay:0.2 sustain:0 hcutoff:4778.23271519263 cutoff:4000 ]", + "[ (19/4 → 5/1) ⇝ 41/8 | note:E5 s:sawtooth gain:0.38994891982521085 attack:0.001 decay:0.2 sustain:0 hcutoff:4778.23271519263 cutoff:4000 ]", "[ 4/1 → 17/4 | s:bd gain:0.7 ]", "[ 9/2 → 19/4 | s:bd gain:0.7 ]", "[ 9/2 → 5/1 | s:sn gain:0.7 ]", "[ 17/4 → 9/2 | s:hh3 gain:0.7 ]", "[ 19/4 → 5/1 | s:hh3 gain:0.7 ]", - "[ 41/8 → 21/4 | n:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2799.329510692108 ]", - "[ 41/8 → 21/4 | n:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2799.329510692108 ]", - "[ 43/8 → 11/2 | n:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2832.694627163799 ]", - "[ 43/8 → 11/2 | n:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2832.694627163799 ]", - "[ 11/2 → 45/8 | n:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2848.313487543853 ]", - "[ 11/2 → 45/8 | n:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2848.313487543853 ]", - "[ 23/4 → 47/8 | n:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2877.376777172205 ]", - "[ 23/4 → 47/8 | n:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2877.376777172205 ]", - "[ 47/8 → 6/1 | n:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2890.803699781578 ]", - "[ 47/8 → 6/1 | n:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2890.803699781578 ]", - "[ 11/2 → 6/1 | n:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2870.3855457166487 ]", - "[ 11/2 → 6/1 | n:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2870.3855457166487 ]", - "[ (45/8 → 6/1) ⇝ 49/8 | n:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2877.376777172205 ]", - "[ (45/8 → 6/1) ⇝ 49/8 | n:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2877.376777172205 ]", - "[ (23/4 → 6/1) ⇝ 25/4 | n:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2884.183170199766 ]", - "[ (23/4 → 6/1) ⇝ 25/4 | n:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2884.183170199766 ]", - "[ (47/8 → 6/1) ⇝ 51/8 | n:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2890.803699781578 ]", - "[ (47/8 → 6/1) ⇝ 51/8 | n:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2890.803699781578 ]", - "[ 5/1 → 21/4 | n:F#5 s:sawtooth gain:0.3855983939685166 attack:0.001 decay:0.2 sustain:0 hcutoff:4692.8969006490215 cutoff:4000 ]", - "[ 5/1 → 21/4 | n:A4 s:sawtooth gain:0.3855983939685166 attack:0.001 decay:0.2 sustain:0 hcutoff:4692.8969006490215 cutoff:4000 ]", - "[ 39/8 ⇜ (5/1 → 31/6) ⇝ 21/4 | n:A5 s:sawtooth gain:0.3871314633555296 attack:0.001 decay:0.2 sustain:0 hcutoff:4721.553103742387 cutoff:4000 ]", - "[ 39/8 ⇜ (31/6 → 21/4) | n:F#5 s:sawtooth gain:0.3871314633555296 attack:0.001 decay:0.2 sustain:0 hcutoff:4721.553103742387 cutoff:4000 ]", - "[ 39/8 ⇜ (5/1 → 31/6) ⇝ 21/4 | n:C#5 s:sawtooth gain:0.3871314633555296 attack:0.001 decay:0.2 sustain:0 hcutoff:4721.553103742387 cutoff:4000 ]", - "[ 39/8 ⇜ (31/6 → 21/4) | n:A4 s:sawtooth gain:0.3871314633555296 attack:0.001 decay:0.2 sustain:0 hcutoff:4721.553103742387 cutoff:4000 ]", - "[ 21/4 → 11/2 | n:F#5 s:sawtooth gain:0.37865929150004085 attack:0.001 decay:0.2 sustain:0 hcutoff:4576.2777420207385 cutoff:4000 ]", - "[ 21/4 → 11/2 | n:A4 s:sawtooth gain:0.37865929150004085 attack:0.001 decay:0.2 sustain:0 hcutoff:4576.2777420207385 cutoff:4000 ]", - "[ 19/4 ⇜ (5/1 → 61/12) ⇝ 41/8 | n:C#6 s:sawtooth gain:0.38994891982521085 attack:0.001 decay:0.2 sustain:0 hcutoff:4778.23271519263 cutoff:4000 ]", - "[ 19/4 ⇜ (61/12 → 41/8) | n:A5 s:sawtooth gain:0.38994891982521085 attack:0.001 decay:0.2 sustain:0 hcutoff:4778.23271519263 cutoff:4000 ]", - "[ 19/4 ⇜ (5/1 → 61/12) ⇝ 41/8 | n:E5 s:sawtooth gain:0.38994891982521085 attack:0.001 decay:0.2 sustain:0 hcutoff:4778.23271519263 cutoff:4000 ]", - "[ 19/4 ⇜ (61/12 → 41/8) | n:C#5 s:sawtooth gain:0.38994891982521085 attack:0.001 decay:0.2 sustain:0 hcutoff:4778.23271519263 cutoff:4000 ]", - "[ (41/8 → 65/12) ⇝ 11/2 | n:A5 s:sawtooth gain:0.38051304866630675 attack:0.001 decay:0.2 sustain:0 hcutoff:4605.721725547503 cutoff:4000 ]", - "[ 41/8 ⇜ (65/12 → 11/2) | n:F#5 s:sawtooth gain:0.38051304866630675 attack:0.001 decay:0.2 sustain:0 hcutoff:4605.721725547503 cutoff:4000 ]", - "[ (41/8 → 65/12) ⇝ 11/2 | n:C#5 s:sawtooth gain:0.38051304866630675 attack:0.001 decay:0.2 sustain:0 hcutoff:4605.721725547503 cutoff:4000 ]", - "[ 41/8 ⇜ (65/12 → 11/2) | n:A4 s:sawtooth gain:0.38051304866630675 attack:0.001 decay:0.2 sustain:0 hcutoff:4605.721725547503 cutoff:4000 ]", - "[ 11/2 → 23/4 | n:F#5 s:sawtooth gain:0.3704811297220968 attack:0.001 decay:0.2 sustain:0 hcutoff:4456.708580912725 cutoff:4000 ]", - "[ 11/2 → 23/4 | n:A4 s:sawtooth gain:0.3704811297220968 attack:0.001 decay:0.2 sustain:0 hcutoff:4456.708580912725 cutoff:4000 ]", - "[ (5/1 → 16/3) ⇝ 43/8 | n:C#6 s:sawtooth gain:0.38398364517932737 attack:0.001 decay:0.2 sustain:0 hcutoff:4664.036300812779 cutoff:4000 ]", - "[ 5/1 ⇜ (16/3 → 43/8) | n:A5 s:sawtooth gain:0.38398364517932737 attack:0.001 decay:0.2 sustain:0 hcutoff:4664.036300812779 cutoff:4000 ]", - "[ (5/1 → 16/3) ⇝ 43/8 | n:E5 s:sawtooth gain:0.38398364517932737 attack:0.001 decay:0.2 sustain:0 hcutoff:4664.036300812779 cutoff:4000 ]", - "[ 5/1 ⇜ (16/3 → 43/8) | n:C#5 s:sawtooth gain:0.38398364517932737 attack:0.001 decay:0.2 sustain:0 hcutoff:4664.036300812779 cutoff:4000 ]", - "[ (43/8 → 17/3) ⇝ 23/4 | n:A5 s:sawtooth gain:0.3726377219727376 attack:0.001 decay:0.2 sustain:0 hcutoff:4486.859640960669 cutoff:4000 ]", - "[ 43/8 ⇜ (17/3 → 23/4) | n:F#5 s:sawtooth gain:0.3726377219727376 attack:0.001 decay:0.2 sustain:0 hcutoff:4486.859640960669 cutoff:4000 ]", - "[ (43/8 → 17/3) ⇝ 23/4 | n:C#5 s:sawtooth gain:0.3726377219727376 attack:0.001 decay:0.2 sustain:0 hcutoff:4486.859640960669 cutoff:4000 ]", - "[ 43/8 ⇜ (17/3 → 23/4) | n:A4 s:sawtooth gain:0.3726377219727376 attack:0.001 decay:0.2 sustain:0 hcutoff:4486.859640960669 cutoff:4000 ]", - "[ 23/4 → 6/1 | n:F#5 s:sawtooth gain:0.36114266880324386 attack:0.001 decay:0.2 sustain:0 hcutoff:4334.517148084427 cutoff:4000 ]", - "[ 23/4 → 6/1 | n:A4 s:sawtooth gain:0.36114266880324386 attack:0.001 decay:0.2 sustain:0 hcutoff:4334.517148084427 cutoff:4000 ]", - "[ (21/4 → 67/12) ⇝ 45/8 | n:C#6 s:sawtooth gain:0.3767280347874561 attack:0.001 decay:0.2 sustain:0 hcutoff:4546.64934384357 cutoff:4000 ]", - "[ 21/4 ⇜ (67/12 → 45/8) | n:A5 s:sawtooth gain:0.3767280347874561 attack:0.001 decay:0.2 sustain:0 hcutoff:4546.64934384357 cutoff:4000 ]", - "[ (21/4 → 67/12) ⇝ 45/8 | n:E5 s:sawtooth gain:0.3767280347874561 attack:0.001 decay:0.2 sustain:0 hcutoff:4546.64934384357 cutoff:4000 ]", - "[ 21/4 ⇜ (67/12 → 45/8) | n:C#5 s:sawtooth gain:0.3767280347874561 attack:0.001 decay:0.2 sustain:0 hcutoff:4546.64934384357 cutoff:4000 ]", - "[ (45/8 → 71/12) ⇝ 6/1 | n:A5 s:sawtooth gain:0.3635813269759728 attack:0.001 decay:0.2 sustain:0 hcutoff:4365.292642693734 cutoff:4000 ]", - "[ 45/8 ⇜ (71/12 → 6/1) | n:F#5 s:sawtooth gain:0.3635813269759728 attack:0.001 decay:0.2 sustain:0 hcutoff:4365.292642693734 cutoff:4000 ]", - "[ (45/8 → 71/12) ⇝ 6/1 | n:C#5 s:sawtooth gain:0.3635813269759728 attack:0.001 decay:0.2 sustain:0 hcutoff:4365.292642693734 cutoff:4000 ]", - "[ 45/8 ⇜ (71/12 → 6/1) | n:A4 s:sawtooth gain:0.3635813269759728 attack:0.001 decay:0.2 sustain:0 hcutoff:4365.292642693734 cutoff:4000 ]", - "[ (11/2 → 35/6) ⇝ 47/8 | n:C#6 s:sawtooth gain:0.368251964143991 attack:0.001 decay:0.2 sustain:0 hcutoff:4426.39359377459 cutoff:4000 ]", - "[ 11/2 ⇜ (35/6 → 47/8) | n:A5 s:sawtooth gain:0.368251964143991 attack:0.001 decay:0.2 sustain:0 hcutoff:4426.39359377459 cutoff:4000 ]", - "[ (11/2 → 35/6) ⇝ 47/8 | n:E5 s:sawtooth gain:0.368251964143991 attack:0.001 decay:0.2 sustain:0 hcutoff:4426.39359377459 cutoff:4000 ]", - "[ 11/2 ⇜ (35/6 → 47/8) | n:C#5 s:sawtooth gain:0.368251964143991 attack:0.001 decay:0.2 sustain:0 hcutoff:4426.39359377459 cutoff:4000 ]", - "[ (47/8 → 6/1) ⇝ 25/4 | n:A5 s:sawtooth gain:0.3586370624427201 attack:0.001 decay:0.2 sustain:0 hcutoff:4303.598663257904 cutoff:4000 ]", - "[ (47/8 → 6/1) ⇝ 25/4 | n:C#5 s:sawtooth gain:0.3586370624427201 attack:0.001 decay:0.2 sustain:0 hcutoff:4303.598663257904 cutoff:4000 ]", - "[ (23/4 → 6/1) ⇝ 49/8 | n:C#6 s:sawtooth gain:0.36114266880324386 attack:0.001 decay:0.2 sustain:0 hcutoff:4334.517148084427 cutoff:4000 ]", - "[ (23/4 → 6/1) ⇝ 49/8 | n:E5 s:sawtooth gain:0.36114266880324386 attack:0.001 decay:0.2 sustain:0 hcutoff:4334.517148084427 cutoff:4000 ]", + "[ 41/8 → 21/4 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2799.329510692108 ]", + "[ 41/8 → 21/4 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2799.329510692108 ]", + "[ 43/8 → 11/2 | note:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2832.694627163799 ]", + "[ 43/8 → 11/2 | note:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2832.694627163799 ]", + "[ 11/2 → 45/8 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2848.313487543853 ]", + "[ 11/2 → 45/8 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2848.313487543853 ]", + "[ 23/4 → 47/8 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2877.376777172205 ]", + "[ 23/4 → 47/8 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2877.376777172205 ]", + "[ 47/8 → 6/1 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2890.803699781578 ]", + "[ 47/8 → 6/1 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2890.803699781578 ]", + "[ 11/2 → 6/1 | note:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2870.3855457166487 ]", + "[ 11/2 → 6/1 | note:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2870.3855457166487 ]", + "[ (45/8 → 6/1) ⇝ 49/8 | note:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2877.376777172205 ]", + "[ (45/8 → 6/1) ⇝ 49/8 | note:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2877.376777172205 ]", + "[ (23/4 → 6/1) ⇝ 25/4 | note:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2884.183170199766 ]", + "[ (23/4 → 6/1) ⇝ 25/4 | note:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2884.183170199766 ]", + "[ (47/8 → 6/1) ⇝ 51/8 | note:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2890.803699781578 ]", + "[ (47/8 → 6/1) ⇝ 51/8 | note:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2890.803699781578 ]", + "[ 5/1 → 21/4 | note:F#5 s:sawtooth gain:0.3855983939685166 attack:0.001 decay:0.2 sustain:0 hcutoff:4692.8969006490215 cutoff:4000 ]", + "[ 5/1 → 21/4 | note:A4 s:sawtooth gain:0.3855983939685166 attack:0.001 decay:0.2 sustain:0 hcutoff:4692.8969006490215 cutoff:4000 ]", + "[ 39/8 ⇜ (5/1 → 31/6) ⇝ 21/4 | note:A5 s:sawtooth gain:0.3871314633555296 attack:0.001 decay:0.2 sustain:0 hcutoff:4721.553103742387 cutoff:4000 ]", + "[ 39/8 ⇜ (31/6 → 21/4) | note:F#5 s:sawtooth gain:0.3871314633555296 attack:0.001 decay:0.2 sustain:0 hcutoff:4721.553103742387 cutoff:4000 ]", + "[ 39/8 ⇜ (5/1 → 31/6) ⇝ 21/4 | note:C#5 s:sawtooth gain:0.3871314633555296 attack:0.001 decay:0.2 sustain:0 hcutoff:4721.553103742387 cutoff:4000 ]", + "[ 39/8 ⇜ (31/6 → 21/4) | note:A4 s:sawtooth gain:0.3871314633555296 attack:0.001 decay:0.2 sustain:0 hcutoff:4721.553103742387 cutoff:4000 ]", + "[ 21/4 → 11/2 | note:F#5 s:sawtooth gain:0.37865929150004085 attack:0.001 decay:0.2 sustain:0 hcutoff:4576.2777420207385 cutoff:4000 ]", + "[ 21/4 → 11/2 | note:A4 s:sawtooth gain:0.37865929150004085 attack:0.001 decay:0.2 sustain:0 hcutoff:4576.2777420207385 cutoff:4000 ]", + "[ 19/4 ⇜ (5/1 → 61/12) ⇝ 41/8 | note:C#6 s:sawtooth gain:0.38994891982521085 attack:0.001 decay:0.2 sustain:0 hcutoff:4778.23271519263 cutoff:4000 ]", + "[ 19/4 ⇜ (61/12 → 41/8) | note:A5 s:sawtooth gain:0.38994891982521085 attack:0.001 decay:0.2 sustain:0 hcutoff:4778.23271519263 cutoff:4000 ]", + "[ 19/4 ⇜ (5/1 → 61/12) ⇝ 41/8 | note:E5 s:sawtooth gain:0.38994891982521085 attack:0.001 decay:0.2 sustain:0 hcutoff:4778.23271519263 cutoff:4000 ]", + "[ 19/4 ⇜ (61/12 → 41/8) | note:C#5 s:sawtooth gain:0.38994891982521085 attack:0.001 decay:0.2 sustain:0 hcutoff:4778.23271519263 cutoff:4000 ]", + "[ (41/8 → 65/12) ⇝ 11/2 | note:A5 s:sawtooth gain:0.38051304866630675 attack:0.001 decay:0.2 sustain:0 hcutoff:4605.721725547503 cutoff:4000 ]", + "[ 41/8 ⇜ (65/12 → 11/2) | note:F#5 s:sawtooth gain:0.38051304866630675 attack:0.001 decay:0.2 sustain:0 hcutoff:4605.721725547503 cutoff:4000 ]", + "[ (41/8 → 65/12) ⇝ 11/2 | note:C#5 s:sawtooth gain:0.38051304866630675 attack:0.001 decay:0.2 sustain:0 hcutoff:4605.721725547503 cutoff:4000 ]", + "[ 41/8 ⇜ (65/12 → 11/2) | note:A4 s:sawtooth gain:0.38051304866630675 attack:0.001 decay:0.2 sustain:0 hcutoff:4605.721725547503 cutoff:4000 ]", + "[ 11/2 → 23/4 | note:F#5 s:sawtooth gain:0.3704811297220968 attack:0.001 decay:0.2 sustain:0 hcutoff:4456.708580912725 cutoff:4000 ]", + "[ 11/2 → 23/4 | note:A4 s:sawtooth gain:0.3704811297220968 attack:0.001 decay:0.2 sustain:0 hcutoff:4456.708580912725 cutoff:4000 ]", + "[ (5/1 → 16/3) ⇝ 43/8 | note:C#6 s:sawtooth gain:0.38398364517932737 attack:0.001 decay:0.2 sustain:0 hcutoff:4664.036300812779 cutoff:4000 ]", + "[ 5/1 ⇜ (16/3 → 43/8) | note:A5 s:sawtooth gain:0.38398364517932737 attack:0.001 decay:0.2 sustain:0 hcutoff:4664.036300812779 cutoff:4000 ]", + "[ (5/1 → 16/3) ⇝ 43/8 | note:E5 s:sawtooth gain:0.38398364517932737 attack:0.001 decay:0.2 sustain:0 hcutoff:4664.036300812779 cutoff:4000 ]", + "[ 5/1 ⇜ (16/3 → 43/8) | note:C#5 s:sawtooth gain:0.38398364517932737 attack:0.001 decay:0.2 sustain:0 hcutoff:4664.036300812779 cutoff:4000 ]", + "[ (43/8 → 17/3) ⇝ 23/4 | note:A5 s:sawtooth gain:0.3726377219727376 attack:0.001 decay:0.2 sustain:0 hcutoff:4486.859640960669 cutoff:4000 ]", + "[ 43/8 ⇜ (17/3 → 23/4) | note:F#5 s:sawtooth gain:0.3726377219727376 attack:0.001 decay:0.2 sustain:0 hcutoff:4486.859640960669 cutoff:4000 ]", + "[ (43/8 → 17/3) ⇝ 23/4 | note:C#5 s:sawtooth gain:0.3726377219727376 attack:0.001 decay:0.2 sustain:0 hcutoff:4486.859640960669 cutoff:4000 ]", + "[ 43/8 ⇜ (17/3 → 23/4) | note:A4 s:sawtooth gain:0.3726377219727376 attack:0.001 decay:0.2 sustain:0 hcutoff:4486.859640960669 cutoff:4000 ]", + "[ 23/4 → 6/1 | note:F#5 s:sawtooth gain:0.36114266880324386 attack:0.001 decay:0.2 sustain:0 hcutoff:4334.517148084427 cutoff:4000 ]", + "[ 23/4 → 6/1 | note:A4 s:sawtooth gain:0.36114266880324386 attack:0.001 decay:0.2 sustain:0 hcutoff:4334.517148084427 cutoff:4000 ]", + "[ (21/4 → 67/12) ⇝ 45/8 | note:C#6 s:sawtooth gain:0.3767280347874561 attack:0.001 decay:0.2 sustain:0 hcutoff:4546.64934384357 cutoff:4000 ]", + "[ 21/4 ⇜ (67/12 → 45/8) | note:A5 s:sawtooth gain:0.3767280347874561 attack:0.001 decay:0.2 sustain:0 hcutoff:4546.64934384357 cutoff:4000 ]", + "[ (21/4 → 67/12) ⇝ 45/8 | note:E5 s:sawtooth gain:0.3767280347874561 attack:0.001 decay:0.2 sustain:0 hcutoff:4546.64934384357 cutoff:4000 ]", + "[ 21/4 ⇜ (67/12 → 45/8) | note:C#5 s:sawtooth gain:0.3767280347874561 attack:0.001 decay:0.2 sustain:0 hcutoff:4546.64934384357 cutoff:4000 ]", + "[ (45/8 → 71/12) ⇝ 6/1 | note:A5 s:sawtooth gain:0.3635813269759728 attack:0.001 decay:0.2 sustain:0 hcutoff:4365.292642693734 cutoff:4000 ]", + "[ 45/8 ⇜ (71/12 → 6/1) | note:F#5 s:sawtooth gain:0.3635813269759728 attack:0.001 decay:0.2 sustain:0 hcutoff:4365.292642693734 cutoff:4000 ]", + "[ (45/8 → 71/12) ⇝ 6/1 | note:C#5 s:sawtooth gain:0.3635813269759728 attack:0.001 decay:0.2 sustain:0 hcutoff:4365.292642693734 cutoff:4000 ]", + "[ 45/8 ⇜ (71/12 → 6/1) | note:A4 s:sawtooth gain:0.3635813269759728 attack:0.001 decay:0.2 sustain:0 hcutoff:4365.292642693734 cutoff:4000 ]", + "[ (11/2 → 35/6) ⇝ 47/8 | note:C#6 s:sawtooth gain:0.368251964143991 attack:0.001 decay:0.2 sustain:0 hcutoff:4426.39359377459 cutoff:4000 ]", + "[ 11/2 ⇜ (35/6 → 47/8) | note:A5 s:sawtooth gain:0.368251964143991 attack:0.001 decay:0.2 sustain:0 hcutoff:4426.39359377459 cutoff:4000 ]", + "[ (11/2 → 35/6) ⇝ 47/8 | note:E5 s:sawtooth gain:0.368251964143991 attack:0.001 decay:0.2 sustain:0 hcutoff:4426.39359377459 cutoff:4000 ]", + "[ 11/2 ⇜ (35/6 → 47/8) | note:C#5 s:sawtooth gain:0.368251964143991 attack:0.001 decay:0.2 sustain:0 hcutoff:4426.39359377459 cutoff:4000 ]", + "[ (47/8 → 6/1) ⇝ 25/4 | note:A5 s:sawtooth gain:0.3586370624427201 attack:0.001 decay:0.2 sustain:0 hcutoff:4303.598663257904 cutoff:4000 ]", + "[ (47/8 → 6/1) ⇝ 25/4 | note:C#5 s:sawtooth gain:0.3586370624427201 attack:0.001 decay:0.2 sustain:0 hcutoff:4303.598663257904 cutoff:4000 ]", + "[ (23/4 → 6/1) ⇝ 49/8 | note:C#6 s:sawtooth gain:0.36114266880324386 attack:0.001 decay:0.2 sustain:0 hcutoff:4334.517148084427 cutoff:4000 ]", + "[ (23/4 → 6/1) ⇝ 49/8 | note:E5 s:sawtooth gain:0.36114266880324386 attack:0.001 decay:0.2 sustain:0 hcutoff:4334.517148084427 cutoff:4000 ]", "[ 5/1 → 21/4 | s:bd gain:0.7 ]", "[ 11/2 → 23/4 | s:bd gain:0.7 ]", "[ 11/2 → 6/1 | s:sn gain:0.7 ]", "[ 21/4 → 11/2 | s:hh3 gain:0.7 ]", "[ 23/4 → 6/1 | s:hh3 gain:0.7 ]", - "[ 49/8 → 25/4 | n:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2915.4076660819765 ]", - "[ 49/8 → 25/4 | n:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2915.4076660819765 ]", - "[ 51/8 → 13/2 | n:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2936.9631544781614 ]", - "[ 51/8 → 13/2 | n:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2936.9631544781614 ]", - "[ 13/2 → 53/8 | n:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2946.5812012110136 ]", - "[ 13/2 → 53/8 | n:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2946.5812012110136 ]", - "[ 27/4 → 55/8 | n:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2963.468935477506 ]", - "[ 27/4 → 55/8 | n:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2963.468935477506 ]", - "[ 55/8 → 7/1 | n:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2970.728450471497 ]", - "[ 55/8 → 7/1 | n:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2970.728450471497 ]", - "[ 45/8 ⇜ (6/1 → 49/8) | n:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2903.483208638841 ]", - "[ 45/8 ⇜ (6/1 → 49/8) | n:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2903.483208638841 ]", - "[ 23/4 ⇜ (6/1 → 25/4) | n:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2909.5402784268977 ]", - "[ 23/4 ⇜ (6/1 → 25/4) | n:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2909.5402784268977 ]", - "[ 47/8 ⇜ (6/1 → 51/8) | n:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2915.4076660819765 ]", - "[ 47/8 ⇜ (6/1 → 51/8) | n:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2915.4076660819765 ]", - "[ 6/1 → 25/4 | n:F#5 s:sawtooth gain:0.3507338432270528 attack:0.001 decay:0.2 sustain:0 hcutoff:4210.038361759807 cutoff:4000 ]", - "[ 6/1 → 25/4 | n:A4 s:sawtooth gain:0.3507338432270528 attack:0.001 decay:0.2 sustain:0 hcutoff:4210.038361759807 cutoff:4000 ]", - "[ 47/8 ⇜ (6/1 → 37/6) ⇝ 25/4 | n:A5 s:sawtooth gain:0.3507338432270528 attack:0.001 decay:0.2 sustain:0 hcutoff:4210.038361759807 cutoff:4000 ]", - "[ 47/8 ⇜ (37/6 → 25/4) | n:F#5 s:sawtooth gain:0.3507338432270528 attack:0.001 decay:0.2 sustain:0 hcutoff:4210.038361759807 cutoff:4000 ]", - "[ 47/8 ⇜ (6/1 → 37/6) ⇝ 25/4 | n:C#5 s:sawtooth gain:0.3507338432270528 attack:0.001 decay:0.2 sustain:0 hcutoff:4210.038361759807 cutoff:4000 ]", - "[ 47/8 ⇜ (37/6 → 25/4) | n:A4 s:sawtooth gain:0.3507338432270528 attack:0.001 decay:0.2 sustain:0 hcutoff:4210.038361759807 cutoff:4000 ]", - "[ 25/4 → 13/2 | n:F#5 s:sawtooth gain:0.33935489567386506 attack:0.001 decay:0.2 sustain:0 hcutoff:4083.6134096397636 cutoff:4000 ]", - "[ 25/4 → 13/2 | n:A4 s:sawtooth gain:0.33935489567386506 attack:0.001 decay:0.2 sustain:0 hcutoff:4083.6134096397636 cutoff:4000 ]", - "[ 23/4 ⇜ (6/1 → 73/12) ⇝ 49/8 | n:C#6 s:sawtooth gain:0.35343108171056015 attack:0.001 decay:0.2 sustain:0 hcutoff:4241.3539374389275 cutoff:4000 ]", - "[ 23/4 ⇜ (73/12 → 49/8) | n:A5 s:sawtooth gain:0.35343108171056015 attack:0.001 decay:0.2 sustain:0 hcutoff:4241.3539374389275 cutoff:4000 ]", - "[ 23/4 ⇜ (6/1 → 73/12) ⇝ 49/8 | n:E5 s:sawtooth gain:0.35343108171056015 attack:0.001 decay:0.2 sustain:0 hcutoff:4241.3539374389275 cutoff:4000 ]", - "[ 23/4 ⇜ (73/12 → 49/8) | n:C#5 s:sawtooth gain:0.35343108171056015 attack:0.001 decay:0.2 sustain:0 hcutoff:4241.3539374389275 cutoff:4000 ]", - "[ (49/8 → 77/12) ⇝ 13/2 | n:A5 s:sawtooth gain:0.3422847385870941 attack:0.001 decay:0.2 sustain:0 hcutoff:4115.383232572483 cutoff:4000 ]", - "[ 49/8 ⇜ (77/12 → 13/2) | n:F#5 s:sawtooth gain:0.3422847385870941 attack:0.001 decay:0.2 sustain:0 hcutoff:4115.383232572483 cutoff:4000 ]", - "[ (49/8 → 77/12) ⇝ 13/2 | n:C#5 s:sawtooth gain:0.3422847385870941 attack:0.001 decay:0.2 sustain:0 hcutoff:4115.383232572483 cutoff:4000 ]", - "[ 49/8 ⇜ (77/12 → 13/2) | n:A4 s:sawtooth gain:0.3422847385870941 attack:0.001 decay:0.2 sustain:0 hcutoff:4115.383232572483 cutoff:4000 ]", - "[ 13/2 → 27/4 | n:F#5 s:sawtooth gain:0.3271154116289833 attack:0.001 decay:0.2 sustain:0 hcutoff:3955.588813730369 cutoff:4000 ]", - "[ 13/2 → 27/4 | n:A4 s:sawtooth gain:0.3271154116289833 attack:0.001 decay:0.2 sustain:0 hcutoff:3955.588813730369 cutoff:4000 ]", - "[ (6/1 → 19/3) ⇝ 51/8 | n:C#6 s:sawtooth gain:0.3479759264430665 attack:0.001 decay:0.2 sustain:0 hcutoff:4178.601124662687 cutoff:4000 ]", - "[ 6/1 ⇜ (19/3 → 51/8) | n:A5 s:sawtooth gain:0.3479759264430665 attack:0.001 decay:0.2 sustain:0 hcutoff:4178.601124662687 cutoff:4000 ]", - "[ (6/1 → 19/3) ⇝ 51/8 | n:E5 s:sawtooth gain:0.3479759264430665 attack:0.001 decay:0.2 sustain:0 hcutoff:4178.601124662687 cutoff:4000 ]", - "[ 6/1 ⇜ (19/3 → 51/8) | n:C#5 s:sawtooth gain:0.3479759264430665 attack:0.001 decay:0.2 sustain:0 hcutoff:4178.601124662687 cutoff:4000 ]", - "[ (51/8 → 20/3) ⇝ 27/4 | n:A5 s:sawtooth gain:0.3302496429830646 attack:0.001 decay:0.2 sustain:0 hcutoff:3987.7258050403216 cutoff:4000 ]", - "[ 51/8 ⇜ (20/3 → 27/4) | n:F#5 s:sawtooth gain:0.3302496429830646 attack:0.001 decay:0.2 sustain:0 hcutoff:3987.7258050403216 cutoff:4000 ]", - "[ (51/8 → 20/3) ⇝ 27/4 | n:C#5 s:sawtooth gain:0.3302496429830646 attack:0.001 decay:0.2 sustain:0 hcutoff:3987.7258050403216 cutoff:4000 ]", - "[ 51/8 ⇜ (20/3 → 27/4) | n:A4 s:sawtooth gain:0.3302496429830646 attack:0.001 decay:0.2 sustain:0 hcutoff:3987.7258050403216 cutoff:4000 ]", - "[ 27/4 → 7/1 | n:F#5 s:sawtooth gain:0.31413326401454233 attack:0.001 decay:0.2 sustain:0 hcutoff:3826.315480550129 cutoff:4000 ]", - "[ 27/4 → 7/1 | n:A4 s:sawtooth gain:0.31413326401454233 attack:0.001 decay:0.2 sustain:0 hcutoff:3826.315480550129 cutoff:4000 ]", - "[ (25/4 → 79/12) ⇝ 53/8 | n:C#6 s:sawtooth gain:0.3363712287126769 attack:0.001 decay:0.2 sustain:0 hcutoff:4051.743587553753 cutoff:4000 ]", - "[ 25/4 ⇜ (79/12 → 53/8) | n:A5 s:sawtooth gain:0.3363712287126769 attack:0.001 decay:0.2 sustain:0 hcutoff:4051.743587553753 cutoff:4000 ]", - "[ (25/4 → 79/12) ⇝ 53/8 | n:E5 s:sawtooth gain:0.3363712287126769 attack:0.001 decay:0.2 sustain:0 hcutoff:4051.743587553753 cutoff:4000 ]", - "[ 25/4 ⇜ (79/12 → 53/8) | n:C#5 s:sawtooth gain:0.3363712287126769 attack:0.001 decay:0.2 sustain:0 hcutoff:4051.743587553753 cutoff:4000 ]", - "[ (53/8 → 83/12) ⇝ 7/1 | n:A5 s:sawtooth gain:0.3174416994481911 attack:0.001 decay:0.2 sustain:0 hcutoff:3858.7315549779487 cutoff:4000 ]", - "[ 53/8 ⇜ (83/12 → 7/1) | n:F#5 s:sawtooth gain:0.3174416994481911 attack:0.001 decay:0.2 sustain:0 hcutoff:3858.7315549779487 cutoff:4000 ]", - "[ (53/8 → 83/12) ⇝ 7/1 | n:C#5 s:sawtooth gain:0.3174416994481911 attack:0.001 decay:0.2 sustain:0 hcutoff:3858.7315549779487 cutoff:4000 ]", - "[ 53/8 ⇜ (83/12 → 7/1) | n:A4 s:sawtooth gain:0.3174416994481911 attack:0.001 decay:0.2 sustain:0 hcutoff:3858.7315549779487 cutoff:4000 ]", - "[ (13/2 → 41/6) ⇝ 55/8 | n:C#6 s:sawtooth gain:0.32393472883446767 attack:0.001 decay:0.2 sustain:0 hcutoff:3923.373759622562 cutoff:4000 ]", - "[ 13/2 ⇜ (41/6 → 55/8) | n:A5 s:sawtooth gain:0.32393472883446767 attack:0.001 decay:0.2 sustain:0 hcutoff:3923.373759622562 cutoff:4000 ]", - "[ (13/2 → 41/6) ⇝ 55/8 | n:E5 s:sawtooth gain:0.32393472883446767 attack:0.001 decay:0.2 sustain:0 hcutoff:3923.373759622562 cutoff:4000 ]", - "[ 13/2 ⇜ (41/6 → 55/8) | n:C#5 s:sawtooth gain:0.32393472883446767 attack:0.001 decay:0.2 sustain:0 hcutoff:3923.373759622562 cutoff:4000 ]", - "[ (55/8 → 7/1) ⇝ 29/4 | n:A5 s:sawtooth gain:0.30398425548024827 attack:0.001 decay:0.2 sustain:0 hcutoff:3728.7540466585065 cutoff:4000 ]", - "[ (55/8 → 7/1) ⇝ 29/4 | n:C#5 s:sawtooth gain:0.30398425548024827 attack:0.001 decay:0.2 sustain:0 hcutoff:3728.7540466585065 cutoff:4000 ]", - "[ (27/4 → 7/1) ⇝ 57/8 | n:C#6 s:sawtooth gain:0.3107861971007485 attack:0.001 decay:0.2 sustain:0 hcutoff:3793.8434936445938 cutoff:4000 ]", - "[ (27/4 → 7/1) ⇝ 57/8 | n:E5 s:sawtooth gain:0.3107861971007485 attack:0.001 decay:0.2 sustain:0 hcutoff:3793.8434936445938 cutoff:4000 ]", + "[ 49/8 → 25/4 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2915.4076660819765 ]", + "[ 49/8 → 25/4 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2915.4076660819765 ]", + "[ 51/8 → 13/2 | note:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2936.9631544781614 ]", + "[ 51/8 → 13/2 | note:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2936.9631544781614 ]", + "[ 13/2 → 53/8 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2946.5812012110136 ]", + "[ 13/2 → 53/8 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2946.5812012110136 ]", + "[ 27/4 → 55/8 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2963.468935477506 ]", + "[ 27/4 → 55/8 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2963.468935477506 ]", + "[ 55/8 → 7/1 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2970.728450471497 ]", + "[ 55/8 → 7/1 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2970.728450471497 ]", + "[ 45/8 ⇜ (6/1 → 49/8) | note:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2903.483208638841 ]", + "[ 45/8 ⇜ (6/1 → 49/8) | note:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2903.483208638841 ]", + "[ 23/4 ⇜ (6/1 → 25/4) | note:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2909.5402784268977 ]", + "[ 23/4 ⇜ (6/1 → 25/4) | note:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2909.5402784268977 ]", + "[ 47/8 ⇜ (6/1 → 51/8) | note:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2915.4076660819765 ]", + "[ 47/8 ⇜ (6/1 → 51/8) | note:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2915.4076660819765 ]", + "[ 6/1 → 25/4 | note:F#5 s:sawtooth gain:0.3507338432270528 attack:0.001 decay:0.2 sustain:0 hcutoff:4210.038361759807 cutoff:4000 ]", + "[ 6/1 → 25/4 | note:A4 s:sawtooth gain:0.3507338432270528 attack:0.001 decay:0.2 sustain:0 hcutoff:4210.038361759807 cutoff:4000 ]", + "[ 47/8 ⇜ (6/1 → 37/6) ⇝ 25/4 | note:A5 s:sawtooth gain:0.3507338432270528 attack:0.001 decay:0.2 sustain:0 hcutoff:4210.038361759807 cutoff:4000 ]", + "[ 47/8 ⇜ (37/6 → 25/4) | note:F#5 s:sawtooth gain:0.3507338432270528 attack:0.001 decay:0.2 sustain:0 hcutoff:4210.038361759807 cutoff:4000 ]", + "[ 47/8 ⇜ (6/1 → 37/6) ⇝ 25/4 | note:C#5 s:sawtooth gain:0.3507338432270528 attack:0.001 decay:0.2 sustain:0 hcutoff:4210.038361759807 cutoff:4000 ]", + "[ 47/8 ⇜ (37/6 → 25/4) | note:A4 s:sawtooth gain:0.3507338432270528 attack:0.001 decay:0.2 sustain:0 hcutoff:4210.038361759807 cutoff:4000 ]", + "[ 25/4 → 13/2 | note:F#5 s:sawtooth gain:0.33935489567386506 attack:0.001 decay:0.2 sustain:0 hcutoff:4083.6134096397636 cutoff:4000 ]", + "[ 25/4 → 13/2 | note:A4 s:sawtooth gain:0.33935489567386506 attack:0.001 decay:0.2 sustain:0 hcutoff:4083.6134096397636 cutoff:4000 ]", + "[ 23/4 ⇜ (6/1 → 73/12) ⇝ 49/8 | note:C#6 s:sawtooth gain:0.35343108171056015 attack:0.001 decay:0.2 sustain:0 hcutoff:4241.3539374389275 cutoff:4000 ]", + "[ 23/4 ⇜ (73/12 → 49/8) | note:A5 s:sawtooth gain:0.35343108171056015 attack:0.001 decay:0.2 sustain:0 hcutoff:4241.3539374389275 cutoff:4000 ]", + "[ 23/4 ⇜ (6/1 → 73/12) ⇝ 49/8 | note:E5 s:sawtooth gain:0.35343108171056015 attack:0.001 decay:0.2 sustain:0 hcutoff:4241.3539374389275 cutoff:4000 ]", + "[ 23/4 ⇜ (73/12 → 49/8) | note:C#5 s:sawtooth gain:0.35343108171056015 attack:0.001 decay:0.2 sustain:0 hcutoff:4241.3539374389275 cutoff:4000 ]", + "[ (49/8 → 77/12) ⇝ 13/2 | note:A5 s:sawtooth gain:0.3422847385870941 attack:0.001 decay:0.2 sustain:0 hcutoff:4115.383232572483 cutoff:4000 ]", + "[ 49/8 ⇜ (77/12 → 13/2) | note:F#5 s:sawtooth gain:0.3422847385870941 attack:0.001 decay:0.2 sustain:0 hcutoff:4115.383232572483 cutoff:4000 ]", + "[ (49/8 → 77/12) ⇝ 13/2 | note:C#5 s:sawtooth gain:0.3422847385870941 attack:0.001 decay:0.2 sustain:0 hcutoff:4115.383232572483 cutoff:4000 ]", + "[ 49/8 ⇜ (77/12 → 13/2) | note:A4 s:sawtooth gain:0.3422847385870941 attack:0.001 decay:0.2 sustain:0 hcutoff:4115.383232572483 cutoff:4000 ]", + "[ 13/2 → 27/4 | note:F#5 s:sawtooth gain:0.3271154116289833 attack:0.001 decay:0.2 sustain:0 hcutoff:3955.588813730369 cutoff:4000 ]", + "[ 13/2 → 27/4 | note:A4 s:sawtooth gain:0.3271154116289833 attack:0.001 decay:0.2 sustain:0 hcutoff:3955.588813730369 cutoff:4000 ]", + "[ (6/1 → 19/3) ⇝ 51/8 | note:C#6 s:sawtooth gain:0.3479759264430665 attack:0.001 decay:0.2 sustain:0 hcutoff:4178.601124662687 cutoff:4000 ]", + "[ 6/1 ⇜ (19/3 → 51/8) | note:A5 s:sawtooth gain:0.3479759264430665 attack:0.001 decay:0.2 sustain:0 hcutoff:4178.601124662687 cutoff:4000 ]", + "[ (6/1 → 19/3) ⇝ 51/8 | note:E5 s:sawtooth gain:0.3479759264430665 attack:0.001 decay:0.2 sustain:0 hcutoff:4178.601124662687 cutoff:4000 ]", + "[ 6/1 ⇜ (19/3 → 51/8) | note:C#5 s:sawtooth gain:0.3479759264430665 attack:0.001 decay:0.2 sustain:0 hcutoff:4178.601124662687 cutoff:4000 ]", + "[ (51/8 → 20/3) ⇝ 27/4 | note:A5 s:sawtooth gain:0.3302496429830646 attack:0.001 decay:0.2 sustain:0 hcutoff:3987.7258050403216 cutoff:4000 ]", + "[ 51/8 ⇜ (20/3 → 27/4) | note:F#5 s:sawtooth gain:0.3302496429830646 attack:0.001 decay:0.2 sustain:0 hcutoff:3987.7258050403216 cutoff:4000 ]", + "[ (51/8 → 20/3) ⇝ 27/4 | note:C#5 s:sawtooth gain:0.3302496429830646 attack:0.001 decay:0.2 sustain:0 hcutoff:3987.7258050403216 cutoff:4000 ]", + "[ 51/8 ⇜ (20/3 → 27/4) | note:A4 s:sawtooth gain:0.3302496429830646 attack:0.001 decay:0.2 sustain:0 hcutoff:3987.7258050403216 cutoff:4000 ]", + "[ 27/4 → 7/1 | note:F#5 s:sawtooth gain:0.31413326401454233 attack:0.001 decay:0.2 sustain:0 hcutoff:3826.315480550129 cutoff:4000 ]", + "[ 27/4 → 7/1 | note:A4 s:sawtooth gain:0.31413326401454233 attack:0.001 decay:0.2 sustain:0 hcutoff:3826.315480550129 cutoff:4000 ]", + "[ (25/4 → 79/12) ⇝ 53/8 | note:C#6 s:sawtooth gain:0.3363712287126769 attack:0.001 decay:0.2 sustain:0 hcutoff:4051.743587553753 cutoff:4000 ]", + "[ 25/4 ⇜ (79/12 → 53/8) | note:A5 s:sawtooth gain:0.3363712287126769 attack:0.001 decay:0.2 sustain:0 hcutoff:4051.743587553753 cutoff:4000 ]", + "[ (25/4 → 79/12) ⇝ 53/8 | note:E5 s:sawtooth gain:0.3363712287126769 attack:0.001 decay:0.2 sustain:0 hcutoff:4051.743587553753 cutoff:4000 ]", + "[ 25/4 ⇜ (79/12 → 53/8) | note:C#5 s:sawtooth gain:0.3363712287126769 attack:0.001 decay:0.2 sustain:0 hcutoff:4051.743587553753 cutoff:4000 ]", + "[ (53/8 → 83/12) ⇝ 7/1 | note:A5 s:sawtooth gain:0.3174416994481911 attack:0.001 decay:0.2 sustain:0 hcutoff:3858.7315549779487 cutoff:4000 ]", + "[ 53/8 ⇜ (83/12 → 7/1) | note:F#5 s:sawtooth gain:0.3174416994481911 attack:0.001 decay:0.2 sustain:0 hcutoff:3858.7315549779487 cutoff:4000 ]", + "[ (53/8 → 83/12) ⇝ 7/1 | note:C#5 s:sawtooth gain:0.3174416994481911 attack:0.001 decay:0.2 sustain:0 hcutoff:3858.7315549779487 cutoff:4000 ]", + "[ 53/8 ⇜ (83/12 → 7/1) | note:A4 s:sawtooth gain:0.3174416994481911 attack:0.001 decay:0.2 sustain:0 hcutoff:3858.7315549779487 cutoff:4000 ]", + "[ (13/2 → 41/6) ⇝ 55/8 | note:C#6 s:sawtooth gain:0.32393472883446767 attack:0.001 decay:0.2 sustain:0 hcutoff:3923.373759622562 cutoff:4000 ]", + "[ 13/2 ⇜ (41/6 → 55/8) | note:A5 s:sawtooth gain:0.32393472883446767 attack:0.001 decay:0.2 sustain:0 hcutoff:3923.373759622562 cutoff:4000 ]", + "[ (13/2 → 41/6) ⇝ 55/8 | note:E5 s:sawtooth gain:0.32393472883446767 attack:0.001 decay:0.2 sustain:0 hcutoff:3923.373759622562 cutoff:4000 ]", + "[ 13/2 ⇜ (41/6 → 55/8) | note:C#5 s:sawtooth gain:0.32393472883446767 attack:0.001 decay:0.2 sustain:0 hcutoff:3923.373759622562 cutoff:4000 ]", + "[ (55/8 → 7/1) ⇝ 29/4 | note:A5 s:sawtooth gain:0.30398425548024827 attack:0.001 decay:0.2 sustain:0 hcutoff:3728.7540466585065 cutoff:4000 ]", + "[ (55/8 → 7/1) ⇝ 29/4 | note:C#5 s:sawtooth gain:0.30398425548024827 attack:0.001 decay:0.2 sustain:0 hcutoff:3728.7540466585065 cutoff:4000 ]", + "[ (27/4 → 7/1) ⇝ 57/8 | note:C#6 s:sawtooth gain:0.3107861971007485 attack:0.001 decay:0.2 sustain:0 hcutoff:3793.8434936445938 cutoff:4000 ]", + "[ (27/4 → 7/1) ⇝ 57/8 | note:E5 s:sawtooth gain:0.3107861971007485 attack:0.001 decay:0.2 sustain:0 hcutoff:3793.8434936445938 cutoff:4000 ]", "[ 6/1 → 25/4 | s:bd gain:0.7 ]", "[ 13/2 → 27/4 | s:bd gain:0.7 ]", "[ 13/2 → 7/1 | s:sn gain:0.7 ]", "[ 25/4 → 13/2 | s:hh3 gain:0.7 ]", "[ 27/4 → 7/1 | s:hh3 gain:0.7 ]", - "[ 57/8 → 29/4 | n:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2982.856914513109 ]", - "[ 57/8 → 29/4 | n:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2982.856914513109 ]", - "[ 59/8 → 15/2 | n:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2991.774409503181 ]", - "[ 59/8 → 15/2 | n:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2991.774409503181 ]", - "[ 15/2 → 61/8 | n:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2995.0220264467503 ]", - "[ 15/2 → 61/8 | n:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2995.0220264467503 ]", - "[ 31/4 → 63/8 | n:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2999.0852191942718 ]", - "[ 31/4 → 63/8 | n:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2999.0852191942718 ]", - "[ 63/8 → 8/1 | n:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2999.898347482845 ]", - "[ 63/8 → 8/1 | n:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2999.898347482845 ]", - "[ 15/2 → 8/1 | n:G3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2998.3738658769826 ]", - "[ 15/2 → 8/1 | n:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2998.3738658769826 ]", - "[ (61/8 → 8/1) ⇝ 65/8 | n:G3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2999.0852191942718 ]", - "[ (61/8 → 8/1) ⇝ 65/8 | n:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2999.0852191942718 ]", - "[ (31/4 → 8/1) ⇝ 33/4 | n:G3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2999.5934052398757 ]", - "[ (31/4 → 8/1) ⇝ 33/4 | n:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2999.5934052398757 ]", - "[ (63/8 → 8/1) ⇝ 67/8 | n:G3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2999.898347482845 ]", - "[ (63/8 → 8/1) ⇝ 67/8 | n:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2999.898347482845 ]", - "[ 7/1 → 29/4 | n:F#5 s:sawtooth gain:0.30053347800883307 attack:0.001 decay:0.2 sustain:0 hcutoff:3696.147739319613 cutoff:4000 ]", - "[ 7/1 → 29/4 | n:A4 s:sawtooth gain:0.30053347800883307 attack:0.001 decay:0.2 sustain:0 hcutoff:3696.147739319613 cutoff:4000 ]", - "[ 55/8 ⇜ (7/1 → 43/6) ⇝ 29/4 | n:A5 s:sawtooth gain:0.30398425548024827 attack:0.001 decay:0.2 sustain:0 hcutoff:3728.7540466585065 cutoff:4000 ]", - "[ 55/8 ⇜ (43/6 → 29/4) | n:F#5 s:sawtooth gain:0.30398425548024827 attack:0.001 decay:0.2 sustain:0 hcutoff:3728.7540466585065 cutoff:4000 ]", - "[ 55/8 ⇜ (7/1 → 43/6) ⇝ 29/4 | n:C#5 s:sawtooth gain:0.30398425548024827 attack:0.001 decay:0.2 sustain:0 hcutoff:3728.7540466585065 cutoff:4000 ]", - "[ 55/8 ⇜ (43/6 → 29/4) | n:A4 s:sawtooth gain:0.30398425548024827 attack:0.001 decay:0.2 sustain:0 hcutoff:3728.7540466585065 cutoff:4000 ]", - "[ 29/4 → 15/2 | n:F#5 s:sawtooth gain:0.28644702698548963 attack:0.001 decay:0.2 sustain:0 hcutoff:3565.4423707696824 cutoff:4000 ]", - "[ 29/4 → 15/2 | n:A4 s:sawtooth gain:0.28644702698548963 attack:0.001 decay:0.2 sustain:0 hcutoff:3565.4423707696824 cutoff:4000 ]", - "[ 27/4 ⇜ (7/1 → 85/12) ⇝ 57/8 | n:C#6 s:sawtooth gain:0.3107861971007485 attack:0.001 decay:0.2 sustain:0 hcutoff:3793.8434936445938 cutoff:4000 ]", - "[ 27/4 ⇜ (85/12 → 57/8) | n:A5 s:sawtooth gain:0.3107861971007485 attack:0.001 decay:0.2 sustain:0 hcutoff:3793.8434936445938 cutoff:4000 ]", - "[ 27/4 ⇜ (7/1 → 85/12) ⇝ 57/8 | n:E5 s:sawtooth gain:0.3107861971007485 attack:0.001 decay:0.2 sustain:0 hcutoff:3793.8434936445938 cutoff:4000 ]", - "[ 27/4 ⇜ (85/12 → 57/8) | n:C#5 s:sawtooth gain:0.3107861971007485 attack:0.001 decay:0.2 sustain:0 hcutoff:3793.8434936445938 cutoff:4000 ]", - "[ (57/8 → 89/12) ⇝ 15/2 | n:A5 s:sawtooth gain:0.29000691362123476 attack:0.001 decay:0.2 sustain:0 hcutoff:3598.149539397671 cutoff:4000 ]", - "[ 57/8 ⇜ (89/12 → 15/2) | n:F#5 s:sawtooth gain:0.29000691362123476 attack:0.001 decay:0.2 sustain:0 hcutoff:3598.149539397671 cutoff:4000 ]", - "[ (57/8 → 89/12) ⇝ 15/2 | n:C#5 s:sawtooth gain:0.29000691362123476 attack:0.001 decay:0.2 sustain:0 hcutoff:3598.149539397671 cutoff:4000 ]", - "[ 57/8 ⇜ (89/12 → 15/2) | n:A4 s:sawtooth gain:0.29000691362123476 attack:0.001 decay:0.2 sustain:0 hcutoff:3598.149539397671 cutoff:4000 ]", - "[ 15/2 → 31/4 | n:F#5 s:sawtooth gain:0.2720095711683043 attack:0.001 decay:0.2 sustain:0 hcutoff:3434.557629230318 cutoff:4000 ]", - "[ 15/2 → 31/4 | n:A4 s:sawtooth gain:0.2720095711683043 attack:0.001 decay:0.2 sustain:0 hcutoff:3434.557629230318 cutoff:4000 ]", - "[ (7/1 → 22/3) ⇝ 59/8 | n:C#6 s:sawtooth gain:0.29705226105983373 attack:0.001 decay:0.2 sustain:0 hcutoff:3663.507823075358 cutoff:4000 ]", - "[ 7/1 ⇜ (22/3 → 59/8) | n:A5 s:sawtooth gain:0.29705226105983373 attack:0.001 decay:0.2 sustain:0 hcutoff:3663.507823075358 cutoff:4000 ]", - "[ (7/1 → 22/3) ⇝ 59/8 | n:E5 s:sawtooth gain:0.29705226105983373 attack:0.001 decay:0.2 sustain:0 hcutoff:3663.507823075358 cutoff:4000 ]", - "[ 7/1 ⇜ (22/3 → 59/8) | n:C#5 s:sawtooth gain:0.29705226105983373 attack:0.001 decay:0.2 sustain:0 hcutoff:3663.507823075358 cutoff:4000 ]", - "[ (59/8 → 23/3) ⇝ 31/4 | n:A5 s:sawtooth gain:0.2756442833140452 attack:0.001 decay:0.2 sustain:0 hcutoff:3467.276011071639 cutoff:4000 ]", - "[ 59/8 ⇜ (23/3 → 31/4) | n:F#5 s:sawtooth gain:0.2756442833140452 attack:0.001 decay:0.2 sustain:0 hcutoff:3467.276011071639 cutoff:4000 ]", - "[ (59/8 → 23/3) ⇝ 31/4 | n:C#5 s:sawtooth gain:0.2756442833140452 attack:0.001 decay:0.2 sustain:0 hcutoff:3467.276011071639 cutoff:4000 ]", - "[ 59/8 ⇜ (23/3 → 31/4) | n:A4 s:sawtooth gain:0.2756442833140452 attack:0.001 decay:0.2 sustain:0 hcutoff:3467.276011071639 cutoff:4000 ]", - "[ 31/4 → 8/1 | n:F#5 s:sawtooth gain:0.2573601511491127 attack:0.001 decay:0.2 sustain:0 hcutoff:3303.852260680389 cutoff:4000 ]", - "[ 31/4 → 8/1 | n:A4 s:sawtooth gain:0.2573601511491127 attack:0.001 decay:0.2 sustain:0 hcutoff:3303.852260680389 cutoff:4000 ]", - "[ (29/4 → 91/12) ⇝ 61/8 | n:C#6 s:sawtooth gain:0.28286518602353056 attack:0.001 decay:0.2 sustain:0 hcutoff:3532.7239889283615 cutoff:4000 ]", - "[ 29/4 ⇜ (91/12 → 61/8) | n:A5 s:sawtooth gain:0.28286518602353056 attack:0.001 decay:0.2 sustain:0 hcutoff:3532.7239889283615 cutoff:4000 ]", - "[ (29/4 → 91/12) ⇝ 61/8 | n:E5 s:sawtooth gain:0.28286518602353056 attack:0.001 decay:0.2 sustain:0 hcutoff:3532.7239889283615 cutoff:4000 ]", - "[ 29/4 ⇜ (91/12 → 61/8) | n:C#5 s:sawtooth gain:0.28286518602353056 attack:0.001 decay:0.2 sustain:0 hcutoff:3532.7239889283615 cutoff:4000 ]", - "[ (61/8 → 95/12) ⇝ 8/1 | n:A5 s:sawtooth gain:0.26103468453995016 attack:0.001 decay:0.2 sustain:0 hcutoff:3336.4921769246425 cutoff:4000 ]", - "[ 61/8 ⇜ (95/12 → 8/1) | n:F#5 s:sawtooth gain:0.26103468453995016 attack:0.001 decay:0.2 sustain:0 hcutoff:3336.4921769246425 cutoff:4000 ]", - "[ (61/8 → 95/12) ⇝ 8/1 | n:C#5 s:sawtooth gain:0.26103468453995016 attack:0.001 decay:0.2 sustain:0 hcutoff:3336.4921769246425 cutoff:4000 ]", - "[ 61/8 ⇜ (95/12 → 8/1) | n:A4 s:sawtooth gain:0.26103468453995016 attack:0.001 decay:0.2 sustain:0 hcutoff:3336.4921769246425 cutoff:4000 ]", - "[ (15/2 → 47/6) ⇝ 63/8 | n:C#6 s:sawtooth gain:0.2683616012798825 attack:0.001 decay:0.2 sustain:0 hcutoff:3401.8504606023293 cutoff:4000 ]", - "[ 15/2 ⇜ (47/6 → 63/8) | n:A5 s:sawtooth gain:0.2683616012798825 attack:0.001 decay:0.2 sustain:0 hcutoff:3401.8504606023293 cutoff:4000 ]", - "[ (15/2 → 47/6) ⇝ 63/8 | n:E5 s:sawtooth gain:0.2683616012798825 attack:0.001 decay:0.2 sustain:0 hcutoff:3401.8504606023293 cutoff:4000 ]", - "[ 15/2 ⇜ (47/6 → 63/8) | n:C#5 s:sawtooth gain:0.2683616012798825 attack:0.001 decay:0.2 sustain:0 hcutoff:3401.8504606023293 cutoff:4000 ]", - "[ (63/8 → 8/1) ⇝ 33/4 | n:A5 s:sawtooth gain:0.2536811842784369 attack:0.001 decay:0.2 sustain:0 hcutoff:3271.2459533414954 cutoff:4000 ]", - "[ (63/8 → 8/1) ⇝ 33/4 | n:C#5 s:sawtooth gain:0.2536811842784369 attack:0.001 decay:0.2 sustain:0 hcutoff:3271.2459533414954 cutoff:4000 ]", - "[ (31/4 → 8/1) ⇝ 65/8 | n:C#6 s:sawtooth gain:0.2573601511491127 attack:0.001 decay:0.2 sustain:0 hcutoff:3303.852260680389 cutoff:4000 ]", - "[ (31/4 → 8/1) ⇝ 65/8 | n:E5 s:sawtooth gain:0.2573601511491127 attack:0.001 decay:0.2 sustain:0 hcutoff:3303.852260680389 cutoff:4000 ]", + "[ 57/8 → 29/4 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2982.856914513109 ]", + "[ 57/8 → 29/4 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2982.856914513109 ]", + "[ 59/8 → 15/2 | note:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2991.774409503181 ]", + "[ 59/8 → 15/2 | note:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2991.774409503181 ]", + "[ 15/2 → 61/8 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2995.0220264467503 ]", + "[ 15/2 → 61/8 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2995.0220264467503 ]", + "[ 31/4 → 63/8 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2999.0852191942718 ]", + "[ 31/4 → 63/8 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2999.0852191942718 ]", + "[ 63/8 → 8/1 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2999.898347482845 ]", + "[ 63/8 → 8/1 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2999.898347482845 ]", + "[ 15/2 → 8/1 | note:G3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2998.3738658769826 ]", + "[ 15/2 → 8/1 | note:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2998.3738658769826 ]", + "[ (61/8 → 8/1) ⇝ 65/8 | note:G3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2999.0852191942718 ]", + "[ (61/8 → 8/1) ⇝ 65/8 | note:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2999.0852191942718 ]", + "[ (31/4 → 8/1) ⇝ 33/4 | note:G3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2999.5934052398757 ]", + "[ (31/4 → 8/1) ⇝ 33/4 | note:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2999.5934052398757 ]", + "[ (63/8 → 8/1) ⇝ 67/8 | note:G3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2999.898347482845 ]", + "[ (63/8 → 8/1) ⇝ 67/8 | note:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2999.898347482845 ]", + "[ 7/1 → 29/4 | note:F#5 s:sawtooth gain:0.30053347800883307 attack:0.001 decay:0.2 sustain:0 hcutoff:3696.147739319613 cutoff:4000 ]", + "[ 7/1 → 29/4 | note:A4 s:sawtooth gain:0.30053347800883307 attack:0.001 decay:0.2 sustain:0 hcutoff:3696.147739319613 cutoff:4000 ]", + "[ 55/8 ⇜ (7/1 → 43/6) ⇝ 29/4 | note:A5 s:sawtooth gain:0.30398425548024827 attack:0.001 decay:0.2 sustain:0 hcutoff:3728.7540466585065 cutoff:4000 ]", + "[ 55/8 ⇜ (43/6 → 29/4) | note:F#5 s:sawtooth gain:0.30398425548024827 attack:0.001 decay:0.2 sustain:0 hcutoff:3728.7540466585065 cutoff:4000 ]", + "[ 55/8 ⇜ (7/1 → 43/6) ⇝ 29/4 | note:C#5 s:sawtooth gain:0.30398425548024827 attack:0.001 decay:0.2 sustain:0 hcutoff:3728.7540466585065 cutoff:4000 ]", + "[ 55/8 ⇜ (43/6 → 29/4) | note:A4 s:sawtooth gain:0.30398425548024827 attack:0.001 decay:0.2 sustain:0 hcutoff:3728.7540466585065 cutoff:4000 ]", + "[ 29/4 → 15/2 | note:F#5 s:sawtooth gain:0.28644702698548963 attack:0.001 decay:0.2 sustain:0 hcutoff:3565.4423707696824 cutoff:4000 ]", + "[ 29/4 → 15/2 | note:A4 s:sawtooth gain:0.28644702698548963 attack:0.001 decay:0.2 sustain:0 hcutoff:3565.4423707696824 cutoff:4000 ]", + "[ 27/4 ⇜ (7/1 → 85/12) ⇝ 57/8 | note:C#6 s:sawtooth gain:0.3107861971007485 attack:0.001 decay:0.2 sustain:0 hcutoff:3793.8434936445938 cutoff:4000 ]", + "[ 27/4 ⇜ (85/12 → 57/8) | note:A5 s:sawtooth gain:0.3107861971007485 attack:0.001 decay:0.2 sustain:0 hcutoff:3793.8434936445938 cutoff:4000 ]", + "[ 27/4 ⇜ (7/1 → 85/12) ⇝ 57/8 | note:E5 s:sawtooth gain:0.3107861971007485 attack:0.001 decay:0.2 sustain:0 hcutoff:3793.8434936445938 cutoff:4000 ]", + "[ 27/4 ⇜ (85/12 → 57/8) | note:C#5 s:sawtooth gain:0.3107861971007485 attack:0.001 decay:0.2 sustain:0 hcutoff:3793.8434936445938 cutoff:4000 ]", + "[ (57/8 → 89/12) ⇝ 15/2 | note:A5 s:sawtooth gain:0.29000691362123476 attack:0.001 decay:0.2 sustain:0 hcutoff:3598.149539397671 cutoff:4000 ]", + "[ 57/8 ⇜ (89/12 → 15/2) | note:F#5 s:sawtooth gain:0.29000691362123476 attack:0.001 decay:0.2 sustain:0 hcutoff:3598.149539397671 cutoff:4000 ]", + "[ (57/8 → 89/12) ⇝ 15/2 | note:C#5 s:sawtooth gain:0.29000691362123476 attack:0.001 decay:0.2 sustain:0 hcutoff:3598.149539397671 cutoff:4000 ]", + "[ 57/8 ⇜ (89/12 → 15/2) | note:A4 s:sawtooth gain:0.29000691362123476 attack:0.001 decay:0.2 sustain:0 hcutoff:3598.149539397671 cutoff:4000 ]", + "[ 15/2 → 31/4 | note:F#5 s:sawtooth gain:0.2720095711683043 attack:0.001 decay:0.2 sustain:0 hcutoff:3434.557629230318 cutoff:4000 ]", + "[ 15/2 → 31/4 | note:A4 s:sawtooth gain:0.2720095711683043 attack:0.001 decay:0.2 sustain:0 hcutoff:3434.557629230318 cutoff:4000 ]", + "[ (7/1 → 22/3) ⇝ 59/8 | note:C#6 s:sawtooth gain:0.29705226105983373 attack:0.001 decay:0.2 sustain:0 hcutoff:3663.507823075358 cutoff:4000 ]", + "[ 7/1 ⇜ (22/3 → 59/8) | note:A5 s:sawtooth gain:0.29705226105983373 attack:0.001 decay:0.2 sustain:0 hcutoff:3663.507823075358 cutoff:4000 ]", + "[ (7/1 → 22/3) ⇝ 59/8 | note:E5 s:sawtooth gain:0.29705226105983373 attack:0.001 decay:0.2 sustain:0 hcutoff:3663.507823075358 cutoff:4000 ]", + "[ 7/1 ⇜ (22/3 → 59/8) | note:C#5 s:sawtooth gain:0.29705226105983373 attack:0.001 decay:0.2 sustain:0 hcutoff:3663.507823075358 cutoff:4000 ]", + "[ (59/8 → 23/3) ⇝ 31/4 | note:A5 s:sawtooth gain:0.2756442833140452 attack:0.001 decay:0.2 sustain:0 hcutoff:3467.276011071639 cutoff:4000 ]", + "[ 59/8 ⇜ (23/3 → 31/4) | note:F#5 s:sawtooth gain:0.2756442833140452 attack:0.001 decay:0.2 sustain:0 hcutoff:3467.276011071639 cutoff:4000 ]", + "[ (59/8 → 23/3) ⇝ 31/4 | note:C#5 s:sawtooth gain:0.2756442833140452 attack:0.001 decay:0.2 sustain:0 hcutoff:3467.276011071639 cutoff:4000 ]", + "[ 59/8 ⇜ (23/3 → 31/4) | note:A4 s:sawtooth gain:0.2756442833140452 attack:0.001 decay:0.2 sustain:0 hcutoff:3467.276011071639 cutoff:4000 ]", + "[ 31/4 → 8/1 | note:F#5 s:sawtooth gain:0.2573601511491127 attack:0.001 decay:0.2 sustain:0 hcutoff:3303.852260680389 cutoff:4000 ]", + "[ 31/4 → 8/1 | note:A4 s:sawtooth gain:0.2573601511491127 attack:0.001 decay:0.2 sustain:0 hcutoff:3303.852260680389 cutoff:4000 ]", + "[ (29/4 → 91/12) ⇝ 61/8 | note:C#6 s:sawtooth gain:0.28286518602353056 attack:0.001 decay:0.2 sustain:0 hcutoff:3532.7239889283615 cutoff:4000 ]", + "[ 29/4 ⇜ (91/12 → 61/8) | note:A5 s:sawtooth gain:0.28286518602353056 attack:0.001 decay:0.2 sustain:0 hcutoff:3532.7239889283615 cutoff:4000 ]", + "[ (29/4 → 91/12) ⇝ 61/8 | note:E5 s:sawtooth gain:0.28286518602353056 attack:0.001 decay:0.2 sustain:0 hcutoff:3532.7239889283615 cutoff:4000 ]", + "[ 29/4 ⇜ (91/12 → 61/8) | note:C#5 s:sawtooth gain:0.28286518602353056 attack:0.001 decay:0.2 sustain:0 hcutoff:3532.7239889283615 cutoff:4000 ]", + "[ (61/8 → 95/12) ⇝ 8/1 | note:A5 s:sawtooth gain:0.26103468453995016 attack:0.001 decay:0.2 sustain:0 hcutoff:3336.4921769246425 cutoff:4000 ]", + "[ 61/8 ⇜ (95/12 → 8/1) | note:F#5 s:sawtooth gain:0.26103468453995016 attack:0.001 decay:0.2 sustain:0 hcutoff:3336.4921769246425 cutoff:4000 ]", + "[ (61/8 → 95/12) ⇝ 8/1 | note:C#5 s:sawtooth gain:0.26103468453995016 attack:0.001 decay:0.2 sustain:0 hcutoff:3336.4921769246425 cutoff:4000 ]", + "[ 61/8 ⇜ (95/12 → 8/1) | note:A4 s:sawtooth gain:0.26103468453995016 attack:0.001 decay:0.2 sustain:0 hcutoff:3336.4921769246425 cutoff:4000 ]", + "[ (15/2 → 47/6) ⇝ 63/8 | note:C#6 s:sawtooth gain:0.2683616012798825 attack:0.001 decay:0.2 sustain:0 hcutoff:3401.8504606023293 cutoff:4000 ]", + "[ 15/2 ⇜ (47/6 → 63/8) | note:A5 s:sawtooth gain:0.2683616012798825 attack:0.001 decay:0.2 sustain:0 hcutoff:3401.8504606023293 cutoff:4000 ]", + "[ (15/2 → 47/6) ⇝ 63/8 | note:E5 s:sawtooth gain:0.2683616012798825 attack:0.001 decay:0.2 sustain:0 hcutoff:3401.8504606023293 cutoff:4000 ]", + "[ 15/2 ⇜ (47/6 → 63/8) | note:C#5 s:sawtooth gain:0.2683616012798825 attack:0.001 decay:0.2 sustain:0 hcutoff:3401.8504606023293 cutoff:4000 ]", + "[ (63/8 → 8/1) ⇝ 33/4 | note:A5 s:sawtooth gain:0.2536811842784369 attack:0.001 decay:0.2 sustain:0 hcutoff:3271.2459533414954 cutoff:4000 ]", + "[ (63/8 → 8/1) ⇝ 33/4 | note:C#5 s:sawtooth gain:0.2536811842784369 attack:0.001 decay:0.2 sustain:0 hcutoff:3271.2459533414954 cutoff:4000 ]", + "[ (31/4 → 8/1) ⇝ 65/8 | note:C#6 s:sawtooth gain:0.2573601511491127 attack:0.001 decay:0.2 sustain:0 hcutoff:3303.852260680389 cutoff:4000 ]", + "[ (31/4 → 8/1) ⇝ 65/8 | note:E5 s:sawtooth gain:0.2573601511491127 attack:0.001 decay:0.2 sustain:0 hcutoff:3303.852260680389 cutoff:4000 ]", "[ 7/1 → 29/4 | s:bd gain:0.7 ]", "[ 15/2 → 31/4 | s:bd gain:0.7 ]", "[ 63/8 → 8/1 | s:bd gain:0.7 ]", "[ 15/2 → 8/1 | s:sn gain:0.7 ]", "[ 29/4 → 15/2 | s:hh3 gain:0.7 ]", "[ 31/4 → 8/1 | s:hh3 gain:0.7 ]", - "[ 65/8 → 33/4 | n:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2999.0852191942718 ]", - "[ 65/8 → 33/4 | n:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2999.0852191942718 ]", - "[ 67/8 → 17/2 | n:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2995.0220264467503 ]", - "[ 67/8 → 17/2 | n:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2995.0220264467503 ]", - "[ 17/2 → 69/8 | n:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2991.774409503181 ]", - "[ 17/2 → 69/8 | n:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2991.774409503181 ]", - "[ 35/4 → 71/8 | n:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2982.856914513109 ]", - "[ 35/4 → 71/8 | n:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2982.856914513109 ]", - "[ 71/8 → 9/1 | n:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2977.1924080321423 ]", - "[ 71/8 → 9/1 | n:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2977.1924080321423 ]", - "[ 61/8 ⇜ (8/1 → 65/8) | n:G3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2999.898347482845 ]", - "[ 61/8 ⇜ (8/1 → 65/8) | n:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2999.898347482845 ]", - "[ 31/4 ⇜ (8/1 → 33/4) | n:G3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2999.5934052398757 ]", - "[ 31/4 ⇜ (8/1 → 33/4) | n:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2999.5934052398757 ]", - "[ 63/8 ⇜ (8/1 → 67/8) | n:G3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2999.0852191942718 ]", - "[ 63/8 ⇜ (8/1 → 67/8) | n:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2999.0852191942718 ]", - "[ (8/1 → 25/3) ⇝ 67/8 | n:C#6 s:sawtooth gain:0.2389653154600499 attack:0.001 decay:0.2 sustain:0 hcutoff:3141.2684450220513 cutoff:4000 ]", - "[ 8/1 ⇜ (25/3 → 67/8) | n:A5 s:sawtooth gain:0.2389653154600499 attack:0.001 decay:0.2 sustain:0 hcutoff:3141.2684450220513 cutoff:4000 ]", - "[ (8/1 → 25/3) ⇝ 67/8 | n:E5 s:sawtooth gain:0.2389653154600499 attack:0.001 decay:0.2 sustain:0 hcutoff:3141.2684450220513 cutoff:4000 ]", - "[ 8/1 ⇜ (25/3 → 67/8) | n:C#5 s:sawtooth gain:0.2389653154600499 attack:0.001 decay:0.2 sustain:0 hcutoff:3141.2684450220513 cutoff:4000 ]", - "[ (67/8 → 26/3) ⇝ 35/4 | n:A5 s:sawtooth gain:0.21713481397646955 attack:0.001 decay:0.2 sustain:0 hcutoff:2948.256412446248 cutoff:4000 ]", - "[ 67/8 ⇜ (26/3 → 35/4) | n:F#5 s:sawtooth gain:0.21713481397646955 attack:0.001 decay:0.2 sustain:0 hcutoff:2948.256412446248 cutoff:4000 ]", - "[ (67/8 → 26/3) ⇝ 35/4 | n:C#5 s:sawtooth gain:0.21713481397646955 attack:0.001 decay:0.2 sustain:0 hcutoff:2948.256412446248 cutoff:4000 ]", - "[ 67/8 ⇜ (26/3 → 35/4) | n:A4 s:sawtooth gain:0.21713481397646955 attack:0.001 decay:0.2 sustain:0 hcutoff:2948.256412446248 cutoff:4000 ]", - "[ 35/4 → 9/1 | n:F#5 s:sawtooth gain:0.19946652199116702 attack:0.001 decay:0.2 sustain:0 hcutoff:2789.9616382401937 cutoff:4000 ]", - "[ 35/4 → 9/1 | n:A4 s:sawtooth gain:0.19946652199116702 attack:0.001 decay:0.2 sustain:0 hcutoff:2789.9616382401937 cutoff:4000 ]", - "[ (33/4 → 103/12) ⇝ 69/8 | n:C#6 s:sawtooth gain:0.2243557166859549 attack:0.001 decay:0.2 sustain:0 hcutoff:3012.274194959679 cutoff:4000 ]", - "[ 33/4 ⇜ (103/12 → 69/8) | n:A5 s:sawtooth gain:0.2243557166859549 attack:0.001 decay:0.2 sustain:0 hcutoff:3012.274194959679 cutoff:4000 ]", - "[ (33/4 → 103/12) ⇝ 69/8 | n:E5 s:sawtooth gain:0.2243557166859549 attack:0.001 decay:0.2 sustain:0 hcutoff:3012.274194959679 cutoff:4000 ]", - "[ 33/4 ⇜ (103/12 → 69/8) | n:C#5 s:sawtooth gain:0.2243557166859549 attack:0.001 decay:0.2 sustain:0 hcutoff:3012.274194959679 cutoff:4000 ]", - "[ (69/8 → 107/12) ⇝ 9/1 | n:A5 s:sawtooth gain:0.20294773894016632 attack:0.001 decay:0.2 sustain:0 hcutoff:2821.398875337315 cutoff:4000 ]", - "[ 69/8 ⇜ (107/12 → 9/1) | n:F#5 s:sawtooth gain:0.20294773894016632 attack:0.001 decay:0.2 sustain:0 hcutoff:2821.398875337315 cutoff:4000 ]", - "[ (69/8 → 107/12) ⇝ 9/1 | n:C#5 s:sawtooth gain:0.20294773894016632 attack:0.001 decay:0.2 sustain:0 hcutoff:2821.398875337315 cutoff:4000 ]", - "[ 69/8 ⇜ (107/12 → 9/1) | n:A4 s:sawtooth gain:0.20294773894016632 attack:0.001 decay:0.2 sustain:0 hcutoff:2821.398875337315 cutoff:4000 ]", - "[ (17/2 → 53/6) ⇝ 71/8 | n:C#6 s:sawtooth gain:0.2099930863787653 attack:0.001 decay:0.2 sustain:0 hcutoff:2884.6167674275184 cutoff:4000 ]", - "[ 17/2 ⇜ (53/6 → 71/8) | n:A5 s:sawtooth gain:0.2099930863787653 attack:0.001 decay:0.2 sustain:0 hcutoff:2884.6167674275184 cutoff:4000 ]", - "[ (17/2 → 53/6) ⇝ 71/8 | n:E5 s:sawtooth gain:0.2099930863787653 attack:0.001 decay:0.2 sustain:0 hcutoff:2884.6167674275184 cutoff:4000 ]", - "[ 17/2 ⇜ (53/6 → 71/8) | n:C#5 s:sawtooth gain:0.2099930863787653 attack:0.001 decay:0.2 sustain:0 hcutoff:2884.6167674275184 cutoff:4000 ]", - "[ (71/8 → 9/1) ⇝ 37/4 | n:A5 s:sawtooth gain:0.18921380289925155 attack:0.001 decay:0.2 sustain:0 hcutoff:2696.4013367420957 cutoff:4000 ]", - "[ (71/8 → 9/1) ⇝ 37/4 | n:C#5 s:sawtooth gain:0.18921380289925155 attack:0.001 decay:0.2 sustain:0 hcutoff:2696.4013367420957 cutoff:4000 ]", - "[ (35/4 → 9/1) ⇝ 73/8 | n:C#6 s:sawtooth gain:0.1960157445197518 attack:0.001 decay:0.2 sustain:0 hcutoff:2758.6460625610725 cutoff:4000 ]", - "[ (35/4 → 9/1) ⇝ 73/8 | n:E5 s:sawtooth gain:0.1960157445197518 attack:0.001 decay:0.2 sustain:0 hcutoff:2758.6460625610725 cutoff:4000 ]", - "[ 8/1 → 33/4 | n:F#5 s:sawtooth gain:0.24263984885088735 attack:0.001 decay:0.2 sustain:0 hcutoff:3173.6845194498705 cutoff:4000 ]", - "[ 8/1 → 33/4 | n:A4 s:sawtooth gain:0.24263984885088735 attack:0.001 decay:0.2 sustain:0 hcutoff:3173.6845194498705 cutoff:4000 ]", - "[ 63/8 ⇜ (8/1 → 49/6) ⇝ 33/4 | n:A5 s:sawtooth gain:0.24263984885088735 attack:0.001 decay:0.2 sustain:0 hcutoff:3173.6845194498705 cutoff:4000 ]", - "[ 63/8 ⇜ (49/6 → 33/4) | n:F#5 s:sawtooth gain:0.24263984885088735 attack:0.001 decay:0.2 sustain:0 hcutoff:3173.6845194498705 cutoff:4000 ]", - "[ 63/8 ⇜ (8/1 → 49/6) ⇝ 33/4 | n:C#5 s:sawtooth gain:0.24263984885088735 attack:0.001 decay:0.2 sustain:0 hcutoff:3173.6845194498705 cutoff:4000 ]", - "[ 63/8 ⇜ (49/6 → 33/4) | n:A4 s:sawtooth gain:0.24263984885088735 attack:0.001 decay:0.2 sustain:0 hcutoff:3173.6845194498705 cutoff:4000 ]", - "[ 33/4 → 17/2 | n:F#5 s:sawtooth gain:0.2279904288316958 attack:0.001 decay:0.2 sustain:0 hcutoff:3044.4111862696313 cutoff:4000 ]", - "[ 33/4 → 17/2 | n:A4 s:sawtooth gain:0.2279904288316958 attack:0.001 decay:0.2 sustain:0 hcutoff:3044.4111862696313 cutoff:4000 ]", - "[ 31/4 ⇜ (8/1 → 97/12) ⇝ 65/8 | n:C#6 s:sawtooth gain:0.24631881572156322 attack:0.001 decay:0.2 sustain:0 hcutoff:3206.156506355406 cutoff:4000 ]", - "[ 31/4 ⇜ (97/12 → 65/8) | n:A5 s:sawtooth gain:0.24631881572156322 attack:0.001 decay:0.2 sustain:0 hcutoff:3206.156506355406 cutoff:4000 ]", - "[ 31/4 ⇜ (8/1 → 97/12) ⇝ 65/8 | n:E5 s:sawtooth gain:0.24631881572156322 attack:0.001 decay:0.2 sustain:0 hcutoff:3206.156506355406 cutoff:4000 ]", - "[ 31/4 ⇜ (97/12 → 65/8) | n:C#5 s:sawtooth gain:0.24631881572156322 attack:0.001 decay:0.2 sustain:0 hcutoff:3206.156506355406 cutoff:4000 ]", - "[ (65/8 → 101/12) ⇝ 17/2 | n:A5 s:sawtooth gain:0.2316383987201176 attack:0.001 decay:0.2 sustain:0 hcutoff:3076.6262403774385 cutoff:4000 ]", - "[ 65/8 ⇜ (101/12 → 17/2) | n:F#5 s:sawtooth gain:0.2316383987201176 attack:0.001 decay:0.2 sustain:0 hcutoff:3076.6262403774385 cutoff:4000 ]", - "[ (65/8 → 101/12) ⇝ 17/2 | n:C#5 s:sawtooth gain:0.2316383987201176 attack:0.001 decay:0.2 sustain:0 hcutoff:3076.6262403774385 cutoff:4000 ]", - "[ 65/8 ⇜ (101/12 → 17/2) | n:A4 s:sawtooth gain:0.2316383987201176 attack:0.001 decay:0.2 sustain:0 hcutoff:3076.6262403774385 cutoff:4000 ]", - "[ 17/2 → 35/4 | n:F#5 s:sawtooth gain:0.21355297301451046 attack:0.001 decay:0.2 sustain:0 hcutoff:2916.386590360237 cutoff:4000 ]", - "[ 17/2 → 35/4 | n:A4 s:sawtooth gain:0.21355297301451046 attack:0.001 decay:0.2 sustain:0 hcutoff:2916.386590360237 cutoff:4000 ]", + "[ 65/8 → 33/4 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2999.0852191942718 ]", + "[ 65/8 → 33/4 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2999.0852191942718 ]", + "[ 67/8 → 17/2 | note:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2995.0220264467503 ]", + "[ 67/8 → 17/2 | note:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2995.0220264467503 ]", + "[ 17/2 → 69/8 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2991.774409503181 ]", + "[ 17/2 → 69/8 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2991.774409503181 ]", + "[ 35/4 → 71/8 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2982.856914513109 ]", + "[ 35/4 → 71/8 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2982.856914513109 ]", + "[ 71/8 → 9/1 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2977.1924080321423 ]", + "[ 71/8 → 9/1 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2977.1924080321423 ]", + "[ 61/8 ⇜ (8/1 → 65/8) | note:G3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2999.898347482845 ]", + "[ 61/8 ⇜ (8/1 → 65/8) | note:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2999.898347482845 ]", + "[ 31/4 ⇜ (8/1 → 33/4) | note:G3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2999.5934052398757 ]", + "[ 31/4 ⇜ (8/1 → 33/4) | note:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2999.5934052398757 ]", + "[ 63/8 ⇜ (8/1 → 67/8) | note:G3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2999.0852191942718 ]", + "[ 63/8 ⇜ (8/1 → 67/8) | note:B3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2999.0852191942718 ]", + "[ (8/1 → 25/3) ⇝ 67/8 | note:C#6 s:sawtooth gain:0.2389653154600499 attack:0.001 decay:0.2 sustain:0 hcutoff:3141.2684450220513 cutoff:4000 ]", + "[ 8/1 ⇜ (25/3 → 67/8) | note:A5 s:sawtooth gain:0.2389653154600499 attack:0.001 decay:0.2 sustain:0 hcutoff:3141.2684450220513 cutoff:4000 ]", + "[ (8/1 → 25/3) ⇝ 67/8 | note:E5 s:sawtooth gain:0.2389653154600499 attack:0.001 decay:0.2 sustain:0 hcutoff:3141.2684450220513 cutoff:4000 ]", + "[ 8/1 ⇜ (25/3 → 67/8) | note:C#5 s:sawtooth gain:0.2389653154600499 attack:0.001 decay:0.2 sustain:0 hcutoff:3141.2684450220513 cutoff:4000 ]", + "[ (67/8 → 26/3) ⇝ 35/4 | note:A5 s:sawtooth gain:0.21713481397646955 attack:0.001 decay:0.2 sustain:0 hcutoff:2948.256412446248 cutoff:4000 ]", + "[ 67/8 ⇜ (26/3 → 35/4) | note:F#5 s:sawtooth gain:0.21713481397646955 attack:0.001 decay:0.2 sustain:0 hcutoff:2948.256412446248 cutoff:4000 ]", + "[ (67/8 → 26/3) ⇝ 35/4 | note:C#5 s:sawtooth gain:0.21713481397646955 attack:0.001 decay:0.2 sustain:0 hcutoff:2948.256412446248 cutoff:4000 ]", + "[ 67/8 ⇜ (26/3 → 35/4) | note:A4 s:sawtooth gain:0.21713481397646955 attack:0.001 decay:0.2 sustain:0 hcutoff:2948.256412446248 cutoff:4000 ]", + "[ 35/4 → 9/1 | note:F#5 s:sawtooth gain:0.19946652199116702 attack:0.001 decay:0.2 sustain:0 hcutoff:2789.9616382401937 cutoff:4000 ]", + "[ 35/4 → 9/1 | note:A4 s:sawtooth gain:0.19946652199116702 attack:0.001 decay:0.2 sustain:0 hcutoff:2789.9616382401937 cutoff:4000 ]", + "[ (33/4 → 103/12) ⇝ 69/8 | note:C#6 s:sawtooth gain:0.2243557166859549 attack:0.001 decay:0.2 sustain:0 hcutoff:3012.274194959679 cutoff:4000 ]", + "[ 33/4 ⇜ (103/12 → 69/8) | note:A5 s:sawtooth gain:0.2243557166859549 attack:0.001 decay:0.2 sustain:0 hcutoff:3012.274194959679 cutoff:4000 ]", + "[ (33/4 → 103/12) ⇝ 69/8 | note:E5 s:sawtooth gain:0.2243557166859549 attack:0.001 decay:0.2 sustain:0 hcutoff:3012.274194959679 cutoff:4000 ]", + "[ 33/4 ⇜ (103/12 → 69/8) | note:C#5 s:sawtooth gain:0.2243557166859549 attack:0.001 decay:0.2 sustain:0 hcutoff:3012.274194959679 cutoff:4000 ]", + "[ (69/8 → 107/12) ⇝ 9/1 | note:A5 s:sawtooth gain:0.20294773894016632 attack:0.001 decay:0.2 sustain:0 hcutoff:2821.398875337315 cutoff:4000 ]", + "[ 69/8 ⇜ (107/12 → 9/1) | note:F#5 s:sawtooth gain:0.20294773894016632 attack:0.001 decay:0.2 sustain:0 hcutoff:2821.398875337315 cutoff:4000 ]", + "[ (69/8 → 107/12) ⇝ 9/1 | note:C#5 s:sawtooth gain:0.20294773894016632 attack:0.001 decay:0.2 sustain:0 hcutoff:2821.398875337315 cutoff:4000 ]", + "[ 69/8 ⇜ (107/12 → 9/1) | note:A4 s:sawtooth gain:0.20294773894016632 attack:0.001 decay:0.2 sustain:0 hcutoff:2821.398875337315 cutoff:4000 ]", + "[ (17/2 → 53/6) ⇝ 71/8 | note:C#6 s:sawtooth gain:0.2099930863787653 attack:0.001 decay:0.2 sustain:0 hcutoff:2884.6167674275184 cutoff:4000 ]", + "[ 17/2 ⇜ (53/6 → 71/8) | note:A5 s:sawtooth gain:0.2099930863787653 attack:0.001 decay:0.2 sustain:0 hcutoff:2884.6167674275184 cutoff:4000 ]", + "[ (17/2 → 53/6) ⇝ 71/8 | note:E5 s:sawtooth gain:0.2099930863787653 attack:0.001 decay:0.2 sustain:0 hcutoff:2884.6167674275184 cutoff:4000 ]", + "[ 17/2 ⇜ (53/6 → 71/8) | note:C#5 s:sawtooth gain:0.2099930863787653 attack:0.001 decay:0.2 sustain:0 hcutoff:2884.6167674275184 cutoff:4000 ]", + "[ (71/8 → 9/1) ⇝ 37/4 | note:A5 s:sawtooth gain:0.18921380289925155 attack:0.001 decay:0.2 sustain:0 hcutoff:2696.4013367420957 cutoff:4000 ]", + "[ (71/8 → 9/1) ⇝ 37/4 | note:C#5 s:sawtooth gain:0.18921380289925155 attack:0.001 decay:0.2 sustain:0 hcutoff:2696.4013367420957 cutoff:4000 ]", + "[ (35/4 → 9/1) ⇝ 73/8 | note:C#6 s:sawtooth gain:0.1960157445197518 attack:0.001 decay:0.2 sustain:0 hcutoff:2758.6460625610725 cutoff:4000 ]", + "[ (35/4 → 9/1) ⇝ 73/8 | note:E5 s:sawtooth gain:0.1960157445197518 attack:0.001 decay:0.2 sustain:0 hcutoff:2758.6460625610725 cutoff:4000 ]", + "[ 8/1 → 33/4 | note:F#5 s:sawtooth gain:0.24263984885088735 attack:0.001 decay:0.2 sustain:0 hcutoff:3173.6845194498705 cutoff:4000 ]", + "[ 8/1 → 33/4 | note:A4 s:sawtooth gain:0.24263984885088735 attack:0.001 decay:0.2 sustain:0 hcutoff:3173.6845194498705 cutoff:4000 ]", + "[ 63/8 ⇜ (8/1 → 49/6) ⇝ 33/4 | note:A5 s:sawtooth gain:0.24263984885088735 attack:0.001 decay:0.2 sustain:0 hcutoff:3173.6845194498705 cutoff:4000 ]", + "[ 63/8 ⇜ (49/6 → 33/4) | note:F#5 s:sawtooth gain:0.24263984885088735 attack:0.001 decay:0.2 sustain:0 hcutoff:3173.6845194498705 cutoff:4000 ]", + "[ 63/8 ⇜ (8/1 → 49/6) ⇝ 33/4 | note:C#5 s:sawtooth gain:0.24263984885088735 attack:0.001 decay:0.2 sustain:0 hcutoff:3173.6845194498705 cutoff:4000 ]", + "[ 63/8 ⇜ (49/6 → 33/4) | note:A4 s:sawtooth gain:0.24263984885088735 attack:0.001 decay:0.2 sustain:0 hcutoff:3173.6845194498705 cutoff:4000 ]", + "[ 33/4 → 17/2 | note:F#5 s:sawtooth gain:0.2279904288316958 attack:0.001 decay:0.2 sustain:0 hcutoff:3044.4111862696313 cutoff:4000 ]", + "[ 33/4 → 17/2 | note:A4 s:sawtooth gain:0.2279904288316958 attack:0.001 decay:0.2 sustain:0 hcutoff:3044.4111862696313 cutoff:4000 ]", + "[ 31/4 ⇜ (8/1 → 97/12) ⇝ 65/8 | note:C#6 s:sawtooth gain:0.24631881572156322 attack:0.001 decay:0.2 sustain:0 hcutoff:3206.156506355406 cutoff:4000 ]", + "[ 31/4 ⇜ (97/12 → 65/8) | note:A5 s:sawtooth gain:0.24631881572156322 attack:0.001 decay:0.2 sustain:0 hcutoff:3206.156506355406 cutoff:4000 ]", + "[ 31/4 ⇜ (8/1 → 97/12) ⇝ 65/8 | note:E5 s:sawtooth gain:0.24631881572156322 attack:0.001 decay:0.2 sustain:0 hcutoff:3206.156506355406 cutoff:4000 ]", + "[ 31/4 ⇜ (97/12 → 65/8) | note:C#5 s:sawtooth gain:0.24631881572156322 attack:0.001 decay:0.2 sustain:0 hcutoff:3206.156506355406 cutoff:4000 ]", + "[ (65/8 → 101/12) ⇝ 17/2 | note:A5 s:sawtooth gain:0.2316383987201176 attack:0.001 decay:0.2 sustain:0 hcutoff:3076.6262403774385 cutoff:4000 ]", + "[ 65/8 ⇜ (101/12 → 17/2) | note:F#5 s:sawtooth gain:0.2316383987201176 attack:0.001 decay:0.2 sustain:0 hcutoff:3076.6262403774385 cutoff:4000 ]", + "[ (65/8 → 101/12) ⇝ 17/2 | note:C#5 s:sawtooth gain:0.2316383987201176 attack:0.001 decay:0.2 sustain:0 hcutoff:3076.6262403774385 cutoff:4000 ]", + "[ 65/8 ⇜ (101/12 → 17/2) | note:A4 s:sawtooth gain:0.2316383987201176 attack:0.001 decay:0.2 sustain:0 hcutoff:3076.6262403774385 cutoff:4000 ]", + "[ 17/2 → 35/4 | note:F#5 s:sawtooth gain:0.21355297301451046 attack:0.001 decay:0.2 sustain:0 hcutoff:2916.386590360237 cutoff:4000 ]", + "[ 17/2 → 35/4 | note:A4 s:sawtooth gain:0.21355297301451046 attack:0.001 decay:0.2 sustain:0 hcutoff:2916.386590360237 cutoff:4000 ]", "[ 8/1 → 33/4 | s:bd gain:0.7 ]", "[ 17/2 → 35/4 | s:bd gain:0.7 ]", "[ 17/2 → 9/1 | s:sn gain:0.7 ]", "[ 33/4 → 17/2 | s:hh3 gain:0.7 ]", "[ 35/4 → 9/1 | s:hh3 gain:0.7 ]", - "[ 73/8 → 37/4 | n:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2963.4689354775064 ]", - "[ 73/8 → 37/4 | n:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2963.4689354775064 ]", - "[ 75/8 → 19/2 | n:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2946.5812012110136 ]", - "[ 75/8 → 19/2 | n:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2946.5812012110136 ]", - "[ 19/2 → 77/8 | n:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2936.9631544781614 ]", - "[ 19/2 → 77/8 | n:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2936.9631544781614 ]", - "[ 39/4 → 79/8 | n:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2915.4076660819765 ]", - "[ 39/4 → 79/8 | n:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2915.4076660819765 ]", - "[ 79/8 → 10/1 | n:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2903.483208638841 ]", - "[ 79/8 → 10/1 | n:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2903.483208638841 ]", - "[ 19/2 → 10/1 | n:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2921.0844879970778 ]", - "[ 19/2 → 10/1 | n:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2921.0844879970778 ]", - "[ (77/8 → 10/1) ⇝ 81/8 | n:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2915.4076660819765 ]", - "[ (77/8 → 10/1) ⇝ 81/8 | n:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2915.4076660819765 ]", - "[ (39/4 → 10/1) ⇝ 41/4 | n:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2909.5402784268977 ]", - "[ (39/4 → 10/1) ⇝ 41/4 | n:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2909.5402784268977 ]", - "[ (79/8 → 10/1) ⇝ 83/8 | n:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2903.483208638841 ]", - "[ (79/8 → 10/1) ⇝ 83/8 | n:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2903.483208638841 ]", - "[ 9/1 → 37/4 | n:F#5 s:sawtooth gain:0.18586673598545772 attack:0.001 decay:0.2 sustain:0 hcutoff:2665.4828519155726 cutoff:4000 ]", - "[ 9/1 → 37/4 | n:A4 s:sawtooth gain:0.18586673598545772 attack:0.001 decay:0.2 sustain:0 hcutoff:2665.4828519155726 cutoff:4000 ]", - "[ 71/8 ⇜ (9/1 → 55/6) ⇝ 37/4 | n:A5 s:sawtooth gain:0.18921380289925155 attack:0.001 decay:0.2 sustain:0 hcutoff:2696.4013367420957 cutoff:4000 ]", - "[ 71/8 ⇜ (55/6 → 37/4) | n:F#5 s:sawtooth gain:0.18921380289925155 attack:0.001 decay:0.2 sustain:0 hcutoff:2696.4013367420957 cutoff:4000 ]", - "[ 71/8 ⇜ (9/1 → 55/6) ⇝ 37/4 | n:C#5 s:sawtooth gain:0.18921380289925155 attack:0.001 decay:0.2 sustain:0 hcutoff:2696.4013367420957 cutoff:4000 ]", - "[ 71/8 ⇜ (55/6 → 37/4) | n:A4 s:sawtooth gain:0.18921380289925155 attack:0.001 decay:0.2 sustain:0 hcutoff:2696.4013367420957 cutoff:4000 ]", - "[ 37/4 → 19/2 | n:F#5 s:sawtooth gain:0.17288458837101678 attack:0.001 decay:0.2 sustain:0 hcutoff:2543.291419087276 cutoff:4000 ]", - "[ 37/4 → 19/2 | n:A4 s:sawtooth gain:0.17288458837101678 attack:0.001 decay:0.2 sustain:0 hcutoff:2543.291419087276 cutoff:4000 ]", - "[ 35/4 ⇜ (9/1 → 109/12) ⇝ 73/8 | n:C#6 s:sawtooth gain:0.1960157445197518 attack:0.001 decay:0.2 sustain:0 hcutoff:2758.6460625610725 cutoff:4000 ]", - "[ 35/4 ⇜ (109/12 → 73/8) | n:A5 s:sawtooth gain:0.1960157445197518 attack:0.001 decay:0.2 sustain:0 hcutoff:2758.6460625610725 cutoff:4000 ]", - "[ 35/4 ⇜ (9/1 → 109/12) ⇝ 73/8 | n:E5 s:sawtooth gain:0.1960157445197518 attack:0.001 decay:0.2 sustain:0 hcutoff:2758.6460625610725 cutoff:4000 ]", - "[ 35/4 ⇜ (109/12 → 73/8) | n:C#5 s:sawtooth gain:0.1960157445197518 attack:0.001 decay:0.2 sustain:0 hcutoff:2758.6460625610725 cutoff:4000 ]", - "[ (73/8 → 113/12) ⇝ 19/2 | n:A5 s:sawtooth gain:0.17606527116553244 attack:0.001 decay:0.2 sustain:0 hcutoff:2573.60640622541 cutoff:4000 ]", - "[ 73/8 ⇜ (113/12 → 19/2) | n:F#5 s:sawtooth gain:0.17606527116553244 attack:0.001 decay:0.2 sustain:0 hcutoff:2573.60640622541 cutoff:4000 ]", - "[ (73/8 → 113/12) ⇝ 19/2 | n:C#5 s:sawtooth gain:0.17606527116553244 attack:0.001 decay:0.2 sustain:0 hcutoff:2573.60640622541 cutoff:4000 ]", - "[ 73/8 ⇜ (113/12 → 19/2) | n:A4 s:sawtooth gain:0.17606527116553244 attack:0.001 decay:0.2 sustain:0 hcutoff:2573.60640622541 cutoff:4000 ]", - "[ 19/2 → 39/4 | n:F#5 s:sawtooth gain:0.16064510432613502 attack:0.001 decay:0.2 sustain:0 hcutoff:2423.7222579792624 cutoff:4000 ]", - "[ 19/2 → 39/4 | n:A4 s:sawtooth gain:0.16064510432613502 attack:0.001 decay:0.2 sustain:0 hcutoff:2423.7222579792624 cutoff:4000 ]", - "[ (9/1 → 28/3) ⇝ 75/8 | n:C#6 s:sawtooth gain:0.182558300551809 attack:0.001 decay:0.2 sustain:0 hcutoff:2634.707357306267 cutoff:4000 ]", - "[ 9/1 ⇜ (28/3 → 75/8) | n:A5 s:sawtooth gain:0.182558300551809 attack:0.001 decay:0.2 sustain:0 hcutoff:2634.707357306267 cutoff:4000 ]", - "[ (9/1 → 28/3) ⇝ 75/8 | n:E5 s:sawtooth gain:0.182558300551809 attack:0.001 decay:0.2 sustain:0 hcutoff:2634.707357306267 cutoff:4000 ]", - "[ 9/1 ⇜ (28/3 → 75/8) | n:C#5 s:sawtooth gain:0.182558300551809 attack:0.001 decay:0.2 sustain:0 hcutoff:2634.707357306267 cutoff:4000 ]", - "[ (75/8 → 29/3) ⇝ 39/4 | n:A5 s:sawtooth gain:0.16362877128732323 attack:0.001 decay:0.2 sustain:0 hcutoff:2453.350656156431 cutoff:4000 ]", - "[ 75/8 ⇜ (29/3 → 39/4) | n:F#5 s:sawtooth gain:0.16362877128732323 attack:0.001 decay:0.2 sustain:0 hcutoff:2453.350656156431 cutoff:4000 ]", - "[ (75/8 → 29/3) ⇝ 39/4 | n:C#5 s:sawtooth gain:0.16362877128732323 attack:0.001 decay:0.2 sustain:0 hcutoff:2453.350656156431 cutoff:4000 ]", - "[ 75/8 ⇜ (29/3 → 39/4) | n:A4 s:sawtooth gain:0.16362877128732323 attack:0.001 decay:0.2 sustain:0 hcutoff:2453.350656156431 cutoff:4000 ]", - "[ 39/4 → 10/1 | n:F#5 s:sawtooth gain:0.14926615677294724 attack:0.001 decay:0.2 sustain:0 hcutoff:2307.1030993509794 cutoff:4000 ]", - "[ 39/4 → 10/1 | n:A4 s:sawtooth gain:0.14926615677294724 attack:0.001 decay:0.2 sustain:0 hcutoff:2307.1030993509794 cutoff:4000 ]", - "[ (37/4 → 115/12) ⇝ 77/8 | n:C#6 s:sawtooth gain:0.16975035701693547 attack:0.001 decay:0.2 sustain:0 hcutoff:2513.140359039332 cutoff:4000 ]", - "[ 37/4 ⇜ (115/12 → 77/8) | n:A5 s:sawtooth gain:0.16975035701693547 attack:0.001 decay:0.2 sustain:0 hcutoff:2513.140359039332 cutoff:4000 ]", - "[ (37/4 → 115/12) ⇝ 77/8 | n:E5 s:sawtooth gain:0.16975035701693547 attack:0.001 decay:0.2 sustain:0 hcutoff:2513.140359039332 cutoff:4000 ]", - "[ 37/4 ⇜ (115/12 → 77/8) | n:C#5 s:sawtooth gain:0.16975035701693547 attack:0.001 decay:0.2 sustain:0 hcutoff:2513.140359039332 cutoff:4000 ]", - "[ (77/8 → 119/12) ⇝ 10/1 | n:A5 s:sawtooth gain:0.15202407355693354 attack:0.001 decay:0.2 sustain:0 hcutoff:2335.9636991872226 cutoff:4000 ]", - "[ 77/8 ⇜ (119/12 → 10/1) | n:F#5 s:sawtooth gain:0.15202407355693354 attack:0.001 decay:0.2 sustain:0 hcutoff:2335.9636991872226 cutoff:4000 ]", - "[ (77/8 → 119/12) ⇝ 10/1 | n:C#5 s:sawtooth gain:0.15202407355693354 attack:0.001 decay:0.2 sustain:0 hcutoff:2335.9636991872226 cutoff:4000 ]", - "[ 77/8 ⇜ (119/12 → 10/1) | n:A4 s:sawtooth gain:0.15202407355693354 attack:0.001 decay:0.2 sustain:0 hcutoff:2335.9636991872226 cutoff:4000 ]", - "[ (19/2 → 59/6) ⇝ 79/8 | n:C#6 s:sawtooth gain:0.157715261412906 attack:0.001 decay:0.2 sustain:0 hcutoff:2394.2782744524975 cutoff:4000 ]", - "[ 19/2 ⇜ (59/6 → 79/8) | n:A5 s:sawtooth gain:0.157715261412906 attack:0.001 decay:0.2 sustain:0 hcutoff:2394.2782744524975 cutoff:4000 ]", - "[ (19/2 → 59/6) ⇝ 79/8 | n:E5 s:sawtooth gain:0.157715261412906 attack:0.001 decay:0.2 sustain:0 hcutoff:2394.2782744524975 cutoff:4000 ]", - "[ 19/2 ⇜ (59/6 → 79/8) | n:C#5 s:sawtooth gain:0.157715261412906 attack:0.001 decay:0.2 sustain:0 hcutoff:2394.2782744524975 cutoff:4000 ]", - "[ (79/8 → 10/1) ⇝ 41/4 | n:A5 s:sawtooth gain:0.14656891828944 attack:0.001 decay:0.2 sustain:0 hcutoff:2278.446896257612 cutoff:4000 ]", - "[ (79/8 → 10/1) ⇝ 41/4 | n:C#5 s:sawtooth gain:0.14656891828944 attack:0.001 decay:0.2 sustain:0 hcutoff:2278.446896257612 cutoff:4000 ]", - "[ (39/4 → 10/1) ⇝ 81/8 | n:C#6 s:sawtooth gain:0.14926615677294724 attack:0.001 decay:0.2 sustain:0 hcutoff:2307.1030993509794 cutoff:4000 ]", - "[ (39/4 → 10/1) ⇝ 81/8 | n:E5 s:sawtooth gain:0.14926615677294724 attack:0.001 decay:0.2 sustain:0 hcutoff:2307.1030993509794 cutoff:4000 ]", + "[ 73/8 → 37/4 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2963.4689354775064 ]", + "[ 73/8 → 37/4 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2963.4689354775064 ]", + "[ 75/8 → 19/2 | note:D2 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2946.5812012110136 ]", + "[ 75/8 → 19/2 | note:D2 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2946.5812012110136 ]", + "[ 19/2 → 77/8 | note:D1 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2936.9631544781614 ]", + "[ 19/2 → 77/8 | note:D1 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2936.9631544781614 ]", + "[ 39/4 → 79/8 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2915.4076660819765 ]", + "[ 39/4 → 79/8 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2915.4076660819765 ]", + "[ 79/8 → 10/1 | note:D3 s:sawtooth gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2903.483208638841 ]", + "[ 79/8 → 10/1 | note:D3 s:square gain:0.3 attack:0.01 decay:0.1 sustain:0.5 cutoff:2903.483208638841 ]", + "[ 19/2 → 10/1 | note:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2921.0844879970778 ]", + "[ 19/2 → 10/1 | note:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2921.0844879970778 ]", + "[ (77/8 → 10/1) ⇝ 81/8 | note:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2915.4076660819765 ]", + "[ (77/8 → 10/1) ⇝ 81/8 | note:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2915.4076660819765 ]", + "[ (39/4 → 10/1) ⇝ 41/4 | note:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2909.5402784268977 ]", + "[ (39/4 → 10/1) ⇝ 41/4 | note:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2909.5402784268977 ]", + "[ (79/8 → 10/1) ⇝ 83/8 | note:F#3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2903.483208638841 ]", + "[ (79/8 → 10/1) ⇝ 83/8 | note:A3 s:square gain:0.7 attack:0.01 decay:0.1 sustain:0 cutoff:2903.483208638841 ]", + "[ 9/1 → 37/4 | note:F#5 s:sawtooth gain:0.18586673598545772 attack:0.001 decay:0.2 sustain:0 hcutoff:2665.4828519155726 cutoff:4000 ]", + "[ 9/1 → 37/4 | note:A4 s:sawtooth gain:0.18586673598545772 attack:0.001 decay:0.2 sustain:0 hcutoff:2665.4828519155726 cutoff:4000 ]", + "[ 71/8 ⇜ (9/1 → 55/6) ⇝ 37/4 | note:A5 s:sawtooth gain:0.18921380289925155 attack:0.001 decay:0.2 sustain:0 hcutoff:2696.4013367420957 cutoff:4000 ]", + "[ 71/8 ⇜ (55/6 → 37/4) | note:F#5 s:sawtooth gain:0.18921380289925155 attack:0.001 decay:0.2 sustain:0 hcutoff:2696.4013367420957 cutoff:4000 ]", + "[ 71/8 ⇜ (9/1 → 55/6) ⇝ 37/4 | note:C#5 s:sawtooth gain:0.18921380289925155 attack:0.001 decay:0.2 sustain:0 hcutoff:2696.4013367420957 cutoff:4000 ]", + "[ 71/8 ⇜ (55/6 → 37/4) | note:A4 s:sawtooth gain:0.18921380289925155 attack:0.001 decay:0.2 sustain:0 hcutoff:2696.4013367420957 cutoff:4000 ]", + "[ 37/4 → 19/2 | note:F#5 s:sawtooth gain:0.17288458837101678 attack:0.001 decay:0.2 sustain:0 hcutoff:2543.291419087276 cutoff:4000 ]", + "[ 37/4 → 19/2 | note:A4 s:sawtooth gain:0.17288458837101678 attack:0.001 decay:0.2 sustain:0 hcutoff:2543.291419087276 cutoff:4000 ]", + "[ 35/4 ⇜ (9/1 → 109/12) ⇝ 73/8 | note:C#6 s:sawtooth gain:0.1960157445197518 attack:0.001 decay:0.2 sustain:0 hcutoff:2758.6460625610725 cutoff:4000 ]", + "[ 35/4 ⇜ (109/12 → 73/8) | note:A5 s:sawtooth gain:0.1960157445197518 attack:0.001 decay:0.2 sustain:0 hcutoff:2758.6460625610725 cutoff:4000 ]", + "[ 35/4 ⇜ (9/1 → 109/12) ⇝ 73/8 | note:E5 s:sawtooth gain:0.1960157445197518 attack:0.001 decay:0.2 sustain:0 hcutoff:2758.6460625610725 cutoff:4000 ]", + "[ 35/4 ⇜ (109/12 → 73/8) | note:C#5 s:sawtooth gain:0.1960157445197518 attack:0.001 decay:0.2 sustain:0 hcutoff:2758.6460625610725 cutoff:4000 ]", + "[ (73/8 → 113/12) ⇝ 19/2 | note:A5 s:sawtooth gain:0.17606527116553244 attack:0.001 decay:0.2 sustain:0 hcutoff:2573.60640622541 cutoff:4000 ]", + "[ 73/8 ⇜ (113/12 → 19/2) | note:F#5 s:sawtooth gain:0.17606527116553244 attack:0.001 decay:0.2 sustain:0 hcutoff:2573.60640622541 cutoff:4000 ]", + "[ (73/8 → 113/12) ⇝ 19/2 | note:C#5 s:sawtooth gain:0.17606527116553244 attack:0.001 decay:0.2 sustain:0 hcutoff:2573.60640622541 cutoff:4000 ]", + "[ 73/8 ⇜ (113/12 → 19/2) | note:A4 s:sawtooth gain:0.17606527116553244 attack:0.001 decay:0.2 sustain:0 hcutoff:2573.60640622541 cutoff:4000 ]", + "[ 19/2 → 39/4 | note:F#5 s:sawtooth gain:0.16064510432613502 attack:0.001 decay:0.2 sustain:0 hcutoff:2423.7222579792624 cutoff:4000 ]", + "[ 19/2 → 39/4 | note:A4 s:sawtooth gain:0.16064510432613502 attack:0.001 decay:0.2 sustain:0 hcutoff:2423.7222579792624 cutoff:4000 ]", + "[ (9/1 → 28/3) ⇝ 75/8 | note:C#6 s:sawtooth gain:0.182558300551809 attack:0.001 decay:0.2 sustain:0 hcutoff:2634.707357306267 cutoff:4000 ]", + "[ 9/1 ⇜ (28/3 → 75/8) | note:A5 s:sawtooth gain:0.182558300551809 attack:0.001 decay:0.2 sustain:0 hcutoff:2634.707357306267 cutoff:4000 ]", + "[ (9/1 → 28/3) ⇝ 75/8 | note:E5 s:sawtooth gain:0.182558300551809 attack:0.001 decay:0.2 sustain:0 hcutoff:2634.707357306267 cutoff:4000 ]", + "[ 9/1 ⇜ (28/3 → 75/8) | note:C#5 s:sawtooth gain:0.182558300551809 attack:0.001 decay:0.2 sustain:0 hcutoff:2634.707357306267 cutoff:4000 ]", + "[ (75/8 → 29/3) ⇝ 39/4 | note:A5 s:sawtooth gain:0.16362877128732323 attack:0.001 decay:0.2 sustain:0 hcutoff:2453.350656156431 cutoff:4000 ]", + "[ 75/8 ⇜ (29/3 → 39/4) | note:F#5 s:sawtooth gain:0.16362877128732323 attack:0.001 decay:0.2 sustain:0 hcutoff:2453.350656156431 cutoff:4000 ]", + "[ (75/8 → 29/3) ⇝ 39/4 | note:C#5 s:sawtooth gain:0.16362877128732323 attack:0.001 decay:0.2 sustain:0 hcutoff:2453.350656156431 cutoff:4000 ]", + "[ 75/8 ⇜ (29/3 → 39/4) | note:A4 s:sawtooth gain:0.16362877128732323 attack:0.001 decay:0.2 sustain:0 hcutoff:2453.350656156431 cutoff:4000 ]", + "[ 39/4 → 10/1 | note:F#5 s:sawtooth gain:0.14926615677294724 attack:0.001 decay:0.2 sustain:0 hcutoff:2307.1030993509794 cutoff:4000 ]", + "[ 39/4 → 10/1 | note:A4 s:sawtooth gain:0.14926615677294724 attack:0.001 decay:0.2 sustain:0 hcutoff:2307.1030993509794 cutoff:4000 ]", + "[ (37/4 → 115/12) ⇝ 77/8 | note:C#6 s:sawtooth gain:0.16975035701693547 attack:0.001 decay:0.2 sustain:0 hcutoff:2513.140359039332 cutoff:4000 ]", + "[ 37/4 ⇜ (115/12 → 77/8) | note:A5 s:sawtooth gain:0.16975035701693547 attack:0.001 decay:0.2 sustain:0 hcutoff:2513.140359039332 cutoff:4000 ]", + "[ (37/4 → 115/12) ⇝ 77/8 | note:E5 s:sawtooth gain:0.16975035701693547 attack:0.001 decay:0.2 sustain:0 hcutoff:2513.140359039332 cutoff:4000 ]", + "[ 37/4 ⇜ (115/12 → 77/8) | note:C#5 s:sawtooth gain:0.16975035701693547 attack:0.001 decay:0.2 sustain:0 hcutoff:2513.140359039332 cutoff:4000 ]", + "[ (77/8 → 119/12) ⇝ 10/1 | note:A5 s:sawtooth gain:0.15202407355693354 attack:0.001 decay:0.2 sustain:0 hcutoff:2335.9636991872226 cutoff:4000 ]", + "[ 77/8 ⇜ (119/12 → 10/1) | note:F#5 s:sawtooth gain:0.15202407355693354 attack:0.001 decay:0.2 sustain:0 hcutoff:2335.9636991872226 cutoff:4000 ]", + "[ (77/8 → 119/12) ⇝ 10/1 | note:C#5 s:sawtooth gain:0.15202407355693354 attack:0.001 decay:0.2 sustain:0 hcutoff:2335.9636991872226 cutoff:4000 ]", + "[ 77/8 ⇜ (119/12 → 10/1) | note:A4 s:sawtooth gain:0.15202407355693354 attack:0.001 decay:0.2 sustain:0 hcutoff:2335.9636991872226 cutoff:4000 ]", + "[ (19/2 → 59/6) ⇝ 79/8 | note:C#6 s:sawtooth gain:0.157715261412906 attack:0.001 decay:0.2 sustain:0 hcutoff:2394.2782744524975 cutoff:4000 ]", + "[ 19/2 ⇜ (59/6 → 79/8) | note:A5 s:sawtooth gain:0.157715261412906 attack:0.001 decay:0.2 sustain:0 hcutoff:2394.2782744524975 cutoff:4000 ]", + "[ (19/2 → 59/6) ⇝ 79/8 | note:E5 s:sawtooth gain:0.157715261412906 attack:0.001 decay:0.2 sustain:0 hcutoff:2394.2782744524975 cutoff:4000 ]", + "[ 19/2 ⇜ (59/6 → 79/8) | note:C#5 s:sawtooth gain:0.157715261412906 attack:0.001 decay:0.2 sustain:0 hcutoff:2394.2782744524975 cutoff:4000 ]", + "[ (79/8 → 10/1) ⇝ 41/4 | note:A5 s:sawtooth gain:0.14656891828944 attack:0.001 decay:0.2 sustain:0 hcutoff:2278.446896257612 cutoff:4000 ]", + "[ (79/8 → 10/1) ⇝ 41/4 | note:C#5 s:sawtooth gain:0.14656891828944 attack:0.001 decay:0.2 sustain:0 hcutoff:2278.446896257612 cutoff:4000 ]", + "[ (39/4 → 10/1) ⇝ 81/8 | note:C#6 s:sawtooth gain:0.14926615677294724 attack:0.001 decay:0.2 sustain:0 hcutoff:2307.1030993509794 cutoff:4000 ]", + "[ (39/4 → 10/1) ⇝ 81/8 | note:E5 s:sawtooth gain:0.14926615677294724 attack:0.001 decay:0.2 sustain:0 hcutoff:2307.1030993509794 cutoff:4000 ]", "[ 9/1 → 37/4 | s:bd gain:0.7 ]", "[ 19/2 → 39/4 | s:bd gain:0.7 ]", "[ 19/2 → 10/1 | s:sn gain:0.7 ]", @@ -8131,54 +8131,54 @@ exports[`renders tunes > tune: meltingsubmarine 1`] = ` "[ (3/4 → 1/1) ⇝ 3/2 | s:sd:1 speed:0.7931522866332671 ]", "[ 3/8 → 3/4 | s:hh27 speed:0.7285963821098448 ]", "[ (3/4 → 1/1) ⇝ 9/8 | s:hh27 speed:0.77531205091027 ]", - "[ (0/1 → 1/1) ⇝ 3/2 | n:33.129885541275144 decay:0.15 sustain:0 s:sawtooth gain:0.4 cutoff:3669.6267869262615 ]", - "[ (0/1 → 1/1) ⇝ 3/2 | n:33.17988554127514 decay:0.15 sustain:0 s:sawtooth gain:0.4 cutoff:3669.6267869262615 ]", - "[ (0/1 → 1/1) ⇝ 3/2 | n:55.129885541275144 s:sawtooth gain:0.16 cutoff:500 attack:1 ]", - "[ (0/1 → 1/1) ⇝ 3/2 | n:59.129885541275144 s:sawtooth gain:0.16 cutoff:500 attack:1 ]", - "[ (0/1 → 1/1) ⇝ 3/2 | n:60.129885541275144 s:sawtooth gain:0.16 cutoff:500 attack:1 ]", - "[ (0/1 → 1/1) ⇝ 3/2 | n:64.12988554127514 s:sawtooth gain:0.16 cutoff:500 attack:1 ]", - "[ (0/1 → 1/1) ⇝ 3/2 | n:55.16988554127514 s:sawtooth gain:0.16 cutoff:500 attack:1 ]", - "[ (0/1 → 1/1) ⇝ 3/2 | n:59.16988554127514 s:sawtooth gain:0.16 cutoff:500 attack:1 ]", - "[ (0/1 → 1/1) ⇝ 3/2 | n:60.16988554127514 s:sawtooth gain:0.16 cutoff:500 attack:1 ]", - "[ (0/1 → 1/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 → 1/2) ⇝ 9/16 | n:69.04676036055696 decay:0.1 sustain:0 s:triangle gain:0.15 ]", - "[ 3/8 ⇜ (1/2 → 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 → 1/1) ⇝ 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 → 1/2) ⇝ 9/16 | n:69.08676036055695 decay:0.1 sustain:0 s:triangle gain:0.15 ]", - "[ 3/8 ⇜ (1/2 → 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 → 1/1) ⇝ 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 → 11/16) ⇝ 3/4 | n:69.04676036055696 decay:0.1 sustain:0 s:triangle gain:0.075 ]", - "[ 9/16 ⇜ (11/16 → 3/4) | n:72.04676036055696 decay:0.1 sustain:0 s:triangle gain:0.075 ]", - "[ (15/16 → 1/1) ⇝ 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 → 11/16) ⇝ 3/4 | n:69.08676036055695 decay:0.1 sustain:0 s:triangle gain:0.075 ]", - "[ 9/16 ⇜ (11/16 → 3/4) | n:72.08676036055695 decay:0.1 sustain:0 s:triangle gain:0.075 ]", - "[ (15/16 → 1/1) ⇝ 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 → 7/8) ⇝ 15/16 | n:69.04676036055696 decay:0.1 sustain:0 s:triangle gain:0.049999999999999996 ]", - "[ 3/4 ⇜ (7/8 → 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 → 7/8) ⇝ 15/16 | n:69.08676036055695 decay:0.1 sustain:0 s:triangle gain:0.049999999999999996 ]", - "[ 3/4 ⇜ (7/8 → 15/16) | n:72.08676036055695 decay:0.1 sustain:0 s:triangle gain:0.049999999999999996 ]", - "[ (0/1 → 1/16) ⇝ 3/16 | n:72.0468455057745 decay:0.1 sustain:0 s:triangle gain:0.0375 ]", - "[ 0/1 ⇜ (1/16 → 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 → 1/16) ⇝ 3/16 | n:72.0868455057745 decay:0.1 sustain:0 s:triangle gain:0.0375 ]", - "[ 0/1 ⇜ (1/16 → 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 → 1/1) ⇝ 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 → 1/1) ⇝ 9/8 | n:69.08676036055695 decay:0.1 sustain:0 s:triangle gain:0.0375 ]", + "[ (0/1 → 1/1) ⇝ 3/2 | note:33.129885541275144 decay:0.15 sustain:0 s:sawtooth gain:0.4 cutoff:3669.6267869262615 ]", + "[ (0/1 → 1/1) ⇝ 3/2 | note:33.17988554127514 decay:0.15 sustain:0 s:sawtooth gain:0.4 cutoff:3669.6267869262615 ]", + "[ (0/1 → 1/1) ⇝ 3/2 | note:55.129885541275144 s:sawtooth gain:0.16 cutoff:500 attack:1 ]", + "[ (0/1 → 1/1) ⇝ 3/2 | note:59.129885541275144 s:sawtooth gain:0.16 cutoff:500 attack:1 ]", + "[ (0/1 → 1/1) ⇝ 3/2 | note:60.129885541275144 s:sawtooth gain:0.16 cutoff:500 attack:1 ]", + "[ (0/1 → 1/1) ⇝ 3/2 | note:64.12988554127514 s:sawtooth gain:0.16 cutoff:500 attack:1 ]", + "[ (0/1 → 1/1) ⇝ 3/2 | note:55.16988554127514 s:sawtooth gain:0.16 cutoff:500 attack:1 ]", + "[ (0/1 → 1/1) ⇝ 3/2 | note:59.16988554127514 s:sawtooth gain:0.16 cutoff:500 attack:1 ]", + "[ (0/1 → 1/1) ⇝ 3/2 | note:60.16988554127514 s:sawtooth gain:0.16 cutoff:500 attack:1 ]", + "[ (0/1 → 1/1) ⇝ 3/2 | note:64.16988554127515 s:sawtooth gain:0.16 cutoff:500 attack:1 ]", + "[ 3/16 → 3/8 | note:69.01266877519555 decay:0.1 sustain:0 s:triangle gain:0.15 ]", + "[ (3/8 → 1/2) ⇝ 9/16 | note:69.04676036055696 decay:0.1 sustain:0 s:triangle gain:0.15 ]", + "[ 3/8 ⇜ (1/2 → 9/16) | note:72.04676036055696 decay:0.1 sustain:0 s:triangle gain:0.15 ]", + "[ 3/4 → 15/16 | note:72.16001184806132 decay:0.1 sustain:0 s:triangle gain:0.15 ]", + "[ (15/16 → 1/1) ⇝ 9/8 | note:72.21301072199333 decay:0.1 sustain:0 s:triangle gain:0.15 ]", + "[ 3/16 → 3/8 | note:69.05266877519557 decay:0.1 sustain:0 s:triangle gain:0.15 ]", + "[ (3/8 → 1/2) ⇝ 9/16 | note:69.08676036055695 decay:0.1 sustain:0 s:triangle gain:0.15 ]", + "[ 3/8 ⇜ (1/2 → 9/16) | note:72.08676036055695 decay:0.1 sustain:0 s:triangle gain:0.15 ]", + "[ 3/4 → 15/16 | note:72.20001184806131 decay:0.1 sustain:0 s:triangle gain:0.15 ]", + "[ (15/16 → 1/1) ⇝ 9/8 | note:72.25301072199335 decay:0.1 sustain:0 s:triangle gain:0.15 ]", + "[ 0/1 → 3/16 | note:93.00057728554401 decay:0.1 sustain:0 s:triangle gain:0.075 ]", + "[ 0/1 → 3/16 | note:93.04057728554402 decay:0.1 sustain:0 s:triangle gain:0.075 ]", + "[ 3/8 → 9/16 | note:69.01266877519555 decay:0.1 sustain:0 s:triangle gain:0.075 ]", + "[ (9/16 → 11/16) ⇝ 3/4 | note:69.04676036055696 decay:0.1 sustain:0 s:triangle gain:0.075 ]", + "[ 9/16 ⇜ (11/16 → 3/4) | note:72.04676036055696 decay:0.1 sustain:0 s:triangle gain:0.075 ]", + "[ (15/16 → 1/1) ⇝ 9/8 | note:72.16001184806132 decay:0.1 sustain:0 s:triangle gain:0.075 ]", + "[ 3/8 → 9/16 | note:69.05266877519557 decay:0.1 sustain:0 s:triangle gain:0.075 ]", + "[ (9/16 → 11/16) ⇝ 3/4 | note:69.08676036055695 decay:0.1 sustain:0 s:triangle gain:0.075 ]", + "[ 9/16 ⇜ (11/16 → 3/4) | note:72.08676036055695 decay:0.1 sustain:0 s:triangle gain:0.075 ]", + "[ (15/16 → 1/1) ⇝ 9/8 | note:72.20001184806131 decay:0.1 sustain:0 s:triangle gain:0.075 ]", + "[ 3/16 → 3/8 | note:93.00057728554401 decay:0.1 sustain:0 s:triangle gain:0.049999999999999996 ]", + "[ 3/16 → 3/8 | note:93.04057728554402 decay:0.1 sustain:0 s:triangle gain:0.049999999999999996 ]", + "[ 9/16 → 3/4 | note:69.01266877519555 decay:0.1 sustain:0 s:triangle gain:0.049999999999999996 ]", + "[ (3/4 → 7/8) ⇝ 15/16 | note:69.04676036055696 decay:0.1 sustain:0 s:triangle gain:0.049999999999999996 ]", + "[ 3/4 ⇜ (7/8 → 15/16) | note:72.04676036055696 decay:0.1 sustain:0 s:triangle gain:0.049999999999999996 ]", + "[ 9/16 → 3/4 | note:69.05266877519557 decay:0.1 sustain:0 s:triangle gain:0.049999999999999996 ]", + "[ (3/4 → 7/8) ⇝ 15/16 | note:69.08676036055695 decay:0.1 sustain:0 s:triangle gain:0.049999999999999996 ]", + "[ 3/4 ⇜ (7/8 → 15/16) | note:72.08676036055695 decay:0.1 sustain:0 s:triangle gain:0.049999999999999996 ]", + "[ (0/1 → 1/16) ⇝ 3/16 | note:72.0468455057745 decay:0.1 sustain:0 s:triangle gain:0.0375 ]", + "[ 0/1 ⇜ (1/16 → 3/16) | note:93.0468455057745 decay:0.1 sustain:0 s:triangle gain:0.0375 ]", + "[ 3/8 → 9/16 | note:93.00057728554401 decay:0.1 sustain:0 s:triangle gain:0.0375 ]", + "[ (0/1 → 1/16) ⇝ 3/16 | note:72.0868455057745 decay:0.1 sustain:0 s:triangle gain:0.0375 ]", + "[ 0/1 ⇜ (1/16 → 3/16) | note:93.0868455057745 decay:0.1 sustain:0 s:triangle gain:0.0375 ]", + "[ 3/8 → 9/16 | note:93.04057728554402 decay:0.1 sustain:0 s:triangle gain:0.0375 ]", + "[ 3/4 → 15/16 | note:69.01266877519555 decay:0.1 sustain:0 s:triangle gain:0.0375 ]", + "[ (15/16 → 1/1) ⇝ 9/8 | note:69.04676036055696 decay:0.1 sustain:0 s:triangle gain:0.0375 ]", + "[ 3/4 → 15/16 | note:69.05266877519557 decay:0.1 sustain:0 s:triangle gain:0.0375 ]", + "[ (15/16 → 1/1) ⇝ 9/8 | note:69.08676036055695 decay:0.1 sustain:0 s:triangle gain:0.0375 ]", ] `; @@ -8193,12 +8193,12 @@ exports[`renders tunes > tune: orbit 1`] = ` exports[`renders tunes > tune: outroMusic 1`] = ` [ - "[ (0/1 → 1/1) ⇝ 3/1 | n:E3 s:0040_FluidR3_GM_sf2_file attack:0.05 decay:0.1 sustain:0.7 cutoff:1111.7252990603447 gain:0.3 ]", - "[ (0/1 → 1/1) ⇝ 3/1 | n:G3 s:0040_FluidR3_GM_sf2_file attack:0.05 decay:0.1 sustain:0.7 cutoff:1111.7252990603447 gain:0.3 ]", - "[ (0/1 → 1/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 → 1/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 → 1/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 → 1/1) ⇝ 3/1 | note:E3 s:0040_FluidR3_GM_sf2_file attack:0.05 decay:0.1 sustain:0.7 cutoff:1111.7252990603447 gain:0.3 ]", + "[ (0/1 → 1/1) ⇝ 3/1 | note:G3 s:0040_FluidR3_GM_sf2_file attack:0.05 decay:0.1 sustain:0.7 cutoff:1111.7252990603447 gain:0.3 ]", + "[ (0/1 → 1/1) ⇝ 3/1 | note:B3 s:0040_FluidR3_GM_sf2_file attack:0.05 decay:0.1 sustain:0.7 cutoff:1111.7252990603447 gain:0.3 ]", + "[ (0/1 → 1/1) ⇝ 3/1 | note:D4 s:0040_FluidR3_GM_sf2_file attack:0.05 decay:0.1 sustain:0.7 cutoff:1111.7252990603447 gain:0.3 ]", + "[ (0/1 → 1/1) ⇝ 9/2 | note: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 | note: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 → 1/1) ⇝ 3/2 | s:sd speed:0.9931522866332672 n:3 ]", "[ 0/1 → 1/2 | s:hh speed:0.9036881079621337 n:3 ]", diff --git a/website/src/docs/JsDoc.jsx b/website/src/docs/JsDoc.jsx index f0c3b900..88a775a5 100644 --- a/website/src/docs/JsDoc.jsx +++ b/website/src/docs/JsDoc.jsx @@ -4,7 +4,7 @@ import { MiniRepl } from './MiniRepl'; const getTag = (title, item) => item.tags?.find((t) => t.title === title)?.text; -export function JsDoc({ name, h = 3, hideDescription }) { +export function JsDoc({ name, h = 3, hideDescription, punchcard, canvasHeight }) { const item = docs[name]; if (!item) { console.warn('Not found: ' + name); @@ -40,7 +40,7 @@ export function JsDoc({ name, h = 3, hideDescription }) { {item.examples?.length ? ( {item.examples?.map((example, k) => ( - + ))} ) : ( diff --git a/website/src/docs/MiniRepl.jsx b/website/src/docs/MiniRepl.jsx index 9ea06151..d6a325ff 100644 --- a/website/src/docs/MiniRepl.jsx +++ b/website/src/docs/MiniRepl.jsx @@ -3,8 +3,9 @@ import { initAudioOnFirstClick } from '@strudel.cycles/webaudio'; import { useEffect, useState } from 'react'; import { prebake } from '../repl/prebake'; +let modules; if (typeof window !== 'undefined') { - evalScope( + modules = evalScope( controls, import('@strudel.cycles/core'), // import('@strudel.cycles/tone'), @@ -22,14 +23,20 @@ if (typeof window !== 'undefined') { prebake(); } -export function MiniRepl({ tune, withCanvas }) { +export function MiniRepl({ tune, drawTime, punchcard, canvasHeight = 100 }) { const [Repl, setRepl] = useState(); useEffect(() => { // we have to load this package on the client // because codemirror throws an error on the server - import('@strudel.cycles/react').then((res) => { - setRepl(() => res.MiniRepl); - }); + Promise.all([import('@strudel.cycles/react'), modules]) + .then(([res]) => setRepl(() => res.MiniRepl)) + .catch((err) => console.error(err)); }, []); - return Repl ? : {tune}; + return Repl ? ( + + + + ) : ( + {tune} + ); } diff --git a/website/src/pages/learn/factories.mdx b/website/src/pages/learn/factories.mdx index b6101594..7a7256ec 100644 --- a/website/src/pages/learn/factories.mdx +++ b/website/src/pages/learn/factories.mdx @@ -61,3 +61,7 @@ As a chained function: ## silence + +## run + + diff --git a/website/src/pages/learn/getting-started.mdx b/website/src/pages/learn/getting-started.mdx index 5d877e08..3f2868f1 100644 --- a/website/src/pages/learn/getting-started.mdx +++ b/website/src/pages/learn/getting-started.mdx @@ -28,7 +28,7 @@ Strudel however runs directly in your web browser, does not require any custom s The main place to actually make music with Strudel is the [Strudel REPL](https://strudel.tidalcycles.org/) ([what is a REPL?](https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop)), but in these pages you will also encounter interactive "MiniREPLs" where you can listen to and edit Strudel patterns. Try clicking the play icon below: - + Then edit the text so it reads `s("bd sd cp hh")` and click the refresh icon. Congratulations, you have now live coded your first Strudel pattern! @@ -54,13 +54,13 @@ Alternatively, you can get a taste of what Strudel can do by clicking play on th hh: ['hh27/000_hh27closedhh.wav','hh/000_hh3closedhh.wav'], }, 'github:tidalcycles/Dirt-Samples/master/'); stack( -s("bd,[~ ],hh(3,4)") // drums +s("bd,[~ ],hh*8") // drums .speed(perlin.range(.7,.9)) // random sample speed variation ,"" // bassline .off(1/8,x=>x.add(12).degradeBy(.5)) // random octave jumps .add(perlin.range(0,.5)) // random pitch variation .superimpose(add(.05)) // add second, slightly detuned voice -.n() // wrap in "n" +.note() // wrap in "note" .decay(.15).sustain(0) // make each note of equal length .s('sawtooth') // waveform .gain(.4) // turn down @@ -68,7 +68,7 @@ s("bd,[~ ],hh(3,4)") // drums ,">".voicings('lefthand') // chords .superimpose(x=>x.add(.04)) // add second, slightly detuned voice .add(perlin.range(0,.5)) // random pitch variation -.n() // wrap in "n" +.note() // wrap in "note" .s('sawtooth') // waveform .gain(.16) // turn down .cutoff(500) // fixed cutoff diff --git a/website/src/pages/learn/mini-notation.mdx b/website/src/pages/learn/mini-notation.mdx index 2d0cb289..4c0a0242 100644 --- a/website/src/pages/learn/mini-notation.mdx +++ b/website/src/pages/learn/mini-notation.mdx @@ -51,12 +51,12 @@ If you do just want to get a regular string that is _not_ parsed as mini-notatio We can play more notes by separating them with spaces: - + Here, those four notes are squashed into one cycle, so each note is a quarter second long. Try adding or removing notes and notice how the tempo changes! - + Note that the overall duration of time does not change, and instead each note length descreases. This is a key idea, as it illustrates the 'Cycle' in TidalCycles! @@ -72,28 +72,28 @@ But, it will begin to make sense as we go through more elements of mini-notation We can slow the sequence down by enclosing it in brackets and dividing it by a number (`/2`): - + The division by two means that the sequence will be played over the course of two cycles. You can also use decimal numbers for any tempo you like (`/2.75`). - + ## Angle Brackets Using angle brackets `<>`, we can define the sequence length based on the number of events: -")`} /> +")`} punchcard /> The above snippet is the same as: - + The advantage of the angle brackets, is that we can add more events without needing to change the number at the end. -")`} /> +")`} punchcard /> -")`} /> +")`} punchcard /> This is more similar to traditional music sequencers and piano rolls, where adding a note increases the perceived overall duration. @@ -101,15 +101,13 @@ This is more similar to traditional music sequencers and piano rolls, where addi Contrary to division, a sequence can be sped up by multiplying it by a number using the asterisk symbol (`*`): - + The multiplication by two here means that the sequence will play twice a cycle. As with divisions, multiplications can be decimal (`*2.75`): - - -Actually, this is not true, but this will be [fixed](https://github.com/tidalcycles/strudel/issues/314) :) + ## Subdividing time with bracket nesting @@ -133,7 +131,7 @@ Well, what this means is that in TidalCycles, not only can you divide time any w The "~" represents a rest, and will create silence between other events: - + ## Parallel / polyphony @@ -141,17 +139,17 @@ Using commas, we can play chords. The following are the same: - + But to play multiple chords in a sequence, we have to wrap them in brackets: -")`} /> +")`} punchcard /> ## Elongation With the "@" symbol, we can specify temporal "weight" of a sequence child: -")`} /> +")`} punchcard /> Here, the first chord has a weight of 2, making it twice the length of the other chords. The default weight is 1. @@ -159,7 +157,7 @@ Here, the first chord has a weight of 2, making it twice the length of the other Using "!" we can repeat without speeding up: -")`} /> +")`} punchcard /> In essence, the `x!n` is like a shortcut for `[x*n]@n`. @@ -181,24 +179,24 @@ Using round brackets after an event, we can create rhythmical sub-divisions base This algorithm can be found in many different types of music software, and is often referred to as a [Euclidean rhythm](https://en.wikipedia.org/wiki/Euclidean_rhythm) sequencer, after computer scientist Godfriend Toussaint. Why is it interesting? Well, consider the following simple example: - + Sound familiar? This is a popular Euclidian rhythm going by various names, such as "Pop Clave". These rhythms can be found in all musical cultures, and the Euclidian rhythm algorithm allows us to express them extremely easily. Writing this rhythm out in full require describing: - + But using the Euclidian rhythm notation, we only need to express "3 beats over 8 segments, starting on position 1". This makes it easy to write patterns with interesting rhythmic structures and variations that still sound familiar: - + Note that since the example above does not use the third `offset` parameter, it can be written simply as `"(3,8)"`. - + Let's look at those three parameters in detail. @@ -207,26 +205,26 @@ Let's look at those three parameters in detail. `beats`: the first parameter controls how may beats will be played. Compare these: - - - + + + ### Segments `segments`: the second parameter controls the total amount of segments the beats will be distributed over: - - - + + + ### Offsets `offset`: the third (optional) parameter controls the starting position for distributing the beats. We need a secondary rhythm to hear the difference: - - - + + + ## Mini-notation exercise diff --git a/website/src/pages/learn/notes.mdx b/website/src/pages/learn/notes.mdx index 9fe8472f..d4209c0f 100644 --- a/website/src/pages/learn/notes.mdx +++ b/website/src/pages/learn/notes.mdx @@ -25,7 +25,7 @@ Here's the same pattern written in three different ways: -Let's look at `note`, `n` and `freq` in more detail... +Let's look at those in more detail... ## `note` names diff --git a/website/src/pages/learn/sounds.mdx b/website/src/pages/learn/sounds.mdx index 4e944581..f80f51be 100644 --- a/website/src/pages/learn/sounds.mdx +++ b/website/src/pages/learn/sounds.mdx @@ -20,15 +20,17 @@ You can learn more about both of these approaches in the pages [Synths](/learn/s # Combining notes and sounds -In both of the above cases, we are no longer directly controlling the `note`/`n`/`freq` of the sound heard via `s`, as we were in the [Notes](/strudel/notes) page. +In both of the above cases, we are no longer directly controlling the `note`/`freq` of the sound heard via `s`, as we were in the [Notes](/strudel/notes) page. -So how can we both control the sound and the pitch? We can _combine_ `note`/`n`/`freq` with `s` to change the sound of our pitches: +So how can we both control the sound and the pitch? We can _combine_ `note`/`freq` with `s` to change the sound of our pitches: - + - + + +The last example will actually sound the same with or without `s`, because `triangle` is the default value for `s`. What about combining different notes with different sounds at the same time? @@ -37,5 +39,3 @@ What about combining different notes with different sounds at the same time? Hmm, something interesting is going on there, related to there being five notes and three sounds. Let's now take a step back and think about the Strudel [Code](/learn/code) we've been hearing so far. - - diff --git a/website/src/pages/learn/strudel-vs-tidal.mdx b/website/src/pages/learn/strudel-vs-tidal.mdx index daf79b9b..776ca759 100644 --- a/website/src/pages/learn/strudel-vs-tidal.mdx +++ b/website/src/pages/learn/strudel-vs-tidal.mdx @@ -18,13 +18,13 @@ Strudel is written in JavaScript, while Tidal is written in Haskell. This difference is most obvious when looking at the syntax: -```hs +```haskell iter 4 $ every 3 (||+ n "10 20") $ (n "0 1 3") # s "triangle" # crush 4 ``` One _could_ express that pattern to Strudel like so: -```txt +``` iter(4, every(3, add.squeeze("10 20"), n("0 1 3").s("triangle").crush(4))) ``` @@ -37,7 +37,7 @@ operators, or change the meaning of existing ones. Before you discard Strudel as an unwieldy paren monster, look at this alternative way to write the above: -```txt +``` n("0 1 3").every(3, add.squeeze("10 20")).iter(4).s("triangle").crush(4) ``` @@ -114,7 +114,7 @@ Also, samples are always loaded from a URL rather than from the disk, although [ 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: -```txt +``` let a = note("c a f e") let b = s("bd sd") @@ -127,7 +127,7 @@ stack( Alternatively, you could write everything as one `stack` and use `.hush()` to silence a pattern: -```txt +``` stack( note("c a f e"), s("bd sd").hush() @@ -141,6 +141,6 @@ Note that strudel will always use the last statement in your code as the pattern Strudels tempo is 1 cycle per second, while tidal defaults to `0.5625`. You can get the same tempo as tidal with: -```txt +``` note("c a f e").fast(.5625); ``` diff --git a/website/src/pages/technical-manual/docs.mdx b/website/src/pages/technical-manual/docs.mdx index b0417984..502702af 100644 --- a/website/src/pages/technical-manual/docs.mdx +++ b/website/src/pages/technical-manual/docs.mdx @@ -29,7 +29,11 @@ add a mini repl with - `client:idle` is required to tell astro that the repl should be interactive, see [Client Directive](https://docs.astro.build/en/reference/directives-reference/#client-directives) - `tune`: be any valid pattern code -- `withCanvas`: If set, a canvas will be rendered below that shows a pianoroll (WIP) +- `punchcard`: if added, a punchcard / pianoroll visualization is renderd +- `drawTime`: time window for drawing, defaults to `[0, 4]` +- `canvasHeight`: height of the canvas, defaults to 100px + +See `mini-notation.mdx` for usage examples ## In-Source Documentation diff --git a/website/src/repl/Repl.jsx b/website/src/repl/Repl.jsx index 53c744d8..8c94d157 100644 --- a/website/src/repl/Repl.jsx +++ b/website/src/repl/Repl.jsx @@ -4,7 +4,7 @@ Copyright (C) 2022 Strudel contributors - see . */ -import { cleanupDraw, cleanupUi, controls, evalScope, logger } from '@strudel.cycles/core'; +import { cleanupDraw, cleanupUi, controls, evalScope, getDrawContext, logger } from '@strudel.cycles/core'; import { CodeMirror, cx, flash, useHighlighting, useStrudel } from '@strudel.cycles/react'; import { getAudioContext, @@ -54,6 +54,12 @@ evalScope( export let loadedSamples = []; const presets = prebake(); +let drawContext, clearCanvas; +if (typeof window !== 'undefined') { + drawContext = getDrawContext(); + clearCanvas = () => drawContext.clearRect(0, 0, drawContext.canvas.height, drawContext.canvas.width); +} + Promise.all([...modules, presets]).then((data) => { // console.log('modules and sample registry loade', data); loadedSamples = Object.entries(getLoadedSamples() || {}); @@ -125,6 +131,7 @@ export function Repl({ embedded = false }) { setPending(false); }, onToggle: (play) => !play && cleanupDraw(false), + drawContext, }); // init code @@ -167,7 +174,7 @@ export function Repl({ embedded = false }) { view, pattern, active: started && !activeCode?.includes('strudel disable-highlighting'), - getTime: () => scheduler.getPhase(), + getTime: () => scheduler.now(), }); // @@ -203,6 +210,7 @@ export function Repl({ embedded = false }) { const handleShuffle = async () => { const { code, name } = getRandomTune(); logger(`[repl] ✨ loading random tune "${name}"`); + clearCanvas(); resetLoadedSamples(); await prebake(); // declare default samples await evaluate(code, false); diff --git a/website/src/repl/drawings.mjs b/website/src/repl/drawings.mjs new file mode 100644 index 00000000..0aa09ef3 --- /dev/null +++ b/website/src/repl/drawings.mjs @@ -0,0 +1,172 @@ +export const lightflower = `Pattern.prototype.nest = function(n, cycles) { + n = reify(n) + return this.echo(n, pure(cycles).div(n), 1) +} + +Pattern.prototype.deepimpose = function(func, times) { + if(times===0) return this; + return this.superimpose(x=>func(x).deepimpose(func, times-1)) +} + +angle(saw) + .fill('#aaffee12') + .r(.18) + .w(.06) + .h(.06) + .deepimpose(x=>x.mul(r(2).w(2).h(2)).late(1/12), 3) + .nest(6, 1) + .s('ellipse') + .mul(w(sine).h(sine).range(.5,1.25)) + .off(.5, x=>x.fill('#ffeeaa12').rev().div(r(1.2))) + .slow(16) + .smear(0.6) + .animate({smear:0}) +`; + +// https://strudel.tidalcycles.org/?C31_NrcMfZEO +export const spiralflower = `const {innerWidth:ww,innerHeight:wh} = window; +const ctx = getDrawContext() +const piDiv180 = Math.PI / 180; +function fromPolar(angle, radius, cx, cy) { + const radians = (angle-90) * piDiv180 + return [cx + Math.cos(radians) * radius, cy + Math.sin(radians) * radius] +} +const [w, h] = [200,200] +const [cx,cy] = [ww/2,wh/2]; +function drawSpiralSegment(ctx, {angle,b,r, density = 2, color = 'darkseagreen', thick = 2, long = 1}) { + let i = angle; + ctx.beginPath(); + while(i < b){ + const radius = Math.max(Math.min(r - i*.2,1000),20); + const [x1,y1] = fromPolar(i, radius, cx, cy) + const [x2,y2] = fromPolar(i, radius+long, cx, cy) + ctx.lineWidth = thick; + ctx.moveTo(x1,y1); + ctx.strokeStyle= color + ctx.lineTo(x2,y2); + ctx.stroke() + i+=300/density; + } +} +const { r, angle, b, color, density,thick} = + createParams('r', 'angle', 'b', 'color','density','thick','long'); + + +const pattern = + r(sine.range(200,800).slow(4)) + .angle(cosine.range(0, 45).slow(3)) + .b(perlin.range(1000, 4000).slow(5)) + .thick(sine.range(2,50).slow(2)) + .long(perlin.range(1,100).slow(3)) + .off(1, x=>x.color('white')) + .off(2, x=>x.color('salmon')) + .off(4, x=>x.color('purple')) + .slow(4)//.mask("x(5,8)") + + +function onDraw(f) { + ctx.beginPath(); + drawSpiralSegment(ctx, f.value); +} + + +// generic draw logic +window.frame && cancelAnimationFrame(window.frame); + +function render(t) { + t = Math.round(t) + const frame = pattern.slow(1000).queryArc(t, t) + ctx.fillStyle='#20001005' + ctx.fillRect(0,0,ww,wh) + //ctx.clearRect(0,0,ww,wh) + ctx.stroke() + frame.forEach(onDraw) + window.frame = requestAnimationFrame(render); +}; + +window.frame = requestAnimationFrame(render); + +silence +`; + +export const syncexample = `"<0 1 2 3>/2" +.off(1/2, add(4)) +.off(1, add(2)) +.scale(cat('C minor','C major').slow(8)) +.layer( + x=>x.note().piano(), + p=>stack( + p + .angle(p.sub('c3').div(12)) + .r(.5) + .s('ellipse') + .w(.1) + .h(.1), + p.x(p.sub('c3').div(12)) + .y(.9) + .w(1/12) + .h(.1) + .s('rect') + ).animate({sync:true,smear:0.9}) +) +`; + +export const moveRescaleZoom = ` +const rescale = register('rescale', function (f, pat) { + return pat.mul(x(f).w(f).y(f).h(f)); +}) + +const move = register('move', function (dx, dy, pat) { + return pat.add(x(dx).y(dy)); +}) + +const zoom = register('zoom', function (f, pat) { + const d = pure(1).sub(f).div(2); + return pat.rescale(f).move(d, d); +}) + +x(.5).y(.5).w(1).h(1) + .zoom(saw.slow(3)) + .move(sine.range(-.1,.1),0) + .fill("#ffeeaa10") + .s('rect') + .echo(6,.5,1) + .animate({smear:0.5})`; + +export const strudelS = ` +const rescale = register('rescale', function (f, pat) { + return pat.mul(x(f).w(f).y(f).h(f)); +}) + +const move = register('move', function (dx, dy, pat) { + return pat.add(x(dx).y(dy)); +}) + +const flipY = register('flipY', function (pat) { + return pat.fmap(v => ({...v, y:1-v.y})) +}) + +const zoom = register('zoom', function (f, pat) { + const d = pure(1).sub(f).div(2); + return pat.rescale(f).move(d, d); +}) + +Pattern.prototype.nest = function(n, cycles) { + n = reify(n) + return this.echo(n, pure(cycles).div(n), 1) +} + +x(sine.div(1)).y(cosine.range(0,.5)) + .w(.1).h(.1) + .mul(w(square).h(square).slow(8)) + .zoom(saw.slow(8)) + .layer( + id, + _=>_.flipY().move(0,0).rev() + ) + .mask("0 1@2").rev() + .nest(16,9) + .s('rect') + .fill("royalblue steelblue".fast(14)) + .slow(8) + .animate({smear:.99})`; diff --git a/website/src/repl/tunes.mjs b/website/src/repl/tunes.mjs index 3543cb05..554fe43c 100644 --- a/website/src/repl/tunes.mjs +++ b/website/src/repl/tunes.mjs @@ -466,14 +466,14 @@ samples({ stack( "-7 0 -7 7".struct("x(5,8,1)").fast(2).sub(7) .scale(scales) - .n() + .note() .s("sawtooth,square") .gain(.3).attack(0.01).decay(0.1).sustain(.5) .apply(filter1), "~@3 [<2 3>,<4 5>]" .echo(4,1/16,.7) .scale(scales) - .n() + .note() .s('square').gain(.7) .attack(0.01).decay(0.1).sustain(0) .apply(filter1), @@ -484,7 +484,7 @@ stack( .fast(2) .echo(32, 1/8, .8) .scale(scales) - .n() + .note() .s("sawtooth") .gain(sine.range(.1,.4).slow(8)) .attack(.001).decay(.2).sustain(0) @@ -527,7 +527,7 @@ stack( .off(1/8,x=>x.add(12).degradeBy(.5)) // random octave jumps .add(perlin.range(0,.5)) // random pitch variation .superimpose(add(.05)) // add second, slightly detuned voice - .n() // wrap in "n" + .note() // wrap in "note" .decay(.15).sustain(0) // make each note of equal length .s('sawtooth') // waveform .gain(.4) // turn down @@ -536,7 +536,7 @@ stack( ,">".voicings('lefthand') // chords .superimpose(x=>x.add(.04)) // add second, slightly detuned voice .add(perlin.range(0,.5)) // random pitch variation - .n() // wrap in "n" + .note() // wrap in "note" .s('sawtooth') // waveform .gain(.16) // turn down .cutoff(500) // fixed cutoff @@ -545,7 +545,7 @@ stack( ,"a4 c5 ".struct("x(5,8,-1)") .superimpose(x=>x.add(.04)) // add second, slightly detuned voice .add(perlin.range(0,.5)) // random pitch variation - .n() // wrap in "n" + .note() // wrap in "note" .decay(.1).sustain(0) // make notes short .s('triangle') // waveform .degradeBy(perlin.range(0,.5)) // randomly controlled random removal :) @@ -565,12 +565,12 @@ samples({ "C^7 Am7 Dm7 G7".slow(2).voicings('lefthand') .stack("0@6 [<1 2> <2 0> 1]@2".scale('C5 major')) - .n().slow(4) + .note().slow(4) .s('0040_FluidR3_GM_sf2_file') .color('steelblue') .stack( "<-7 ~@2 [~@2 -7] -9 ~@2 [~@2 -9] -10!2 ~ [~@2 -10] -5 ~ [-3 -2 -10]@2>*2".scale('C3 major') - .n().s('sawtooth').color('brown') + .note().s('sawtooth').color('brown') ) .attack(0.05).decay(.1).sustain(.7) .cutoff(perlin.range(800,2000))
{tune}