Skip to content

Releases: stoatworks-labs/pitch

Release list

v0.1.0

Choose a tag to compare

@github-actions github-actions released this 23 Sep 21:14

An LED wall seen through a camera, as an FFGL effect for Resolume Arena and Avenue, shown as SW Pitch. Every IMAG camera pointed at an LED wall samples a grid with a grid, twice: in space, a lattice of small emitters with black between them against a sensor lattice behind a Bayer mosaic; in time, a wall lit one scan group at a time by pulse-width modulation against a rolling shutter whose rows each integrate their own slice of the pulse train. The plugin integrates both analytically, and that is the whole plugin.

What falls out, none of it drawn: coloured moiré 1 / |s − round(s)| pixels long that swims with Camera Scale and dies under Focus; scan bands with a period of P / (Readout / H) rows that vanish at a shutter of whole refresh periods; low-grey breakup, worst where the pulses are shortest, which Scrambled PWM spreads away; black between the pixels; and seeded dead, dim, dead-row and off-bin cabinets.

What is verified

By tools/verify.sh on an M4 Max, macOS 26.4, on 2026-09-23, every check at 320×180 and 1280×720:

  • The neutral settings return the input at 0/255; a fill of 0.5 differs by 128/255.
  • The frame mean equals fill × level × wall area to 2.6e-8 with Focus off and 1.9e-8 with a 1.5 px blur disc, against a float tolerance of 2.2e-6.
  • Moiré at 0.8 LEDs/px is DFT bin 32 of 160 = 5.00 px against 5.00 predicted; at 1.25 it is 4.00 against 4.00; at 1.0 the contrast is 1e-5; a 1.5 px blur takes 0.126 down to 0.0099.
  • The scan-band period is DFT bin 20 at every raster, as P / (Tr / H) says, with depth 0.20000 against a closed form of 0.20000, and 1.2e-7 at a two-period shutter.
  • Relative band depth 0.769 > 0.460 > 0.084 at 10, 50 and 90% grey under Conventional PWM, each within 1e-4 of the closed-form overlap, and 0.019 under Scrambled at 50%.
  • Dead cabinets exactly black and exactly cabinet-aligned; dead rows exactly one row; the same seed byte-identical twice.
  • At each mosaic site the demosaic returns the sensor's own channel to 0/255.
  • A detuned overlap integral and a swapped Bayer phase both FAIL the checks, and a one-character mutation of the shipped GLSL is caught by four of them.
  • All 26 swept controls change the picture; all 5 shaders compile through glslc; oxbow loads it as SW Pitch / PI01 / effect and renders 120 frames.
  • Render cost 0.74 ms/frame at 720p, 1.29 at 1080p and 4.91 at 4K at the defaults. macOS figures only.
  • Windows, in Resolume Arena 7.27.1 (win-lab, Mesa llvmpipe, no GPU, 2026-09-23): a CI build of this source loads from Extra Effects, registers as SW Pitch / PI01 / effect, all 32 host controls match the declaration, it renders and Arena's log stays clean: 9 of 9 of the fleet gate's checks. 20 controls moved the picture; 7 were inconclusive (Scan Ratio, Grey Bits, Refresh Phase, Readout, Frame Rate, Module Rows, Dead Row), because the gate compares single frames of a still picture and those act on the time-varying scan bands or on one row per cabinet. The harness sweep proves all of them live. Software rendering says nothing about a GPU or about speed.

What is not

  • Never loaded into Resolume on macOS. How 26 controls in five groups present in the inspector there is untested.
  • A real processor applies a gamma before its PWM, so a real wall's low-grey breakup is worse than modelled. LEDs are square emitters with hard edges; under Rotation a pixel's footprint is nine axis-aligned boxes rather than one rotated square.
  • What the host's clock does to the band phase over a long session is untested.
  • No OpenFX port, no browser demo, no presets. There is a user guide at https://stoatworks-labs.com/software/pitch/guide/.

The macOS build is signed and notarised; the Windows build is unsigned, so SmartScreen warns once.