38 void openTabBox(
const char* label)
override { push_group(label); }
46 add_zone(label, zone, init, min, max, step);
51 add_zone(label, zone, init, min, max, step);
56 add_zone(label, zone, init, min, max, step);
59 add_zone(label, zone, 0.0f, 0.0f, 1.0f, 1.0f);
62 add_zone(label, zone, 0.0f, 0.0f, 1.0f, 1.0f);
72 zone_metadata_[zone][key] = value;
76 const std::vector<Zone>&
zones()
const {
return zones_; }
79 std::vector<Zone> zones_;
80 std::vector<std::string> group_stack_;
81 std::map<FAUSTFLOAT*, std::map<std::string, std::string>> zone_metadata_;
83 void push_group(
const char* label) {
84 if (label && label[0]) {
85 group_stack_.emplace_back(label);
90 if (!group_stack_.empty()) {
91 group_stack_.pop_back();
95 std::string current_group()
const {
97 for (
const auto& g : group_stack_) {
98 if (!result.empty()) result +=
"/";
104 void add_zone(
const char* label,
FAUSTFLOAT* zone,
105 float init,
float min,
float max,
float step) {
108 z.desc.name = label ? label :
"";
109 z.desc.group = current_group();
112 z.desc.default_value = init;
117 auto it = zone_metadata_.find(zone);
118 if (it != zone_metadata_.end()) {
119 auto uit = it->second.find(
"unit");
120 if (uit != it->second.end()) {
121 z.desc.unit = uit->second;
125 zones_.push_back(std::move(z));
132 void declare(
const char* key,
const char* value)
override {
134 metadata_[key] = value;
138 const std::string&
get(
const std::string& key,
const std::string& fallback =
"")
const {
139 auto it = metadata_.find(key);
140 return it != metadata_.end() ? it->second : fallback;
143 const std::map<std::string, std::string>&
all()
const {
return metadata_; }
146 std::map<std::string, std::string> metadata_;
152template <
typename FaustDsp>
157 faust_dsp_ = std::make_unique<FaustDsp>();
160 faust_dsp_->metadata(&meta_);
163 faust_dsp_->buildUserInterface(&ui_);
166 for (
const auto& zone : ui_.zones()) {
171 bus_layout_.num_inputs = faust_dsp_->getNumInputs();
172 bus_layout_.num_outputs = faust_dsp_->getNumOutputs();
179 std::string name = meta_.get(
"name",
"FAUST Plugin");
180 std::string author = meta_.get(
"author",
"FAUST");
185 desc.
bundle_id =
"com.pulp.faust." + sanitize_id(name);
186 desc.
version = meta_.get(
"version",
"1.0.0");
208 auto& zones =
const_cast<std::vector<PulpFaustUI::Zone>&
>(ui_.zones());
211 std::map<std::string, int> group_ids;
212 int next_group_id = 1;
214 for (
auto& zone : zones) {
215 if (!zone.desc.group.empty() && group_ids.find(zone.desc.group) == group_ids.end()) {
216 group_ids[zone.desc.group] = next_group_id;
217 store.
add_group({next_group_id, zone.desc.group, 0});
224 for (
auto& zone : zones) {
227 info.name = zone.desc.name;
228 info.unit = zone.desc.unit;
229 info.range = {zone.desc.min, zone.desc.max, zone.desc.default_value, zone.desc.step};
231 if (!zone.desc.group.empty()) {
232 auto it = group_ids.find(zone.desc.group);
233 if (it != group_ids.end()) {
234 info.group_id = it->second;
239 zone.param_id = next_id;
250 if (num_in < 0 || num_out < 0 || max_block_size_ < 0) {
252 output_ptrs_.clear();
255 input_ptrs_.assign(
static_cast<std::size_t
>(num_in),
nullptr);
256 output_ptrs_.assign(
static_cast<std::size_t
>(num_out),
nullptr);
257 faust_dsp_->init(
static_cast<int>(sample_rate_));
270 if (output.
num_samples() >
static_cast<std::size_t
>(std::numeric_limits<int>::max())) {
279 const auto frames =
static_cast<std::size_t
>(n);
280 if (!prepared_ || input.
num_channels() != input_ptrs_.size() ||
281 output.
num_channels() != output_ptrs_.size() || n > max_block_size_ ||
288 for (
const auto& zone : ui_.zones()) {
293 faust_dsp_->compute(0, input_ptrs_.data(), output_ptrs_.data());
297 for (
int ch = 0; ch < num_in; ++ch) {
298 input_ptrs_[
static_cast<std::size_t
>(ch)] =
299 const_cast<float*
>(input.
channel_ptr(
static_cast<std::size_t
>(ch)));
301 for (
int ch = 0; ch < num_out; ++ch) {
302 output_ptrs_[
static_cast<std::size_t
>(ch)] =
306 faust_dsp_->compute(n, input_ptrs_.data(), output_ptrs_.data());
316 std::unique_ptr<FaustDsp> faust_dsp_;
319 double sample_rate_ = 48000.0;
320 int max_block_size_ = 512;
321 bool prepared_ =
false;
322 std::vector<float*> input_ptrs_;
323 std::vector<float*> output_ptrs_;
325 static std::string sanitize_id(
const std::string& name) {
327 for (
char c : name) {
328 if (std::isalnum(
static_cast<unsigned char>(c))) {
329 result +=
static_cast<char>(std::tolower(
static_cast<unsigned char>(c)));
330 }
else if (c ==
' ' || c ==
'-' || c ==
'_') {
331 if (!result.empty() && result.back() !=
'-') {
Definition faust_base.hpp:24
Non-owning view over multi-channel audio sample data.
Definition buffer.hpp:30
std::size_t num_samples() const
Definition buffer.hpp:84
std::size_t num_channels() const
Definition buffer.hpp:83
void clear()
Zero-fill all channels.
Definition buffer.hpp:90
SampleType * channel_ptr(std::size_t index)
Raw pointer to one channel's sample data.
Definition buffer.hpp:68
Definition dsl_processor.hpp:49
DslBusLayout bus_layout_
Definition dsl_processor.hpp:59
std::string dsl_name_
Definition dsl_processor.hpp:60
std::vector< DslParamDescriptor > dsl_params_
Definition dsl_processor.hpp:58
void prepare(const format::PrepareContext &ctx) override
Prepare for processing.
Definition faust_processor.hpp:244
bool has_editor() const override
Editor support.
Definition faust_processor.hpp:313
void process(audio::BufferView< float > &output, const audio::BufferView< const float > &input, midi::MidiBuffer &, midi::MidiBuffer &, const format::ProcessContext &ctx) override
Process one buffer of audio.
Definition faust_processor.hpp:261
format::PluginDescriptor descriptor() const override
Return the plugin's metadata. Called once during initialization.
Definition faust_processor.hpp:178
FaustProcessor()
Definition faust_processor.hpp:155
void define_parameters(state::StateStore &store) override
Register parameters with the state store.
Definition faust_processor.hpp:207
void release() override
Release resources.
Definition faust_processor.hpp:309
Definition faust_processor.hpp:29
void addHorizontalSlider(const char *label, float *zone, float init, float min, float max, float step) override
Definition faust_processor.hpp:43
void closeBox() override
Definition faust_processor.hpp:41
void openHorizontalBox(const char *label) override
Definition faust_processor.hpp:39
void addVerticalSlider(const char *label, float *zone, float init, float min, float max, float step) override
Definition faust_processor.hpp:48
void addButton(const char *label, float *zone) override
Definition faust_processor.hpp:58
void declare(float *zone, const char *key, const char *value) override
Definition faust_processor.hpp:70
void openTabBox(const char *label) override
Definition faust_processor.hpp:38
void addNumEntry(const char *label, float *zone, float init, float min, float max, float step) override
Definition faust_processor.hpp:53
void addHorizontalBargraph(const char *, float *, float, float) override
Definition faust_processor.hpp:66
void openVerticalBox(const char *label) override
Definition faust_processor.hpp:40
void addVerticalBargraph(const char *, float *, float, float) override
Definition faust_processor.hpp:67
const std::vector< Zone > & zones() const
Definition faust_processor.hpp:76
void addCheckButton(const char *label, float *zone) override
Definition faust_processor.hpp:61
Collection of timestamped MIDI events within a single audio buffer period.
Definition buffer.hpp:31
Centralized parameter storage with lock-free value access.
Definition store.hpp:164
float get_value(ParamID id) const
Read a parameter's base value (lock-free).
Definition store.hpp:186
void add_parameter(const ParamInfo &info)
Register a parameter.
void add_group(const ParamGroup &group)
Register a parameter group. Call during initialization only.
#define FAUSTFLOAT
Definition faust_base.hpp:11
Definition dsl_processor.hpp:18
@ g
Definition pitch.hpp:27
uint32_t ParamID
Unique parameter identifier, stable across plugin versions.
Definition parameter.hpp:55
@ z
Definition input_events.hpp:42
Definition dsl_processor.hpp:21
Definition faust_processor.hpp:31
DslParamDescriptor desc
Definition faust_processor.hpp:33
float * zone_ptr
Definition faust_processor.hpp:32
state::ParamID param_id
Definition faust_processor.hpp:34
Definition prepare_resources.hpp:102
double sample_rate
Definition prepare_resources.hpp:103
int input_channels
Definition prepare_resources.hpp:105
int max_buffer_size
Definition prepare_resources.hpp:104
int output_channels
Definition prepare_resources.hpp:106
Process context — passed every audio callback with transport state.
Definition process_context.hpp:89
int num_samples
Definition process_context.hpp:91
Immutable parameter metadata, registered once at plugin initialization.
Definition parameter.hpp:316