- Braille canvas: 2×4 dots per cell (4× resolution vs half-blocks)
- Shared palettes, effects, and audio between both renderers
- README with both demos and build instructions for each
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Custom terminal canvas: one buffer, one write() per frame
- Threaded audio via Nim channels (20fps → 60fps)
- 6 phosphor palettes (green, amber, cyan, blue, white, red)
- All tuning constants at top of osc.nim
- No illwill dependency, binary 352KB → 200KB
- CRT effects use same palette as trace
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Replaced avhelper.c with direct {.dynlib.} pragma imports
- Grid off by default
- Higher default gain and time zoom
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The packet layout is buf(8), pts(8), dts(8), data(8), size(4),
stream_index(4). We had buf, data, size, stream_index — reading
the pts timestamp as the data pointer, so every packet was garbage.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Loads libavformat + libavdevice at runtime — no dev packages, no
subprocess, no pipe buffering. Falls back gracefully to ffmpeg
subprocess then demo mode if .so files aren't present.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- CRT boot/shutdown animations (ported from AetherTune)
- Y-T (time-domain) and X-Y (Lissajous) display modes
- Phosphor persistence with bloom and decay
- Half-block rendering for 2x vertical resolution
- Live audio capture via ffmpeg/PulseAudio monitor
- Gain and time/div controls, grid toggle, freeze
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>