Abomerration
Sound-reactive chromatic aberration for Resolume

What it does
Chromatic aberration is a lens failing to bring every wavelength to the same place. Photographers spent a century and a great deal of money getting rid of it. This puts it back, wires it to the music, and then keeps going well past anything glass could do.
One idea runs through the whole plugin, and it is the reason it does not look like the usual RGB-offset effect. A lens does not split a picture into three channels — it focuses every wavelength at a slightly different magnification, and the coloured fringe you see is the entire visible spectrum smeared along that path and then integrated by the sensor. So this displaces the picture once per wavelength sample and adds the results up through spectral weights. The familiar hard red/blue split is not a separate mode or a different code path: it is what the same loop does when you ask for three samples, because the three-sample weight table is the identity. That is why one control spans a cheap 1990s channel offset and a real prismatic fringe with nothing else changing.
Four geometries decide which way the spectrum is smeared. Radial is what a real uncorrected lens does — nothing on the axis, worst in the corners. Linear is a prism held in front of it, or a three-strip camera slipping out of registration, with no optical centre at all. Tangential rotates each wavelength about the centre instead of pushing it outward, which no lens does. Turbulent takes its direction from a drifting noise field, and is the abomination the plugin is named for.
The music drives it four ways, every one switched off by default — dropped on a layer with nothing routed this is an ordinary manual aberration lens and behaves like one. A beat pulse locks to the host's transport on any division from a quarter beat to two bars. An overall level pump follows the mix. A band split sends bass, mid and treble each to their own channel, so the picture comes apart along with the music rather than merely pumping. And manual channel trims sit on top of all of it. Depth is carved out of the amount rather than added to it, so full depth means silence renders a clean picture and the beat renders the whole effect.
Real lateral aberration is invisible in a flat area, because displacing a region of constant colour returns the same region — so an Edges control weights the dispersion by local contrast, and at zero you get the misregistered-camera look instead. Show Field paints the dispersion magnitude over a dim picture with four meters along the bottom for bass, mid, treble and beat, because a flat region with an enormous displacement looks exactly like one with none, and because “is it hearing anything at all?” is otherwise unanswerable inside Resolume.
Also available as an OpenFX plugin for DaVinci Resolve, Vegas Pro, Nuke and Natron. The dispersion field, the spectral weight table and every parameter curve are the same source files both builds compile, so a preset cannot mean one thing in Resolume and another in Resolve. The reactive controls are absent from the OpenFX build rather than shown doing nothing: OFX has neither beat information nor an audio input, and a dead control that looks live is worse than one that is honestly missing.
- Four geometries — radial like a real uncorrected lens, linear like a prism, tangential like nothing at all, and a drifting turbulent noise field
- Spectral integration from a hard three-sample RGB split up to a 32-sample prismatic fringe, with the weights normalised so the setting changes quality and never tint
- A beat pulse locked to the host's transport, on any division from a quarter beat to two bars, with a decay from a linear ramp to a click
- Band split driving red, green and blue from bass, mid and treble separately — four routes, including bass-only and treble-only for dense mixes
- Overall level pump, and manual per-channel trims on top of everything
- Edges weights the dispersion by local contrast, so the fringe lands where a real lens would put it
- Show Field paints the displacement magnitude with live bass, mid, treble and beat meters
- Eight factory presets, from Uncorrected Lens to Abomination, driven from one table shared by both builds
- Amount is a fraction of the frame height, so the same setting looks the same at 720p and 4K
- 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.5. v0.1.4 gave the Edges control a name that says what it does inside FFGL's sixteen characters; v0.1.5 changed nothing but the Windows installer, which no longer touches the system PATH — the earlier one could overwrite it. The dispersion field 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 actually wrote against the C++ across all four geometries: worst disagreement 7e-07 of a frame width, with a control case comparing against the wrong geometry that must and does disagree. A separate check finds each channel's edge in the rendered frame and compares it against the displacement the controls asked for, agreeing to better than a pixel at three amounts. The spectral weights are shown to preserve energy by rendering a flat field at every setting and every amount and demanding it come back flat. The reaction is fourteen assertions with no GPU involved at all, including the bar recovery tracking the host clock to 1.2e-07, and one check feeds a milliseconds host and a seconds host the same show and demands identical output — which is the trap that would otherwise make the plugin run a thousand times fast in the only host anybody uses it in. All 24 controls are swept and shown to change the picture, and 22 checks run from a clean universal build. That testing found real defects during development: the spectral quadrature aliased its own source badly enough that at large amounts every quality setting was equally bad and no longer even ordered, fixed by having each wavelength sample read from a mip level covering twice the gap to its neighbour; a Sync dropdown with two entries that were byte-identical code paths; and a harness that was rendering every frame upside down while three separate numerical checks passed regardless, because each measured something a vertical flip does not change. It has since been loaded into Resolume Arena and confirmed working, which is the one thing none of that testing could establish — every check drives the plugin class directly or through the host entry point, and none of them can say whether twenty-four controls present sensibly in a real inspector. Still open: the OpenFX build has never been opened in Resolve, Nuke, Natron or Vegas, only smoke-tested through a headless probe, and Windows is built in CI and has never been run. The Linux build is loaded in CI on a stock Rocky 8 — the two entry points a host calls first, which is where a wrong ABI shows up — but that is a load, not a render. One known limit is measured rather than guessed — at the cheapest prism setting a hard black-to-white edge leaves about 5 of 255 of ripple in the fringe, and more samples buy a sharper picture at the same smoothness rather than less ripple.
Watch it running
Nothing loads from YouTube until you press play.Watch it there instead