Vital
Loading...
Searching...
No Matches
filters_module.cpp
Go to the documentation of this file.
1#include "filters_module.h"
2#include "filter_module.h"
3
4namespace vital {
5
7 SynthModule(kNumInputs, 1),
8 filter_1_(nullptr), filter_2_(nullptr),
9 filter_1_filter_input_(nullptr), filter_2_filter_input_(nullptr) {
10 // Allocate shared outputs for feeding each filter.
11 filter_1_input_ = std::make_shared<Output>();
12 filter_2_input_ = std::make_shared<Output>();
13 }
14
45
46 void FiltersModule::processParallel(int num_samples) {
55
56 getLocalProcessor(filter_1_)->process(num_samples);
57 getLocalProcessor(filter_2_)->process(num_samples);
58
59 poly_float* output_buffer = output()->buffer;
60 const poly_float* filter_1_buffer = filter_1_->output()->buffer;
61 const poly_float* filter_2_buffer = filter_2_->output()->buffer;
62
63 for (int i = 0; i < num_samples; ++i)
64 output_buffer[i] = filter_1_buffer[i] + filter_2_buffer[i];
65 }
66
75 filter_2_input_->buffer = filter_2_input_->owned_buffer.get();
76
77 getLocalProcessor(filter_1_)->process(num_samples);
78
79 poly_float* filter_2_input_buffer = filter_2_input_->buffer;
80 const poly_float* filter_1_output_buffer = filter_1_->output()->buffer;
81 const poly_float* filter_2_straight_input = input(kFilter2Input)->source->buffer;
82
83 for (int i = 0; i < num_samples; ++i)
84 filter_2_input_buffer[i] = filter_1_output_buffer[i] + filter_2_straight_input[i];
85
86 getLocalProcessor(filter_2_)->process(num_samples);
87 utils::copyBuffer(output()->buffer, filter_2_->output()->buffer, num_samples);
88 }
89
97 filter_1_input_->buffer = filter_1_input_->owned_buffer.get();
99
100 getLocalProcessor(filter_2_)->process(num_samples);
101
102 poly_float* filter_1_input_buffer = filter_1_input_->buffer;
103 const poly_float* filter_2_output_buffer = filter_2_->output()->buffer;
104 const poly_float* filter_1_straight_input = input(kFilter1Input)->source->buffer;
105
106 for (int i = 0; i < num_samples; ++i)
107 filter_1_input_buffer[i] = filter_2_output_buffer[i] + filter_1_straight_input[i];
108
109 getLocalProcessor(filter_1_)->process(num_samples);
110 utils::copyBuffer(output()->buffer, filter_1_->output()->buffer, num_samples);
111 }
112
113 void FiltersModule::process(int num_samples) {
122 processSerialBackward(num_samples);
124 processSerialForward(num_samples);
125 else
126 processParallel(num_samples);
127 }
128} // namespace vital
A versatile filter module supporting multiple filter models and mixing options.
Definition filter_module.h:25
@ kMidi
Definition filter_module.h:39
@ kReset
Definition filter_module.h:37
@ kKeytrack
Definition filter_module.h:38
@ kAudio
Definition filter_module.h:36
const Value * getOnValue()
Retrieves the "on" Value for controlling the filter state if it was created.
Definition filter_module.h:115
void init() override
Initializes the FiltersModule, creating parameter controls and instantiating filter submodules.
Definition filters_module.cpp:15
FiltersModule()
Constructs the FiltersModule, initializing internal states and creating outputs for filter inputs.
Definition filters_module.cpp:6
FilterModule * filter_2_
The second filter module instance.
Definition filters_module.h:110
void processSerialBackward(int num_samples)
Processes filters in the reverse serial mode, with filter 2 feeding into filter 1.
Definition filters_module.cpp:90
std::shared_ptr< Output > filter_1_input_
Internal output buffer feeding filter 1.
Definition filters_module.h:115
Value * filter_2_filter_input_
Determines if filter 2 is connected in series/parallel routing.
Definition filters_module.h:113
FilterModule * filter_1_
The first filter module instance.
Definition filters_module.h:109
Value * filter_1_filter_input_
Determines if filter 1 is connected in series/parallel routing.
Definition filters_module.h:112
@ kReset
Definition filters_module.h:32
@ kMidi
Definition filters_module.h:31
@ kFilter1Input
Definition filters_module.h:28
@ kKeytrack
Definition filters_module.h:30
@ kFilter2Input
Definition filters_module.h:29
void processSerialForward(int num_samples)
Processes filters in serial mode, with filter 1 feeding into filter 2.
Definition filters_module.cpp:67
void process(int num_samples) override
Processes a block of samples, applying either parallel or serial filter configurations based on param...
Definition filters_module.cpp:113
void processParallel(int num_samples)
Processes both filters in parallel, mixing their outputs.
Definition filters_module.cpp:46
std::shared_ptr< Output > filter_2_input_
Internal output buffer feeding filter 2.
Definition filters_module.h:116
force_inline Input * input(unsigned int index=0) const
Retrieves the Input pointer at a given index.
Definition processor.h:587
void useInput(Input *input)
Uses an existing Input object as this Processor's first input.
Definition processor.cpp:126
void plug(const Output *source)
Connects an external Output to this Processor's first input.
Definition processor.cpp:79
virtual void process(int num_samples)=0
Main processing function. Called by the ProcessorRouter.
force_inline Output * output(unsigned int index=0) const
Retrieves the Output pointer at a given index.
Definition processor.h:616
virtual void init()
Called after constructor, used for any additional initialization. Subclasses can override....
Definition processor.h:258
Processor * getLocalProcessor(const Processor *global_processor)
Retrieves the local instance of a globally defined Processor.
Definition processor_router.cpp:376
virtual void addProcessor(Processor *processor)
Adds a Processor to be managed by this router.
Definition processor_router.cpp:121
A ProcessorRouter that encapsulates a cohesive unit of functionality in the synthesizer.
Definition synth_module.h:129
Value * createBaseControl(std::string name, bool audio_rate=false, bool smooth_value=false)
Creates a simple control processor for a given parameter name.
Definition synth_module.cpp:22
void addSubmodule(SynthModule *module)
Adds a submodule to this SynthModule.
Definition synth_module.h:289
force_inline mono_float value() const
Returns the current mono_float value of the first lane.
Definition value.h:60
force_inline void copyBuffer(mono_float *dest, const mono_float *source, int size)
Copies data from a source mono buffer to a destination mono buffer.
Definition poly_utils.h:586
Contains classes and functions used within the Vital synthesizer framework.
const Output * source
The output from which this input reads samples.
Definition processor.h:134
poly_float * buffer
Pointer to the output buffer.
Definition processor.h:110
Represents a vector of floating-point values using SIMD instructions.
Definition poly_values.h:600