Correctness (four were my own regressions from the REVELATION wave): · ☸ WHEELS polymeter permanently detuned after any skipped frame — seqAbsStep advanced by ++ per transition, but one frame can cross two 16ths (bpm ≳155, or the clamped dt on every tab refocus). Proven to drift 12 steps out at 174bpm; now advances by the true distance, so seqAbsStep % 16 === seqCurStep always holds. · Sample & hold with exactly one lit step froze on its first sample forever (guard keyed on the wrapped step, which never changed) — now keyed on the absolute step. · PSALM double-activation left the MICROPHONE HOT after "stop": the re-entrancy guard sat after the getUserMedia await, orphaning the first stream/interval/context. Guard is now synchronous, a stop during the prompt is honoured, and a second tap while starting cancels. Mic off means off — the promise the feature makes. · Live-recording a drum tap into a short wheel wrote steps past wlen that never played; the tap now folds onto the lane's own wheel. · Switching MIDI out port left notes droning on the old port (pending off-timers fired at the NEW one) — midiFlushOut() releases every held note + all-notes-off before the swap. · world_quakes' seen-set grew unbounded on long-running rigs. Security: stored XSS via the commune room name — the one untrusted string reaching innerHTML unescaped (hub only lower-cased it). Escaped client-side at both sinks, and the hub now strips markup chars too. Robustness: world_ephemeris/world_almanac imported swisseph unguarded, so a machine without pyswisseph crash-looped them every 10s forever against the supervisor's exit-0 contract — both now retire quietly (verified by simulating the missing dep), and pyswisseph is documented in requirements. Mobile: the top bar's five separately-pinned chips collided below ~500px — the first thing a phone visitor saw was a broken header. Now a clean row with the account chip on its own line and the source counter moved left. Housekeeping: dead measureSpaced(), dead #account .code selector, and an 888K stale worktree removed. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
18 lines
877 B
Plaintext
18 lines
877 B
Plaintext
# Godstrument — core (required)
|
|
python-osc>=1.9
|
|
websockets>=12.0
|
|
|
|
# Satellites worker (workers/world_sats.py) — SGP4 propagation from Celestrak TLEs
|
|
# pip install sgp4 # pure-python, no build; worker is import-safe without it
|
|
# Sky workers (workers/world_ephemeris.py, world_almanac.py) — Swiss Ephemeris planets
|
|
# pip install pyswisseph # both workers are import-safe without it (they retire quietly)
|
|
|
|
# Optional: MIDI output from the hub to Ableton/TouchDesigner via a virtual port
|
|
# pip install python-rtmidi
|
|
# Optional: microphone FFT worker (workers/audio_worker.py)
|
|
# pip install numpy sounddevice
|
|
# Optional: webcam hand-tracking worker (workers/vision_worker.py)
|
|
# pip install opencv-python mediapipe # needs a Python build MediaPipe ships wheels for
|
|
# Optional: MIDI-in worker (workers/midi_worker.py)
|
|
# pip install mido python-rtmidi
|