Skip to content

Releases: stoatworks-labs/toner

Release list

Toner v0.1.0

Choose a tag to compare

@github-actions github-actions released this 24 Sep 15:56

A photocopier, and a copy of a copy of a copy, as an FFGL effect for Resolume Arena and Avenue, shown as SW Toner. Each frame goes through a xerographic engine — optics, an auto-exposure that sets the background to paper white, a photoconductor with a steep discharge curve, development that follows the electric field above the latent image rather than the image itself, a toner supply that runs short with the coverage it has laid down, and a drum whose defects come round once a circumference — and then the same machine runs again on its own output, up to eight generations a frame. Greys collapse to paper or toner, wide solids go hollow while thin lines print full, a heavy page runs out part-way down, the copies drift a little more each generation, and in Photo Mode a halftone re-screened every copy beats against itself. None of it is drawn.

What is verified

By tools/verify.sh on an M4 Max, macOS 26.4, on 2026-09-24, at two rasters (320×180 and 1280×720):

  • A grey ramp copied n times matches the stated tone curve composed n times, column for column, within 3×10⁻⁶ (320) and 3×10⁻⁵ (1280), with exactly two plateaus and a transition that narrows every copy, in five cases.
  • A solid square's density profile follows the strip-field closed form within 5×10⁻⁶ over eight widths; the centre-to-edge ratio runs 1, 1, 1, 1, 0.41, 0, 0, 0 as the width grows; a one-pixel line prints full; nothing develops two pixels outside any square; with the electrode fully in a 33-px solid's centre holds at 1.000000.
  • The drum's repeats are one circumference apart to 8×10⁻⁶ px at a whole-pixel circumference (99 and 396 px) and 6×10⁻⁵ px at a fractional one (66.6 and 266.4 px).
  • Density down a page of constant coverage follows the depletion–recovery closed form at 0.045 of the tolerance, in four settings and three process directions.
  • After 2, 5 and 8 generations a line has turned by the sum of the seeded skews: 0.880°, 1.540° and 3.161° measured at 1280 wide against 0.888°, 1.514° and 3.132°.
  • Grey paper comes out exactly white at full suppression; a grey patch lands where the tone curve says, within 4×10⁻⁵.
  • Six perturbed copiers each fail their check, and one character changed in the shipped GLSL is caught by all six checks.
  • All 17 controls change the picture; all 13 shaders compile through glslc; oxbow loads it as SW Toner / TO01 / effect and renders 120 frames.
  • Render cost at Generations 1 / 5 / 8: 1.4 / 6.5 / 10.3 ms a frame at 1080p and 4.6 / 21 / 34 ms at 4K, so the cap of eight keeps 1080p real-time and about three generations are real-time at 4K. macOS figures only.
  • Windows, in Resolume Arena 7.27.1 (win-lab, Mesa llvmpipe, no GPU, 2026-09-24): this release's DLL loads from Extra Effects, registers as SW Toner / TO01 / effect, all 23 host controls match the declaration, it renders and Arena's log stays clean: 9 of the fleet gate's 9 checks, with all 18 controls moving the picture (four under a precondition). Software rendering says nothing about a GPU or about speed.

What is not

  • Never loaded into Resolume on macOS.
  • The field is a separable product of strip closed forms, not the radial field of a point charge; its scale is in pixels, so a 4K page hollows features half the size, relative to the page, that a 1080p page does. The developer starts every generation fresh.
  • Footage has been seen by eye only, through the harness, on Resolume's bundled demo clips: bright shapes on black, which the copier reads as black pages with the shapes cut out in paper. For a white page give it a bright original.
  • No OpenFX port and no presets. There is a user guide at https://stoatworks-labs.com/software/toner/guide/ and a browser demo at https://toner-demo.stoatworks-labs.com/.

The macOS build is Developer ID-signed and notarised by the release pipeline after publication; if macOS refuses a download, it predates the signing, so download it again. The Windows build is unsigned, so SmartScreen warns once.