Stoatworks Labs

Tinsel

LED outlines for Resolume

Releasedv0.1.0Plugin & ModuleC++ / GLSL
Tinsel — LED outlines for Resolume
Figures from Resolume's own demo media with their outlines lit, rendered by the plugin's own offline harness in a headless GL context — not a Resolume screen capture. Real frames through the real shipped shaders.

What it does

An FFGL effect for Resolume Arena and Avenue. It finds the outlines in whatever is on the layer, hangs a string of virtual lamps along them, and runs the sort of pattern an LED controller runs. Point it at a logo and it becomes a neon sign, a theatre marquee, or a Christmas tree.

The idea it is built on is the one an LED controller is built on: a pattern never chooses a colour. It decides where in the palette each lamp sits and how bright it is, and the palette turns the first of those into RGB. That is why twenty patterns and sixteen palettes are worth more than thirty-six of either — Comet on Christmas is a red-and-green chaser, Comet on Frost is a shooting star, and neither is the other with a different colour on it.

It also makes a pattern a pure function of (lamp, time), with no state and no history — which is what makes it testable. The pattern library exists twice, once in C++ and once in GLSL, and because the GLSL is a fragment rather than a whole shader, the effect and the test are assembled around the same text. So the harness checks what the plugin actually runs rather than a transcription of it.

Lamp Size is a radius in pixels rather than a fraction of the lamp spacing, which is the difference between lamps and streaks: the strip is a field whose gradient varies across the frame, so a window measured in strip units is a dot where the field runs fast and a smear where it runs slowly. Wind the same control past half the lamp spacing and the lamps merge into a continuous glowing rope — the neon-sign look, from one control rather than a second mode.

  • Twenty patterns — chase, theater chase, comet, meteor, Larson scanner, colour wipe, twinkle, sparkle, glitter, fire flicker, breathe, strobe, dissolve, colour waves, fairy lights and more
  • Sixteen palettes, from Christmas and Candy Cane to Frost, Fire, Ocean and Cyberpunk, plus two driven from your own two colours
  • Detect on luma, alpha, chroma or both — chroma finds the boundary between two colours of equal brightness, which a luma edge detector is completely blind to and brand artwork is full of
  • Lamp Size in pixels: separate bulbs at one end of the control, a continuous neon rope at the other
  • Five strip layouts — spiral, angle, linear, radial and a randomly wired order
  • A temporal filter tuned for footage, deliberately asymmetric so an outline that drops out for a frame does not blink
  • An Edges view that shows the detected mask on its own, which is how the edge controls are actually set
  • Universal macOS bundle and a Windows x64 DLL

Where it stands

Built, measured and released as v0.1.0. The pattern library exists twice — in C++ and in GLSL — and an offline harness runs the shader at one pixel per lamp and compares it against the C++: 527,100 comparisons across every pattern, time, intensity and spread, with zero disagreements. That check has already caught a real GPU-only defect, where a float modulo returned the lamp spacing instead of zero at an exact multiple and put out the brightest lamp in the pattern. All 31 controls are swept and shown to change the picture. Render cost is measured: 0.55 ms/frame at 1080p and 2.36 ms at 4K, about a seventh of a 60fps frame. Both the macOS universal bundle and the Windows DLL build in CI. Still open: it has never been loaded into Resolume, so how the controls present in the host is untested, and it has never been built on Linux. The strip coordinate is also a field rather than an arc length — a chase climbs a shape the way a string wound round a tree climbs it, and does not follow a letterform round its own curve. Contour tracing is planned for the next version.

Watch it running

Tinsel video thumbnail

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