Ferric
Wow, flutter and tape noise reduction for Resolume

What it does
Ferric treats the video signal the way a cassette deck treats an audio one. A transport that is never quite steady drags the picture past the head so it leans, waves and tears in time; the oxide adds its own hiss and loses contact here and there; and the consumer sliding-band noise reduction that hid one under the other is in there too, with both ends of it exposed — which is where the interesting damage lives.
The first of the two ideas holding it up is that wow and flutter is a timing error, and a picture read off tape is a signal with a clock. Every pixel is given a tape time — how far into the recording the head was when that pixel came off the oxide — and one scalar error signal is evaluated there. Nothing else. Wow is slower than a picture, so the whole frame leans; flutter fits a cycle or two into a picture, so it draws a wave down the image, and that wave scrolls between frames because the clock moved. Scrape flutter fits many cycles in and becomes fine horizontal banding. Lines stretch rather than merely shifting, because tape time varies along the line as well as down the picture. None of that is coded separately; it is what one substitution does.
The second is that noise reduction is a round trip through a medium rather than a filter. Encoding boosts quiet high-frequency detail before the tape so the tape's own noise floor sits underneath it, and decoding cuts it by the same amount afterwards, taking the hiss down with it. Nothing is removed. So the chain here is the real chain in the real order — encode, tape, decode — and every artifact anybody recognises about the format is the two ends disagreeing. Decode something that was never encoded and it goes dull and starts breathing. Encode with nothing decoding and it goes hard and glassy. Mistrack the levels and the round trip cancels at some brightnesses and not others, so detail pumps as the shot changes: a tape recorded on one deck and played back on another.
The processing is one-dimensional and horizontal, because tape has one frequency axis and it lands on the picture as the scan direction. A vertical edge is a high frequency to a tape machine; a horizontal edge is not a frequency at all, it is the next line. So vertical edges pump under the compander and horizontal ones sit perfectly still — measured at 9.996 against 0.000 — and that asymmetry is the effect rather than a shortcut.
There is one honest fiction, and it is exposed as a control rather than hidden. A real 625-line picture scans at 15625 lines per second, and at that rate audio-band flutter is a constant across the whole frame: no vertical structure, no travelling wave, no tearing at all. Audio wow and flutter and video time-base error are not the same phenomenon. So Ferric does what it says instead — it runs a picture through a cassette transport, and a cassette transport does not scan at 15625 lines a second. Tape Speed spans about two milliseconds of tape per picture, where the frame is rigid and only wow survives, to about two seconds, where a single flutter cycle covers a few scanlines and the image comes apart into ribbons.
- Wow, flutter, scrape flutter and a slow drift, evaluated as one time-base error at each pixel's own tape time — so the flutter wave scrolls down the picture between frames rather than standing still
- Four transports — Cassette, Reel to Reel, Video Head and Failing — which multiply your controls rather than replacing them, and set which components dominate
- Tape Speed, from a rigid frame to the picture coming apart into ribbons, because it decides how much of the error signal fits inside one picture
- Hiss generated along the scan so it reads as horizontal video grain rather than film speckle, plus dropouts and head wear
- Type B and Type C sliding-band noise reduction as a full round trip — encode, tape, decode — with Decode Only, Encode Only and a Mistracking control for the artifacts the real systems are known for
- A beat that puts a sharp excursion straight into the error signal, so the transport lurches on the grid instead of merely modulating; plus level and band drives, every one off by default
- Show Trace: the error signal plotted against position down the picture, with audio meters and a seven-segment readout of weighted wow and flutter measured through a DIN 45507 curve
- Nine factory presets, seven of which leave every reactive depth at zero so they behave with nothing routed
Where it stands
Built, measured and released as v0.1.1; the point release changed nothing but the Windows installer, which no longer touches the system PATH — the earlier one could overwrite it. Twenty-three checks pass from a clean universal build. The GLSL error signal exists twice — in C++ and in GLSL — and an offline harness renders it through a probe shader assembled from the same strings the plugin uses, then compares what the GPU wrote against the C++ over 6400 points: worst disagreement 1.9e-05, with a control case comparing against a deliberately detuned transport that must fail. A neutral Ferric returns the picture bit-exactly; encode into decode cancels to 1.31 rms; the compander moves vertical detail by 9.996 rms and horizontal detail by 0.000; and a milliseconds host and a seconds host render identical frames. It has been loaded and rendered in Resolume Arena 7.27.1 on macOS and on Windows, the latter on Mesa llvmpipe — a different GLSL compiler, which is the point of doing it. Still open: no operator has dragged a slider, since every control was driven over Resolume's REST API; no NVIDIA or AMD driver has run it; there is no OpenFX build; and none of it has been through a show.
Watch it running
Nothing loads from YouTube until you press play.Watch it there instead