From pulp
Guides Pulp developers on optional ARA (Audio Random Access) SDK setup, CMake integration, companion API support, validation, and ARA-aware plugin implementation.
How this skill is triggered — by the user, by Claude, or both
Slash command
/pulp:araThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Use this when working on Pulp's optional ARA (Audio Random Access) support or
Use this when working on Pulp's optional ARA (Audio Random Access) support or when guiding users who want to build and validate ARA-enabled plugins.
kARAAPIGeneration_2_3_Final = 6)tools/deps/audit.py --strict must stay
green.DEPENDENCIES.md lists ARA SDK under Optional Developer-Supplied Vendor
SDKs exactly because of the companion-API carve-out in CLAUDE.md.main.The SDK is public on GitHub. Clone with submodules so ARA_API + ARA_Library + ARA_Examples all resolve:
git clone --recurse-submodules --depth 1 \
https://github.com/Celemony/ARA_SDK.git \
external/ara-sdk
After cloning, verify:
ls external/ara-sdk/ARA_API/ARAInterface.h # core C API
ls external/ara-sdk/ARA_Library/PlugIn/ARAPlug.h # C++11 helpers
Never commit external/ara-sdk/. The external/ prefix keeps it out of
cmake --install exports and the repo audit.
Two CMake knobs:
cmake -S . -B build \
-DPULP_ENABLE_ARA=ON \
-DPULP_ARA_SDK_DIR=/absolute/path/to/external/ara-sdk
PULP_ENABLE_ARA=ON without PULP_ARA_SDK_DIR fails fast with a clear
error. A missing / wrong path fails on ARAInterface.h existence check
before any compilation starts.
When enabled, pulp-format is built with PULP_HAS_ARA=1 and the ARA SDK
include directory added to its PUBLIC include path. Plugin TUs that want
to implement ARA include <ARA_API/ARAInterface.h> directly.
Quick smoke:
cmake --build build --target pulp-test-ara
./build/test/pulp-test-ara
# Expect: ara_sdk_compiled_in() → true, ara_sdk_generation() >= 6
A build with PULP_ENABLE_ARA=OFF (the default) must still pass the same
tests — ara_sdk_compiled_in() returns false and ara_sdk_generation()
returns 0 without failing.
Processor::create_ara_document_controller() to return a
concrete AraDocumentController subclass.<pulp/format/ara/types.hpp>
(AraAudioSource, AraPlaybackRegion, etc.). These are
SDK-independent so the plugin TU never pulls the SDK unless it wants
to implement a content reader that inspects ARA's C structs directly.A real ARA::ARAFactory is surfaced out of core/format/src/ara_factory.cpp
whenever PULP_HAS_ARA is defined. Hosts reach it via the adapter-specific
hook listed below — the integration code is done on the adapter side, so
plugin authors only subclass AraDocumentController.
Already end-to-end wired: clap_plugin::get_extension(kClapAraFactoryExtension)
returns the live factory. Example: core/format/src/clap_adapter.cpp
(search for kClapAraFactoryExtension).
Validate with ./build/tools/scan-worker/pulp-scan-worker path/to/MyPlug.clap
once ARA is initialised.
The VST3 adapter wires PulpVst3Processor::initialize(FUnknown*) to query
IPluginFactory3::setHostContext for the attribute key
kVst3AraFactoryContextKey. The plug-in side does nothing beyond subclassing
AraDocumentController; the adapter binding is in
core/format/src/vst3_adapter.cpp.
The AU adapter exposes kAuAraFactoryPropertyKey as the KVO property
audioUnitARAFactory on PulpAudioUnit. Logic reads it on scan, caches the
factory, and binds a document controller per loaded plug-in instance.
# Build with the SDK on:
cmake -S . -B build -DPULP_ENABLE_ARA=ON -DPULP_ARA_SDK_DIR=$PWD/external/ara-sdk
cmake --build build --target pulp-test-ara
# Run the live-factory tests (guarded on PULP_HAS_ARA):
./build/test/pulp-test-ara '[factory]'
The ABI-conformance test asserts that the factory's highestSupportedApiGeneration
is kARAAPIGeneration_2_3_Final, that createDocumentControllerWithDocument
returns a non-null ARADocumentControllerInstance, and that getFactory()
round-trips back to the same factory pointer.
AraPlaybackRegion matches ARAPlaybackRegionProperties; adapters
convert to samples only at explicit sample-domain APIs.docs/reference/host-thread-rules.md.host_supports_ara() currently returns false even with the SDK
compiled in until the format-adapter companion factories are wired.PULP_HAS_ARA is on, ara_companion_factory_for() returns a real
ARA::ARAFactory. Its createDocumentControllerWithDocument returns
a valid ARADocumentControllerInstance, but every call on the
controller interface is a no-op until plug-ins override them. Hosts
see a working factory; they just cannot edit audio yet.planning/production-readiness/06-ara.mdplanning/production-readiness/STATUS.md (ARA / workstream 06 section)Path map: tools/scripts/skill_path_map.json. Add entries for
core/format/src/ara*, core/format/include/pulp/format/ara*,
external/ara-sdk (so non-committed work still triggers skill sync
checks on related source changes).
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.
Establishes Arc's skill routing, instruction priority, and bootstrap rules at session startup. Use when beginning any conversation with Arc.