close ×
System
Parameters
How playback is determined, degraded, and constructed from accumulated state.
Memory Weight Calculation
weight = min(
(visits / 15) × 0.30
+ (listenSec / 3600) × 0.50
+ (interactions / 80) × 0.20
, 1.0)
visits
Increments on each page load. Contributes 30% of maximum weight over 15 visits.
listenSec
Accumulated seconds of active playback. Full weight contribution at 1 hour total listening time.
interactions
Scrubs, track changes, B-side control adjustments. 80 interactions saturates this component.
Track Degradation Factor
trackDeg(i) = min(weight + (i / 5) × 0.12, 1.0)
Each track carries a base degradation equal to the memory weight, offset by its position in the sequence. Track 06 accumulates an additional 0.12 degradation penalty over track 01 regardless of weight. Later tracks always sound more worn.
A-Side: Answering Machine Signal Chain
The audio signal is processed through a vintage telephone / answering machine emulation built in Web Audio API. The chain runs: source → pre-distortion gain → telephone bandpass (300–3400Hz) → harmonic saturation → tape wobble (LFO on playback rate) → noise floor injection → output.
bandpass
300Hz high-pass, 3400Hz low-pass — the exact bandwidth of analog telephone circuits. Eliminates all sub-bass and high-frequency content.
saturation
WaveShaper with a soft-clip curve applied pre-output. Introduces odd harmonics that simulate magnetic tape head saturation and analog line compression.
wobble LFO
Low-frequency oscillator modulates playbackRate ±0.004–0.018 at 0.3–0.8Hz. Depth and rate increase with trackDeg — higher memory weight = more wow and flutter.
noise floor
White noise buffer mixed at 0.002–0.04 amplitude depending on degradation. Simulates analog tape hiss and electrostatic interference.
A-Side: Stutter and Reverse Engine
Memory weight determines the probability and character of glitch events applied to the buffer in real time. All stutter operations work on the decoded PCM buffer, not on the audio output stream — slices are scheduled as new BufferSource nodes.
stutter probability
Base probability per second: weight × 0.4 × browser memory pressure coefficient. At full weight, approximately 40% chance of a stutter event per second under normal memory conditions.
stutter types
Three modes weighted by degradation: (1) micro-repeat — 0.06–0.22s slice looped 2–5× ; (2) reverse fragment — 0.08–0.35s slice played backwards inline; (3) dropout — 0.04–0.12s silence injected mid-signal.
memory pressure
Browser memory usage is polled via performance.memory (where available). jsHeapSizeLimit usage above 60% multiplies stutter probability. Above 85%, reverse events are introduced regardless of weight. This makes the system respond to the actual computational state of the device.
reverse slices
A reversed copy of the buffer is created on load by iterating the Float32Array in reverse for each channel. Reverse fragments are spliced in at scheduled times using AudioContext.currentTime offsets, creating a seamless stitch back to forward playback.
B-Side: Slice Sequencer
Each source track strip is divided into 8 equal-duration slices based on the actual decoded buffer length. Slices can be dragged to any of 6 slots in the construction bar. Playback iterates through occupied slots sequentially, loading the corresponding buffer segment using AudioBufferSourceNode with start offset and duration parameters.
slice duration
buf.duration / 8 — equal divisions of the real decoded audio length. Slice 0 is always the track opening; slice 7 always the close.
construction bar
Accepts any of 48 available slices (8 × 6 tracks). Mixed-track sequences create splice discontinuities audible as hard cuts. This is intentional — the construction bar is a record of decisions, not a smooth mix.
loop
Construction sequence loops continuously until stopped. Each loop increments the interaction counter, contributing to memory weight accumulation.
Persistence
All state is written to localStorage under key 180g011_mem. There is no expiry. B-side construction state is not persisted — only the memory weight components and highest completed track are stored across sessions.