Vital
Loading...
Searching...
No Matches
distortion_module.cpp
Go to the documentation of this file.
1#include "distortion_module.h"
2
3#include "distortion.h"
4#include "digital_svf.h"
5
6namespace vital {
7
9 SynthModule(0, 1), // no inputs registered here, 1 output
10 distortion_(nullptr),
11 filter_(nullptr),
12 mix_(0.0f) { }
13
15 // Clean up owned processors if needed.
16 }
17
26 distortion_ = new Distortion();
29
30 Value* distortion_type = createBaseControl("distortion_type");
31 Output* distortion_drive = createMonoModControl("distortion_drive", true, true);
32 distortion_mix_ = createMonoModControl("distortion_mix");
33
34 distortion_->plug(distortion_type, Distortion::kType);
35 distortion_->plug(distortion_drive, Distortion::kDrive);
36
37 filter_order_ = createBaseControl("distortion_filter_order");
38 Output* midi_cutoff = createMonoModControl("distortion_filter_cutoff", true, true);
39 Output* resonance = createMonoModControl("distortion_filter_resonance");
40 Output* blend = createMonoModControl("distortion_filter_blend");
41
42 filter_ = new DigitalSvf();
48 filter_->setBasic(true);
50
52 }
53
54 void DistortionModule::setSampleRate(int sample_rate) {
61 SynthModule::setSampleRate(sample_rate);
62 distortion_->setSampleRate(sample_rate);
63 filter_->setSampleRate(sample_rate);
64 }
65
66 void DistortionModule::processWithInput(const poly_float* audio_in, int num_samples) {
73 SynthModule::process(num_samples);
74
75 // Determine processing order based on filter order value
76 float order_value = filter_order_->output()->buffer[0][0];
77 if (order_value < 1.0f) {
78 // Only distortion
79 distortion_->processWithInput(audio_in, num_samples);
80 }
81 else if (order_value > 1.0f) {
82 // Distortion followed by filter
83 distortion_->processWithInput(audio_in, num_samples);
84 filter_->processWithInput(output()->buffer, num_samples);
85 }
86 else {
87 // Filter first, then distortion
88 filter_->processWithInput(audio_in, num_samples);
89 distortion_->processWithInput(output()->buffer, num_samples);
90 }
91
92 poly_float current_mix = mix_;
93 mix_ = utils::clamp(distortion_mix_->buffer[0], 0.0f, 1.0f);
94 poly_float delta_mix = (mix_ - current_mix) * (1.0f / num_samples);
95 poly_float* audio_out = output()->buffer;
96
97 // Apply wet/dry interpolation over the block of samples.
98 for (int i = 0; i < num_samples; ++i) {
99 current_mix += delta_mix;
100 // Interpolate between the original audio and the processed output
101 audio_out[i] = utils::interpolate(audio_in[i], audio_out[i], current_mix);
102 }
103 }
104} // namespace vital
A state-variable filter (SVF) implementation, supporting multiple filter types (12/24 dB,...
Definition digital_svf.h:17
void setDriveCompensation(bool drive_compensation)
Enables or disables drive compensation (reducing drive as resonance increases).
Definition digital_svf.h:407
void processWithInput(const poly_float *audio_in, int num_samples) override
Processes a block of samples using a provided input buffer.
Definition digital_svf.cpp:41
void setBasic(bool basic)
Sets whether this filter should use a simpler, “basic” processing path.
Definition digital_svf.h:400
A Processor that applies various types of distortion to an audio signal.
Definition distortion.h:16
virtual void processWithInput(const poly_float *audio_in, int num_samples) override
Processes a block of audio using a provided input buffer.
Definition distortion.cpp:210
@ kType
Distortion type (see Type enum)
Definition distortion.h:44
@ kDrive
Drive amount in dB.
Definition distortion.h:45
Output * distortion_mix_
Control for blending between dry and distorted signal.
Definition distortion_module.h:66
DistortionModule()
Constructs a new DistortionModule.
Definition distortion_module.cpp:8
DigitalSvf * filter_
The internal digital state-variable filter processor.
Definition distortion_module.h:65
virtual ~DistortionModule()
Destroys the DistortionModule, releasing its internal resources.
Definition distortion_module.cpp:14
Value * filter_order_
Determines the order of filtering relative to distortion.
Definition distortion_module.h:64
virtual void processWithInput(const poly_float *audio_in, int num_samples) override
Processes a block of samples with given input audio, applying distortion and filtering.
Definition distortion_module.cpp:66
virtual void init() override
Initializes the DistortionModule, setting up internal controls and connecting processors.
Definition distortion_module.cpp:18
virtual void setSampleRate(int sample_rate) override
Sets the sample rate for the module, ensuring time-dependent parameters scale properly.
Definition distortion_module.cpp:54
poly_float mix_
The current effective mix value for wet/dry blending.
Definition distortion_module.h:67
Distortion * distortion_
The internal Distortion processor.
Definition distortion_module.h:63
void useOutput(Output *output)
Uses an existing Output object as this Processor's first output.
Definition processor.cpp:138
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 setSampleRate(int sample_rate)
Updates the sample rate of this Processor (scaled by oversampling).
Definition processor.h:285
virtual void init()
Called after constructor, used for any additional initialization. Subclasses can override....
Definition processor.h:258
virtual void addIdleProcessor(Processor *processor)
Adds a Processor that should remain idle (not processed) in the router.
Definition processor_router.cpp:146
@ kPassBlend
Blending parameter for low-pass, high-pass, band-pass.
Definition synth_filter.h:62
@ kResonance
Resonance parameter.
Definition synth_filter.h:58
@ kMidiCutoff
MIDI-based cutoff parameter.
Definition synth_filter.h:57
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
Output * createMonoModControl(std::string name, bool audio_rate=false, bool smooth_value=false, Output *internal_modulation=nullptr)
Creates a monophonic mod control, including applying parameter scaling.
Definition synth_module.cpp:104
A Processor that maintains and outputs a constant poly_float value.
Definition value.h:24
cr::Value resonance
Resonance factor for this formant.
Definition formant_filter.cpp:18
cr::Value midi_cutoff
MIDI note for the filter's cutoff.
Definition formant_filter.cpp:19
force_inline poly_float clamp(poly_float value, mono_float min, mono_float max)
Clamps each lane of a vector to [min, max].
Definition poly_utils.h:306
force_inline poly_float interpolate(poly_float from, poly_float to, mono_float t)
Performs a linear interpolation between two poly_floats using a scalar t in [0..1].
Definition poly_utils.h:182
Contains classes and functions used within the Vital synthesizer framework.
Holds and manages a buffer of samples (poly_float) for a Processor's output.
Definition processor.h:35
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