원클릭으로
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 직업 분류 기준
Pulp musical/media time primitives, immutable compiled tempo maps, monotonic transport beats, exact sample anchors, corrected inverse conversion, and shared transport quantization arithmetic.
Import designs from Figma, Stitch, v0, Pencil, React Native, or Claude Design into Pulp web-compat JS with automated visual validation. Claude Design imports also scaffold a pulp::view::EditorBridge handler file. Versioned parser, format, and compatibility-schema detection lives behind `--detect-only` and `--report-new-format`.
Pick the right Pulp Stream for a given I/O task, wire async callbacks correctly without deadlocking the worker, and avoid the backpressure / cancellation footguns in `pulp::runtime::AsyncStream`.
Editor lifecycle and multi-view attach for Pulp plugins — when to override Processor::create_view(), the open → notify_attached → resize → close protocol, release_view() ownership rules, and secondary-view roles.
Load, run, and test VST3 / AU / CLAP / LV2 plugins from Pulp code. Use when working on `core/host/` (scanner, plugin_slot, signal_graph), when adding a new format backend, when wiring a plugin into a SignalGraph, or when writing an integration test that needs a real plug-in binary.
Audio Unit v3 (AUAudioUnit) format adapter for Pulp — render-block wiring, parameter tree bridging, MIDI / sysex via AURenderEvent, sidechain pulls, state persistence, iOS extension surface, and the pitfalls discovered while wiring the adapter.
| 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)
tools/ci/governed-build.sh cmake --build build
# 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.