Week of 2026-05-15 — Membrane Framework lineage-program pipeline + January Almanac program

Started 2026-05-15 · shipped

The first Almanac monthly program is shipped, and the production-grade pipeline that produced it is shipped alongside. This workshop entry documents both — the Membrane Framework integration into AETHER, and the Rockefeller / January narration as the proof-of-concept that exercises the full pipeline.

The Edition I Phonograph audio (/canon/audio/edition-i-phonograph- object-lesson) was produced by a 110-line bash harness around piper, sox, and ffmpeg. The harness worked, but as a one-shot shell script it had no supervisor, no per-stage observability, no re-runnable cache, no event surface that the AETHER dashboard at localhost:4000 could subscribe to, and no shape that would gracefully extend to the 11 remaining Almanac monthly programs that need to ship across the coming year. The shell harness was the right call for the first ship — it was simple, debuggable, and proved the audio pipeline shape — but it was not the right substrate for the eleven-program-and-counting cadence that the Almanac and the subsequent Edition audio components require.

This workshop entry covers the Membrane integration that replaces it.

What landed

a Membrane-element-shaped DAG:

a chapter-aware TTS source. Splits the input markdown on # Chapter N — Title headings, synthesizes each chapter to disk via Piper, returns a {number, title, wav_path} manifest.

bed. Two recipes: :pink_reverb (Edition I Phonograph default) and :rumble_machinery (Almanac January / Rockefeller default — brown noise plus filtered pink noise, suggesting a refinery floor's industrial rumble; no third-party audio assets).

configurable gain ratios. Defaults: narration 1.0, ambient 0.12 (≈ -18 dB), matching the Phonograph Object Lesson production- tested mix.

loudness to -16 LUFS (the podcast broadcast standard).

orchestrator. Composes the modules above into a complete production pipeline. Single public entry point: Aether.Audio.LineageProgram.run(script_path, output_opus_path).

Membrane.Pipeline that demonstrates the Membrane DAG model end-to-end: Membrane.File.Source → WavStripHeader → Membrane.FFmpeg.SWResample.Converter → Membrane.Opus.Encoder → Membrane.File.Sink. Used as the encoder-leg integration smoke test.

that strips the 44-byte WAV header from Membrane.File.Source output and emits the correctly-typed Membrane.RawAudio stream format downstream.

AETHER deps. Versions actually installed:

  {:membrane_core, "~> 1.0"},               # 1.3.1
  {:membrane_file_plugin, "~> 0.17"},       # 0.17.3
  {:membrane_raw_audio_format, "~> 0.12"},  # 0.12.1
  {:membrane_opus_plugin, "~> 0.20"},       # 0.20.7
  {:membrane_mp3_lame_plugin, "~> 0.18"},   # 0.18.5
  {:membrane_ffmpeg_swresample_plugin, "~> 0.20"}  # 0.20.5

— the January narration script. 5,107 words. Calibrated against Chernow's Titan, Nevins's Study in Power, Williamson and Daum's American Petroleum Industry, Yergin's The Prize, Rockefeller's dictated Random Reminiscences, and the Ohio Secretary of State records.

— the shipped audio artifacts. 22.66 MB opus, 25.38 MB mp3, 27 min 43 sec, integrated loudness -16.5 LUFS (target -16 LUFS).

architecture document.

Voice — en_US-libritts_r-medium

Same voice as the Phonograph Object Lesson. The voice's prosody at 185 wpm gives 5,107 words → 27.7 min, almost exactly the ratio that Edition I's Phonograph audio came in at.

Ambient bed — :rumble_machinery

For the Rockefeller program the recipe is :rumble_machinery rather than :pink_reverb. Brown noise contributes low-frequency rumble; subsequently-mixed pink noise contributes a suggested machinery hiss; heavier reverb suggests a large interior space (a refinery floor); a 60-800 Hz band-pass keeps the bed clear of the voice fundamental. The bed is mixed at -18 dB so the narration sits comfortably on top.

The two recipes (:pink_reverb and :rumble_machinery) establish the pattern for the remaining ten monthly programs: each program selects a recipe appropriate to its figure's environment.

Loudness normalization — -16 LUFS

This is the production upgrade that the shell harness did not have. The Rockefeller program is normalized to -16 LUFS integrated, -1.5 dBFS true peak, 11 LU range — the broadcast podcast standard.

The integrated loudness of the input mix was -17.1 LUFS; the loudnorm filter raised it to -16.5 LUFS in single-pass mode.

What's reusable across future monthly programs

The whole pipeline. The 11 remaining Almanac monthly programs require: a new narration script, an optional ambient recipe selection, and a new output basename + content page. No further Elixir code changes.

What's gated for the remaining 11 monthly programs

The pipeline is ready. Each remaining month is gated only on script-writing capacity. The full backlog (Feb-Dec, with figures, dates, and "script TODO" status) is enumerated in ~/aether/docs/membrane-lineage-pipeline.md §3.

Cross-references