Skip to content

Releases: stoatworks-labs/rebate

Release list

v0.1.0

Choose a tag to compare

@github-actions github-actions released this 24 Sep 01:04

Colour negative film, and the scan of it, as an FFGL effect for Resolume Arena and Avenue, shown as SW Rebate. A film look is usually a lookup table; this is the process. The clip is the scene. It exposes three dye layers through their overlapping spectral sensitivities; each is developed along a characteristic curve — toe, straight line of slope γ, shoulder — into impure dyes that masking couplers correct, which is why a negative is orange; the dye forms in grain cells. Then the flat orange negative is scanned and inverted, as a lab scanner does it: divide by the base, set the levels, invert.

None of the look is drawn. Grain sits in the mid-tones because a cell's covered fraction has variance c(1 − c)/N. Expired stock goes blue in the shadows, because age fog is an exposure the blue-sensitive layer takes most of. A light leak is warm and saturates on the shoulder. Cross-processing — reversal film through C-41 — scans warm, most in the shadows. And the rebate: unexposed film printing black, sprocket holes, and edge print pre-exposed at manufacture. View: Negative shows the orange strip before the scanner inverts it. The stocks and edge codes are invented; no real manufacturer's name or mark appears.

What is verified

By tools/verify.sh on an M4 Max, macOS 26.4, on 2026-09-24, every check at 320×180 and 1280×720; the figures are the README's, each asserted by a check that passed tonight:

  • The straight line's slope reads back as 0.57948 for γ = 0.58, in every channel of three negative stocks; one stop of push raises γ × 1.15000 and fog by +0.030000, as stated.
  • A neutral wedge through C-41 with the mask inverts to neutral: worst chroma 1.1e-6 over 24 unclipped steps.
  • Grain variance at c = 0.5 is 1.9158e-2 against c(1 − c)/N's 1.9159e-2 over 921,600 samples, and zero to 1e-21 at fog and at Dmax.
  • Each half-stop of leak adds 0.0872 of density on the straight line and 0.00001 past the shoulder, and it is warm: R 0.69 > G 0.30 > B 0.17 at the edge.
  • Cross-processed film scans R > G > B on all 22 unclipped steps, with no orange (0.033 against C-41's 0.802).
  • The sprocket holes and the border are exactly 0 in the positive; the same seed and frame give 0 differing values, and 320×180 is bit-identical to the top-left of 1280×720.
  • 11 of 11 negative controls fail as they should, and a one-character mutation of the shipped GLSL was caught by six checks.
  • All 22 swept controls change the picture; all 6 shaders compile through glslc; oxbow sees SW Rebate / RB01 / effect and renders 120 frames.
  • Render cost at the defaults 0.18 ms/frame at 720p, 0.44 at 1080p, 0.54 at 1440p and 1.22 at 4K, under a tenth of a 60 fps frame; Auto Levels adds about 0.6 ms at 4K. macOS figures only.
  • Windows, in Resolume Arena 7.27.1 (win-lab, Mesa llvmpipe, no GPU, 2026-09-24): a CI build of this source loads from Extra Effects, registers as SW Rebate / RB01 / effect, all 28 host controls match the declaration, it renders and Arena's log stays clean: 9 of 9 of the fleet gate's checks. 22 controls moved the picture, 7 of them under a precondition; Grain Seed was inconclusive, because the grain renews every frame. Software rendering says nothing about a GPU or about speed.

What is not

  • Never loaded into Resolume on macOS. How its controls in six groups present in the inspector, and what the host's clock does to the grain's film frame over a long session, are untested.
  • Three layers with one curve shape, a 3×3 spectral crossover and a 3×3 dye-impurity matrix: not a spectral simulation of any real stock. No adjacency effects, interlayer inhibition or coupler chemistry; the scanner is one levels step and one gamma.
  • Grain is per output pixel, not per micron of film, so it does not scale with the frame.
  • Seen only on a synthetic test card and Resolume's bundled demo clips, never on camera footage of people or places.
  • There is a browser demo: the plugin's own shaders in WebGL2, but the stocks, development, scanner profile and strip are a hand port to JavaScript that only a reader checks.
  • No OpenFX port, no presets. There is a user guide at https://stoatworks-labs.com/software/rebate/guide/.

The macOS build is Developer ID-signed and notarised by the release pipeline after publication; if macOS refuses a download, it predates the signing, so download it again. The Windows build is unsigned, so SmartScreen warns once.