|
| 1 | +# Notes |
| 2 | + |
| 3 | +Working notes for this repo: status, decisions, and the traps that have actually bitten. |
| 4 | +Migrated out of Claude Code's memory on 2026-08-24, so they are written in the first |
| 5 | +person and dated by when each thing was learned — that date is usually the useful part. |
| 6 | + |
| 7 | +Cross-cutting notes that are not specific to this repo live in |
| 8 | +[fleet-notes](https://github.com/stoatworks-labs/fleet-notes). |
| 9 | + |
| 10 | +*old-cathode — analogue TV signal path + CRT display as an FFGL effect for Resolume; PUBLIC MIT, verified via its own headless octest harness and since 2026-08-02 run in Resolume on real content* |
| 11 | + |
| 12 | +**old-cathode** (started 2026-08-01) — an **analogue television signal path**, not |
| 13 | +a CRT look, as an FFGL effect for Resolume Arena/Avenue. |
| 14 | +`~/Projects/old-cathode`, **PUBLIC MIT**, github.com/stoatworks-labs/old-cathode, |
| 15 | +v0.1.0, no release cut yet. |
| 16 | + |
| 17 | +**The design idea that governs everything:** it encodes to a colour subcarrier, |
| 18 | +damages the composite as one signal, and decodes with a synchronous demodulator. |
| 19 | +Dot crawl, cross-colour, chroma smear and coloured snow are **consequences, never |
| 20 | +drawn**. If tempted to add one directly, the chain is wrong somewhere instead. |
| 21 | + |
| 22 | +**Signal stages run at the SD raster (754×486 NTSC / 921×576 PAL) regardless of |
| 23 | +composition size.** Authentic *and* load-bearing: artefacts stay |
| 24 | +resolution-independent, and 4K costs only 2.4× 1080p (0.83 vs 0.34 ms/frame, M4 |
| 25 | +Max only, never CI). 754 = **4× subcarrier**, which is what makes the decoder's |
| 26 | +chroma notch a plain three-tap average — two samples apart is exactly 180° of |
| 27 | +carrier. Move off 4fsc and the notch stops working. |
| 28 | + |
| 29 | +**Verified only by `tools/octest`** — a headless CGL 4.1-core harness that drives |
| 30 | +the real plugin class through the real FFGL sequence to a PNG. Deterministic |
| 31 | +(time from the frame counter). Level survives the round trip (0.502 in/out); mask |
| 32 | +gains land within ~1%; **PAL delay line holds hue at 0.0° under a 16.8° decoder |
| 33 | +phase error that shifts NTSC 6–26°**. **Run in Resolume on real content** as of |
| 34 | +2026-08-02 (Allan's own report), so the old "never loaded into Resolume" is |
| 35 | +retired along with the param-group/host-texture/premultiplication caveat. |
| 36 | + |
| 37 | +`tools/sweep.py` renders every param at both ends and fails if any made no |
| 38 | +difference. **A GLSL uniform name that doesn't match the C++ is silently ignored** |
| 39 | +— `glGetUniformLocation` returns -1, `glUniform(-1)` is a documented no-op — so a |
| 40 | +control can be stone dead while everything compiles, links and renders. Nothing |
| 41 | +else catches it; worth copying to any shader repo in the fleet. All 33 pass. |
| 42 | + |
| 43 | +Traps live in the repo's AGENTS.md — see [agents md convention](https://github.com/stoatworks-labs/fleet-notes/blob/main/notes/reference_agents_md_convention.md). The |
| 44 | +sharp ones: **`flat` and `active` are GLSL reserved words** (fails at runtime as |
| 45 | +"effect does nothing"); mask gains are **measured with `octest --flat 0.05 |
| 46 | +--measure`, never derived** (edge shaping and AA eat the duty cycle); the |
| 47 | +scanline/mask `fwidth` fade thresholds must keep **486 lines into 1080 = 2.2 |
| 48 | +px/line** on the full-strength side; and the tube pass **overscans** (curvature |
| 49 | +divided through by its corner expansion) because otherwise barrel distortion |
| 50 | +pulls the picture's own corners inside the glass and Corner Radius does nothing. |
| 51 | + |
| 52 | +**Resolume Arena IS installed on this Mac** (`/Applications/Resolume Arena`, |
| 53 | +plugins in `~/Documents/Resolume Arena/Extra Effects`, where `cmake --install` |
| 54 | +puts it and where LumaKey already lives). So "can't test it here" is false — and |
| 55 | +as of 2026-08-02 it has been driven through the host. What stays true is that |
| 56 | +driving that GUI *from a session* is unreliable per |
| 57 | +**screenshot capture** (working-practice note, kept in Claude memory), so host verification comes from Allan running |
| 58 | +it, not from an agent. |
| 59 | + |
| 60 | +Related: [resolume luma keyer](https://github.com/stoatworks-labs/resolume-luma-keyer/blob/main/docs/NOTES.md) (`resolume-luma-keyer`) (the FFGL submodule + CMake MODULE |
| 61 | +pattern came from there), [resolume ofx bridge](https://github.com/stoatworks-labs/resolume-ofx-bridge/blob/main/docs/NOTES.md) (`resolume-ofx-bridge`), |
| 62 | +[ffgl sdk bugs](https://github.com/stoatworks-labs/fleet-notes/blob/main/notes/reference_ffgl_sdk_bugs.md), **disclaimer scope** (working-practice note, kept in Claude memory) (AI disclaimer |
| 63 | +applies). |
0 commit comments