Log inGet started
World

The Eighth Ketyl

Branchmain
Branchesmain
Commite99ff0a216

README.md

audio.Script

Every word The Eighth Ketyl says, written down. Sixteen lines, two speakers, and the ids the design spec fixes so staging can cue a line today and the sound slice can voice it separately.

local Script = require("audio.Script")
Script.text("v_seal_2")     -- "Deep blue. Dry. Eight tries. Hello, ketyl eight."
Script.speaker("v_plate_5") -- "column"

The two speakers

THE CHEMIST is the woman running the still. She has lost seven ketyls and talks to this one the way you talk to something you expect to lose: dry, clinical, tired, and — by the head plate — invested despite herself. She is heard over a radio from outside the glass.

THE COLUMN is the still's own instrument readout. Flat, mechanical, states numbers. It is a machine and it sounds like one: its read is pitched down onto a machine's clock, ring-modulated onto a carrier, quantised to a readout's step ladder and cut to an intercom's band.

The lines

idspeakerwhen
v_open_1 v_open_2 v_open_3chemistthe opening, before control
v_plate_2 … v_plate_8columnarriving on that plate
v_clearchemista plate goes clean
v_lowcolumncharge critical
v_wetchemistwetness critical
v_quenchchemistthe loss
v_seal_1 v_seal_2chemistthe win

Why the words live here and not in the audio

Every spoken line ships with its written form on screen. It is how a line survives a failed generation, a muted player and a noisy room. If a clip is missing the game still says the line — it is captioned rather than lost.

API

  • get(id) → { id, speaker, text } or nil.
  • text(id) → the words, or "".
  • speaker(id) → "chemist" / "column" / "".
  • all() → every line in reading order.
  • ids() → every id in reading order.
  • duration(id) → how long the line takes to read aloud, as an estimate. audio.Clips.duration(id) is better — it measures the clip.