<!-- SS · part 69 -->
display:flex;flex-wrap:wrap;gap:6px 10px;align-items:center;margin-bottom:6px;font-size:12px;color:#ccc}
.es-eq-top label{display:flex;gap:6px;align-items:center}
#es .es-eqp select,#es .es-wave select{background:#0a0a0a !important;color:#fff !important;border:1px solid var(--ln) !important;border-radius:6px !important;padding:5px !important;font-size:12px !important;max-width:190px}
#es .es-eq-cv{display:block;width:100%;height:120px;border:1px solid var(--ln);border-radius:8px;background:#050505;margin:6px 0}
.es-geq{display:grid;grid-template-columns:repeat(10,1fr);gap:2px;padding:8px 4px;background:linear-gradient(#0b0b0b,#040404);border:1px solid #3a2a10;border-radius:8px;box-shadow:inset 0 0 12px rgba(227,18,44,.15)}
.es-geq-b{display:flex;flex-direction:column;align-items:center;font:9px ui-monospace,Menlo,monospace;color:#e8c36a}
.es-geq-b b{color:#ff3048;font-weight:700;text-shadow:0 0 6px rgba(255,48,72,.8);min-height:12px}
#es .es-geq-b input[type=range]{writing-mode:vertical-lr;direction:rtl;width:22px !important;height:110px !important;accent-color:#e3122c;margin:4px 0;padding:0 !important}
.es-peq{display:flex;flex-direction:column;gap:5px;margin-top:8px}
.es-peq-r{display:grid;grid-template-columns:18px 86px 1fr 1fr 1fr;gap:5px;align-items:center;font-size:10px;color:#aaa}
.es-peq-r label{display:flex;flex-direction:column}.es-peq-r b{color:var(--g)}
#es .es-peq-r input[type=range]{width:100% !important;min-width:0}
#es .es-peq-r select{max-width:86px;font-size:11px !important;padding:3px !important}
@media (max-width:420px){.es-peq-r{grid-template-columns:18px 1fr 1fr;}.es-peq-r label:last-child{grid-column:2/4}}
/* wave studio (retro) */
.es-wave{background:linear-gradient(#120406,#050505) !important;border-color:#5a1a1a !important}
.es-wv-h{font-family:ui-monospace,Menlo,monospace !important;letter-spacing:.12em}
.es-wv-src{display:flex;gap:6px;margin-bottom:6px}.es-wv-src select{flex:1}
.es-wv-lcd{font:12px/1.2 ui-monospace,Menlo,monospace;color:#7dff8a;background:#020a03;border:1px solid #1f3a20;border-radius:4px;padding:6px 8px;margin-bottom:6px;text-shadow:0 0 6px rgba(125,255,138,.6);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#es .es-wv-cv{display:block;width:100%;height:150px;border:2px inset #3a2a10;border-radius:4px;cursor:crosshair}
.es-wv-bar,.es-wv-rack{display:flex;flex-wrap:wrap;gap:4px;margin-top:6px}
#es .es-wv-bar button,#es .es-wv-rack button{background:linear-gradient(#2a2a2a,#121212) !important;color:#e8c36a !important;border:1px solid #4a3a1a !important;border-radius:3px !important;font:600 11px/1 ui-monospace,Menlo,monospace !important;padding:7px 8px !important;min-height:30px;box-shadow:inset 0 1px 0 rgba(255,255,255,.08) !important}
#es .es-wv-rack button{color:#ff6b7d !important}
#es .es-wv-rack button.is-on{background:#e3122c !important;color:#000 !important}
#es .es-wv-bar button:disabled,#es .es-wv-rack button:disabled{opacity:.5}
.es-wv-amt{display:flex;gap:8px;align-items:end;margin-top:6px}.es-wv-amt .es-slider{flex:1}
.es-wv-amt i{font-style:normal}
.es-wv-pend{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin-top:6px;padding:6px;border:1px dashed var(--g);border-radius:6px;font-size:12px;color:var(--g)}
.es-wv-out button{color:#fff !important}

/* site-skin overrides for panel headings + phone top bar */
#es h2.es-h{font:800 13px/1.2 system-ui,-apple-system,"Segoe UI",sans-serif !important;letter-spacing:.1em !important;color:var(--g2) !important;text-transform:none !important;margin:0 0 8px !important;text-shadow:none !important}
#es h2.es-h small{display:inline !important;font:600 9px/1.2 system-ui,-apple-system,"Segoe UI",sans-serif !important;letter-spacing:.14em !important;color:var(--mu) !important}
@media (max-width:1099px){.es-top{grid-template-columns:1fr}.es-transport{justify-content:flex-start;flex-wrap:wrap}}

#es [hidden]{display:none !important}
@media (max-width:1099px){#es .es-act{font-size:11px !important;letter-spacing:.02em !important;white-space:normal !important;line-height:1.1 !important;padding:8px 2px !important;overflow:hidden}}


===== FILE: public/ss/studio.js =====
/* Epistles Studio (/ss) — arrangement-based AI music studio. Tone.js (self-hosted), Gemini via /api/ss/arrange,
   Kokoro via /api/ss/voice jobs, offline WAV export via Tone.Offline. The classic page lives at /ss?classic=1. */
(function () {
  'use strict';
  var $ = function (s, r) { return (r || document).querySelector(s); };
  var $$ = function (s, r) { return Array.prototype.slice.call((r || document).querySelectorAll(s)); };
  var root = $('#es'); if (!root) return;
  var IS_ADMIN = root.getAttribute('data-admin') === '1';
  var CSRF = (document.querySelector('meta[name="csrf-token"]') || {}).content || '';
  var STEPS = 16, LS_KEY = 'es_state_v1';
  var SECS = ['intro', 'verse', 'chorus', 'bridge', 'outro'];
  var LANES = ['vocals', 'drums', 'bass', 'chords', 'lead'];
  var LANE_C = { vocals: '#ff3048', drums: