Databend
Your picture, opened in an audio editor, for Resolume

What it does
An FFGL effect for Resolume Arena and Avenue. Databending is opening a picture in an audio editor and running audio effects on it. The editor doesn't see a picture. It sees one long stream of samples in the order the file lays them out: row by row, one plane after another or R, G, B per pixel, with a row stride that may carry padding. A delay-line effect on that stream has no idea where the lines are. Databend models that stream exactly and runs actual delay-line effects on it, in the order an audio editor would: echo, flanger, phaser, pitch shift, then the export back to pixels.
Everything comes out of the layout. An echo of k lines and m samples comes back k lines down and m samples across, and with feedback the echoes march down the picture on a slant, each m g to the k as bright as the last. A flanger is a delay swept by an LFO in stream time, and stream time is the scan, so the ghost's offset changes line by line and you get a comb across the scanlines. A phaser is a cascade of all-pass stages, which pass every frequency at unity gain but delay smooth content more than edges, so the picture smears to the right with ringing and keeps its energy. A pitch shifter resamples the scan in grains, stretching the line inside a grain and repeating or skipping at the seam.
The file layout is part of the mechanism. In an interleaved RGB stream, a delay that isn't a multiple of three puts one channel's samples in another's slot, so the echo comes back in the wrong colour, and every effect rotates hue because hue lives at the stream's period-3 frequency. In a planar stream, a delay past a plane's start reads the previous plane, so the first lines of green carry echoes of the last lines of red. The sample format decides what happens past full scale: 8-bit and 16-bit files wrap (the harsh look) or clip, and a float file clips. An unsigned file's silence is black, and a signed one's is mid-grey.
Each frame is its own file. The delay memories don't cross frames, but the LFOs carry their phase from frame to frame, so the comb and the sweep move. The phaser runs on the GPU as a windowed restart, with the window taken from a proved bound on how fast the cascade forgets. A swept phaser with feedback has no such bound, so that control has been left out on purpose. Every coordinate is an integer, every coefficient is worked out in double on the CPU, and the LFOs are exact triangles, which is what lets the harness hold each effect to its closed form.
- Planar or Interleaved layout, a row stride with padding, rows or columns as the line
- 8-bit unsigned, 16-bit signed or float format; Wrap or Clip past full scale
- Echo: lines and samples of delay, feedback to 7/8, its own mix
- Flanger: base delay, depth and rate in stream time; a crossfade
- Phaser: 2 to 12 all-pass stages, rate and depth, at unity gain
- Pitch shifter: half to double, grains of 64 to 4096 samples
- Universal macOS bundle and a Windows x64 DLL
Where it stands
v0.1.0, and early days. It hasn't been loaded into Resolume on macOS yet. The effects are measured by an offline harness driving the real plugin class at two rasters: echoes land where the closed form says, padded rows included, with zero error across the whole picture; in an interleaved file a delay of 1 mod 3 moves red's echo into green, green's into blue and blue's into the next pixel's red; the flanger's ghost sits where the LFO puts it on every line; the phaser keeps a noise picture's energy within a bound it proves; and 8-bit and 16-bit files wrap past full scale while a float one clips. It catches seven models broken on purpose and a one-character sabotage of its own shader, and all 25 controls change the picture. Render cost on macOS at the defaults is 5.8 ms a frame at 1080p and 18.7 ms at 4K, so 4K isn't real time with the phaser on. There's no phaser feedback, on purpose. There's a user guide, but no presets and no OpenFX port. Try it in your own rig before you trust it in a show.
Watch it running
Nothing loads from YouTube until you press play.Watch it there instead