Skip to content

Releases: stoatworks-labs/downlink

Release list

v0.1.0

Choose a tag to compare

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

Analogue FM satellite television, as an FFGL effect for Resolume Arena and Avenue, shown as SW Downlink. Analogue satellite TV sent composite video as frequency modulation, because FM trades bandwidth for noise, and that trade has a cliff. Above the FM threshold the picture is clean but for fine coloured grain; below it the discriminator throws clicks, whole-cycle phase slips smeared into horizontal streaks: the sparklies of a dish slightly off-pointing or a rain fade. The plugin builds the link, PAL → pre-emphasis → FM carrier with energy dispersal → noisy channel → Gaussian IF → discriminator → lowpass → de-emphasis → clamp → PAL decoder, on the GPU, per sample, with the discriminator at 283.75 MHz.

None of it is drawn. Sparklies arrive at Rice's rate — a few dozen a field at the default 9 dB CNR, thousands at 4 — and are black on white and white on black, from Rice's modulation term. A clamp that catches a click on the back porch makes whole lines jump. The 25 Hz dispersal triangle rocks the picture unless Clamp Good takes it off. Threshold Ext. moves the knee down; Rain Fade and Audio Fade take dB off the link. Pull CNR down 2 dB from the defaults and the sparklies take over.

What is verified

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

  • Both emphasis networks lie within 0.019 dB of ITU-R F.405-1's 625-line curve (its own tolerance is 0.10–0.15 dB), and pre- then de-emphasis is flat to 0.018 dB.
  • Clicks counted in the discriminator's output: 9,115 / 3,407 / 2,031 / 257 at 4 / 6 / 8 / 10 dB against the sampled discriminator's exact 8,983 / 3,378 / 1,975 / 257; sampled 64 times finer, 286,302 /s against Rice's 286,665 /s.
  • Near white, positive to negative clicks are 0.279 against 0.268 predicted at 6 dB and 0.198 against 0.200 at 8 dB.
  • Output SNR tracks CNR at 1.007 dB per dB, within 0.08 dB of 20.59 dB above it; the knee at 8.71 dB against 8.57, and Threshold Ext. moves it 3.84 dB against 3.90.
  • The dispersal triangle comes through each clamp as predicted, pixel by pixel: Off within 1.8e-5 of the triangle, Slow within 6.0e-4 of a first-order lag, Good within 1.4e-6.
  • 8 of 8 negative controls fail as they should, and a one-character mutation of the shipped link shader was caught by --polarity at both rasters.
  • All 14 swept controls change the picture; all 12 shaders compile through glslc; oxbow sees SW Downlink / DL01 / effect and renders 120 frames.
  • Render cost at the defaults, on a GPU shared with other builds tonight: 5.2 ms/frame at 720p, 6.1 at 1080p and 6.2 at 4K for PAL, and 11.4–14.3 for Component's three carriers (the README's quieter run: 3.1–3.7 PAL, 5.8–6.5 Component). The link runs at its own raster, so output size hardly matters; the discriminator is most of the cost. 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 Downlink / DL01 / effect, all 21 host controls match the declaration, it renders and Arena's log stays clean: 9 of 9 of the fleet gate's checks. 11 controls moved the picture, 2 of them under a precondition; Deviation, Dispersal and IF Bandwidth were inconclusive, because the link's noise changes every frame, and the 2 audio controls (Audio, Audio Fade) were not testable, because win-lab has no sound device. Software rendering says nothing about a GPU or about speed. CI itself renders only --emphasis and --dispersal, since the software renderer is too slow for the per-sample link; the other GL checks run on the dev Mac.

What is not

  • Never loaded into Resolume on macOS. Whether 3 ms of GPU (6 for Component) sits comfortably beside other effects on a show machine is untested.
  • Nobody has measured what Resolume's 64 FFT bins are, so Audio Fade reads their total level only, and how hard it bites is unknown.
  • The receiver is one design: a Gaussian IF rather than a SAW filter, threshold extension as an ideal tracking filter rather than a PLL, and a perfect colour reference with no burst. Component mode is an idealised MAC. The coloured grain is visible, but no check measures the noise spectrum's shape.
  • There is a browser demo: the plugin's own ten shaders, checked identical to the plugin's by verify.sh, but the link's CPU half is a hand port to JavaScript that only a reader checks, and with no audio Audio Fade does nothing there.
  • No OpenFX port, no presets. There is a user guide at https://stoatworks-labs.com/software/downlink/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.