Vital
Loading...
Searching...
No Matches
filter_response.h
Go to the documentation of this file.
1#pragma once
2
4
5#include "skin.h"
6#include "comb_filter.h"
7#include "digital_svf.h"
8#include "diode_filter.h"
9#include "dirty_filter.h"
10#include "formant_filter.h"
11#include "ladder_filter.h"
12#include "phaser_filter.h"
13#include "sallen_key_filter.h"
14#include "synth_types.h"
15
16class SynthSlider;
17
27public:
29 static constexpr int kResolution = 512;
31 static constexpr int kDefaultVisualSampleRate = 200000;
33 static constexpr int kCombAlternatePeriod = 3;
34
36 static constexpr double kMouseSensitivityX = 0.3;
37 static constexpr double kMouseSensitivityY = 0.3;
38
56
62 FilterResponse(String suffix, const vital::output_map& mono_modulations);
63
70 FilterResponse(int index, const vital::output_map& mono_modulations, const vital::output_map& poly_modulations);
71
75 virtual ~FilterResponse();
76
81 void init(OpenGlWrapper& open_gl) override;
82
88 void render(OpenGlWrapper& open_gl, bool animate) override;
89
94 void destroy(OpenGlWrapper& open_gl) override;
95
100 void paintBackground(Graphics& g) override;
101
106 void setCutoffSlider(SynthSlider* slider) { cutoff_slider_ = slider; }
107
112 void setResonanceSlider(SynthSlider* slider) { resonance_slider_ = slider; }
113
118 void setFormantXSlider(SynthSlider* slider) { formant_x_slider_ = slider; }
119
124 void setFormantYSlider(SynthSlider* slider) { formant_y_slider_ = slider; }
125
130 void setFilterMixSlider(SynthSlider* slider) { filter_mix_slider_ = slider; }
131
136 void setBlendSlider(SynthSlider* slider) { blend_slider_ = slider; }
137
142 void setTransposeSlider(SynthSlider* slider) { transpose_slider_ = slider; }
143
148 void setFormantTransposeSlider(SynthSlider* slider) { formant_transpose_slider_ = slider; }
149
154 void setFormantResonanceSlider(SynthSlider* slider) { formant_resonance_slider_ = slider; }
155
160 void setFormantSpreadSlider(SynthSlider* slider) { formant_spread_slider_ = slider; }
161
166 void mouseDown(const MouseEvent& e) override;
167
172 void mouseDrag(const MouseEvent& e) override;
173
178 void mouseExit(const MouseEvent& e) override;
179
185 void mouseWheelMove(const MouseEvent& e, const MouseWheelDetails& wheel) override;
186
191 void setActive(bool active) { active_ = active; }
192
197 void setModel(vital::constants::FilterModel model) { filter_model_ = model; }
198
203 void setStyle(int style) { filter_state_.style = style; }
204
205private:
210 struct FilterResponseShader {
211 static constexpr int kMaxStages = 5;
212
213 OpenGLShaderProgram* shader;
214 std::unique_ptr<OpenGLShaderProgram::Attribute> position;
215
216 std::unique_ptr<OpenGLShaderProgram::Uniform> mix;
217 std::unique_ptr<OpenGLShaderProgram::Uniform> midi_cutoff;
218 std::unique_ptr<OpenGLShaderProgram::Uniform> resonance;
219 std::unique_ptr<OpenGLShaderProgram::Uniform> drive;
220 std::unique_ptr<OpenGLShaderProgram::Uniform> db24;
221 std::unique_ptr<OpenGLShaderProgram::Uniform> stages[kMaxStages];
222
223 std::unique_ptr<OpenGLShaderProgram::Uniform> formant_cutoff;
224 std::unique_ptr<OpenGLShaderProgram::Uniform> formant_resonance;
225 std::unique_ptr<OpenGLShaderProgram::Uniform> formant_spread;
226 std::unique_ptr<OpenGLShaderProgram::Uniform> formant_low;
227 std::unique_ptr<OpenGLShaderProgram::Uniform> formant_band;
228 std::unique_ptr<OpenGLShaderProgram::Uniform> formant_high;
229 };
230
235
240 void setFilterSettingsFromPosition(Point<int> position);
241
246 void drawFilterResponse(OpenGlWrapper& open_gl);
247
254 vital::poly_float getOutputsTotal(std::pair<vital::Output*, vital::Output*> outputs,
255 vital::poly_float default_value);
256
262 bool setupFilterState(vital::constants::FilterModel model);
263
268 bool isStereoState();
269
276 void loadShader(FilterShader shader, vital::constants::FilterModel model, int index);
277
283 void bind(FilterShader shader, OpenGLContext& open_gl_context);
284
290 void unbind(FilterShader shader, OpenGLContext& open_gl_context);
291
296 void renderLineResponse(OpenGlWrapper& open_gl);
297
298 bool active_;
299 bool animate_;
300 Point<int> last_mouse_position_;
301 double current_resonance_value_;
302 double current_cutoff_value_;
303 double current_formant_x_value_;
304 double current_formant_y_value_;
305
306 Colour line_left_color_;
307 Colour line_right_color_;
308 Colour line_disabled_color_;
309 Colour fill_left_color_;
310 Colour fill_right_color_;
311 Colour fill_disabled_color_;
312
313 vital::SallenKeyFilter analog_filter_;
314 vital::CombFilter comb_filter_;
315 vital::DigitalSvf digital_filter_;
316 vital::DiodeFilter diode_filter_;
317 vital::DirtyFilter dirty_filter_;
318 vital::FormantFilter formant_filter_;
319 vital::LadderFilter ladder_filter_;
320 vital::PhaserFilter phaser_filter_;
321
322 int last_filter_style_;
323 vital::constants::FilterModel last_filter_model_;
324 vital::constants::FilterModel filter_model_;
327
328 SynthSlider* cutoff_slider_;
329 SynthSlider* resonance_slider_;
330 SynthSlider* formant_x_slider_;
331 SynthSlider* formant_y_slider_;
332 SynthSlider* filter_mix_slider_;
333 SynthSlider* blend_slider_;
334 SynthSlider* transpose_slider_;
335 SynthSlider* formant_transpose_slider_;
336 SynthSlider* formant_resonance_slider_;
337 SynthSlider* formant_spread_slider_;
338
339 std::pair<vital::Output*, vital::Output*> filter_mix_outputs_;
340 std::pair<vital::Output*, vital::Output*> midi_cutoff_outputs_;
341 std::pair<vital::Output*, vital::Output*> resonance_outputs_;
342 std::pair<vital::Output*, vital::Output*> blend_outputs_;
343 std::pair<vital::Output*, vital::Output*> transpose_outputs_;
344 std::pair<vital::Output*, vital::Output*> interpolate_x_outputs_;
345 std::pair<vital::Output*, vital::Output*> interpolate_y_outputs_;
346 std::pair<vital::Output*, vital::Output*> formant_resonance_outputs_;
347 std::pair<vital::Output*, vital::Output*> formant_spread_outputs_;
348 std::pair<vital::Output*, vital::Output*> formant_transpose_outputs_;
349
350 FilterResponseShader shaders_[kNumFilterShaders];
351 std::unique_ptr<float[]> line_data_;
352 GLuint vertex_array_object_;
353 GLuint line_buffer_;
354 GLuint response_buffer_;
355
356 JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(FilterResponse)
357};
Displays the frequency response of various filter models in Vital.
Definition filter_response.h:26
void setCutoffSlider(SynthSlider *slider)
Sets the slider controlling the cutoff frequency.
Definition filter_response.h:106
void mouseDrag(const MouseEvent &e) override
Handles mouse drag events, allowing interactive adjustment of filter parameters.
Definition filter_response.cpp:328
void setFormantXSlider(SynthSlider *slider)
Sets the slider controlling the formant X parameter (for formant filter models).
Definition filter_response.h:118
void setFilterMixSlider(SynthSlider *slider)
Sets the slider controlling the filter mix parameter.
Definition filter_response.h:130
void destroy(OpenGlWrapper &open_gl) override
Destroys the OpenGL resources used by this component.
Definition filter_response.cpp:240
static constexpr double kMouseSensitivityY
Definition filter_response.h:37
void setFormantResonanceSlider(SynthSlider *slider)
Sets the slider for formant resonance parameter.
Definition filter_response.h:154
void mouseDown(const MouseEvent &e) override
Handles mouse down events, initiating user interaction with filter parameters.
Definition filter_response.cpp:311
FilterShader
An enumeration of different filter shader programs used for rendering.
Definition filter_response.h:43
@ kLadder
Definition filter_response.h:46
@ kPositiveFlange
Definition filter_response.h:51
@ kComb
Definition filter_response.h:50
@ kDigital
Definition filter_response.h:47
@ kNumFilterShaders
Definition filter_response.h:54
@ kDiode
Definition filter_response.h:48
@ kNegativeFlange
Definition filter_response.h:52
@ kFormant
Definition filter_response.h:49
@ kPhase
Definition filter_response.h:53
@ kDirty
Definition filter_response.h:45
@ kAnalog
Definition filter_response.h:44
void paintBackground(Graphics &g) override
Draws the background of the component (e.g. coloring, grid lines).
Definition filter_response.cpp:272
void setActive(bool active)
Sets whether the filter visualization is active.
Definition filter_response.h:191
virtual ~FilterResponse()
Destructor.
Definition filter_response.cpp:188
void setBlendSlider(SynthSlider *slider)
Sets the slider controlling the blend parameter (e.g., for morphing filter responses).
Definition filter_response.h:136
void setStyle(int style)
Sets the style of the filter (e.g., 12dB/oct, 24dB/oct).
Definition filter_response.h:203
void setTransposeSlider(SynthSlider *slider)
Sets the slider controlling transposition of certain filter parameters.
Definition filter_response.h:142
void mouseWheelMove(const MouseEvent &e, const MouseWheelDetails &wheel) override
Handles mouse wheel events for fine-tuning filter parameters.
Definition filter_response.cpp:338
void mouseExit(const MouseEvent &e) override
Handles mouse exit events, finalizing interactive changes and hiding tooltips.
Definition filter_response.cpp:332
void setFormantTransposeSlider(SynthSlider *slider)
Sets the slider for formant transpose (formant shifting) parameter.
Definition filter_response.h:148
static constexpr int kDefaultVisualSampleRate
High sample rate used for filter response visualization (not actual audio rate).
Definition filter_response.h:31
void setFormantYSlider(SynthSlider *slider)
Sets the slider controlling the formant Y parameter (for formant filter models).
Definition filter_response.h:124
void render(OpenGlWrapper &open_gl, bool animate) override
Renders the filter response curve to the screen.
Definition filter_response.cpp:234
static constexpr int kResolution
Number of points used for drawing the filter response curve.
Definition filter_response.h:29
static constexpr int kCombAlternatePeriod
Period used for alternating patterns (specifically with comb filters).
Definition filter_response.h:33
void setFormantSpreadSlider(SynthSlider *slider)
Sets the slider for formant spread parameter.
Definition filter_response.h:160
void init(OpenGlWrapper &open_gl) override
Initializes the OpenGL resources for the filter response visualization.
Definition filter_response.cpp:190
void setResonanceSlider(SynthSlider *slider)
Sets the slider controlling the filter resonance.
Definition filter_response.h:112
static constexpr double kMouseSensitivityX
Sensitivity multipliers for mouse interaction along the X and Y axes.
Definition filter_response.h:36
void setModel(vital::constants::FilterModel model)
Sets the currently selected filter model to visualize.
Definition filter_response.h:197
A component for rendering lines with optional filling and boost effects using OpenGL.
Definition open_gl_line_renderer.h:16
A specialized slider with extended functionality for modulation, parameter control,...
Definition synth_slider.h:314
A Processor implementing a comb-based filter with multiple feedback styles.
Definition comb_filter.h:18
A state-variable filter (SVF) implementation, supporting multiple filter types (12/24 dB,...
Definition digital_svf.h:17
A diode ladder filter implementation for the Vital synthesizer.
Definition diode_filter.h:20
A nonlinear filter that produces a "dirty" and saturated sound, ideal for adding character to the sig...
Definition dirty_filter.h:30
A multi-formant filter for vocal/voicing effects in the Vital synthesizer.
Definition formant_filter.h:18
A classic transistor ladder-style filter for the Vital synthesizer.
Definition ladder_filter.h:19
A multi-stage phaser filter for the Vital synthesizer.
Definition phaser_filter.h:19
A Sallen-Key style filter capable of multiple modes (12dB, 24dB, dual modes) with nonlinear drive and...
Definition sallen_key_filter.h:28
Holds the parameters necessary to configure a SynthFilter at runtime.
Definition synth_filter.h:92
int style
Filter style enum (e.g., k12Db, k24Db)
Definition synth_filter.h:116
FilterModel
Identifiers for different filter models available in Vital’s filters.
Definition synth_constants.h:194
std::map< std::string, Output * > output_map
Maps parameter names to Output pointers, representing output signals from various modules.
Definition synth_types.h:229
A helper struct containing references to OpenGL context, shaders, and display scale.
Definition shaders.h:174
Represents a vector of floating-point values using SIMD instructions.
Definition poly_values.h:600