8 const std::shared_ptr<Nodes::Generator::Logic>& logic,
9 bool reset_between_buffers)
11 , m_reset_between_buffers(reset_between_buffers)
12 , m_use_internal(false)
14 , m_has_generated_data(false)
17 , m_last_held_value(0.0)
18 , m_last_logic_value(0.0)
24 if (!
m_logic || input_data.empty()) {
36 std::vector<double> data = input_data;
37 if (data.size() < num_samples) {
38 data.resize(num_samples, 0.0);
45 const auto& state =
m_logic->m_state.load();
48 for (
size_t i = 0; i < data.size(); ++i) {
53 for (
size_t i = 0; i < data.size(); ++i) {
69 auto& buffer_data = std::dynamic_pointer_cast<AudioBuffer>(buffer)->get_data();
70 size_t min_size = std::min(
m_logic_data.size(), buffer_data.size());
72 if (!modulation_func) {
75 modulation_func = [](
double logic_val,
double ) {
81 modulation_func = [](
double logic_val,
double buffer_val) {
82 return logic_val * buffer_val;
87 modulation_func = [](
double logic_val,
double buffer_val) {
88 return logic_val + buffer_val;
93 modulation_func = [](
double logic_val,
double buffer_val) {
94 return logic_val > 0.5 ? -buffer_val : buffer_val;
103 modulation_func = [
this](
double logic_val,
double buffer_val)
mutable {
104 if (logic_val > 0.5) {
113 modulation_func = [](
double logic_val,
double buffer_val) {
114 return logic_val > 0.5 ? buffer_val : 0.0;
119 modulation_func = [](
double logic_val,
double buffer_val) {
120 return buffer_val * logic_val;
125 modulation_func = [
this](
double logic_val,
double ) {
136 modulation_func = [
this, first_sample =
true](
double logic_val,
double buffer_val)
mutable {
138 first_sample =
false;
157 modulation_func = [](
double logic_val,
double ) {
163 for (
size_t i = 0; i < min_size; ++i) {
164 buffer_data[i] = modulation_func(
m_logic_data[i], buffer_data[i]);
176 auto audio_buffer = std::dynamic_pointer_cast<AudioBuffer>(buffer);
177 if (!audio_buffer || audio_buffer->get_data().empty()) {
181 generate(audio_buffer->get_num_samples(), audio_buffer->get_data());
void processing_function(std::shared_ptr< Buffer > buffer) override
Processes a buffer through the logic node.
ModulationFunction m_modulation_function
Custom transformation function.
LogicProcessor(Args &&... args)
Constructs a LogicProcessor with internal Logic node.
ModulationType
Defines how logic values modulate buffer content.
@ MULTIPLY
Gate/mask buffer: out = logic * buffer (standard audio gate)
@ SAMPLE_AND_HOLD
Sample on logic change: out = logic_changed ? buffer : held_value.
@ REPLACE
Replace buffer with logic values: out = logic.
@ CUSTOM
User-defined modulation function.
@ ZERO_ON_FALSE
Silence when logic is false: out = logic ? buffer : 0.0.
@ INVERT_ON_TRUE
Invert signal when logic is true: out = logic ? -buffer : buffer.
@ ADD
Offset buffer: out = logic + buffer.
@ CROSSFADE
Smooth interpolation: out = lerp(0.0, buffer, logic)
@ HOLD_ON_FALSE
Hold last value when logic is false: out = logic ? buffer : last_value.
@ THRESHOLD_REMAP
Binary value selection: out = logic ? high_val : low_val.
std::vector< double > m_logic_data
Stored logic processing results.
bool m_has_generated_data
Whether logic data has been generated.
double m_last_held_value
Last held value for HOLD_ON_FALSE and SAMPLE_AND_HOLD.
double m_high_value
High value for THRESHOLD_REMAP.
std::function< double(double, double)> ModulationFunction
Function type for custom digital signal transformations.
bool generate(size_t num_samples, const std::vector< double > &input_data)
Generates discrete logic data from input without modifying any buffer.
double m_low_value
Low value for THRESHOLD_REMAP.
std::shared_ptr< Nodes::Generator::Logic > m_logic
Logic node for processing.
double m_last_logic_value
Previous logic value for change detection.
ModulationType m_modulation_type
How logic values modulate buffer content.
void set_modulation_function(ModulationFunction func)
Set custom modulation function.
std::shared_ptr< Nodes::Generator::Logic > m_pending_logic
Pending logic node update.
void on_attach(std::shared_ptr< Buffer > buffer) override
Called when the processor is attached to a buffer.
bool m_use_internal
Whether to use internal logic node.
bool apply(const std::shared_ptr< Buffer > &buffer, ModulationFunction modulation_func=nullptr)
Applies stored logic data to the given buffer.
bool m_reset_between_buffers
Whether to reset logic between buffers.
@ INACTIVE
Engine is not processing this node.