Receipt
A thermal receipt printer, for Resolume

What it does
An FFGL effect for Resolume Arena and Avenue. A thermal printer has a fixed line of resistive heaters, 576 across an 80 mm roll or 384 across 58 mm, and no ink: heat-sensitive paper darkens where it gets hot enough. The head prints one dot row at a time as the stepper pulls the paper, so the physics of heat is the whole look, and Receipt runs that physics row by row.
Tone is a dither, because a dot is on or off: an 8 by 8 Bayer matrix, Floyd-Steinberg or Atkinson, in raster order as a printer's firmware does it. Each heater is a one-pole: a heater that fired on the last row is still warm, so the next dot there darkens more and the heat spreads to the paper beside it. Vertical lines thicken by a dot each side, every mark trails a tail below it, and dark areas block up. History Control is the firmware's answer: it shortens a warm heater's strobe by the heat it predicts is left, which stops the thickening but cannot cool a heater that is not firing.
The supply can only fire so many dots at once, so the head is strobed in blocks and a block with many black dots sags. Dense rows print paler, and a row whose blocks differ in coverage bands at the block boundaries: on dark footage a banded grey with a seam down the head. A slipping roller repeats a row, or stalls while the data moves on and overprints a dark band. Age fades the dye, yellows the stock and browns the print, darkest at the edge where it was held.
Static prints the frame as a receipt. Printing scrolls the receipt out of the slot at the print speed, each new row printed from the frame showing when the head reached it, so the paper is a slit-scan of time, and tears it off at the tear length. The dither and the print run on the CPU at the head's resolution after a read-back, about 1.2 ms a frame whatever the output's size, because error diffusion is serial in both directions. The paper is opaque and off the paper is transparent, so the layer below shows round the receipt.
- A thermal head of 384 or 576 heaters at 8 dots per millimetre, one dot row at a time
- Bayer, Floyd-Steinberg and Atkinson dithers, in raster order
- Heat carried from row to row: lines thicken, marks run on, dark areas block up; the firmware's History Control
- A supply budget strobed in 1 to 8 blocks: dense rows print paler and band at the block seams
- A slipping roller that repeats or overprints rows
- Static or Printing: the receipt scrolls out of the slot in real time and tears off
- Six paper tints, age fading and yellowing; Letterbox, Rotate or Tile
- Universal macOS bundle and a Windows x64 DLL
Where it stands
v0.1.0, and honestly early. The printer is measured, not asserted, by an offline harness that drives the real plugin class headlessly at two rasters and on Apple's software renderer: on ten flat greys Bayer fires exactly its count of 64 dots, Floyd-Steinberg is within 0.0013 of the tone against a derived bound of 0.0053, and Atkinson within 0.068 of 0.13 and blank below an eighth; at a heavy heat carry a 9-dot line widens to 11 dots from the row the heat model predicts and runs on 11 rows below its end, and under full history control stays 9 and runs on 3; a strobe block over the budget prints at the stated sag to 1e-7, with every density step on a block boundary; forced slips move exactly the stated rows; every dot lands on its whole-pixel cell; Printing prints the same rows at 60, 50 and 30 fps; and a resize mid-print keeps every dot. Seven negative controls and a one-character mutation of the shipped shader are caught, and all 14 controls change the picture. The printer's constants (the paper's threshold, the heat's spread, the supply's dot budget, the dye's optical density) are chosen, not measured from a real printer. The CPU print costs about 1.2 ms a frame on an M4 Max; the read-back it waits on inside a real Resolume composition is unmeasured. It has not yet been loaded into Resolume on macOS. On Windows it has: a build of this source loads, registers and renders in Resolume Arena 7.27.1 on software rendering (win-lab, no GPU), with every parameter as declared and all 14 controls shown moving the picture. The macOS build is Developer ID-signed and notarised. There is a user guide and a browser demo; no presets and no OpenFX port. Check it in your own rig before trusting it in a show.
Watch it running
Nothing loads from YouTube until you press play.Watch it there instead