Pattern v0.1.0
A tracker's pattern editor written by the music as it plays, as an FFGL source for Resolume Arena and Avenue, shown as SW Pattern. A tracker plays a pattern of 64 rows at a rate set by Speed (ticks a row) and BPM (a tick is 2.5 / BPM seconds), four rows a beat at the default Speed of 6. FFGL gives a plugin no audio output, only the spectrum of what is playing, so this runs the tracker backwards: the row cursor runs on the real tracker clock, rate-locked to the host's tempo, and each channel owns a band of the host's 64-bin spectrum. An onset in that band writes a note into the channel on the current row — its pitch from the band's peak bin, its volume as a Cxx effect from the onset's strength, its sample number from the channel. After row 3F the cursor wraps and the next pass overwrites the last, each row cleared as the cursor enters it.
Nothing is animated. The cursor steps on the beat because it runs on a clock; a busy passage fills every row and a sparse one leaves dots because nothing is written that was not heard; an arrangement change shows as the old notes being replaced. Tempo Source (Host, Detected, Manual), Speed 1–31, Swing, 64 or 32 rows, Keep Notes; four or eight channels, Bin Law (Linear / Log) and Bin Value (Magnitude / Power) for the host's unmeasured spectrum, Sensitivity, Band Split, Fold Octaves; three themes named by colour, 3–33 rows visible, VU bars, an effects column, and whole-pixel scaling. It is not a MOD player; it draws no logos and no tracker's name.
What is verified
By tools/verify.sh on an Apple M4 Max, macOS 26.4, on 2026-09-24, eight of nine check groups with no GL context at all:
- The row cursor sits on floor(t / T) mod 64 on every one of 36,000 frames of a ten-minute run at 60 fps (30,000 at 50, 18,000 at 30) from a host clock at 499,000,000 ms, with a quarter-row swing and across a 125 → 90 → 180 BPM change with no row jump. A phase kept in float fails on 2,400 frames.
- A burst in band k writes exactly one note, in channel k, on the row current at that frame, at four and eight channels under both bin laws; a burst held across a row boundary writes once.
- Loud stationary audio already playing when the clip starts, at 40 s and at 499,000,000 ms, writes no false note in the first second, and a real onset at 1.5 s is still heard.
- All 64 bins give the predicted note or
---under Linear and Log, folded and unfolded; a 96 kHz sample rate moves the notes as predicted. - The next pass clears, keeps (Keep Notes) and overwrites rows exactly; a jump of 520 rows clears the pattern.
- A metronome at 120, 100 and 150 BPM, at 24–60 fps, is detected within ±1 BPM by 3.00 s and held for twelve; the row clock follows it over a host saying 77.
- At 640×360 and 320×180, Scale 1–4 and Auto, four and eight channels: every s×s block is one colour, every pixel outside the screen is the background, every probed glyph matches the font table bit for bit.
- Seven negative controls each fail their check; a one-row shift in the shipped shader fails 36 assertions. All 17 controls change the picture at both rasters.
oxbowprobes it asSW Pattern/PN01/ source. - Render cost at the defaults: 0.041 ms/frame at 720p, 0.054 at 1080p, 0.128 at 4K (macOS figures only).
- CI (
ci.yml) green on the release commit, macOS and Windows. - 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 Pattern/PN01/ source, all 23 host controls match the declaration, it renders, the five visual controls move the picture and Arena's log stays clean: 9 of the fleet gate's 9 checks. The box has no sound device, so the 12 audio-driven controls were not exercised there; the Manual BPM changes three header digits on a still and read inconclusive. Software rendering says nothing about a GPU or about speed.
Found filming the release video
The video was rendered by the harness from a synthesised 125 BPM track through the plugin's real audio input (pntest --pipe --wav), so the harness's FFT and normalisation, not Resolume's. Three facts, all in the user guide:
- A quiet band hears the leading edge of any sharp transient: the first frame holding an onset carries only its first milliseconds, which are broadband, so a hard-attack kick writes every channel until each band's floor has learned the leak (about a second).
- A band holding a sustained instrument adapts its floor to it and can miss a kick that a quieter neighbouring band writes from the leak.
- The Detected tempo source read the bar, not the beat, on this groove: 62 for 125 in three takes. The
--detectedmetronome checks still hold; the video uses the Host and Manual sources.
What is not
- Never loaded into Resolume on macOS, and no real audio has reached it in a host. The layout, value law and sample rate of Resolume's 64 bins are assumptions with switches; the onset thresholds were set on synthetic spectra.
- Rate lock only, no lock to the host's downbeat (
barPhaseunused). - No OpenFX port and no presets. There is a user guide at https://stoatworks-labs.com/software/pattern/guide/ and a browser demo at https://pattern-demo.stoatworks-labs.com/, which is a port rather than the plugin.
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.