TelemetrySynth.gainNode was only ever created inside start(), which is
only called from the main ENGAGE/FULL STOP flow. Every telemetry-driven
soundboard one-shot (LCARS Single/Double Chirp, Ack Sequence, Sensor
Sweep, the TOS/NX/Cardassian era sounds, Door Chime, and the Phase 3
who/bioship/belter era generators) guarded on `!this.gainNode` with no
fallback, so clicking any of them before the ambient bed had been
engaged once did nothing at all: no sound, no console error, and
nothing for the spectrum analyzer to react to.
ExpandedSciFiAudioSynth and WhoniverseAudioSynth already self-heal this
way via their own init() (called at the top of every public synth
method) - that's why buttons like Comm Badge work standalone. Add the
same init() to TelemetrySynth and call it from every method reachable
from the soundboard, so the whole class follows the same convention.
start() is left untouched: it still unconditionally rebuilds the node
on every engage so a newly-selected preset's volume takes effect
immediately.
Verified with a small headless harness driving TelemetrySynth directly
(no prior start()): all 13 affected methods now create gainNode and
fire real oscillators on first call, where they previously did nothing.
Confirmed against the pre-fix code that the same harness reproduces the
original silent failure. Regenerated dist/SciFiAmbientDisplay_v4.html
to match (tools/package.ps1 requires PowerShell, unavailable in this
shell, so the inlining was replicated in Python matching its exact
output convention; diff against the previous build is exactly the 31
added lines, nothing else).
Co-Authored-By: Claude Sonnet 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01582UUCEBExzp3oK3Spz1Xx