Validation
What was run, with which tools, and what came out. The results are a snapshot: they say what
was true on the date given, not that every later change was checked the same way. Re-run
cargo xtask validate <plugin> for your own plugin and version.
macOS (2026-10-24 and 2026-10-25; macOS 26.6, Apple silicon)
| Check | Result |
|---|---|
cargo test (parameters, queue, state, presets, MIDI learn, ADSR; CLAP interface: pedal, bend, mod wheel, envelope, presets, an old session sample-exact, random playing, no allocation in process; controller: session chunk, presets with JSON and text data, request routing, mark_dirty off the main thread, parameter gestures, web view size in the session; sub-block song position; preset metadata read, written and kept on overwrite, saved through /__apf/preset/save, reported to CLAP indexers; 250 factory and 250 user presets of 6 KB listed under 20 ms) | pass |
| clap-validator 0.4.1 (with the deadlock fix below) | 38 passed, 0 failed, 6 skipped; the preset-discovery tests pass, also with 250 extra user presets (list presets: 256, with features and descriptions) |
apf-host on the built .clap: render and web view round trip (page to host to page); claimed shortcuts reach the page, other keys reach the host with their key-up and modifier changes | pass |
| Steinberg VST3 validator (SDK 3.8.0) | 47 passed, 0 failed |
vst3-state-check (demo synth, and a larger modular synth built on APF): seven restore orders, web view closed against opened | pass; the demo synth bit-identical to the saved session (largest sample difference 0); the modular synth within 0.22 dB per band, and like its same-timed twins; --inject-stale fails all eight scenarios (2026-10-25) |
auval AUv2 (aumu ApDs MiSm) | AU VALIDATION SUCCEEDED |
auval AUv3 (aumu ApD3 MiSm) | AU VALIDATION SUCCEEDED |
| REAPER 7.62: CLAP, VST3 and AU loaded, rendered offline | all three identical (-14.8 dBFS RMS) |
| Logic Pro: AUv2 and AUv3 load, the web view shows, edits reach Logic | pass (open points in Known issues) |
| Logic Pro, AUv3: a project saved before new parameters were added loads with its sound; Smart Controls follow the first eight parameters; factory presets in Logic’s menu; mod wheel, bend and pedal reach the plugin | pass (2026-10-22) |
au-probe: AUv2 and AUv3 list the factory and user presets, selecting one loads it (also from the sandboxed AUv3) | pass |
Preset bar with 256 presets in apf-host (WKWebView): menu grouped by type, description as tooltip, the arrows step in that order and load | pass |
Tuning demo (controller): clap-validator, apf-host (including a 1 MiB POST body, five resizes, apf.resize), VST3 validator, auval v2 and v3 | pass |
xtask --project: a copy of the demo synth in a workspace outside APF, all formats, all validators | pass |
| Resizing in REAPER 7.62: CLAP, VST3 and AU windows resized to 1280, 900, 300 (below the minimum) and 1100 wide: the page follows and keeps its minimum | pass |
| Resizing in Logic: AUv3 by the page’s grip (Logic gives AUv3 windows no edge); the size is kept when the window is reopened | pass |
Audio input on an instrument (CLAP, VST3, AUv2, AUv3) and as aumf: REAPER renders, auval | pass |
Effects (examples 02 and 06): cargo xtask validate with a test signal on the input of vst3-state-check and au-state-check (AUv2 build); --inject-stale and a session that is not restored are caught | pass (2026-10-30) |
Hot reload (2026-10-30; macOS 26.6.2, Logic Pro 12.4)
| Check | Result |
|---|---|
Logic Pro 12.4, AUv3, a larger modular synth on APF with its window open, cargo xtask hot --watch running: a panel title changed in the Rust source | the watcher built and published in 3.3 s; the open window showed the new title 128 ms later; changed back in 2.4 s and 100 ms; one extension process throughout |
apf-host --hot-test (CLAP): a held chord, the web view open, a copy of the build published | swapped in 0.2 to 0.3 s while blocks kept playing; the moved parameter kept; the web view open again; sound after the swap |
A real DSP change while running: the modular synth’s output at half gain (CLAP in apf-host, AUv3 out of process); example 10’s oscillator fixed to a square wave (CLAP) | heard across the swap: −4.8 to −11.3 dBFS (CLAP), −5.1 to −11.2 dBFS (AUv3); −32.3 to −28.8 dBFS (example 10) |
au-hot-check: the AUv2 in-process and the installed AUv3 out of process, web view open | swapped while rendering, the parameter kept, sound after; the AUv3 loads the builds through its sandbox exception |
cargo xtask validate --hot, example 10 and the modular synth: every validator above on the shell bundles, plus the three swap checks | pass |
Not verified for hot reload: VST3 in a host (the shell passes the VST3 validator and the state check; its swap runs the same way as the CLAP’s), REAPER, Windows and Linux.
Not verified on macOS: a controller’s own knobs, wheels and pedal played by hand in Logic;
Bitwig (remote controls); mark_dirty lighting Logic’s or REAPER’s “changed” mark by a
controller edit (checked only through the CLAP interface); an aumf and an input-taking
aumu in Logic; Logic resizing an AUv2 web view by its window edge (see
Known issues). The standalone app has an open problem: do not leave it
running unattended.
Windows (2026-10-25; Windows 11, x64, 125 % scale, REAPER 7.83)
| Check | Result |
|---|---|
cargo test --workspace | pass |
apf-host --gui-test on the CLAP of the demo synth, the tuning demo and a larger modular synth: render, page-host-page round trip with a 1 MiB POST, Ctrl+D and Backspace into the page, an unclaimed Ctrl+S on to the host’s window, apf.maximize, five resizes | pass |
| REAPER 7.83: VST3 and CLAP scanned and loaded, offline render, project saved and reloaded (state restored without opening the web view, renders equal to -98 dB), web view opens, resizes, closes; the space bar over the web view plays in REAPER | pass |
cargo xtask bundle and install from Git Bash, PowerShell and cmd | pass |
cargo xtask validate on a larger modular synth: clap-validator 0.4.1 (37 passed, 0 failed, 7 skipped), apf-host, Steinberg VST3 validator (47 passed), vst3-state-check | pass |
Not verified on Windows: the standalone, other hosts (Cubase, Bitwig, Ableton Live), a second monitor with another scale, ARM64.
Audio input on an instrument, and MIDI-controlled effects
AudioLayout { main_input: 2, main_output: 2, note_input: true } gives a stereo input next to
the notes in every format; the output starts as a copy of the input, and the plugin adds its
voices to it. Checked on 2026-10-24 with a copy of the demo synth that adds its voices to the
input: CLAP and VST3 show two input pins in REAPER, the AUv2 and AUv3 an input bus (auval:
2-2 channels). A 220 Hz tone reaches the output unchanged (gain 1.000) with the chord on top.
With au-type = "aumf" and audio-effect as the first CLAP feature, the same plugin is a
MIDI-controlled effect: auval passes it as aumf (v2 and v3), and REAPER loads it as an
effect that takes MIDI. How Logic routes audio into an aumu that has an input (its
side-chain menu, by Apple’s documentation) and how it lists an aumf is not checked.
The tools
clap-validator is built from source, tag 0.4.1, with one fix. As released it deadlocks on
the second preset of a preset container (the factory presets inside a plugin are one), so its
preset-discovery tests never finish. The patch is
scripts/clap-validator-0.4.1-preset-deadlock.patch:
git clone --branch 0.4.1 https://github.com/free-audio/clap-validator && cd clap-validator
git apply ../apf/scripts/clap-validator-0.4.1-preset-deadlock.patch
cargo install --path . --locked # the results above used Rust 1.95.0: cargo +1.95.0 install ...
cargo xtask validate stops a validator run after five minutes instead of waiting forever.
The VST3 validator and tools/vst3-state-check are built by cargo xtask validate from the
VST3 SDK that the wrapper build downloads. By hand (any OS, CMake 3.25 or newer):
cmake -S tools/vst3-state-check -B build/vst3-state-check -DCMAKE_BUILD_TYPE=Release \
-DVST3_SDK_ROOT=<target dir>/apf-wrapper/cpm-cache/vst3sdk/<hash>
cmake --build build/vst3-state-check --config Release
build/vst3-state-check/vst3-state-check "dist/release/APF Demo Synth.vst3" [--preset NAME | --preset-program N]
auval is Apple’s Audio Unit validator, part of macOS. apf-host is APF’s own small
CLAP host (see Testing without a host).