Releases: stoatworks-labs/spasis
Release list
v0.1.1 — the user guide, and the button that opens it
Nothing about what the four displays draw has changed. The analysis, the geometry and the shaders are byte-for-byte the v0.1.0 ones, and the same 296 offline checks pass. This release exists to add the fourth About button and the guide behind it.
A user guide
There is now a Spasis user guide, and each plugin's About block has gained a User guide button that opens it. v0.1.0 shipped with three buttons because there was no guide for a fourth to point at — the About block only ever emits a link it can see a page for, rather than showing a button that opens a 404.
The guide covers the one piece of setup this project actually needs — pointing Audio Input at a real capture device — and why three of the four displays draw only their graticule until you do. Two of the control descriptions are taken from the code rather than from the slider, and both would have been wrong by eye:
- Gain is a decibel control spanning −12 dB to +24 dB, so the centre default is +6 dB, not unity.
- Persistence is a half-life from 20 ms to about two seconds, so the bottom of its travel is roughly one frame rather than instantaneous.
For anyone building from source
sptest gains --movie, which streams raw RGBA frames from the shipping render path for ffmpeg to encode — it is what the project video is made from. Shot names come from the same table --sheet uses, so a shot is always a configuration the contact sheet also renders and checks, and an unknown name fails rather than falling back to a default.
tools/verify.sh grows two checks on it, and the glslc shader pass moved into tools/check-shaders.sh so CI and verify.sh run one implementation instead of two copies.
Still true, and still the thing to know
It has never been fed by a real desk and has never run a show. A microphone and a silent loopback are not a 5.1 stem feed, so the layouts, the rose and the width plot have only ever seen synthetic multichannel audio. First contact with a live rig found five bugs in a plugin that had already passed three hundred offline checks — check it in your own rig before trusting it in front of an audience.
Full changelog: v0.1.0...v0.1.1
v0.1.0 — the stereo and surround field, drawn
First release.
Four FFGL sources for Resolume Arena and Avenue that draw the shape of the stereo and surround field — where the energy is pointing, how wide each part of the spectrum is, and what the balance looks like — as sonar-style displays you can put on a screen rather than in a meter bridge.
| Source | What it shows |
|---|---|
| Spasis Field | The goniometer. Where the signal sits, instant by instant. |
| Spasis Rose | Polar level: energy against direction, or a lobe per speaker. |
| Spasis Width | Stereo width against frequency. |
| Spasis Balance | Tonal balance. |
All four take the same two controls — a Shape (circle, half circle, or the whole raster) and a Style (oscilloscope, bargraph, or particles) — so four displays × three shapes × three styles is thirty-six pictures out of one set of controls that behaves the same way in every plugin.
The claim, and how it is checked
The stereo layout is ±45°, not the ITU ±30°, and that is the most consequential number in the project. The field point for one instant is the amplitude-weighted sum of the unit vectors to each speaker; at ±45° that comes out as exactly (side, mid), which is the classic goniometer — mono up the vertical axis, out-of-phase flat on the horizontal. The generalised law and the instrument every engineer already owns are the same thing, and they are only the same thing at 45°.
That is measured rather than asserted. sptest --field fails if a hard-panned channel stops landing at 45°, and sptest --width fails if the width reading stops agreeing with |S|/(|M|+|S|) at any landmark. Both drive the analysis code that ships — the harness links the same object library the four bundles do.
It captures its own audio
FFGL offers a plugin exactly one audio input: a buffer of N magnitude bins of a mono sum. No phase, no channels, no time-domain samples. A goniometer needs L and R as waveforms, per-band width needs the complex spectrum of each channel separately, and a surround rose needs six. None of that is recoverable from a mono magnitude spectrum, and a plugin that guessed would draw four plausible pictures of nothing.
So Spasis opens its own capture device — a loopback like BlackHole, a Dante Virtual Soundcard, or an interface with the desk feeding it. Point Audio Input at it and pick the Speakers layout that matches: stereo, quad, 5.1, 7.1, or an even ring of any channel count up to eight.
Left on its default the input is Resolume's own mono FFT, which needs no setup and works in any host — and can only show Balance. The other three then draw their graticule at full brightness and nothing else: an empty instrument rather than a black frame. The same happens when a chosen device is delivering digital silence, which on macOS is exactly what a host without microphone permission is handed instead of an error.
Verified
- Loaded and run in Resolume Arena 7.27.1 on both platforms. On macOS all four register as video sources, expose their parameters with the right names and defaults, and capture live audio from a real CoreAudio device — a mono microphone drew a correctly vertical goniometer trace. Multichannel capture was checked against real hardware: a 6-channel bridge opens as 6 at 48 kHz, and a 112-channel L-ISA bridge is correctly capped to 8 at 44.1 kHz. On Windows all four DLLs load and instantiate under Mesa llvmpipe, which means every shader compiles under a GLSL compiler that is not Apple's.
- 296 offline invariant checks, including the FFT against a direct DFT to within −80 dB, the field law at ±45° and the ITU layout landing at 30° instead, width against
|S|/(|M|+|S|)generalising to six channels, an LFE-only 5.1 signal leaving the field at the origin while still reading a level, the host-FFT fallback leaving field, rose and width empty rather than inventing them, and the capture ring dropping the oldest sample and never the newest. - A twelve-picture contact sheet that fails any display coming out blank or solid.
- Universal macOS bundles (
arm64+x86_64) and Windows x64 DLLs, checked withlipoandnmin the release job rather than trusted to the build log.
Not verified
- Never fed by a real desk. A microphone and a silent loopback are not a 5.1 stem feed. The layouts, the rose and the width plot have only ever seen synthetic multichannel audio.
- Never run a show. No sustained run, no performance figures on a real GPU, no VJ has touched the controls. First contact with a live rig found five bugs in a plugin that had already passed three hundred offline checks — so check it in your own rig before trusting it in front of an audience.
- No factory presets, and no user guide yet.
Install
Drop all four bundles (macOS) or all four .dlls (Windows) into Resolume's extra effects folder and restart Resolume:
- macOS —
~/Documents/Resolume Arena/Extra Effects/ - Windows —
Documents\Resolume Arena\Extra Effects\
Use Resolume Avenue in place of Resolume Arena for Avenue. They appear as four sources, not effects.
MIT licensed.