Stoatworks Labs

Rebate

Colour negative film, developed and scanned, for Resolume

Betav0.3.1Plugin & ModuleC++ / GLSL
Rebate — Colour negative film, developed and scanned, for Resolume
Rebate

What it does

An FFGL effect for Resolume Arena and Avenue. A film look is usually a lookup table, and this one runs the process instead. Your clip is the scene, and it exposes the three dye layers of a colour negative through the overlap of their spectral sensitivities. Each layer is developed along a characteristic curve (a toe, a straight line of slope γ, a shoulder) into dye. The dyes aren't pure, so the film carries masking couplers to cancel their impurities, which is why a negative is orange. Then the flat orange negative is scanned and inverted: divide by the base, set the levels, invert. View Negative shows you the film on a light box before the scanner gets to it.

The grain is a count. Each cell holds N sites a dye cloud can land on, so the covered fraction's variance is c(1 − c)/N: loudest in the mid-tones, gone in clear shadows and blocked highlights, and nobody tuned it to go there. Stock sets N, and Grain Size sets the cell. Push steepens the curve and lifts the fog. Age fog is an exposure, so it goes through the curve and the blue-sensitive top layer takes most of it, which is why expired stock scanned with the normal profile goes blue in the shadows and warm in the highlights. Auto Levels, the lab re-measuring the roll, takes most of that back out.

A light leak is light coming through the base, which reaches the red-sensitive layer first, so it's warm. It's also an exposure, so it saturates on the shoulder instead of piling up forever, and it fogs the rebate along with the picture. Cross-processing is reversal film through C-41: no mask, a steep curve, and a scanner dividing by a mask that isn't there, so the positive goes warm, most of all in the shadows. Round the frame, in Full, 6x6 or 35 mm, is the rebate: unexposed film that prints black, a latent edge print that prints light, and clear sprocket holes that clip to black. The stock codes and frame numbers are made up, and no real manufacturer's name or mark appears.

The model is three layers sharing one curve shape, a 3×3 spectral crossover and a 3×3 dye-impurity matrix. That's enough for every mechanism above, but it isn't a spectral simulation of any real stock. The five stocks are invented and described by their parameters.

Also available as an OpenFX plugin for DaVinci Resolve, Vegas Pro, Nuke and Natron, with the same film and scan in float from end to end. Auto Levels measures each frame on its own there, and an Encoding control takes a clip that's already linear light, the way Nuke and Natron work, as well as display-encoded picture.

  • Three dye layers, each developed along a toe, a straight line of slope γ and a shoulder
  • The orange mask, and a scanner that divides it out, set by hand or with Auto Levels
  • Five invented stocks, Push from −1 to +3 stops, and Age that fogs the shadows blue
  • Grain as a count of dye clouds per cell, loudest in the mid-tones, with its own size and seed
  • A light leak from any edge that is warm and saturates on the shoulder
  • C-41, E-6 and cross-processing
  • Full, 6x6 or 35 mm frames with the rebate, sprocket holes and edge print, and View Negative to see the film itself
  • Universal macOS bundle and a Windows x64 DLL

Where it stands

v0.3.1, which turns the sprocket holes the right way round (every release before drew them through 90°); v0.3.0 added the OpenFX build's Encoding control for clips that are already linear light, and v0.2.0 the OpenFX build. Still 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; Grain Seed couldn't be seen moving there, because the grain renews every frame. The OpenFX build has been checked in DaVinci Resolve Studio 21.1 on macOS; Vegas, Nuke and Natron are untried. An offline harness driving the real plugin reads each claim back out of the picture: the curve's slope, push and fog come back as set, a neutral wedge through C-41 with the mask inverts to neutral within 1.1e-6, the grain's variance matches c(1 − c)/N and peaks in the mid-tones in every channel, the light leak saturates past the shoulder and reads warm, cross-processed film scans warm at every unclipped step, and the sprocket holes and border are exactly 0 in the positive. It catches twelve models that are wrong on purpose and a one-character sabotage of its own shader, and all 22 controls change the picture. It costs 0.20 ms a frame at 720p and 1.19 ms at 4K on macOS. It's only been seen on a synthetic test card, never on footage, and the stocks' constants were chosen by reasoning and by eye, not fitted to any real film. Grain is per output pixel, so it doesn't scale with the frame. There's a user guide and a browser demo (a port, not the plugin), but no presets. The macOS builds are signed and notarised. Try it in your own rig before you trust it in a show.

Watch it running

Rebate video thumbnail

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