From pulp
Create FAUST DSP plugins in Pulp using offline codegen, pre-generated C++ headers, and the FaustProcessor template wrapper.
npx claudepluginhub danielraffel/pulp --plugin pulpThis skill uses the workspace's default tool permissions.
Use this skill when a task involves writing, generating, or testing FAUST-based processors in Pulp.
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 skill when a task involves writing, generating, or testing FAUST-based processors in Pulp.
Pulp supports FAUST as an offline codegen DSL. The FAUST compiler is an optional external tool; pre-generated C++ is checked into the source tree so builds work without a FAUST installation.
Supported now:
.dsp source files with offline codegen to C++ headersFaustProcessor<T> template that bridges any FAUST-generated dsp subclass into Pulp's Processor modelbuildUserInterface() into StateStoregetNumInputs() / getNumOutputs()name, author, version) into PluginDescriptorPulpFaust.cmake (pulp_faust_generate, pulp_add_faust_test)Not supported by this skill:
declare options "[midi:on][nvoices:N]"@gfx / FAUST GUI — FaustProcessor reports has_editor() = false| File | Purpose |
|---|---|
core/dsl/include/pulp/dsl/faust_base.hpp | Self-contained FAUST base classes (dsp, UI, Meta) |
core/dsl/include/pulp/dsl/faust_processor.hpp | FaustProcessor<T> template and PulpFaustUI |
core/dsl/include/pulp/dsl/dsl_processor.hpp | DslProcessor base class shared across DSL lanes |
tools/cmake/PulpFaust.cmake | CMake module: pulp_faust_generate(), pulp_add_faust_test() |
examples/faust-gain/ | Stereo gain — simplest FAUST example |
examples/faust-filter/ | Parametric filter example |
examples/faust-tremolo/ | Tremolo with rate/depth |
FAUST offline codegen produces a C++ class derived from ::dsp. Pulp provides self-contained base classes in faust_base.hpp so the generated code compiles without the FAUST architecture headers. FaustProcessor<T> wraps the generated class:
buildUserInterface() to discover parameters and metadata() for plugin infodefine_parameters() registers each FAUST zone as a StateStore parameter with correct range/unit/groupprepare() calls dsp::init(sample_rate)process() syncs StateStore values into FAUST zone pointers, then calls dsp::compute()// examples/faust-myplugin/myplugin.dsp
declare name "MyPlugin";
declare author "YourName";
declare version "1.0.0";
import("stdfaust.lib");
gain = hslider("Gain [unit:dB]", 0, -60, 24, 0.1) : ba.db2linear;
process = _, _ : *(gain), *(gain);
faust on PATH)faust -lang cpp -cn MyPluginDsp -o examples/faust-myplugin/generated_myplugin.hpp \
examples/faust-myplugin/myplugin.dsp
Or let CMake handle it (regenerates when .dsp changes):
include(PulpFaust)
pulp_faust_generate(
${CMAKE_CURRENT_SOURCE_DIR}/generated_myplugin.hpp
${CMAKE_CURRENT_SOURCE_DIR}/myplugin.dsp
MyPluginDsp
)
The generated header is committed to the repo so builds never require faust.
// examples/faust-myplugin/faust_myplugin.hpp
#pragma once
#include "generated_myplugin.hpp"
#include <pulp/dsl/faust_processor.hpp>
namespace pulp::examples {
using MyPluginProcessor = dsl::FaustProcessor<MyPluginDsp>;
inline std::unique_ptr<format::Processor> create_my_plugin() {
return std::make_unique<MyPluginProcessor>();
}
} // namespace pulp::examples
if(PULP_BUILD_TESTS)
add_executable(pulp-faust-myplugin-test test_faust_myplugin.cpp)
target_link_libraries(pulp-faust-myplugin-test PRIVATE pulp::dsl pulp::format Catch2::Catch2WithMain)
target_include_directories(pulp-faust-myplugin-test PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
catch_discover_tests(pulp-faust-myplugin-test)
endif()
Follow the pattern in examples/faust-gain/test_faust_gain.cpp:
descriptor() metadata matches FAUST declare statementsdsl_name() == "faust", dsl_params(), bus_layout())# Build everything (uses pre-generated C++ — no faust needed)
cmake --build build -j$(sysctl -n hw.ncpu)
# Run all FAUST tests
ctest --test-dir build -R "faust" --output-on-failure
# Run one example
ctest --test-dir build -R "FaustGain" --output-on-failure
# Regenerate all FAUST C++ (requires faust on PATH)
cmake --build build --target faust-regenerate
When modifying the FAUST lane, verify:
faust installed.dsp metadatagetNumInputs() / getNumOutputs()DslProcessor reflection (dsl_name, dsl_params, bus_layout) is accurateexamples/CMakeLists.txtThis skill covers the offline codegen FAUST lane only.