Stoatworks Labs
Pilot — A ZX Spectrum tape loader for Resolume
Pilot

What it does

An FFGL effect for Resolume Arena and Avenue. Most reveal transitions are a shape moving across a frame: a wipe, a circle, a slab of noise. This one is an address order. The ZX Spectrum's display file isn't stored top to bottom. The byte holding a pixel lives at third × 2048 + line × 256 + character row × 32 + column, so filling it from the start of the tape to the end makes the pattern it makes, and nobody chose it.

Three things come out of that without anyone designing them. The picture doesn't wipe down the screen: it arrives in three thirds, each filling in as an eight-line interleave, the venetian blind everybody who watched a Spectrum load remembers. The colour arrives last and all at once, because the 768 attribute bytes sit after the 6144 bytes of picture, so the image lands in monochrome and colours in over the final 11% of the load. And the border is the loading signal itself: the beam paints the tape's current half-cycle as it scans, so the stripes are horizontal and there are baud ÷ 50 pairs of them down the picture.

Progress is the load. Scrub it by hand in Manual, or let Sync run it. At Clip time the tape runs at the actual baud rate, and 6912 bytes at 1500 baud takes 37 seconds, while Beat and Bar land a whole load on Resolume's tempo. Four machines set the rate and the border: ZX 48 with the 48K ROM's red and cyan pilot then yellow and blue data, a ZX 128 turbo loader, a C64 turbo's whole-border flash and an Amstrad, with Baud trimming any of them from a quarter to four times its own rate.

Error Rate fails blocks at random, and a failed block prints R Tape loading error, 0:1 in the Spectrum's own words over whatever had arrived, holds it, and starts the load again. The failures are seeded, so scrubbing back over one shows you the same one again. Background decides what an address that hasn't arrived yet shows: the power-on Paper, as a real machine did, black, or the live clip, which turns the whole thing into a colour-and-quantise transition over the picture.

It's also an OpenFX plugin for DaVinci Resolve, Vegas Pro, Nuke and Natron, as an effect and as a transition that loads the incoming shot over the outgoing one. Beat and Bar sync are Resolume-only.

  • The Spectrum's display-file address order as the reveal: three thirds, each an eight-line interleave
  • Monochrome first, colour last, because the attribute bytes come after the bitmap
  • A border that is the loading signal: baud ÷ 50 stripe pairs, pilot colours then data colours
  • Four loaders — ZX 48, ZX 128, C64 turbo and Amstrad — with a Baud trim from ×¼ to ×4
  • Manual, Clip time, Beat and Bar sync, with Clip time running at the real baud rate
  • Seeded block failures with the Spectrum's own loading-error report
  • Power-on Ink, Paper and Bright, and a Paper, Black or live-clip background for what has not arrived
  • Mix 0 is a byte-exact bypass
  • Universal macOS bundle and a Windows x64 DLL

Where it stands

v0.2.0, which adds the OpenFX build, and early days. It hasn't been loaded into Resolume on macOS yet, so how the parameters look in the inspector and how Arena's own textures behave are untested. On Windows it has: a build loads, registers and renders in Resolume Arena 7.27.1 on software rendering (no GPU), passing all nine of the fleet's host checks with every parameter as declared. The OpenFX build has been checked in DaVinci Resolve Studio 21.1 on macOS; Vegas, Nuke and Natron are untried. Everything else is measured by an offline harness driving the real plugin class, mostly with no GL context at all: the address order agrees bit for bit with an independently written loop for all 6144 addresses, the rendered frame matches it at two rasters and six points in the load, no colour arrives before byte 6144, the border advances 16 half-cycles per byte on every machine, the failure rate holds up over 20,000 draws, ten models broken on purpose are all caught, all 14 controls change the picture, and Mix 0 is the input byte for byte. Render cost on macOS is 0.09 ms a frame at 720p, 0.21 at 1080p and 0.36 at 4K, because the two expensive passes run at 256×192 and 32×24 whatever the composition is. The universal build has never run on Intel. Only the ZX 48 models a documented loading routine. The other three machines are looks in the same shape, and none of them has been compared against a real tape or an emulator. Baud drives the border and the Clip time period but not the reveal in Manual, on purpose. A cell's colours are recomputed every frame, so on moving footage they change during the load. There's a user guide and a browser demo, which is a port rather than the plugin, but no factory presets. Try it in your own rig before you trust it in a show.

Watch it running

Pilot video thumbnail

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