ワンクリックで
faust
Create FAUST DSP plugins in Pulp using offline codegen, pre-generated C++ headers, and the FaustProcessor template wrapper.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Create FAUST DSP plugins in Pulp using offline codegen, pre-generated C++ headers, and the FaustProcessor template wrapper.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Optional ARA support for Pulp, including developer-supplied ARA SDK setup, CMake enablement, adapter companion APIs, validation, and ARA-aware plugin implementation guidance.
Local and cloud CI for Pulp — validate branches, create PRs, merge on green. Handles "push to main", "ship this", "run CI", "check PR", and "list PRs".
Checklist and decision tree for adding, modifying, or removing CLI commands. Keeps CLI source, slash commands, docs, and skills in sync.
Real-DAW (REAPER) functional smoke for reload/editor/format-adapter changes — opt-in, scoped, headless-safe, zero-pollution
Sign, notarize, package, and distribute Pulp plugins and apps across macOS, Windows, and Android
Stand up a fast, cached, isolated, disposable macOS CI lane on Tart — layered golden VM images, ephemeral per-job GitHub Actions runners, host-mounted caches, and a reusable per-repo vm-image manifest. Use when setting up VM-based CI for Pulp or generalizing it to another repo, building/refreshing golden images, wiring ephemeral runners, or debugging the VM lane.
| name | faust |
| description | Create FAUST DSP plugins in Pulp using offline codegen, pre-generated C++ headers, and the FaustProcessor template wrapper. |
| requires | {"scripts":["tools/cmake/PulpFaust.cmake"],"tools":[]} |
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.