From pulp
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.
npx claudepluginhub danielraffel/pulp --plugin pulpThis skill uses the workspace's default tool permissions.
Use this when working on Pulp's optional AAX support or when guiding users who
Monitors deployed URLs for regressions after deploys, merges, or upgrades by checking HTTP status, console errors, network failures, performance (LCP/CLS/INP), content, and API health.
Share bugs, ideas, or general feedback.
Use this when working on Pulp's optional AAX support or when guiding users who want to build and validate AAX plugins locally.
Supported hosts: macOS and Windows
Unsupported: Linux and Ubuntu
Current scope: AAX Native
Out of scope: bundling Avid assets, DSP/AudioSuite support, PACE release automation
Never commit the AAX SDK, DigiShell, validator binaries, or Avid example code.
Never unpack Avid downloads inside the Pulp repo.
Keep AAX developer-supplied, opt-in, and out-of-tree.
Run the repo audits after AAX-related changes:
python3 tools/deps/audit.py --strict
Tell users to sign in at:
https://developer.avid.com/aax/
Required downloads:
AAX SDKDigiShell and AAX ValidatorOptional later:
AAX Plug-In Page Table EditorDo not recommend these for normal Pulp AAX setup unless the task explicitly needs them:
AAX Developer Tools beta bundlesPreferred user-local locations so Pulp can auto-discover them:
~/SDKs/avid/aax-sdk/current
~/SDKs/avid/aax-validator/current
%USERPROFILE%\SDKs\avid\aax-sdk\current
%USERPROFILE%\SDKs\avid\aax-validator\current
Environment variables override auto-discovery:
export PULP_AAX_SDK_DIR=~/SDKs/avid/aax-sdk/current
export PULP_AAX_VALIDATOR_DIR=~/SDKs/avid/aax-validator/current
Check current AAX availability:
pulp status
pulp doctor
Build with AAX enabled:
cmake -S . -B build \
-DCMAKE_BUILD_TYPE=Debug \
-DPULP_ENABLE_AAX=ON \
-DPULP_AAX_SDK_DIR="$PULP_AAX_SDK_DIR"
cmake --build build --target MyPlugin_AAX -j$(sysctl -n hw.ncpu 2>/dev/null || nproc)
Validate built plugins:
pulp validate
pulp validate --all
Notes:
pulp validate uses the faster AAX describe-validation path when the validator is installed.pulp validate --all runs the broader AAX validator suite.PULP_AAX_SDK_DIR.PULP_AAX_VALIDATOR_DIR.AAX from FORMATS.AAX splits multi-byte sysex (F0 … F7) across sequential AAX_CMidiPacket
entries — the first packet carries the F0 status byte, continuation
packets can appear with no status byte, and the final packet carries F7.
Each packet's mData field is at most 4 bytes. A single-packet decoder
will silently drop everything after the first 4 sysex bytes, and the
host will never see the real message.
The correct shape is a per-node accumulator:
std::vector<uint8_t> sysex_buffer;
bool sysex_in_progress = false;
int32_t sysex_start_offset = 0;
// for each packet in the node's buffer:
// if byte == 0xF0 → start accumulator, capture start_offset from mTimestamp
// while sysex_in_progress → append every payload byte (no status-byte requirement)
// if byte == 0xF7 → flush accumulator as one MidiEvent, reset
This matches the shape used for CLAP/VST3/AU/CoreMIDI/ALSA sysex (#239).
See core/format/src/aax_runtime.cpp::decode_midi_node for the canonical
implementation landed in #408.
When adding or changing any AAX MIDI input path, exercise this against a multi-packet sysex vector (at least one packet across the 4-byte boundary and one terminator-only packet) in a unit test. Shipping without the test is the #290 "tests ship with fixes" rule.
After any AAX-related change:
PULP_ENABLE_AAX=ON against a developer-supplied SDK.pulp validate and pulp validate --all when the validator is installed.docs/guides/aax.md if behavior changed.