Vital
Loading...
Searching...
No Matches
reverb.h
Go to the documentation of this file.
1#pragma once
2
3#include "processor.h"
4#include "one_pole_filter.h"
5
6namespace vital {
7
16 class Reverb : public Processor {
17 public:
21 static constexpr mono_float kT60Amplitude = 0.001f;
22
26 static constexpr mono_float kAllpassFeedback = 0.6f;
27
31 static constexpr float kMinDelay = 3.0f;
32
36 static constexpr int kBaseSampleRate = 44100;
37
41 static constexpr int kDefaultSampleRate = 88200;
42
46 static constexpr int kNetworkSize = 16;
47
51 static constexpr int kBaseFeedbackBits = 14;
52
56 static constexpr int kExtraLookupSample = 4;
57
61 static constexpr int kBaseAllpassBits = 10;
62
66 static constexpr int kNetworkContainers = kNetworkSize / poly_float::kSize;
67
71 static constexpr int kMinSizePower = -3;
72
76 static constexpr int kMaxSizePower = 1;
77
81 static constexpr float kSizePowerRange = kMaxSizePower - kMinSizePower;
82
87
92
97 enum {
113 };
114
120 Reverb();
121
123 virtual ~Reverb() { }
124
130 void process(int num_samples) override;
131
138 void processWithInput(const poly_float* audio_in, int num_samples) override;
139
146 force_inline float getSampleRateRatio(int sample_rate) { return sample_rate / (1.0f * kBaseSampleRate); }
147
156 force_inline int getBufferScale(int sample_rate) {
157 int scale = 1;
158 float ratio = getSampleRateRatio(sample_rate);
159 while (scale < ratio)
160 scale *= 2;
161 return scale;
162 }
163
169 void setSampleRate(int sample_rate) override;
170
176 void setOversampleAmount(int oversample_amount) override;
177
183 void setupBuffersForSampleRate(int sample_rate);
184
188 void hardReset() override;
189
198 poly_float write_offset = poly_float(write_index_) - offset;
199 poly_float floored_offset = utils::floor(write_offset);
200 poly_float t = write_offset - floored_offset;
201 matrix interpolation_matrix = utils::getPolynomialInterpolationMatrix(t);
202 poly_int indices = utils::toInt(floored_offset) & feedback_mask_;
203 matrix value_matrix = utils::getValueMatrix(lookups, indices);
204 value_matrix.transpose();
205 return interpolation_matrix.multiplyAndSumRows(value_matrix);
206 }
207
216 poly_int indices = (poly_int(write_index_ * poly_float::kSize) - offset) & allpass_mask_;
217 return poly_float(lookup[indices[0]], lookup[indices[1]], lookup[indices[2]], lookup[indices[3]]);
218 }
219
228 buffer[0] = buffer[max_feedback_size_];
229 buffer[max_feedback_size_ + 1] = buffer[1];
230 buffer[max_feedback_size_ + 2] = buffer[2];
231 buffer[max_feedback_size_ + 3] = buffer[3];
232 }
233
238 virtual Processor* clone() const override { VITAL_ASSERT(false); return nullptr; }
239
240 private:
244 std::unique_ptr<StereoMemory> memory_;
245
249 std::unique_ptr<poly_float[]> allpass_lookups_[kNetworkContainers];
250
254 std::unique_ptr<mono_float[]> feedback_memories_[kNetworkSize];
255
259 mono_float* feedback_lookups_[kNetworkSize];
260
265
269 OnePoleFilter<> low_shelf_filters_[kNetworkContainers];
270
274 OnePoleFilter<> high_shelf_filters_[kNetworkContainers];
275
279 OnePoleFilter<> low_pre_filter_;
280
284 OnePoleFilter<> high_pre_filter_;
285
289 poly_float low_pre_coefficient_;
290
294 poly_float high_pre_coefficient_;
295
299 poly_float low_coefficient_;
300
304 poly_float low_amplitude_;
305
309 poly_float high_coefficient_;
310
314 poly_float high_amplitude_;
315
319 mono_float chorus_phase_;
320
324 poly_float chorus_amount_;
325
329 poly_float feedback_;
330
334 poly_float damping_;
335
339 poly_float sample_delay_;
340
344 poly_float sample_delay_increment_;
345
349 poly_float dry_;
350
354 poly_float wet_;
355
359 int write_index_;
360
364 int max_allpass_size_;
365
369 int max_feedback_size_;
370
374 int feedback_mask_;
375
379 poly_mask allpass_mask_;
380
384 int poly_allpass_mask_;
385
386 JUCE_LEAK_DETECTOR(Reverb)
387 };
388} // namespace vital
A one-pole filter implementation with optional nonlinear saturation.
Definition one_pole_filter.h:22
Base class for all signal-processing units in Vital.
Definition processor.h:212
A Processor implementing a dense feedback network reverb.
Definition reverb.h:16
void hardReset() override
Resets the reverb, clearing buffer contents and resetting filters.
Definition reverb.cpp:483
static constexpr float kMinDelay
Minimum delay (in samples) used for certain time-domain operations.
Definition reverb.h:31
void setSampleRate(int sample_rate) override
Overrides base class to update reverb internal buffers at a new sample rate.
Definition reverb.cpp:462
force_inline poly_float readAllpass(const mono_float *lookup, poly_int offset)
Reads from the all-pass filters using integer offsets.
Definition reverb.h:215
static constexpr mono_float kT60Amplitude
Amplitude at which we consider the reverb tail to effectively end (T60).
Definition reverb.h:21
static constexpr int kDefaultSampleRate
Default sample rate used for internal buffer initialization.
Definition reverb.h:41
force_inline int getBufferScale(int sample_rate)
Computes a buffer scaling factor based on current sample rate.
Definition reverb.h:156
static constexpr int kMinSizePower
Minimum size exponent for reverb buffer scale.
Definition reverb.h:71
static constexpr int kExtraLookupSample
Extra samples in the buffer to allow for interpolation overflow.
Definition reverb.h:56
virtual ~Reverb()
Default destructor.
Definition reverb.h:123
force_inline poly_float readFeedback(const mono_float *const *lookups, poly_float offset)
Reads from the feedback delay line with polynomial interpolation.
Definition reverb.h:197
force_inline float getSampleRateRatio(int sample_rate)
Returns the ratio of the current sample rate to kBaseSampleRate.
Definition reverb.h:146
void setOversampleAmount(int oversample_amount) override
Overrides base class to handle changes in oversampling factor.
Definition reverb.cpp:472
static constexpr int kNetworkContainers
Number of poly_float-sized containers covering the entire network.
Definition reverb.h:66
static const poly_float kFeedbackDelays[kNetworkContainers]
Fixed feedback delays (in samples) for each container.
Definition reverb.h:91
void setupBuffersForSampleRate(int sample_rate)
Adjusts internal buffer sizes and states for the given sample rate.
Definition reverb.cpp:79
@ kNumInputs
Total number of inputs.
Definition reverb.h:112
@ kChorusFrequency
Frequency of the chorus LFO (Hz)
Definition reverb.h:107
@ kPreHighCutoff
Pre-filter high cutoff (MIDI note)
Definition reverb.h:101
@ kSize
Overall size (scales buffer size exponent)
Definition reverb.h:109
@ kChorusAmount
Amount of chorusing applied to feedback lines.
Definition reverb.h:106
@ kStereoWidth
Stereo width parameter (not used in all reverb modes)
Definition reverb.h:108
@ kAudio
Audio input buffer.
Definition reverb.h:98
@ kHighGain
High-frequency attenuation (dB)
Definition reverb.h:105
@ kDelay
Additional pre-delay in samples.
Definition reverb.h:110
@ kPreLowCutoff
Pre-filter low cutoff (MIDI note)
Definition reverb.h:100
@ kHighCutoff
Internal feedback high cutoff (MIDI note)
Definition reverb.h:104
@ kLowCutoff
Internal feedback low cutoff (MIDI note)
Definition reverb.h:102
@ kDecayTime
Reverb decay time in seconds.
Definition reverb.h:99
@ kLowGain
Low-frequency attenuation (dB)
Definition reverb.h:103
@ kWet
Dry/wet mix.
Definition reverb.h:111
static constexpr mono_float kAllpassFeedback
Feedback coefficient for all-pass filter sections.
Definition reverb.h:26
static constexpr int kBaseSampleRate
Reference sample rate for the base reverb time calculations.
Definition reverb.h:36
virtual Processor * clone() const override
Creates a clone of this Processor. (Not implemented for Reverb).
Definition reverb.h:238
static const poly_int kAllpassDelays[kNetworkContainers]
Fixed all-pass filter delays for each container.
Definition reverb.h:86
static constexpr int kBaseAllpassBits
Base bits used for the all-pass filters’ buffer size.
Definition reverb.h:61
static constexpr int kBaseFeedbackBits
Base bits used for feedback buffer size calculations.
Definition reverb.h:51
Reverb()
Constructs a Reverb processor with default configuration.
Definition reverb.cpp:41
static constexpr int kMaxSizePower
Maximum size exponent for reverb buffer scale.
Definition reverb.h:76
void process(int num_samples) override
Processes audio by pulling from the kAudio input buffer.
Definition reverb.cpp:113
static constexpr float kSizePowerRange
The exponent range (max minus min).
Definition reverb.h:81
void processWithInput(const poly_float *audio_in, int num_samples) override
Processes a block of audio using a provided input buffer.
Definition reverb.cpp:128
static constexpr int kNetworkSize
Number of feedback delay lines in the network.
Definition reverb.h:46
force_inline void wrapFeedbackBuffer(mono_float *buffer)
Wraps the feedback buffer to preserve continuity for polynomial interpolation.
Definition reverb.h:227
#define VITAL_ASSERT(x)
Definition common.h:11
#define force_inline
Definition common.h:23
force_inline poly_float floor(poly_float value)
Floors each lane in value.
Definition poly_utils.h:777
force_inline matrix getPolynomialInterpolationMatrix(poly_float t_from)
Creates a matrix for polynomial interpolation given a starting poly_float t_from.
Definition poly_utils.h:205
force_inline matrix getValueMatrix(const mono_float *buffer, poly_int indices)
Creates a matrix of 4 poly_float lanes from a single buffer at varying indices.
Definition poly_utils.h:262
force_inline poly_int toInt(poly_float floats)
Casts a poly_float to poly_int by truncation.
Definition poly_utils.h:748
Contains classes and functions used within the Vital synthesizer framework.
float mono_float
Definition common.h:33
Declares the Processor class and related structures for handling audio processing in a polyphonic con...
A structure representing a 4x1 matrix of poly_float rows.
Definition matrix.h:19
force_inline poly_float multiplyAndSumRows(const matrix &other)
Multiplies and sums corresponding rows of this matrix with another matrix.
Definition matrix.h:93
force_inline void transpose()
Transposes the matrix in-place.
Definition matrix.h:44
Represents a vector of floating-point values using SIMD instructions.
Definition poly_values.h:600
Represents a vector of integer values using SIMD instructions.
Definition poly_values.h:56