Stoatworks Labs

Old Cathode

The whole analogue TV signal path, for Resolume

Field provenv1.0.8Plugin & ModuleC++ / GLSL
Old Cathode — The whole analogue TV signal path, for Resolume
Rendered by the plugin's own offline harness, which drives the real plugin class through a headless GL context — not a Resolume screen capture.

What it does

An analogue television signal path for Resolume Arena and Avenue. It encodes the picture onto a colour subcarrier the way a broadcast encoder would have, damages the composite waveform as one signal, and decodes it again with a synchronous demodulator that knows no more than a real receiver did. Only then does it paint the result onto a phosphor screen with a shadow mask, a beam that goes soft when it's bright, a curved glass face, and a viewer sitting somewhere in particular.

Nearly everything you'd call the CRT look comes out of that path rather than being drawn on top. Dot crawl happens because the subcarrier sits inside the luminance band. Cross-colour happens because fine detail near that frequency gets demodulated as if it were colour (which is why presenters were told to leave the fine stripes at home). Noise added to the composite gets un-mixed by the decoder along with everything else, so it turns up as grey grain and coloured speckle in the right proportions without anyone asking it to.

In practice the controls interact the way the real thing's did. Dropping the chroma bandwidth smears colour sideways and cuts the cross-colour, because in the hardware those were the same filter. Losing signal costs you the colour before it costs you the picture. Switching from NTSC to PAL changes what the Tint control does, because a PAL decoder averages each line with the one above and a phase error cancels out.

There's also an OpenFX plugin for DaVinci Resolve, Vegas Pro, Nuke and Natron: the same signal path mirrored on the CPU, constant for constant, with the subcarrier phase walk driven by the timeline frame number, so any frame renders the same however the host gets to it.

  • Four dot mask patterns — delta shadow mask, aperture grille with its damper wires, slot mask, and a hard RGB stripe
  • NTSC or PAL, from broadcast or three grades of VHS, each with its own bandwidths and colour-under delay
  • Noise, dropouts, multipath ghosting and adjacent-channel interference, all injected before the decoder rather than painted on after it
  • Tracking error, head-switch tear, line jitter, mains hum, vertical hold and interlace
  • A scanning beam that gets fatter where it is brighter, phosphor persistence with per-colour decay, and halation through the glass
  • Screen curvature with overscan, rounded tube corners, true perspective and vignette — the mask lives on the glass, so it foreshortens with the tube
  • Universal macOS bundle, a Windows DLL, and an OpenFX bundle for macOS, Windows and Linux

Where it stands

Released at v1.0.8, on the 1.0 line. The OpenFX build for Resolve, Vegas, Nuke and Natron arrived in v0.2.0. Since then it's been dependency and CI upkeep, plus v1.0.5's Windows installer, which no longer touches the system PATH (the earlier one could overwrite it), v1.0.6's proper description in the field Resolume shows for it, v1.0.7's SW in front of its name there, and v1.0.8's fix for Resolve's Fusion page, where every OpenFX render used to fail. It needs Resolume Arena or Avenue 7.3.1 or newer. It loads in Arena 7.27.0 with all six shader stages compiling in the host, and it's been run there on real content, not just through the offline harness. The OpenFX build has run in one real host, Resolve Studio 21.1's Fusion page.

Watch it running

Old Cathode video thumbnail

Nothing loads from YouTube until you press play.Watch it there instead