Stoatworks Labs

Rosette

Offset litho for Resolume

Betav0.1.0Plugin & ModuleC++ / GLSL
Rosette — Offset litho for Resolume
No screenshot — this one is configuration inside another application.

What it does

An FFGL effect for Resolume Arena and Avenue. A halftone is not a texture laid over a picture. It 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 is a consequence rather than an effect.

Rosettes: put the four lattices at the standard angles — C 15°, M 75°, Y 0°, K 45° — and they interfere into the flower printers recognise. Nothing draws it; it is 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 it is real interference between two lattices rather than 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. 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 promise. 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 abrupt 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 — and Total Ink is the limit on how much ink one point may carry, 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 the angles and the screen are actually set.

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 this is an ordinary manual halftone and behaves like one. It is a modulation source at video rate rather than a signal source — the smallest interval it can resolve is a frame, so a kick lands up to 17 ms late at 60 fps.

  • 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.1.0, and honestly early. The printing model is measured against an independent statement of the same arithmetic, and tools/verify.sh runs the lot: the GLSL spot functions agree with their C++ originals over 264,196 comparisons with 0 disagreements past 1e-5 and a largest difference of 1.79e-07; printed area follows the dot-gain curve with the worst of 20 tone bands off by 0.0099 of full area across 6 shape-and-gain cases; 45°, 15°, 75° and 20° screens are recovered from about 1,550 dot centroids to within 0.06°, at a pitch of 15.95–15.98 px for a 16 px screen; registration offsets move every dot by exactly what was asked to within 0.0491 px; every overprint pixel is exact at 0/255; press wander is bounded at 9.545 of 10 px, smooth at 0.2174 px/frame, different per plate and exactly zero at zero; and silence moves nothing at full audio drive. All 44 parameters measurably change the picture. Render cost on macOS is 0.15 ms/frame at 720p, 0.23 at 1080p and 0.50 at 4K — 3% of a 60 fps frame. On 21 September 2026 the x64 DLL was registered, loaded and instantiated once in Resolume Arena 7.27.1 on win-lab, listed as SW Rosette under idstring RZ01 among 112 video effects, shaders compiling and the inspector drawn, with 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, 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 of instantiation is the diag log rather than the clip's effect list. No real audio reached it in a host, so Resolume's 64-bin FFT mapping remains an assumption. No OpenFX port, no user guide and no release history. 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. Check it in your own rig before trusting it in a show.

Watch it running

Rosette video thumbnail

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