Pitch
An LED wall seen through a camera, for Resolume

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. 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. Every camera op knows that as a rule of thumb, and here it's a theorem. A dark level is a short pulse that a window either catches or misses, so the bands are deepest at low grey, and Scrambled PWM spreads the same on-time over sixteen sub-periods and cuts them 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 gives you the input back, 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 early days. It hasn't been loaded into Resolume on macOS yet. On Windows it has: a build loads, registers and renders in Resolume Arena 7.27.1 on software rendering (no GPU), with every parameter as declared, but seven controls that act on the moving scan bands or on one row per cabinet couldn't be shown moving on the host check's still picture. The physics is measured by an offline harness driving the real plugin class at two rasters: the neutral settings return the input exactly, the moiré's peak lands at 5.00 px against 5.00 predicted and 4.00 against 4.00, the scan bands match their closed form in period and depth, the bands get shallower towards white as predicted and shallower again under Scrambled PWM, and dead cabinets are black and in the right place. It catches a detuned overlap integral, a swapped Bayer phase and a one-character sabotage of its own shader, and all 26 swept controls change the picture. Render cost on macOS is 0.74 ms a frame at 720p, 1.29 at 1080p and 4.91 at 4K. The gamma a real wall's processor applies before its PWM isn't modelled, so real low-grey breakup is worse than shown, and the LEDs are square emitters with hard edges. There's a user guide and a browser demo, which is a port rather than the plugin, but no OpenFX port. Try it in your own rig before you trust it in a show.
Watch it running
Nothing loads from YouTube until you press play.Watch it there instead