aax
無料Optional AAX support for Pulp, including developer-supplied Avid SDK setup, CMake enablement, DigiShell/AAX Validator workflows, and local AAX builds on macOS or Windows.
日本語の概要は準備中です。原文の説明を表示しています。
Prove a UI or generation feature actually works before asking a human to look at it. Covers A/B-ing an imported design against its source render, driving controls headlessly so a dead button cannot ship, proving the generator really spawns, and launching the real host (VCV Rack, a DAW). Use before any "take a look" on imported UI, plugin shells, or prompt-to-artifact pipelines.
インストールする前に、エージェントに与えられる指示の中身を確認できます。
A build is not proof. A screenshot is not proof. A passing suite is not proof that the thing a human will do actually works. This skill is the checklist that turns "it looks right" into "I drove it and watched it work".
It exists because the alternative was measured. A shell was handed over that
rendered pixel-close to its design and was completely inert — not one
button clickable — because the verification was a screenshot. And after that was
fixed, Build still generated a patch whichever mode was selected, so the
headline feature was unreachable, while thirteen tests passed.
Run every one that applies. Each answers a question the others cannot.
An imported design has a source render. Compare against it, every pass.
# Capture the source. Use the CLI, never the helper directly.
pulp import-design <prototype.html> --output <dir>
# Capture ours.
<app-binary> --screenshot /tmp/ours.png
# Put them side by side and get a number.
python3 tools/rack/compare_renders.py --out /tmp/sheet.png \
design=<dir>/browser.png ours=/tmp/ours.png rack=/tmp/host.png
compare_renders.py reports the mean per-pixel difference. It is blunt but
monotone: it drops when they converge and rises when they diverge, which cannot
be argued with the way "looks close enough" can. Track it; do not let it climb.
Name every difference you can still see. A number near zero and a list of five unfixed deltas is honest. A number alone is not.
Traps:
--screenshot captures the render surface, not the composited window. So
window-level chrome — rounded corners, shadow, titlebar — will look wrong in a
capture even when it is right on screen. Check the running app before
"fixing" it.A control that looks pressable and is not is worse than no control.
// Click through the ROOT at the control's centre, the way a mouse would.
const auto b = absolute_bounds(*control);
REQUIRE(b.width > 0.0f); // a control nothing can hit is not one
root->simulate_click({b.x + b.width * 0.5f, b.y + b.height * 0.5f});
Never call the handler directly. Calling on_click passes for a control
that is unreachable, invisible, zero-sized or buried under a sibling — the exact
bug class this catches.
Assert, per control:
true passed while
the mode was hard-coded true and the other mode was unreachableTraps, all paid for:
hit_test() returns the DEEPEST view. A label inside a button swallows
the click: pressing the word "Build" does nothing while pressing the padding
beside it works. Make control contents pointer-events: none by default.ToggleButton fires when a sibling in its radio group turns it off, so
handlers that ignore the value run on the way down too. Act on the press.__dispatch__ swallows handler exceptions. Define __dispatchError__ or
a throw while restyling silently takes the navigation with it.dynamic_cast<ToggleButton*> on
a styled row returns null and the wiring reports it by returning false to
nobody. Make that path fail loudly."The button path reaches the generator" is a claim about code until something spawns.
Point the real client at stub scripts that record their arguments — a genuine spawn with only the expensive part stood in:
::setenv("FORGE_MODULAR_TOOLS", stub_dir.c_str(), 1);
auto engine = make_engine(); // the REAL one
engine->submit("a 12 hp wavefolder", /*patch_mode=*/false);
// assert: which script, which subcommand, and that the prompt survived quoting
Assert the subcommand, not just the script. A generator invoked without it may inventory instead of generating and succeed at doing nothing.
Then run it for real once, from the click, behind a hidden tag so it never runs in CI:
<test-binary> "[.e2e]" # spawns the real generator; minutes, paid API
Traps:
The format validators prove a plugin scans. They do not prove anything happens. Load it where a user would: VCV Rack for a module or patch, a DAW for AU/VST3/CLAP.
For Rack specifically:
Loaded plugin <Name> <version> in ~/Library/Application Support/Rack2/log.txt is the host
confirming it, and it survives a modal covering the window.plugin::init() runs once); a patch
loads instantly..vcvplugin reads as an archive until Rack unpacks it on load, so
it can look entirely uninstantiable.auval cannot pass over SSH — AU registration needs a GUI login session,
so it fails regardless of the plugin. A first-run failure on a freshly copied
AU is usually the registration cache: killall AudioComponentRegistrar.Non-negotiable, and the reason is a test written here that passed with and without the fix it was meant to prove — the fixture's stepped parameter was already quantized upstream, so it could never have failed.
So: break the thing on purpose, watch the check go red, restore it, watch it go green. If it does not go red, the check is decoration.
# the shape
<edit the fix out>; <run> # expect FAIL
<restore>; <run> # expect PASS
Failing for the wrong reason counts as failing. A check that rejects correct material is not a strict check, it is a broken one.
If any line is unchecked, say which and why, rather than showing the work as finished. Around twenty gates in this project were wrong the first time they met real material, and every one was found by running it. None by reading it.
For A4 DPR work, use tools/scripts/gpu_dpr_runner.py to preserve each raw
sample and artifact receipt. Its deterministic self-test plants bad hashes,
input scaling, content drift, software-GPU substitution, incomplete traces,
fidelity failures, and adapter timeouts. Passing that test proves the harness,
not the product: unfinished real adapters and SKIP/INCONCLUSIVE cells remain
explicit incomplete dependencies.
For terminal v2 work, init-v2 must create an absent absolute run directory
from the three fixed live A2T/A3 dependency receipts; never supply a manifest or
draft. Each of the 84 original and 84 repeat cells must retain eight unique,
runner-owned regular files, including real PNG/trace/executable-product bytes.
finalize-v2 rederives the result only from nonce-bound runner snapshots. A
local state HMAC detects corruption but is not trust authority. After protected
main contains the exact fixed-path manifest/result Git blobs, run
verify-live-v2; a result-authored protected_main_verified boolean is not
proof. See docs/validation/gpu-dpr/README.md for the closed workflow.
まだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
Optional AAX support for Pulp, including developer-supplied Avid SDK setup, CMake enablement, DigiShell/AAX Validator workflows, and local AAX builds on macOS or Windows.
日本語の概要は準備中です。原文の説明を表示しています。
Configure, implement, and test Pulp's optional desktop Ableton Link tempo-sync adapter while preserving the developer-supplied SDK, licensing, realtime, latency-compensation, and no-install boundaries.
日本語の概要は準備中です。原文の説明を表示しています。
Maintain Pulp's installed design-time agent capability manifest and public-surface ledger. Use when adding, removing, renaming, or materially changing public audio, MIDI, signal, timebase, or sequence APIs; registering a new algorithm for generators; changing capability support or deprecation state; or repairing agent-capabilities freshness, schema, fingerprint, tombstone, or installed-SDK tests.
日本語の概要は準備中です。原文の説明を表示しています。
Android platform development for Pulp — NDK cross-compilation, Oboe audio, Dawn/Skia GPU rendering, JNI bridge, touch interaction, emulator workflows, and end-to-end smoke validation. Covers build, deploy, debug, and the gotchas discovered during bringup.
日本語の概要は準備中です。原文の説明を表示しています。
Optional ARA support for Pulp, including developer-supplied ARA SDK setup, CMake enablement, adapter companion APIs, validation, and ARA-aware plugin implementation guidance.
日本語の概要は準備中です。原文の説明を表示しています。
The measurement surface for ALL Pulp DSP and audio-pipeline work — read it BEFORE writing or gating DSP, not only when something already sounds wrong. Covers the C++ harness (signal generators, metrics, assertions, RenderScenario, contracts), the offline Audio Doctor (magnitude/frequency response, THD/THD+N, phase/group delay), and their Python sibling the Audio Quality Lab (tools/audio/quality-lab — null residual + alignment, LTAS log-spectral distance, spectral flux/centroid, HNR, Theil-Sen drift slope, Kaiser-sinc resampling, license-guarded corpus, regression-net ratchet). TRIGGER on AUTHORING work — "build/design an oscillator/filter/synth/effect", "add a DSP module", "what should the acceptance gate be", "how do I measure aliasing / anti-aliasing / alias floor", "null against a reference", "is this DSP correct", "choose a tolerance", "golden/regression corpus for audio", "measure drift or jitter", "A/B two renders" — AND on DEBUGGING work — "is there sound / no audio / I hear nothing", "does this filter/compressor/synth/delay produce the right signal", "prove the DSP / prove the contract", "measure the frequency response", "what's the THD / is it distorting", "what's the group delay / phase response / measured latency", "magnitude response curve", "render a test tone and assert", "audio regression", "64-frame works but 128 is silent", "sample-rate change pitch-shifted it", "describe what's in this buffer", "audio doctor", "compare before/after a DSP refactor". Reach for this BEFORE hand-rolling any FFT, null test, alias measurement, pitch tracker, or golden-render script — most of it already exists in one of the two lanes. Test/tool layer over HeadlessHost — deterministic, no audio device, no speakers. Off the realtime thread entirely.
日本語の概要は準備中です。原文の説明を表示しています。