galvo
An ILDA laser projector for Resolume

What it does
An FFGL effect for Resolume Arena and Avenue. A laser show is a path scanned by two mirrors with a finite point budget: the picture is where the beam went, at the brightness its dwell time gave it, and nothing else is drawn. galvo models that path and that budget, and everything anybody recognises about laser graphics comes out of it.
Corners have bright studs because a sharp vertex is sent to the scanner several times over and the light piles up while the beam sits there — that is what Corner Dwell is. Corners round off when the galvo cannot keep up, because a galvo is a mass on a spring: wind Galvo Speed down from 60 kpps to 8 and the figure starts to look like handwriting. Damping below 1 makes the mirror overshoot a corner and come back through it. Mis-set blanking draws the hooks and the faint join-the-dots lines of a projector whose beam switches on before the mirrors arrive. And a frame with more path than the point budget covers is drawn over several host frames, visibly crawling — which is exactly what a real projector does with a frame that is too busy, and Scan Rate Floor is the same answer show software gives.
The outline is found rather than assumed. The clip is edge-detected at a small working resolution, thinned to a one-pixel skeleton, walked into ordered contours, and simplified so a straight edge is two points and not two hundred. Detect On decides what "different" means between two pixels, and it matters more than the operator does: Alpha for a logo that arrived with transparency and so already carries a perfect outline, Chroma for the boundary between two colours of equal brightness that a luma detector is blind to, Luma for everything else. Background → Edge Mask shows the mask on its own, because judging a threshold through a layer of beam is guesswork.
Be honest about the input: this works beautifully on logos, titles and line art, where there are real outlines to find, and turns busy footage into a scribble. That is a property of the problem rather than a setting nobody has found. Galvo Speed, Trace Size, Corner Dwell and Blanking Delay are real integers in their own units, not 0..1 sliders, because a scanner's rating is a number people already know.
- A second-order galvanometer model per axis — speed in kpps, damping, and the ringing that follows from both
- Corner dwell, so a drawn vertex has the bright stud a real scanner leaves there
- Blanking Delay in points, for the hooks and painted jumps of a projector out of adjustment
- A finite point budget that continues where it left off, so a frame too busy crawls the way it does in a real rig
- Scan Rate Floor thins the point stream to hold the rate up, the way show software does
- Contour tracing: edge detect, skeletonise, walk into ordered contours, simplify
- Detect on luma, alpha, chroma or luma-or-alpha, with an Edge Mask view for setting it
- Beam colour from the clip, pushed toward a saturated laser primary, or a palette with a hue sweep along the path
- Persistence as a camera's exposure rather than a phosphor — which is how anybody has ever seen a laser photographed
- Universal macOS bundle and a Windows x64 DLL
Where it stands
v0.1.0, and honestly early. The physics is measured rather than asserted, by an offline harness that drives the real plugin classes: the galvo's step response matches the exact second-order closed form to three decimals at five dampings on both axes, energy is conserved to 0.026% across twelve galvos and 0.011% across an 8:1 range of point rates, a four-point corner measures 4.27× the side brightness against 4.19× predicted, a 4,000-point path at 8 kpps takes exactly 30 host frames, and the contour tracer returns a square as one closed contour of perimeter 319 against 320 in four vertices. All 24 swept controls measurably change the picture. Render cost on macOS is 0.7–1.0 ms/frame at 720p and 1080p — they are indistinguishable, because most of the cost is one synchronous readback rather than the GPU, which is also why lowering Trace Size is the performance control rather than lowering the output resolution — and 1.4–1.6 ms at 4K. On 21 September 2026 the x64 DLL was registered, loaded and instantiated in Resolume Arena 7.27.1 on win-lab, listed as SW Galvo under idstring GV01 among 112 video effects, with the shaders compiling and the inspector drawn. That machine has no GPU: OpenGL came from Mesa llvmpipe, a software rasteriser, so it has never run on a GPU in Resolume, nothing was timed on Windows, and it has never been instantiated in Arena on macOS. It also models an ILDA scanner rather than driving one — there is no ILDA output and it has never driven a real laser. No long session, composition save and reload or preset recall was exercised in the host; there is no OpenFX port, no user guide and no factory presets. The browser demo runs the plugin's own shaders, but its CPU half — the tracer, the point stream and the galvo model — is a hand port to JavaScript, and nothing checks a port but a reader. Check it in your own rig before trusting it in front of an audience.
Watch it running
Nothing loads from YouTube until you press play.Watch it there instead