Stoatworks Labs

NESolume

Retro console hardware for Resolume

Stablev1.1.0Plugin & ModuleC++ / GLSL
NESolume — Retro console hardware for Resolume
The harness test card through the NES: posterised into the 2C02 palette, Bayer dither working the gradients, and the 16×16 attribute areas bleeding hue exactly the way the hardware forced them to. Rendered by the plugin's own offline harness in a headless GL context, not a Resolume screen capture.

What it does

A retro games console between your content and your output, for Resolume Arena and Avenue. The picture is averaged down onto a real machine's raster, forced through that machine's colour system with its attribute cells enforced, and scaled back up as fat pixels. Nine machines are in the table, from the Game Boy's four greens to the PlayStation's 15-bit RGB, each defined by three facts: how many lines it drew, what colours it could physically produce, and how big the area forced to share them was.

The recognisable artefacts are consequences of those constraints rather than drawings of them. Chunky dithered gradients are the palette running out of levels; attribute clash is a cell only being allowed one set of colours when two objects cross it — the NES's 16×16 attribute areas make its clash the chunkiest, exactly as they did.

The glitches hold the same line. Corruption happens to the indices, before colour choice — a real glitch scrambled CRAM and tile pointers, not the DAC — so a corrupted Game Boy can only show you wrong greens. Displacement is scroll-register damage: whole raster pixels, whole tiles, wrapping around the edge the way a scroll register wraps. At Glitch Rate zero the corruption is a still, which is what a crashed machine actually does.

v1.1.0 adds a tenth machine, the Commodore Amiga, as its display constraints. Every colour is a 12-bit register chosen for the picture: 32 of them, or Extra Half-Brite's 32 plus their exact half-bright twins, or HAM6 — hold-and-modify, where a pixel is one of 16 registers or the pixel to its left with one gun changed, so colour smears in off every hard edge. HAM6 is encoded exactly, line by line, on the CPU. The screen is the Amiga's own, 320 or 640 pixels by 256 or 200 lines; interlace shows its doubled lines as two fields, 50 or 60 a second, with the twitter and 25 Hz flicker that came with them, and a flicker fixer that weaves them back. It was appended, so every existing console renders byte for byte as it did in v1.0.7.

Also available as an OpenFX plugin for DaVinci Resolve, Vegas Pro, Nuke and Natron. The console table is the same code in both builds, and the glitch clock runs off the timeline frame, so any frame renders identically however the host reaches it.

  • Ten machines: Custom, Game Boy, NES, ZX Spectrum, Commodore 64, Master System, Mega Drive, SNES, PlayStation and, new in v1.1.0, the Amiga — real master palettes, real DAC depths and real colour registers
  • The Amiga: OCS 32 colours, Extra Half-Brite and HAM6 over 12-bit registers chosen per frame or fixed; PAL and NTSC, low and high res; interlace and a flicker fixer
  • Pixel Size from quarter-size to four-times-chunky around each console's native raster; width follows your composition so pixels stay square
  • Ordered Bayer dither scaled to the quantisation step, and a 1–8 bit per channel DAC on the Custom console
  • Attribute Clash — your own brightness, the cell's hue, from off to full Spectrum strictness
  • Wave, Shake, Block Glitch, Line Glitch, Palette Glitch and Garbage, all palette-legal, on a glitch clock from still to 18 Hz
  • An LCD pixel grid that fades itself out when pixels get too small to have one, and a wet/dry Mix
  • Eight factory presets from Handheld to Kill Screen, driving both builds from one table
  • Universal macOS bundle, a Windows DLL, and an OpenFX bundle for macOS, Windows and Linux

Where it stands

Built, verified and released as v1.1.0, the Amiga. It is an addition and nothing else: a harness renders 71 configurations of the nine existing consoles through v1.0.7's own harness and this one, and every byte is the same, and v1.0.7's 20 parameters keep their index, name, type, default and option values. The Amiga is checked the same way the rest is, by measurement: the HAM6 encoder's error equals an exhaustive search of every six-bit code on 242 short lines, a HAM edge never arrives in fewer than three pixels, every pixel is 12-bit in every mode with every glitch on, Extra Half-Brite shows only registers and their exact twins, and in laced mode alternate lines change on alternate fields; four deliberately broken models each fail. The older verification stands: every fixed-palette console's output is checked against its master palette with every corruption on, all twenty controls move pixels, and presets render byte-identically to their hand-set values. On Windows it passed the fleet's Arena gate in Resolume Arena 7.27.1 with all 21 controls live; it has not been loaded into Resolume on macOS, the OpenFX build has not been loaded into a real Resolve, and the Amiga is in the FFGL plugin only. The macOS build is Developer ID-signed and notarised.

Watch it running

NESolume video thumbnail

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