Summary
Temporal-domain analogue of RFC-012's Aetherizer audio bus. Operates between renderer output and encoder input, providing two orthogonal granular controls — `frame_hold` (Ikeda stroboscopic cadence) and `interp_factor` (Viola time dilation via optical-flow interpolation). The most speculative RFC of the arc — ships with honest retirement contingency if no recipe adopts it within six months.
RFC
RFC-021 — Granular frame processing
Scope
- New top-level `granular:` block
- `frame_hold: 0..3` — Ikeda primitive. Each rendered frame held N+1 times in output. `frame_hold: 2` produces ~15 visible transitions per second at 30fps export — the Ikeda cadence.
- `interp_factor: 1..40×` — Viola primitive. M-1 intermediate frames synthesised between each rendered pair. `interp_factor: 20` produces continuous Viola-style time-dilation.
- `interp_engine: classical | rife`
- `classical` (default, ships): OpenCV Farnebäck dense optical flow. Self-hostable, deterministic, no model weights.
- `rife` (opt-in extension): Real-time Intermediate Flow Estimation neural interpolation. Requires separate model install at `~/.config/oceancanvas/models/rife/`. Higher quality at cost of self-host friction.
- `audio_sync: real_time | stretch | hold` with explicit semantics:
- `real_time` (default) — audio plays at recipe fps; granular only affects visual
- `stretch` — pitch-preserving audio time-stretch to match visual; expensive
- `hold` — audio holds in sync with `frame_hold` steps; novelty
- Speculative effects schema reservation: `datamosh` / `pixel_sort` / `slit_scan` declared in schema as opt-in, not implemented at v1. Reserves naming for future RFC revision.
- Cross-validated TS ↔ Py at perceptual tolerance (matches RFC-019). Classical optical flow is OpenCV-version-deterministic; CI pins version.
Dependencies
- RFC-019 + RFC-020 must be in place — granular operations sit between renderer output (which is layered + post-FX'd) and encoder input
Closure conditions (more conservative than other RFCs)
Closes only when at least one `minimalist`-identity recipe demonstrably uses `frame_hold ≥ 1` AND at least one `meditative`-identity recipe demonstrably uses `interp_factor ≥ 4` with the classical engine. If neither condition is met within six months of landing, the RFC retires honestly — the schema reservation is removed and the `granular:` block is dropped from the parser.
Closes into
- ADR-048 — Granular frame primitive: `frame_hold` + `interp_factor` + temporal operations
Notable design calls
- Classical optical flow at v1, neural opt-in — preserves self-hostable constraint as default; users wanting RIFE quality install separately
- Real-time audio sync as default — cheapest, most intuitive; stretch / hold modes opt-in for specific aesthetics
- Honest retirement — the most candidly speculative RFC of the arc explicitly carries a retirement clause if unused. The aesthetic payoff is potentially large but unproven for ocean data.
Summary
Temporal-domain analogue of RFC-012's Aetherizer audio bus. Operates between renderer output and encoder input, providing two orthogonal granular controls — `frame_hold` (Ikeda stroboscopic cadence) and `interp_factor` (Viola time dilation via optical-flow interpolation). The most speculative RFC of the arc — ships with honest retirement contingency if no recipe adopts it within six months.
RFC
RFC-021 — Granular frame processing
Scope
Dependencies
Closure conditions (more conservative than other RFCs)
Closes only when at least one `minimalist`-identity recipe demonstrably uses `frame_hold ≥ 1` AND at least one `meditative`-identity recipe demonstrably uses `interp_factor ≥ 4` with the classical engine. If neither condition is met within six months of landing, the RFC retires honestly — the schema reservation is removed and the `granular:` block is dropped from the parser.
Closes into
Notable design calls