{"children":[{"children":[{"children":[],"kind":"view-node","props":{"html":"<style>.ls-desk{margin:28px 0;padding:24px;background:#08191d;color:#e4f7ee;border:1px solid #294442;border-radius:20px;font:14px/1.5 system-ui,sans-serif}.ls-desk *{box-sizing:border-box}.ls-desk header{display:flex;justify-content:space-between;align-items:center;gap:18px}.ls-eyebrow{font-size:11px;letter-spacing:.15em;color:#a5dd89}.ls-desk h2{font-size:30px;line-height:1.2;margin:10px 0}.ls-desk h3{margin:0 0 8px}.ls-desk p{color:var(--daw-muted,#9bb6b4)}.ls-desk a{color:#b8e696}.ls-desk button,.ls-desk select,.ls-desk input[type=number]{color:inherit;background:#142c2e;border:1px solid #3c5c55;border-radius:8px;padding:9px 12px;font:inherit}.ls-desk button{cursor:pointer}.ls-desk button:disabled{opacity:.45;cursor:default}.ls-desk button:focus-visible,.ls-desk input:focus-visible,.ls-desk textarea:focus-visible{outline:2px solid var(--daw-accent,#c4ef83);outline-offset:3px}.ls-desk [data-ls=apply],.ls-desk [data-ls=start]{background:var(--editor-accent,#c4ef83);color:var(--editor-accent-ink,#142819);font-weight:650}.ls-transport{display:flex;align-items:center;gap:12px;margin:18px 0;padding:12px;background:#102426;border-radius:12px;flex-wrap:wrap}.ls-transport output{font-variant-numeric:tabular-nums}.ls-meter{width:72px;height:6px;background:var(--daw-border-strong,#294442);border-radius:4px;overflow:hidden}.ls-meter i{display:block;height:100%;width:0;background:var(--daw-accent,#c4ef83)}.ls-columns{display:grid;grid-template-columns:minmax(0,1.8fr) minmax(250px,1fr);gap:24px}.ls-code,.ls-mix{min-width:0}.ls-code nav{display:flex;gap:8px;margin-bottom:14px}.ls-code nav [aria-pressed=true]{border-color:#c4ef83;color:#c4ef83}.ls-desk label{display:block}.ls-code label>span{float:right;font-size:11px;color:var(--daw-muted,#779d99)}.ls-desk textarea{display:block;width:100%;resize:vertical;min-height:260px;background:var(--daw-well,#031013);color:var(--daw-ink,#d0eddf);border:1px solid var(--daw-border,#284542);border-radius:10px;padding:15px;margin-top:8px;font:13px/1.6 ui-monospace,monospace;tab-size:2}.ls-compose,.ls-actions{display:flex;flex-wrap:wrap;align-items:end;gap:10px;margin:12px 0}.ls-compose input{width:85px}.ls-compose select{display:block}.ls-desk pre{white-space:pre-wrap;overflow-wrap:anywhere;font:12px/1.6 ui-monospace,monospace}.ls-desk [data-ls=status]{min-height:40px;color:var(--daw-soft,#c4ef83)}.ls-desk [data-ls=status][data-error=true]{color:#ffb4a6}.ls-desk kbd{font-size:10px;opacity:.65;margin-left:10px}.ls-lanes{margin:20px 0}.ls-lanes label{display:grid;grid-template-columns:58px minmax(50px,1fr) 40px;gap:8px;align-items:center;margin:16px 0}.ls-lanes input{width:100%;accent-color:var(--daw-accent,#b6e77f)}.ls-lanes output{text-align:right;font-size:12px}.ls-tempo input{width:85px}.ls-desk details{margin-top:24px}.ls-desk summary{cursor:pointer}.ls-clock-boundary{font-size:12px;margin-top:24px}.ls-desk [hidden]{display:none!important}.ls-desk [data-cre8-island]{min-height:0!important}@media(max-width:720px){.ls-desk{padding:16px}.ls-columns{grid-template-columns:1fr}.ls-desk header{align-items:start;flex-direction:column}.ls-transport output{flex-basis:100%}.ls-desk h2{font-size:26px}}\n\n/* Editor metrics are shared so the projection stays aligned with native text selection. */\n.ls-desk{scroll-margin-top:18px}.ls-desk [data-ls=focus]{margin-left:auto}.ls-draft-bar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:8px 0 14px;color:var(--daw-soft,#b6dba0);font-size:12px}.ls-draft-bar button{padding:4px 8px;font-size:11px;background:transparent}.ls-desk[data-dirty=true] [data-ls=draft-state]{color:#f5bb7c}.ls-editor-frame{display:flex;border:1px solid var(--daw-border-strong,#355a51);border-radius:10px;overflow:hidden;background:var(--daw-well,#031013);margin-top:8px;position:relative}.ls-gutter{flex:0 0 42px;background:var(--daw-panel,#07191b);color:var(--daw-faint,#547d76);text-align:right;overflow:hidden;user-select:none}.ls-desk .ls-gutter pre{margin:0;padding:15px 9px 15px 0;white-space:pre;font:13px/21px ui-monospace,monospace}.ls-editor-surface{position:relative;min-width:0;flex:1;overflow:hidden}.ls-desk .ls-editor-surface textarea,.ls-desk .ls-editor-surface>pre{margin:0;padding:15px 12px;border:0;border-radius:0;background:transparent;font:13px/21px ui-monospace,monospace;tab-size:2;white-space:pre;overflow-wrap:normal;letter-spacing:normal}.ls-desk .ls-editor-surface textarea{display:block;position:relative;width:100%;min-height:365px;resize:vertical;caret-color:var(--daw-ink,#e4f7ee);outline-offset:-2px}.ls-desk .ls-editor-surface>pre{position:absolute;top:0;left:0;min-width:100%;pointer-events:none;display:none;color:var(--daw-ink,#cce4dc)}.ls-editor-frame.is-enhanced .ls-editor-surface>pre{display:block}.ls-desk .ls-editor-frame.is-enhanced textarea{color:transparent;-webkit-text-fill-color:transparent}.ls-desk .ls-editor-frame.is-enhanced textarea::selection{background:color-mix(in srgb,var(--daw-accent,#bcee83) 25%,transparent)}.ls-token-command{color:#bcee83;font-weight:600}.ls-token-comment{color:#607f7d}.ls-token-note{color:#b9acff}.ls-token-number{color:#f1bd81}.ls-token-pattern{color:#80ddd3}.ls-editor-footer{display:flex;justify-content:space-between;gap:10px;color:var(--daw-muted,#789994);font:10px/1.5 ui-monospace,monospace;padding:8px 1px}.ls-editor-frame[data-error=true]{border-color:#f0a28e}.ls-gutter [data-error-line=true]{color:#ffb5a6;background:#522e28}.ls-preset-row{display:flex;flex-wrap:wrap;gap:8px;align-items:end;padding:12px 0;border-bottom:1px solid var(--daw-border,#24423e)}.ls-preset-row label{font-size:11px;color:var(--daw-muted,#8aada5)}.ls-preset-row select{display:block;margin-top:5px;max-width:180px}.ls-preset-row button{font-size:12px}.ls-live-badge{margin-left:auto;color:var(--daw-soft,#b6da9b);font:10px/1.5 ui-monospace,monospace;letter-spacing:.08em}.ls-arrangement{border:1px solid var(--daw-border-strong,#294641);border-radius:10px;overflow:hidden;margin-top:18px}.ls-arrangement>div:first-child{display:flex;justify-content:space-between;gap:8px;padding:10px 12px;font-size:11px;background:var(--daw-control,#0b2224)}.ls-arrangement span{color:var(--daw-soft,#a0b8ad)}.ls-arrangement svg{display:block;width:100%;height:auto;font-family:system-ui}.ls-arrangement p{padding:12px;font-size:12px}.ls-desk[data-focus=true] .ls-mix{display:none}.ls-desk[data-focus=true] .ls-columns{grid-template-columns:minmax(0,1fr)}.ls-desk [data-ls=error-line]{color:#ffb5a6;border-color:#a76658;padding:5px 10px;font-size:12px}.ls-desk [data-busy=true]{opacity:.6}\n@media(max-width:720px){.ls-editor-footer{flex-wrap:wrap}.ls-live-badge{margin-left:0}.ls-draft-bar{gap:7px}.ls-desk [data-ls=focus]{display:none}.ls-preset-row select{max-width:160px}.ls-desk .ls-editor-surface textarea,.ls-desk .ls-editor-surface>pre,.ls-desk .ls-gutter pre{font-size:12px}.ls-gutter{flex-basis:32px}.ls-arrangement>div:first-child{flex-direction:column}.ls-desk[data-focus=true] .ls-mix{display:block}}\n.ls-arrangement [data-ls=arrangement]{overflow-x:auto}.ls-arrangement svg{min-width:640px}.ls-token-comment{color:#769690}\n.ls-project-bar{display:flex;align-items:center;flex-wrap:wrap;gap:8px 14px;padding:12px 0;margin:12px 0;border-top:1px solid var(--daw-border,#294442);border-bottom:1px solid var(--daw-border,#294442);font-size:11px;color:var(--daw-muted,#89aaa1)}.ls-project-bar [data-ls=saved-state]{color:var(--daw-soft,#b6dba0);margin-right:auto}.ls-project-bar button{font-size:11px;padding:6px 10px}.ls-project-bar>span:last-child{flex-basis:100%}.ls-lanes{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.ls-lane-row{min-width:0;padding:12px;background:var(--daw-panel,#0b2224);border:1px solid var(--daw-border,#294442);border-radius:10px}.ls-lane-heading{display:flex;align-items:center;gap:8px}.ls-lane-heading label{display:block;margin:0;font-size:12px}.ls-lane-heading output{margin-left:auto;color:var(--daw-soft,#b6dba0)}.ls-lane-heading button{padding:3px 7px;font:11px ui-monospace,monospace}.ls-lane-row input{margin:16px 0;display:block}.ls-lane-row select{display:block;width:100%;min-width:0;padding:6px;font-size:11px}.ls-lane-row>span{display:block;font-size:11px;color:var(--daw-muted,#89aaa1);padding:7px 0}.ls-lane-row[data-muted=true]{border-color:#986547}.ls-lane-row[data-muted=true] [data-ls-mute]{background:#f0b97e;color:#251a14;border-color:#f0b97e}.ls-lane-row[data-muted=true] input{opacity:.55}.ls-desk select:focus-visible{outline:2px solid var(--daw-accent,#c4ef83);outline-offset:3px}.ls-desk[data-workspace=daw]{margin-top:0}.ls-desk[data-workspace=daw] h2{font-size:36px}.ls-desk[data-workspace=daw] .ls-eyebrow{color:var(--daw-muted)}@media(max-width:720px){.ls-desk[data-workspace=daw] h2{font-size:27px}.ls-project-bar [data-ls=saved-state]{flex-basis:100%}.ls-lane-row{padding:10px}.ls-lane-heading{gap:5px}}\n.ls-menu-bar{display:flex;align-items:center;gap:4px;padding:4px 0 10px;margin-bottom:10px;border-bottom:1px solid var(--daw-border,#2b453b);position:relative;z-index:5;flex-wrap:wrap}.ls-menu-bar>span{margin-left:auto;font:10px system-ui;color:var(--daw-muted,#8fac9e)}.ls-desk button[hidden]{display:none!important}@media(max-width:540px){.ls-menu-bar>span{width:100%;margin:4px 10px 0}}\n/* Gutter lines follow the textarea viewport without determining its height. */\n.ls-gutter{position:relative}.ls-desk .ls-gutter pre{position:absolute;top:0;left:0;width:100%;box-sizing:border-box}\n.ls-midi { margin-top: 1rem; }\n.ls-desk .ls-daw-only { display: none; }\n.ls-midi label { display: grid; gap: .4rem; margin: .65rem 0; }\n.ls-midi select { width: 100%; min-width: 0; }\n.ls-midi-controls { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; }\n.ls-midi [data-score-midi=\"preview\"] { max-height: 12rem; overflow: auto; white-space: pre; font-size: .75rem; }\n.ls-midi [data-score-midi=\"status\"] { overflow-wrap: anywhere; }\n\n/* Interactive phrases belong to the DAW; Performance keeps the score overview. */\n.ls-track-timeline{display:none}\n/* The portable session component occupies the shared transport row. */\n.ls-transport [data-cre8-host-component=\"audio.session\"]{flex:1 1 100%;min-width:0}\n.ls-transport #audio-session-transport{margin:0;padding:0;border:0;background:transparent;box-shadow:none}\n.ls-transport #audio-session-transport .primitive-card__body{display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:0}\n.ls-transport #ls-export-wav,.ls-transport #ls-export-midi,.ls-transport #ls-export-session{display:none}\n.ls-transport #ls-export-state{flex:1 1 240px;margin:0;font-size:12px;color:inherit}\n.ls-desk>header nav{display:flex;flex-wrap:wrap;gap:12px}\n.ls-transport-feedback{flex:1 1 100%;min-width:0}\n.ls-desk .ls-transport-feedback [data-ls=status]{margin:0;min-height:0;font:12px/1.5 system-ui,sans-serif;white-space:pre-wrap;color:#b4c8c2}\n.ls-desk .ls-transport-feedback [data-ls=status][data-error=true]{padding:8px 10px;border-left:3px solid #ffb4a6;background:#ffb4a60c;color:#ffb4a6}\n.ls-desk #ls-prepare,.ls-desk #ls-start:not(:disabled){background:var(--editor-accent,#c4ef83);color:var(--editor-accent-ink,#142819);border-color:var(--editor-accent,#c4ef83);font-weight:650}\n\n/* Preserve app layout around native document primitives. */\n.media-fragment { display:contents; }\n.ls-desk .primitive-input,.ls-desk .primitive-select { display:contents; }\n.ls-desk .primitive-input__label,.ls-desk .primitive-select__label { font:inherit; }\n/* The code label is two spans: only the language tag floats right. */\n.ls-code label>span:first-child:not(:only-child){float:none;font-size:inherit;color:inherit}\n/* The textarea's own label repeats the visible one above the editor; it stays for assistive tech. */\n.ls-editor-surface .primitive-input__label{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}\n\n/* Notation editor, drafts and status in the Song studio read on the shell palette in light and dark; the live score page keeps its own. */\n.ls-desk[data-workspace=daw] [data-ls=status][data-error=true],.ls-desk[data-workspace=daw] [data-ls=error-line],.ls-desk[data-workspace=daw] .ls-gutter [data-error-line=true]{color:var(--cre8-view-danger)}\n.ls-desk[data-workspace=daw] .ls-gutter [data-error-line=true]{background:color-mix(in srgb,var(--cre8-view-danger) 14%,var(--daw-panel))}\n.ls-desk[data-workspace=daw] .ls-editor-frame[data-error=true],.ls-desk[data-workspace=daw] [data-ls=error-line]{border-color:var(--cre8-view-danger)}\n.ls-desk[data-workspace=daw][data-dirty=true] [data-ls=draft-state]{color:light-dark(#8a4b00,#f5bb7c)}\n.ls-desk[data-workspace=daw] .ls-token-command{color:light-dark(#3d6b10,#bcee83)}\n.ls-desk[data-workspace=daw] .ls-token-comment{color:var(--daw-muted)}\n.ls-desk[data-workspace=daw] .ls-token-note{color:light-dark(#5b45b8,#b9acff)}\n.ls-desk[data-workspace=daw] .ls-token-number{color:light-dark(#9a5a00,#f1bd81)}\n.ls-desk[data-workspace=daw] .ls-token-pattern{color:light-dark(#0b6b62,#80ddd3)}\n/* Shared mixer console. Tokens resolve from an ancestor's --mixer-* override,\n   then the editor chrome's --editor-*, then light-dark() defaults. Live values\n   (--level, --peak, aria-pressed, data-clipped) are set by the app's script. */\n.mixer-console,.mixer-strip{\n  --_surface:var(--mixer-surface,var(--editor-raised,light-dark(#ffffff,#1f2724)));\n  --_well:var(--mixer-well,var(--editor-surface,light-dark(#edf1ee,#141a18)));\n  --_ink:var(--mixer-ink,var(--editor-ink,light-dark(#182620,#edf3ee)));\n  --_muted:var(--mixer-muted,var(--editor-muted,light-dark(#536259,#a6b5ab)));\n  --_border:var(--mixer-border,var(--editor-border,light-dark(#cbd5ce,#3b4941)));\n  --_accent:var(--mixer-accent,var(--editor-accent,light-dark(#246640,#b8f568)));\n  --_ok:var(--mixer-ok,light-dark(#2f9e5b,#5fd38a));\n  --_warn:var(--mixer-warn,light-dark(#b98f10,#f2d25c));\n  --_hot:var(--mixer-hot,light-dark(#c8453a,#ff6b5e));\n  --_mute:var(--mixer-mute,light-dark(#b7791f,#f0b44c));\n  --_solo:var(--mixer-solo,light-dark(#2b72ad,#79c3ff));\n  --_arm:var(--mixer-arm,light-dark(#c8453a,#ff6b5e));\n  --_latch:var(--mixer-latch,light-dark(#7453b8,#b69cff));\n  --_fader-height:var(--mixer-fader-height,150px);\n}\n.mixer-console{\n  display:flex;gap:6px;align-items:stretch;overflow-x:auto;padding:6px;\n  background:var(--_well);border:1px solid var(--_border);border-radius:8px;\n}\n.mixer-strip{\n  box-sizing:border-box;display:flex;flex-direction:column;align-items:stretch;gap:6px;\n  flex:0 0 auto;min-width:84px;margin:0;padding:8px 6px;\n  border:1px solid var(--_border);border-radius:6px;background:var(--_surface);color:var(--_ink);\n  font:11px/1.3 system-ui,sans-serif;\n}\n.mixer-strip *{box-sizing:border-box}\n/* Controls arrive as base-theme primitives: drop the form-field chrome a\n   slider or a strip button should not carry. */\n.mixer-strip .primitive-input,.mixer-strip .primitive-select{margin:0;gap:2px;min-width:0}\n.mixer-strip input[type=range]{padding:0;border:0;border-radius:0;background:none;box-shadow:none;min-width:0}\n.mixer-strip[data-mixer-role=bus]{border-top:3px solid var(--_solo)}\n.mixer-strip[data-mixer-role=master]{\n  border-top:3px solid var(--_accent);position:sticky;right:0;margin-left:auto;\n  /* The solid shadow covers the console's padding, where strips scrolling\n     under the pinned master would otherwise peek out. */\n  box-shadow:7px 0 0 var(--_well),-8px 0 8px -8px rgb(0 0 0/.4);\n}\n.mixer-header{display:flex;flex-wrap:wrap;align-items:baseline;gap:2px 5px;min-width:0}\n.mixer-number{color:var(--_muted);font-variant-numeric:tabular-nums}\n.mixer-name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600}\n.mixer-layout{flex:0 0 auto;padding:0 5px;border:1px solid var(--_border);border-radius:999px;color:var(--_muted);font-size:10px;line-height:15px}\n.mixer-handle{display:flex;justify-content:center;gap:2px}\n.mixer-slot :is(select,button,input){width:100%;max-width:100%;font-size:11px}\n/* Routing, the insert chain, sends, badges and the automation mode sit in\n   signal order under the name, one dense row or card each. They take the\n   strip's width rather than setting it, so a long effect or bus name\n   ellipsizes instead of widening its strip. */\n:is(.mixer-route,.mixer-inserts,.mixer-sends,.mixer-assign,.mixer-automation){contain:inline-size;min-width:0}\n:is(.mixer-route,.mixer-automation,.mixer-send) :is(select,input){width:100%;max-width:100%;font-size:11px}\n.mixer-strip :is(.mixer-route,.mixer-automation,.mixer-send) :is(.primitive-select__label,.primitive-input__label){font-size:10px;font-weight:600;color:var(--_muted)}\n:is(.mixer-route,.mixer-automation) select{min-height:20px;padding:1px 3px;border:1px solid var(--_border);border-radius:3px;background:var(--_well);color:var(--_ink)}\n.mixer-inserts,.mixer-sends{display:flex;flex-direction:column;gap:2px}\n.mixer-insert{\n  display:flex;align-items:center;gap:3px;min-height:20px;padding:1px 2px 1px 6px;\n  border:1px solid var(--_border);border-radius:3px;background:var(--_well);box-shadow:inset 3px 0 0 var(--_accent);\n}\n.mixer-insert-name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.mixer-insert>:not(.mixer-insert-name){flex:0 0 auto;margin:0}\n.mixer-insert :is(button,.primitive-action){\n  min-width:22px;min-height:18px;margin:0;padding:1px 4px;border:1px solid var(--_border);border-radius:3px;\n  background:var(--_surface);color:var(--_ink);font:600 10px/1 system-ui,sans-serif;cursor:pointer;\n}\n.mixer-insert :is(button,.primitive-action)[aria-pressed=true]{border-color:var(--_accent);color:var(--_accent)}\n.mixer-insert[data-bypassed=true]{box-shadow:none;border-style:dashed}\n.mixer-insert[data-bypassed=true] .mixer-insert-name{color:var(--_muted);text-decoration:line-through}\n.mixer-send{display:flex;flex-direction:column;gap:2px;padding:2px 4px 3px;border:1px solid var(--_border);border-radius:3px;background:var(--_well)}\n.mixer-send-head{display:flex;align-items:center;gap:4px}\n.mixer-send-bus{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.mixer-send-tap{flex:0 0 auto;padding:0 4px;border:1px solid var(--_border);border-radius:999px;color:var(--_muted);font-size:9px;line-height:13px;text-transform:uppercase;letter-spacing:.04em}\n.mixer-send[data-mixer-tap=pre] .mixer-send-tap{border-color:var(--_warn);color:var(--_ink)}\n.mixer-send input[type=range]{display:block;width:100%;margin:0;accent-color:var(--_solo)}\n.mixer-assign{display:flex;flex-wrap:wrap;gap:3px}\n.mixer-badge{\n  max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:0 5px;\n  border:1px solid var(--_border);border-left-width:3px;border-radius:3px;font-size:10px;line-height:15px;\n}\n.mixer-badge[data-mixer-badge=group]{border-left-color:var(--_accent)}\n.mixer-badge[data-mixer-badge=vca]{border-left-color:var(--_solo)}\n.mixer-badge-kind{color:var(--_muted);font-size:9px;text-transform:uppercase;letter-spacing:.04em}\n/* The automation select is tinted by the option it has selected, so the\n   colour is the control's own state: read, touch, latch or write. */\n.mixer-automation select{border-left:3px solid var(--_auto,var(--_border))}\n.mixer-automation:has(option[value=read]:checked){--_auto:var(--_ok)}\n.mixer-automation:has(option[value=touch]:checked){--_auto:var(--_warn)}\n.mixer-automation:has(option[value=latch]:checked){--_auto:var(--_latch)}\n.mixer-automation:has(option[value=write]:checked){--_auto:var(--_hot)}\n.mixer-pan{position:relative;padding:0 2px}\n.mixer-pan input[type=range]{display:block;width:100%;margin:0;accent-color:var(--_accent)}\n.mixer-pan::after{content:\"\";position:absolute;left:50%;top:2px;bottom:2px;border-left:1px dashed var(--_border);pointer-events:none}\n.mixer-buttons{display:flex;justify-content:center;gap:4px}\n.mixer-strip .mixer-buttons>*{\n  min-width:26px;min-height:24px;margin:0;padding:2px 6px;border:1px solid var(--_border);border-radius:4px;\n  background:var(--_well);color:var(--_ink);font:600 11px/1 system-ui,sans-serif;cursor:pointer;\n}\n.mixer-strip .mixer-buttons>:hover:not(:disabled){border-color:var(--_accent)}\n.mixer-strip .mixer-buttons>:disabled{opacity:.45;cursor:default}\n.mixer-strip .mixer-buttons>[data-mixer-button=mute][aria-pressed=true]{background:var(--_mute);border-color:var(--_mute);color:#141414}\n.mixer-strip .mixer-buttons>[data-mixer-button=solo][aria-pressed=true]{background:var(--_solo);border-color:var(--_solo);color:#0e1a24}\n.mixer-strip .mixer-buttons>[data-mixer-button=arm][aria-pressed=true]{background:var(--_arm);border-color:var(--_arm);color:#fff}\n/* Bays sit at the foot of the strip so faders line up across a console\n   whatever slots each strip carries above them. */\n.mixer-fader-bay{display:flex;justify-content:center;align-items:stretch;gap:4px;height:var(--_fader-height);margin-top:auto}\n/* Marks follow the thumb's centre, which travels 8px in from each end. */\n.mixer-scale{position:relative;width:22px;margin:0;padding:0;list-style:none;color:var(--_muted);font:9px/1 system-ui,sans-serif;font-variant-numeric:tabular-nums}\n.mixer-scale li{position:absolute;right:0;bottom:calc(8px + var(--at,0)*(100% - 16px));transform:translateY(50%);white-space:nowrap}\n.mixer-fader,.mixer-fader>.primitive-input{display:flex;justify-content:center;height:100%}\n.mixer-fader input[type=range]{writing-mode:vertical-lr;direction:rtl;width:24px;height:100%;margin:0;accent-color:var(--_accent)}\n.mixer-meter{display:flex;gap:1px;height:100%;padding:1px;background:var(--_well);border:1px solid var(--_border);border-radius:2px}\n/* The gradient is painted at full height and the unlit part covered, so a\n   bar's colour always reads its absolute level (bands at -18 and -6 dB). */\n.mixer-meter-bar{\n  position:relative;flex:0 0 5px;height:100%;overflow:hidden;\n  background:linear-gradient(to top,var(--_ok) 0 70%,var(--_warn) 70% 90%,var(--_hot) 90%);\n}\n.mixer-meter:has(>:nth-child(9)) .mixer-meter-bar{flex-basis:3px}\n.mixer-meter-bar::before{content:\"\";position:absolute;inset:0 0 auto;height:calc((1 - var(--level,0))*100%);background:var(--_well);opacity:.9}\n.mixer-meter-bar::after{content:\"\";position:absolute;left:0;right:0;height:2px;bottom:calc(var(--peak,0)*100% - 2px);background:var(--_ink)}\n.mixer-meter-bar[data-clipped=true]{box-shadow:inset 0 3px 0 var(--_hot)}\n.mixer-readout{text-align:center;color:var(--_muted);font-variant-numeric:tabular-nums}\n.mixer-strip :is(button,select,input):focus-visible{outline:2px solid var(--_accent);outline-offset:2px}\n@media(pointer:coarse){\n  .mixer-strip{min-width:104px}\n  .mixer-strip .mixer-buttons>*{min-width:30px;min-height:40px}\n}\n@media(pointer:coarse){\n  .mixer-insert,:is(.mixer-route,.mixer-automation) select{min-height:36px}\n  .mixer-insert :is(button,.primitive-action){min-width:32px;min-height:32px}\n}\n/* Audio's standalone DAW composes the same controls used by Performance. */\nbody:has(.ls-desk[data-workspace=daw]) main:has(.ls-desk[data-workspace=daw]),\n.primitive-page:has(.ls-desk[data-workspace=daw]){max-width:none;margin:0;padding:0;}\n.primitive-app-shell__content:has(.ls-desk[data-workspace=daw]){--cre8-page-gutter-x:0px;--cre8-page-gutter-y:0px;--cre8-page-max-width:100%}\n.ls-render-tools{border-top:1px solid var(--cre8-view-border);background:var(--cre8-view-surface);color:var(--cre8-view-fg)}\n.ls-render-tools>summary{padding:10px 16px;cursor:pointer;font-weight:600;color:var(--cre8-view-fg-muted)}\n.ls-render-tools[open]>summary{border-bottom:1px solid var(--cre8-view-border-subtle)}\n.ls-render-tools>:not(summary){padding:12px 16px 20px;max-width:960px}\n.ls-desk[data-workspace=daw] .ls-quiet-help{margin:8px 0;font-size:11px;color:var(--daw-muted);}\n.ls-quiet-help>summary{cursor:pointer;padding:4px 0;}\n.ls-desk[data-workspace=daw][data-daw-view=visual] .ls-draft-bar,\n.ls-desk[data-workspace=daw][data-daw-view=visual] .ls-preset-row,\n.ls-desk[data-workspace=daw][data-daw-view=visual] .ls-compose{display:none;}\n.ls-desk[data-workspace=daw] .ls-eyebrow,.ls-daw-library>.ls-daw-caption,.ls-daw-library>p{display:none;}\n.ls-desk[data-workspace=daw]{--daw-well:light-dark(#eef1ee,#0b0f0e);--daw-bg:light-dark(#fafbfa,#111614);--daw-panel:light-dark(#f3f5f3,#181e1c);--daw-control:light-dark(#ffffff,#212926);--daw-control-hi:light-dark(#e8ede9,#2b3531);--daw-border:light-dark(rgba(16,24,20,.12),rgba(255,255,255,.08));--daw-border-strong:light-dark(rgba(16,24,20,.22),rgba(255,255,255,.15));--daw-grid:light-dark(rgba(16,24,20,.07),rgba(255,255,255,.05));--daw-ink:var(--editor-ink);--daw-soft:light-dark(#3a4540,#c5cfca);--daw-muted:var(--editor-muted);--daw-faint:var(--cre8-view-fg-faint);--daw-accent:var(--editor-accent);--daw-accent-ink:var(--editor-accent-ink);--daw-selected:var(--editor-selected);display:grid;grid-template-columns:185px minmax(0,1fr);gap:0;margin:0;padding:0;border:1px solid var(--daw-border);border-radius:8px;background:var(--daw-bg);color:var(--daw-ink);font:12px/1.5 system-ui}\n.ls-desk[data-workspace=daw]>header{grid-column:1/-1}\n.ls-desk[data-workspace=daw] h2{font-size:21px;margin:3px 0;letter-spacing:-.025em}.ls-desk[data-workspace=daw]>header p{display:none}.ls-desk[data-workspace=daw] .ls-eyebrow{font:9px ui-monospace,monospace;color:var(--daw-muted);letter-spacing:.12em}\n.ls-desk[data-workspace=daw] button,.ls-desk[data-workspace=daw] select,.ls-desk[data-workspace=daw] input[type=number]{border-radius:4px;border-color:var(--daw-border-strong);background:var(--daw-control);padding:7px 10px;font-size:11px}\n.ls-desk[data-workspace=daw] [data-ls=start],.ls-desk[data-workspace=daw] [data-ls=apply]{background:var(--editor-accent,#c4ef83);color:var(--editor-accent-ink,#142819);border-color:var(--editor-accent,#c4ef83)}\n.ls-desk[data-workspace=daw] .ls-menu-bar{grid-column:1/-1;grid-row:2}\n.ls-desk[data-workspace=daw] .ls-menu-bar details{margin:0}.ls-desk[data-workspace=daw] .ls-menu-bar>span{color:var(--daw-muted)}\n.ls-desk[data-workspace=daw] .ls-transport{grid-column:1/-1;grid-row:3;border-radius:0;margin:0;padding:12px 20px;border-bottom:1px solid var(--daw-border);background:var(--daw-control);min-height:64px}\n.ls-desk[data-workspace=daw] .ls-transport output{padding:10px 16px;border:1px solid var(--daw-border-strong);border-radius:4px;background:var(--daw-well);font:12px ui-monospace,monospace;color:var(--daw-ink);min-width:240px}\n.ls-desk[data-workspace=daw] .ls-daw-tabs{grid-column:1/-1;grid-row:4}\n.ls-daw-tabs [data-daw-mixer]{margin-left:auto}\n.ls-desk[data-workspace=daw] .ls-columns,.ls-desk[data-workspace=daw] .ls-mix{display:contents}\n.ls-desk[data-workspace=daw] .ls-code{grid-column:2;grid-row:5;display:flex;flex-direction:column;min-height:440px;min-width:0;overflow:visible;padding:14px 18px;background:var(--daw-bg)}\n.ls-desk[data-workspace=daw] .ls-code>nav{display:none}.ls-desk[data-workspace=daw] .ls-draft-bar{font-size:10px;margin:0 0 12px}\n.ls-desk[data-workspace=daw] .ls-arrangement{order:-1;flex-shrink:0;margin:0 0 14px;border-color:var(--daw-border-strong);border-radius:4px}\n.ls-desk[data-workspace=daw] .ls-arrangement>div:first-child{background:var(--daw-control);font-size:11px;align-items:center;flex-wrap:wrap}\n.ls-desk[data-workspace=daw] .ls-arrangement [data-ls=arrangement]{overflow:auto;min-height:235px;background:repeating-linear-gradient(90deg,transparent 0,transparent 95px,var(--daw-grid) 95px,var(--daw-grid) 96px),var(--daw-well)}\n.ls-desk[data-workspace=daw] .ls-arrangement svg{height:235px;width:calc(100% * var(--daw-zoom,1));min-width:calc(760px * var(--daw-zoom,1));max-width:none}\n.ls-desk[data-workspace=daw] .ls-daw-only{display:flex}.ls-timeline-zoom{align-items:center;gap:7px;font-size:10px;margin-left:auto}.ls-timeline-zoom input{width:80px;accent-color:var(--daw-accent)}.ls-timeline-zoom output{min-width:35px}\n.ls-desk[data-workspace=daw]:not([data-daw-view=tracks]) .ls-arrangement{display:none}\n.ls-desk[data-workspace=daw][data-daw-view=tracks] .ls-draft-bar,.ls-desk[data-workspace=daw][data-daw-view=tracks] [data-ls-pane=session]{display:none}\n.ls-desk[data-workspace=daw][data-daw-view=tracks] [data-ls-pane=code]{display:contents}\n.ls-desk[data-workspace=daw][data-daw-view=tracks] [data-ls-pane=code]>label,.ls-desk[data-workspace=daw][data-daw-view=tracks] .ls-editor-frame,.ls-desk[data-workspace=daw][data-daw-view=tracks] .ls-editor-footer{display:none}\n.ls-desk[data-workspace=daw] .ls-preset-row{order:2;font-size:10px;margin-top:6px;padding:6px 0}.ls-desk[data-workspace=daw] .ls-compose{order:3;font-size:11px;margin:8px 0 0}.ls-desk[data-workspace=daw] [data-ls=status]{font-size:11px;min-height:20px;margin:4px 0}\n.ls-desk[data-workspace=daw] .ls-daw-library{grid-column:1;grid-row:5;border-right:1px solid var(--daw-border);padding:16px 12px;background:var(--daw-panel);min-width:0}\n.ls-daw-caption{font:9px ui-monospace,monospace;letter-spacing:.09em;color:var(--daw-muted)}.ls-daw-library h3{font-size:16px;margin:8px 0}.ls-daw-library p{font-size:10px;color:var(--daw-muted)}\n.ls-desk[data-workspace=daw] .ls-daw-library button{display:grid;grid-template-columns:22px 1fr;text-align:left;gap:2px 4px;width:100%;margin:6px 0;padding:6px 7px;font-size:10px;background:var(--daw-control);border-left:3px solid var(--track-color,#8eadbf)}\n.ls-daw-library button strong{grid-column:2;grid-row:1;font-size:12px;font-weight:500}.ls-daw-library button span{color:var(--daw-soft);font-size:9px}.ls-daw-library button span:first-child{grid-column:1;grid-row:1;align-self:center}.ls-daw-library button span:last-child{display:none}.ls-daw-library a{display:block;font-size:10px;margin-top:20px}\n.ls-desk[data-workspace=daw] .ls-channel-rack{grid-column:1/-1;grid-row:6;display:grid;grid-template-columns:1fr auto;gap:8px 16px;border-top:1px solid var(--daw-border);padding:14px 18px;background:var(--daw-panel);min-width:0}\n.ls-channel-rack>h3{margin:0;font-size:13px}.ls-desk[data-workspace=daw] .ls-channel-rack>p{grid-column:1;font-size:10px;margin:0;color:var(--daw-muted)}\n.ls-desk[data-workspace=daw] .ls-tempo{grid-column:2;grid-row:1/3;align-self:center;font-size:11px}.ls-desk[data-workspace=daw] .ls-tempo input{width:66px}\n.ls-desk[data-workspace=daw] .ls-lanes{grid-column:1/-1;display:grid;grid-template-columns:repeat(6,minmax(90px,1fr));gap:8px;margin:4px 0;overflow:auto}\n/* Lanes are shared mixer strips (view-lib mixer_console): the DAW sets their palette and each lane's track colour. */\n.ls-desk[data-workspace=daw]{--mixer-surface:var(--daw-panel);--mixer-well:var(--daw-well);--mixer-ink:var(--daw-ink);--mixer-muted:var(--daw-muted);--mixer-border:var(--daw-border-strong);--mixer-fader-height:118px}\n.ls-desk[data-workspace=daw] .ls-lane-row{--mixer-accent:var(--track-color,#b8d699);min-width:90px;padding:10px;border-top:3px solid var(--track-color,#8eadbf);border-radius:4px}\n.ls-desk[data-workspace=daw] .ls-lane-row .mixer-handle>.ls-channel-order{flex:1;margin:0}.ls-desk[data-workspace=daw] .ls-lane-row .mixer-readout output{font:10px ui-monospace,monospace;color:var(--daw-soft);text-align:center}\n.ls-desk[data-workspace=daw] .ls-lane-row .mixer-slot label{display:block;margin:0 0 2px;font-size:10px;color:var(--daw-muted)}\n.ls-desk[data-workspace=daw] .ls-lane-row select{padding:6px 4px;font-size:10px}.ls-desk[data-workspace=daw] .ls-lane-row .mixer-slot>.primitive-text{display:block;font-size:10px;padding:6px 0;color:var(--daw-muted)}\n.ls-desk[data-workspace=daw] [data-ls=mix]{grid-column:2;justify-self:end;font-size:11px}\n.ls-desk[data-workspace=daw][data-daw-mixer=false] .ls-channel-rack{display:none}\n.ls-desk[data-workspace=daw] .ls-mix>details,.ls-desk[data-workspace=daw] .ls-clock-boundary{display:none}\n.ls-desk[data-workspace=daw][data-daw-view=midi] .ls-code{display:none}.ls-desk[data-workspace=daw][data-daw-view=midi] .ls-midi{display:block;grid-column:2;grid-row:5;padding:20px;margin:0;min-width:0;background:var(--daw-bg)}\n.ls-desk[data-workspace=daw] .ls-midi pre{padding:14px;border:1px solid var(--daw-border-strong);border-radius:4px;background:var(--daw-well)}.ls-desk[data-workspace=daw] .ls-midi p{font-size:11px}\n.ls-desk[data-workspace=daw] .ls-project-bar{grid-column:1/-1;grid-row:7;padding:8px 16px;margin:0;border:0;border-top:1px solid var(--daw-border);font-size:10px}.ls-desk[data-workspace=daw] .ls-project-bar>span:last-child{display:none}\n.ls-desk[data-workspace=daw]>[data-cre8-island]{display:none}\n[data-ls-channel=drums],[data-daw-track=drums]{--track-color:#e6b276}[data-ls-channel=bass],[data-daw-track=bass]{--track-color:#b7d98d}[data-ls-channel=pads],[data-daw-track=pads]{--track-color:#85bedc}[data-ls-channel=melody],[data-daw-track=melody]{--track-color:#b9a0df}[data-ls-channel=arp],[data-daw-track=arp]{--track-color:#7dd0b9}[data-ls-channel=reverb],[data-daw-track=reverb]{--track-color:#a6accc}\n.ls-desk[data-workspace=daw] .ls-lane-row[data-selected=true],.ls-desk[data-workspace=daw] .ls-daw-library [aria-pressed=true]{outline:1px solid var(--track-color);outline-offset:-1px;background:var(--daw-control-hi)}\n@media(max-width:800px){.ls-desk[data-workspace=daw]{grid-template-columns:145px minmax(0,1fr)}.ls-desk[data-workspace=daw] .ls-lanes{grid-template-columns:repeat(6,110px)}.ls-desk[data-workspace=daw] .ls-code{padding:12px}.ls-desk[data-workspace=daw] .ls-transport output{font-size:10px;min-width:0}.ls-daw-library p{display:none}}\n@media(max-width:560px){.ls-desk[data-workspace=daw]{grid-template-columns:minmax(0,1fr)}.ls-desk[data-workspace=daw] .ls-daw-library{display:none}.ls-desk[data-workspace=daw] .ls-code,.ls-desk[data-workspace=daw][data-daw-view=midi] .ls-midi{grid-column:1}.ls-desk[data-workspace=daw]>header{flex-direction:row}.ls-desk[data-workspace=daw] .ls-transport{padding:10px}.ls-desk[data-workspace=daw] .ls-transport output{flex-basis:100%}.ls-desk[data-workspace=daw] .ls-channel-rack{padding:12px}.ls-desk[data-workspace=daw] .ls-menu-bar>span{display:none}.ls-desk[data-workspace=daw] .ls-tempo{grid-column:1;grid-row:auto}.ls-desk[data-workspace=daw] .ls-channel-rack>p{grid-column:1/-1}.ls-desk[data-workspace=daw] .ls-arrangement>div:first-child{align-items:start}.ls-timeline-zoom{margin:0}}\n.ls-piano{display:none}\n.ls-desk[data-workspace=daw][data-daw-view=piano] .ls-piano{display:block;order:-1;min-width:0}\n.ls-desk[data-workspace=daw][data-daw-view=piano] [data-ls-pane]{display:none!important}\n.ls-piano header{flex-wrap:wrap;justify-content:start;gap:12px;margin-bottom:10px}.ls-piano header>div{margin-right:auto}.ls-piano h3{margin:4px 0}.ls-piano label{font-size:10px;color:var(--daw-soft)}.ls-piano select{margin-left:6px}\n.ls-piano-scroll{overflow:auto;height:300px;border:1px solid var(--daw-border-strong);border-radius:4px;background:var(--daw-well);overscroll-behavior:contain}\n.ls-piano-grid{position:relative;min-width:820px;height:0;touch-action:pan-x pan-y}\n.ls-piano-key{position:absolute;left:0;width:100%;height:20px;border-bottom:1px solid var(--daw-border);background:var(--daw-panel);color:var(--daw-soft);pointer-events:none;font:10px/20px ui-monospace,monospace;padding-left:5px}\n.ls-piano-key[data-black=true]{background:var(--daw-bg);color:var(--daw-muted)}\n.ls-piano-beat{position:absolute;top:0;bottom:0;width:1px;background:#526b7c;pointer-events:none}.ls-piano-beat span{position:sticky;top:0;background:var(--daw-panel);color:var(--daw-soft);font:9px ui-monospace,monospace;padding:2px}\n.ls-desk[data-workspace=daw] .ls-piano-note{position:absolute;height:18px;border:1px solid var(--daw-accent);border-radius:3px;padding:0 5px;overflow:hidden;white-space:nowrap;text-align:left;font:10px/16px ui-monospace,monospace;background:color-mix(in srgb,var(--track-color,var(--daw-accent)) 80%,var(--daw-panel));color:#152116;touch-action:none;cursor:grab;min-width:5px}\n.ls-desk[data-workspace=daw] .ls-piano-note[aria-pressed=true]{background:color-mix(in srgb,var(--track-color,var(--daw-accent)) 55%,#fff);outline:2px solid var(--daw-soft);outline-offset:1px;z-index:2}.ls-piano-note::after{content:'';position:absolute;right:0;top:0;bottom:0;width:5px;background:var(--daw-grid);cursor:ew-resize}\n.ls-piano-inspector{display:flex;flex-wrap:wrap;align-items:end;gap:8px;margin:12px 0}.ls-piano-inspector input{display:block;width:85px!important;margin-top:4px}.ls-piano footer{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.ls-piano footer span{font-size:10px;color:var(--daw-soft)}.ls-piano>p{font-size:11px}\n.ls-desk[data-workspace=daw][data-daw-view=clips] .ls-piano{display:block;order:-1;min-width:0}\n.ls-desk[data-workspace=daw][data-daw-view=clips] [data-ls-pane],.ls-desk[data-workspace=daw][data-daw-view=clips] .ls-piano-scroll,.ls-desk[data-workspace=daw][data-daw-view=clips] .ls-piano-inspector,.ls-desk[data-workspace=daw][data-daw-view=clips] .ls-piano-hints{display:none!important}\n.ls-clip-editor{margin:12px 0 16px}.ls-clip-scroll{overflow:auto;border:1px solid var(--daw-border-strong);border-radius:4px;background:var(--daw-well)}.ls-clip-grid{position:relative;height:98px;min-width:620px;background:repeating-linear-gradient(90deg,transparent 0,transparent calc(25% - 1px),var(--daw-control-hi) calc(25% - 1px),var(--daw-control-hi) 25%)}\n.ls-desk[data-workspace=daw] .ls-clip-region{position:absolute;top:16px;height:64px;min-width:0;background:var(--daw-control-hi);border:1px solid var(--daw-soft);border-top:3px solid var(--track-color,var(--daw-accent));color:var(--daw-ink);border-radius:4px;text-align:left;padding:8px 10px;overflow:hidden;white-space:nowrap;touch-action:none;cursor:grab}.ls-clip-region small{display:block;font-size:10px;color:var(--daw-soft)}.ls-clip-region[data-empty=true]{background:var(--daw-panel);border-color:var(--daw-border);color:var(--daw-muted)}\n.ls-clip-selection{position:absolute;top:11px;height:74px;border:2px solid var(--daw-accent);pointer-events:none;border-radius:5px;z-index:2}.ls-clip-controls{display:flex;flex-wrap:wrap;gap:8px;align-items:end}.ls-clip-controls input{display:block;width:105px!important;margin-top:4px}.ls-clip-controls label{font-size:10px}.ls-clip-editor>p{font-size:10px;margin:8px 0;color:var(--daw-soft)}.ls-desk[data-workspace=daw][data-daw-view=clips] .ls-clip-grid{height:160px}.ls-desk[data-workspace=daw][data-daw-view=clips] .ls-clip-region{top:28px;height:100px}.ls-desk[data-workspace=daw][data-daw-view=clips] .ls-clip-selection{top:23px;height:110px}\n.ls-desk[data-workspace=daw] .ls-clip-region{display:flex;flex-direction:column;justify-content:flex-start;user-select:none}\n.ls-clip-preview{position:absolute;left:10px;right:10px;top:42px;bottom:5px;overflow:hidden;pointer-events:none}.ls-clip-preview i{display:block;position:absolute;height:3px;min-width:2px;border-radius:1px;background:var(--track-color,var(--daw-accent))}.ls-desk[data-workspace=daw][data-daw-view=clips] .ls-clip-preview{top:48px;bottom:10px}\n/* Server-rendered instrument and phrase components share the Audio draft. */\n.ls-instrument-editor{display:none}.ls-desk[data-workspace=daw][data-daw-view=instruments] .ls-instrument-editor{display:block;order:-1}.ls-desk[data-workspace=daw][data-daw-view=instruments] [data-ls-pane]{display:none!important}\n.ls-instrument-fields{display:grid;grid-template-columns:repeat(auto-fit,minmax(145px,1fr));gap:12px;margin:14px 0}.ls-instrument-fields label{display:flex;flex-direction:column;gap:5px;font-size:11px}.ls-instrument-fields input:not([type=checkbox]),.ls-instrument-fields select{width:100%;min-width:0;box-sizing:border-box;background:var(--daw-panel);color:var(--daw-ink);border:1px solid var(--daw-border-strong);border-radius:4px;padding:8px}.ls-instrument-fields input[type=checkbox]{width:auto;margin:0 4px 0 0}.ls-instrument-editor details{padding:12px;border:1px solid var(--daw-border-strong);border-radius:5px}.ls-instrument-editor p{color:var(--daw-soft)}\n.ls-arrange-controls{display:flex;flex-wrap:wrap;gap:8px;align-items:center;padding:12px}.ls-arrange-controls input{width:65px}.ls-arrange-controls [role=status]{flex-basis:100%;font-size:11px;color:var(--daw-soft)}\n.ls-track-timeline{display:flex;flex-direction:column;min-width:calc(650px * var(--daw-zoom,1));padding:8px}.ls-track-phrase-row{display:flex;gap:8px;align-items:center;height:64px}.ls-track-phrase-row>strong{width:60px;font-size:11px;color:var(--daw-soft)}.ls-track-phrases{position:relative;flex:1;height:56px}.ls-desk[data-workspace=daw] .ls-track-phrases button{position:absolute;top:3px;height:50px;box-sizing:border-box;border:3px solid var(--daw-border);background:var(--daw-control-hi);color:var(--daw-ink);touch-action:none;cursor:grab;z-index:1;text-align:left;user-select:none}.ls-track-phrases small{display:block;font-size:9px}.ls-track-phrases [aria-pressed=true]{outline:2px solid var(--daw-accent);outline-offset:-3px;z-index:3!important}.ls-desk[data-workspace=daw] .ls-track-phrases [data-arrange-empty=true]{background:var(--daw-panel);color:var(--daw-muted)}\n.ls-desk[data-workspace=daw] .ls-arrangement svg{height:235px}.ls-desk[data-workspace=daw] .ls-daw-library{display:flex;flex-direction:column}.ls-daw-library>p,.ls-daw-library>h3,.ls-daw-library>.ls-daw-caption{order:-1}.ls-daw-library>a{order:10}.ls-channel-order{display:flex;gap:4px;align-items:center;margin-bottom:6px}.ls-channel-order [data-channel-drag]{cursor:grab;touch-action:none}.ls-desk[data-workspace=daw] .ls-channel-order button{padding:3px 7px}.ls-channel-order [data-channel-drag]{margin-right:auto}\n@media(max-width:560px){.ls-desk[data-workspace=daw] .ls-daw-library{display:none}.ls-instrument-fields{grid-template-columns:repeat(2,minmax(0,1fr))}}\n\n.ls-instrument-editor header{display:block}.ls-lane-row[data-drop-target=true]{outline:2px solid var(--daw-accent);outline-offset:2px}\n/* Persistent clip and envelope components are rendered by Audio. */\n.ls-session-editor{display:none}.ls-desk[data-track-editor=true][data-daw-view=tracks] .ls-session-editor,.ls-desk[data-track-editor=true][data-daw-view=flow] .ls-session-editor{display:block;order:-1;min-width:0}.ls-desk[data-track-editor=true][data-daw-view=tracks] .ls-arrangement{display:none}.ls-desk[data-daw-view=flow] [data-ls-pane]{display:none!important}.ls-session-flow{display:none}.ls-desk[data-daw-view=flow] .ls-session-flow{display:block}.ls-desk[data-daw-view=flow] .ls-session-timeline{display:none}.ls-session-editor>div>header{align-items:center}.ls-session-editor p{font-size:11px}.ls-session-scroll{overflow:auto;max-height:660px;border:1px solid var(--daw-border-strong);border-radius:5px}.ls-session-lanes{min-width:650px}.ls-session-track{border-bottom:1px solid var(--daw-border-strong);background:var(--daw-bg);padding:8px}.ls-session-track>header{display:flex;gap:8px;justify-content:flex-start;min-height:36px}.ls-session-track header label{display:flex;align-items:center;gap:5px;margin-left:auto;white-space:nowrap}.ls-session-track input[type=number]{width:58px}.ls-session-track header small{max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--daw-muted)}.ls-session-lane{position:relative;height:68px;background:repeating-linear-gradient(90deg,var(--daw-bg) 0,var(--daw-bg) calc(12.5% - 1px),var(--daw-control-hi) calc(12.5% - 1px),var(--daw-control-hi) 12.5%)}.ls-session-lane [data-session-clip]{position:absolute;top:6px;height:54px;min-width:12px;text-align:left;white-space:nowrap;overflow:hidden;touch-action:none;border:2px solid var(--daw-soft);background:var(--daw-control-hi);user-select:none;cursor:grab}.ls-session-lane small{display:block;font-size:9px;color:var(--daw-soft)}.ls-session-lane [aria-pressed=true]{outline:2px solid var(--daw-accent);z-index:3}.ls-session-lane [data-clip-resize]{position:absolute;right:0;top:0;height:100%;width:9px;background:#b5d08e77;cursor:ew-resize;touch-action:none}.ls-envelope{display:block;width:100%;height:92px;background:var(--daw-well);touch-action:none;overflow:visible}.ls-envelope path{fill:#92c47844;stroke:#b7e390;stroke-width:1.5;vector-effect:non-scaling-stroke}.ls-envelope circle{fill:var(--daw-accent);stroke:#172f2a;stroke-width:2;cursor:grab}.ls-envelope text{fill:#a8c49d;font:10px system-ui;pointer-events:none}.ls-envelope-fields,.ls-session-fields{display:flex;gap:8px;align-items:end;flex-wrap:wrap;margin:12px 0}.ls-session-fields label,.ls-envelope-fields label{font-size:10px;display:flex;flex-direction:column;gap:4px}.ls-session-fields input,.ls-envelope-fields input{width:90px;max-width:100%;box-sizing:border-box}.ls-session-fields select{max-width:200px}.ls-clip-detail{padding:12px;border:1px solid var(--daw-border-strong);border-radius:5px;margin-top:12px}.ls-clip-note-list{display:flex;gap:4px;flex-wrap:wrap;max-height:110px;overflow:auto}.ls-session-editor[aria-busy=true]{opacity:.75}.ls-desk[data-track-session=true] .ls-legacy-patch,.ls-desk[data-track-session=true] .ls-lane-row:not([data-ls-channel=reverb]){display:none}.ls-desk[data-track-session=true] .ls-daw-library [data-daw-track]:not([data-daw-track=reverb]){display:none}.ls-desk[data-track-session=true] .ls-channel-rack .ls-lanes{display:flex}.ls-desk[data-track-session=true] .ls-lane-row[data-ls-channel=reverb]{min-width:160px}.ls-desk[data-track-session=true] [data-daw-view=piano],.ls-desk[data-track-session=true] [data-daw-view=clips]{display:none}.ls-desk[data-track-session=true] [data-daw-view=tracks] .ls-draft-bar{display:flex}.ls-flow-route{display:flex;flex-wrap:wrap;gap:10px;align-items:center;border:1px solid var(--daw-border-strong);border-radius:5px;padding:16px;margin:10px 0}.ls-flow-route span{padding:9px;background:var(--daw-control);border-radius:4px}.ls-flow-route i{color:var(--daw-accent)}.ls-flow-route small{display:block;font-size:9px;letter-spacing:.06em;text-transform:uppercase;color:var(--daw-muted)}.ls-flow-route em{display:block;font-style:normal;font-size:10px;color:var(--daw-soft)}.ls-flow-route>button{text-align:left}.ls-flow-route[data-flow-row=bus]{border-style:dashed}.ls-flow-route[data-flow-row=master]{border-color:var(--daw-accent)}.ls-flow-route .ls-flow-send{margin-left:auto;background:none;border:1px dashed var(--daw-soft)}.ls-flow-notes{margin:10px 0;padding-left:18px;font-size:11px;color:#f0c98a}.ls-flow-route>*{max-width:100%;box-sizing:border-box}.ls-flow-route label{display:block;padding:9px;background:var(--daw-control);border-radius:4px;font-size:11px}.ls-flow-route :is(input,select){max-width:100%;min-width:0}.ls-flow-route input[type=number]{width:76px}.ls-flow-route span:has(>[data-insert-params]){display:grid;grid-template-columns:repeat(4,auto);gap:4px}.ls-flow-route span:has(>[data-insert-params])>:is(small,strong,input){grid-column:1/-1}.ls-flow-route span>input{width:100%;box-sizing:border-box}.ls-flow-route span>button{padding:3px 6px;font-size:10px}.ls-flow-route span:has(>[data-insert-action=bypass][aria-pressed=true])>strong{text-decoration:line-through;opacity:.65}.ls-desk[data-track-session=true][data-daw-view=tracks] .ls-draft-bar{display:flex}\n@media(max-width:560px){.ls-session-fields input{width:76px}.ls-session-fields select{max-width:160px}.ls-envelope-fields{align-items:end}.ls-session-editor h3{font-size:15px}.ls-flow-route{gap:6px;padding:10px}}\n\n/* Presence stays above the DAW header and its navigation link. */\n.primitive-room-scope:has([data-live-score]) > .primitive-room-scope__viewers{position:static!important;display:flex;width:max-content;margin:0 0 8px auto}\n\n/* The workspace shell gives transport and navigation a consistent hierarchy. */\n.ls-desk[data-workspace=daw]{border:0;border-radius:0;width:100%;min-height:100dvh;box-sizing:border-box;grid-template-rows:auto auto auto auto minmax(440px,1fr) auto auto;}\n/* The heading, menu bar and view tabs are the shared editor strips (identity, menu, modes); their padding, rule and type come from view-lib's editor chrome. */\n.ls-desk[data-workspace=daw] .ls-transport{gap:8px 12px;padding:12px;background:var(--editor-surface);color:var(--editor-ink);border-bottom-color:var(--editor-border)}\n.ls-desk[data-workspace=daw] .ls-transport button{min-height:40px;border-radius:6px}\n.ls-desk[data-workspace=daw] :is(#ls-prepare,#ls-start:not(:disabled)){background:var(--editor-accent);border-color:var(--editor-accent);color:var(--editor-accent-ink);font-weight:650}\n.ls-desk[data-workspace=daw] #ls-stop:not(:disabled){border-color:var(--daw-soft);color:var(--daw-ink)}\n.ls-desk[data-workspace=daw] .ls-transport #ls-export-state{color:var(--cre8-view-fg-muted);font-size:11px}\n.ls-desk[data-workspace=daw] .ls-transport output{padding:6px 9px;min-width:0;max-width:100%;overflow-wrap:anywhere;border-color:var(--daw-border);border-radius:6px;font-size:11px}\n.ls-desk[data-workspace=daw] .ls-transport-feedback [data-ls=status]{margin:2px 0 0;min-height:0;color:var(--cre8-view-fg-muted);font:12px/1.5 system-ui,sans-serif}\n.ls-desk[data-workspace=daw] .ls-transport-feedback [data-ls=status][data-error=true]{color:var(--cre8-view-danger,#ffb4a6)}\n.ls-desk[data-workspace=daw] .ls-daw-tabs{overflow:visible}\n.ls-desk[data-workspace=daw] .ls-daw-tabs button{white-space:normal}\n\n.ls-desk[data-workspace=daw] .ls-arrangement [data-ls=arrangement]:has(>p){min-height:96px;display:grid;align-items:center}\n.ls-desk[data-workspace=daw] a:focus-visible{outline:2px solid var(--daw-accent);outline-offset:3px}\n@media(max-width:720px){\n  .ls-desk[data-workspace=daw] .ls-daw-tabs[data-editor-strip]{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:3px}\n  .ls-desk[data-workspace=daw] .ls-daw-tabs button{min-width:0;min-height:44px;overflow-wrap:anywhere}\n  .ls-desk[data-workspace=daw] .ls-daw-tabs [data-daw-mixer]{margin-left:0}\n  .ls-desk[data-workspace=daw] .ls-transport{padding:12px;gap:8px}\n  .ls-desk[data-workspace=daw] .ls-transport output{flex-basis:auto}\n  .ls-desk[data-workspace=daw] .ls-live-badge{margin-left:0}\n}\n@media(max-width:420px){\n  .ls-desk[data-workspace=daw] .ls-daw-tabs[data-editor-strip]{grid-template-columns:repeat(3,minmax(0,1fr))}\n  .ls-desk[data-workspace=daw] .ls-transport #audio-session-transport .primitive-card__body{gap:6px}\n  .ls-desk[data-workspace=daw] .ls-transport button{padding:8px;font-size:11px}\n}\n/* Each parameter is one cell: its enable box names it, so the control's own label stays for assistive tech only. */\n.ls-instrument-fields .primitive-checkbox{margin:0 0 5px}.ls-instrument-fields .primitive-checkbox__label{flex-direction:row;align-items:center;gap:6px}\n.ls-instrument-fields .primitive-checkbox~:is(.primitive-select,.primitive-input)>label{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}\n.ls-instrument-fields label:has(>.primitive-input__required){flex-direction:row}\n/* The DAW fills the window: the editor and the mixer scroll inside their own regions, the transport and status strips stay put. */\n@media(min-width:900px) and (min-height:620px){\n  .ls-desk[data-workspace=daw][data-daw-shell=true]{height:100dvh;min-height:0;overflow:hidden;grid-template-rows:auto auto auto auto minmax(0,1fr) auto auto}\n  .ls-desk[data-workspace=daw][data-daw-shell=true] :is(.ls-daw-library,.ls-code,.ls-midi){min-height:0;overflow:auto;overscroll-behavior:contain}\n  .ls-desk[data-workspace=daw][data-daw-shell=true] .ls-channel-rack{max-height:34dvh;overflow:auto;overscroll-behavior:contain}\n  .ls-desk[data-workspace=daw][data-daw-shell=true] .ls-transport{display:grid;grid-template-columns:minmax(0,1fr) auto auto;grid-template-areas:\"controls time badge\" \"feedback feedback meter\";align-items:center;gap:6px 14px;padding:8px 12px}\n  .ls-desk[data-workspace=daw][data-daw-shell=true] .ls-transport>:first-child{grid-area:controls;min-width:0}\n  .ls-desk[data-workspace=daw][data-daw-shell=true] .ls-transport>.ls-daw-timecode{grid-area:time}\n  .ls-desk[data-workspace=daw][data-daw-shell=true] .ls-transport>[data-ls=live-state]{grid-area:badge}\n  .ls-desk[data-workspace=daw][data-daw-shell=true] .ls-transport>.ls-transport-feedback{grid-area:feedback;min-width:0}\n  .ls-desk[data-workspace=daw][data-daw-shell=true] .ls-transport>.ls-meter{grid-area:meter;min-width:160px}\n  /* The timecode shows position; the sentence clock stays in the document for assistive tech. */\n  .ls-desk[data-workspace=daw][data-daw-shell=true] .ls-transport>[data-ls=clock]{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}\n}\n.ls-daw-timecode{display:flex;align-items:baseline;gap:12px;padding:6px 14px;border:1px solid color-mix(in srgb,currentColor 18%,transparent);border-radius:8px;background:color-mix(in srgb,currentColor 6%,transparent);font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-variant-numeric:tabular-nums;white-space:nowrap}\n.ls-daw-timecode[hidden],.ls-daw-status[hidden]{display:none}\n.ls-daw-timecode [data-daw-time=bars]{font-size:22px;font-weight:600;letter-spacing:.02em}\n.ls-daw-timecode [data-daw-time=clock],.ls-daw-timecode [data-daw-time=bpm]{font-size:12px;opacity:.75}\n.ls-daw-status{display:flex;flex-wrap:wrap;gap:4px 18px;margin-left:auto;font-size:11px;font-variant-numeric:tabular-nums}\n.ls-daw-status [data-daw-status-cell]{display:inline-flex;gap:6px;align-items:baseline;white-space:nowrap}\n.ls-daw-status [data-daw-status-cell]>:first-child{opacity:.6;text-transform:uppercase;letter-spacing:.06em;font-size:10px}\n/* Ruler, playhead and envelope cursors are drawn over the session lanes and never take pointer input. */\n.ls-desk[data-daw-shell=true] .ls-session-lanes{position:relative}\n.daw-ruler{font:10px/1 ui-monospace,SFMono-Regular,Consolas,monospace;opacity:.8;pointer-events:none}\n.daw-ruler__bars{display:grid;grid-auto-flow:column;grid-auto-columns:1fr}\n.daw-ruler__bars>span{padding:3px 4px;border-left:1px solid color-mix(in srgb,currentColor 30%,transparent)}\n.daw-playhead{position:absolute;top:0;bottom:0;left:0;width:2px;margin-left:-1px;background:var(--cre8-accent,#f5a524);box-shadow:0 0 8px var(--cre8-accent,#f5a524);pointer-events:none;z-index:3;will-change:transform}\n.daw-playhead[hidden]{display:none}\n.daw-envelope-cursor{stroke:currentColor;stroke-width:1;opacity:.45;vector-effect:non-scaling-stroke}\n.daw-envelope-dot{stroke:var(--cre8-accent,#f5a524);stroke-width:9;stroke-linecap:round;vector-effect:non-scaling-stroke}\n.ls-desk[data-daw-shell=true] [data-session-lane] [data-session-clip]{opacity:calc(.35 + .65*var(--daw-env-gain,1));transition:opacity .1s linear}\n@media(prefers-reduced-motion:reduce){.ls-desk[data-daw-shell=true] [data-session-lane] [data-session-clip]{transition:none}}\n\n/* The transport sits on the shared editor surface in both light and dark themes. */\n.ls-desk[data-workspace=daw] .ls-transport .ls-live-badge{color:var(--editor-accent)}\n\n/* Links take the shell accent so they read in both themes. */\n.ls-desk[data-workspace=daw] a{color:var(--daw-accent)}\n\n/* View tabs read as tabs: an underline marks the open view, and the mixer toggle is a chip. */\n.ls-desk[data-workspace=daw] .ls-daw-tabs{gap:2px;padding:0 8px;background:var(--daw-panel);border-bottom:1px solid var(--daw-border)}\n.ls-desk[data-workspace=daw] .ls-daw-tabs button{min-height:0;padding:11px 12px 9px;border:0;border-bottom:2px solid transparent;border-radius:0;background:transparent;color:var(--daw-muted);font-weight:500}\n.ls-desk[data-workspace=daw] .ls-daw-tabs button:hover{color:var(--daw-ink);background:var(--editor-hover)}\n.ls-desk[data-workspace=daw] .ls-daw-tabs button[aria-pressed=true]{color:var(--daw-ink);border-bottom-color:var(--daw-accent);background:transparent}\n.ls-desk[data-workspace=daw] .ls-daw-tabs button[data-daw-mixer]{align-self:center;margin:6px 4px 6px auto;padding:5px 12px;border:1px solid var(--daw-border-strong);border-radius:999px}\n.ls-desk[data-workspace=daw] .ls-daw-tabs button[data-daw-mixer][aria-pressed=true]{border-color:var(--daw-accent);background:var(--daw-selected)}\n\n/* The transport is one control cluster; a control that cannot run yet reads as disabled. */\n.ls-desk[data-workspace=daw] #audio-session-transport{background:transparent;border:0;padding:0;box-shadow:none}\n.ls-desk[data-workspace=daw] #audio-session-transport .primitive-card__body{display:flex;flex-wrap:wrap;align-items:center;gap:6px;padding:0}\n.ls-desk[data-workspace=daw] .ls-transport button{min-height:34px;padding:0 14px;border-radius:8px;border:1px solid var(--daw-border-strong);background:var(--daw-control);color:var(--daw-ink);font-weight:550}\n.ls-desk[data-workspace=daw] .ls-transport button:disabled{opacity:.42;cursor:not-allowed}\n.ls-desk[data-workspace=daw] .ls-transport :is(#ls-start,#ls-stop)::before{display:inline-block;margin-right:7px;font-size:10px}\n.ls-desk[data-workspace=daw] #ls-start::before{content:'\\25B6'}\n.ls-desk[data-workspace=daw] #ls-stop::before{content:'\\25A0'}\n.ls-desk[data-workspace=daw] .ls-transport :is(#ls-prepare,#ls-start:not(:disabled)){background:var(--daw-accent);border-color:var(--daw-accent);color:var(--daw-accent-ink)}\n.ls-desk[data-workspace=daw] #ls-publish-item{margin-left:6px}\n.ls-desk[data-workspace=daw] .ls-daw-timecode{border-color:var(--daw-border-strong);background:var(--daw-well)}\n.ls-desk[data-workspace=daw] .ls-live-badge{padding:3px 9px;border:1px solid var(--daw-border-strong);border-radius:999px;font:600 10px/1.4 ui-monospace,monospace;letter-spacing:.08em}\n\n/* Channel list: a colour edge, a quiet number and the name; the selected channel takes its own colour. */\n.ls-desk[data-workspace=daw] .ls-daw-library button{grid-template-columns:18px 1fr;align-items:center;margin:2px 0;padding:8px 10px;border:1px solid transparent;border-left:0;border-radius:6px;background:transparent;box-shadow:inset 3px 0 0 var(--track-color)}\n.ls-desk[data-workspace=daw] .ls-daw-library button:hover{background:var(--editor-hover)}\n.ls-desk[data-workspace=daw] .ls-daw-library button span:first-child{color:var(--daw-faint);font:10px ui-monospace,monospace}\n.ls-desk[data-workspace=daw] .ls-daw-library button strong{font-size:13px}\n.ls-desk[data-workspace=daw] .ls-daw-library [aria-pressed=true]{outline:0;background:color-mix(in srgb,var(--track-color) 20%,transparent);border-color:color-mix(in srgb,var(--track-color) 50%,transparent)}\n\n/* Arrangement and mixer strips are rounded panels; the selected strip is tinted by its track. */\n.ls-desk[data-workspace=daw] .ls-arrangement{border-radius:8px;overflow:hidden;background:var(--daw-panel)}\n.ls-desk[data-workspace=daw] .ls-arrangement>div:first-child{padding:8px 12px;border-bottom:1px solid var(--daw-border)}\n.ls-desk[data-workspace=daw] .ls-arrangement [data-ls=arrangement]>p{justify-self:center;color:var(--daw-muted)}\n.ls-desk[data-workspace=daw] .ls-lane-row{border:1px solid var(--daw-border);border-top:2px solid var(--track-color);border-radius:8px;background:var(--daw-panel)}\n.ls-desk[data-workspace=daw] .ls-lane-row[data-selected=true]{outline:0;border-color:color-mix(in srgb,var(--track-color) 55%,transparent);background:color-mix(in srgb,var(--track-color) 14%,var(--daw-panel))}\n.ls-desk[data-workspace=daw] :is(.ls-preset-row,.ls-compose){padding:10px 12px;border:1px solid var(--daw-border);border-radius:8px;background:var(--daw-panel)}\n/* SSR track components: controls fit the viewport; clips retain beat-relative positions. */\n.ls-desk .ls-session-timeline>header {display:flex;flex-direction:row;align-items:center;gap:16px;text-align:left;margin-bottom:8px}\n.ls-session-timeline>header>div {min-width:0;flex:1}\n.ls-session-timeline>header h3 {margin:4px 0}\n.ls-session-timeline>header>button {flex:none}\n.ls-session-timeline>p {max-width:72ch;margin:8px 0 16px;color:var(--daw-muted)}\n.ls-session-scroll {max-height:none;overflow:visible;border:0;border-radius:0}\n.ls-session-lanes {min-width:0;display:grid;gap:12px}\n.ls-session-row-scroll {overflow-x:auto;min-width:0;scrollbar-width:thin}\n.ls-session-row-scroll>.ls-session-lane,.ls-session-row-scroll>.ls-envelope {min-width:var(--arrangement-width)}\n/* One bar per tile, sized as a fraction of the lane, so the bar lines sit under the %-placed clips at any zoom or panel width. */\n.ls-session-row-scroll>.ls-session-lane {background:linear-gradient(90deg,var(--daw-bg) 0,var(--daw-bg) calc(100% - 1px),var(--daw-control-hi) calc(100% - 1px)) 0 0/calc(100% * var(--bar-fraction,.125)) 100% repeat-x var(--daw-bg)}\n.ls-session-track {min-width:0;border:1px solid var(--daw-border);border-radius:8px;padding:10px;background:var(--daw-panel)}\n.ls-desk .ls-session-track>header {display:grid;grid-template-columns:minmax(0,1fr) 72px 48px 66px;align-items:center;gap:10px;min-height:44px;margin:0 0 8px;flex-direction:row}\n.ls-track-identity {display:flex;align-items:center;gap:10px;min-width:0}\n.ls-desk[data-workspace=daw] .ls-track-identity>button {max-width:100%;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left;font-weight:600;border-color:transparent;background:transparent;padding:6px 0;font-size:12px}\n.ls-desk[data-workspace=daw] .ls-track-identity>button:disabled {opacity:1;cursor:default}\n.ls-session-track header small {min-width:0;max-width:180px;font-size:10px}\n.ls-desk .ls-session-track header label {display:flex;flex-direction:column;align-items:stretch;gap:2px;margin:0;font-size:9px;color:var(--daw-soft)}\n.ls-desk[data-workspace=daw] .ls-session-track input[type=number] {width:100%;padding:6px;font-size:12px;min-height:30px}\n.ls-session-track [data-track-mute][aria-pressed=true] {background:color-mix(in srgb,#ba935b 35%,var(--daw-panel));border-color:#ba935b;color:#ffe0aa}\n.ls-desk .ls-session-track .ssr-action-menu {margin:0;justify-self:stretch}\n.ls-session-track .ssr-action-menu>summary {padding:8px;gap:5px;min-height:36px;justify-content:center;border:1px solid var(--daw-border-strong);background:var(--daw-control);color:var(--daw-ink);font-size:11px}\n.ls-session-track .ssr-action-menu>[role=menu] {z-index:100;background:var(--daw-panel);border-color:var(--daw-border-strong);border-radius:8px}\n.ls-desk[data-workspace=daw] .ls-session-track .ssr-action-menu [role=menuitem] {min-height:42px;background:transparent;border:0;padding:10px 12px;font-size:12px}\n.ls-desk[data-workspace=daw] .ls-session-track .ssr-action-menu [role=menuitem]:hover,\n.ls-desk[data-workspace=daw] .ls-session-track .ssr-action-menu [role=menuitem]:focus-visible {background:var(--daw-control-hi)}\n.ls-session-lane {height:64px;border-radius:4px}\n.ls-desk[data-workspace=daw] .ls-session-lane [data-session-clip] {height:52px;top:6px;padding:7px 12px;border:1px solid var(--daw-border-strong);border-left:3px solid var(--daw-accent);background:var(--daw-control-hi);color:var(--daw-ink);border-radius:4px}\n.ls-session-lane [data-clip-resize] {width:12px;background:#b5d08e33}\n.ls-session-lane [aria-pressed=true] {outline-offset:-2px}\n.ls-envelope {margin-top:8px;border-radius:4px;height:96px;background:repeating-linear-gradient(90deg,transparent 0,transparent calc(12.5% - 1px),var(--daw-grid) calc(12.5% - 1px),var(--daw-grid) 12.5%),var(--daw-bg)}\n.ls-envelope circle {vector-effect:non-scaling-stroke;stroke:var(--daw-accent);stroke-width:10}\n.ls-envelope-caption {display:flex;justify-content:space-between;font-size:10px;color:var(--daw-soft);margin:12px 0 6px}\n.ls-session-timeline:not(:has(.ls-envelope)) .ls-envelope-fields {display:none}\n.ls-envelope-fields {padding:12px;border:1px solid var(--daw-border);border-radius:8px;background:var(--daw-panel);gap:10px}\n.ls-envelope-fields>span {font-size:11px;color:var(--daw-muted)}\n.ls-envelope-fields>strong {font-size:11px;margin-right:auto;align-self:center}\n.ls-desk[data-workspace=daw] .ls-envelope-fields input {width:76px}\n.ls-clip-detail {background:var(--daw-panel);border-color:var(--daw-border);border-radius:8px}\n.ls-clip-detail h4 {margin:0 0 12px;font-size:13px}\n.ls-session-fields input:not([type=number]) {background:var(--daw-control);color:var(--daw-ink);border:1px solid var(--daw-border-strong);border-radius:4px;padding:7px 10px;font:inherit}\n.ls-session-fields input,.ls-session-fields select {min-height:34px}\n.ls-session-editor [data-track-status] {color:var(--daw-muted)}\n/* Persistent tracks carry their own mixer controls; the old channel list is redundant. */\n.ls-desk[data-workspace=daw][data-track-session=true] {grid-template-columns:minmax(0,1fr)}\n.ls-desk[data-workspace=daw][data-track-session=true] .ls-daw-library {display:none}\n.ls-desk[data-workspace=daw][data-track-session=true] .ls-code,\n.ls-desk[data-workspace=daw][data-track-session=true] .ls-midi {grid-column:1}\n.ls-desk[data-workspace=daw][data-track-session=true] .ls-channel-rack {grid-template-columns:minmax(0,1fr) auto;gap:8px 20px;padding:12px 18px}\n.ls-desk[data-workspace=daw][data-track-session=true] .ls-channel-rack .ls-lanes {grid-column:1;grid-row:3;display:block;overflow:visible;margin:0}\n.ls-desk[data-workspace=daw][data-track-session=true] .ls-lane-row[data-ls-channel=reverb] {display:grid;grid-template-columns:110px minmax(80px,240px) auto auto;align-items:center;gap:12px;min-width:0;padding:8px 12px;border-top-width:1px;margin:0}\n.ls-desk[data-workspace=daw][data-track-session=true] .ls-lane-row :is(.mixer-handle,.mixer-slot,.mixer-scale) {display:none}\n/* The return strip lies flat beside the track editor: name, fader, level, mute. */\n.ls-desk[data-workspace=daw][data-track-session=true] .ls-lane-row .mixer-fader-bay {order:1;height:auto;margin:0}\n.ls-desk[data-workspace=daw][data-track-session=true] .ls-lane-row .mixer-readout {order:2}\n.ls-desk[data-workspace=daw][data-track-session=true] .ls-lane-row .mixer-buttons {order:3}\n.ls-desk[data-workspace=daw][data-track-session=true] .ls-lane-row :is(.mixer-fader,.mixer-fader>.primitive-input) {width:100%;height:auto}\n.ls-desk[data-workspace=daw][data-track-session=true] .ls-lane-row .mixer-fader input[type=range] {writing-mode:horizontal-tb;direction:ltr;width:100%;height:28px;margin:0}\n.ls-desk[data-workspace=daw][data-track-session=true] [data-ls=mix] {grid-column:2;grid-row:3;align-self:center}\n@media(max-width:720px) {\n  .ls-track-identity {display:block}\n  .ls-track-identity>small {display:block;max-width:100%;font-size:9px}\n  .ls-desk .ls-session-track>header {grid-template-columns:minmax(0,1fr) 58px 44px 58px;gap:6px}\n  .ls-desk[data-workspace=daw] .ls-session-track [data-track-mute],\n  .ls-session-track .ssr-action-menu>summary {min-height:44px;padding:6px}\n  .ls-desk[data-workspace=daw] .ls-session-track input[type=number] {font-size:16px;min-height:34px;padding:4px}\n  .ls-desk[data-workspace=daw] .ls-session-track .ssr-action-menu [role=menuitem] {min-height:44px}\n  .ls-desk .ls-session-timeline>header {align-items:center;gap:8px}\n  .ls-desk[data-workspace=daw] .ls-session-timeline>header>button {max-width:118px;min-height:44px;padding:8px;white-space:normal}\n  .ls-desk[data-workspace=daw] .ls-session-timeline>header h3 {font-size:15px}\n  .ls-session-timeline>p {font-size:11px;line-height:1.6}\n  .ls-session-track {padding:8px}\n  .ls-envelope {height:100px}\n  .ls-envelope-fields {display:grid;grid-template-columns:repeat(2,minmax(0,1fr));align-items:end}\n  .ls-envelope-fields>strong,.ls-envelope-fields>span {grid-column:1/-1}\n  .ls-desk[data-workspace=daw] .ls-envelope-fields input {width:100%;font-size:16px}\n  .ls-envelope-fields button {min-height:44px}\n  .ls-session-fields {display:grid;grid-template-columns:repeat(2,minmax(0,1fr))}\n  .ls-desk[data-workspace=daw] .ls-session-fields input,.ls-session-fields select {width:100%;max-width:100%;font-size:16px}\n  .ls-session-fields button {min-height:44px}\n  .ls-desk[data-workspace=daw][data-track-session=true] .ls-channel-rack .ls-lanes {grid-column:1/-1}\n  .ls-desk[data-workspace=daw][data-track-session=true] .ls-lane-row[data-ls-channel=reverb] {grid-template-columns:100px minmax(60px,1fr)}\n  .ls-desk[data-workspace=daw][data-track-session=true] [data-ls=mix] {grid-column:1/-1;grid-row:4;justify-self:stretch;min-height:44px}\n}\n@media(max-width:560px) {\n  .ls-desk[data-workspace=daw] .ls-code {padding:12px 8px}\n  .ls-desk[data-workspace=daw] .ls-daw-tabs {flex-wrap:nowrap;overflow-x:auto;gap:6px;padding:8px;scrollbar-width:thin}\n  .ls-desk[data-workspace=daw] .ls-daw-tabs button {flex:none;min-height:42px;padding:8px 12px}\n  .ls-desk[data-workspace=daw] .ls-transport {gap:8px;min-height:0}\n  .ls-desk[data-workspace=daw] .ls-transport output {padding:8px;flex-basis:auto;min-width:0;font-size:10px}\n  .ls-desk[data-workspace=daw] .ls-transport button {min-height:40px}\n  .ls-desk[data-workspace=daw] .ls-transport .ls-meter {display:none}\n  .ls-desk[data-workspace=daw] .ls-draft-bar {flex-wrap:wrap;gap:8px;margin-top:8px}\n  .ls-desk[data-workspace=daw] .ls-draft-bar button {min-height:40px}\n  .ls-desk[data-workspace=daw] .ls-tempo {grid-column:2;grid-row:1/3}\n  .ls-desk[data-workspace=daw] .ls-channel-rack>p {grid-column:1;font-size:10px}\n}\n/* The chord lane rides the tracks' beat axis; blocks are coloured by harmonic function and carry a tension bar. */\n.ls-desk .ls-session-track.ls-chord-track>header {display:flex;margin:0 0 6px;min-height:0}\n.ls-chord-track {background:var(--daw-bg);border-style:dashed}\n.ls-chord-track .ls-track-identity>small {color:#c9b98a}\n.ls-chord-lane {position:relative;height:46px;border-radius:4px;background:var(--daw-bg)}\n.ls-session-row-scroll>.ls-chord-lane {min-width:var(--arrangement-width)}\n.ls-chord-empty {margin:0;padding:14px 10px;font-size:11px;color:var(--daw-muted)}\n.ls-chord-block {position:absolute;top:4px;bottom:4px;display:flex;flex-direction:column;justify-content:center;gap:1px;padding:2px 8px 6px;overflow:hidden;white-space:nowrap;border:1px solid var(--daw-border-strong);border-left:3px solid var(--daw-soft);border-radius:4px;background:var(--daw-control);color:var(--daw-ink);font-size:12px;line-height:1.1;box-sizing:border-box}\n.ls-chord-block b {font-weight:650;overflow:hidden;text-overflow:ellipsis}\n.ls-chord-block small {font-size:10px;color:var(--daw-soft);overflow:hidden;text-overflow:ellipsis}\n.ls-chord-block i {position:absolute;left:0;bottom:0;height:3px;width:calc(var(--tension,0)*100%);background:#e0a96d}\n.ls-chord-block[data-function=tonic] {border-left-color:#8fd0a0;background:color-mix(in srgb,#8fd0a0 22%,var(--daw-panel))}\n.ls-chord-block[data-function=predominant] {border-left-color:#8fb4e0;background:var(--daw-panel)}\n.ls-chord-block[data-function=dominant] {border-left-color:#e6a86a;background:color-mix(in srgb,#e6a86a 22%,var(--daw-panel))}\n/* The harmony panel: key, pitch-class weights, the progression reading and the compose form. */\n.ls-harmony {margin:16px 0;padding:14px;border:1px solid var(--daw-border);border-radius:8px;background:var(--daw-bg)}\n.ls-harmony>header {display:flex;flex-wrap:wrap;align-items:flex-end;justify-content:space-between;gap:8px 16px;margin-bottom:12px}\n.ls-harmony>header h3 {margin:2px 0 0}\n.ls-harmony-key {display:flex;flex-direction:column;align-items:flex-end;gap:2px;margin:0}\n.ls-harmony-key strong {font-size:18px;color:color-mix(in srgb,#d9b46a 60%,var(--daw-ink))}\n.ls-harmony-key span {font-size:11px;color:var(--daw-muted)}\n.ls-harmony-refused {margin:0;color:#e9b48a;font-size:12px}\n.ls-harmony-grid {display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:12px}\n.ls-harmony-card {margin:0;padding:12px;border:1px solid var(--daw-border);border-radius:8px;background:var(--daw-panel);min-width:0}\n.ls-harmony-card h4 {margin:0 0 10px;font-size:12px;letter-spacing:.04em;text-transform:uppercase;color:var(--daw-soft)}\n.ls-harmony-card p {margin:0 0 8px;font-size:12px;color:var(--daw-soft)}\n.ls-harmony-card ul {margin:0 0 8px;padding-left:18px;font-size:12px;color:var(--daw-soft)}\n.ls-harmony-row {display:flex;flex-wrap:wrap;align-items:flex-end;gap:8px;margin-top:8px}\n.ls-harmony label,.ls-harmony-tools label {display:flex;flex-direction:column;gap:3px;font-size:10px;color:var(--daw-soft);min-width:0}\n.ls-harmony select,.ls-harmony input,.ls-harmony-tools select,.ls-harmony-tools input {min-height:34px;background:var(--daw-control);color:var(--daw-ink);border:1px solid var(--daw-border-strong);border-radius:4px;padding:4px 8px;font:inherit;font-size:12px;max-width:100%}\n.ls-harmony input[type=range] {padding:0;accent-color:#d9b46a}\n.ls-harmony label.ls-harmony-check {flex-direction:row;align-items:center;gap:6px;font-size:12px;color:var(--daw-ink)}\n.ls-harmony label.ls-harmony-check input {min-height:0}\n.ls-harmony-candidates {display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin-top:10px}\n.ls-harmony-candidates>small {font-size:10px;color:var(--daw-muted);width:100%}\n.ls-harmony-candidates button small {color:var(--daw-muted);font-size:10px}\n.ls-harmony-candidates button[aria-pressed=true] {border-color:#d9b46a;color:color-mix(in srgb,#d9b46a 60%,var(--daw-ink))}\n.ls-pc-bars {display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:3px;align-items:end;height:96px}\n.ls-pc {display:flex;flex-direction:column;justify-content:flex-end;align-items:center;gap:4px;height:100%;min-width:0}\n.ls-pc span {width:100%;height:calc(var(--weight,0)*72px + 2px);border-radius:3px 3px 0 0;background:var(--daw-control-hi)}\n.ls-pc[data-in-key=true] span {background:#7fb39a}\n.ls-pc[data-tonic=true] span {background:#e2c27a}\n.ls-pc b {font-size:10px;font-weight:600;color:var(--daw-muted);white-space:nowrap}\n.ls-pc[data-in-key=true] b {color:var(--daw-ink)}\n.ls-harmony-weights figcaption {margin-top:8px;font-size:11px;color:var(--daw-muted)}\n.ls-harmony-numerals {font-size:15px!important;letter-spacing:.02em;color:color-mix(in srgb,#d9b46a 60%,var(--daw-ink))!important}\n.ls-harmony-chip {display:inline-block;margin:0 4px 4px 0;padding:2px 8px;border:1px solid var(--daw-border-strong);border-radius:999px;font-size:10px;color:var(--daw-ink);background:var(--daw-control)}\n.ls-harmony-traits {margin-top:4px}\n.ls-harmony-form {display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:8px}\n.ls-harmony-compose .ls-harmony-row button:first-child {background:color-mix(in srgb,#a3b86b 30%,var(--daw-panel));border-color:#a3b86b;color:var(--daw-ink)}\n/* Scale tools inside a clip's inspector. */\n.ls-harmony-tools {margin-top:12px;padding:10px;border:1px dashed var(--daw-border-strong);border-radius:8px}\n.ls-harmony-tools>strong {font-size:11px;letter-spacing:.04em;text-transform:uppercase;color:var(--daw-soft)}\n.ls-harmony-tools input[type=number] {width:5.5em}\n.ls-harmony-tools-note {margin:12px 0 0;font-size:11px;color:var(--daw-muted)}\n@media(max-width:720px) {\n  .ls-harmony {padding:10px}\n  .ls-harmony > header,.ls-harmony-key {align-items:flex-start}\n  .ls-harmony select,.ls-harmony input,.ls-harmony-tools select,.ls-harmony-tools input {font-size:16px;min-height:44px}\n  .ls-harmony button,.ls-harmony-tools button {min-height:44px}\n  .ls-harmony-grid {grid-template-columns:minmax(0,1fr)}\n}\n@media(max-width:560px) {\n  .ls-harmony-form {grid-template-columns:repeat(2,minmax(0,1fr))}\n  .ls-pc b {font-size:9px}\n  .ls-chord-block {padding:2px 5px 6px;font-size:11px}\n}\n\n/* Timeline zoom scales the song rows in the browser; the ruler is clipped to the lanes it measures. */\n.ls-session-lanes>.daw-ruler {overflow:hidden}\n.ls-track-zoom {display:flex;align-items:center;gap:4px}\n.ls-track-zoom button {min-width:34px;font-weight:600}\n.ls-session-fields .ls-track-zoom input[type=range] {width:96px;padding:0;border:0;background:none}\n\n/* Piano roll of the selected persistent clip: sticky key labels, a beat grid and a velocity lane that scrolls with it. */\n.ls-track-piano {--tp-row:14px;--tp-key:76px;--tp-beat:64px;--tp-width:max(480px,calc(var(--tp-beats,4) * var(--tp-beat)));margin:12px 0;border:1px solid var(--daw-border-strong);border-radius:5px;background:var(--daw-well)}\n.ls-track-piano:focus-visible {outline:2px solid var(--daw-accent);outline-offset:2px}\n.ls-track-piano .ls-tp-help {margin:6px 8px;color:var(--daw-muted)}\n.ls-tp-roll {max-height:280px;overflow:auto;scrollbar-width:thin;overscroll-behavior:contain}\n.ls-tp-body {display:flex;width:max-content}\n.ls-tp-keys,.ls-tp-velocity-key {position:sticky;left:0;z-index:2;flex:none;width:var(--tp-key);box-sizing:border-box;background:var(--daw-bg);border-right:1px solid var(--daw-border-strong)}\n.ls-tp-key {height:var(--tp-row);box-sizing:border-box;padding:0 6px;font:9px/var(--tp-row) ui-monospace,SFMono-Regular,Consolas,monospace;color:var(--daw-muted);border-bottom:1px solid var(--daw-border);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.ls-tp-key[data-black=true] {background:var(--daw-well)}\n.ls-tp-key[data-c=true] {color:var(--daw-ink);border-bottom-color:var(--daw-border-strong)}\n.ls-tp-grid {position:relative;flex:none;width:var(--tp-width);height:calc(var(--tp-rows,128) * var(--tp-row));touch-action:none;cursor:crosshair;background:linear-gradient(90deg,#5d8193 0 1px,transparent 1px) 0 0/calc(100% * var(--tp-bar-fraction,1)) 100% repeat-x,linear-gradient(90deg,#284150 0 1px,transparent 1px) 0 0/calc(100% * var(--tp-beat-fraction,.25)) 100% repeat-x,repeating-linear-gradient(180deg,transparent 0,transparent calc(var(--tp-row) - 1px),#18303c calc(var(--tp-row) - 1px),#18303c var(--tp-row)),#10212b}\n.ls-track-piano .ls-tp-note {position:absolute;height:var(--tp-row);min-width:4px;min-height:0;box-sizing:border-box;margin:0;padding:0;border:1px solid var(--daw-border);border-radius:2px;background:#9dc6a5;cursor:grab;touch-action:none;font-size:0}\n.ls-track-piano .ls-tp-note[aria-pressed=true] {background:color-mix(in srgb,var(--track-color,var(--daw-accent)) 55%,#fff);outline:2px solid #f5a524;outline-offset:0;z-index:1}\n.ls-track-piano .ls-tp-note [data-tp-resize] {position:absolute;right:0;top:0;bottom:0;width:6px;background:#ffffff40;cursor:ew-resize}\n.ls-track-piano [data-tp-ghost] {opacity:.6;pointer-events:none}\n.ls-tp-velocity {display:flex;height:64px;overflow:hidden;border-top:1px solid var(--daw-border-strong)}\n.ls-tp-velocity-key {display:flex;align-items:center;padding:0 6px;font-size:9px;color:var(--daw-muted)}\n.ls-tp-velocity-bars {position:relative;flex:none;width:var(--tp-width);margin-right:16px;touch-action:none;background:repeating-linear-gradient(180deg,var(--daw-panel) 0 1px,transparent 1px 25%)}\n.ls-tp-vel {position:absolute;top:0;bottom:0;width:10px;margin-left:-1px;cursor:ns-resize;touch-action:none}\n.ls-tp-vel>i {position:absolute;left:0;bottom:0;width:4px;background:#b7e390;border-radius:2px 2px 0 0}\n.ls-tp-vel[aria-pressed=true]>i {background:#f5a524}\n@media(max-width:760px) {\n  .ls-track-piano {--tp-row:18px;--tp-key:64px}\n  .ls-tp-roll {max-height:340px}\n}\n\n/* Wide panels put each track's controls in a column beside its lane, so a row is about as tall as its clips:\n   the name and gain on top, then mute, solo, the menu and the add-automation select. */\n@media(min-width:721px) {\n  .ls-session-timeline>p {margin:2px 0 8px;font-size:11px}\n  .ls-session-lanes {gap:6px}\n  .ls-session-track {position:relative;display:grid;grid-template-columns:220px minmax(0,1fr);gap:0 10px;align-items:start;padding:6px}\n  .ls-desk .ls-session-track>header {grid-template-columns:36px 36px 48px minmax(0,1fr);grid-template-rows:28px 28px;gap:4px;min-height:0;margin:0}\n  .ls-desk .ls-session-track.ls-chord-track>header {margin:0}\n  .ls-desk .ls-session-track>header>.ls-track-identity {grid-column:1/4;grid-row:1}\n  .ls-desk[data-workspace=daw] .ls-track-identity>button {padding:2px 0}\n  /* The input keeps its aria-label; the visible unit replaces the wrapped \"Gain dB\" text. */\n  .ls-desk .ls-session-track>header>label {grid-column:4;grid-row:1;flex-direction:row;align-items:center;gap:4px;font-size:0}\n  .ls-desk .ls-session-track>header>label::after {content:\"dB\";font-size:9px}\n  .ls-desk[data-workspace=daw] .ls-session-track>header input[type=number] {flex:1;width:auto;min-width:0;min-height:28px;padding:3px 5px}\n  .ls-desk .ls-session-track>header>[data-track-mute] {grid-column:1;grid-row:2}\n  .ls-desk .ls-session-track>header>[data-track-solo] {grid-column:2;grid-row:2}\n  .ls-desk .ls-session-track>header>.ssr-action-menu {grid-column:3;grid-row:2}\n  .ls-desk[data-workspace=daw] .ls-session-track>header>button,.ls-session-track .ssr-action-menu>summary {min-height:28px;padding:3px 4px;font-size:11px}\n  .ls-session-track>header>[data-track-delete] {display:none}\n  /* The add-automation select takes the header's last cell; its containing block is the track, so the row scroller does not clip it. */\n  .ls-session-track .ls-automation-add {position:absolute;left:138px;bottom:auto;top:38px;width:88px;margin:0;font-size:0;box-sizing:border-box}\n  .ls-session-track .ls-automation-add select {flex:1;min-width:0;min-height:28px;padding:3px 5px;font-size:11px}\n  .ls-automation-fields {position:sticky;left:0;width:max-content;max-width:100%;box-sizing:border-box}\n  .ls-session-lane {height:60px}\n  .ls-desk[data-workspace=daw] .ls-session-lane [data-session-clip] {height:52px;top:4px;padding:3px 6px}\n}\n/* One scrollbar under the last row drives every row, since the rows scroll together. */\n.ls-session-lanes .ls-session-row-scroll {scrollbar-width:none}\n.ls-session-lanes>.ls-session-track:last-of-type .ls-session-row-scroll {scrollbar-width:thin}\n/* A clip shows its notes; the name and count ride on top and clip rather than wrap. */\n.ls-desk[data-workspace=daw] .ls-session-lane [data-session-clip] {overflow:hidden;white-space:nowrap;text-align:left;font-size:11px;line-height:1.2}\n.ls-session-lane [data-session-clip]>.ls-clip-label,.ls-session-lane [data-session-clip]>small {position:relative;overflow:hidden;text-overflow:ellipsis;text-shadow:0 0 3px var(--daw-bg)}\n.ls-session-lane [data-session-clip]>small {display:inline;margin-left:6px;font-size:10px;color:var(--daw-soft)}\n.ls-clip-notes {position:absolute;inset:16px 4px 3px 4px;pointer-events:none}\n.ls-clip-notes>i {position:absolute;bottom:calc(var(--p) / var(--rows) * 100%);height:clamp(2px,calc(100% / var(--rows)),5px);min-width:2px;border-radius:1px;background:color-mix(in srgb,var(--daw-accent) 70%,var(--daw-ink));opacity:.75}\n/* Automation lanes under a track: one envelope per automated parameter, the point fields and the add select. */\n.ls-automation {display:flex;flex-direction:column;gap:4px}\n.ls-automation-curve path {fill:#d6efb322;stroke:#d6efb3;stroke-width:2;vector-effect:non-scaling-stroke}\n.ls-automation-curve[data-envelope-param^=\"pan\"] path {fill:#9fd4ff1f;stroke:#9fd4ff}\n.ls-automation-curve[data-envelope-param^=\"send:\"] path {fill:#c9a8ff1f;stroke:#c9a8ff}\n.ls-automation-curve[data-envelope-param^=\"insert:\"] path {fill:#ffc78a1f;stroke:#ffc78a}\n.ls-automation-curve circle {cursor:grab}\n.ls-automation-curve circle:focus-visible {outline:none;stroke:#fff}\n.ls-automation-fields {display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:10px 12px;border:1px solid var(--daw-border);border-radius:8px;background:var(--daw-panel)}\n.ls-automation-fields>strong {font-size:11px;margin-right:auto}\n.ls-automation-fields label {display:flex;align-items:center;gap:6px;font-size:11px;color:var(--daw-muted)}\n.ls-automation-fields input {width:76px}\n.ls-automation-add {display:flex;align-items:center;gap:8px;font-size:11px;color:var(--daw-muted);margin-top:4px}\n.ls-automation-add select {max-width:240px}\n@media (max-width:640px) {.ls-automation-fields input {width:64px}.ls-automation-add select {max-width:100%}}\n/* Opt-in editor chrome. Documents, canvases, transport and geometry stay app-owned. */\n[data-editor-chrome]{\n  --editor-surface:light-dark(#f6f8f6,#1b2220);\n  --editor-raised:light-dark(#fff,#242e29);\n  --editor-ink:var(--cre8-view-fg,light-dark(#182620,#edf3ee));\n  --editor-muted:var(--cre8-view-fg-muted,light-dark(#536259,#a6b5ab));\n  --editor-border:var(--cre8-view-border,light-dark(#cbd5ce,#3b4941));\n  /* One accent for every editor: the page's own, so a selected tab matches the app tab above it. */\n  --editor-accent:var(--cre8-view-accent,light-dark(#0f5c40,#51d88a));\n  --editor-accent-ink:light-dark(#fff,#06130f);\n  --editor-selected:color-mix(in srgb,var(--editor-accent) 16%,transparent);\n  --editor-hover:color-mix(in srgb,var(--editor-ink) 8%,transparent);\n  --editor-font:Inter,ui-sans-serif,system-ui,sans-serif;\n  --editor-control-height:34px;\n  --editor-control-radius:0px;\n  --editor-strip-pad:5px 12px;\n}\n[data-editor-chrome] [data-editor-strip]{\n  box-sizing:border-box;color:var(--editor-ink);background:var(--editor-surface);border-color:var(--editor-border);\n  gap:4px;min-width:0;\n}\n[data-editor-chrome] [data-editor-strip] :is(button,summary,select){\n  box-sizing:border-box;min-height:var(--editor-control-height);border-radius:var(--editor-control-radius);\n  font:12px/1.4 var(--editor-font);color:var(--editor-ink);border-color:var(--editor-border);padding:6px 10px;\n}\n[data-editor-chrome] [data-editor-strip] select{background:var(--editor-raised)}\n[data-editor-chrome] [data-editor-strip] :is(button,summary){background:transparent}\n[data-editor-chrome] [data-editor-strip] :is([aria-selected=true],[aria-pressed=true]){\n  background:var(--editor-selected);color:var(--editor-accent);border-color:var(--editor-accent);\n}\n[data-editor-chrome] [data-editor-strip] :is(button,summary):hover:not(:disabled,[aria-selected=true],[aria-pressed=true]){background:var(--editor-hover)}\n[data-editor-chrome] [data-editor-strip] :is(button,select):disabled{opacity:.45;cursor:default}\n[data-editor-chrome] :is(button,summary,select,input,textarea,[role=separator]):focus-visible{\n  outline:2px solid var(--editor-accent);outline-offset:2px;\n}\n\n/* Strip anatomy. Every editor reads top to bottom: identity, menu, tools or modes, the work, status.\n   An app marks the strip; the padding, rule and type come from here. */\n[data-editor-chrome] [data-editor-strip]:is([data-editor-strip=identity],[data-editor-strip=menu],[data-editor-strip=tools],[data-editor-strip=modes]){\n  display:flex;align-items:center;margin:0;padding:var(--editor-strip-pad);border-radius:0;\n  border-bottom:1px solid var(--editor-border);\n}\n[data-editor-chrome] [data-editor-strip=identity]{flex-wrap:wrap;gap:4px 12px;min-height:44px}\n[data-editor-chrome] [data-editor-strip=identity] :is(h1,h2){\n  margin:0;font:700 15px/1.3 var(--editor-font);letter-spacing:-.01em;white-space:nowrap;color:var(--editor-ink);\n}\n[data-editor-chrome] [data-editor-strip=menu]{flex-wrap:wrap;gap:2px}\n/* A menu bar set inside another strip is part of that strip's line. */\n[data-editor-chrome] [data-editor-strip] [data-editor-strip=menu]{flex:0 0 auto;padding:0;border:0;background:transparent}\n[data-editor-chrome] [data-editor-strip=modes]{flex-wrap:wrap}\n/* The document in hand: a name over one muted line. */\n[data-editor-chrome] [data-editor-part=project]{\n  display:grid;flex:1 1 180px;min-width:0;padding-left:12px;border-left:1px solid var(--editor-border);\n}\n[data-editor-chrome] [data-editor-part=project]>:is(strong,input){\n  overflow:hidden;font:600 13px/1.25 var(--editor-font);color:var(--editor-ink);text-overflow:ellipsis;white-space:nowrap;\n}\n[data-editor-chrome] [data-editor-part=project]>span{\n  overflow:hidden;font:11px/1.25 var(--editor-font);color:var(--editor-muted);text-overflow:ellipsis;white-space:nowrap;\n}\n[data-editor-chrome] [data-editor-part=actions]{display:flex;flex:0 0 auto;align-items:center;gap:6px;margin-left:auto}\n/* A way out of the editor wears the strip's button shape. */\n[data-editor-chrome] [data-editor-part=actions] a:where(:not([role],[hidden])){\n  display:inline-flex;align-items:center;box-sizing:border-box;min-height:var(--editor-control-height);padding:6px 10px;\n  border:1px solid var(--editor-border);border-radius:var(--editor-control-radius);\n  font:12px/1.4 var(--editor-font);color:var(--editor-ink);text-decoration:none;white-space:nowrap;\n}\n[data-editor-chrome] [data-editor-part=actions] a:where(:not([role],[hidden])):hover{background:var(--editor-hover)}\n[data-editor-chrome] [data-editor-part=actions] :is(button,summary){border:1px solid var(--editor-border)}\n/* The one action an editor exists for. */\n[data-editor-chrome] [data-editor-strip] [data-editor-primary],\n[data-editor-chrome] [data-editor-strip] [data-editor-primary]:hover:not(:disabled){\n  background:var(--editor-accent);border-color:var(--editor-accent);color:var(--editor-accent-ink);font-weight:600;\n}\n[data-editor-chrome] [data-editor-strip=status]{\n  display:flex;justify-content:space-between;gap:12px;margin:0;padding:6px 12px;\n  border-top:1px solid var(--editor-border);font:11px/1.4 var(--editor-font);color:var(--editor-muted);\n}\n[data-editor-chrome] [data-editor-strip=status]>*{overflow:hidden;margin:0;text-overflow:ellipsis;white-space:nowrap}\n[data-editor-chrome] [data-editor-strip=status] b{color:var(--editor-ink);font-weight:600;font-variant-numeric:tabular-nums}\n\n/* Menus. The trigger's caret is drawn, so it sits on the label's midline in every editor. */\n[data-editor-chrome] .ssr-action-menu>summary{gap:7px;border:0;font:12px/1.4 var(--editor-font);color:var(--editor-ink)}\n[data-editor-chrome] .ssr-action-menu>summary>span[aria-hidden]{\n  width:5px;height:5px;margin-top:-3px;overflow:hidden;font-size:0;opacity:.6;\n  border:solid currentColor;border-width:0 1.5px 1.5px 0;transform:rotate(45deg);\n}\n[data-editor-chrome] .ssr-action-menu:is([open],:hover)>summary{background:var(--editor-hover);border-color:transparent}\n[data-editor-chrome] .ssr-action-menu>[role=menu]{\n  background:var(--editor-raised);color:var(--editor-ink);border-color:var(--editor-border);\n  border-radius:var(--editor-control-radius);\n}\n[data-editor-chrome] .ssr-action-menu :is([role=menuitem],[role=menuitemcheckbox]){\n  color:var(--editor-ink);min-height:var(--editor-control-height);border-radius:var(--editor-control-radius);font-family:var(--editor-font);\n}\n[data-editor-chrome] .ssr-action-menu :is([role=menuitem],[role=menuitemcheckbox]):is(:hover,:focus-visible):not(:disabled){background:var(--editor-selected);outline-color:var(--editor-accent)}\n[data-editor-chrome] .cre8-document-tab:has([aria-selected=true]){border-top-color:var(--editor-accent);background:var(--editor-selected)}\n[data-editor-chrome] .cre8-document-tab>.primitive-tabs-button{border-radius:0;border:0}\n[data-editor-chrome] .cre8-document-tab-close{padding:4px;min-width:28px}\n[data-editor-chrome] [data-tab-dirty]{color:var(--editor-accent)}\n[data-editor-chrome] button[data-ssr-menu-open]{min-height:var(--editor-control-height);min-width:var(--editor-control-height)}\n@media(pointer:coarse){\n  [data-editor-chrome]{--editor-control-height:44px}\n  [data-editor-chrome] [data-editor-strip] :is(button,summary,select){min-width:44px}\n  [data-editor-chrome] .ssr-action-menu :is([role=menuitem],[role=menuitemcheckbox]){min-height:44px}\n}\n@media(prefers-reduced-motion:reduce){[data-editor-chrome] [data-editor-strip] *{scroll-behavior:auto;transition:none}}\n/* Visuals pane: the DAW's own shader picture, shown in the code column beside\n   the piano roll. Hidden exactly the way .ls-piano is, so one DAW view is\n   visible at a time. */\n.ls-visual[data-visual-workspace=trace] .ls-field-views{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;}\n.ls-visual .ls-shader-preview canvas{width:100%;aspect-ratio:16/9;border:1px solid #415c6e;box-sizing:border-box;}\n.ls-visual[data-visual-workspace=trace] .ls-field-views figcaption{min-height:0;padding:0 0 7px;font:11px ui-monospace,monospace;color:#a8c4c9;}\n@media(max-width:700px){.ls-visual[data-visual-workspace=trace] .ls-field-views{grid-template-columns:minmax(0,1fr);}}\n[data-scope-mode=plate] [data-visual-shader-only],\n[data-scope-mode=plate] .ls-shader-live,\n[data-scope-mode=plate] .ls-visual-lock{display:none!important}\n[data-plate-slot] {min-width:0;margin-top:14px}\n[data-plate-slot] .primitive-card__body {display:flex;flex-wrap:wrap;gap:12px;align-items:end}\n[data-plate-slot] .primitive-input {display:flex;flex:1 1 150px;min-width:0;flex-direction:column;gap:6px}\n[data-plate-slot] input {width:100%;min-height:36px;box-sizing:border-box}\n[data-plate-slot] input[type=checkbox] {width:auto}\n[data-plate-slot] .primitive-text {flex-basis:100%;font-size:12px;line-height:1.6;overflow-wrap:anywhere}\n[data-plate-slot] .primitive-card__title {font-size:18px}\n[data-plate-slot] .primitive-card {border:1px solid #31505b;border-radius:10px;padding:16px}\n.ls-visual{display:none}\n.ls-desk[data-workspace=daw][data-daw-view=visual] .ls-visual{display:block;order:-1;min-width:0}\n.ls-desk[data-workspace=daw][data-daw-view=visual] [data-ls-pane]{display:none!important}\n.ls-desk[data-workspace=daw] .ls-visual header{display:flex;flex-wrap:wrap;align-items:end;justify-content:start;gap:10px;margin-bottom:10px}\n.ls-desk[data-workspace=daw] .ls-visual header>div{margin-right:auto}\n.ls-desk[data-workspace=daw] .ls-visual h3{margin:4px 0}\n.ls-desk[data-workspace=daw] .ls-visual label{font-size:10px;color:#a8bfce}\n.ls-desk[data-workspace=daw] .ls-visual header select{display:block;margin-top:4px;max-width:190px}\n.ls-visual-check{display:flex!important;align-items:center;gap:6px;padding-bottom:8px}\n.ls-visual-check input{accent-color:#b8d699;margin:0}\n.ls-visual-stage{position:relative;border:1px solid #415c6e;border-radius:4px;background:#050f16;overflow:hidden}\n.ls-desk[data-workspace=daw] .ls-visual canvas{display:block;width:100%;aspect-ratio:16/9;height:auto;background:#050f16}\n.ls-visual[data-visual-ready=false] .ls-visual-stage{background:repeating-linear-gradient(135deg,#0d1c26 0,#0d1c26 12px,#132534 12px,#132534 24px)}\n.ls-visual-lock{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin:10px 0 14px;font-size:10px;color:#9db3c1}\n.ls-desk[data-workspace=daw] .ls-visual-lock output{padding:5px 9px;border:1px solid #47606b;border-radius:4px;background:#101c24;font:11px ui-monospace,monospace;color:#d7e9d9}\n.ls-visual[data-visual-live=true] .ls-visual-lock output{border-color:#7fa87c;color:#cfe9b8}\n.ls-visual-lock span{flex:1 1 240px;min-width:0}\n.ls-desk[data-workspace=daw] .ls-visual-code label{font-size:10px}\n.ls-desk[data-workspace=daw] .ls-visual-code label>span{float:right;color:#7d9aac}\n.ls-desk[data-workspace=daw] .ls-visual .ls-editor-frame{border-color:#415c6e;border-radius:4px;background:#0d1c26}\n.ls-desk[data-workspace=daw] .ls-visual .ls-editor-surface textarea{min-height:250px}\n.ls-desk[data-workspace=daw] .ls-visual .ls-gutter{background:#101f2a;color:#5c7c8c}\n.ls-visual-actions{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:10px 0}\n.ls-visual-actions a{font-size:10px;margin-left:auto}\n.ls-desk[data-workspace=daw] .ls-visual [data-visual=status]{min-height:20px;margin:4px 0;font-size:11px;color:#bcd7a8;white-space:pre-wrap}\n.ls-desk[data-workspace=daw] .ls-visual [data-visual=status][data-error=true]{color:#ffb4a6}\n.ls-visual-inputs{margin-top:14px}\n.ls-desk[data-workspace=daw] .ls-visual-inputs summary{font-size:11px}\n.ls-desk[data-workspace=daw] .ls-visual-inputs dl{display:grid;grid-template-columns:132px minmax(0,1fr);gap:3px 12px;margin:10px 0;font-size:10px}\n.ls-desk[data-workspace=daw] .ls-visual-inputs dt{color:#bcee83;font-family:ui-monospace,monospace}\n.ls-desk[data-workspace=daw] .ls-visual-inputs dd{margin:0;color:#a0b7c6}\n.ls-desk[data-workspace=daw] .ls-visual>p{font-size:11px}\n@media(max-width:800px){.ls-desk[data-workspace=daw] .ls-visual-inputs dl{grid-template-columns:minmax(0,1fr)}.ls-desk[data-workspace=daw] .ls-visual-inputs dd{margin-bottom:6px}.ls-visual-actions a{margin-left:0}}\n/* Scope controls belong to the shared Visuals pane and wrap within narrow desks. */\n.ls-scope-controls { display:flex; flex-wrap:wrap; align-items:center; gap:12px; padding:12px; background:#091a22; border:1px solid #29434a; border-radius:8px; }\n.ls-scope-controls[hidden] { display:none; }\n.ls-scope-controls label { display:flex; align-items:center; gap:6px; font-size:12px; }\n.ls-scope-controls input[type=range] { width:100px; }\n.ls-scope-controls output { flex-basis:100%; color:#86dfb8; font:12px monospace; }\n.ls-visual[data-scope-mode]:not([data-scope-mode=\"shader\"]) [data-visual-shader-only] { display:none!important; }\n.ls-sound-source { display:block; margin:0 0 12px; color:var(--text-muted,#a6b7c3); font-size:12px; }\n.ls-field-experiment { display:flex; flex-wrap:wrap; align-items:center; gap:8px; margin:12px 0 8px; }\n.ls-field-experiment label { display:flex; align-items:center; gap:8px; }\n.ls-field-panel .ls-field-save-help { font-size:12px; opacity:.75; margin:4px 0; }\n.ls-field-panel [data-field-saved] { display:block; font-size:12px; margin:4px 0 12px; }\n.ls-visual-surfaces { display:flex; gap:4px; padding:4px; border:1px solid #35505a; border-radius:8px; }\n.ls-visual-surfaces button[aria-pressed=true] { background:#234b43!important; border-color:#8bcfb5!important; color:#e2fff1!important; }\n.ls-shader-trace { display:flex; flex-wrap:wrap; align-items:center; gap:12px; padding:10px 0; }\n.ls-shader-trace output { flex:1 1 320px; color:#a8bfce; font-size:11px; }\n.ls-shader-live { display:flex; flex-wrap:wrap; align-items:center; gap:12px; margin-bottom:12px; padding:10px; border:1px solid #35505a; border-radius:6px; }\n.ls-shader-live label { display:flex; align-items:center; gap:6px; }\n.ls-shader-live input[type=range] { width:100px; }\n.ls-shader-live output { flex:1 1 320px; color:#a8bfce; font-size:11px; }\n.ls-visual[data-live-shader=true] .ls-shader-live { border-color:#8bcfb5; }\n.ls-scope-controls { display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1fr); margin-top:12px; align-items:start; }\n.ls-scope-section { display:flex; flex-wrap:wrap; gap:12px; min-width:0; margin:0; padding:12px; border:1px solid #35505a; border-radius:6px; }\n.ls-scope-section legend { color:#e1f0df; font-size:12px; padding:0 6px; }\n.ls-scope-section p,.ls-scope-fields p { flex-basis:100%; margin:0; font-size:11px; line-height:1.5; color:#9eb6c2; }\n.ls-scope-controls>output,.ls-scope-midi { grid-column:1/-1; }\n.ls-scope-controls select { max-width:100%; }\n.ls-scope-spatial { flex-basis:100%; }\n.ls-scope-fields { display:flex; flex-wrap:wrap; gap:12px; padding:12px 0; }\n.ls-spectrum-controls { grid-column:1/-1; }\n.ls-spectrum-controls[hidden],.ls-scope-fields[hidden] { display:none; }\n.ls-spectrum-controls input[type=file] { max-width:100%; width:240px; }\n[data-theremini-mapping] input[type=number] { width:76px; }\n.ls-visual[data-scope-mode=spectrum] .ls-scope-section:first-child>label:not(:first-of-type),\n.ls-visual[data-scope-mode=spectrum] .ls-scope-section:first-child>.ls-scope-spatial { display:none; }\n.ls-scope-controls summary { cursor:pointer; color:#b8d9cc; font-size:12px; }\n.ls-field-panel { margin:0 0 12px; padding:16px; border:1px solid #538a7b; border-radius:10px; background:linear-gradient(120deg,#102d2b,#101f2b); }\n.ls-field-panel[hidden] { display:none; }\n.ls-field-heading,.ls-field-actions { display:flex; flex-wrap:wrap; align-items:center; gap:12px; }\n.ls-field-heading h4 { margin:4px 0; font-size:18px; color:#dcfff0; }\n.ls-field-panel p { flex:1 1 240px; margin:0; color:#adc6cb; font-size:12px; line-height:1.5; }\n.ls-field-presets { display:flex; flex-wrap:wrap; gap:6px; margin:12px 0; }\n.ls-field-presets [aria-pressed=true],.ls-visual[data-field-active=true] [data-field-open] { background:#234b43!important; border-color:#8bcfb5!important; color:#e2fff1!important; }\n.ls-field-knobs { display:grid; grid-template-columns:repeat(auto-fit,minmax(180px,1fr)); gap:16px; margin:16px 0; }\n.ls-desk[data-workspace=daw] .ls-field-knobs label { display:grid; grid-template-columns:1fr auto; gap:7px; font-size:12px; }\n.ls-field-knobs input { grid-column:1; grid-row:2; width:100%; min-width:0; }\n.ls-field-knobs output { grid-column:2; grid-row:2; min-width:42px; color:#9df4ca; font:12px ui-monospace,monospace; }\n.ls-field-play{display:grid;grid-template-columns:minmax(0,1.2fr) minmax(180px,1fr);gap:20px;align-items:center;margin:16px 0;}\n.ls-field-play .ls-field-knobs{grid-template-columns:1fr;margin:0;gap:12px;}\n.ls-field-pad-wrap{min-width:0;}\n.ls-field-pad-wrap .ls-field-pad{position:relative;display:block;width:100%;height:160px;padding:0;overflow:hidden;touch-action:none;user-select:none;cursor:crosshair;border:1px solid #547b80;border-radius:9px;background:radial-gradient(ellipse at center,#163c45,#071b25);}\n.ls-field-pad:focus-visible{outline:2px solid #adf7cf;outline-offset:3px;}\n.ls-field-pad svg{position:absolute;inset:0;width:100%;height:100%;pointer-events:none;}\n.ls-field-pad path{stroke:#578087;stroke-dasharray:3 5;fill:none;}\n.ls-field-pad circle{fill:#c7ffe3;stroke:#65dda7;stroke-width:2;}\n.ls-field-pad span{position:absolute;color:#b1d2d6;font:10px ui-monospace,monospace;pointer-events:none;}\n.ls-field-pad-x{bottom:8px;right:10px;}.ls-field-pad-y{top:8px;left:10px;}\n.ls-field-pad-wrap p{font-size:11px;margin-top:7px;}\n.ls-field-gesture{border-top:1px solid #35545c;padding-top:14px;margin:14px 0;}\n.ls-field-gesture-actions{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:8px 0;}\n.ls-field-gesture-actions label{display:flex;align-items:center;gap:6px;font-size:12px;}\n.ls-field-gesture-actions input{width:90px;}.ls-field-gesture-actions select{max-width:230px;}\n.ls-field-gesture output{display:block;font-size:12px;color:#a4e4cd;min-height:20px;margin:10px 0;}\n.ls-field-gesture details{margin:10px 0;}.ls-field-gesture summary{cursor:pointer;font-size:12px;color:#d0e6e3;}\n.ls-field-gesture svg{display:block;width:100%;height:100px;background:#071b25;margin:10px 0;border-radius:6px;}\n.ls-field-gesture path{fill:none;stroke-width:1.5;vector-effect:non-scaling-stroke;}\n[data-field-gesture-curve=xw]{stroke:#86ebc0;}[data-field-gesture-curve=xy]{stroke:#87baf5;}[data-field-gesture-curve=interaction]{stroke:#e6b978;}\n.ls-field-gesture line{stroke:#fff;stroke-width:1;opacity:.65;vector-effect:non-scaling-stroke;}\n.ls-field-gesture .ls-field-gesture-legend{display:flex;gap:15px;font-size:10px;}\n.ls-field-gesture-legend span:nth-child(1){color:#86ebc0;}.ls-field-gesture-legend span:nth-child(2){color:#87baf5;}.ls-field-gesture-legend span:nth-child(3){color:#e6b978;}\n@media(max-width:650px){.ls-field-play{grid-template-columns:minmax(0,1fr);}}\n.ls-visual[data-field-active=true]:not([data-live-shader=true]) .ls-shader-live { display:none; }\n@media(max-width:800px){.ls-scope-controls{grid-template-columns:minmax(0,1fr)}.ls-scope-controls label{flex-wrap:wrap}.ls-visual-surfaces{width:100%}.ls-visual-surfaces button{flex:1}}\n\n[data-spectrum-slot] .primitive-card__body{display:flex;flex-wrap:wrap;align-items:center;gap:14px}\n[data-spectrum-slot] .primitive-input{display:flex;flex-direction:column;gap:6px;min-width:150px}\n[data-spectrum-slot] .primitive-input input[type=file]{max-width:240px}\n[data-spectrum-slot] .primitive-text{flex-basis:100%}\n[data-spectrum-slot] .primitive-card{padding:16px;border:1px solid #31505b;border-radius:8px}\n[data-spectrum-slot] .primitive-card h3{font-size:14px}\n[data-spectrum-slot] [data-cre8-host-ready=false]{opacity:.8}\n\n[data-spectrum-slot]{flex-basis:100%;min-width:0}\n[data-spectrum-slot] .primitive-card__title{font-size:14px}\n\n[data-cre8-host-component=\"virtual.shader-studio\"] {min-width:0;}\n[data-cre8-host-component=\"virtual.shader-studio\"] > .primitive-card > .primitive-card__body {display:flex;flex-wrap:wrap;gap:12px;align-items:center;}\n[data-cre8-host-component=\"virtual.shader-studio\"] .ssr-code-editor {flex-basis:100%;width:100%;min-width:0;}\n[data-cre8-host-component=\"virtual.shader-studio\"] .primitive-text,\n[data-cre8-host-component=\"virtual.shader-studio\"] .primitive-card {flex-basis:100%;min-width:0;overflow-wrap:anywhere;}\n[data-cre8-host-component=\"virtual.shader-studio\"] .primitive-select {min-width:160px;}\n\n/* Workspace panels share a canvas and one instrument transport. */\n.ls-field-views{display:grid;grid-template-columns:minmax(0,1fr);gap:14px;margin:12px 0;}\n.ls-visual[data-field-active=true] .ls-field-views{grid-template-columns:repeat(2,minmax(0,1fr));}\n.ls-field-views figure{margin:0;min-width:0;}\n.ls-field-views figcaption{display:flex;flex-direction:column;gap:3px;min-height:48px;font-size:13px;color:#def5ef;}\n.ls-field-views figcaption span{font-size:11px;color:#9cb7c4;}\n.ls-field-geometry svg{display:block;width:100%;aspect-ratio:1;background:#071720;border:1px solid #35505a;border-radius:6px;box-sizing:border-box;}\n.ls-field-geometry [data-field-axes] line{stroke:#344d5a;stroke-dasharray:3 4;}\n.ls-field-geometry [data-field-axes] text{fill:#9db7c4;font:11px ui-monospace,monospace;}\n.ls-field-geometry label{display:flex;flex-wrap:wrap;align-items:center;gap:8px;font-size:11px;margin:12px 0 8px;}\n.ls-field-geometry input{flex:1;min-width:100px;}\n.ls-field-geometry output{display:block;font:11px/1.7 ui-monospace,monospace;color:#c6e1dd;overflow-wrap:anywhere;}\n.ls-field-views p{font-size:11px;color:#9eb8c3;line-height:1.5;margin:8px 0;}\n.ls-field-legend{display:flex;align-items:center;gap:8px;margin-top:8px;font:10px ui-monospace,monospace;color:#aec6d0;}\n.ls-field-color-key{flex:1;height:5px;border-radius:4px;background:linear-gradient(90deg,hsl(210 85% 67%),hsl(122.5 85% 67%),hsl(35 85% 67%));}\n.ls-visual[data-field-active=true] .ls-field-sound .ls-visual-stage{aspect-ratio:1;}\n.ls-visual[data-field-active=true] .ls-field-sound canvas{display:block;width:100%;height:100%;aspect-ratio:1;}\n@media(max-width:800px){.ls-visual[data-field-active=true] .ls-field-views{grid-template-columns:minmax(0,1fr);}}\n.ls-visual [data-visual-for][hidden] {display:none!important;}\n.ls-visual-workspaces {display:flex;flex-wrap:wrap;gap:4px;width:100%;}\n.ls-visual-workspaces>button[aria-pressed=true]{background:#234b43!important;border-color:#8bcfb5!important;color:#e2fff1!important;}\n.ls-visual-workspaces>div>span {display:block;margin:0 0 6px;color:#8faeae;font-size:11px;}\n.ls-visual-workspaces .ls-visual-surfaces {width:auto;}\n.ls-visual-workspaces .ls-visual-surfaces button {flex:1;min-width:0;}\n.ls-workspace-description {color:#a8c4c9;line-height:1.5;margin:4px 0 14px;}\n.ls-instrument-bar {display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:12px;margin-bottom:12px;border:1px solid #35505a;border-radius:8px;background:#102329;}\n.ls-instrument-bar label {display:flex;align-items:center;gap:8px;}\n.ls-instrument-bar input[type=range] {width:120px;}\n.ls-instrument-bar p,.ls-instrument-bar output {flex-basis:100%;margin:0;color:#a8c4c9;font-size:11px;}\n.ls-visual>[data-visual-for=\"geometry\"] {margin-bottom:12px;}\n.ls-scope-controls {display:block;}\n.ls-scope-controls>output {display:block;margin-bottom:10px;}\n.ls-scope-controls details,.ls-shader-sound {margin-top:12px;}\n.ls-display-settings>summary,.ls-shader-sound>summary {cursor:pointer;color:#bed6cf;font-size:12px;padding:8px 0;}\n.ls-shader-sound {padding:0 12px;border:1px solid #35505a;border-radius:8px;}\n.ls-visual .ls-shader-sound .ls-shader-live {display:flex;}\n.ls-shader-editor,.ls-visual-help{margin-top:12px;border-top:1px solid #35505a;padding-top:8px;}\n.ls-shader-editor>summary,.ls-visual-help>summary{cursor:pointer;color:#bed6cf;font-size:12px;padding:6px 0;}\n.ls-visual-help{font-size:12px;color:#9eb6c2;}\n.ls-visual output:empty{display:none;}\n@media(max-width:600px){.ls-visual-workspaces{grid-template-columns:minmax(0,1fr);}.ls-instrument-bar label{flex-wrap:wrap;}}\n\n.ls-field-arrangement { margin:12px 0; padding:12px; border:1px solid #538a7b; border-radius:8px; }\n.ls-field-arrangement svg { display:block; width:100%; height:90px; margin:12px 0 6px; background:#091a22; }\n.ls-field-arrangement path { fill:none; stroke-width:1.5; vector-effect:non-scaling-stroke; }\n[data-field-arrangement-curve=xw] { stroke:#83dfb1; }\n[data-field-arrangement-curve=xy] { stroke:#81bfff; }\n[data-field-arrangement-curve=interaction] { stroke:#efbb84; }\n[data-field-arrangement-playhead] { stroke:#fff; stroke-width:1; }\n.ls-field-arrangement>label { display:flex; align-items:center; gap:12px; }\n.ls-field-arrangement input[type=range] { flex:1; min-width:0; }\n.ls-field-arrangement select { max-width:100%; }\n.ls-field-arrangement output { display:block; margin:8px 0; font:12px ui-monospace,monospace; color:#dcfff0; }\n\n.ls-field-arrangement .ls-field-gesture-legend { display:flex; gap:16px; margin:6px 0 10px; }\n.ls-field-arrangement .ls-field-gesture-legend span:nth-child(1) { color:#83dfb1; }\n.ls-field-arrangement .ls-field-gesture-legend span:nth-child(2) { color:#81bfff; }\n.ls-field-arrangement .ls-field-gesture-legend span:nth-child(3) { color:#efbb84; }\n\n/* Portable arrangement controls share the compact instrument layout. */\n.ls-field-arrangement .primitive-card {background:transparent;border:0;box-shadow:none;padding:0;}\n.ls-field-arrangement .primitive-card__header {padding:0 0 12px;border:0;}\n.ls-field-arrangement .primitive-card__title {font-size:16px;margin:0;}\n.ls-field-arrangement .primitive-card__body {display:flex;flex-wrap:wrap;gap:12px;align-items:end;padding:0;}\n.ls-field-arrangement .primitive-input,.ls-field-arrangement .primitive-select {flex:1 1 180px;min-width:0;}\n.ls-field-arrangement .primitive-checkbox {flex-basis:100%;}\n.ls-field-arrangement .primitive-checkbox__label {justify-content:flex-start;gap:8px;}\n.ls-field-arrangement .primitive-checkbox__text {flex:none;}\n.ls-field-arrangement .primitive-input__control,.ls-field-arrangement .primitive-select__control {width:100%;box-sizing:border-box;}\n.ls-field-arrangement .primitive-text {flex-basis:100%;font-size:12px;line-height:1.6;}\n.ls-field-arrangement [role=status] {color:#dcfff0;}\n/* Scene pads share the DAW transport and author ordinary track clips. */\n.ls-scene-performance{display:none}\n.ls-desk[data-workspace=daw][data-daw-view=perform] .ls-code,.ls-desk[data-workspace=daw][data-daw-view=perform] .ls-daw-library,.ls-desk[data-workspace=daw][data-daw-view=perform] .ls-channel-rack,.ls-desk[data-workspace=daw][data-daw-view=perform] [data-daw-mixer]{display:none}\n.ls-desk[data-workspace=daw][data-daw-view=perform] .ls-scene-performance{display:block;grid-column:1/-1;grid-row:5;min-width:0;min-height:0;overflow:auto;padding:28px;background:radial-gradient(ellipse at top right,color-mix(in srgb,var(--daw-accent) 14%,var(--daw-bg)),var(--daw-bg) 70%)}\n.ls-scene-performance h2{font-size:30px!important;margin:8px 0!important}\n.ls-scene-performance>p{max-width:720px;color:var(--daw-soft)}\n.ls-scene-setup,.ls-scene-actions{display:flex;gap:8px;flex-wrap:wrap;margin:20px 0}\n.ls-scene-pads{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin:24px 0}\n.ls-desk .ls-scene-pads button{min-height:136px;text-align:left;padding:20px;border:1px solid var(--daw-border-strong);border-top:4px solid var(--daw-accent);background:color-mix(in srgb,var(--daw-accent) 12%,var(--daw-panel));font-size:20px;white-space:normal;overflow-wrap:anywhere}\n.ls-desk .ls-scene-pads button:nth-child(2){border-top-color:#dcb98e;background:color-mix(in srgb,#dcb98e 14%,var(--daw-panel))}\n.ls-desk .ls-scene-pads button:nth-child(3){border-top-color:#aebbe8;background:color-mix(in srgb,#aebbe8 14%,var(--daw-panel))}\n.ls-scene-pads button::after{content:attr(data-state);display:block;font:11px system-ui;text-transform:uppercase;letter-spacing:.12em;margin-top:24px;color:var(--daw-muted)}\n.ls-scene-pads button[aria-pressed=true]{outline:2px solid var(--daw-accent);outline-offset:3px}\n.ls-scene-pads button[data-state=playing]::after{color:var(--daw-ink);font-weight:700}\n.ls-scene-pads button[data-state=queued]::after{color:light-dark(#8a4b00,#ffd29c)}\n.ls-scene-hint{font-size:11px;line-height:1.6}\n.ls-scene-performance [role=status]{padding:12px 0;border-top:1px solid var(--daw-border-strong);min-height:44px}\n@media(max-width:560px){.ls-desk[data-workspace=daw][data-daw-view=perform] .ls-scene-performance{grid-column:1;padding:18px}.ls-scene-pads{gap:8px}.ls-desk .ls-scene-pads button{padding:10px;font-size:15px;min-height:118px}}\n.ls-waveform{display:none;min-width:0;outline-offset:3px}\n.ls-waveform [data-audio=insert-panel]>h4,.ls-waveform [data-audio=insert-panel]>p,.ls-waveform [data-audio=insert-panel]>output{flex-basis:100%;margin:0}\n.ls-waveform [data-audio=insert-panel] label{flex-wrap:wrap;max-width:100%}.ls-waveform [data-audio=insert-panel] input,.ls-waveform [data-audio=insert-panel] select{min-width:0;max-width:100%;box-sizing:border-box}\n.ls-waveform [data-insert=status][data-error=true]{color:var(--cre8-view-danger,#ffb4a6)}\n.ls-desk[data-workspace=daw][data-daw-view=waveform] .ls-waveform{display:block;order:-1}\n.ls-desk[data-workspace=daw][data-daw-view=waveform] [data-ls-pane],.ls-desk[data-workspace=daw][data-daw-view=waveform] .ls-draft-bar{display:none!important}\n.ls-waveform header{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}.ls-waveform h3{margin:3px 0;font-size:20px}.ls-waveform output{font:11px/1.5 ui-monospace,monospace;overflow-wrap:anywhere;color:var(--daw-soft)}\n.ls-wave-tools,.ls-wave-selection{display:flex;gap:6px;flex-wrap:wrap;align-items:center;margin:12px 0}.ls-waveform label{display:flex;gap:5px;align-items:center;font-size:11px;color:var(--daw-soft)}.ls-waveform input[type=checkbox]{width:auto}.ls-waveform input[type=number]{width:105px!important;box-sizing:border-box}.ls-wave-selection label{flex-direction:column;align-items:flex-start}.ls-waveform input[data-wave=db]{width:65px!important}\n.ls-waveform canvas{display:block;box-sizing:border-box;width:100%;height:280px;background:var(--daw-well);border:1px solid var(--daw-border-strong);border-radius:6px;touch-action:none;cursor:crosshair}.ls-waveform canvas:focus-visible{outline:2px solid var(--daw-accent);outline-offset:3px}\n.ls-waveform input[data-wave=scroll]{display:block;width:100%;margin:8px 0;accent-color:var(--daw-accent)}.ls-waveform [data-wave=status]{min-height:18px;color:var(--daw-soft)}.ls-waveform [data-wave=status][data-error=true]{color:var(--cre8-view-danger,#ffb4a6)}.ls-waveform details{font-size:11px;color:var(--daw-muted)}.ls-waveform [aria-busy=true]{opacity:.65}\n@media(max-width:560px){.ls-wave-tools button{min-height:40px}.ls-waveform canvas{height:250px}.ls-wave-selection{gap:8px}.ls-waveform header output{flex-basis:100%}}\n.ls-audio-timeline{margin:20px 0;padding:16px 0;border-top:1px solid var(--daw-border-strong);border-bottom:1px solid var(--daw-border-strong)}.ls-audio-track{border:1px solid var(--daw-border);border-radius:6px;margin:10px 0;padding:8px;min-width:0}.ls-audio-track .ls-wave-tools{margin:0 0 8px}.ls-audio-track input[data-track=pan]{width:85px}.ls-audio-lane{position:relative;height:68px;background:repeating-linear-gradient(90deg,var(--daw-well) 0%,var(--daw-well) 9.9%,var(--daw-border-strong) 10%);overflow:hidden}.ls-desk[data-workspace=daw] .ls-audio-lane button{position:absolute;top:4px;height:60px;min-width:3px;overflow:hidden;padding:3px;border:1px solid var(--daw-accent);background:color-mix(in srgb,var(--daw-accent) 45%,#06130f);color:#e5f3de;text-align:left;touch-action:none;cursor:grab;white-space:nowrap}.ls-desk[data-workspace=daw] .ls-audio-lane button[aria-pressed=true]{border:2px solid var(--daw-ink);background:color-mix(in srgb,var(--daw-accent) 70%,#06130f)}.ls-audio-lane canvas{position:absolute;inset:18px 0 0;width:100%;height:38px;border:0;border-radius:0;pointer-events:none;background:transparent}.ls-waveform select{max-width:260px}.ls-waveform input[data-audio=name],.ls-waveform input[data-track=name]{width:170px;max-width:100%}.ls-waveform [data-audio=record-status]{max-width:440px}.ls-waveform meter{width:110px}.ls-waveform [data-audio=save-status][data-error=true]{color:var(--cre8-view-danger,#ffb4a6)}.ls-waveform .ls-audio-timeline p{font-size:11px;color:var(--daw-muted)}\n.ls-audio-playhead{position:absolute;top:0;height:100%;width:2px;background:var(--daw-accent);pointer-events:none;z-index:2}\n.ls-wave-generator{border:1px solid var(--daw-border-strong);border-radius:6px;padding:12px;margin:16px 0}.ls-wave-generator summary{font-size:13px;color:var(--daw-ink);cursor:pointer}.ls-wave-generator [hidden]{display:none!important}.ls-wave-generator label{flex-direction:column;align-items:flex-start}.ls-wave-generator [data-audio=generator-status][data-error=true]{color:var(--cre8-view-danger,#ffb4a6)}\n.ls-wave-geometry{min-width:0}.ls-wave-geometry p{max-width:72ch}.ls-wave-geometry [data-audio=generator-projection]{color:var(--daw-soft);max-width:640px}.ls-wave-geometry svg{display:block;width:100%;height:auto}.ls-wave-geometry .ls-wave-tools>div{min-width:0}\n.ls-wave-geometry{border:1px solid var(--daw-border-strong);border-radius:8px;padding:16px;margin:12px 0;background:var(--daw-panel)}.ls-wave-geometry h4{margin:0 0 6px;font-size:16px;color:var(--daw-ink)}.ls-wave-geometry-intro{margin:0 0 16px;color:var(--daw-soft)}.ls-wave-geometry-grid{display:grid;grid-template-columns:minmax(240px,1fr) minmax(260px,1.2fr);gap:20px;align-items:start}.ls-wave-geometry-controls>.ls-wave-tools{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin:0}.ls-wave-geometry-controls label{display:flex;gap:6px;min-width:0}.ls-wave-geometry-controls select,.ls-wave-geometry-controls input{box-sizing:border-box;width:100%;max-width:100%;min-width:0}.ls-wave-geometry-summary{padding:12px;border-left:3px solid var(--daw-accent);background:color-mix(in srgb,var(--daw-accent) 12%,var(--daw-panel));color:var(--daw-ink);font-size:12px;line-height:1.6}.ls-wave-geometry-visual{border:1px solid var(--daw-border);border-radius:6px;padding:8px 12px}.ls-wave-geometry-visual .ls-wave-tools{margin:6px 0;align-items:center}.ls-wave-geometry-visual p{font-size:11px;color:var(--daw-soft);flex:1;min-width:150px;margin:0}.ls-wave-geometry-help{border-top:1px solid var(--daw-border);padding-top:12px;margin-top:12px}.ls-wave-geometry-help p{font-size:12px;color:var(--daw-soft);line-height:1.6}.ls-wave-generator [data-audio-action=generate-wave]{background:var(--daw-accent);color:var(--daw-accent-ink);border-color:var(--daw-accent);font-weight:700}.ls-wave-generator [data-audio-action=generate-wave]:disabled{opacity:.45}.ls-wave-generator button:focus-visible,.ls-wave-generator summary:focus-visible,.ls-wave-generator input:focus-visible,.ls-wave-generator select:focus-visible{outline:2px solid var(--daw-accent);outline-offset:3px}@media(max-width:1050px){.ls-wave-geometry-grid{grid-template-columns:minmax(0,1fr)}.ls-wave-geometry-visual{max-width:600px}}@media(max-width:440px){.ls-wave-geometry-controls>.ls-wave-tools{grid-template-columns:minmax(0,1fr)}.ls-wave-geometry{padding:12px}}\n.ls-wave-geometry-controls>.ls-wave-tools>.primitive-select,.ls-wave-geometry-controls>.ls-wave-tools>.primitive-input{display:flex;flex-direction:column;gap:6px;min-width:0}\n.ls-desk .ls-waveform .ls-wave-generator button[data-audio-action=generate-wave]{background:var(--daw-accent);color:var(--daw-accent-ink);border-color:var(--daw-accent)}\n.ls-wave-analysis{border:1px solid var(--daw-border-strong);border-radius:6px;padding:12px;margin:12px 0}.ls-wave-analysis summary,.ls-spectrum-settings summary{cursor:pointer;color:var(--daw-ink)}.ls-waveform canvas[data-spectrum=plot]{height:220px;margin-top:12px;cursor:default;touch-action:auto}.ls-waveform canvas[hidden]{display:none!important}.ls-spectrum-results{max-width:100%;overflow:auto}.ls-spectrum-results table{width:100%;border-collapse:collapse;margin-top:12px;font-size:11px}.ls-spectrum-results th,.ls-spectrum-results td{padding:8px;text-align:left;border-bottom:1px solid var(--daw-border);vertical-align:top}.ls-spectrum-results td:last-child{min-width:180px}.ls-spectrum-settings{flex:1}.ls-spectrum-settings label{flex-direction:column;align-items:flex-start}\n.ls-audio-automation { margin-top: 1rem; padding: 1rem; border: 1px solid var(--daw-border); border-radius: 8px; background: var(--daw-panel); }\n.ls-automation-controls { display: flex; flex-wrap: wrap; align-items: end; gap: .65rem; }\n.ls-automation-controls input, .ls-automation-controls select { max-width: 16rem; }\n.ls-automation-curve { display: block; width: 100%; height: 140px; margin-top: 1rem; border: 1px solid var(--daw-border-strong); border-radius: 4px; background: var(--daw-well); cursor: crosshair; }\n/* Editor layout. The template lists controls by owner; this orders them as an editor: project, one wrapping toolbar row, the audio view with its selection and status, quick processing, tool panels, then the project mix. */\n.ls-desk[data-workspace=daw][data-daw-view=waveform] .ls-daw-library{display:none}\n.ls-desk[data-workspace=daw][data-daw-view=waveform] .ls-code{grid-column:1/-1}\n.ls-desk[data-workspace=daw][data-daw-view=waveform] .ls-waveform{display:flex;flex-wrap:wrap;align-items:center;gap:8px}\n.ls-waveform>*{flex:1 1 100%;min-width:0;margin:0;order:20}\n.ls-desk .ls-waveform>details{margin:0}\n.ls-waveform>header{order:0}\n.ls-waveform>[aria-label=\"Audio project\"]{order:1;padding-bottom:8px;border-bottom:1px solid var(--daw-border)}\n.ls-waveform>[aria-label=\"Waveform files\"]{order:2}\n.ls-waveform>[aria-label=\"Waveform transport and navigation\"]{order:3}\n.ls-waveform>[aria-label=\"Waveform edits\"]{order:4}\n.ls-waveform>[aria-label=\"Waveform display\"]{order:5}\n.ls-waveform>[data-spectrum=display-status]{order:6;flex:1 1 220px;color:var(--daw-muted)}\n.ls-waveform>canvas{order:7;max-width:100%}\n.ls-waveform>.primitive-input:has(>[data-wave=scroll]){order:8}\n.ls-waveform>.ls-wave-selection{order:9}\n.ls-waveform>[data-wave=status]{order:10;padding:7px 10px;border-left:3px solid var(--daw-accent);border-radius:0 4px 4px 0;background:color-mix(in srgb,var(--daw-accent) 10%,var(--daw-panel));font-size:12px}\n.ls-waveform>[data-wave=status][data-error=true]{border-left-color:var(--cre8-view-danger,#ff907f)}\n.ls-waveform>[aria-label=\"Waveform processing\"]{order:11}\n.ls-waveform>.ls-wave-analysis{order:12}\n.ls-waveform>.ls-wave-generator{order:13}\n.ls-waveform>details:has([data-audio=device]){order:14}\n.ls-waveform>.ls-wave-process{order:15}\n.ls-waveform>.ls-audio-timeline{order:30}\n.ls-waveform>[data-audio=song-panel]{order:31}\n.ls-waveform>[data-audio=insert-panel]{order:32}\n.ls-waveform>details:last-child{order:40}\n.ls-waveform>.ls-wave-tools[role=group]{flex:0 1 auto;gap:4px;padding:5px;border:1px solid var(--daw-border);border-radius:6px;background:var(--daw-panel)}\n.ls-waveform>[aria-label=\"Audio project\"].ls-wave-tools,.ls-waveform>[aria-label=\"Waveform processing\"].ls-wave-tools{flex:1 1 100%;padding:0 0 8px;border-width:0 0 1px;border-radius:0;background:none}\n.ls-waveform>[aria-label=\"Waveform processing\"].ls-wave-tools{padding:0;border:0}\n.ls-waveform>.ls-wave-tools[role=group] .primitive-input,.ls-waveform>.ls-wave-tools[role=group] .primitive-select{display:flex;flex-direction:row;margin:0;align-items:center;gap:6px}\n.ls-waveform>.ls-wave-tools[role=group] .primitive-input__label,.ls-waveform>.ls-wave-tools[role=group] .primitive-select__label{margin:0;white-space:nowrap}\n.ls-waveform>.ls-wave-tools button:disabled,.ls-waveform>.ls-wave-selection button:disabled{opacity:.4}\n.ls-waveform [data-wave-action=play]:not(:disabled){background:var(--daw-accent);color:var(--daw-accent-ink);border-color:var(--daw-accent)}\n.ls-waveform>.primitive-input:has(>[data-wave=scroll])>label{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}\n.ls-waveform>.primitive-input:has(>[data-wave=scroll]) input{margin:0}\n.ls-waveform>.primitive-input:has(>[data-wave=scroll]:disabled){display:none}\n.ls-waveform>.ls-wave-selection{align-items:flex-end}\n.ls-waveform>details{flex:1 1 calc(50% - 4px);align-self:flex-start;box-sizing:border-box;padding:0;border:1px solid var(--daw-border);border-radius:6px;background:var(--daw-panel)}\n.ls-waveform>details[open]{flex-basis:100%;padding-bottom:12px}\n.ls-waveform>details>summary{padding:9px 12px;font-size:12px;font-weight:600;color:var(--daw-ink);cursor:pointer}\n.ls-waveform>details>summary:hover{background:var(--daw-control-hi)}\n.ls-waveform>details>:not(summary){margin-left:12px;margin-right:12px}\n.ls-waveform>.ls-audio-timeline,.ls-waveform>[data-audio=song-panel],.ls-waveform>[data-audio=insert-panel]{box-sizing:border-box;margin-top:8px;padding:14px;border:1px solid var(--daw-border);border-radius:6px;background:var(--daw-panel)}\n.ls-waveform>.ls-audio-timeline h3,.ls-waveform>[data-audio=song-panel] h4,.ls-waveform>[data-audio=insert-panel] h4{margin:0 0 6px;font-size:14px}\n.ls-waveform>.ls-audio-timeline>header{margin-bottom:10px}\n.ls-waveform>[data-audio=song-panel]{display:flex;flex-wrap:wrap;align-items:center;gap:6px}\n.ls-waveform>[data-audio=song-panel]>:is(h4,p,output){flex-basis:100%;margin:0}\n/* Tracks come first; the native-effect companion follows the clip and automation tools. */\n.ls-waveform>.ls-audio-timeline{display:flex;flex-direction:column}\n.ls-audio-timeline>.ls-native-effects{order:1;margin-top:14px;padding-top:12px;border-top:1px solid var(--daw-border)}\n.ls-audio-timeline>.ls-quiet-help{order:2}\n/* Clip, native-effect and automation controls act on audio tracks, so they wait for the first one. */\n.ls-audio-timeline:has(>[data-audio=tracks]:empty)>:is(.ls-native-effects,[aria-label=\"Selected audio clip\"],.ls-audio-automation){display:none}\n.ls-audio-timeline>[data-audio=tracks]:empty::before{content:\"No audio tracks yet. Select a range in the waveform, then Add selection as track.\";display:block;padding:14px;border:1px dashed var(--daw-border-strong);border-radius:6px;font-size:11px;color:var(--daw-muted)}\n/* Before any audio is loaded only the ways to get audio in are offered. */\n.ls-waveform[data-wave-empty=true]>:is([aria-label=\"Waveform transport and navigation\"],[aria-label=\"Waveform edits\"],[aria-label=\"Waveform display\"],[aria-label=\"Waveform processing\"],[data-spectrum=display-status],.ls-wave-selection,.ls-wave-analysis,.ls-wave-process){display:none}\n.ls-waveform[data-wave-empty=true]>canvas{height:180px;cursor:default}\n@media(max-width:700px){.ls-waveform>details{flex-basis:100%}}\n</style>"},"tag":"RawHtml"},{"children":[{"children":[],"kind":"view-node","props":{"html":"<script type=\"application/json\" data-ls=\"presets\">{\n  \"pulse\": \"// Pulse engine · x is a hit, X is an accent\\ntempo 124\\nbars 2\\ninstrument bass saw_bass\\ninstrument arp bell\\nlevel reverb 0.25\\n\\npattern kick X...x...X...x... 0 8 0.8\\npattern snare ....x.......x... 0 8 0.65\\npattern hat ..x...x...x...x. 0 8 0.35\\nsequence bass C2,-,C2,G2,A#1,-,G2,- 0 8 0.65 0.7\\nsequence arp C4,D#4,G4,A#4,G4,D#4,C4,G3 0 8 0.45 0.45\\n\",\n  \"drift\": \"// Drift · long gates and soft space\\ntempo 72\\nbars 4\\ninstrument pads warm_pad\\ninstrument melody bell\\nlevel drums 0.45\\nlevel reverb 0.55\\n\\nsequence pads C3,D#3,G3,A#2 0 16 0.95 0.5\\nsequence melody G4,-,D#4,-,A#4,G4,-,D#4 0 16 0.6 0.5\\npattern kick x.......x....... 0 16 0.7\\npattern hat ..x...x...x...x. 0 16 0.3\\n\",\n  \"composer\": \"// Composer seed → editable score\\ntempo 110\\nbars 4\\ncompose house 7\\nclear bass\\ninstrument bass saw_bass\\nsequence bass C2,-,G2,-,A#1,-,G2,C2 0 16 0.75 0.8\\nlevel reverb 0.3\\n\",\n  \"console\": \"// Console · the same notes through inserts and sends\\ntempo 118\\nbars 2\\nkit house\\ninstrument bass saw_bass\\ninstrument arp bell\\n\\npattern kick x...x...x...x... 0 8 0.85\\npattern hat ..x...x...x...x. 0 8 0.3\\nsequence bass C2,-,G2,-,A#1,-,G2,- 0 8 0.7 0.75\\nsequence arp C4,D#4,G4,A#4 0 8 0.4 0.4\\n\\npan arp -0.5\\nfx bass filter mode=low_pass cutoff_hz=900 resonance=1.4\\nfx bass sat kind=tube drive=2.5 mix=0.6\\nfx drums comp threshold_db=-16 ratio=4 attack_ms=8\\nfx master eq3 low_gain_db=1.5 high_gain_db=2\\nmaster glue=1 threshold=-14 ratio=3\\n\",\n  \"echoes\": \"// Echoes · the delay bus, tempo synced\\ntempo 92\\nbars 2\\nlevel reverb 0.25\\ninstrument melody bell\\n\\npattern kick x.......x....... 0 8 0.7\\nsequence melody G4,-,D#4,-,A#4,-,G4,- 0 8 0.35 0.6\\nsequence bass C2,-,-,-,A#1,-,-,- 0 8 0.9 0.7\\n\\ndelay time=1/8. feedback=0.45 pingpong=1 damping=4200\\nsend melody delay 0.6\\nsend arp delay 0.3\\nlevel delay 0.8\\n\",\n  \"sweep\": \"// Sweep · automation on a fader and a filter\\ntempo 126\\nbars 4\\nkit analog_808\\ninstrument pads warm_pad\\n\\npattern kick x...x...x...x...x...x...x...x... 0 16 0.85\\nsequence pads C3,D#3,G3,A#3 0 16 0.95 0.5\\nsequence bass C2,C2,G2,A#1 0 16 0.6 0.75\\n\\nfx pads filter mode=low_pass cutoff_hz=400 resonance=3\\nautomation pads fx.1.cutoff_hz 0 300\\nautomation pads fx.1.cutoff_hz 12 6000\\nautomation pads fx.1.cutoff_hz 16 300\\nautomation bass gain 0 0.15\\nautomation bass gain 16 1\\nreverb preset=classic mix=0.4\\n\",\n  \"showcase\": \"// Night Signal · inserts, sends, both buses, automation and the master chain\\ntempo 124\\nbars 4\\nkit house\\ninstrument bass saw_bass\\ninstrument pads warm_pad\\ninstrument melody bell\\ninstrument arp bell\\n\\npattern kick X...x...X...x...X...x...X...x... 0 16 0.85\\npattern snare ....x.......x.......x.......x..x 0 16 0.6\\npattern hat ..x...x...x...x...x...x...x.x.x. 0 16 0.3\\nsequence bass C2,-,C2,G2,A#1,-,A#1,D#2,G#1,-,G#1,D#2,G1,-,G1,A#1 0 16 0.7 0.75\\nsequence pads C3,A#2,G#2,G2 0 16 0.95 0.5\\nsequence melody G4,-,D#4,-,A#4,G4,-,D#4,C5,-,G4,-,F4,D#4,D4,- 0 16 0.55 0.5\\nsequence arp C4,D#4,G4,A#4,G4,D#4,C4,G3,G#3,C4,D#4,G4,G3,B3,D4,G4 0 16 0.4 0.4\\n\\n// Placement and space\\npan arp -0.45\\npan melody 0.3\\nsend pads reverb 0.5\\nsend melody reverb 0.4\\nsend arp delay 0.45\\nsend melody delay 0.25\\nreverb preset=classic mix=0.35\\ndelay time=1/8. feedback=0.4 pingpong=1 damping=4200\\nlevel delay 0.7\\n\\n// Inserts\\nfx bass filter mode=low_pass cutoff_hz=900 resonance=1.4\\nfx bass sat kind=tube drive=2.5 mix=0.6\\nfx drums comp threshold_db=-16 ratio=4 attack_ms=8\\nfx pads filter mode=low_pass cutoff_hz=400 resonance=2.5\\nfx pads chorus\\nfx arp phaser\\nfx master eq3 low_gain_db=1.5 high_gain_db=2\\nmaster glue=1 threshold=-14 ratio=3\\n\\n// Automation: the pads open across the phrase and duck under every kick; the melody fades in, the arp fades out\\nautomation pads fx.1.cutoff_hz 0 400\\nautomation pads fx.1.cutoff_hz 12 5000\\nautomation pads fx.1.cutoff_hz 16 400\\nautomation pads gain 0 0.3\\nautomation pads gain 0.75 1\\nautomation pads gain 1 0.3\\nautomation pads gain 1.75 1\\nautomation pads gain 2 0.3\\nautomation pads gain 2.75 1\\nautomation pads gain 3 0.3\\nautomation pads gain 3.75 1\\nautomation pads gain 4 0.3\\nautomation pads gain 4.75 1\\nautomation pads gain 5 0.3\\nautomation pads gain 5.75 1\\nautomation pads gain 6 0.3\\nautomation pads gain 6.75 1\\nautomation pads gain 7 0.3\\nautomation pads gain 7.75 1\\nautomation pads gain 8 0.3\\nautomation pads gain 8.75 1\\nautomation pads gain 9 0.3\\nautomation pads gain 9.75 1\\nautomation pads gain 10 0.3\\nautomation pads gain 10.75 1\\nautomation pads gain 11 0.3\\nautomation pads gain 11.75 1\\nautomation pads gain 12 0.3\\nautomation pads gain 12.75 1\\nautomation pads gain 13 0.3\\nautomation pads gain 13.75 1\\nautomation pads gain 14 0.3\\nautomation pads gain 14.75 1\\nautomation pads gain 15 0.3\\nautomation pads gain 15.75 1\\nautomation melody gain 0 0\\nautomation melody gain 4 1\\nautomation arp gain 12 1\\nautomation arp gain 16 0.1\\n\"\n}\n</script>"},"tag":"RawHtml"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"className":"ls-eyebrow","text":"CRE8 DAW / SONG WORKSPACE","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Audio editor","variant":"h1"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Code notes, play the synth, shape the mix. Your next edit lands on a bar.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-ls-nav":true,"href":"/view/virtual/performance","label":"Performance editor"},"tag":"Action"}],"kind":"view-node","props":{"aria-label":"Related audio areas","data-editor-part":"actions","element":"nav"},"tag":"Section"}],"kind":"view-node","props":{"data-editor-strip":"identity","element":"header"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"html":"<style>.ssr-action-menu{position:relative;display:inline-block;font:12px/1.5 system-ui,sans-serif;color:var(--vp-ink,#e4f2ee)}\n.ssr-action-menu>summary{display:flex;align-items:center;gap:16px;cursor:pointer;list-style:none;padding:6px 10px;border:1px solid transparent;border-radius:5px;user-select:none}\n.ssr-action-menu>summary::-webkit-details-marker{display:none}\n.ssr-action-menu>summary:hover,.ssr-action-menu[open]>summary{background:light-dark(#eef6f3,#1b3229);border-color:light-dark(#ccded5,#385747)}\n.ssr-action-menu>summary>span{color:light-dark(#516e5e,#97b3a4);font-size:11px}\n.ssr-action-menu>[role=menu]{position:absolute;top:calc(100% + 4px);left:0;z-index:50;min-width:190px;max-width:calc(100vw - 48px);padding:5px;border:1px solid light-dark(#cadbd2,#426151);border-radius:8px;background:light-dark(#f3f9f7,#10221c);box-shadow:0 12px 32px #0008}\n.ssr-action-menu:not([open])>[role=menu]{display:none}\nbody .ssr-action-menu :is([role=menuitem],[role=menuitemcheckbox]){display:block;width:100%;text-align:left;white-space:normal;border:0;border-radius:4px;padding:9px 12px;background:transparent;color:light-dark(#21312c,#e4f2ee);font:12px/1.5 system-ui;cursor:pointer}\nbody .ssr-action-menu :is([role=menuitem],[role=menuitemcheckbox]):hover,body .ssr-action-menu :is([role=menuitem],[role=menuitemcheckbox]):focus-visible{background:light-dark(#e6f1ec,#2b4b3b);outline:2px solid #99cfad;outline-offset:-2px}\nbody .ssr-action-menu :is([role=menuitem],[role=menuitemcheckbox]):disabled{opacity:.4;cursor:default;background:transparent}\n.ssr-action-menu [role=menuitemcheckbox]::after{content:'○' / '';float:right;margin-left:12px}\n.ssr-action-menu [role=menuitemcheckbox][aria-checked=true]::after{content:'✓' / ''}\n.ssr-action-menu>summary:focus-visible{outline:2px solid #99cfad;outline-offset:2px}\n.ssr-action-menu[data-align=end]>[role=menu]{left:auto;right:0}\n</style><script>/* Shared enhancement of server-authored action menus; commands remain app-owned. */\n(() => {\n  if (window.__cre8SsrActionMenus) return;\n  window.__cre8SsrActionMenus = true;\n  const menuOf = node => node instanceof Element ? node.closest('[data-ssr-menu]') : null;\n  const trigger = menu => menu.querySelector('summary');\n  const targetOf = item => document.getElementById(item.dataset.ssrMenuTarget);\n  const available = target => target instanceof HTMLButtonElement && !target.hasAttribute('data-ssr-menu-target') && !target.matches(':disabled') && target.getAttribute('aria-disabled') !== 'true' && !target.closest('[inert]');\n  const returnFocus = new WeakMap();\n  function sync(menu) {\n    if (trigger(menu).getAttribute('aria-expanded') !== String(menu.open)) trigger(menu).setAttribute('aria-expanded', String(menu.open));\n    for (const item of menu.querySelectorAll('[data-ssr-menu-target]')) {\n      const target = targetOf(item);\n      item.disabled = !available(target);\n      const checked = target?.getAttribute('aria-pressed') ?? target?.getAttribute('aria-expanded');\n      item.setAttribute('role', checked === 'true' || checked === 'false' ? 'menuitemcheckbox' : 'menuitem');\n      if (checked === 'true' || checked === 'false') item.setAttribute('aria-checked', checked);\n      else item.removeAttribute('aria-checked');\n    }\n  }\n  const items = menu => [...menu.querySelectorAll('[data-ssr-menu-target]')].filter(item => !item.disabled);\n  function close(menu, focus = false) {\n    menu.open = false; sync(menu);\n    const previous = returnFocus.get(menu);\n    const anchor = previous?.id ? document.getElementById(previous.id) : previous;\n    if (focus) (anchor?.isConnected ? anchor : trigger(menu)).focus({preventScroll:true});\n    returnFocus.delete(menu);\n  }\n  function open(menu, last = false, context = null) {\n    document.querySelectorAll('[data-ssr-menu][open]').forEach(other => { if (other !== menu) close(other); });\n    returnFocus.set(menu, context?.owner || trigger(menu));\n    menu.open = true; sync(menu);\n    const list = items(menu);\n    menu.dataset.align = 'start';\n    const rect = menu.querySelector('[role=menu]').getBoundingClientRect();\n    menu.dataset.align = rect.right > innerWidth - 12 ? 'end' : 'start';\n    if (menu.hasAttribute('data-ssr-menu-floating')) {\n      const panel = menu.querySelector('[role=menu]'), anchor = trigger(menu).getBoundingClientRect();\n      const left = Math.max(12, Math.min(context ? context.x : anchor.left, innerWidth - rect.width - 12));\n      const preferredTop = context ? context.y : anchor.bottom + 4;\n      const top = Math.max(12, Math.min(preferredTop, innerHeight - rect.height - 12));\n      Object.assign(panel.style, {position:'fixed', left:left+'px', right:'auto', top:top+'px', maxHeight:'calc(100dvh - 24px)', overflowY:'auto'});\n    }\n    ((last ? list.at(-1) : list[0]) || trigger(menu)).focus({preventScroll:true});\n  }\n  // Consumers opt in with the ID of their server-rendered menu. No commands or selectors are evaluated.\n  const contextMenu = node => {\n    const owner = node instanceof Element ? node.closest('[data-ssr-context-menu]') : null;\n    const menu = owner && document.getElementById(owner.dataset.ssrContextMenu);\n    return menu?.matches('[data-ssr-menu]') ? menu : null;\n  };\n  document.addEventListener('contextmenu', event => {\n    const menu = contextMenu(event.target);\n    if (event.defaultPrevented || !menu || event.target.closest('input,textarea,select,[contenteditable=true]')) return;\n    const owner = event.target.closest('button,[tabindex]') || trigger(menu);\n    const rect = owner.getBoundingClientRect();\n    event.preventDefault(); open(menu, false, {owner, x:event.clientX || rect.left, y:event.clientY || rect.bottom});\n  });\n  document.addEventListener('click', event => {\n    const opener = event.target.closest?.('[data-ssr-menu-open]');\n    if (opener && !opener.matches(':disabled') && opener.getAttribute('aria-disabled') !== 'true') {\n      const linked = document.getElementById(opener.dataset.ssrMenuOpen);\n      if (linked?.matches('[data-ssr-menu]')) {\n        event.preventDefault();\n        const owner = (opener.id && document.getElementById(opener.id)) || opener;\n        const rect = owner.getBoundingClientRect();\n        open(linked, false, {owner, x:rect.left, y:rect.bottom});\n        return;\n      }\n    }\n    const menu = menuOf(event.target);\n    if (!menu) return;\n    if (event.target.closest('summary') === trigger(menu)) {\n      event.preventDefault(); menu.open ? close(menu) : open(menu); return;\n    }\n    const item = event.target.closest('[data-ssr-menu-target]');\n    if (!item || !menu.contains(item)) return;\n    const target = targetOf(item);\n    if (!available(target)) { sync(menu); return; }\n    close(menu, true);\n    target.click();\n  });\n  document.addEventListener('keydown', event => {\n    if (event.key === 'ContextMenu' || (event.shiftKey && event.key === 'F10')) {\n      const context = contextMenu(event.target);\n      if (context && !event.defaultPrevented && !event.target.closest('input,textarea,select,[contenteditable=true]')) {\n        const owner = (event.target.id && document.getElementById(event.target.id)) || event.target;\n        const rect = owner.getBoundingClientRect();\n        event.preventDefault(); open(context, false, {owner,x:rect.left,y:rect.bottom}); return;\n      }\n    }\n    const menu = menuOf(event.target);\n    if (!menu) return;\n    if (event.key === 'Escape' && menu.open) { event.preventDefault(); close(menu, true); return; }\n    if (event.key === 'Tab' && menu.open) { close(menu, true); return; }\n    if (event.isComposing || event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) return;\n    const onTrigger = event.target === trigger(menu);\n    if (['ArrowLeft','ArrowRight'].includes(event.key) && menu.closest('[data-ssr-menubar]')) {\n      const peers = [...menu.closest('[data-ssr-menubar]').querySelectorAll('[data-ssr-menu]')];\n      const next = peers[(peers.indexOf(menu) + (event.key === 'ArrowRight' ? 1 : -1) + peers.length) % peers.length];\n      event.preventDefault(); menu.open ? open(next) : trigger(next).focus(); return;\n    }\n    if (onTrigger && ['ArrowDown', 'ArrowUp'].includes(event.key)) { event.preventDefault(); open(menu, event.key === 'ArrowUp'); return; }\n    if (!menu.open || !['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(event.key)) return;\n    event.preventDefault(); sync(menu);\n    const list = items(menu), index = list.indexOf(document.activeElement);\n    const next = event.key === 'Home' ? 0 : event.key === 'End' ? list.length - 1 : (index + (event.key === 'ArrowDown' ? 1 : -1) + list.length) % list.length;\n    list[next]?.focus();\n  });\n  document.addEventListener('pointerdown', event => {\n    document.querySelectorAll('[data-ssr-menu][open]').forEach(menu => { if (!menu.contains(event.target)) close(menu); });\n  });\n  document.addEventListener('focusin', event => {\n    document.querySelectorAll('[data-ssr-menu][open]').forEach(menu => { if (!menu.contains(event.target)) close(menu); });\n  });\n  document.addEventListener('toggle', event => { if (event.target.matches?.('[data-ssr-menu]')) sync(event.target); }, true);\n  const closeFloating = event => document.querySelectorAll('[data-ssr-menu-floating][open]').forEach(menu => {\n    if (!(event.target instanceof Node) || !menu.contains(event.target)) close(menu);\n  });\n  document.addEventListener('scroll', closeFloating, true);\n  window.addEventListener('resize', closeFloating);\n  // A native preparation can enable exports while a menu is already open.\n  new MutationObserver(records => {\n    if (records.some(record => !record.target.hasAttribute('data-ssr-menu-target'))) {\n      document.querySelectorAll('[data-ssr-menu][open]').forEach(sync);\n    }\n  }).observe(document, {subtree:true, attributes:true, attributeFilter:['disabled','aria-disabled','aria-pressed','aria-expanded','inert']});\n})();\n</script><details class=\"ssr-action-menu\" data-ssr-menu data-ssr-menu-floating id=\"ls-file-menu\"><summary role=\"button\" id=\"ls-file-menu-trigger\" aria-haspopup=\"menu\" aria-expanded=\"false\" aria-controls=\"ls-file-menu-items\">File<span aria-hidden=\"true\">⌄</span></summary><div id=\"ls-file-menu-items\" role=\"menu\" aria-labelledby=\"ls-file-menu-trigger\"><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-open-project\" >Open project…</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-save-project\" >Save project…</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-open-file\" >Open score, session or audio…</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-save-file\" >Save music draft…</button></div></details><details class=\"ssr-action-menu\" data-ssr-menu data-ssr-menu-floating id=\"ls-edit-menu\"><summary role=\"button\" id=\"ls-edit-menu-trigger\" aria-haspopup=\"menu\" aria-expanded=\"false\" aria-controls=\"ls-edit-menu-items\">Edit<span aria-hidden=\"true\">⌄</span></summary><div id=\"ls-edit-menu-items\" role=\"menu\" aria-labelledby=\"ls-edit-menu-trigger\"><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-undo-draft\" disabled>Undo draft replacement</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-revert-draft\" disabled>Restore prepared take</button></div></details><details class=\"ssr-action-menu\" data-ssr-menu data-ssr-menu-floating id=\"ls-view-menu\"><summary role=\"button\" id=\"ls-view-menu-trigger\" aria-haspopup=\"menu\" aria-expanded=\"false\" aria-controls=\"ls-view-menu-items\">View<span aria-hidden=\"true\">⌄</span></summary><div id=\"ls-view-menu-items\" role=\"menu\" aria-labelledby=\"ls-view-menu-trigger\"><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-focus-editor\" >Focus editor</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-view-tracks\" >Tracks</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-view-perform\" >Scenes</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-view-instruments\" >Instruments</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-view-flow\" >Signal flow</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-view-clips\" >Clips</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-view-waveform\" >Waveform</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-view-piano\" >Piano roll</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-view-code\" >Music code</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-view-session\" >Session</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-view-midi\" >MIDI recorder</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-view-visual\" >Visuals</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-view-mixer\" >Mixer</button></div></details><details class=\"ssr-action-menu\" data-ssr-menu data-ssr-menu-floating id=\"ls-export-menu\"><summary role=\"button\" id=\"ls-export-menu-trigger\" aria-haspopup=\"menu\" aria-expanded=\"false\" aria-controls=\"ls-export-menu-items\">Export song<span aria-hidden=\"true\">⌄</span></summary><div id=\"ls-export-menu-items\" role=\"menu\" aria-labelledby=\"ls-export-menu-trigger\"><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-export-wav\" disabled>Song audio · WAV</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-export-midi\" disabled>Song notes · MIDI (.mid)</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-export-session\" disabled>Song session (.json)</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-publish-item\" disabled>Publish song as item</button></div></details>"},"tag":"RawHtml"},{"children":[],"kind":"view-node","props":{"hidden":true},"tag":"Section"}],"kind":"view-node","props":{"aria-label":"Editor menus","className":"ls-menu-bar","data-editor-strip":"menu","data-ssr-menubar":true,"element":"nav"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-ls":"saved-state","text":"Draft stays in this browser tab","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"controlKey":"live-score.13","data-ls":"save-project","disabled":false,"hidden":true,"id":"ls-save-file","label":"Save draft file"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"live-score.14","data-ls":"open-project","disabled":false,"hidden":true,"id":"ls-open-file","label":"Open score, session or audio"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"accept":".json,.cre8score,.txt,audio/*,.wav,.mp3,.m4a,.ogg,.flac","controlKey":"live-score.15","data-ls":"file","disabled":false,"hidden":true,"kind":"file","label":"","name":"live-score-15"},"tag":"Input"}],"kind":"view-node","props":{"hidden":true},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Switching pages preserves your draft. Prepare again to play.","variant":"span"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Position ","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"data-daw-status":"position","text":"1.1","variant":"b"},"tag":"Text"}],"kind":"view-node","props":{"data-daw-status-cell":"position","element":"span"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"text":"Tempo ","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"data-daw-status":"tempo","text":"—","variant":"b"},"tag":"Text"}],"kind":"view-node","props":{"data-daw-status-cell":"tempo","element":"span"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"text":"Loop ","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"data-daw-status":"loop","text":"—","variant":"b"},"tag":"Text"}],"kind":"view-node","props":{"data-daw-status-cell":"loop","element":"span"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"text":"Selected ","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"data-daw-status":"selection","text":"nothing","variant":"b"},"tag":"Text"}],"kind":"view-node","props":{"data-daw-status-cell":"selection","element":"span"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-daw-status","data-daw-status-cells":true,"element":"div","hidden":true},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-project-bar","data-editor-strip":"status","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"audio.session.prepare","event":"click"},"hostOutputs":{"disabled":"prepareDisabled","text":"prepareLabel"},"id":"ls-prepare","label":"Prepare score"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"audio.session.start","event":"click"},"hostOutputs":{"disabled":"startDisabled","text":"startLabel"},"id":"ls-start","label":"Start audio"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"audio.session.stop","event":"click"},"hostOutputs":{"disabled":"stopDisabled"},"id":"ls-stop","label":"Stop"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"audio.session.wav","event":"click"},"hostOutputs":{"disabled":"exportDisabled"},"id":"ls-export-wav","label":"Song audio · WAV (one loop)"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"audio.session.midi","event":"click"},"hostOutputs":{"disabled":"exportDisabled"},"id":"ls-export-midi","label":"Song notes · MIDI (.mid)"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"audio.session.session","event":"click"},"hostOutputs":{"disabled":"exportDisabled"},"id":"ls-export-session","label":"Song session (.json)"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"audio.session.item","event":"click"},"hostOutputs":{"disabled":"exportDisabled"},"id":"ls-publish-item","label":"Publish song as item"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"aria-live":"polite","hostOutput":"exportLabel","id":"ls-export-state","role":"status","text":"Prepare a song to export WAV, MIDI or session JSON, or publish it as an item."},"tag":"Text"}],"kind":"view-node","props":{"hostCapability":"audio.session","hostVersion":1,"id":"audio-session-transport"},"tag":"Card"}],"kind":"view-node","props":{"data-cre8-host-artifact":"{\"schema\":\"cre8.view.ir\",\"version\":1,\"template_id\":\"audio.session\",\"source_hash\":\"1140f9a1d5ac410824fccb6b3bd7c546673d956cde7b64f72b7181250737add2\",\"context_hash\":\"44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a\",\"tree_hash\":\"fa30f207b1f227269e43d876e1cd92759587129c1dadedcb2cc7f500d256dd90\",\"tree_json\":\"{\\\"children\\\":[{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"audio.session.prepare\\\",\\\"event\\\":\\\"click\\\"},\\\"hostOutputs\\\":{\\\"disabled\\\":\\\"prepareDisabled\\\",\\\"text\\\":\\\"prepareLabel\\\"},\\\"id\\\":\\\"ls-prepare\\\",\\\"label\\\":\\\"Prepare score\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"audio.session.start\\\",\\\"event\\\":\\\"click\\\"},\\\"hostOutputs\\\":{\\\"disabled\\\":\\\"startDisabled\\\",\\\"text\\\":\\\"startLabel\\\"},\\\"id\\\":\\\"ls-start\\\",\\\"label\\\":\\\"Start audio\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"audio.session.stop\\\",\\\"event\\\":\\\"click\\\"},\\\"hostOutputs\\\":{\\\"disabled\\\":\\\"stopDisabled\\\"},\\\"id\\\":\\\"ls-stop\\\",\\\"label\\\":\\\"Stop\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"audio.session.wav\\\",\\\"event\\\":\\\"click\\\"},\\\"hostOutputs\\\":{\\\"disabled\\\":\\\"exportDisabled\\\"},\\\"id\\\":\\\"ls-export-wav\\\",\\\"label\\\":\\\"Song audio · WAV (one loop)\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"audio.session.midi\\\",\\\"event\\\":\\\"click\\\"},\\\"hostOutputs\\\":{\\\"disabled\\\":\\\"exportDisabled\\\"},\\\"id\\\":\\\"ls-export-midi\\\",\\\"label\\\":\\\"Song notes · MIDI (.mid)\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"audio.session.session\\\",\\\"event\\\":\\\"click\\\"},\\\"hostOutputs\\\":{\\\"disabled\\\":\\\"exportDisabled\\\"},\\\"id\\\":\\\"ls-export-session\\\",\\\"label\\\":\\\"Song session (.json)\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"audio.session.item\\\",\\\"event\\\":\\\"click\\\"},\\\"hostOutputs\\\":{\\\"disabled\\\":\\\"exportDisabled\\\"},\\\"id\\\":\\\"ls-publish-item\\\",\\\"label\\\":\\\"Publish song as item\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"aria-live\\\":\\\"polite\\\",\\\"hostOutput\\\":\\\"exportLabel\\\",\\\"id\\\":\\\"ls-export-state\\\",\\\"role\\\":\\\"status\\\",\\\"text\\\":\\\"Prepare a song to export WAV, MIDI or session JSON, or publish it as an item.\\\"},\\\"tag\\\":\\\"Text\\\"}],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"hostCapability\\\":\\\"audio.session\\\",\\\"hostVersion\\\":1,\\\"id\\\":\\\"audio-session-transport\\\"},\\\"tag\\\":\\\"Card\\\"}\",\"tree\":{\"children\":[{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"audio.session.prepare\",\"event\":\"click\"},\"hostOutputs\":{\"disabled\":\"prepareDisabled\",\"text\":\"prepareLabel\"},\"id\":\"ls-prepare\",\"label\":\"Prepare score\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"audio.session.start\",\"event\":\"click\"},\"hostOutputs\":{\"disabled\":\"startDisabled\",\"text\":\"startLabel\"},\"id\":\"ls-start\",\"label\":\"Start audio\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"audio.session.stop\",\"event\":\"click\"},\"hostOutputs\":{\"disabled\":\"stopDisabled\"},\"id\":\"ls-stop\",\"label\":\"Stop\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"audio.session.wav\",\"event\":\"click\"},\"hostOutputs\":{\"disabled\":\"exportDisabled\"},\"id\":\"ls-export-wav\",\"label\":\"Song audio · WAV (one loop)\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"audio.session.midi\",\"event\":\"click\"},\"hostOutputs\":{\"disabled\":\"exportDisabled\"},\"id\":\"ls-export-midi\",\"label\":\"Song notes · MIDI (.mid)\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"audio.session.session\",\"event\":\"click\"},\"hostOutputs\":{\"disabled\":\"exportDisabled\"},\"id\":\"ls-export-session\",\"label\":\"Song session (.json)\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"audio.session.item\",\"event\":\"click\"},\"hostOutputs\":{\"disabled\":\"exportDisabled\"},\"id\":\"ls-publish-item\",\"label\":\"Publish song as item\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"aria-live\":\"polite\",\"hostOutput\":\"exportLabel\",\"id\":\"ls-export-state\",\"role\":\"status\",\"text\":\"Prepare a song to export WAV, MIDI or session JSON, or publish it as an item.\"},\"tag\":\"Text\"}],\"kind\":\"view-node\",\"props\":{\"hostCapability\":\"audio.session\",\"hostVersion\":1,\"id\":\"audio-session-transport\"},\"tag\":\"Card\"},\"execution\":{\"portable_ir_schema\":\"cre8.view.ir\",\"portable_ir_tree_hash\":\"fa30f207b1f227269e43d876e1cd92759587129c1dadedcb2cc7f500d256dd90\",\"portable_ir_version\":1,\"producer\":\"rust-ssr\"}}","data-cre8-host-component":"audio.session","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-daw-time":"bars","text":"001.1","variant":"b"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"data-daw-time":"clock","text":"0:00.0","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"data-daw-time":"bpm","text":"— BPM","variant":"span"},"tag":"Text"}],"kind":"view-node","props":{"aria-hidden":"true","className":"ls-daw-timecode","data-daw-timecode":true,"element":"div","hidden":true},"tag":"Section"},{"children":[],"kind":"view-node","props":{"aria-label":"Playback position","aria-live":"off","data-ls":"clock","role":"timer","text":"Stopped · prepare a score","variant":"output"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"data-ls":"meter","text":"","variant":"i"},"tag":"Text"}],"kind":"view-node","props":{"aria-hidden":"true","className":"ls-meter","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"className":"ls-live-badge","data-ls":"live-state","text":"NO LIVE TAKE","variant":"span"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"aria-live":"polite","data-ls":"status","role":"status","text":"Connecting audio controls…","variant":"p"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"controlKey":"live-score.24","data-ls":"error-line","disabled":false,"hidden":true,"label":"Go to error line"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-transport-feedback","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"aria-label":"Song transport","className":"ls-transport","element":"div","role":"group"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"daw-workspace.3","data-daw-editor":"code","data-daw-view":"tracks","disabled":false,"id":"ls-view-tracks","label":"Tracks","pressed":true},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"daw-workspace.perform","data-daw-open":"live-score-perform","data-daw-view":"perform","disabled":false,"id":"ls-view-perform","label":"Perform","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"daw-workspace.4","data-daw-editor":"code","data-daw-view":"instruments","disabled":false,"id":"ls-view-instruments","label":"Instruments","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"daw-workspace.5","data-daw-editor":"session","data-daw-view":"flow","disabled":false,"id":"ls-view-flow","label":"Signal flow","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"daw-workspace.6","data-daw-editor":"piano","data-daw-view":"clips","disabled":false,"id":"ls-view-clips","label":"Clips","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"daw-workspace.7","data-daw-open":"live-score-waveform","data-daw-view":"waveform","disabled":false,"id":"ls-view-waveform","label":"Waveform","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"daw-workspace.8","data-daw-editor":"piano","data-daw-view":"piano","disabled":false,"id":"ls-view-piano","label":"Piano roll","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"daw-workspace.9","data-daw-editor":"code","data-daw-view":"code","disabled":false,"id":"ls-view-code","label":"Music code","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"daw-workspace.10","data-daw-editor":"session","data-daw-view":"session","disabled":false,"id":"ls-view-session","label":"Session","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"daw-workspace.11","data-daw-open":"live-score-midi","data-daw-view":"midi","disabled":false,"id":"ls-view-midi","label":"MIDI recorder","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"daw-workspace.12","data-daw-editor":"code","data-daw-view":"visual","disabled":false,"id":"ls-view-visual","label":"Visuals","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"daw-workspace.13","data-daw-mixer":true,"disabled":false,"id":"ls-view-mixer","label":"Mixer","pressed":true},"tag":"Action"}],"kind":"view-node","props":{"aria-label":"DAW workspace","className":"ls-daw-tabs","data-editor-strip":"modes","element":"nav"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"className":"ls-daw-caption","text":"SESSION CHANNELS","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Your sound","variant":"h3"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Select a channel to reach its fader.","variant":"p"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"text":"01 "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Drums","variant":"strong"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Rhythm","variant":"span"},"tag":"Text"}],"kind":"view-node","props":{"controlKey":"daw-workspace.18","data-daw-track":"drums","disabled":false,"pressed":false},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"text":"02 "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Bass","variant":"strong"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Low end","variant":"span"},"tag":"Text"}],"kind":"view-node","props":{"controlKey":"daw-workspace.21","data-daw-track":"bass","disabled":false,"pressed":false},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"text":"03 "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Pads","variant":"strong"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Harmony","variant":"span"},"tag":"Text"}],"kind":"view-node","props":{"controlKey":"daw-workspace.24","data-daw-track":"pads","disabled":false,"pressed":false},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"text":"04 "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Melody","variant":"strong"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Lead","variant":"span"},"tag":"Text"}],"kind":"view-node","props":{"controlKey":"daw-workspace.27","data-daw-track":"melody","disabled":false,"pressed":false},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"text":"05 "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Arp","variant":"strong"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Motion","variant":"span"},"tag":"Text"}],"kind":"view-node","props":{"controlKey":"daw-workspace.30","data-daw-track":"arp","disabled":false,"pressed":false},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"text":"06 "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Space","variant":"strong"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Reverb return","variant":"span"},"tag":"Text"}],"kind":"view-node","props":{"controlKey":"daw-workspace.33","data-daw-track":"reverb","disabled":false,"pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"daw-workspace.36","data-ls-nav":true,"href":"/view/device/midi","label":"Device connections ↗"},"tag":"Action"}],"kind":"view-node","props":{"aria-label":"Session channels","className":"ls-daw-library","element":"aside"},"tag":"Section"}],"kind":"view-node","props":{"className":"media-fragment","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"className":"ls-daw-caption","text":"PERFORM → CAPTURE → EDIT","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Find the take.","variant":"h2"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"One instrument. Three scenes. Cue a new mood on the next bar, then shape your performance in Tracks.","variant":"p"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"scene-performance.starter","data-scene-action":"starter","disabled":false,"label":"Load three-scene starter"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"scene-performance.prepare","data-scene-action":"prepare","disabled":false,"label":"Prepare scenes"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-scene-setup","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"className":"ls-scene-hint","text":"The starter replaces tracks; Undo restores them. Or select an instrument with three four-beat MIDI clips. Prepared scenes last until you close or reload this editor.","variant":"p"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"scene-performance.launch-0","data-scene-launch":"0","disabled":true,"label":"Spark","pressed":true},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"scene-performance.launch-1","data-scene-launch":"1","disabled":true,"label":"Lift","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"scene-performance.launch-2","data-scene-launch":"2","disabled":true,"label":"Release","pressed":false},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-scene-pads","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"scene-performance.capture","data-scene-action":"capture","disabled":true,"label":"Capture take"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"scene-performance.finish","data-scene-action":"finish","disabled":true,"label":"Finish take"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"scene-performance.use","data-scene-action":"use","disabled":true,"label":"Use captured take"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-scene-actions","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"data-scene-status":true,"role":"status","text":"Load the starter or select a track, then prepare your three scenes.","variant":"p"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"className":"ls-scene-hint","text":"Capture up to 256 beats. Use captured take replaces the track arrangement with editable MIDI clips. Save the project to keep it; prepare the arrangement for playback and export.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"aria-label":"Scene performance","className":"ls-scene-performance","data-scene-performance":true,"element":"section","id":"live-score-perform"},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"className":"ls-daw-caption","text":"PHRASES / NOTES","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Clips & notes","variant":"h3"},"tag":"Text"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.8","data-piano":"lane","default":"melody","disabled":false,"label":"Lane","name":"piano-roll-8","options":[{"label":"Bass","value":"bass"},{"label":"Pads","value":"pads"},{"label":"Melody","value":"melody"},{"label":"Arp","value":"arp"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.9","data-piano":"load","disabled":false,"label":"Load prepared lane"},"tag":"Action"}],"kind":"view-node","props":{"element":"header"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"aria-live":"polite","data-piano":"status","role":"status","text":"Prepare a score, then load a lane to edit its notes.","variant":"p"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Bar phrases","className":"ls-clip-grid","data-piano":"clips","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-clip-scroll","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"data-piano":"region-status","text":"Select a bar phrase to arrange its notes.","variant":"p"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.17","data-piano":"region-target","default":"0","disabled":false,"kind":"number","label":"Destination beat","max":"16","min":"0","name":"piano-roll-17","step":".25"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.18","data-piano":"region-move","disabled":true,"label":"Move phrase"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.19","data-piano":"region-duplicate","disabled":true,"label":"Duplicate phrase"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.20","data-piano":"region-delete","disabled":true,"label":"Delete phrase"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.21","data-piano":"region-open","disabled":true,"label":"Open in piano roll"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-clip-controls","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Select or drag a bar phrase · double-click to edit notes. Overlapping phrases retain their notes. Bar groups rebuild when you load a lane.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"aria-label":"Phrase arrangement","className":"ls-clip-editor","element":"section"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Note grid","className":"ls-piano-grid","data-piano":"grid","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"aria-label":"Piano roll notes; scroll to explore pitches","className":"ls-piano-scroll","element":"div","tabIndex":0},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.27","data-piano":"pitch","default":"60","disabled":false,"kind":"number","label":"Pitch (MIDI)","max":"127","min":"0","name":"piano-roll-27","step":"1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.29","data-piano":"beat","default":"0","disabled":false,"kind":"number","label":"Beat (from 0)","max":"16","min":"0","name":"piano-roll-29","step":".25"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.31","data-piano":"duration","default":"1","disabled":false,"kind":"number","label":"Length (beats)","max":"16","min":".0020833333333333333","name":"piano-roll-31","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.33","data-piano":"velocity","default":".8","disabled":false,"kind":"number","label":"Velocity","max":"1","min":"0","name":"piano-roll-33","step":".05"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.34","data-piano":"update","disabled":true,"label":"Update note"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.35","data-piano":"add","disabled":true,"label":"Add note"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.36","data-piano":"delete","disabled":true,"label":"Delete note"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.duplicate","data-piano":"duplicate","disabled":true,"label":"Duplicate note"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-piano-inspector","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.39","data-piano":"undo","disabled":true,"label":"Undo note edit"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.redo","data-piano":"redo","disabled":true,"label":"Redo note edit"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.quantize","data-piano":"quantize","disabled":true,"label":"Quantize lane"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.snap","data-piano":"snap","default":".25","label":"Snap (beats)","name":"piano-snap","options":[{"label":"1 beat","value":"1"},{"label":"½ beat","value":".5"},{"label":"¼ beat","value":".25"},{"label":"⅛ beat","value":".125"},{"label":"⅓ beat (triplet)","value":"0.3333333333333333"}]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"className":"ls-piano-hints","text":"Drag notes to move · drag right edge to resize · arrows move · Shift + arrows resize · Delete removes. Snap controls movement and lane quantization.","variant":"span"},"tag":"Text"}],"kind":"view-node","props":{"element":"footer"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Note and phrase edits update your draft automatically. Prepare to hear changes. Your playing take stays intact.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"aria-label":"Piano roll","className":"ls-piano","data-piano-roll":true,"element":"section"},"tag":"Section"}],"kind":"view-node","props":{"className":"media-fragment","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"className":"ls-daw-caption","text":"AUDIO EDITOR","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Waveform","variant":"h3"},"tag":"Text"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"data-wave":"info","text":"Import audio or open a prepared mix.","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"element":"header"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.10","data-audio":"name","default":"Untitled audio project","disabled":false,"kind":"text","label":"Project name","maxlength":256,"name":"waveform-editor-10"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.11","data-audio-action":"save","disabled":false,"id":"ls-save-project","label":"Save project"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.12","data-audio-action":"open","disabled":false,"id":"ls-open-project","label":"Open project…"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"accept":".cre8audio","controlKey":"waveform-editor.13","data-audio":"project-file","disabled":false,"hidden":true,"kind":"file","label":"","name":"waveform-editor-13"},"tag":"Input"}],"kind":"view-node","props":{"hidden":true},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.15","data-audio":"recoveries","default":"","disabled":false,"label":"Local recovery","name":"waveform-editor-15","options":[{"label":"No saved recovery","value":""}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.16","data-audio-action":"recover","disabled":true,"label":"Restore recovery"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"data-audio":"save-status","role":"status","text":"Checking local recovery…","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"aria-label":"Audio project","className":"ls-wave-tools","element":"div","role":"group"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"text":"Song in this project","variant":"h4"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Keep the editable score and MIDI with your audio tracks. Prepare edits, update the phrase audio, then place or repeat it in the project.","variant":"p"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.song-update","data-audio-action":"song-update","disabled":false,"label":"Update song audio"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.song-remove","data-audio-action":"song-remove","disabled":false,"label":"Remove song audio"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.song-gain","data-audio":"song-gain","default":"0","disabled":false,"kind":"number","label":"Song gain dB","max":"24","min":"-60","name":"waveform-editor-song-gain","step":"0.5"},"tag":"Input"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.song-mute","data-audio":"song-mute","default":false,"disabled":false,"kind":"checkbox","label":"Mute song audio","name":"waveform-editor-song-mute"},"tag":"Input"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.song-start","data-audio":"song-start","default":"0","kind":"number","label":"Phrase start (seconds)","max":"1800","min":"0","name":"waveform-editor-song-start","step":"0.001"},"tag":"Input"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.song-repeats","data-audio":"song-repeats","default":"1","kind":"number","label":"Repeat prepared phrase","max":"4096","min":"1","name":"waveform-editor-song-repeats","step":"1"},"tag":"Input"},{"children":[],"kind":"view-node","props":{"aria-live":"polite","data-audio":"song-status","text":"Prepare your song, then Update song audio.","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"aria-label":"Song in project","className":"ls-audio-project","data-audio":"song-panel","element":"section"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"text":"Channel inserts","variant":"h4"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.insert-channel","data-insert":"channel","disabled":true,"label":"Insert channel","name":"waveform-editor-insert-channel","options":[]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.insert-entry","data-insert":"entry","disabled":true,"label":"Channel insert","name":"waveform-editor-insert-entry","options":[]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.insert-name","data-insert":"name","default":"","disabled":true,"kind":"text","label":"Insert name","maxLength":80,"name":"waveform-editor-insert-name"},"tag":"Input"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.insert-add","data-insert-action":"add","disabled":true,"label":"Add current effect settings"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.insert-load","data-insert-action":"load","disabled":true,"label":"Load insert settings"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.insert-update","data-insert-action":"update","disabled":true,"label":"Update selected insert"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.insert-toggle","data-insert-action":"toggle","disabled":true,"label":"Bypass / enable insert"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.insert-up","data-insert-action":"up","disabled":true,"label":"Move insert up"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.insert-down","data-insert-action":"down","disabled":true,"label":"Move insert down"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.insert-remove","data-insert-action":"remove","disabled":true,"label":"Remove insert"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"data-insert":"summary","text":"Add an audio track or song to set up channel inserts.","variant":"output"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"data-insert":"status","role":"status","text":"","variant":"output"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Choose EQ, filter, compressor, limiter or gate settings in Effects, then add them to a channel. Inserts run in order before channel gain and pan for project playback, overdub and stems. Source audio stays unchanged.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-quiet-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"aria-label":"Channel inserts","className":"ls-wave-tools","data-audio":"insert-panel","element":"section"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.19","data-wave-action":"import","disabled":false,"label":"Import audio…"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"accept":"audio/*,.wav,.mp3,.flac,.ogg,.m4a","controlKey":"waveform-editor.20","data-wave":"file","disabled":false,"hidden":true,"kind":"file","label":"","name":"waveform-editor-20"},"tag":"Input"}],"kind":"view-node","props":{"hidden":true},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.21","data-wave-action":"prepared","disabled":false,"label":"Open prepared mix"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.22","data-wave-action":"export","disabled":true,"label":"Export WAV"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.23","data-wave-action":"export-selection","disabled":true,"label":"Export selection"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.25","data-audio":"sample-rate","default":"48000","disabled":false,"kind":"number","label":"Sample rate Hz","max":"192000","min":"8000","name":"waveform-editor-25","step":"1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.26","data-audio-action":"resample","disabled":false,"label":"Convert sample rate"},"tag":"Action"}],"kind":"view-node","props":{"aria-label":"Waveform files","className":"ls-wave-tools","element":"div","role":"group"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.28","data-wave-action":"play","disabled":true,"label":"Play selection / cursor"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.29","data-wave-action":"stop","disabled":false,"label":"Stop"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.31","data-wave":"loop","default":false,"disabled":false,"label":"Loop selection","name":"waveform-editor-31"},"tag":"Checkbox"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.33","data-wave":"scrub","default":false,"disabled":false,"label":"Scrub on drag","name":"waveform-editor-33"},"tag":"Checkbox"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.34","data-wave-action":"zoom-in","disabled":true,"label":"Zoom +"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.35","data-wave-action":"zoom-out","disabled":true,"label":"Zoom −"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.36","data-wave-action":"fit","disabled":true,"label":"Fit audio"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.37","data-wave-action":"fit-selection","disabled":true,"label":"Fit selection"},"tag":"Action"}],"kind":"view-node","props":{"aria-label":"Waveform transport and navigation","className":"ls-wave-tools","element":"div","role":"group"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.40","data-spectrum":"view","default":"waveform","disabled":false,"label":"Audio view","name":"waveform-editor-40","options":[{"label":"Waveform","value":"waveform"},{"label":"Spectrogram","value":"spectrogram"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Spectrum settings"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.45","data-spectrum":"size","default":"2048","disabled":false,"label":"FFT size","name":"waveform-editor-45","options":[{"label":"256","value":"256"},{"label":"512","value":"512"},{"label":"1024","value":"1024"},{"label":"2048","value":"2048"},{"label":"4096","value":"4096"},{"label":"8192","value":"8192"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.47","data-spectrum":"window","default":"hann","disabled":false,"label":"FFT window","name":"waveform-editor-47","options":[{"label":"Hann","value":"hann"},{"label":"Hamming","value":"hamming"},{"label":"Blackman","value":"blackman"},{"label":"Rectangular","value":"rectangular"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.49","data-spectrum":"scale","default":"log","disabled":false,"label":"Frequency scale","name":"waveform-editor-49","options":[{"label":"Logarithmic","value":"log"},{"label":"Linear","value":"linear"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.51","data-spectrum":"min","default":"20","disabled":false,"kind":"number","label":"Minimum Hz","max":"95999","min":"0","name":"waveform-editor-51","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.53","data-spectrum":"max","default":"20000","disabled":false,"kind":"number","label":"Maximum Hz","max":"96000","min":"1","name":"waveform-editor-53","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.55","data-spectrum":"floor","default":"-100","disabled":false,"kind":"number","label":"Display floor dBFS","max":"23","min":"-160","name":"waveform-editor-55","step":"1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.57","data-spectrum":"ceiling","default":"0","disabled":false,"kind":"number","label":"Display ceiling dBFS","max":"24","min":"-159","name":"waveform-editor-57","step":"1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Applies to spectrogram and selection analysis. Larger FFT windows resolve closer frequencies but blur timing. Zoom in to inspect brief events: the overview samples a bounded number of time windows. Stereo channels remain separate. Frequency labels describe the display; selection and edits still operate on time ranges across all channels.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-quiet-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-spectrum-settings","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"aria-label":"Waveform display","className":"ls-wave-tools","element":"div","role":"group"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"data-spectrum":"display-status","role":"status","text":"Switch to Spectrogram to inspect frequency content.","variant":"output"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"html":"<canvas data-wave=\"canvas\" height=\"280\" tabindex=\"0\" role=\"img\" aria-label=\"Audio waveform. Drag to select; Shift-click to extend; arrow keys move one sample; Shift-arrow extends the selection.\"></canvas>"},"tag":"RawHtml"},{"children":[],"kind":"view-node","props":{"aria-label":"Waveform horizontal scroll","controlKey":"waveform-editor.61","data-wave":"scroll","default":"0","disabled":true,"kind":"range","label":"Waveform horizontal scroll","max":"0","min":"0","name":"waveform-editor-61","step":"1"},"tag":"Input"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.64","data-wave":"units","default":"seconds","disabled":false,"label":"Units","name":"waveform-editor-64","options":[{"label":"Seconds","value":"seconds"},{"label":"Samples","value":"samples"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.66","data-wave":"start","default":"0","disabled":true,"kind":"number","label":"Selection start","min":"0","name":"waveform-editor-66","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.68","data-wave":"end","default":"0","disabled":true,"kind":"number","label":"Selection end","min":"0","name":"waveform-editor-68","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.69","data-wave-action":"select-all","disabled":true,"label":"Select all"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"data-wave":"selection","text":"0 samples selected","variant":"output"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.71","data-wave-action":"zero-crossings","disabled":true,"label":"Snap to zero crossings"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-wave-selection","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Analyze selection · spectrum and levels"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.75","data-spectrum":"analyze","data-spectrum-action":"analyze","disabled":true,"label":"Analyze selection"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.76","data-spectrum":"export","data-spectrum-action":"export","disabled":true,"label":"Export spectrum CSV"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"aria-live":"polite","data-spectrum":"summary","role":"status","text":"Select a time range, then analyze. Results refresh only when requested.","variant":"output"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"html":"<canvas data-spectrum=\"plot\" width=\"800\" height=\"220\" role=\"img\" aria-label=\"Selection frequency spectrum. Left or mono is green; right is blue. Peak frequencies and levels are also listed in the table.\" hidden></canvas>"},"tag":"RawHtml"},{"children":[],"kind":"view-node","props":{"className":"ls-spectrum-results","data-spectrum":"results","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Peak, RMS, DC and clipping cover every selected sample. Clipping counts samples at or above full scale; this is not a true-peak or LUFS meter. Spectrum levels use window-corrected tone amplitudes, not noise spectral density. Peak frequencies are estimates; spectral levels can read lower for tones between FFT bins. Long selections use up to 128 evenly spaced FFT windows; narrow selections use a smaller FFT. Correlation is +1 for matching channels, −1 for opposite polarity and undefined for a silent or constant channel. Results clear when audio, selection or spectrum settings change. CSV includes all FFT bins.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-quiet-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-analysis","element":"details"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.82","data-wave-action":"undo","disabled":true,"label":"Undo"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.83","data-wave-action":"redo","disabled":true,"label":"Redo"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.84","data-wave-action":"cut","disabled":true,"label":"Cut"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.85","data-wave-action":"copy","disabled":true,"label":"Copy"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.86","data-wave-action":"paste","disabled":true,"label":"Paste"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.87","data-wave-action":"delete","disabled":true,"label":"Delete"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.88","data-wave-action":"trim","disabled":true,"label":"Trim to selection"},"tag":"Action"}],"kind":"view-node","props":{"aria-label":"Waveform edits","className":"ls-wave-tools","element":"div","role":"group"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.90","data-wave-action":"silence","disabled":true,"label":"Silence"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.91","data-wave-action":"reverse","disabled":true,"label":"Reverse"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.92","data-wave-action":"fade-in","disabled":true,"label":"Fade in"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.93","data-wave-action":"fade-out","disabled":true,"label":"Fade out"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.94","data-wave-action":"dc","disabled":true,"label":"Remove DC offset"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.96","data-wave":"db","default":"-1","disabled":false,"kind":"number","label":"Level dB","max":"24","min":"-60","name":"waveform-editor-96","step":"0.1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.97","data-wave-action":"normalize","disabled":true,"label":"Normalize peak"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.98","data-wave-action":"gain","disabled":true,"label":"Apply gain"},"tag":"Action"}],"kind":"view-node","props":{"aria-label":"Waveform processing","className":"ls-wave-tools","element":"div","role":"group"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Generate audio · geometry, beats, tones and noise"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.103","data-audio":"gen-kind","default":"tone","disabled":false,"label":"Generator","name":"waveform-editor-103","options":[{"label":"Tone","value":"tone"},{"label":"Binaural beats","value":"binaural"},{"label":"Monaural beats · mixed tones","value":"monaural"},{"label":"Geometry · E8 / tesseract","value":"geometry"},{"label":"Frequency sweep / chirp","value":"chirp"},{"label":"Amplitude modulation","value":"am"},{"label":"Noise","value":"noise"},{"label":"Rhythm clicks","value":"rhythm"},{"label":"DTMF keypad","value":"dtmf"},{"label":"Silence","value":"silence"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.105","data-audio":"gen-duration","default":"2","disabled":false,"kind":"number","label":"Duration s","max":"60","min":"0.001","name":"waveform-editor-105","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.107","data-audio":"gen-rate","default":"48000","disabled":false,"kind":"number","label":"Generator rate Hz","max":"192000","min":"8000","name":"waveform-editor-107","step":"1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.109","data-audio":"gen-channels","default":"1","disabled":false,"label":"Output channels","name":"waveform-editor-109","options":[{"label":"Mono","value":"1"},{"label":"Stereo","value":"2"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.111","data-audio":"gen-level","default":"-12","disabled":false,"kind":"number","label":"Peak level dBFS","max":"0","min":"-96","name":"waveform-editor-111","step":"0.1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.113","data-audio":"gen-fadeIn","default":"5","disabled":false,"kind":"number","label":"Generator fade in ms","max":"60000","min":"0","name":"waveform-editor-113","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.115","data-audio":"gen-fadeOut","default":"5","disabled":false,"kind":"number","label":"Generator fade out ms","max":"60000","min":"0","name":"waveform-editor-115","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.118","data-audio":"gen-wave","default":"sine","disabled":false,"label":"Wave shape","name":"waveform-editor-118","options":[{"label":"Sine","value":"sine"},{"label":"Square (smoothed edges)","value":"square"},{"label":"Sawtooth (smoothed edges)","value":"saw"},{"label":"Triangle","value":"triangle"},{"label":"Pulse (smoothed edges)","value":"pulse"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.120","data-audio":"gen-duty","default":"50","disabled":false,"kind":"number","label":"Pulse duty %","max":"99","min":"1","name":"waveform-editor-120","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"data-generator-duty":true,"element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-tools","data-generator-for":"tone chirp am","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.123","data-audio":"gen-frequency","default":"440","disabled":false,"kind":"number","label":"Frequency / carrier Hz","max":"95999","min":"1","name":"waveform-editor-123","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.125","data-audio":"gen-phase","default":"0","disabled":false,"kind":"number","label":"Starting phase °","max":"360","min":"0","name":"waveform-editor-125","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-tools","data-generator-for":"tone chirp am binaural monaural geometry","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.128","data-audio":"gen-endFrequency","default":"880","disabled":false,"kind":"number","label":"End frequency Hz","max":"95999","min":"1","name":"waveform-editor-128","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.130","data-audio":"gen-endLevel","default":"-12","disabled":false,"kind":"number","label":"End peak level dBFS","max":"0","min":"-96","name":"waveform-editor-130","step":"0.1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.132","data-audio":"gen-sweep","default":"log","disabled":false,"label":"Frequency interpolation","name":"waveform-editor-132","options":[{"label":"Logarithmic","value":"log"},{"label":"Linear","value":"linear"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-tools","data-generator-for":"chirp","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"text":"Shape your sound","variant":"h4"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"className":"ls-wave-geometry-intro","text":"Choose a shape and how it moves. Preview to listen, then generate a waveform to edit or export.","variant":"p"},"tag":"Text"},{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.geometry-shape","data-audio":"gen-geometryShape","default":"e8","label":"Geometry","name":"waveform-editor-geometry-shape","options":[{"label":"E8 · 240 roots in 8D","value":"e8"},{"label":"Tesseract · 16 vertices in 4D","value":"tesseract"}]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.geometry-rotation","data-audio":"gen-geometryRotation","default":"fixed","label":"Sound motion","name":"waveform-editor-geometry-rotation","options":[{"label":"Fixed angle · steady tone","value":"fixed"},{"label":"Follow rotation · evolving tone","value":"rotate"}]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.geometry-angle","data-audio":"gen-geometryAngle","default":"35","kind":"number","label":"Starting angle °","max":"360","min":"0","name":"waveform-editor-geometry-angle","step":"0.1"},"tag":"Input"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.geometry-speed","data-audio":"gen-geometrySpeed","default":"15","label":"Rotation speed","name":"waveform-editor-geometry-speed","options":[{"label":"Slow · 6° / s","value":"6"},{"label":"Gentle · 15° / s","value":"15"},{"label":"Medium · 30° / s","value":"30"},{"label":"Fast · 60° / s","value":"60"}]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.geometry-harmonics","data-audio":"gen-geometryHarmonics","default":"24","kind":"number","label":"Harmonic slots","max":"64","min":"2","name":"waveform-editor-geometry-harmonics","step":"1"},"tag":"Input"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.geometry-motion","data-audio":"gen-geometryMotion","default":"steady","label":"Volume envelope","name":"waveform-editor-geometry-motion","options":[{"label":"Steady","value":"steady"},{"label":"Amplitude modulation","value":"am"}]},"tag":"Select"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"className":"ls-wave-geometry-summary","data-audio":"geometry-summary","role":"status","text":"Choose your sound motion.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-wave-geometry-controls","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Choose Geometry to explore the projection, then Preview or generate audio.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"aria-label":"Geometry projection and harmonic amplitudes","data-audio":"generator-projection","element":"div","role":"img"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-pressed":"false","controlKey":"waveform-editor.geometry-animate","data-audio":"geometry-animate","disabled":true,"label":"Animate picture"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"data-audio":"geometry-animation-status","role":"status","text":"Silent picture preview. Pause to keep a starting angle.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-geometry-visual","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-geometry-grid","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"How geometry becomes sound","variant":"span"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Left: the projected shape. Right: harmonic strengths from low to high. Position maps to harmonics; projection height weights their amplitude. Dimmed bars are omitted to fit the sample rate.","variant":"p"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Follow rotation changes the sound over the full Duration at the selected Rotation speed. Preview or generate pauses the picture and uses that starting angle. Fixed angle keeps a steady spectrum; the volume envelope can still pulse it.","variant":"p"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Moving harmonic strengths are smoothed. High harmonics are omitted to leave room for rotation and modulation. Stereo repeats the same tone in both ears. Peak level is a ceiling, not matched loudness.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-wave-geometry-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-geometry","data-generator-for":"geometry","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.135","data-audio":"gen-beat","default":"8","disabled":false,"kind":"number","label":"Beat difference Hz","max":"1000","min":"0","name":"waveform-editor-135","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.beat-curve","data-audio":"gen-beatCurve","default":"hold","label":"Beat movement","name":"waveform-editor-beat-curve","options":[{"label":"Hold","value":"hold"},{"label":"Linear sweep","value":"linear"}]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.end-beat","data-audio":"gen-endBeat","default":"8","disabled":true,"kind":"number","label":"End beat difference Hz","max":"1000","min":"0","name":"waveform-editor-end-beat","step":"any"},"tag":"Input"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Binaural sends one sine to each ear; use headphones for separation. Monaural mixes both sines into each output channel. Hold or sweep their frequency difference around a fixed carrier.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-quiet-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-tools","data-generator-for":"binaural monaural","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.139","data-audio":"gen-modulation","default":"4","disabled":false,"kind":"number","label":"Modulation Hz","max":"1000","min":"0.01","name":"waveform-editor-139","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.141","data-audio":"gen-depth","default":"100","disabled":false,"kind":"number","label":"Modulation depth %","max":"100","min":"0","name":"waveform-editor-141","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-tools","data-generator-for":"am geometry","data-generator-modulation":true,"element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.144","data-audio":"gen-color","default":"pink","disabled":false,"label":"Noise color","name":"waveform-editor-144","options":[{"label":"Pink","value":"pink"},{"label":"White","value":"white"},{"label":"Brownian","value":"brown"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.146","data-audio":"gen-seed","default":"1","disabled":false,"kind":"number","label":"Repeatable seed","max":"4294967295","min":"1","name":"waveform-editor-146","step":"1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-tools","data-generator-for":"noise","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.149","data-audio":"gen-bpm","default":"120","disabled":false,"kind":"number","label":"Tempo BPM","max":"400","min":"20","name":"waveform-editor-149","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.151","data-audio":"gen-beats","default":"4","disabled":false,"kind":"number","label":"Beats per bar","max":"16","min":"1","name":"waveform-editor-151","step":"1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.153","data-audio":"gen-swing","default":"0","disabled":false,"kind":"number","label":"Swing %","max":"75","min":"0","name":"waveform-editor-153","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-tools","data-generator-for":"rhythm","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.156","data-audio":"gen-sequence","default":"123#","disabled":false,"kind":"text","label":"Key sequence","maxlength":128,"name":"waveform-editor-156"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.158","data-audio":"gen-toneMs","default":"150","disabled":false,"kind":"number","label":"Tone ms","max":"5000","min":"10","name":"waveform-editor-158","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.160","data-audio":"gen-gapMs","default":"75","disabled":false,"kind":"number","label":"Gap ms","max":"5000","min":"0","name":"waveform-editor-160","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Duration follows the sequence, with no trailing gap. Keys: 0–9, A–D, * and #.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-wave-tools","data-generator-for":"dtmf","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.163","data-audio-action":"generator-selection","disabled":false,"label":"Use selection duration and format"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.164","data-audio-action":"preview-generator","disabled":false,"label":"Preview audio (up to 5 s)"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.165","data-audio-action":"stop","disabled":false,"label":"Stop generator preview"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.166","data-audio-action":"generate-wave","disabled":false,"label":"Generate waveform"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.167","data-audio-action":"insert-generator","disabled":false,"label":"Insert / replace selection"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.168","data-audio-action":"generator-track","disabled":false,"label":"Add generated track"},"tag":"Action"}],"kind":"view-node","props":{"aria-label":"Generate audio actions","className":"ls-wave-tools","element":"div","role":"group"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"aria-live":"polite","data-audio":"generator-status","role":"status","text":"","variant":"output"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Preview plays up to 5 seconds without changing the project. Generate replaces the waveform; Undo restores it. Use Export WAV to save the result. Insert replaces the selection or inserts at the cursor; format must match. Add track places a clip at the timeline cursor. Maximum 60 seconds / 64 MiB. Start quietly when auditioning tones.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-quiet-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-generator","element":"details"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Filters, dynamics and noise repair"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.175","data-audio":"processor","default":"high-pass","disabled":false,"label":"Processor","name":"waveform-editor-175","options":[{"label":"High-pass filter","value":"high-pass"},{"label":"Low-pass filter","value":"low-pass"},{"label":"Parametric EQ","value":"eq"},{"label":"Compressor","value":"compress"},{"label":"Peak limiter","value":"limit"},{"label":"Noise gate","value":"noise-gate"},{"label":"Profile noise reduction","value":"noise-reduction"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.177","data-audio":"frequency","default":"1000","disabled":false,"kind":"number","label":"Frequency Hz","max":"96000","min":"20","name":"waveform-editor-177"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.179","data-audio":"eq-gain","default":"0","disabled":false,"kind":"number","label":"EQ gain dB","max":"24","min":"-24","name":"waveform-editor-179","step":"0.1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.181","data-audio":"eq-q","default":"0.707","disabled":false,"kind":"number","label":"EQ Q","max":"20","min":"0.1","name":"waveform-editor-181","step":"0.1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.183","data-audio":"threshold","default":"-18","disabled":false,"kind":"number","label":"Threshold dB","max":"0","min":"-96","name":"waveform-editor-183"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.185","data-audio":"ratio","default":"4","disabled":false,"kind":"number","label":"Ratio","max":"40","min":"1","name":"waveform-editor-185","step":"0.1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.187","data-audio":"attack","default":"10","disabled":false,"kind":"number","label":"Attack ms","max":"1000","min":"0.1","name":"waveform-editor-187","step":"0.1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.189","data-audio":"release","default":"100","disabled":false,"kind":"number","label":"Release ms","max":"5000","min":"1","name":"waveform-editor-189"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.191","data-audio":"noise-db","default":"12","disabled":false,"kind":"number","label":"Noise reduction dB","max":"36","min":"0","name":"waveform-editor-191","step":"1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.193","data-audio":"noise-sensitivity","default":"0","disabled":false,"kind":"number","label":"Sensitivity boost dB","max":"24","min":"-12","name":"waveform-editor-193","step":"0.5"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.195","data-audio":"noise-smoothing","default":"1","disabled":false,"kind":"number","label":"Frequency smoothing bands","max":"12","min":"0","name":"waveform-editor-195","step":"1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.196","data-audio-action":"noise-profile","disabled":false,"label":"Capture noise profile"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"data-audio":"noise-status","text":"No noise profile","variant":"output"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.198","data-audio-action":"preview-original","disabled":false,"label":"A: original selection"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.199","data-audio-action":"preview-effect","disabled":false,"label":"B: preview effect"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.200","data-audio-action":"preview-noise-residue","disabled":false,"label":"Listen to removed noise"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.201","data-audio-action":"stop","disabled":false,"label":"Stop preview / cancel repair"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.202","data-audio-action":"apply-effect","disabled":false,"label":"Apply effect"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"aria-live":"polite","data-audio":"effect-status","role":"status","text":"Choose a processor; preview before applying.","variant":"output"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Processing uses the selected audio. Filters use frequency; EQ also uses gain and Q (band width); dynamics use threshold. Compression links stereo channels. The limiter applies an immediate peak ceiling. For noise repair, capture a noise-only passage, then select the audio to clean. Sensitivity boosts the measured noise power; higher values remove more signal. Smoothing spreads gains over neighboring FFT bands; 0 disables it. Listen to removed noise to check what would be lost. A/B previews restart at the same selection start, up to five seconds, with short audition fades and no automatic level matching. Apply commits the full selection with Undo available. Noise profiling and reduction support up to 30 seconds.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-quiet-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-process","data-render-controls":true,"element":"details"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Pitch and time · transpose and change tempo"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.209","data-audio":"pitch-semitones","default":"0","disabled":false,"kind":"number","label":"Pitch semitones","max":"12","min":"-12","name":"waveform-editor-209","step":"1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.211","data-audio":"pitch-cents","default":"0","disabled":false,"kind":"number","label":"Pitch cents","max":"100","min":"-100","name":"waveform-editor-211","step":"1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.213","data-audio":"tempo-percent","default":"0","disabled":false,"kind":"number","label":"Tempo change %","max":"100","min":"-50","name":"waveform-editor-213","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.215","data-audio":"pitch-size","default":"2048","disabled":false,"label":"Pitch/time FFT window","name":"waveform-editor-215","options":[{"label":"1024","value":"1024"},{"label":"2048","value":"2048"},{"label":"4096","value":"4096"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.217","data-audio":"pitch-transients","default":false,"disabled":false,"label":"Protect transient attacks","name":"waveform-editor-217"},"tag":"Checkbox"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.219","data-audio":"pitch-formants","default":false,"disabled":false,"label":"Preserve formants (experimental)","name":"waveform-editor-219"},"tag":"Checkbox"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.221","data-audio":"from-bpm","default":"120","disabled":false,"kind":"number","label":"Original BPM","max":"400","min":"20","name":"waveform-editor-221","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.223","data-audio":"to-bpm","default":"120","disabled":false,"kind":"number","label":"Target BPM","max":"400","min":"20","name":"waveform-editor-223","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.224","data-audio-action":"pitch-bpm","disabled":false,"label":"Use BPM conversion"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"data-audio":"pitch-summary","role":"status","text":"Select audio to change pitch or tempo.","variant":"output"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.227","data-audio-action":"pitch-original","disabled":false,"label":"A: original before pitch/time"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.228","data-audio-action":"pitch-preview","disabled":false,"label":"B: preview pitch / tempo"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.229","data-audio-action":"stop","disabled":false,"label":"Stop preview / cancel pitch/time"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.230","data-audio-action":"pitch-apply","disabled":false,"label":"Apply pitch / tempo"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"aria-live":"polite","data-audio":"pitch-status","role":"status","text":"Pitch and tempo are independent. Zero leaves that parameter unchanged.","variant":"output"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Positive tempo makes audio shorter; −50% doubles its duration and +100% halves it. Pitch totals −12 to +12 semitones, including cents. Input: up to 30 seconds; output: up to 60 seconds, within 64 MiB processing buffers. Select at least one FFT window. Larger windows favor sustained tones; smaller windows retain more timing detail. Transient protection resets phase at detected attacks. Experimental formant preservation estimates the broad spectral envelope and can color the sound; compare previews on your material. Preview starts at the selection beginning and plays up to five output seconds. Apply replaces only the selection, shifts following waveform audio, and keeps Undo. Stop or parameter changes cancel an unfinished render.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-quiet-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-process","data-audio":"pitch-panel","data-render-controls":true,"element":"details"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Targeted repair · clicks, gaps and clipping"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.237","data-audio":"repair-kind","default":"clicks","disabled":false,"label":"Repair tool","name":"waveform-editor-237","options":[{"label":"Remove isolated clicks","value":"clicks"},{"label":"Interpolate selected gap","value":"gap"},{"label":"Reconstruct clipped peaks","value":"clipping"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.239","data-audio":"repair-threshold","default":"0.9","disabled":false,"kind":"number","label":"Repair threshold (amplitude)","max":"1","min":"0.05","name":"waveform-editor-239","step":"0.01"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.241","data-audio":"repair-width","default":"16","disabled":false,"kind":"number","label":"Maximum repair width (samples)","max":"128","min":"1","name":"waveform-editor-241","step":"1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.242","data-audio-action":"repair-original","disabled":false,"label":"A: original before repair"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.243","data-audio-action":"repair-preview","disabled":false,"label":"B: preview targeted repair"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.244","data-audio-action":"repair-apply","disabled":false,"label":"Apply targeted repair"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.245","data-audio-action":"stop","disabled":false,"label":"Stop / cancel targeted repair"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"data-audio":"repair-status","role":"status","text":"Select the damaged audio and preview first.","variant":"output"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Click threshold is the minimum sample jump; lower values detect smaller spikes and may alter transients. Clipping threshold is the absolute peak level of damaged samples; set it to the recorded clipping level. Repairs use neighboring intact samples and keep duration. Gap repair needs a selection of 1–128 samples with two intact samples on each side. Automatic tools skip damage wider than the width limit or without intact boundaries. Reconstructed peaks can exceed full scale; lower gain before exporting. These estimates cannot recover the original lost recording. Maximum selection: 30 seconds.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-quiet-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-process","data-audio":"repair-panel","data-render-controls":true,"element":"details"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Markers, regions and volume envelope"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.252","data-precision":"name","default":"Region 1","disabled":false,"kind":"text","label":"Marker or region name","maxlength":100,"name":"waveform-editor-252"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.253","data-precision-action":"label-add","disabled":false,"label":"Name selection / cursor"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.255","data-precision":"labels","default":"","disabled":false,"label":"Saved marker or region","name":"waveform-editor-255","options":[]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.256","data-precision-action":"label-update","disabled":false,"label":"Update name and range"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.257","data-precision-action":"label-remove","disabled":false,"label":"Remove label"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"html":"<canvas data-precision=\"envelope\" width=\"640\" height=\"120\" style=\"width:100%;height:120px;touch-action:none\" aria-label=\"Volume envelope draft\"></canvas>"},"tag":"RawHtml"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.261","data-precision":"time","default":"0","disabled":false,"kind":"number","label":"Envelope time s","min":"0","name":"waveform-editor-261","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.263","data-precision":"gain","default":"1","disabled":false,"kind":"number","label":"Envelope linear gain","max":"2","min":"0","name":"waveform-editor-263","step":"0.01"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.264","data-precision-action":"point-set","disabled":false,"label":"Set envelope point"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.266","data-precision":"points","default":"","disabled":false,"label":"Envelope point","name":"waveform-editor-266","options":[]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.267","data-precision-action":"point-remove","disabled":false,"label":"Remove point"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.268","data-precision-action":"envelope-clear","disabled":false,"label":"Clear envelope draft"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.269","data-precision-action":"envelope-apply","disabled":false,"label":"Apply envelope to selection"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"data-precision":"status","role":"status","text":"Click or drag the envelope to shape volume, or enter exact values.","variant":"output"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"The envelope spans the whole waveform. Gain 1 is unchanged, 0 is silence, 2 is twice the amplitude. Points interpolate linearly; the first and last gains extend to the edges. It is a draft until Apply renders the selected range and clears the draft. Undo restores both. Markers, regions and envelope drafts save in audio projects and follow time edits. Up to 256 labels and 128 points.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-quiet-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-process","element":"details"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Non-destructive effect rack"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.276","data-audio":"rack-family","default":"apply-effect","disabled":false,"label":"Rack effect family","name":"waveform-editor-276","options":[{"label":"Filters / dynamics / noise","value":"apply-effect"},{"label":"Pitch / tempo","value":"pitch-apply"},{"label":"Targeted repair","value":"repair-apply"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.278","data-audio":"rack-name","disabled":false,"kind":"text","label":"Rack effect name","maxlength":80,"name":"waveform-editor-278","placeholder":"Optional effect name"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.279","data-audio-action":"rack-add","disabled":false,"label":"Add current settings to rack"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.281","data-audio":"rack-entry","default":"","disabled":false,"label":"Rack effect","name":"waveform-editor-281","options":[]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.282","data-audio-action":"rack-load","disabled":false,"label":"Edit selected rack settings"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.283","data-audio-action":"rack-update","disabled":false,"label":"Update selected rack effect"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.284","data-audio-action":"rack-toggle","disabled":false,"label":"Bypass / enable effect"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.285","data-audio-action":"rack-up","disabled":false,"label":"Move effect earlier"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.286","data-audio-action":"rack-down","disabled":false,"label":"Move effect later"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.287","data-audio-action":"rack-remove","disabled":false,"label":"Remove rack effect"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"data-audio":"rack-summary","role":"status","text":"","variant":"output"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.290","data-audio-action":"rack-original","disabled":false,"label":"A: original before rack"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.291","data-audio-action":"rack-preview","disabled":false,"label":"B: preview effect rack"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.292","data-audio-action":"rack-export","disabled":false,"label":"Export selection through rack"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.293","data-audio-action":"rack-apply","disabled":false,"label":"Render rack into waveform and bypass"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.294","data-audio-action":"stop","disabled":false,"label":"Stop / cancel rack"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"aria-live":"polite","data-audio":"rack-status","role":"status","text":"Set an effect's controls, choose its family here, then add it to the rack.","variant":"output"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"The rack processes effects from top to bottom. Edit loads a node into its effect panel; Update captures those controls. Rack edits and settings save with the waveform and support Undo. Preview renders from the current selected source and plays up to five seconds; rack export downloads the whole processed selection. Ordinary waveform playback and export use source PCM. Render replaces the selection and bypasses every rack effect in one Undo step. Changing the rack does not automatically alter an existing preview; preview again to hear it. Start with up to 30 seconds; output is limited to 60 seconds / 64 MiB, and each processor retains its own limits. Gap repair uses intact samples outside the selection. This is an offline rack, not a real-time insert chain.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-quiet-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-process","data-render-controls":true,"element":"details"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Effect presets and repeat"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.301","data-audio":"preset-family","default":"apply-effect","disabled":false,"label":"Preset effect family","name":"waveform-editor-301","options":[{"label":"Filters / dynamics / noise","value":"apply-effect"},{"label":"Pitch / tempo","value":"pitch-apply"},{"label":"Targeted repair","value":"repair-apply"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.303","data-audio":"preset-name","default":"My preset","disabled":false,"kind":"text","label":"Effect preset name","maxlength":80,"name":"waveform-editor-303"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.304","data-audio-action":"preset-save","disabled":false,"label":"Save current effect settings"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.306","data-audio":"presets","default":"","disabled":false,"label":"Saved effect preset","name":"waveform-editor-306","options":[]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.307","data-audio-action":"preset-load","disabled":false,"label":"Load effect settings"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.308","data-audio-action":"repeat-effect","disabled":false,"label":"Repeat last effect"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"data-audio":"preset-status","role":"status","text":"Presets are saved with this audio project. Loading changes controls only.","variant":"output"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Choose the family whose current controls you want to save. Saving the same name replaces that preset. Noise recipes include the captured noise profile. Repeat applies the last successful filter, noise, pitch/time or targeted repair to the current selection with Undo. Shortcut: Ctrl/⌘+R while the waveform has focus. Up to 32 presets.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-quiet-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-process","element":"details"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Audio tracks","variant":"h3"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"data-audio":"timeline-info","text":"No audio clips","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"element":"header"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.316","data-audio-action":"add-track","disabled":false,"label":"Add selection as track"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.317","data-audio-action":"add-clip","disabled":false,"label":"Add selection to selected track"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.318","data-audio-action":"play-mix","disabled":false,"label":"Play project mix"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.319","data-audio-action":"stop","disabled":false,"label":"Stop audio"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.320","data-audio-action":"export-mix","disabled":false,"label":"Export project mix WAV"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.321","data-audio-action":"undo","disabled":false,"label":"Undo timeline"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.322","data-audio-action":"redo","disabled":false,"label":"Redo timeline"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.324","data-audio":"cursor","default":"0","disabled":false,"kind":"number","label":"Timeline cursor s","min":"0","name":"waveform-editor-324","step":"0.001"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.stem","data-audio":"stem","default":"","label":"Aligned stem","name":"waveform-editor-stem","options":[]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.export-stem","data-audio-action":"export-stem","disabled":false,"label":"Export selected stem WAV"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"text":"Native VST3 effects","variant":"h4"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Process the selected aligned stem with a native effect. The render becomes a new audio track; your original audio stays editable.","variant":"p"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform.native.address","data-native-effect":"address","default":"http://127.0.0.1:5279","kind":"text","label":"Native host address","name":"waveform-native-address"},"tag":"Input"},{"children":[],"kind":"view-node","props":{"autocomplete":"off","controlKey":"waveform.native.code","data-native-effect":"code","default":"","kind":"password","label":"Native host pairing code","maxlength":64,"name":"waveform-native-code"},"tag":"Input"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform.native.connect","data-native-action":"connect","disabled":false,"label":"Connect native host"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform.native.module","data-native-effect":"module","default":"","label":"Native plugin","name":"waveform-native-module","options":[]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform.native.inspect","data-native-action":"inspect","disabled":true,"label":"Inspect plugin"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform.native.effect","data-native-effect":"effect","default":"","label":"Plugin effect","name":"waveform-native-effect","options":[]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform.native.load","data-native-action":"load","disabled":true,"label":"Load effect"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform.native.parameter","data-native-effect":"parameter","default":"","label":"Plugin parameter","name":"waveform-native-parameter","options":[]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform.native.value","data-native-effect":"value","default":"","kind":"number","label":"Parameter value (0–1)","max":1,"min":0,"name":"waveform-native-value","step":0.001},"tag":"Input"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform.native.tail","data-native-effect":"tail","default":"0","kind":"number","label":"Render tail seconds","max":30,"min":0,"name":"waveform-native-tail","step":0.1},"tag":"Input"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform.native.save","data-native-action":"save","disabled":true,"label":"Store effect settings"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform.native.render","data-native-action":"render","disabled":true,"label":"Render selected stem with VST3"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform.native.cancel","data-native-action":"cancel","disabled":true,"label":"Cancel native job"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"aria-live":"polite","data-native-effect":"status","text":"Connect a native effects host for this DAW. Load effect checks channel support without changing your audio.","variant":"output"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"data-native-effect":"saved","text":"No native effect settings stored in this project.","variant":"p"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform.native.preview","data-native-action":"preview","disabled":true,"label":"Prepare VST3 preview"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform.native.original","data-native-action":"original","disabled":true,"label":"Original preview"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform.native.processed","data-native-action":"processed","disabled":true,"label":"Processed preview"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform.native.keep","data-native-action":"keep","disabled":true,"label":"Keep preview as track"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform.native.discard","data-native-action":"discard","disabled":true,"label":"Discard preview"},"tag":"Action"}],"kind":"view-node","props":{"aria-label":"Native effect audition","className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"aria-live":"polite","data-native-effect":"preview-status","text":"Prepare a preview to compare before adding a track. Project, source or effect changes discard it.","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"aria-label":"Native VST3 effects","className":"ls-native-effects","data-native-effects":true,"element":"section"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"data-audio":"tracks","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"data-track":"label","text":"","variant":"strong"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.331","data-track":"name","disabled":false,"kind":"text","label":"Track name","maxlength":256,"name":"waveform-editor-331"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.333","data-track":"gain","disabled":false,"kind":"number","label":"Gain dB","max":"24","min":"-60","name":"waveform-editor-333","step":"0.1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.335","data-track":"pan","disabled":false,"kind":"range","label":"Pan","max":"1","min":"-1","name":"waveform-editor-335","step":"0.01"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.337","data-track":"mute","default":false,"disabled":false,"label":"Mute","name":"waveform-editor-337"},"tag":"Checkbox"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.339","data-track":"solo","default":false,"disabled":false,"label":"Solo","name":"waveform-editor-339"},"tag":"Checkbox"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.340","data-track-remove":true,"disabled":false,"label":"Remove track"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"className":"ls-audio-lane","data-track":"lane","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-audio-track","element":"section"},"tag":"Section"}],"kind":"view-node","props":{"data-audio":"track-template","element":"template"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.344","data-audio":"clip","default":"","disabled":false,"label":"Selected clip","name":"waveform-editor-344","options":[{"label":"Select a clip","value":""}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.346","data-audio":"destination","default":"","disabled":false,"label":"Destination track","name":"waveform-editor-346","options":[]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.348","data-audio":"clip-at","default":"0","disabled":false,"kind":"number","label":"Clip start s","min":"0","name":"waveform-editor-348","step":"0.001"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.350","data-audio":"clip-offset","default":"0","disabled":false,"kind":"number","label":"Source offset s","min":"0","name":"waveform-editor-350","step":"0.001"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.352","data-audio":"clip-length","default":"0","disabled":false,"kind":"number","label":"Clip duration s","min":"0","name":"waveform-editor-352","step":"0.001"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.354","data-audio":"clip-gain","default":"0","disabled":false,"kind":"number","label":"Clip gain dB","max":"24","min":"-60","name":"waveform-editor-354","step":"0.1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.356","data-audio":"clip-fade-in","default":"0","disabled":false,"kind":"number","label":"Fade in s","min":"0","name":"waveform-editor-356","step":"0.001"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.358","data-audio":"clip-fade-out","default":"0","disabled":false,"kind":"number","label":"Fade out s","min":"0","name":"waveform-editor-358","step":"0.001"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.359","data-audio-action":"update-clip","disabled":false,"label":"Apply clip settings"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.360","data-audio-action":"split","disabled":false,"label":"Split at cursor"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.361","data-audio-action":"duplicate","disabled":false,"label":"Duplicate clip"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.362","data-audio-action":"delete","disabled":false,"label":"Delete clip"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.364","data-audio":"ripple","default":false,"disabled":false,"label":"Ripple following clips on this track","name":"waveform-editor-364"},"tag":"Checkbox"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.365","data-audio-action":"crossfade","disabled":false,"label":"Crossfade overlap"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.366","data-audio-action":"edit-clip","disabled":false,"label":"Copy clip to waveform"},"tag":"Action"}],"kind":"view-node","props":{"aria-label":"Selected audio clip","className":"ls-wave-tools","element":"div","role":"group"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"text":"Track automation","variant":"h4"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Gain and pan follow project time after inserts. Click the curve to set a point, or enter exact values. Undo and Redo use timeline history.","variant":"p"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"audio.automation.track","data-automation":"track","default":"","label":"Audio track","name":"automation-track","options":[]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"controlKey":"audio.automation.parameter","data-automation":"parameter","default":"gain","label":"Parameter","name":"automation-parameter","options":[{"label":"Gain (dB)","value":"gain"},{"label":"Pan","value":"pan"}]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"controlKey":"audio.automation.interpolation","data-automation":"interpolation","default":"linear","label":"Between points","name":"automation-interpolation","options":[{"label":"Linear ramp","value":"linear"},{"label":"Hold value","value":"hold"}]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"controlKey":"audio.automation.point","data-automation":"point","default":"","label":"Saved point","name":"automation-point","options":[]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"controlKey":"audio.automation.time","data-automation":"time","default":"0","kind":"number","label":"Time (seconds)","min":"0","name":"automation-time","step":"any"},"tag":"Input"},{"children":[],"kind":"view-node","props":{"controlKey":"audio.automation.value","data-automation":"value","default":"0","kind":"number","label":"Value","max":"24","min":"-60","name":"automation-value","step":".5"},"tag":"Input"},{"children":[],"kind":"view-node","props":{"controlKey":"audio.automation.cursor","data-automation-action":"cursor","label":"Use timeline cursor"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"audio.automation.set","data-automation-action":"set","label":"Set point"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"audio.automation.delete","data-automation-action":"delete","label":"Delete point"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"audio.automation.clear","data-automation-action":"clear","label":"Clear lane"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-automation-controls","element":"section"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"html":"<canvas width=\"900\" height=\"140\" data-automation=\"curve\" aria-label=\"Automation curve\" class=\"ls-automation-curve\"></canvas>"},"tag":"RawHtml"},{"children":[],"kind":"view-node","props":{"aria-live":"polite","data-automation":"status","role":"status","text":"Add an audio track to draw automation.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-audio-automation","data-automation-editor":"","element":"section"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Select a clip to edit it. Drag clips to move them in time or between tracks. Left/right arrows on a clip move one sample; hold Ctrl/⌘ for one second. Clips and recorded takes are resampled to the timeline rate when added. Clip changes are non-destructive. Copy clip to waveform opens its source range for processing; add the result to the timeline when ready.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-quiet-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"aria-label":"Audio clip timeline","className":"ls-audio-timeline","data-audio":"timeline","element":"section"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Record audio"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.372","data-audio":"device","default":"","disabled":false,"label":"Microphone","name":"waveform-editor-372","options":[{"label":"System default input","value":""}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.373","data-audio-action":"devices","disabled":false,"label":"Refresh input devices"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.375","data-audio":"channels","default":"1","disabled":false,"label":"Channels","name":"waveform-editor-375","options":[{"label":"Mono","value":"1"},{"label":"Stereo","value":"2"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.377","data-audio":"overdub","default":false,"disabled":false,"label":"Play timeline while recording","name":"waveform-editor-377"},"tag":"Checkbox"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.379","data-audio":"monitor","default":false,"disabled":false,"label":"Monitor input (use headphones)","name":"waveform-editor-379"},"tag":"Checkbox"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.381","data-audio":"latency","default":"0","disabled":false,"kind":"number","label":"Input latency correction ms","max":"2000","min":"0","name":"waveform-editor-381","step":"1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.382","data-audio-action":"record","disabled":false,"label":"Record microphone"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.383","data-audio-action":"record-stop","disabled":true,"label":"Finish recording"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"html":"<meter data-audio=\"meter\" min=\"0\" max=\"1\" value=\"0\" aria-label=\"Microphone peak level\"></meter>"},"tag":"RawHtml"},{"children":[],"kind":"view-node","props":{"data-audio":"record-status","role":"status","text":"Ready. Recording creates a new audio track at the timeline cursor.","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Measure recording latency"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.391","data-audio-action":"calibrate","disabled":false,"label":"Measure round-trip latency"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.392","data-audio-action":"use-latency","disabled":true,"label":"Use measured correction"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"data-audio":"latency-status","role":"status","text":"No measured correction.","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Measure plays three quiet test tones and records 2.5 seconds with input monitoring off. Let the selected microphone hear the speakers, or connect an audio loopback cable. Keep levels low. The result includes output, input and acoustic travel time; remeasure when your audio route changes. Test audio is discarded. If the tones cannot be identified consistently, no correction is applied.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-quiet-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"element":"details"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Capture stops at five minutes or 64 MiB of PCM. Input latency correction shifts the take earlier; calibrate it for your device. Microphone audio stays in this browser and your saved project.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-quiet-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"element":"details"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"aria-live":"polite","data-wave":"status","role":"status","text":"Import audio, open a prepared mix, or restore a saved audio project.","variant":"p"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Editing help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Drag a range, or enter exact seconds or sample positions. Double-click selects all. Ctrl/⌘ + wheel zooms around the pointer; wheel scrolls. Space plays/stops; Ctrl/⌘ A, X, C, V, Z, Shift Z; Delete removes the range. Left/right moves one sample; hold Shift to extend. Home/End jumps to the audio edges. Scrub plays short previews as you drag.","variant":"p"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Open prepared mix copies the prepared song; music code and song exports keep their own state. Audio project files include waveform edits, tracks, selection and undo history. Local recovery is browser-specific; save a project file for a portable copy. Each open editor writes a separate recovery. WAV export is 16-bit PCM. Browser imports may resample to the audio device rate. Undo retains up to 32 changes within a 128 MiB budget per editor. Timeline limits: 16 tracks, 128 clips, 64 MiB source PCM and 64 MiB stereo mix.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"element":"details"},"tag":"Section"}],"kind":"view-node","props":{"aria-label":"Waveform editor","className":"ls-waveform","data-waveform-editor":true,"element":"section","id":"live-score-waveform","tabIndex":0},"tag":"Section"}],"kind":"view-node","props":{"className":"media-fragment","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"className":"ls-daw-caption","text":"SOUND DESIGN","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Create an instrument","variant":"h3"},"tag":"Text"}],"kind":"view-node","props":{"element":"header"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Design a patch, assign it to a musical channel, then Prepare score to hear it. Reuse its name in Music code.","variant":"p"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"instrument-editor.9","data-instrument":"name","default":"my_synth","disabled":false,"kind":"text","label":"Name","maxlength":48,"name":"instrument-editor-9","pattern":"[a-z][a-z0-9_]*","required":true},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"instrument-editor.11","data-instrument":"lane","default":"melody","disabled":false,"label":"Channel","name":"instrument-editor-11","options":[{"label":"bass","value":"bass"},{"label":"pads","value":"pads"},{"label":"melody","value":"melody"},{"label":"arp","value":"arp"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"instrument-editor.13","data-instrument":"base","default":"warm_pad","disabled":false,"label":"Starting patch","name":"instrument-editor-13","options":[{"label":"warm_pad","value":"warm_pad"},{"label":"bright_lead","value":"bright_lead"},{"label":"bell","value":"bell"},{"label":"hollow","value":"hollow"},{"label":"saw_bass","value":"saw_bass"},{"label":"sub_sine","value":"sub_sine"},{"label":"square_lead","value":"square_lead"},{"label":"triangle_keys","value":"triangle_keys"},{"label":"organ","value":"organ"},{"label":"pluck","value":"pluck"},{"label":"glass","value":"glass"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-instrument-fields","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Parameters"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Enable a parameter to override the starting patch.","variant":"p"},"tag":"Text"},{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"data-param-enable":"osc1","label":"Enable Waveform","name":"enable-osc1"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"data-instrument-param":"osc1","disabled":true,"label":"Waveform","name":"instrument-osc1","options":[{"label":"sine","value":"sine"},{"label":"triangle","value":"triangle"},{"label":"saw","value":"saw"},{"label":"square","value":"square"},{"label":"additive","value":"additive"}]},"tag":"Select"}],"kind":"view-node","props":{},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-param-enable":"filter","label":"Enable Filter","name":"enable-filter"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"data-instrument-param":"filter","disabled":true,"label":"Filter","name":"instrument-filter","options":[{"label":"none","value":"none"},{"label":"lp","value":"lp"},{"label":"hp","value":"hp"},{"label":"bp","value":"bp"},{"label":"notch","value":"notch"}]},"tag":"Select"}],"kind":"view-node","props":{},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-param-enable":"osc1.detune","label":"Enable Detune (cents)","name":"enable-osc1.detune"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"data-instrument-param":"osc1.detune","default":"0","disabled":true,"kind":"number","label":"Detune (cents)","max":"100","min":"-100","name":"instrument-osc1.detune","step":"any"},"tag":"Input"}],"kind":"view-node","props":{},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-param-enable":"cutoff","label":"Enable Cutoff (Hz)","name":"enable-cutoff"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"data-instrument-param":"cutoff","default":"20000","disabled":true,"kind":"number","label":"Cutoff (Hz)","max":"20000","min":"20","name":"instrument-cutoff","step":"any"},"tag":"Input"}],"kind":"view-node","props":{},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-param-enable":"res","label":"Enable Resonance","name":"enable-res"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"data-instrument-param":"res","default":"0","disabled":true,"kind":"number","label":"Resonance","max":"1","min":"0","name":"instrument-res","step":"any"},"tag":"Input"}],"kind":"view-node","props":{},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-param-enable":"amp.a","label":"Enable Attack (ms)","name":"enable-amp.a"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"data-instrument-param":"amp.a","default":"8","disabled":true,"kind":"number","label":"Attack (ms)","max":"8000","min":"0","name":"instrument-amp.a","step":"any"},"tag":"Input"}],"kind":"view-node","props":{},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-param-enable":"amp.d","label":"Enable Decay (ms)","name":"enable-amp.d"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"data-instrument-param":"amp.d","default":"120","disabled":true,"kind":"number","label":"Decay (ms)","max":"8000","min":"0","name":"instrument-amp.d","step":"any"},"tag":"Input"}],"kind":"view-node","props":{},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-param-enable":"amp.s","label":"Enable Sustain","name":"enable-amp.s"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"data-instrument-param":"amp.s","default":"0.7","disabled":true,"kind":"number","label":"Sustain","max":"1","min":"0","name":"instrument-amp.s","step":"any"},"tag":"Input"}],"kind":"view-node","props":{},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-param-enable":"amp.r","label":"Enable Release (ms)","name":"enable-amp.r"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"data-instrument-param":"amp.r","default":"180","disabled":true,"kind":"number","label":"Release (ms)","max":"8000","min":"0","name":"instrument-amp.r","step":"any"},"tag":"Input"}],"kind":"view-node","props":{},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-param-enable":"gain","label":"Enable Gain","name":"enable-gain"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"data-instrument-param":"gain","default":"0.3","disabled":true,"kind":"number","label":"Gain","max":"1","min":"0","name":"instrument-gain","step":"any"},"tag":"Input"}],"kind":"view-node","props":{},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-param-enable":"pan","label":"Enable Pan","name":"enable-pan"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"data-instrument-param":"pan","default":"0","disabled":true,"kind":"number","label":"Pan","max":"1","min":"-1","name":"instrument-pan","step":"any"},"tag":"Input"}],"kind":"view-node","props":{},"tag":"Section"}],"kind":"view-node","props":{"className":"media-fragment"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-instrument-fields","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"element":"details","open":true},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"instrument-editor.18","data-instrument":"add-track","disabled":false,"label":"Add instrument track"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"instrument-editor.19","data-instrument":"update-track","disabled":true,"label":"Update selected track"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"className":"ls-legacy-patch","controlKey":"instrument-editor.20","data-instrument":"create","disabled":false,"label":"Assign to score channel"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"data-instrument":"status","role":"status","text":"Custom instruments are saved with your score draft.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"aria-label":"Instrument builder","className":"ls-instrument-editor","data-instrument-editor":true,"element":"section"},"tag":"Section"}],"kind":"view-node","props":{"className":"media-fragment","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"text":"Prepare a score to open its tracks, clips and envelopes.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"aria-label":"Track session","className":"ls-session-editor","data-session-editor":true,"element":"section"},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Visuals","variant":"h3"},"tag":"Text"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.7","data-visual":"fullscreen","disabled":false,"label":"Fullscreen"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.12","data-scope-surface":"shader","data-visual-workspace":"shader","disabled":false,"label":"Shaders","pressed":true},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-shader-scope","data-scope-surface":"trace","data-visual-workspace":"trace","disabled":false,"label":"Shader → scope","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.13","data-scope-surface":"scope","data-visual-workspace":"scope","disabled":false,"label":"Oscilloscope","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.14","data-scope-surface":"spectrum","data-visual-workspace":"spectrum","disabled":false,"label":"Spectrogram","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.18","data-scope-surface":"geometry","data-visual-workspace":"geometry","disabled":false,"label":"Geometry","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.19","data-field-open":true,"data-visual-workspace":"field","disabled":false,"label":"4D field","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.20","data-scope-surface":"plate","data-visual-workspace":"plate","disabled":false,"label":"Resonant plate","pressed":false},"tag":"Action"}],"kind":"view-node","props":{"aria-label":"Visual workspace","className":"ls-visual-workspaces","element":"nav"},"tag":"Section"}],"kind":"view-node","props":{"element":"header"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"aria-live":"polite","className":"ls-sound-source","data-scope":"source","role":"status","text":"Sound · stopped","variant":"output"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Geometry instrument"},"tag":"Text"}],"kind":"view-node","props":{"element":"legend"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Vector shape","controlKey":"visual-performance-visual.36","data-scope":"shape","default":"circle","disabled":false,"label":"From","name":"visual-performance-visual-36","options":[{"label":"Circle","value":"circle"},{"label":"Lissajous 3:2","value":"lissajous"},{"label":"Diamond","value":"diamond"},{"label":"Rose","value":"rose"},{"label":"Orbit knot","value":"orbit"},{"label":"Five-point star","value":"star"},{"label":"Triangle","value":"triangle"},{"label":"Hexagon","value":"hexagon"},{"label":"Spirograph","value":"spirograph"},{"label":"Torus knot","value":"torus"},{"label":"Circle grid 3 × 3","value":"grid"},{"label":"Honeycomb","value":"honeycomb"},{"label":"Smooth 4D field","value":"field"},{"label":"Captured shader contour","value":"shader"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Target shape","controlKey":"visual-performance-visual.38","data-scope":"target","default":"rose","disabled":false,"label":"To","name":"visual-performance-visual-38","options":[{"label":"Rose","value":"rose"},{"label":"Circle","value":"circle"},{"label":"Lissajous 3:2","value":"lissajous"},{"label":"Diamond","value":"diamond"},{"label":"Orbit knot","value":"orbit"},{"label":"Five-point star","value":"star"},{"label":"Triangle","value":"triangle"},{"label":"Hexagon","value":"hexagon"},{"label":"Spirograph","value":"spirograph"},{"label":"Torus knot","value":"torus"},{"label":"Circle grid 3 × 3","value":"grid"},{"label":"Honeycomb","value":"honeycomb"},{"label":"Smooth 4D field","value":"field"},{"label":"Captured shader contour","value":"shader"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Shape morph","controlKey":"visual-performance-visual.40","data-scope":"morph","default":"0","disabled":false,"kind":"range","label":"Morph","max":"1","min":"0","name":"visual-performance-visual-40","step":"0.001"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Morph motion rate","controlKey":"visual-performance-visual.42","data-scope":"motion","default":"0","disabled":false,"kind":"range","label":"Motion Hz","max":"2","min":"0","name":"visual-performance-visual-42","step":"0.01"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Journey seed","controlKey":"visual-performance-visual.44","data-scope":"seed","default":"1","disabled":false,"kind":"number","label":"Seed","max":"4294967295","min":"0","name":"visual-performance-visual-44","step":"1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.45","data-scope":"journey","disabled":false,"label":"Generate journey"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"text":"Harmony voices share the MIDI root and morph, with normalized level. Tiled paths include connecting strokes; summed voices reshape the trace.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-scope-section","data-visual-for":"geometry","element":"fieldset","hidden":true},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"className":"ls-daw-caption","text":"FIELD INSTRUMENT","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Smooth 4D field","variant":"h4"},"tag":"Text"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Scan a smooth field into sound. Rotate it to reshape the harmonics.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-field-heading","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"checked":true,"disabled":true,"hostBinding":{"action":"virtual.field.follow","event":"change","key":"follow","read":"checked"},"hostOutputs":{"checked":"follow","disabled":"busy"},"label":"Follow prepared take","name":"virtual-field-arrangement-follow"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.field.clip","event":"change","key":"clip","read":"text"},"hostOutputs":{"disabled":"clipDisabled","options":"clips","value":"clip"},"label":"Arrangement field clip","name":"virtual-field-arrangement-clip","options":[]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.field.point","event":"change","key":"point","read":"text"},"hostOutputs":{"disabled":"editDisabled","options":"points","value":"point"},"label":"Curve point","name":"virtual-field-arrangement-point","options":[]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"html":"<svg id=\"virtual-field-arrangement-plot\" viewBox=\"0 0 320 100\" preserveAspectRatio=\"none\" role=\"img\" aria-label=\"Field curves: XW, XY and Interaction\"><path data-field-arrangement-curve=\"xw\"/><path data-field-arrangement-curve=\"xy\"/><path data-field-arrangement-curve=\"interaction\"/><line data-field-arrangement-playhead x1=\"0\" x2=\"0\" y1=\"0\" y2=\"100\"/></svg>"},"tag":"RawHtml"},{"children":[],"kind":"view-node","props":{"text":"XW · XY · Interaction"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"default":0,"disabled":true,"hostBinding":{"action":"virtual.field.scrub","event":"input","key":"beat","read":"number"},"hostOutputs":{"disabled":"scrubDisabled","max":"duration","value":"beat"},"kind":"range","label":"Explore clip beat","max":4,"min":0,"name":"virtual-field-arrangement-scrub","step":0.01},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":0,"disabled":true,"hostBinding":{"action":"virtual.field.value","event":"input","key":"xw","read":"number"},"hostOutputs":{"disabled":"editDisabled","value":"xw"},"kind":"number","label":"Point XW (degrees)","max":180.0,"min":-180.0,"name":"virtual-field-arrangement-xw","step":1.0},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":0,"disabled":true,"hostBinding":{"action":"virtual.field.value","event":"input","key":"xy","read":"number"},"hostOutputs":{"disabled":"editDisabled","value":"xy"},"kind":"number","label":"Point XY (degrees)","max":180.0,"min":-180.0,"name":"virtual-field-arrangement-xy","step":1.0},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":0,"disabled":true,"hostBinding":{"action":"virtual.field.value","event":"input","key":"interaction","read":"number"},"hostOutputs":{"disabled":"editDisabled","value":"interaction"},"kind":"number","label":"Point interaction","max":1.0,"min":0.0,"name":"virtual-field-arrangement-interaction","step":0.01},"tag":"Input"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.field.edit","event":"click"},"hostOutputs":{"disabled":"loadDisabled"},"id":"virtual-field-arrangement-edit","label":"Load draft curves"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.field.save","event":"click"},"hostOutputs":{"disabled":"saveDisabled"},"id":"virtual-field-arrangement-save","label":"Save point to draft"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"hostOutput":"status","id":"virtual-field-arrangement-status","role":"status","text":"Prepare an arrangement with a 4D field clip to explore its movement."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Scrub during playback to hear the arrangement; stopped scrubbing stays silent. Load draft curves to edit a point. The first and last points stay linked for a closed loop. Save changes the draft; Prepare adopts it into audio. Undo draft replacement restores the edit."},"tag":"Text"}],"kind":"view-node","props":{"hostCapability":"virtual.field-arrangement","hostInitial":{"follow":true},"hostPlotId":"virtual-field-arrangement-plot","hostVersion":1,"id":"virtual-field-arrangement","title":"Arrangement movement"},"tag":"Card"}],"kind":"view-node","props":{"data-cre8-host-artifact":"{\"schema\":\"cre8.view.ir\",\"version\":1,\"template_id\":\"virtual.field-arrangement\",\"source_hash\":\"cf9515fc9b956bdfd98d73b62f463ea1182a887bd3811dac029e19aca5da7516\",\"context_hash\":\"09742b83331e8f809bca436422bb0ffc9f4827a49af2cfdd54b810442588cfa0\",\"tree_hash\":\"89b2976c5da8160acbb88dc335b0d823ac78d01e4120fe883a233497d25a3997\",\"tree_json\":\"{\\\"children\\\":[{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"checked\\\":true,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.field.follow\\\",\\\"event\\\":\\\"change\\\",\\\"key\\\":\\\"follow\\\",\\\"read\\\":\\\"checked\\\"},\\\"hostOutputs\\\":{\\\"checked\\\":\\\"follow\\\",\\\"disabled\\\":\\\"busy\\\"},\\\"label\\\":\\\"Follow prepared take\\\",\\\"name\\\":\\\"virtual-field-arrangement-follow\\\"},\\\"tag\\\":\\\"Checkbox\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.field.clip\\\",\\\"event\\\":\\\"change\\\",\\\"key\\\":\\\"clip\\\",\\\"read\\\":\\\"text\\\"},\\\"hostOutputs\\\":{\\\"disabled\\\":\\\"clipDisabled\\\",\\\"options\\\":\\\"clips\\\",\\\"value\\\":\\\"clip\\\"},\\\"label\\\":\\\"Arrangement field clip\\\",\\\"name\\\":\\\"virtual-field-arrangement-clip\\\",\\\"options\\\":[]},\\\"tag\\\":\\\"Select\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.field.point\\\",\\\"event\\\":\\\"change\\\",\\\"key\\\":\\\"point\\\",\\\"read\\\":\\\"text\\\"},\\\"hostOutputs\\\":{\\\"disabled\\\":\\\"editDisabled\\\",\\\"options\\\":\\\"points\\\",\\\"value\\\":\\\"point\\\"},\\\"label\\\":\\\"Curve point\\\",\\\"name\\\":\\\"virtual-field-arrangement-point\\\",\\\"options\\\":[]},\\\"tag\\\":\\\"Select\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"html\\\":\\\"<svg id=\\\\\\\"virtual-field-arrangement-plot\\\\\\\" viewBox=\\\\\\\"0 0 320 100\\\\\\\" preserveAspectRatio=\\\\\\\"none\\\\\\\" role=\\\\\\\"img\\\\\\\" aria-label=\\\\\\\"Field curves: XW, XY and Interaction\\\\\\\"><path data-field-arrangement-curve=\\\\\\\"xw\\\\\\\"/><path data-field-arrangement-curve=\\\\\\\"xy\\\\\\\"/><path data-field-arrangement-curve=\\\\\\\"interaction\\\\\\\"/><line data-field-arrangement-playhead x1=\\\\\\\"0\\\\\\\" x2=\\\\\\\"0\\\\\\\" y1=\\\\\\\"0\\\\\\\" y2=\\\\\\\"100\\\\\\\"/></svg>\\\"},\\\"tag\\\":\\\"RawHtml\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"XW · XY · Interaction\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":0,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.field.scrub\\\",\\\"event\\\":\\\"input\\\",\\\"key\\\":\\\"beat\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"disabled\\\":\\\"scrubDisabled\\\",\\\"max\\\":\\\"duration\\\",\\\"value\\\":\\\"beat\\\"},\\\"kind\\\":\\\"range\\\",\\\"label\\\":\\\"Explore clip beat\\\",\\\"max\\\":4,\\\"min\\\":0,\\\"name\\\":\\\"virtual-field-arrangement-scrub\\\",\\\"step\\\":0.01},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":0,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.field.value\\\",\\\"event\\\":\\\"input\\\",\\\"key\\\":\\\"xw\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"disabled\\\":\\\"editDisabled\\\",\\\"value\\\":\\\"xw\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Point XW (degrees)\\\",\\\"max\\\":180.0,\\\"min\\\":-180.0,\\\"name\\\":\\\"virtual-field-arrangement-xw\\\",\\\"step\\\":1.0},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":0,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.field.value\\\",\\\"event\\\":\\\"input\\\",\\\"key\\\":\\\"xy\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"disabled\\\":\\\"editDisabled\\\",\\\"value\\\":\\\"xy\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Point XY (degrees)\\\",\\\"max\\\":180.0,\\\"min\\\":-180.0,\\\"name\\\":\\\"virtual-field-arrangement-xy\\\",\\\"step\\\":1.0},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":0,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.field.value\\\",\\\"event\\\":\\\"input\\\",\\\"key\\\":\\\"interaction\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"disabled\\\":\\\"editDisabled\\\",\\\"value\\\":\\\"interaction\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Point interaction\\\",\\\"max\\\":1.0,\\\"min\\\":0.0,\\\"name\\\":\\\"virtual-field-arrangement-interaction\\\",\\\"step\\\":0.01},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.field.edit\\\",\\\"event\\\":\\\"click\\\"},\\\"hostOutputs\\\":{\\\"disabled\\\":\\\"loadDisabled\\\"},\\\"id\\\":\\\"virtual-field-arrangement-edit\\\",\\\"label\\\":\\\"Load draft curves\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.field.save\\\",\\\"event\\\":\\\"click\\\"},\\\"hostOutputs\\\":{\\\"disabled\\\":\\\"saveDisabled\\\"},\\\"id\\\":\\\"virtual-field-arrangement-save\\\",\\\"label\\\":\\\"Save point to draft\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"hostOutput\\\":\\\"status\\\",\\\"id\\\":\\\"virtual-field-arrangement-status\\\",\\\"role\\\":\\\"status\\\",\\\"text\\\":\\\"Prepare an arrangement with a 4D field clip to explore its movement.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"Scrub during playback to hear the arrangement; stopped scrubbing stays silent. Load draft curves to edit a point. The first and last points stay linked for a closed loop. Save changes the draft; Prepare adopts it into audio. Undo draft replacement restores the edit.\\\"},\\\"tag\\\":\\\"Text\\\"}],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"hostCapability\\\":\\\"virtual.field-arrangement\\\",\\\"hostInitial\\\":{\\\"follow\\\":true},\\\"hostPlotId\\\":\\\"virtual-field-arrangement-plot\\\",\\\"hostVersion\\\":1,\\\"id\\\":\\\"virtual-field-arrangement\\\",\\\"title\\\":\\\"Arrangement movement\\\"},\\\"tag\\\":\\\"Card\\\"}\",\"tree\":{\"children\":[{\"children\":[],\"kind\":\"view-node\",\"props\":{\"checked\":true,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.field.follow\",\"event\":\"change\",\"key\":\"follow\",\"read\":\"checked\"},\"hostOutputs\":{\"checked\":\"follow\",\"disabled\":\"busy\"},\"label\":\"Follow prepared take\",\"name\":\"virtual-field-arrangement-follow\"},\"tag\":\"Checkbox\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.field.clip\",\"event\":\"change\",\"key\":\"clip\",\"read\":\"text\"},\"hostOutputs\":{\"disabled\":\"clipDisabled\",\"options\":\"clips\",\"value\":\"clip\"},\"label\":\"Arrangement field clip\",\"name\":\"virtual-field-arrangement-clip\",\"options\":[]},\"tag\":\"Select\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.field.point\",\"event\":\"change\",\"key\":\"point\",\"read\":\"text\"},\"hostOutputs\":{\"disabled\":\"editDisabled\",\"options\":\"points\",\"value\":\"point\"},\"label\":\"Curve point\",\"name\":\"virtual-field-arrangement-point\",\"options\":[]},\"tag\":\"Select\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"html\":\"<svg id=\\\"virtual-field-arrangement-plot\\\" viewBox=\\\"0 0 320 100\\\" preserveAspectRatio=\\\"none\\\" role=\\\"img\\\" aria-label=\\\"Field curves: XW, XY and Interaction\\\"><path data-field-arrangement-curve=\\\"xw\\\"/><path data-field-arrangement-curve=\\\"xy\\\"/><path data-field-arrangement-curve=\\\"interaction\\\"/><line data-field-arrangement-playhead x1=\\\"0\\\" x2=\\\"0\\\" y1=\\\"0\\\" y2=\\\"100\\\"/></svg>\"},\"tag\":\"RawHtml\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"XW · XY · Interaction\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":0,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.field.scrub\",\"event\":\"input\",\"key\":\"beat\",\"read\":\"number\"},\"hostOutputs\":{\"disabled\":\"scrubDisabled\",\"max\":\"duration\",\"value\":\"beat\"},\"kind\":\"range\",\"label\":\"Explore clip beat\",\"max\":4,\"min\":0,\"name\":\"virtual-field-arrangement-scrub\",\"step\":0.01},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":0,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.field.value\",\"event\":\"input\",\"key\":\"xw\",\"read\":\"number\"},\"hostOutputs\":{\"disabled\":\"editDisabled\",\"value\":\"xw\"},\"kind\":\"number\",\"label\":\"Point XW (degrees)\",\"max\":180.0,\"min\":-180.0,\"name\":\"virtual-field-arrangement-xw\",\"step\":1.0},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":0,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.field.value\",\"event\":\"input\",\"key\":\"xy\",\"read\":\"number\"},\"hostOutputs\":{\"disabled\":\"editDisabled\",\"value\":\"xy\"},\"kind\":\"number\",\"label\":\"Point XY (degrees)\",\"max\":180.0,\"min\":-180.0,\"name\":\"virtual-field-arrangement-xy\",\"step\":1.0},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":0,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.field.value\",\"event\":\"input\",\"key\":\"interaction\",\"read\":\"number\"},\"hostOutputs\":{\"disabled\":\"editDisabled\",\"value\":\"interaction\"},\"kind\":\"number\",\"label\":\"Point interaction\",\"max\":1.0,\"min\":0.0,\"name\":\"virtual-field-arrangement-interaction\",\"step\":0.01},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.field.edit\",\"event\":\"click\"},\"hostOutputs\":{\"disabled\":\"loadDisabled\"},\"id\":\"virtual-field-arrangement-edit\",\"label\":\"Load draft curves\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.field.save\",\"event\":\"click\"},\"hostOutputs\":{\"disabled\":\"saveDisabled\"},\"id\":\"virtual-field-arrangement-save\",\"label\":\"Save point to draft\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"hostOutput\":\"status\",\"id\":\"virtual-field-arrangement-status\",\"role\":\"status\",\"text\":\"Prepare an arrangement with a 4D field clip to explore its movement.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"Scrub during playback to hear the arrangement; stopped scrubbing stays silent. Load draft curves to edit a point. The first and last points stay linked for a closed loop. Save changes the draft; Prepare adopts it into audio. Undo draft replacement restores the edit.\"},\"tag\":\"Text\"}],\"kind\":\"view-node\",\"props\":{\"hostCapability\":\"virtual.field-arrangement\",\"hostInitial\":{\"follow\":true},\"hostPlotId\":\"virtual-field-arrangement-plot\",\"hostVersion\":1,\"id\":\"virtual-field-arrangement\",\"title\":\"Arrangement movement\"},\"tag\":\"Card\"},\"execution\":{\"portable_ir_schema\":\"cre8.view.ir\",\"portable_ir_tree_hash\":\"89b2976c5da8160acbb88dc335b0d823ac78d01e4120fe883a233497d25a3997\",\"portable_ir_version\":1,\"producer\":\"rust-ssr\"}}","data-cre8-host-component":"virtual.field-arrangement","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"aria-label":"Arrangement movement","className":"ls-field-arrangement","element":"section"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Field visual","controlKey":"visual-smooth-field.11","data-field-view":true,"default":"xy","disabled":false,"label":"View sound","name":"visual-smooth-field-11","options":[{"label":"Stereo orbit","value":"xy"},{"label":"Waveforms","value":"wave"},{"label":"3D spectrogram","value":"spectrum"},{"label":"Shader","value":"shader"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-smooth-field.12","data-field-experiment":"save","disabled":false,"label":"Save experiment"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-smooth-field.13","data-field-experiment":"recall","disabled":false,"label":"Recall saved"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-field-experiment","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"className":"ls-field-save-help","text":"One saved experiment on this browser: field, gesture, frequency, voices and visual choice. Shader edits and display settings stay separate.","variant":"p"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"aria-live":"polite","data-field-saved":true,"role":"status","text":"","variant":"output"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"visual-smooth-field.17","data-field-preset":"{\"xw\":0,\"xy\":0,\"interaction\":0}","disabled":false,"label":"Pure orbit"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-smooth-field.18","data-field-preset":"{\"xw\":25,\"xy\":-20,\"interaction\":0.65}","disabled":false,"label":"Folded ribbon"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-smooth-field.19","data-field-preset":"{\"xw\":75,\"xy\":-20,\"interaction\":0.9}","disabled":false,"label":"Braided loop"},"tag":"Action"}],"kind":"view-node","props":{"aria-label":"Field starting shapes","className":"ls-field-presets","element":"div","role":"group"},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"html":"<svg viewbox=\"0 0 320 160\" preserveaspectratio=\"none\" aria-hidden=\"true\"><path d=\"M160 0V160M0 80H320\"></path><circle data-field-pad-marker cx=\"182.2\" cy=\"88.9\" r=\"5\"></circle></svg>"},"tag":"RawHtml"},{"children":[],"kind":"view-node","props":{"className":"ls-field-pad-x","text":"XW · left / right","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"className":"ls-field-pad-y","text":"XY · up / down","variant":"span"},"tag":"Text"}],"kind":"view-node","props":{"aria-describedby":"field-pad-help","aria-label":"Field rotation pad","className":"ls-field-pad","controlKey":"visual-smooth-field.22","data-field-pad":true,"disabled":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"id":"field-pad-help","text":"Drag to rotate. Arrow keys move 5°; Shift moves 1°; Home centres. Press Play instrument to hear it.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-field-pad-wrap","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Field rotation XW","controlKey":"visual-smooth-field.30","data-scope":"field-xw","default":"25","disabled":false,"kind":"range","label":"Rotate XW","max":"180","min":"-180","name":"visual-smooth-field-30","step":"any"},"tag":"Input"},{"children":[],"kind":"view-node","props":{"data-field-value":"xw","text":"25°","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Field rotation XY","controlKey":"visual-smooth-field.33","data-scope":"field-xy","default":"-20","disabled":false,"kind":"range","label":"Rotate XY","max":"180","min":"-180","name":"visual-smooth-field-33","step":"any"},"tag":"Input"},{"children":[],"kind":"view-node","props":{"data-field-value":"xy","text":"−20°","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Field interaction","controlKey":"visual-smooth-field.36","data-scope":"field-interaction","default":"0.65","disabled":false,"kind":"range","label":"Interaction","max":"1","min":"0","name":"visual-smooth-field-36","step":"0.01"},"tag":"Input"},{"children":[],"kind":"view-node","props":{"data-field-value":"interaction","text":"65%","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-field-knobs","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-field-play","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"visual-smooth-field.39","data-field-gesture-action":"record","disabled":false,"label":"Record gesture"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-smooth-field.40","data-field-gesture-action":"finish","disabled":true,"label":"Finish gesture"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-smooth-field.41","data-field-gesture-action":"loop","disabled":true,"label":"Loop gesture","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-smooth-field.42","data-field-gesture-action":"download","disabled":true,"label":"Download gesture WAV"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-field-gesture-actions","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"data-field-gesture-status":true,"text":"Record a movement to make a reusable gesture. Record and Loop start the instrument.","variant":"output"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Gesture curves & editing"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"html":"<svg viewbox=\"0 0 320 100\" preserveaspectratio=\"none\" role=\"img\" aria-label=\"Recorded gesture curves: XW, XY and Interaction\">\n        <path data-field-gesture-curve=\"xw\"></path><path data-field-gesture-curve=\"xy\"></path><path data-field-gesture-curve=\"interaction\"></path>\n        <line data-field-gesture-playhead x1=\"0\" x2=\"0\" y1=\"0\" y2=\"100\"></line>\n      </svg>"},"tag":"RawHtml"},{"children":[{"children":[],"kind":"view-node","props":{"text":"XW","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"XY","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Interaction","variant":"span"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-field-gesture-legend","variant":"p"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Gesture duration seconds","controlKey":"visual-smooth-field.53","data-field-gesture-length":true,"disabled":true,"kind":"number","label":"Duration (s)","max":"16.08","min":"0.1","name":"visual-smooth-field-53","step":"0.001"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-smooth-field.54","data-field-gesture-action":"duration","disabled":true,"label":"Apply duration"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Gesture point","controlKey":"visual-smooth-field.56","data-field-gesture-point":true,"default":"","disabled":true,"label":"Point","name":"visual-smooth-field-56","options":[]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-smooth-field.57","data-field-gesture-action":"update","disabled":true,"label":"Update point"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-field-gesture-actions","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Select a point, adjust the pad or Interaction, then Update point. Duration changes gesture speed; pitch stays independent. Save experiment keeps the gesture.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"element":"details"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Send to arrangement"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Field clip start beat","controlKey":"visual-smooth-field.63","data-field-clip-start":true,"default":"0","disabled":false,"kind":"number","label":"Start beat","min":"0","name":"visual-smooth-field-63","step":".25"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Field clip length beats","controlKey":"visual-smooth-field.65","data-field-clip-beats":true,"default":"4","disabled":false,"kind":"number","label":"Length (beats)","min":".25","name":"visual-smooth-field-65","step":".25"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-smooth-field.66","data-field-gesture-action":"arrange","disabled":true,"label":"Add field clip"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-field-gesture-actions","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Adds a new track with an editable held MIDI note and this gesture stretched across the clip. Beat 0 is the start. Pitch uses the nearest MIDI note; voices are preserved. Prepare the score first.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"element":"details"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Capture up to 16 seconds on the audio clock, with a short return to the start. WAV exports one dry cycle. Native field clips keep the movement editable and follow the arrangement tempo.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"aria-label":"Gesture clip","className":"ls-field-gesture","data-field-gesture-controls":true,"element":"section"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Visuals follow the sound; switching views keeps the instrument playing. Stereo orbit shows the audio readout, not all four coordinates.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"aria-label":"Smooth 4D field","className":"ls-field-panel","data-scope":"field-controls","element":"section","hidden":true},"tag":"Section"}],"kind":"view-node","props":{"className":"media-fragment","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Geometry · the 4D scan","variant":"strong"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"XYZ projection · colour shows rotated W","variant":"span"},"tag":"Text"}],"kind":"view-node","props":{"element":"figcaption"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"html":"<svg viewbox=\"0 0 320 320\" role=\"img\" aria-label=\"Four-dimensional scan projected into XYZ; blue is negative W and amber is positive W\">\n        <g data-field-axes></g><g data-field-curve fill=\"none\" stroke-width=\"2.2\" stroke-linecap=\"round\"></g>\n        <circle data-field-probe cx=\"160\" cy=\"160\" r=\"4.5\" fill=\"#fff\" stroke-width=\"2.5\"></circle>\n      </svg>"},"tag":"RawHtml"},{"children":[{"children":[],"kind":"view-node","props":{"text":"W −√2","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"aria-hidden":"true","className":"ls-field-color-key","text":"","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"+√2","variant":"span"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-field-legend","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Field phase probe","controlKey":"visual-performance-visual.58","data-field-phase":true,"default":"0","disabled":false,"kind":"range","label":"Phase probe · picture only","max":"1","min":"0","name":"visual-performance-visual-58","step":"0.001"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"aria-label":"Coordinates at phase probe","data-field-coordinates":true,"text":"","variant":"output"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"aria-label":"Raw stereo readout at phase probe","data-field-readout":true,"text":"","variant":"output"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Full cycle, fixed scale. Rotation changes the path; Interaction changes its stereo readout. Raw values precede audio filtering and level compensation.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-field-geometry","data-field-geometry":true,"data-visual-for":"field","element":"figure","hidden":true},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Shader"},"tag":"Text"}],"kind":"view-node","props":{"element":"figcaption"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"html":"<canvas data-shader-preview width=\"960\" height=\"540\" role=\"img\" aria-label=\"Shader source before contour capture\"></canvas>"},"tag":"RawHtml"}],"kind":"view-node","props":{"className":"ls-shader-preview","data-visual-for":"trace","element":"figure","hidden":true},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Audio output"},"tag":"Text"}],"kind":"view-node","props":{"data-visual-for":"field trace","element":"figcaption","hidden":true},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"html":"<canvas data-visual=\"canvas\" width=\"960\" height=\"540\" role=\"img\" aria-label=\"Shader picture driven by the prepared score\"></canvas>"},"tag":"RawHtml"}],"kind":"view-node","props":{"className":"ls-visual-stage","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"data-visual-for":"field","hidden":true,"text":"Play the instrument to compare the sound with its geometry. This view includes the voice's filtering, harmony and spatial settings.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-field-sound","element":"figure"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-field-views","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"visual-contour-preset","data-visual":"contour-preset","disabled":true,"label":"Contour preset"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.144","data-scope":"trace","disabled":false,"label":"Capture"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"data-scope":"trace-status","role":"status","text":"Capture an outline to play.","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-shader-trace","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.147","data-scope":"live","disabled":false,"label":"Link live"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Live shader trace rate","controlKey":"visual-performance-visual.149","data-scope":"live-rate","default":"10","disabled":false,"label":"Trace rate","name":"visual-performance-visual-149","options":[{"label":"5 / sec","value":"5"},{"label":"10 / sec","value":"10"},{"label":"20 / sec","value":"20"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Contour brightness","controlKey":"visual-performance-visual.151","data-scope":"threshold","default":"0.5","disabled":false,"kind":"range","label":"Contour brightness","max":"0.95","min":"0.05","name":"visual-performance-visual-151","step":"0.01"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"data-scope":"live-status","role":"status","text":"","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-shader-live","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-shader-sound","data-visual-for":"trace","element":"section","hidden":true},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Vector frequency","controlKey":"visual-performance-visual.25","data-scope":"frequency","default":"110","disabled":false,"kind":"range","label":"Frequency","max":"2000","min":"20","name":"visual-performance-visual-25","step":"0.01"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Vector voices","controlKey":"visual-performance-visual.27","data-scope":"voices","default":"solo","disabled":false,"label":"Voices","name":"visual-performance-visual-27","options":[{"label":"Solo","value":"solo"},{"label":"Octave · 2 voices","value":"octave"},{"label":"Perfect fifth · 2 voices","value":"fifth"},{"label":"Major triad · 3 voices","value":"triad"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.28","data-scope":"play","disabled":false,"label":"Play"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.29","data-scope":"stop","disabled":false,"label":"Stop"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"aria-describedby":"scope-wav-help","controlKey":"visual-performance-visual.30","data-scope":"export","disabled":false,"label":"Export WAV"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"aria-live":"polite","data-scope":"export-status","role":"status","text":"","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"aria-label":"Instrument playback","className":"ls-instrument-bar","data-visual-for":"geometry field trace","element":"section","hidden":true},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Simply supported aluminium rectangle · up to 64 bending modes. Choose harmonic RMS or live displacement driven by the DAW mix. Gold marks low vibration; red marks the point exciter."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"default":350.0,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"frequency","read":"number"},"hostOutputs":{"value":"frequency"},"kind":"number","label":"Drive frequency (Hz)","max":2000.0,"min":30.0,"name":"virtual-plate-frequency","step":0.1},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":300.0,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"width","read":"number"},"hostOutputs":{"value":"width"},"kind":"number","label":"Plate width (mm)","max":600.0,"min":200.0,"name":"virtual-plate-width","step":1.0},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":1.0,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"aspect","read":"number"},"hostOutputs":{"value":"aspect"},"kind":"number","label":"Height / width","max":1.5,"min":0.75,"name":"virtual-plate-aspect","step":0.01},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":1.0,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"thickness","read":"number"},"hostOutputs":{"value":"thickness"},"kind":"number","label":"Thickness (mm)","max":3.0,"min":0.5,"name":"virtual-plate-thickness","step":0.05},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":0.01,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"damping","read":"number"},"hostOutputs":{"value":"damping"},"kind":"number","label":"Damping ratio","max":0.1,"min":0.002,"name":"virtual-plate-damping","step":0.001},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":1.0,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"force","read":"number"},"hostOutputs":{"value":"force"},"kind":"number","label":"Drive force (mN)","max":100.0,"min":0.0,"name":"virtual-plate-force","step":0.1},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":25.0,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"audioForce","read":"number"},"hostOutputs":{"value":"audioForce"},"kind":"number","label":"Live force (mN per full-scale sample)","max":100.0,"min":0.0,"name":"virtual-plate-audioForce","step":0.1},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":0.37,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"x","read":"number"},"hostOutputs":{"value":"x"},"kind":"number","label":"Exciter X (fraction)","max":1.0,"min":0.0,"name":"virtual-plate-x","step":0.01},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":0.41,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"y","read":"number"},"hostOutputs":{"value":"y"},"kind":"number","label":"Exciter Y (fraction)","max":1.0,"min":0.0,"name":"virtual-plate-y","step":0.01},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":90.0,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"phase","read":"number"},"hostOutputs":{"value":"phase"},"kind":"number","label":"Surface phase (degrees)","max":360.0,"min":0.0,"name":"virtual-plate-phase","step":1.0},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":-25.0,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"yaw","read":"number"},"hostOutputs":{"value":"yaw"},"kind":"number","label":"Surface orbit (degrees)","max":180.0,"min":-180.0,"name":"virtual-plate-yaw","step":1.0},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":40.0,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"tilt","read":"number"},"hostOutputs":{"value":"tilt"},"kind":"number","label":"Surface tilt (degrees)","max":80.0,"min":10.0,"name":"virtual-plate-tilt","step":1.0},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":0.5,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"height","read":"number"},"hostOutputs":{"value":"height"},"kind":"number","label":"Display height (relative)","max":1.0,"min":0.1,"name":"virtual-plate-height","step":0.05},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":0.35,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"blend","read":"number"},"hostOutputs":{"value":"blend"},"kind":"number","label":"Hyperedge blend","max":1.0,"min":0.0,"name":"virtual-plate-blend","step":0.01},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":0.5,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"bridge","read":"number"},"hostOutputs":{"value":"bridge"},"kind":"number","label":"AD bridge weight","max":2.0,"min":0.0,"name":"virtual-plate-bridge","step":0.05},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":25.0,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"xw","read":"number"},"hostOutputs":{"value":"xw"},"kind":"number","label":"4D rotation XW (degrees)","max":180.0,"min":-180.0,"name":"virtual-plate-xw","step":1.0},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":-20.0,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"yz","read":"number"},"hostOutputs":{"value":"yz"},"kind":"number","label":"4D rotation YZ (degrees)","max":180.0,"min":-180.0,"name":"virtual-plate-yz","step":1.0},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":1.5,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"axisDelay","read":"number"},"hostOutputs":{"value":"axisDelay"},"kind":"number","label":"Axis delay step (ms)","max":5.0,"min":0.0,"name":"virtual-plate-axisDelay","step":0.1},"tag":"Input"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"change","initialize":true,"key":"live","read":"checked"},"hostOutputs":{"checked":"live"},"label":"Live response · DAW mix","name":"virtual-plate-live"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"change","initialize":true,"key":"surface","read":"checked"},"hostOutputs":{"checked":"surface"},"label":"3D surface · phase slice","name":"virtual-plate-surface"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"change","initialize":true,"key":"trace","read":"checked"},"hostOutputs":{"checked":"trace"},"label":"4D pickup trajectory","name":"virtual-plate-trace"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"change","initialize":true,"key":"listen","read":"checked"},"hostOutputs":{"checked":"listen"},"label":"Listen to pickup blend","name":"virtual-plate-listen"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.plate.tune","event":"click"},"hostOutputs":{},"id":"virtual-plate-tune","label":"Tune nearest mode"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.plate.play","event":"click"},"hostOutputs":{"disabled":"playDisabled"},"id":"virtual-plate-play","label":"Hear drive tone"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.plate.stop","event":"click"},"hostOutputs":{"disabled":"stopDisabled"},"id":"virtual-plate-stop","label":"Stop drive tone"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"hostOutput":"status","id":"virtual-plate-status","role":"status","text":"Preparing physical response…"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"hostOutput":"modes","id":"virtual-plate-modes","role":"status","text":"Mode frequencies follow dimensions, thickness and material."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"hostOutput":"audio","id":"virtual-plate-audio","role":"status","text":"Tone is an audible frequency reference; speaker level is independent of simulated force."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"hostOutput":"hyper","id":"virtual-plate-hyper","role":"status","text":"Four virtual pickups A(.19,.23), B(.73,.29), C(.31,.79), D(.81,.67). Hyperedges ABC and BCD blend groups; AD is the adjustable bridge. Enable the trajectory, then play a score or hear the drive tone."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Harmonic mode reports RMS with a frozen phase slice. Live mode integrates every audio sample and shows instantaneous displacement; phase control is ignored. Live force uses the mono DAW mix, not microphone capture. Picture height is normalized (1 nm floor in live mode); physical values remain in µm. Display snapshots may alias audio-frequency motion. E = 69 GPa, density = 2700 kg/m³, Poisson ratio = 0.33. No sand transport, free-edge or centre-clamp approximation."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"4D trajectory: X/Y screen position, Z perspective, W colour. Shows 512 consecutive audio samples; picture size is normalized. Hypergraph averaging and orthogonal rotations act on pickup signals, not plate mechanics. Optional stereo audition maps rotated X/Y to L/R at 0.03 digital units per µm, capped at ±0.1, alongside the dry source. Global Stop and leaving this view mute it. Changes to the blend do not reset plate motion."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Axis delay embeds rotated signals at t, t−τ, t−2τ, t−3τ using audio samples. Set delay to zero for simultaneous physical pickups. Time offsets change the stereo audition as well as the trajectory."},"tag":"Text"}],"kind":"view-node","props":{"hostCapability":"virtual.plate","hostInitial":{"aspect":1.0,"audioForce":25.0,"axisDelay":1.5,"blend":0.35,"bridge":0.5,"damping":0.01,"force":1.0,"frequency":350.0,"height":0.5,"listen":false,"live":false,"phase":90.0,"surface":false,"thickness":1.0,"tilt":40.0,"trace":false,"width":300.0,"x":0.37,"xw":25.0,"y":0.41,"yaw":-25.0,"yz":-20.0},"hostLimits":{"aspect":[0.75,1.5],"audioForce":[0.0,100.0],"axisDelay":[0.0,5.0],"blend":[0.0,1.0],"bridge":[0.0,2.0],"damping":[0.002,0.1],"force":[0.0,100.0],"frequency":[30.0,2000.0],"height":[0.1,1.0],"phase":[0.0,360.0],"thickness":[0.5,3.0],"tilt":[10.0,80.0],"width":[200.0,600.0],"x":[0.0,1.0],"xw":[-180.0,180.0],"y":[0.0,1.0],"yaw":[-180.0,180.0],"yz":[-180.0,180.0]},"hostVersion":1,"id":"virtual-plate","title":"Resonant plate"},"tag":"Card"}],"kind":"view-node","props":{"data-cre8-host-artifact":"{\"schema\":\"cre8.view.ir\",\"version\":1,\"template_id\":\"virtual.plate\",\"source_hash\":\"8f1a0ec669e961846be031b7d9ece72b7577208120e1b6923c8117fe7a9f7e2e\",\"context_hash\":\"b4478446303f92d2720210e42e874bc0975eac38c221e6eab7dfa6b4a3e00bd5\",\"tree_hash\":\"3dd562ac957cce1c3711af0de1cac6be89c0f1a8cb31861656969d97105ac9d7\",\"tree_json\":\"{\\\"children\\\":[{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"Simply supported aluminium rectangle · up to 64 bending modes. Choose harmonic RMS or live displacement driven by the DAW mix. Gold marks low vibration; red marks the point exciter.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":350.0,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"frequency\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"frequency\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Drive frequency (Hz)\\\",\\\"max\\\":2000.0,\\\"min\\\":30.0,\\\"name\\\":\\\"virtual-plate-frequency\\\",\\\"step\\\":0.1},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":300.0,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"width\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"width\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Plate width (mm)\\\",\\\"max\\\":600.0,\\\"min\\\":200.0,\\\"name\\\":\\\"virtual-plate-width\\\",\\\"step\\\":1.0},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":1.0,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"aspect\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"aspect\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Height / width\\\",\\\"max\\\":1.5,\\\"min\\\":0.75,\\\"name\\\":\\\"virtual-plate-aspect\\\",\\\"step\\\":0.01},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":1.0,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"thickness\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"thickness\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Thickness (mm)\\\",\\\"max\\\":3.0,\\\"min\\\":0.5,\\\"name\\\":\\\"virtual-plate-thickness\\\",\\\"step\\\":0.05},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":0.01,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"damping\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"damping\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Damping ratio\\\",\\\"max\\\":0.1,\\\"min\\\":0.002,\\\"name\\\":\\\"virtual-plate-damping\\\",\\\"step\\\":0.001},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":1.0,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"force\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"force\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Drive force (mN)\\\",\\\"max\\\":100.0,\\\"min\\\":0.0,\\\"name\\\":\\\"virtual-plate-force\\\",\\\"step\\\":0.1},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":25.0,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"audioForce\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"audioForce\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Live force (mN per full-scale sample)\\\",\\\"max\\\":100.0,\\\"min\\\":0.0,\\\"name\\\":\\\"virtual-plate-audioForce\\\",\\\"step\\\":0.1},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":0.37,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"x\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"x\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Exciter X (fraction)\\\",\\\"max\\\":1.0,\\\"min\\\":0.0,\\\"name\\\":\\\"virtual-plate-x\\\",\\\"step\\\":0.01},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":0.41,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"y\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"y\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Exciter Y (fraction)\\\",\\\"max\\\":1.0,\\\"min\\\":0.0,\\\"name\\\":\\\"virtual-plate-y\\\",\\\"step\\\":0.01},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":90.0,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"phase\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"phase\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Surface phase (degrees)\\\",\\\"max\\\":360.0,\\\"min\\\":0.0,\\\"name\\\":\\\"virtual-plate-phase\\\",\\\"step\\\":1.0},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":-25.0,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"yaw\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"yaw\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Surface orbit (degrees)\\\",\\\"max\\\":180.0,\\\"min\\\":-180.0,\\\"name\\\":\\\"virtual-plate-yaw\\\",\\\"step\\\":1.0},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":40.0,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"tilt\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"tilt\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Surface tilt (degrees)\\\",\\\"max\\\":80.0,\\\"min\\\":10.0,\\\"name\\\":\\\"virtual-plate-tilt\\\",\\\"step\\\":1.0},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":0.5,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"height\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"height\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Display height (relative)\\\",\\\"max\\\":1.0,\\\"min\\\":0.1,\\\"name\\\":\\\"virtual-plate-height\\\",\\\"step\\\":0.05},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":0.35,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"blend\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"blend\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Hyperedge blend\\\",\\\"max\\\":1.0,\\\"min\\\":0.0,\\\"name\\\":\\\"virtual-plate-blend\\\",\\\"step\\\":0.01},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":0.5,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"bridge\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"bridge\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"AD bridge weight\\\",\\\"max\\\":2.0,\\\"min\\\":0.0,\\\"name\\\":\\\"virtual-plate-bridge\\\",\\\"step\\\":0.05},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":25.0,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"xw\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"xw\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"4D rotation XW (degrees)\\\",\\\"max\\\":180.0,\\\"min\\\":-180.0,\\\"name\\\":\\\"virtual-plate-xw\\\",\\\"step\\\":1.0},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":-20.0,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"yz\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"yz\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"4D rotation YZ (degrees)\\\",\\\"max\\\":180.0,\\\"min\\\":-180.0,\\\"name\\\":\\\"virtual-plate-yz\\\",\\\"step\\\":1.0},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":1.5,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"axisDelay\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"axisDelay\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Axis delay step (ms)\\\",\\\"max\\\":5.0,\\\"min\\\":0.0,\\\"name\\\":\\\"virtual-plate-axisDelay\\\",\\\"step\\\":0.1},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"change\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"live\\\",\\\"read\\\":\\\"checked\\\"},\\\"hostOutputs\\\":{\\\"checked\\\":\\\"live\\\"},\\\"label\\\":\\\"Live response · DAW mix\\\",\\\"name\\\":\\\"virtual-plate-live\\\"},\\\"tag\\\":\\\"Checkbox\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"change\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"surface\\\",\\\"read\\\":\\\"checked\\\"},\\\"hostOutputs\\\":{\\\"checked\\\":\\\"surface\\\"},\\\"label\\\":\\\"3D surface · phase slice\\\",\\\"name\\\":\\\"virtual-plate-surface\\\"},\\\"tag\\\":\\\"Checkbox\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"change\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"trace\\\",\\\"read\\\":\\\"checked\\\"},\\\"hostOutputs\\\":{\\\"checked\\\":\\\"trace\\\"},\\\"label\\\":\\\"4D pickup trajectory\\\",\\\"name\\\":\\\"virtual-plate-trace\\\"},\\\"tag\\\":\\\"Checkbox\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"change\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"listen\\\",\\\"read\\\":\\\"checked\\\"},\\\"hostOutputs\\\":{\\\"checked\\\":\\\"listen\\\"},\\\"label\\\":\\\"Listen to pickup blend\\\",\\\"name\\\":\\\"virtual-plate-listen\\\"},\\\"tag\\\":\\\"Checkbox\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.tune\\\",\\\"event\\\":\\\"click\\\"},\\\"hostOutputs\\\":{},\\\"id\\\":\\\"virtual-plate-tune\\\",\\\"label\\\":\\\"Tune nearest mode\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.play\\\",\\\"event\\\":\\\"click\\\"},\\\"hostOutputs\\\":{\\\"disabled\\\":\\\"playDisabled\\\"},\\\"id\\\":\\\"virtual-plate-play\\\",\\\"label\\\":\\\"Hear drive tone\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.stop\\\",\\\"event\\\":\\\"click\\\"},\\\"hostOutputs\\\":{\\\"disabled\\\":\\\"stopDisabled\\\"},\\\"id\\\":\\\"virtual-plate-stop\\\",\\\"label\\\":\\\"Stop drive tone\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"hostOutput\\\":\\\"status\\\",\\\"id\\\":\\\"virtual-plate-status\\\",\\\"role\\\":\\\"status\\\",\\\"text\\\":\\\"Preparing physical response…\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"hostOutput\\\":\\\"modes\\\",\\\"id\\\":\\\"virtual-plate-modes\\\",\\\"role\\\":\\\"status\\\",\\\"text\\\":\\\"Mode frequencies follow dimensions, thickness and material.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"hostOutput\\\":\\\"audio\\\",\\\"id\\\":\\\"virtual-plate-audio\\\",\\\"role\\\":\\\"status\\\",\\\"text\\\":\\\"Tone is an audible frequency reference; speaker level is independent of simulated force.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"hostOutput\\\":\\\"hyper\\\",\\\"id\\\":\\\"virtual-plate-hyper\\\",\\\"role\\\":\\\"status\\\",\\\"text\\\":\\\"Four virtual pickups A(.19,.23), B(.73,.29), C(.31,.79), D(.81,.67). Hyperedges ABC and BCD blend groups; AD is the adjustable bridge. Enable the trajectory, then play a score or hear the drive tone.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"Harmonic mode reports RMS with a frozen phase slice. Live mode integrates every audio sample and shows instantaneous displacement; phase control is ignored. Live force uses the mono DAW mix, not microphone capture. Picture height is normalized (1 nm floor in live mode); physical values remain in µm. Display snapshots may alias audio-frequency motion. E = 69 GPa, density = 2700 kg/m³, Poisson ratio = 0.33. No sand transport, free-edge or centre-clamp approximation.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"4D trajectory: X/Y screen position, Z perspective, W colour. Shows 512 consecutive audio samples; picture size is normalized. Hypergraph averaging and orthogonal rotations act on pickup signals, not plate mechanics. Optional stereo audition maps rotated X/Y to L/R at 0.03 digital units per µm, capped at ±0.1, alongside the dry source. Global Stop and leaving this view mute it. Changes to the blend do not reset plate motion.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"Axis delay embeds rotated signals at t, t−τ, t−2τ, t−3τ using audio samples. Set delay to zero for simultaneous physical pickups. Time offsets change the stereo audition as well as the trajectory.\\\"},\\\"tag\\\":\\\"Text\\\"}],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"hostCapability\\\":\\\"virtual.plate\\\",\\\"hostInitial\\\":{\\\"aspect\\\":1.0,\\\"audioForce\\\":25.0,\\\"axisDelay\\\":1.5,\\\"blend\\\":0.35,\\\"bridge\\\":0.5,\\\"damping\\\":0.01,\\\"force\\\":1.0,\\\"frequency\\\":350.0,\\\"height\\\":0.5,\\\"listen\\\":false,\\\"live\\\":false,\\\"phase\\\":90.0,\\\"surface\\\":false,\\\"thickness\\\":1.0,\\\"tilt\\\":40.0,\\\"trace\\\":false,\\\"width\\\":300.0,\\\"x\\\":0.37,\\\"xw\\\":25.0,\\\"y\\\":0.41,\\\"yaw\\\":-25.0,\\\"yz\\\":-20.0},\\\"hostLimits\\\":{\\\"aspect\\\":[0.75,1.5],\\\"audioForce\\\":[0.0,100.0],\\\"axisDelay\\\":[0.0,5.0],\\\"blend\\\":[0.0,1.0],\\\"bridge\\\":[0.0,2.0],\\\"damping\\\":[0.002,0.1],\\\"force\\\":[0.0,100.0],\\\"frequency\\\":[30.0,2000.0],\\\"height\\\":[0.1,1.0],\\\"phase\\\":[0.0,360.0],\\\"thickness\\\":[0.5,3.0],\\\"tilt\\\":[10.0,80.0],\\\"width\\\":[200.0,600.0],\\\"x\\\":[0.0,1.0],\\\"xw\\\":[-180.0,180.0],\\\"y\\\":[0.0,1.0],\\\"yaw\\\":[-180.0,180.0],\\\"yz\\\":[-180.0,180.0]},\\\"hostVersion\\\":1,\\\"id\\\":\\\"virtual-plate\\\",\\\"title\\\":\\\"Resonant plate\\\"},\\\"tag\\\":\\\"Card\\\"}\",\"tree\":{\"children\":[{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"Simply supported aluminium rectangle · up to 64 bending modes. Choose harmonic RMS or live displacement driven by the DAW mix. Gold marks low vibration; red marks the point exciter.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":350.0,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"frequency\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"frequency\"},\"kind\":\"number\",\"label\":\"Drive frequency (Hz)\",\"max\":2000.0,\"min\":30.0,\"name\":\"virtual-plate-frequency\",\"step\":0.1},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":300.0,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"width\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"width\"},\"kind\":\"number\",\"label\":\"Plate width (mm)\",\"max\":600.0,\"min\":200.0,\"name\":\"virtual-plate-width\",\"step\":1.0},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":1.0,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"aspect\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"aspect\"},\"kind\":\"number\",\"label\":\"Height / width\",\"max\":1.5,\"min\":0.75,\"name\":\"virtual-plate-aspect\",\"step\":0.01},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":1.0,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"thickness\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"thickness\"},\"kind\":\"number\",\"label\":\"Thickness (mm)\",\"max\":3.0,\"min\":0.5,\"name\":\"virtual-plate-thickness\",\"step\":0.05},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":0.01,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"damping\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"damping\"},\"kind\":\"number\",\"label\":\"Damping ratio\",\"max\":0.1,\"min\":0.002,\"name\":\"virtual-plate-damping\",\"step\":0.001},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":1.0,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"force\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"force\"},\"kind\":\"number\",\"label\":\"Drive force (mN)\",\"max\":100.0,\"min\":0.0,\"name\":\"virtual-plate-force\",\"step\":0.1},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":25.0,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"audioForce\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"audioForce\"},\"kind\":\"number\",\"label\":\"Live force (mN per full-scale sample)\",\"max\":100.0,\"min\":0.0,\"name\":\"virtual-plate-audioForce\",\"step\":0.1},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":0.37,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"x\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"x\"},\"kind\":\"number\",\"label\":\"Exciter X (fraction)\",\"max\":1.0,\"min\":0.0,\"name\":\"virtual-plate-x\",\"step\":0.01},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":0.41,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"y\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"y\"},\"kind\":\"number\",\"label\":\"Exciter Y (fraction)\",\"max\":1.0,\"min\":0.0,\"name\":\"virtual-plate-y\",\"step\":0.01},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":90.0,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"phase\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"phase\"},\"kind\":\"number\",\"label\":\"Surface phase (degrees)\",\"max\":360.0,\"min\":0.0,\"name\":\"virtual-plate-phase\",\"step\":1.0},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":-25.0,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"yaw\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"yaw\"},\"kind\":\"number\",\"label\":\"Surface orbit (degrees)\",\"max\":180.0,\"min\":-180.0,\"name\":\"virtual-plate-yaw\",\"step\":1.0},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":40.0,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"tilt\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"tilt\"},\"kind\":\"number\",\"label\":\"Surface tilt (degrees)\",\"max\":80.0,\"min\":10.0,\"name\":\"virtual-plate-tilt\",\"step\":1.0},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":0.5,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"height\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"height\"},\"kind\":\"number\",\"label\":\"Display height (relative)\",\"max\":1.0,\"min\":0.1,\"name\":\"virtual-plate-height\",\"step\":0.05},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":0.35,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"blend\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"blend\"},\"kind\":\"number\",\"label\":\"Hyperedge blend\",\"max\":1.0,\"min\":0.0,\"name\":\"virtual-plate-blend\",\"step\":0.01},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":0.5,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"bridge\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"bridge\"},\"kind\":\"number\",\"label\":\"AD bridge weight\",\"max\":2.0,\"min\":0.0,\"name\":\"virtual-plate-bridge\",\"step\":0.05},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":25.0,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"xw\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"xw\"},\"kind\":\"number\",\"label\":\"4D rotation XW (degrees)\",\"max\":180.0,\"min\":-180.0,\"name\":\"virtual-plate-xw\",\"step\":1.0},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":-20.0,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"yz\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"yz\"},\"kind\":\"number\",\"label\":\"4D rotation YZ (degrees)\",\"max\":180.0,\"min\":-180.0,\"name\":\"virtual-plate-yz\",\"step\":1.0},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":1.5,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"axisDelay\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"axisDelay\"},\"kind\":\"number\",\"label\":\"Axis delay step (ms)\",\"max\":5.0,\"min\":0.0,\"name\":\"virtual-plate-axisDelay\",\"step\":0.1},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"change\",\"initialize\":true,\"key\":\"live\",\"read\":\"checked\"},\"hostOutputs\":{\"checked\":\"live\"},\"label\":\"Live response · DAW mix\",\"name\":\"virtual-plate-live\"},\"tag\":\"Checkbox\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"change\",\"initialize\":true,\"key\":\"surface\",\"read\":\"checked\"},\"hostOutputs\":{\"checked\":\"surface\"},\"label\":\"3D surface · phase slice\",\"name\":\"virtual-plate-surface\"},\"tag\":\"Checkbox\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"change\",\"initialize\":true,\"key\":\"trace\",\"read\":\"checked\"},\"hostOutputs\":{\"checked\":\"trace\"},\"label\":\"4D pickup trajectory\",\"name\":\"virtual-plate-trace\"},\"tag\":\"Checkbox\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"change\",\"initialize\":true,\"key\":\"listen\",\"read\":\"checked\"},\"hostOutputs\":{\"checked\":\"listen\"},\"label\":\"Listen to pickup blend\",\"name\":\"virtual-plate-listen\"},\"tag\":\"Checkbox\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.tune\",\"event\":\"click\"},\"hostOutputs\":{},\"id\":\"virtual-plate-tune\",\"label\":\"Tune nearest mode\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.play\",\"event\":\"click\"},\"hostOutputs\":{\"disabled\":\"playDisabled\"},\"id\":\"virtual-plate-play\",\"label\":\"Hear drive tone\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.stop\",\"event\":\"click\"},\"hostOutputs\":{\"disabled\":\"stopDisabled\"},\"id\":\"virtual-plate-stop\",\"label\":\"Stop drive tone\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"hostOutput\":\"status\",\"id\":\"virtual-plate-status\",\"role\":\"status\",\"text\":\"Preparing physical response…\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"hostOutput\":\"modes\",\"id\":\"virtual-plate-modes\",\"role\":\"status\",\"text\":\"Mode frequencies follow dimensions, thickness and material.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"hostOutput\":\"audio\",\"id\":\"virtual-plate-audio\",\"role\":\"status\",\"text\":\"Tone is an audible frequency reference; speaker level is independent of simulated force.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"hostOutput\":\"hyper\",\"id\":\"virtual-plate-hyper\",\"role\":\"status\",\"text\":\"Four virtual pickups A(.19,.23), B(.73,.29), C(.31,.79), D(.81,.67). Hyperedges ABC and BCD blend groups; AD is the adjustable bridge. Enable the trajectory, then play a score or hear the drive tone.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"Harmonic mode reports RMS with a frozen phase slice. Live mode integrates every audio sample and shows instantaneous displacement; phase control is ignored. Live force uses the mono DAW mix, not microphone capture. Picture height is normalized (1 nm floor in live mode); physical values remain in µm. Display snapshots may alias audio-frequency motion. E = 69 GPa, density = 2700 kg/m³, Poisson ratio = 0.33. No sand transport, free-edge or centre-clamp approximation.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"4D trajectory: X/Y screen position, Z perspective, W colour. Shows 512 consecutive audio samples; picture size is normalized. Hypergraph averaging and orthogonal rotations act on pickup signals, not plate mechanics. Optional stereo audition maps rotated X/Y to L/R at 0.03 digital units per µm, capped at ±0.1, alongside the dry source. Global Stop and leaving this view mute it. Changes to the blend do not reset plate motion.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"Axis delay embeds rotated signals at t, t−τ, t−2τ, t−3τ using audio samples. Set delay to zero for simultaneous physical pickups. Time offsets change the stereo audition as well as the trajectory.\"},\"tag\":\"Text\"}],\"kind\":\"view-node\",\"props\":{\"hostCapability\":\"virtual.plate\",\"hostInitial\":{\"aspect\":1.0,\"audioForce\":25.0,\"axisDelay\":1.5,\"blend\":0.35,\"bridge\":0.5,\"damping\":0.01,\"force\":1.0,\"frequency\":350.0,\"height\":0.5,\"listen\":false,\"live\":false,\"phase\":90.0,\"surface\":false,\"thickness\":1.0,\"tilt\":40.0,\"trace\":false,\"width\":300.0,\"x\":0.37,\"xw\":25.0,\"y\":0.41,\"yaw\":-25.0,\"yz\":-20.0},\"hostLimits\":{\"aspect\":[0.75,1.5],\"audioForce\":[0.0,100.0],\"axisDelay\":[0.0,5.0],\"blend\":[0.0,1.0],\"bridge\":[0.0,2.0],\"damping\":[0.002,0.1],\"force\":[0.0,100.0],\"frequency\":[30.0,2000.0],\"height\":[0.1,1.0],\"phase\":[0.0,360.0],\"thickness\":[0.5,3.0],\"tilt\":[10.0,80.0],\"width\":[200.0,600.0],\"x\":[0.0,1.0],\"xw\":[-180.0,180.0],\"y\":[0.0,1.0],\"yaw\":[-180.0,180.0],\"yz\":[-180.0,180.0]},\"hostVersion\":1,\"id\":\"virtual-plate\",\"title\":\"Resonant plate\"},\"tag\":\"Card\"},\"execution\":{\"portable_ir_schema\":\"cre8.view.ir\",\"portable_ir_tree_hash\":\"3dd562ac957cce1c3711af0de1cac6be89c0f1a8cb31861656969d97105ac9d7\",\"portable_ir_version\":1,\"producer\":\"rust-ssr\"}}","data-cre8-host-component":"virtual.plate","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"data-plate-slot":true,"element":"div","hidden":true},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-live":"polite","data-scope":"status","role":"status","text":"","variant":"output"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Scope settings"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Scope display"},"tag":"Text"}],"kind":"view-node","props":{"element":"legend"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Scope trace","controlKey":"visual-performance-visual.77","data-scope":"mode","default":"xy","disabled":false,"label":"Trace","name":"visual-performance-visual-77","options":[{"label":"XY path","value":"xy"},{"label":"Stereo waveform","value":"wave"},{"label":"3D spectrogram","value":"spectrum"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Scope gain","controlKey":"visual-performance-visual.79","data-scope":"gain","default":"4","disabled":false,"kind":"range","label":"Picture gain","max":"8","min":"0.25","name":"visual-performance-visual-79","step":"0.25"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Scope window","controlKey":"visual-performance-visual.81","data-scope":"window","default":"20","disabled":false,"label":"Window","name":"visual-performance-visual-81","options":[{"label":"5 ms","value":"5"},{"label":"20 ms","value":"20"},{"label":"50 ms","value":"50"},{"label":"100 ms","value":"100"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Scope persistence","controlKey":"visual-performance-visual.83","data-scope":"persistence","default":"100","disabled":false,"kind":"range","label":"Persistence","max":"500","min":"0","name":"visual-performance-visual-83","step":"10"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.85","data-scope":"trigger","default":true,"disabled":false,"label":"Rising-edge trigger (waveform)","name":"visual-performance-visual-85"},"tag":"Checkbox"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.87","data-scope":"freeze","default":false,"disabled":false,"label":"Freeze picture","name":"visual-performance-visual-87"},"tag":"Checkbox"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"3D rotation & depth"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Scope axes","controlKey":"visual-performance-visual.92","data-scope":"space","default":"flat","disabled":false,"label":"Axes","name":"visual-performance-visual-92","options":[{"label":"Stereo plane · L / R","value":"flat"},{"label":"Stereo + delayed L depth","value":"stereo-depth"},{"label":"Delay space · L / Lτ / L2τ","value":"delay"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Depth delay milliseconds","controlKey":"visual-performance-visual.94","data-scope":"delay","default":"1","disabled":false,"kind":"range","label":"Delay ms","max":"5","min":"0.1","name":"visual-performance-visual-94","step":"0.1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Scope projection","controlKey":"visual-performance-visual.96","data-scope":"projection","default":"orthographic","disabled":false,"label":"Projection","name":"visual-performance-visual-96","options":[{"label":"Orthographic","value":"orthographic"},{"label":"Perspective","value":"perspective"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Scope rotation X","controlKey":"visual-performance-visual.98","data-scope":"rotate-x","default":"0","disabled":false,"kind":"range","label":"Rotate X","max":"180","min":"-180","name":"visual-performance-visual-98","step":"1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Scope rotation Y","controlKey":"visual-performance-visual.100","data-scope":"rotate-y","default":"0","disabled":false,"kind":"range","label":"Rotate Y","max":"180","min":"-180","name":"visual-performance-visual-100","step":"1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Scope rotation Z","controlKey":"visual-performance-visual.102","data-scope":"rotate-z","default":"0","disabled":false,"kind":"range","label":"Rotate Z","max":"180","min":"-180","name":"visual-performance-visual-102","step":"1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.103","data-scope":"reset-view","disabled":false,"label":"Reset rotation"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"text":"Depth is derived from delayed audio, not a third input channel. Projection changes the picture only; waveform view ignores these controls.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-scope-fields","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-scope-spatial","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-scope-section","element":"fieldset"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-display-settings","data-visual-for":"scope geometry field trace","element":"details","hidden":true},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"default":-25.0,"disabled":true,"hostBinding":{"action":"virtual.spectrogram.set","event":"input","initialize":true,"key":"yaw","read":"number"},"kind":"range","label":"Spectrum orbit","max":180.0,"min":-180.0,"name":"virtual-spectrum-yaw","step":1.0},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":35.0,"disabled":true,"hostBinding":{"action":"virtual.spectrogram.set","event":"input","initialize":true,"key":"tilt","read":"number"},"kind":"range","label":"Spectrum tilt","max":80.0,"min":5.0,"name":"virtual-spectrum-tilt","step":1.0},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":1.5,"disabled":true,"hostBinding":{"action":"virtual.spectrogram.set","event":"input","initialize":true,"key":"height","read":"number"},"kind":"range","label":"Spectrum height","max":3.0,"min":0.2,"name":"virtual-spectrum-height","step":0.1},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":0.3,"disabled":true,"hostBinding":{"action":"virtual.spectrogram.set","event":"input","initialize":true,"key":"opacity","read":"number"},"kind":"range","label":"Video mix","max":0.8,"min":0.0,"name":"virtual-spectrum-opacity","step":0.01},"tag":"Input"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.spectrogram.set","event":"change","initialize":true,"key":"frozen","read":"checked"},"label":"Freeze spectrum","name":"virtual-spectrum-frozen"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.spectrogram.clear","event":"click"},"id":"virtual-spectrum-clear","label":"Clear history"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.spectrogram.camera","event":"click"},"id":"virtual-spectrum-camera","label":"Use camera"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.spectrogram.video-stop","event":"click"},"id":"virtual-spectrum-video-stop","label":"Stop video"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"accept":"video/*","disabled":true,"hostBinding":{"action":"virtual.spectrogram.file","event":"change","read":"file"},"kind":"file","label":"Local video","name":"virtual-spectrum-file"},"tag":"Input"},{"children":[],"kind":"view-node","props":{"hostOutput":"status","id":"virtual-spectrum-status","role":"status","text":"Frequency left to right · level in height and color · six seconds of measured history in depth."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"hostOutput":"videoStatus","id":"virtual-spectrum-videoStatus","role":"status","text":"Local picture only. Video loops freely; camera stops when this view is hidden. No upload or video audio."},"tag":"Text"}],"kind":"view-node","props":{"hostCapability":"virtual.spectrogram","hostInitial":{"frozen":false,"height":1.5,"opacity":0.3,"tilt":35.0,"yaw":-25.0},"hostLimits":{"height":[0.2,3.0],"opacity":[0.0,0.8],"tilt":[5.0,80.0],"yaw":[-180.0,180.0]},"hostVersion":1,"id":"virtual-spectrum","title":"Virtual · frequency landscape & video"},"tag":"Card"}],"kind":"view-node","props":{"data-cre8-host-artifact":"{\"schema\":\"cre8.view.ir\",\"version\":1,\"template_id\":\"virtual.spectrogram\",\"source_hash\":\"b5ca5478f57926ed995aeb344a15b8bb6487ab4e4ca9f0b9e858937d5b3b015d\",\"context_hash\":\"ac2653378140b7020e1b10976d97e196a56daac74580d42e4787381d3c14ba97\",\"tree_hash\":\"611f1135776cbd2dada96963f086ee96b20c59111037a402533c6dd3ee375e85\",\"tree_json\":\"{\\\"children\\\":[{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":-25.0,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.spectrogram.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"yaw\\\",\\\"read\\\":\\\"number\\\"},\\\"kind\\\":\\\"range\\\",\\\"label\\\":\\\"Spectrum orbit\\\",\\\"max\\\":180.0,\\\"min\\\":-180.0,\\\"name\\\":\\\"virtual-spectrum-yaw\\\",\\\"step\\\":1.0},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":35.0,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.spectrogram.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"tilt\\\",\\\"read\\\":\\\"number\\\"},\\\"kind\\\":\\\"range\\\",\\\"label\\\":\\\"Spectrum tilt\\\",\\\"max\\\":80.0,\\\"min\\\":5.0,\\\"name\\\":\\\"virtual-spectrum-tilt\\\",\\\"step\\\":1.0},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":1.5,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.spectrogram.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"height\\\",\\\"read\\\":\\\"number\\\"},\\\"kind\\\":\\\"range\\\",\\\"label\\\":\\\"Spectrum height\\\",\\\"max\\\":3.0,\\\"min\\\":0.2,\\\"name\\\":\\\"virtual-spectrum-height\\\",\\\"step\\\":0.1},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":0.3,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.spectrogram.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"opacity\\\",\\\"read\\\":\\\"number\\\"},\\\"kind\\\":\\\"range\\\",\\\"label\\\":\\\"Video mix\\\",\\\"max\\\":0.8,\\\"min\\\":0.0,\\\"name\\\":\\\"virtual-spectrum-opacity\\\",\\\"step\\\":0.01},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.spectrogram.set\\\",\\\"event\\\":\\\"change\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"frozen\\\",\\\"read\\\":\\\"checked\\\"},\\\"label\\\":\\\"Freeze spectrum\\\",\\\"name\\\":\\\"virtual-spectrum-frozen\\\"},\\\"tag\\\":\\\"Checkbox\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.spectrogram.clear\\\",\\\"event\\\":\\\"click\\\"},\\\"id\\\":\\\"virtual-spectrum-clear\\\",\\\"label\\\":\\\"Clear history\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.spectrogram.camera\\\",\\\"event\\\":\\\"click\\\"},\\\"id\\\":\\\"virtual-spectrum-camera\\\",\\\"label\\\":\\\"Use camera\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.spectrogram.video-stop\\\",\\\"event\\\":\\\"click\\\"},\\\"id\\\":\\\"virtual-spectrum-video-stop\\\",\\\"label\\\":\\\"Stop video\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"accept\\\":\\\"video/*\\\",\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.spectrogram.file\\\",\\\"event\\\":\\\"change\\\",\\\"read\\\":\\\"file\\\"},\\\"kind\\\":\\\"file\\\",\\\"label\\\":\\\"Local video\\\",\\\"name\\\":\\\"virtual-spectrum-file\\\"},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"hostOutput\\\":\\\"status\\\",\\\"id\\\":\\\"virtual-spectrum-status\\\",\\\"role\\\":\\\"status\\\",\\\"text\\\":\\\"Frequency left to right · level in height and color · six seconds of measured history in depth.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"hostOutput\\\":\\\"videoStatus\\\",\\\"id\\\":\\\"virtual-spectrum-videoStatus\\\",\\\"role\\\":\\\"status\\\",\\\"text\\\":\\\"Local picture only. Video loops freely; camera stops when this view is hidden. No upload or video audio.\\\"},\\\"tag\\\":\\\"Text\\\"}],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"hostCapability\\\":\\\"virtual.spectrogram\\\",\\\"hostInitial\\\":{\\\"frozen\\\":false,\\\"height\\\":1.5,\\\"opacity\\\":0.3,\\\"tilt\\\":35.0,\\\"yaw\\\":-25.0},\\\"hostLimits\\\":{\\\"height\\\":[0.2,3.0],\\\"opacity\\\":[0.0,0.8],\\\"tilt\\\":[5.0,80.0],\\\"yaw\\\":[-180.0,180.0]},\\\"hostVersion\\\":1,\\\"id\\\":\\\"virtual-spectrum\\\",\\\"title\\\":\\\"Virtual · frequency landscape & video\\\"},\\\"tag\\\":\\\"Card\\\"}\",\"tree\":{\"children\":[{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":-25.0,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.spectrogram.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"yaw\",\"read\":\"number\"},\"kind\":\"range\",\"label\":\"Spectrum orbit\",\"max\":180.0,\"min\":-180.0,\"name\":\"virtual-spectrum-yaw\",\"step\":1.0},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":35.0,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.spectrogram.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"tilt\",\"read\":\"number\"},\"kind\":\"range\",\"label\":\"Spectrum tilt\",\"max\":80.0,\"min\":5.0,\"name\":\"virtual-spectrum-tilt\",\"step\":1.0},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":1.5,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.spectrogram.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"height\",\"read\":\"number\"},\"kind\":\"range\",\"label\":\"Spectrum height\",\"max\":3.0,\"min\":0.2,\"name\":\"virtual-spectrum-height\",\"step\":0.1},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":0.3,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.spectrogram.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"opacity\",\"read\":\"number\"},\"kind\":\"range\",\"label\":\"Video mix\",\"max\":0.8,\"min\":0.0,\"name\":\"virtual-spectrum-opacity\",\"step\":0.01},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.spectrogram.set\",\"event\":\"change\",\"initialize\":true,\"key\":\"frozen\",\"read\":\"checked\"},\"label\":\"Freeze spectrum\",\"name\":\"virtual-spectrum-frozen\"},\"tag\":\"Checkbox\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.spectrogram.clear\",\"event\":\"click\"},\"id\":\"virtual-spectrum-clear\",\"label\":\"Clear history\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.spectrogram.camera\",\"event\":\"click\"},\"id\":\"virtual-spectrum-camera\",\"label\":\"Use camera\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.spectrogram.video-stop\",\"event\":\"click\"},\"id\":\"virtual-spectrum-video-stop\",\"label\":\"Stop video\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"accept\":\"video/*\",\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.spectrogram.file\",\"event\":\"change\",\"read\":\"file\"},\"kind\":\"file\",\"label\":\"Local video\",\"name\":\"virtual-spectrum-file\"},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"hostOutput\":\"status\",\"id\":\"virtual-spectrum-status\",\"role\":\"status\",\"text\":\"Frequency left to right · level in height and color · six seconds of measured history in depth.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"hostOutput\":\"videoStatus\",\"id\":\"virtual-spectrum-videoStatus\",\"role\":\"status\",\"text\":\"Local picture only. Video loops freely; camera stops when this view is hidden. No upload or video audio.\"},\"tag\":\"Text\"}],\"kind\":\"view-node\",\"props\":{\"hostCapability\":\"virtual.spectrogram\",\"hostInitial\":{\"frozen\":false,\"height\":1.5,\"opacity\":0.3,\"tilt\":35.0,\"yaw\":-25.0},\"hostLimits\":{\"height\":[0.2,3.0],\"opacity\":[0.0,0.8],\"tilt\":[5.0,80.0],\"yaw\":[-180.0,180.0]},\"hostVersion\":1,\"id\":\"virtual-spectrum\",\"title\":\"Virtual · frequency landscape & video\"},\"tag\":\"Card\"},\"execution\":{\"portable_ir_schema\":\"cre8.view.ir\",\"portable_ir_tree_hash\":\"611f1135776cbd2dada96963f086ee96b20c59111037a402533c6dd3ee375e85\",\"portable_ir_version\":1,\"producer\":\"rust-ssr\"}}","data-cre8-host-component":"virtual.spectrogram","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"data-spectrum-slot":true,"element":"div","hidden":true},"tag":"Section"}],"kind":"view-node","props":{"data-visual-for":"spectrum","element":"div","hidden":true},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"MIDI & spatial audio"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.110","data-scope":"midi-scan","disabled":false,"label":"Scan MIDI inputs"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"aria-label":"Vector MIDI input","controlKey":"visual-performance-visual.111","data-scope":"midi-port","default":"","disabled":false,"label":"Vector MIDI input","name":"visual-performance-visual-111","options":[{"label":"Scan for a device","value":""}]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.112","data-scope":"midi-connect","disabled":true,"label":"Connect MIDI"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"MIDI controller profile","controlKey":"visual-performance-visual.114","data-scope":"midi-profile","default":"keyboard","disabled":false,"label":"Controller","name":"visual-performance-visual-114","options":[{"label":"Keyboard · notes & bend","value":"keyboard"},{"label":"Theremini · antenna CCs","value":"theremini"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Antenna MIDI channel","controlKey":"visual-performance-visual.117","data-scope":"midi-channel","default":"1","disabled":false,"kind":"number","label":"Channel","max":"16","min":"1","name":"visual-performance-visual-117"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Pitch antenna CC","controlKey":"visual-performance-visual.119","data-scope":"pitch-cc","default":"20","disabled":false,"kind":"number","label":"Pitch CC","max":"119","min":"0","name":"visual-performance-visual-119"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Volume antenna CC","controlKey":"visual-performance-visual.121","data-scope":"volume-cc","default":"2","disabled":false,"kind":"number","label":"Volume CC","max":"119","min":"0","name":"visual-performance-visual-121"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Antenna CC resolution","controlKey":"visual-performance-visual.123","data-scope":"cc-bits","default":"7","disabled":false,"label":"Resolution","name":"visual-performance-visual-123","options":[{"label":"7-bit","value":"7"},{"label":"14-bit CC pairs","value":"14"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Antenna low frequency","controlKey":"visual-performance-visual.125","data-scope":"low-hz","default":"55","disabled":false,"kind":"number","label":"Low Hz","max":"1999","min":"20","name":"visual-performance-visual-125"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Antenna high frequency","controlKey":"visual-performance-visual.127","data-scope":"high-hz","default":"1760","disabled":false,"kind":"number","label":"High Hz","max":"2000","min":"21","name":"visual-performance-visual-127"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Match the instrument’s MIDI CC OUT settings. Default: channel 1, pitch CC20, volume CC2, 7-bit. This plays CRE8’s geometry voice; USB MIDI does not carry the Theremini’s own audio.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-scope-fields","data-theremini-mapping":true,"element":"div","hidden":true},"tag":"Section"},{"children":[],"kind":"view-node","props":{"data-scope":"midi-status","role":"status","text":"Select a controller profile, scan, then connect. Keyboard: notes, bend ±2, CC1 morph and CC74 motion. Theremini: continuous antenna pitch and level.","variant":"output"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.131","data-scope":"spatial","default":false,"disabled":false,"label":"Spatial audio (HRTF)","name":"visual-performance-visual-131"},"tag":"Checkbox"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Instrument azimuth","controlKey":"visual-performance-visual.133","data-scope":"azimuth","default":"0","disabled":false,"kind":"range","label":"Azimuth","max":"180","min":"-180","name":"visual-performance-visual-133"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.135","data-scope":"antenna-space","default":false,"disabled":false,"label":"MIDI pitch moves left ↔ right","name":"visual-performance-visual-135"},"tag":"Checkbox"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Headphones reveal spatial placement. HRTF changes the monitored stereo signal; instrument WAV export stays dry.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-scope-fields","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-scope-midi","data-visual-for":"geometry field","element":"details","hidden":true},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-scope-controls","data-scope":"controls","element":"div","hidden":true},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-visual":"lock","text":"Locked to the transport · stopped","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-visual-lock","variant":"p"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Shader editor"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.shader.effect","event":"change","key":"effect","read":"text"},"hostOutputs":{"options":"effects","value":"effect"},"label":"Shader effect","name":"virtual-shader-effect","options":[{"label":"NEBULA","value":"NEBULA"},{"label":"SPECTRUM TUNNEL","value":"SPECTRUM TUNNEL"},{"label":"LATTICE","value":"LATTICE"},{"label":"WAVEFORM HALO","value":"WAVEFORM HALO"},{"label":"PLASMA","value":"PLASMA"},{"label":"POLAR EQ","value":"POLAR EQ"},{"label":"OSCILLOSCOPE","value":"OSCILLOSCOPE"},{"label":"VORONOI","value":"VORONOI"},{"label":"STARFIELD","value":"STARFIELD"},{"label":"FLOW FIELD","value":"FLOW FIELD"},{"label":"KALEIDO","value":"KALEIDO"},{"label":"METABALLS","value":"METABALLS"},{"label":"CONTOUR BLOOM","value":"CONTOUR BLOOM"},{"label":"AURORA CURTAINS","value":"AURORA CURTAINS"},{"label":"HARMONIC RIBBONS","value":"HARMONIC RIBBONS"},{"label":"CYMATIC PLATE","value":"CYMATIC PLATE"},{"label":"SPECTRAL DUNES","value":"SPECTRAL DUNES"},{"label":"PRISM ORBIT","value":"PRISM ORBIT"},{"label":"CONTOUR KNOT","value":"CONTOUR KNOT"}]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.shader.auto","event":"change","key":"auto","read":"checked"},"hostOutputs":{"checked":"auto"},"label":"Auto-cycle every four bars","name":"virtual-shader-auto"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.shader.projector","event":"click"},"id":"virtual-shader-projector","label":"Send to projector"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.shader.apply","event":"click"},"id":"virtual-shader-apply","label":"Apply effect"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.shader.revert","event":"click"},"id":"virtual-shader-revert","label":"Restore starter effect"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"text":"Effect source · GLSL ES 3.0 · Ctrl / ⌘ Enter applies the effect."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"hostBinding":{"action":"virtual.shader.source","event":"input","key":"source","maxLength":65536,"read":"text"},"hostEditor":true,"hostOutputs":{"errorLine":"errorLine","value":"source"},"hostShortcut":"virtual.shader.apply","html":"<div class=\"ssr-code-editor\" data-ssr-code-editor=\"glsl\">\n<style>.ssr-code-editor{min-width:0}.ssr-code-frame{display:flex;position:relative;overflow:hidden;background:light-dark(#f7fafb,#031013);border:1px solid light-dark(#cae0db,#355a51);border-radius:8px}\n.ssr-code-gutter{position:relative;flex:0 0 42px;overflow:hidden;text-align:right;background:#07191b;color:#70938b;user-select:none}\n.ssr-code-gutter pre{position:absolute;top:0;left:0;width:100%;box-sizing:border-box;padding:14px 8px 14px 0;margin:0;font:12px/21px ui-monospace,monospace;white-space:pre}\n.ssr-code-surface{position:relative;flex:1;min-width:0;overflow:hidden}\n.ssr-code-surface textarea,.ssr-code-surface>pre{box-sizing:border-box;margin:0;padding:14px 12px;border:0;border-radius:0;background:transparent;font:12px/21px ui-monospace,monospace;letter-spacing:normal;tab-size:2;white-space:pre;overflow-wrap:normal}\n.ssr-code-surface textarea{display:block;position:relative;width:100%;min-height:390px;resize:vertical;color:light-dark(#33855d,#d0eddf);caret-color:light-dark(#1f2f27,#e4f7ee);outline-offset:-2px}\n.ssr-code-surface>pre{display:none;position:absolute;top:0;left:0;min-width:100%;pointer-events:none;color:light-dark(#33855d,#d0eddf)}\n.ssr-code-frame.is-enhanced .ssr-code-surface>pre{display:block}\n.ssr-code-frame.is-enhanced textarea{color:transparent;-webkit-text-fill-color:transparent}\n.ssr-code-frame.is-enhanced textarea::selection{background:#bcee8340}\n.ssr-code-footer{display:flex;justify-content:space-between;flex-wrap:wrap;gap:8px;padding:8px 2px;color:light-dark(#57796f,#89aaa0);font:10px/1.5 ui-monospace,monospace}\n.ssr-code-token--keyword{color:light-dark(#63a116,#c2ef8b)}.ssr-code-token--type{color:light-dark(#2c8b7d,#91dcd1)}.ssr-code-token--builtin{color:light-dark(#3112a5,#bfaeff)}.ssr-code-token--number{color:light-dark(#a56012,#f5c187)}.ssr-code-token--comment{color:#789c92}.ssr-code-token--attribute{color:light-dark(#97215b,#edaccc)}.ssr-code-token--string{color:light-dark(#9f6918,#edc589)}\n.ssr-code-frame[data-error=true]{border-color:#f0a28e}.ssr-code-gutter [data-error-line=true]{color:#ffb5a6;background:#522e28}\n@media(max-width:540px){.ssr-code-gutter{flex-basis:32px}.ssr-code-footer{font-size:9px}}\n.ssr-code-navigation,.ssr-code-find{padding:10px 12px;background:light-dark(#f5faf9,#0b1d19);border-top:1px solid light-dark(#d1e3dd,#29453b);font:11px/1.5 system-ui;color:light-dark(#3e5d51,#adcbbf)}\n.ssr-code-navigation{display:flex;flex-wrap:wrap;gap:8px;align-items:center}\n.ssr-code-navigation button,.ssr-code-find button{cursor:pointer;padding:5px 9px;border:1px solid light-dark(#cbdfd8,#36584b);border-radius:6px;background:light-dark(#f1f7f6,#122b24);color:light-dark(#3d7a5a,#d5eadf);font:inherit}\n.ssr-code-navigation button:disabled,.ssr-code-find button:disabled{opacity:.45;cursor:default}\n.ssr-code-navigation input,.ssr-code-query input{box-sizing:border-box;border:1px solid light-dark(#c9dcd5,#3e6153);border-radius:5px;background:light-dark(#f7fbf9,#061410);color:light-dark(#203023,#e4f4e7);padding:5px 7px;font:inherit;min-width:0}\n.ssr-code-navigation input{width:68px}.ssr-code-navigation kbd{font:9px ui-monospace,monospace;color:light-dark(#5d7a6e,#87a498)}\n.ssr-code-navigation [data-code=navigation-status]{font-size:10px;flex-basis:100%;empty-cells:hide}\n.ssr-code-navigation [data-code=navigation-status]:empty{display:none}\n.ssr-code-navigation input[aria-invalid=true]{border-color:#f0a28e}\n.ssr-code-find[hidden]{display:none}.ssr-code-find{display:grid;gap:8px}\n.ssr-code-query{display:flex;align-items:center;gap:8px}.ssr-code-query input{flex:1;width:100%}\n.ssr-code-find-options,.ssr-code-find-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap}\n.ssr-code-find-options label{display:flex;align-items:center;gap:5px}.ssr-code-find-options input{accent-color:#c2ef8b}\n.ssr-code-find-actions [data-code=find-close]{margin-left:auto}.ssr-code-find-actions [data-code=find-count]{font:10px ui-monospace,monospace}\n.ssr-code-match{background:#786a235c}.ssr-code-match-active{background:#8f6a3280;box-shadow:inset 0 -2px #edcc7a}\n.ssr-code-navigation :focus-visible,.ssr-code-find :focus-visible{outline:2px solid #c2ef8b;outline-offset:2px}\n.ssr-code-replace{display:grid;gap:8px;border-top:1px solid light-dark(#d1e3dd,#29453b);padding-top:10px}.ssr-code-replace[hidden]{display:none}\n.ssr-code-replace [data-code=replace-status]{font-size:10px;color:light-dark(#416154,#a8c7ba)}.ssr-code-query>span{flex-shrink:0}\n</style>\n<div class=\"ssr-code-navigation\" role=\"group\" aria-label=\"Code navigation\">\n  <button type=\"button\" data-code=\"find-toggle\" data-code-nav-control aria-expanded=\"false\" aria-controls=\"virtual-shader-source-find\" title=\"Find (Ctrl or Command F); F3 next, Shift F3 previous\" disabled>Find <kbd>⌘/Ctrl F</kbd></button>\n  <label for=\"virtual-shader-source-line\">Line</label><input id=\"virtual-shader-source-line\" data-code=\"goto-line\" data-code-nav-control type=\"number\" min=\"1\" step=\"1\" value=\"1\" aria-describedby=\"virtual-shader-source-navigation-status\" title=\"Go to line (Ctrl or Command G)\" disabled><button type=\"button\" data-code=\"goto-submit\" data-code-nav-control disabled>Go</button>\n  <span id=\"virtual-shader-source-navigation-status\" data-code=\"navigation-status\" role=\"status\" aria-live=\"polite\"></span>\n</div>\n<div id=\"virtual-shader-source-find\" class=\"ssr-code-find\" data-code=\"find-bar\" role=\"search\" aria-label=\"Find in code\" hidden>\n  <label class=\"ssr-code-query\"><span>Find text</span><input data-code=\"find-query\" data-code-nav-control type=\"search\" maxlength=\"1024\" autocomplete=\"off\" spellcheck=\"false\" disabled></label>\n  <div class=\"ssr-code-find-options\"><label><input data-code=\"find-case\" data-code-nav-control type=\"checkbox\" disabled>Match case</label><label><input data-code=\"find-word\" data-code-nav-control type=\"checkbox\" disabled>Whole word</label></div>\n  <div class=\"ssr-code-find-actions\"><button type=\"button\" data-code=\"find-prev\" data-code-nav-control aria-label=\"Previous match\" disabled>↑</button><button type=\"button\" data-code=\"find-next\" data-code-nav-control aria-label=\"Next match\" disabled>↓</button><span data-code=\"find-count\" role=\"status\" aria-live=\"polite\">Type to find</span><button type=\"button\" data-code=\"replace-toggle\" data-code-nav-control aria-expanded=\"false\" aria-controls=\"virtual-shader-source-replace\" disabled>Replace…</button><button type=\"button\" data-code=\"find-close\" data-code-nav-control aria-label=\"Close find\" disabled>Close</button></div>\n  <div id=\"virtual-shader-source-replace\" class=\"ssr-code-replace\" data-code=\"replace-bar\" hidden>\n    <label class=\"ssr-code-query\"><span>Replace with</span><input data-code=\"replace-query\" data-code-nav-control type=\"text\" maxlength=\"65536\" autocomplete=\"off\" spellcheck=\"false\" disabled></label>\n    <div class=\"ssr-code-find-actions\"><button type=\"button\" data-code=\"replace-one\" data-code-nav-control disabled>Replace</button><button type=\"button\" data-code=\"replace-all\" data-code-nav-control disabled>Replace all</button><button type=\"button\" data-code=\"replace-undo\" data-code-nav-control disabled>Undo replacement</button></div>\n    <span data-code=\"replace-status\" role=\"status\" aria-live=\"polite\">Replacement is literal. An empty value deletes matches.</span>\n  </div>\n</div>\n<div class=\"ssr-code-frame\" data-code=\"frame\">\n  <div class=\"ssr-code-gutter\" aria-hidden=\"true\"><pre data-code=\"lines\">1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24</pre></div>\n  <div class=\"ssr-code-surface\"><pre data-code=\"highlight\" aria-hidden=\"true\"></pre><textarea disabled aria-label=\"Code source\" id=\"virtual-shader-source\" data-code=\"source\" rows=\"18\" maxlength=\"65536\" wrap=\"off\" spellcheck=\"false\" autocapitalize=\"off\" autocomplete=\"off\" aria-describedby=\"virtual-shader-help virtual-shader-source-keys\">// Bar-locked rings. Every input below comes from the score you are playing.\nvoid main(){\n  vec2 uv=(gl_FragCoord.xy-.5*uRes)/uRes.y;\n  float r=length(uv);\n\n  // One ring per beat, pushed outward by the transport&#39;s own beat phase.\n  float ring=fract(r*3.0-uBeatPhase);\n  float pulse=smoothstep(.55,.0,abs(ring-.5))*(.25+1.6*uParts.y);\n\n  // The bar advances the hue, so the picture shows its place in the loop.\n  float hue=fract(.55+uBar*.07+uBarPhase*.12+r*.1);\n  vec3 col=hsv(vec3(hue,.7,1.))*pulse;\n\n  // Pads wash the frame; melody and arp sparkle over it.\n  col+=pal(hue+.4)*uParts.z*.35*smoothstep(1.2,.2,r);\n  col+=pal(fract(hue+.6))*pow(fbm(uv*6.+uTime*.3),5.)*6.*uParts.w;\n\n  // A scored hit lands as a flash and a kick of brightness, then decays.\n  col+=uOnset*.5*hsv(vec3(fract(hue+.5),.35,1.))*smoothstep(.9,.0,r);\n  col*=1.+.35*uParts.x*uOnset;\n\n  col*=smoothstep(1.35,.25,r);\n  fragColor=vec4(col,1.);\n}</textarea></div>\n</div>\n<div class=\"ssr-code-footer\"><span data-code=\"cursor\">Ln 1 · Col 1</span><span id=\"virtual-shader-source-keys\">Tab indent · Ctrl/⌘ / comment · Esc then Tab to leave</span></div>\n</div>","id":"virtual-shader-source"},"tag":"RawHtml"},{"children":[],"kind":"view-node","props":{"hostOutput":"status","id":"virtual-shader-status","role":"status","text":"Starting the visualizer…"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"id":"virtual-shader-help","text":"Write a void main() body. The shared prelude provides uniforms and spec(), wav(), hsv(), pal(), rot(), noise(), fbm(), smin(), sdCircle() and sdBox(). A compile error keeps the running picture."},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Shader inputs"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"text":"uBar: Bar number the transport is on, counting from 1; 0 when stopped."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"uBarPhase: 0..1 sawtooth across one bar."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"uBass: Measured low-band energy, 0..1 (smoothed)."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"uBeat: Envelope that pops to 1 on a bass transient and decays."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"uBeatPhase: 0..1 sawtooth across one beat."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"uCentroid: Spectral centroid (brightness), 0..1."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"uLvl: Alias of uRms, kept for the original effects."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"uMid: Measured mid-band energy, 0..1 (smoothed)."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"uOnset: 1 on a scored note or drum hit, decaying to 0."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"uParts: Score energy per part: x drums, y bass, z pads, w melody+arp."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"uRes: Canvas size in pixels (vec2)."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"uRms: Measured waveform level, 0..1 (smoothed)."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"uSpec: Two-row texture: row 0 spectrum, row 1 waveform (use spec()/wav())."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"uTempo: Beats per minute of the running score."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"uTime: Seconds since the visualizer was created."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"uTre: Alias of uTreble, kept for the original effects."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"uTreble: Measured high-band energy, 0..1 (smoothed)."},"tag":"Text"}],"kind":"view-node","props":{"title":"Shader inputs"},"tag":"Card"}],"kind":"view-node","props":{"element":"details"},"tag":"Section"}],"kind":"view-node","props":{"hostCapability":"virtual.shader-studio","hostInitial":{"source":"// Bar-locked rings. Every input below comes from the score you are playing.\nvoid main(){\n  vec2 uv=(gl_FragCoord.xy-.5*uRes)/uRes.y;\n  float r=length(uv);\n\n  // One ring per beat, pushed outward by the transport's own beat phase.\n  float ring=fract(r*3.0-uBeatPhase);\n  float pulse=smoothstep(.55,.0,abs(ring-.5))*(.25+1.6*uParts.y);\n\n  // The bar advances the hue, so the picture shows its place in the loop.\n  float hue=fract(.55+uBar*.07+uBarPhase*.12+r*.1);\n  vec3 col=hsv(vec3(hue,.7,1.))*pulse;\n\n  // Pads wash the frame; melody and arp sparkle over it.\n  col+=pal(hue+.4)*uParts.z*.35*smoothstep(1.2,.2,r);\n  col+=pal(fract(hue+.6))*pow(fbm(uv*6.+uTime*.3),5.)*6.*uParts.w;\n\n  // A scored hit lands as a flash and a kick of brightness, then decays.\n  col+=uOnset*.5*hsv(vec3(fract(hue+.5),.35,1.))*smoothstep(.9,.0,r);\n  col*=1.+.35*uParts.x*uOnset;\n\n  col*=smoothstep(1.35,.25,r);\n  fragColor=vec4(col,1.);\n}"},"hostVersion":1,"title":"Shader studio"},"tag":"Card"}],"kind":"view-node","props":{"data-cre8-host-artifact":"{\"schema\":\"cre8.view.ir\",\"version\":1,\"template_id\":\"virtual.shader-studio\",\"source_hash\":\"13413c2523ce535194beb39f21f54cb9679823b225896ee48133569bdf1420f4\",\"context_hash\":\"e53384975d531088890d0f5c789834494bac395897904a7a42ad86740ed2c09c\",\"tree_hash\":\"bac308dae501619de262ee13e6cadaff96ae9e1d651e358d5cb53e0ada33443f\",\"tree_json\":\"{\\\"children\\\":[{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.shader.effect\\\",\\\"event\\\":\\\"change\\\",\\\"key\\\":\\\"effect\\\",\\\"read\\\":\\\"text\\\"},\\\"hostOutputs\\\":{\\\"options\\\":\\\"effects\\\",\\\"value\\\":\\\"effect\\\"},\\\"label\\\":\\\"Shader effect\\\",\\\"name\\\":\\\"virtual-shader-effect\\\",\\\"options\\\":[{\\\"label\\\":\\\"NEBULA\\\",\\\"value\\\":\\\"NEBULA\\\"},{\\\"label\\\":\\\"SPECTRUM TUNNEL\\\",\\\"value\\\":\\\"SPECTRUM TUNNEL\\\"},{\\\"label\\\":\\\"LATTICE\\\",\\\"value\\\":\\\"LATTICE\\\"},{\\\"label\\\":\\\"WAVEFORM HALO\\\",\\\"value\\\":\\\"WAVEFORM HALO\\\"},{\\\"label\\\":\\\"PLASMA\\\",\\\"value\\\":\\\"PLASMA\\\"},{\\\"label\\\":\\\"POLAR EQ\\\",\\\"value\\\":\\\"POLAR EQ\\\"},{\\\"label\\\":\\\"OSCILLOSCOPE\\\",\\\"value\\\":\\\"OSCILLOSCOPE\\\"},{\\\"label\\\":\\\"VORONOI\\\",\\\"value\\\":\\\"VORONOI\\\"},{\\\"label\\\":\\\"STARFIELD\\\",\\\"value\\\":\\\"STARFIELD\\\"},{\\\"label\\\":\\\"FLOW FIELD\\\",\\\"value\\\":\\\"FLOW FIELD\\\"},{\\\"label\\\":\\\"KALEIDO\\\",\\\"value\\\":\\\"KALEIDO\\\"},{\\\"label\\\":\\\"METABALLS\\\",\\\"value\\\":\\\"METABALLS\\\"},{\\\"label\\\":\\\"CONTOUR BLOOM\\\",\\\"value\\\":\\\"CONTOUR BLOOM\\\"},{\\\"label\\\":\\\"AURORA CURTAINS\\\",\\\"value\\\":\\\"AURORA CURTAINS\\\"},{\\\"label\\\":\\\"HARMONIC RIBBONS\\\",\\\"value\\\":\\\"HARMONIC RIBBONS\\\"},{\\\"label\\\":\\\"CYMATIC PLATE\\\",\\\"value\\\":\\\"CYMATIC PLATE\\\"},{\\\"label\\\":\\\"SPECTRAL DUNES\\\",\\\"value\\\":\\\"SPECTRAL DUNES\\\"},{\\\"label\\\":\\\"PRISM ORBIT\\\",\\\"value\\\":\\\"PRISM ORBIT\\\"},{\\\"label\\\":\\\"CONTOUR KNOT\\\",\\\"value\\\":\\\"CONTOUR KNOT\\\"}]},\\\"tag\\\":\\\"Select\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.shader.auto\\\",\\\"event\\\":\\\"change\\\",\\\"key\\\":\\\"auto\\\",\\\"read\\\":\\\"checked\\\"},\\\"hostOutputs\\\":{\\\"checked\\\":\\\"auto\\\"},\\\"label\\\":\\\"Auto-cycle every four bars\\\",\\\"name\\\":\\\"virtual-shader-auto\\\"},\\\"tag\\\":\\\"Checkbox\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.shader.projector\\\",\\\"event\\\":\\\"click\\\"},\\\"id\\\":\\\"virtual-shader-projector\\\",\\\"label\\\":\\\"Send to projector\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.shader.apply\\\",\\\"event\\\":\\\"click\\\"},\\\"id\\\":\\\"virtual-shader-apply\\\",\\\"label\\\":\\\"Apply effect\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.shader.revert\\\",\\\"event\\\":\\\"click\\\"},\\\"id\\\":\\\"virtual-shader-revert\\\",\\\"label\\\":\\\"Restore starter effect\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"Effect source · GLSL ES 3.0 · Ctrl / ⌘ Enter applies the effect.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.shader.source\\\",\\\"event\\\":\\\"input\\\",\\\"key\\\":\\\"source\\\",\\\"maxLength\\\":65536,\\\"read\\\":\\\"text\\\"},\\\"hostEditor\\\":true,\\\"hostOutputs\\\":{\\\"errorLine\\\":\\\"errorLine\\\",\\\"value\\\":\\\"source\\\"},\\\"hostShortcut\\\":\\\"virtual.shader.apply\\\",\\\"html\\\":\\\"<div class=\\\\\\\"ssr-code-editor\\\\\\\" data-ssr-code-editor=\\\\\\\"glsl\\\\\\\">\\\\n<style>.ssr-code-editor{min-width:0}.ssr-code-frame{display:flex;position:relative;overflow:hidden;background:light-dark(#f7fafb,#031013);border:1px solid light-dark(#cae0db,#355a51);border-radius:8px}\\\\n.ssr-code-gutter{position:relative;flex:0 0 42px;overflow:hidden;text-align:right;background:#07191b;color:#70938b;user-select:none}\\\\n.ssr-code-gutter pre{position:absolute;top:0;left:0;width:100%;box-sizing:border-box;padding:14px 8px 14px 0;margin:0;font:12px/21px ui-monospace,monospace;white-space:pre}\\\\n.ssr-code-surface{position:relative;flex:1;min-width:0;overflow:hidden}\\\\n.ssr-code-surface textarea,.ssr-code-surface>pre{box-sizing:border-box;margin:0;padding:14px 12px;border:0;border-radius:0;background:transparent;font:12px/21px ui-monospace,monospace;letter-spacing:normal;tab-size:2;white-space:pre;overflow-wrap:normal}\\\\n.ssr-code-surface textarea{display:block;position:relative;width:100%;min-height:390px;resize:vertical;color:light-dark(#33855d,#d0eddf);caret-color:light-dark(#1f2f27,#e4f7ee);outline-offset:-2px}\\\\n.ssr-code-surface>pre{display:none;position:absolute;top:0;left:0;min-width:100%;pointer-events:none;color:light-dark(#33855d,#d0eddf)}\\\\n.ssr-code-frame.is-enhanced .ssr-code-surface>pre{display:block}\\\\n.ssr-code-frame.is-enhanced textarea{color:transparent;-webkit-text-fill-color:transparent}\\\\n.ssr-code-frame.is-enhanced textarea::selection{background:#bcee8340}\\\\n.ssr-code-footer{display:flex;justify-content:space-between;flex-wrap:wrap;gap:8px;padding:8px 2px;color:light-dark(#57796f,#89aaa0);font:10px/1.5 ui-monospace,monospace}\\\\n.ssr-code-token--keyword{color:light-dark(#63a116,#c2ef8b)}.ssr-code-token--type{color:light-dark(#2c8b7d,#91dcd1)}.ssr-code-token--builtin{color:light-dark(#3112a5,#bfaeff)}.ssr-code-token--number{color:light-dark(#a56012,#f5c187)}.ssr-code-token--comment{color:#789c92}.ssr-code-token--attribute{color:light-dark(#97215b,#edaccc)}.ssr-code-token--string{color:light-dark(#9f6918,#edc589)}\\\\n.ssr-code-frame[data-error=true]{border-color:#f0a28e}.ssr-code-gutter [data-error-line=true]{color:#ffb5a6;background:#522e28}\\\\n@media(max-width:540px){.ssr-code-gutter{flex-basis:32px}.ssr-code-footer{font-size:9px}}\\\\n.ssr-code-navigation,.ssr-code-find{padding:10px 12px;background:light-dark(#f5faf9,#0b1d19);border-top:1px solid light-dark(#d1e3dd,#29453b);font:11px/1.5 system-ui;color:light-dark(#3e5d51,#adcbbf)}\\\\n.ssr-code-navigation{display:flex;flex-wrap:wrap;gap:8px;align-items:center}\\\\n.ssr-code-navigation button,.ssr-code-find button{cursor:pointer;padding:5px 9px;border:1px solid light-dark(#cbdfd8,#36584b);border-radius:6px;background:light-dark(#f1f7f6,#122b24);color:light-dark(#3d7a5a,#d5eadf);font:inherit}\\\\n.ssr-code-navigation button:disabled,.ssr-code-find button:disabled{opacity:.45;cursor:default}\\\\n.ssr-code-navigation input,.ssr-code-query input{box-sizing:border-box;border:1px solid light-dark(#c9dcd5,#3e6153);border-radius:5px;background:light-dark(#f7fbf9,#061410);color:light-dark(#203023,#e4f4e7);padding:5px 7px;font:inherit;min-width:0}\\\\n.ssr-code-navigation input{width:68px}.ssr-code-navigation kbd{font:9px ui-monospace,monospace;color:light-dark(#5d7a6e,#87a498)}\\\\n.ssr-code-navigation [data-code=navigation-status]{font-size:10px;flex-basis:100%;empty-cells:hide}\\\\n.ssr-code-navigation [data-code=navigation-status]:empty{display:none}\\\\n.ssr-code-navigation input[aria-invalid=true]{border-color:#f0a28e}\\\\n.ssr-code-find[hidden]{display:none}.ssr-code-find{display:grid;gap:8px}\\\\n.ssr-code-query{display:flex;align-items:center;gap:8px}.ssr-code-query input{flex:1;width:100%}\\\\n.ssr-code-find-options,.ssr-code-find-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap}\\\\n.ssr-code-find-options label{display:flex;align-items:center;gap:5px}.ssr-code-find-options input{accent-color:#c2ef8b}\\\\n.ssr-code-find-actions [data-code=find-close]{margin-left:auto}.ssr-code-find-actions [data-code=find-count]{font:10px ui-monospace,monospace}\\\\n.ssr-code-match{background:#786a235c}.ssr-code-match-active{background:#8f6a3280;box-shadow:inset 0 -2px #edcc7a}\\\\n.ssr-code-navigation :focus-visible,.ssr-code-find :focus-visible{outline:2px solid #c2ef8b;outline-offset:2px}\\\\n.ssr-code-replace{display:grid;gap:8px;border-top:1px solid light-dark(#d1e3dd,#29453b);padding-top:10px}.ssr-code-replace[hidden]{display:none}\\\\n.ssr-code-replace [data-code=replace-status]{font-size:10px;color:light-dark(#416154,#a8c7ba)}.ssr-code-query>span{flex-shrink:0}\\\\n</style>\\\\n<div class=\\\\\\\"ssr-code-navigation\\\\\\\" role=\\\\\\\"group\\\\\\\" aria-label=\\\\\\\"Code navigation\\\\\\\">\\\\n  <button type=\\\\\\\"button\\\\\\\" data-code=\\\\\\\"find-toggle\\\\\\\" data-code-nav-control aria-expanded=\\\\\\\"false\\\\\\\" aria-controls=\\\\\\\"virtual-shader-source-find\\\\\\\" title=\\\\\\\"Find (Ctrl or Command F); F3 next, Shift F3 previous\\\\\\\" disabled>Find <kbd>⌘/Ctrl F</kbd></button>\\\\n  <label for=\\\\\\\"virtual-shader-source-line\\\\\\\">Line</label><input id=\\\\\\\"virtual-shader-source-line\\\\\\\" data-code=\\\\\\\"goto-line\\\\\\\" data-code-nav-control type=\\\\\\\"number\\\\\\\" min=\\\\\\\"1\\\\\\\" step=\\\\\\\"1\\\\\\\" value=\\\\\\\"1\\\\\\\" aria-describedby=\\\\\\\"virtual-shader-source-navigation-status\\\\\\\" title=\\\\\\\"Go to line (Ctrl or Command G)\\\\\\\" disabled><button type=\\\\\\\"button\\\\\\\" data-code=\\\\\\\"goto-submit\\\\\\\" data-code-nav-control disabled>Go</button>\\\\n  <span id=\\\\\\\"virtual-shader-source-navigation-status\\\\\\\" data-code=\\\\\\\"navigation-status\\\\\\\" role=\\\\\\\"status\\\\\\\" aria-live=\\\\\\\"polite\\\\\\\"></span>\\\\n</div>\\\\n<div id=\\\\\\\"virtual-shader-source-find\\\\\\\" class=\\\\\\\"ssr-code-find\\\\\\\" data-code=\\\\\\\"find-bar\\\\\\\" role=\\\\\\\"search\\\\\\\" aria-label=\\\\\\\"Find in code\\\\\\\" hidden>\\\\n  <label class=\\\\\\\"ssr-code-query\\\\\\\"><span>Find text</span><input data-code=\\\\\\\"find-query\\\\\\\" data-code-nav-control type=\\\\\\\"search\\\\\\\" maxlength=\\\\\\\"1024\\\\\\\" autocomplete=\\\\\\\"off\\\\\\\" spellcheck=\\\\\\\"false\\\\\\\" disabled></label>\\\\n  <div class=\\\\\\\"ssr-code-find-options\\\\\\\"><label><input data-code=\\\\\\\"find-case\\\\\\\" data-code-nav-control type=\\\\\\\"checkbox\\\\\\\" disabled>Match case</label><label><input data-code=\\\\\\\"find-word\\\\\\\" data-code-nav-control type=\\\\\\\"checkbox\\\\\\\" disabled>Whole word</label></div>\\\\n  <div class=\\\\\\\"ssr-code-find-actions\\\\\\\"><button type=\\\\\\\"button\\\\\\\" data-code=\\\\\\\"find-prev\\\\\\\" data-code-nav-control aria-label=\\\\\\\"Previous match\\\\\\\" disabled>↑</button><button type=\\\\\\\"button\\\\\\\" data-code=\\\\\\\"find-next\\\\\\\" data-code-nav-control aria-label=\\\\\\\"Next match\\\\\\\" disabled>↓</button><span data-code=\\\\\\\"find-count\\\\\\\" role=\\\\\\\"status\\\\\\\" aria-live=\\\\\\\"polite\\\\\\\">Type to find</span><button type=\\\\\\\"button\\\\\\\" data-code=\\\\\\\"replace-toggle\\\\\\\" data-code-nav-control aria-expanded=\\\\\\\"false\\\\\\\" aria-controls=\\\\\\\"virtual-shader-source-replace\\\\\\\" disabled>Replace…</button><button type=\\\\\\\"button\\\\\\\" data-code=\\\\\\\"find-close\\\\\\\" data-code-nav-control aria-label=\\\\\\\"Close find\\\\\\\" disabled>Close</button></div>\\\\n  <div id=\\\\\\\"virtual-shader-source-replace\\\\\\\" class=\\\\\\\"ssr-code-replace\\\\\\\" data-code=\\\\\\\"replace-bar\\\\\\\" hidden>\\\\n    <label class=\\\\\\\"ssr-code-query\\\\\\\"><span>Replace with</span><input data-code=\\\\\\\"replace-query\\\\\\\" data-code-nav-control type=\\\\\\\"text\\\\\\\" maxlength=\\\\\\\"65536\\\\\\\" autocomplete=\\\\\\\"off\\\\\\\" spellcheck=\\\\\\\"false\\\\\\\" disabled></label>\\\\n    <div class=\\\\\\\"ssr-code-find-actions\\\\\\\"><button type=\\\\\\\"button\\\\\\\" data-code=\\\\\\\"replace-one\\\\\\\" data-code-nav-control disabled>Replace</button><button type=\\\\\\\"button\\\\\\\" data-code=\\\\\\\"replace-all\\\\\\\" data-code-nav-control disabled>Replace all</button><button type=\\\\\\\"button\\\\\\\" data-code=\\\\\\\"replace-undo\\\\\\\" data-code-nav-control disabled>Undo replacement</button></div>\\\\n    <span data-code=\\\\\\\"replace-status\\\\\\\" role=\\\\\\\"status\\\\\\\" aria-live=\\\\\\\"polite\\\\\\\">Replacement is literal. An empty value deletes matches.</span>\\\\n  </div>\\\\n</div>\\\\n<div class=\\\\\\\"ssr-code-frame\\\\\\\" data-code=\\\\\\\"frame\\\\\\\">\\\\n  <div class=\\\\\\\"ssr-code-gutter\\\\\\\" aria-hidden=\\\\\\\"true\\\\\\\"><pre data-code=\\\\\\\"lines\\\\\\\">1\\\\n2\\\\n3\\\\n4\\\\n5\\\\n6\\\\n7\\\\n8\\\\n9\\\\n10\\\\n11\\\\n12\\\\n13\\\\n14\\\\n15\\\\n16\\\\n17\\\\n18\\\\n19\\\\n20\\\\n21\\\\n22\\\\n23\\\\n24</pre></div>\\\\n  <div class=\\\\\\\"ssr-code-surface\\\\\\\"><pre data-code=\\\\\\\"highlight\\\\\\\" aria-hidden=\\\\\\\"true\\\\\\\"></pre><textarea disabled aria-label=\\\\\\\"Code source\\\\\\\" id=\\\\\\\"virtual-shader-source\\\\\\\" data-code=\\\\\\\"source\\\\\\\" rows=\\\\\\\"18\\\\\\\" maxlength=\\\\\\\"65536\\\\\\\" wrap=\\\\\\\"off\\\\\\\" spellcheck=\\\\\\\"false\\\\\\\" autocapitalize=\\\\\\\"off\\\\\\\" autocomplete=\\\\\\\"off\\\\\\\" aria-describedby=\\\\\\\"virtual-shader-help virtual-shader-source-keys\\\\\\\">// Bar-locked rings. Every input below comes from the score you are playing.\\\\nvoid main(){\\\\n  vec2 uv=(gl_FragCoord.xy-.5*uRes)/uRes.y;\\\\n  float r=length(uv);\\\\n\\\\n  // One ring per beat, pushed outward by the transport&#39;s own beat phase.\\\\n  float ring=fract(r*3.0-uBeatPhase);\\\\n  float pulse=smoothstep(.55,.0,abs(ring-.5))*(.25+1.6*uParts.y);\\\\n\\\\n  // The bar advances the hue, so the picture shows its place in the loop.\\\\n  float hue=fract(.55+uBar*.07+uBarPhase*.12+r*.1);\\\\n  vec3 col=hsv(vec3(hue,.7,1.))*pulse;\\\\n\\\\n  // Pads wash the frame; melody and arp sparkle over it.\\\\n  col+=pal(hue+.4)*uParts.z*.35*smoothstep(1.2,.2,r);\\\\n  col+=pal(fract(hue+.6))*pow(fbm(uv*6.+uTime*.3),5.)*6.*uParts.w;\\\\n\\\\n  // A scored hit lands as a flash and a kick of brightness, then decays.\\\\n  col+=uOnset*.5*hsv(vec3(fract(hue+.5),.35,1.))*smoothstep(.9,.0,r);\\\\n  col*=1.+.35*uParts.x*uOnset;\\\\n\\\\n  col*=smoothstep(1.35,.25,r);\\\\n  fragColor=vec4(col,1.);\\\\n}</textarea></div>\\\\n</div>\\\\n<div class=\\\\\\\"ssr-code-footer\\\\\\\"><span data-code=\\\\\\\"cursor\\\\\\\">Ln 1 · Col 1</span><span id=\\\\\\\"virtual-shader-source-keys\\\\\\\">Tab indent · Ctrl/⌘ / comment · Esc then Tab to leave</span></div>\\\\n</div>\\\",\\\"id\\\":\\\"virtual-shader-source\\\"},\\\"tag\\\":\\\"RawHtml\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"hostOutput\\\":\\\"status\\\",\\\"id\\\":\\\"virtual-shader-status\\\",\\\"role\\\":\\\"status\\\",\\\"text\\\":\\\"Starting the visualizer…\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"id\\\":\\\"virtual-shader-help\\\",\\\"text\\\":\\\"Write a void main() body. The shared prelude provides uniforms and spec(), wav(), hsv(), pal(), rot(), noise(), fbm(), smin(), sdCircle() and sdBox(). A compile error keeps the running picture.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[{\\\"children\\\":[{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"Shader inputs\\\"},\\\"tag\\\":\\\"Text\\\"}],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"element\\\":\\\"summary\\\"},\\\"tag\\\":\\\"Section\\\"},{\\\"children\\\":[{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"uBar: Bar number the transport is on, counting from 1; 0 when stopped.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"uBarPhase: 0..1 sawtooth across one bar.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"uBass: Measured low-band energy, 0..1 (smoothed).\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"uBeat: Envelope that pops to 1 on a bass transient and decays.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"uBeatPhase: 0..1 sawtooth across one beat.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"uCentroid: Spectral centroid (brightness), 0..1.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"uLvl: Alias of uRms, kept for the original effects.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"uMid: Measured mid-band energy, 0..1 (smoothed).\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"uOnset: 1 on a scored note or drum hit, decaying to 0.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"uParts: Score energy per part: x drums, y bass, z pads, w melody+arp.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"uRes: Canvas size in pixels (vec2).\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"uRms: Measured waveform level, 0..1 (smoothed).\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"uSpec: Two-row texture: row 0 spectrum, row 1 waveform (use spec()/wav()).\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"uTempo: Beats per minute of the running score.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"uTime: Seconds since the visualizer was created.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"uTre: Alias of uTreble, kept for the original effects.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"uTreble: Measured high-band energy, 0..1 (smoothed).\\\"},\\\"tag\\\":\\\"Text\\\"}],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"title\\\":\\\"Shader inputs\\\"},\\\"tag\\\":\\\"Card\\\"}],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"element\\\":\\\"details\\\"},\\\"tag\\\":\\\"Section\\\"}],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"hostCapability\\\":\\\"virtual.shader-studio\\\",\\\"hostInitial\\\":{\\\"source\\\":\\\"// Bar-locked rings. Every input below comes from the score you are playing.\\\\nvoid main(){\\\\n  vec2 uv=(gl_FragCoord.xy-.5*uRes)/uRes.y;\\\\n  float r=length(uv);\\\\n\\\\n  // One ring per beat, pushed outward by the transport's own beat phase.\\\\n  float ring=fract(r*3.0-uBeatPhase);\\\\n  float pulse=smoothstep(.55,.0,abs(ring-.5))*(.25+1.6*uParts.y);\\\\n\\\\n  // The bar advances the hue, so the picture shows its place in the loop.\\\\n  float hue=fract(.55+uBar*.07+uBarPhase*.12+r*.1);\\\\n  vec3 col=hsv(vec3(hue,.7,1.))*pulse;\\\\n\\\\n  // Pads wash the frame; melody and arp sparkle over it.\\\\n  col+=pal(hue+.4)*uParts.z*.35*smoothstep(1.2,.2,r);\\\\n  col+=pal(fract(hue+.6))*pow(fbm(uv*6.+uTime*.3),5.)*6.*uParts.w;\\\\n\\\\n  // A scored hit lands as a flash and a kick of brightness, then decays.\\\\n  col+=uOnset*.5*hsv(vec3(fract(hue+.5),.35,1.))*smoothstep(.9,.0,r);\\\\n  col*=1.+.35*uParts.x*uOnset;\\\\n\\\\n  col*=smoothstep(1.35,.25,r);\\\\n  fragColor=vec4(col,1.);\\\\n}\\\"},\\\"hostVersion\\\":1,\\\"title\\\":\\\"Shader studio\\\"},\\\"tag\\\":\\\"Card\\\"}\",\"tree\":{\"children\":[{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.shader.effect\",\"event\":\"change\",\"key\":\"effect\",\"read\":\"text\"},\"hostOutputs\":{\"options\":\"effects\",\"value\":\"effect\"},\"label\":\"Shader effect\",\"name\":\"virtual-shader-effect\",\"options\":[{\"label\":\"NEBULA\",\"value\":\"NEBULA\"},{\"label\":\"SPECTRUM TUNNEL\",\"value\":\"SPECTRUM TUNNEL\"},{\"label\":\"LATTICE\",\"value\":\"LATTICE\"},{\"label\":\"WAVEFORM HALO\",\"value\":\"WAVEFORM HALO\"},{\"label\":\"PLASMA\",\"value\":\"PLASMA\"},{\"label\":\"POLAR EQ\",\"value\":\"POLAR EQ\"},{\"label\":\"OSCILLOSCOPE\",\"value\":\"OSCILLOSCOPE\"},{\"label\":\"VORONOI\",\"value\":\"VORONOI\"},{\"label\":\"STARFIELD\",\"value\":\"STARFIELD\"},{\"label\":\"FLOW FIELD\",\"value\":\"FLOW FIELD\"},{\"label\":\"KALEIDO\",\"value\":\"KALEIDO\"},{\"label\":\"METABALLS\",\"value\":\"METABALLS\"},{\"label\":\"CONTOUR BLOOM\",\"value\":\"CONTOUR BLOOM\"},{\"label\":\"AURORA CURTAINS\",\"value\":\"AURORA CURTAINS\"},{\"label\":\"HARMONIC RIBBONS\",\"value\":\"HARMONIC RIBBONS\"},{\"label\":\"CYMATIC PLATE\",\"value\":\"CYMATIC PLATE\"},{\"label\":\"SPECTRAL DUNES\",\"value\":\"SPECTRAL DUNES\"},{\"label\":\"PRISM ORBIT\",\"value\":\"PRISM ORBIT\"},{\"label\":\"CONTOUR KNOT\",\"value\":\"CONTOUR KNOT\"}]},\"tag\":\"Select\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.shader.auto\",\"event\":\"change\",\"key\":\"auto\",\"read\":\"checked\"},\"hostOutputs\":{\"checked\":\"auto\"},\"label\":\"Auto-cycle every four bars\",\"name\":\"virtual-shader-auto\"},\"tag\":\"Checkbox\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.shader.projector\",\"event\":\"click\"},\"id\":\"virtual-shader-projector\",\"label\":\"Send to projector\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.shader.apply\",\"event\":\"click\"},\"id\":\"virtual-shader-apply\",\"label\":\"Apply effect\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.shader.revert\",\"event\":\"click\"},\"id\":\"virtual-shader-revert\",\"label\":\"Restore starter effect\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"Effect source · GLSL ES 3.0 · Ctrl / ⌘ Enter applies the effect.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"hostBinding\":{\"action\":\"virtual.shader.source\",\"event\":\"input\",\"key\":\"source\",\"maxLength\":65536,\"read\":\"text\"},\"hostEditor\":true,\"hostOutputs\":{\"errorLine\":\"errorLine\",\"value\":\"source\"},\"hostShortcut\":\"virtual.shader.apply\",\"html\":\"<div class=\\\"ssr-code-editor\\\" data-ssr-code-editor=\\\"glsl\\\">\\n<style>.ssr-code-editor{min-width:0}.ssr-code-frame{display:flex;position:relative;overflow:hidden;background:light-dark(#f7fafb,#031013);border:1px solid light-dark(#cae0db,#355a51);border-radius:8px}\\n.ssr-code-gutter{position:relative;flex:0 0 42px;overflow:hidden;text-align:right;background:#07191b;color:#70938b;user-select:none}\\n.ssr-code-gutter pre{position:absolute;top:0;left:0;width:100%;box-sizing:border-box;padding:14px 8px 14px 0;margin:0;font:12px/21px ui-monospace,monospace;white-space:pre}\\n.ssr-code-surface{position:relative;flex:1;min-width:0;overflow:hidden}\\n.ssr-code-surface textarea,.ssr-code-surface>pre{box-sizing:border-box;margin:0;padding:14px 12px;border:0;border-radius:0;background:transparent;font:12px/21px ui-monospace,monospace;letter-spacing:normal;tab-size:2;white-space:pre;overflow-wrap:normal}\\n.ssr-code-surface textarea{display:block;position:relative;width:100%;min-height:390px;resize:vertical;color:light-dark(#33855d,#d0eddf);caret-color:light-dark(#1f2f27,#e4f7ee);outline-offset:-2px}\\n.ssr-code-surface>pre{display:none;position:absolute;top:0;left:0;min-width:100%;pointer-events:none;color:light-dark(#33855d,#d0eddf)}\\n.ssr-code-frame.is-enhanced .ssr-code-surface>pre{display:block}\\n.ssr-code-frame.is-enhanced textarea{color:transparent;-webkit-text-fill-color:transparent}\\n.ssr-code-frame.is-enhanced textarea::selection{background:#bcee8340}\\n.ssr-code-footer{display:flex;justify-content:space-between;flex-wrap:wrap;gap:8px;padding:8px 2px;color:light-dark(#57796f,#89aaa0);font:10px/1.5 ui-monospace,monospace}\\n.ssr-code-token--keyword{color:light-dark(#63a116,#c2ef8b)}.ssr-code-token--type{color:light-dark(#2c8b7d,#91dcd1)}.ssr-code-token--builtin{color:light-dark(#3112a5,#bfaeff)}.ssr-code-token--number{color:light-dark(#a56012,#f5c187)}.ssr-code-token--comment{color:#789c92}.ssr-code-token--attribute{color:light-dark(#97215b,#edaccc)}.ssr-code-token--string{color:light-dark(#9f6918,#edc589)}\\n.ssr-code-frame[data-error=true]{border-color:#f0a28e}.ssr-code-gutter [data-error-line=true]{color:#ffb5a6;background:#522e28}\\n@media(max-width:540px){.ssr-code-gutter{flex-basis:32px}.ssr-code-footer{font-size:9px}}\\n.ssr-code-navigation,.ssr-code-find{padding:10px 12px;background:light-dark(#f5faf9,#0b1d19);border-top:1px solid light-dark(#d1e3dd,#29453b);font:11px/1.5 system-ui;color:light-dark(#3e5d51,#adcbbf)}\\n.ssr-code-navigation{display:flex;flex-wrap:wrap;gap:8px;align-items:center}\\n.ssr-code-navigation button,.ssr-code-find button{cursor:pointer;padding:5px 9px;border:1px solid light-dark(#cbdfd8,#36584b);border-radius:6px;background:light-dark(#f1f7f6,#122b24);color:light-dark(#3d7a5a,#d5eadf);font:inherit}\\n.ssr-code-navigation button:disabled,.ssr-code-find button:disabled{opacity:.45;cursor:default}\\n.ssr-code-navigation input,.ssr-code-query input{box-sizing:border-box;border:1px solid light-dark(#c9dcd5,#3e6153);border-radius:5px;background:light-dark(#f7fbf9,#061410);color:light-dark(#203023,#e4f4e7);padding:5px 7px;font:inherit;min-width:0}\\n.ssr-code-navigation input{width:68px}.ssr-code-navigation kbd{font:9px ui-monospace,monospace;color:light-dark(#5d7a6e,#87a498)}\\n.ssr-code-navigation [data-code=navigation-status]{font-size:10px;flex-basis:100%;empty-cells:hide}\\n.ssr-code-navigation [data-code=navigation-status]:empty{display:none}\\n.ssr-code-navigation input[aria-invalid=true]{border-color:#f0a28e}\\n.ssr-code-find[hidden]{display:none}.ssr-code-find{display:grid;gap:8px}\\n.ssr-code-query{display:flex;align-items:center;gap:8px}.ssr-code-query input{flex:1;width:100%}\\n.ssr-code-find-options,.ssr-code-find-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap}\\n.ssr-code-find-options label{display:flex;align-items:center;gap:5px}.ssr-code-find-options input{accent-color:#c2ef8b}\\n.ssr-code-find-actions [data-code=find-close]{margin-left:auto}.ssr-code-find-actions [data-code=find-count]{font:10px ui-monospace,monospace}\\n.ssr-code-match{background:#786a235c}.ssr-code-match-active{background:#8f6a3280;box-shadow:inset 0 -2px #edcc7a}\\n.ssr-code-navigation :focus-visible,.ssr-code-find :focus-visible{outline:2px solid #c2ef8b;outline-offset:2px}\\n.ssr-code-replace{display:grid;gap:8px;border-top:1px solid light-dark(#d1e3dd,#29453b);padding-top:10px}.ssr-code-replace[hidden]{display:none}\\n.ssr-code-replace [data-code=replace-status]{font-size:10px;color:light-dark(#416154,#a8c7ba)}.ssr-code-query>span{flex-shrink:0}\\n</style>\\n<div class=\\\"ssr-code-navigation\\\" role=\\\"group\\\" aria-label=\\\"Code navigation\\\">\\n  <button type=\\\"button\\\" data-code=\\\"find-toggle\\\" data-code-nav-control aria-expanded=\\\"false\\\" aria-controls=\\\"virtual-shader-source-find\\\" title=\\\"Find (Ctrl or Command F); F3 next, Shift F3 previous\\\" disabled>Find <kbd>⌘/Ctrl F</kbd></button>\\n  <label for=\\\"virtual-shader-source-line\\\">Line</label><input id=\\\"virtual-shader-source-line\\\" data-code=\\\"goto-line\\\" data-code-nav-control type=\\\"number\\\" min=\\\"1\\\" step=\\\"1\\\" value=\\\"1\\\" aria-describedby=\\\"virtual-shader-source-navigation-status\\\" title=\\\"Go to line (Ctrl or Command G)\\\" disabled><button type=\\\"button\\\" data-code=\\\"goto-submit\\\" data-code-nav-control disabled>Go</button>\\n  <span id=\\\"virtual-shader-source-navigation-status\\\" data-code=\\\"navigation-status\\\" role=\\\"status\\\" aria-live=\\\"polite\\\"></span>\\n</div>\\n<div id=\\\"virtual-shader-source-find\\\" class=\\\"ssr-code-find\\\" data-code=\\\"find-bar\\\" role=\\\"search\\\" aria-label=\\\"Find in code\\\" hidden>\\n  <label class=\\\"ssr-code-query\\\"><span>Find text</span><input data-code=\\\"find-query\\\" data-code-nav-control type=\\\"search\\\" maxlength=\\\"1024\\\" autocomplete=\\\"off\\\" spellcheck=\\\"false\\\" disabled></label>\\n  <div class=\\\"ssr-code-find-options\\\"><label><input data-code=\\\"find-case\\\" data-code-nav-control type=\\\"checkbox\\\" disabled>Match case</label><label><input data-code=\\\"find-word\\\" data-code-nav-control type=\\\"checkbox\\\" disabled>Whole word</label></div>\\n  <div class=\\\"ssr-code-find-actions\\\"><button type=\\\"button\\\" data-code=\\\"find-prev\\\" data-code-nav-control aria-label=\\\"Previous match\\\" disabled>↑</button><button type=\\\"button\\\" data-code=\\\"find-next\\\" data-code-nav-control aria-label=\\\"Next match\\\" disabled>↓</button><span data-code=\\\"find-count\\\" role=\\\"status\\\" aria-live=\\\"polite\\\">Type to find</span><button type=\\\"button\\\" data-code=\\\"replace-toggle\\\" data-code-nav-control aria-expanded=\\\"false\\\" aria-controls=\\\"virtual-shader-source-replace\\\" disabled>Replace…</button><button type=\\\"button\\\" data-code=\\\"find-close\\\" data-code-nav-control aria-label=\\\"Close find\\\" disabled>Close</button></div>\\n  <div id=\\\"virtual-shader-source-replace\\\" class=\\\"ssr-code-replace\\\" data-code=\\\"replace-bar\\\" hidden>\\n    <label class=\\\"ssr-code-query\\\"><span>Replace with</span><input data-code=\\\"replace-query\\\" data-code-nav-control type=\\\"text\\\" maxlength=\\\"65536\\\" autocomplete=\\\"off\\\" spellcheck=\\\"false\\\" disabled></label>\\n    <div class=\\\"ssr-code-find-actions\\\"><button type=\\\"button\\\" data-code=\\\"replace-one\\\" data-code-nav-control disabled>Replace</button><button type=\\\"button\\\" data-code=\\\"replace-all\\\" data-code-nav-control disabled>Replace all</button><button type=\\\"button\\\" data-code=\\\"replace-undo\\\" data-code-nav-control disabled>Undo replacement</button></div>\\n    <span data-code=\\\"replace-status\\\" role=\\\"status\\\" aria-live=\\\"polite\\\">Replacement is literal. An empty value deletes matches.</span>\\n  </div>\\n</div>\\n<div class=\\\"ssr-code-frame\\\" data-code=\\\"frame\\\">\\n  <div class=\\\"ssr-code-gutter\\\" aria-hidden=\\\"true\\\"><pre data-code=\\\"lines\\\">1\\n2\\n3\\n4\\n5\\n6\\n7\\n8\\n9\\n10\\n11\\n12\\n13\\n14\\n15\\n16\\n17\\n18\\n19\\n20\\n21\\n22\\n23\\n24</pre></div>\\n  <div class=\\\"ssr-code-surface\\\"><pre data-code=\\\"highlight\\\" aria-hidden=\\\"true\\\"></pre><textarea disabled aria-label=\\\"Code source\\\" id=\\\"virtual-shader-source\\\" data-code=\\\"source\\\" rows=\\\"18\\\" maxlength=\\\"65536\\\" wrap=\\\"off\\\" spellcheck=\\\"false\\\" autocapitalize=\\\"off\\\" autocomplete=\\\"off\\\" aria-describedby=\\\"virtual-shader-help virtual-shader-source-keys\\\">// Bar-locked rings. Every input below comes from the score you are playing.\\nvoid main(){\\n  vec2 uv=(gl_FragCoord.xy-.5*uRes)/uRes.y;\\n  float r=length(uv);\\n\\n  // One ring per beat, pushed outward by the transport&#39;s own beat phase.\\n  float ring=fract(r*3.0-uBeatPhase);\\n  float pulse=smoothstep(.55,.0,abs(ring-.5))*(.25+1.6*uParts.y);\\n\\n  // The bar advances the hue, so the picture shows its place in the loop.\\n  float hue=fract(.55+uBar*.07+uBarPhase*.12+r*.1);\\n  vec3 col=hsv(vec3(hue,.7,1.))*pulse;\\n\\n  // Pads wash the frame; melody and arp sparkle over it.\\n  col+=pal(hue+.4)*uParts.z*.35*smoothstep(1.2,.2,r);\\n  col+=pal(fract(hue+.6))*pow(fbm(uv*6.+uTime*.3),5.)*6.*uParts.w;\\n\\n  // A scored hit lands as a flash and a kick of brightness, then decays.\\n  col+=uOnset*.5*hsv(vec3(fract(hue+.5),.35,1.))*smoothstep(.9,.0,r);\\n  col*=1.+.35*uParts.x*uOnset;\\n\\n  col*=smoothstep(1.35,.25,r);\\n  fragColor=vec4(col,1.);\\n}</textarea></div>\\n</div>\\n<div class=\\\"ssr-code-footer\\\"><span data-code=\\\"cursor\\\">Ln 1 · Col 1</span><span id=\\\"virtual-shader-source-keys\\\">Tab indent · Ctrl/⌘ / comment · Esc then Tab to leave</span></div>\\n</div>\",\"id\":\"virtual-shader-source\"},\"tag\":\"RawHtml\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"hostOutput\":\"status\",\"id\":\"virtual-shader-status\",\"role\":\"status\",\"text\":\"Starting the visualizer…\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"id\":\"virtual-shader-help\",\"text\":\"Write a void main() body. The shared prelude provides uniforms and spec(), wav(), hsv(), pal(), rot(), noise(), fbm(), smin(), sdCircle() and sdBox(). A compile error keeps the running picture.\"},\"tag\":\"Text\"},{\"children\":[{\"children\":[{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"Shader inputs\"},\"tag\":\"Text\"}],\"kind\":\"view-node\",\"props\":{\"element\":\"summary\"},\"tag\":\"Section\"},{\"children\":[{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"uBar: Bar number the transport is on, counting from 1; 0 when stopped.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"uBarPhase: 0..1 sawtooth across one bar.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"uBass: Measured low-band energy, 0..1 (smoothed).\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"uBeat: Envelope that pops to 1 on a bass transient and decays.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"uBeatPhase: 0..1 sawtooth across one beat.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"uCentroid: Spectral centroid (brightness), 0..1.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"uLvl: Alias of uRms, kept for the original effects.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"uMid: Measured mid-band energy, 0..1 (smoothed).\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"uOnset: 1 on a scored note or drum hit, decaying to 0.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"uParts: Score energy per part: x drums, y bass, z pads, w melody+arp.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"uRes: Canvas size in pixels (vec2).\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"uRms: Measured waveform level, 0..1 (smoothed).\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"uSpec: Two-row texture: row 0 spectrum, row 1 waveform (use spec()/wav()).\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"uTempo: Beats per minute of the running score.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"uTime: Seconds since the visualizer was created.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"uTre: Alias of uTreble, kept for the original effects.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"uTreble: Measured high-band energy, 0..1 (smoothed).\"},\"tag\":\"Text\"}],\"kind\":\"view-node\",\"props\":{\"title\":\"Shader inputs\"},\"tag\":\"Card\"}],\"kind\":\"view-node\",\"props\":{\"element\":\"details\"},\"tag\":\"Section\"}],\"kind\":\"view-node\",\"props\":{\"hostCapability\":\"virtual.shader-studio\",\"hostInitial\":{\"source\":\"// Bar-locked rings. Every input below comes from the score you are playing.\\nvoid main(){\\n  vec2 uv=(gl_FragCoord.xy-.5*uRes)/uRes.y;\\n  float r=length(uv);\\n\\n  // One ring per beat, pushed outward by the transport's own beat phase.\\n  float ring=fract(r*3.0-uBeatPhase);\\n  float pulse=smoothstep(.55,.0,abs(ring-.5))*(.25+1.6*uParts.y);\\n\\n  // The bar advances the hue, so the picture shows its place in the loop.\\n  float hue=fract(.55+uBar*.07+uBarPhase*.12+r*.1);\\n  vec3 col=hsv(vec3(hue,.7,1.))*pulse;\\n\\n  // Pads wash the frame; melody and arp sparkle over it.\\n  col+=pal(hue+.4)*uParts.z*.35*smoothstep(1.2,.2,r);\\n  col+=pal(fract(hue+.6))*pow(fbm(uv*6.+uTime*.3),5.)*6.*uParts.w;\\n\\n  // A scored hit lands as a flash and a kick of brightness, then decays.\\n  col+=uOnset*.5*hsv(vec3(fract(hue+.5),.35,1.))*smoothstep(.9,.0,r);\\n  col*=1.+.35*uParts.x*uOnset;\\n\\n  col*=smoothstep(1.35,.25,r);\\n  fragColor=vec4(col,1.);\\n}\"},\"hostVersion\":1,\"title\":\"Shader studio\"},\"tag\":\"Card\"},\"execution\":{\"portable_ir_schema\":\"cre8.view.ir\",\"portable_ir_tree_hash\":\"bac308dae501619de262ee13e6cadaff96ae9e1d651e358d5cb53e0ada33443f\",\"portable_ir_version\":1,\"producer\":\"rust-ssr\"}}","data-cre8-host-component":"virtual.shader-studio","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-shader-editor","data-visual-for":"shader trace","element":"details"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"className":"ls-workspace-description","data-visual-description":true,"text":"Create a shader picture driven by the audio. Edit effects below the canvas.","variant":"p"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"id":"scope-wav-help","text":"Instrument sample · 2 seconds · stereo WAV · current instrument settings · dry audio.","variant":"p"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"data-visual-shader-only":true,"text":"The picture reads the take that is playing: measured audio through the analyser, and the score's own bars, beats, per-part energy and note onsets. Prepare and start a score to see both.","variant":"p"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Capture uses the longest bright outline in the center square. Link live follows that outline; blank frames keep the last valid path. Stop ends the link and audio."},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-visual-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"aria-label":"Visuals","className":"ls-visual","data-field-default":null,"data-virtual-performance":"1","data-visual-desk":true,"element":"section"},"tag":"Section"}],"kind":"view-node","props":{"className":"media-fragment","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"live-score.30","data-ls-tab":"code","disabled":false,"label":"Live code","pressed":true},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"live-score.31","data-ls-tab":"session","disabled":false,"label":"DAW session","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"live-score.32","data-ls":"focus","disabled":false,"id":"ls-focus-editor","label":"Focus editor","pressed":false},"tag":"Action"}],"kind":"view-node","props":{"aria-label":"Music editor","element":"nav"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-controls":"ls-edit-menu-items","aria-haspopup":"menu","aria-label":"More draft actions","controlKey":"live-score.34","data-ssr-menu-open":"ls-edit-menu","disabled":false,"id":"ls-draft-more","label":"⋯"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"data-ls":"draft-state","text":"Unprepared draft","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"controlKey":"live-score.36","data-ls":"revert","disabled":true,"id":"ls-revert-draft","label":"Restore prepared take"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"live-score.37","data-ls":"undo","disabled":true,"id":"ls-undo-draft","label":"Undo draft edit"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-draft-bar","data-ssr-context-menu":"ls-edit-menu","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Score "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"CRE8 SCORE","variant":"span"},"tag":"Text"}],"kind":"view-node","props":{"element":"label","for":"live-score-source"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"data-ls":"lines","text":"1","variant":"pre"},"tag":"Text"}],"kind":"view-node","props":{"aria-hidden":"true","className":"ls-gutter","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-hidden":"true","data-ls":"highlight","text":"","variant":"pre"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"aria-label":"Score CRE8 SCORE","autocapitalize":"off","controlKey":"live-score.46","data-ls":"source","default":"// Change a note, then apply on the next bar.\ntempo 96\nbars 2\ninstrument bass saw_bass\ninstrument melody bell\nlevel bass 0.7\nlevel melody 0.55\nlevel drums 0.8\nlevel reverb 0.3\n\ndrum kick 0 0.9\ndrum kick 2 0.85\ndrum kick 4 0.9\ndrum kick 6 0.85\ndrum snare 1 0.65\ndrum snare 3 0.65\ndrum snare 5 0.65\ndrum snare 7 0.65\ndrum hat 0.5 0.3\ndrum hat 2.5 0.3\ndrum hat 4.5 0.3\ndrum hat 6.5 0.3\n\nnote bass C2 0 0.75 0.8\nnote bass C2 1.5 0.4 0.6\nnote bass G2 2 0.75 0.7\nnote bass A#1 4 0.75 0.8\nnote bass G2 6 0.75 0.7\nnote melody D#4 0.5 0.5 0.65\nnote melody G4 2.5 0.5 0.65\nnote melody A#4 4.5 0.5 0.65\nnote melody G4 6.5 0.5 0.65\n","disabled":false,"id":"live-score-source","kind":"textarea","label":"Score CRE8 SCORE","maxlength":16384,"name":"live-score-source","rows":17,"spellcheck":false,"wrap":"off"},"tag":"Input"}],"kind":"view-node","props":{"className":"ls-editor-surface","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-editor-frame","data-ls":"editor","data-ssr-context-menu":"ls-edit-menu","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-ls":"cursor","text":"Ln 1 · Col 1","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Tab indent · Ctrl / ⌘ / comment · Ctrl / ⌘ Enter apply · Esc then Tab to leave","variant":"span"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-editor-footer","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"live-score.52","data-ls":"preset","default":"starter","disabled":false,"label":"Sound sketch","name":"live-score-52","options":[{"label":"Orbit groove","value":"starter"},{"label":"Pulse engine","value":"pulse"},{"label":"Drift","value":"drift"},{"label":"Composer remix","value":"composer"},{"label":"Night Signal · full session","value":"showcase"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"live-score.53","data-ls":"preset-load","disabled":false,"label":"Load sketch"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Prepared takes","controlKey":"live-score.55","data-ls":"takes","default":"","disabled":false,"label":"Prepared takes","name":"live-score-55","options":[{"label":"No takes yet","value":""}]},"tag":"Select"}],"kind":"view-node","props":{"className":"ls-takes","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"live-score.56","data-ls":"take-load","disabled":true,"label":"Recall take"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-preset-row","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"live-score.59","data-ls":"style","default":"house","disabled":false,"label":"Compose","name":"live-score-59","options":[{"label":"house","value":"house"},{"label":"chill","value":"chill"},{"label":"cosmic","value":"cosmic"},{"label":"lofi","value":"lofi"},{"label":"trance","value":"trance"},{"label":"pop","value":"pop"},{"label":"cinematic","value":"cinematic"},{"label":"tribal","value":"tribal"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"live-score.61","data-ls":"seed","default":"7","disabled":false,"kind":"number","label":"Seed","max":"999999","min":"0","name":"live-score-61"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"live-score.62","data-ls":"compose","disabled":false,"label":"Write composer draft"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-compose","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"data-ls-pane":"code","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"live-score.65","data-ls":"session","default":"","disabled":false,"kind":"textarea","label":"DAW session JSON","name":"live-score-65","placeholder":"Prepare your score to edit its session…","rows":15,"spellcheck":false,"wrap":"off"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Edit tempo, lane gains, mutes and instruments. The score source travels with this session.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"data-ls-pane":"session","element":"div","hidden":true},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Arrangement","variant":"strong"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"data-ls":"arrangement-state","text":"Prepare a score to see its notes","variant":"span"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Arrangement zoom","controlKey":"live-score.73","data-daw-zoom":true,"default":"1","disabled":false,"kind":"range","label":"Zoom","max":"3","min":"1","name":"live-score-73","step":"0.25"},"tag":"Input"},{"children":[],"kind":"view-node","props":{"data-daw-zoom-label":true,"text":"100%","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-daw-only ls-timeline-zoom","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"text":"Your compiled drums and note lanes appear here.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"aria-label":"Prepared note lanes; scroll sideways on narrow screens","data-ls":"arrangement","element":"div","role":"region","tabIndex":0},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"arrangement-controls.4","data-arrange":"lane","default":"bass","disabled":false,"label":"Channel","name":"arrangement-controls-4","options":[{"label":"bass","value":"bass"},{"label":"pads","value":"pads"},{"label":"melody","value":"melody"},{"label":"arp","value":"arp"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"arrangement-controls.6","data-arrange":"beat","default":"0","disabled":false,"kind":"number","label":"Beat","max":"16","min":"0","name":"arrangement-controls-6","step":".25"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"arrangement-controls.7","data-arrange":"move","disabled":false,"label":"Move phrase"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"arrangement-controls.8","data-arrange":"duplicate","disabled":false,"label":"Duplicate phrase"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"data-arrange":"status","role":"status","text":"Select a phrase or drag it between channels. Prepare applies each draft.","variant":"span"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-arrange-controls","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"media-fragment","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"aria-label":"Compiled arrangement","className":"ls-arrangement","element":"section"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-code","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Mixer","variant":"h3"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Faders edit the draft. Apply mix to update the prepared song.","variant":"p"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"live-score.81","data-ls":"tempo","default":"96","disabled":false,"kind":"number","label":"Tempo BPM","max":"180","min":"60","name":"live-score-81"},"tag":"Input"}],"kind":"view-node","props":{"className":"ls-tempo","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Drag Drums channel","data-channel-drag":"true","label":"⠿"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"aria-label":"Move Drums earlier","data-channel-move":"up","label":"←"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"aria-label":"Move Drums later","data-channel-move":"down","label":"→"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-channel-order","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"mixer-handle","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"html":"<div class=\"mixer-header\"><span class=\"mixer-number\">01</span><span class=\"mixer-name\">Drums</span><span class=\"mixer-layout\" title=\"L R\">stereo</span></div>"},"tag":"RawHtml"},{"children":[{"children":[],"kind":"view-node","props":{"text":"Drum synth"},"tag":"Text"}],"kind":"view-node","props":{"className":"mixer-slot","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Mute Drums","data-ls-mute":"drums","data-mixer-button":"mute","disabled":true,"label":"M","pressed":false},"tag":"Action"}],"kind":"view-node","props":{"className":"mixer-buttons","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"html":"<ol class=\"mixer-scale\" aria-hidden=\"true\"><li style=\"--at:1.0000\">0</li><li style=\"--at:0.7079\">-3</li><li style=\"--at:0.5012\">-6</li><li style=\"--at:0.2512\">-12</li><li style=\"--at:0.1000\">-20</li><li style=\"--at:0.0000\">-∞</li></ol>"},"tag":"RawHtml"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Drums","data-ls-lane":"drums","default":"0.8","id":"ls-gain-drums","kind":"range","max":"1","min":"0","name":"gain-drums","step":"0.01"},"tag":"Input"}],"kind":"view-node","props":{"className":"mixer-fader","data-mixer-fader":true,"element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"mixer-fader-bay","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-ls-gain-label":"drums","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"className":"mixer-readout","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"aria-label":"Drums","className":"mixer-strip ls-lane-row","data-ls-channel":"drums","data-mixer-role":"channel","data-mixer-strip":"drums","element":"div","role":"group"},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Drag Bass channel","data-channel-drag":"true","label":"⠿"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"aria-label":"Move Bass earlier","data-channel-move":"up","label":"←"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"aria-label":"Move Bass later","data-channel-move":"down","label":"→"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-channel-order","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"mixer-handle","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"html":"<div class=\"mixer-header\"><span class=\"mixer-number\">02</span><span class=\"mixer-name\">Bass</span><span class=\"mixer-layout\" title=\"L R\">stereo</span></div>"},"tag":"RawHtml"},{"children":[{"children":[],"kind":"view-node","props":{"data-ls-instrument":"bass","default":"saw_bass","disabled":true,"label":"Bass instrument","name":"instrument-bass","options":[{"label":"Saw bass","value":"saw_bass"},{"label":"Warm pad","value":"warm_pad"},{"label":"Bell","value":"bell"},{"label":"Bright lead","value":"bright_lead"}]},"tag":"Select"}],"kind":"view-node","props":{"className":"mixer-slot","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Mute Bass","data-ls-mute":"bass","data-mixer-button":"mute","disabled":true,"label":"M","pressed":false},"tag":"Action"}],"kind":"view-node","props":{"className":"mixer-buttons","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"html":"<ol class=\"mixer-scale\" aria-hidden=\"true\"><li style=\"--at:1.0000\">0</li><li style=\"--at:0.7079\">-3</li><li style=\"--at:0.5012\">-6</li><li style=\"--at:0.2512\">-12</li><li style=\"--at:0.1000\">-20</li><li style=\"--at:0.0000\">-∞</li></ol>"},"tag":"RawHtml"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Bass","data-ls-lane":"bass","default":"0.7","id":"ls-gain-bass","kind":"range","max":"1","min":"0","name":"gain-bass","step":"0.01"},"tag":"Input"}],"kind":"view-node","props":{"className":"mixer-fader","data-mixer-fader":true,"element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"mixer-fader-bay","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-ls-gain-label":"bass","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"className":"mixer-readout","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"aria-label":"Bass","className":"mixer-strip ls-lane-row","data-ls-channel":"bass","data-mixer-role":"channel","data-mixer-strip":"bass","element":"div","role":"group"},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Drag Pads channel","data-channel-drag":"true","label":"⠿"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"aria-label":"Move Pads earlier","data-channel-move":"up","label":"←"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"aria-label":"Move Pads later","data-channel-move":"down","label":"→"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-channel-order","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"mixer-handle","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"html":"<div class=\"mixer-header\"><span class=\"mixer-number\">03</span><span class=\"mixer-name\">Pads</span><span class=\"mixer-layout\" title=\"L R\">stereo</span></div>"},"tag":"RawHtml"},{"children":[{"children":[],"kind":"view-node","props":{"data-ls-instrument":"pads","default":"warm_pad","disabled":true,"label":"Pads instrument","name":"instrument-pads","options":[{"label":"Saw bass","value":"saw_bass"},{"label":"Warm pad","value":"warm_pad"},{"label":"Bell","value":"bell"},{"label":"Bright lead","value":"bright_lead"}]},"tag":"Select"}],"kind":"view-node","props":{"className":"mixer-slot","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Mute Pads","data-ls-mute":"pads","data-mixer-button":"mute","disabled":true,"label":"M","pressed":false},"tag":"Action"}],"kind":"view-node","props":{"className":"mixer-buttons","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"html":"<ol class=\"mixer-scale\" aria-hidden=\"true\"><li style=\"--at:1.0000\">0</li><li style=\"--at:0.7079\">-3</li><li style=\"--at:0.5012\">-6</li><li style=\"--at:0.2512\">-12</li><li style=\"--at:0.1000\">-20</li><li style=\"--at:0.0000\">-∞</li></ol>"},"tag":"RawHtml"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Pads","data-ls-lane":"pads","default":"0.8","id":"ls-gain-pads","kind":"range","max":"1","min":"0","name":"gain-pads","step":"0.01"},"tag":"Input"}],"kind":"view-node","props":{"className":"mixer-fader","data-mixer-fader":true,"element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"mixer-fader-bay","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-ls-gain-label":"pads","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"className":"mixer-readout","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"aria-label":"Pads","className":"mixer-strip ls-lane-row","data-ls-channel":"pads","data-mixer-role":"channel","data-mixer-strip":"pads","element":"div","role":"group"},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Drag Melody channel","data-channel-drag":"true","label":"⠿"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"aria-label":"Move Melody earlier","data-channel-move":"up","label":"←"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"aria-label":"Move Melody later","data-channel-move":"down","label":"→"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-channel-order","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"mixer-handle","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"html":"<div class=\"mixer-header\"><span class=\"mixer-number\">04</span><span class=\"mixer-name\">Melody</span><span class=\"mixer-layout\" title=\"L R\">stereo</span></div>"},"tag":"RawHtml"},{"children":[{"children":[],"kind":"view-node","props":{"data-ls-instrument":"melody","default":"bright_lead","disabled":true,"label":"Melody instrument","name":"instrument-melody","options":[{"label":"Saw bass","value":"saw_bass"},{"label":"Warm pad","value":"warm_pad"},{"label":"Bell","value":"bell"},{"label":"Bright lead","value":"bright_lead"}]},"tag":"Select"}],"kind":"view-node","props":{"className":"mixer-slot","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Mute Melody","data-ls-mute":"melody","data-mixer-button":"mute","disabled":true,"label":"M","pressed":false},"tag":"Action"}],"kind":"view-node","props":{"className":"mixer-buttons","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"html":"<ol class=\"mixer-scale\" aria-hidden=\"true\"><li style=\"--at:1.0000\">0</li><li style=\"--at:0.7079\">-3</li><li style=\"--at:0.5012\">-6</li><li style=\"--at:0.2512\">-12</li><li style=\"--at:0.1000\">-20</li><li style=\"--at:0.0000\">-∞</li></ol>"},"tag":"RawHtml"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Melody","data-ls-lane":"melody","default":"0.55","id":"ls-gain-melody","kind":"range","max":"1","min":"0","name":"gain-melody","step":"0.01"},"tag":"Input"}],"kind":"view-node","props":{"className":"mixer-fader","data-mixer-fader":true,"element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"mixer-fader-bay","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-ls-gain-label":"melody","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"className":"mixer-readout","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"aria-label":"Melody","className":"mixer-strip ls-lane-row","data-ls-channel":"melody","data-mixer-role":"channel","data-mixer-strip":"melody","element":"div","role":"group"},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Drag Arp channel","data-channel-drag":"true","label":"⠿"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"aria-label":"Move Arp earlier","data-channel-move":"up","label":"←"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"aria-label":"Move Arp later","data-channel-move":"down","label":"→"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-channel-order","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"mixer-handle","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"html":"<div class=\"mixer-header\"><span class=\"mixer-number\">05</span><span class=\"mixer-name\">Arp</span><span class=\"mixer-layout\" title=\"L R\">stereo</span></div>"},"tag":"RawHtml"},{"children":[{"children":[],"kind":"view-node","props":{"data-ls-instrument":"arp","default":"bell","disabled":true,"label":"Arp instrument","name":"instrument-arp","options":[{"label":"Saw bass","value":"saw_bass"},{"label":"Warm pad","value":"warm_pad"},{"label":"Bell","value":"bell"},{"label":"Bright lead","value":"bright_lead"}]},"tag":"Select"}],"kind":"view-node","props":{"className":"mixer-slot","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Mute Arp","data-ls-mute":"arp","data-mixer-button":"mute","disabled":true,"label":"M","pressed":false},"tag":"Action"}],"kind":"view-node","props":{"className":"mixer-buttons","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"html":"<ol class=\"mixer-scale\" aria-hidden=\"true\"><li style=\"--at:1.0000\">0</li><li style=\"--at:0.7079\">-3</li><li style=\"--at:0.5012\">-6</li><li style=\"--at:0.2512\">-12</li><li style=\"--at:0.1000\">-20</li><li style=\"--at:0.0000\">-∞</li></ol>"},"tag":"RawHtml"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Arp","data-ls-lane":"arp","default":"0.8","id":"ls-gain-arp","kind":"range","max":"1","min":"0","name":"gain-arp","step":"0.01"},"tag":"Input"}],"kind":"view-node","props":{"className":"mixer-fader","data-mixer-fader":true,"element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"mixer-fader-bay","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-ls-gain-label":"arp","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"className":"mixer-readout","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"aria-label":"Arp","className":"mixer-strip ls-lane-row","data-ls-channel":"arp","data-mixer-role":"channel","data-mixer-strip":"arp","element":"div","role":"group"},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Drag Space channel","data-channel-drag":"true","label":"⠿"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"aria-label":"Move Space earlier","data-channel-move":"up","label":"←"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"aria-label":"Move Space later","data-channel-move":"down","label":"→"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-channel-order","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"mixer-handle","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"html":"<div class=\"mixer-header\"><span class=\"mixer-number\">06</span><span class=\"mixer-name\">Space</span><span class=\"mixer-layout\" title=\"L R\">stereo</span></div>"},"tag":"RawHtml"},{"children":[{"children":[],"kind":"view-node","props":{"text":"Reverb return"},"tag":"Text"}],"kind":"view-node","props":{"className":"mixer-slot","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Mute Space","data-ls-mute":"reverb","data-mixer-button":"mute","disabled":true,"label":"M","pressed":false},"tag":"Action"}],"kind":"view-node","props":{"className":"mixer-buttons","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"html":"<ol class=\"mixer-scale\" aria-hidden=\"true\"><li style=\"--at:1.0000\">0</li><li style=\"--at:0.7079\">-3</li><li style=\"--at:0.5012\">-6</li><li style=\"--at:0.2512\">-12</li><li style=\"--at:0.1000\">-20</li><li style=\"--at:0.0000\">-∞</li></ol>"},"tag":"RawHtml"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Space","data-ls-lane":"reverb","default":"0.3","id":"ls-gain-reverb","kind":"range","max":"1","min":"0","name":"gain-reverb","step":"0.01"},"tag":"Input"}],"kind":"view-node","props":{"className":"mixer-fader","data-mixer-fader":true,"element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"mixer-fader-bay","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-ls-gain-label":"reverb","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"className":"mixer-readout","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"aria-label":"Space","className":"mixer-strip ls-lane-row","data-ls-channel":"reverb","data-mixer-role":"bus","data-mixer-strip":"reverb","element":"div","role":"group"},"tag":"Section"}],"kind":"view-node","props":{"className":"media-fragment"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-lanes","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"live-score.83","data-ls":"mix","disabled":true,"label":"Apply mix"},"tag":"Action"}],"kind":"view-node","props":{"aria-label":"Channel strips","className":"ls-channel-rack","element":"section"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Play a MIDI phrase"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Turn your controller into score code. The first note starts a phrase using this score’s tempo and bars, independent of loop playback.","variant":"p"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"live-score.88","data-score-midi":"scan","disabled":true,"label":"Scan inputs"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"live-score.89","data-ls-nav":true,"href":"/view/device/midi","label":"Device ↗"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-midi-controls","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"live-score.91","data-score-midi":"ports","default":"","disabled":true,"label":"Input","name":"live-score-91","options":[]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"live-score.93","data-score-midi":"channel","default":"0","disabled":false,"label":"Receive","name":"live-score-93","options":[{"label":"All channels","value":"0"},{"label":"Keyboard · channel 1","value":"1"},{"label":"Pads · channel 10","value":"10"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"live-score.95","data-score-midi":"record","disabled":true,"label":"Record phrase"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"live-score.96","data-score-midi":"stop","disabled":true,"label":"Stop recording"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-midi-controls","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"aria-live":"polite","data-score-midi":"status","role":"status","text":"Connecting MIDI controls…","variant":"p"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"aria-label":"Recorded score phrase","data-score-midi":"preview","text":"Your recorded notes will appear here.","variant":"pre"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"controlKey":"live-score.99","data-score-midi":"insert","disabled":true,"label":"Insert into score"},"tag":"Action"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"1/16-note grid · up to 128 notes · review before inserting. Notes go to Melody; channel 10 maps 36 kick, 38 snare, 42 hat, 46 open hat. Other pads are skipped. Pressure, sustain and CC are not recorded. Prepare score to hear the result; live monitoring is off.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-quiet-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-midi","data-ls-midi":true,"element":"details","id":"live-score-midi","open":true},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Score language"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Beats start at 0. Loops are 1–4 bars at 60–180 BPM.","variant":"p"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"tempo 96\nbars 2\ncompose house 7\nclear bass\ninstrument bass saw_bass\nnote bass C2 0 0.75 0.8\ndrum kick 0 0.9\nlevel reverb 0.3","variant":"pre"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Note: part, pitch, beat, duration, velocity. Parts: bass, pads, melody, arp. Drums: kick, snare, hat, open_hat.","variant":"p"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"text":"Song-wide: "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"kit <name>","variant":"code"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":" · "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"swing 0..0.3","variant":"code"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":" · "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"root C4","variant":"code"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":" · "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"scale dorian","variant":"code"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"."},"tag":"Text"}],"kind":"view-node","props":{"variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"element":"details"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Pattern playground"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"pattern kick X...x... 0 8 0.8\nsequence bass C2,-,G2,- 0 8 0.75 0.7","variant":"pre"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"text":"Pattern: voice, steps, start, span, velocity. "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"x","variant":"code"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":" hit · "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"X","variant":"code"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":" full accent · "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":".","variant":"code"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":" rest."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"html":"<br>"},"tag":"RawHtml"},{"children":[],"kind":"view-node","props":{"text":"Sequence: part, comma-separated notes, start, span, gate, velocity. "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"-","variant":"code"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":" is a rest. Gate is the fraction of each step held, from 0.01 to 1."},"tag":"Text"}],"kind":"view-node","props":{"variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"element":"details","open":true},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Mixing console"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"text":"Targets: bass, pads, melody, arp, drums, master. Up to four "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"fx","variant":"code"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":" per target, appended in order; "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"fx <target> clear","variant":"code"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":" drops them."},"tag":"Text"}],"kind":"view-node","props":{"variant":"p"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"text":"Automate "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"gain","variant":"code"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":", "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"pan","variant":"code"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":", "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"send.reverb","variant":"code"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":", "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"send.delay","variant":"code"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":" or "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"fx.<n>.<param>","variant":"code"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":" (1-based, declared first): one line per breakpoint, at most 64 per parameter and 256 per score."},"tag":"Text"}],"kind":"view-node","props":{"variant":"p"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"text":"Every parameter is validated against the plugin catalog at "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"/audio/plugins","variant":"code"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":". A score naming none of these renders exactly as before."},"tag":"Text"}],"kind":"view-node","props":{"variant":"p"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"pan arp -0.5\nsend melody reverb 0.35\nsend arp delay 0.4\nfx bass filter mode=low_pass cutoff_hz=900\nautomation bass gain 0 0.2\nautomation bass gain 8 1\nreverb preset=plate mix=0.4\ndelay time=1/8. feedback=0.45 pingpong=1\nmaster glue=1 ceiling=0.9","variant":"pre"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-quiet-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"element":"details"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"className":"ls-clock-boundary","text":"Audio uses its own sample clock. On the Virtual stage, DAW energy can drive shader level and tempo; beat phases remain independent.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"aria-label":"Loop mixer","className":"ls-mix","element":"aside"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-columns","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"aria-label":"Live music desk","className":"ls-desk","data-cre8-binding":"audio.liveScore","data-daw-contract":"1","data-daw-mixer":"true","data-daw-render":"audio.daw.render","data-daw-view":"tracks","data-editor-chrome":"audio","data-live-score":true,"data-workspace":"daw","element":"section","id":"live-music-desk"},"tag":"Section"}],"kind":"view-node","props":{"className":"media-fragment","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Render tools"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"endpoint":"/audio/song","fields":[{"kind":"select","label":"Style","name":"style","options":[{"label":"Chill","value":"chill"},{"label":"House","value":"house"},{"label":"Pop","value":"pop"},{"label":"Cosmic","value":"cosmic"},{"label":"Lofi","value":"lofi"},{"label":"Trance","value":"trance"},{"label":"Cinematic","value":"cinematic"},{"label":"Tribal","value":"tribal"}]},{"default":16,"kind":"number","label":"Bars","name":"bars"},{"default":96,"kind":"number","label":"Tempo (BPM)","name":"tempo_bpm"},{"default":0.0,"kind":"number","label":"Swing (0-0.35)","name":"swing"},{"default":7,"kind":"number","label":"Seed","name":"seed"},{"kind":"checkbox","label":"Export MIDI","name":"include_midi"},{"default":false,"kind":"hidden","name":"include_wav"}],"method":"POST","submitLabel":"Compose","timeoutMs":30000,"title":"Generate song"},"tag":"Form"}],"kind":"view-node","props":{"id":"song","label":"Song"},"tag":"Tab"},{"children":[{"children":[],"kind":"view-node","props":{"endpoint":"/audio/graph","fields":[{"kind":"textarea","label":"Session JSON","name":"audio_session","placeholder":"{ \"lanes\": [], \"transport\": { \"bpm\": 96 } }"}],"method":"POST","submitLabel":"Compile","timeoutMs":10000,"title":"Compile audio graph"},"tag":"Form"}],"kind":"view-node","props":{"id":"graph","label":"Graph"},"tag":"Tab"},{"children":[{"children":[],"kind":"view-node","props":{"endpoint":"/audio/scene","fields":[{"default":"focus_wonder","kind":"text","label":"Preset","name":"preset"},{"default":8,"kind":"number","label":"Duration","name":"duration_secs"},{"default":44100,"kind":"number","label":"Sample rate","name":"sample_rate"}],"method":"POST","submitLabel":"Render","timeoutMs":10000,"title":"Render scene"},"tag":"Form"}],"kind":"view-node","props":{"id":"scene","label":"Scene"},"tag":"Tab"},{"children":[{"children":[],"kind":"view-node","props":{"endpoint":"/audio/schema","fields":[{"default":"summary","kind":"text","label":"Kind","name":"kind"}],"method":"GET","submitLabel":"Inspect","title":"Inspect schema"},"tag":"Form"}],"kind":"view-node","props":{"id":"schema","label":"Schema"},"tag":"Tab"}],"kind":"view-node","props":{"defaultTab":"song"},"tag":"Tabs"}],"kind":"view-node","props":{"aria-label":"Render tools","className":"ls-render-tools","element":"details","id":"audio-render-tools"},"tag":"Section"},{"children":[{"children":[{"children":["Checking view availability…"],"kind":"view-node","props":{},"tag":"Text"}],"kind":"view-node","props":{"aria-label":"View availability","class":"primitive-live-payload","id":"payload-live-content-audio-audio-mixer"},"tag":"Section"}],"kind":"view-node","props":{"id":"payload-live-audio-audio-mixer","patchTarget":"#payload-live-content-audio-audio-mixer","pollIntervalMs":8000,"refreshHref":"/view/payload/patch?app=Audio&view=audio.mixer","streamUrl":"/view/payload/patch?app=Audio&view=audio.mixer","transport":"http","transportStatus":false},"tag":"LiveSlot"}],"data":{"children":[{"children":[{"children":[],"kind":"view-node","props":{"html":"<style>.ls-desk{margin:28px 0;padding:24px;background:#08191d;color:#e4f7ee;border:1px solid #294442;border-radius:20px;font:14px/1.5 system-ui,sans-serif}.ls-desk *{box-sizing:border-box}.ls-desk header{display:flex;justify-content:space-between;align-items:center;gap:18px}.ls-eyebrow{font-size:11px;letter-spacing:.15em;color:#a5dd89}.ls-desk h2{font-size:30px;line-height:1.2;margin:10px 0}.ls-desk h3{margin:0 0 8px}.ls-desk p{color:var(--daw-muted,#9bb6b4)}.ls-desk a{color:#b8e696}.ls-desk button,.ls-desk select,.ls-desk input[type=number]{color:inherit;background:#142c2e;border:1px solid #3c5c55;border-radius:8px;padding:9px 12px;font:inherit}.ls-desk button{cursor:pointer}.ls-desk button:disabled{opacity:.45;cursor:default}.ls-desk button:focus-visible,.ls-desk input:focus-visible,.ls-desk textarea:focus-visible{outline:2px solid var(--daw-accent,#c4ef83);outline-offset:3px}.ls-desk [data-ls=apply],.ls-desk [data-ls=start]{background:var(--editor-accent,#c4ef83);color:var(--editor-accent-ink,#142819);font-weight:650}.ls-transport{display:flex;align-items:center;gap:12px;margin:18px 0;padding:12px;background:#102426;border-radius:12px;flex-wrap:wrap}.ls-transport output{font-variant-numeric:tabular-nums}.ls-meter{width:72px;height:6px;background:var(--daw-border-strong,#294442);border-radius:4px;overflow:hidden}.ls-meter i{display:block;height:100%;width:0;background:var(--daw-accent,#c4ef83)}.ls-columns{display:grid;grid-template-columns:minmax(0,1.8fr) minmax(250px,1fr);gap:24px}.ls-code,.ls-mix{min-width:0}.ls-code nav{display:flex;gap:8px;margin-bottom:14px}.ls-code nav [aria-pressed=true]{border-color:#c4ef83;color:#c4ef83}.ls-desk label{display:block}.ls-code label>span{float:right;font-size:11px;color:var(--daw-muted,#779d99)}.ls-desk textarea{display:block;width:100%;resize:vertical;min-height:260px;background:var(--daw-well,#031013);color:var(--daw-ink,#d0eddf);border:1px solid var(--daw-border,#284542);border-radius:10px;padding:15px;margin-top:8px;font:13px/1.6 ui-monospace,monospace;tab-size:2}.ls-compose,.ls-actions{display:flex;flex-wrap:wrap;align-items:end;gap:10px;margin:12px 0}.ls-compose input{width:85px}.ls-compose select{display:block}.ls-desk pre{white-space:pre-wrap;overflow-wrap:anywhere;font:12px/1.6 ui-monospace,monospace}.ls-desk [data-ls=status]{min-height:40px;color:var(--daw-soft,#c4ef83)}.ls-desk [data-ls=status][data-error=true]{color:#ffb4a6}.ls-desk kbd{font-size:10px;opacity:.65;margin-left:10px}.ls-lanes{margin:20px 0}.ls-lanes label{display:grid;grid-template-columns:58px minmax(50px,1fr) 40px;gap:8px;align-items:center;margin:16px 0}.ls-lanes input{width:100%;accent-color:var(--daw-accent,#b6e77f)}.ls-lanes output{text-align:right;font-size:12px}.ls-tempo input{width:85px}.ls-desk details{margin-top:24px}.ls-desk summary{cursor:pointer}.ls-clock-boundary{font-size:12px;margin-top:24px}.ls-desk [hidden]{display:none!important}.ls-desk [data-cre8-island]{min-height:0!important}@media(max-width:720px){.ls-desk{padding:16px}.ls-columns{grid-template-columns:1fr}.ls-desk header{align-items:start;flex-direction:column}.ls-transport output{flex-basis:100%}.ls-desk h2{font-size:26px}}\n\n/* Editor metrics are shared so the projection stays aligned with native text selection. */\n.ls-desk{scroll-margin-top:18px}.ls-desk [data-ls=focus]{margin-left:auto}.ls-draft-bar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:8px 0 14px;color:var(--daw-soft,#b6dba0);font-size:12px}.ls-draft-bar button{padding:4px 8px;font-size:11px;background:transparent}.ls-desk[data-dirty=true] [data-ls=draft-state]{color:#f5bb7c}.ls-editor-frame{display:flex;border:1px solid var(--daw-border-strong,#355a51);border-radius:10px;overflow:hidden;background:var(--daw-well,#031013);margin-top:8px;position:relative}.ls-gutter{flex:0 0 42px;background:var(--daw-panel,#07191b);color:var(--daw-faint,#547d76);text-align:right;overflow:hidden;user-select:none}.ls-desk .ls-gutter pre{margin:0;padding:15px 9px 15px 0;white-space:pre;font:13px/21px ui-monospace,monospace}.ls-editor-surface{position:relative;min-width:0;flex:1;overflow:hidden}.ls-desk .ls-editor-surface textarea,.ls-desk .ls-editor-surface>pre{margin:0;padding:15px 12px;border:0;border-radius:0;background:transparent;font:13px/21px ui-monospace,monospace;tab-size:2;white-space:pre;overflow-wrap:normal;letter-spacing:normal}.ls-desk .ls-editor-surface textarea{display:block;position:relative;width:100%;min-height:365px;resize:vertical;caret-color:var(--daw-ink,#e4f7ee);outline-offset:-2px}.ls-desk .ls-editor-surface>pre{position:absolute;top:0;left:0;min-width:100%;pointer-events:none;display:none;color:var(--daw-ink,#cce4dc)}.ls-editor-frame.is-enhanced .ls-editor-surface>pre{display:block}.ls-desk .ls-editor-frame.is-enhanced textarea{color:transparent;-webkit-text-fill-color:transparent}.ls-desk .ls-editor-frame.is-enhanced textarea::selection{background:color-mix(in srgb,var(--daw-accent,#bcee83) 25%,transparent)}.ls-token-command{color:#bcee83;font-weight:600}.ls-token-comment{color:#607f7d}.ls-token-note{color:#b9acff}.ls-token-number{color:#f1bd81}.ls-token-pattern{color:#80ddd3}.ls-editor-footer{display:flex;justify-content:space-between;gap:10px;color:var(--daw-muted,#789994);font:10px/1.5 ui-monospace,monospace;padding:8px 1px}.ls-editor-frame[data-error=true]{border-color:#f0a28e}.ls-gutter [data-error-line=true]{color:#ffb5a6;background:#522e28}.ls-preset-row{display:flex;flex-wrap:wrap;gap:8px;align-items:end;padding:12px 0;border-bottom:1px solid var(--daw-border,#24423e)}.ls-preset-row label{font-size:11px;color:var(--daw-muted,#8aada5)}.ls-preset-row select{display:block;margin-top:5px;max-width:180px}.ls-preset-row button{font-size:12px}.ls-live-badge{margin-left:auto;color:var(--daw-soft,#b6da9b);font:10px/1.5 ui-monospace,monospace;letter-spacing:.08em}.ls-arrangement{border:1px solid var(--daw-border-strong,#294641);border-radius:10px;overflow:hidden;margin-top:18px}.ls-arrangement>div:first-child{display:flex;justify-content:space-between;gap:8px;padding:10px 12px;font-size:11px;background:var(--daw-control,#0b2224)}.ls-arrangement span{color:var(--daw-soft,#a0b8ad)}.ls-arrangement svg{display:block;width:100%;height:auto;font-family:system-ui}.ls-arrangement p{padding:12px;font-size:12px}.ls-desk[data-focus=true] .ls-mix{display:none}.ls-desk[data-focus=true] .ls-columns{grid-template-columns:minmax(0,1fr)}.ls-desk [data-ls=error-line]{color:#ffb5a6;border-color:#a76658;padding:5px 10px;font-size:12px}.ls-desk [data-busy=true]{opacity:.6}\n@media(max-width:720px){.ls-editor-footer{flex-wrap:wrap}.ls-live-badge{margin-left:0}.ls-draft-bar{gap:7px}.ls-desk [data-ls=focus]{display:none}.ls-preset-row select{max-width:160px}.ls-desk .ls-editor-surface textarea,.ls-desk .ls-editor-surface>pre,.ls-desk .ls-gutter pre{font-size:12px}.ls-gutter{flex-basis:32px}.ls-arrangement>div:first-child{flex-direction:column}.ls-desk[data-focus=true] .ls-mix{display:block}}\n.ls-arrangement [data-ls=arrangement]{overflow-x:auto}.ls-arrangement svg{min-width:640px}.ls-token-comment{color:#769690}\n.ls-project-bar{display:flex;align-items:center;flex-wrap:wrap;gap:8px 14px;padding:12px 0;margin:12px 0;border-top:1px solid var(--daw-border,#294442);border-bottom:1px solid var(--daw-border,#294442);font-size:11px;color:var(--daw-muted,#89aaa1)}.ls-project-bar [data-ls=saved-state]{color:var(--daw-soft,#b6dba0);margin-right:auto}.ls-project-bar button{font-size:11px;padding:6px 10px}.ls-project-bar>span:last-child{flex-basis:100%}.ls-lanes{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.ls-lane-row{min-width:0;padding:12px;background:var(--daw-panel,#0b2224);border:1px solid var(--daw-border,#294442);border-radius:10px}.ls-lane-heading{display:flex;align-items:center;gap:8px}.ls-lane-heading label{display:block;margin:0;font-size:12px}.ls-lane-heading output{margin-left:auto;color:var(--daw-soft,#b6dba0)}.ls-lane-heading button{padding:3px 7px;font:11px ui-monospace,monospace}.ls-lane-row input{margin:16px 0;display:block}.ls-lane-row select{display:block;width:100%;min-width:0;padding:6px;font-size:11px}.ls-lane-row>span{display:block;font-size:11px;color:var(--daw-muted,#89aaa1);padding:7px 0}.ls-lane-row[data-muted=true]{border-color:#986547}.ls-lane-row[data-muted=true] [data-ls-mute]{background:#f0b97e;color:#251a14;border-color:#f0b97e}.ls-lane-row[data-muted=true] input{opacity:.55}.ls-desk select:focus-visible{outline:2px solid var(--daw-accent,#c4ef83);outline-offset:3px}.ls-desk[data-workspace=daw]{margin-top:0}.ls-desk[data-workspace=daw] h2{font-size:36px}.ls-desk[data-workspace=daw] .ls-eyebrow{color:var(--daw-muted)}@media(max-width:720px){.ls-desk[data-workspace=daw] h2{font-size:27px}.ls-project-bar [data-ls=saved-state]{flex-basis:100%}.ls-lane-row{padding:10px}.ls-lane-heading{gap:5px}}\n.ls-menu-bar{display:flex;align-items:center;gap:4px;padding:4px 0 10px;margin-bottom:10px;border-bottom:1px solid var(--daw-border,#2b453b);position:relative;z-index:5;flex-wrap:wrap}.ls-menu-bar>span{margin-left:auto;font:10px system-ui;color:var(--daw-muted,#8fac9e)}.ls-desk button[hidden]{display:none!important}@media(max-width:540px){.ls-menu-bar>span{width:100%;margin:4px 10px 0}}\n/* Gutter lines follow the textarea viewport without determining its height. */\n.ls-gutter{position:relative}.ls-desk .ls-gutter pre{position:absolute;top:0;left:0;width:100%;box-sizing:border-box}\n.ls-midi { margin-top: 1rem; }\n.ls-desk .ls-daw-only { display: none; }\n.ls-midi label { display: grid; gap: .4rem; margin: .65rem 0; }\n.ls-midi select { width: 100%; min-width: 0; }\n.ls-midi-controls { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; }\n.ls-midi [data-score-midi=\"preview\"] { max-height: 12rem; overflow: auto; white-space: pre; font-size: .75rem; }\n.ls-midi [data-score-midi=\"status\"] { overflow-wrap: anywhere; }\n\n/* Interactive phrases belong to the DAW; Performance keeps the score overview. */\n.ls-track-timeline{display:none}\n/* The portable session component occupies the shared transport row. */\n.ls-transport [data-cre8-host-component=\"audio.session\"]{flex:1 1 100%;min-width:0}\n.ls-transport #audio-session-transport{margin:0;padding:0;border:0;background:transparent;box-shadow:none}\n.ls-transport #audio-session-transport .primitive-card__body{display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:0}\n.ls-transport #ls-export-wav,.ls-transport #ls-export-midi,.ls-transport #ls-export-session{display:none}\n.ls-transport #ls-export-state{flex:1 1 240px;margin:0;font-size:12px;color:inherit}\n.ls-desk>header nav{display:flex;flex-wrap:wrap;gap:12px}\n.ls-transport-feedback{flex:1 1 100%;min-width:0}\n.ls-desk .ls-transport-feedback [data-ls=status]{margin:0;min-height:0;font:12px/1.5 system-ui,sans-serif;white-space:pre-wrap;color:#b4c8c2}\n.ls-desk .ls-transport-feedback [data-ls=status][data-error=true]{padding:8px 10px;border-left:3px solid #ffb4a6;background:#ffb4a60c;color:#ffb4a6}\n.ls-desk #ls-prepare,.ls-desk #ls-start:not(:disabled){background:var(--editor-accent,#c4ef83);color:var(--editor-accent-ink,#142819);border-color:var(--editor-accent,#c4ef83);font-weight:650}\n\n/* Preserve app layout around native document primitives. */\n.media-fragment { display:contents; }\n.ls-desk .primitive-input,.ls-desk .primitive-select { display:contents; }\n.ls-desk .primitive-input__label,.ls-desk .primitive-select__label { font:inherit; }\n/* The code label is two spans: only the language tag floats right. */\n.ls-code label>span:first-child:not(:only-child){float:none;font-size:inherit;color:inherit}\n/* The textarea's own label repeats the visible one above the editor; it stays for assistive tech. */\n.ls-editor-surface .primitive-input__label{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}\n\n/* Notation editor, drafts and status in the Song studio read on the shell palette in light and dark; the live score page keeps its own. */\n.ls-desk[data-workspace=daw] [data-ls=status][data-error=true],.ls-desk[data-workspace=daw] [data-ls=error-line],.ls-desk[data-workspace=daw] .ls-gutter [data-error-line=true]{color:var(--cre8-view-danger)}\n.ls-desk[data-workspace=daw] .ls-gutter [data-error-line=true]{background:color-mix(in srgb,var(--cre8-view-danger) 14%,var(--daw-panel))}\n.ls-desk[data-workspace=daw] .ls-editor-frame[data-error=true],.ls-desk[data-workspace=daw] [data-ls=error-line]{border-color:var(--cre8-view-danger)}\n.ls-desk[data-workspace=daw][data-dirty=true] [data-ls=draft-state]{color:light-dark(#8a4b00,#f5bb7c)}\n.ls-desk[data-workspace=daw] .ls-token-command{color:light-dark(#3d6b10,#bcee83)}\n.ls-desk[data-workspace=daw] .ls-token-comment{color:var(--daw-muted)}\n.ls-desk[data-workspace=daw] .ls-token-note{color:light-dark(#5b45b8,#b9acff)}\n.ls-desk[data-workspace=daw] .ls-token-number{color:light-dark(#9a5a00,#f1bd81)}\n.ls-desk[data-workspace=daw] .ls-token-pattern{color:light-dark(#0b6b62,#80ddd3)}\n/* Shared mixer console. Tokens resolve from an ancestor's --mixer-* override,\n   then the editor chrome's --editor-*, then light-dark() defaults. Live values\n   (--level, --peak, aria-pressed, data-clipped) are set by the app's script. */\n.mixer-console,.mixer-strip{\n  --_surface:var(--mixer-surface,var(--editor-raised,light-dark(#ffffff,#1f2724)));\n  --_well:var(--mixer-well,var(--editor-surface,light-dark(#edf1ee,#141a18)));\n  --_ink:var(--mixer-ink,var(--editor-ink,light-dark(#182620,#edf3ee)));\n  --_muted:var(--mixer-muted,var(--editor-muted,light-dark(#536259,#a6b5ab)));\n  --_border:var(--mixer-border,var(--editor-border,light-dark(#cbd5ce,#3b4941)));\n  --_accent:var(--mixer-accent,var(--editor-accent,light-dark(#246640,#b8f568)));\n  --_ok:var(--mixer-ok,light-dark(#2f9e5b,#5fd38a));\n  --_warn:var(--mixer-warn,light-dark(#b98f10,#f2d25c));\n  --_hot:var(--mixer-hot,light-dark(#c8453a,#ff6b5e));\n  --_mute:var(--mixer-mute,light-dark(#b7791f,#f0b44c));\n  --_solo:var(--mixer-solo,light-dark(#2b72ad,#79c3ff));\n  --_arm:var(--mixer-arm,light-dark(#c8453a,#ff6b5e));\n  --_latch:var(--mixer-latch,light-dark(#7453b8,#b69cff));\n  --_fader-height:var(--mixer-fader-height,150px);\n}\n.mixer-console{\n  display:flex;gap:6px;align-items:stretch;overflow-x:auto;padding:6px;\n  background:var(--_well);border:1px solid var(--_border);border-radius:8px;\n}\n.mixer-strip{\n  box-sizing:border-box;display:flex;flex-direction:column;align-items:stretch;gap:6px;\n  flex:0 0 auto;min-width:84px;margin:0;padding:8px 6px;\n  border:1px solid var(--_border);border-radius:6px;background:var(--_surface);color:var(--_ink);\n  font:11px/1.3 system-ui,sans-serif;\n}\n.mixer-strip *{box-sizing:border-box}\n/* Controls arrive as base-theme primitives: drop the form-field chrome a\n   slider or a strip button should not carry. */\n.mixer-strip .primitive-input,.mixer-strip .primitive-select{margin:0;gap:2px;min-width:0}\n.mixer-strip input[type=range]{padding:0;border:0;border-radius:0;background:none;box-shadow:none;min-width:0}\n.mixer-strip[data-mixer-role=bus]{border-top:3px solid var(--_solo)}\n.mixer-strip[data-mixer-role=master]{\n  border-top:3px solid var(--_accent);position:sticky;right:0;margin-left:auto;\n  /* The solid shadow covers the console's padding, where strips scrolling\n     under the pinned master would otherwise peek out. */\n  box-shadow:7px 0 0 var(--_well),-8px 0 8px -8px rgb(0 0 0/.4);\n}\n.mixer-header{display:flex;flex-wrap:wrap;align-items:baseline;gap:2px 5px;min-width:0}\n.mixer-number{color:var(--_muted);font-variant-numeric:tabular-nums}\n.mixer-name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600}\n.mixer-layout{flex:0 0 auto;padding:0 5px;border:1px solid var(--_border);border-radius:999px;color:var(--_muted);font-size:10px;line-height:15px}\n.mixer-handle{display:flex;justify-content:center;gap:2px}\n.mixer-slot :is(select,button,input){width:100%;max-width:100%;font-size:11px}\n/* Routing, the insert chain, sends, badges and the automation mode sit in\n   signal order under the name, one dense row or card each. They take the\n   strip's width rather than setting it, so a long effect or bus name\n   ellipsizes instead of widening its strip. */\n:is(.mixer-route,.mixer-inserts,.mixer-sends,.mixer-assign,.mixer-automation){contain:inline-size;min-width:0}\n:is(.mixer-route,.mixer-automation,.mixer-send) :is(select,input){width:100%;max-width:100%;font-size:11px}\n.mixer-strip :is(.mixer-route,.mixer-automation,.mixer-send) :is(.primitive-select__label,.primitive-input__label){font-size:10px;font-weight:600;color:var(--_muted)}\n:is(.mixer-route,.mixer-automation) select{min-height:20px;padding:1px 3px;border:1px solid var(--_border);border-radius:3px;background:var(--_well);color:var(--_ink)}\n.mixer-inserts,.mixer-sends{display:flex;flex-direction:column;gap:2px}\n.mixer-insert{\n  display:flex;align-items:center;gap:3px;min-height:20px;padding:1px 2px 1px 6px;\n  border:1px solid var(--_border);border-radius:3px;background:var(--_well);box-shadow:inset 3px 0 0 var(--_accent);\n}\n.mixer-insert-name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.mixer-insert>:not(.mixer-insert-name){flex:0 0 auto;margin:0}\n.mixer-insert :is(button,.primitive-action){\n  min-width:22px;min-height:18px;margin:0;padding:1px 4px;border:1px solid var(--_border);border-radius:3px;\n  background:var(--_surface);color:var(--_ink);font:600 10px/1 system-ui,sans-serif;cursor:pointer;\n}\n.mixer-insert :is(button,.primitive-action)[aria-pressed=true]{border-color:var(--_accent);color:var(--_accent)}\n.mixer-insert[data-bypassed=true]{box-shadow:none;border-style:dashed}\n.mixer-insert[data-bypassed=true] .mixer-insert-name{color:var(--_muted);text-decoration:line-through}\n.mixer-send{display:flex;flex-direction:column;gap:2px;padding:2px 4px 3px;border:1px solid var(--_border);border-radius:3px;background:var(--_well)}\n.mixer-send-head{display:flex;align-items:center;gap:4px}\n.mixer-send-bus{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.mixer-send-tap{flex:0 0 auto;padding:0 4px;border:1px solid var(--_border);border-radius:999px;color:var(--_muted);font-size:9px;line-height:13px;text-transform:uppercase;letter-spacing:.04em}\n.mixer-send[data-mixer-tap=pre] .mixer-send-tap{border-color:var(--_warn);color:var(--_ink)}\n.mixer-send input[type=range]{display:block;width:100%;margin:0;accent-color:var(--_solo)}\n.mixer-assign{display:flex;flex-wrap:wrap;gap:3px}\n.mixer-badge{\n  max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:0 5px;\n  border:1px solid var(--_border);border-left-width:3px;border-radius:3px;font-size:10px;line-height:15px;\n}\n.mixer-badge[data-mixer-badge=group]{border-left-color:var(--_accent)}\n.mixer-badge[data-mixer-badge=vca]{border-left-color:var(--_solo)}\n.mixer-badge-kind{color:var(--_muted);font-size:9px;text-transform:uppercase;letter-spacing:.04em}\n/* The automation select is tinted by the option it has selected, so the\n   colour is the control's own state: read, touch, latch or write. */\n.mixer-automation select{border-left:3px solid var(--_auto,var(--_border))}\n.mixer-automation:has(option[value=read]:checked){--_auto:var(--_ok)}\n.mixer-automation:has(option[value=touch]:checked){--_auto:var(--_warn)}\n.mixer-automation:has(option[value=latch]:checked){--_auto:var(--_latch)}\n.mixer-automation:has(option[value=write]:checked){--_auto:var(--_hot)}\n.mixer-pan{position:relative;padding:0 2px}\n.mixer-pan input[type=range]{display:block;width:100%;margin:0;accent-color:var(--_accent)}\n.mixer-pan::after{content:\"\";position:absolute;left:50%;top:2px;bottom:2px;border-left:1px dashed var(--_border);pointer-events:none}\n.mixer-buttons{display:flex;justify-content:center;gap:4px}\n.mixer-strip .mixer-buttons>*{\n  min-width:26px;min-height:24px;margin:0;padding:2px 6px;border:1px solid var(--_border);border-radius:4px;\n  background:var(--_well);color:var(--_ink);font:600 11px/1 system-ui,sans-serif;cursor:pointer;\n}\n.mixer-strip .mixer-buttons>:hover:not(:disabled){border-color:var(--_accent)}\n.mixer-strip .mixer-buttons>:disabled{opacity:.45;cursor:default}\n.mixer-strip .mixer-buttons>[data-mixer-button=mute][aria-pressed=true]{background:var(--_mute);border-color:var(--_mute);color:#141414}\n.mixer-strip .mixer-buttons>[data-mixer-button=solo][aria-pressed=true]{background:var(--_solo);border-color:var(--_solo);color:#0e1a24}\n.mixer-strip .mixer-buttons>[data-mixer-button=arm][aria-pressed=true]{background:var(--_arm);border-color:var(--_arm);color:#fff}\n/* Bays sit at the foot of the strip so faders line up across a console\n   whatever slots each strip carries above them. */\n.mixer-fader-bay{display:flex;justify-content:center;align-items:stretch;gap:4px;height:var(--_fader-height);margin-top:auto}\n/* Marks follow the thumb's centre, which travels 8px in from each end. */\n.mixer-scale{position:relative;width:22px;margin:0;padding:0;list-style:none;color:var(--_muted);font:9px/1 system-ui,sans-serif;font-variant-numeric:tabular-nums}\n.mixer-scale li{position:absolute;right:0;bottom:calc(8px + var(--at,0)*(100% - 16px));transform:translateY(50%);white-space:nowrap}\n.mixer-fader,.mixer-fader>.primitive-input{display:flex;justify-content:center;height:100%}\n.mixer-fader input[type=range]{writing-mode:vertical-lr;direction:rtl;width:24px;height:100%;margin:0;accent-color:var(--_accent)}\n.mixer-meter{display:flex;gap:1px;height:100%;padding:1px;background:var(--_well);border:1px solid var(--_border);border-radius:2px}\n/* The gradient is painted at full height and the unlit part covered, so a\n   bar's colour always reads its absolute level (bands at -18 and -6 dB). */\n.mixer-meter-bar{\n  position:relative;flex:0 0 5px;height:100%;overflow:hidden;\n  background:linear-gradient(to top,var(--_ok) 0 70%,var(--_warn) 70% 90%,var(--_hot) 90%);\n}\n.mixer-meter:has(>:nth-child(9)) .mixer-meter-bar{flex-basis:3px}\n.mixer-meter-bar::before{content:\"\";position:absolute;inset:0 0 auto;height:calc((1 - var(--level,0))*100%);background:var(--_well);opacity:.9}\n.mixer-meter-bar::after{content:\"\";position:absolute;left:0;right:0;height:2px;bottom:calc(var(--peak,0)*100% - 2px);background:var(--_ink)}\n.mixer-meter-bar[data-clipped=true]{box-shadow:inset 0 3px 0 var(--_hot)}\n.mixer-readout{text-align:center;color:var(--_muted);font-variant-numeric:tabular-nums}\n.mixer-strip :is(button,select,input):focus-visible{outline:2px solid var(--_accent);outline-offset:2px}\n@media(pointer:coarse){\n  .mixer-strip{min-width:104px}\n  .mixer-strip .mixer-buttons>*{min-width:30px;min-height:40px}\n}\n@media(pointer:coarse){\n  .mixer-insert,:is(.mixer-route,.mixer-automation) select{min-height:36px}\n  .mixer-insert :is(button,.primitive-action){min-width:32px;min-height:32px}\n}\n/* Audio's standalone DAW composes the same controls used by Performance. */\nbody:has(.ls-desk[data-workspace=daw]) main:has(.ls-desk[data-workspace=daw]),\n.primitive-page:has(.ls-desk[data-workspace=daw]){max-width:none;margin:0;padding:0;}\n.primitive-app-shell__content:has(.ls-desk[data-workspace=daw]){--cre8-page-gutter-x:0px;--cre8-page-gutter-y:0px;--cre8-page-max-width:100%}\n.ls-render-tools{border-top:1px solid var(--cre8-view-border);background:var(--cre8-view-surface);color:var(--cre8-view-fg)}\n.ls-render-tools>summary{padding:10px 16px;cursor:pointer;font-weight:600;color:var(--cre8-view-fg-muted)}\n.ls-render-tools[open]>summary{border-bottom:1px solid var(--cre8-view-border-subtle)}\n.ls-render-tools>:not(summary){padding:12px 16px 20px;max-width:960px}\n.ls-desk[data-workspace=daw] .ls-quiet-help{margin:8px 0;font-size:11px;color:var(--daw-muted);}\n.ls-quiet-help>summary{cursor:pointer;padding:4px 0;}\n.ls-desk[data-workspace=daw][data-daw-view=visual] .ls-draft-bar,\n.ls-desk[data-workspace=daw][data-daw-view=visual] .ls-preset-row,\n.ls-desk[data-workspace=daw][data-daw-view=visual] .ls-compose{display:none;}\n.ls-desk[data-workspace=daw] .ls-eyebrow,.ls-daw-library>.ls-daw-caption,.ls-daw-library>p{display:none;}\n.ls-desk[data-workspace=daw]{--daw-well:light-dark(#eef1ee,#0b0f0e);--daw-bg:light-dark(#fafbfa,#111614);--daw-panel:light-dark(#f3f5f3,#181e1c);--daw-control:light-dark(#ffffff,#212926);--daw-control-hi:light-dark(#e8ede9,#2b3531);--daw-border:light-dark(rgba(16,24,20,.12),rgba(255,255,255,.08));--daw-border-strong:light-dark(rgba(16,24,20,.22),rgba(255,255,255,.15));--daw-grid:light-dark(rgba(16,24,20,.07),rgba(255,255,255,.05));--daw-ink:var(--editor-ink);--daw-soft:light-dark(#3a4540,#c5cfca);--daw-muted:var(--editor-muted);--daw-faint:var(--cre8-view-fg-faint);--daw-accent:var(--editor-accent);--daw-accent-ink:var(--editor-accent-ink);--daw-selected:var(--editor-selected);display:grid;grid-template-columns:185px minmax(0,1fr);gap:0;margin:0;padding:0;border:1px solid var(--daw-border);border-radius:8px;background:var(--daw-bg);color:var(--daw-ink);font:12px/1.5 system-ui}\n.ls-desk[data-workspace=daw]>header{grid-column:1/-1}\n.ls-desk[data-workspace=daw] h2{font-size:21px;margin:3px 0;letter-spacing:-.025em}.ls-desk[data-workspace=daw]>header p{display:none}.ls-desk[data-workspace=daw] .ls-eyebrow{font:9px ui-monospace,monospace;color:var(--daw-muted);letter-spacing:.12em}\n.ls-desk[data-workspace=daw] button,.ls-desk[data-workspace=daw] select,.ls-desk[data-workspace=daw] input[type=number]{border-radius:4px;border-color:var(--daw-border-strong);background:var(--daw-control);padding:7px 10px;font-size:11px}\n.ls-desk[data-workspace=daw] [data-ls=start],.ls-desk[data-workspace=daw] [data-ls=apply]{background:var(--editor-accent,#c4ef83);color:var(--editor-accent-ink,#142819);border-color:var(--editor-accent,#c4ef83)}\n.ls-desk[data-workspace=daw] .ls-menu-bar{grid-column:1/-1;grid-row:2}\n.ls-desk[data-workspace=daw] .ls-menu-bar details{margin:0}.ls-desk[data-workspace=daw] .ls-menu-bar>span{color:var(--daw-muted)}\n.ls-desk[data-workspace=daw] .ls-transport{grid-column:1/-1;grid-row:3;border-radius:0;margin:0;padding:12px 20px;border-bottom:1px solid var(--daw-border);background:var(--daw-control);min-height:64px}\n.ls-desk[data-workspace=daw] .ls-transport output{padding:10px 16px;border:1px solid var(--daw-border-strong);border-radius:4px;background:var(--daw-well);font:12px ui-monospace,monospace;color:var(--daw-ink);min-width:240px}\n.ls-desk[data-workspace=daw] .ls-daw-tabs{grid-column:1/-1;grid-row:4}\n.ls-daw-tabs [data-daw-mixer]{margin-left:auto}\n.ls-desk[data-workspace=daw] .ls-columns,.ls-desk[data-workspace=daw] .ls-mix{display:contents}\n.ls-desk[data-workspace=daw] .ls-code{grid-column:2;grid-row:5;display:flex;flex-direction:column;min-height:440px;min-width:0;overflow:visible;padding:14px 18px;background:var(--daw-bg)}\n.ls-desk[data-workspace=daw] .ls-code>nav{display:none}.ls-desk[data-workspace=daw] .ls-draft-bar{font-size:10px;margin:0 0 12px}\n.ls-desk[data-workspace=daw] .ls-arrangement{order:-1;flex-shrink:0;margin:0 0 14px;border-color:var(--daw-border-strong);border-radius:4px}\n.ls-desk[data-workspace=daw] .ls-arrangement>div:first-child{background:var(--daw-control);font-size:11px;align-items:center;flex-wrap:wrap}\n.ls-desk[data-workspace=daw] .ls-arrangement [data-ls=arrangement]{overflow:auto;min-height:235px;background:repeating-linear-gradient(90deg,transparent 0,transparent 95px,var(--daw-grid) 95px,var(--daw-grid) 96px),var(--daw-well)}\n.ls-desk[data-workspace=daw] .ls-arrangement svg{height:235px;width:calc(100% * var(--daw-zoom,1));min-width:calc(760px * var(--daw-zoom,1));max-width:none}\n.ls-desk[data-workspace=daw] .ls-daw-only{display:flex}.ls-timeline-zoom{align-items:center;gap:7px;font-size:10px;margin-left:auto}.ls-timeline-zoom input{width:80px;accent-color:var(--daw-accent)}.ls-timeline-zoom output{min-width:35px}\n.ls-desk[data-workspace=daw]:not([data-daw-view=tracks]) .ls-arrangement{display:none}\n.ls-desk[data-workspace=daw][data-daw-view=tracks] .ls-draft-bar,.ls-desk[data-workspace=daw][data-daw-view=tracks] [data-ls-pane=session]{display:none}\n.ls-desk[data-workspace=daw][data-daw-view=tracks] [data-ls-pane=code]{display:contents}\n.ls-desk[data-workspace=daw][data-daw-view=tracks] [data-ls-pane=code]>label,.ls-desk[data-workspace=daw][data-daw-view=tracks] .ls-editor-frame,.ls-desk[data-workspace=daw][data-daw-view=tracks] .ls-editor-footer{display:none}\n.ls-desk[data-workspace=daw] .ls-preset-row{order:2;font-size:10px;margin-top:6px;padding:6px 0}.ls-desk[data-workspace=daw] .ls-compose{order:3;font-size:11px;margin:8px 0 0}.ls-desk[data-workspace=daw] [data-ls=status]{font-size:11px;min-height:20px;margin:4px 0}\n.ls-desk[data-workspace=daw] .ls-daw-library{grid-column:1;grid-row:5;border-right:1px solid var(--daw-border);padding:16px 12px;background:var(--daw-panel);min-width:0}\n.ls-daw-caption{font:9px ui-monospace,monospace;letter-spacing:.09em;color:var(--daw-muted)}.ls-daw-library h3{font-size:16px;margin:8px 0}.ls-daw-library p{font-size:10px;color:var(--daw-muted)}\n.ls-desk[data-workspace=daw] .ls-daw-library button{display:grid;grid-template-columns:22px 1fr;text-align:left;gap:2px 4px;width:100%;margin:6px 0;padding:6px 7px;font-size:10px;background:var(--daw-control);border-left:3px solid var(--track-color,#8eadbf)}\n.ls-daw-library button strong{grid-column:2;grid-row:1;font-size:12px;font-weight:500}.ls-daw-library button span{color:var(--daw-soft);font-size:9px}.ls-daw-library button span:first-child{grid-column:1;grid-row:1;align-self:center}.ls-daw-library button span:last-child{display:none}.ls-daw-library a{display:block;font-size:10px;margin-top:20px}\n.ls-desk[data-workspace=daw] .ls-channel-rack{grid-column:1/-1;grid-row:6;display:grid;grid-template-columns:1fr auto;gap:8px 16px;border-top:1px solid var(--daw-border);padding:14px 18px;background:var(--daw-panel);min-width:0}\n.ls-channel-rack>h3{margin:0;font-size:13px}.ls-desk[data-workspace=daw] .ls-channel-rack>p{grid-column:1;font-size:10px;margin:0;color:var(--daw-muted)}\n.ls-desk[data-workspace=daw] .ls-tempo{grid-column:2;grid-row:1/3;align-self:center;font-size:11px}.ls-desk[data-workspace=daw] .ls-tempo input{width:66px}\n.ls-desk[data-workspace=daw] .ls-lanes{grid-column:1/-1;display:grid;grid-template-columns:repeat(6,minmax(90px,1fr));gap:8px;margin:4px 0;overflow:auto}\n/* Lanes are shared mixer strips (view-lib mixer_console): the DAW sets their palette and each lane's track colour. */\n.ls-desk[data-workspace=daw]{--mixer-surface:var(--daw-panel);--mixer-well:var(--daw-well);--mixer-ink:var(--daw-ink);--mixer-muted:var(--daw-muted);--mixer-border:var(--daw-border-strong);--mixer-fader-height:118px}\n.ls-desk[data-workspace=daw] .ls-lane-row{--mixer-accent:var(--track-color,#b8d699);min-width:90px;padding:10px;border-top:3px solid var(--track-color,#8eadbf);border-radius:4px}\n.ls-desk[data-workspace=daw] .ls-lane-row .mixer-handle>.ls-channel-order{flex:1;margin:0}.ls-desk[data-workspace=daw] .ls-lane-row .mixer-readout output{font:10px ui-monospace,monospace;color:var(--daw-soft);text-align:center}\n.ls-desk[data-workspace=daw] .ls-lane-row .mixer-slot label{display:block;margin:0 0 2px;font-size:10px;color:var(--daw-muted)}\n.ls-desk[data-workspace=daw] .ls-lane-row select{padding:6px 4px;font-size:10px}.ls-desk[data-workspace=daw] .ls-lane-row .mixer-slot>.primitive-text{display:block;font-size:10px;padding:6px 0;color:var(--daw-muted)}\n.ls-desk[data-workspace=daw] [data-ls=mix]{grid-column:2;justify-self:end;font-size:11px}\n.ls-desk[data-workspace=daw][data-daw-mixer=false] .ls-channel-rack{display:none}\n.ls-desk[data-workspace=daw] .ls-mix>details,.ls-desk[data-workspace=daw] .ls-clock-boundary{display:none}\n.ls-desk[data-workspace=daw][data-daw-view=midi] .ls-code{display:none}.ls-desk[data-workspace=daw][data-daw-view=midi] .ls-midi{display:block;grid-column:2;grid-row:5;padding:20px;margin:0;min-width:0;background:var(--daw-bg)}\n.ls-desk[data-workspace=daw] .ls-midi pre{padding:14px;border:1px solid var(--daw-border-strong);border-radius:4px;background:var(--daw-well)}.ls-desk[data-workspace=daw] .ls-midi p{font-size:11px}\n.ls-desk[data-workspace=daw] .ls-project-bar{grid-column:1/-1;grid-row:7;padding:8px 16px;margin:0;border:0;border-top:1px solid var(--daw-border);font-size:10px}.ls-desk[data-workspace=daw] .ls-project-bar>span:last-child{display:none}\n.ls-desk[data-workspace=daw]>[data-cre8-island]{display:none}\n[data-ls-channel=drums],[data-daw-track=drums]{--track-color:#e6b276}[data-ls-channel=bass],[data-daw-track=bass]{--track-color:#b7d98d}[data-ls-channel=pads],[data-daw-track=pads]{--track-color:#85bedc}[data-ls-channel=melody],[data-daw-track=melody]{--track-color:#b9a0df}[data-ls-channel=arp],[data-daw-track=arp]{--track-color:#7dd0b9}[data-ls-channel=reverb],[data-daw-track=reverb]{--track-color:#a6accc}\n.ls-desk[data-workspace=daw] .ls-lane-row[data-selected=true],.ls-desk[data-workspace=daw] .ls-daw-library [aria-pressed=true]{outline:1px solid var(--track-color);outline-offset:-1px;background:var(--daw-control-hi)}\n@media(max-width:800px){.ls-desk[data-workspace=daw]{grid-template-columns:145px minmax(0,1fr)}.ls-desk[data-workspace=daw] .ls-lanes{grid-template-columns:repeat(6,110px)}.ls-desk[data-workspace=daw] .ls-code{padding:12px}.ls-desk[data-workspace=daw] .ls-transport output{font-size:10px;min-width:0}.ls-daw-library p{display:none}}\n@media(max-width:560px){.ls-desk[data-workspace=daw]{grid-template-columns:minmax(0,1fr)}.ls-desk[data-workspace=daw] .ls-daw-library{display:none}.ls-desk[data-workspace=daw] .ls-code,.ls-desk[data-workspace=daw][data-daw-view=midi] .ls-midi{grid-column:1}.ls-desk[data-workspace=daw]>header{flex-direction:row}.ls-desk[data-workspace=daw] .ls-transport{padding:10px}.ls-desk[data-workspace=daw] .ls-transport output{flex-basis:100%}.ls-desk[data-workspace=daw] .ls-channel-rack{padding:12px}.ls-desk[data-workspace=daw] .ls-menu-bar>span{display:none}.ls-desk[data-workspace=daw] .ls-tempo{grid-column:1;grid-row:auto}.ls-desk[data-workspace=daw] .ls-channel-rack>p{grid-column:1/-1}.ls-desk[data-workspace=daw] .ls-arrangement>div:first-child{align-items:start}.ls-timeline-zoom{margin:0}}\n.ls-piano{display:none}\n.ls-desk[data-workspace=daw][data-daw-view=piano] .ls-piano{display:block;order:-1;min-width:0}\n.ls-desk[data-workspace=daw][data-daw-view=piano] [data-ls-pane]{display:none!important}\n.ls-piano header{flex-wrap:wrap;justify-content:start;gap:12px;margin-bottom:10px}.ls-piano header>div{margin-right:auto}.ls-piano h3{margin:4px 0}.ls-piano label{font-size:10px;color:var(--daw-soft)}.ls-piano select{margin-left:6px}\n.ls-piano-scroll{overflow:auto;height:300px;border:1px solid var(--daw-border-strong);border-radius:4px;background:var(--daw-well);overscroll-behavior:contain}\n.ls-piano-grid{position:relative;min-width:820px;height:0;touch-action:pan-x pan-y}\n.ls-piano-key{position:absolute;left:0;width:100%;height:20px;border-bottom:1px solid var(--daw-border);background:var(--daw-panel);color:var(--daw-soft);pointer-events:none;font:10px/20px ui-monospace,monospace;padding-left:5px}\n.ls-piano-key[data-black=true]{background:var(--daw-bg);color:var(--daw-muted)}\n.ls-piano-beat{position:absolute;top:0;bottom:0;width:1px;background:#526b7c;pointer-events:none}.ls-piano-beat span{position:sticky;top:0;background:var(--daw-panel);color:var(--daw-soft);font:9px ui-monospace,monospace;padding:2px}\n.ls-desk[data-workspace=daw] .ls-piano-note{position:absolute;height:18px;border:1px solid var(--daw-accent);border-radius:3px;padding:0 5px;overflow:hidden;white-space:nowrap;text-align:left;font:10px/16px ui-monospace,monospace;background:color-mix(in srgb,var(--track-color,var(--daw-accent)) 80%,var(--daw-panel));color:#152116;touch-action:none;cursor:grab;min-width:5px}\n.ls-desk[data-workspace=daw] .ls-piano-note[aria-pressed=true]{background:color-mix(in srgb,var(--track-color,var(--daw-accent)) 55%,#fff);outline:2px solid var(--daw-soft);outline-offset:1px;z-index:2}.ls-piano-note::after{content:'';position:absolute;right:0;top:0;bottom:0;width:5px;background:var(--daw-grid);cursor:ew-resize}\n.ls-piano-inspector{display:flex;flex-wrap:wrap;align-items:end;gap:8px;margin:12px 0}.ls-piano-inspector input{display:block;width:85px!important;margin-top:4px}.ls-piano footer{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.ls-piano footer span{font-size:10px;color:var(--daw-soft)}.ls-piano>p{font-size:11px}\n.ls-desk[data-workspace=daw][data-daw-view=clips] .ls-piano{display:block;order:-1;min-width:0}\n.ls-desk[data-workspace=daw][data-daw-view=clips] [data-ls-pane],.ls-desk[data-workspace=daw][data-daw-view=clips] .ls-piano-scroll,.ls-desk[data-workspace=daw][data-daw-view=clips] .ls-piano-inspector,.ls-desk[data-workspace=daw][data-daw-view=clips] .ls-piano-hints{display:none!important}\n.ls-clip-editor{margin:12px 0 16px}.ls-clip-scroll{overflow:auto;border:1px solid var(--daw-border-strong);border-radius:4px;background:var(--daw-well)}.ls-clip-grid{position:relative;height:98px;min-width:620px;background:repeating-linear-gradient(90deg,transparent 0,transparent calc(25% - 1px),var(--daw-control-hi) calc(25% - 1px),var(--daw-control-hi) 25%)}\n.ls-desk[data-workspace=daw] .ls-clip-region{position:absolute;top:16px;height:64px;min-width:0;background:var(--daw-control-hi);border:1px solid var(--daw-soft);border-top:3px solid var(--track-color,var(--daw-accent));color:var(--daw-ink);border-radius:4px;text-align:left;padding:8px 10px;overflow:hidden;white-space:nowrap;touch-action:none;cursor:grab}.ls-clip-region small{display:block;font-size:10px;color:var(--daw-soft)}.ls-clip-region[data-empty=true]{background:var(--daw-panel);border-color:var(--daw-border);color:var(--daw-muted)}\n.ls-clip-selection{position:absolute;top:11px;height:74px;border:2px solid var(--daw-accent);pointer-events:none;border-radius:5px;z-index:2}.ls-clip-controls{display:flex;flex-wrap:wrap;gap:8px;align-items:end}.ls-clip-controls input{display:block;width:105px!important;margin-top:4px}.ls-clip-controls label{font-size:10px}.ls-clip-editor>p{font-size:10px;margin:8px 0;color:var(--daw-soft)}.ls-desk[data-workspace=daw][data-daw-view=clips] .ls-clip-grid{height:160px}.ls-desk[data-workspace=daw][data-daw-view=clips] .ls-clip-region{top:28px;height:100px}.ls-desk[data-workspace=daw][data-daw-view=clips] .ls-clip-selection{top:23px;height:110px}\n.ls-desk[data-workspace=daw] .ls-clip-region{display:flex;flex-direction:column;justify-content:flex-start;user-select:none}\n.ls-clip-preview{position:absolute;left:10px;right:10px;top:42px;bottom:5px;overflow:hidden;pointer-events:none}.ls-clip-preview i{display:block;position:absolute;height:3px;min-width:2px;border-radius:1px;background:var(--track-color,var(--daw-accent))}.ls-desk[data-workspace=daw][data-daw-view=clips] .ls-clip-preview{top:48px;bottom:10px}\n/* Server-rendered instrument and phrase components share the Audio draft. */\n.ls-instrument-editor{display:none}.ls-desk[data-workspace=daw][data-daw-view=instruments] .ls-instrument-editor{display:block;order:-1}.ls-desk[data-workspace=daw][data-daw-view=instruments] [data-ls-pane]{display:none!important}\n.ls-instrument-fields{display:grid;grid-template-columns:repeat(auto-fit,minmax(145px,1fr));gap:12px;margin:14px 0}.ls-instrument-fields label{display:flex;flex-direction:column;gap:5px;font-size:11px}.ls-instrument-fields input:not([type=checkbox]),.ls-instrument-fields select{width:100%;min-width:0;box-sizing:border-box;background:var(--daw-panel);color:var(--daw-ink);border:1px solid var(--daw-border-strong);border-radius:4px;padding:8px}.ls-instrument-fields input[type=checkbox]{width:auto;margin:0 4px 0 0}.ls-instrument-editor details{padding:12px;border:1px solid var(--daw-border-strong);border-radius:5px}.ls-instrument-editor p{color:var(--daw-soft)}\n.ls-arrange-controls{display:flex;flex-wrap:wrap;gap:8px;align-items:center;padding:12px}.ls-arrange-controls input{width:65px}.ls-arrange-controls [role=status]{flex-basis:100%;font-size:11px;color:var(--daw-soft)}\n.ls-track-timeline{display:flex;flex-direction:column;min-width:calc(650px * var(--daw-zoom,1));padding:8px}.ls-track-phrase-row{display:flex;gap:8px;align-items:center;height:64px}.ls-track-phrase-row>strong{width:60px;font-size:11px;color:var(--daw-soft)}.ls-track-phrases{position:relative;flex:1;height:56px}.ls-desk[data-workspace=daw] .ls-track-phrases button{position:absolute;top:3px;height:50px;box-sizing:border-box;border:3px solid var(--daw-border);background:var(--daw-control-hi);color:var(--daw-ink);touch-action:none;cursor:grab;z-index:1;text-align:left;user-select:none}.ls-track-phrases small{display:block;font-size:9px}.ls-track-phrases [aria-pressed=true]{outline:2px solid var(--daw-accent);outline-offset:-3px;z-index:3!important}.ls-desk[data-workspace=daw] .ls-track-phrases [data-arrange-empty=true]{background:var(--daw-panel);color:var(--daw-muted)}\n.ls-desk[data-workspace=daw] .ls-arrangement svg{height:235px}.ls-desk[data-workspace=daw] .ls-daw-library{display:flex;flex-direction:column}.ls-daw-library>p,.ls-daw-library>h3,.ls-daw-library>.ls-daw-caption{order:-1}.ls-daw-library>a{order:10}.ls-channel-order{display:flex;gap:4px;align-items:center;margin-bottom:6px}.ls-channel-order [data-channel-drag]{cursor:grab;touch-action:none}.ls-desk[data-workspace=daw] .ls-channel-order button{padding:3px 7px}.ls-channel-order [data-channel-drag]{margin-right:auto}\n@media(max-width:560px){.ls-desk[data-workspace=daw] .ls-daw-library{display:none}.ls-instrument-fields{grid-template-columns:repeat(2,minmax(0,1fr))}}\n\n.ls-instrument-editor header{display:block}.ls-lane-row[data-drop-target=true]{outline:2px solid var(--daw-accent);outline-offset:2px}\n/* Persistent clip and envelope components are rendered by Audio. */\n.ls-session-editor{display:none}.ls-desk[data-track-editor=true][data-daw-view=tracks] .ls-session-editor,.ls-desk[data-track-editor=true][data-daw-view=flow] .ls-session-editor{display:block;order:-1;min-width:0}.ls-desk[data-track-editor=true][data-daw-view=tracks] .ls-arrangement{display:none}.ls-desk[data-daw-view=flow] [data-ls-pane]{display:none!important}.ls-session-flow{display:none}.ls-desk[data-daw-view=flow] .ls-session-flow{display:block}.ls-desk[data-daw-view=flow] .ls-session-timeline{display:none}.ls-session-editor>div>header{align-items:center}.ls-session-editor p{font-size:11px}.ls-session-scroll{overflow:auto;max-height:660px;border:1px solid var(--daw-border-strong);border-radius:5px}.ls-session-lanes{min-width:650px}.ls-session-track{border-bottom:1px solid var(--daw-border-strong);background:var(--daw-bg);padding:8px}.ls-session-track>header{display:flex;gap:8px;justify-content:flex-start;min-height:36px}.ls-session-track header label{display:flex;align-items:center;gap:5px;margin-left:auto;white-space:nowrap}.ls-session-track input[type=number]{width:58px}.ls-session-track header small{max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--daw-muted)}.ls-session-lane{position:relative;height:68px;background:repeating-linear-gradient(90deg,var(--daw-bg) 0,var(--daw-bg) calc(12.5% - 1px),var(--daw-control-hi) calc(12.5% - 1px),var(--daw-control-hi) 12.5%)}.ls-session-lane [data-session-clip]{position:absolute;top:6px;height:54px;min-width:12px;text-align:left;white-space:nowrap;overflow:hidden;touch-action:none;border:2px solid var(--daw-soft);background:var(--daw-control-hi);user-select:none;cursor:grab}.ls-session-lane small{display:block;font-size:9px;color:var(--daw-soft)}.ls-session-lane [aria-pressed=true]{outline:2px solid var(--daw-accent);z-index:3}.ls-session-lane [data-clip-resize]{position:absolute;right:0;top:0;height:100%;width:9px;background:#b5d08e77;cursor:ew-resize;touch-action:none}.ls-envelope{display:block;width:100%;height:92px;background:var(--daw-well);touch-action:none;overflow:visible}.ls-envelope path{fill:#92c47844;stroke:#b7e390;stroke-width:1.5;vector-effect:non-scaling-stroke}.ls-envelope circle{fill:var(--daw-accent);stroke:#172f2a;stroke-width:2;cursor:grab}.ls-envelope text{fill:#a8c49d;font:10px system-ui;pointer-events:none}.ls-envelope-fields,.ls-session-fields{display:flex;gap:8px;align-items:end;flex-wrap:wrap;margin:12px 0}.ls-session-fields label,.ls-envelope-fields label{font-size:10px;display:flex;flex-direction:column;gap:4px}.ls-session-fields input,.ls-envelope-fields input{width:90px;max-width:100%;box-sizing:border-box}.ls-session-fields select{max-width:200px}.ls-clip-detail{padding:12px;border:1px solid var(--daw-border-strong);border-radius:5px;margin-top:12px}.ls-clip-note-list{display:flex;gap:4px;flex-wrap:wrap;max-height:110px;overflow:auto}.ls-session-editor[aria-busy=true]{opacity:.75}.ls-desk[data-track-session=true] .ls-legacy-patch,.ls-desk[data-track-session=true] .ls-lane-row:not([data-ls-channel=reverb]){display:none}.ls-desk[data-track-session=true] .ls-daw-library [data-daw-track]:not([data-daw-track=reverb]){display:none}.ls-desk[data-track-session=true] .ls-channel-rack .ls-lanes{display:flex}.ls-desk[data-track-session=true] .ls-lane-row[data-ls-channel=reverb]{min-width:160px}.ls-desk[data-track-session=true] [data-daw-view=piano],.ls-desk[data-track-session=true] [data-daw-view=clips]{display:none}.ls-desk[data-track-session=true] [data-daw-view=tracks] .ls-draft-bar{display:flex}.ls-flow-route{display:flex;flex-wrap:wrap;gap:10px;align-items:center;border:1px solid var(--daw-border-strong);border-radius:5px;padding:16px;margin:10px 0}.ls-flow-route span{padding:9px;background:var(--daw-control);border-radius:4px}.ls-flow-route i{color:var(--daw-accent)}.ls-flow-route small{display:block;font-size:9px;letter-spacing:.06em;text-transform:uppercase;color:var(--daw-muted)}.ls-flow-route em{display:block;font-style:normal;font-size:10px;color:var(--daw-soft)}.ls-flow-route>button{text-align:left}.ls-flow-route[data-flow-row=bus]{border-style:dashed}.ls-flow-route[data-flow-row=master]{border-color:var(--daw-accent)}.ls-flow-route .ls-flow-send{margin-left:auto;background:none;border:1px dashed var(--daw-soft)}.ls-flow-notes{margin:10px 0;padding-left:18px;font-size:11px;color:#f0c98a}.ls-flow-route>*{max-width:100%;box-sizing:border-box}.ls-flow-route label{display:block;padding:9px;background:var(--daw-control);border-radius:4px;font-size:11px}.ls-flow-route :is(input,select){max-width:100%;min-width:0}.ls-flow-route input[type=number]{width:76px}.ls-flow-route span:has(>[data-insert-params]){display:grid;grid-template-columns:repeat(4,auto);gap:4px}.ls-flow-route span:has(>[data-insert-params])>:is(small,strong,input){grid-column:1/-1}.ls-flow-route span>input{width:100%;box-sizing:border-box}.ls-flow-route span>button{padding:3px 6px;font-size:10px}.ls-flow-route span:has(>[data-insert-action=bypass][aria-pressed=true])>strong{text-decoration:line-through;opacity:.65}.ls-desk[data-track-session=true][data-daw-view=tracks] .ls-draft-bar{display:flex}\n@media(max-width:560px){.ls-session-fields input{width:76px}.ls-session-fields select{max-width:160px}.ls-envelope-fields{align-items:end}.ls-session-editor h3{font-size:15px}.ls-flow-route{gap:6px;padding:10px}}\n\n/* Presence stays above the DAW header and its navigation link. */\n.primitive-room-scope:has([data-live-score]) > .primitive-room-scope__viewers{position:static!important;display:flex;width:max-content;margin:0 0 8px auto}\n\n/* The workspace shell gives transport and navigation a consistent hierarchy. */\n.ls-desk[data-workspace=daw]{border:0;border-radius:0;width:100%;min-height:100dvh;box-sizing:border-box;grid-template-rows:auto auto auto auto minmax(440px,1fr) auto auto;}\n/* The heading, menu bar and view tabs are the shared editor strips (identity, menu, modes); their padding, rule and type come from view-lib's editor chrome. */\n.ls-desk[data-workspace=daw] .ls-transport{gap:8px 12px;padding:12px;background:var(--editor-surface);color:var(--editor-ink);border-bottom-color:var(--editor-border)}\n.ls-desk[data-workspace=daw] .ls-transport button{min-height:40px;border-radius:6px}\n.ls-desk[data-workspace=daw] :is(#ls-prepare,#ls-start:not(:disabled)){background:var(--editor-accent);border-color:var(--editor-accent);color:var(--editor-accent-ink);font-weight:650}\n.ls-desk[data-workspace=daw] #ls-stop:not(:disabled){border-color:var(--daw-soft);color:var(--daw-ink)}\n.ls-desk[data-workspace=daw] .ls-transport #ls-export-state{color:var(--cre8-view-fg-muted);font-size:11px}\n.ls-desk[data-workspace=daw] .ls-transport output{padding:6px 9px;min-width:0;max-width:100%;overflow-wrap:anywhere;border-color:var(--daw-border);border-radius:6px;font-size:11px}\n.ls-desk[data-workspace=daw] .ls-transport-feedback [data-ls=status]{margin:2px 0 0;min-height:0;color:var(--cre8-view-fg-muted);font:12px/1.5 system-ui,sans-serif}\n.ls-desk[data-workspace=daw] .ls-transport-feedback [data-ls=status][data-error=true]{color:var(--cre8-view-danger,#ffb4a6)}\n.ls-desk[data-workspace=daw] .ls-daw-tabs{overflow:visible}\n.ls-desk[data-workspace=daw] .ls-daw-tabs button{white-space:normal}\n\n.ls-desk[data-workspace=daw] .ls-arrangement [data-ls=arrangement]:has(>p){min-height:96px;display:grid;align-items:center}\n.ls-desk[data-workspace=daw] a:focus-visible{outline:2px solid var(--daw-accent);outline-offset:3px}\n@media(max-width:720px){\n  .ls-desk[data-workspace=daw] .ls-daw-tabs[data-editor-strip]{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:3px}\n  .ls-desk[data-workspace=daw] .ls-daw-tabs button{min-width:0;min-height:44px;overflow-wrap:anywhere}\n  .ls-desk[data-workspace=daw] .ls-daw-tabs [data-daw-mixer]{margin-left:0}\n  .ls-desk[data-workspace=daw] .ls-transport{padding:12px;gap:8px}\n  .ls-desk[data-workspace=daw] .ls-transport output{flex-basis:auto}\n  .ls-desk[data-workspace=daw] .ls-live-badge{margin-left:0}\n}\n@media(max-width:420px){\n  .ls-desk[data-workspace=daw] .ls-daw-tabs[data-editor-strip]{grid-template-columns:repeat(3,minmax(0,1fr))}\n  .ls-desk[data-workspace=daw] .ls-transport #audio-session-transport .primitive-card__body{gap:6px}\n  .ls-desk[data-workspace=daw] .ls-transport button{padding:8px;font-size:11px}\n}\n/* Each parameter is one cell: its enable box names it, so the control's own label stays for assistive tech only. */\n.ls-instrument-fields .primitive-checkbox{margin:0 0 5px}.ls-instrument-fields .primitive-checkbox__label{flex-direction:row;align-items:center;gap:6px}\n.ls-instrument-fields .primitive-checkbox~:is(.primitive-select,.primitive-input)>label{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}\n.ls-instrument-fields label:has(>.primitive-input__required){flex-direction:row}\n/* The DAW fills the window: the editor and the mixer scroll inside their own regions, the transport and status strips stay put. */\n@media(min-width:900px) and (min-height:620px){\n  .ls-desk[data-workspace=daw][data-daw-shell=true]{height:100dvh;min-height:0;overflow:hidden;grid-template-rows:auto auto auto auto minmax(0,1fr) auto auto}\n  .ls-desk[data-workspace=daw][data-daw-shell=true] :is(.ls-daw-library,.ls-code,.ls-midi){min-height:0;overflow:auto;overscroll-behavior:contain}\n  .ls-desk[data-workspace=daw][data-daw-shell=true] .ls-channel-rack{max-height:34dvh;overflow:auto;overscroll-behavior:contain}\n  .ls-desk[data-workspace=daw][data-daw-shell=true] .ls-transport{display:grid;grid-template-columns:minmax(0,1fr) auto auto;grid-template-areas:\"controls time badge\" \"feedback feedback meter\";align-items:center;gap:6px 14px;padding:8px 12px}\n  .ls-desk[data-workspace=daw][data-daw-shell=true] .ls-transport>:first-child{grid-area:controls;min-width:0}\n  .ls-desk[data-workspace=daw][data-daw-shell=true] .ls-transport>.ls-daw-timecode{grid-area:time}\n  .ls-desk[data-workspace=daw][data-daw-shell=true] .ls-transport>[data-ls=live-state]{grid-area:badge}\n  .ls-desk[data-workspace=daw][data-daw-shell=true] .ls-transport>.ls-transport-feedback{grid-area:feedback;min-width:0}\n  .ls-desk[data-workspace=daw][data-daw-shell=true] .ls-transport>.ls-meter{grid-area:meter;min-width:160px}\n  /* The timecode shows position; the sentence clock stays in the document for assistive tech. */\n  .ls-desk[data-workspace=daw][data-daw-shell=true] .ls-transport>[data-ls=clock]{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}\n}\n.ls-daw-timecode{display:flex;align-items:baseline;gap:12px;padding:6px 14px;border:1px solid color-mix(in srgb,currentColor 18%,transparent);border-radius:8px;background:color-mix(in srgb,currentColor 6%,transparent);font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-variant-numeric:tabular-nums;white-space:nowrap}\n.ls-daw-timecode[hidden],.ls-daw-status[hidden]{display:none}\n.ls-daw-timecode [data-daw-time=bars]{font-size:22px;font-weight:600;letter-spacing:.02em}\n.ls-daw-timecode [data-daw-time=clock],.ls-daw-timecode [data-daw-time=bpm]{font-size:12px;opacity:.75}\n.ls-daw-status{display:flex;flex-wrap:wrap;gap:4px 18px;margin-left:auto;font-size:11px;font-variant-numeric:tabular-nums}\n.ls-daw-status [data-daw-status-cell]{display:inline-flex;gap:6px;align-items:baseline;white-space:nowrap}\n.ls-daw-status [data-daw-status-cell]>:first-child{opacity:.6;text-transform:uppercase;letter-spacing:.06em;font-size:10px}\n/* Ruler, playhead and envelope cursors are drawn over the session lanes and never take pointer input. */\n.ls-desk[data-daw-shell=true] .ls-session-lanes{position:relative}\n.daw-ruler{font:10px/1 ui-monospace,SFMono-Regular,Consolas,monospace;opacity:.8;pointer-events:none}\n.daw-ruler__bars{display:grid;grid-auto-flow:column;grid-auto-columns:1fr}\n.daw-ruler__bars>span{padding:3px 4px;border-left:1px solid color-mix(in srgb,currentColor 30%,transparent)}\n.daw-playhead{position:absolute;top:0;bottom:0;left:0;width:2px;margin-left:-1px;background:var(--cre8-accent,#f5a524);box-shadow:0 0 8px var(--cre8-accent,#f5a524);pointer-events:none;z-index:3;will-change:transform}\n.daw-playhead[hidden]{display:none}\n.daw-envelope-cursor{stroke:currentColor;stroke-width:1;opacity:.45;vector-effect:non-scaling-stroke}\n.daw-envelope-dot{stroke:var(--cre8-accent,#f5a524);stroke-width:9;stroke-linecap:round;vector-effect:non-scaling-stroke}\n.ls-desk[data-daw-shell=true] [data-session-lane] [data-session-clip]{opacity:calc(.35 + .65*var(--daw-env-gain,1));transition:opacity .1s linear}\n@media(prefers-reduced-motion:reduce){.ls-desk[data-daw-shell=true] [data-session-lane] [data-session-clip]{transition:none}}\n\n/* The transport sits on the shared editor surface in both light and dark themes. */\n.ls-desk[data-workspace=daw] .ls-transport .ls-live-badge{color:var(--editor-accent)}\n\n/* Links take the shell accent so they read in both themes. */\n.ls-desk[data-workspace=daw] a{color:var(--daw-accent)}\n\n/* View tabs read as tabs: an underline marks the open view, and the mixer toggle is a chip. */\n.ls-desk[data-workspace=daw] .ls-daw-tabs{gap:2px;padding:0 8px;background:var(--daw-panel);border-bottom:1px solid var(--daw-border)}\n.ls-desk[data-workspace=daw] .ls-daw-tabs button{min-height:0;padding:11px 12px 9px;border:0;border-bottom:2px solid transparent;border-radius:0;background:transparent;color:var(--daw-muted);font-weight:500}\n.ls-desk[data-workspace=daw] .ls-daw-tabs button:hover{color:var(--daw-ink);background:var(--editor-hover)}\n.ls-desk[data-workspace=daw] .ls-daw-tabs button[aria-pressed=true]{color:var(--daw-ink);border-bottom-color:var(--daw-accent);background:transparent}\n.ls-desk[data-workspace=daw] .ls-daw-tabs button[data-daw-mixer]{align-self:center;margin:6px 4px 6px auto;padding:5px 12px;border:1px solid var(--daw-border-strong);border-radius:999px}\n.ls-desk[data-workspace=daw] .ls-daw-tabs button[data-daw-mixer][aria-pressed=true]{border-color:var(--daw-accent);background:var(--daw-selected)}\n\n/* The transport is one control cluster; a control that cannot run yet reads as disabled. */\n.ls-desk[data-workspace=daw] #audio-session-transport{background:transparent;border:0;padding:0;box-shadow:none}\n.ls-desk[data-workspace=daw] #audio-session-transport .primitive-card__body{display:flex;flex-wrap:wrap;align-items:center;gap:6px;padding:0}\n.ls-desk[data-workspace=daw] .ls-transport button{min-height:34px;padding:0 14px;border-radius:8px;border:1px solid var(--daw-border-strong);background:var(--daw-control);color:var(--daw-ink);font-weight:550}\n.ls-desk[data-workspace=daw] .ls-transport button:disabled{opacity:.42;cursor:not-allowed}\n.ls-desk[data-workspace=daw] .ls-transport :is(#ls-start,#ls-stop)::before{display:inline-block;margin-right:7px;font-size:10px}\n.ls-desk[data-workspace=daw] #ls-start::before{content:'\\25B6'}\n.ls-desk[data-workspace=daw] #ls-stop::before{content:'\\25A0'}\n.ls-desk[data-workspace=daw] .ls-transport :is(#ls-prepare,#ls-start:not(:disabled)){background:var(--daw-accent);border-color:var(--daw-accent);color:var(--daw-accent-ink)}\n.ls-desk[data-workspace=daw] #ls-publish-item{margin-left:6px}\n.ls-desk[data-workspace=daw] .ls-daw-timecode{border-color:var(--daw-border-strong);background:var(--daw-well)}\n.ls-desk[data-workspace=daw] .ls-live-badge{padding:3px 9px;border:1px solid var(--daw-border-strong);border-radius:999px;font:600 10px/1.4 ui-monospace,monospace;letter-spacing:.08em}\n\n/* Channel list: a colour edge, a quiet number and the name; the selected channel takes its own colour. */\n.ls-desk[data-workspace=daw] .ls-daw-library button{grid-template-columns:18px 1fr;align-items:center;margin:2px 0;padding:8px 10px;border:1px solid transparent;border-left:0;border-radius:6px;background:transparent;box-shadow:inset 3px 0 0 var(--track-color)}\n.ls-desk[data-workspace=daw] .ls-daw-library button:hover{background:var(--editor-hover)}\n.ls-desk[data-workspace=daw] .ls-daw-library button span:first-child{color:var(--daw-faint);font:10px ui-monospace,monospace}\n.ls-desk[data-workspace=daw] .ls-daw-library button strong{font-size:13px}\n.ls-desk[data-workspace=daw] .ls-daw-library [aria-pressed=true]{outline:0;background:color-mix(in srgb,var(--track-color) 20%,transparent);border-color:color-mix(in srgb,var(--track-color) 50%,transparent)}\n\n/* Arrangement and mixer strips are rounded panels; the selected strip is tinted by its track. */\n.ls-desk[data-workspace=daw] .ls-arrangement{border-radius:8px;overflow:hidden;background:var(--daw-panel)}\n.ls-desk[data-workspace=daw] .ls-arrangement>div:first-child{padding:8px 12px;border-bottom:1px solid var(--daw-border)}\n.ls-desk[data-workspace=daw] .ls-arrangement [data-ls=arrangement]>p{justify-self:center;color:var(--daw-muted)}\n.ls-desk[data-workspace=daw] .ls-lane-row{border:1px solid var(--daw-border);border-top:2px solid var(--track-color);border-radius:8px;background:var(--daw-panel)}\n.ls-desk[data-workspace=daw] .ls-lane-row[data-selected=true]{outline:0;border-color:color-mix(in srgb,var(--track-color) 55%,transparent);background:color-mix(in srgb,var(--track-color) 14%,var(--daw-panel))}\n.ls-desk[data-workspace=daw] :is(.ls-preset-row,.ls-compose){padding:10px 12px;border:1px solid var(--daw-border);border-radius:8px;background:var(--daw-panel)}\n/* SSR track components: controls fit the viewport; clips retain beat-relative positions. */\n.ls-desk .ls-session-timeline>header {display:flex;flex-direction:row;align-items:center;gap:16px;text-align:left;margin-bottom:8px}\n.ls-session-timeline>header>div {min-width:0;flex:1}\n.ls-session-timeline>header h3 {margin:4px 0}\n.ls-session-timeline>header>button {flex:none}\n.ls-session-timeline>p {max-width:72ch;margin:8px 0 16px;color:var(--daw-muted)}\n.ls-session-scroll {max-height:none;overflow:visible;border:0;border-radius:0}\n.ls-session-lanes {min-width:0;display:grid;gap:12px}\n.ls-session-row-scroll {overflow-x:auto;min-width:0;scrollbar-width:thin}\n.ls-session-row-scroll>.ls-session-lane,.ls-session-row-scroll>.ls-envelope {min-width:var(--arrangement-width)}\n/* One bar per tile, sized as a fraction of the lane, so the bar lines sit under the %-placed clips at any zoom or panel width. */\n.ls-session-row-scroll>.ls-session-lane {background:linear-gradient(90deg,var(--daw-bg) 0,var(--daw-bg) calc(100% - 1px),var(--daw-control-hi) calc(100% - 1px)) 0 0/calc(100% * var(--bar-fraction,.125)) 100% repeat-x var(--daw-bg)}\n.ls-session-track {min-width:0;border:1px solid var(--daw-border);border-radius:8px;padding:10px;background:var(--daw-panel)}\n.ls-desk .ls-session-track>header {display:grid;grid-template-columns:minmax(0,1fr) 72px 48px 66px;align-items:center;gap:10px;min-height:44px;margin:0 0 8px;flex-direction:row}\n.ls-track-identity {display:flex;align-items:center;gap:10px;min-width:0}\n.ls-desk[data-workspace=daw] .ls-track-identity>button {max-width:100%;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left;font-weight:600;border-color:transparent;background:transparent;padding:6px 0;font-size:12px}\n.ls-desk[data-workspace=daw] .ls-track-identity>button:disabled {opacity:1;cursor:default}\n.ls-session-track header small {min-width:0;max-width:180px;font-size:10px}\n.ls-desk .ls-session-track header label {display:flex;flex-direction:column;align-items:stretch;gap:2px;margin:0;font-size:9px;color:var(--daw-soft)}\n.ls-desk[data-workspace=daw] .ls-session-track input[type=number] {width:100%;padding:6px;font-size:12px;min-height:30px}\n.ls-session-track [data-track-mute][aria-pressed=true] {background:color-mix(in srgb,#ba935b 35%,var(--daw-panel));border-color:#ba935b;color:#ffe0aa}\n.ls-desk .ls-session-track .ssr-action-menu {margin:0;justify-self:stretch}\n.ls-session-track .ssr-action-menu>summary {padding:8px;gap:5px;min-height:36px;justify-content:center;border:1px solid var(--daw-border-strong);background:var(--daw-control);color:var(--daw-ink);font-size:11px}\n.ls-session-track .ssr-action-menu>[role=menu] {z-index:100;background:var(--daw-panel);border-color:var(--daw-border-strong);border-radius:8px}\n.ls-desk[data-workspace=daw] .ls-session-track .ssr-action-menu [role=menuitem] {min-height:42px;background:transparent;border:0;padding:10px 12px;font-size:12px}\n.ls-desk[data-workspace=daw] .ls-session-track .ssr-action-menu [role=menuitem]:hover,\n.ls-desk[data-workspace=daw] .ls-session-track .ssr-action-menu [role=menuitem]:focus-visible {background:var(--daw-control-hi)}\n.ls-session-lane {height:64px;border-radius:4px}\n.ls-desk[data-workspace=daw] .ls-session-lane [data-session-clip] {height:52px;top:6px;padding:7px 12px;border:1px solid var(--daw-border-strong);border-left:3px solid var(--daw-accent);background:var(--daw-control-hi);color:var(--daw-ink);border-radius:4px}\n.ls-session-lane [data-clip-resize] {width:12px;background:#b5d08e33}\n.ls-session-lane [aria-pressed=true] {outline-offset:-2px}\n.ls-envelope {margin-top:8px;border-radius:4px;height:96px;background:repeating-linear-gradient(90deg,transparent 0,transparent calc(12.5% - 1px),var(--daw-grid) calc(12.5% - 1px),var(--daw-grid) 12.5%),var(--daw-bg)}\n.ls-envelope circle {vector-effect:non-scaling-stroke;stroke:var(--daw-accent);stroke-width:10}\n.ls-envelope-caption {display:flex;justify-content:space-between;font-size:10px;color:var(--daw-soft);margin:12px 0 6px}\n.ls-session-timeline:not(:has(.ls-envelope)) .ls-envelope-fields {display:none}\n.ls-envelope-fields {padding:12px;border:1px solid var(--daw-border);border-radius:8px;background:var(--daw-panel);gap:10px}\n.ls-envelope-fields>span {font-size:11px;color:var(--daw-muted)}\n.ls-envelope-fields>strong {font-size:11px;margin-right:auto;align-self:center}\n.ls-desk[data-workspace=daw] .ls-envelope-fields input {width:76px}\n.ls-clip-detail {background:var(--daw-panel);border-color:var(--daw-border);border-radius:8px}\n.ls-clip-detail h4 {margin:0 0 12px;font-size:13px}\n.ls-session-fields input:not([type=number]) {background:var(--daw-control);color:var(--daw-ink);border:1px solid var(--daw-border-strong);border-radius:4px;padding:7px 10px;font:inherit}\n.ls-session-fields input,.ls-session-fields select {min-height:34px}\n.ls-session-editor [data-track-status] {color:var(--daw-muted)}\n/* Persistent tracks carry their own mixer controls; the old channel list is redundant. */\n.ls-desk[data-workspace=daw][data-track-session=true] {grid-template-columns:minmax(0,1fr)}\n.ls-desk[data-workspace=daw][data-track-session=true] .ls-daw-library {display:none}\n.ls-desk[data-workspace=daw][data-track-session=true] .ls-code,\n.ls-desk[data-workspace=daw][data-track-session=true] .ls-midi {grid-column:1}\n.ls-desk[data-workspace=daw][data-track-session=true] .ls-channel-rack {grid-template-columns:minmax(0,1fr) auto;gap:8px 20px;padding:12px 18px}\n.ls-desk[data-workspace=daw][data-track-session=true] .ls-channel-rack .ls-lanes {grid-column:1;grid-row:3;display:block;overflow:visible;margin:0}\n.ls-desk[data-workspace=daw][data-track-session=true] .ls-lane-row[data-ls-channel=reverb] {display:grid;grid-template-columns:110px minmax(80px,240px) auto auto;align-items:center;gap:12px;min-width:0;padding:8px 12px;border-top-width:1px;margin:0}\n.ls-desk[data-workspace=daw][data-track-session=true] .ls-lane-row :is(.mixer-handle,.mixer-slot,.mixer-scale) {display:none}\n/* The return strip lies flat beside the track editor: name, fader, level, mute. */\n.ls-desk[data-workspace=daw][data-track-session=true] .ls-lane-row .mixer-fader-bay {order:1;height:auto;margin:0}\n.ls-desk[data-workspace=daw][data-track-session=true] .ls-lane-row .mixer-readout {order:2}\n.ls-desk[data-workspace=daw][data-track-session=true] .ls-lane-row .mixer-buttons {order:3}\n.ls-desk[data-workspace=daw][data-track-session=true] .ls-lane-row :is(.mixer-fader,.mixer-fader>.primitive-input) {width:100%;height:auto}\n.ls-desk[data-workspace=daw][data-track-session=true] .ls-lane-row .mixer-fader input[type=range] {writing-mode:horizontal-tb;direction:ltr;width:100%;height:28px;margin:0}\n.ls-desk[data-workspace=daw][data-track-session=true] [data-ls=mix] {grid-column:2;grid-row:3;align-self:center}\n@media(max-width:720px) {\n  .ls-track-identity {display:block}\n  .ls-track-identity>small {display:block;max-width:100%;font-size:9px}\n  .ls-desk .ls-session-track>header {grid-template-columns:minmax(0,1fr) 58px 44px 58px;gap:6px}\n  .ls-desk[data-workspace=daw] .ls-session-track [data-track-mute],\n  .ls-session-track .ssr-action-menu>summary {min-height:44px;padding:6px}\n  .ls-desk[data-workspace=daw] .ls-session-track input[type=number] {font-size:16px;min-height:34px;padding:4px}\n  .ls-desk[data-workspace=daw] .ls-session-track .ssr-action-menu [role=menuitem] {min-height:44px}\n  .ls-desk .ls-session-timeline>header {align-items:center;gap:8px}\n  .ls-desk[data-workspace=daw] .ls-session-timeline>header>button {max-width:118px;min-height:44px;padding:8px;white-space:normal}\n  .ls-desk[data-workspace=daw] .ls-session-timeline>header h3 {font-size:15px}\n  .ls-session-timeline>p {font-size:11px;line-height:1.6}\n  .ls-session-track {padding:8px}\n  .ls-envelope {height:100px}\n  .ls-envelope-fields {display:grid;grid-template-columns:repeat(2,minmax(0,1fr));align-items:end}\n  .ls-envelope-fields>strong,.ls-envelope-fields>span {grid-column:1/-1}\n  .ls-desk[data-workspace=daw] .ls-envelope-fields input {width:100%;font-size:16px}\n  .ls-envelope-fields button {min-height:44px}\n  .ls-session-fields {display:grid;grid-template-columns:repeat(2,minmax(0,1fr))}\n  .ls-desk[data-workspace=daw] .ls-session-fields input,.ls-session-fields select {width:100%;max-width:100%;font-size:16px}\n  .ls-session-fields button {min-height:44px}\n  .ls-desk[data-workspace=daw][data-track-session=true] .ls-channel-rack .ls-lanes {grid-column:1/-1}\n  .ls-desk[data-workspace=daw][data-track-session=true] .ls-lane-row[data-ls-channel=reverb] {grid-template-columns:100px minmax(60px,1fr)}\n  .ls-desk[data-workspace=daw][data-track-session=true] [data-ls=mix] {grid-column:1/-1;grid-row:4;justify-self:stretch;min-height:44px}\n}\n@media(max-width:560px) {\n  .ls-desk[data-workspace=daw] .ls-code {padding:12px 8px}\n  .ls-desk[data-workspace=daw] .ls-daw-tabs {flex-wrap:nowrap;overflow-x:auto;gap:6px;padding:8px;scrollbar-width:thin}\n  .ls-desk[data-workspace=daw] .ls-daw-tabs button {flex:none;min-height:42px;padding:8px 12px}\n  .ls-desk[data-workspace=daw] .ls-transport {gap:8px;min-height:0}\n  .ls-desk[data-workspace=daw] .ls-transport output {padding:8px;flex-basis:auto;min-width:0;font-size:10px}\n  .ls-desk[data-workspace=daw] .ls-transport button {min-height:40px}\n  .ls-desk[data-workspace=daw] .ls-transport .ls-meter {display:none}\n  .ls-desk[data-workspace=daw] .ls-draft-bar {flex-wrap:wrap;gap:8px;margin-top:8px}\n  .ls-desk[data-workspace=daw] .ls-draft-bar button {min-height:40px}\n  .ls-desk[data-workspace=daw] .ls-tempo {grid-column:2;grid-row:1/3}\n  .ls-desk[data-workspace=daw] .ls-channel-rack>p {grid-column:1;font-size:10px}\n}\n/* The chord lane rides the tracks' beat axis; blocks are coloured by harmonic function and carry a tension bar. */\n.ls-desk .ls-session-track.ls-chord-track>header {display:flex;margin:0 0 6px;min-height:0}\n.ls-chord-track {background:var(--daw-bg);border-style:dashed}\n.ls-chord-track .ls-track-identity>small {color:#c9b98a}\n.ls-chord-lane {position:relative;height:46px;border-radius:4px;background:var(--daw-bg)}\n.ls-session-row-scroll>.ls-chord-lane {min-width:var(--arrangement-width)}\n.ls-chord-empty {margin:0;padding:14px 10px;font-size:11px;color:var(--daw-muted)}\n.ls-chord-block {position:absolute;top:4px;bottom:4px;display:flex;flex-direction:column;justify-content:center;gap:1px;padding:2px 8px 6px;overflow:hidden;white-space:nowrap;border:1px solid var(--daw-border-strong);border-left:3px solid var(--daw-soft);border-radius:4px;background:var(--daw-control);color:var(--daw-ink);font-size:12px;line-height:1.1;box-sizing:border-box}\n.ls-chord-block b {font-weight:650;overflow:hidden;text-overflow:ellipsis}\n.ls-chord-block small {font-size:10px;color:var(--daw-soft);overflow:hidden;text-overflow:ellipsis}\n.ls-chord-block i {position:absolute;left:0;bottom:0;height:3px;width:calc(var(--tension,0)*100%);background:#e0a96d}\n.ls-chord-block[data-function=tonic] {border-left-color:#8fd0a0;background:color-mix(in srgb,#8fd0a0 22%,var(--daw-panel))}\n.ls-chord-block[data-function=predominant] {border-left-color:#8fb4e0;background:var(--daw-panel)}\n.ls-chord-block[data-function=dominant] {border-left-color:#e6a86a;background:color-mix(in srgb,#e6a86a 22%,var(--daw-panel))}\n/* The harmony panel: key, pitch-class weights, the progression reading and the compose form. */\n.ls-harmony {margin:16px 0;padding:14px;border:1px solid var(--daw-border);border-radius:8px;background:var(--daw-bg)}\n.ls-harmony>header {display:flex;flex-wrap:wrap;align-items:flex-end;justify-content:space-between;gap:8px 16px;margin-bottom:12px}\n.ls-harmony>header h3 {margin:2px 0 0}\n.ls-harmony-key {display:flex;flex-direction:column;align-items:flex-end;gap:2px;margin:0}\n.ls-harmony-key strong {font-size:18px;color:color-mix(in srgb,#d9b46a 60%,var(--daw-ink))}\n.ls-harmony-key span {font-size:11px;color:var(--daw-muted)}\n.ls-harmony-refused {margin:0;color:#e9b48a;font-size:12px}\n.ls-harmony-grid {display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:12px}\n.ls-harmony-card {margin:0;padding:12px;border:1px solid var(--daw-border);border-radius:8px;background:var(--daw-panel);min-width:0}\n.ls-harmony-card h4 {margin:0 0 10px;font-size:12px;letter-spacing:.04em;text-transform:uppercase;color:var(--daw-soft)}\n.ls-harmony-card p {margin:0 0 8px;font-size:12px;color:var(--daw-soft)}\n.ls-harmony-card ul {margin:0 0 8px;padding-left:18px;font-size:12px;color:var(--daw-soft)}\n.ls-harmony-row {display:flex;flex-wrap:wrap;align-items:flex-end;gap:8px;margin-top:8px}\n.ls-harmony label,.ls-harmony-tools label {display:flex;flex-direction:column;gap:3px;font-size:10px;color:var(--daw-soft);min-width:0}\n.ls-harmony select,.ls-harmony input,.ls-harmony-tools select,.ls-harmony-tools input {min-height:34px;background:var(--daw-control);color:var(--daw-ink);border:1px solid var(--daw-border-strong);border-radius:4px;padding:4px 8px;font:inherit;font-size:12px;max-width:100%}\n.ls-harmony input[type=range] {padding:0;accent-color:#d9b46a}\n.ls-harmony label.ls-harmony-check {flex-direction:row;align-items:center;gap:6px;font-size:12px;color:var(--daw-ink)}\n.ls-harmony label.ls-harmony-check input {min-height:0}\n.ls-harmony-candidates {display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin-top:10px}\n.ls-harmony-candidates>small {font-size:10px;color:var(--daw-muted);width:100%}\n.ls-harmony-candidates button small {color:var(--daw-muted);font-size:10px}\n.ls-harmony-candidates button[aria-pressed=true] {border-color:#d9b46a;color:color-mix(in srgb,#d9b46a 60%,var(--daw-ink))}\n.ls-pc-bars {display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:3px;align-items:end;height:96px}\n.ls-pc {display:flex;flex-direction:column;justify-content:flex-end;align-items:center;gap:4px;height:100%;min-width:0}\n.ls-pc span {width:100%;height:calc(var(--weight,0)*72px + 2px);border-radius:3px 3px 0 0;background:var(--daw-control-hi)}\n.ls-pc[data-in-key=true] span {background:#7fb39a}\n.ls-pc[data-tonic=true] span {background:#e2c27a}\n.ls-pc b {font-size:10px;font-weight:600;color:var(--daw-muted);white-space:nowrap}\n.ls-pc[data-in-key=true] b {color:var(--daw-ink)}\n.ls-harmony-weights figcaption {margin-top:8px;font-size:11px;color:var(--daw-muted)}\n.ls-harmony-numerals {font-size:15px!important;letter-spacing:.02em;color:color-mix(in srgb,#d9b46a 60%,var(--daw-ink))!important}\n.ls-harmony-chip {display:inline-block;margin:0 4px 4px 0;padding:2px 8px;border:1px solid var(--daw-border-strong);border-radius:999px;font-size:10px;color:var(--daw-ink);background:var(--daw-control)}\n.ls-harmony-traits {margin-top:4px}\n.ls-harmony-form {display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:8px}\n.ls-harmony-compose .ls-harmony-row button:first-child {background:color-mix(in srgb,#a3b86b 30%,var(--daw-panel));border-color:#a3b86b;color:var(--daw-ink)}\n/* Scale tools inside a clip's inspector. */\n.ls-harmony-tools {margin-top:12px;padding:10px;border:1px dashed var(--daw-border-strong);border-radius:8px}\n.ls-harmony-tools>strong {font-size:11px;letter-spacing:.04em;text-transform:uppercase;color:var(--daw-soft)}\n.ls-harmony-tools input[type=number] {width:5.5em}\n.ls-harmony-tools-note {margin:12px 0 0;font-size:11px;color:var(--daw-muted)}\n@media(max-width:720px) {\n  .ls-harmony {padding:10px}\n  .ls-harmony > header,.ls-harmony-key {align-items:flex-start}\n  .ls-harmony select,.ls-harmony input,.ls-harmony-tools select,.ls-harmony-tools input {font-size:16px;min-height:44px}\n  .ls-harmony button,.ls-harmony-tools button {min-height:44px}\n  .ls-harmony-grid {grid-template-columns:minmax(0,1fr)}\n}\n@media(max-width:560px) {\n  .ls-harmony-form {grid-template-columns:repeat(2,minmax(0,1fr))}\n  .ls-pc b {font-size:9px}\n  .ls-chord-block {padding:2px 5px 6px;font-size:11px}\n}\n\n/* Timeline zoom scales the song rows in the browser; the ruler is clipped to the lanes it measures. */\n.ls-session-lanes>.daw-ruler {overflow:hidden}\n.ls-track-zoom {display:flex;align-items:center;gap:4px}\n.ls-track-zoom button {min-width:34px;font-weight:600}\n.ls-session-fields .ls-track-zoom input[type=range] {width:96px;padding:0;border:0;background:none}\n\n/* Piano roll of the selected persistent clip: sticky key labels, a beat grid and a velocity lane that scrolls with it. */\n.ls-track-piano {--tp-row:14px;--tp-key:76px;--tp-beat:64px;--tp-width:max(480px,calc(var(--tp-beats,4) * var(--tp-beat)));margin:12px 0;border:1px solid var(--daw-border-strong);border-radius:5px;background:var(--daw-well)}\n.ls-track-piano:focus-visible {outline:2px solid var(--daw-accent);outline-offset:2px}\n.ls-track-piano .ls-tp-help {margin:6px 8px;color:var(--daw-muted)}\n.ls-tp-roll {max-height:280px;overflow:auto;scrollbar-width:thin;overscroll-behavior:contain}\n.ls-tp-body {display:flex;width:max-content}\n.ls-tp-keys,.ls-tp-velocity-key {position:sticky;left:0;z-index:2;flex:none;width:var(--tp-key);box-sizing:border-box;background:var(--daw-bg);border-right:1px solid var(--daw-border-strong)}\n.ls-tp-key {height:var(--tp-row);box-sizing:border-box;padding:0 6px;font:9px/var(--tp-row) ui-monospace,SFMono-Regular,Consolas,monospace;color:var(--daw-muted);border-bottom:1px solid var(--daw-border);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.ls-tp-key[data-black=true] {background:var(--daw-well)}\n.ls-tp-key[data-c=true] {color:var(--daw-ink);border-bottom-color:var(--daw-border-strong)}\n.ls-tp-grid {position:relative;flex:none;width:var(--tp-width);height:calc(var(--tp-rows,128) * var(--tp-row));touch-action:none;cursor:crosshair;background:linear-gradient(90deg,#5d8193 0 1px,transparent 1px) 0 0/calc(100% * var(--tp-bar-fraction,1)) 100% repeat-x,linear-gradient(90deg,#284150 0 1px,transparent 1px) 0 0/calc(100% * var(--tp-beat-fraction,.25)) 100% repeat-x,repeating-linear-gradient(180deg,transparent 0,transparent calc(var(--tp-row) - 1px),#18303c calc(var(--tp-row) - 1px),#18303c var(--tp-row)),#10212b}\n.ls-track-piano .ls-tp-note {position:absolute;height:var(--tp-row);min-width:4px;min-height:0;box-sizing:border-box;margin:0;padding:0;border:1px solid var(--daw-border);border-radius:2px;background:#9dc6a5;cursor:grab;touch-action:none;font-size:0}\n.ls-track-piano .ls-tp-note[aria-pressed=true] {background:color-mix(in srgb,var(--track-color,var(--daw-accent)) 55%,#fff);outline:2px solid #f5a524;outline-offset:0;z-index:1}\n.ls-track-piano .ls-tp-note [data-tp-resize] {position:absolute;right:0;top:0;bottom:0;width:6px;background:#ffffff40;cursor:ew-resize}\n.ls-track-piano [data-tp-ghost] {opacity:.6;pointer-events:none}\n.ls-tp-velocity {display:flex;height:64px;overflow:hidden;border-top:1px solid var(--daw-border-strong)}\n.ls-tp-velocity-key {display:flex;align-items:center;padding:0 6px;font-size:9px;color:var(--daw-muted)}\n.ls-tp-velocity-bars {position:relative;flex:none;width:var(--tp-width);margin-right:16px;touch-action:none;background:repeating-linear-gradient(180deg,var(--daw-panel) 0 1px,transparent 1px 25%)}\n.ls-tp-vel {position:absolute;top:0;bottom:0;width:10px;margin-left:-1px;cursor:ns-resize;touch-action:none}\n.ls-tp-vel>i {position:absolute;left:0;bottom:0;width:4px;background:#b7e390;border-radius:2px 2px 0 0}\n.ls-tp-vel[aria-pressed=true]>i {background:#f5a524}\n@media(max-width:760px) {\n  .ls-track-piano {--tp-row:18px;--tp-key:64px}\n  .ls-tp-roll {max-height:340px}\n}\n\n/* Wide panels put each track's controls in a column beside its lane, so a row is about as tall as its clips:\n   the name and gain on top, then mute, solo, the menu and the add-automation select. */\n@media(min-width:721px) {\n  .ls-session-timeline>p {margin:2px 0 8px;font-size:11px}\n  .ls-session-lanes {gap:6px}\n  .ls-session-track {position:relative;display:grid;grid-template-columns:220px minmax(0,1fr);gap:0 10px;align-items:start;padding:6px}\n  .ls-desk .ls-session-track>header {grid-template-columns:36px 36px 48px minmax(0,1fr);grid-template-rows:28px 28px;gap:4px;min-height:0;margin:0}\n  .ls-desk .ls-session-track.ls-chord-track>header {margin:0}\n  .ls-desk .ls-session-track>header>.ls-track-identity {grid-column:1/4;grid-row:1}\n  .ls-desk[data-workspace=daw] .ls-track-identity>button {padding:2px 0}\n  /* The input keeps its aria-label; the visible unit replaces the wrapped \"Gain dB\" text. */\n  .ls-desk .ls-session-track>header>label {grid-column:4;grid-row:1;flex-direction:row;align-items:center;gap:4px;font-size:0}\n  .ls-desk .ls-session-track>header>label::after {content:\"dB\";font-size:9px}\n  .ls-desk[data-workspace=daw] .ls-session-track>header input[type=number] {flex:1;width:auto;min-width:0;min-height:28px;padding:3px 5px}\n  .ls-desk .ls-session-track>header>[data-track-mute] {grid-column:1;grid-row:2}\n  .ls-desk .ls-session-track>header>[data-track-solo] {grid-column:2;grid-row:2}\n  .ls-desk .ls-session-track>header>.ssr-action-menu {grid-column:3;grid-row:2}\n  .ls-desk[data-workspace=daw] .ls-session-track>header>button,.ls-session-track .ssr-action-menu>summary {min-height:28px;padding:3px 4px;font-size:11px}\n  .ls-session-track>header>[data-track-delete] {display:none}\n  /* The add-automation select takes the header's last cell; its containing block is the track, so the row scroller does not clip it. */\n  .ls-session-track .ls-automation-add {position:absolute;left:138px;bottom:auto;top:38px;width:88px;margin:0;font-size:0;box-sizing:border-box}\n  .ls-session-track .ls-automation-add select {flex:1;min-width:0;min-height:28px;padding:3px 5px;font-size:11px}\n  .ls-automation-fields {position:sticky;left:0;width:max-content;max-width:100%;box-sizing:border-box}\n  .ls-session-lane {height:60px}\n  .ls-desk[data-workspace=daw] .ls-session-lane [data-session-clip] {height:52px;top:4px;padding:3px 6px}\n}\n/* One scrollbar under the last row drives every row, since the rows scroll together. */\n.ls-session-lanes .ls-session-row-scroll {scrollbar-width:none}\n.ls-session-lanes>.ls-session-track:last-of-type .ls-session-row-scroll {scrollbar-width:thin}\n/* A clip shows its notes; the name and count ride on top and clip rather than wrap. */\n.ls-desk[data-workspace=daw] .ls-session-lane [data-session-clip] {overflow:hidden;white-space:nowrap;text-align:left;font-size:11px;line-height:1.2}\n.ls-session-lane [data-session-clip]>.ls-clip-label,.ls-session-lane [data-session-clip]>small {position:relative;overflow:hidden;text-overflow:ellipsis;text-shadow:0 0 3px var(--daw-bg)}\n.ls-session-lane [data-session-clip]>small {display:inline;margin-left:6px;font-size:10px;color:var(--daw-soft)}\n.ls-clip-notes {position:absolute;inset:16px 4px 3px 4px;pointer-events:none}\n.ls-clip-notes>i {position:absolute;bottom:calc(var(--p) / var(--rows) * 100%);height:clamp(2px,calc(100% / var(--rows)),5px);min-width:2px;border-radius:1px;background:color-mix(in srgb,var(--daw-accent) 70%,var(--daw-ink));opacity:.75}\n/* Automation lanes under a track: one envelope per automated parameter, the point fields and the add select. */\n.ls-automation {display:flex;flex-direction:column;gap:4px}\n.ls-automation-curve path {fill:#d6efb322;stroke:#d6efb3;stroke-width:2;vector-effect:non-scaling-stroke}\n.ls-automation-curve[data-envelope-param^=\"pan\"] path {fill:#9fd4ff1f;stroke:#9fd4ff}\n.ls-automation-curve[data-envelope-param^=\"send:\"] path {fill:#c9a8ff1f;stroke:#c9a8ff}\n.ls-automation-curve[data-envelope-param^=\"insert:\"] path {fill:#ffc78a1f;stroke:#ffc78a}\n.ls-automation-curve circle {cursor:grab}\n.ls-automation-curve circle:focus-visible {outline:none;stroke:#fff}\n.ls-automation-fields {display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:10px 12px;border:1px solid var(--daw-border);border-radius:8px;background:var(--daw-panel)}\n.ls-automation-fields>strong {font-size:11px;margin-right:auto}\n.ls-automation-fields label {display:flex;align-items:center;gap:6px;font-size:11px;color:var(--daw-muted)}\n.ls-automation-fields input {width:76px}\n.ls-automation-add {display:flex;align-items:center;gap:8px;font-size:11px;color:var(--daw-muted);margin-top:4px}\n.ls-automation-add select {max-width:240px}\n@media (max-width:640px) {.ls-automation-fields input {width:64px}.ls-automation-add select {max-width:100%}}\n/* Opt-in editor chrome. Documents, canvases, transport and geometry stay app-owned. */\n[data-editor-chrome]{\n  --editor-surface:light-dark(#f6f8f6,#1b2220);\n  --editor-raised:light-dark(#fff,#242e29);\n  --editor-ink:var(--cre8-view-fg,light-dark(#182620,#edf3ee));\n  --editor-muted:var(--cre8-view-fg-muted,light-dark(#536259,#a6b5ab));\n  --editor-border:var(--cre8-view-border,light-dark(#cbd5ce,#3b4941));\n  /* One accent for every editor: the page's own, so a selected tab matches the app tab above it. */\n  --editor-accent:var(--cre8-view-accent,light-dark(#0f5c40,#51d88a));\n  --editor-accent-ink:light-dark(#fff,#06130f);\n  --editor-selected:color-mix(in srgb,var(--editor-accent) 16%,transparent);\n  --editor-hover:color-mix(in srgb,var(--editor-ink) 8%,transparent);\n  --editor-font:Inter,ui-sans-serif,system-ui,sans-serif;\n  --editor-control-height:34px;\n  --editor-control-radius:0px;\n  --editor-strip-pad:5px 12px;\n}\n[data-editor-chrome] [data-editor-strip]{\n  box-sizing:border-box;color:var(--editor-ink);background:var(--editor-surface);border-color:var(--editor-border);\n  gap:4px;min-width:0;\n}\n[data-editor-chrome] [data-editor-strip] :is(button,summary,select){\n  box-sizing:border-box;min-height:var(--editor-control-height);border-radius:var(--editor-control-radius);\n  font:12px/1.4 var(--editor-font);color:var(--editor-ink);border-color:var(--editor-border);padding:6px 10px;\n}\n[data-editor-chrome] [data-editor-strip] select{background:var(--editor-raised)}\n[data-editor-chrome] [data-editor-strip] :is(button,summary){background:transparent}\n[data-editor-chrome] [data-editor-strip] :is([aria-selected=true],[aria-pressed=true]){\n  background:var(--editor-selected);color:var(--editor-accent);border-color:var(--editor-accent);\n}\n[data-editor-chrome] [data-editor-strip] :is(button,summary):hover:not(:disabled,[aria-selected=true],[aria-pressed=true]){background:var(--editor-hover)}\n[data-editor-chrome] [data-editor-strip] :is(button,select):disabled{opacity:.45;cursor:default}\n[data-editor-chrome] :is(button,summary,select,input,textarea,[role=separator]):focus-visible{\n  outline:2px solid var(--editor-accent);outline-offset:2px;\n}\n\n/* Strip anatomy. Every editor reads top to bottom: identity, menu, tools or modes, the work, status.\n   An app marks the strip; the padding, rule and type come from here. */\n[data-editor-chrome] [data-editor-strip]:is([data-editor-strip=identity],[data-editor-strip=menu],[data-editor-strip=tools],[data-editor-strip=modes]){\n  display:flex;align-items:center;margin:0;padding:var(--editor-strip-pad);border-radius:0;\n  border-bottom:1px solid var(--editor-border);\n}\n[data-editor-chrome] [data-editor-strip=identity]{flex-wrap:wrap;gap:4px 12px;min-height:44px}\n[data-editor-chrome] [data-editor-strip=identity] :is(h1,h2){\n  margin:0;font:700 15px/1.3 var(--editor-font);letter-spacing:-.01em;white-space:nowrap;color:var(--editor-ink);\n}\n[data-editor-chrome] [data-editor-strip=menu]{flex-wrap:wrap;gap:2px}\n/* A menu bar set inside another strip is part of that strip's line. */\n[data-editor-chrome] [data-editor-strip] [data-editor-strip=menu]{flex:0 0 auto;padding:0;border:0;background:transparent}\n[data-editor-chrome] [data-editor-strip=modes]{flex-wrap:wrap}\n/* The document in hand: a name over one muted line. */\n[data-editor-chrome] [data-editor-part=project]{\n  display:grid;flex:1 1 180px;min-width:0;padding-left:12px;border-left:1px solid var(--editor-border);\n}\n[data-editor-chrome] [data-editor-part=project]>:is(strong,input){\n  overflow:hidden;font:600 13px/1.25 var(--editor-font);color:var(--editor-ink);text-overflow:ellipsis;white-space:nowrap;\n}\n[data-editor-chrome] [data-editor-part=project]>span{\n  overflow:hidden;font:11px/1.25 var(--editor-font);color:var(--editor-muted);text-overflow:ellipsis;white-space:nowrap;\n}\n[data-editor-chrome] [data-editor-part=actions]{display:flex;flex:0 0 auto;align-items:center;gap:6px;margin-left:auto}\n/* A way out of the editor wears the strip's button shape. */\n[data-editor-chrome] [data-editor-part=actions] a:where(:not([role],[hidden])){\n  display:inline-flex;align-items:center;box-sizing:border-box;min-height:var(--editor-control-height);padding:6px 10px;\n  border:1px solid var(--editor-border);border-radius:var(--editor-control-radius);\n  font:12px/1.4 var(--editor-font);color:var(--editor-ink);text-decoration:none;white-space:nowrap;\n}\n[data-editor-chrome] [data-editor-part=actions] a:where(:not([role],[hidden])):hover{background:var(--editor-hover)}\n[data-editor-chrome] [data-editor-part=actions] :is(button,summary){border:1px solid var(--editor-border)}\n/* The one action an editor exists for. */\n[data-editor-chrome] [data-editor-strip] [data-editor-primary],\n[data-editor-chrome] [data-editor-strip] [data-editor-primary]:hover:not(:disabled){\n  background:var(--editor-accent);border-color:var(--editor-accent);color:var(--editor-accent-ink);font-weight:600;\n}\n[data-editor-chrome] [data-editor-strip=status]{\n  display:flex;justify-content:space-between;gap:12px;margin:0;padding:6px 12px;\n  border-top:1px solid var(--editor-border);font:11px/1.4 var(--editor-font);color:var(--editor-muted);\n}\n[data-editor-chrome] [data-editor-strip=status]>*{overflow:hidden;margin:0;text-overflow:ellipsis;white-space:nowrap}\n[data-editor-chrome] [data-editor-strip=status] b{color:var(--editor-ink);font-weight:600;font-variant-numeric:tabular-nums}\n\n/* Menus. The trigger's caret is drawn, so it sits on the label's midline in every editor. */\n[data-editor-chrome] .ssr-action-menu>summary{gap:7px;border:0;font:12px/1.4 var(--editor-font);color:var(--editor-ink)}\n[data-editor-chrome] .ssr-action-menu>summary>span[aria-hidden]{\n  width:5px;height:5px;margin-top:-3px;overflow:hidden;font-size:0;opacity:.6;\n  border:solid currentColor;border-width:0 1.5px 1.5px 0;transform:rotate(45deg);\n}\n[data-editor-chrome] .ssr-action-menu:is([open],:hover)>summary{background:var(--editor-hover);border-color:transparent}\n[data-editor-chrome] .ssr-action-menu>[role=menu]{\n  background:var(--editor-raised);color:var(--editor-ink);border-color:var(--editor-border);\n  border-radius:var(--editor-control-radius);\n}\n[data-editor-chrome] .ssr-action-menu :is([role=menuitem],[role=menuitemcheckbox]){\n  color:var(--editor-ink);min-height:var(--editor-control-height);border-radius:var(--editor-control-radius);font-family:var(--editor-font);\n}\n[data-editor-chrome] .ssr-action-menu :is([role=menuitem],[role=menuitemcheckbox]):is(:hover,:focus-visible):not(:disabled){background:var(--editor-selected);outline-color:var(--editor-accent)}\n[data-editor-chrome] .cre8-document-tab:has([aria-selected=true]){border-top-color:var(--editor-accent);background:var(--editor-selected)}\n[data-editor-chrome] .cre8-document-tab>.primitive-tabs-button{border-radius:0;border:0}\n[data-editor-chrome] .cre8-document-tab-close{padding:4px;min-width:28px}\n[data-editor-chrome] [data-tab-dirty]{color:var(--editor-accent)}\n[data-editor-chrome] button[data-ssr-menu-open]{min-height:var(--editor-control-height);min-width:var(--editor-control-height)}\n@media(pointer:coarse){\n  [data-editor-chrome]{--editor-control-height:44px}\n  [data-editor-chrome] [data-editor-strip] :is(button,summary,select){min-width:44px}\n  [data-editor-chrome] .ssr-action-menu :is([role=menuitem],[role=menuitemcheckbox]){min-height:44px}\n}\n@media(prefers-reduced-motion:reduce){[data-editor-chrome] [data-editor-strip] *{scroll-behavior:auto;transition:none}}\n/* Visuals pane: the DAW's own shader picture, shown in the code column beside\n   the piano roll. Hidden exactly the way .ls-piano is, so one DAW view is\n   visible at a time. */\n.ls-visual[data-visual-workspace=trace] .ls-field-views{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;}\n.ls-visual .ls-shader-preview canvas{width:100%;aspect-ratio:16/9;border:1px solid #415c6e;box-sizing:border-box;}\n.ls-visual[data-visual-workspace=trace] .ls-field-views figcaption{min-height:0;padding:0 0 7px;font:11px ui-monospace,monospace;color:#a8c4c9;}\n@media(max-width:700px){.ls-visual[data-visual-workspace=trace] .ls-field-views{grid-template-columns:minmax(0,1fr);}}\n[data-scope-mode=plate] [data-visual-shader-only],\n[data-scope-mode=plate] .ls-shader-live,\n[data-scope-mode=plate] .ls-visual-lock{display:none!important}\n[data-plate-slot] {min-width:0;margin-top:14px}\n[data-plate-slot] .primitive-card__body {display:flex;flex-wrap:wrap;gap:12px;align-items:end}\n[data-plate-slot] .primitive-input {display:flex;flex:1 1 150px;min-width:0;flex-direction:column;gap:6px}\n[data-plate-slot] input {width:100%;min-height:36px;box-sizing:border-box}\n[data-plate-slot] input[type=checkbox] {width:auto}\n[data-plate-slot] .primitive-text {flex-basis:100%;font-size:12px;line-height:1.6;overflow-wrap:anywhere}\n[data-plate-slot] .primitive-card__title {font-size:18px}\n[data-plate-slot] .primitive-card {border:1px solid #31505b;border-radius:10px;padding:16px}\n.ls-visual{display:none}\n.ls-desk[data-workspace=daw][data-daw-view=visual] .ls-visual{display:block;order:-1;min-width:0}\n.ls-desk[data-workspace=daw][data-daw-view=visual] [data-ls-pane]{display:none!important}\n.ls-desk[data-workspace=daw] .ls-visual header{display:flex;flex-wrap:wrap;align-items:end;justify-content:start;gap:10px;margin-bottom:10px}\n.ls-desk[data-workspace=daw] .ls-visual header>div{margin-right:auto}\n.ls-desk[data-workspace=daw] .ls-visual h3{margin:4px 0}\n.ls-desk[data-workspace=daw] .ls-visual label{font-size:10px;color:#a8bfce}\n.ls-desk[data-workspace=daw] .ls-visual header select{display:block;margin-top:4px;max-width:190px}\n.ls-visual-check{display:flex!important;align-items:center;gap:6px;padding-bottom:8px}\n.ls-visual-check input{accent-color:#b8d699;margin:0}\n.ls-visual-stage{position:relative;border:1px solid #415c6e;border-radius:4px;background:#050f16;overflow:hidden}\n.ls-desk[data-workspace=daw] .ls-visual canvas{display:block;width:100%;aspect-ratio:16/9;height:auto;background:#050f16}\n.ls-visual[data-visual-ready=false] .ls-visual-stage{background:repeating-linear-gradient(135deg,#0d1c26 0,#0d1c26 12px,#132534 12px,#132534 24px)}\n.ls-visual-lock{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin:10px 0 14px;font-size:10px;color:#9db3c1}\n.ls-desk[data-workspace=daw] .ls-visual-lock output{padding:5px 9px;border:1px solid #47606b;border-radius:4px;background:#101c24;font:11px ui-monospace,monospace;color:#d7e9d9}\n.ls-visual[data-visual-live=true] .ls-visual-lock output{border-color:#7fa87c;color:#cfe9b8}\n.ls-visual-lock span{flex:1 1 240px;min-width:0}\n.ls-desk[data-workspace=daw] .ls-visual-code label{font-size:10px}\n.ls-desk[data-workspace=daw] .ls-visual-code label>span{float:right;color:#7d9aac}\n.ls-desk[data-workspace=daw] .ls-visual .ls-editor-frame{border-color:#415c6e;border-radius:4px;background:#0d1c26}\n.ls-desk[data-workspace=daw] .ls-visual .ls-editor-surface textarea{min-height:250px}\n.ls-desk[data-workspace=daw] .ls-visual .ls-gutter{background:#101f2a;color:#5c7c8c}\n.ls-visual-actions{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:10px 0}\n.ls-visual-actions a{font-size:10px;margin-left:auto}\n.ls-desk[data-workspace=daw] .ls-visual [data-visual=status]{min-height:20px;margin:4px 0;font-size:11px;color:#bcd7a8;white-space:pre-wrap}\n.ls-desk[data-workspace=daw] .ls-visual [data-visual=status][data-error=true]{color:#ffb4a6}\n.ls-visual-inputs{margin-top:14px}\n.ls-desk[data-workspace=daw] .ls-visual-inputs summary{font-size:11px}\n.ls-desk[data-workspace=daw] .ls-visual-inputs dl{display:grid;grid-template-columns:132px minmax(0,1fr);gap:3px 12px;margin:10px 0;font-size:10px}\n.ls-desk[data-workspace=daw] .ls-visual-inputs dt{color:#bcee83;font-family:ui-monospace,monospace}\n.ls-desk[data-workspace=daw] .ls-visual-inputs dd{margin:0;color:#a0b7c6}\n.ls-desk[data-workspace=daw] .ls-visual>p{font-size:11px}\n@media(max-width:800px){.ls-desk[data-workspace=daw] .ls-visual-inputs dl{grid-template-columns:minmax(0,1fr)}.ls-desk[data-workspace=daw] .ls-visual-inputs dd{margin-bottom:6px}.ls-visual-actions a{margin-left:0}}\n/* Scope controls belong to the shared Visuals pane and wrap within narrow desks. */\n.ls-scope-controls { display:flex; flex-wrap:wrap; align-items:center; gap:12px; padding:12px; background:#091a22; border:1px solid #29434a; border-radius:8px; }\n.ls-scope-controls[hidden] { display:none; }\n.ls-scope-controls label { display:flex; align-items:center; gap:6px; font-size:12px; }\n.ls-scope-controls input[type=range] { width:100px; }\n.ls-scope-controls output { flex-basis:100%; color:#86dfb8; font:12px monospace; }\n.ls-visual[data-scope-mode]:not([data-scope-mode=\"shader\"]) [data-visual-shader-only] { display:none!important; }\n.ls-sound-source { display:block; margin:0 0 12px; color:var(--text-muted,#a6b7c3); font-size:12px; }\n.ls-field-experiment { display:flex; flex-wrap:wrap; align-items:center; gap:8px; margin:12px 0 8px; }\n.ls-field-experiment label { display:flex; align-items:center; gap:8px; }\n.ls-field-panel .ls-field-save-help { font-size:12px; opacity:.75; margin:4px 0; }\n.ls-field-panel [data-field-saved] { display:block; font-size:12px; margin:4px 0 12px; }\n.ls-visual-surfaces { display:flex; gap:4px; padding:4px; border:1px solid #35505a; border-radius:8px; }\n.ls-visual-surfaces button[aria-pressed=true] { background:#234b43!important; border-color:#8bcfb5!important; color:#e2fff1!important; }\n.ls-shader-trace { display:flex; flex-wrap:wrap; align-items:center; gap:12px; padding:10px 0; }\n.ls-shader-trace output { flex:1 1 320px; color:#a8bfce; font-size:11px; }\n.ls-shader-live { display:flex; flex-wrap:wrap; align-items:center; gap:12px; margin-bottom:12px; padding:10px; border:1px solid #35505a; border-radius:6px; }\n.ls-shader-live label { display:flex; align-items:center; gap:6px; }\n.ls-shader-live input[type=range] { width:100px; }\n.ls-shader-live output { flex:1 1 320px; color:#a8bfce; font-size:11px; }\n.ls-visual[data-live-shader=true] .ls-shader-live { border-color:#8bcfb5; }\n.ls-scope-controls { display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1fr); margin-top:12px; align-items:start; }\n.ls-scope-section { display:flex; flex-wrap:wrap; gap:12px; min-width:0; margin:0; padding:12px; border:1px solid #35505a; border-radius:6px; }\n.ls-scope-section legend { color:#e1f0df; font-size:12px; padding:0 6px; }\n.ls-scope-section p,.ls-scope-fields p { flex-basis:100%; margin:0; font-size:11px; line-height:1.5; color:#9eb6c2; }\n.ls-scope-controls>output,.ls-scope-midi { grid-column:1/-1; }\n.ls-scope-controls select { max-width:100%; }\n.ls-scope-spatial { flex-basis:100%; }\n.ls-scope-fields { display:flex; flex-wrap:wrap; gap:12px; padding:12px 0; }\n.ls-spectrum-controls { grid-column:1/-1; }\n.ls-spectrum-controls[hidden],.ls-scope-fields[hidden] { display:none; }\n.ls-spectrum-controls input[type=file] { max-width:100%; width:240px; }\n[data-theremini-mapping] input[type=number] { width:76px; }\n.ls-visual[data-scope-mode=spectrum] .ls-scope-section:first-child>label:not(:first-of-type),\n.ls-visual[data-scope-mode=spectrum] .ls-scope-section:first-child>.ls-scope-spatial { display:none; }\n.ls-scope-controls summary { cursor:pointer; color:#b8d9cc; font-size:12px; }\n.ls-field-panel { margin:0 0 12px; padding:16px; border:1px solid #538a7b; border-radius:10px; background:linear-gradient(120deg,#102d2b,#101f2b); }\n.ls-field-panel[hidden] { display:none; }\n.ls-field-heading,.ls-field-actions { display:flex; flex-wrap:wrap; align-items:center; gap:12px; }\n.ls-field-heading h4 { margin:4px 0; font-size:18px; color:#dcfff0; }\n.ls-field-panel p { flex:1 1 240px; margin:0; color:#adc6cb; font-size:12px; line-height:1.5; }\n.ls-field-presets { display:flex; flex-wrap:wrap; gap:6px; margin:12px 0; }\n.ls-field-presets [aria-pressed=true],.ls-visual[data-field-active=true] [data-field-open] { background:#234b43!important; border-color:#8bcfb5!important; color:#e2fff1!important; }\n.ls-field-knobs { display:grid; grid-template-columns:repeat(auto-fit,minmax(180px,1fr)); gap:16px; margin:16px 0; }\n.ls-desk[data-workspace=daw] .ls-field-knobs label { display:grid; grid-template-columns:1fr auto; gap:7px; font-size:12px; }\n.ls-field-knobs input { grid-column:1; grid-row:2; width:100%; min-width:0; }\n.ls-field-knobs output { grid-column:2; grid-row:2; min-width:42px; color:#9df4ca; font:12px ui-monospace,monospace; }\n.ls-field-play{display:grid;grid-template-columns:minmax(0,1.2fr) minmax(180px,1fr);gap:20px;align-items:center;margin:16px 0;}\n.ls-field-play .ls-field-knobs{grid-template-columns:1fr;margin:0;gap:12px;}\n.ls-field-pad-wrap{min-width:0;}\n.ls-field-pad-wrap .ls-field-pad{position:relative;display:block;width:100%;height:160px;padding:0;overflow:hidden;touch-action:none;user-select:none;cursor:crosshair;border:1px solid #547b80;border-radius:9px;background:radial-gradient(ellipse at center,#163c45,#071b25);}\n.ls-field-pad:focus-visible{outline:2px solid #adf7cf;outline-offset:3px;}\n.ls-field-pad svg{position:absolute;inset:0;width:100%;height:100%;pointer-events:none;}\n.ls-field-pad path{stroke:#578087;stroke-dasharray:3 5;fill:none;}\n.ls-field-pad circle{fill:#c7ffe3;stroke:#65dda7;stroke-width:2;}\n.ls-field-pad span{position:absolute;color:#b1d2d6;font:10px ui-monospace,monospace;pointer-events:none;}\n.ls-field-pad-x{bottom:8px;right:10px;}.ls-field-pad-y{top:8px;left:10px;}\n.ls-field-pad-wrap p{font-size:11px;margin-top:7px;}\n.ls-field-gesture{border-top:1px solid #35545c;padding-top:14px;margin:14px 0;}\n.ls-field-gesture-actions{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:8px 0;}\n.ls-field-gesture-actions label{display:flex;align-items:center;gap:6px;font-size:12px;}\n.ls-field-gesture-actions input{width:90px;}.ls-field-gesture-actions select{max-width:230px;}\n.ls-field-gesture output{display:block;font-size:12px;color:#a4e4cd;min-height:20px;margin:10px 0;}\n.ls-field-gesture details{margin:10px 0;}.ls-field-gesture summary{cursor:pointer;font-size:12px;color:#d0e6e3;}\n.ls-field-gesture svg{display:block;width:100%;height:100px;background:#071b25;margin:10px 0;border-radius:6px;}\n.ls-field-gesture path{fill:none;stroke-width:1.5;vector-effect:non-scaling-stroke;}\n[data-field-gesture-curve=xw]{stroke:#86ebc0;}[data-field-gesture-curve=xy]{stroke:#87baf5;}[data-field-gesture-curve=interaction]{stroke:#e6b978;}\n.ls-field-gesture line{stroke:#fff;stroke-width:1;opacity:.65;vector-effect:non-scaling-stroke;}\n.ls-field-gesture .ls-field-gesture-legend{display:flex;gap:15px;font-size:10px;}\n.ls-field-gesture-legend span:nth-child(1){color:#86ebc0;}.ls-field-gesture-legend span:nth-child(2){color:#87baf5;}.ls-field-gesture-legend span:nth-child(3){color:#e6b978;}\n@media(max-width:650px){.ls-field-play{grid-template-columns:minmax(0,1fr);}}\n.ls-visual[data-field-active=true]:not([data-live-shader=true]) .ls-shader-live { display:none; }\n@media(max-width:800px){.ls-scope-controls{grid-template-columns:minmax(0,1fr)}.ls-scope-controls label{flex-wrap:wrap}.ls-visual-surfaces{width:100%}.ls-visual-surfaces button{flex:1}}\n\n[data-spectrum-slot] .primitive-card__body{display:flex;flex-wrap:wrap;align-items:center;gap:14px}\n[data-spectrum-slot] .primitive-input{display:flex;flex-direction:column;gap:6px;min-width:150px}\n[data-spectrum-slot] .primitive-input input[type=file]{max-width:240px}\n[data-spectrum-slot] .primitive-text{flex-basis:100%}\n[data-spectrum-slot] .primitive-card{padding:16px;border:1px solid #31505b;border-radius:8px}\n[data-spectrum-slot] .primitive-card h3{font-size:14px}\n[data-spectrum-slot] [data-cre8-host-ready=false]{opacity:.8}\n\n[data-spectrum-slot]{flex-basis:100%;min-width:0}\n[data-spectrum-slot] .primitive-card__title{font-size:14px}\n\n[data-cre8-host-component=\"virtual.shader-studio\"] {min-width:0;}\n[data-cre8-host-component=\"virtual.shader-studio\"] > .primitive-card > .primitive-card__body {display:flex;flex-wrap:wrap;gap:12px;align-items:center;}\n[data-cre8-host-component=\"virtual.shader-studio\"] .ssr-code-editor {flex-basis:100%;width:100%;min-width:0;}\n[data-cre8-host-component=\"virtual.shader-studio\"] .primitive-text,\n[data-cre8-host-component=\"virtual.shader-studio\"] .primitive-card {flex-basis:100%;min-width:0;overflow-wrap:anywhere;}\n[data-cre8-host-component=\"virtual.shader-studio\"] .primitive-select {min-width:160px;}\n\n/* Workspace panels share a canvas and one instrument transport. */\n.ls-field-views{display:grid;grid-template-columns:minmax(0,1fr);gap:14px;margin:12px 0;}\n.ls-visual[data-field-active=true] .ls-field-views{grid-template-columns:repeat(2,minmax(0,1fr));}\n.ls-field-views figure{margin:0;min-width:0;}\n.ls-field-views figcaption{display:flex;flex-direction:column;gap:3px;min-height:48px;font-size:13px;color:#def5ef;}\n.ls-field-views figcaption span{font-size:11px;color:#9cb7c4;}\n.ls-field-geometry svg{display:block;width:100%;aspect-ratio:1;background:#071720;border:1px solid #35505a;border-radius:6px;box-sizing:border-box;}\n.ls-field-geometry [data-field-axes] line{stroke:#344d5a;stroke-dasharray:3 4;}\n.ls-field-geometry [data-field-axes] text{fill:#9db7c4;font:11px ui-monospace,monospace;}\n.ls-field-geometry label{display:flex;flex-wrap:wrap;align-items:center;gap:8px;font-size:11px;margin:12px 0 8px;}\n.ls-field-geometry input{flex:1;min-width:100px;}\n.ls-field-geometry output{display:block;font:11px/1.7 ui-monospace,monospace;color:#c6e1dd;overflow-wrap:anywhere;}\n.ls-field-views p{font-size:11px;color:#9eb8c3;line-height:1.5;margin:8px 0;}\n.ls-field-legend{display:flex;align-items:center;gap:8px;margin-top:8px;font:10px ui-monospace,monospace;color:#aec6d0;}\n.ls-field-color-key{flex:1;height:5px;border-radius:4px;background:linear-gradient(90deg,hsl(210 85% 67%),hsl(122.5 85% 67%),hsl(35 85% 67%));}\n.ls-visual[data-field-active=true] .ls-field-sound .ls-visual-stage{aspect-ratio:1;}\n.ls-visual[data-field-active=true] .ls-field-sound canvas{display:block;width:100%;height:100%;aspect-ratio:1;}\n@media(max-width:800px){.ls-visual[data-field-active=true] .ls-field-views{grid-template-columns:minmax(0,1fr);}}\n.ls-visual [data-visual-for][hidden] {display:none!important;}\n.ls-visual-workspaces {display:flex;flex-wrap:wrap;gap:4px;width:100%;}\n.ls-visual-workspaces>button[aria-pressed=true]{background:#234b43!important;border-color:#8bcfb5!important;color:#e2fff1!important;}\n.ls-visual-workspaces>div>span {display:block;margin:0 0 6px;color:#8faeae;font-size:11px;}\n.ls-visual-workspaces .ls-visual-surfaces {width:auto;}\n.ls-visual-workspaces .ls-visual-surfaces button {flex:1;min-width:0;}\n.ls-workspace-description {color:#a8c4c9;line-height:1.5;margin:4px 0 14px;}\n.ls-instrument-bar {display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:12px;margin-bottom:12px;border:1px solid #35505a;border-radius:8px;background:#102329;}\n.ls-instrument-bar label {display:flex;align-items:center;gap:8px;}\n.ls-instrument-bar input[type=range] {width:120px;}\n.ls-instrument-bar p,.ls-instrument-bar output {flex-basis:100%;margin:0;color:#a8c4c9;font-size:11px;}\n.ls-visual>[data-visual-for=\"geometry\"] {margin-bottom:12px;}\n.ls-scope-controls {display:block;}\n.ls-scope-controls>output {display:block;margin-bottom:10px;}\n.ls-scope-controls details,.ls-shader-sound {margin-top:12px;}\n.ls-display-settings>summary,.ls-shader-sound>summary {cursor:pointer;color:#bed6cf;font-size:12px;padding:8px 0;}\n.ls-shader-sound {padding:0 12px;border:1px solid #35505a;border-radius:8px;}\n.ls-visual .ls-shader-sound .ls-shader-live {display:flex;}\n.ls-shader-editor,.ls-visual-help{margin-top:12px;border-top:1px solid #35505a;padding-top:8px;}\n.ls-shader-editor>summary,.ls-visual-help>summary{cursor:pointer;color:#bed6cf;font-size:12px;padding:6px 0;}\n.ls-visual-help{font-size:12px;color:#9eb6c2;}\n.ls-visual output:empty{display:none;}\n@media(max-width:600px){.ls-visual-workspaces{grid-template-columns:minmax(0,1fr);}.ls-instrument-bar label{flex-wrap:wrap;}}\n\n.ls-field-arrangement { margin:12px 0; padding:12px; border:1px solid #538a7b; border-radius:8px; }\n.ls-field-arrangement svg { display:block; width:100%; height:90px; margin:12px 0 6px; background:#091a22; }\n.ls-field-arrangement path { fill:none; stroke-width:1.5; vector-effect:non-scaling-stroke; }\n[data-field-arrangement-curve=xw] { stroke:#83dfb1; }\n[data-field-arrangement-curve=xy] { stroke:#81bfff; }\n[data-field-arrangement-curve=interaction] { stroke:#efbb84; }\n[data-field-arrangement-playhead] { stroke:#fff; stroke-width:1; }\n.ls-field-arrangement>label { display:flex; align-items:center; gap:12px; }\n.ls-field-arrangement input[type=range] { flex:1; min-width:0; }\n.ls-field-arrangement select { max-width:100%; }\n.ls-field-arrangement output { display:block; margin:8px 0; font:12px ui-monospace,monospace; color:#dcfff0; }\n\n.ls-field-arrangement .ls-field-gesture-legend { display:flex; gap:16px; margin:6px 0 10px; }\n.ls-field-arrangement .ls-field-gesture-legend span:nth-child(1) { color:#83dfb1; }\n.ls-field-arrangement .ls-field-gesture-legend span:nth-child(2) { color:#81bfff; }\n.ls-field-arrangement .ls-field-gesture-legend span:nth-child(3) { color:#efbb84; }\n\n/* Portable arrangement controls share the compact instrument layout. */\n.ls-field-arrangement .primitive-card {background:transparent;border:0;box-shadow:none;padding:0;}\n.ls-field-arrangement .primitive-card__header {padding:0 0 12px;border:0;}\n.ls-field-arrangement .primitive-card__title {font-size:16px;margin:0;}\n.ls-field-arrangement .primitive-card__body {display:flex;flex-wrap:wrap;gap:12px;align-items:end;padding:0;}\n.ls-field-arrangement .primitive-input,.ls-field-arrangement .primitive-select {flex:1 1 180px;min-width:0;}\n.ls-field-arrangement .primitive-checkbox {flex-basis:100%;}\n.ls-field-arrangement .primitive-checkbox__label {justify-content:flex-start;gap:8px;}\n.ls-field-arrangement .primitive-checkbox__text {flex:none;}\n.ls-field-arrangement .primitive-input__control,.ls-field-arrangement .primitive-select__control {width:100%;box-sizing:border-box;}\n.ls-field-arrangement .primitive-text {flex-basis:100%;font-size:12px;line-height:1.6;}\n.ls-field-arrangement [role=status] {color:#dcfff0;}\n/* Scene pads share the DAW transport and author ordinary track clips. */\n.ls-scene-performance{display:none}\n.ls-desk[data-workspace=daw][data-daw-view=perform] .ls-code,.ls-desk[data-workspace=daw][data-daw-view=perform] .ls-daw-library,.ls-desk[data-workspace=daw][data-daw-view=perform] .ls-channel-rack,.ls-desk[data-workspace=daw][data-daw-view=perform] [data-daw-mixer]{display:none}\n.ls-desk[data-workspace=daw][data-daw-view=perform] .ls-scene-performance{display:block;grid-column:1/-1;grid-row:5;min-width:0;min-height:0;overflow:auto;padding:28px;background:radial-gradient(ellipse at top right,color-mix(in srgb,var(--daw-accent) 14%,var(--daw-bg)),var(--daw-bg) 70%)}\n.ls-scene-performance h2{font-size:30px!important;margin:8px 0!important}\n.ls-scene-performance>p{max-width:720px;color:var(--daw-soft)}\n.ls-scene-setup,.ls-scene-actions{display:flex;gap:8px;flex-wrap:wrap;margin:20px 0}\n.ls-scene-pads{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin:24px 0}\n.ls-desk .ls-scene-pads button{min-height:136px;text-align:left;padding:20px;border:1px solid var(--daw-border-strong);border-top:4px solid var(--daw-accent);background:color-mix(in srgb,var(--daw-accent) 12%,var(--daw-panel));font-size:20px;white-space:normal;overflow-wrap:anywhere}\n.ls-desk .ls-scene-pads button:nth-child(2){border-top-color:#dcb98e;background:color-mix(in srgb,#dcb98e 14%,var(--daw-panel))}\n.ls-desk .ls-scene-pads button:nth-child(3){border-top-color:#aebbe8;background:color-mix(in srgb,#aebbe8 14%,var(--daw-panel))}\n.ls-scene-pads button::after{content:attr(data-state);display:block;font:11px system-ui;text-transform:uppercase;letter-spacing:.12em;margin-top:24px;color:var(--daw-muted)}\n.ls-scene-pads button[aria-pressed=true]{outline:2px solid var(--daw-accent);outline-offset:3px}\n.ls-scene-pads button[data-state=playing]::after{color:var(--daw-ink);font-weight:700}\n.ls-scene-pads button[data-state=queued]::after{color:light-dark(#8a4b00,#ffd29c)}\n.ls-scene-hint{font-size:11px;line-height:1.6}\n.ls-scene-performance [role=status]{padding:12px 0;border-top:1px solid var(--daw-border-strong);min-height:44px}\n@media(max-width:560px){.ls-desk[data-workspace=daw][data-daw-view=perform] .ls-scene-performance{grid-column:1;padding:18px}.ls-scene-pads{gap:8px}.ls-desk .ls-scene-pads button{padding:10px;font-size:15px;min-height:118px}}\n.ls-waveform{display:none;min-width:0;outline-offset:3px}\n.ls-waveform [data-audio=insert-panel]>h4,.ls-waveform [data-audio=insert-panel]>p,.ls-waveform [data-audio=insert-panel]>output{flex-basis:100%;margin:0}\n.ls-waveform [data-audio=insert-panel] label{flex-wrap:wrap;max-width:100%}.ls-waveform [data-audio=insert-panel] input,.ls-waveform [data-audio=insert-panel] select{min-width:0;max-width:100%;box-sizing:border-box}\n.ls-waveform [data-insert=status][data-error=true]{color:var(--cre8-view-danger,#ffb4a6)}\n.ls-desk[data-workspace=daw][data-daw-view=waveform] .ls-waveform{display:block;order:-1}\n.ls-desk[data-workspace=daw][data-daw-view=waveform] [data-ls-pane],.ls-desk[data-workspace=daw][data-daw-view=waveform] .ls-draft-bar{display:none!important}\n.ls-waveform header{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}.ls-waveform h3{margin:3px 0;font-size:20px}.ls-waveform output{font:11px/1.5 ui-monospace,monospace;overflow-wrap:anywhere;color:var(--daw-soft)}\n.ls-wave-tools,.ls-wave-selection{display:flex;gap:6px;flex-wrap:wrap;align-items:center;margin:12px 0}.ls-waveform label{display:flex;gap:5px;align-items:center;font-size:11px;color:var(--daw-soft)}.ls-waveform input[type=checkbox]{width:auto}.ls-waveform input[type=number]{width:105px!important;box-sizing:border-box}.ls-wave-selection label{flex-direction:column;align-items:flex-start}.ls-waveform input[data-wave=db]{width:65px!important}\n.ls-waveform canvas{display:block;box-sizing:border-box;width:100%;height:280px;background:var(--daw-well);border:1px solid var(--daw-border-strong);border-radius:6px;touch-action:none;cursor:crosshair}.ls-waveform canvas:focus-visible{outline:2px solid var(--daw-accent);outline-offset:3px}\n.ls-waveform input[data-wave=scroll]{display:block;width:100%;margin:8px 0;accent-color:var(--daw-accent)}.ls-waveform [data-wave=status]{min-height:18px;color:var(--daw-soft)}.ls-waveform [data-wave=status][data-error=true]{color:var(--cre8-view-danger,#ffb4a6)}.ls-waveform details{font-size:11px;color:var(--daw-muted)}.ls-waveform [aria-busy=true]{opacity:.65}\n@media(max-width:560px){.ls-wave-tools button{min-height:40px}.ls-waveform canvas{height:250px}.ls-wave-selection{gap:8px}.ls-waveform header output{flex-basis:100%}}\n.ls-audio-timeline{margin:20px 0;padding:16px 0;border-top:1px solid var(--daw-border-strong);border-bottom:1px solid var(--daw-border-strong)}.ls-audio-track{border:1px solid var(--daw-border);border-radius:6px;margin:10px 0;padding:8px;min-width:0}.ls-audio-track .ls-wave-tools{margin:0 0 8px}.ls-audio-track input[data-track=pan]{width:85px}.ls-audio-lane{position:relative;height:68px;background:repeating-linear-gradient(90deg,var(--daw-well) 0%,var(--daw-well) 9.9%,var(--daw-border-strong) 10%);overflow:hidden}.ls-desk[data-workspace=daw] .ls-audio-lane button{position:absolute;top:4px;height:60px;min-width:3px;overflow:hidden;padding:3px;border:1px solid var(--daw-accent);background:color-mix(in srgb,var(--daw-accent) 45%,#06130f);color:#e5f3de;text-align:left;touch-action:none;cursor:grab;white-space:nowrap}.ls-desk[data-workspace=daw] .ls-audio-lane button[aria-pressed=true]{border:2px solid var(--daw-ink);background:color-mix(in srgb,var(--daw-accent) 70%,#06130f)}.ls-audio-lane canvas{position:absolute;inset:18px 0 0;width:100%;height:38px;border:0;border-radius:0;pointer-events:none;background:transparent}.ls-waveform select{max-width:260px}.ls-waveform input[data-audio=name],.ls-waveform input[data-track=name]{width:170px;max-width:100%}.ls-waveform [data-audio=record-status]{max-width:440px}.ls-waveform meter{width:110px}.ls-waveform [data-audio=save-status][data-error=true]{color:var(--cre8-view-danger,#ffb4a6)}.ls-waveform .ls-audio-timeline p{font-size:11px;color:var(--daw-muted)}\n.ls-audio-playhead{position:absolute;top:0;height:100%;width:2px;background:var(--daw-accent);pointer-events:none;z-index:2}\n.ls-wave-generator{border:1px solid var(--daw-border-strong);border-radius:6px;padding:12px;margin:16px 0}.ls-wave-generator summary{font-size:13px;color:var(--daw-ink);cursor:pointer}.ls-wave-generator [hidden]{display:none!important}.ls-wave-generator label{flex-direction:column;align-items:flex-start}.ls-wave-generator [data-audio=generator-status][data-error=true]{color:var(--cre8-view-danger,#ffb4a6)}\n.ls-wave-geometry{min-width:0}.ls-wave-geometry p{max-width:72ch}.ls-wave-geometry [data-audio=generator-projection]{color:var(--daw-soft);max-width:640px}.ls-wave-geometry svg{display:block;width:100%;height:auto}.ls-wave-geometry .ls-wave-tools>div{min-width:0}\n.ls-wave-geometry{border:1px solid var(--daw-border-strong);border-radius:8px;padding:16px;margin:12px 0;background:var(--daw-panel)}.ls-wave-geometry h4{margin:0 0 6px;font-size:16px;color:var(--daw-ink)}.ls-wave-geometry-intro{margin:0 0 16px;color:var(--daw-soft)}.ls-wave-geometry-grid{display:grid;grid-template-columns:minmax(240px,1fr) minmax(260px,1.2fr);gap:20px;align-items:start}.ls-wave-geometry-controls>.ls-wave-tools{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin:0}.ls-wave-geometry-controls label{display:flex;gap:6px;min-width:0}.ls-wave-geometry-controls select,.ls-wave-geometry-controls input{box-sizing:border-box;width:100%;max-width:100%;min-width:0}.ls-wave-geometry-summary{padding:12px;border-left:3px solid var(--daw-accent);background:color-mix(in srgb,var(--daw-accent) 12%,var(--daw-panel));color:var(--daw-ink);font-size:12px;line-height:1.6}.ls-wave-geometry-visual{border:1px solid var(--daw-border);border-radius:6px;padding:8px 12px}.ls-wave-geometry-visual .ls-wave-tools{margin:6px 0;align-items:center}.ls-wave-geometry-visual p{font-size:11px;color:var(--daw-soft);flex:1;min-width:150px;margin:0}.ls-wave-geometry-help{border-top:1px solid var(--daw-border);padding-top:12px;margin-top:12px}.ls-wave-geometry-help p{font-size:12px;color:var(--daw-soft);line-height:1.6}.ls-wave-generator [data-audio-action=generate-wave]{background:var(--daw-accent);color:var(--daw-accent-ink);border-color:var(--daw-accent);font-weight:700}.ls-wave-generator [data-audio-action=generate-wave]:disabled{opacity:.45}.ls-wave-generator button:focus-visible,.ls-wave-generator summary:focus-visible,.ls-wave-generator input:focus-visible,.ls-wave-generator select:focus-visible{outline:2px solid var(--daw-accent);outline-offset:3px}@media(max-width:1050px){.ls-wave-geometry-grid{grid-template-columns:minmax(0,1fr)}.ls-wave-geometry-visual{max-width:600px}}@media(max-width:440px){.ls-wave-geometry-controls>.ls-wave-tools{grid-template-columns:minmax(0,1fr)}.ls-wave-geometry{padding:12px}}\n.ls-wave-geometry-controls>.ls-wave-tools>.primitive-select,.ls-wave-geometry-controls>.ls-wave-tools>.primitive-input{display:flex;flex-direction:column;gap:6px;min-width:0}\n.ls-desk .ls-waveform .ls-wave-generator button[data-audio-action=generate-wave]{background:var(--daw-accent);color:var(--daw-accent-ink);border-color:var(--daw-accent)}\n.ls-wave-analysis{border:1px solid var(--daw-border-strong);border-radius:6px;padding:12px;margin:12px 0}.ls-wave-analysis summary,.ls-spectrum-settings summary{cursor:pointer;color:var(--daw-ink)}.ls-waveform canvas[data-spectrum=plot]{height:220px;margin-top:12px;cursor:default;touch-action:auto}.ls-waveform canvas[hidden]{display:none!important}.ls-spectrum-results{max-width:100%;overflow:auto}.ls-spectrum-results table{width:100%;border-collapse:collapse;margin-top:12px;font-size:11px}.ls-spectrum-results th,.ls-spectrum-results td{padding:8px;text-align:left;border-bottom:1px solid var(--daw-border);vertical-align:top}.ls-spectrum-results td:last-child{min-width:180px}.ls-spectrum-settings{flex:1}.ls-spectrum-settings label{flex-direction:column;align-items:flex-start}\n.ls-audio-automation { margin-top: 1rem; padding: 1rem; border: 1px solid var(--daw-border); border-radius: 8px; background: var(--daw-panel); }\n.ls-automation-controls { display: flex; flex-wrap: wrap; align-items: end; gap: .65rem; }\n.ls-automation-controls input, .ls-automation-controls select { max-width: 16rem; }\n.ls-automation-curve { display: block; width: 100%; height: 140px; margin-top: 1rem; border: 1px solid var(--daw-border-strong); border-radius: 4px; background: var(--daw-well); cursor: crosshair; }\n/* Editor layout. The template lists controls by owner; this orders them as an editor: project, one wrapping toolbar row, the audio view with its selection and status, quick processing, tool panels, then the project mix. */\n.ls-desk[data-workspace=daw][data-daw-view=waveform] .ls-daw-library{display:none}\n.ls-desk[data-workspace=daw][data-daw-view=waveform] .ls-code{grid-column:1/-1}\n.ls-desk[data-workspace=daw][data-daw-view=waveform] .ls-waveform{display:flex;flex-wrap:wrap;align-items:center;gap:8px}\n.ls-waveform>*{flex:1 1 100%;min-width:0;margin:0;order:20}\n.ls-desk .ls-waveform>details{margin:0}\n.ls-waveform>header{order:0}\n.ls-waveform>[aria-label=\"Audio project\"]{order:1;padding-bottom:8px;border-bottom:1px solid var(--daw-border)}\n.ls-waveform>[aria-label=\"Waveform files\"]{order:2}\n.ls-waveform>[aria-label=\"Waveform transport and navigation\"]{order:3}\n.ls-waveform>[aria-label=\"Waveform edits\"]{order:4}\n.ls-waveform>[aria-label=\"Waveform display\"]{order:5}\n.ls-waveform>[data-spectrum=display-status]{order:6;flex:1 1 220px;color:var(--daw-muted)}\n.ls-waveform>canvas{order:7;max-width:100%}\n.ls-waveform>.primitive-input:has(>[data-wave=scroll]){order:8}\n.ls-waveform>.ls-wave-selection{order:9}\n.ls-waveform>[data-wave=status]{order:10;padding:7px 10px;border-left:3px solid var(--daw-accent);border-radius:0 4px 4px 0;background:color-mix(in srgb,var(--daw-accent) 10%,var(--daw-panel));font-size:12px}\n.ls-waveform>[data-wave=status][data-error=true]{border-left-color:var(--cre8-view-danger,#ff907f)}\n.ls-waveform>[aria-label=\"Waveform processing\"]{order:11}\n.ls-waveform>.ls-wave-analysis{order:12}\n.ls-waveform>.ls-wave-generator{order:13}\n.ls-waveform>details:has([data-audio=device]){order:14}\n.ls-waveform>.ls-wave-process{order:15}\n.ls-waveform>.ls-audio-timeline{order:30}\n.ls-waveform>[data-audio=song-panel]{order:31}\n.ls-waveform>[data-audio=insert-panel]{order:32}\n.ls-waveform>details:last-child{order:40}\n.ls-waveform>.ls-wave-tools[role=group]{flex:0 1 auto;gap:4px;padding:5px;border:1px solid var(--daw-border);border-radius:6px;background:var(--daw-panel)}\n.ls-waveform>[aria-label=\"Audio project\"].ls-wave-tools,.ls-waveform>[aria-label=\"Waveform processing\"].ls-wave-tools{flex:1 1 100%;padding:0 0 8px;border-width:0 0 1px;border-radius:0;background:none}\n.ls-waveform>[aria-label=\"Waveform processing\"].ls-wave-tools{padding:0;border:0}\n.ls-waveform>.ls-wave-tools[role=group] .primitive-input,.ls-waveform>.ls-wave-tools[role=group] .primitive-select{display:flex;flex-direction:row;margin:0;align-items:center;gap:6px}\n.ls-waveform>.ls-wave-tools[role=group] .primitive-input__label,.ls-waveform>.ls-wave-tools[role=group] .primitive-select__label{margin:0;white-space:nowrap}\n.ls-waveform>.ls-wave-tools button:disabled,.ls-waveform>.ls-wave-selection button:disabled{opacity:.4}\n.ls-waveform [data-wave-action=play]:not(:disabled){background:var(--daw-accent);color:var(--daw-accent-ink);border-color:var(--daw-accent)}\n.ls-waveform>.primitive-input:has(>[data-wave=scroll])>label{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}\n.ls-waveform>.primitive-input:has(>[data-wave=scroll]) input{margin:0}\n.ls-waveform>.primitive-input:has(>[data-wave=scroll]:disabled){display:none}\n.ls-waveform>.ls-wave-selection{align-items:flex-end}\n.ls-waveform>details{flex:1 1 calc(50% - 4px);align-self:flex-start;box-sizing:border-box;padding:0;border:1px solid var(--daw-border);border-radius:6px;background:var(--daw-panel)}\n.ls-waveform>details[open]{flex-basis:100%;padding-bottom:12px}\n.ls-waveform>details>summary{padding:9px 12px;font-size:12px;font-weight:600;color:var(--daw-ink);cursor:pointer}\n.ls-waveform>details>summary:hover{background:var(--daw-control-hi)}\n.ls-waveform>details>:not(summary){margin-left:12px;margin-right:12px}\n.ls-waveform>.ls-audio-timeline,.ls-waveform>[data-audio=song-panel],.ls-waveform>[data-audio=insert-panel]{box-sizing:border-box;margin-top:8px;padding:14px;border:1px solid var(--daw-border);border-radius:6px;background:var(--daw-panel)}\n.ls-waveform>.ls-audio-timeline h3,.ls-waveform>[data-audio=song-panel] h4,.ls-waveform>[data-audio=insert-panel] h4{margin:0 0 6px;font-size:14px}\n.ls-waveform>.ls-audio-timeline>header{margin-bottom:10px}\n.ls-waveform>[data-audio=song-panel]{display:flex;flex-wrap:wrap;align-items:center;gap:6px}\n.ls-waveform>[data-audio=song-panel]>:is(h4,p,output){flex-basis:100%;margin:0}\n/* Tracks come first; the native-effect companion follows the clip and automation tools. */\n.ls-waveform>.ls-audio-timeline{display:flex;flex-direction:column}\n.ls-audio-timeline>.ls-native-effects{order:1;margin-top:14px;padding-top:12px;border-top:1px solid var(--daw-border)}\n.ls-audio-timeline>.ls-quiet-help{order:2}\n/* Clip, native-effect and automation controls act on audio tracks, so they wait for the first one. */\n.ls-audio-timeline:has(>[data-audio=tracks]:empty)>:is(.ls-native-effects,[aria-label=\"Selected audio clip\"],.ls-audio-automation){display:none}\n.ls-audio-timeline>[data-audio=tracks]:empty::before{content:\"No audio tracks yet. Select a range in the waveform, then Add selection as track.\";display:block;padding:14px;border:1px dashed var(--daw-border-strong);border-radius:6px;font-size:11px;color:var(--daw-muted)}\n/* Before any audio is loaded only the ways to get audio in are offered. */\n.ls-waveform[data-wave-empty=true]>:is([aria-label=\"Waveform transport and navigation\"],[aria-label=\"Waveform edits\"],[aria-label=\"Waveform display\"],[aria-label=\"Waveform processing\"],[data-spectrum=display-status],.ls-wave-selection,.ls-wave-analysis,.ls-wave-process){display:none}\n.ls-waveform[data-wave-empty=true]>canvas{height:180px;cursor:default}\n@media(max-width:700px){.ls-waveform>details{flex-basis:100%}}\n</style>"},"tag":"RawHtml"},{"children":[{"children":[],"kind":"view-node","props":{"html":"<script type=\"application/json\" data-ls=\"presets\">{\n  \"pulse\": \"// Pulse engine · x is a hit, X is an accent\\ntempo 124\\nbars 2\\ninstrument bass saw_bass\\ninstrument arp bell\\nlevel reverb 0.25\\n\\npattern kick X...x...X...x... 0 8 0.8\\npattern snare ....x.......x... 0 8 0.65\\npattern hat ..x...x...x...x. 0 8 0.35\\nsequence bass C2,-,C2,G2,A#1,-,G2,- 0 8 0.65 0.7\\nsequence arp C4,D#4,G4,A#4,G4,D#4,C4,G3 0 8 0.45 0.45\\n\",\n  \"drift\": \"// Drift · long gates and soft space\\ntempo 72\\nbars 4\\ninstrument pads warm_pad\\ninstrument melody bell\\nlevel drums 0.45\\nlevel reverb 0.55\\n\\nsequence pads C3,D#3,G3,A#2 0 16 0.95 0.5\\nsequence melody G4,-,D#4,-,A#4,G4,-,D#4 0 16 0.6 0.5\\npattern kick x.......x....... 0 16 0.7\\npattern hat ..x...x...x...x. 0 16 0.3\\n\",\n  \"composer\": \"// Composer seed → editable score\\ntempo 110\\nbars 4\\ncompose house 7\\nclear bass\\ninstrument bass saw_bass\\nsequence bass C2,-,G2,-,A#1,-,G2,C2 0 16 0.75 0.8\\nlevel reverb 0.3\\n\",\n  \"console\": \"// Console · the same notes through inserts and sends\\ntempo 118\\nbars 2\\nkit house\\ninstrument bass saw_bass\\ninstrument arp bell\\n\\npattern kick x...x...x...x... 0 8 0.85\\npattern hat ..x...x...x...x. 0 8 0.3\\nsequence bass C2,-,G2,-,A#1,-,G2,- 0 8 0.7 0.75\\nsequence arp C4,D#4,G4,A#4 0 8 0.4 0.4\\n\\npan arp -0.5\\nfx bass filter mode=low_pass cutoff_hz=900 resonance=1.4\\nfx bass sat kind=tube drive=2.5 mix=0.6\\nfx drums comp threshold_db=-16 ratio=4 attack_ms=8\\nfx master eq3 low_gain_db=1.5 high_gain_db=2\\nmaster glue=1 threshold=-14 ratio=3\\n\",\n  \"echoes\": \"// Echoes · the delay bus, tempo synced\\ntempo 92\\nbars 2\\nlevel reverb 0.25\\ninstrument melody bell\\n\\npattern kick x.......x....... 0 8 0.7\\nsequence melody G4,-,D#4,-,A#4,-,G4,- 0 8 0.35 0.6\\nsequence bass C2,-,-,-,A#1,-,-,- 0 8 0.9 0.7\\n\\ndelay time=1/8. feedback=0.45 pingpong=1 damping=4200\\nsend melody delay 0.6\\nsend arp delay 0.3\\nlevel delay 0.8\\n\",\n  \"sweep\": \"// Sweep · automation on a fader and a filter\\ntempo 126\\nbars 4\\nkit analog_808\\ninstrument pads warm_pad\\n\\npattern kick x...x...x...x...x...x...x...x... 0 16 0.85\\nsequence pads C3,D#3,G3,A#3 0 16 0.95 0.5\\nsequence bass C2,C2,G2,A#1 0 16 0.6 0.75\\n\\nfx pads filter mode=low_pass cutoff_hz=400 resonance=3\\nautomation pads fx.1.cutoff_hz 0 300\\nautomation pads fx.1.cutoff_hz 12 6000\\nautomation pads fx.1.cutoff_hz 16 300\\nautomation bass gain 0 0.15\\nautomation bass gain 16 1\\nreverb preset=classic mix=0.4\\n\",\n  \"showcase\": \"// Night Signal · inserts, sends, both buses, automation and the master chain\\ntempo 124\\nbars 4\\nkit house\\ninstrument bass saw_bass\\ninstrument pads warm_pad\\ninstrument melody bell\\ninstrument arp bell\\n\\npattern kick X...x...X...x...X...x...X...x... 0 16 0.85\\npattern snare ....x.......x.......x.......x..x 0 16 0.6\\npattern hat ..x...x...x...x...x...x...x.x.x. 0 16 0.3\\nsequence bass C2,-,C2,G2,A#1,-,A#1,D#2,G#1,-,G#1,D#2,G1,-,G1,A#1 0 16 0.7 0.75\\nsequence pads C3,A#2,G#2,G2 0 16 0.95 0.5\\nsequence melody G4,-,D#4,-,A#4,G4,-,D#4,C5,-,G4,-,F4,D#4,D4,- 0 16 0.55 0.5\\nsequence arp C4,D#4,G4,A#4,G4,D#4,C4,G3,G#3,C4,D#4,G4,G3,B3,D4,G4 0 16 0.4 0.4\\n\\n// Placement and space\\npan arp -0.45\\npan melody 0.3\\nsend pads reverb 0.5\\nsend melody reverb 0.4\\nsend arp delay 0.45\\nsend melody delay 0.25\\nreverb preset=classic mix=0.35\\ndelay time=1/8. feedback=0.4 pingpong=1 damping=4200\\nlevel delay 0.7\\n\\n// Inserts\\nfx bass filter mode=low_pass cutoff_hz=900 resonance=1.4\\nfx bass sat kind=tube drive=2.5 mix=0.6\\nfx drums comp threshold_db=-16 ratio=4 attack_ms=8\\nfx pads filter mode=low_pass cutoff_hz=400 resonance=2.5\\nfx pads chorus\\nfx arp phaser\\nfx master eq3 low_gain_db=1.5 high_gain_db=2\\nmaster glue=1 threshold=-14 ratio=3\\n\\n// Automation: the pads open across the phrase and duck under every kick; the melody fades in, the arp fades out\\nautomation pads fx.1.cutoff_hz 0 400\\nautomation pads fx.1.cutoff_hz 12 5000\\nautomation pads fx.1.cutoff_hz 16 400\\nautomation pads gain 0 0.3\\nautomation pads gain 0.75 1\\nautomation pads gain 1 0.3\\nautomation pads gain 1.75 1\\nautomation pads gain 2 0.3\\nautomation pads gain 2.75 1\\nautomation pads gain 3 0.3\\nautomation pads gain 3.75 1\\nautomation pads gain 4 0.3\\nautomation pads gain 4.75 1\\nautomation pads gain 5 0.3\\nautomation pads gain 5.75 1\\nautomation pads gain 6 0.3\\nautomation pads gain 6.75 1\\nautomation pads gain 7 0.3\\nautomation pads gain 7.75 1\\nautomation pads gain 8 0.3\\nautomation pads gain 8.75 1\\nautomation pads gain 9 0.3\\nautomation pads gain 9.75 1\\nautomation pads gain 10 0.3\\nautomation pads gain 10.75 1\\nautomation pads gain 11 0.3\\nautomation pads gain 11.75 1\\nautomation pads gain 12 0.3\\nautomation pads gain 12.75 1\\nautomation pads gain 13 0.3\\nautomation pads gain 13.75 1\\nautomation pads gain 14 0.3\\nautomation pads gain 14.75 1\\nautomation pads gain 15 0.3\\nautomation pads gain 15.75 1\\nautomation melody gain 0 0\\nautomation melody gain 4 1\\nautomation arp gain 12 1\\nautomation arp gain 16 0.1\\n\"\n}\n</script>"},"tag":"RawHtml"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"className":"ls-eyebrow","text":"CRE8 DAW / SONG WORKSPACE","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Audio editor","variant":"h1"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Code notes, play the synth, shape the mix. Your next edit lands on a bar.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-ls-nav":true,"href":"/view/virtual/performance","label":"Performance editor"},"tag":"Action"}],"kind":"view-node","props":{"aria-label":"Related audio areas","data-editor-part":"actions","element":"nav"},"tag":"Section"}],"kind":"view-node","props":{"data-editor-strip":"identity","element":"header"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"html":"<style>.ssr-action-menu{position:relative;display:inline-block;font:12px/1.5 system-ui,sans-serif;color:var(--vp-ink,#e4f2ee)}\n.ssr-action-menu>summary{display:flex;align-items:center;gap:16px;cursor:pointer;list-style:none;padding:6px 10px;border:1px solid transparent;border-radius:5px;user-select:none}\n.ssr-action-menu>summary::-webkit-details-marker{display:none}\n.ssr-action-menu>summary:hover,.ssr-action-menu[open]>summary{background:light-dark(#eef6f3,#1b3229);border-color:light-dark(#ccded5,#385747)}\n.ssr-action-menu>summary>span{color:light-dark(#516e5e,#97b3a4);font-size:11px}\n.ssr-action-menu>[role=menu]{position:absolute;top:calc(100% + 4px);left:0;z-index:50;min-width:190px;max-width:calc(100vw - 48px);padding:5px;border:1px solid light-dark(#cadbd2,#426151);border-radius:8px;background:light-dark(#f3f9f7,#10221c);box-shadow:0 12px 32px #0008}\n.ssr-action-menu:not([open])>[role=menu]{display:none}\nbody .ssr-action-menu :is([role=menuitem],[role=menuitemcheckbox]){display:block;width:100%;text-align:left;white-space:normal;border:0;border-radius:4px;padding:9px 12px;background:transparent;color:light-dark(#21312c,#e4f2ee);font:12px/1.5 system-ui;cursor:pointer}\nbody .ssr-action-menu :is([role=menuitem],[role=menuitemcheckbox]):hover,body .ssr-action-menu :is([role=menuitem],[role=menuitemcheckbox]):focus-visible{background:light-dark(#e6f1ec,#2b4b3b);outline:2px solid #99cfad;outline-offset:-2px}\nbody .ssr-action-menu :is([role=menuitem],[role=menuitemcheckbox]):disabled{opacity:.4;cursor:default;background:transparent}\n.ssr-action-menu [role=menuitemcheckbox]::after{content:'○' / '';float:right;margin-left:12px}\n.ssr-action-menu [role=menuitemcheckbox][aria-checked=true]::after{content:'✓' / ''}\n.ssr-action-menu>summary:focus-visible{outline:2px solid #99cfad;outline-offset:2px}\n.ssr-action-menu[data-align=end]>[role=menu]{left:auto;right:0}\n</style><script>/* Shared enhancement of server-authored action menus; commands remain app-owned. */\n(() => {\n  if (window.__cre8SsrActionMenus) return;\n  window.__cre8SsrActionMenus = true;\n  const menuOf = node => node instanceof Element ? node.closest('[data-ssr-menu]') : null;\n  const trigger = menu => menu.querySelector('summary');\n  const targetOf = item => document.getElementById(item.dataset.ssrMenuTarget);\n  const available = target => target instanceof HTMLButtonElement && !target.hasAttribute('data-ssr-menu-target') && !target.matches(':disabled') && target.getAttribute('aria-disabled') !== 'true' && !target.closest('[inert]');\n  const returnFocus = new WeakMap();\n  function sync(menu) {\n    if (trigger(menu).getAttribute('aria-expanded') !== String(menu.open)) trigger(menu).setAttribute('aria-expanded', String(menu.open));\n    for (const item of menu.querySelectorAll('[data-ssr-menu-target]')) {\n      const target = targetOf(item);\n      item.disabled = !available(target);\n      const checked = target?.getAttribute('aria-pressed') ?? target?.getAttribute('aria-expanded');\n      item.setAttribute('role', checked === 'true' || checked === 'false' ? 'menuitemcheckbox' : 'menuitem');\n      if (checked === 'true' || checked === 'false') item.setAttribute('aria-checked', checked);\n      else item.removeAttribute('aria-checked');\n    }\n  }\n  const items = menu => [...menu.querySelectorAll('[data-ssr-menu-target]')].filter(item => !item.disabled);\n  function close(menu, focus = false) {\n    menu.open = false; sync(menu);\n    const previous = returnFocus.get(menu);\n    const anchor = previous?.id ? document.getElementById(previous.id) : previous;\n    if (focus) (anchor?.isConnected ? anchor : trigger(menu)).focus({preventScroll:true});\n    returnFocus.delete(menu);\n  }\n  function open(menu, last = false, context = null) {\n    document.querySelectorAll('[data-ssr-menu][open]').forEach(other => { if (other !== menu) close(other); });\n    returnFocus.set(menu, context?.owner || trigger(menu));\n    menu.open = true; sync(menu);\n    const list = items(menu);\n    menu.dataset.align = 'start';\n    const rect = menu.querySelector('[role=menu]').getBoundingClientRect();\n    menu.dataset.align = rect.right > innerWidth - 12 ? 'end' : 'start';\n    if (menu.hasAttribute('data-ssr-menu-floating')) {\n      const panel = menu.querySelector('[role=menu]'), anchor = trigger(menu).getBoundingClientRect();\n      const left = Math.max(12, Math.min(context ? context.x : anchor.left, innerWidth - rect.width - 12));\n      const preferredTop = context ? context.y : anchor.bottom + 4;\n      const top = Math.max(12, Math.min(preferredTop, innerHeight - rect.height - 12));\n      Object.assign(panel.style, {position:'fixed', left:left+'px', right:'auto', top:top+'px', maxHeight:'calc(100dvh - 24px)', overflowY:'auto'});\n    }\n    ((last ? list.at(-1) : list[0]) || trigger(menu)).focus({preventScroll:true});\n  }\n  // Consumers opt in with the ID of their server-rendered menu. No commands or selectors are evaluated.\n  const contextMenu = node => {\n    const owner = node instanceof Element ? node.closest('[data-ssr-context-menu]') : null;\n    const menu = owner && document.getElementById(owner.dataset.ssrContextMenu);\n    return menu?.matches('[data-ssr-menu]') ? menu : null;\n  };\n  document.addEventListener('contextmenu', event => {\n    const menu = contextMenu(event.target);\n    if (event.defaultPrevented || !menu || event.target.closest('input,textarea,select,[contenteditable=true]')) return;\n    const owner = event.target.closest('button,[tabindex]') || trigger(menu);\n    const rect = owner.getBoundingClientRect();\n    event.preventDefault(); open(menu, false, {owner, x:event.clientX || rect.left, y:event.clientY || rect.bottom});\n  });\n  document.addEventListener('click', event => {\n    const opener = event.target.closest?.('[data-ssr-menu-open]');\n    if (opener && !opener.matches(':disabled') && opener.getAttribute('aria-disabled') !== 'true') {\n      const linked = document.getElementById(opener.dataset.ssrMenuOpen);\n      if (linked?.matches('[data-ssr-menu]')) {\n        event.preventDefault();\n        const owner = (opener.id && document.getElementById(opener.id)) || opener;\n        const rect = owner.getBoundingClientRect();\n        open(linked, false, {owner, x:rect.left, y:rect.bottom});\n        return;\n      }\n    }\n    const menu = menuOf(event.target);\n    if (!menu) return;\n    if (event.target.closest('summary') === trigger(menu)) {\n      event.preventDefault(); menu.open ? close(menu) : open(menu); return;\n    }\n    const item = event.target.closest('[data-ssr-menu-target]');\n    if (!item || !menu.contains(item)) return;\n    const target = targetOf(item);\n    if (!available(target)) { sync(menu); return; }\n    close(menu, true);\n    target.click();\n  });\n  document.addEventListener('keydown', event => {\n    if (event.key === 'ContextMenu' || (event.shiftKey && event.key === 'F10')) {\n      const context = contextMenu(event.target);\n      if (context && !event.defaultPrevented && !event.target.closest('input,textarea,select,[contenteditable=true]')) {\n        const owner = (event.target.id && document.getElementById(event.target.id)) || event.target;\n        const rect = owner.getBoundingClientRect();\n        event.preventDefault(); open(context, false, {owner,x:rect.left,y:rect.bottom}); return;\n      }\n    }\n    const menu = menuOf(event.target);\n    if (!menu) return;\n    if (event.key === 'Escape' && menu.open) { event.preventDefault(); close(menu, true); return; }\n    if (event.key === 'Tab' && menu.open) { close(menu, true); return; }\n    if (event.isComposing || event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) return;\n    const onTrigger = event.target === trigger(menu);\n    if (['ArrowLeft','ArrowRight'].includes(event.key) && menu.closest('[data-ssr-menubar]')) {\n      const peers = [...menu.closest('[data-ssr-menubar]').querySelectorAll('[data-ssr-menu]')];\n      const next = peers[(peers.indexOf(menu) + (event.key === 'ArrowRight' ? 1 : -1) + peers.length) % peers.length];\n      event.preventDefault(); menu.open ? open(next) : trigger(next).focus(); return;\n    }\n    if (onTrigger && ['ArrowDown', 'ArrowUp'].includes(event.key)) { event.preventDefault(); open(menu, event.key === 'ArrowUp'); return; }\n    if (!menu.open || !['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(event.key)) return;\n    event.preventDefault(); sync(menu);\n    const list = items(menu), index = list.indexOf(document.activeElement);\n    const next = event.key === 'Home' ? 0 : event.key === 'End' ? list.length - 1 : (index + (event.key === 'ArrowDown' ? 1 : -1) + list.length) % list.length;\n    list[next]?.focus();\n  });\n  document.addEventListener('pointerdown', event => {\n    document.querySelectorAll('[data-ssr-menu][open]').forEach(menu => { if (!menu.contains(event.target)) close(menu); });\n  });\n  document.addEventListener('focusin', event => {\n    document.querySelectorAll('[data-ssr-menu][open]').forEach(menu => { if (!menu.contains(event.target)) close(menu); });\n  });\n  document.addEventListener('toggle', event => { if (event.target.matches?.('[data-ssr-menu]')) sync(event.target); }, true);\n  const closeFloating = event => document.querySelectorAll('[data-ssr-menu-floating][open]').forEach(menu => {\n    if (!(event.target instanceof Node) || !menu.contains(event.target)) close(menu);\n  });\n  document.addEventListener('scroll', closeFloating, true);\n  window.addEventListener('resize', closeFloating);\n  // A native preparation can enable exports while a menu is already open.\n  new MutationObserver(records => {\n    if (records.some(record => !record.target.hasAttribute('data-ssr-menu-target'))) {\n      document.querySelectorAll('[data-ssr-menu][open]').forEach(sync);\n    }\n  }).observe(document, {subtree:true, attributes:true, attributeFilter:['disabled','aria-disabled','aria-pressed','aria-expanded','inert']});\n})();\n</script><details class=\"ssr-action-menu\" data-ssr-menu data-ssr-menu-floating id=\"ls-file-menu\"><summary role=\"button\" id=\"ls-file-menu-trigger\" aria-haspopup=\"menu\" aria-expanded=\"false\" aria-controls=\"ls-file-menu-items\">File<span aria-hidden=\"true\">⌄</span></summary><div id=\"ls-file-menu-items\" role=\"menu\" aria-labelledby=\"ls-file-menu-trigger\"><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-open-project\" >Open project…</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-save-project\" >Save project…</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-open-file\" >Open score, session or audio…</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-save-file\" >Save music draft…</button></div></details><details class=\"ssr-action-menu\" data-ssr-menu data-ssr-menu-floating id=\"ls-edit-menu\"><summary role=\"button\" id=\"ls-edit-menu-trigger\" aria-haspopup=\"menu\" aria-expanded=\"false\" aria-controls=\"ls-edit-menu-items\">Edit<span aria-hidden=\"true\">⌄</span></summary><div id=\"ls-edit-menu-items\" role=\"menu\" aria-labelledby=\"ls-edit-menu-trigger\"><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-undo-draft\" disabled>Undo draft replacement</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-revert-draft\" disabled>Restore prepared take</button></div></details><details class=\"ssr-action-menu\" data-ssr-menu data-ssr-menu-floating id=\"ls-view-menu\"><summary role=\"button\" id=\"ls-view-menu-trigger\" aria-haspopup=\"menu\" aria-expanded=\"false\" aria-controls=\"ls-view-menu-items\">View<span aria-hidden=\"true\">⌄</span></summary><div id=\"ls-view-menu-items\" role=\"menu\" aria-labelledby=\"ls-view-menu-trigger\"><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-focus-editor\" >Focus editor</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-view-tracks\" >Tracks</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-view-perform\" >Scenes</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-view-instruments\" >Instruments</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-view-flow\" >Signal flow</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-view-clips\" >Clips</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-view-waveform\" >Waveform</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-view-piano\" >Piano roll</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-view-code\" >Music code</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-view-session\" >Session</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-view-midi\" >MIDI recorder</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-view-visual\" >Visuals</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-view-mixer\" >Mixer</button></div></details><details class=\"ssr-action-menu\" data-ssr-menu data-ssr-menu-floating id=\"ls-export-menu\"><summary role=\"button\" id=\"ls-export-menu-trigger\" aria-haspopup=\"menu\" aria-expanded=\"false\" aria-controls=\"ls-export-menu-items\">Export song<span aria-hidden=\"true\">⌄</span></summary><div id=\"ls-export-menu-items\" role=\"menu\" aria-labelledby=\"ls-export-menu-trigger\"><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-export-wav\" disabled>Song audio · WAV</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-export-midi\" disabled>Song notes · MIDI (.mid)</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-export-session\" disabled>Song session (.json)</button><button type=\"button\" role=\"menuitem\" tabindex=\"-1\" data-ssr-menu-target=\"ls-publish-item\" disabled>Publish song as item</button></div></details>"},"tag":"RawHtml"},{"children":[],"kind":"view-node","props":{"hidden":true},"tag":"Section"}],"kind":"view-node","props":{"aria-label":"Editor menus","className":"ls-menu-bar","data-editor-strip":"menu","data-ssr-menubar":true,"element":"nav"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-ls":"saved-state","text":"Draft stays in this browser tab","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"controlKey":"live-score.13","data-ls":"save-project","disabled":false,"hidden":true,"id":"ls-save-file","label":"Save draft file"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"live-score.14","data-ls":"open-project","disabled":false,"hidden":true,"id":"ls-open-file","label":"Open score, session or audio"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"accept":".json,.cre8score,.txt,audio/*,.wav,.mp3,.m4a,.ogg,.flac","controlKey":"live-score.15","data-ls":"file","disabled":false,"hidden":true,"kind":"file","label":"","name":"live-score-15"},"tag":"Input"}],"kind":"view-node","props":{"hidden":true},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Switching pages preserves your draft. Prepare again to play.","variant":"span"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Position ","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"data-daw-status":"position","text":"1.1","variant":"b"},"tag":"Text"}],"kind":"view-node","props":{"data-daw-status-cell":"position","element":"span"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"text":"Tempo ","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"data-daw-status":"tempo","text":"—","variant":"b"},"tag":"Text"}],"kind":"view-node","props":{"data-daw-status-cell":"tempo","element":"span"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"text":"Loop ","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"data-daw-status":"loop","text":"—","variant":"b"},"tag":"Text"}],"kind":"view-node","props":{"data-daw-status-cell":"loop","element":"span"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"text":"Selected ","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"data-daw-status":"selection","text":"nothing","variant":"b"},"tag":"Text"}],"kind":"view-node","props":{"data-daw-status-cell":"selection","element":"span"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-daw-status","data-daw-status-cells":true,"element":"div","hidden":true},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-project-bar","data-editor-strip":"status","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"audio.session.prepare","event":"click"},"hostOutputs":{"disabled":"prepareDisabled","text":"prepareLabel"},"id":"ls-prepare","label":"Prepare score"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"audio.session.start","event":"click"},"hostOutputs":{"disabled":"startDisabled","text":"startLabel"},"id":"ls-start","label":"Start audio"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"audio.session.stop","event":"click"},"hostOutputs":{"disabled":"stopDisabled"},"id":"ls-stop","label":"Stop"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"audio.session.wav","event":"click"},"hostOutputs":{"disabled":"exportDisabled"},"id":"ls-export-wav","label":"Song audio · WAV (one loop)"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"audio.session.midi","event":"click"},"hostOutputs":{"disabled":"exportDisabled"},"id":"ls-export-midi","label":"Song notes · MIDI (.mid)"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"audio.session.session","event":"click"},"hostOutputs":{"disabled":"exportDisabled"},"id":"ls-export-session","label":"Song session (.json)"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"audio.session.item","event":"click"},"hostOutputs":{"disabled":"exportDisabled"},"id":"ls-publish-item","label":"Publish song as item"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"aria-live":"polite","hostOutput":"exportLabel","id":"ls-export-state","role":"status","text":"Prepare a song to export WAV, MIDI or session JSON, or publish it as an item."},"tag":"Text"}],"kind":"view-node","props":{"hostCapability":"audio.session","hostVersion":1,"id":"audio-session-transport"},"tag":"Card"}],"kind":"view-node","props":{"data-cre8-host-artifact":"{\"schema\":\"cre8.view.ir\",\"version\":1,\"template_id\":\"audio.session\",\"source_hash\":\"1140f9a1d5ac410824fccb6b3bd7c546673d956cde7b64f72b7181250737add2\",\"context_hash\":\"44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a\",\"tree_hash\":\"fa30f207b1f227269e43d876e1cd92759587129c1dadedcb2cc7f500d256dd90\",\"tree_json\":\"{\\\"children\\\":[{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"audio.session.prepare\\\",\\\"event\\\":\\\"click\\\"},\\\"hostOutputs\\\":{\\\"disabled\\\":\\\"prepareDisabled\\\",\\\"text\\\":\\\"prepareLabel\\\"},\\\"id\\\":\\\"ls-prepare\\\",\\\"label\\\":\\\"Prepare score\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"audio.session.start\\\",\\\"event\\\":\\\"click\\\"},\\\"hostOutputs\\\":{\\\"disabled\\\":\\\"startDisabled\\\",\\\"text\\\":\\\"startLabel\\\"},\\\"id\\\":\\\"ls-start\\\",\\\"label\\\":\\\"Start audio\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"audio.session.stop\\\",\\\"event\\\":\\\"click\\\"},\\\"hostOutputs\\\":{\\\"disabled\\\":\\\"stopDisabled\\\"},\\\"id\\\":\\\"ls-stop\\\",\\\"label\\\":\\\"Stop\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"audio.session.wav\\\",\\\"event\\\":\\\"click\\\"},\\\"hostOutputs\\\":{\\\"disabled\\\":\\\"exportDisabled\\\"},\\\"id\\\":\\\"ls-export-wav\\\",\\\"label\\\":\\\"Song audio · WAV (one loop)\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"audio.session.midi\\\",\\\"event\\\":\\\"click\\\"},\\\"hostOutputs\\\":{\\\"disabled\\\":\\\"exportDisabled\\\"},\\\"id\\\":\\\"ls-export-midi\\\",\\\"label\\\":\\\"Song notes · MIDI (.mid)\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"audio.session.session\\\",\\\"event\\\":\\\"click\\\"},\\\"hostOutputs\\\":{\\\"disabled\\\":\\\"exportDisabled\\\"},\\\"id\\\":\\\"ls-export-session\\\",\\\"label\\\":\\\"Song session (.json)\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"audio.session.item\\\",\\\"event\\\":\\\"click\\\"},\\\"hostOutputs\\\":{\\\"disabled\\\":\\\"exportDisabled\\\"},\\\"id\\\":\\\"ls-publish-item\\\",\\\"label\\\":\\\"Publish song as item\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"aria-live\\\":\\\"polite\\\",\\\"hostOutput\\\":\\\"exportLabel\\\",\\\"id\\\":\\\"ls-export-state\\\",\\\"role\\\":\\\"status\\\",\\\"text\\\":\\\"Prepare a song to export WAV, MIDI or session JSON, or publish it as an item.\\\"},\\\"tag\\\":\\\"Text\\\"}],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"hostCapability\\\":\\\"audio.session\\\",\\\"hostVersion\\\":1,\\\"id\\\":\\\"audio-session-transport\\\"},\\\"tag\\\":\\\"Card\\\"}\",\"tree\":{\"children\":[{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"audio.session.prepare\",\"event\":\"click\"},\"hostOutputs\":{\"disabled\":\"prepareDisabled\",\"text\":\"prepareLabel\"},\"id\":\"ls-prepare\",\"label\":\"Prepare score\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"audio.session.start\",\"event\":\"click\"},\"hostOutputs\":{\"disabled\":\"startDisabled\",\"text\":\"startLabel\"},\"id\":\"ls-start\",\"label\":\"Start audio\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"audio.session.stop\",\"event\":\"click\"},\"hostOutputs\":{\"disabled\":\"stopDisabled\"},\"id\":\"ls-stop\",\"label\":\"Stop\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"audio.session.wav\",\"event\":\"click\"},\"hostOutputs\":{\"disabled\":\"exportDisabled\"},\"id\":\"ls-export-wav\",\"label\":\"Song audio · WAV (one loop)\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"audio.session.midi\",\"event\":\"click\"},\"hostOutputs\":{\"disabled\":\"exportDisabled\"},\"id\":\"ls-export-midi\",\"label\":\"Song notes · MIDI (.mid)\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"audio.session.session\",\"event\":\"click\"},\"hostOutputs\":{\"disabled\":\"exportDisabled\"},\"id\":\"ls-export-session\",\"label\":\"Song session (.json)\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"audio.session.item\",\"event\":\"click\"},\"hostOutputs\":{\"disabled\":\"exportDisabled\"},\"id\":\"ls-publish-item\",\"label\":\"Publish song as item\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"aria-live\":\"polite\",\"hostOutput\":\"exportLabel\",\"id\":\"ls-export-state\",\"role\":\"status\",\"text\":\"Prepare a song to export WAV, MIDI or session JSON, or publish it as an item.\"},\"tag\":\"Text\"}],\"kind\":\"view-node\",\"props\":{\"hostCapability\":\"audio.session\",\"hostVersion\":1,\"id\":\"audio-session-transport\"},\"tag\":\"Card\"},\"execution\":{\"portable_ir_schema\":\"cre8.view.ir\",\"portable_ir_tree_hash\":\"fa30f207b1f227269e43d876e1cd92759587129c1dadedcb2cc7f500d256dd90\",\"portable_ir_version\":1,\"producer\":\"rust-ssr\"}}","data-cre8-host-component":"audio.session","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-daw-time":"bars","text":"001.1","variant":"b"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"data-daw-time":"clock","text":"0:00.0","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"data-daw-time":"bpm","text":"— BPM","variant":"span"},"tag":"Text"}],"kind":"view-node","props":{"aria-hidden":"true","className":"ls-daw-timecode","data-daw-timecode":true,"element":"div","hidden":true},"tag":"Section"},{"children":[],"kind":"view-node","props":{"aria-label":"Playback position","aria-live":"off","data-ls":"clock","role":"timer","text":"Stopped · prepare a score","variant":"output"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"data-ls":"meter","text":"","variant":"i"},"tag":"Text"}],"kind":"view-node","props":{"aria-hidden":"true","className":"ls-meter","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"className":"ls-live-badge","data-ls":"live-state","text":"NO LIVE TAKE","variant":"span"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"aria-live":"polite","data-ls":"status","role":"status","text":"Connecting audio controls…","variant":"p"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"controlKey":"live-score.24","data-ls":"error-line","disabled":false,"hidden":true,"label":"Go to error line"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-transport-feedback","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"aria-label":"Song transport","className":"ls-transport","element":"div","role":"group"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"daw-workspace.3","data-daw-editor":"code","data-daw-view":"tracks","disabled":false,"id":"ls-view-tracks","label":"Tracks","pressed":true},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"daw-workspace.perform","data-daw-open":"live-score-perform","data-daw-view":"perform","disabled":false,"id":"ls-view-perform","label":"Perform","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"daw-workspace.4","data-daw-editor":"code","data-daw-view":"instruments","disabled":false,"id":"ls-view-instruments","label":"Instruments","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"daw-workspace.5","data-daw-editor":"session","data-daw-view":"flow","disabled":false,"id":"ls-view-flow","label":"Signal flow","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"daw-workspace.6","data-daw-editor":"piano","data-daw-view":"clips","disabled":false,"id":"ls-view-clips","label":"Clips","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"daw-workspace.7","data-daw-open":"live-score-waveform","data-daw-view":"waveform","disabled":false,"id":"ls-view-waveform","label":"Waveform","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"daw-workspace.8","data-daw-editor":"piano","data-daw-view":"piano","disabled":false,"id":"ls-view-piano","label":"Piano roll","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"daw-workspace.9","data-daw-editor":"code","data-daw-view":"code","disabled":false,"id":"ls-view-code","label":"Music code","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"daw-workspace.10","data-daw-editor":"session","data-daw-view":"session","disabled":false,"id":"ls-view-session","label":"Session","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"daw-workspace.11","data-daw-open":"live-score-midi","data-daw-view":"midi","disabled":false,"id":"ls-view-midi","label":"MIDI recorder","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"daw-workspace.12","data-daw-editor":"code","data-daw-view":"visual","disabled":false,"id":"ls-view-visual","label":"Visuals","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"daw-workspace.13","data-daw-mixer":true,"disabled":false,"id":"ls-view-mixer","label":"Mixer","pressed":true},"tag":"Action"}],"kind":"view-node","props":{"aria-label":"DAW workspace","className":"ls-daw-tabs","data-editor-strip":"modes","element":"nav"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"className":"ls-daw-caption","text":"SESSION CHANNELS","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Your sound","variant":"h3"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Select a channel to reach its fader.","variant":"p"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"text":"01 "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Drums","variant":"strong"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Rhythm","variant":"span"},"tag":"Text"}],"kind":"view-node","props":{"controlKey":"daw-workspace.18","data-daw-track":"drums","disabled":false,"pressed":false},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"text":"02 "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Bass","variant":"strong"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Low end","variant":"span"},"tag":"Text"}],"kind":"view-node","props":{"controlKey":"daw-workspace.21","data-daw-track":"bass","disabled":false,"pressed":false},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"text":"03 "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Pads","variant":"strong"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Harmony","variant":"span"},"tag":"Text"}],"kind":"view-node","props":{"controlKey":"daw-workspace.24","data-daw-track":"pads","disabled":false,"pressed":false},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"text":"04 "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Melody","variant":"strong"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Lead","variant":"span"},"tag":"Text"}],"kind":"view-node","props":{"controlKey":"daw-workspace.27","data-daw-track":"melody","disabled":false,"pressed":false},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"text":"05 "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Arp","variant":"strong"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Motion","variant":"span"},"tag":"Text"}],"kind":"view-node","props":{"controlKey":"daw-workspace.30","data-daw-track":"arp","disabled":false,"pressed":false},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"text":"06 "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Space","variant":"strong"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Reverb return","variant":"span"},"tag":"Text"}],"kind":"view-node","props":{"controlKey":"daw-workspace.33","data-daw-track":"reverb","disabled":false,"pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"daw-workspace.36","data-ls-nav":true,"href":"/view/device/midi","label":"Device connections ↗"},"tag":"Action"}],"kind":"view-node","props":{"aria-label":"Session channels","className":"ls-daw-library","element":"aside"},"tag":"Section"}],"kind":"view-node","props":{"className":"media-fragment","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"className":"ls-daw-caption","text":"PERFORM → CAPTURE → EDIT","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Find the take.","variant":"h2"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"One instrument. Three scenes. Cue a new mood on the next bar, then shape your performance in Tracks.","variant":"p"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"scene-performance.starter","data-scene-action":"starter","disabled":false,"label":"Load three-scene starter"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"scene-performance.prepare","data-scene-action":"prepare","disabled":false,"label":"Prepare scenes"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-scene-setup","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"className":"ls-scene-hint","text":"The starter replaces tracks; Undo restores them. Or select an instrument with three four-beat MIDI clips. Prepared scenes last until you close or reload this editor.","variant":"p"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"scene-performance.launch-0","data-scene-launch":"0","disabled":true,"label":"Spark","pressed":true},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"scene-performance.launch-1","data-scene-launch":"1","disabled":true,"label":"Lift","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"scene-performance.launch-2","data-scene-launch":"2","disabled":true,"label":"Release","pressed":false},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-scene-pads","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"scene-performance.capture","data-scene-action":"capture","disabled":true,"label":"Capture take"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"scene-performance.finish","data-scene-action":"finish","disabled":true,"label":"Finish take"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"scene-performance.use","data-scene-action":"use","disabled":true,"label":"Use captured take"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-scene-actions","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"data-scene-status":true,"role":"status","text":"Load the starter or select a track, then prepare your three scenes.","variant":"p"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"className":"ls-scene-hint","text":"Capture up to 256 beats. Use captured take replaces the track arrangement with editable MIDI clips. Save the project to keep it; prepare the arrangement for playback and export.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"aria-label":"Scene performance","className":"ls-scene-performance","data-scene-performance":true,"element":"section","id":"live-score-perform"},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"className":"ls-daw-caption","text":"PHRASES / NOTES","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Clips & notes","variant":"h3"},"tag":"Text"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.8","data-piano":"lane","default":"melody","disabled":false,"label":"Lane","name":"piano-roll-8","options":[{"label":"Bass","value":"bass"},{"label":"Pads","value":"pads"},{"label":"Melody","value":"melody"},{"label":"Arp","value":"arp"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.9","data-piano":"load","disabled":false,"label":"Load prepared lane"},"tag":"Action"}],"kind":"view-node","props":{"element":"header"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"aria-live":"polite","data-piano":"status","role":"status","text":"Prepare a score, then load a lane to edit its notes.","variant":"p"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Bar phrases","className":"ls-clip-grid","data-piano":"clips","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-clip-scroll","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"data-piano":"region-status","text":"Select a bar phrase to arrange its notes.","variant":"p"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.17","data-piano":"region-target","default":"0","disabled":false,"kind":"number","label":"Destination beat","max":"16","min":"0","name":"piano-roll-17","step":".25"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.18","data-piano":"region-move","disabled":true,"label":"Move phrase"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.19","data-piano":"region-duplicate","disabled":true,"label":"Duplicate phrase"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.20","data-piano":"region-delete","disabled":true,"label":"Delete phrase"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.21","data-piano":"region-open","disabled":true,"label":"Open in piano roll"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-clip-controls","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Select or drag a bar phrase · double-click to edit notes. Overlapping phrases retain their notes. Bar groups rebuild when you load a lane.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"aria-label":"Phrase arrangement","className":"ls-clip-editor","element":"section"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Note grid","className":"ls-piano-grid","data-piano":"grid","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"aria-label":"Piano roll notes; scroll to explore pitches","className":"ls-piano-scroll","element":"div","tabIndex":0},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.27","data-piano":"pitch","default":"60","disabled":false,"kind":"number","label":"Pitch (MIDI)","max":"127","min":"0","name":"piano-roll-27","step":"1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.29","data-piano":"beat","default":"0","disabled":false,"kind":"number","label":"Beat (from 0)","max":"16","min":"0","name":"piano-roll-29","step":".25"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.31","data-piano":"duration","default":"1","disabled":false,"kind":"number","label":"Length (beats)","max":"16","min":".0020833333333333333","name":"piano-roll-31","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.33","data-piano":"velocity","default":".8","disabled":false,"kind":"number","label":"Velocity","max":"1","min":"0","name":"piano-roll-33","step":".05"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.34","data-piano":"update","disabled":true,"label":"Update note"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.35","data-piano":"add","disabled":true,"label":"Add note"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.36","data-piano":"delete","disabled":true,"label":"Delete note"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.duplicate","data-piano":"duplicate","disabled":true,"label":"Duplicate note"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-piano-inspector","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.39","data-piano":"undo","disabled":true,"label":"Undo note edit"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.redo","data-piano":"redo","disabled":true,"label":"Redo note edit"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.quantize","data-piano":"quantize","disabled":true,"label":"Quantize lane"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"piano-roll.snap","data-piano":"snap","default":".25","label":"Snap (beats)","name":"piano-snap","options":[{"label":"1 beat","value":"1"},{"label":"½ beat","value":".5"},{"label":"¼ beat","value":".25"},{"label":"⅛ beat","value":".125"},{"label":"⅓ beat (triplet)","value":"0.3333333333333333"}]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"className":"ls-piano-hints","text":"Drag notes to move · drag right edge to resize · arrows move · Shift + arrows resize · Delete removes. Snap controls movement and lane quantization.","variant":"span"},"tag":"Text"}],"kind":"view-node","props":{"element":"footer"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Note and phrase edits update your draft automatically. Prepare to hear changes. Your playing take stays intact.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"aria-label":"Piano roll","className":"ls-piano","data-piano-roll":true,"element":"section"},"tag":"Section"}],"kind":"view-node","props":{"className":"media-fragment","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"className":"ls-daw-caption","text":"AUDIO EDITOR","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Waveform","variant":"h3"},"tag":"Text"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"data-wave":"info","text":"Import audio or open a prepared mix.","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"element":"header"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.10","data-audio":"name","default":"Untitled audio project","disabled":false,"kind":"text","label":"Project name","maxlength":256,"name":"waveform-editor-10"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.11","data-audio-action":"save","disabled":false,"id":"ls-save-project","label":"Save project"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.12","data-audio-action":"open","disabled":false,"id":"ls-open-project","label":"Open project…"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"accept":".cre8audio","controlKey":"waveform-editor.13","data-audio":"project-file","disabled":false,"hidden":true,"kind":"file","label":"","name":"waveform-editor-13"},"tag":"Input"}],"kind":"view-node","props":{"hidden":true},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.15","data-audio":"recoveries","default":"","disabled":false,"label":"Local recovery","name":"waveform-editor-15","options":[{"label":"No saved recovery","value":""}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.16","data-audio-action":"recover","disabled":true,"label":"Restore recovery"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"data-audio":"save-status","role":"status","text":"Checking local recovery…","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"aria-label":"Audio project","className":"ls-wave-tools","element":"div","role":"group"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"text":"Song in this project","variant":"h4"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Keep the editable score and MIDI with your audio tracks. Prepare edits, update the phrase audio, then place or repeat it in the project.","variant":"p"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.song-update","data-audio-action":"song-update","disabled":false,"label":"Update song audio"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.song-remove","data-audio-action":"song-remove","disabled":false,"label":"Remove song audio"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.song-gain","data-audio":"song-gain","default":"0","disabled":false,"kind":"number","label":"Song gain dB","max":"24","min":"-60","name":"waveform-editor-song-gain","step":"0.5"},"tag":"Input"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.song-mute","data-audio":"song-mute","default":false,"disabled":false,"kind":"checkbox","label":"Mute song audio","name":"waveform-editor-song-mute"},"tag":"Input"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.song-start","data-audio":"song-start","default":"0","kind":"number","label":"Phrase start (seconds)","max":"1800","min":"0","name":"waveform-editor-song-start","step":"0.001"},"tag":"Input"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.song-repeats","data-audio":"song-repeats","default":"1","kind":"number","label":"Repeat prepared phrase","max":"4096","min":"1","name":"waveform-editor-song-repeats","step":"1"},"tag":"Input"},{"children":[],"kind":"view-node","props":{"aria-live":"polite","data-audio":"song-status","text":"Prepare your song, then Update song audio.","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"aria-label":"Song in project","className":"ls-audio-project","data-audio":"song-panel","element":"section"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"text":"Channel inserts","variant":"h4"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.insert-channel","data-insert":"channel","disabled":true,"label":"Insert channel","name":"waveform-editor-insert-channel","options":[]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.insert-entry","data-insert":"entry","disabled":true,"label":"Channel insert","name":"waveform-editor-insert-entry","options":[]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.insert-name","data-insert":"name","default":"","disabled":true,"kind":"text","label":"Insert name","maxLength":80,"name":"waveform-editor-insert-name"},"tag":"Input"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.insert-add","data-insert-action":"add","disabled":true,"label":"Add current effect settings"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.insert-load","data-insert-action":"load","disabled":true,"label":"Load insert settings"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.insert-update","data-insert-action":"update","disabled":true,"label":"Update selected insert"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.insert-toggle","data-insert-action":"toggle","disabled":true,"label":"Bypass / enable insert"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.insert-up","data-insert-action":"up","disabled":true,"label":"Move insert up"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.insert-down","data-insert-action":"down","disabled":true,"label":"Move insert down"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.insert-remove","data-insert-action":"remove","disabled":true,"label":"Remove insert"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"data-insert":"summary","text":"Add an audio track or song to set up channel inserts.","variant":"output"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"data-insert":"status","role":"status","text":"","variant":"output"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Choose EQ, filter, compressor, limiter or gate settings in Effects, then add them to a channel. Inserts run in order before channel gain and pan for project playback, overdub and stems. Source audio stays unchanged.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-quiet-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"aria-label":"Channel inserts","className":"ls-wave-tools","data-audio":"insert-panel","element":"section"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.19","data-wave-action":"import","disabled":false,"label":"Import audio…"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"accept":"audio/*,.wav,.mp3,.flac,.ogg,.m4a","controlKey":"waveform-editor.20","data-wave":"file","disabled":false,"hidden":true,"kind":"file","label":"","name":"waveform-editor-20"},"tag":"Input"}],"kind":"view-node","props":{"hidden":true},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.21","data-wave-action":"prepared","disabled":false,"label":"Open prepared mix"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.22","data-wave-action":"export","disabled":true,"label":"Export WAV"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.23","data-wave-action":"export-selection","disabled":true,"label":"Export selection"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.25","data-audio":"sample-rate","default":"48000","disabled":false,"kind":"number","label":"Sample rate Hz","max":"192000","min":"8000","name":"waveform-editor-25","step":"1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.26","data-audio-action":"resample","disabled":false,"label":"Convert sample rate"},"tag":"Action"}],"kind":"view-node","props":{"aria-label":"Waveform files","className":"ls-wave-tools","element":"div","role":"group"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.28","data-wave-action":"play","disabled":true,"label":"Play selection / cursor"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.29","data-wave-action":"stop","disabled":false,"label":"Stop"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.31","data-wave":"loop","default":false,"disabled":false,"label":"Loop selection","name":"waveform-editor-31"},"tag":"Checkbox"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.33","data-wave":"scrub","default":false,"disabled":false,"label":"Scrub on drag","name":"waveform-editor-33"},"tag":"Checkbox"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.34","data-wave-action":"zoom-in","disabled":true,"label":"Zoom +"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.35","data-wave-action":"zoom-out","disabled":true,"label":"Zoom −"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.36","data-wave-action":"fit","disabled":true,"label":"Fit audio"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.37","data-wave-action":"fit-selection","disabled":true,"label":"Fit selection"},"tag":"Action"}],"kind":"view-node","props":{"aria-label":"Waveform transport and navigation","className":"ls-wave-tools","element":"div","role":"group"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.40","data-spectrum":"view","default":"waveform","disabled":false,"label":"Audio view","name":"waveform-editor-40","options":[{"label":"Waveform","value":"waveform"},{"label":"Spectrogram","value":"spectrogram"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Spectrum settings"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.45","data-spectrum":"size","default":"2048","disabled":false,"label":"FFT size","name":"waveform-editor-45","options":[{"label":"256","value":"256"},{"label":"512","value":"512"},{"label":"1024","value":"1024"},{"label":"2048","value":"2048"},{"label":"4096","value":"4096"},{"label":"8192","value":"8192"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.47","data-spectrum":"window","default":"hann","disabled":false,"label":"FFT window","name":"waveform-editor-47","options":[{"label":"Hann","value":"hann"},{"label":"Hamming","value":"hamming"},{"label":"Blackman","value":"blackman"},{"label":"Rectangular","value":"rectangular"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.49","data-spectrum":"scale","default":"log","disabled":false,"label":"Frequency scale","name":"waveform-editor-49","options":[{"label":"Logarithmic","value":"log"},{"label":"Linear","value":"linear"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.51","data-spectrum":"min","default":"20","disabled":false,"kind":"number","label":"Minimum Hz","max":"95999","min":"0","name":"waveform-editor-51","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.53","data-spectrum":"max","default":"20000","disabled":false,"kind":"number","label":"Maximum Hz","max":"96000","min":"1","name":"waveform-editor-53","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.55","data-spectrum":"floor","default":"-100","disabled":false,"kind":"number","label":"Display floor dBFS","max":"23","min":"-160","name":"waveform-editor-55","step":"1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.57","data-spectrum":"ceiling","default":"0","disabled":false,"kind":"number","label":"Display ceiling dBFS","max":"24","min":"-159","name":"waveform-editor-57","step":"1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Applies to spectrogram and selection analysis. Larger FFT windows resolve closer frequencies but blur timing. Zoom in to inspect brief events: the overview samples a bounded number of time windows. Stereo channels remain separate. Frequency labels describe the display; selection and edits still operate on time ranges across all channels.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-quiet-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-spectrum-settings","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"aria-label":"Waveform display","className":"ls-wave-tools","element":"div","role":"group"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"data-spectrum":"display-status","role":"status","text":"Switch to Spectrogram to inspect frequency content.","variant":"output"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"html":"<canvas data-wave=\"canvas\" height=\"280\" tabindex=\"0\" role=\"img\" aria-label=\"Audio waveform. Drag to select; Shift-click to extend; arrow keys move one sample; Shift-arrow extends the selection.\"></canvas>"},"tag":"RawHtml"},{"children":[],"kind":"view-node","props":{"aria-label":"Waveform horizontal scroll","controlKey":"waveform-editor.61","data-wave":"scroll","default":"0","disabled":true,"kind":"range","label":"Waveform horizontal scroll","max":"0","min":"0","name":"waveform-editor-61","step":"1"},"tag":"Input"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.64","data-wave":"units","default":"seconds","disabled":false,"label":"Units","name":"waveform-editor-64","options":[{"label":"Seconds","value":"seconds"},{"label":"Samples","value":"samples"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.66","data-wave":"start","default":"0","disabled":true,"kind":"number","label":"Selection start","min":"0","name":"waveform-editor-66","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.68","data-wave":"end","default":"0","disabled":true,"kind":"number","label":"Selection end","min":"0","name":"waveform-editor-68","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.69","data-wave-action":"select-all","disabled":true,"label":"Select all"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"data-wave":"selection","text":"0 samples selected","variant":"output"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.71","data-wave-action":"zero-crossings","disabled":true,"label":"Snap to zero crossings"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-wave-selection","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Analyze selection · spectrum and levels"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.75","data-spectrum":"analyze","data-spectrum-action":"analyze","disabled":true,"label":"Analyze selection"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.76","data-spectrum":"export","data-spectrum-action":"export","disabled":true,"label":"Export spectrum CSV"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"aria-live":"polite","data-spectrum":"summary","role":"status","text":"Select a time range, then analyze. Results refresh only when requested.","variant":"output"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"html":"<canvas data-spectrum=\"plot\" width=\"800\" height=\"220\" role=\"img\" aria-label=\"Selection frequency spectrum. Left or mono is green; right is blue. Peak frequencies and levels are also listed in the table.\" hidden></canvas>"},"tag":"RawHtml"},{"children":[],"kind":"view-node","props":{"className":"ls-spectrum-results","data-spectrum":"results","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Peak, RMS, DC and clipping cover every selected sample. Clipping counts samples at or above full scale; this is not a true-peak or LUFS meter. Spectrum levels use window-corrected tone amplitudes, not noise spectral density. Peak frequencies are estimates; spectral levels can read lower for tones between FFT bins. Long selections use up to 128 evenly spaced FFT windows; narrow selections use a smaller FFT. Correlation is +1 for matching channels, −1 for opposite polarity and undefined for a silent or constant channel. Results clear when audio, selection or spectrum settings change. CSV includes all FFT bins.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-quiet-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-analysis","element":"details"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.82","data-wave-action":"undo","disabled":true,"label":"Undo"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.83","data-wave-action":"redo","disabled":true,"label":"Redo"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.84","data-wave-action":"cut","disabled":true,"label":"Cut"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.85","data-wave-action":"copy","disabled":true,"label":"Copy"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.86","data-wave-action":"paste","disabled":true,"label":"Paste"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.87","data-wave-action":"delete","disabled":true,"label":"Delete"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.88","data-wave-action":"trim","disabled":true,"label":"Trim to selection"},"tag":"Action"}],"kind":"view-node","props":{"aria-label":"Waveform edits","className":"ls-wave-tools","element":"div","role":"group"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.90","data-wave-action":"silence","disabled":true,"label":"Silence"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.91","data-wave-action":"reverse","disabled":true,"label":"Reverse"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.92","data-wave-action":"fade-in","disabled":true,"label":"Fade in"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.93","data-wave-action":"fade-out","disabled":true,"label":"Fade out"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.94","data-wave-action":"dc","disabled":true,"label":"Remove DC offset"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.96","data-wave":"db","default":"-1","disabled":false,"kind":"number","label":"Level dB","max":"24","min":"-60","name":"waveform-editor-96","step":"0.1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.97","data-wave-action":"normalize","disabled":true,"label":"Normalize peak"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.98","data-wave-action":"gain","disabled":true,"label":"Apply gain"},"tag":"Action"}],"kind":"view-node","props":{"aria-label":"Waveform processing","className":"ls-wave-tools","element":"div","role":"group"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Generate audio · geometry, beats, tones and noise"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.103","data-audio":"gen-kind","default":"tone","disabled":false,"label":"Generator","name":"waveform-editor-103","options":[{"label":"Tone","value":"tone"},{"label":"Binaural beats","value":"binaural"},{"label":"Monaural beats · mixed tones","value":"monaural"},{"label":"Geometry · E8 / tesseract","value":"geometry"},{"label":"Frequency sweep / chirp","value":"chirp"},{"label":"Amplitude modulation","value":"am"},{"label":"Noise","value":"noise"},{"label":"Rhythm clicks","value":"rhythm"},{"label":"DTMF keypad","value":"dtmf"},{"label":"Silence","value":"silence"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.105","data-audio":"gen-duration","default":"2","disabled":false,"kind":"number","label":"Duration s","max":"60","min":"0.001","name":"waveform-editor-105","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.107","data-audio":"gen-rate","default":"48000","disabled":false,"kind":"number","label":"Generator rate Hz","max":"192000","min":"8000","name":"waveform-editor-107","step":"1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.109","data-audio":"gen-channels","default":"1","disabled":false,"label":"Output channels","name":"waveform-editor-109","options":[{"label":"Mono","value":"1"},{"label":"Stereo","value":"2"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.111","data-audio":"gen-level","default":"-12","disabled":false,"kind":"number","label":"Peak level dBFS","max":"0","min":"-96","name":"waveform-editor-111","step":"0.1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.113","data-audio":"gen-fadeIn","default":"5","disabled":false,"kind":"number","label":"Generator fade in ms","max":"60000","min":"0","name":"waveform-editor-113","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.115","data-audio":"gen-fadeOut","default":"5","disabled":false,"kind":"number","label":"Generator fade out ms","max":"60000","min":"0","name":"waveform-editor-115","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.118","data-audio":"gen-wave","default":"sine","disabled":false,"label":"Wave shape","name":"waveform-editor-118","options":[{"label":"Sine","value":"sine"},{"label":"Square (smoothed edges)","value":"square"},{"label":"Sawtooth (smoothed edges)","value":"saw"},{"label":"Triangle","value":"triangle"},{"label":"Pulse (smoothed edges)","value":"pulse"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.120","data-audio":"gen-duty","default":"50","disabled":false,"kind":"number","label":"Pulse duty %","max":"99","min":"1","name":"waveform-editor-120","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"data-generator-duty":true,"element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-tools","data-generator-for":"tone chirp am","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.123","data-audio":"gen-frequency","default":"440","disabled":false,"kind":"number","label":"Frequency / carrier Hz","max":"95999","min":"1","name":"waveform-editor-123","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.125","data-audio":"gen-phase","default":"0","disabled":false,"kind":"number","label":"Starting phase °","max":"360","min":"0","name":"waveform-editor-125","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-tools","data-generator-for":"tone chirp am binaural monaural geometry","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.128","data-audio":"gen-endFrequency","default":"880","disabled":false,"kind":"number","label":"End frequency Hz","max":"95999","min":"1","name":"waveform-editor-128","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.130","data-audio":"gen-endLevel","default":"-12","disabled":false,"kind":"number","label":"End peak level dBFS","max":"0","min":"-96","name":"waveform-editor-130","step":"0.1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.132","data-audio":"gen-sweep","default":"log","disabled":false,"label":"Frequency interpolation","name":"waveform-editor-132","options":[{"label":"Logarithmic","value":"log"},{"label":"Linear","value":"linear"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-tools","data-generator-for":"chirp","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"text":"Shape your sound","variant":"h4"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"className":"ls-wave-geometry-intro","text":"Choose a shape and how it moves. Preview to listen, then generate a waveform to edit or export.","variant":"p"},"tag":"Text"},{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.geometry-shape","data-audio":"gen-geometryShape","default":"e8","label":"Geometry","name":"waveform-editor-geometry-shape","options":[{"label":"E8 · 240 roots in 8D","value":"e8"},{"label":"Tesseract · 16 vertices in 4D","value":"tesseract"}]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.geometry-rotation","data-audio":"gen-geometryRotation","default":"fixed","label":"Sound motion","name":"waveform-editor-geometry-rotation","options":[{"label":"Fixed angle · steady tone","value":"fixed"},{"label":"Follow rotation · evolving tone","value":"rotate"}]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.geometry-angle","data-audio":"gen-geometryAngle","default":"35","kind":"number","label":"Starting angle °","max":"360","min":"0","name":"waveform-editor-geometry-angle","step":"0.1"},"tag":"Input"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.geometry-speed","data-audio":"gen-geometrySpeed","default":"15","label":"Rotation speed","name":"waveform-editor-geometry-speed","options":[{"label":"Slow · 6° / s","value":"6"},{"label":"Gentle · 15° / s","value":"15"},{"label":"Medium · 30° / s","value":"30"},{"label":"Fast · 60° / s","value":"60"}]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.geometry-harmonics","data-audio":"gen-geometryHarmonics","default":"24","kind":"number","label":"Harmonic slots","max":"64","min":"2","name":"waveform-editor-geometry-harmonics","step":"1"},"tag":"Input"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.geometry-motion","data-audio":"gen-geometryMotion","default":"steady","label":"Volume envelope","name":"waveform-editor-geometry-motion","options":[{"label":"Steady","value":"steady"},{"label":"Amplitude modulation","value":"am"}]},"tag":"Select"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"className":"ls-wave-geometry-summary","data-audio":"geometry-summary","role":"status","text":"Choose your sound motion.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-wave-geometry-controls","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Choose Geometry to explore the projection, then Preview or generate audio.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"aria-label":"Geometry projection and harmonic amplitudes","data-audio":"generator-projection","element":"div","role":"img"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-pressed":"false","controlKey":"waveform-editor.geometry-animate","data-audio":"geometry-animate","disabled":true,"label":"Animate picture"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"data-audio":"geometry-animation-status","role":"status","text":"Silent picture preview. Pause to keep a starting angle.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-geometry-visual","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-geometry-grid","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"How geometry becomes sound","variant":"span"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Left: the projected shape. Right: harmonic strengths from low to high. Position maps to harmonics; projection height weights their amplitude. Dimmed bars are omitted to fit the sample rate.","variant":"p"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Follow rotation changes the sound over the full Duration at the selected Rotation speed. Preview or generate pauses the picture and uses that starting angle. Fixed angle keeps a steady spectrum; the volume envelope can still pulse it.","variant":"p"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Moving harmonic strengths are smoothed. High harmonics are omitted to leave room for rotation and modulation. Stereo repeats the same tone in both ears. Peak level is a ceiling, not matched loudness.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-wave-geometry-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-geometry","data-generator-for":"geometry","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.135","data-audio":"gen-beat","default":"8","disabled":false,"kind":"number","label":"Beat difference Hz","max":"1000","min":"0","name":"waveform-editor-135","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.beat-curve","data-audio":"gen-beatCurve","default":"hold","label":"Beat movement","name":"waveform-editor-beat-curve","options":[{"label":"Hold","value":"hold"},{"label":"Linear sweep","value":"linear"}]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.end-beat","data-audio":"gen-endBeat","default":"8","disabled":true,"kind":"number","label":"End beat difference Hz","max":"1000","min":"0","name":"waveform-editor-end-beat","step":"any"},"tag":"Input"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Binaural sends one sine to each ear; use headphones for separation. Monaural mixes both sines into each output channel. Hold or sweep their frequency difference around a fixed carrier.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-quiet-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-tools","data-generator-for":"binaural monaural","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.139","data-audio":"gen-modulation","default":"4","disabled":false,"kind":"number","label":"Modulation Hz","max":"1000","min":"0.01","name":"waveform-editor-139","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.141","data-audio":"gen-depth","default":"100","disabled":false,"kind":"number","label":"Modulation depth %","max":"100","min":"0","name":"waveform-editor-141","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-tools","data-generator-for":"am geometry","data-generator-modulation":true,"element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.144","data-audio":"gen-color","default":"pink","disabled":false,"label":"Noise color","name":"waveform-editor-144","options":[{"label":"Pink","value":"pink"},{"label":"White","value":"white"},{"label":"Brownian","value":"brown"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.146","data-audio":"gen-seed","default":"1","disabled":false,"kind":"number","label":"Repeatable seed","max":"4294967295","min":"1","name":"waveform-editor-146","step":"1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-tools","data-generator-for":"noise","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.149","data-audio":"gen-bpm","default":"120","disabled":false,"kind":"number","label":"Tempo BPM","max":"400","min":"20","name":"waveform-editor-149","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.151","data-audio":"gen-beats","default":"4","disabled":false,"kind":"number","label":"Beats per bar","max":"16","min":"1","name":"waveform-editor-151","step":"1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.153","data-audio":"gen-swing","default":"0","disabled":false,"kind":"number","label":"Swing %","max":"75","min":"0","name":"waveform-editor-153","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-tools","data-generator-for":"rhythm","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.156","data-audio":"gen-sequence","default":"123#","disabled":false,"kind":"text","label":"Key sequence","maxlength":128,"name":"waveform-editor-156"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.158","data-audio":"gen-toneMs","default":"150","disabled":false,"kind":"number","label":"Tone ms","max":"5000","min":"10","name":"waveform-editor-158","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.160","data-audio":"gen-gapMs","default":"75","disabled":false,"kind":"number","label":"Gap ms","max":"5000","min":"0","name":"waveform-editor-160","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Duration follows the sequence, with no trailing gap. Keys: 0–9, A–D, * and #.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-wave-tools","data-generator-for":"dtmf","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.163","data-audio-action":"generator-selection","disabled":false,"label":"Use selection duration and format"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.164","data-audio-action":"preview-generator","disabled":false,"label":"Preview audio (up to 5 s)"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.165","data-audio-action":"stop","disabled":false,"label":"Stop generator preview"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.166","data-audio-action":"generate-wave","disabled":false,"label":"Generate waveform"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.167","data-audio-action":"insert-generator","disabled":false,"label":"Insert / replace selection"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.168","data-audio-action":"generator-track","disabled":false,"label":"Add generated track"},"tag":"Action"}],"kind":"view-node","props":{"aria-label":"Generate audio actions","className":"ls-wave-tools","element":"div","role":"group"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"aria-live":"polite","data-audio":"generator-status","role":"status","text":"","variant":"output"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Preview plays up to 5 seconds without changing the project. Generate replaces the waveform; Undo restores it. Use Export WAV to save the result. Insert replaces the selection or inserts at the cursor; format must match. Add track places a clip at the timeline cursor. Maximum 60 seconds / 64 MiB. Start quietly when auditioning tones.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-quiet-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-generator","element":"details"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Filters, dynamics and noise repair"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.175","data-audio":"processor","default":"high-pass","disabled":false,"label":"Processor","name":"waveform-editor-175","options":[{"label":"High-pass filter","value":"high-pass"},{"label":"Low-pass filter","value":"low-pass"},{"label":"Parametric EQ","value":"eq"},{"label":"Compressor","value":"compress"},{"label":"Peak limiter","value":"limit"},{"label":"Noise gate","value":"noise-gate"},{"label":"Profile noise reduction","value":"noise-reduction"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.177","data-audio":"frequency","default":"1000","disabled":false,"kind":"number","label":"Frequency Hz","max":"96000","min":"20","name":"waveform-editor-177"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.179","data-audio":"eq-gain","default":"0","disabled":false,"kind":"number","label":"EQ gain dB","max":"24","min":"-24","name":"waveform-editor-179","step":"0.1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.181","data-audio":"eq-q","default":"0.707","disabled":false,"kind":"number","label":"EQ Q","max":"20","min":"0.1","name":"waveform-editor-181","step":"0.1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.183","data-audio":"threshold","default":"-18","disabled":false,"kind":"number","label":"Threshold dB","max":"0","min":"-96","name":"waveform-editor-183"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.185","data-audio":"ratio","default":"4","disabled":false,"kind":"number","label":"Ratio","max":"40","min":"1","name":"waveform-editor-185","step":"0.1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.187","data-audio":"attack","default":"10","disabled":false,"kind":"number","label":"Attack ms","max":"1000","min":"0.1","name":"waveform-editor-187","step":"0.1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.189","data-audio":"release","default":"100","disabled":false,"kind":"number","label":"Release ms","max":"5000","min":"1","name":"waveform-editor-189"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.191","data-audio":"noise-db","default":"12","disabled":false,"kind":"number","label":"Noise reduction dB","max":"36","min":"0","name":"waveform-editor-191","step":"1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.193","data-audio":"noise-sensitivity","default":"0","disabled":false,"kind":"number","label":"Sensitivity boost dB","max":"24","min":"-12","name":"waveform-editor-193","step":"0.5"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.195","data-audio":"noise-smoothing","default":"1","disabled":false,"kind":"number","label":"Frequency smoothing bands","max":"12","min":"0","name":"waveform-editor-195","step":"1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.196","data-audio-action":"noise-profile","disabled":false,"label":"Capture noise profile"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"data-audio":"noise-status","text":"No noise profile","variant":"output"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.198","data-audio-action":"preview-original","disabled":false,"label":"A: original selection"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.199","data-audio-action":"preview-effect","disabled":false,"label":"B: preview effect"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.200","data-audio-action":"preview-noise-residue","disabled":false,"label":"Listen to removed noise"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.201","data-audio-action":"stop","disabled":false,"label":"Stop preview / cancel repair"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.202","data-audio-action":"apply-effect","disabled":false,"label":"Apply effect"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"aria-live":"polite","data-audio":"effect-status","role":"status","text":"Choose a processor; preview before applying.","variant":"output"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Processing uses the selected audio. Filters use frequency; EQ also uses gain and Q (band width); dynamics use threshold. Compression links stereo channels. The limiter applies an immediate peak ceiling. For noise repair, capture a noise-only passage, then select the audio to clean. Sensitivity boosts the measured noise power; higher values remove more signal. Smoothing spreads gains over neighboring FFT bands; 0 disables it. Listen to removed noise to check what would be lost. A/B previews restart at the same selection start, up to five seconds, with short audition fades and no automatic level matching. Apply commits the full selection with Undo available. Noise profiling and reduction support up to 30 seconds.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-quiet-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-process","data-render-controls":true,"element":"details"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Pitch and time · transpose and change tempo"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.209","data-audio":"pitch-semitones","default":"0","disabled":false,"kind":"number","label":"Pitch semitones","max":"12","min":"-12","name":"waveform-editor-209","step":"1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.211","data-audio":"pitch-cents","default":"0","disabled":false,"kind":"number","label":"Pitch cents","max":"100","min":"-100","name":"waveform-editor-211","step":"1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.213","data-audio":"tempo-percent","default":"0","disabled":false,"kind":"number","label":"Tempo change %","max":"100","min":"-50","name":"waveform-editor-213","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.215","data-audio":"pitch-size","default":"2048","disabled":false,"label":"Pitch/time FFT window","name":"waveform-editor-215","options":[{"label":"1024","value":"1024"},{"label":"2048","value":"2048"},{"label":"4096","value":"4096"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.217","data-audio":"pitch-transients","default":false,"disabled":false,"label":"Protect transient attacks","name":"waveform-editor-217"},"tag":"Checkbox"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.219","data-audio":"pitch-formants","default":false,"disabled":false,"label":"Preserve formants (experimental)","name":"waveform-editor-219"},"tag":"Checkbox"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.221","data-audio":"from-bpm","default":"120","disabled":false,"kind":"number","label":"Original BPM","max":"400","min":"20","name":"waveform-editor-221","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.223","data-audio":"to-bpm","default":"120","disabled":false,"kind":"number","label":"Target BPM","max":"400","min":"20","name":"waveform-editor-223","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.224","data-audio-action":"pitch-bpm","disabled":false,"label":"Use BPM conversion"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"data-audio":"pitch-summary","role":"status","text":"Select audio to change pitch or tempo.","variant":"output"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.227","data-audio-action":"pitch-original","disabled":false,"label":"A: original before pitch/time"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.228","data-audio-action":"pitch-preview","disabled":false,"label":"B: preview pitch / tempo"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.229","data-audio-action":"stop","disabled":false,"label":"Stop preview / cancel pitch/time"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.230","data-audio-action":"pitch-apply","disabled":false,"label":"Apply pitch / tempo"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"aria-live":"polite","data-audio":"pitch-status","role":"status","text":"Pitch and tempo are independent. Zero leaves that parameter unchanged.","variant":"output"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Positive tempo makes audio shorter; −50% doubles its duration and +100% halves it. Pitch totals −12 to +12 semitones, including cents. Input: up to 30 seconds; output: up to 60 seconds, within 64 MiB processing buffers. Select at least one FFT window. Larger windows favor sustained tones; smaller windows retain more timing detail. Transient protection resets phase at detected attacks. Experimental formant preservation estimates the broad spectral envelope and can color the sound; compare previews on your material. Preview starts at the selection beginning and plays up to five output seconds. Apply replaces only the selection, shifts following waveform audio, and keeps Undo. Stop or parameter changes cancel an unfinished render.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-quiet-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-process","data-audio":"pitch-panel","data-render-controls":true,"element":"details"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Targeted repair · clicks, gaps and clipping"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.237","data-audio":"repair-kind","default":"clicks","disabled":false,"label":"Repair tool","name":"waveform-editor-237","options":[{"label":"Remove isolated clicks","value":"clicks"},{"label":"Interpolate selected gap","value":"gap"},{"label":"Reconstruct clipped peaks","value":"clipping"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.239","data-audio":"repair-threshold","default":"0.9","disabled":false,"kind":"number","label":"Repair threshold (amplitude)","max":"1","min":"0.05","name":"waveform-editor-239","step":"0.01"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.241","data-audio":"repair-width","default":"16","disabled":false,"kind":"number","label":"Maximum repair width (samples)","max":"128","min":"1","name":"waveform-editor-241","step":"1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.242","data-audio-action":"repair-original","disabled":false,"label":"A: original before repair"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.243","data-audio-action":"repair-preview","disabled":false,"label":"B: preview targeted repair"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.244","data-audio-action":"repair-apply","disabled":false,"label":"Apply targeted repair"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.245","data-audio-action":"stop","disabled":false,"label":"Stop / cancel targeted repair"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"data-audio":"repair-status","role":"status","text":"Select the damaged audio and preview first.","variant":"output"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Click threshold is the minimum sample jump; lower values detect smaller spikes and may alter transients. Clipping threshold is the absolute peak level of damaged samples; set it to the recorded clipping level. Repairs use neighboring intact samples and keep duration. Gap repair needs a selection of 1–128 samples with two intact samples on each side. Automatic tools skip damage wider than the width limit or without intact boundaries. Reconstructed peaks can exceed full scale; lower gain before exporting. These estimates cannot recover the original lost recording. Maximum selection: 30 seconds.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-quiet-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-process","data-audio":"repair-panel","data-render-controls":true,"element":"details"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Markers, regions and volume envelope"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.252","data-precision":"name","default":"Region 1","disabled":false,"kind":"text","label":"Marker or region name","maxlength":100,"name":"waveform-editor-252"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.253","data-precision-action":"label-add","disabled":false,"label":"Name selection / cursor"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.255","data-precision":"labels","default":"","disabled":false,"label":"Saved marker or region","name":"waveform-editor-255","options":[]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.256","data-precision-action":"label-update","disabled":false,"label":"Update name and range"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.257","data-precision-action":"label-remove","disabled":false,"label":"Remove label"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"html":"<canvas data-precision=\"envelope\" width=\"640\" height=\"120\" style=\"width:100%;height:120px;touch-action:none\" aria-label=\"Volume envelope draft\"></canvas>"},"tag":"RawHtml"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.261","data-precision":"time","default":"0","disabled":false,"kind":"number","label":"Envelope time s","min":"0","name":"waveform-editor-261","step":"any"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.263","data-precision":"gain","default":"1","disabled":false,"kind":"number","label":"Envelope linear gain","max":"2","min":"0","name":"waveform-editor-263","step":"0.01"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.264","data-precision-action":"point-set","disabled":false,"label":"Set envelope point"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.266","data-precision":"points","default":"","disabled":false,"label":"Envelope point","name":"waveform-editor-266","options":[]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.267","data-precision-action":"point-remove","disabled":false,"label":"Remove point"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.268","data-precision-action":"envelope-clear","disabled":false,"label":"Clear envelope draft"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.269","data-precision-action":"envelope-apply","disabled":false,"label":"Apply envelope to selection"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"data-precision":"status","role":"status","text":"Click or drag the envelope to shape volume, or enter exact values.","variant":"output"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"The envelope spans the whole waveform. Gain 1 is unchanged, 0 is silence, 2 is twice the amplitude. Points interpolate linearly; the first and last gains extend to the edges. It is a draft until Apply renders the selected range and clears the draft. Undo restores both. Markers, regions and envelope drafts save in audio projects and follow time edits. Up to 256 labels and 128 points.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-quiet-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-process","element":"details"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Non-destructive effect rack"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.276","data-audio":"rack-family","default":"apply-effect","disabled":false,"label":"Rack effect family","name":"waveform-editor-276","options":[{"label":"Filters / dynamics / noise","value":"apply-effect"},{"label":"Pitch / tempo","value":"pitch-apply"},{"label":"Targeted repair","value":"repair-apply"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.278","data-audio":"rack-name","disabled":false,"kind":"text","label":"Rack effect name","maxlength":80,"name":"waveform-editor-278","placeholder":"Optional effect name"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.279","data-audio-action":"rack-add","disabled":false,"label":"Add current settings to rack"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.281","data-audio":"rack-entry","default":"","disabled":false,"label":"Rack effect","name":"waveform-editor-281","options":[]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.282","data-audio-action":"rack-load","disabled":false,"label":"Edit selected rack settings"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.283","data-audio-action":"rack-update","disabled":false,"label":"Update selected rack effect"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.284","data-audio-action":"rack-toggle","disabled":false,"label":"Bypass / enable effect"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.285","data-audio-action":"rack-up","disabled":false,"label":"Move effect earlier"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.286","data-audio-action":"rack-down","disabled":false,"label":"Move effect later"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.287","data-audio-action":"rack-remove","disabled":false,"label":"Remove rack effect"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"data-audio":"rack-summary","role":"status","text":"","variant":"output"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.290","data-audio-action":"rack-original","disabled":false,"label":"A: original before rack"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.291","data-audio-action":"rack-preview","disabled":false,"label":"B: preview effect rack"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.292","data-audio-action":"rack-export","disabled":false,"label":"Export selection through rack"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.293","data-audio-action":"rack-apply","disabled":false,"label":"Render rack into waveform and bypass"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.294","data-audio-action":"stop","disabled":false,"label":"Stop / cancel rack"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"aria-live":"polite","data-audio":"rack-status","role":"status","text":"Set an effect's controls, choose its family here, then add it to the rack.","variant":"output"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"The rack processes effects from top to bottom. Edit loads a node into its effect panel; Update captures those controls. Rack edits and settings save with the waveform and support Undo. Preview renders from the current selected source and plays up to five seconds; rack export downloads the whole processed selection. Ordinary waveform playback and export use source PCM. Render replaces the selection and bypasses every rack effect in one Undo step. Changing the rack does not automatically alter an existing preview; preview again to hear it. Start with up to 30 seconds; output is limited to 60 seconds / 64 MiB, and each processor retains its own limits. Gap repair uses intact samples outside the selection. This is an offline rack, not a real-time insert chain.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-quiet-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-process","data-render-controls":true,"element":"details"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Effect presets and repeat"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.301","data-audio":"preset-family","default":"apply-effect","disabled":false,"label":"Preset effect family","name":"waveform-editor-301","options":[{"label":"Filters / dynamics / noise","value":"apply-effect"},{"label":"Pitch / tempo","value":"pitch-apply"},{"label":"Targeted repair","value":"repair-apply"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.303","data-audio":"preset-name","default":"My preset","disabled":false,"kind":"text","label":"Effect preset name","maxlength":80,"name":"waveform-editor-303"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.304","data-audio-action":"preset-save","disabled":false,"label":"Save current effect settings"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.306","data-audio":"presets","default":"","disabled":false,"label":"Saved effect preset","name":"waveform-editor-306","options":[]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.307","data-audio-action":"preset-load","disabled":false,"label":"Load effect settings"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.308","data-audio-action":"repeat-effect","disabled":false,"label":"Repeat last effect"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"data-audio":"preset-status","role":"status","text":"Presets are saved with this audio project. Loading changes controls only.","variant":"output"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Choose the family whose current controls you want to save. Saving the same name replaces that preset. Noise recipes include the captured noise profile. Repeat applies the last successful filter, noise, pitch/time or targeted repair to the current selection with Undo. Shortcut: Ctrl/⌘+R while the waveform has focus. Up to 32 presets.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-quiet-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-wave-process","element":"details"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Audio tracks","variant":"h3"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"data-audio":"timeline-info","text":"No audio clips","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"element":"header"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.316","data-audio-action":"add-track","disabled":false,"label":"Add selection as track"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.317","data-audio-action":"add-clip","disabled":false,"label":"Add selection to selected track"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.318","data-audio-action":"play-mix","disabled":false,"label":"Play project mix"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.319","data-audio-action":"stop","disabled":false,"label":"Stop audio"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.320","data-audio-action":"export-mix","disabled":false,"label":"Export project mix WAV"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.321","data-audio-action":"undo","disabled":false,"label":"Undo timeline"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.322","data-audio-action":"redo","disabled":false,"label":"Redo timeline"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.324","data-audio":"cursor","default":"0","disabled":false,"kind":"number","label":"Timeline cursor s","min":"0","name":"waveform-editor-324","step":"0.001"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.stem","data-audio":"stem","default":"","label":"Aligned stem","name":"waveform-editor-stem","options":[]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.export-stem","data-audio-action":"export-stem","disabled":false,"label":"Export selected stem WAV"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"text":"Native VST3 effects","variant":"h4"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Process the selected aligned stem with a native effect. The render becomes a new audio track; your original audio stays editable.","variant":"p"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform.native.address","data-native-effect":"address","default":"http://127.0.0.1:5279","kind":"text","label":"Native host address","name":"waveform-native-address"},"tag":"Input"},{"children":[],"kind":"view-node","props":{"autocomplete":"off","controlKey":"waveform.native.code","data-native-effect":"code","default":"","kind":"password","label":"Native host pairing code","maxlength":64,"name":"waveform-native-code"},"tag":"Input"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform.native.connect","data-native-action":"connect","disabled":false,"label":"Connect native host"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform.native.module","data-native-effect":"module","default":"","label":"Native plugin","name":"waveform-native-module","options":[]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform.native.inspect","data-native-action":"inspect","disabled":true,"label":"Inspect plugin"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform.native.effect","data-native-effect":"effect","default":"","label":"Plugin effect","name":"waveform-native-effect","options":[]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform.native.load","data-native-action":"load","disabled":true,"label":"Load effect"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform.native.parameter","data-native-effect":"parameter","default":"","label":"Plugin parameter","name":"waveform-native-parameter","options":[]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform.native.value","data-native-effect":"value","default":"","kind":"number","label":"Parameter value (0–1)","max":1,"min":0,"name":"waveform-native-value","step":0.001},"tag":"Input"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform.native.tail","data-native-effect":"tail","default":"0","kind":"number","label":"Render tail seconds","max":30,"min":0,"name":"waveform-native-tail","step":0.1},"tag":"Input"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform.native.save","data-native-action":"save","disabled":true,"label":"Store effect settings"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform.native.render","data-native-action":"render","disabled":true,"label":"Render selected stem with VST3"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform.native.cancel","data-native-action":"cancel","disabled":true,"label":"Cancel native job"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"aria-live":"polite","data-native-effect":"status","text":"Connect a native effects host for this DAW. Load effect checks channel support without changing your audio.","variant":"output"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"data-native-effect":"saved","text":"No native effect settings stored in this project.","variant":"p"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform.native.preview","data-native-action":"preview","disabled":true,"label":"Prepare VST3 preview"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform.native.original","data-native-action":"original","disabled":true,"label":"Original preview"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform.native.processed","data-native-action":"processed","disabled":true,"label":"Processed preview"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform.native.keep","data-native-action":"keep","disabled":true,"label":"Keep preview as track"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform.native.discard","data-native-action":"discard","disabled":true,"label":"Discard preview"},"tag":"Action"}],"kind":"view-node","props":{"aria-label":"Native effect audition","className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"aria-live":"polite","data-native-effect":"preview-status","text":"Prepare a preview to compare before adding a track. Project, source or effect changes discard it.","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"aria-label":"Native VST3 effects","className":"ls-native-effects","data-native-effects":true,"element":"section"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"data-audio":"tracks","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"data-track":"label","text":"","variant":"strong"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.331","data-track":"name","disabled":false,"kind":"text","label":"Track name","maxlength":256,"name":"waveform-editor-331"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.333","data-track":"gain","disabled":false,"kind":"number","label":"Gain dB","max":"24","min":"-60","name":"waveform-editor-333","step":"0.1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.335","data-track":"pan","disabled":false,"kind":"range","label":"Pan","max":"1","min":"-1","name":"waveform-editor-335","step":"0.01"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.337","data-track":"mute","default":false,"disabled":false,"label":"Mute","name":"waveform-editor-337"},"tag":"Checkbox"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.339","data-track":"solo","default":false,"disabled":false,"label":"Solo","name":"waveform-editor-339"},"tag":"Checkbox"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.340","data-track-remove":true,"disabled":false,"label":"Remove track"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"className":"ls-audio-lane","data-track":"lane","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-audio-track","element":"section"},"tag":"Section"}],"kind":"view-node","props":{"data-audio":"track-template","element":"template"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.344","data-audio":"clip","default":"","disabled":false,"label":"Selected clip","name":"waveform-editor-344","options":[{"label":"Select a clip","value":""}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.346","data-audio":"destination","default":"","disabled":false,"label":"Destination track","name":"waveform-editor-346","options":[]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.348","data-audio":"clip-at","default":"0","disabled":false,"kind":"number","label":"Clip start s","min":"0","name":"waveform-editor-348","step":"0.001"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.350","data-audio":"clip-offset","default":"0","disabled":false,"kind":"number","label":"Source offset s","min":"0","name":"waveform-editor-350","step":"0.001"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.352","data-audio":"clip-length","default":"0","disabled":false,"kind":"number","label":"Clip duration s","min":"0","name":"waveform-editor-352","step":"0.001"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.354","data-audio":"clip-gain","default":"0","disabled":false,"kind":"number","label":"Clip gain dB","max":"24","min":"-60","name":"waveform-editor-354","step":"0.1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.356","data-audio":"clip-fade-in","default":"0","disabled":false,"kind":"number","label":"Fade in s","min":"0","name":"waveform-editor-356","step":"0.001"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.358","data-audio":"clip-fade-out","default":"0","disabled":false,"kind":"number","label":"Fade out s","min":"0","name":"waveform-editor-358","step":"0.001"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.359","data-audio-action":"update-clip","disabled":false,"label":"Apply clip settings"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.360","data-audio-action":"split","disabled":false,"label":"Split at cursor"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.361","data-audio-action":"duplicate","disabled":false,"label":"Duplicate clip"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.362","data-audio-action":"delete","disabled":false,"label":"Delete clip"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.364","data-audio":"ripple","default":false,"disabled":false,"label":"Ripple following clips on this track","name":"waveform-editor-364"},"tag":"Checkbox"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.365","data-audio-action":"crossfade","disabled":false,"label":"Crossfade overlap"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.366","data-audio-action":"edit-clip","disabled":false,"label":"Copy clip to waveform"},"tag":"Action"}],"kind":"view-node","props":{"aria-label":"Selected audio clip","className":"ls-wave-tools","element":"div","role":"group"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"text":"Track automation","variant":"h4"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Gain and pan follow project time after inserts. Click the curve to set a point, or enter exact values. Undo and Redo use timeline history.","variant":"p"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"audio.automation.track","data-automation":"track","default":"","label":"Audio track","name":"automation-track","options":[]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"controlKey":"audio.automation.parameter","data-automation":"parameter","default":"gain","label":"Parameter","name":"automation-parameter","options":[{"label":"Gain (dB)","value":"gain"},{"label":"Pan","value":"pan"}]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"controlKey":"audio.automation.interpolation","data-automation":"interpolation","default":"linear","label":"Between points","name":"automation-interpolation","options":[{"label":"Linear ramp","value":"linear"},{"label":"Hold value","value":"hold"}]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"controlKey":"audio.automation.point","data-automation":"point","default":"","label":"Saved point","name":"automation-point","options":[]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"controlKey":"audio.automation.time","data-automation":"time","default":"0","kind":"number","label":"Time (seconds)","min":"0","name":"automation-time","step":"any"},"tag":"Input"},{"children":[],"kind":"view-node","props":{"controlKey":"audio.automation.value","data-automation":"value","default":"0","kind":"number","label":"Value","max":"24","min":"-60","name":"automation-value","step":".5"},"tag":"Input"},{"children":[],"kind":"view-node","props":{"controlKey":"audio.automation.cursor","data-automation-action":"cursor","label":"Use timeline cursor"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"audio.automation.set","data-automation-action":"set","label":"Set point"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"audio.automation.delete","data-automation-action":"delete","label":"Delete point"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"audio.automation.clear","data-automation-action":"clear","label":"Clear lane"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-automation-controls","element":"section"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"html":"<canvas width=\"900\" height=\"140\" data-automation=\"curve\" aria-label=\"Automation curve\" class=\"ls-automation-curve\"></canvas>"},"tag":"RawHtml"},{"children":[],"kind":"view-node","props":{"aria-live":"polite","data-automation":"status","role":"status","text":"Add an audio track to draw automation.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-audio-automation","data-automation-editor":"","element":"section"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Select a clip to edit it. Drag clips to move them in time or between tracks. Left/right arrows on a clip move one sample; hold Ctrl/⌘ for one second. Clips and recorded takes are resampled to the timeline rate when added. Clip changes are non-destructive. Copy clip to waveform opens its source range for processing; add the result to the timeline when ready.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-quiet-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"aria-label":"Audio clip timeline","className":"ls-audio-timeline","data-audio":"timeline","element":"section"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Record audio"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.372","data-audio":"device","default":"","disabled":false,"label":"Microphone","name":"waveform-editor-372","options":[{"label":"System default input","value":""}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.373","data-audio-action":"devices","disabled":false,"label":"Refresh input devices"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.375","data-audio":"channels","default":"1","disabled":false,"label":"Channels","name":"waveform-editor-375","options":[{"label":"Mono","value":"1"},{"label":"Stereo","value":"2"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.377","data-audio":"overdub","default":false,"disabled":false,"label":"Play timeline while recording","name":"waveform-editor-377"},"tag":"Checkbox"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.379","data-audio":"monitor","default":false,"disabled":false,"label":"Monitor input (use headphones)","name":"waveform-editor-379"},"tag":"Checkbox"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.381","data-audio":"latency","default":"0","disabled":false,"kind":"number","label":"Input latency correction ms","max":"2000","min":"0","name":"waveform-editor-381","step":"1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.382","data-audio-action":"record","disabled":false,"label":"Record microphone"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.383","data-audio-action":"record-stop","disabled":true,"label":"Finish recording"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"html":"<meter data-audio=\"meter\" min=\"0\" max=\"1\" value=\"0\" aria-label=\"Microphone peak level\"></meter>"},"tag":"RawHtml"},{"children":[],"kind":"view-node","props":{"data-audio":"record-status","role":"status","text":"Ready. Recording creates a new audio track at the timeline cursor.","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Measure recording latency"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.391","data-audio-action":"calibrate","disabled":false,"label":"Measure round-trip latency"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"waveform-editor.392","data-audio-action":"use-latency","disabled":true,"label":"Use measured correction"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"data-audio":"latency-status","role":"status","text":"No measured correction.","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-wave-tools","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Measure plays three quiet test tones and records 2.5 seconds with input monitoring off. Let the selected microphone hear the speakers, or connect an audio loopback cable. Keep levels low. The result includes output, input and acoustic travel time; remeasure when your audio route changes. Test audio is discarded. If the tones cannot be identified consistently, no correction is applied.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-quiet-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"element":"details"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Capture stops at five minutes or 64 MiB of PCM. Input latency correction shifts the take earlier; calibrate it for your device. Microphone audio stays in this browser and your saved project.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-quiet-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"element":"details"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"aria-live":"polite","data-wave":"status","role":"status","text":"Import audio, open a prepared mix, or restore a saved audio project.","variant":"p"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Editing help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Drag a range, or enter exact seconds or sample positions. Double-click selects all. Ctrl/⌘ + wheel zooms around the pointer; wheel scrolls. Space plays/stops; Ctrl/⌘ A, X, C, V, Z, Shift Z; Delete removes the range. Left/right moves one sample; hold Shift to extend. Home/End jumps to the audio edges. Scrub plays short previews as you drag.","variant":"p"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Open prepared mix copies the prepared song; music code and song exports keep their own state. Audio project files include waveform edits, tracks, selection and undo history. Local recovery is browser-specific; save a project file for a portable copy. Each open editor writes a separate recovery. WAV export is 16-bit PCM. Browser imports may resample to the audio device rate. Undo retains up to 32 changes within a 128 MiB budget per editor. Timeline limits: 16 tracks, 128 clips, 64 MiB source PCM and 64 MiB stereo mix.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"element":"details"},"tag":"Section"}],"kind":"view-node","props":{"aria-label":"Waveform editor","className":"ls-waveform","data-waveform-editor":true,"element":"section","id":"live-score-waveform","tabIndex":0},"tag":"Section"}],"kind":"view-node","props":{"className":"media-fragment","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"className":"ls-daw-caption","text":"SOUND DESIGN","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Create an instrument","variant":"h3"},"tag":"Text"}],"kind":"view-node","props":{"element":"header"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Design a patch, assign it to a musical channel, then Prepare score to hear it. Reuse its name in Music code.","variant":"p"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"instrument-editor.9","data-instrument":"name","default":"my_synth","disabled":false,"kind":"text","label":"Name","maxlength":48,"name":"instrument-editor-9","pattern":"[a-z][a-z0-9_]*","required":true},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"instrument-editor.11","data-instrument":"lane","default":"melody","disabled":false,"label":"Channel","name":"instrument-editor-11","options":[{"label":"bass","value":"bass"},{"label":"pads","value":"pads"},{"label":"melody","value":"melody"},{"label":"arp","value":"arp"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"instrument-editor.13","data-instrument":"base","default":"warm_pad","disabled":false,"label":"Starting patch","name":"instrument-editor-13","options":[{"label":"warm_pad","value":"warm_pad"},{"label":"bright_lead","value":"bright_lead"},{"label":"bell","value":"bell"},{"label":"hollow","value":"hollow"},{"label":"saw_bass","value":"saw_bass"},{"label":"sub_sine","value":"sub_sine"},{"label":"square_lead","value":"square_lead"},{"label":"triangle_keys","value":"triangle_keys"},{"label":"organ","value":"organ"},{"label":"pluck","value":"pluck"},{"label":"glass","value":"glass"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-instrument-fields","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Parameters"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Enable a parameter to override the starting patch.","variant":"p"},"tag":"Text"},{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"data-param-enable":"osc1","label":"Enable Waveform","name":"enable-osc1"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"data-instrument-param":"osc1","disabled":true,"label":"Waveform","name":"instrument-osc1","options":[{"label":"sine","value":"sine"},{"label":"triangle","value":"triangle"},{"label":"saw","value":"saw"},{"label":"square","value":"square"},{"label":"additive","value":"additive"}]},"tag":"Select"}],"kind":"view-node","props":{},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-param-enable":"filter","label":"Enable Filter","name":"enable-filter"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"data-instrument-param":"filter","disabled":true,"label":"Filter","name":"instrument-filter","options":[{"label":"none","value":"none"},{"label":"lp","value":"lp"},{"label":"hp","value":"hp"},{"label":"bp","value":"bp"},{"label":"notch","value":"notch"}]},"tag":"Select"}],"kind":"view-node","props":{},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-param-enable":"osc1.detune","label":"Enable Detune (cents)","name":"enable-osc1.detune"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"data-instrument-param":"osc1.detune","default":"0","disabled":true,"kind":"number","label":"Detune (cents)","max":"100","min":"-100","name":"instrument-osc1.detune","step":"any"},"tag":"Input"}],"kind":"view-node","props":{},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-param-enable":"cutoff","label":"Enable Cutoff (Hz)","name":"enable-cutoff"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"data-instrument-param":"cutoff","default":"20000","disabled":true,"kind":"number","label":"Cutoff (Hz)","max":"20000","min":"20","name":"instrument-cutoff","step":"any"},"tag":"Input"}],"kind":"view-node","props":{},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-param-enable":"res","label":"Enable Resonance","name":"enable-res"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"data-instrument-param":"res","default":"0","disabled":true,"kind":"number","label":"Resonance","max":"1","min":"0","name":"instrument-res","step":"any"},"tag":"Input"}],"kind":"view-node","props":{},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-param-enable":"amp.a","label":"Enable Attack (ms)","name":"enable-amp.a"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"data-instrument-param":"amp.a","default":"8","disabled":true,"kind":"number","label":"Attack (ms)","max":"8000","min":"0","name":"instrument-amp.a","step":"any"},"tag":"Input"}],"kind":"view-node","props":{},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-param-enable":"amp.d","label":"Enable Decay (ms)","name":"enable-amp.d"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"data-instrument-param":"amp.d","default":"120","disabled":true,"kind":"number","label":"Decay (ms)","max":"8000","min":"0","name":"instrument-amp.d","step":"any"},"tag":"Input"}],"kind":"view-node","props":{},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-param-enable":"amp.s","label":"Enable Sustain","name":"enable-amp.s"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"data-instrument-param":"amp.s","default":"0.7","disabled":true,"kind":"number","label":"Sustain","max":"1","min":"0","name":"instrument-amp.s","step":"any"},"tag":"Input"}],"kind":"view-node","props":{},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-param-enable":"amp.r","label":"Enable Release (ms)","name":"enable-amp.r"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"data-instrument-param":"amp.r","default":"180","disabled":true,"kind":"number","label":"Release (ms)","max":"8000","min":"0","name":"instrument-amp.r","step":"any"},"tag":"Input"}],"kind":"view-node","props":{},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-param-enable":"gain","label":"Enable Gain","name":"enable-gain"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"data-instrument-param":"gain","default":"0.3","disabled":true,"kind":"number","label":"Gain","max":"1","min":"0","name":"instrument-gain","step":"any"},"tag":"Input"}],"kind":"view-node","props":{},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-param-enable":"pan","label":"Enable Pan","name":"enable-pan"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"data-instrument-param":"pan","default":"0","disabled":true,"kind":"number","label":"Pan","max":"1","min":"-1","name":"instrument-pan","step":"any"},"tag":"Input"}],"kind":"view-node","props":{},"tag":"Section"}],"kind":"view-node","props":{"className":"media-fragment"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-instrument-fields","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"element":"details","open":true},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"instrument-editor.18","data-instrument":"add-track","disabled":false,"label":"Add instrument track"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"instrument-editor.19","data-instrument":"update-track","disabled":true,"label":"Update selected track"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"className":"ls-legacy-patch","controlKey":"instrument-editor.20","data-instrument":"create","disabled":false,"label":"Assign to score channel"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"data-instrument":"status","role":"status","text":"Custom instruments are saved with your score draft.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"aria-label":"Instrument builder","className":"ls-instrument-editor","data-instrument-editor":true,"element":"section"},"tag":"Section"}],"kind":"view-node","props":{"className":"media-fragment","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"text":"Prepare a score to open its tracks, clips and envelopes.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"aria-label":"Track session","className":"ls-session-editor","data-session-editor":true,"element":"section"},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Visuals","variant":"h3"},"tag":"Text"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.7","data-visual":"fullscreen","disabled":false,"label":"Fullscreen"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.12","data-scope-surface":"shader","data-visual-workspace":"shader","disabled":false,"label":"Shaders","pressed":true},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-shader-scope","data-scope-surface":"trace","data-visual-workspace":"trace","disabled":false,"label":"Shader → scope","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.13","data-scope-surface":"scope","data-visual-workspace":"scope","disabled":false,"label":"Oscilloscope","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.14","data-scope-surface":"spectrum","data-visual-workspace":"spectrum","disabled":false,"label":"Spectrogram","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.18","data-scope-surface":"geometry","data-visual-workspace":"geometry","disabled":false,"label":"Geometry","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.19","data-field-open":true,"data-visual-workspace":"field","disabled":false,"label":"4D field","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.20","data-scope-surface":"plate","data-visual-workspace":"plate","disabled":false,"label":"Resonant plate","pressed":false},"tag":"Action"}],"kind":"view-node","props":{"aria-label":"Visual workspace","className":"ls-visual-workspaces","element":"nav"},"tag":"Section"}],"kind":"view-node","props":{"element":"header"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"aria-live":"polite","className":"ls-sound-source","data-scope":"source","role":"status","text":"Sound · stopped","variant":"output"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Geometry instrument"},"tag":"Text"}],"kind":"view-node","props":{"element":"legend"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Vector shape","controlKey":"visual-performance-visual.36","data-scope":"shape","default":"circle","disabled":false,"label":"From","name":"visual-performance-visual-36","options":[{"label":"Circle","value":"circle"},{"label":"Lissajous 3:2","value":"lissajous"},{"label":"Diamond","value":"diamond"},{"label":"Rose","value":"rose"},{"label":"Orbit knot","value":"orbit"},{"label":"Five-point star","value":"star"},{"label":"Triangle","value":"triangle"},{"label":"Hexagon","value":"hexagon"},{"label":"Spirograph","value":"spirograph"},{"label":"Torus knot","value":"torus"},{"label":"Circle grid 3 × 3","value":"grid"},{"label":"Honeycomb","value":"honeycomb"},{"label":"Smooth 4D field","value":"field"},{"label":"Captured shader contour","value":"shader"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Target shape","controlKey":"visual-performance-visual.38","data-scope":"target","default":"rose","disabled":false,"label":"To","name":"visual-performance-visual-38","options":[{"label":"Rose","value":"rose"},{"label":"Circle","value":"circle"},{"label":"Lissajous 3:2","value":"lissajous"},{"label":"Diamond","value":"diamond"},{"label":"Orbit knot","value":"orbit"},{"label":"Five-point star","value":"star"},{"label":"Triangle","value":"triangle"},{"label":"Hexagon","value":"hexagon"},{"label":"Spirograph","value":"spirograph"},{"label":"Torus knot","value":"torus"},{"label":"Circle grid 3 × 3","value":"grid"},{"label":"Honeycomb","value":"honeycomb"},{"label":"Smooth 4D field","value":"field"},{"label":"Captured shader contour","value":"shader"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Shape morph","controlKey":"visual-performance-visual.40","data-scope":"morph","default":"0","disabled":false,"kind":"range","label":"Morph","max":"1","min":"0","name":"visual-performance-visual-40","step":"0.001"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Morph motion rate","controlKey":"visual-performance-visual.42","data-scope":"motion","default":"0","disabled":false,"kind":"range","label":"Motion Hz","max":"2","min":"0","name":"visual-performance-visual-42","step":"0.01"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Journey seed","controlKey":"visual-performance-visual.44","data-scope":"seed","default":"1","disabled":false,"kind":"number","label":"Seed","max":"4294967295","min":"0","name":"visual-performance-visual-44","step":"1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.45","data-scope":"journey","disabled":false,"label":"Generate journey"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"text":"Harmony voices share the MIDI root and morph, with normalized level. Tiled paths include connecting strokes; summed voices reshape the trace.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-scope-section","data-visual-for":"geometry","element":"fieldset","hidden":true},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"className":"ls-daw-caption","text":"FIELD INSTRUMENT","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Smooth 4D field","variant":"h4"},"tag":"Text"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Scan a smooth field into sound. Rotate it to reshape the harmonics.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-field-heading","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"checked":true,"disabled":true,"hostBinding":{"action":"virtual.field.follow","event":"change","key":"follow","read":"checked"},"hostOutputs":{"checked":"follow","disabled":"busy"},"label":"Follow prepared take","name":"virtual-field-arrangement-follow"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.field.clip","event":"change","key":"clip","read":"text"},"hostOutputs":{"disabled":"clipDisabled","options":"clips","value":"clip"},"label":"Arrangement field clip","name":"virtual-field-arrangement-clip","options":[]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.field.point","event":"change","key":"point","read":"text"},"hostOutputs":{"disabled":"editDisabled","options":"points","value":"point"},"label":"Curve point","name":"virtual-field-arrangement-point","options":[]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"html":"<svg id=\"virtual-field-arrangement-plot\" viewBox=\"0 0 320 100\" preserveAspectRatio=\"none\" role=\"img\" aria-label=\"Field curves: XW, XY and Interaction\"><path data-field-arrangement-curve=\"xw\"/><path data-field-arrangement-curve=\"xy\"/><path data-field-arrangement-curve=\"interaction\"/><line data-field-arrangement-playhead x1=\"0\" x2=\"0\" y1=\"0\" y2=\"100\"/></svg>"},"tag":"RawHtml"},{"children":[],"kind":"view-node","props":{"text":"XW · XY · Interaction"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"default":0,"disabled":true,"hostBinding":{"action":"virtual.field.scrub","event":"input","key":"beat","read":"number"},"hostOutputs":{"disabled":"scrubDisabled","max":"duration","value":"beat"},"kind":"range","label":"Explore clip beat","max":4,"min":0,"name":"virtual-field-arrangement-scrub","step":0.01},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":0,"disabled":true,"hostBinding":{"action":"virtual.field.value","event":"input","key":"xw","read":"number"},"hostOutputs":{"disabled":"editDisabled","value":"xw"},"kind":"number","label":"Point XW (degrees)","max":180.0,"min":-180.0,"name":"virtual-field-arrangement-xw","step":1.0},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":0,"disabled":true,"hostBinding":{"action":"virtual.field.value","event":"input","key":"xy","read":"number"},"hostOutputs":{"disabled":"editDisabled","value":"xy"},"kind":"number","label":"Point XY (degrees)","max":180.0,"min":-180.0,"name":"virtual-field-arrangement-xy","step":1.0},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":0,"disabled":true,"hostBinding":{"action":"virtual.field.value","event":"input","key":"interaction","read":"number"},"hostOutputs":{"disabled":"editDisabled","value":"interaction"},"kind":"number","label":"Point interaction","max":1.0,"min":0.0,"name":"virtual-field-arrangement-interaction","step":0.01},"tag":"Input"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.field.edit","event":"click"},"hostOutputs":{"disabled":"loadDisabled"},"id":"virtual-field-arrangement-edit","label":"Load draft curves"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.field.save","event":"click"},"hostOutputs":{"disabled":"saveDisabled"},"id":"virtual-field-arrangement-save","label":"Save point to draft"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"hostOutput":"status","id":"virtual-field-arrangement-status","role":"status","text":"Prepare an arrangement with a 4D field clip to explore its movement."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Scrub during playback to hear the arrangement; stopped scrubbing stays silent. Load draft curves to edit a point. The first and last points stay linked for a closed loop. Save changes the draft; Prepare adopts it into audio. Undo draft replacement restores the edit."},"tag":"Text"}],"kind":"view-node","props":{"hostCapability":"virtual.field-arrangement","hostInitial":{"follow":true},"hostPlotId":"virtual-field-arrangement-plot","hostVersion":1,"id":"virtual-field-arrangement","title":"Arrangement movement"},"tag":"Card"}],"kind":"view-node","props":{"data-cre8-host-artifact":"{\"schema\":\"cre8.view.ir\",\"version\":1,\"template_id\":\"virtual.field-arrangement\",\"source_hash\":\"cf9515fc9b956bdfd98d73b62f463ea1182a887bd3811dac029e19aca5da7516\",\"context_hash\":\"09742b83331e8f809bca436422bb0ffc9f4827a49af2cfdd54b810442588cfa0\",\"tree_hash\":\"89b2976c5da8160acbb88dc335b0d823ac78d01e4120fe883a233497d25a3997\",\"tree_json\":\"{\\\"children\\\":[{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"checked\\\":true,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.field.follow\\\",\\\"event\\\":\\\"change\\\",\\\"key\\\":\\\"follow\\\",\\\"read\\\":\\\"checked\\\"},\\\"hostOutputs\\\":{\\\"checked\\\":\\\"follow\\\",\\\"disabled\\\":\\\"busy\\\"},\\\"label\\\":\\\"Follow prepared take\\\",\\\"name\\\":\\\"virtual-field-arrangement-follow\\\"},\\\"tag\\\":\\\"Checkbox\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.field.clip\\\",\\\"event\\\":\\\"change\\\",\\\"key\\\":\\\"clip\\\",\\\"read\\\":\\\"text\\\"},\\\"hostOutputs\\\":{\\\"disabled\\\":\\\"clipDisabled\\\",\\\"options\\\":\\\"clips\\\",\\\"value\\\":\\\"clip\\\"},\\\"label\\\":\\\"Arrangement field clip\\\",\\\"name\\\":\\\"virtual-field-arrangement-clip\\\",\\\"options\\\":[]},\\\"tag\\\":\\\"Select\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.field.point\\\",\\\"event\\\":\\\"change\\\",\\\"key\\\":\\\"point\\\",\\\"read\\\":\\\"text\\\"},\\\"hostOutputs\\\":{\\\"disabled\\\":\\\"editDisabled\\\",\\\"options\\\":\\\"points\\\",\\\"value\\\":\\\"point\\\"},\\\"label\\\":\\\"Curve point\\\",\\\"name\\\":\\\"virtual-field-arrangement-point\\\",\\\"options\\\":[]},\\\"tag\\\":\\\"Select\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"html\\\":\\\"<svg id=\\\\\\\"virtual-field-arrangement-plot\\\\\\\" viewBox=\\\\\\\"0 0 320 100\\\\\\\" preserveAspectRatio=\\\\\\\"none\\\\\\\" role=\\\\\\\"img\\\\\\\" aria-label=\\\\\\\"Field curves: XW, XY and Interaction\\\\\\\"><path data-field-arrangement-curve=\\\\\\\"xw\\\\\\\"/><path data-field-arrangement-curve=\\\\\\\"xy\\\\\\\"/><path data-field-arrangement-curve=\\\\\\\"interaction\\\\\\\"/><line data-field-arrangement-playhead x1=\\\\\\\"0\\\\\\\" x2=\\\\\\\"0\\\\\\\" y1=\\\\\\\"0\\\\\\\" y2=\\\\\\\"100\\\\\\\"/></svg>\\\"},\\\"tag\\\":\\\"RawHtml\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"XW · XY · Interaction\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":0,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.field.scrub\\\",\\\"event\\\":\\\"input\\\",\\\"key\\\":\\\"beat\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"disabled\\\":\\\"scrubDisabled\\\",\\\"max\\\":\\\"duration\\\",\\\"value\\\":\\\"beat\\\"},\\\"kind\\\":\\\"range\\\",\\\"label\\\":\\\"Explore clip beat\\\",\\\"max\\\":4,\\\"min\\\":0,\\\"name\\\":\\\"virtual-field-arrangement-scrub\\\",\\\"step\\\":0.01},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":0,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.field.value\\\",\\\"event\\\":\\\"input\\\",\\\"key\\\":\\\"xw\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"disabled\\\":\\\"editDisabled\\\",\\\"value\\\":\\\"xw\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Point XW (degrees)\\\",\\\"max\\\":180.0,\\\"min\\\":-180.0,\\\"name\\\":\\\"virtual-field-arrangement-xw\\\",\\\"step\\\":1.0},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":0,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.field.value\\\",\\\"event\\\":\\\"input\\\",\\\"key\\\":\\\"xy\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"disabled\\\":\\\"editDisabled\\\",\\\"value\\\":\\\"xy\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Point XY (degrees)\\\",\\\"max\\\":180.0,\\\"min\\\":-180.0,\\\"name\\\":\\\"virtual-field-arrangement-xy\\\",\\\"step\\\":1.0},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":0,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.field.value\\\",\\\"event\\\":\\\"input\\\",\\\"key\\\":\\\"interaction\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"disabled\\\":\\\"editDisabled\\\",\\\"value\\\":\\\"interaction\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Point interaction\\\",\\\"max\\\":1.0,\\\"min\\\":0.0,\\\"name\\\":\\\"virtual-field-arrangement-interaction\\\",\\\"step\\\":0.01},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.field.edit\\\",\\\"event\\\":\\\"click\\\"},\\\"hostOutputs\\\":{\\\"disabled\\\":\\\"loadDisabled\\\"},\\\"id\\\":\\\"virtual-field-arrangement-edit\\\",\\\"label\\\":\\\"Load draft curves\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.field.save\\\",\\\"event\\\":\\\"click\\\"},\\\"hostOutputs\\\":{\\\"disabled\\\":\\\"saveDisabled\\\"},\\\"id\\\":\\\"virtual-field-arrangement-save\\\",\\\"label\\\":\\\"Save point to draft\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"hostOutput\\\":\\\"status\\\",\\\"id\\\":\\\"virtual-field-arrangement-status\\\",\\\"role\\\":\\\"status\\\",\\\"text\\\":\\\"Prepare an arrangement with a 4D field clip to explore its movement.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"Scrub during playback to hear the arrangement; stopped scrubbing stays silent. Load draft curves to edit a point. The first and last points stay linked for a closed loop. Save changes the draft; Prepare adopts it into audio. Undo draft replacement restores the edit.\\\"},\\\"tag\\\":\\\"Text\\\"}],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"hostCapability\\\":\\\"virtual.field-arrangement\\\",\\\"hostInitial\\\":{\\\"follow\\\":true},\\\"hostPlotId\\\":\\\"virtual-field-arrangement-plot\\\",\\\"hostVersion\\\":1,\\\"id\\\":\\\"virtual-field-arrangement\\\",\\\"title\\\":\\\"Arrangement movement\\\"},\\\"tag\\\":\\\"Card\\\"}\",\"tree\":{\"children\":[{\"children\":[],\"kind\":\"view-node\",\"props\":{\"checked\":true,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.field.follow\",\"event\":\"change\",\"key\":\"follow\",\"read\":\"checked\"},\"hostOutputs\":{\"checked\":\"follow\",\"disabled\":\"busy\"},\"label\":\"Follow prepared take\",\"name\":\"virtual-field-arrangement-follow\"},\"tag\":\"Checkbox\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.field.clip\",\"event\":\"change\",\"key\":\"clip\",\"read\":\"text\"},\"hostOutputs\":{\"disabled\":\"clipDisabled\",\"options\":\"clips\",\"value\":\"clip\"},\"label\":\"Arrangement field clip\",\"name\":\"virtual-field-arrangement-clip\",\"options\":[]},\"tag\":\"Select\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.field.point\",\"event\":\"change\",\"key\":\"point\",\"read\":\"text\"},\"hostOutputs\":{\"disabled\":\"editDisabled\",\"options\":\"points\",\"value\":\"point\"},\"label\":\"Curve point\",\"name\":\"virtual-field-arrangement-point\",\"options\":[]},\"tag\":\"Select\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"html\":\"<svg id=\\\"virtual-field-arrangement-plot\\\" viewBox=\\\"0 0 320 100\\\" preserveAspectRatio=\\\"none\\\" role=\\\"img\\\" aria-label=\\\"Field curves: XW, XY and Interaction\\\"><path data-field-arrangement-curve=\\\"xw\\\"/><path data-field-arrangement-curve=\\\"xy\\\"/><path data-field-arrangement-curve=\\\"interaction\\\"/><line data-field-arrangement-playhead x1=\\\"0\\\" x2=\\\"0\\\" y1=\\\"0\\\" y2=\\\"100\\\"/></svg>\"},\"tag\":\"RawHtml\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"XW · XY · Interaction\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":0,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.field.scrub\",\"event\":\"input\",\"key\":\"beat\",\"read\":\"number\"},\"hostOutputs\":{\"disabled\":\"scrubDisabled\",\"max\":\"duration\",\"value\":\"beat\"},\"kind\":\"range\",\"label\":\"Explore clip beat\",\"max\":4,\"min\":0,\"name\":\"virtual-field-arrangement-scrub\",\"step\":0.01},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":0,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.field.value\",\"event\":\"input\",\"key\":\"xw\",\"read\":\"number\"},\"hostOutputs\":{\"disabled\":\"editDisabled\",\"value\":\"xw\"},\"kind\":\"number\",\"label\":\"Point XW (degrees)\",\"max\":180.0,\"min\":-180.0,\"name\":\"virtual-field-arrangement-xw\",\"step\":1.0},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":0,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.field.value\",\"event\":\"input\",\"key\":\"xy\",\"read\":\"number\"},\"hostOutputs\":{\"disabled\":\"editDisabled\",\"value\":\"xy\"},\"kind\":\"number\",\"label\":\"Point XY (degrees)\",\"max\":180.0,\"min\":-180.0,\"name\":\"virtual-field-arrangement-xy\",\"step\":1.0},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":0,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.field.value\",\"event\":\"input\",\"key\":\"interaction\",\"read\":\"number\"},\"hostOutputs\":{\"disabled\":\"editDisabled\",\"value\":\"interaction\"},\"kind\":\"number\",\"label\":\"Point interaction\",\"max\":1.0,\"min\":0.0,\"name\":\"virtual-field-arrangement-interaction\",\"step\":0.01},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.field.edit\",\"event\":\"click\"},\"hostOutputs\":{\"disabled\":\"loadDisabled\"},\"id\":\"virtual-field-arrangement-edit\",\"label\":\"Load draft curves\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.field.save\",\"event\":\"click\"},\"hostOutputs\":{\"disabled\":\"saveDisabled\"},\"id\":\"virtual-field-arrangement-save\",\"label\":\"Save point to draft\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"hostOutput\":\"status\",\"id\":\"virtual-field-arrangement-status\",\"role\":\"status\",\"text\":\"Prepare an arrangement with a 4D field clip to explore its movement.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"Scrub during playback to hear the arrangement; stopped scrubbing stays silent. Load draft curves to edit a point. The first and last points stay linked for a closed loop. Save changes the draft; Prepare adopts it into audio. Undo draft replacement restores the edit.\"},\"tag\":\"Text\"}],\"kind\":\"view-node\",\"props\":{\"hostCapability\":\"virtual.field-arrangement\",\"hostInitial\":{\"follow\":true},\"hostPlotId\":\"virtual-field-arrangement-plot\",\"hostVersion\":1,\"id\":\"virtual-field-arrangement\",\"title\":\"Arrangement movement\"},\"tag\":\"Card\"},\"execution\":{\"portable_ir_schema\":\"cre8.view.ir\",\"portable_ir_tree_hash\":\"89b2976c5da8160acbb88dc335b0d823ac78d01e4120fe883a233497d25a3997\",\"portable_ir_version\":1,\"producer\":\"rust-ssr\"}}","data-cre8-host-component":"virtual.field-arrangement","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"aria-label":"Arrangement movement","className":"ls-field-arrangement","element":"section"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Field visual","controlKey":"visual-smooth-field.11","data-field-view":true,"default":"xy","disabled":false,"label":"View sound","name":"visual-smooth-field-11","options":[{"label":"Stereo orbit","value":"xy"},{"label":"Waveforms","value":"wave"},{"label":"3D spectrogram","value":"spectrum"},{"label":"Shader","value":"shader"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-smooth-field.12","data-field-experiment":"save","disabled":false,"label":"Save experiment"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-smooth-field.13","data-field-experiment":"recall","disabled":false,"label":"Recall saved"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-field-experiment","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"className":"ls-field-save-help","text":"One saved experiment on this browser: field, gesture, frequency, voices and visual choice. Shader edits and display settings stay separate.","variant":"p"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"aria-live":"polite","data-field-saved":true,"role":"status","text":"","variant":"output"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"visual-smooth-field.17","data-field-preset":"{\"xw\":0,\"xy\":0,\"interaction\":0}","disabled":false,"label":"Pure orbit"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-smooth-field.18","data-field-preset":"{\"xw\":25,\"xy\":-20,\"interaction\":0.65}","disabled":false,"label":"Folded ribbon"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-smooth-field.19","data-field-preset":"{\"xw\":75,\"xy\":-20,\"interaction\":0.9}","disabled":false,"label":"Braided loop"},"tag":"Action"}],"kind":"view-node","props":{"aria-label":"Field starting shapes","className":"ls-field-presets","element":"div","role":"group"},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"html":"<svg viewbox=\"0 0 320 160\" preserveaspectratio=\"none\" aria-hidden=\"true\"><path d=\"M160 0V160M0 80H320\"></path><circle data-field-pad-marker cx=\"182.2\" cy=\"88.9\" r=\"5\"></circle></svg>"},"tag":"RawHtml"},{"children":[],"kind":"view-node","props":{"className":"ls-field-pad-x","text":"XW · left / right","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"className":"ls-field-pad-y","text":"XY · up / down","variant":"span"},"tag":"Text"}],"kind":"view-node","props":{"aria-describedby":"field-pad-help","aria-label":"Field rotation pad","className":"ls-field-pad","controlKey":"visual-smooth-field.22","data-field-pad":true,"disabled":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"id":"field-pad-help","text":"Drag to rotate. Arrow keys move 5°; Shift moves 1°; Home centres. Press Play instrument to hear it.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-field-pad-wrap","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Field rotation XW","controlKey":"visual-smooth-field.30","data-scope":"field-xw","default":"25","disabled":false,"kind":"range","label":"Rotate XW","max":"180","min":"-180","name":"visual-smooth-field-30","step":"any"},"tag":"Input"},{"children":[],"kind":"view-node","props":{"data-field-value":"xw","text":"25°","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Field rotation XY","controlKey":"visual-smooth-field.33","data-scope":"field-xy","default":"-20","disabled":false,"kind":"range","label":"Rotate XY","max":"180","min":"-180","name":"visual-smooth-field-33","step":"any"},"tag":"Input"},{"children":[],"kind":"view-node","props":{"data-field-value":"xy","text":"−20°","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Field interaction","controlKey":"visual-smooth-field.36","data-scope":"field-interaction","default":"0.65","disabled":false,"kind":"range","label":"Interaction","max":"1","min":"0","name":"visual-smooth-field-36","step":"0.01"},"tag":"Input"},{"children":[],"kind":"view-node","props":{"data-field-value":"interaction","text":"65%","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-field-knobs","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-field-play","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"visual-smooth-field.39","data-field-gesture-action":"record","disabled":false,"label":"Record gesture"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-smooth-field.40","data-field-gesture-action":"finish","disabled":true,"label":"Finish gesture"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-smooth-field.41","data-field-gesture-action":"loop","disabled":true,"label":"Loop gesture","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-smooth-field.42","data-field-gesture-action":"download","disabled":true,"label":"Download gesture WAV"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-field-gesture-actions","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"data-field-gesture-status":true,"text":"Record a movement to make a reusable gesture. Record and Loop start the instrument.","variant":"output"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Gesture curves & editing"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"html":"<svg viewbox=\"0 0 320 100\" preserveaspectratio=\"none\" role=\"img\" aria-label=\"Recorded gesture curves: XW, XY and Interaction\">\n        <path data-field-gesture-curve=\"xw\"></path><path data-field-gesture-curve=\"xy\"></path><path data-field-gesture-curve=\"interaction\"></path>\n        <line data-field-gesture-playhead x1=\"0\" x2=\"0\" y1=\"0\" y2=\"100\"></line>\n      </svg>"},"tag":"RawHtml"},{"children":[{"children":[],"kind":"view-node","props":{"text":"XW","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"XY","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Interaction","variant":"span"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-field-gesture-legend","variant":"p"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Gesture duration seconds","controlKey":"visual-smooth-field.53","data-field-gesture-length":true,"disabled":true,"kind":"number","label":"Duration (s)","max":"16.08","min":"0.1","name":"visual-smooth-field-53","step":"0.001"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-smooth-field.54","data-field-gesture-action":"duration","disabled":true,"label":"Apply duration"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Gesture point","controlKey":"visual-smooth-field.56","data-field-gesture-point":true,"default":"","disabled":true,"label":"Point","name":"visual-smooth-field-56","options":[]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-smooth-field.57","data-field-gesture-action":"update","disabled":true,"label":"Update point"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-field-gesture-actions","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Select a point, adjust the pad or Interaction, then Update point. Duration changes gesture speed; pitch stays independent. Save experiment keeps the gesture.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"element":"details"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Send to arrangement"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Field clip start beat","controlKey":"visual-smooth-field.63","data-field-clip-start":true,"default":"0","disabled":false,"kind":"number","label":"Start beat","min":"0","name":"visual-smooth-field-63","step":".25"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Field clip length beats","controlKey":"visual-smooth-field.65","data-field-clip-beats":true,"default":"4","disabled":false,"kind":"number","label":"Length (beats)","min":".25","name":"visual-smooth-field-65","step":".25"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-smooth-field.66","data-field-gesture-action":"arrange","disabled":true,"label":"Add field clip"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-field-gesture-actions","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Adds a new track with an editable held MIDI note and this gesture stretched across the clip. Beat 0 is the start. Pitch uses the nearest MIDI note; voices are preserved. Prepare the score first.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"element":"details"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Capture up to 16 seconds on the audio clock, with a short return to the start. WAV exports one dry cycle. Native field clips keep the movement editable and follow the arrangement tempo.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"aria-label":"Gesture clip","className":"ls-field-gesture","data-field-gesture-controls":true,"element":"section"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Visuals follow the sound; switching views keeps the instrument playing. Stereo orbit shows the audio readout, not all four coordinates.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"aria-label":"Smooth 4D field","className":"ls-field-panel","data-scope":"field-controls","element":"section","hidden":true},"tag":"Section"}],"kind":"view-node","props":{"className":"media-fragment","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Geometry · the 4D scan","variant":"strong"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"XYZ projection · colour shows rotated W","variant":"span"},"tag":"Text"}],"kind":"view-node","props":{"element":"figcaption"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"html":"<svg viewbox=\"0 0 320 320\" role=\"img\" aria-label=\"Four-dimensional scan projected into XYZ; blue is negative W and amber is positive W\">\n        <g data-field-axes></g><g data-field-curve fill=\"none\" stroke-width=\"2.2\" stroke-linecap=\"round\"></g>\n        <circle data-field-probe cx=\"160\" cy=\"160\" r=\"4.5\" fill=\"#fff\" stroke-width=\"2.5\"></circle>\n      </svg>"},"tag":"RawHtml"},{"children":[{"children":[],"kind":"view-node","props":{"text":"W −√2","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"aria-hidden":"true","className":"ls-field-color-key","text":"","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"+√2","variant":"span"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-field-legend","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Field phase probe","controlKey":"visual-performance-visual.58","data-field-phase":true,"default":"0","disabled":false,"kind":"range","label":"Phase probe · picture only","max":"1","min":"0","name":"visual-performance-visual-58","step":"0.001"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"aria-label":"Coordinates at phase probe","data-field-coordinates":true,"text":"","variant":"output"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"aria-label":"Raw stereo readout at phase probe","data-field-readout":true,"text":"","variant":"output"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Full cycle, fixed scale. Rotation changes the path; Interaction changes its stereo readout. Raw values precede audio filtering and level compensation.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-field-geometry","data-field-geometry":true,"data-visual-for":"field","element":"figure","hidden":true},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Shader"},"tag":"Text"}],"kind":"view-node","props":{"element":"figcaption"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"html":"<canvas data-shader-preview width=\"960\" height=\"540\" role=\"img\" aria-label=\"Shader source before contour capture\"></canvas>"},"tag":"RawHtml"}],"kind":"view-node","props":{"className":"ls-shader-preview","data-visual-for":"trace","element":"figure","hidden":true},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Audio output"},"tag":"Text"}],"kind":"view-node","props":{"data-visual-for":"field trace","element":"figcaption","hidden":true},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"html":"<canvas data-visual=\"canvas\" width=\"960\" height=\"540\" role=\"img\" aria-label=\"Shader picture driven by the prepared score\"></canvas>"},"tag":"RawHtml"}],"kind":"view-node","props":{"className":"ls-visual-stage","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"data-visual-for":"field","hidden":true,"text":"Play the instrument to compare the sound with its geometry. This view includes the voice's filtering, harmony and spatial settings.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-field-sound","element":"figure"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-field-views","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"visual-contour-preset","data-visual":"contour-preset","disabled":true,"label":"Contour preset"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.144","data-scope":"trace","disabled":false,"label":"Capture"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"data-scope":"trace-status","role":"status","text":"Capture an outline to play.","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-shader-trace","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.147","data-scope":"live","disabled":false,"label":"Link live"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Live shader trace rate","controlKey":"visual-performance-visual.149","data-scope":"live-rate","default":"10","disabled":false,"label":"Trace rate","name":"visual-performance-visual-149","options":[{"label":"5 / sec","value":"5"},{"label":"10 / sec","value":"10"},{"label":"20 / sec","value":"20"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Contour brightness","controlKey":"visual-performance-visual.151","data-scope":"threshold","default":"0.5","disabled":false,"kind":"range","label":"Contour brightness","max":"0.95","min":"0.05","name":"visual-performance-visual-151","step":"0.01"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"data-scope":"live-status","role":"status","text":"","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-shader-live","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-shader-sound","data-visual-for":"trace","element":"section","hidden":true},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Vector frequency","controlKey":"visual-performance-visual.25","data-scope":"frequency","default":"110","disabled":false,"kind":"range","label":"Frequency","max":"2000","min":"20","name":"visual-performance-visual-25","step":"0.01"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Vector voices","controlKey":"visual-performance-visual.27","data-scope":"voices","default":"solo","disabled":false,"label":"Voices","name":"visual-performance-visual-27","options":[{"label":"Solo","value":"solo"},{"label":"Octave · 2 voices","value":"octave"},{"label":"Perfect fifth · 2 voices","value":"fifth"},{"label":"Major triad · 3 voices","value":"triad"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.28","data-scope":"play","disabled":false,"label":"Play"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.29","data-scope":"stop","disabled":false,"label":"Stop"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"aria-describedby":"scope-wav-help","controlKey":"visual-performance-visual.30","data-scope":"export","disabled":false,"label":"Export WAV"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"aria-live":"polite","data-scope":"export-status","role":"status","text":"","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"aria-label":"Instrument playback","className":"ls-instrument-bar","data-visual-for":"geometry field trace","element":"section","hidden":true},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Simply supported aluminium rectangle · up to 64 bending modes. Choose harmonic RMS or live displacement driven by the DAW mix. Gold marks low vibration; red marks the point exciter."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"default":350.0,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"frequency","read":"number"},"hostOutputs":{"value":"frequency"},"kind":"number","label":"Drive frequency (Hz)","max":2000.0,"min":30.0,"name":"virtual-plate-frequency","step":0.1},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":300.0,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"width","read":"number"},"hostOutputs":{"value":"width"},"kind":"number","label":"Plate width (mm)","max":600.0,"min":200.0,"name":"virtual-plate-width","step":1.0},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":1.0,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"aspect","read":"number"},"hostOutputs":{"value":"aspect"},"kind":"number","label":"Height / width","max":1.5,"min":0.75,"name":"virtual-plate-aspect","step":0.01},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":1.0,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"thickness","read":"number"},"hostOutputs":{"value":"thickness"},"kind":"number","label":"Thickness (mm)","max":3.0,"min":0.5,"name":"virtual-plate-thickness","step":0.05},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":0.01,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"damping","read":"number"},"hostOutputs":{"value":"damping"},"kind":"number","label":"Damping ratio","max":0.1,"min":0.002,"name":"virtual-plate-damping","step":0.001},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":1.0,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"force","read":"number"},"hostOutputs":{"value":"force"},"kind":"number","label":"Drive force (mN)","max":100.0,"min":0.0,"name":"virtual-plate-force","step":0.1},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":25.0,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"audioForce","read":"number"},"hostOutputs":{"value":"audioForce"},"kind":"number","label":"Live force (mN per full-scale sample)","max":100.0,"min":0.0,"name":"virtual-plate-audioForce","step":0.1},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":0.37,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"x","read":"number"},"hostOutputs":{"value":"x"},"kind":"number","label":"Exciter X (fraction)","max":1.0,"min":0.0,"name":"virtual-plate-x","step":0.01},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":0.41,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"y","read":"number"},"hostOutputs":{"value":"y"},"kind":"number","label":"Exciter Y (fraction)","max":1.0,"min":0.0,"name":"virtual-plate-y","step":0.01},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":90.0,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"phase","read":"number"},"hostOutputs":{"value":"phase"},"kind":"number","label":"Surface phase (degrees)","max":360.0,"min":0.0,"name":"virtual-plate-phase","step":1.0},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":-25.0,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"yaw","read":"number"},"hostOutputs":{"value":"yaw"},"kind":"number","label":"Surface orbit (degrees)","max":180.0,"min":-180.0,"name":"virtual-plate-yaw","step":1.0},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":40.0,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"tilt","read":"number"},"hostOutputs":{"value":"tilt"},"kind":"number","label":"Surface tilt (degrees)","max":80.0,"min":10.0,"name":"virtual-plate-tilt","step":1.0},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":0.5,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"height","read":"number"},"hostOutputs":{"value":"height"},"kind":"number","label":"Display height (relative)","max":1.0,"min":0.1,"name":"virtual-plate-height","step":0.05},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":0.35,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"blend","read":"number"},"hostOutputs":{"value":"blend"},"kind":"number","label":"Hyperedge blend","max":1.0,"min":0.0,"name":"virtual-plate-blend","step":0.01},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":0.5,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"bridge","read":"number"},"hostOutputs":{"value":"bridge"},"kind":"number","label":"AD bridge weight","max":2.0,"min":0.0,"name":"virtual-plate-bridge","step":0.05},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":25.0,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"xw","read":"number"},"hostOutputs":{"value":"xw"},"kind":"number","label":"4D rotation XW (degrees)","max":180.0,"min":-180.0,"name":"virtual-plate-xw","step":1.0},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":-20.0,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"yz","read":"number"},"hostOutputs":{"value":"yz"},"kind":"number","label":"4D rotation YZ (degrees)","max":180.0,"min":-180.0,"name":"virtual-plate-yz","step":1.0},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":1.5,"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"input","initialize":true,"key":"axisDelay","read":"number"},"hostOutputs":{"value":"axisDelay"},"kind":"number","label":"Axis delay step (ms)","max":5.0,"min":0.0,"name":"virtual-plate-axisDelay","step":0.1},"tag":"Input"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"change","initialize":true,"key":"live","read":"checked"},"hostOutputs":{"checked":"live"},"label":"Live response · DAW mix","name":"virtual-plate-live"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"change","initialize":true,"key":"surface","read":"checked"},"hostOutputs":{"checked":"surface"},"label":"3D surface · phase slice","name":"virtual-plate-surface"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"change","initialize":true,"key":"trace","read":"checked"},"hostOutputs":{"checked":"trace"},"label":"4D pickup trajectory","name":"virtual-plate-trace"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.plate.set","event":"change","initialize":true,"key":"listen","read":"checked"},"hostOutputs":{"checked":"listen"},"label":"Listen to pickup blend","name":"virtual-plate-listen"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.plate.tune","event":"click"},"hostOutputs":{},"id":"virtual-plate-tune","label":"Tune nearest mode"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.plate.play","event":"click"},"hostOutputs":{"disabled":"playDisabled"},"id":"virtual-plate-play","label":"Hear drive tone"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.plate.stop","event":"click"},"hostOutputs":{"disabled":"stopDisabled"},"id":"virtual-plate-stop","label":"Stop drive tone"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"hostOutput":"status","id":"virtual-plate-status","role":"status","text":"Preparing physical response…"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"hostOutput":"modes","id":"virtual-plate-modes","role":"status","text":"Mode frequencies follow dimensions, thickness and material."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"hostOutput":"audio","id":"virtual-plate-audio","role":"status","text":"Tone is an audible frequency reference; speaker level is independent of simulated force."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"hostOutput":"hyper","id":"virtual-plate-hyper","role":"status","text":"Four virtual pickups A(.19,.23), B(.73,.29), C(.31,.79), D(.81,.67). Hyperedges ABC and BCD blend groups; AD is the adjustable bridge. Enable the trajectory, then play a score or hear the drive tone."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Harmonic mode reports RMS with a frozen phase slice. Live mode integrates every audio sample and shows instantaneous displacement; phase control is ignored. Live force uses the mono DAW mix, not microphone capture. Picture height is normalized (1 nm floor in live mode); physical values remain in µm. Display snapshots may alias audio-frequency motion. E = 69 GPa, density = 2700 kg/m³, Poisson ratio = 0.33. No sand transport, free-edge or centre-clamp approximation."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"4D trajectory: X/Y screen position, Z perspective, W colour. Shows 512 consecutive audio samples; picture size is normalized. Hypergraph averaging and orthogonal rotations act on pickup signals, not plate mechanics. Optional stereo audition maps rotated X/Y to L/R at 0.03 digital units per µm, capped at ±0.1, alongside the dry source. Global Stop and leaving this view mute it. Changes to the blend do not reset plate motion."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Axis delay embeds rotated signals at t, t−τ, t−2τ, t−3τ using audio samples. Set delay to zero for simultaneous physical pickups. Time offsets change the stereo audition as well as the trajectory."},"tag":"Text"}],"kind":"view-node","props":{"hostCapability":"virtual.plate","hostInitial":{"aspect":1.0,"audioForce":25.0,"axisDelay":1.5,"blend":0.35,"bridge":0.5,"damping":0.01,"force":1.0,"frequency":350.0,"height":0.5,"listen":false,"live":false,"phase":90.0,"surface":false,"thickness":1.0,"tilt":40.0,"trace":false,"width":300.0,"x":0.37,"xw":25.0,"y":0.41,"yaw":-25.0,"yz":-20.0},"hostLimits":{"aspect":[0.75,1.5],"audioForce":[0.0,100.0],"axisDelay":[0.0,5.0],"blend":[0.0,1.0],"bridge":[0.0,2.0],"damping":[0.002,0.1],"force":[0.0,100.0],"frequency":[30.0,2000.0],"height":[0.1,1.0],"phase":[0.0,360.0],"thickness":[0.5,3.0],"tilt":[10.0,80.0],"width":[200.0,600.0],"x":[0.0,1.0],"xw":[-180.0,180.0],"y":[0.0,1.0],"yaw":[-180.0,180.0],"yz":[-180.0,180.0]},"hostVersion":1,"id":"virtual-plate","title":"Resonant plate"},"tag":"Card"}],"kind":"view-node","props":{"data-cre8-host-artifact":"{\"schema\":\"cre8.view.ir\",\"version\":1,\"template_id\":\"virtual.plate\",\"source_hash\":\"8f1a0ec669e961846be031b7d9ece72b7577208120e1b6923c8117fe7a9f7e2e\",\"context_hash\":\"b4478446303f92d2720210e42e874bc0975eac38c221e6eab7dfa6b4a3e00bd5\",\"tree_hash\":\"3dd562ac957cce1c3711af0de1cac6be89c0f1a8cb31861656969d97105ac9d7\",\"tree_json\":\"{\\\"children\\\":[{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"Simply supported aluminium rectangle · up to 64 bending modes. Choose harmonic RMS or live displacement driven by the DAW mix. Gold marks low vibration; red marks the point exciter.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":350.0,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"frequency\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"frequency\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Drive frequency (Hz)\\\",\\\"max\\\":2000.0,\\\"min\\\":30.0,\\\"name\\\":\\\"virtual-plate-frequency\\\",\\\"step\\\":0.1},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":300.0,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"width\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"width\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Plate width (mm)\\\",\\\"max\\\":600.0,\\\"min\\\":200.0,\\\"name\\\":\\\"virtual-plate-width\\\",\\\"step\\\":1.0},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":1.0,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"aspect\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"aspect\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Height / width\\\",\\\"max\\\":1.5,\\\"min\\\":0.75,\\\"name\\\":\\\"virtual-plate-aspect\\\",\\\"step\\\":0.01},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":1.0,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"thickness\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"thickness\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Thickness (mm)\\\",\\\"max\\\":3.0,\\\"min\\\":0.5,\\\"name\\\":\\\"virtual-plate-thickness\\\",\\\"step\\\":0.05},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":0.01,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"damping\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"damping\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Damping ratio\\\",\\\"max\\\":0.1,\\\"min\\\":0.002,\\\"name\\\":\\\"virtual-plate-damping\\\",\\\"step\\\":0.001},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":1.0,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"force\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"force\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Drive force (mN)\\\",\\\"max\\\":100.0,\\\"min\\\":0.0,\\\"name\\\":\\\"virtual-plate-force\\\",\\\"step\\\":0.1},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":25.0,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"audioForce\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"audioForce\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Live force (mN per full-scale sample)\\\",\\\"max\\\":100.0,\\\"min\\\":0.0,\\\"name\\\":\\\"virtual-plate-audioForce\\\",\\\"step\\\":0.1},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":0.37,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"x\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"x\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Exciter X (fraction)\\\",\\\"max\\\":1.0,\\\"min\\\":0.0,\\\"name\\\":\\\"virtual-plate-x\\\",\\\"step\\\":0.01},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":0.41,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"y\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"y\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Exciter Y (fraction)\\\",\\\"max\\\":1.0,\\\"min\\\":0.0,\\\"name\\\":\\\"virtual-plate-y\\\",\\\"step\\\":0.01},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":90.0,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"phase\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"phase\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Surface phase (degrees)\\\",\\\"max\\\":360.0,\\\"min\\\":0.0,\\\"name\\\":\\\"virtual-plate-phase\\\",\\\"step\\\":1.0},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":-25.0,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"yaw\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"yaw\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Surface orbit (degrees)\\\",\\\"max\\\":180.0,\\\"min\\\":-180.0,\\\"name\\\":\\\"virtual-plate-yaw\\\",\\\"step\\\":1.0},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":40.0,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"tilt\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"tilt\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Surface tilt (degrees)\\\",\\\"max\\\":80.0,\\\"min\\\":10.0,\\\"name\\\":\\\"virtual-plate-tilt\\\",\\\"step\\\":1.0},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":0.5,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"height\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"height\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Display height (relative)\\\",\\\"max\\\":1.0,\\\"min\\\":0.1,\\\"name\\\":\\\"virtual-plate-height\\\",\\\"step\\\":0.05},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":0.35,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"blend\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"blend\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Hyperedge blend\\\",\\\"max\\\":1.0,\\\"min\\\":0.0,\\\"name\\\":\\\"virtual-plate-blend\\\",\\\"step\\\":0.01},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":0.5,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"bridge\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"bridge\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"AD bridge weight\\\",\\\"max\\\":2.0,\\\"min\\\":0.0,\\\"name\\\":\\\"virtual-plate-bridge\\\",\\\"step\\\":0.05},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":25.0,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"xw\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"xw\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"4D rotation XW (degrees)\\\",\\\"max\\\":180.0,\\\"min\\\":-180.0,\\\"name\\\":\\\"virtual-plate-xw\\\",\\\"step\\\":1.0},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":-20.0,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"yz\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"yz\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"4D rotation YZ (degrees)\\\",\\\"max\\\":180.0,\\\"min\\\":-180.0,\\\"name\\\":\\\"virtual-plate-yz\\\",\\\"step\\\":1.0},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":1.5,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"axisDelay\\\",\\\"read\\\":\\\"number\\\"},\\\"hostOutputs\\\":{\\\"value\\\":\\\"axisDelay\\\"},\\\"kind\\\":\\\"number\\\",\\\"label\\\":\\\"Axis delay step (ms)\\\",\\\"max\\\":5.0,\\\"min\\\":0.0,\\\"name\\\":\\\"virtual-plate-axisDelay\\\",\\\"step\\\":0.1},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"change\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"live\\\",\\\"read\\\":\\\"checked\\\"},\\\"hostOutputs\\\":{\\\"checked\\\":\\\"live\\\"},\\\"label\\\":\\\"Live response · DAW mix\\\",\\\"name\\\":\\\"virtual-plate-live\\\"},\\\"tag\\\":\\\"Checkbox\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"change\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"surface\\\",\\\"read\\\":\\\"checked\\\"},\\\"hostOutputs\\\":{\\\"checked\\\":\\\"surface\\\"},\\\"label\\\":\\\"3D surface · phase slice\\\",\\\"name\\\":\\\"virtual-plate-surface\\\"},\\\"tag\\\":\\\"Checkbox\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"change\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"trace\\\",\\\"read\\\":\\\"checked\\\"},\\\"hostOutputs\\\":{\\\"checked\\\":\\\"trace\\\"},\\\"label\\\":\\\"4D pickup trajectory\\\",\\\"name\\\":\\\"virtual-plate-trace\\\"},\\\"tag\\\":\\\"Checkbox\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.set\\\",\\\"event\\\":\\\"change\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"listen\\\",\\\"read\\\":\\\"checked\\\"},\\\"hostOutputs\\\":{\\\"checked\\\":\\\"listen\\\"},\\\"label\\\":\\\"Listen to pickup blend\\\",\\\"name\\\":\\\"virtual-plate-listen\\\"},\\\"tag\\\":\\\"Checkbox\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.tune\\\",\\\"event\\\":\\\"click\\\"},\\\"hostOutputs\\\":{},\\\"id\\\":\\\"virtual-plate-tune\\\",\\\"label\\\":\\\"Tune nearest mode\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.play\\\",\\\"event\\\":\\\"click\\\"},\\\"hostOutputs\\\":{\\\"disabled\\\":\\\"playDisabled\\\"},\\\"id\\\":\\\"virtual-plate-play\\\",\\\"label\\\":\\\"Hear drive tone\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.plate.stop\\\",\\\"event\\\":\\\"click\\\"},\\\"hostOutputs\\\":{\\\"disabled\\\":\\\"stopDisabled\\\"},\\\"id\\\":\\\"virtual-plate-stop\\\",\\\"label\\\":\\\"Stop drive tone\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"hostOutput\\\":\\\"status\\\",\\\"id\\\":\\\"virtual-plate-status\\\",\\\"role\\\":\\\"status\\\",\\\"text\\\":\\\"Preparing physical response…\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"hostOutput\\\":\\\"modes\\\",\\\"id\\\":\\\"virtual-plate-modes\\\",\\\"role\\\":\\\"status\\\",\\\"text\\\":\\\"Mode frequencies follow dimensions, thickness and material.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"hostOutput\\\":\\\"audio\\\",\\\"id\\\":\\\"virtual-plate-audio\\\",\\\"role\\\":\\\"status\\\",\\\"text\\\":\\\"Tone is an audible frequency reference; speaker level is independent of simulated force.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"hostOutput\\\":\\\"hyper\\\",\\\"id\\\":\\\"virtual-plate-hyper\\\",\\\"role\\\":\\\"status\\\",\\\"text\\\":\\\"Four virtual pickups A(.19,.23), B(.73,.29), C(.31,.79), D(.81,.67). Hyperedges ABC and BCD blend groups; AD is the adjustable bridge. Enable the trajectory, then play a score or hear the drive tone.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"Harmonic mode reports RMS with a frozen phase slice. Live mode integrates every audio sample and shows instantaneous displacement; phase control is ignored. Live force uses the mono DAW mix, not microphone capture. Picture height is normalized (1 nm floor in live mode); physical values remain in µm. Display snapshots may alias audio-frequency motion. E = 69 GPa, density = 2700 kg/m³, Poisson ratio = 0.33. No sand transport, free-edge or centre-clamp approximation.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"4D trajectory: X/Y screen position, Z perspective, W colour. Shows 512 consecutive audio samples; picture size is normalized. Hypergraph averaging and orthogonal rotations act on pickup signals, not plate mechanics. Optional stereo audition maps rotated X/Y to L/R at 0.03 digital units per µm, capped at ±0.1, alongside the dry source. Global Stop and leaving this view mute it. Changes to the blend do not reset plate motion.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"Axis delay embeds rotated signals at t, t−τ, t−2τ, t−3τ using audio samples. Set delay to zero for simultaneous physical pickups. Time offsets change the stereo audition as well as the trajectory.\\\"},\\\"tag\\\":\\\"Text\\\"}],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"hostCapability\\\":\\\"virtual.plate\\\",\\\"hostInitial\\\":{\\\"aspect\\\":1.0,\\\"audioForce\\\":25.0,\\\"axisDelay\\\":1.5,\\\"blend\\\":0.35,\\\"bridge\\\":0.5,\\\"damping\\\":0.01,\\\"force\\\":1.0,\\\"frequency\\\":350.0,\\\"height\\\":0.5,\\\"listen\\\":false,\\\"live\\\":false,\\\"phase\\\":90.0,\\\"surface\\\":false,\\\"thickness\\\":1.0,\\\"tilt\\\":40.0,\\\"trace\\\":false,\\\"width\\\":300.0,\\\"x\\\":0.37,\\\"xw\\\":25.0,\\\"y\\\":0.41,\\\"yaw\\\":-25.0,\\\"yz\\\":-20.0},\\\"hostLimits\\\":{\\\"aspect\\\":[0.75,1.5],\\\"audioForce\\\":[0.0,100.0],\\\"axisDelay\\\":[0.0,5.0],\\\"blend\\\":[0.0,1.0],\\\"bridge\\\":[0.0,2.0],\\\"damping\\\":[0.002,0.1],\\\"force\\\":[0.0,100.0],\\\"frequency\\\":[30.0,2000.0],\\\"height\\\":[0.1,1.0],\\\"phase\\\":[0.0,360.0],\\\"thickness\\\":[0.5,3.0],\\\"tilt\\\":[10.0,80.0],\\\"width\\\":[200.0,600.0],\\\"x\\\":[0.0,1.0],\\\"xw\\\":[-180.0,180.0],\\\"y\\\":[0.0,1.0],\\\"yaw\\\":[-180.0,180.0],\\\"yz\\\":[-180.0,180.0]},\\\"hostVersion\\\":1,\\\"id\\\":\\\"virtual-plate\\\",\\\"title\\\":\\\"Resonant plate\\\"},\\\"tag\\\":\\\"Card\\\"}\",\"tree\":{\"children\":[{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"Simply supported aluminium rectangle · up to 64 bending modes. Choose harmonic RMS or live displacement driven by the DAW mix. Gold marks low vibration; red marks the point exciter.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":350.0,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"frequency\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"frequency\"},\"kind\":\"number\",\"label\":\"Drive frequency (Hz)\",\"max\":2000.0,\"min\":30.0,\"name\":\"virtual-plate-frequency\",\"step\":0.1},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":300.0,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"width\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"width\"},\"kind\":\"number\",\"label\":\"Plate width (mm)\",\"max\":600.0,\"min\":200.0,\"name\":\"virtual-plate-width\",\"step\":1.0},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":1.0,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"aspect\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"aspect\"},\"kind\":\"number\",\"label\":\"Height / width\",\"max\":1.5,\"min\":0.75,\"name\":\"virtual-plate-aspect\",\"step\":0.01},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":1.0,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"thickness\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"thickness\"},\"kind\":\"number\",\"label\":\"Thickness (mm)\",\"max\":3.0,\"min\":0.5,\"name\":\"virtual-plate-thickness\",\"step\":0.05},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":0.01,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"damping\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"damping\"},\"kind\":\"number\",\"label\":\"Damping ratio\",\"max\":0.1,\"min\":0.002,\"name\":\"virtual-plate-damping\",\"step\":0.001},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":1.0,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"force\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"force\"},\"kind\":\"number\",\"label\":\"Drive force (mN)\",\"max\":100.0,\"min\":0.0,\"name\":\"virtual-plate-force\",\"step\":0.1},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":25.0,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"audioForce\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"audioForce\"},\"kind\":\"number\",\"label\":\"Live force (mN per full-scale sample)\",\"max\":100.0,\"min\":0.0,\"name\":\"virtual-plate-audioForce\",\"step\":0.1},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":0.37,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"x\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"x\"},\"kind\":\"number\",\"label\":\"Exciter X (fraction)\",\"max\":1.0,\"min\":0.0,\"name\":\"virtual-plate-x\",\"step\":0.01},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":0.41,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"y\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"y\"},\"kind\":\"number\",\"label\":\"Exciter Y (fraction)\",\"max\":1.0,\"min\":0.0,\"name\":\"virtual-plate-y\",\"step\":0.01},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":90.0,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"phase\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"phase\"},\"kind\":\"number\",\"label\":\"Surface phase (degrees)\",\"max\":360.0,\"min\":0.0,\"name\":\"virtual-plate-phase\",\"step\":1.0},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":-25.0,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"yaw\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"yaw\"},\"kind\":\"number\",\"label\":\"Surface orbit (degrees)\",\"max\":180.0,\"min\":-180.0,\"name\":\"virtual-plate-yaw\",\"step\":1.0},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":40.0,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"tilt\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"tilt\"},\"kind\":\"number\",\"label\":\"Surface tilt (degrees)\",\"max\":80.0,\"min\":10.0,\"name\":\"virtual-plate-tilt\",\"step\":1.0},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":0.5,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"height\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"height\"},\"kind\":\"number\",\"label\":\"Display height (relative)\",\"max\":1.0,\"min\":0.1,\"name\":\"virtual-plate-height\",\"step\":0.05},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":0.35,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"blend\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"blend\"},\"kind\":\"number\",\"label\":\"Hyperedge blend\",\"max\":1.0,\"min\":0.0,\"name\":\"virtual-plate-blend\",\"step\":0.01},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":0.5,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"bridge\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"bridge\"},\"kind\":\"number\",\"label\":\"AD bridge weight\",\"max\":2.0,\"min\":0.0,\"name\":\"virtual-plate-bridge\",\"step\":0.05},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":25.0,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"xw\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"xw\"},\"kind\":\"number\",\"label\":\"4D rotation XW (degrees)\",\"max\":180.0,\"min\":-180.0,\"name\":\"virtual-plate-xw\",\"step\":1.0},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":-20.0,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"yz\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"yz\"},\"kind\":\"number\",\"label\":\"4D rotation YZ (degrees)\",\"max\":180.0,\"min\":-180.0,\"name\":\"virtual-plate-yz\",\"step\":1.0},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":1.5,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"axisDelay\",\"read\":\"number\"},\"hostOutputs\":{\"value\":\"axisDelay\"},\"kind\":\"number\",\"label\":\"Axis delay step (ms)\",\"max\":5.0,\"min\":0.0,\"name\":\"virtual-plate-axisDelay\",\"step\":0.1},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"change\",\"initialize\":true,\"key\":\"live\",\"read\":\"checked\"},\"hostOutputs\":{\"checked\":\"live\"},\"label\":\"Live response · DAW mix\",\"name\":\"virtual-plate-live\"},\"tag\":\"Checkbox\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"change\",\"initialize\":true,\"key\":\"surface\",\"read\":\"checked\"},\"hostOutputs\":{\"checked\":\"surface\"},\"label\":\"3D surface · phase slice\",\"name\":\"virtual-plate-surface\"},\"tag\":\"Checkbox\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"change\",\"initialize\":true,\"key\":\"trace\",\"read\":\"checked\"},\"hostOutputs\":{\"checked\":\"trace\"},\"label\":\"4D pickup trajectory\",\"name\":\"virtual-plate-trace\"},\"tag\":\"Checkbox\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.set\",\"event\":\"change\",\"initialize\":true,\"key\":\"listen\",\"read\":\"checked\"},\"hostOutputs\":{\"checked\":\"listen\"},\"label\":\"Listen to pickup blend\",\"name\":\"virtual-plate-listen\"},\"tag\":\"Checkbox\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.tune\",\"event\":\"click\"},\"hostOutputs\":{},\"id\":\"virtual-plate-tune\",\"label\":\"Tune nearest mode\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.play\",\"event\":\"click\"},\"hostOutputs\":{\"disabled\":\"playDisabled\"},\"id\":\"virtual-plate-play\",\"label\":\"Hear drive tone\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.plate.stop\",\"event\":\"click\"},\"hostOutputs\":{\"disabled\":\"stopDisabled\"},\"id\":\"virtual-plate-stop\",\"label\":\"Stop drive tone\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"hostOutput\":\"status\",\"id\":\"virtual-plate-status\",\"role\":\"status\",\"text\":\"Preparing physical response…\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"hostOutput\":\"modes\",\"id\":\"virtual-plate-modes\",\"role\":\"status\",\"text\":\"Mode frequencies follow dimensions, thickness and material.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"hostOutput\":\"audio\",\"id\":\"virtual-plate-audio\",\"role\":\"status\",\"text\":\"Tone is an audible frequency reference; speaker level is independent of simulated force.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"hostOutput\":\"hyper\",\"id\":\"virtual-plate-hyper\",\"role\":\"status\",\"text\":\"Four virtual pickups A(.19,.23), B(.73,.29), C(.31,.79), D(.81,.67). Hyperedges ABC and BCD blend groups; AD is the adjustable bridge. Enable the trajectory, then play a score or hear the drive tone.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"Harmonic mode reports RMS with a frozen phase slice. Live mode integrates every audio sample and shows instantaneous displacement; phase control is ignored. Live force uses the mono DAW mix, not microphone capture. Picture height is normalized (1 nm floor in live mode); physical values remain in µm. Display snapshots may alias audio-frequency motion. E = 69 GPa, density = 2700 kg/m³, Poisson ratio = 0.33. No sand transport, free-edge or centre-clamp approximation.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"4D trajectory: X/Y screen position, Z perspective, W colour. Shows 512 consecutive audio samples; picture size is normalized. Hypergraph averaging and orthogonal rotations act on pickup signals, not plate mechanics. Optional stereo audition maps rotated X/Y to L/R at 0.03 digital units per µm, capped at ±0.1, alongside the dry source. Global Stop and leaving this view mute it. Changes to the blend do not reset plate motion.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"Axis delay embeds rotated signals at t, t−τ, t−2τ, t−3τ using audio samples. Set delay to zero for simultaneous physical pickups. Time offsets change the stereo audition as well as the trajectory.\"},\"tag\":\"Text\"}],\"kind\":\"view-node\",\"props\":{\"hostCapability\":\"virtual.plate\",\"hostInitial\":{\"aspect\":1.0,\"audioForce\":25.0,\"axisDelay\":1.5,\"blend\":0.35,\"bridge\":0.5,\"damping\":0.01,\"force\":1.0,\"frequency\":350.0,\"height\":0.5,\"listen\":false,\"live\":false,\"phase\":90.0,\"surface\":false,\"thickness\":1.0,\"tilt\":40.0,\"trace\":false,\"width\":300.0,\"x\":0.37,\"xw\":25.0,\"y\":0.41,\"yaw\":-25.0,\"yz\":-20.0},\"hostLimits\":{\"aspect\":[0.75,1.5],\"audioForce\":[0.0,100.0],\"axisDelay\":[0.0,5.0],\"blend\":[0.0,1.0],\"bridge\":[0.0,2.0],\"damping\":[0.002,0.1],\"force\":[0.0,100.0],\"frequency\":[30.0,2000.0],\"height\":[0.1,1.0],\"phase\":[0.0,360.0],\"thickness\":[0.5,3.0],\"tilt\":[10.0,80.0],\"width\":[200.0,600.0],\"x\":[0.0,1.0],\"xw\":[-180.0,180.0],\"y\":[0.0,1.0],\"yaw\":[-180.0,180.0],\"yz\":[-180.0,180.0]},\"hostVersion\":1,\"id\":\"virtual-plate\",\"title\":\"Resonant plate\"},\"tag\":\"Card\"},\"execution\":{\"portable_ir_schema\":\"cre8.view.ir\",\"portable_ir_tree_hash\":\"3dd562ac957cce1c3711af0de1cac6be89c0f1a8cb31861656969d97105ac9d7\",\"portable_ir_version\":1,\"producer\":\"rust-ssr\"}}","data-cre8-host-component":"virtual.plate","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"data-plate-slot":true,"element":"div","hidden":true},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-live":"polite","data-scope":"status","role":"status","text":"","variant":"output"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Scope settings"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Scope display"},"tag":"Text"}],"kind":"view-node","props":{"element":"legend"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Scope trace","controlKey":"visual-performance-visual.77","data-scope":"mode","default":"xy","disabled":false,"label":"Trace","name":"visual-performance-visual-77","options":[{"label":"XY path","value":"xy"},{"label":"Stereo waveform","value":"wave"},{"label":"3D spectrogram","value":"spectrum"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Scope gain","controlKey":"visual-performance-visual.79","data-scope":"gain","default":"4","disabled":false,"kind":"range","label":"Picture gain","max":"8","min":"0.25","name":"visual-performance-visual-79","step":"0.25"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Scope window","controlKey":"visual-performance-visual.81","data-scope":"window","default":"20","disabled":false,"label":"Window","name":"visual-performance-visual-81","options":[{"label":"5 ms","value":"5"},{"label":"20 ms","value":"20"},{"label":"50 ms","value":"50"},{"label":"100 ms","value":"100"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Scope persistence","controlKey":"visual-performance-visual.83","data-scope":"persistence","default":"100","disabled":false,"kind":"range","label":"Persistence","max":"500","min":"0","name":"visual-performance-visual-83","step":"10"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.85","data-scope":"trigger","default":true,"disabled":false,"label":"Rising-edge trigger (waveform)","name":"visual-performance-visual-85"},"tag":"Checkbox"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.87","data-scope":"freeze","default":false,"disabled":false,"label":"Freeze picture","name":"visual-performance-visual-87"},"tag":"Checkbox"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"3D rotation & depth"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Scope axes","controlKey":"visual-performance-visual.92","data-scope":"space","default":"flat","disabled":false,"label":"Axes","name":"visual-performance-visual-92","options":[{"label":"Stereo plane · L / R","value":"flat"},{"label":"Stereo + delayed L depth","value":"stereo-depth"},{"label":"Delay space · L / Lτ / L2τ","value":"delay"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Depth delay milliseconds","controlKey":"visual-performance-visual.94","data-scope":"delay","default":"1","disabled":false,"kind":"range","label":"Delay ms","max":"5","min":"0.1","name":"visual-performance-visual-94","step":"0.1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Scope projection","controlKey":"visual-performance-visual.96","data-scope":"projection","default":"orthographic","disabled":false,"label":"Projection","name":"visual-performance-visual-96","options":[{"label":"Orthographic","value":"orthographic"},{"label":"Perspective","value":"perspective"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Scope rotation X","controlKey":"visual-performance-visual.98","data-scope":"rotate-x","default":"0","disabled":false,"kind":"range","label":"Rotate X","max":"180","min":"-180","name":"visual-performance-visual-98","step":"1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Scope rotation Y","controlKey":"visual-performance-visual.100","data-scope":"rotate-y","default":"0","disabled":false,"kind":"range","label":"Rotate Y","max":"180","min":"-180","name":"visual-performance-visual-100","step":"1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Scope rotation Z","controlKey":"visual-performance-visual.102","data-scope":"rotate-z","default":"0","disabled":false,"kind":"range","label":"Rotate Z","max":"180","min":"-180","name":"visual-performance-visual-102","step":"1"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.103","data-scope":"reset-view","disabled":false,"label":"Reset rotation"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"text":"Depth is derived from delayed audio, not a third input channel. Projection changes the picture only; waveform view ignores these controls.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-scope-fields","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-scope-spatial","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-scope-section","element":"fieldset"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-display-settings","data-visual-for":"scope geometry field trace","element":"details","hidden":true},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"default":-25.0,"disabled":true,"hostBinding":{"action":"virtual.spectrogram.set","event":"input","initialize":true,"key":"yaw","read":"number"},"kind":"range","label":"Spectrum orbit","max":180.0,"min":-180.0,"name":"virtual-spectrum-yaw","step":1.0},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":35.0,"disabled":true,"hostBinding":{"action":"virtual.spectrogram.set","event":"input","initialize":true,"key":"tilt","read":"number"},"kind":"range","label":"Spectrum tilt","max":80.0,"min":5.0,"name":"virtual-spectrum-tilt","step":1.0},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":1.5,"disabled":true,"hostBinding":{"action":"virtual.spectrogram.set","event":"input","initialize":true,"key":"height","read":"number"},"kind":"range","label":"Spectrum height","max":3.0,"min":0.2,"name":"virtual-spectrum-height","step":0.1},"tag":"Input"},{"children":[],"kind":"view-node","props":{"default":0.3,"disabled":true,"hostBinding":{"action":"virtual.spectrogram.set","event":"input","initialize":true,"key":"opacity","read":"number"},"kind":"range","label":"Video mix","max":0.8,"min":0.0,"name":"virtual-spectrum-opacity","step":0.01},"tag":"Input"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.spectrogram.set","event":"change","initialize":true,"key":"frozen","read":"checked"},"label":"Freeze spectrum","name":"virtual-spectrum-frozen"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.spectrogram.clear","event":"click"},"id":"virtual-spectrum-clear","label":"Clear history"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.spectrogram.camera","event":"click"},"id":"virtual-spectrum-camera","label":"Use camera"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.spectrogram.video-stop","event":"click"},"id":"virtual-spectrum-video-stop","label":"Stop video"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"accept":"video/*","disabled":true,"hostBinding":{"action":"virtual.spectrogram.file","event":"change","read":"file"},"kind":"file","label":"Local video","name":"virtual-spectrum-file"},"tag":"Input"},{"children":[],"kind":"view-node","props":{"hostOutput":"status","id":"virtual-spectrum-status","role":"status","text":"Frequency left to right · level in height and color · six seconds of measured history in depth."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"hostOutput":"videoStatus","id":"virtual-spectrum-videoStatus","role":"status","text":"Local picture only. Video loops freely; camera stops when this view is hidden. No upload or video audio."},"tag":"Text"}],"kind":"view-node","props":{"hostCapability":"virtual.spectrogram","hostInitial":{"frozen":false,"height":1.5,"opacity":0.3,"tilt":35.0,"yaw":-25.0},"hostLimits":{"height":[0.2,3.0],"opacity":[0.0,0.8],"tilt":[5.0,80.0],"yaw":[-180.0,180.0]},"hostVersion":1,"id":"virtual-spectrum","title":"Virtual · frequency landscape & video"},"tag":"Card"}],"kind":"view-node","props":{"data-cre8-host-artifact":"{\"schema\":\"cre8.view.ir\",\"version\":1,\"template_id\":\"virtual.spectrogram\",\"source_hash\":\"b5ca5478f57926ed995aeb344a15b8bb6487ab4e4ca9f0b9e858937d5b3b015d\",\"context_hash\":\"ac2653378140b7020e1b10976d97e196a56daac74580d42e4787381d3c14ba97\",\"tree_hash\":\"611f1135776cbd2dada96963f086ee96b20c59111037a402533c6dd3ee375e85\",\"tree_json\":\"{\\\"children\\\":[{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":-25.0,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.spectrogram.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"yaw\\\",\\\"read\\\":\\\"number\\\"},\\\"kind\\\":\\\"range\\\",\\\"label\\\":\\\"Spectrum orbit\\\",\\\"max\\\":180.0,\\\"min\\\":-180.0,\\\"name\\\":\\\"virtual-spectrum-yaw\\\",\\\"step\\\":1.0},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":35.0,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.spectrogram.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"tilt\\\",\\\"read\\\":\\\"number\\\"},\\\"kind\\\":\\\"range\\\",\\\"label\\\":\\\"Spectrum tilt\\\",\\\"max\\\":80.0,\\\"min\\\":5.0,\\\"name\\\":\\\"virtual-spectrum-tilt\\\",\\\"step\\\":1.0},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":1.5,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.spectrogram.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"height\\\",\\\"read\\\":\\\"number\\\"},\\\"kind\\\":\\\"range\\\",\\\"label\\\":\\\"Spectrum height\\\",\\\"max\\\":3.0,\\\"min\\\":0.2,\\\"name\\\":\\\"virtual-spectrum-height\\\",\\\"step\\\":0.1},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"default\\\":0.3,\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.spectrogram.set\\\",\\\"event\\\":\\\"input\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"opacity\\\",\\\"read\\\":\\\"number\\\"},\\\"kind\\\":\\\"range\\\",\\\"label\\\":\\\"Video mix\\\",\\\"max\\\":0.8,\\\"min\\\":0.0,\\\"name\\\":\\\"virtual-spectrum-opacity\\\",\\\"step\\\":0.01},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.spectrogram.set\\\",\\\"event\\\":\\\"change\\\",\\\"initialize\\\":true,\\\"key\\\":\\\"frozen\\\",\\\"read\\\":\\\"checked\\\"},\\\"label\\\":\\\"Freeze spectrum\\\",\\\"name\\\":\\\"virtual-spectrum-frozen\\\"},\\\"tag\\\":\\\"Checkbox\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.spectrogram.clear\\\",\\\"event\\\":\\\"click\\\"},\\\"id\\\":\\\"virtual-spectrum-clear\\\",\\\"label\\\":\\\"Clear history\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.spectrogram.camera\\\",\\\"event\\\":\\\"click\\\"},\\\"id\\\":\\\"virtual-spectrum-camera\\\",\\\"label\\\":\\\"Use camera\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.spectrogram.video-stop\\\",\\\"event\\\":\\\"click\\\"},\\\"id\\\":\\\"virtual-spectrum-video-stop\\\",\\\"label\\\":\\\"Stop video\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"accept\\\":\\\"video/*\\\",\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.spectrogram.file\\\",\\\"event\\\":\\\"change\\\",\\\"read\\\":\\\"file\\\"},\\\"kind\\\":\\\"file\\\",\\\"label\\\":\\\"Local video\\\",\\\"name\\\":\\\"virtual-spectrum-file\\\"},\\\"tag\\\":\\\"Input\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"hostOutput\\\":\\\"status\\\",\\\"id\\\":\\\"virtual-spectrum-status\\\",\\\"role\\\":\\\"status\\\",\\\"text\\\":\\\"Frequency left to right · level in height and color · six seconds of measured history in depth.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"hostOutput\\\":\\\"videoStatus\\\",\\\"id\\\":\\\"virtual-spectrum-videoStatus\\\",\\\"role\\\":\\\"status\\\",\\\"text\\\":\\\"Local picture only. Video loops freely; camera stops when this view is hidden. No upload or video audio.\\\"},\\\"tag\\\":\\\"Text\\\"}],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"hostCapability\\\":\\\"virtual.spectrogram\\\",\\\"hostInitial\\\":{\\\"frozen\\\":false,\\\"height\\\":1.5,\\\"opacity\\\":0.3,\\\"tilt\\\":35.0,\\\"yaw\\\":-25.0},\\\"hostLimits\\\":{\\\"height\\\":[0.2,3.0],\\\"opacity\\\":[0.0,0.8],\\\"tilt\\\":[5.0,80.0],\\\"yaw\\\":[-180.0,180.0]},\\\"hostVersion\\\":1,\\\"id\\\":\\\"virtual-spectrum\\\",\\\"title\\\":\\\"Virtual · frequency landscape & video\\\"},\\\"tag\\\":\\\"Card\\\"}\",\"tree\":{\"children\":[{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":-25.0,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.spectrogram.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"yaw\",\"read\":\"number\"},\"kind\":\"range\",\"label\":\"Spectrum orbit\",\"max\":180.0,\"min\":-180.0,\"name\":\"virtual-spectrum-yaw\",\"step\":1.0},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":35.0,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.spectrogram.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"tilt\",\"read\":\"number\"},\"kind\":\"range\",\"label\":\"Spectrum tilt\",\"max\":80.0,\"min\":5.0,\"name\":\"virtual-spectrum-tilt\",\"step\":1.0},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":1.5,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.spectrogram.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"height\",\"read\":\"number\"},\"kind\":\"range\",\"label\":\"Spectrum height\",\"max\":3.0,\"min\":0.2,\"name\":\"virtual-spectrum-height\",\"step\":0.1},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"default\":0.3,\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.spectrogram.set\",\"event\":\"input\",\"initialize\":true,\"key\":\"opacity\",\"read\":\"number\"},\"kind\":\"range\",\"label\":\"Video mix\",\"max\":0.8,\"min\":0.0,\"name\":\"virtual-spectrum-opacity\",\"step\":0.01},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.spectrogram.set\",\"event\":\"change\",\"initialize\":true,\"key\":\"frozen\",\"read\":\"checked\"},\"label\":\"Freeze spectrum\",\"name\":\"virtual-spectrum-frozen\"},\"tag\":\"Checkbox\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.spectrogram.clear\",\"event\":\"click\"},\"id\":\"virtual-spectrum-clear\",\"label\":\"Clear history\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.spectrogram.camera\",\"event\":\"click\"},\"id\":\"virtual-spectrum-camera\",\"label\":\"Use camera\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.spectrogram.video-stop\",\"event\":\"click\"},\"id\":\"virtual-spectrum-video-stop\",\"label\":\"Stop video\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"accept\":\"video/*\",\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.spectrogram.file\",\"event\":\"change\",\"read\":\"file\"},\"kind\":\"file\",\"label\":\"Local video\",\"name\":\"virtual-spectrum-file\"},\"tag\":\"Input\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"hostOutput\":\"status\",\"id\":\"virtual-spectrum-status\",\"role\":\"status\",\"text\":\"Frequency left to right · level in height and color · six seconds of measured history in depth.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"hostOutput\":\"videoStatus\",\"id\":\"virtual-spectrum-videoStatus\",\"role\":\"status\",\"text\":\"Local picture only. Video loops freely; camera stops when this view is hidden. No upload or video audio.\"},\"tag\":\"Text\"}],\"kind\":\"view-node\",\"props\":{\"hostCapability\":\"virtual.spectrogram\",\"hostInitial\":{\"frozen\":false,\"height\":1.5,\"opacity\":0.3,\"tilt\":35.0,\"yaw\":-25.0},\"hostLimits\":{\"height\":[0.2,3.0],\"opacity\":[0.0,0.8],\"tilt\":[5.0,80.0],\"yaw\":[-180.0,180.0]},\"hostVersion\":1,\"id\":\"virtual-spectrum\",\"title\":\"Virtual · frequency landscape & video\"},\"tag\":\"Card\"},\"execution\":{\"portable_ir_schema\":\"cre8.view.ir\",\"portable_ir_tree_hash\":\"611f1135776cbd2dada96963f086ee96b20c59111037a402533c6dd3ee375e85\",\"portable_ir_version\":1,\"producer\":\"rust-ssr\"}}","data-cre8-host-component":"virtual.spectrogram","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"data-spectrum-slot":true,"element":"div","hidden":true},"tag":"Section"}],"kind":"view-node","props":{"data-visual-for":"spectrum","element":"div","hidden":true},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"MIDI & spatial audio"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.110","data-scope":"midi-scan","disabled":false,"label":"Scan MIDI inputs"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"aria-label":"Vector MIDI input","controlKey":"visual-performance-visual.111","data-scope":"midi-port","default":"","disabled":false,"label":"Vector MIDI input","name":"visual-performance-visual-111","options":[{"label":"Scan for a device","value":""}]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.112","data-scope":"midi-connect","disabled":true,"label":"Connect MIDI"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"MIDI controller profile","controlKey":"visual-performance-visual.114","data-scope":"midi-profile","default":"keyboard","disabled":false,"label":"Controller","name":"visual-performance-visual-114","options":[{"label":"Keyboard · notes & bend","value":"keyboard"},{"label":"Theremini · antenna CCs","value":"theremini"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Antenna MIDI channel","controlKey":"visual-performance-visual.117","data-scope":"midi-channel","default":"1","disabled":false,"kind":"number","label":"Channel","max":"16","min":"1","name":"visual-performance-visual-117"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Pitch antenna CC","controlKey":"visual-performance-visual.119","data-scope":"pitch-cc","default":"20","disabled":false,"kind":"number","label":"Pitch CC","max":"119","min":"0","name":"visual-performance-visual-119"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Volume antenna CC","controlKey":"visual-performance-visual.121","data-scope":"volume-cc","default":"2","disabled":false,"kind":"number","label":"Volume CC","max":"119","min":"0","name":"visual-performance-visual-121"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Antenna CC resolution","controlKey":"visual-performance-visual.123","data-scope":"cc-bits","default":"7","disabled":false,"label":"Resolution","name":"visual-performance-visual-123","options":[{"label":"7-bit","value":"7"},{"label":"14-bit CC pairs","value":"14"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Antenna low frequency","controlKey":"visual-performance-visual.125","data-scope":"low-hz","default":"55","disabled":false,"kind":"number","label":"Low Hz","max":"1999","min":"20","name":"visual-performance-visual-125"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Antenna high frequency","controlKey":"visual-performance-visual.127","data-scope":"high-hz","default":"1760","disabled":false,"kind":"number","label":"High Hz","max":"2000","min":"21","name":"visual-performance-visual-127"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Match the instrument’s MIDI CC OUT settings. Default: channel 1, pitch CC20, volume CC2, 7-bit. This plays CRE8’s geometry voice; USB MIDI does not carry the Theremini’s own audio.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-scope-fields","data-theremini-mapping":true,"element":"div","hidden":true},"tag":"Section"},{"children":[],"kind":"view-node","props":{"data-scope":"midi-status","role":"status","text":"Select a controller profile, scan, then connect. Keyboard: notes, bend ±2, CC1 morph and CC74 motion. Theremini: continuous antenna pitch and level.","variant":"output"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.131","data-scope":"spatial","default":false,"disabled":false,"label":"Spatial audio (HRTF)","name":"visual-performance-visual-131"},"tag":"Checkbox"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Instrument azimuth","controlKey":"visual-performance-visual.133","data-scope":"azimuth","default":"0","disabled":false,"kind":"range","label":"Azimuth","max":"180","min":"-180","name":"visual-performance-visual-133"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"visual-performance-visual.135","data-scope":"antenna-space","default":false,"disabled":false,"label":"MIDI pitch moves left ↔ right","name":"visual-performance-visual-135"},"tag":"Checkbox"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Headphones reveal spatial placement. HRTF changes the monitored stereo signal; instrument WAV export stays dry.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-scope-fields","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-scope-midi","data-visual-for":"geometry field","element":"details","hidden":true},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-scope-controls","data-scope":"controls","element":"div","hidden":true},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-visual":"lock","text":"Locked to the transport · stopped","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-visual-lock","variant":"p"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Shader editor"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.shader.effect","event":"change","key":"effect","read":"text"},"hostOutputs":{"options":"effects","value":"effect"},"label":"Shader effect","name":"virtual-shader-effect","options":[{"label":"NEBULA","value":"NEBULA"},{"label":"SPECTRUM TUNNEL","value":"SPECTRUM TUNNEL"},{"label":"LATTICE","value":"LATTICE"},{"label":"WAVEFORM HALO","value":"WAVEFORM HALO"},{"label":"PLASMA","value":"PLASMA"},{"label":"POLAR EQ","value":"POLAR EQ"},{"label":"OSCILLOSCOPE","value":"OSCILLOSCOPE"},{"label":"VORONOI","value":"VORONOI"},{"label":"STARFIELD","value":"STARFIELD"},{"label":"FLOW FIELD","value":"FLOW FIELD"},{"label":"KALEIDO","value":"KALEIDO"},{"label":"METABALLS","value":"METABALLS"},{"label":"CONTOUR BLOOM","value":"CONTOUR BLOOM"},{"label":"AURORA CURTAINS","value":"AURORA CURTAINS"},{"label":"HARMONIC RIBBONS","value":"HARMONIC RIBBONS"},{"label":"CYMATIC PLATE","value":"CYMATIC PLATE"},{"label":"SPECTRAL DUNES","value":"SPECTRAL DUNES"},{"label":"PRISM ORBIT","value":"PRISM ORBIT"},{"label":"CONTOUR KNOT","value":"CONTOUR KNOT"}]},"tag":"Select"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.shader.auto","event":"change","key":"auto","read":"checked"},"hostOutputs":{"checked":"auto"},"label":"Auto-cycle every four bars","name":"virtual-shader-auto"},"tag":"Checkbox"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.shader.projector","event":"click"},"id":"virtual-shader-projector","label":"Send to projector"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.shader.apply","event":"click"},"id":"virtual-shader-apply","label":"Apply effect"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"disabled":true,"hostBinding":{"action":"virtual.shader.revert","event":"click"},"id":"virtual-shader-revert","label":"Restore starter effect"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"text":"Effect source · GLSL ES 3.0 · Ctrl / ⌘ Enter applies the effect."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"hostBinding":{"action":"virtual.shader.source","event":"input","key":"source","maxLength":65536,"read":"text"},"hostEditor":true,"hostOutputs":{"errorLine":"errorLine","value":"source"},"hostShortcut":"virtual.shader.apply","html":"<div class=\"ssr-code-editor\" data-ssr-code-editor=\"glsl\">\n<style>.ssr-code-editor{min-width:0}.ssr-code-frame{display:flex;position:relative;overflow:hidden;background:light-dark(#f7fafb,#031013);border:1px solid light-dark(#cae0db,#355a51);border-radius:8px}\n.ssr-code-gutter{position:relative;flex:0 0 42px;overflow:hidden;text-align:right;background:#07191b;color:#70938b;user-select:none}\n.ssr-code-gutter pre{position:absolute;top:0;left:0;width:100%;box-sizing:border-box;padding:14px 8px 14px 0;margin:0;font:12px/21px ui-monospace,monospace;white-space:pre}\n.ssr-code-surface{position:relative;flex:1;min-width:0;overflow:hidden}\n.ssr-code-surface textarea,.ssr-code-surface>pre{box-sizing:border-box;margin:0;padding:14px 12px;border:0;border-radius:0;background:transparent;font:12px/21px ui-monospace,monospace;letter-spacing:normal;tab-size:2;white-space:pre;overflow-wrap:normal}\n.ssr-code-surface textarea{display:block;position:relative;width:100%;min-height:390px;resize:vertical;color:light-dark(#33855d,#d0eddf);caret-color:light-dark(#1f2f27,#e4f7ee);outline-offset:-2px}\n.ssr-code-surface>pre{display:none;position:absolute;top:0;left:0;min-width:100%;pointer-events:none;color:light-dark(#33855d,#d0eddf)}\n.ssr-code-frame.is-enhanced .ssr-code-surface>pre{display:block}\n.ssr-code-frame.is-enhanced textarea{color:transparent;-webkit-text-fill-color:transparent}\n.ssr-code-frame.is-enhanced textarea::selection{background:#bcee8340}\n.ssr-code-footer{display:flex;justify-content:space-between;flex-wrap:wrap;gap:8px;padding:8px 2px;color:light-dark(#57796f,#89aaa0);font:10px/1.5 ui-monospace,monospace}\n.ssr-code-token--keyword{color:light-dark(#63a116,#c2ef8b)}.ssr-code-token--type{color:light-dark(#2c8b7d,#91dcd1)}.ssr-code-token--builtin{color:light-dark(#3112a5,#bfaeff)}.ssr-code-token--number{color:light-dark(#a56012,#f5c187)}.ssr-code-token--comment{color:#789c92}.ssr-code-token--attribute{color:light-dark(#97215b,#edaccc)}.ssr-code-token--string{color:light-dark(#9f6918,#edc589)}\n.ssr-code-frame[data-error=true]{border-color:#f0a28e}.ssr-code-gutter [data-error-line=true]{color:#ffb5a6;background:#522e28}\n@media(max-width:540px){.ssr-code-gutter{flex-basis:32px}.ssr-code-footer{font-size:9px}}\n.ssr-code-navigation,.ssr-code-find{padding:10px 12px;background:light-dark(#f5faf9,#0b1d19);border-top:1px solid light-dark(#d1e3dd,#29453b);font:11px/1.5 system-ui;color:light-dark(#3e5d51,#adcbbf)}\n.ssr-code-navigation{display:flex;flex-wrap:wrap;gap:8px;align-items:center}\n.ssr-code-navigation button,.ssr-code-find button{cursor:pointer;padding:5px 9px;border:1px solid light-dark(#cbdfd8,#36584b);border-radius:6px;background:light-dark(#f1f7f6,#122b24);color:light-dark(#3d7a5a,#d5eadf);font:inherit}\n.ssr-code-navigation button:disabled,.ssr-code-find button:disabled{opacity:.45;cursor:default}\n.ssr-code-navigation input,.ssr-code-query input{box-sizing:border-box;border:1px solid light-dark(#c9dcd5,#3e6153);border-radius:5px;background:light-dark(#f7fbf9,#061410);color:light-dark(#203023,#e4f4e7);padding:5px 7px;font:inherit;min-width:0}\n.ssr-code-navigation input{width:68px}.ssr-code-navigation kbd{font:9px ui-monospace,monospace;color:light-dark(#5d7a6e,#87a498)}\n.ssr-code-navigation [data-code=navigation-status]{font-size:10px;flex-basis:100%;empty-cells:hide}\n.ssr-code-navigation [data-code=navigation-status]:empty{display:none}\n.ssr-code-navigation input[aria-invalid=true]{border-color:#f0a28e}\n.ssr-code-find[hidden]{display:none}.ssr-code-find{display:grid;gap:8px}\n.ssr-code-query{display:flex;align-items:center;gap:8px}.ssr-code-query input{flex:1;width:100%}\n.ssr-code-find-options,.ssr-code-find-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap}\n.ssr-code-find-options label{display:flex;align-items:center;gap:5px}.ssr-code-find-options input{accent-color:#c2ef8b}\n.ssr-code-find-actions [data-code=find-close]{margin-left:auto}.ssr-code-find-actions [data-code=find-count]{font:10px ui-monospace,monospace}\n.ssr-code-match{background:#786a235c}.ssr-code-match-active{background:#8f6a3280;box-shadow:inset 0 -2px #edcc7a}\n.ssr-code-navigation :focus-visible,.ssr-code-find :focus-visible{outline:2px solid #c2ef8b;outline-offset:2px}\n.ssr-code-replace{display:grid;gap:8px;border-top:1px solid light-dark(#d1e3dd,#29453b);padding-top:10px}.ssr-code-replace[hidden]{display:none}\n.ssr-code-replace [data-code=replace-status]{font-size:10px;color:light-dark(#416154,#a8c7ba)}.ssr-code-query>span{flex-shrink:0}\n</style>\n<div class=\"ssr-code-navigation\" role=\"group\" aria-label=\"Code navigation\">\n  <button type=\"button\" data-code=\"find-toggle\" data-code-nav-control aria-expanded=\"false\" aria-controls=\"virtual-shader-source-find\" title=\"Find (Ctrl or Command F); F3 next, Shift F3 previous\" disabled>Find <kbd>⌘/Ctrl F</kbd></button>\n  <label for=\"virtual-shader-source-line\">Line</label><input id=\"virtual-shader-source-line\" data-code=\"goto-line\" data-code-nav-control type=\"number\" min=\"1\" step=\"1\" value=\"1\" aria-describedby=\"virtual-shader-source-navigation-status\" title=\"Go to line (Ctrl or Command G)\" disabled><button type=\"button\" data-code=\"goto-submit\" data-code-nav-control disabled>Go</button>\n  <span id=\"virtual-shader-source-navigation-status\" data-code=\"navigation-status\" role=\"status\" aria-live=\"polite\"></span>\n</div>\n<div id=\"virtual-shader-source-find\" class=\"ssr-code-find\" data-code=\"find-bar\" role=\"search\" aria-label=\"Find in code\" hidden>\n  <label class=\"ssr-code-query\"><span>Find text</span><input data-code=\"find-query\" data-code-nav-control type=\"search\" maxlength=\"1024\" autocomplete=\"off\" spellcheck=\"false\" disabled></label>\n  <div class=\"ssr-code-find-options\"><label><input data-code=\"find-case\" data-code-nav-control type=\"checkbox\" disabled>Match case</label><label><input data-code=\"find-word\" data-code-nav-control type=\"checkbox\" disabled>Whole word</label></div>\n  <div class=\"ssr-code-find-actions\"><button type=\"button\" data-code=\"find-prev\" data-code-nav-control aria-label=\"Previous match\" disabled>↑</button><button type=\"button\" data-code=\"find-next\" data-code-nav-control aria-label=\"Next match\" disabled>↓</button><span data-code=\"find-count\" role=\"status\" aria-live=\"polite\">Type to find</span><button type=\"button\" data-code=\"replace-toggle\" data-code-nav-control aria-expanded=\"false\" aria-controls=\"virtual-shader-source-replace\" disabled>Replace…</button><button type=\"button\" data-code=\"find-close\" data-code-nav-control aria-label=\"Close find\" disabled>Close</button></div>\n  <div id=\"virtual-shader-source-replace\" class=\"ssr-code-replace\" data-code=\"replace-bar\" hidden>\n    <label class=\"ssr-code-query\"><span>Replace with</span><input data-code=\"replace-query\" data-code-nav-control type=\"text\" maxlength=\"65536\" autocomplete=\"off\" spellcheck=\"false\" disabled></label>\n    <div class=\"ssr-code-find-actions\"><button type=\"button\" data-code=\"replace-one\" data-code-nav-control disabled>Replace</button><button type=\"button\" data-code=\"replace-all\" data-code-nav-control disabled>Replace all</button><button type=\"button\" data-code=\"replace-undo\" data-code-nav-control disabled>Undo replacement</button></div>\n    <span data-code=\"replace-status\" role=\"status\" aria-live=\"polite\">Replacement is literal. An empty value deletes matches.</span>\n  </div>\n</div>\n<div class=\"ssr-code-frame\" data-code=\"frame\">\n  <div class=\"ssr-code-gutter\" aria-hidden=\"true\"><pre data-code=\"lines\">1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24</pre></div>\n  <div class=\"ssr-code-surface\"><pre data-code=\"highlight\" aria-hidden=\"true\"></pre><textarea disabled aria-label=\"Code source\" id=\"virtual-shader-source\" data-code=\"source\" rows=\"18\" maxlength=\"65536\" wrap=\"off\" spellcheck=\"false\" autocapitalize=\"off\" autocomplete=\"off\" aria-describedby=\"virtual-shader-help virtual-shader-source-keys\">// Bar-locked rings. Every input below comes from the score you are playing.\nvoid main(){\n  vec2 uv=(gl_FragCoord.xy-.5*uRes)/uRes.y;\n  float r=length(uv);\n\n  // One ring per beat, pushed outward by the transport&#39;s own beat phase.\n  float ring=fract(r*3.0-uBeatPhase);\n  float pulse=smoothstep(.55,.0,abs(ring-.5))*(.25+1.6*uParts.y);\n\n  // The bar advances the hue, so the picture shows its place in the loop.\n  float hue=fract(.55+uBar*.07+uBarPhase*.12+r*.1);\n  vec3 col=hsv(vec3(hue,.7,1.))*pulse;\n\n  // Pads wash the frame; melody and arp sparkle over it.\n  col+=pal(hue+.4)*uParts.z*.35*smoothstep(1.2,.2,r);\n  col+=pal(fract(hue+.6))*pow(fbm(uv*6.+uTime*.3),5.)*6.*uParts.w;\n\n  // A scored hit lands as a flash and a kick of brightness, then decays.\n  col+=uOnset*.5*hsv(vec3(fract(hue+.5),.35,1.))*smoothstep(.9,.0,r);\n  col*=1.+.35*uParts.x*uOnset;\n\n  col*=smoothstep(1.35,.25,r);\n  fragColor=vec4(col,1.);\n}</textarea></div>\n</div>\n<div class=\"ssr-code-footer\"><span data-code=\"cursor\">Ln 1 · Col 1</span><span id=\"virtual-shader-source-keys\">Tab indent · Ctrl/⌘ / comment · Esc then Tab to leave</span></div>\n</div>","id":"virtual-shader-source"},"tag":"RawHtml"},{"children":[],"kind":"view-node","props":{"hostOutput":"status","id":"virtual-shader-status","role":"status","text":"Starting the visualizer…"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"id":"virtual-shader-help","text":"Write a void main() body. The shared prelude provides uniforms and spec(), wav(), hsv(), pal(), rot(), noise(), fbm(), smin(), sdCircle() and sdBox(). A compile error keeps the running picture."},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Shader inputs"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"text":"uBar: Bar number the transport is on, counting from 1; 0 when stopped."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"uBarPhase: 0..1 sawtooth across one bar."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"uBass: Measured low-band energy, 0..1 (smoothed)."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"uBeat: Envelope that pops to 1 on a bass transient and decays."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"uBeatPhase: 0..1 sawtooth across one beat."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"uCentroid: Spectral centroid (brightness), 0..1."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"uLvl: Alias of uRms, kept for the original effects."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"uMid: Measured mid-band energy, 0..1 (smoothed)."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"uOnset: 1 on a scored note or drum hit, decaying to 0."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"uParts: Score energy per part: x drums, y bass, z pads, w melody+arp."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"uRes: Canvas size in pixels (vec2)."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"uRms: Measured waveform level, 0..1 (smoothed)."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"uSpec: Two-row texture: row 0 spectrum, row 1 waveform (use spec()/wav())."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"uTempo: Beats per minute of the running score."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"uTime: Seconds since the visualizer was created."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"uTre: Alias of uTreble, kept for the original effects."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"uTreble: Measured high-band energy, 0..1 (smoothed)."},"tag":"Text"}],"kind":"view-node","props":{"title":"Shader inputs"},"tag":"Card"}],"kind":"view-node","props":{"element":"details"},"tag":"Section"}],"kind":"view-node","props":{"hostCapability":"virtual.shader-studio","hostInitial":{"source":"// Bar-locked rings. Every input below comes from the score you are playing.\nvoid main(){\n  vec2 uv=(gl_FragCoord.xy-.5*uRes)/uRes.y;\n  float r=length(uv);\n\n  // One ring per beat, pushed outward by the transport's own beat phase.\n  float ring=fract(r*3.0-uBeatPhase);\n  float pulse=smoothstep(.55,.0,abs(ring-.5))*(.25+1.6*uParts.y);\n\n  // The bar advances the hue, so the picture shows its place in the loop.\n  float hue=fract(.55+uBar*.07+uBarPhase*.12+r*.1);\n  vec3 col=hsv(vec3(hue,.7,1.))*pulse;\n\n  // Pads wash the frame; melody and arp sparkle over it.\n  col+=pal(hue+.4)*uParts.z*.35*smoothstep(1.2,.2,r);\n  col+=pal(fract(hue+.6))*pow(fbm(uv*6.+uTime*.3),5.)*6.*uParts.w;\n\n  // A scored hit lands as a flash and a kick of brightness, then decays.\n  col+=uOnset*.5*hsv(vec3(fract(hue+.5),.35,1.))*smoothstep(.9,.0,r);\n  col*=1.+.35*uParts.x*uOnset;\n\n  col*=smoothstep(1.35,.25,r);\n  fragColor=vec4(col,1.);\n}"},"hostVersion":1,"title":"Shader studio"},"tag":"Card"}],"kind":"view-node","props":{"data-cre8-host-artifact":"{\"schema\":\"cre8.view.ir\",\"version\":1,\"template_id\":\"virtual.shader-studio\",\"source_hash\":\"13413c2523ce535194beb39f21f54cb9679823b225896ee48133569bdf1420f4\",\"context_hash\":\"e53384975d531088890d0f5c789834494bac395897904a7a42ad86740ed2c09c\",\"tree_hash\":\"bac308dae501619de262ee13e6cadaff96ae9e1d651e358d5cb53e0ada33443f\",\"tree_json\":\"{\\\"children\\\":[{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.shader.effect\\\",\\\"event\\\":\\\"change\\\",\\\"key\\\":\\\"effect\\\",\\\"read\\\":\\\"text\\\"},\\\"hostOutputs\\\":{\\\"options\\\":\\\"effects\\\",\\\"value\\\":\\\"effect\\\"},\\\"label\\\":\\\"Shader effect\\\",\\\"name\\\":\\\"virtual-shader-effect\\\",\\\"options\\\":[{\\\"label\\\":\\\"NEBULA\\\",\\\"value\\\":\\\"NEBULA\\\"},{\\\"label\\\":\\\"SPECTRUM TUNNEL\\\",\\\"value\\\":\\\"SPECTRUM TUNNEL\\\"},{\\\"label\\\":\\\"LATTICE\\\",\\\"value\\\":\\\"LATTICE\\\"},{\\\"label\\\":\\\"WAVEFORM HALO\\\",\\\"value\\\":\\\"WAVEFORM HALO\\\"},{\\\"label\\\":\\\"PLASMA\\\",\\\"value\\\":\\\"PLASMA\\\"},{\\\"label\\\":\\\"POLAR EQ\\\",\\\"value\\\":\\\"POLAR EQ\\\"},{\\\"label\\\":\\\"OSCILLOSCOPE\\\",\\\"value\\\":\\\"OSCILLOSCOPE\\\"},{\\\"label\\\":\\\"VORONOI\\\",\\\"value\\\":\\\"VORONOI\\\"},{\\\"label\\\":\\\"STARFIELD\\\",\\\"value\\\":\\\"STARFIELD\\\"},{\\\"label\\\":\\\"FLOW FIELD\\\",\\\"value\\\":\\\"FLOW FIELD\\\"},{\\\"label\\\":\\\"KALEIDO\\\",\\\"value\\\":\\\"KALEIDO\\\"},{\\\"label\\\":\\\"METABALLS\\\",\\\"value\\\":\\\"METABALLS\\\"},{\\\"label\\\":\\\"CONTOUR BLOOM\\\",\\\"value\\\":\\\"CONTOUR BLOOM\\\"},{\\\"label\\\":\\\"AURORA CURTAINS\\\",\\\"value\\\":\\\"AURORA CURTAINS\\\"},{\\\"label\\\":\\\"HARMONIC RIBBONS\\\",\\\"value\\\":\\\"HARMONIC RIBBONS\\\"},{\\\"label\\\":\\\"CYMATIC PLATE\\\",\\\"value\\\":\\\"CYMATIC PLATE\\\"},{\\\"label\\\":\\\"SPECTRAL DUNES\\\",\\\"value\\\":\\\"SPECTRAL DUNES\\\"},{\\\"label\\\":\\\"PRISM ORBIT\\\",\\\"value\\\":\\\"PRISM ORBIT\\\"},{\\\"label\\\":\\\"CONTOUR KNOT\\\",\\\"value\\\":\\\"CONTOUR KNOT\\\"}]},\\\"tag\\\":\\\"Select\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.shader.auto\\\",\\\"event\\\":\\\"change\\\",\\\"key\\\":\\\"auto\\\",\\\"read\\\":\\\"checked\\\"},\\\"hostOutputs\\\":{\\\"checked\\\":\\\"auto\\\"},\\\"label\\\":\\\"Auto-cycle every four bars\\\",\\\"name\\\":\\\"virtual-shader-auto\\\"},\\\"tag\\\":\\\"Checkbox\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.shader.projector\\\",\\\"event\\\":\\\"click\\\"},\\\"id\\\":\\\"virtual-shader-projector\\\",\\\"label\\\":\\\"Send to projector\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.shader.apply\\\",\\\"event\\\":\\\"click\\\"},\\\"id\\\":\\\"virtual-shader-apply\\\",\\\"label\\\":\\\"Apply effect\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"disabled\\\":true,\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.shader.revert\\\",\\\"event\\\":\\\"click\\\"},\\\"id\\\":\\\"virtual-shader-revert\\\",\\\"label\\\":\\\"Restore starter effect\\\"},\\\"tag\\\":\\\"Action\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"Effect source · GLSL ES 3.0 · Ctrl / ⌘ Enter applies the effect.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"hostBinding\\\":{\\\"action\\\":\\\"virtual.shader.source\\\",\\\"event\\\":\\\"input\\\",\\\"key\\\":\\\"source\\\",\\\"maxLength\\\":65536,\\\"read\\\":\\\"text\\\"},\\\"hostEditor\\\":true,\\\"hostOutputs\\\":{\\\"errorLine\\\":\\\"errorLine\\\",\\\"value\\\":\\\"source\\\"},\\\"hostShortcut\\\":\\\"virtual.shader.apply\\\",\\\"html\\\":\\\"<div class=\\\\\\\"ssr-code-editor\\\\\\\" data-ssr-code-editor=\\\\\\\"glsl\\\\\\\">\\\\n<style>.ssr-code-editor{min-width:0}.ssr-code-frame{display:flex;position:relative;overflow:hidden;background:light-dark(#f7fafb,#031013);border:1px solid light-dark(#cae0db,#355a51);border-radius:8px}\\\\n.ssr-code-gutter{position:relative;flex:0 0 42px;overflow:hidden;text-align:right;background:#07191b;color:#70938b;user-select:none}\\\\n.ssr-code-gutter pre{position:absolute;top:0;left:0;width:100%;box-sizing:border-box;padding:14px 8px 14px 0;margin:0;font:12px/21px ui-monospace,monospace;white-space:pre}\\\\n.ssr-code-surface{position:relative;flex:1;min-width:0;overflow:hidden}\\\\n.ssr-code-surface textarea,.ssr-code-surface>pre{box-sizing:border-box;margin:0;padding:14px 12px;border:0;border-radius:0;background:transparent;font:12px/21px ui-monospace,monospace;letter-spacing:normal;tab-size:2;white-space:pre;overflow-wrap:normal}\\\\n.ssr-code-surface textarea{display:block;position:relative;width:100%;min-height:390px;resize:vertical;color:light-dark(#33855d,#d0eddf);caret-color:light-dark(#1f2f27,#e4f7ee);outline-offset:-2px}\\\\n.ssr-code-surface>pre{display:none;position:absolute;top:0;left:0;min-width:100%;pointer-events:none;color:light-dark(#33855d,#d0eddf)}\\\\n.ssr-code-frame.is-enhanced .ssr-code-surface>pre{display:block}\\\\n.ssr-code-frame.is-enhanced textarea{color:transparent;-webkit-text-fill-color:transparent}\\\\n.ssr-code-frame.is-enhanced textarea::selection{background:#bcee8340}\\\\n.ssr-code-footer{display:flex;justify-content:space-between;flex-wrap:wrap;gap:8px;padding:8px 2px;color:light-dark(#57796f,#89aaa0);font:10px/1.5 ui-monospace,monospace}\\\\n.ssr-code-token--keyword{color:light-dark(#63a116,#c2ef8b)}.ssr-code-token--type{color:light-dark(#2c8b7d,#91dcd1)}.ssr-code-token--builtin{color:light-dark(#3112a5,#bfaeff)}.ssr-code-token--number{color:light-dark(#a56012,#f5c187)}.ssr-code-token--comment{color:#789c92}.ssr-code-token--attribute{color:light-dark(#97215b,#edaccc)}.ssr-code-token--string{color:light-dark(#9f6918,#edc589)}\\\\n.ssr-code-frame[data-error=true]{border-color:#f0a28e}.ssr-code-gutter [data-error-line=true]{color:#ffb5a6;background:#522e28}\\\\n@media(max-width:540px){.ssr-code-gutter{flex-basis:32px}.ssr-code-footer{font-size:9px}}\\\\n.ssr-code-navigation,.ssr-code-find{padding:10px 12px;background:light-dark(#f5faf9,#0b1d19);border-top:1px solid light-dark(#d1e3dd,#29453b);font:11px/1.5 system-ui;color:light-dark(#3e5d51,#adcbbf)}\\\\n.ssr-code-navigation{display:flex;flex-wrap:wrap;gap:8px;align-items:center}\\\\n.ssr-code-navigation button,.ssr-code-find button{cursor:pointer;padding:5px 9px;border:1px solid light-dark(#cbdfd8,#36584b);border-radius:6px;background:light-dark(#f1f7f6,#122b24);color:light-dark(#3d7a5a,#d5eadf);font:inherit}\\\\n.ssr-code-navigation button:disabled,.ssr-code-find button:disabled{opacity:.45;cursor:default}\\\\n.ssr-code-navigation input,.ssr-code-query input{box-sizing:border-box;border:1px solid light-dark(#c9dcd5,#3e6153);border-radius:5px;background:light-dark(#f7fbf9,#061410);color:light-dark(#203023,#e4f4e7);padding:5px 7px;font:inherit;min-width:0}\\\\n.ssr-code-navigation input{width:68px}.ssr-code-navigation kbd{font:9px ui-monospace,monospace;color:light-dark(#5d7a6e,#87a498)}\\\\n.ssr-code-navigation [data-code=navigation-status]{font-size:10px;flex-basis:100%;empty-cells:hide}\\\\n.ssr-code-navigation [data-code=navigation-status]:empty{display:none}\\\\n.ssr-code-navigation input[aria-invalid=true]{border-color:#f0a28e}\\\\n.ssr-code-find[hidden]{display:none}.ssr-code-find{display:grid;gap:8px}\\\\n.ssr-code-query{display:flex;align-items:center;gap:8px}.ssr-code-query input{flex:1;width:100%}\\\\n.ssr-code-find-options,.ssr-code-find-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap}\\\\n.ssr-code-find-options label{display:flex;align-items:center;gap:5px}.ssr-code-find-options input{accent-color:#c2ef8b}\\\\n.ssr-code-find-actions [data-code=find-close]{margin-left:auto}.ssr-code-find-actions [data-code=find-count]{font:10px ui-monospace,monospace}\\\\n.ssr-code-match{background:#786a235c}.ssr-code-match-active{background:#8f6a3280;box-shadow:inset 0 -2px #edcc7a}\\\\n.ssr-code-navigation :focus-visible,.ssr-code-find :focus-visible{outline:2px solid #c2ef8b;outline-offset:2px}\\\\n.ssr-code-replace{display:grid;gap:8px;border-top:1px solid light-dark(#d1e3dd,#29453b);padding-top:10px}.ssr-code-replace[hidden]{display:none}\\\\n.ssr-code-replace [data-code=replace-status]{font-size:10px;color:light-dark(#416154,#a8c7ba)}.ssr-code-query>span{flex-shrink:0}\\\\n</style>\\\\n<div class=\\\\\\\"ssr-code-navigation\\\\\\\" role=\\\\\\\"group\\\\\\\" aria-label=\\\\\\\"Code navigation\\\\\\\">\\\\n  <button type=\\\\\\\"button\\\\\\\" data-code=\\\\\\\"find-toggle\\\\\\\" data-code-nav-control aria-expanded=\\\\\\\"false\\\\\\\" aria-controls=\\\\\\\"virtual-shader-source-find\\\\\\\" title=\\\\\\\"Find (Ctrl or Command F); F3 next, Shift F3 previous\\\\\\\" disabled>Find <kbd>⌘/Ctrl F</kbd></button>\\\\n  <label for=\\\\\\\"virtual-shader-source-line\\\\\\\">Line</label><input id=\\\\\\\"virtual-shader-source-line\\\\\\\" data-code=\\\\\\\"goto-line\\\\\\\" data-code-nav-control type=\\\\\\\"number\\\\\\\" min=\\\\\\\"1\\\\\\\" step=\\\\\\\"1\\\\\\\" value=\\\\\\\"1\\\\\\\" aria-describedby=\\\\\\\"virtual-shader-source-navigation-status\\\\\\\" title=\\\\\\\"Go to line (Ctrl or Command G)\\\\\\\" disabled><button type=\\\\\\\"button\\\\\\\" data-code=\\\\\\\"goto-submit\\\\\\\" data-code-nav-control disabled>Go</button>\\\\n  <span id=\\\\\\\"virtual-shader-source-navigation-status\\\\\\\" data-code=\\\\\\\"navigation-status\\\\\\\" role=\\\\\\\"status\\\\\\\" aria-live=\\\\\\\"polite\\\\\\\"></span>\\\\n</div>\\\\n<div id=\\\\\\\"virtual-shader-source-find\\\\\\\" class=\\\\\\\"ssr-code-find\\\\\\\" data-code=\\\\\\\"find-bar\\\\\\\" role=\\\\\\\"search\\\\\\\" aria-label=\\\\\\\"Find in code\\\\\\\" hidden>\\\\n  <label class=\\\\\\\"ssr-code-query\\\\\\\"><span>Find text</span><input data-code=\\\\\\\"find-query\\\\\\\" data-code-nav-control type=\\\\\\\"search\\\\\\\" maxlength=\\\\\\\"1024\\\\\\\" autocomplete=\\\\\\\"off\\\\\\\" spellcheck=\\\\\\\"false\\\\\\\" disabled></label>\\\\n  <div class=\\\\\\\"ssr-code-find-options\\\\\\\"><label><input data-code=\\\\\\\"find-case\\\\\\\" data-code-nav-control type=\\\\\\\"checkbox\\\\\\\" disabled>Match case</label><label><input data-code=\\\\\\\"find-word\\\\\\\" data-code-nav-control type=\\\\\\\"checkbox\\\\\\\" disabled>Whole word</label></div>\\\\n  <div class=\\\\\\\"ssr-code-find-actions\\\\\\\"><button type=\\\\\\\"button\\\\\\\" data-code=\\\\\\\"find-prev\\\\\\\" data-code-nav-control aria-label=\\\\\\\"Previous match\\\\\\\" disabled>↑</button><button type=\\\\\\\"button\\\\\\\" data-code=\\\\\\\"find-next\\\\\\\" data-code-nav-control aria-label=\\\\\\\"Next match\\\\\\\" disabled>↓</button><span data-code=\\\\\\\"find-count\\\\\\\" role=\\\\\\\"status\\\\\\\" aria-live=\\\\\\\"polite\\\\\\\">Type to find</span><button type=\\\\\\\"button\\\\\\\" data-code=\\\\\\\"replace-toggle\\\\\\\" data-code-nav-control aria-expanded=\\\\\\\"false\\\\\\\" aria-controls=\\\\\\\"virtual-shader-source-replace\\\\\\\" disabled>Replace…</button><button type=\\\\\\\"button\\\\\\\" data-code=\\\\\\\"find-close\\\\\\\" data-code-nav-control aria-label=\\\\\\\"Close find\\\\\\\" disabled>Close</button></div>\\\\n  <div id=\\\\\\\"virtual-shader-source-replace\\\\\\\" class=\\\\\\\"ssr-code-replace\\\\\\\" data-code=\\\\\\\"replace-bar\\\\\\\" hidden>\\\\n    <label class=\\\\\\\"ssr-code-query\\\\\\\"><span>Replace with</span><input data-code=\\\\\\\"replace-query\\\\\\\" data-code-nav-control type=\\\\\\\"text\\\\\\\" maxlength=\\\\\\\"65536\\\\\\\" autocomplete=\\\\\\\"off\\\\\\\" spellcheck=\\\\\\\"false\\\\\\\" disabled></label>\\\\n    <div class=\\\\\\\"ssr-code-find-actions\\\\\\\"><button type=\\\\\\\"button\\\\\\\" data-code=\\\\\\\"replace-one\\\\\\\" data-code-nav-control disabled>Replace</button><button type=\\\\\\\"button\\\\\\\" data-code=\\\\\\\"replace-all\\\\\\\" data-code-nav-control disabled>Replace all</button><button type=\\\\\\\"button\\\\\\\" data-code=\\\\\\\"replace-undo\\\\\\\" data-code-nav-control disabled>Undo replacement</button></div>\\\\n    <span data-code=\\\\\\\"replace-status\\\\\\\" role=\\\\\\\"status\\\\\\\" aria-live=\\\\\\\"polite\\\\\\\">Replacement is literal. An empty value deletes matches.</span>\\\\n  </div>\\\\n</div>\\\\n<div class=\\\\\\\"ssr-code-frame\\\\\\\" data-code=\\\\\\\"frame\\\\\\\">\\\\n  <div class=\\\\\\\"ssr-code-gutter\\\\\\\" aria-hidden=\\\\\\\"true\\\\\\\"><pre data-code=\\\\\\\"lines\\\\\\\">1\\\\n2\\\\n3\\\\n4\\\\n5\\\\n6\\\\n7\\\\n8\\\\n9\\\\n10\\\\n11\\\\n12\\\\n13\\\\n14\\\\n15\\\\n16\\\\n17\\\\n18\\\\n19\\\\n20\\\\n21\\\\n22\\\\n23\\\\n24</pre></div>\\\\n  <div class=\\\\\\\"ssr-code-surface\\\\\\\"><pre data-code=\\\\\\\"highlight\\\\\\\" aria-hidden=\\\\\\\"true\\\\\\\"></pre><textarea disabled aria-label=\\\\\\\"Code source\\\\\\\" id=\\\\\\\"virtual-shader-source\\\\\\\" data-code=\\\\\\\"source\\\\\\\" rows=\\\\\\\"18\\\\\\\" maxlength=\\\\\\\"65536\\\\\\\" wrap=\\\\\\\"off\\\\\\\" spellcheck=\\\\\\\"false\\\\\\\" autocapitalize=\\\\\\\"off\\\\\\\" autocomplete=\\\\\\\"off\\\\\\\" aria-describedby=\\\\\\\"virtual-shader-help virtual-shader-source-keys\\\\\\\">// Bar-locked rings. Every input below comes from the score you are playing.\\\\nvoid main(){\\\\n  vec2 uv=(gl_FragCoord.xy-.5*uRes)/uRes.y;\\\\n  float r=length(uv);\\\\n\\\\n  // One ring per beat, pushed outward by the transport&#39;s own beat phase.\\\\n  float ring=fract(r*3.0-uBeatPhase);\\\\n  float pulse=smoothstep(.55,.0,abs(ring-.5))*(.25+1.6*uParts.y);\\\\n\\\\n  // The bar advances the hue, so the picture shows its place in the loop.\\\\n  float hue=fract(.55+uBar*.07+uBarPhase*.12+r*.1);\\\\n  vec3 col=hsv(vec3(hue,.7,1.))*pulse;\\\\n\\\\n  // Pads wash the frame; melody and arp sparkle over it.\\\\n  col+=pal(hue+.4)*uParts.z*.35*smoothstep(1.2,.2,r);\\\\n  col+=pal(fract(hue+.6))*pow(fbm(uv*6.+uTime*.3),5.)*6.*uParts.w;\\\\n\\\\n  // A scored hit lands as a flash and a kick of brightness, then decays.\\\\n  col+=uOnset*.5*hsv(vec3(fract(hue+.5),.35,1.))*smoothstep(.9,.0,r);\\\\n  col*=1.+.35*uParts.x*uOnset;\\\\n\\\\n  col*=smoothstep(1.35,.25,r);\\\\n  fragColor=vec4(col,1.);\\\\n}</textarea></div>\\\\n</div>\\\\n<div class=\\\\\\\"ssr-code-footer\\\\\\\"><span data-code=\\\\\\\"cursor\\\\\\\">Ln 1 · Col 1</span><span id=\\\\\\\"virtual-shader-source-keys\\\\\\\">Tab indent · Ctrl/⌘ / comment · Esc then Tab to leave</span></div>\\\\n</div>\\\",\\\"id\\\":\\\"virtual-shader-source\\\"},\\\"tag\\\":\\\"RawHtml\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"hostOutput\\\":\\\"status\\\",\\\"id\\\":\\\"virtual-shader-status\\\",\\\"role\\\":\\\"status\\\",\\\"text\\\":\\\"Starting the visualizer…\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"id\\\":\\\"virtual-shader-help\\\",\\\"text\\\":\\\"Write a void main() body. The shared prelude provides uniforms and spec(), wav(), hsv(), pal(), rot(), noise(), fbm(), smin(), sdCircle() and sdBox(). A compile error keeps the running picture.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[{\\\"children\\\":[{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"Shader inputs\\\"},\\\"tag\\\":\\\"Text\\\"}],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"element\\\":\\\"summary\\\"},\\\"tag\\\":\\\"Section\\\"},{\\\"children\\\":[{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"uBar: Bar number the transport is on, counting from 1; 0 when stopped.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"uBarPhase: 0..1 sawtooth across one bar.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"uBass: Measured low-band energy, 0..1 (smoothed).\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"uBeat: Envelope that pops to 1 on a bass transient and decays.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"uBeatPhase: 0..1 sawtooth across one beat.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"uCentroid: Spectral centroid (brightness), 0..1.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"uLvl: Alias of uRms, kept for the original effects.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"uMid: Measured mid-band energy, 0..1 (smoothed).\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"uOnset: 1 on a scored note or drum hit, decaying to 0.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"uParts: Score energy per part: x drums, y bass, z pads, w melody+arp.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"uRes: Canvas size in pixels (vec2).\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"uRms: Measured waveform level, 0..1 (smoothed).\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"uSpec: Two-row texture: row 0 spectrum, row 1 waveform (use spec()/wav()).\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"uTempo: Beats per minute of the running score.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"uTime: Seconds since the visualizer was created.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"uTre: Alias of uTreble, kept for the original effects.\\\"},\\\"tag\\\":\\\"Text\\\"},{\\\"children\\\":[],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"text\\\":\\\"uTreble: Measured high-band energy, 0..1 (smoothed).\\\"},\\\"tag\\\":\\\"Text\\\"}],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"title\\\":\\\"Shader inputs\\\"},\\\"tag\\\":\\\"Card\\\"}],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"element\\\":\\\"details\\\"},\\\"tag\\\":\\\"Section\\\"}],\\\"kind\\\":\\\"view-node\\\",\\\"props\\\":{\\\"hostCapability\\\":\\\"virtual.shader-studio\\\",\\\"hostInitial\\\":{\\\"source\\\":\\\"// Bar-locked rings. Every input below comes from the score you are playing.\\\\nvoid main(){\\\\n  vec2 uv=(gl_FragCoord.xy-.5*uRes)/uRes.y;\\\\n  float r=length(uv);\\\\n\\\\n  // One ring per beat, pushed outward by the transport's own beat phase.\\\\n  float ring=fract(r*3.0-uBeatPhase);\\\\n  float pulse=smoothstep(.55,.0,abs(ring-.5))*(.25+1.6*uParts.y);\\\\n\\\\n  // The bar advances the hue, so the picture shows its place in the loop.\\\\n  float hue=fract(.55+uBar*.07+uBarPhase*.12+r*.1);\\\\n  vec3 col=hsv(vec3(hue,.7,1.))*pulse;\\\\n\\\\n  // Pads wash the frame; melody and arp sparkle over it.\\\\n  col+=pal(hue+.4)*uParts.z*.35*smoothstep(1.2,.2,r);\\\\n  col+=pal(fract(hue+.6))*pow(fbm(uv*6.+uTime*.3),5.)*6.*uParts.w;\\\\n\\\\n  // A scored hit lands as a flash and a kick of brightness, then decays.\\\\n  col+=uOnset*.5*hsv(vec3(fract(hue+.5),.35,1.))*smoothstep(.9,.0,r);\\\\n  col*=1.+.35*uParts.x*uOnset;\\\\n\\\\n  col*=smoothstep(1.35,.25,r);\\\\n  fragColor=vec4(col,1.);\\\\n}\\\"},\\\"hostVersion\\\":1,\\\"title\\\":\\\"Shader studio\\\"},\\\"tag\\\":\\\"Card\\\"}\",\"tree\":{\"children\":[{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.shader.effect\",\"event\":\"change\",\"key\":\"effect\",\"read\":\"text\"},\"hostOutputs\":{\"options\":\"effects\",\"value\":\"effect\"},\"label\":\"Shader effect\",\"name\":\"virtual-shader-effect\",\"options\":[{\"label\":\"NEBULA\",\"value\":\"NEBULA\"},{\"label\":\"SPECTRUM TUNNEL\",\"value\":\"SPECTRUM TUNNEL\"},{\"label\":\"LATTICE\",\"value\":\"LATTICE\"},{\"label\":\"WAVEFORM HALO\",\"value\":\"WAVEFORM HALO\"},{\"label\":\"PLASMA\",\"value\":\"PLASMA\"},{\"label\":\"POLAR EQ\",\"value\":\"POLAR EQ\"},{\"label\":\"OSCILLOSCOPE\",\"value\":\"OSCILLOSCOPE\"},{\"label\":\"VORONOI\",\"value\":\"VORONOI\"},{\"label\":\"STARFIELD\",\"value\":\"STARFIELD\"},{\"label\":\"FLOW FIELD\",\"value\":\"FLOW FIELD\"},{\"label\":\"KALEIDO\",\"value\":\"KALEIDO\"},{\"label\":\"METABALLS\",\"value\":\"METABALLS\"},{\"label\":\"CONTOUR BLOOM\",\"value\":\"CONTOUR BLOOM\"},{\"label\":\"AURORA CURTAINS\",\"value\":\"AURORA CURTAINS\"},{\"label\":\"HARMONIC RIBBONS\",\"value\":\"HARMONIC RIBBONS\"},{\"label\":\"CYMATIC PLATE\",\"value\":\"CYMATIC PLATE\"},{\"label\":\"SPECTRAL DUNES\",\"value\":\"SPECTRAL DUNES\"},{\"label\":\"PRISM ORBIT\",\"value\":\"PRISM ORBIT\"},{\"label\":\"CONTOUR KNOT\",\"value\":\"CONTOUR KNOT\"}]},\"tag\":\"Select\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.shader.auto\",\"event\":\"change\",\"key\":\"auto\",\"read\":\"checked\"},\"hostOutputs\":{\"checked\":\"auto\"},\"label\":\"Auto-cycle every four bars\",\"name\":\"virtual-shader-auto\"},\"tag\":\"Checkbox\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.shader.projector\",\"event\":\"click\"},\"id\":\"virtual-shader-projector\",\"label\":\"Send to projector\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.shader.apply\",\"event\":\"click\"},\"id\":\"virtual-shader-apply\",\"label\":\"Apply effect\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"disabled\":true,\"hostBinding\":{\"action\":\"virtual.shader.revert\",\"event\":\"click\"},\"id\":\"virtual-shader-revert\",\"label\":\"Restore starter effect\"},\"tag\":\"Action\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"Effect source · GLSL ES 3.0 · Ctrl / ⌘ Enter applies the effect.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"hostBinding\":{\"action\":\"virtual.shader.source\",\"event\":\"input\",\"key\":\"source\",\"maxLength\":65536,\"read\":\"text\"},\"hostEditor\":true,\"hostOutputs\":{\"errorLine\":\"errorLine\",\"value\":\"source\"},\"hostShortcut\":\"virtual.shader.apply\",\"html\":\"<div class=\\\"ssr-code-editor\\\" data-ssr-code-editor=\\\"glsl\\\">\\n<style>.ssr-code-editor{min-width:0}.ssr-code-frame{display:flex;position:relative;overflow:hidden;background:light-dark(#f7fafb,#031013);border:1px solid light-dark(#cae0db,#355a51);border-radius:8px}\\n.ssr-code-gutter{position:relative;flex:0 0 42px;overflow:hidden;text-align:right;background:#07191b;color:#70938b;user-select:none}\\n.ssr-code-gutter pre{position:absolute;top:0;left:0;width:100%;box-sizing:border-box;padding:14px 8px 14px 0;margin:0;font:12px/21px ui-monospace,monospace;white-space:pre}\\n.ssr-code-surface{position:relative;flex:1;min-width:0;overflow:hidden}\\n.ssr-code-surface textarea,.ssr-code-surface>pre{box-sizing:border-box;margin:0;padding:14px 12px;border:0;border-radius:0;background:transparent;font:12px/21px ui-monospace,monospace;letter-spacing:normal;tab-size:2;white-space:pre;overflow-wrap:normal}\\n.ssr-code-surface textarea{display:block;position:relative;width:100%;min-height:390px;resize:vertical;color:light-dark(#33855d,#d0eddf);caret-color:light-dark(#1f2f27,#e4f7ee);outline-offset:-2px}\\n.ssr-code-surface>pre{display:none;position:absolute;top:0;left:0;min-width:100%;pointer-events:none;color:light-dark(#33855d,#d0eddf)}\\n.ssr-code-frame.is-enhanced .ssr-code-surface>pre{display:block}\\n.ssr-code-frame.is-enhanced textarea{color:transparent;-webkit-text-fill-color:transparent}\\n.ssr-code-frame.is-enhanced textarea::selection{background:#bcee8340}\\n.ssr-code-footer{display:flex;justify-content:space-between;flex-wrap:wrap;gap:8px;padding:8px 2px;color:light-dark(#57796f,#89aaa0);font:10px/1.5 ui-monospace,monospace}\\n.ssr-code-token--keyword{color:light-dark(#63a116,#c2ef8b)}.ssr-code-token--type{color:light-dark(#2c8b7d,#91dcd1)}.ssr-code-token--builtin{color:light-dark(#3112a5,#bfaeff)}.ssr-code-token--number{color:light-dark(#a56012,#f5c187)}.ssr-code-token--comment{color:#789c92}.ssr-code-token--attribute{color:light-dark(#97215b,#edaccc)}.ssr-code-token--string{color:light-dark(#9f6918,#edc589)}\\n.ssr-code-frame[data-error=true]{border-color:#f0a28e}.ssr-code-gutter [data-error-line=true]{color:#ffb5a6;background:#522e28}\\n@media(max-width:540px){.ssr-code-gutter{flex-basis:32px}.ssr-code-footer{font-size:9px}}\\n.ssr-code-navigation,.ssr-code-find{padding:10px 12px;background:light-dark(#f5faf9,#0b1d19);border-top:1px solid light-dark(#d1e3dd,#29453b);font:11px/1.5 system-ui;color:light-dark(#3e5d51,#adcbbf)}\\n.ssr-code-navigation{display:flex;flex-wrap:wrap;gap:8px;align-items:center}\\n.ssr-code-navigation button,.ssr-code-find button{cursor:pointer;padding:5px 9px;border:1px solid light-dark(#cbdfd8,#36584b);border-radius:6px;background:light-dark(#f1f7f6,#122b24);color:light-dark(#3d7a5a,#d5eadf);font:inherit}\\n.ssr-code-navigation button:disabled,.ssr-code-find button:disabled{opacity:.45;cursor:default}\\n.ssr-code-navigation input,.ssr-code-query input{box-sizing:border-box;border:1px solid light-dark(#c9dcd5,#3e6153);border-radius:5px;background:light-dark(#f7fbf9,#061410);color:light-dark(#203023,#e4f4e7);padding:5px 7px;font:inherit;min-width:0}\\n.ssr-code-navigation input{width:68px}.ssr-code-navigation kbd{font:9px ui-monospace,monospace;color:light-dark(#5d7a6e,#87a498)}\\n.ssr-code-navigation [data-code=navigation-status]{font-size:10px;flex-basis:100%;empty-cells:hide}\\n.ssr-code-navigation [data-code=navigation-status]:empty{display:none}\\n.ssr-code-navigation input[aria-invalid=true]{border-color:#f0a28e}\\n.ssr-code-find[hidden]{display:none}.ssr-code-find{display:grid;gap:8px}\\n.ssr-code-query{display:flex;align-items:center;gap:8px}.ssr-code-query input{flex:1;width:100%}\\n.ssr-code-find-options,.ssr-code-find-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap}\\n.ssr-code-find-options label{display:flex;align-items:center;gap:5px}.ssr-code-find-options input{accent-color:#c2ef8b}\\n.ssr-code-find-actions [data-code=find-close]{margin-left:auto}.ssr-code-find-actions [data-code=find-count]{font:10px ui-monospace,monospace}\\n.ssr-code-match{background:#786a235c}.ssr-code-match-active{background:#8f6a3280;box-shadow:inset 0 -2px #edcc7a}\\n.ssr-code-navigation :focus-visible,.ssr-code-find :focus-visible{outline:2px solid #c2ef8b;outline-offset:2px}\\n.ssr-code-replace{display:grid;gap:8px;border-top:1px solid light-dark(#d1e3dd,#29453b);padding-top:10px}.ssr-code-replace[hidden]{display:none}\\n.ssr-code-replace [data-code=replace-status]{font-size:10px;color:light-dark(#416154,#a8c7ba)}.ssr-code-query>span{flex-shrink:0}\\n</style>\\n<div class=\\\"ssr-code-navigation\\\" role=\\\"group\\\" aria-label=\\\"Code navigation\\\">\\n  <button type=\\\"button\\\" data-code=\\\"find-toggle\\\" data-code-nav-control aria-expanded=\\\"false\\\" aria-controls=\\\"virtual-shader-source-find\\\" title=\\\"Find (Ctrl or Command F); F3 next, Shift F3 previous\\\" disabled>Find <kbd>⌘/Ctrl F</kbd></button>\\n  <label for=\\\"virtual-shader-source-line\\\">Line</label><input id=\\\"virtual-shader-source-line\\\" data-code=\\\"goto-line\\\" data-code-nav-control type=\\\"number\\\" min=\\\"1\\\" step=\\\"1\\\" value=\\\"1\\\" aria-describedby=\\\"virtual-shader-source-navigation-status\\\" title=\\\"Go to line (Ctrl or Command G)\\\" disabled><button type=\\\"button\\\" data-code=\\\"goto-submit\\\" data-code-nav-control disabled>Go</button>\\n  <span id=\\\"virtual-shader-source-navigation-status\\\" data-code=\\\"navigation-status\\\" role=\\\"status\\\" aria-live=\\\"polite\\\"></span>\\n</div>\\n<div id=\\\"virtual-shader-source-find\\\" class=\\\"ssr-code-find\\\" data-code=\\\"find-bar\\\" role=\\\"search\\\" aria-label=\\\"Find in code\\\" hidden>\\n  <label class=\\\"ssr-code-query\\\"><span>Find text</span><input data-code=\\\"find-query\\\" data-code-nav-control type=\\\"search\\\" maxlength=\\\"1024\\\" autocomplete=\\\"off\\\" spellcheck=\\\"false\\\" disabled></label>\\n  <div class=\\\"ssr-code-find-options\\\"><label><input data-code=\\\"find-case\\\" data-code-nav-control type=\\\"checkbox\\\" disabled>Match case</label><label><input data-code=\\\"find-word\\\" data-code-nav-control type=\\\"checkbox\\\" disabled>Whole word</label></div>\\n  <div class=\\\"ssr-code-find-actions\\\"><button type=\\\"button\\\" data-code=\\\"find-prev\\\" data-code-nav-control aria-label=\\\"Previous match\\\" disabled>↑</button><button type=\\\"button\\\" data-code=\\\"find-next\\\" data-code-nav-control aria-label=\\\"Next match\\\" disabled>↓</button><span data-code=\\\"find-count\\\" role=\\\"status\\\" aria-live=\\\"polite\\\">Type to find</span><button type=\\\"button\\\" data-code=\\\"replace-toggle\\\" data-code-nav-control aria-expanded=\\\"false\\\" aria-controls=\\\"virtual-shader-source-replace\\\" disabled>Replace…</button><button type=\\\"button\\\" data-code=\\\"find-close\\\" data-code-nav-control aria-label=\\\"Close find\\\" disabled>Close</button></div>\\n  <div id=\\\"virtual-shader-source-replace\\\" class=\\\"ssr-code-replace\\\" data-code=\\\"replace-bar\\\" hidden>\\n    <label class=\\\"ssr-code-query\\\"><span>Replace with</span><input data-code=\\\"replace-query\\\" data-code-nav-control type=\\\"text\\\" maxlength=\\\"65536\\\" autocomplete=\\\"off\\\" spellcheck=\\\"false\\\" disabled></label>\\n    <div class=\\\"ssr-code-find-actions\\\"><button type=\\\"button\\\" data-code=\\\"replace-one\\\" data-code-nav-control disabled>Replace</button><button type=\\\"button\\\" data-code=\\\"replace-all\\\" data-code-nav-control disabled>Replace all</button><button type=\\\"button\\\" data-code=\\\"replace-undo\\\" data-code-nav-control disabled>Undo replacement</button></div>\\n    <span data-code=\\\"replace-status\\\" role=\\\"status\\\" aria-live=\\\"polite\\\">Replacement is literal. An empty value deletes matches.</span>\\n  </div>\\n</div>\\n<div class=\\\"ssr-code-frame\\\" data-code=\\\"frame\\\">\\n  <div class=\\\"ssr-code-gutter\\\" aria-hidden=\\\"true\\\"><pre data-code=\\\"lines\\\">1\\n2\\n3\\n4\\n5\\n6\\n7\\n8\\n9\\n10\\n11\\n12\\n13\\n14\\n15\\n16\\n17\\n18\\n19\\n20\\n21\\n22\\n23\\n24</pre></div>\\n  <div class=\\\"ssr-code-surface\\\"><pre data-code=\\\"highlight\\\" aria-hidden=\\\"true\\\"></pre><textarea disabled aria-label=\\\"Code source\\\" id=\\\"virtual-shader-source\\\" data-code=\\\"source\\\" rows=\\\"18\\\" maxlength=\\\"65536\\\" wrap=\\\"off\\\" spellcheck=\\\"false\\\" autocapitalize=\\\"off\\\" autocomplete=\\\"off\\\" aria-describedby=\\\"virtual-shader-help virtual-shader-source-keys\\\">// Bar-locked rings. Every input below comes from the score you are playing.\\nvoid main(){\\n  vec2 uv=(gl_FragCoord.xy-.5*uRes)/uRes.y;\\n  float r=length(uv);\\n\\n  // One ring per beat, pushed outward by the transport&#39;s own beat phase.\\n  float ring=fract(r*3.0-uBeatPhase);\\n  float pulse=smoothstep(.55,.0,abs(ring-.5))*(.25+1.6*uParts.y);\\n\\n  // The bar advances the hue, so the picture shows its place in the loop.\\n  float hue=fract(.55+uBar*.07+uBarPhase*.12+r*.1);\\n  vec3 col=hsv(vec3(hue,.7,1.))*pulse;\\n\\n  // Pads wash the frame; melody and arp sparkle over it.\\n  col+=pal(hue+.4)*uParts.z*.35*smoothstep(1.2,.2,r);\\n  col+=pal(fract(hue+.6))*pow(fbm(uv*6.+uTime*.3),5.)*6.*uParts.w;\\n\\n  // A scored hit lands as a flash and a kick of brightness, then decays.\\n  col+=uOnset*.5*hsv(vec3(fract(hue+.5),.35,1.))*smoothstep(.9,.0,r);\\n  col*=1.+.35*uParts.x*uOnset;\\n\\n  col*=smoothstep(1.35,.25,r);\\n  fragColor=vec4(col,1.);\\n}</textarea></div>\\n</div>\\n<div class=\\\"ssr-code-footer\\\"><span data-code=\\\"cursor\\\">Ln 1 · Col 1</span><span id=\\\"virtual-shader-source-keys\\\">Tab indent · Ctrl/⌘ / comment · Esc then Tab to leave</span></div>\\n</div>\",\"id\":\"virtual-shader-source\"},\"tag\":\"RawHtml\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"hostOutput\":\"status\",\"id\":\"virtual-shader-status\",\"role\":\"status\",\"text\":\"Starting the visualizer…\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"id\":\"virtual-shader-help\",\"text\":\"Write a void main() body. The shared prelude provides uniforms and spec(), wav(), hsv(), pal(), rot(), noise(), fbm(), smin(), sdCircle() and sdBox(). A compile error keeps the running picture.\"},\"tag\":\"Text\"},{\"children\":[{\"children\":[{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"Shader inputs\"},\"tag\":\"Text\"}],\"kind\":\"view-node\",\"props\":{\"element\":\"summary\"},\"tag\":\"Section\"},{\"children\":[{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"uBar: Bar number the transport is on, counting from 1; 0 when stopped.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"uBarPhase: 0..1 sawtooth across one bar.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"uBass: Measured low-band energy, 0..1 (smoothed).\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"uBeat: Envelope that pops to 1 on a bass transient and decays.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"uBeatPhase: 0..1 sawtooth across one beat.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"uCentroid: Spectral centroid (brightness), 0..1.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"uLvl: Alias of uRms, kept for the original effects.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"uMid: Measured mid-band energy, 0..1 (smoothed).\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"uOnset: 1 on a scored note or drum hit, decaying to 0.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"uParts: Score energy per part: x drums, y bass, z pads, w melody+arp.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"uRes: Canvas size in pixels (vec2).\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"uRms: Measured waveform level, 0..1 (smoothed).\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"uSpec: Two-row texture: row 0 spectrum, row 1 waveform (use spec()/wav()).\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"uTempo: Beats per minute of the running score.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"uTime: Seconds since the visualizer was created.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"uTre: Alias of uTreble, kept for the original effects.\"},\"tag\":\"Text\"},{\"children\":[],\"kind\":\"view-node\",\"props\":{\"text\":\"uTreble: Measured high-band energy, 0..1 (smoothed).\"},\"tag\":\"Text\"}],\"kind\":\"view-node\",\"props\":{\"title\":\"Shader inputs\"},\"tag\":\"Card\"}],\"kind\":\"view-node\",\"props\":{\"element\":\"details\"},\"tag\":\"Section\"}],\"kind\":\"view-node\",\"props\":{\"hostCapability\":\"virtual.shader-studio\",\"hostInitial\":{\"source\":\"// Bar-locked rings. Every input below comes from the score you are playing.\\nvoid main(){\\n  vec2 uv=(gl_FragCoord.xy-.5*uRes)/uRes.y;\\n  float r=length(uv);\\n\\n  // One ring per beat, pushed outward by the transport's own beat phase.\\n  float ring=fract(r*3.0-uBeatPhase);\\n  float pulse=smoothstep(.55,.0,abs(ring-.5))*(.25+1.6*uParts.y);\\n\\n  // The bar advances the hue, so the picture shows its place in the loop.\\n  float hue=fract(.55+uBar*.07+uBarPhase*.12+r*.1);\\n  vec3 col=hsv(vec3(hue,.7,1.))*pulse;\\n\\n  // Pads wash the frame; melody and arp sparkle over it.\\n  col+=pal(hue+.4)*uParts.z*.35*smoothstep(1.2,.2,r);\\n  col+=pal(fract(hue+.6))*pow(fbm(uv*6.+uTime*.3),5.)*6.*uParts.w;\\n\\n  // A scored hit lands as a flash and a kick of brightness, then decays.\\n  col+=uOnset*.5*hsv(vec3(fract(hue+.5),.35,1.))*smoothstep(.9,.0,r);\\n  col*=1.+.35*uParts.x*uOnset;\\n\\n  col*=smoothstep(1.35,.25,r);\\n  fragColor=vec4(col,1.);\\n}\"},\"hostVersion\":1,\"title\":\"Shader studio\"},\"tag\":\"Card\"},\"execution\":{\"portable_ir_schema\":\"cre8.view.ir\",\"portable_ir_tree_hash\":\"bac308dae501619de262ee13e6cadaff96ae9e1d651e358d5cb53e0ada33443f\",\"portable_ir_version\":1,\"producer\":\"rust-ssr\"}}","data-cre8-host-component":"virtual.shader-studio","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-shader-editor","data-visual-for":"shader trace","element":"details"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"className":"ls-workspace-description","data-visual-description":true,"text":"Create a shader picture driven by the audio. Edit effects below the canvas.","variant":"p"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"id":"scope-wav-help","text":"Instrument sample · 2 seconds · stereo WAV · current instrument settings · dry audio.","variant":"p"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"data-visual-shader-only":true,"text":"The picture reads the take that is playing: measured audio through the analyser, and the score's own bars, beats, per-part energy and note onsets. Prepare and start a score to see both.","variant":"p"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Capture uses the longest bright outline in the center square. Link live follows that outline; blank frames keep the last valid path. Stop ends the link and audio."},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-visual-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"aria-label":"Visuals","className":"ls-visual","data-field-default":null,"data-virtual-performance":"1","data-visual-desk":true,"element":"section"},"tag":"Section"}],"kind":"view-node","props":{"className":"media-fragment","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"live-score.30","data-ls-tab":"code","disabled":false,"label":"Live code","pressed":true},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"live-score.31","data-ls-tab":"session","disabled":false,"label":"DAW session","pressed":false},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"live-score.32","data-ls":"focus","disabled":false,"id":"ls-focus-editor","label":"Focus editor","pressed":false},"tag":"Action"}],"kind":"view-node","props":{"aria-label":"Music editor","element":"nav"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-controls":"ls-edit-menu-items","aria-haspopup":"menu","aria-label":"More draft actions","controlKey":"live-score.34","data-ssr-menu-open":"ls-edit-menu","disabled":false,"id":"ls-draft-more","label":"⋯"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"data-ls":"draft-state","text":"Unprepared draft","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"controlKey":"live-score.36","data-ls":"revert","disabled":true,"id":"ls-revert-draft","label":"Restore prepared take"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"live-score.37","data-ls":"undo","disabled":true,"id":"ls-undo-draft","label":"Undo draft edit"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-draft-bar","data-ssr-context-menu":"ls-edit-menu","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Score "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"CRE8 SCORE","variant":"span"},"tag":"Text"}],"kind":"view-node","props":{"element":"label","for":"live-score-source"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"data-ls":"lines","text":"1","variant":"pre"},"tag":"Text"}],"kind":"view-node","props":{"aria-hidden":"true","className":"ls-gutter","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-hidden":"true","data-ls":"highlight","text":"","variant":"pre"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"aria-label":"Score CRE8 SCORE","autocapitalize":"off","controlKey":"live-score.46","data-ls":"source","default":"// Change a note, then apply on the next bar.\ntempo 96\nbars 2\ninstrument bass saw_bass\ninstrument melody bell\nlevel bass 0.7\nlevel melody 0.55\nlevel drums 0.8\nlevel reverb 0.3\n\ndrum kick 0 0.9\ndrum kick 2 0.85\ndrum kick 4 0.9\ndrum kick 6 0.85\ndrum snare 1 0.65\ndrum snare 3 0.65\ndrum snare 5 0.65\ndrum snare 7 0.65\ndrum hat 0.5 0.3\ndrum hat 2.5 0.3\ndrum hat 4.5 0.3\ndrum hat 6.5 0.3\n\nnote bass C2 0 0.75 0.8\nnote bass C2 1.5 0.4 0.6\nnote bass G2 2 0.75 0.7\nnote bass A#1 4 0.75 0.8\nnote bass G2 6 0.75 0.7\nnote melody D#4 0.5 0.5 0.65\nnote melody G4 2.5 0.5 0.65\nnote melody A#4 4.5 0.5 0.65\nnote melody G4 6.5 0.5 0.65\n","disabled":false,"id":"live-score-source","kind":"textarea","label":"Score CRE8 SCORE","maxlength":16384,"name":"live-score-source","rows":17,"spellcheck":false,"wrap":"off"},"tag":"Input"}],"kind":"view-node","props":{"className":"ls-editor-surface","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-editor-frame","data-ls":"editor","data-ssr-context-menu":"ls-edit-menu","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-ls":"cursor","text":"Ln 1 · Col 1","variant":"span"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Tab indent · Ctrl / ⌘ / comment · Ctrl / ⌘ Enter apply · Esc then Tab to leave","variant":"span"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-editor-footer","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"live-score.52","data-ls":"preset","default":"starter","disabled":false,"label":"Sound sketch","name":"live-score-52","options":[{"label":"Orbit groove","value":"starter"},{"label":"Pulse engine","value":"pulse"},{"label":"Drift","value":"drift"},{"label":"Composer remix","value":"composer"},{"label":"Night Signal · full session","value":"showcase"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"live-score.53","data-ls":"preset-load","disabled":false,"label":"Load sketch"},"tag":"Action"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Prepared takes","controlKey":"live-score.55","data-ls":"takes","default":"","disabled":false,"label":"Prepared takes","name":"live-score-55","options":[{"label":"No takes yet","value":""}]},"tag":"Select"}],"kind":"view-node","props":{"className":"ls-takes","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"live-score.56","data-ls":"take-load","disabled":true,"label":"Recall take"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-preset-row","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"live-score.59","data-ls":"style","default":"house","disabled":false,"label":"Compose","name":"live-score-59","options":[{"label":"house","value":"house"},{"label":"chill","value":"chill"},{"label":"cosmic","value":"cosmic"},{"label":"lofi","value":"lofi"},{"label":"trance","value":"trance"},{"label":"pop","value":"pop"},{"label":"cinematic","value":"cinematic"},{"label":"tribal","value":"tribal"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"live-score.61","data-ls":"seed","default":"7","disabled":false,"kind":"number","label":"Seed","max":"999999","min":"0","name":"live-score-61"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"live-score.62","data-ls":"compose","disabled":false,"label":"Write composer draft"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-compose","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"data-ls-pane":"code","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"live-score.65","data-ls":"session","default":"","disabled":false,"kind":"textarea","label":"DAW session JSON","name":"live-score-65","placeholder":"Prepare your score to edit its session…","rows":15,"spellcheck":false,"wrap":"off"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Edit tempo, lane gains, mutes and instruments. The score source travels with this session.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"data-ls-pane":"session","element":"div","hidden":true},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Arrangement","variant":"strong"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"data-ls":"arrangement-state","text":"Prepare a score to see its notes","variant":"span"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Arrangement zoom","controlKey":"live-score.73","data-daw-zoom":true,"default":"1","disabled":false,"kind":"range","label":"Zoom","max":"3","min":"1","name":"live-score-73","step":"0.25"},"tag":"Input"},{"children":[],"kind":"view-node","props":{"data-daw-zoom-label":true,"text":"100%","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-daw-only ls-timeline-zoom","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"text":"Your compiled drums and note lanes appear here.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"aria-label":"Prepared note lanes; scroll sideways on narrow screens","data-ls":"arrangement","element":"div","role":"region","tabIndex":0},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"arrangement-controls.4","data-arrange":"lane","default":"bass","disabled":false,"label":"Channel","name":"arrangement-controls-4","options":[{"label":"bass","value":"bass"},{"label":"pads","value":"pads"},{"label":"melody","value":"melody"},{"label":"arp","value":"arp"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"arrangement-controls.6","data-arrange":"beat","default":"0","disabled":false,"kind":"number","label":"Beat","max":"16","min":"0","name":"arrangement-controls-6","step":".25"},"tag":"Input"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"arrangement-controls.7","data-arrange":"move","disabled":false,"label":"Move phrase"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"arrangement-controls.8","data-arrange":"duplicate","disabled":false,"label":"Duplicate phrase"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"data-arrange":"status","role":"status","text":"Select a phrase or drag it between channels. Prepare applies each draft.","variant":"span"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-arrange-controls","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"media-fragment","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"aria-label":"Compiled arrangement","className":"ls-arrangement","element":"section"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-code","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Mixer","variant":"h3"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Faders edit the draft. Apply mix to update the prepared song.","variant":"p"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"live-score.81","data-ls":"tempo","default":"96","disabled":false,"kind":"number","label":"Tempo BPM","max":"180","min":"60","name":"live-score-81"},"tag":"Input"}],"kind":"view-node","props":{"className":"ls-tempo","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Drag Drums channel","data-channel-drag":"true","label":"⠿"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"aria-label":"Move Drums earlier","data-channel-move":"up","label":"←"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"aria-label":"Move Drums later","data-channel-move":"down","label":"→"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-channel-order","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"mixer-handle","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"html":"<div class=\"mixer-header\"><span class=\"mixer-number\">01</span><span class=\"mixer-name\">Drums</span><span class=\"mixer-layout\" title=\"L R\">stereo</span></div>"},"tag":"RawHtml"},{"children":[{"children":[],"kind":"view-node","props":{"text":"Drum synth"},"tag":"Text"}],"kind":"view-node","props":{"className":"mixer-slot","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Mute Drums","data-ls-mute":"drums","data-mixer-button":"mute","disabled":true,"label":"M","pressed":false},"tag":"Action"}],"kind":"view-node","props":{"className":"mixer-buttons","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"html":"<ol class=\"mixer-scale\" aria-hidden=\"true\"><li style=\"--at:1.0000\">0</li><li style=\"--at:0.7079\">-3</li><li style=\"--at:0.5012\">-6</li><li style=\"--at:0.2512\">-12</li><li style=\"--at:0.1000\">-20</li><li style=\"--at:0.0000\">-∞</li></ol>"},"tag":"RawHtml"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Drums","data-ls-lane":"drums","default":"0.8","id":"ls-gain-drums","kind":"range","max":"1","min":"0","name":"gain-drums","step":"0.01"},"tag":"Input"}],"kind":"view-node","props":{"className":"mixer-fader","data-mixer-fader":true,"element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"mixer-fader-bay","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-ls-gain-label":"drums","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"className":"mixer-readout","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"aria-label":"Drums","className":"mixer-strip ls-lane-row","data-ls-channel":"drums","data-mixer-role":"channel","data-mixer-strip":"drums","element":"div","role":"group"},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Drag Bass channel","data-channel-drag":"true","label":"⠿"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"aria-label":"Move Bass earlier","data-channel-move":"up","label":"←"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"aria-label":"Move Bass later","data-channel-move":"down","label":"→"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-channel-order","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"mixer-handle","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"html":"<div class=\"mixer-header\"><span class=\"mixer-number\">02</span><span class=\"mixer-name\">Bass</span><span class=\"mixer-layout\" title=\"L R\">stereo</span></div>"},"tag":"RawHtml"},{"children":[{"children":[],"kind":"view-node","props":{"data-ls-instrument":"bass","default":"saw_bass","disabled":true,"label":"Bass instrument","name":"instrument-bass","options":[{"label":"Saw bass","value":"saw_bass"},{"label":"Warm pad","value":"warm_pad"},{"label":"Bell","value":"bell"},{"label":"Bright lead","value":"bright_lead"}]},"tag":"Select"}],"kind":"view-node","props":{"className":"mixer-slot","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Mute Bass","data-ls-mute":"bass","data-mixer-button":"mute","disabled":true,"label":"M","pressed":false},"tag":"Action"}],"kind":"view-node","props":{"className":"mixer-buttons","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"html":"<ol class=\"mixer-scale\" aria-hidden=\"true\"><li style=\"--at:1.0000\">0</li><li style=\"--at:0.7079\">-3</li><li style=\"--at:0.5012\">-6</li><li style=\"--at:0.2512\">-12</li><li style=\"--at:0.1000\">-20</li><li style=\"--at:0.0000\">-∞</li></ol>"},"tag":"RawHtml"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Bass","data-ls-lane":"bass","default":"0.7","id":"ls-gain-bass","kind":"range","max":"1","min":"0","name":"gain-bass","step":"0.01"},"tag":"Input"}],"kind":"view-node","props":{"className":"mixer-fader","data-mixer-fader":true,"element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"mixer-fader-bay","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-ls-gain-label":"bass","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"className":"mixer-readout","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"aria-label":"Bass","className":"mixer-strip ls-lane-row","data-ls-channel":"bass","data-mixer-role":"channel","data-mixer-strip":"bass","element":"div","role":"group"},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Drag Pads channel","data-channel-drag":"true","label":"⠿"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"aria-label":"Move Pads earlier","data-channel-move":"up","label":"←"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"aria-label":"Move Pads later","data-channel-move":"down","label":"→"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-channel-order","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"mixer-handle","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"html":"<div class=\"mixer-header\"><span class=\"mixer-number\">03</span><span class=\"mixer-name\">Pads</span><span class=\"mixer-layout\" title=\"L R\">stereo</span></div>"},"tag":"RawHtml"},{"children":[{"children":[],"kind":"view-node","props":{"data-ls-instrument":"pads","default":"warm_pad","disabled":true,"label":"Pads instrument","name":"instrument-pads","options":[{"label":"Saw bass","value":"saw_bass"},{"label":"Warm pad","value":"warm_pad"},{"label":"Bell","value":"bell"},{"label":"Bright lead","value":"bright_lead"}]},"tag":"Select"}],"kind":"view-node","props":{"className":"mixer-slot","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Mute Pads","data-ls-mute":"pads","data-mixer-button":"mute","disabled":true,"label":"M","pressed":false},"tag":"Action"}],"kind":"view-node","props":{"className":"mixer-buttons","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"html":"<ol class=\"mixer-scale\" aria-hidden=\"true\"><li style=\"--at:1.0000\">0</li><li style=\"--at:0.7079\">-3</li><li style=\"--at:0.5012\">-6</li><li style=\"--at:0.2512\">-12</li><li style=\"--at:0.1000\">-20</li><li style=\"--at:0.0000\">-∞</li></ol>"},"tag":"RawHtml"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Pads","data-ls-lane":"pads","default":"0.8","id":"ls-gain-pads","kind":"range","max":"1","min":"0","name":"gain-pads","step":"0.01"},"tag":"Input"}],"kind":"view-node","props":{"className":"mixer-fader","data-mixer-fader":true,"element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"mixer-fader-bay","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-ls-gain-label":"pads","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"className":"mixer-readout","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"aria-label":"Pads","className":"mixer-strip ls-lane-row","data-ls-channel":"pads","data-mixer-role":"channel","data-mixer-strip":"pads","element":"div","role":"group"},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Drag Melody channel","data-channel-drag":"true","label":"⠿"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"aria-label":"Move Melody earlier","data-channel-move":"up","label":"←"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"aria-label":"Move Melody later","data-channel-move":"down","label":"→"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-channel-order","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"mixer-handle","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"html":"<div class=\"mixer-header\"><span class=\"mixer-number\">04</span><span class=\"mixer-name\">Melody</span><span class=\"mixer-layout\" title=\"L R\">stereo</span></div>"},"tag":"RawHtml"},{"children":[{"children":[],"kind":"view-node","props":{"data-ls-instrument":"melody","default":"bright_lead","disabled":true,"label":"Melody instrument","name":"instrument-melody","options":[{"label":"Saw bass","value":"saw_bass"},{"label":"Warm pad","value":"warm_pad"},{"label":"Bell","value":"bell"},{"label":"Bright lead","value":"bright_lead"}]},"tag":"Select"}],"kind":"view-node","props":{"className":"mixer-slot","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Mute Melody","data-ls-mute":"melody","data-mixer-button":"mute","disabled":true,"label":"M","pressed":false},"tag":"Action"}],"kind":"view-node","props":{"className":"mixer-buttons","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"html":"<ol class=\"mixer-scale\" aria-hidden=\"true\"><li style=\"--at:1.0000\">0</li><li style=\"--at:0.7079\">-3</li><li style=\"--at:0.5012\">-6</li><li style=\"--at:0.2512\">-12</li><li style=\"--at:0.1000\">-20</li><li style=\"--at:0.0000\">-∞</li></ol>"},"tag":"RawHtml"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Melody","data-ls-lane":"melody","default":"0.55","id":"ls-gain-melody","kind":"range","max":"1","min":"0","name":"gain-melody","step":"0.01"},"tag":"Input"}],"kind":"view-node","props":{"className":"mixer-fader","data-mixer-fader":true,"element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"mixer-fader-bay","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-ls-gain-label":"melody","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"className":"mixer-readout","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"aria-label":"Melody","className":"mixer-strip ls-lane-row","data-ls-channel":"melody","data-mixer-role":"channel","data-mixer-strip":"melody","element":"div","role":"group"},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Drag Arp channel","data-channel-drag":"true","label":"⠿"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"aria-label":"Move Arp earlier","data-channel-move":"up","label":"←"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"aria-label":"Move Arp later","data-channel-move":"down","label":"→"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-channel-order","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"mixer-handle","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"html":"<div class=\"mixer-header\"><span class=\"mixer-number\">05</span><span class=\"mixer-name\">Arp</span><span class=\"mixer-layout\" title=\"L R\">stereo</span></div>"},"tag":"RawHtml"},{"children":[{"children":[],"kind":"view-node","props":{"data-ls-instrument":"arp","default":"bell","disabled":true,"label":"Arp instrument","name":"instrument-arp","options":[{"label":"Saw bass","value":"saw_bass"},{"label":"Warm pad","value":"warm_pad"},{"label":"Bell","value":"bell"},{"label":"Bright lead","value":"bright_lead"}]},"tag":"Select"}],"kind":"view-node","props":{"className":"mixer-slot","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Mute Arp","data-ls-mute":"arp","data-mixer-button":"mute","disabled":true,"label":"M","pressed":false},"tag":"Action"}],"kind":"view-node","props":{"className":"mixer-buttons","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"html":"<ol class=\"mixer-scale\" aria-hidden=\"true\"><li style=\"--at:1.0000\">0</li><li style=\"--at:0.7079\">-3</li><li style=\"--at:0.5012\">-6</li><li style=\"--at:0.2512\">-12</li><li style=\"--at:0.1000\">-20</li><li style=\"--at:0.0000\">-∞</li></ol>"},"tag":"RawHtml"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Arp","data-ls-lane":"arp","default":"0.8","id":"ls-gain-arp","kind":"range","max":"1","min":"0","name":"gain-arp","step":"0.01"},"tag":"Input"}],"kind":"view-node","props":{"className":"mixer-fader","data-mixer-fader":true,"element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"mixer-fader-bay","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-ls-gain-label":"arp","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"className":"mixer-readout","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"aria-label":"Arp","className":"mixer-strip ls-lane-row","data-ls-channel":"arp","data-mixer-role":"channel","data-mixer-strip":"arp","element":"div","role":"group"},"tag":"Section"},{"children":[{"children":[{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Drag Space channel","data-channel-drag":"true","label":"⠿"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"aria-label":"Move Space earlier","data-channel-move":"up","label":"←"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"aria-label":"Move Space later","data-channel-move":"down","label":"→"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-channel-order","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"mixer-handle","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"html":"<div class=\"mixer-header\"><span class=\"mixer-number\">06</span><span class=\"mixer-name\">Space</span><span class=\"mixer-layout\" title=\"L R\">stereo</span></div>"},"tag":"RawHtml"},{"children":[{"children":[],"kind":"view-node","props":{"text":"Reverb return"},"tag":"Text"}],"kind":"view-node","props":{"className":"mixer-slot","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Mute Space","data-ls-mute":"reverb","data-mixer-button":"mute","disabled":true,"label":"M","pressed":false},"tag":"Action"}],"kind":"view-node","props":{"className":"mixer-buttons","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"html":"<ol class=\"mixer-scale\" aria-hidden=\"true\"><li style=\"--at:1.0000\">0</li><li style=\"--at:0.7079\">-3</li><li style=\"--at:0.5012\">-6</li><li style=\"--at:0.2512\">-12</li><li style=\"--at:0.1000\">-20</li><li style=\"--at:0.0000\">-∞</li></ol>"},"tag":"RawHtml"},{"children":[{"children":[],"kind":"view-node","props":{"aria-label":"Space","data-ls-lane":"reverb","default":"0.3","id":"ls-gain-reverb","kind":"range","max":"1","min":"0","name":"gain-reverb","step":"0.01"},"tag":"Input"}],"kind":"view-node","props":{"className":"mixer-fader","data-mixer-fader":true,"element":"div"},"tag":"Section"}],"kind":"view-node","props":{"className":"mixer-fader-bay","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"data-ls-gain-label":"reverb","variant":"output"},"tag":"Text"}],"kind":"view-node","props":{"className":"mixer-readout","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"aria-label":"Space","className":"mixer-strip ls-lane-row","data-ls-channel":"reverb","data-mixer-role":"bus","data-mixer-strip":"reverb","element":"div","role":"group"},"tag":"Section"}],"kind":"view-node","props":{"className":"media-fragment"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-lanes","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"controlKey":"live-score.83","data-ls":"mix","disabled":true,"label":"Apply mix"},"tag":"Action"}],"kind":"view-node","props":{"aria-label":"Channel strips","className":"ls-channel-rack","element":"section"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Play a MIDI phrase"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Turn your controller into score code. The first note starts a phrase using this score’s tempo and bars, independent of loop playback.","variant":"p"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"live-score.88","data-score-midi":"scan","disabled":true,"label":"Scan inputs"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"live-score.89","data-ls-nav":true,"href":"/view/device/midi","label":"Device ↗"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-midi-controls","element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"live-score.91","data-score-midi":"ports","default":"","disabled":true,"label":"Input","name":"live-score-91","options":[]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"live-score.93","data-score-midi":"channel","default":"0","disabled":false,"label":"Receive","name":"live-score-93","options":[{"label":"All channels","value":"0"},{"label":"Keyboard · channel 1","value":"1"},{"label":"Pads · channel 10","value":"10"}]},"tag":"Select"}],"kind":"view-node","props":{"element":"div"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"controlKey":"live-score.95","data-score-midi":"record","disabled":true,"label":"Record phrase"},"tag":"Action"},{"children":[],"kind":"view-node","props":{"controlKey":"live-score.96","data-score-midi":"stop","disabled":true,"label":"Stop recording"},"tag":"Action"}],"kind":"view-node","props":{"className":"ls-midi-controls","element":"div"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"aria-live":"polite","data-score-midi":"status","role":"status","text":"Connecting MIDI controls…","variant":"p"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"aria-label":"Recorded score phrase","data-score-midi":"preview","text":"Your recorded notes will appear here.","variant":"pre"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"controlKey":"live-score.99","data-score-midi":"insert","disabled":true,"label":"Insert into score"},"tag":"Action"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"1/16-note grid · up to 128 notes · review before inserting. Notes go to Melody; channel 10 maps 36 kick, 38 snare, 42 hat, 46 open hat. Other pads are skipped. Pressure, sustain and CC are not recorded. Prepare score to hear the result; live monitoring is off.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-quiet-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-midi","data-ls-midi":true,"element":"details","id":"live-score-midi","open":true},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Score language"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"Beats start at 0. Loops are 1–4 bars at 60–180 BPM.","variant":"p"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"tempo 96\nbars 2\ncompose house 7\nclear bass\ninstrument bass saw_bass\nnote bass C2 0 0.75 0.8\ndrum kick 0 0.9\nlevel reverb 0.3","variant":"pre"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"Note: part, pitch, beat, duration, velocity. Parts: bass, pads, melody, arp. Drums: kick, snare, hat, open_hat.","variant":"p"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"text":"Song-wide: "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"kit <name>","variant":"code"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":" · "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"swing 0..0.3","variant":"code"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":" · "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"root C4","variant":"code"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":" · "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"scale dorian","variant":"code"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"."},"tag":"Text"}],"kind":"view-node","props":{"variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"element":"details"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Pattern playground"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"pattern kick X...x... 0 8 0.8\nsequence bass C2,-,G2,- 0 8 0.75 0.7","variant":"pre"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"text":"Pattern: voice, steps, start, span, velocity. "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"x","variant":"code"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":" hit · "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"X","variant":"code"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":" full accent · "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":".","variant":"code"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":" rest."},"tag":"Text"},{"children":[],"kind":"view-node","props":{"html":"<br>"},"tag":"RawHtml"},{"children":[],"kind":"view-node","props":{"text":"Sequence: part, comma-separated notes, start, span, gate, velocity. "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"-","variant":"code"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":" is a rest. Gate is the fraction of each step held, from 0.01 to 1."},"tag":"Text"}],"kind":"view-node","props":{"variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"element":"details","open":true},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Mixing console"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[],"kind":"view-node","props":{"text":"Targets: bass, pads, melody, arp, drums, master. Up to four "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"fx","variant":"code"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":" per target, appended in order; "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"fx <target> clear","variant":"code"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":" drops them."},"tag":"Text"}],"kind":"view-node","props":{"variant":"p"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"text":"Automate "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"gain","variant":"code"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":", "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"pan","variant":"code"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":", "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"send.reverb","variant":"code"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":", "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"send.delay","variant":"code"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":" or "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"fx.<n>.<param>","variant":"code"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":" (1-based, declared first): one line per breakpoint, at most 64 per parameter and 256 per score."},"tag":"Text"}],"kind":"view-node","props":{"variant":"p"},"tag":"Text"},{"children":[{"children":[],"kind":"view-node","props":{"text":"Every parameter is validated against the plugin catalog at "},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":"/audio/plugins","variant":"code"},"tag":"Text"},{"children":[],"kind":"view-node","props":{"text":". A score naming none of these renders exactly as before."},"tag":"Text"}],"kind":"view-node","props":{"variant":"p"},"tag":"Text"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Help"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"text":"pan arp -0.5\nsend melody reverb 0.35\nsend arp delay 0.4\nfx bass filter mode=low_pass cutoff_hz=900\nautomation bass gain 0 0.2\nautomation bass gain 8 1\nreverb preset=plate mix=0.4\ndelay time=1/8. feedback=0.45 pingpong=1\nmaster glue=1 ceiling=0.9","variant":"pre"},"tag":"Text"}],"kind":"view-node","props":{"className":"ls-quiet-help","element":"details"},"tag":"Section"}],"kind":"view-node","props":{"element":"details"},"tag":"Section"},{"children":[],"kind":"view-node","props":{"className":"ls-clock-boundary","text":"Audio uses its own sample clock. On the Virtual stage, DAW energy can drive shader level and tempo; beat phases remain independent.","variant":"p"},"tag":"Text"}],"kind":"view-node","props":{"aria-label":"Loop mixer","className":"ls-mix","element":"aside"},"tag":"Section"}],"kind":"view-node","props":{"className":"ls-columns","element":"div"},"tag":"Section"}],"kind":"view-node","props":{"aria-label":"Live music desk","className":"ls-desk","data-cre8-binding":"audio.liveScore","data-daw-contract":"1","data-daw-mixer":"true","data-daw-render":"audio.daw.render","data-daw-view":"tracks","data-editor-chrome":"audio","data-live-score":true,"data-workspace":"daw","element":"section","id":"live-music-desk"},"tag":"Section"}],"kind":"view-node","props":{"className":"media-fragment","element":"div"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"text":"Render tools"},"tag":"Text"}],"kind":"view-node","props":{"element":"summary"},"tag":"Section"},{"children":[{"children":[{"children":[],"kind":"view-node","props":{"endpoint":"/audio/song","fields":[{"kind":"select","label":"Style","name":"style","options":[{"label":"Chill","value":"chill"},{"label":"House","value":"house"},{"label":"Pop","value":"pop"},{"label":"Cosmic","value":"cosmic"},{"label":"Lofi","value":"lofi"},{"label":"Trance","value":"trance"},{"label":"Cinematic","value":"cinematic"},{"label":"Tribal","value":"tribal"}]},{"default":16,"kind":"number","label":"Bars","name":"bars"},{"default":96,"kind":"number","label":"Tempo (BPM)","name":"tempo_bpm"},{"default":0.0,"kind":"number","label":"Swing (0-0.35)","name":"swing"},{"default":7,"kind":"number","label":"Seed","name":"seed"},{"kind":"checkbox","label":"Export MIDI","name":"include_midi"},{"default":false,"kind":"hidden","name":"include_wav"}],"method":"POST","submitLabel":"Compose","timeoutMs":30000,"title":"Generate song"},"tag":"Form"}],"kind":"view-node","props":{"id":"song","label":"Song"},"tag":"Tab"},{"children":[{"children":[],"kind":"view-node","props":{"endpoint":"/audio/graph","fields":[{"kind":"textarea","label":"Session JSON","name":"audio_session","placeholder":"{ \"lanes\": [], \"transport\": { \"bpm\": 96 } }"}],"method":"POST","submitLabel":"Compile","timeoutMs":10000,"title":"Compile audio graph"},"tag":"Form"}],"kind":"view-node","props":{"id":"graph","label":"Graph"},"tag":"Tab"},{"children":[{"children":[],"kind":"view-node","props":{"endpoint":"/audio/scene","fields":[{"default":"focus_wonder","kind":"text","label":"Preset","name":"preset"},{"default":8,"kind":"number","label":"Duration","name":"duration_secs"},{"default":44100,"kind":"number","label":"Sample rate","name":"sample_rate"}],"method":"POST","submitLabel":"Render","timeoutMs":10000,"title":"Render scene"},"tag":"Form"}],"kind":"view-node","props":{"id":"scene","label":"Scene"},"tag":"Tab"},{"children":[{"children":[],"kind":"view-node","props":{"endpoint":"/audio/schema","fields":[{"default":"summary","kind":"text","label":"Kind","name":"kind"}],"method":"GET","submitLabel":"Inspect","title":"Inspect schema"},"tag":"Form"}],"kind":"view-node","props":{"id":"schema","label":"Schema"},"tag":"Tab"}],"kind":"view-node","props":{"defaultTab":"song"},"tag":"Tabs"}],"kind":"view-node","props":{"aria-label":"Render tools","className":"ls-render-tools","element":"details","id":"audio-render-tools"},"tag":"Section"},{"children":[{"children":[{"children":["Checking view availability…"],"kind":"view-node","props":{},"tag":"Text"}],"kind":"view-node","props":{"aria-label":"View availability","class":"primitive-live-payload","id":"payload-live-content-audio-audio-mixer"},"tag":"Section"}],"kind":"view-node","props":{"id":"payload-live-audio-audio-mixer","patchTarget":"#payload-live-content-audio-audio-mixer","pollIntervalMs":8000,"refreshHref":"/view/payload/patch?app=Audio&view=audio.mixer","streamUrl":"/view/payload/patch?app=Audio&view=audio.mixer","transport":"http","transportStatus":false},"tag":"LiveSlot"}],"kind":"view-node","ok":true,"props":{},"tag":"Page"},"kind":"view-node","ok":true,"props":{},"tag":"Page"}