Stoatworks Labs

Pitch

An LED wall seen through a camera, for Resolume

Betav0.1.0Plugin & ModuleC++ / GLSL
Pitch — An LED wall seen through a camera, for Resolume
No screenshot — this one is configuration inside another application.

What it does

An FFGL effect for Resolume Arena and Avenue. Every IMAG camera pointed at an LED wall samples a grid with a grid, twice. In space, the wall is a lattice of small emitters with black between them and the sensor is a second lattice behind a Bayer mosaic. In time, the wall is lit one scan group at a time and makes grey by pulse-width modulation, and each sensor row integrates its own slice of that pulse train as the rolling shutter slides down the frame.

So every pixel is a small box laid over the LED grid, and every row is a window laid over the pulse train. Pitch integrates both analytically rather than by sampling, and that is the whole plugin. The moiré fringe is 1 / |s − round(s)| pixels long at s LEDs per pixel, swims when Camera Scale moves, and is coloured because the Bayer mosaic samples red and blue a pixel apart. Focus kills it, because a lens blurs before the sensor samples.

The scan bands have a period of P / (Readout / H) rows against a pulse train of period P, and a shutter of a whole number of refresh periods leaves no band at all: the operator's rule, here a theorem rather than a tip. A dark level is a short pulse that a window either catches or misses, so the band depth is worst at low grey, and Scrambled PWM spreads the same on-time over sixteen sub-periods and cuts it by about that factor.

The wall is a whole number of cabinets built from modules, and a seeded draw per cabinet makes some of them dead, dim, missing a row or a colour bin a shade off. Pitch, Fill Factor and Camera Scale at 1, a shutter of whole periods and Bayer off is the identity, to the byte.

  • An LED wall and the camera filming it, both integrated analytically rather than sampled
  • Moiré from lattice against lattice, coloured by the Bayer mosaic, killed by Focus
  • Rolling-shutter scan bands from multiplexed scan groups and PWM, with a period you can predict
  • Low-grey breakup, and Scrambled PWM that spreads it away
  • Fill Factor, 3-in-1 SMD or discrete RGB layouts, cabinets and modules
  • Seeded cabinet faults: dead, dim, a dead row, a colour bin a shade off
  • Camera Scale, Rotation, Focus, OLPF, Shutter, Readout and frame rate as the camera's own controls
  • Universal macOS bundle and a Windows x64 DLL

Where it stands

v0.1.0, and honestly early. The physics is measured, not asserted, by an offline harness that drives the real plugin class headlessly at two rasters: the neutral settings return the input at 0/255; the frame mean equals fill × level × wall area to 2.6e-8; the moiré's DFT peak lands at 5.00 px against 5.00 predicted at 0.8 LEDs per pixel and 4.00 against 4.00 at 1.25; the scan-band period is the predicted DFT bin at every raster with depth 0.20000 against a closed form of 0.20000, and 1.2e-7 at a two-period shutter; the relative band depth falls 0.769, 0.460, 0.084 at 10, 50 and 90% grey, each within 1e-4 of its closed form, and to 0.019 under Scrambled PWM; dead cabinets are exactly black and exactly aligned. A detuned overlap integral and a swapped Bayer phase are both caught, and so is a one-character mutation of the shipped shader. All 26 swept controls change the picture. Render cost on macOS is 0.74 ms/frame at 720p, 1.29 at 1080p and 4.91 at 4K. It has not yet been loaded into Resolume on macOS. On Windows it has: a build of this source loads, registers and renders in Resolume Arena 7.27.1 on software rendering (win-lab, no GPU), with every parameter as declared; seven controls that act on the moving scan bands or on one row per cabinet could not be shown moving on the gate's still picture. The processor gamma a real wall applies before its PWM is not modelled, so real low-grey breakup is worse than shown; LEDs are square emitters with hard edges. There is a user guide and a browser demo, which is a port rather than the plugin; no OpenFX port. Check it in your own rig before trusting it in a show.

Watch it running

Pitch video thumbnail

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