Releases: stoatworks-labs/teletext
Release list
v0.1.0
A picture sent as Level 1 teletext mosaic graphics, as an FFGL effect for Resolume Arena and Avenue, shown as SW Teletext. A teletext page is 40 columns by 24 rows of cells, eight colours, 2 × 3 sixels — and colour is not stored per cell: it is set by a control code that changes the colour from that cell onwards, and the code itself occupies a cell. So encoding a picture is an optimisation under a hard serial constraint, and the look is what the optimum looks like: a black column at every colour boundary, colour rationed, the artists' free boundary where the background may move, and Hold Graphics bleeding the last shape into the gap.
Teletext runs each frame through an exactly optimal row encoder — a Viterbi programme over the decoder's own row state, checked against an exhaustive search — transmits the page a few rows per 50 Hz field so a moving picture tears between rows, and puts bit errors where the standard puts them: a single bit fails parity and blanks a cell, two bits pass as the wrong mosaic, and a Hamming-protected row address means a row never moves. The header is a real row 0 with a page number, a service name and a running clock, drawn from a font of our own.
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):
- The row programme's realised cost equals an exhaustive search over every control placement, exactly, in integers, on 24 random rows in both error spaces; with Hold on the realised cost is never above the hold-off optimum and never below the search with Hold in its alphabet (gap 0 on every row).
- A red-then-blue row puts its control cells at exactly {0, 20} with the boundary cell black; red then blue-on-red at exactly {0, 18, 19}; with backgrounds allowed the boundary costs 0 pixels of black.
- 0 of 921,600 pixels off the eight colours and 0 in a non-uniform sixel, in four renders at each raster.
- The separated gutter: 0 pixels disagree with the SAA5050 rule on 912 cells, exactly 28 kx ky white pixels a cell at a whole-pixel scale.
- All 24 rows show the frame of the field that carried them, at 60 and 24 fps, through a resize.
- A forced single-bit error blanks its cell (0 pixels changed outside it); a forced double-bit error changes the mosaic; at Signal Quality 0.3, 124 of 960 cells fail parity and 0 pixels leave the palette.
- Nine perturbed models each fail their check, and one character changed in the shipped GLSL is caught.
- All 12 controls change the picture;
oxbowloads it asSW Teletext/TX01/ effect and renders 120 frames. - Render cost at the defaults: 0.67 ms/frame at 720p, 0.86 at 1080p and 2.98 at 4K, the 80×72 read-back included. 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 Teletext/TX01/ effect, all 18 host controls match the declaration, it renders and Arena's log stays clean: 8 of the fleet gate's 9 checks, in two runs. The ninth, controls, read Rows per Field and Freeze dead both times, because the gate holds a still picture: a still page comes round in under a second at any Rows per Field, and a frozen still is the same still. Software rendering says nothing about a GPU or about speed.
What is not
- Never loaded into Resolume on macOS.
- Hold Graphics is approximate and bounded, not proven optimal. Mosaics only, Level 1 only. The separated gutter follows jsbeeb's reading of the SAA5050. The error constants are stated, not measured.
- Eight colours and nothing between: a dark clip loses its mid-tones to black. Lift it with a brightness effect ahead of this one.
- No OpenFX port and no presets. There is a user guide at https://stoatworks-labs.com/software/teletext/guide/ and a browser demo at https://teletext-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.