SIGNAL ANALYSIS: INT/002 — STATION
01 — CONCEPT
A number station intercept. Somewhere on the shortwave band, a coded transmission is broadcasting to an unknown recipient. You have tuned in. For approximately forty-two seconds you watch structure emerge from noise — digits freeze into groups, groups resolve into a message, and then the signal degrades and is lost. The next cycle, a different frequency, a different message. You are always too late and never quite sure what you witnessed.
Where INT/001 DRIFT explored organic flow — currents, turbulence, dissolution — STATION is its structural inverse. Rhythmic. Gridded. Cold War cryptographic. The noise here is not Perlin; it is the static between stations, the random digits of a one-time pad. Structure does not emerge gradually — it snaps into place, holds for a transmission window, then collapses. The atmosphere is not natural but institutional: someone built this signal, and someone else is trying to read it.
02 — TECHNIQUE
No simplex noise. STATION uses a seeded PRNG (mulberry32) for cycle reproducibility — each seed determines which message is selected and what digit sequences fill the transmission groups. A separate fast PRNG drives per-frame randomness for the scanning noise floor. The result is pure randomness shaped by phase logic, not spatial coherence. Every cell is independent. Structure comes from the code, not the noise.
The grid is populated exclusively with numeric digits (0–9) during most phases. During the decode phase, cells in the message zone spin through the full printable ASCII range (charCodes 33–126) before settling on the decoded character — a visual echo of a cipher machine cycling through possibilities. Decoded messages use uppercase Latin characters, numerals, and directional symbols (N, S, E, W for coordinates).
The key rendering challenge: making structured groups visible against a dense numeric background without sacrificing atmosphere. Global approaches (sparse backgrounds, uniform dimming) all destroyed the noise field that gives the piece its character. The solution is localised colour separation — a radial gradient around each revealed group.
When a transmission group appears, the Euclidean distance from every background cell to the nearest group center is computed. A six-step gradient maps distance to colour: cells within one unit of a group render near-invisible, graduating back to normal noise brightness at five units. The result is a localised clearing that forms around each group — like radio interference pushing the static aside. The dense noise field remains everywhere the signal is not.
████ ████ ████ ████ ████
cleared gradient noise groups decoded
Same colour-batched canvas rendering as INT/001. Cells are grouped by colour, fillStyle is set once per colour per frame, then all cells of that colour are drawn in a single pass. Canvas state changes stay in the single digits per frame regardless of grid density.
03 — CYCLE BEHAVIOUR
Each cycle runs approximately 42 seconds and transitions through six phases. A new seed is generated per cycle, selecting a fresh message and digit sequences. The phase system is driven by elapsed time — no external triggers, no interaction. You are an observer intercepting a broadcast that does not know you are listening.
04 — ITERATIONS
Initial implementation rendered every cell at standard palette intensity across all phases. Transmission groups were present but visually invisible — the signal drowned in its own noise floor. The grid read as a uniform wall of equally-bright digits. However, this version had the strongest atmospheric quality — the density and uniform colour created a convincing impression of shortwave static. Something important was happening, even if you could not quite see what.
Attempted contrast by culling ~82% of background cells during transmission and decode. Bounding box blanking created structural gaps between groups. Groups became clearly visible against near-empty space, but the atmospheric density that defined the scanning phase was gone. The grid felt hollow. The sparse approach treated the noise as something to remove. It is not.
Full cell density restored. Background cells dimmed to near-background palette tones (surfaceRaised, border). A blanked bounding box around the transmission zone created clear structural separation. Groups were readable but the blank rectangle carved a visible hole in the noise field — the piece felt divided into zones rather than unified.
Removed bounding box blanking. Noise flows right up to groups, contrast is colour-only. Better than v3 — the field feels continuous. But the aggressive dimming of background cells changed the character of the piece. The dark noise floor made the grid feel empty despite being full. The transition from bright scanning to dim transmission was too sharp a tonal shift. Returned to v1 as baseline.
The breakthrough. Instead of dimming the entire background, only the noisenearest each revealed group fades toward the background colour. A six-step gradient radiates outward from each group center — near-invisible at 0–1 cells, graduating back to normal noise brightness at 5+ cells. The effect resembles a radio interference pattern: localised clearings form around each group while the dense noise field remains everywhere else. Full atmospheric density is preserved; the signal creates its own space.
After the decode sweep completes, the message blinks at 500ms intervals — alternating between the decoded text in accent orange and the original encoded digits in primary text colour. The flicker between decoded and encoded states mirrors the uncertainty of an intercepted transmission: you are never quite sure which version is real.
GRADIENT (distance from group center) 0–1 cells ···· #252019 near-invisible 1–2 cells ···· #2D2720 very dark 2–3 cells ···· #3A3228 dark 3–4 cells ···· #4D4438 medium-dark 4–5 cells ···· #6A6050 approaching subtle 5+ cells ····· textSubtle normal noise
05 — CURRENT PARAMETERS
GRID cell_width ········· 14px cell_height ········ 20px font_size ·········· 14px chrome_rows ········ 2 (status line) TIMING digit_change ······· 80ms (~12 changes/sec) scanning ··········· 6,000ms lock ··············· 5,000ms transmission ······· 12,000ms decode ············· 8,000ms corruption ········· 6,000ms lost ··············· 5,000ms total_cycle ········ ~42s TRANSMISSION FORMAT group_size ········· 5 digits group_gap ·········· 1 cell row_gap ············ 1 row layout ············· centered block, computed per message MESSAGE POOL (16 messages) coordinates ········ 6 (Berlin, Bletchley Park, UVB-76, Leningrad, DC, Munich) designations ······· 5 (ECHO 7, CARDINAL, NIGHTWATCH, FULCRUM, OPUS 3) phrases ············ 5 (THE WATER REMEMBERS, ALL SIGNALS ARE FINAL, ...) RADIAL GRADIENT steps ·············· 6 (near-invisible → normal noise) inner_radius ······· 0–1 cells (#252019) outer_radius ······· 5+ cells (textSubtle) computation ········ Euclidean distance to nearest group center blink_interval ····· 500ms (decoded ↔ encoded) CHROME status_line ········ phase indicator + progress bar frequency ·········· 4625.00 kHz (UVB-76 "Buzzer" frequency) scanning_freq ······ -----.-- kHz (no lock) AUDIO (Tone.js) static ············· bandpass-filtered white noise + AM modulation carrier ············ sine oscillator, phase-synchronised beep_markers ······· per-group during transmission decode_pitch ······· carrier frequency rises during decode corruption ········· chaotic modulation lost ··············· silence
06 — AUDIO
STATION is the first piece in the INT Series with audio. The shortwave radio atmosphere is constructed in Tone.js and synchronised to the phase cycle. Audio is muted by default — the piece works as a purely visual experience. Unmuting adds a layer that transforms the grid from abstract pattern into intercepted broadcast.
07 — DEPENDENCIES
tone ············ shortwave audio synthesis (Tone.js) mulberry32 ······ seeded PRNG for reproducible cycles (inline) canvas 2d ······· browser-native rendering geist mono ······ monospace typeface