Vectrix
Vector CRT synth for Resolume

What it does
A function generator makes a two-channel signal. That signal goes through fourteen guitar and eurorack effects — a gate, a compressor, a wavefolder, a ring modulator, a phaser, a delay, a reverb — and what comes out the far end drives the horizontal and vertical deflection of an oscilloscope. It came out of a series by Ms Mad Lemon, who does the same thing with 555 timers, LM358 op-amps and the deflection yoke of a CRT television.
One idea runs through the whole plugin: it models a route, not a look. The clearest place to see that is the brightness. A beam deposits light at a constant rate while it is switched on, so where it moves fast it spreads that light thinly and the trace is dim, and where it turns around it lingers and the trace blooms — which is why a square drawn by an oscilloscope has bright corners and a square drawn by a computer does not. So the renderer never calculates that. It deposits a fixed quantum of energy per sample interval and spreads it over the distance the beam actually covered, and the brightness falls out of the arithmetic, with the right behaviour at both extremes and no limits anywhere.
Everything else follows the same rule. The delay's repeats get rounder each time because its feedback path is filtered, and a filtered deflection signal has softer corners. The gate darkens the trace without moving it, because a grid voltage cuts beam current without touching the yoke. Sample and hold draws lines between its steps, because the beam travels rather than teleporting. Point two sawtooths at it and blank the flyback and you get a clean raster — not because anything declined to draw the flyback line, but because the beam is genuinely switched off during it.
The phaser is the one worth understanding. On one axis only, it shifts each frequency component of the horizontal deflection by a different amount, so a sine figure rotates and a complex one shears. That is not an affine transform, so no shader can produce it — which is why the whole signal chain runs on the CPU at 96 kHz rather than in a fragment program.
Also available as an OpenFX plugin for DaVinci Resolve, Vegas Pro, Nuke and Natron, sharing the same signal engine. The OpenFX build renders on the CPU, because OpenFX hands a plugin no GL context.
- Five sources: two oscillators with the X:Y ratio locked to exact rationals so a Lissajous figure stands still, parametric shapes, a 3D wireframe including a scrolling landscape with hidden-line removal, the traced edges of the clip below, and audio files
- Audio file playback drives the beam directly — left channel to X, right to Y — which is how oscilloscope music works, in WAV, AIFF, MP3, FLAC, Ogg and Opus
- Fourteen effects in a fixed pedalboard order, each able to process both axes, one axis, or the mid/side pair — and an effect applied to one deflection axis and not the other is a geometric transform of the figure rather than a filter
- Phosphors are a measured table rather than a tint: P31, P1, P2, P7, P11 and P39, with two layers and real energy transfer, so P7's long trail is a different colour from its blue strike
- A round lab scope and a rectangular vector monitor from the same renderer — face aspect, corner radius and deflection gain span both
- Fifteen factory presets, each a whole signal path rather than a set of slider positions
- The face buffer is sized by the beam's spot rather than by the output, so 4K costs about two and a half times 1080p rather than four
- Universal macOS bundle, a Windows x64 DLL, and an OpenFX bundle for macOS, Windows and Linux
Where it stands
Built, measured and released as v0.1.9; the point release changed nothing but the Windows installer, which no longer touches the system PATH — the earlier one could overwrite it. The plugin's central claim — that brightness follows dwell time — is measured rather than asserted: an offline harness renders one sweep at ten speeds spanning a hundred to one and the total light deposited varies by 0.0103 per cent, and a decelerating segment's line density regresses against one-over-velocity at r-squared 0.99999. The effect build at zero beam is bit-identical to its input, a blanked span deposits exactly zero, ten simulated minutes of phase accumulation stays accurate to three parts in a hundred million, and all 152 controls are swept and shown to change the picture. Twenty-one checks run from a clean universal build. That testing found five real defects during development, including two controls that were technically alive and practically useless — the halation pair moved 124 subpixels of a two-megapixel frame by one part in 255, because the bright pass kept a threshold a moving trace never reaches. Both plugins have since been loaded and run in Resolume Arena, on macOS and on Windows. Running the Windows binary in a real host is what found the one defect every offline check missed: an array walked for a null terminator it never had, which macOS's linker made harmless by luck and MSVC turned into a crash during Resolume's plugin scan — before a frame, before any log was written, taking Arena down on every start. Fixed in v0.1.5, and reproduced on two very different machines before it was. Still open: whether Arena's input is genuinely premultiplied, and how the Trace source's pixel readback inside a render call behaves for frame rate in a real host.
Watch it running
Nothing loads from YouTube until you press play.Watch it there instead