Stoatworks Labs

Spasis

The shape of the stereo and surround field, for Resolume

Releasedv0.1.2Plugin & ModuleC++ / GLSL
Spasis — The shape of the stereo and surround field, for Resolume
Spasis Field — the goniometer, circle shape, oscilloscope style — rendered by the project's own offline harness from a synthetic programme in a headless GL context, not a Resolume screen capture. The same command is in the repo's README, so the picture can be regenerated rather than being a file nobody can reproduce.

What it does

Four audio sources for Resolume Arena and Avenue. Spasis Field is the goniometer, showing where the signal sits instant by instant. Spasis Rose is polar level, energy against direction or a lobe per speaker. Spasis Width plots stereo width against frequency. Spasis Tonal is tonal balance. Each one's its own plugin rather than one plugin with a measurement dropdown, because that's how a VJ browses a source list, and it keeps every parameter set inside FFGL's sixteen-character name limit.

All four share the same two controls, a Shape (circle, half circle or the whole raster) and a Style (oscilloscope, bargraph or particles), so four displays by three shapes by three styles gives thirty-six pictures from one set of controls that works the same in every plugin.

The stereo layout is ±45° rather than the ITU's ±30°, and that's the most important number in the project. The field point for one instant is the amplitude-weighted sum of the unit vectors to each speaker, and at ±45° that comes out as (side, mid), which is the classic goniometer: mono up the vertical axis, out-of-phase flat along the horizontal. The general law and the instrument every engineer already owns turn out to be the same thing, but only at 45°. The offline harness checks it: it fails if a hard-panned channel stops landing at 45°, or if the width reading stops agreeing with |S|/(|M|+|S|) at any landmark.

The other decision worth knowing about is that it captures its own audio. FFGL gives a plugin one audio input: a buffer of N magnitude bins of a mono sum, with no phase, no channels and 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 of them. None of that can be got back from a mono magnitude spectrum, and a plugin that guessed would draw four convincing 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.

Left on its default, the audio input is Resolume's own mono FFT, which needs no setup and works in any host, but can only show Tonal. The other three then draw their graticule at full brightness and nothing else, so you get an empty instrument rather than a black frame. The same happens when the chosen device is delivering digital silence, which on macOS is what a host without microphone permission gets handed instead of an error. FFGL gives a plugin no way to draw text and no window, so Spasis can't tell you why in words, but it can at least make sure it doesn't look like a plugin that's crashed.

  • Four sources — Field (goniometer), Rose (polar level), Width (stereo width against frequency) and Tonal (tonal balance)
  • One control surface across all four: three shapes × three styles, thirty-six pictures
  • Stereo, quad, 5.1, 7.1, or an even ring of any channel count up to eight
  • Its own multichannel capture from any device the machine offers — BlackHole, Dante Virtual Soundcard, or an interface fed by the desk
  • A host-FFT fallback that needs no setup, works in any host, and refuses to draw the three displays it cannot know
  • LFE contributes a level and never a direction; height channels are shaded rather than moved, because a flat picture cannot show elevation
  • Universal macOS bundles (Apple Silicon and Intel) and Windows x64 DLLs

Where it stands

Released at v0.1.2, which only changes the name each plugin reports, so the four sit together in Resolume's browser as SW Spasis Field, Rose, Width and Tonal. Balance became Tonal to fit FFGL's sixteen characters, and the plugin IDs and bundle names haven't changed. v0.1.1 added the user guide, and a browser demo followed, but what the plugins draw is still v0.1.0's. The macOS builds are signed and notarised. All four sources have been loaded and run in Resolume Arena 7.27.1 on both platforms. On macOS they register as video sources, show their 22 parameters with the right names and defaults, and capture live audio from a real CoreAudio device: a mono microphone drew a properly vertical goniometer trace, and multichannel capture was checked against real hardware, with a 6-channel bridge opening as 6 at 48 kHz and a 112-channel L-ISA bridge correctly capped to 8. On Windows all four DLLs load and instantiate under Mesa llvmpipe, so every shader compiles under a GLSL compiler that isn't Apple's. Behind that are 300 offline checks covering the FFT against a direct DFT, the field law at ±45° and the ITU layout at 30°, the width reading out to six channels, and the capture ring dropping the oldest sample rather than the newest. What hasn't happened: it's never been fed by a real desk (a microphone and a silent loopback aren't a 5.1 stem feed, so the layouts, the rose and the width plot have only ever seen synthetic multichannel audio), and it's never run a show. First contact with a live rig found five bugs in a plugin that had already passed three hundred offline checks, so try it in your own rig before you trust it in front of an audience.

Watch it running

Spasis video thumbnail

Nothing loads from YouTube until you press play.Watch it there instead