Skip to content

Releases: stoatworks-labs/schlieren

Release list

v0.1.0

Choose a tag to compare

@github-actions github-actions released this 14 Oct 01:32

The first release of Schlieren: pressure waves on the beat for Resolume Arena and Avenue, as an FFGL effect (SW Schlieren, SZ01). A loudspeaker fires a pulse of sound into the air on every beat, on every hit in the music or when you press Fire, and you watch your clip through that air the way a schlieren camera would. It's the only way I know to fire a 165 dB starting pistol on every beat without a noise complaint.

The one idea: you can't see sound, but you can see what it does to light. A pressure wave squeezes the air, denser air bends light towards it by a few millionths of a radian, and in 1864 August Toepler worked out that a knife edge at the focus of a lens turns those bends into light and shade. So the plugin is the whole chain, in real units: a 20 cm speaker firing a Pop, a Kick or a Blast at 120 to 190 dB at a metre, a spherical wave that steepens into shocks when it's loud (weak-shock theory), the beam's view of it summed along its path, and air's Gladstone–Dale constant bending the light. The rings, their light and shade, the cracks, the echoes and the caustics all fall out of that. The one cheat is the camera: Slow Motion runs from 30× to 30 000×, but the beats arrive in real time, each firing a pulse you then watch slowed down.

Downloads: a universal macOS bundle (Apple silicon and Intel) as a .dmg or .zip, and a Windows x64 installer (-setup.exe) or .zip. Every download carries the one effect: Schlieren.bundle on macOS, Schlieren.dll on Windows. The macOS build is Developer ID-signed and notarised by the fleet's signing agent once the release is published. The Windows build isn't signed, so SmartScreen warns once.

What is measured (offline, by tools/verify.sh on an Apple Silicon Mac, driving the plugin's own class in a headless GL context at two rasters and on Apple's software renderer):

  • The air. c = 343.2 m/s against √(γRT/M) = 343.23; ρ = 1.2040 against pM/RT = 1.2041; n − 1 = 2.721e-4 against Edlén's standard air at 20 °C, 2.723e-4; 140 dB SPL is 200 Pa.
  • Shocks. A Pop's shock forms between 0.95 and 1.1 of the age weak-shock theory gives. A top hat's shock and an N-wave's length land within a cell of their closed forms, and Pop, Kick and Blast agree with a 2400-cell Godunov solve to within its own error.
  • The beat. On every Fire On beat setting, every pulse leaves within 6e-14 s of its beat.
  • The beam. 0 of 2048 table texels outside their bound against a brute-force Gauss–Legendre line of sight (worst 2e-6 of the peak, 2e-4 at a Blast's shock front). 0 of 14 651 sampled pixels of the field outside theirs. The front sits between the last pixel that moved and the first that didn't at 0.69, 1.26 and 1.84 m, and the projection fades as R^−0.522 against theory's −0.5.
  • The optics. The knife at 0°, 90° and 210°: 0 of 6180 pixels outside clamp(1 + ε·k/ε_c, 0, 2). The shadowgraph keeps to its first-order law within its bound everywhere, and keeps the frame's light to 1.000001. The backdrop at 20 km is displaced by Lε, up to 76 px, with a worst error of 0.18 px.
  • Walls, audio and the rest. A rigid floor mirrors the field bit for bit, and a box's four walls to 5e-4. Six kicks give six pulses, each on its kick's frame; Accent puts soft hits 12 dB under hard ones, and with no audio every pulse is at Loudness. A new raster keeps the air (0 bytes differ), and the host's GL state comes back.
  • The checks can fail. 16 models that are wrong on purpose and 16 one-character mutants of the shipped GLSL and C++ are all caught. All 21 controls the sweep can move change the picture; the 22nd, Audio, is the input Threshold and Accent are swept through. The bundle is universal, and oxbow renders 120 frames through it.

On macOS it's never been loaded into Resolume; the fleet's test host, oxbow, is the only host it's run in there.

Windows, in Resolume Arena 7.27.1 (win-lab, Mesa llvmpipe: software rendering, no GPU, no sound device): the x64 build loads, registers and renders, and passed all 9 of the fleet's Arena checks that can run there (the audio one is skipped). Every control is as declared and Arena's log stays clean. Eight controls measurably changed the picture in one run (Loudness, Field Width, Sensitivity, Distance, Grey Field, View, Mix and Arena's own Opacity), and nine in the formal run on the build being released, where Pulse joined them. The rest that act on the rings (Fire On, Length, Speaker X and Y, Slow Motion, Walls, Reflection, Optics and Knife Angle) came back too close to call rather than dead: with a pulse on every beat the air never sits still between two of the gate's grabs. Threshold, Accent and Audio need sound, which that machine hasn't got. Software rendering says nothing about a GPU or about speed.

What is assumed, or unconfirmed. No host anywhere has played it any music, so Accent and Threshold on Resolume's own FFT are untested, and nobody has measured what level Resolume's bins carry. On a Mac, I haven't seen how the 22 controls read in Arena's inspector or how Fire On follows Arena's transport. Weak-shock theory is honest to about a third of an atmosphere at the speaker's surface, which is about 165 dB at a metre, where the default sits; past roughly 170 dB the shocks are a good look rather than a prediction. Echoes are added up linearly (no Mach stems), the shadowgraph past a caustic is capped at sixteen times the light, and the air is dry, at 20 °C, with no control for it.

Cost: GPU time, the median of 120 frames on an Apple Silicon GPU shared with other work. At the defaults (120 BPM, about eleven pulses in the air) it's 0.43 ms at 720p, 0.54 ms at 1080p and 1.91 ms at 4K. Half Beat in a box of rigid walls on Shadowgraph, with up to 107 images in the air, takes 0.60, 1.10 and 4.04 ms. Nothing was timed inside Resolume.

Not done. No presets, no browser demo and no OpenFX port.