Add sound reference documentation and fix air-handler/docking-clamp duplicate

- Add sound_reference.md (937 lines): Real-world production reference covering Star Trek (TOS–ENT), Doctor Who/Whoniverse, Bioships (six ships across five franchises), and Space Stations (six stations across five sources).
- Add agents.md: Project architecture guide (file ownership, load order, conventions).
- Add telemetry_elements.md: Catalog of 10 telemetry elements with per-era selection weights and preset-by-preset routing.
- Add visual_elements.md: Canvas/SVG split architecture, layer declarations, per-theme casts.
- Fix duplicate soundboard mapping: Separate 'AIR HANDLER THUD' from 'DOCKING CLAMP LATCH'. Create ExpandedSciFiAudioSynth.synthesizeAirHandlerThud() (dull triangle-wave thump + sub-octave + slow airflow whoosh) distinct from synthesizeDockingClamp() (bright square-wave impact + pneumatic hiss). Update js/app.js to wire btn-air-handler to the new method.

Key findings:
* All 70 presets across 10 universes use Star Trek telemetry eras only — cross-universe borrowing is structural, not accidental.
* Doctor Who TARDIS demat correctly implements Brian Hodgson's 1963 technique (piano strings + tape feedback).
* Sevastopol Station's production sound design (Jeff van Dyck, Pinewood foley) is the best-documented non-Trek entry.
* The Expanse's "jury-rigged" Belter signature (Nelson Ferreira) is the single most actionable production detail found.

Co-Authored-By: Claude Haiku 4.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01NbMozG2xjcgLBia8vrzTrr
This commit is contained in:
Claude
2026-09-04 05:08:04 +00:00
co-authored by Claude Haiku 4.5
parent d04016850c
commit 97b0faa4a6
6 changed files with 8026 additions and 6219 deletions
+123
View File
@@ -0,0 +1,123 @@
# AGENTS.md — SciFi-XZBT
Guidance for AI coding agents working in this repository.
## What this project is
A browser-only, zero-dependency **sci-fi ambient audio + visual display**. It
synthesizes starship room tone (hull drone, warp core, life support, telemetry,
alerts) with the Web Audio API and renders LCARS-styled UI, an audio
visualizer, and a procedural "observation" viewscreen on HTML canvas.
It runs by opening `index.html` in a browser. There is **no build step, no
package manager, no server, and no test suite.**
## Architecture
`index.html` loads one stylesheet and six scripts **in a fixed order**:
```
css/style.css
js/audio.js -> js/config.js -> js/visualizer.js
js/observation-bezels.js -> js/observation-engine.js -> js/app.js
```
Order matters: every file defines plain classes/objects and publishes them on
`window`; `js/app.js` runs last and consumes all of them. Do not reorder the
tags without checking the dependencies.
| File | Owns | ~Lines |
| --- | --- | --- |
| `index.html` | DOM skeleton, script/link tags | 370 |
| `css/style.css` | LCARS themes, CRT effects, palettes | 2,300 |
| `js/audio.js` | `AudioManager` + all synth classes (hull, warp, life support, telemetry, alert, Whoniverse, expanded sci-fi) | 2,250 |
| `js/config.js` | `StarshipPresets`, `UniverseRegistry` — data only, no behavior | 1,040 |
| `js/visualizer.js` | `StarshipVisualizer` — spectrum + warp core canvas | 640 |
| `js/observation-bezels.js` | `ObservationBezels` — procedural SVG viewport frames per era | 270 |
| `js/observation-engine.js` | `ObservationEngine` — celestial simulation and canvas rendering | 2,780 |
| `js/app.js` | DOM bindings, hotkeys, UI controllers, main loop | 3,960 |
| `tools/package.ps1` | Builds the standalone single-file HTML | — |
| `dist/SciFiAmbientDisplay_v4.html` | **Generated output — never edit by hand** | — |
## Hard constraints
- **No dependencies.** No npm, no CDN links, no external fonts, images, or
audio files. The packaged build must work when double-clicked while offline.
- **No ES modules.** No `import` / `export`, no `type="module"`. Scripts are
classic globals.
- **Publish globals explicitly.** End each file with `window.Thing = Thing;`,
matching the existing pattern.
- **All audio is synthesized**, not sampled. New sounds are built from
oscillators / noise / filters in `js/audio.js`.
## Where to make a change
- New room or ship preset, universe, palette → `js/config.js`
- Sound generation, oscillators, envelopes, filters → `js/audio.js`
- Spectrum bars, warp-core animation → `js/visualizer.js`
- Viewscreen frame / bezel shapes per era → `js/observation-bezels.js`
- Planets, stars, drift, observation-mode canvas → `js/observation-engine.js`
- Buttons, sliders, hotkeys, state wiring, animation loop → `js/app.js`
- Colors, layout, theme classes, CRT overlay → `css/style.css`
Presets in `config.js` follow a fixed shape — copy an existing one rather than
inventing fields:
```js
'era-room': {
id, name, era, theme, alertType, description,
hull: { volume, baseFreq, filterCutoff, resonance, noiseMix, harmonicSpread },
warp: { volume, bpm, carrierFreq, filterCutoff, pulseShape, resonance, swirlMix },
lifeSupport: { volume, noiseType, highpassFreq, lowpassFreq, airflowModSpeed, airflowModDepth },
telemetry: { volume, density, era }
}
```
## Adding a new JS file
1. Create `js/your-file.js` and end it with `window.YourThing = YourThing;`.
2. Add the tag to `index.html` **in this exact form**, positioned before any
file that depends on it (and always before `js/app.js`):
```html
<script src="js/your-file.js"></script>
```
`tools/package.ps1` inlines assets by matching
`<script\s+src="([^"]+)"></script>` and
`<link\s+rel="stylesheet"\s+href="([^"]+)"\s*/?>`. Extra attributes, a
different quote style, or a self-closing script tag will be silently left as
an external reference and the standalone build will break.
## Build
```powershell
powershell -ExecutionPolicy Bypass -File .\tools\package.ps1
```
Writes `dist/SciFiAmbientDisplay_v4.html` (CSS and JS inlined). Re-run it after
any change to CSS, JS, or `index.html`. `tools/extract.ps1` is the original
extraction script, kept for reference only.
## Verifying work
There are no automated tests. Verification is manual:
1. Open `index.html` in a browser; check the console is clean.
2. Exercise the affected area — play a preset, switch era/universe, open
observation mode.
3. Re-run `package.ps1` and open `dist/SciFiAmbientDisplay_v4.html` **with the
network disabled** to confirm it is genuinely self-contained.
Browser autoplay policy blocks audio until a user gesture; audio starting only
after a click is expected behavior, not a bug.
## Conventions and cautions
- 2-space indentation; single quotes in JS; existing brace and spacing style.
- `js/app.js` and `js/observation-engine.js` are large. Make **surgical, scoped
edits** — do not rewrite, reorder, or reformat whole files.
- Do not reformat or lint files wholesale; diffs should stay minimal and
reviewable.
- Never edit anything in `dist/` — regenerate it instead.
- Preserve the offline, single-file-deliverable property in every change.
+3963 -3961
View File
File diff suppressed because it is too large Load Diff
+2333 -2258
View File
File diff suppressed because it is too large Load Diff
+942
View File
@@ -0,0 +1,942 @@
# Real-World Sound Reference
Source material for deciding what each preset **should** sound like. This is a
reference about the shows, not about this codebase — but every section ends by
naming the synth element that already covers the sound, so it can be read
straight across into `js/config.js`.
**Nothing here proposes removing an existing element.** The current elements
catalogued in [`telemetry_elements.md`](telemetry_elements.md) are the baseline;
this document maps them to their real counterparts and identifies what is
*missing*, not what is wrong.
Scope: Star Trek (five eras the telemetry router already knows), Doctor Who
/ The Whoniverse, the six ships grouped under this app's `bioships` universe,
and the six stations grouped under `spacestations`. Other universes are a
later pass.
---
## Confidence levels
There is no single authoritative catalog of Star Trek sound effects by ship and
room. What exists is production history (interviews, obituaries, trade press),
fan-maintained sound archives organized by category, and the shows themselves.
Every claim below carries one of these markers. **Do not promote a claim to a
higher level without a source.**
| Level | Meaning |
| --- | --- |
| **[DOC]** | Documented in a cited production source — an interview, trade article, or credited account. |
| **[OBS]** | Directly observable by listening to the episodes or an archive file. Verifiable by anyone, but not documented as a production decision. |
| **[ATT]** | Widely attested in fan documentation and consistent across sources, but without a primary production citation. |
| **[GAP]** | Not yet established. Listed so it is visible, not filled in with a guess. |
---
## Layer mapping
Real production sound categories map onto this app's four audio layers as
follows. This is the translation table between "what the show did" and "what we
can synthesize".
| Show category | App layer | Notes |
| --- | --- | --- |
| Room tone / set ambience | `hull` (`HullDroneSynth`) | The low continuous bed. Per-room variation lives almost entirely here. |
| Engine / warp core | `warp` (`WarpCoreSynth`) | Rhythmic pulse. Five `pulseShape` variants already exist. |
| Air handling / life support | `lifeSupport` (`LifeSupportSynth`) | Filtered noise with slow airflow modulation. |
| Computer beeps, chirps, relays, sweeps | `telemetry` (`TelemetrySynth`) | The discrete chatter layer. |
| Klaxons, alerts | `AlertSynth` | Separate layer, event-triggered. |
| Doors, turbolifts, transporters, comms | `TelemetrySynth` (manual) / soundboard | One-shots, not part of the ambient bed. |
| Phasers, torpedoes, explosions | *out of scope* | This is an ambient display, not a combat simulator. |
Categories with no home yet — turbolift, transporter, replicator, forcefield,
holodeck, tricorder, viewscreen — are noted in the gap list at the end.
---
## TOS — The Original Series
**Production context [DOC]:** Sound effects were built by Douglas Grindstaff,
working from Paramount and Desilu library material, personal collections, and
Paramount's 1953 *War of the Worlds*. Gene Roddenberry's direction to him was to
"think like an artist and paint everything with sound," and he insisted each
visited planet carry its own distinct audio signature — built from variations of
an orchestra tuning up. The transporter effect blended musical effects with
electric generator recordings, with fades cut by hand using a razor blade on
magnetic tape at a Moviola.
### Ambience bed
| Element | Character | Confidence |
| --- | --- | --- |
| Bridge room tone | Constant low hum with a persistent layer of electronic computer chatter riding on top — the chatter is nearly continuous rather than occasional, which is the defining TOS trait. | **[OBS]** |
| Engine room | Heavier, more mechanical, with a pronounced oscillating thrum. | **[OBS]** |
| Quarters | Quieter, less chatter, hum dominant. | **[OBS]** |
*Covered by:* `hull` with low `baseFreq` and low `filterCutoff`; `warp` with
`pulseShape: 'tos'`, whose comment already describes an "electromechanical
oscillating engine thrum."
### Discrete sounds
| Sound | Character | Existing element | Confidence |
| --- | --- | --- | --- |
| Computer warble | Wavering, unstable analog tone; reads as a machine thinking. | **TOS Computer Warble** — already a close match (detuned tri+saw under a 1422 Hz vibrato LFO through a bandpass). | **[OBS]** |
| Relay / solenoid click | Sharp mechanical snap, no pitch. | **TOS Relay Click** | **[OBS]** |
| Bosun's whistle | Rising-falling two-tone whistle preceding shipwide announcements. | *none***gap** | **[ATT]** |
| Red alert klaxon | Harsh oscillating buzzer, closer to a hooter than a tone. | `AlertSynth.synthesizeTOSRedAlertCycle` | **[OBS]** |
| Door | Pneumatic swish, softer and more mechanical than TNG's. | *none***gap** | **[OBS]** |
**Assessment:** TOS is the best-served era in the app already. The two telemetry
elements are era-appropriate and the density is right — TOS should run at
*higher* telemetry density than TNG, because the chatter is near-continuous
rather than punctuating.
---
## TNG — The Next Generation
### Ambience bed
| Element | Character | Confidence |
| --- | --- | --- |
| Bridge room tone | Warm, smooth, low-frequency hum. Deliberately calmer and less busy than TOS — the 24th century sounds *settled*. | **[OBS]** |
| Main Engineering | The warp core dominates: a slow, deep, multi-stage pulse with a reverberant bloom. The single most recognizable ambience in the franchise. | **[OBS]** |
| Crew quarters | Muffled, heavily damped, warp core barely present. | **[OBS]** |
| Corridor | Between bridge and quarters; some air handling. | **[OBS]** |
| Sickbay | Quieter, with intermittent medical monitor tones. | **[OBS]** |
*Covered by:* `pulseShape: 'tng'` already implements a four-stage envelope with
a secondary harmonic bloom, which is the correct shape.
### Discrete sounds
| Sound | Character | Existing element | Confidence |
| --- | --- | --- | --- |
| LCARS touch tone | Short, soft, musical sine blip. Panel interaction. | **LCARS Single Chirp** | **[OBS]** |
| LCARS confirmation | Two tones, second higher — acknowledgment. | **LCARS Double Chirp** | **[OBS]** |
| LCARS data sequence | Three or more tones in quick succession. | **LCARS Acknowledgment Sequence** | **[OBS]** |
| Door chime | Two-tone, rising fourth. The "come in" chime. | **TNG Door Chime** | **[OBS]** |
| Door open | Soft pneumatic swish. | *none***gap** | **[OBS]** |
| Red alert klaxon | Three-tone descending pattern, urgent but musical. | `AlertSynth.synthesizeTNGRedAlertCycle` | **[OBS]** |
| Yellow alert | Softer single chime, repeating. | `AlertSynth.synthesizeYellowAlertCycle` | **[OBS]** |
| Comm chirp | The tap-badge tone before speech. | *none***gap**, and a strong candidate | **[OBS]** |
| Turbolift | Rising whoosh with a settling tone. | *none***gap** | **[OBS]** |
| Transporter | Shimmering rise or fall over ~3 s. | *none***gap** | **[OBS]** |
| Replicator | Short shimmer, transporter-adjacent but briefer. | *none***gap** | **[OBS]** |
**Sound team [GAP]:** TNG's supervising sound editors and the specific
attribution for the LCARS tone set are not established here. The series won
multiple sound editing Emmys and the credits are a matter of record; this
document should not name individuals until that is checked against a primary
source.
**Assessment:** The best-covered era for telemetry. The clearest single gap is
the **comm badge chirp** — arguably the most recognizable discrete sound in all
of TNG and currently absent.
---
## DS9 — Deep Space Nine
The key structural fact: DS9 is a **Cardassian-built station** (originally Terok
Nor), not a Starfleet ship. Its native systems sound alien, and Starfleet
equipment installed aboard sounds like Starfleet — the two coexist, which is why
the era's current 50/50 split between the Cardassian Sensor and the LCARS Single
Chirp is defensible rather than accidental. **[ATT]**
### Ambience bed
| Element | Character | Confidence |
| --- | --- | --- |
| Ops | Deeper, more resonant and more cavernous than a Starfleet bridge; a heavier industrial bed. | **[OBS]** |
| Promenade | Open, echoing public space with crowd presence — distinct from any shipboard room tone. | **[OBS]** |
| Habitat ring / quarters | Enclosed, low, mechanical. | **[OBS]** |
| Defiant | Cramped warship: tighter, more aggressive, faster core pulse. | **[OBS]** |
*Covered by:* `pulseShape: 'defiant'` (tight attack, rapid decay) — already the
most-used pulse shape in the config at 15 presets.
### Discrete sounds
| Sound | Character | Existing element | Confidence |
| --- | --- | --- | --- |
| Cardassian computer tone | Resonant, metallic, unresolved — dissonant rather than musical. | **Cardassian Sensor Tone** (sine pair a tritone apart) | **[OBS]** |
| Cardassian door | Heavy, grinding, mechanical — nothing like a Starfleet swish. | *none***gap**, high character value | **[OBS]** |
| Starfleet overlay | LCARS tones from installed Federation equipment. | **LCARS Single Chirp** | **[OBS]** |
**Assessment:** The Promenade has no equivalent anywhere in the app — it is the
one Trek location whose defining quality is *crowd*, not machinery. Worth noting
as a design question rather than a synth gap.
---
## VOY — Voyager
### Ambience bed
| Element | Character | Confidence |
| --- | --- | --- |
| Bridge | Crisper and cleaner than TNG; higher-frequency content, more air. | **[OBS]** |
| Engineering | Class-9 warp core: faster and sharper than the Galaxy-class pulse, higher resonance. | **[OBS]** |
| Astrometrics | Open, quiet, with sensor sweep activity. | **[OBS]** |
*Covered by:* `pulseShape: 'voyager'` — faster peak (20% vs TNG's 28%), higher
filter excursion. Correct.
### Discrete sounds
| Sound | Character | Existing element | Confidence |
| --- | --- | --- | --- |
| LCARS tones | Same family as TNG, slightly brighter. | **LCARS Double Chirp** | **[OBS]** |
| Long-range sensor sweep | Gliding tone, up or down. | **Sensor Sweep** | **[OBS]** |
| Bio-neural gel pack | *No distinctive recurring sound established.* | — | **[GAP]** |
**Assessment:** Well covered. The current 60/40 Double Chirp / Sensor Sweep
split is a reasonable read of the era.
---
## ENT — Enterprise (NX-01)
The design brief across all departments was a ship closer to present-day
technology than to the 24th century — the NX-01 reads as a submarine or a
research vessel rather than a starship. **[ATT]**
### Ambience bed
| Element | Character | Confidence |
| --- | --- | --- |
| Bridge | Mechanical, more present machinery noise, less smooth than TNG. | **[OBS]** |
| Engineering | Reactor chug rather than a magnetic pulse; heavier, more industrial. | **[OBS]** |
| Quarters | Audible ventilation; the ship is never silent. | **[OBS]** |
*Covered by:* `pulseShape: 'nx'` — described in the code as a "reactor chug",
which is the right instinct.
### Discrete sounds
| Sound | Character | Existing element | Confidence |
| --- | --- | --- | --- |
| Hydraulic relay | Heavy, dull mechanical thunk. | **NX Hydraulic Relay** | **[OBS]** |
| Indicator beep | Plain utilitarian beep, no musical intent. | **NX Indicator Beep** | **[OBS]** |
| Door | Manual-feeling, mechanical, slower than later eras. | *none***gap** | **[OBS]** |
| Comm | Rougher and more radio-like than the TNG badge chirp. | *none***gap** | **[OBS]** |
**Assessment:** Correctly characterized. The deliberate *plainness* of the NX
telemetry is the point — resist any temptation to make these more musical.
---
## Star Trek existing element retention map
Every current telemetry element and its real counterpart. All ten are
era-appropriate and none should be removed.
| Existing element | Real counterpart | Verdict |
| --- | --- | --- |
| LCARS Single Chirp | TNG/VOY panel touch tone | Keep — accurate |
| LCARS Double Chirp | TNG/VOY confirmation tone | Keep — accurate |
| LCARS Acknowledgment Sequence | TNG multi-tone data run | Keep — accurate |
| Sensor Sweep | Long-range sensor glide | Keep — accurate |
| TOS Computer Warble | TOS computer chatter | Keep — strong match |
| TOS Relay Click | TOS mechanical relay | Keep — accurate |
| Cardassian Sensor Tone | Terok Nor native systems | Keep — strong match |
| NX Hydraulic Relay | NX-01 mechanical systems | Keep — accurate |
| NX Indicator Beep | NX-01 indicator | Keep — accurate |
| TNG Door Chime | Door annunciator | Keep — accurate; consider adding to the `tng` scheduler at low weight |
---
## Star Trek gap list
Ranked by how much each would add, given what already exists.
| # | Sound | Era(s) | Why it matters | Difficulty |
| --- | --- | --- | --- | --- |
| 1 | **Comm badge chirp** | TNG, VOY | The most recognizable discrete sound in the franchise, and completely absent. Short, bright, two-part. | Low |
| 2 | **Cardassian door** | DS9 | Heavy grinding mechanism; would give DS9 presets character they currently lack entirely. | Medium — needs noise plus resonant filter sweep |
| 3 | **Door swish** | TOS, TNG, VOY, ENT | Four era variants from one filtered-noise primitive with different envelopes. High reuse for low cost. | Low |
| 4 | **Turbolift** | TNG, VOY | Rising whoosh and settle; adds a sense of a ship in use. | Medium |
| 5 | **Bosun's whistle** | TOS | Distinctive and very era-specific; two-tone glide. | Low |
| 6 | **Transporter** | all | Iconic, but long (~3 s) and shimmer-dense — pushes past the ambient-layer duration guideline and belongs on the soundboard. | High |
| 7 | **Medical monitor** | TNG, VOY | Slow rhythmic tone; would make a sickbay preset viable. | Low |
| 8 | **Replicator** | TNG, VOY | Brief shimmer; lower value than the above. | Medium |
Items 1, 3, 5 and 7 are all low-difficulty and would roughly double the
discrete vocabulary.
---
## Star Trek open questions
Deliberately unresolved rather than guessed:
- **[GAP]** TNG/DS9/VOY sound editor credits and who designed the LCARS tone
set. Check series credits and Emmy records against a primary source before
naming anyone.
- **[GAP]** Whether the LCARS tones follow a deliberate musical scheme or the
perceived intervals are incidental. The app assumes a fixed pitch set; that is
a design choice, not an established fact about the shows.
- **[GAP]** Per-room ambience is characterized above by listening, not from
production documentation. If a set-by-set breakdown exists it has not been
located.
- **[GAP]** Whether TOS telemetry density should differ from TNG by default. The
listening impression is that it should be substantially higher; no source
confirms an intended difference.
### Where to verify
- Memory Alpha's *Star Trek Sound Effects* page — the closest thing to a canon
index, though it resists automated fetching.
- TrekCore's audio archive, organized into 19 categories including background
ambient, computer, door, turbolift, red alert and warp, with per-series
subdivisions. Listening to these directly is the fastest route to closing the
**[OBS]** and **[GAP]** entries above.
- Episode audio itself, for per-room ambience — the only reliable source for it.
---
# Doctor Who — The Whoniverse
Everything in this app's `whoniverse` universe traces back to one source: the
**BBC Radiophonic Workshop**, and specifically sound designer **Brian Hodgson**,
who created the TARDIS's signature sounds in 1963. Unlike Star Trek's five
distinct production eras, Doctor Who's sound identity is organized around the
**TARDIS console room redesigns that accompany each Doctor** — which is exactly
how this app's own presets are already structured (`js/config.js`'s
`whoniverse` universe has one preset per console room, 1st/2nd Doctors through
14th/15th).
**Nothing here proposes removing an existing element.** `WhoniverseAudioSynth`
already implements eight elements, several of them explicitly modeled on the
real production technique in their own code comments. This section verifies
those claims against source material and identifies what's missing — not what's
wrong.
## Layer mapping (Whoniverse-specific)
| Real sound | App layer | Notes |
| --- | --- | --- |
| TARDIS interior room tone | `hull` (`HullDroneSynth`) | Continuous, present in every scene set inside the TARDIS. |
| Central column / time rotor pulse | `warp` (`WarpCoreSynth`) | The rising-falling column is the TARDIS's visual "engine," so it maps to the pulse layer even though nothing is propelling anything in the Trek sense. |
| Cloister Room / ship systems | `lifeSupport` (`LifeSupportSynth`) | Background systems hum. |
| Console beeps / instrument chatter | `telemetry` (`TelemetrySynth`) | Borrowed wholesale from Star Trek eras — see [`telemetry_elements.md`](telemetry_elements.md#preset--telemetry-era-reference). |
| Materialization/dematerialization, cloister bell, sonic screwdriver, etc. | `WhoniverseAudioSynth` (manual, soundboard) | One-shots, not part of the ambient bed — same role as doors/transporters in the Trek layer mapping. |
## The materialization sound ("wheeze-groan" / "vwoorp")
**[DOC]** Brian Hodgson created the effect in 1963 for *An Unearthly Child* by
dragging a house key along the bass strings of a broken piano, then processing
the recording through **tape feedback** — playing a signal into a second tape
recorder that repeats it, producing a sound that seems to recede, and reversing
that same technique to make it seem to approach. He layered in "little bits of
white noise, little chiffs of beeps and things coming and going" on top. The
conceptual hook was "the rending of the fabric of time and space" — the sound
is deliberately a *tearing*, not a mechanical hum.
**[ATT]** The sound has no single official name. Fans call it the "vwoorpy" or
the "wheezing, groaning" sound; there is no evidence the production ever gave it
a formal name.
**[DOC]** — and worth knowing because it changes how you'd think about
*variation* — the sound is explicitly **not** how a time machine is supposed to
sound. In-universe, it results from the Doctor's TARDIS having its brakes left
on; other, properly functioning TARDISes make no such sound. This licenses this
app's cross-console-room variation as accurate to the fiction rather than an
oversight: every console room can plausibly sound slightly different, because
the "sound" was never a fixed engineering constant to begin with.
*Covered by:* `synthesizeDematCycle` / `synthesizeSingleDematSwell`. The code
comment already cites Hodgson's technique directly and models it in three
layers — a friction-scrape carrier (sawtooth through a swept bandpass filter,
standing in for the scraped piano string), a sub-vortex FM groan (the "cosmic"
undertone), and a 5.5 Hz flutter LFO (standing in for tape flanging). This is
the single most research-grounded element in the entire codebase — the
implementation isn't just era-appropriate, it's technique-appropriate.
**Assessment: keep as-is.** This element does not need revision; it needs
recognition as the reference implementation for how a "real sound → synthesis"
translation should look throughout this whole app.
## The cloister bell
**[DOC]** In-universe, the cloister bell warns the TARDIS crew of a threat
severe enough to endanger the ship itself — hull breach, vortex discontinuity,
even the heat death of the universe. It's mounted in the Cloister Room but
audible throughout the ship, and can be triggered automatically by the TARDIS's
systems or manually from the console.
**[OBS]** Sonically it reads as a deep, resonant bronze bell — closer to a
cathedral bell than an alarm klaxon — struck at a slow, ominous, unhurried
interval that contrasts with how urgent its message is.
**[GAP]** No production source located for how the actual bell sound was
recorded, its real strike interval, or who created it. The existing code's
comment calling 3.2 s "the canonical cloister bell repetition rate" is an
**[ATT]**-level claim at best here — it should not be read as sourced fact
without a citation, even though it isn't being challenged as *wrong*.
*Covered by:* `triggerCloisterBell` / `synthesizeCloisterStrike`. The strike is
built from six inharmonic partials at realistic bell ratios (fundamental, minor
third, fifth, octave, and two upper strike tones) over a 108 Hz fundamental —
this is a legitimate bell-synthesis model, not a guess, regardless of whether
the specific interval is confirmed.
**Assessment: keep as-is; the interval claim's citation is the only open
item, not the sound design.**
## The sonic screwdriver
**[OBS]** A high-pitched, warbling electronic buzz/whine — mechanical rather
than musical, closer to a dental drill or scanning tool than a chime.
**[GAP]** No production source located describing how the effect was originally
created or engineered, despite searching. This is a genuine hole in the
public record, not a research shortcut — treat any claim about its origin
(a common one repeated informally is a kazoo or comb-and-paper source) as
unverified folklore unless a citation turns up.
*Covered by:* `synthesizeSonicScrewdriver`. Dual square/sawtooth oscillators
roughly a beat-frequency apart, under a fast 32 Hz vibrato, through a resonant
bandpass — a reasonable synthesis of the *character*, independent of whether it
matches the real production method.
**Assessment: keep as-is; character match is solid even though the historical
method is undocumented.**
## Other discrete sounds
| Sound | Character | Existing element | Confidence |
| --- | --- | --- | --- |
| Fast-return lever | Mechanical spring-lever clack the Doctor throws to abort a landing/departure. | **`synthesizeFastReturn`** — triangle wave falling 620→95 Hz, hard clack envelope. | **[ATT]** — the lever is a recurring visual/mechanical prop across eras; no dedicated production sound citation found, but the clack-and-recoil character is consistent with how it's portrayed. |
| Demat switch / console relay | Small mechanical toggle sound for individual console actions, distinct from the full materialization cycle. | **`synthesizeDematSwitch`** — 60 ms square-wave click. | **[OBS]** |
| Telepathic circuits | The TARDIS's translation/psychic-link system — no consistent discrete sound is established on screen; it is usually implied rather than heard. | **`synthesizeTelepathicChime`** — a four-note ascending C-major arpeggio shimmer. | **[GAP]** — this element is a reasonable *invention* for something the show doesn't consistently sonify, not a documented real sound. Flagging so it isn't mistaken for a verified effect. |
| Time rotor column | The rising/falling central column, often shown in sync with the engine sound rather than having a distinct sound of its own. | *none dedicated* — folded into the demat cycle | **[OBS]** |
| Console "typewriter" / dematerialization lever throw | Physical lever-throw clunk before a materialization cycle begins. | *none***gap** | **[ATT]** |
## Whoniverse existing element retention map
| Existing element | Real counterpart | Verdict |
| --- | --- | --- |
| Demat Cycle / Single Demat Swell | TARDIS wheeze-groan (Hodgson, 1963) | Keep — the strongest research-to-synthesis match in the app |
| Cloister Bell / Cloister Strike | Cloister bell danger signal | Keep — sound model is sound; strike-interval citation is the only gap |
| Sonic Screwdriver | Sonic screwdriver buzz | Keep — character accurate; historical method undocumented |
| Fast-Return Lever | Fast-return spring lever | Keep — plausible, unverified against a primary source |
| Demat Switch | Console relay/toggle | Keep — generic and safe regardless of citation |
| Telepathic Chime | *(no consistent on-screen sound)* | Keep as a deliberate invention — worth labeling as such in-app rather than implying it's documented |
## Whoniverse gap list
| # | Sound | Why it matters | Difficulty |
| --- | --- | --- | --- |
| 1 | **Lever-throw clunk** | A physical, tactile beat that currently has no discrete sound — precedes every materialization cycle on screen. Cheap complement to the existing demat cycle. | Low |
| 2 | **TARDIS door open/close** | Distinct wooden-creak-plus-latch character, unlike any Trek door sound already in the app; would give the Whoniverse universe a texture Star Trek's presets can't reuse. | LowMedium |
| 3 | **Scanner/monitor activation** | The console room's viewscreen has a recognizable activation tone across several eras. | Medium |
| 4 | **Console "type" input** | Rapid button/lever interaction chatter distinct from Trek's LCARS chirps — currently the app reuses Trek telemetry wholesale here (see the era table in `telemetry_elements.md`). | Medium — this is really about giving Whoniverse its *own* telemetry vocabulary rather than one new element |
Item 4 is the more consequential one long-term: right now every Whoniverse
preset borrows a Trek-era telemetry vocabulary (TOS warbles, TNG chirps, etc.)
because `telemetry.era` only has five Trek values to choose from. A dedicated
`who` era — built from lever clunks, switch throws, and the console's own
percussive character — would be the single biggest authenticity improvement
available to this universe, bigger than any individual missing one-shot.
## Whoniverse open questions
- **[GAP]** The cloister bell's real strike interval and who created the sound.
The existing "canonical... rate" code comment should be treated as unverified
until a source is found.
- **[GAP]** The sonic screwdriver's original production method. A commonly
repeated claim (kazoo/comb-and-paper origin) surfaced in searches but with no
citation strong enough to record here as fact.
- **[GAP]** Whether materialization sound genuinely varies by console
room/Doctor in the source material, the way this app's presets already
assume, or whether that's an app-level design choice dressed as canon. The
in-universe "brakes left on" explanation supports the *idea* of variation but
doesn't confirm the show varied the actual sound design by era.
- **[GAP]** No console-room-specific ambience breakdown was found (parallel to
the missing Star Trek per-room documentation) — characterizations of "warmer"
vs. "colder" console rooms in this app's presets are plausible extrapolations
from the visual redesigns, not sourced audio claims.
### Where to verify (Doctor Who)
- The BBC's own account of Brian Hodgson's technique (`doctorwho.tv`) is the
best primary source located and is what the demat-cycle comment in the code
already reflects accurately.
- *TARDIS Wiki* (`tardis.fandom.com`) and its mirror `tardis.wiki` are the
closest thing to a canon index for in-universe behavior (cloister bell,
vwoorpy) but do not cover sound production technique.
- BBC Sound Effects releases (e.g. *BBC Sound Effects No. 19: Doctor Who Sound
Effects*) are a plausible source of primary audio for closing the sonic
screwdriver and cloister bell **[GAP]** entries — not yet reviewed here.
---
# Bioships
Unlike Star Trek or Doctor Who, "Bioships" is not one franchise — it's this
app's own category grouping six living/biomechanical ships from five unrelated
sources: *Farscape* (Moya, Talyn), *Lexx* (The Lexx), *Babylon 5* (Vorlon
Cruiser), *Stargate Atlantis* (Wraith Hive Ship), and *Star Trek: Voyager*
(Species 8472). There is no shared production history to research — each ship
has its own creative team and its own answer to "what does organic technology
sound like." What follows is per-ship, not per-era.
**Nothing here proposes removing an existing element.** As the retention map
below shows, `bioships` currently has **no bespoke synthesis of its own at
all** — every discrete "bio" sound in the soundboard is a relabeled element
borrowed from `WhoniverseAudioSynth`. That is worth knowing, not fixing by
force; see the assessment at the end.
## Layer mapping (Bioships-specific)
| Real concept | App layer | Notes |
| --- | --- | --- |
| Heartbeat / vascular pulse | `hull` (`HullDroneSynth`) | The organic equivalent of engine room tone — several presets describe this explicitly (Moya: "pulsating vascular fluid circulation"). |
| Propulsion (starburst, bio-molecular thrust) | `warp` (`WarpCoreSynth`) | Reused pulse shapes stand in for biological propulsion with no real acoustic reference to check against. |
| Respiration / internal atmosphere | `lifeSupport` (`LifeSupportSynth`) | Wraith hive ships' misty corridors and Lexx's "organic respiration" both map here. |
| Neural/telepathic activity | `telemetry` (`TelemetrySynth`) | Currently just borrowed Trek eras — see the config table below. |
| Discrete organic events (creaks, twitches, vocalizations) | soundboard, relabeled `WhoniverseAudioSynth` calls | No ship-specific synthesis exists; see below. |
## Ship-by-ship
### Moya — Farscape (Leviathan transport)
**[DOC]** Series creator Rockne S. O'Bannon's explicit design brief was that
Moya's interior should be "suggestive of organic, but I didn't want it to give
the sense that when people walked down the passageway you'd hear a squishing
sound." This is a real, citable production constraint, and it cuts directly
against the wettest, most visceral reading of "organic ship."
**[ATT]** Moya is a Leviathan transport vessel — a living, sentient,
bio-mechanical being, not merely a ship *shaped* like an organism. Her pilot
(Pilot) is neurally bonded to her, with nerve endings that grow together over
time; an artificially rushed bond causes "a great deal of pain" from mismatched
nerve endings.
**[ATT]** Starburst — the Leviathans' faster-than-light escape mechanism — is
described as an energy buildup that surges through the pilot's den and around
the pilot before releasing across the hull, tearing a dimensional rift. Its
unpredictability is explicitly called biological in nature, and hasn't been
replicated by any non-Leviathan ship.
*Covered by:* preset `bio-moya` (hull volume 0.75, low 45 Hz base, `pulseShape:
'tng'` at a slow 38 bpm — a heartbeat-like rate, not an engine rate). The slow
bpm choice is a reasonable synthesis decision even without a documented real
tempo to check it against.
### Talyn — Farscape (Leviathan-Gunship hybrid)
**[ATT]** Talyn is Moya's offspring, genetically and technologically altered
into a hybrid gunship — younger, more aggressive, combat-capable in a way
ordinary Leviathans are not.
*Covered by:* preset `bio-talyn` — higher bpm (64 vs Moya's 38), `pulseShape:
'defiant'` (the tightest, most aggressive envelope in the app), higher
resonance. The faster/tenser parameter choices track the "young, aggressive
warship" framing accurately even without a specific real-world sound to verify
against.
### The Lexx — Lexx (machine-insect hybrid superweapon)
**[DOC]** The Lexx is explicitly a "machineinsect hybrid," created as the most
powerful weapon of destruction across two universes, capable of destroying a
planet in a single shot. Its command chair was originally covered in a
removable "skin" (a technological shell), which was written out after the
first season to reveal the organic tissue beneath directly — a production
choice to lean *further* into the organic aesthetic over time, not away from
it.
**[GAP]** No production source located describing how the ship's ambient sound
— engine drone, organic wall texture, breathing — was actually created or
recorded, despite searching.
*Covered by:* preset `bio-lexx` — the lowest base frequency of any bioship
preset (38 Hz), heaviest noise mix (0.6), brown noise in `lifeSupport` (the
darkest noise color available). These choices align with "massive biomechanical
insectoid digestive engine drone" from the preset's own description, but that
description is this app's own writing, not a sourced claim about the show.
### Vorlon Cruiser — Babylon 5 (living transport)
**[DOC]** Vorlon transports are described on more than one occasion in the show
as **"singing"** to their occupants — a directly citable, specific claim that
lines up almost exactly with this app's own preset description ("telepathic
singing crystal harmonics").
**[ATT]** The ships carry Vorlon bio-armor and use four sail-like organic folds
for propulsion rather than a mechanical drive, and are described as having "an
intelligence and will of their own" — a genuinely symbiotic, not merely
piloted, relationship with Ambassador Kosh.
*Covered by:* preset `bio-vorlon` — the highest `resonance` of any bioship
preset (3.8 hull / 4.5 warp) and the widest `swirlMix` (0.5), which is a
plausible way to synthesize "singing" — resonant, harmonically rich, spatially
moving — even though no specific frequency content is documented for the real
sound.
**Assessment:** this is the one bioship preset with the strongest direct
textual match ("singing") between the source material and the preset's own
description. It is the best candidate in this whole category for a bespoke
telemetry element, discussed below.
### Wraith Hive Ship — Stargate Atlantis (grown organic warship)
**[DOC]** Hive ship hulls are living, growing organic matter, built through
biotechnology capable of rapid growth — which grants automatic hull
regeneration and self-regulating internal structure, but also means the ship
can dangerously reconfigure itself when something goes wrong, with chambers
appearing or disappearing. The organic hull requires periodic rest between
hyperspace jumps to heal radiation damage, which is a real plot-relevant
constraint, not incidental color.
**[DOC]** The ship is crewed through a neural interface that responds only to
a telepathic signature carried in Wraith DNA — full-blooded Wraith operate it
without fatigue, while those with diluted DNA tire quickly. Interior corridors
are described with **a fine mist covering the floor** throughout inhabited
sections.
*Covered by:* preset `bio-wraith` — the lowest bpm of any bioship (32),
combined with the second-lowest base frequency (34 Hz) and heaviest noise
mix alongside `bio-lexx` (0.65). The mist detail is a strong, currently unused
cue for `lifeSupport` tuning — see the gap list.
### Species 8472 — Star Trek: Voyager (fluidic-space bioship)
**[DOC]** Species 8472 bioships are built from organic technology resembling
the species' own biology, originate from a parallel dimension called fluidic
space, and are explicitly impervious to conventional Starfleet and Borg
weapons — Voyager only defeats one using modified Borg nanoprobes, a
biological rather than a physical countermeasure.
**[GAP]** No documented detail located on the ship's actual sound design;
Memory Alpha's production-side coverage of this vessel is thin.
*Covered by:* preset `bio-species-8472` — the highest base frequency of any
bioship (68 Hz, notably brighter than the others' 3458 Hz range) and
`pulseShape: 'defiant'`. The brighter tuning is a reasonable read of "pure
genetic thrust" and "high-frequency biological firing capacitors" from the
app's own preset description, but again, that description is house writing, not
a documented production fact.
## The "no squishing" design constraint
O'Bannon's stated preference for Moya deserves to generalize across the whole
category, not just his own ship: **organic does not have to mean wet.** Every
existing bioship preset in this app already avoids literal squelch/gurgle
noise-synthesis in favor of resonant tones, filtered noise beds, and pulse
envelopes — which happens to align with the one explicit real production
statement found in this research. Any future bioship element should hold that
line deliberately, not by accident.
## Existing element / soundboard relabeling
`bioships`' soundboard (`js/config.js`) does not call any bespoke synthesis. It
relabels five existing `WhoniverseAudioSynth` / `TelemetrySynth` elements with
organic-sounding names:
| Soundboard label | Actual method called | Real element |
| --- | --- | --- |
| NEURAL TWITCH | `synthesizeTelepathicChime` | Doctor Who telepathic circuit chime (C-major arpeggio shimmer) |
| VASCULAR PUMP | `synthesizeFastReturn` | Doctor Who fast-return lever clack |
| CHITIN CREAK | `synthesizeDematSwitch` | Doctor Who console relay click |
| BIOPLASMIC HISS | `synthesizeSensorSweep` | Star Trek sensor sweep glide |
| SYMBIOTE VOCALIZATION | `synthesizeSonicScrewdriver` | Doctor Who sonic screwdriver buzz |
None of these were designed with any of the six ships above in mind — they are
reused verbatim from a different universe's implementation, exactly as
`telemetry.era` reuses Trek vocabulary for every non-Trek universe (see
[`telemetry_elements.md`](telemetry_elements.md)). This is the same pattern
recurring a third time: Whoniverse borrows nothing (it's the source), Trek eras
get borrowed by everyone else's telemetry, and now bioships borrows discrete
one-shots the same way.
## Bioships existing element retention map
| Existing (relabeled) element | Ship it's used for | Verdict |
| --- | --- | --- |
| Neural Twitch (telepathic chime) | all bioship presets | Keep — a shimmering chime is a defensible generic stand-in for "neural event," but it was written for the TARDIS, not any of these six ships |
| Vascular Pump (fast return) | all bioship presets | Keep — mechanical clack reads as circulatory pump only by association, not by design |
| Chitin Creak (demat switch) | all bioship presets | Keep — a 60 ms square click has no organic quality at all; the label is doing all the work here |
| Bioplasmic Hiss (sensor sweep) | all bioship presets | Keep — a clean sine glide is the least "biological"-sounding element in the whole app; strongest case for replacement |
| Symbiote Vocalization (sonic screwdriver) | all bioship presets | Keep — a resonant buzz is closer to organic than the others, best of the five relabels |
## Bioships gap list
| # | Sound | Why it matters | Difficulty |
| --- | --- | --- | --- |
| 1 | **Bespoke bioship telemetry era** | The single biggest gap in this category, and the same shape as Whoniverse's biggest gap. All six presets currently draw `telemetry.era` from Trek's five values (see the era table in `telemetry_elements.md`) — there is no organic-sounding discrete vocabulary at all, only relabeled inorganic ones. | MediumHigh |
| 2 | **"Singing" resonance element for the Vorlon Cruiser** | The strongest single documented cue in this whole category ("singing to their occupants") has no dedicated synthesis; it's currently indistinguishable from any other bioship preset at the discrete-sound level. | Medium |
| 3 | **Neural-bond swell (Moya/Talyn/Wraith)** | Three of six ships have a documented neural-interface detail (Pilot's nerve endings, Wraith telepathic DNA control) that could unify into one element used across all three, rather than reusing the TARDIS's telepathic chime. | Medium |
| 4 | **Misty-atmosphere life-support tuning (Wraith)** | A specific, documented environmental detail (mist-covered corridor floors) with no corresponding audio treatment — likely a `lifeSupport` filter/noise adjustment rather than a new element. | Low |
| 5 | **Hull self-repair / regeneration texture (Wraith)** | Documented as a distinct capability (auto-regenerating organic hull) with dramatic stakes (forced rest between jumps) and no sonic representation at all. | Medium |
Item 1 dwarfs the rest in the same way the Whoniverse telemetry gap did: a
purpose-built organic discrete vocabulary — creaks, pulses, membrane flutters —
would do more for this universe's authenticity than any single new one-shot.
## Bioships open questions
- **[GAP]** No sound design production information was found for The Lexx,
Species 8472, or the Wraith hive ship specifically — all three assessments
above rest on in-universe descriptions (organic materials, behavior,
constraints), not on how anyone actually built the sound.
- **[GAP]** Whether any of these six ships has ever had its sound
professionally analyzed or cataloged the way TrekCore catalogs Star Trek —
no equivalent archive was found across five different franchises with five
different fan communities of very different sizes.
- **[GAP]** Real starburst acoustic character (Farscape) — the visual and
mechanical description is well documented; no sound-specific source was
found.
- **[ATT]** Whether "singing" for the Vorlon ships was ever given specific
acoustic character on screen (pitch, harmony, language-like quality) versus
being a narrative description characters use — the sourced material
confirms the word is used, not what it actually sounds like.
### Where to verify (Bioships)
- *Farscape Encyclopedia Project* (`farscape.fandom.com`) has the O'Bannon
design-brief quote and is the strongest single source found in this pass.
- Direct episode audio is the only realistic source for the Vorlon "singing"
character, the Lexx's ambient drone, and the Wraith hive ship's interior
tone — no written source located describes any of them acoustically.
- *Stargate* wikis (`stargate.fandom.com`, GateWorld) are strong on Wraith
hive ship biology and constraints but do not cover sound production.
- Memory Alpha's Species 8472 coverage is comparatively thin; a production
interview specific to that episode arc ("Scorpion") may exist but was not
located here.
---
# Space Stations
Like Bioships, "Space Stations" is this app's own grouping, not a franchise —
six stations from five unrelated sources: *Babylon 5*, *Space: 1999*
(Moonbase Alpha), *Alien: Isolation* (Sevastopol Station), *The Expanse*
(Tycho and Ceres — two presets, one franchise), and *Aliens*, 1986 (Gateway
Station). Two of the six — Sevastopol and the Belter stations — turned out to
have unusually strong, specifically-attributable production documentation;
this is the best-sourced non-Trek section in this document as a result.
**Nothing here proposes removing an existing element.** As with Bioships, the
soundboard reuses borrowed elements rather than anything station-specific; see
the relabeling table below, which also surfaces a duplication worth knowing
about regardless of any real-world research.
## Layer mapping (Space Stations-specific)
| Real concept | App layer | Notes |
| --- | --- | --- |
| Hull / structural rumble, rotation | `hull` (`HullDroneSynth`) | For rotating stations this is a **centrifugal** rumble, not an engine — a structurally different real-world source than every other universe in this app. |
| Docking, tram transit, mechanical systems | `warp` (`WarpCoreSynth`) | Reused as a rhythmic-pulse layer standing in for docking clamps and tram/transit systems rather than any propulsion. |
| Air handling, decompression risk | `lifeSupport` (`LifeSupportSynth`) | The most literal, well-matched reuse of any layer in this app — stations really do run on continuous mechanical air handling, and two of the six presets (Sevastopol, Gateway) name it directly in their own descriptions. |
| PA announcements, commerce-hub chatter | `telemetry` (`TelemetrySynth`) | Currently just borrowed Trek eras — see the config table below. |
| Docking clamps, trams, PA beats, plaza ambience | soundboard, relabeled elements | No station-specific synthesis exists; see below. |
## Station-by-station
### Babylon 5: Core Control & Zocalo
**[DOC]** The station is a 5-mile, self-sufficient O'Neill-cylinder-style
habitat. Unlike Gerard O'Neill's original counter-rotating-cylinder concept,
Babylon 5's cylinders rotate about the *same* axis while still maintaining zero
net angular momentum — a specific, citable engineering detail — and the
station draws power from fusion reactors rather than the solar collection
O'Neill's original design assumed.
**[GAP]** No production sound-design source located for the station's actual
audio identity or for the Zocalo (its central commerce plaza) specifically.
*Covered by:* preset `sta-babylon-5` — the lowest `warp` bpm outside Sevastopol
(34) standing in for slow centrifugal rotation rather than any engine rhythm,
heavy noise mix (0.6) for structural mass, `telemetry.era: 'ds9'` (a Cardassian
sensor tone for a station that has nothing to do with Cardassia — the same
Trek-borrowing pattern documented in `telemetry_elements.md`).
### Moonbase Alpha: Main Mission Control
**[DOC]** Moonbase Alpha is a **static lunar surface installation**, not a
rotating station — it's a four-kilometer, self-sustaining complex in the
Moon's Plato crater, kept habitable by four nuclear reactors, solar
supplementation, and **eight anti-gravity towers** rather than spin gravity.
Water comes from recycled subsurface ice; food from hydroponics and
biochemical synthesis; sections connect via pressurized travel tubes. Main
Mission itself is a large multi-level control room (relocated underground to a
smaller room in the show's second season for added protection).
**[GAP]** No production audio-design source located.
**Design nuance worth flagging:** Moonbase Alpha is the *one* preset in this
category that structurally has no rotation to rumble with — everything else
here spins. Its current `hull`/`warp` parameters (54 Hz base, 44 bpm) don't
distinguish it from the rotating stations in any deliberate way; there is
nothing wrong with the numbers, but the *reason* for them (reactor and
travel-tube hum, not spin) isn't represented by anything the other presets
don't also have.
*Covered by:* preset `sta-moonbase-alpha``telemetry.era: 'tos'` is the one
telemetry choice in this category that actually lines up with real production
history: Space: 1999 (1975) and TOS (1966) are close contemporaries in
broadcast-era electronic sound design, so borrowing TOS's warble for a 1970s
lunar base is coincidentally more defensible than any other era-borrowing case
in this document.
### Sevastopol Station: Habitation Deck (Alien: Isolation)
**[DOC]** This is the best-documented station in the entire app. Audio
director **Jeff van Dyck** was given access to the original 1979 *Alien*
film's sound effects and rebuilt them with modern technology for continuity
across the franchise. The team hired **Pinewood Studios** to record bespoke
foley rather than relying on effects libraries — including stamping on
different surfaces, "including soil covered in assorted squishy vegetables,"
to capture movement across the station's varied environments, from the
sterile medical bay to the alien nest.
**[DOC]** The station's decay is conveyed through baseline ambient sound
described directly as **"creaking and sparking and shuddering,"** and — a
specific, transferable technique — that ambience is **dynamically ducked**
when the threat is close, so the player becomes more aware of the protagonist's
own breathing and footsteps instead. This is a mixing decision, not a synthesis
one, but it's directly relevant to how any real "Sevastopol" preset ought to
behave if this app ever added activity-linked ambience ducking.
*Covered by:* preset `sta-sevastopol` — brown noise in `lifeSupport` (the
darkest available), high `hull` noise mix (0.65), `pulseShape: 'nx'` for a
mechanical rather than musical pulse. These choices land close to "creaking and
shuddering" in spirit. What's absent is any **spark** element — a short,
transient, high-frequency event distinct from the continuous creak-and-shudder
bed — and the **dynamic ducking** behavior, neither of which this app's
architecture currently supports for any universe.
### Tycho Station: Asteroid Construction Bay & Ceres Station: Sub-Crustal Tunnels (The Expanse)
**[DOC]** Supervising sound editor **Nelson Ferreira** (with sound designers
Nathan Robitaille, then Dave Rose) built *The Expanse*'s audio around a
deliberate **"low-tech it"** philosophy — technology 200 years from now that
still sounds like it evolved from the present, not like generic futurism — and
assigned each faction a distinct sonic signature: **Earth** is heavy and
bass-rich, **Mars** is clean and precise with tight servo sounds, and
**Belters** — the people who live on Tycho and Ceres — get **"broken, creaky
mechanisms suggesting jury-rigged technology."**
That last detail is directly and specifically actionable: it's a citable,
named-production description of exactly what these two presets should sound
like, not an inference from watching. Both Tycho and Ceres are Belter
stations; both should sound *maintained by scavenging*, not engineered.
*Covered by:* preset `sta-tycho` (`noiseMix: 0.55`, `pulseShape: 'defiant'`,
construction-bay framing) and `sta-ceres` (`noiseMix: 0.62`, brown noise,
subterranean framing). Both lean appropriately noisy and mechanical rather than
clean — broadly consistent with "jury-rigged" even without the app having a
dedicated "broken/creaky" telemetry vocabulary to complete the picture (see the
gap list).
### Gateway Station (Aliens, 1986)
**[DOC]** Gateway is a massive geosynchronous station above Quito, Ecuador,
built from advanced plastics and titanium composite in modular sections joined
by steel beams — Earth's hub for interstellar cargo, personnel transfer, the
Colonial Marine Corps, and an aerospace training school. Production designer
Peter Lamont built it from matte paintings and miniature models, reusing parts
from the Nostromo refinery model; Syd Mead and Robert Skotak contributed to its
design. In the film it's where Ripley wakes from 57 years of hypersleep,
recovers in the infirmary, and faces her inquiry — corridors, medical bays, and
an atrium with environmental screens showing Earth.
**[GAP]** No dedicated sound-design source was located for Gateway
specifically; the film's overall industrial sound design is well documented
in general Alien-franchise coverage, but nothing ties a specific technique to
this station rather than to the Sulaco or LV-426 colony.
*Covered by:* preset `sta-gateway` — the lowest `noiseMix` of any station
preset (0.5) and a relatively bright 46 Hz base, consistent with a station
description that emphasizes clean transfer/quarantine functions ("high-volume
environmental air handlers") over the grime of Sevastopol or the Belt.
## Existing element / soundboard relabeling
Same pattern as Bioships: the `spacestations` soundboard calls no
station-specific synthesis. All five buttons relabel existing elements from
two other universes' classes:
| Soundboard label | Actual method called | Real element |
| --- | --- | --- |
| AIR HANDLER THUD | `expandedAudio.synthesizeDockingClamp` | Shared 1:1 with the button below — see note |
| DOCKING CLAMP LATCH | `expandedAudio.synthesizeDockingClamp` | Same docking-clamp synthesis, different label |
| TRAM DEPARTURE GONG | `whoniverseAudio.synthesizeCloisterStrike` | One strike of the Doctor Who cloister bell |
| COMM PA BEAT | `whoniverseAudio.synthesizeDematSwitch` | Doctor Who console relay click |
| ZOCALO PLAZA CHIME | `whoniverseAudio.synthesizeTelepathicChime` | Doctor Who telepathic circuit chime |
**Fixed.** Unlike every other cross-universe borrowing in this document, AIR
HANDLER THUD and DOCKING CLAMP LATCH were calling the **exact same method**
and producing **the literal identical sound** under two different labels on
the same soundboard — the one true duplicate button mapping found anywhere in
the app during this documentation effort. `AIR HANDLER THUD` now calls a new
`ExpandedSciFiAudioSynth.synthesizeAirHandlerThud()`: a dull triangle-wave
thump with a sub-octave body (no bright metallic impact) followed by a
slow-building lowpass-filtered airflow whoosh — a big soft mechanical event
that keeps breathing after it, rather than the docking clamp's single hard
square-wave latch and bright pneumatic hiss. `DOCKING CLAMP LATCH` is
unchanged and still calls `synthesizeDockingClamp()`.
## Space Stations existing element retention map
| Existing (relabeled) element | Verdict |
| --- | --- |
| Air Handler Thud (now `synthesizeAirHandlerThud`) | **Fixed** — no longer shares a method with Docking Clamp Latch; the two are now audibly distinct |
| Docking Clamp Latch (`synthesizeDockingClamp`) | Keep — unchanged |
| Tram Departure Gong (cloister strike) | Keep — a single deep bell strike is a defensible generic "departure" cue, though it carries no tram-specific character |
| Comm PA Beat (demat switch) | Keep — a 60ms click reused as a PA beep; functionally fine, sonically generic |
| Zocalo Plaza Chime (telepathic chime) | Keep — a shimmering four-note arpeggio for a bustling commerce plaza is the largest tonal mismatch of the five: Babylon 5's Zocalo is a defensible **[DOC]** description, and this element (built for a psychic time machine circuit) has no plaza connection at all |
## Space Stations gap list
| # | Sound | Why it matters | Difficulty |
| --- | --- | --- | --- |
| ~~1~~ | ~~Distinct air-handler vs. docking-clamp sounds~~ | **Fixed**`AIR HANDLER THUD` now calls its own `synthesizeAirHandlerThud()` (dull thump + slow airflow whoosh) instead of sharing `synthesizeDockingClamp()`. | Done |
| 2 | **Belter "jury-rigged" telemetry era** | The single most specific, most directly citable production detail found in this whole reference ("broken, creaky mechanisms") has no corresponding discrete-sound vocabulary — Tycho and Ceres currently borrow Voyager/NX Trek telemetry instead of anything broken or creaky. | Medium |
| 3 | **Sevastopol "spark" transient** | Van Dyck's ambience is explicitly creak **and spark** and shudder; this app's Sevastopol preset covers creak/shudder territory via noise and filtering but has no discrete spark event at all. | Low |
| 4 | **Zocalo / commerce-plaza chatter** | A crowd-and-chatter texture (paralleling the Deep Space Nine Promenade gap noted in the Star Trek section) with no equivalent anywhere in the app — public gathering spaces are structurally different from every machinery-dominated preset. | MediumHigh |
| 5 | **Rotation-vs-static distinction for Moonbase Alpha** | Not a missing sound so much as a missing *reason*: nothing currently separates "spinning station rumble" from "static lunar base with anti-gravity towers" even though they are physically different phenomena in the source material. | Low (parameter tuning, not new synthesis) |
Item 1 is close to a one-line fix and should probably happen regardless of any
broader redesign; item 2 has the same "biggest single win" shape as the
Whoniverse and Bioships telemetry gaps, and is unusually well-supported by a
named, quoted production source.
## Space Stations open questions
- **[GAP]** No dedicated sound-design source was found for Babylon 5, Moonbase
Alpha, or Gateway Station specifically — the Babylon 5 and Moonbase Alpha
assessments rest on engineering/production facts (rotation physics, reactor
count), not on how anyone built the audio.
- **[GAP]** Whether Alien: Isolation's per-area foley (medical bay vs. alien
nest, per van Dyck) implies the station's ambience genuinely varies by room
in-game, the way this app's single `sta-sevastopol` preset cannot — the
source confirms *foley* varied by surface, not that the *ambient bed*
itself changes by room.
- **[GAP]** Whether "low-tech it" as a philosophy has any further specifics
published for Ceres vs. Tycho individually, beyond the shared Belter
signature — the source found treats Belter technology as one category, not
two distinct stations.
- **[ATT]** Gateway Station's minimal foley identity in the film itself (a
brief early sequence) means it's the thinnest-sourced entry in this
category by nature of the material, not by research gap.
### Where to verify (Space Stations)
- **A Sound Effect** (`asoundeffect.com`) carries a full named-interview
breakdown of *The Expanse*'s sound team and philosophy — the strongest
single production source in this entire document.
- **PC Gamer**'s "The audio of Alien: Isolation" and **Audio Media
International**'s dedicated coverage both name Jeff van Dyck directly and
describe concrete foley technique — the second is worth reading in full for
detail not captured here.
- *AVP Central* is a strong resource for Alien-franchise station lore
(Sevastopol, Gateway) but does not cover sound production.
- No equivalent named-interview source was found for Babylon 5 or Space: 1999
audio specifically; direct episode audio remains the only way to close those
two entries.
+343
View File
@@ -0,0 +1,343 @@
# Telemetry Audio Elements
Catalog of the discrete telemetry sounds the application produces. All of them
live in `TelemetrySynth` (`js/audio.js`, ~line 715) and are **synthesized at
runtime** from Web Audio oscillators, envelopes and filters — there are no
samples anywhere in this project.
Telemetry is the "computer chatter" layer: short, non-musical-foreground blips
that sit on top of the continuous hull / warp / life-support beds. It is the
only audio layer with a **density** parameter, because it fires as discrete
events rather than running continuously.
---
## Element catalog
| Element | Method | Description | Where used |
| --- | --- | --- | --- |
| **LCARS Single Chirp** | `synthesizeLCARSSingleChirp(pitch?)` | Soft sine touch tone, ~90 ms, gentle 8 ms attack into exponential decay, with a subtle 2% downward pitch glide and a 3.2 kHz lowpass to kill the click. Accepts an optional pitch, which makes it the building block for the other LCARS elements. | TNG auto-scheduler (45%), DS9 (50%), soundboard `btn-chirp-single` / `btn-switch-pop`, preset-change confirmation while playing, **default fallback** for any unmapped soundboard or event id |
| **LCARS Double Chirp** | `synthesizeLCARSDoubleChirp()` | Two single chirps 65 ms apart, second pitch two steps up the LCARS scale (minor third / fourth). The iconic "acknowledged" tone. | TNG auto-scheduler (30%), Voyager (60%), soundboard `btn-chirp-double`, **engage/play confirmation** for non-Whoniverse, non-bioship universes |
| **LCARS Acknowledgment Sequence** | `synthesizeLCARSSequence()` | Three chirps at 75 ms spacing drawn from overlapping windows of the LCARS scale — reads as a short data-accept run rather than a single button press. | TNG auto-scheduler (15%), soundboard `btn-chirp-ack` |
| **Sensor Sweep** | `synthesizeSensorSweep()` | 380 ms sine glide from 12002000 Hz, ramping either up ×1.6 or down ×0.65 at random. Longer and more "scanning" than the chirps. | TNG auto-scheduler (10%), Voyager (40%), soundboard `btn-chirp-sweep`, layered under `btn-scanner` |
| **TOS Computer Warble** | `synthesizeTOSWarble()` | 450 ms of detuned triangle + sawtooth (fundamental and its fifth) under a 1422 Hz vibrato LFO, through a Q=3.5 bandpass at 1.2× the fundamental. Vintage 1960s analog computer voice. | TOS auto-scheduler (60%) |
| **TOS Relay Click** | `synthesizeTOSRelayClick()` | 25 ms square wave falling 1400 → 300 Hz. A mechanical solenoid snap, not a tone. | TOS auto-scheduler (40%) |
| **Cardassian Sensor Tone** | `synthesizeCardassianSensor()` | 550 ms pair of sines a tritone apart (×1.414) for deliberate metallic dissonance, base 420620 Hz. Cavernous, alien, unresolved. | DS9 auto-scheduler (50%) |
| **NX Hydraulic Relay** | `synthesizeNXRelay()` | 40 ms triangle falling 750 → 120 Hz. Heavier and duller than the TOS click — 22nd-century industrial rather than mid-century electrical. | NX auto-scheduler (50%) |
| **NX Indicator Beep** | `synthesizeNXIndicatorBeep()` | 80 ms 950 Hz sine with a flat sustain plateau and a fast tail. Plain and utilitarian; no glide, no scale membership. | NX auto-scheduler (50%) |
| **TNG Door Chime** | `synthesizeDoorChime()` | Two overlapping sines, A5 (880 Hz) then D6 (1174.66 Hz) at +160 ms, each with a long 450700 ms decay. The "come in" chime. | Soundboard `btn-chirp-door` only — **never** fired by the auto-scheduler |
---
## The auto-scheduler
`startAutoTelemetryScheduler()` self-reschedules after every sound:
```
baseDelay = 12000 * (1.05 - density) // ms
interval = max(800, baseDelay + random(0..4000))
```
- `density` 0 → scheduler does not arm at all (`<= 0.01` returns early).
- `density` 1 → ~0.6 s base + jitter, floored at 800 ms — a busy bridge.
- Mid values land in the 212 s range the parameter comment describes.
- Density comes from the active preset's `telemetry.density` and is also live
on the `slider-telemetry-density` UI control.
### Era routing
`playRandomTelemetrySound()` picks an element by `params.era`. Each era draws
from **exactly two or four** elements — this is the table to extend when adding
an era or a new element.
| Era | Elements and weights |
| --- | --- |
| `tng` (also the default) | Single Chirp 45% · Double Chirp 30% · Acknowledgment Sequence 15% · Sensor Sweep 10% |
| `voyager` | Double Chirp 60% · Sensor Sweep 40% |
| `tos` | Computer Warble 60% · Relay Click 40% |
| `ds9` | Cardassian Sensor 50% · Single Chirp 50% |
| `nx` | Hydraulic Relay 50% · Indicator Beep 50% |
Note the era is a **telemetry** property, not a universe property: it is set
per preset in `js/config.js` (`telemetry.era`) and is independent of the
universe that governs the visuals. In practice every preset in every universe
uses one of these five Trek eras, so non-Trek themes play Trek telemetry — see
[Preset → telemetry era reference](#preset--telemetry-era-reference) for the
full per-preset mapping.
---
## The activity event contract
Every scheduled telemetry sound dispatches a window event **after** it plays:
```js
window.dispatchEvent(new CustomEvent('scifi-telemetry-activity', {
detail: { era, density, firedAt }
}));
```
`js/app.js` listens for this and calls `triggerObservationActivity('telemetry')`,
which is what synchronizes observation-mode transient visuals to the audio.
The visual side deliberately treats the pulse as **abstract activity** — no
specific beep means a specific thing on screen. The observation activity slider
then gates whether a given pulse becomes visible:
```
responseChance = 0.18 + activity * 0.82
```
Important: only `playRandomTelemetrySound()` dispatches the event. Elements
triggered directly (soundboard, play/stop, preset change) are silent as far as
the visual layer is concerned. If a new element should drive visuals, it must
either be reachable through the era router or dispatch the event itself.
---
## Pitch material
Two fixed scales are the source of all pitched telemetry. Reuse them rather
than inventing loose frequencies — they are what makes the layer sound coherent.
- **`lcarsPitches`** — 12 entries, 880 Hz → 2637 Hz, a pentatonic-flavored set
built on perfect fourths and fifths. Used by every LCARS element.
- **`tosFrequencies`** — 9 entries, 440 Hz → 2217 Hz, wider and more angular,
matching the era's less "designed" sound.
Unpitched elements (relay clicks, sweeps, the Cardassian tone) generate their
own frequencies and intentionally sit outside both scales.
---
## Signal-chain conventions
Every element follows the same shape. Match it when adding one:
1. Bail out early on `!ctx || !this.gainNode`.
2. Capture `const now = ctx.currentTime` once and schedule everything relative
to it — never use `setTimeout` for sample-accurate timing (it is used only
for the deliberate multi-note spacing in the double chirp and sequence).
3. Build oscillator → per-voice envelope gain → optional filter → `this.gainNode`.
4. Envelopes start at `0.001`, `linearRampToValueAtTime` up, then
`exponentialRampToValueAtTime` down to `~0.0001`. Never ramp exponentially
to or from exactly zero.
5. Peak envelope gain stays in the **0.180.35** band so no element dominates
the bed. Clicks sit at the top of that range because they are so short.
6. Explicitly `stop()` every node at the end of its life. Nothing here loops.
`this.gainNode` carries the layer volume and connects to `am.compressor`, so
individual elements should never touch master volume or the destination.
---
## Related but not telemetry
Short event sounds for non-Starfleet universes live in sibling classes and are
routed by `handleSoundboardTrigger()` in `js/app.js`. Check these before adding
a new telemetry element — the sound you want may already exist:
- **`WhoniverseAudioSynth`** — sonic screwdriver, fast return, demat switch,
telepathic chime, cloister strike.
- **`ExpandedSciFiAudioSynth`** — DRADIS ping, HAL chime, Geiger burst, docking
clamp, improbability flip, cheerful door, and the various drive effects.
- **`AlertSynth`** — red/yellow alert cycles and the warp jump swell. Alerts are
a separate layer with its own trigger path, not telemetry. **They are not
purely user-triggered:** in Observation Mode the cinematic director's Hull
Breach sequence calls `alerts.triggerRedAlert('tng')` on its own, roughly
6.5 s before restoring the previous state. It is in the sequence pool for the
`military`, `outlaw` and `industrial` universes and fires on a random timer
(4575 s for the first sequence, 90180 s between later ones). This is the
only non-telemetry sound in the app that can start without user action.
Preset changes and play/stop pick between these three families by
`activeUniverseId` — see `js/app.js` around lines 305365.
---
## Adding or reusing an element
Reuse an existing element when the need is **generic UI feedback** — the Single
Chirp and Double Chirp are explicitly the neutral confirm/acknowledge sounds and
are already the fallbacks for unmapped ids. Reaching for them costs nothing.
Invent a new element when the sound must carry **era or universe identity** that
no existing element has. In that case:
1. Add the method to `TelemetrySynth` following the signal-chain conventions.
2. Give it a doc comment naming the era and the physical thing it imitates —
every existing element has one.
3. Wire it into the `playRandomTelemetrySound()` era switch with an explicit
probability, or leave it manual-only (like the Door Chime) if it is too
characterful to fire unattended.
4. If it is manual-only, add a soundboard case in `handleSoundboardTrigger()`
and a button in `index.html`.
5. Reuse `lcarsPitches` / `tosFrequencies` if the element is pitched and belongs
to those eras.
6. Keep the duration under ~600 ms. This is an ambient layer; anything longer
reads as a foreground event and belongs in `AlertSynth` instead.
---
## Preset → telemetry era reference
`telemetry.era` is assigned **per preset**, and it is the only thing that
decides which elements the auto-scheduler fires. It is *not* derived from the
universe. All 70 presets across all 10 universes currently use one of the five
Star Trek eras, so non-Trek universes play Trek telemetry: a retrofuture profile
can chatter in TOS warbles, and a living-ship profile can ring with the
Cardassian sensor tone. If you hear a sound that seems foreign to the theme you
are on, this table is where to look it up.
| Era | Elements fired |
| --- | --- |
| `tng` | Single Chirp 45% · Double Chirp 30% · Ack Sequence 15% · Sensor Sweep 10% |
| `voyager` | Double Chirp 60% · Sensor Sweep 40% |
| `tos` | TOS Computer Warble 60% · TOS Relay Click 40% |
| `ds9` | Cardassian Sensor 50% · Single Chirp 50% |
| `nx` | NX Hydraulic Relay 50% · NX Indicator Beep 50% |
### Starfleet Command (10 presets — ds9 ×2 · nx ×1 · tng ×3 · tos ×2 · voyager ×2)
| Preset | Era | Elements heard |
| --- | --- | --- |
| Enterprise-D: Main Bridge | `tng` | Single Chirp 45% · Double Chirp 30% · Ack Sequence 15% · Sensor Sweep 10% |
| Enterprise-D: Main Engineering | `tng` | Single Chirp 45% · Double Chirp 30% · Ack Sequence 15% · Sensor Sweep 10% |
| Enterprise-D: Crew Quarters | `tng` | Single Chirp 45% · Double Chirp 30% · Ack Sequence 15% · Sensor Sweep 10% |
| USS Voyager: Bridge | `voyager` | Double Chirp 60% · Sensor Sweep 40% |
| USS Voyager: Class-9 Warp Core | `voyager` | Double Chirp 60% · Sensor Sweep 40% |
| USS Defiant: Tactical Bridge | `ds9` | Cardassian Sensor 50% · Single Chirp 50% |
| Deep Space 9: Ops Center | `ds9` | Cardassian Sensor 50% · Single Chirp 50% |
| Enterprise NCC-1701: Bridge (TOS) | `tos` | TOS Computer Warble 60% · TOS Relay Click 40% |
| Enterprise NCC-1701: Engineering (TOS) | `tos` | TOS Computer Warble 60% · TOS Relay Click 40% |
| Enterprise NX-01: Command Bridge | `nx` | NX Hydraulic Relay 50% · NX Indicator Beep 50% |
### The Whoniverse (7 presets — ds9 ×1 · nx ×1 · tng ×2 · tos ×1 · voyager ×2)
| Preset | Era | Elements heard |
| --- | --- | --- |
| 1963 Classic Console (1st / 2nd Doctors) | `tos` | TOS Computer Warble 60% · TOS Relay Click 40% |
| Victorian Secondary Console (4th Doctor) | `nx` | NX Hydraulic Relay 50% · NX Indicator Beep 50% |
| The Coral Living TARDIS (9th / 10th Doctors) | `tng` | Single Chirp 45% · Double Chirp 30% · Ack Sequence 15% · Sensor Sweep 10% |
| The Copper Workshop (11th Doctor) | `voyager` | Double Chirp 60% · Sensor Sweep 40% |
| The Cold Machine (12th Doctor) | `ds9` | Cardassian Sensor 50% · Single Chirp 50% |
| The Singing Crystal Console (13th Doctor) | `voyager` | Double Chirp 60% · Sensor Sweep 40% |
| The Infinite White (14th / 15th Doctors) | `tng` | Single Chirp 45% · Double Chirp 30% · Ack Sequence 15% · Sensor Sweep 10% |
### Industrial (8 presets — ds9 ×1 · nx ×3 · tos ×3 · voyager ×1)
| Preset | Era | Elements heard |
| --- | --- | --- |
| USCSS Nostromo: Ore Refinery Bridge | `nx` | NX Hydraulic Relay 50% · NX Indicator Beep 50% |
| Serenity: Firefly-Class Cargo Hold | `tos` | TOS Computer Warble 60% · TOS Relay Click 40% |
| Red Dwarf: Main Drive Corridor | `nx` | NX Hydraulic Relay 50% · NX Indicator Beep 50% |
| Starbug 1: Cockpit Environment | `tos` | TOS Computer Warble 60% · TOS Relay Click 40% |
| The Raza: Dark Matter Bridge | `ds9` | Cardassian Sensor 50% · Single Chirp 50% |
| Rocinante: Combat Ops & Epstein Drive | `voyager` | Double Chirp 60% · Sensor Sweep 40% |
| Eagle Transporter: Command Module | `tos` | TOS Computer Warble 60% · TOS Relay Click 40% |
| Valley Forge: Agro-Dome Forest Hub | `nx` | NX Hydraulic Relay 50% · NX Indicator Beep 50% |
### Bioships (6 presets — ds9 ×1 · nx ×2 · tng ×1 · voyager ×2)
| Preset | Era | Elements heard |
| --- | --- | --- |
| Moya: Leviathan Central Nexus | `tng` | Single Chirp 45% · Double Chirp 30% · Ack Sequence 15% · Sensor Sweep 10% |
| Talyn: Gunship Neural Bridge | `ds9` | Cardassian Sensor 50% · Single Chirp 50% |
| The Lexx: Primary Organ Bridge | `nx` | NX Hydraulic Relay 50% · NX Indicator Beep 50% |
| Vorlon Cruiser: Sentient Core | `voyager` | Double Chirp 60% · Sensor Sweep 40% |
| Wraith Hive Ship: Throne Chamber | `nx` | NX Hydraulic Relay 50% · NX Indicator Beep 50% |
| Species 8472: Fluidic Bioship | `voyager` | Double Chirp 60% · Sensor Sweep 40% |
### Retrofuture (8 presets — nx ×2 · tng ×2 · tos ×3 · voyager ×1)
| Preset | Era | Elements heard |
| --- | --- | --- |
| Jupiter 2: Upper Deck Astrogator | `tos` | TOS Computer Warble 60% · TOS Relay Click 40% |
| The Liberator: Zen Flight Bridge | `tos` | TOS Computer Warble 60% · TOS Relay Click 40% |
| USS Cygnus: Victorian Engine Hall | `nx` | NX Hydraulic Relay 50% · NX Indicator Beep 50% |
| USS Palomino: Deep Research Pod | `nx` | NX Hydraulic Relay 50% · NX Indicator Beep 50% |
| Discovery One: Habitation Centrifuge | `tng` | Single Chirp 45% · Double Chirp 30% · Ack Sequence 15% · Sensor Sweep 10% |
| Dark Star: Bomb Bay & Quarters | `tos` | TOS Computer Warble 60% · TOS Relay Click 40% |
| Gunstar: Tactical Combat Cockpit | `voyager` | Double Chirp 60% · Sensor Sweep 40% |
| The Searcher: 25th Century Flagship | `tng` | Single Chirp 45% · Double Chirp 30% · Ack Sequence 15% · Sensor Sweep 10% |
### Military (7 presets — ds9 ×3 · nx ×1 · tng ×1 · voyager ×2)
| Preset | Era | Elements heard |
| --- | --- | --- |
| USS Sulaco: Conestoga Hangar Deck | `nx` | NX Hydraulic Relay 50% · NX Indicator Beep 50% |
| Battlestar Galactica: Combat Information Center (CIC) | `ds9` | Cardassian Sensor 50% · Single Chirp 50% |
| White Star: Minbari/Vorlon Hybrid Bridge | `voyager` | Double Chirp 60% · Sensor Sweep 40% |
| EAS Agamemnon: Omega Destroyer Bridge | `ds9` | Cardassian Sensor 50% · Single Chirp 50% |
| Andromeda Ascendant: Command Deck | `tng` | Single Chirp 45% · Double Chirp 30% · Ack Sequence 15% · Sensor Sweep 10% |
| Excalibur: Victory-Class Heavy Combat Core | `ds9` | Cardassian Sensor 50% · Single Chirp 50% |
| Colonial Viper Mk II: Cockpit Atmosphere | `voyager` | Double Chirp 60% · Sensor Sweep 40% |
### Deep Space (7 presets — ds9 ×2 · nx ×2 · tng ×2 · voyager ×1)
| Preset | Era | Elements heard |
| --- | --- | --- |
| The Avalon: Interstellar Cruise Concourse | `tng` | Single Chirp 45% · Double Chirp 30% · Ack Sequence 15% · Sensor Sweep 10% |
| The Nightflyer: Telepathic Corridor | `ds9` | Cardassian Sensor 50% · Single Chirp 50% |
| USS Ascension: Generation Ship Promenade | `nx` | NX Hydraulic Relay 50% · NX Indicator Beep 50% |
| Ark One: Evacuation Ark Bridge | `voyager` | Double Chirp 60% · Sensor Sweep 40% |
| Icarus II: Solar Shield Core | `tng` | Single Chirp 45% · Double Chirp 30% · Ack Sequence 15% · Sensor Sweep 10% |
| Event Horizon: Gravity Singularity Core | `nx` | NX Hydraulic Relay 50% · NX Indicator Beep 50% |
| Lewis & Clark: Rescue Cutter Bridge | `ds9` | Cardassian Sensor 50% · Single Chirp 50% |
### Outlaw (6 presets — ds9 ×1 · nx ×1 · tos ×2 · voyager ×2)
| Preset | Era | Elements heard |
| --- | --- | --- |
| The Betty: Salvage Freighter Mess | `nx` | NX Hydraulic Relay 50% · NX Indicator Beep 50% |
| Bebop: Living Quarters & Hangar | `tos` | TOS Computer Warble 60% · TOS Relay Click 40% |
| Outlaw Star: Grappler Bridge | `voyager` | Double Chirp 60% · Sensor Sweep 40% |
| Scorpio: Wanderer Salvage Vessel | `tos` | TOS Computer Warble 60% · TOS Relay Click 40% |
| The Marauder: Havoc Shuttle Bridge | `ds9` | Cardassian Sensor 50% · Single Chirp 50% |
| The Milano: M-Ship Cockpit Lounge | `voyager` | Double Chirp 60% · Sensor Sweep 40% |
### Space Stations (6 presets — ds9 ×1 · nx ×2 · tng ×1 · tos ×1 · voyager ×1)
| Preset | Era | Elements heard |
| --- | --- | --- |
| Babylon 5: Core Control & Zocalo | `ds9` | Cardassian Sensor 50% · Single Chirp 50% |
| Moonbase Alpha: Main Mission Control | `tos` | TOS Computer Warble 60% · TOS Relay Click 40% |
| Sevastopol Station: Habitation Deck | `nx` | NX Hydraulic Relay 50% · NX Indicator Beep 50% |
| Tycho Station: Asteroid Construction Bay | `voyager` | Double Chirp 60% · Sensor Sweep 40% |
| Ceres Station: Sub-Crustal Tunnels | `nx` | NX Hydraulic Relay 50% · NX Indicator Beep 50% |
| Gateway Station: Quarantine Transfer Deck | `tng` | Single Chirp 45% · Double Chirp 30% · Ack Sequence 15% · Sensor Sweep 10% |
### Comedy (5 presets — nx ×1 · tng ×2 · tos ×1 · voyager ×1)
| Preset | Era | Elements heard |
| --- | --- | --- |
| USS Orville: Command Bridge | `tng` | Single Chirp 45% · Double Chirp 30% · Ack Sequence 15% · Sensor Sweep 10% |
| NSEA Protector: Beryllium Engine Room | `voyager` | Double Chirp 60% · Sensor Sweep 40% |
| Heart of Gold: Improbability Bridge | `tng` | Single Chirp 45% · Double Chirp 30% · Ack Sequence 15% · Sensor Sweep 10% |
| HMS Camden Lock: Flight Deck & Mess | `nx` | NX Hydraulic Relay 50% · NX Indicator Beep 50% |
| Spaceball One: Mega-Warship Bridge | `tos` | TOS Computer Warble 60% · TOS Relay Click 40% |
### Notes on the spread
- **Starfleet** is the only universe where the era always matches the fiction.
- **Whoniverse** spans all five eras across its seven presets — the widest
spread of any universe, and the most likely place to hear something
unexpected.
- **Retrofuture** leans on `tos` (3 of 8), which is at least era-plausible for
mid-century-styled ships, but `Discovery One` and `The Searcher` are on full
TNG LCARS.
- **Bioships** has no acoustic relationship to any Trek era; `Talyn` on `ds9`
produces the Cardassian tritone tone inside a living-ship profile.
- **Comedy** and **Spaceball One** on `tos` produce the analog warble.
Two consequences worth keeping in mind when editing:
1. Changing a preset's `telemetry.era` silently changes which sounds it makes.
There is no UI anywhere that names the active era, so the change is audible
but not visible.
2. Any era value outside the five above falls through the `switch` in
`playRandomTelemetrySound()` to the `tng` default. A typo does not fail
loudly — it just produces LCARS chirps.
If a universe should stop borrowing Trek telemetry, the fix is a new era
vocabulary (new elements plus a new `case` in the era router), not a change to
these preset assignments alone — the router has nothing else to offer them.
+322
View File
@@ -0,0 +1,322 @@
# Observation Visual Elements
Catalog of the animated visual elements Observation Mode produces. Everything
here is drawn procedurally at runtime — canvas 2D in `js/observation-engine.js`,
inline SVG generated in `js/app.js` and `js/observation-bezels.js`, and CSS
keyframes in `css/style.css`. There are no image assets in this project.
---
## The two rendering paths
Observation Mode composites **two independent stacks**, and which one a universe
uses is the single most important fact when deciding where a new element goes.
| | Canvas path | SVG path |
| --- | --- | --- |
| Owner | `ObservationEngine.render()` | `getObservationSvg()` / `buildObservationSceneMarkup()` in `js/app.js` |
| DOM node | `#observation-canvas` | `#observation-stage` (art) + `#observation-sim-layer` (motion), z-index 1 and 2 |
| Motion | per-frame in a `requestAnimationFrame` loop | CSS animations + JS spline morphing |
| Used by | universes with `canvas: true` | every universe, but it is the *only* path for `canvas: false` ones |
`OBSERVATION_CANVAS` (top of `js/observation-engine.js`) is the manifest. A
universe not declared `canvas: true` draws nothing on the canvas at all — three
separate barriers enforce this (`canvasEnabled()` in `render()`, canvas
`visibility: hidden` in `start()`, and the stage SVG's own opaque background
rect). Its observation display is entirely bespoke SVG art.
### Layer declarations
| Layer | starfleet | whoniverse | deepspace | spacestations | others |
| --- | :-: | :-: | :-: | :-: | :-: |
| `celestial` | ● | ● | | | |
| `starfield` | ● | | ● | | |
| `deepSpaceField` | | | ● | | |
| `constellations` | | | ● | | |
| `shootingStars` | | | ● | ● | |
| `stationPanorama` | | | | ● | |
| `traffic` | | | | ● | |
| `events` | | | ● | ● | |
| `reticles` | | | | ● | |
| `cinematics` | | | | ● | |
| canvas enabled | ● | ● | ● | ● | — |
`industrial`, `bioships`, `retrofuture`, `military`, `outlaw` and `comedy` are
all `canvas: false` with no layers.
**Dormant layer:** `renderNebulae()` exists and is fully implemented with a
per-universe palette, but no universe currently declares `nebulae`. It is
available for reuse without new code.
Draw order in `render()` is fixed and should not be reshuffled:
stationPanorama → nebulae → celestial → deepSpaceField → starfield →
constellations → shootingStars → traffic/events → reticles.
---
## Canvas celestial elements
| Element | Where drawn | Description | Where used |
| --- | --- | --- | --- |
| **Time Vortex** | `renderCelestialObjects()` | 14 nested ellipses receding on a z-cycle, alternating cyan and gold strokes, counter-rotating by ring parity. Deliberately drawn on pure black with no starfield. | `whoniverse` |
| **Class-M Planet** | `renderCelestialObjects()` | Large body with a Rayleigh-scattering atmosphere halo, a radial terminator gradient, and a bright rim arc on the lit limb. | `starfleet` |
| **Orbiting Moon** | `renderCelestialObjects()` | Small grey disc on a squashed ellipse (×1.7 / ×0.6) around the Class-M planet, with an offset shadow disc. | `starfleet` |
| **Deep-Space Planet** | `regenerateDeepSpaceField()` / `renderDeepSpaceField()` | 24 per session from 6 distinct world palettes (gas giant, ice world, ion-storm giant, seismic rocky, biosignature rocky, frozen dormant). 50% chance of rings, 02 moons each, independent slow drift. | `deepspace` |
| **Nebula Cloud** | `renderDeepSpaceField()` | 35 soft morphing blobs, radius 220620 px, alpha 0.0350.09, each with its own drift, pulse and morph seed. | `deepspace` |
| **Dust Lane** | `renderDeepSpaceField()` | 47 thin angled streaks, 260620 px long, for texture distinct from the soft blobs. | `deepspace` |
| **Derelict Silhouette** | `renderDeepSpaceField()` | 70% chance of 12 segmented megastructure hulks with a blinking beacon and a `DERELICT // NO SIGNAL` callout. | `deepspace` |
| **Anomaly** | `renderDeepSpaceField()` | 12 per session, kind `lensing` or `radiation`, each gated behind its own random `minActivity` threshold of 0.150.55. | `deepspace` |
| **Computer Callout** | `drawComputerCallout()` | Shared annotation primitive: scanning bracket, periodic ping ring, leader line and label. Attached to every planet, derelict and anomaly. | `deepspace` |
| **Generic Nebulae** | `renderNebulae()` | 4 ambient morphing blobs with a per-universe palette (`getNebulaPalette()` covers whoniverse, industrial, bioships and a default). | *dormant — no universe declares it* |
### Station panorama elements
The `spacestations` sky is a **360° panorama in azimuth/elevation space**, not a
forward-motion starfield: the station rotates in place, one full revolution every
240 s, with a ~22% field of view. Generated once per page load.
| Element | Description |
| --- | --- |
| **Panorama Starfield** | 900 stars around the full circle, power-curve size distribution (mostly pinpricks), per-star twinkle speed and phase. |
| **Panorama Nebulae** | 35 patches, own palette, slow pulse. |
| **Panorama Planet** | 12 bodies, banded, 45% rings, 02 moons, own light angle. |
| **Distant Sun** | One, small radius, warm or cool tint. |
| **Sister Station** | 12 far-off structures with optional ring and blinking beacons. |
| **Asteroid Cluster** | 918 procedurally faceted rocks (58 vertices each) with individual rotation. |
Major features are **slot-spread** around the circle rather than randomly placed,
so one notable object drifts through the window every so often instead of
everything clumping into one bearing.
---
## Canvas motion elements
| Element | Method | Description | Where used |
| --- | --- | --- | --- |
| **Parallax Starfield** | `renderStarfield()` | 3D projected star volume with per-universe profile (count, size range, color set, warp-streak flag). Starfleet gets a bespoke calm 150-star cool profile; everything else falls back to `DEFAULT_STARFIELD_PROFILE` (340 stars, 10 colors). | `starfleet`, `deepspace` |
| **Warp Streaks** | `renderStarfield()` + `render()` | In `warp` flight mode stars elongate and the frame clears to a translucent fill instead of solid, producing a motion-blur trail. Station view never smears. | starfield universes |
| **Shooting Star** | `spawnShootingStar()` / `updateShootingStars()` / `renderShootingStars()` | Occasional fast streak with a fading tail. | `deepspace`, `spacestations` |
| **Constellation Lines** | `regenerateConstellation()` / `renderConstellations()` | Faint synthetic point set with connecting lines that fade in, hold, and fade out. Independent of the main starfield. | `deepspace` |
| **Traffic Vessel** | `spawnTraffic()` / `drawShipVessel()` | A ship crossing the frame on a linear path over 1226 s, with an engine particle trail. 12% chance each of a warp-flash entry and/or warp-jump exit. | `spacestations` (and any universe declaring `traffic`) |
| **Comet** | `spawnEvent('comet')` | 5 s drifting event with lateral velocity. | `deepspace`, `spacestations`, cinematics |
| **Warp Flash** | `spawnEvent('warp-flash')` | 1.4 s stationary flash, also used as the arrival marker for warp-entry traffic. | `deepspace`, `spacestations`, cinematics |
| **Target Reticle** | `renderTargetReticles()` | LCARS corner brackets around each traffic vessel with a leader line and text tag. | `spacestations` |
### Traffic vessel types
`drawShipVessel()` draws each by type. `spawnTraffic()` picks the type and label
from the active universe:
| Type | Label pattern | Universe |
| --- | --- | --- |
| `shuttle` | `SHUTTLE // TYPE-9` | default / starfleet |
| `cruiser` | `USS GIBRALTAR // NCC-#####` | starfleet, military |
| `runabout` | `RUNABOUT YANGTZE // NCC-72452` | starfleet |
| `tardis` | `TYPE 40 TIME CAPSULE // DRIFT` | whoniverse |
| `freighter` | `HEAVY HAULER // CLASS IV` | industrial, outlaw |
| `fighterwing` | `VIPER WING // FLIGHT n` | military |
| `bioshippod` | `SPAWN POD // DRIFTING` | bioships |
| `retrosaucer` | `ATOMIC CRUISER // SAUCER CLASS` | retrofuture |
Note that most of these universes are `canvas: false`, so their vessel type is
defined but only reachable if `traffic` is later declared for them. The drawing
code already exists.
---
## SVG scene elements
`buildObservationSceneMarkup(theme)` populates `#observation-sim-layer` with
motion entities over the bespoke stage art. Three builders cover every case:
| Builder | Motion | Parameters |
| --- | --- | --- |
| `obsFlightMarkup` | Travel along a cubic Bézier | `x0..x3, y0..y3, duration, delay, mode` (`arrival` / `cruise` / `depart`), `scale0→scale1`, `minActivity`, `opacity` |
| `obsOrbitMarkup` | Elliptical orbit | `cx, cy, rx, ry, duration, phase, scale0→scale1`, `minActivity`, `opacity` |
| `obsFloatMarkup` | Bounded drift around a point | `cx, cy, ampX, ampY, duration, phase`, `minActivity`, `opacity` |
Per-theme casts:
| Theme | Entities |
| --- | --- |
| `starfleet` | 2 flights (scout arrival, shuttle cruise), 2 orbits (sensor blip, diamond marker) |
| `whoniverse` | 3 orbiting glyphs (◎ ∆ ∞), 2 floating vortex fragments |
| `industrial` | 4 camera-feed-clipped groups: bay drone, 3 embers, airlock tell-tale, corridor lamp — each parented to a clip path matching one feed's picture area |
| `bioships` | 3 flowing particles, 1 orbiting node, 1 breathing membrane |
| `retrofuture` | 2 vector-outline ships, 1 orbiting scope blip, 1 Lissajous figure |
| `military` | 1 four-ship formation, 1 hostile contact, 1 orbiting CAP marker |
| `deepspace` | 1 very slow distant ship, 1 comet, 1 large drifting ringed planet |
| `outlaw` | 1 runner, 1 pursuer, 1 floating needle gauge |
| `spacestations` | 5 clipped entities: arrival, departure, freighter, holding pattern, near pass |
| `comedy` | 1 tour ship, 1 orbiting `?`, 1 tumbling cube |
**Clipping is a rule, not a detail.** The sim layer sits *above* the stage art
(z-index 2 vs 1), so any entity that should appear inside a viewport, camera feed
or window must be wrapped in a matching `clipPath`. The industrial theme's
comment records exactly what went wrong when entities floated free in screen
space.
### Spline morphing
`initializeObservationSplineMorphs()` and `updateObservationSplineMorphs()`
parse the stage SVG's path data and continuously re-target control points, so
static-looking bespoke art breathes. `obsThemeSplineScale(theme)` sets the
per-theme amplitude; `pulseObservationSplineMorphs()` kicks it on activity.
---
## Transient activity effects
`triggerObservationActivity(source)` spawns short-lived generative overlays.
Each universe has its own six-effect vocabulary:
| Universe | Effect vocabulary |
| --- | --- |
| `starfleet` | contact, vector, data, ring, diagnostic, streak |
| `whoniverse` | echo, glyphs, coordinate, warp, rings |
| `industrial` | signal, dropout, vapour, motion, gain, warning |
| `bioships` | neural, spores, ripple, tendril, organ, metric |
| `retrofuture` | blip, scope, counter, vector, bloom, reel |
| `military` | contact, intercept, formation, sector, status, sweep |
| `deepspace` | anomaly, comet, lens, spectral, planet, signal |
| `outlaw` | glitch, route, contact, signal, gauge, rear |
| `spacestations` | dock, depart, guidance, traffic, beacon, queue |
| `comedy` | route, oddity, planet, status, contact, geometry |
Shared primitives every generator can reuse: `obsTextCard()`, `obsContact()`,
`obsExpandingRing()`, plus `obsRand` / `obsInt` / `obsPick` / `obsHex` and the
easing helpers.
**Two trigger sources:**
- `'telemetry'` — driven by the `scifi-telemetry-activity` audio event. Gated by
`responseChance = 0.18 + activity * 0.82`, so at low activity many audio
pulses pass silently and at maximum every pulse gets a visible response.
- `'ambient'` — a self-rescheduling timer whose interval curves from 12.5 s at
minimum activity down to 1.5 s at maximum, plus 2575% jitter.
Above activity 0.55 (telemetry) and 0.82 (any source) a second and third
concurrent effect can spawn, staggered 120380 ms apart.
---
## Frame, chrome and post effects
| Element | Where | Description | Where used |
| --- | --- | --- | --- |
| **Viewport Bezel** | `ObservationBezels.getViewportFrameSvg()` | Procedural SVG window frame, keyed by universe and — for starfleet — by the active preset's *era*, so TOS gets a hexagonal amber bridge bezel and TNG/Voyager get their own. | all except `spacestations`, which has its own native station window in the stage art |
| **Support Pillars** | inside each bezel | Optional vertical struts across the viewport. **Default off.** | bezel universes |
| **Glass Sheen** | `.observation-glass-sheen` | Static specular sheen over the viewport. | all |
| **Scanlines** | `.observation-scanlines` + `updateScanlineBreathing()` | CRT scanline overlay whose opacity breathes with audio energy (base 0.14). | all |
| **Vignette** | `.observation-vignette` | Edge darkening. | all |
| **Alert Wash** | `.observation-alert-wash.alert-red` / `.alert-yellow` | Full-screen color wash driven by `AlertSynth` state via `updateAlertState()`. | all |
| **Camera Wobble** | `cameraWobble` in `update()` | Slow sway of the projection center, so the canvas never feels locked to the frame. | canvas universes |
| **Viewport Vibration** | `updateViewportVibration()` | Short high-frequency shake driven by bass energy and warp pulses. | canvas universes |
| **Lighting Cycle** | `updateLightingCycle()` / `getLightingModifiers()` | A 25-minute ambient cycle that modulates overall brightness and tint — the slowest animation in the app. | canvas universes |
| **Waveform** | `renderWaveform()` | 30-bar HUD spectrum on its own small canvas, colored from the live `--primary-accent` CSS variable. | all |
| **Status Ticker** | `getTickerMessages()` / `updateStatusTicker()` | Scrolling HUD line, per-universe message sets. | all |
| **Cinematic Caption** | `queueCinematicAction('flash-status')` | Transient headline text driven by the cinematic director. | cinematic universes |
### Cinematic sequences
`updateCinematicDirector()` fires a timed multi-step sequence every 4575 s
initially, then 90180 s after each one completes.
| Sequence | Steps | Universes |
| --- | --- | --- |
| **First Contact** | comet → unknown vessel + emphasis flyby → hailing frequencies → warp flash | starfleet, deepspace, spacestations |
| **Hull Breach** | warp pulse + stress caption → red alert → damage control → stabilized + alert off | military, outlaw, industrial |
| **Temporal Anomaly** | flux detected → random warp flash → vortex stabilizing | whoniverse |
| **Bio Resonance** | resonant pulse → comet → dissipating | bioships |
| **Close Flyby** | one emphasized flyby (×1.6 scale, ×0.55 duration) | **every** universe |
Note that Hull Breach reaches into `AlertSynth` — a cinematic can change audio
state, and it restores it in its final step.
### Reusable CSS animation classes
Apply these to any SVG element instead of writing new keyframes:
| Class | Effect |
| --- | --- |
| `.obs-spin` | 18 s linear rotation |
| `.obs-spin-slow` | 42 s linear rotation |
| `.obs-spin-rev` | 28 s reverse rotation |
| `.obs-pulse` | 3.8 s ease-in-out scale pulse |
| `.obs-breathe` | 5.5 s ease-in-out soft swell |
| `.obs-flicker` | 8 s stepped flicker |
| `.obs-blink` | 3.5 s stepped blink |
| `.obs-dashflow` | flowing dash offset (20/12 dasharray, 7 s) |
All of them set `transform-box: fill-box` and a center origin where relevant.
A `prefers-reduced-motion` block collapses every animation inside
`.observation-overlay` to a single 1 ms iteration.
---
## Cross-cutting rules
**Coordinate systems — three of them, do not mix:**
1. **SVG stage space** — a fixed `viewBox="0 0 1600 900"` with
`preserveAspectRatio` slice behavior, so it lands like a CSS `cover`
background. All stage and sim-layer coordinates are in this space.
2. **Canvas normalized space** — deep-space objects store `nx` / `ny` as
screen fractions from the center and are projected each frame, so they
survive window resizes.
3. **Panorama azimuth/elevation** — station features store `a` (01 of a full
revolution) and `e` (elevation), projected through `stationProjectX/Y()`.
`getStationViewportRect()` reproduces the stage SVG's slice math so canvas
objects transit through the *actual* window opening rather than the full canvas.
**Session-seeded vs. per-frame.** The station panorama and the deep-space field
are generated **once per page load** in the constructor and retained for the
whole session — they survive entering and leaving Observation Mode, preset
switches and window resizes. Only a page reload rolls a new sky. Everything else
(traffic, events, shooting stars, constellations, transients) is spawned and
discarded continuously. Respect this contract: regenerating a seeded field
mid-session is a visible glitch, not a refresh.
**Placement clearance.** `placeAway()` in `regenerateDeepSpaceField()` biases new
objects away from already-placed ones, measuring in real pixels (converting
normalized offsets through canvas width/height, because a canvas is wider than
it is tall) and requiring clearance from **both** sides of a pair. The station
panorama does the equivalent with even bearing slots. Any new annotated object
must go through the same placement, or its callout will collide with another's.
**Activity gating.** Nearly every non-essential element carries a `minActivity`
threshold and is skipped when the observation activity slider sits below it.
This is how one scene serves both "calm ambient wallpaper" and "busy bridge".
Give every new element a threshold; 0.05 for things that should almost always be
present, 0.5+ for things that should feel like a rare event.
---
## Reuse or invent
**Reuse** when the need is structural rather than thematic. The three SVG motion
builders, `drawComputerCallout()`, `obsContact()` / `obsExpandingRing()` /
`obsTextCard()`, the eight CSS animation classes, the existing eight vessel
types, and the dormant `renderNebulae()` layer all cover a wide range of needs
with no new code. Declaring an existing layer for another universe in
`OBSERVATION_CANVAS` is the cheapest possible addition — the drawing code
already runs.
**Invent** when a universe needs identity no existing element carries. Then:
1. Decide the path first — canvas or SVG — from the universe's
`OBSERVATION_CANVAS` entry. Putting a canvas element in a `canvas: false`
universe produces nothing at all.
2. For a canvas layer: add it to the manifest, add a `hasLayer()` guard in
`render()` at the right point in the draw order, and never assume a layer is
universal.
3. For an SVG entity: use one of the three builders, give it a `minActivity`,
and clip it if it belongs inside a framed area.
4. Seed anything expensive once and store it on the engine, following the
panorama / deep-space contract.
5. Add a `minActivity` threshold and, for annotated objects, route placement
through the clearance helper.
6. Prefer the existing CSS animation classes over new keyframes, and confirm the
result still reads correctly under `prefers-reduced-motion`.