Slowscan
Slow-scan TV over a fading HF path, for Resolume

What it does
An FFGL effect for Resolume Arena and Avenue. Slow-scan television sends a still picture down a voice radio channel as audio: each pixel is a tone, 1500 Hz for black to 2300 Hz for white, sent a line at a time with a 1200 Hz pulse between lines. A Martin M1 picture takes almost two minutes. At the other end an FM discriminator turns the tones back into brightness, and the decoder paints each line as it arrives.
So Slowscan builds the chain — source, tones, HF channel, discriminator, line timing, picture — and runs it on the CPU at 11,025 samples a second, with Martin M1, Scottie S1 and Robot 36 timed from J. L. Barber's SSTV mode specifications. The clip is read back at the mode's resolution and sent, either latched when a picture starts, as a station sends a stored image, or live, line by line. What reaches the screen is whatever the receiver made of it, the new picture overwriting the old from the top under a cursor.
The receiver times its lines from its own sound-card clock, so a clock a few ppm off leans a vertical edge by e × T_line / T_pixel pixels a line — 0.29 at 300 ppm in Martin M1. Martin sends green, blue and red in turn, so the same slant pulls the end of one colour scan into the start of the next and fringes the edge. Slant Correct subtracts a set ppm, as decoders do; Line Sync re-anchors every line on its 1200 Hz pulse and the lean goes.
Below the FM threshold, around 3 dB SNR in 3 kHz, the discriminator throws clicks and the picture turns to streaks. Rx Bandwidth is the discriminator's lowpass, and narrowing it smears edges to the right. A seeded Clarke fading model takes the SNR down in a fade, so FM does not dim but turns whole bands of lines noisy, a second path makes ghosts, and a carrier on frequency beats with the picture tones into vertical stripes. Resolume hands an effect 64 FFT bins rather than a waveform, so the audio routed in goes on air as noise shaped by those bins, and the music lands in the picture where its spectrum overlaps the SSTV band.
Speed runs the two-minute picture in as little as a second, and it changes only how many samples a video frame is worth: every process is defined per sample, so a noisy, fading picture comes out bit-identical at 1x and at 120x. Auto VIS cycles the three modes and decodes each from its header.
- The whole chain, tones to HF channel to discriminator to picture, at 11,025 samples a second
- Martin M1, Scottie S1 and Robot 36, and Auto VIS, which decodes each from its header
- Slant from the receiver's clock error, with Slant Correct and Line Sync to take it out
- Progressive arrival under a cursor, from a picture latched at the start or sent live
- SNR, Rayleigh fading, multipath and a QRM carrier, with the FM threshold's noise streaks below the knee
- The audio routed in goes on air as interference, shaped by the host's spectrum
- Speed from 1x to 120x, which changes nothing per sample
- Universal macOS bundle and a Windows x64 DLL
Where it stands
v0.1.0, and honestly early. The radio is measured, not asserted, by an offline harness that drives the real plugin class and the signal chain it owns, at two rasters: every line start, segment boundary and pixel boundary of Martin M1, Scottie S1 and Robot 36 lands on its constant to the sample over a whole frame; at ±100 and ±300 ppm the fitted lean is within 5e-5 px/line of e × T_line / T_pixel, and fitted again in the rendered frame at ±150 ppm it is 0.14637 px/line against 0.14634; flat black, grey and white come back to the exact 8-bit value, and an edge's tail decays with τ = 5.797 px against the lowpass's 5.797; above the FM threshold the pixel noise is within 2% of the linearised discriminator's closed form, and the knee is at 3.70 dB SNR against Rice's 3.11 (tolerance 2.78); the VIS header decodes back to the mode it was sent in; at 300 ppm, where Free-run would drift 75 px, Line Sync holds the edge within 0.24 px; 24 lines of a noisy, fading, multipath picture are bit-identical at 1x and 120x; and fourteen negative controls and a one-character mutation of the shipped shader are caught. All 20 swept controls change the picture. Render cost on macOS at the defaults (40x) is 1.04 ms/frame at 720p, 1.02 at 1080p and 1.04 at 4K; it is nearly all the CPU signal chain, on the host's render thread, and it scales with Speed, to 2.58 ms at 120x (1080p). 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; its three audio-driven controls could not be exercised there, because the box has no sound device. Nobody has measured how Resolume lays out its 64 FFT bins, so Bin Spacing is an assumption and the bins are read as magnitudes; the fading is flat, the channel is at most two paths, and the receiver is one decoder design, not MMSSTV's or QSSTV's. 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
Nothing loads from YouTube until you press play.Watch it there instead