<!-- SS · part 31 -->
E = ES && ES.engine(); if (!E) return; ['drums', 'bass', 'chords', 'lead'].forEach(function (t) { ES.setSound(E, t, ES.S.sounds[t]); }); onlyVox(E); }
  function onlyVox(G) { if (G && G.vin) G.vin.gain.value = K.only ? 0 : 1; }
  (window.ES_HOOKS = window.ES_HOOKS || []).push({
    ready: function (api) { ES = api; boot(); },
    sound: function (G, t) { if (K.on || K.only) wrap(G, t); },
    graph: function (G) { onlyVox(G); },
    provenance: function () { return provenance(); }
  });
  // ---------------- My Sounds Only: block AI + built-in generators
  var AI_SEL = '#es-gen,#es-send,#es-remix-btn,#es-remix2,[data-regen],#es-load-ai,#es-roll-regen,#es-render,#es-sg-write,#es-sg-all,#es-sg-one';
  document.addEventListener('click', function (e) { if (!K.only) return; var b = e.target.closest && e.target.closest(AI_SEL); if (b) { e.preventDefault(); e.stopPropagation(); ES && ES.toast('My Sounds Only is on — AI and built-in generators are off. Program it yourself or turn the switch off.', 4500); } }, true);
  function syncOnly() { root.classList.toggle('es-only', !!K.only); document.querySelectorAll(AI_SEL).forEach(function (b) { b.classList.toggle('es-blocked', !!K.only); }); }
  function aiPatternsPresent() { var S = ES.S; if (!S.ai) return false; return Object.keys(S.sections).some(function (n) { return S.ai[n] && JSON.stringify(S.ai[n].patterns) === JSON.stringify(S.sections[n].patterns) && JSON.stringify(S.sections[n].patterns).indexOf('1') >= 0; }); }
  function provenance() {
    var k = kit(), used = [];
    if (k && K.on) Object.keys(k.pads).forEach(function (p) { var s = sample(k.pads[p].sample); if (s) used.push({ pad: p, id: s.id, name: s.name, source: s.source, added: s.created }); });
    var stems = (window.ESREC ? ESREC.list() : []).filter(function (s) { return !s.mute; }).map(function (s) { return { name: s.name, kind: s.kind === 'mic' ? 'recorded take' : 'uploaded file' }; });
    var vox = Object.keys(ES.VOX.clips).length, sung = Object.keys(ES.VOX.clips).filter(function (t) { return ES.VOX.clips[t].sung; }).length;
    var aiPat = aiPatternsPresent();
    var all = K.only && !aiPat;
    return { provenance_v: 1, mySoundsOnly: !!K.only, at: new Date().toISOString(), kit: k && K.on ? { id: k.id, name: k.name } : null, samples: used, stems: stems,
      builtInSynths: !K.only, aiPatternsPresent: aiPat, aiVocalsInMix: !K.only && vox > 0, sungLines: K.only ? 0 : sung,
      statement: all ? 'All audio in this render comes from the creator\'s own material: kit "' + (k ? k.name : '—') + '" (' + used.length + ' sample' + (used.length === 1 ? '' : 's') + ': ' + used.map(function (u) { return u.name; }).join(', ') + ')' + (stems.length ? ' and recordings/uploads: ' + stems.map(function (s) { return s.name; }).join(', ') : '') + '. Built-in synths, AI-generated patterns and AI voices were switched off. (Lyrics are whatever the creator entered.)'
        : 'Mixed sources: ' + [K.on && k ? 'own kit "' + k.name + '"' : null, stems.length ? stems.length + ' own recording/upload(s)' : null, !K.only ? 'built-in synths' : null, aiPat ? 'AI-generated patterns' : null, !K.only && vox ? 'AI voice (Kokoro' + (sung ? '/Sing' : '') + ')' : null].filter(Boolean).join(', ') + '.' };
  }
  // ---------------- UI
  host.innerHTML = '<h2 class="es-h"><span class="es-ic">◍</span> SOUND KIT <small>YOUR OWN SOUNDS · NO COPYRIGHT WORRIES</small></h2>' +
    '<div class="es-kt-sw"><label><input type="checkbox" id="es-kt-on"> Play my kit</label><label class="es-kt-only"><input type="checkbox" id="es-kt-only"> MY SOUNDS ONLY</label><label><input type="checkbox" id="es-kt-lc"> Lead lane plays chops</label></div>' +
    '<div class="es-sg-row"><select id="es-kt-kit" aria-label="Kit"></select><button type="button" class="es-btn es-btn-sm" id="es-kt-new">New kit</button><button type="button" class="es-btn es-btn-sm" id="es-kt-ren">Rename</button><button type="button" class="es-btn es-btn-sm" id="es-kt-del">Delete</button><button type="button" class="es-btn es-btn-sm es-btn-red" id="es-kt-save">Save kit</button></div>' +
    '<div class="es-kt-pads" id="es-kt-pads"></div>' +
    '<h3 class="es-kt-h">MY SAMPLES</h3><div class="es-sg-row"><label class="es-btn es-btn-sm" for="es-kt-file">⇪ Upload</label><input type="file" id="es-kt-file" accept=".wav,.mp3,.m4a,.aac,.ogg,audio/*" multiple hidden><button type="button" class="es-btn es-btn-sm" id="es-kt-rec">● Record sample</button><select id="es-kt-stem" aria-label="From a take"><option value="">From a take/stem…</option></select></div>' +
    '<ul class="es-kt-lib" id="es-kt-lib"></ul>' +
    '<h3 class="es-kt-h">CHOPPER</h3><div class="es-sg-row"><select id="es-kt-chs" aria-label="Sample to chop"></select><select id="es-kt-chn"><option value="auto">Auto (transients)</option><option value="4">4 equal</option><option value="8">8 equal</option><option value="16">16 equal</option></select><button type="button" class="es-btn es-btn-sm" id="es-kt-chop">Chop</bu