From pulp
Guides developers through setting up optional AAX support in Pulp, including Avid SDK download, CMake configuration, DigiShell/AAX Validator workflows, and building/validating AAX plugins on macOS and Windows.
How this skill is triggered — by the user, by Claude, or both
Slash command
/pulp:aaxThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Use this when working on Pulp's optional AAX support or when guiding users who
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. See
core/format/src/aax_runtime.cpp::decode_midi_node for the canonical
implementation.
The AAX bypass MIDI-thru helper must copy sidecar payloads with
MidiBuffer::add_sysex_copy(); MidiBuffer::SysexPayload is deliberately
not a movable raw std::vector.
When clearing an AAX process block's MIDI buffers, clear both the short-event
storage and the sysex sidecars. MidiBuffer::clear() resets short events only;
call clear_sysex() on both input and output buffers before decoding the next
block, or stale sidecar payloads can be re-emitted by a later block.
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. Adapter fixes should ship with the regression tests that prove the fixed behavior.
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.npx claudepluginhub danielraffel/pulp --plugin pulpSets up JUCE audio plugin projects using JUCE-Plugin-Starter template with CMake builds, placeholder replacement, VST3 MIDI generator config, cross-DAW effects, and scripts for macOS/Windows/Linux deployment.
Validates AudioUnit v2/v3 plugins (.component bundles and .appex app extensions) on macOS using Apple's auval tool, including registration and rescan steps.