diff --git a/viz/index.html b/viz/index.html
index 52175e3..fab35d3 100644
--- a/viz/index.html
+++ b/viz/index.html
@@ -370,6 +370,32 @@
#godspeed input[type=range] { width: 88px; accent-color: #7fa0e6; height: 3px; }
#godspeed .held { color: #bcd; font-size: 11px; letter-spacing: 0.5px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
#godspeed .hint { color: rgba(130,150,180,0.6); font-size: 10px; line-height: 1.5; }
+ /* πͺ RESONANCE β the spheres panel (right-anchored, mirrors #godspeed) */
+ #spheres {
+ position: fixed; right: 12px; top: 64px; width: 272px; z-index: 13;
+ background: rgba(10,15,26,0.95); border: 1px solid rgba(120,150,200,0.35);
+ border-radius: 12px; padding: 8px 10px; display: none; color: #c7d4ea;
+ font-size: 11px; -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px);
+ max-height: 80vh; overflow-y: auto;
+ }
+ #spheres.open { display: flex; flex-direction: column; gap: 6px; }
+ #spheres .atop { display: flex; align-items: center; gap: 8px; }
+ #spheres .btitle { color: #cfe0ff; font-size: 12px; font-weight: 600; flex: 1; }
+ #spheres .aclose { cursor: pointer; color: #8fa4c8; font-size: 16px; padding: 0 4px; }
+ #spheres .row { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
+ #spheres .glbl { color: rgba(160,180,215,0.8); font-size: 10px; min-width: 30px; }
+ #spheres .midibtn { background: rgba(40,52,74,0.85); color: #b9c8e2; border: 1px solid rgba(120,150,200,0.25);
+ border-radius: 7px; padding: 3px 9px; cursor: pointer; font-size: 11px; }
+ #spheres .midibtn.on { background: rgba(120,220,150,0.22); color: #bff0c9; border-color: rgba(130,230,160,0.55); }
+ #spheres .bmini { padding: 2px 7px; }
+ #spheres input[type=range] { flex: 1; min-width: 90px; accent-color: #7fa0e6; height: 3px; }
+ #spheres .hint { color: rgba(130,150,180,0.6); font-size: 10px; line-height: 1.5; }
+ #spheres .phead, #spheres .prow { display: grid; grid-template-columns: 56px 1fr 1fr 1fr; gap: 4px; align-items: center; }
+ #spheres .phead { color: rgba(160,180,215,0.7); font-size: 9px; letter-spacing: 0.3px; padding: 0 1px; }
+ #spheres .pname { color: #bcd; font-size: 10px; letter-spacing: 0.3px; }
+ #spheres .meter { position: relative; height: 12px; border-radius: 3px; background: rgba(60,80,120,0.22); overflow: hidden; }
+ #spheres .meter > i { position: absolute; left: 0; top: 0; bottom: 0; background: rgba(127,160,230,0.5); transition: width 0.08s linear; }
+ #spheres .meter > b { position: absolute; inset: 0; font-size: 8px; font-weight: 400; color: #d4dcee; display: flex; align-items: center; justify-content: center; }
/* π£ GODSPEAK β a small "listening" chip near the βͺ button, pulses while the mic is held */
#godspeakrec { position: fixed; top: 12px; right: 92px; z-index: 40; width: 30px; height: 30px;
@@ -1208,6 +1234,7 @@
βΈ WHEELS β a wheel within a wheel. "β¦their work was as it were a wheel in the middle of a wheel" (Ezekiel 1:16). Each lane keeps its own length: set the βΈ wheel chip in a beat lane (or the arranger's euclid row) to anything from 1 to 16, and a lane shorter than the full sixteen wraps on its own turn. A hat of twelve over a kick of sixteen drift apart and only realign every forty-eight steps β polymeter, the oldest trick for making a loop that never quite repeats. Steps past the wheel dim out; the playhead rides each lane's own length; and the pattern exports to MIDI exactly as it plays, twelve-wheel and all. A full wheel of sixteen behaves precisely as it always did.
π PSALM β sing, and the instrument answers. Right-click the sky β π PSALM, allow the microphone, and sing. The pitch is heard, folded to the scale you're in (so you're never out of key), and played as notes β a π chip shows the note leaving your throat. And the duet with β‘ GODSPEED: with the arp running, each note you sing latches into the held chord, one at a time β hum four notes and the machine arpeggiates the chord you sang. It listens locally: the analysis happens in the page, in its own silence, and nothing ever leaves the machine β no recording, no upload, just your voice becoming the instrument's.
β¦ CANON β the shelf of worked examples. Open β β DIMENSIONS and at the top of the list, above your own saved worlds, sit four β¦ factory dimensions that ship with the instrument β the heartbeat (a boom-bap kit with the swing and the kick's duck), the wheel within the wheel (WHEELS, made audible), the squeeze (the market pumping GODSQUASH), and quiet arrival (the earth echo, slow and sparse). Load one to hear a feature in its element, then save your own version under a new name β the β¦ ones are read-only, the same for everyone, a place to start rather than a thing to overwrite.
+πͺ spheres β the music of the spheres. Press S (or right-click the sky β πͺ spheres) and turn it on: the eight planets join the field as modulation sources, the slowest LFOs there are. Each planet offers three signals β phase (its heliocentric longitude, a sawtooth one full turn per orbit), dist (its eccentric breathing, in and out between perihelion and aphelion β Mercury and Mars swing hard, Venus barely), and beat (its synodic dance against Earth β Venus and Earth clasp every 583.9 days, the pentagram cycle). Route any of them like any source, or just say "mars drive filter." One knob rules time: the rate, from 1 to 3650 days of sky per bar β at the default thirty, Venus' year is about seven and a half bars and Jupiter's a hundred and forty-four, real orbits compressed into slow musical arcs. And the βΈ orbital ratios button sets the drum lanes' wheels to the true resonances β 4 : 8 : 16 (Io, Europa and Ganymede, locked at 1 : 2 : 4) and 8 : 13 (Venus to Earth, the pentagram in wheel form), so the polymeter you hear is one the solar system actually keeps. It is all computed here, at the instrument's own clock β the same JPL ephemeris SOLARGOD uses, vendored in, no network and no server, so the sky is deterministic: the same bar always shows the same heaven, and a saved patch reloads the identical sky.
π½ The stage β send the visual to any screen. Right-click the sky β the stage and a clean black mirror window opens, fed live from the canvas. Drag it to a projector, an AirPlay display, a second monitor β macOS treats it like any window β and double-click for fullscreen. The stage has a camera: the whole view by default (whatever you're in β a skin, the wheel, mind mode's POV), or right-click any node β project this node and the camera glides after that one sphere through its orbits, or project its station to frame a whole wheel and its satellites. Change cameras live from the menus while the projector runs; the audience sees the camera breathe from subject to subject.
πΈ The commune β play together, properly. Right-click the sky β the commune. This is for signed-in players: your session rides the connection, so the hub knows exactly who everyone is β no impostors, no setup, no Bluetooth. One of you hosts: name the room, then β invite the others by their username (they must be on the site β invitations reach the present). The invited see the invitation arrive live and join or decline; anyone may leave whenever they wish, and if the host leaves, the room closes with them. Then the sections: members claim voices (right-click any voice, or the panel's picker), or the host allocates them β this bass to her, those pads to him, the godtime itself to whoever conducts β and the hub enforces it: only the section's holder can speak for it. From that moment your levels, mutes, grooves and arranger lanes for what you hold follow your hands on every screen, same living room or opposite sides of the earth. The world β the Source β stays identical for everyone, because it always was. Three people, one planet, one instrument.
@@ -1378,6 +1405,29 @@
+
+