Skip to content

Releases: stoatworks-labs/splitflap

Release list

Splitflap v0.1.0

Choose a tag to compare

@github-actions github-actions released this 24 Sep 20:45

The picture on a split-flap departures board, as an FFGL effect for Resolume Arena and Avenue, shown as SW Splitflap. Every cell of the board is a drum of flaps, each printed with one symbol, and a drum can only turn forward, one flap at a time, at the motor's rate: to show a new symbol a cell passes through every flap between the one on show and the target, and every flap in the air is a hinged plate falling under gravity that hesitates, slaps on to the stop and flutters. A change ripples across the board, a step brighter is one flip and a step darker is the whole drum, a moving picture is never finished, and the drum can be printed with tones, one of six palettes, or the characters of a message. Nothing is animated by hand.

What is verified

By tools/verify.sh on an M4 Max, macOS 26.4, on 2026-09-24, every check read off the rendered picture at 640×360 and 320×180:

  • Between two targets every cell of an 8×4 board with an 8-flap drum makes exactly (target − current) mod 8 flips, counted as tone changes on its top row: 0 of 32 cells wrong at both rasters. With backward flips allowed, 8 of 32 fail.
  • One step brighter is bit-identical from frame 11 after the change (one 12-frame flip), one step darker from frame 83 (eleven flips). Backward, the darken settles on frame 12.
  • A 16×9 board of tones near but not on the flaps, with stagger and the default bounce, lands every cell on its nearest flap by frame 127 and then holds bit-identical for 30 frames.
  • The flap in the air follows the harness's own velocity-Verlet solution of θ″ = (3g/2L) sin θ within 0.49 px of a 90 px half-cell over 59 frames and lands on frame 59; the flutter at full bounce within 0.48 px over 40 frames. A constant acceleration lands on frame 29 and fails 6 of 6; gravity 15 % high lands on frame 55 and fails 6 of 6.
  • A 640×360 ↔ 320×180 resize and an 8 → 16 column regrid on frame 30 of a run keep every flap and every count (0 of 32, 0 of 64 wrong). With the state cleared on a resize, 28 of 32 fail.
  • Loud audio on frame one fires nothing in 60 frames; a real onset fires on its frame. Unprimed, the detector fires on frame 0 and is then deaf.
  • Six negative controls caught; one character changed in the shipped board shader is caught by --fall and --flips; tools/mutate.sh 4 of 4.
  • All 23 controls change the picture at both rasters; the four shaders compile through glslc; --pipe writes whole frames and exits 1 on a closed stdout; oxbow loads it as SW Splitflap / SF01 / effect and renders. CI runs the checks and the sweep on GitHub's macOS runner (software GL) and they pass there too.
  • Render cost on the largest board (96×54): 1.16 ms a frame at 720p, 1.60 at 1080p and 4.21 ms at 4K on a quiet machine (6.0 / 7.4 / 11.6 ms under a load average of 13). macOS figures only.
  • The release survey changed one constant before the tag. Every bundled demo clip went through the Text drum, and at the shipped threshold (a cell mean luma of 0.5) no clip lit more than 18 of 120 cells; at 0.25 the brightest lights 92 and the dark clips stay blank. The drum lights a cell at a quarter of full luma. Two facts for the guide came out of the same survey: Rainbow and Candy have no dark stop, so a dark cell takes their first swatch; and a re-print or regrid keeps the flap indices until the next update.
  • Windows, in Resolume Arena 7.27.1 (win-lab, Mesa llvmpipe, no GPU, 2026-09-24): the v0.1.0 candidate DLL loads from Extra Effects, registers as SW Splitflap / SF01 / effect, all 30 host controls match the declaration in name, order, type, range and default, it renders and Arena's log stays clean: 9 of the fleet gate's 9 checks, with 15 controls moving the picture (Cell Aspect under Fit off, Palette under the Colours drum). Seven controls read inert on the gate's still carrier by design: Flip Time, Stagger, Module Width, Update, Interval, Bounce and Drum Order act only while cells are moving or settle to the same tone, and the harness measures each of them; Audio was skipped for want of a sound device. Software rendering says nothing about a GPU or about speed.

What is not

  • Never loaded into Resolume on macOS.
  • No real audio has reached it in a host: the onset detector's thresholds were set on synthetic spectra, and nobody has measured what Resolume's 64 FFT bins carry.
  • The Text threshold is a constant; cells in a module share a start delay, not a shaft phase; the cell mean comes from the driver's mip pyramid; perspective is a fixed 10 % widening of the free edge.
  • The board is silent: FFGL has no audio output.
  • No OpenFX port and no presets. There is a user guide at https://stoatworks-labs.com/software/splitflap/guide/ and a browser demo at https://splitflap-demo.stoatworks-labs.com/.

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.