Skip to content

Releases: stoatworks-labs/copperlist

Release list

v0.1.0

Choose a tag to compare

@github-actions github-actions released this 24 Sep 01:06

An Amiga cracktro as an FFGL source for Resolume Arena and Avenue, shown as SW Copperlist: not drawn to look like one, but written against an emulation of the chips that made them look that way. The Amiga's copper waits for the beam to reach a screen position and writes a value into a hardware register, so a copper bar is nothing but colour-register writes at the start of scanlines. Copperlist emulates that part of the chipset — chip RAM, the copper reading real instruction words out of it, 32 twelve-bit colour registers, five bitplanes, eight sprites and the blitter — and the cracktro is C++ that builds a copper list and issues blits every field.

What falls out: bars that are always horizontal and cannot blend where they cross, because a register holds one value; mid-line colour changes on the copper's four-pixel grid; 4,096 colours and not one more; a starfield of three multiplexed sprites; a scroller that moves by whole pixels; a wireframe or filled cube in the blitter's line mode; colour cycling as three registers rotated. It runs in fields, 50 Hz PAL or 60 Hz NTSC, from the host clock, and a 60 fps composition repeats fields rather than interpolating one. Every scene switches off with the control that already says how many: an empty Text, Bar Count 0, and so on.

What is verified

By tools/verify.sh on an M4 Max, macOS 26.4, on 2026-09-24, the chip's claims measured in chip RAM and the output at 320×180 and 1280×720; the figures are the README's, each asserted by a suite that passed tonight:

  • 8,544 bar lines: every colour change on the copper's grid, none closer than one MOVE (8 px), and 1,177 pairs exactly 8 px apart, so the bound is reached.
  • 5,982 crossing lines each end on the later write, never a blend: no pixel is a colour no MOVE wrote.
  • 576 blitter lines, 96 through every octant and 480 cube edges: 0 pixels differ from a closed-form Bresenham.
  • The field number is exactly floor(t × 50) (60 NTSC) for 18 × 600 frames, from frame 0, from Resolume's ~499 million ms clock and from 10¹⁰ ms; a field reached by running is byte-identical to the same field reached by a jump.
  • Every channel of 17.6 million output pixels is a multiple of 17; Integer scaling is the chip's picture bit for bit, and the PAL rectangle measures 936 × 720 against 935.68.
  • Each negative control — a one-clock MOVE, a float clock, 8-bit gradients among them — is rejected, and a one-character mutation of the shipped GLSL fails --scaling and --scroll.
  • All 24 sweepable controls change the picture at 480×270 and 320×180; oxbow sees SW Copperlist / CP01 / source, told it takes no inputs, and lights pixels.
  • Render cost 0.76 ms a field for the emulation on the CPU, whatever the output size; 0.80–0.82 ms/frame from 720p to 4K with a new field every frame. macOS figures only.
  • Windows, in Resolume Arena 7.27.1 (win-lab, Mesa llvmpipe, no GPU, 2026-09-24): a CI build of this source loads, registers as SW Copperlist / CP01 / source, all 30 host controls match the declaration, it renders and Arena's log stays clean: 9 of 9 of the fleet gate's checks. But 23 controls read inconclusive rather than live, because a source that never stands still (PAL fields, the scroller, the bars and the stars all move every frame) raises the gate's noise floor above what one control changes. That is the gate's blind spot, not the plugin's; the harness sweep proves every control on macOS. Software rendering says nothing about a GPU or about speed.

What is not

  • Never loaded into Resolume on macOS, so the host clock's unit, editing the Text parameter and the look at a real composition size are inherited assumptions.
  • The emulation leaves out what does not show: the 68000, audio, interrupts, and DMA slot contention — on a real machine five bitplanes would delay copper instructions inside the display window; here they never are. The blitter is instantaneous.
  • There is a browser demo: a JavaScript port of the chip emulation and the cracktro, drawn by the plugin's own shader. It was compared byte for byte with the plugin over 500 frames on 2026-09-24 (0 pixels different), but it is still a port, not the plugin.
  • No OpenFX port, no presets. There is a user guide at https://stoatworks-labs.com/software/copperlist/guide/.

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.