📖 grimoire front door — quick-start card + clickable contents

The grimoire got big, so give it a proper entrance:
-  Quick-start card up top: a 7-step "make it sing in a minute" on-ramp for the
  generative sequencer (scale → euclid → Play One → ratchet → p-lock → play).
- ☰ contents: a floating, jump-anywhere table of contents built from the 22 h2
  sections (delta-based scroll so it lands reliably in any layout). Sits beside
  the × close, drops a clean index panel, closes on pick or outside-click.
Verified: quick-start renders (7 steps), TOC lists all 22 sections and jumps
distinctly (Getting in→top, Playing it→far). Manual regenerated to match.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
type-two 2026-07-10 01:33:16 +10:00
parent 8938424db6
commit 9e5de4f55f
2 changed files with 75 additions and 0 deletions

View File

@ -18,6 +18,24 @@ _how to play the world_
Godstrument is an instrument whose player is the living planet. Roughly forty real feeds — the solar wind streaming off the Sun, the price of bitcoin ticking sub-second on Binance, an earthquake off the coast of Japan, every edit to Wikipedia on Earth, the phase of the Moon, the churn of the U.S. national debt, a wildfire catching somewhere in the dark — arrive as raw numbers, are cleaned into control signals, and are fired at one central hub. There the hub smooths them, learns their ranges, and pours them through a **modulation matrix** — a patchbay where every feed can be wired to a sound. The world already moves; here it moves *something*. You don't play the notes. You decide what drives what. Imagine, but also know: the sound you hear is the sky doing exactly what the sky is doing, routed through choices you made. Godstrument is an instrument whose player is the living planet. Roughly forty real feeds — the solar wind streaming off the Sun, the price of bitcoin ticking sub-second on Binance, an earthquake off the coast of Japan, every edit to Wikipedia on Earth, the phase of the Moon, the churn of the U.S. national debt, a wildfire catching somewhere in the dark — arrive as raw numbers, are cleaned into control signals, and are fired at one central hub. There the hub smooths them, learns their ranges, and pours them through a **modulation matrix** — a patchbay where every feed can be wired to a sound. The world already moves; here it moves *something*. You don't play the notes. You decide what drives what. Imagine, but also know: the sound you hear is the sky doing exactly what the sky is doing, routed through choices you made.
⚡ Quick-start — make it sing in a minute
- Press `T` — the **tracks & grooves** panel opens.
- Pick a **♪ scale** up top — or just switch **skins** (each cosmology is its own key).
- On a note voice (*lead*/*bass*): hit **⬢ euclid** — pulses **11**, steps **16** — for a busy, even rhythm.
- Click 23 notes in one column so they turn blue: **⬛ Play One** picks one at random each pass.
- Open the **ratchet** lane and drag a couple of steps to **34** for instant rolls.
- Switch to a texture voice (*filter*, *glitch*), gate a few steps, and **⬗ p-lock** them to blocky values.
- Press **▶**. In-key, never-repeating, self-glitching — the planet playing your machine.
Everything below is the full lore. Tap **☰ contents** (top-right) to jump anywhere.
--- ---
## Getting in ## Getting in
@ -981,3 +999,5 @@ Every feed the world sends is one of eight temperaments; the shape dictates how
- **🌊 Juno-106 chorus** — an always-on subtle BBD-style stereo chorus on the synth's master bus (two short delays warbled by slow LFOs, panned wide) that warms and widens the dry oscillators. - **🌊 Juno-106 chorus** — an always-on subtle BBD-style stereo chorus on the synth's master bus (two short delays warbled by slow LFOs, panned wide) that warms and widens the dry oscillators.
- **⬗ Parameter locks (p-locks)** — Pocket-Operator / Elektron style: a texture voice (filter, glitch, reverb, drive) gets a per-step `lock` lane that pins its value to a fixed level on that step (blocky, disjointed), overriding the world; drag a step below the lane to unlock it and hand that step back to the data. Applied in `computeDests` via `applyGroove`; travels with the patch. - **⬗ Parameter locks (p-locks)** — Pocket-Operator / Elektron style: a texture voice (filter, glitch, reverb, drive) gets a per-step `lock` lane that pins its value to a fixed level on that step (blocky, disjointed), overriding the world; drag a step below the lane to unlock it and hand that step back to the data. Applied in `computeDests` via `applyGroove`; travels with the patch.
- **🌊 Juno-106 chorus** — an always-on subtle BBD-style stereo chorus on the synth's master bus (two short delays warbled by slow LFOs, panned wide) that warms and widens the dry oscillators. - **🌊 Juno-106 chorus** — an always-on subtle BBD-style stereo chorus on the synth's master bus (two short delays warbled by slow LFOs, panned wide) that warms and widens the dry oscillators.
- **⬗ Parameter locks (p-locks)** — Pocket-Operator / Elektron style: a texture voice (filter, glitch, reverb, drive) gets a per-step `lock` lane that pins its value to a fixed level on that step (blocky, disjointed), overriding the world; drag a step below the lane to unlock it and hand that step back to the data. Applied in `computeDests` via `applyGroove`; travels with the patch.
- **🌊 Juno-106 chorus** — an always-on subtle BBD-style stereo chorus on the synth's master bus (two short delays warbled by slow LFOs, panned wide) that warms and widens the dry oscillators.

View File

@ -412,6 +412,24 @@
#grimoire h2 { color: #9fd0ff; font-size: 17px; letter-spacing: 1px; margin: 34px 0 10px; font-weight: 700; } #grimoire h2 { color: #9fd0ff; font-size: 17px; letter-spacing: 1px; margin: 34px 0 10px; font-weight: 700; }
#grimoire p { line-height: 1.75; color: rgba(205,218,240,0.9); margin: 8px 0; font-size: 14px; } #grimoire p { line-height: 1.75; color: rgba(205,218,240,0.9); margin: 8px 0; font-size: 14px; }
#grimoire .lead { color: rgba(220,230,248,0.95); font-size: 15px; } #grimoire .lead { color: rgba(220,230,248,0.95); font-size: 15px; }
/* quick-start card — the fast on-ramp */
#grimoire .quickstart { max-width: 720px; margin: 6px auto 34px; padding: 18px 22px; border-radius: 14px;
background: linear-gradient(135deg, rgba(90,120,220,0.13), rgba(150,110,230,0.1)); border: 1px solid rgba(140,170,255,0.32); }
#grimoire .quickstart .qshead { font-weight: 800; color: #d3e2ff; font-size: 16px; letter-spacing: 1px; margin-bottom: 10px; }
#grimoire .quickstart ol { margin: 0; padding-left: 22px; color: rgba(210,222,244,0.92); line-height: 1.7; font-size: 13.5px; }
#grimoire .quickstart li { margin: 5px 0; }
#grimoire .quickstart .qsfoot { margin-top: 12px; font-size: 12px; color: rgba(165,185,218,0.72); font-style: italic; }
/* table of contents — the grimoire got big */
#grimtocbtn { position: fixed; top: 18px; right: 62px; z-index: 61; cursor: pointer; font-size: 13px; color: #9fb4d8;
background: rgba(20,26,44,0.85); border: 1px solid rgba(120,150,220,0.35); border-radius: 9px; padding: 5px 11px; }
#grimtocbtn:hover { color: #fff; border-color: rgba(150,180,255,0.6); }
#grimtoc { position: fixed; top: 52px; right: 24px; z-index: 62; width: 290px; max-height: 74vh; overflow-y: auto;
background: rgba(16,20,36,0.97); border: 1px solid rgba(120,150,220,0.4); border-radius: 12px; padding: 8px;
display: none; box-shadow: 0 12px 40px rgba(0,0,0,0.5); }
#grimtoc.open { display: block; }
#grimtoc .grimtoc-head { font-size: 10px; letter-spacing: 2px; text-transform: uppercase; color: rgba(150,175,220,0.7); padding: 4px 8px 8px; }
#grimtoc .grimtoc-item { padding: 6px 9px; border-radius: 7px; cursor: pointer; color: #c6d5ee; font-size: 13px; }
#grimtoc .grimtoc-item:hover { background: rgba(110,145,235,0.22); color: #fff; }
#grimoire ul { list-style: none; padding: 0; margin: 8px 0; } #grimoire ul { list-style: none; padding: 0; margin: 8px 0; }
#grimoire li { line-height: 1.7; margin: 7px 0; padding-left: 20px; position: relative; font-size: 14px; #grimoire li { line-height: 1.7; margin: 7px 0; padding-left: 20px; position: relative; font-size: 14px;
color: rgba(205,218,240,0.9); } color: rgba(205,218,240,0.9); }
@ -485,6 +503,20 @@
<p class="lead">Godstrument is an instrument whose player is the living planet. Roughly forty real feeds — the solar wind streaming off the Sun, the price of bitcoin ticking sub-second on Binance, an earthquake off the coast of Japan, every edit to Wikipedia on Earth, the phase of the Moon, the churn of the U.S. national debt, a wildfire catching somewhere in the dark — arrive as raw numbers, are cleaned into control signals, and are fired at one central hub. There the hub smooths them, learns their ranges, and pours them through a <b>modulation matrix</b> — a patchbay where every feed can be wired to a sound. The world already moves; here it moves <i>something</i>. You don't play the notes. You decide what drives what. Imagine, but also know: the sound you hear is the sky doing exactly what the sky is doing, routed through choices you made.</p> <p class="lead">Godstrument is an instrument whose player is the living planet. Roughly forty real feeds — the solar wind streaming off the Sun, the price of bitcoin ticking sub-second on Binance, an earthquake off the coast of Japan, every edit to Wikipedia on Earth, the phase of the Moon, the churn of the U.S. national debt, a wildfire catching somewhere in the dark — arrive as raw numbers, are cleaned into control signals, and are fired at one central hub. There the hub smooths them, learns their ranges, and pours them through a <b>modulation matrix</b> — a patchbay where every feed can be wired to a sound. The world already moves; here it moves <i>something</i>. You don't play the notes. You decide what drives what. Imagine, but also know: the sound you hear is the sky doing exactly what the sky is doing, routed through choices you made.</p>
<div class="quickstart">
<div class="qshead">⚡ Quick-start — make it sing in a minute</div>
<ol>
<li>Press <kbd>T</kbd> — the <b>tracks &amp; grooves</b> panel opens.</li>
<li>Pick a <b>♪ scale</b> up top — or just switch <b>skins</b> (each cosmology is its own key).</li>
<li>On a note voice (<i>lead</i>/<i>bass</i>): hit <b>⬢ euclid</b> — pulses <b>11</b>, steps <b>16</b> — for a busy, even rhythm.</li>
<li>Click 23 notes in one column so they turn blue: <b>⬛ Play One</b> picks one at random each pass.</li>
<li>Open the <b>ratchet</b> lane and drag a couple of steps to <b>34</b> for instant rolls.</li>
<li>Switch to a texture voice (<i>filter</i>, <i>glitch</i>), gate a few steps, and <b>⬗ p-lock</b> them to blocky values.</li>
<li>Press <b></b>. In-key, never-repeating, self-glitching — the planet playing your machine.</li>
</ol>
<div class="qsfoot">Everything below is the full lore. Tap <b>☰ contents</b> (top-right) to jump anywhere.</div>
</div>
<div class="hr"></div> <div class="hr"></div>
<h2>Getting in</h2> <h2>Getting in</h2>
@ -7098,6 +7130,29 @@
if (el) el.addEventListener("click", open); if (el) el.addEventListener("click", open);
}); });
window.addEventListener("keydown", (e) => { if (e.key === "Escape") close(); }); window.addEventListener("keydown", (e) => { if (e.key === "Escape") close(); });
// ---- table of contents (the grimoire got big) — a jump-anywhere index ----
const heads = [...g.querySelectorAll("h2")];
heads.forEach((h, i) => { if (!h.id) h.id = "grim-" + i; h.style.scrollMarginTop = "24px"; });
const toc = document.createElement("nav"); toc.id = "grimtoc";
const th = document.createElement("div"); th.className = "grimtoc-head"; th.textContent = "contents";
toc.appendChild(th);
heads.forEach(h => {
const it = document.createElement("div"); it.className = "grimtoc-item";
it.textContent = h.textContent.replace(/\s+—.*$/, ""); // trim " — subtitle" for a tidy list
it.title = h.textContent;
it.addEventListener("click", () => { // delta-based jump (robust in any layout)
const target = g.scrollTop + h.getBoundingClientRect().top - g.getBoundingClientRect().top - 20;
g.scrollTop = Math.max(0, target); // instant teleport — always lands
toc.classList.remove("open");
});
toc.appendChild(it);
});
g.appendChild(toc);
const tb = document.createElement("div"); tb.id = "grimtocbtn"; tb.textContent = "☰ contents"; tb.title = "jump to a section";
tb.addEventListener("click", (e) => { e.stopPropagation(); toc.classList.toggle("open"); });
g.appendChild(tb);
g.addEventListener("click", (e) => { if (e.target !== tb && !toc.contains(e.target)) toc.classList.remove("open"); });
})(); })();
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------