Stoatworks Labs

Rosette

A litho press that never quite registers, for Resolume

Betav0.2.0Plugin & ModuleC++ / GLSL
Rosette — A litho press that never quite registers, for Resolume
No screenshot. This one's configuration inside another application.

What it does

An FFGL effect for Resolume Arena and Avenue. A halftone is four plates (cyan, magenta, yellow and black), each a lattice of dots at its own screen angle, laid down one after another by a press that never quite registers them. Model those two things and the rest follows.

Rosettes: put the four lattices at the standard angles, C 15°, M 75°, Y 0° and K 45°, and they interfere into the flower printers recognise. Nothing draws it. It's what four screens at those angles do. Moiré: set two screens to the same angle, or one degree apart, and you get the coarse beat that costs a print run. The Moiré preset puts magenta at 16° against cyan's 15°, and that's actual interference between two lattices, not a texture pretending to be one. Misregistration is per plate, in pixels, and it wanders as the press runs, putting colour fringes on every edge and moving them about. Dot gain fattens the midtones because ink spreads into paper: fifteen points is a litho press, thirty is newsprint. And overprint multiplies, because inks are filters rather than lights, which is why cyan over yellow is green and black over anything is black.

The dot shapes are spot functions rather than sprites, and they behave the way their names suggest. Round grows a near-circle, turns over through a checkerboard at exactly 50%, and inverts into holes. Elliptical is the same function with the metric stretched, so the dot meets its row neighbours first and chains along the screen angle, which is what an elliptical screen is for: no sudden flip at the midtone. Square never inverts. Line is a band.

Black Generation decides how much of the neutral component moves off the CMY plates onto the black one: at 0 greys print as equal parts cyan, magenta and yellow, at 1 as black alone. Total Ink limits how much ink one point can carry, from 200% to 400%. The four inks and the paper are colour pickers rather than fixed process primaries, which is what makes the Riso preset possible. Solo a plate to see its lattice on its own, which is how you actually set the angles and the screen.

A press has two kinds of error, so the audio drives both: the level jitters the plates continuously, and a detected onset throws them, each in its own direction, decaying until the next hit. Audio Drive is zero by default, so with nothing routed it's an ordinary manual halftone and behaves like one. It's a modulation source at video rate rather than a signal source, so the smallest interval it can resolve is a frame, and a kick lands up to 17 ms late at 60 fps.

It's also an OpenFX plugin for DaVinci Resolve, Vegas Pro, Nuke and Natron, with the same separation, screens and presets. The audio drive is Resolume-only.

  • Four real plates at their own screen angles, interfering into rosettes rather than drawing them
  • Moiré as genuine interference between two lattices, one degree apart
  • Four spot functions — round, elliptical, square, line — checked against their C++ originals
  • Dot gain and ink spread, from litho's fifteen points to newsprint's thirty
  • Per-plate registration offsets in pixels, plus a bounded press wander that moves the fringes
  • Subtractive overprint: inks as filters, so cyan over yellow is green and black over anything is black
  • Black generation and a 200–400% total ink limit
  • The four inks and the paper as colour pickers, with a switch and a Solo per plate
  • Six presets: Offset Litho, Newspaper, Riso 2-Colour, Silkscreen, Moiré and Drifting Press
  • Universal macOS bundle and a Windows x64 DLL

Where it stands

v0.2.0, which adds the OpenFX build, and early days. On 21 September 2026 the x64 DLL was registered, loaded and instantiated once in Resolume Arena 7.27.1 on Windows, listed as SW Rosette under idstring RZ01 among 112 video effects, with shaders compiling, the inspector drawn and a log clean of WARN, ERROR and FAIL. That VM has no GPU (OpenGL came from Mesa llvmpipe, a software rasteriser), so it has never run on a GPU in Resolume. It has never been instantiated in Arena on macOS, and no frame timing was taken on Windows at all. The effect was applied to the composition rather than to a clip, so the proof that it instantiated is the diag log rather than the clip's effect list. No real audio has reached it in a host, so Resolume's 64-bin FFT mapping is still an assumption. The OpenFX build has been checked in DaVinci Resolve Studio 21.1 on macOS, as a Fusion tool only; Vegas, Nuke and Natron are untried, and the Windows and Linux OpenFX builds have never rendered in a host. The printing model is measured against an independent version of the same arithmetic, and tools/verify.sh runs the lot: the GLSL spot functions agree with their C++ originals over 264,196 comparisons, printed area follows the dot-gain curve, screen angles are recovered from the dots to within 0.06°, registration offsets land where asked, every overprint pixel is exact, press wander stays bounded and smooth, and silence moves nothing at full audio drive. All 44 of its 49 parameters that can be swept change the picture (the other five are the FFT buffer and the About buttons). Render cost on macOS is 0.15 ms a frame at 720p, 0.23 at 1080p and 0.50 at 4K. There's no user guide. The browser demo runs the plugin's own separation and print shaders ported to WebGL2, checked against the C++ character for character, but the Controls, Screen and Press conversions beside them are a hand translation that nothing checks. Try it in your own rig before you trust it in a show.

Watch it running

Rosette video thumbnail

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