9#include <pulp/host/detail/forge_compressor_ballistics.hpp>
21inline constexpr const char*
kTypeId =
"multiband.compressor";
47 float attack_ms,
float release_ms,
49 signal::Compressor::Params p;
50 p.threshold_db = threshold_db;
51 p.ratio = std::max(1.0f, ratio);
52 p.attack_ms = attack_ms;
53 p.release_ms = release_ms;
55 p.makeup_db = makeup_db;
65 t.num_input_ports = 1;
66 t.num_output_ports = 1;
67 t.default_name =
"Multiband Compressor";
70 t.create = []() ->
void* {
return new Instance{}; };
71 t.destroy = [](
void* p) {
delete static_cast<Instance*
>(p); };
72 t.prepare = [](
void* p,
double sample_rate,
int ) {
74 s->sample_rate =
static_cast<float>(sample_rate);
75 s->crossover.set_frequency(800.0f, s->sample_rate);
76 s->low.set_sample_rate(s->sample_rate);
77 s->high.set_sample_rate(s->sample_rate);
82 t.reset = [](
void* p) {
89 t.baked_params.push_back({
kCrossoverHz, 80.0f, 8000.0f, 800.0f});
91 t.baked_params.push_back({
kLowRatio, 1.0f, 20.0f, 4.0f});
93 t.baked_params.push_back({
kHighRatio, 1.0f, 20.0f, 4.0f});
94 t.baked_params.push_back({
kAttackMs, 0.1f, 100.0f, 10.0f});
95 t.baked_params.push_back({
kReleaseMs, 10.0f, 1000.0f, 150.0f});
96 t.baked_params.push_back({
kLowMakeupDb, -24.0f, 12.0f, 0.0f});
97 t.baked_params.push_back({
kHighMakeupDb, -24.0f, 12.0f, 0.0f});
99 t.baked_params.push_back({
kBallistics, 0.0f, 1.0f, 0.0f});
104 auto* s =
static_cast<Instance*
>(p);
105 const float* input = in.channel_ptr(0);
106 float* output = out.channel_ptr(0);
108 s->crossover.set_frequency(params.value_at(
kCrossoverHz, 0), s->sample_rate);
117 const auto ballistics = forge_compressor::ballistics_for(params.value_at(
kBallistics, 0));
118 s->low.set_ballistics(ballistics);
119 s->high.set_ballistics(ballistics);
126 for (
int start = 0; start < n; start +=
kBandChunk) {
127 const int count = std::min(
kBandChunk, n - start);
128 for (
int k = 0; k < count; ++k) {
129 const auto split = s->crossover.process(input[
static_cast<std::size_t
>(start + k)]);
131 high[k] = split.high;
133 s->low.process(low, count);
134 s->high.process(high, count);
135 for (
int k = 0; k < count; ++k)
136 output[
static_cast<std::size_t
>(start + k)] = low[k] + high[k];
144 "multiband_compressor",
145 "Multiband Compressor",
146 "A two-band compressor with independent low- and high-band dynamics.",
151 "Frequency that divides the low and high compression bands.",
156 {
"low_ratio",
kLowRatio,
"Low Ratio",
":1",
"Gain-reduction ratio for the low band.",
161 {
"high_ratio",
kHighRatio,
"High Ratio",
":1",
176 forge_compressor::ballistics_descriptor(
kBallistics),
182 return 2.0f * std::pow(10.0f, 12.0f / 20.0f);
Non-owning view over multi-channel audio sample data.
Definition buffer.hpp:30
Definition custom_node_type.hpp:51
Definition forge_multiband_catalog.hpp:44
signal::Compressor::Params compressor_params(float threshold_db, float ratio, float attack_ms, float release_ms, float makeup_db)
Definition forge_multiband_catalog.hpp:46
Definition forge_multiband_catalog.hpp:19
constexpr state::ParamID kLowThresholdDb
Definition forge_multiband_catalog.hpp:24
constexpr int kBandChunk
Definition forge_multiband_catalog.hpp:35
constexpr state::ParamID kHighRatio
Definition forge_multiband_catalog.hpp:27
CustomNodeType make_multiband_compressor_node()
Definition forge_multiband_catalog.hpp:61
ForgeNodeDescriptor descriptor()
Definition forge_multiband_catalog.hpp:142
constexpr state::ParamID kHighMakeupDb
Definition forge_multiband_catalog.hpp:31
constexpr const char * kTypeId
Definition forge_multiband_catalog.hpp:21
constexpr state::ParamID kCrossoverHz
Definition forge_multiband_catalog.hpp:23
constexpr state::ParamID kBallistics
Definition forge_multiband_catalog.hpp:32
constexpr state::ParamID kReleaseMs
Definition forge_multiband_catalog.hpp:29
constexpr state::ParamID kAttackMs
Definition forge_multiband_catalog.hpp:28
constexpr state::ParamID kHighThresholdDb
Definition forge_multiband_catalog.hpp:26
constexpr state::ParamID kLowMakeupDb
Definition forge_multiband_catalog.hpp:30
float worst_case_gain()
Definition forge_multiband_catalog.hpp:181
constexpr state::ParamID kLowRatio
Definition forge_multiband_catalog.hpp:25
@ continuous
Definition forge_param_descriptor.hpp:25
@ logarithmic
Definition forge_param_descriptor.hpp:29
@ linear
Definition forge_param_descriptor.hpp:29
LinkwitzRileyT< float > LinkwitzRiley
Definition linkwitz_riley.hpp:88
CompressorT< float > Compressor
Definition compressor.hpp:425
uint32_t ParamID
Unique parameter identifier, stable across plugin versions.
Definition parameter.hpp:55
Definition custom_node_type.hpp:90
Definition forge_param_descriptor.hpp:127
Definition forge_multiband_catalog.hpp:37
signal::Compressor low
Definition forge_multiband_catalog.hpp:39
signal::LinkwitzRiley crossover
Definition forge_multiband_catalog.hpp:38
float sample_rate
Definition forge_multiband_catalog.hpp:41
signal::Compressor high
Definition forge_multiband_catalog.hpp:40