<!-- SS · part 78 -->

    var m = e.target.getAttribute('data-mute'), so = e.target.getAttribute('data-solo');
    if (m) { S.mutes[m] = !S.mutes[m]; e.target.classList.toggle('is-on', S.mutes[m]); }
    else if (so) { S.solos[so] = !S.solos[so]; e.target.classList.toggle('is-on', S.solos[so]); } else return;
    applyMix(E); save();
  });
  $('#es-faders').addEventListener('change', function (e) { var t = e.target.getAttribute('data-fsnd'); if (!t) return; S.sounds[t] = e.target.value; setSound(E, t, e.target.value); if (t === 'drums') kitSel.value = e.target.value; if (t === S.rollLane) renderRoll(); save(); });
  function syncKnobs() { $$('[data-m-k]').forEach(function (k) { k.value = S.master[k.getAttribute('data-m-k')]; }); $('#es-master-state').textContent = 'MASTER: ' + (S.master.on ? 'ON · COMP · EQ · LIMITER' : 'OFF'); $('#es-master').classList.toggle('is-on', !!S.master.on); }
  $('#es-knobs').addEventListener('input', function (e) { var k = e.target.getAttribute('data-m-k'); if (!k) return; S.master[k] = +e.target.value; applyMaster(E); save(); });
  $('#es-master').addEventListener('click', function () {
    S.master.on = !S.master.on;
    if (S.master.on) { S.master.comp = Math.max(S.master.comp, 55); S.master.width = Math.max(S.master.width, 60); toast('Master chain on: glue compressor, EQ lift, limiter at −0.8 dB.'); }
    else toast('Master chain off.');
    applyMaster(E); syncKnobs(); save();
    if (window.innerWidth < 1100) setMTab('mix');
  });
  var specCv = $('#es-spec');
  function drawSpectrum() {
    if (!E || !E.fft) return; var cv = specCv, w = cv.clientWidth, h = cv.clientHeight; if (!w) return;
    var dpr = window.devicePixelRatio || 1; if (cv.width !== w * dpr) { cv.width = w * dpr; cv.height = h * dpr; }
    var g = cv.getContext('2d'); g.setTransform(dpr, 0, 0, dpr, 0, 0); g.fillStyle = '#050505'; g.fillRect(0, 0, w, h);
    var v = E.fft.getValue(), n = v.length, sr = Tone.getContext().sampleRate, bars = Math.min(96, Math.floor(w / 3));
    g.strokeStyle = '#1c1c1c'; g.font = '9px sans-serif';
    [100, 1000, 10000].forEach(function (f) { var x = Math.log(f / 20) / Math.log(1000) * w; g.beginPath(); g.moveTo(x, 0); g.lineTo(x, h); g.stroke(); g.fillStyle = '#555'; g.fillText(f >= 1000 ? f / 1000 + 'k' : f, x + 2, h - 3); });
    for (var i = 0; i < bars; i++) {
      var f0 = 20 * Math.pow(1000, i / bars), f1 = 20 * Math.pow(1000, (i + 1) / bars);
      var a = Math.floor(f0 / (sr / 2) * n), b = Math.max(a + 1, Math.floor(f1 / (sr / 2) * n)), m = -140;
      for (var k = a; k < b && k < n; k++) m = Math.max(m, v[k]);
      var hh = Math.max(0, (m + 100) / 100) * (h - 12);
      g.fillStyle = m > -20 ? '#ff6070' : '#e3122c'; g.fillRect(i * (w / bars), h - 12 - hh, Math.max(1, w / bars - 1), hh);
    }
  }
  function idleSpectrum() { var cv = specCv, w = cv.clientWidth, h = cv.clientHeight; if (!w) return; var dpr = window.devicePixelRatio || 1; cv.width = w * dpr; cv.height = h * dpr; var g = cv.getContext('2d'); g.setTransform(dpr, 0, 0, dpr, 0, 0); g.fillStyle = '#050505'; g.fillRect(0, 0, w, h); g.fillStyle = '#666'; g.font = '10px sans-serif'; g.fillText('Press ▶ — live spectrum of the master bus', 10, h / 2 + 3); }

  // ------------------------------------------------------------------ vocal designer
  var EMO = { calm: { speed: 0.92, pitch: -1, aggr: 0, drama: 45, vuln: 45, pass: 35 }, proud: { speed: 1.0, pitch: 0, aggr: 30, drama: 35, vuln: 20, pass: 70 },
    aggressive: { speed: 1.1, pitch: -2, aggr: 80, drama: 15, vuln: 0, pass: 90 }, melancholy: { speed: 0.9, pitch: -2, aggr: 0, drama: 75, vuln: 70, pass: 40 }, hype: { speed: 1.15, pitch: 1, aggr: 55, drama: 25, vuln: 5, pass: 95 } };
  function syncVoiceUI() {
    var V = S.voice; $('#es-voice').value = V.name; if ($('#es-voice').value !== V.name) { V.name = 'am_onyx'; $('#es-voice').value = V.name; }
    $('#es-speed').value = V.speed; $('#es-speed-v').textContent = (+V.speed).toFixed(2); $('#es-pitch').value = V.pitch; $('#es-pitch-v').textContent = (V.pitch > 0 ? '+' : '') + V.pitch + ' st';
    $$('[data-dyn]').forEach(function (r) { var k = r.getAttribute('data-dyn'); r.value = V[k]; $('[data-v="' + k + '"]').textContent = V[k] + '%'; });
    $$('#es-emo button').forEach(function (b) { b.classList.toggle('is-on', b.getAttribute('data-emo') === V.emo); });
    var o = $('#es-voice').selectedOptions[0];
    $('#es-av-name').textContent = 'VOCAL AVATAR: ' + (V.name.split('_')[1] || V.name).toUpperCase(); $('#es-av-sub').textContent = 'KOKORO · ' + (V.name[0] === 'b' ? 'EN-GB' : 'EN-US') + (o ? ' · ' + o.textContent.split('·')[0].trim().toUpperCase() : '');
  }
  $('#es-voice').addEventListener('change', function () { S.voice.name = this.value; syncVoiceUI(); save(); });
  $('#es-speed').addEventListener('input', function () { S.voice.speed = +this.value; syncVoiceUI(); save(); });
  $('#es-pitch').addEventListener('input', function () { S.voice.pitch = +this.value; syncVoiceUI(); save(); });
  $$('[data-