Stoatworks Labs

Vectrix

An oscilloscope with a pedalboard, for Resolume

Stablev0.1.12Plugin & ModuleC++ / GLSL
Vectrix — An oscilloscope with a pedalboard, for Resolume
Rendered by the plugin's own offline harness in a headless GL context — not a Resolume screen capture. Real frames through the real shipped plugin class.

What it does

A function generator makes a two-channel signal. That signal goes through fourteen guitar and eurorack effects, among them a gate, a compressor, a wavefolder, a ring modulator, a phaser, a delay and a reverb, and whatever 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 the path the beam takes and lets the look follow. Brightness is the clearest place to see that. A beam deposits light at a steady rate while it's switched on, so where it moves fast it spreads that light thinly and the trace is dim, and where it turns round it lingers and the trace blooms. That's why a square drawn by an oscilloscope has bright corners and a square drawn by a computer doesn't. So the renderer never works brightness out at all. It deposits a fixed quantum of energy per sample interval and spreads it over the distance the beam actually covered, and the brightness comes out of the arithmetic, behaving properly at both extremes with 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, because the beam is switched off for the flyback; nothing has been told to skip drawing 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 isn't 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.

There's an OpenFX version for DaVinci Resolve, Vegas Pro, Nuke and Natron too, sharing the same signal engine. It renders on the CPU, because OpenFX doesn't hand a plugin a 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.12. v0.1.10 checks every control name and display against FFGL's sixteen characters, and v0.1.11 put SW in front of both names in Resolume's browser. v0.1.12 is the one to have if you use the OpenFX build: from v0.1.6 to v0.1.11 both plugins crashed the first time any OpenFX host asked them for a frame. v0.1.12 fixes that and also makes them work on Resolve's Fusion page, where they render as tools (Resolve Studio 21.1, macOS). The Resolume build was never affected. The plugin's central claim, that brightness follows dwell time, is measured: 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 slowing segment's line density fits one-over-velocity at r-squared 0.99999. The effect build at zero beam is bit-identical to its input, a blanked span deposits nothing at all, 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-three 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 was drawn or a log written, taking Arena down on every start. That was fixed in v0.1.5, and reproduced on two very different machines before it was. Still open: whether Arena's input really is premultiplied, and what the Trace source's pixel readback inside a render call does to frame rate in a real host. The OpenFX build hasn't been tried on Resolve's other pages or in Vegas, Nuke or Natron, and its Windows and Linux builds have never rendered in a host.

Watch it running

Vectrix video thumbnail

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