Stoatworks Labs

Rebate

Colour negative film, and its scan, for Resolume

Betav0.1.0Plugin & ModuleC++ / GLSL
Rebate — Colour negative film, and its scan, for Resolume
No screenshot — this one is configuration inside another application.

What it does

An FFGL effect for Resolume Arena and Avenue. A film look is usually a lookup table; this is the process. The 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 are impure, so the film carries masking couplers that 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 the film on a light box before the scanner gets to it.

Grain is a count, not a texture. Each cell holds N sites a dye cloud may 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 nothing is tuned to put it there. Stock sets N and Grain Size the cell. Push steepens the curve and lifts the fog. Age fog is an exposure, which goes through the curve and which the blue-sensitive top layer takes most of, so 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 it back out.

A light leak is light through the base, which reaches the red-sensitive layer first, so it is warm; it is an exposure, so it saturates on the shoulder rather than adding without limit, 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 is not there, so the positive goes warm, most in the shadows. Around 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 invented, and no real manufacturer's name or mark appears.

The model is three layers with one curve shape between them, a 3×3 spectral crossover and a 3×3 dye-impurity matrix: enough for every mechanism above, not a spectral simulation of any real stock. The five stocks are invented and described by their parameters.

  • 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.1.0, and honestly early. The film is measured, not asserted, by an offline harness that drives the real plugin class headlessly at two rasters and reads each claim back out of the picture: the straight line's slope reads back as 0.57948 for γ = 0.58, and its extension meets fog and Dmax 1.2e-3 log units from where the curve puts them; one stop of push reads back γ × 1.15000 and fog +0.030000; a neutral wedge through C-41 with the mask, scanned by hand, inverts to a worst chroma of 1.1e-6; the grain's variance at c = 0.5 is 1.9158e-2 against c(1 − c)/N's 1.9159e-2 over 921,600 samples, zero to 1e-21 at fog and at Dmax, and peaks at c = 0.5 in every channel; each half-stop of leak adds 0.0872 of density on the straight line, falling to 0.00001 1.6 log units past the shoulder, and at the edge the positive reads R 0.69 > G 0.30 > B 0.17; cross-processed film scans R > G > B at all 22 unclipped steps; the sprocket holes and border are exactly 0 in the positive. Eleven negative controls and a one-character mutation of the shipped shader are caught. All 22 controls change the picture. Render cost on macOS is 0.20 ms/frame at 720p, 0.33 at 1080p, 0.54 at 1440p and 1.19 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; Grain Seed could not be shown moving there, because the grain renews every frame. It has only been seen on a synthetic test card, never on footage, and the stocks' constants were chosen by reasoning and by eye rather than fitted to any real film; grain is per output pixel, so it does not scale with the frame. There is a user guide; a browser demo, which is a port rather than the plugin; no presets and no OpenFX port. The macOS builds are signed and notarised. Check it in your own rig before trusting it in a show.

Watch it running

Rebate video thumbnail

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