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:
co-authored by
Claude Haiku 4.5
parent
d04016850c
commit
97b0faa4a6
@@ -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.
|
||||
+2333
-2258
File diff suppressed because it is too large
Load Diff
@@ -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 14–22 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. | Low–Medium |
|
||||
| 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 "machine–insect 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' 34–58 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. | Medium–High |
|
||||
| 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. | Medium–High |
|
||||
| 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.
|
||||
@@ -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 1200–2000 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 14–22 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 420–620 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 450–700 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 2–12 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.18–0.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
|
||||
(45–75 s for the first sequence, 90–180 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 305–365.
|
||||
|
||||
---
|
||||
|
||||
## 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.
|
||||
@@ -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()` | 2–4 per session from 6 distinct world palettes (gas giant, ice world, ion-storm giant, seismic rocky, biosignature rocky, frozen dormant). 50% chance of rings, 0–2 moons each, independent slow drift. | `deepspace` |
|
||||
| **Nebula Cloud** | `renderDeepSpaceField()` | 3–5 soft morphing blobs, radius 220–620 px, alpha 0.035–0.09, each with its own drift, pulse and morph seed. | `deepspace` |
|
||||
| **Dust Lane** | `renderDeepSpaceField()` | 4–7 thin angled streaks, 260–620 px long, for texture distinct from the soft blobs. | `deepspace` |
|
||||
| **Derelict Silhouette** | `renderDeepSpaceField()` | 70% chance of 1–2 segmented megastructure hulks with a blinking beacon and a `DERELICT // NO SIGNAL` callout. | `deepspace` |
|
||||
| **Anomaly** | `renderDeepSpaceField()` | 1–2 per session, kind `lensing` or `radiation`, each gated behind its own random `minActivity` threshold of 0.15–0.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** | 3–5 patches, own palette, slow pulse. |
|
||||
| **Panorama Planet** | 1–2 bodies, banded, 45% rings, 0–2 moons, own light angle. |
|
||||
| **Distant Sun** | One, small radius, warm or cool tint. |
|
||||
| **Sister Station** | 1–2 far-off structures with optional ring and blinking beacons. |
|
||||
| **Asteroid Cluster** | 9–18 procedurally faceted rocks (5–8 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 12–26 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 25–75% jitter.
|
||||
|
||||
Above activity 0.55 (telemetry) and 0.82 (any source) a second and third
|
||||
concurrent effect can spawn, staggered 120–380 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 45–75 s
|
||||
initially, then 90–180 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` (0–1 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`.
|
||||
Reference in New Issue
Block a user