Releases: stoatworks-labs/needle
Release list
v0.1.1
A fix release. In v0.1.0 the second (right) meter of a Stereo Pair only ran while Count was on Stereo Pair. If you switched Count to Mono and back, the right meter picked up where it had stopped. For about two seconds it then disagreed with the left one, swinging to catch up with a level that had moved on. It was spotted on the bargraph while filming the project video.
Count now decides how many meters are drawn, not how many are running. Both meters are integrated on every frame. The hidden one keeps reading the programme just as the visible one does, so it comes back already in agreement. Re-seeding the right meter from the left on its return was the other option. It was rejected because it would be a jump the model never made, and it would need its own rule for the hold bar, the eye's heater and a worn pointer's resting place. The cost is a second set of four scalar models at 4800 Hz, which the render bench cannot see.
Nothing else changes. The ballistics, the controls, their names and defaults, and the 37 host parameters are the same as v0.1.0.
What is verified
By tools/verify.sh on an M4 Max, macOS 26.4, on 2026-09-23 (every check passed):
- New:
ndtest --pair. It drives the plugin through its own parameter list and frame path, on all four Types. The level falls in one scenario and rises in the other while the right meter is hidden. Both meters read the same, bit for bit, on all 241 paired frames of every scenario. - The check has a negative control. It is v0.1.0's rule, rebuilt from the engine's public API, and it must fail all 8 scenarios. It does: the worst disagreement is 1.38 of full scale on the VU and 0.99 on the magic eye. A build of the real v0.1.0 source fails the same 8 with the same numbers.
- Everything v0.1.0 verified still holds:
- ANSI C16.5: 99 % at 300.000 ms, with 1.2500 % overshoot.
- IEC 60268-10 type II: 20 dB of fall-back in 2.800000 s.
- The 3 dB LM3915 ladder, the eye's shadow, frame-one priming and frame-rate independence.
- The worn pivot, the defaults, the names and the font.
- Pixel-exact draws at 640×360 and 1920×1080. All 31 swept controls are live.
- Universal binary,
plugMain, ad-hoc signing, andoxbowseesSW Needle/ND01/ source.
- Render cost is under 0.03 ms/frame from 720p to 4K. This is a macOS figure only.
What is not
Everything listed under v0.1.0 still applies.
- It has never been loaded into Resolume on macOS.
- No real audio has reached it in a host. Resolume's 64-bin FFT mapping is assumed; Bin Law is the hedge.
- It is not a true-peak meter. The PPM and the bargraph run on a block RMS.
- A stereo pair is still two instruments reading one spectrum, not two measurements. What this release fixes is that the two now always agree.
- This build has not been through the Arena gate on Windows. v0.1.0 passed it; the only change is inside the CPU engine.
The macOS build is signed and notarised; the Windows build is unsigned, so SmartScreen warns once.
v0.1.0
Audio meters with the ballistics their standards actually specify, as an FFGL source for Resolume Arena and Avenue, shown as SW Needle. There are four instruments: a VU, an IEC 60268-10 type II PPM, a ten-step LM3915 bargraph with a peak hold bar, and a 6U5 magic eye. Each one is drawn live at the output's own raster.
The movement is not a free choice. A VU meter is a mass on a spring with viscous damping, which gives two free parameters, and ANSI C16.5 states two figures about it. needle solves the parameters from those figures in code (zeta 0.812716986, omega_n 13.5119 rad/s), so nothing was tuned by eye. The overshoot on a kick falls out of that. So does 0 VU sitting at 71% of the arc, and so does a worn pivot that stops the pointer short instead of slowing it down. The level is the square root of the sum over all 64 bins of Resolume's spectrum, which by Parseval does not depend on how the bins are laid out. Fixed at release: the docs no longer claim that flipping Standard off at the defaults changes nothing. In Free, the VU falls over the PPM's 2.8 s instead of its own 300 ms, and the PPM rises over the VU's 300 ms.
What is verified
By tools/verify.sh on an M4 Max, macOS 26.4, on 2026-09-23:
- ANSI C16.5: 99% of a step at 300.000 ms (allowed 300 ± 5) and overshoot of 1.2500% (allowed 1.0–1.5). The oversampled integrator tracks the exact step response to better than 1e-12 of full scale.
- IEC 60268-10 type II: 20 dB of fall-back in 2.800000 s (allowed 2.8 ± 0.05). A 5 ms burst reads 2.000000 dB below the same tone held.
- The LM3915 ladder: ten thresholds, found by bisecting on the input rather than read back from the code. Every gap is 3.000000 dB, and the bottom rung sits at −27.000 dB.
- The magic eye's shadow never widens as the level rises across a 60 dB sweep. It is 100° when open, and the wings overlap by 15° at +6 dB.
- A clip triggered at t = 40 s reaches 99% at 300.24 ms, within 2.5 µs of one triggered at zero. Half a second of the same signal reads 0.712908590 at 24, 30, 50, 60 and 144 fps, with a spread of exactly zero.
- At Wear 1 the pointer stops 2.0% of full scale short, from either direction. At Wear 0 it is bit-identical to a frictionless movement at every one of 9,600 steps.
- Pixel-exact draws at 640×360 and 1920×1080, and all 31 swept controls measurably change the picture.
oxbowregisters it, instantiates it and gets lit pixels back, asSW Needle,ND01, source.- Render cost 0.014 ms/frame at 720p, 0.023 at 1080p and 0.023 at 4K, taking the fastest of five passes. The 4K spread was 0.023–0.073, so read this as under 0.03 ms. These are macOS figures only.
- The Windows x64 DLL compiles with MSVC in CI.
- The physics checks,
ndtest --pixelsand the control sweep also run in CI on GitHub's GPU-less macOS runner, using its software renderer, and passed there. - Windows, in Resolume Arena 7.27.1 (win-lab, Mesa llvmpipe, no GPU, 2026-09-23): a CI build of this source passed all 9 of the fleet gate's checks with one skip — it loads from Extra Effects, registers as
SW Needle/ND01/ source, all 37 host parameters match the declaration, it renders, the log stays clean, and 21 controls move the picture. The 11 audio-driven controls were skipped because the box has no sound device, so no real audio has reached it in a host on either platform. Software rendering says nothing about a GPU or about speed.
What is not
- Never loaded into Resolume on macOS. How 31 controls in four groups present in the inspector is untested.
- No real audio has reached it in a host, so Resolume's 64-bin FFT mapping is assumed. Nobody knows whether a bin holds a magnitude or a power, and Bin Law is there so you can choose. The calibration is nominal: Reference Level and Sensitivity are how you put the needle where your programme sits.
- It is not a true-peak meter. The PPM and bargraph run on a block RMS, which reads a sine 3.01 dB below a real PPM, and peakier material further below that. The ballistics follow the standard; the detector does not.
- A stereo pair is two instruments reading one spectrum, not two measurements.
- Three quoted figures come from background knowledge and were not checked against a document: the 2 dB for a 5 ms burst, the BBC PPM's seven marks at 4 dB apart, and the 6U5's 100° shadow.
- Text is pixel-exact only at Rotation 0.
- No factory presets, no OpenFX port, no browser demo. There is a user guide at https://stoatworks-labs.com/software/needle/guide/.
The macOS build is signed and notarised; the Windows build is unsigned, so SmartScreen warns once.