|
Vital
|
A Processor implementing a dense feedback network reverb. More...
#include <reverb.h>
Public Types | |
| enum | { kAudio , kDecayTime , kPreLowCutoff , kPreHighCutoff , kLowCutoff , kLowGain , kHighCutoff , kHighGain , kChorusAmount , kChorusFrequency , kStereoWidth , kSize , kDelay , kWet , kNumInputs } |
Public Member Functions | |
| Reverb () | |
| Constructs a Reverb processor with default configuration. | |
| virtual | ~Reverb () |
| Default destructor. | |
| void | process (int num_samples) override |
| Processes audio by pulling from the kAudio input buffer. | |
| void | processWithInput (const poly_float *audio_in, int num_samples) override |
| Processes a block of audio using a provided input buffer. | |
| force_inline float | getSampleRateRatio (int sample_rate) |
| Returns the ratio of the current sample rate to kBaseSampleRate. | |
| force_inline int | getBufferScale (int sample_rate) |
| Computes a buffer scaling factor based on current sample rate. | |
| void | setSampleRate (int sample_rate) override |
| Overrides base class to update reverb internal buffers at a new sample rate. | |
| void | setOversampleAmount (int oversample_amount) override |
| Overrides base class to handle changes in oversampling factor. | |
| void | setupBuffersForSampleRate (int sample_rate) |
| Adjusts internal buffer sizes and states for the given sample rate. | |
| void | hardReset () override |
| Resets the reverb, clearing buffer contents and resetting filters. | |
| force_inline poly_float | readFeedback (const mono_float *const *lookups, poly_float offset) |
| Reads from the feedback delay line with polynomial interpolation. | |
| force_inline poly_float | readAllpass (const mono_float *lookup, poly_int offset) |
| Reads from the all-pass filters using integer offsets. | |
| force_inline void | wrapFeedbackBuffer (mono_float *buffer) |
| Wraps the feedback buffer to preserve continuity for polynomial interpolation. | |
| virtual Processor * | clone () const override |
| Creates a clone of this Processor. (Not implemented for Reverb). | |
Public Member Functions inherited from vital::Processor | |
| Processor (int num_inputs, int num_outputs, bool control_rate=false, int max_oversample=1) | |
| Constructs a Processor with a given number of inputs/outputs and oversampling. | |
| virtual | ~Processor () |
| Virtual destructor. | |
| virtual bool | hasState () const |
| Indicates whether this Processor requires per-voice state. | |
| virtual void | init () |
| Called after constructor, used for any additional initialization. Subclasses can override. Sets the initialized flag. | |
| virtual void | reset (poly_mask reset_mask) |
| Called to reset the Processor's per-voice state (e.g., on note-on). | |
| bool | initialized () |
| Returns whether this Processor has been initialized. | |
| force_inline bool | enabled () const |
| Checks if this Processor is enabled. | |
| virtual void | enable (bool enable) |
| Enables or disables this Processor. | |
| force_inline int | getSampleRate () const |
| Retrieves the current (effective) sample rate. | |
| force_inline int | getOversampleAmount () const |
| Retrieves the current oversampling factor. | |
| force_inline bool | isControlRate () const |
| Checks if this Processor is running at control rate (buffer_size == 1). | |
| virtual void | setControlRate (bool control_rate) |
| Sets whether this Processor runs at control rate. | |
| force_inline poly_mask | getResetMask (int input_index) const |
| Retrieves a mask indicating which voices triggered a note-on event. Compares the input's trigger_value to kVoiceOn. | |
| force_inline void | clearOutputBufferForReset (poly_mask reset_mask, int input_index, int output_index) const |
| Clears output samples for voices that are about to be reset, based on the trigger offset. | |
| bool | inputMatchesBufferSize (int input=0) |
| Checks whether the buffer size of a particular input matches the size needed by this Processor. | |
| bool | checkInputAndOutputSize (int num_samples) |
Checks if all inputs and outputs have buffers big enough for num_samples. | |
| virtual bool | isPolyphonic () const |
| Checks if this Processor is polyphonic by querying its ProcessorRouter. | |
| void | plug (const Output *source) |
| Connects an external Output to this Processor's first input. | |
| void | plug (const Output *source, unsigned int input_index) |
| Connects an external Output to a specified input index. | |
| void | plug (const Processor *source) |
| Connects the first output of a Processor to this Processor's first input. | |
| void | plug (const Processor *source, unsigned int input_index) |
| Connects the first output of a Processor to a specified input index. | |
| void | plugNext (const Output *source) |
| Connects an external Output to the first available (unplugged) input. | |
| void | plugNext (const Processor *source) |
| Connects the first output of a Processor to the first available (unplugged) input. | |
| void | useInput (Input *input) |
| Uses an existing Input object as this Processor's first input. | |
| void | useInput (Input *input, int index) |
| Uses an existing Input object at a specified input index. | |
| void | useOutput (Output *output) |
| Uses an existing Output object as this Processor's first output. | |
| void | useOutput (Output *output, int index) |
| Uses an existing Output object at a specified output index. | |
| int | connectedInputs () |
| Counts how many inputs are connected to a real source (not null_source_). | |
| virtual void | unplugIndex (unsigned int input_index) |
| Removes the connection at a specified input index, if any. | |
| virtual void | unplug (const Output *source) |
| Removes a connection to a given Output from all inputs. | |
| virtual void | unplug (const Processor *source) |
| Removes connections to all outputs from a given Processor. | |
| virtual void | numInputsChanged () |
| Called when the number of inputs changes (e.g., new connections). Subclasses may override for dynamic behavior. | |
| force_inline void | router (ProcessorRouter *router) |
| Sets the ProcessorRouter that owns or manages this Processor. | |
| force_inline ProcessorRouter * | router () const |
| Returns the ProcessorRouter that currently owns this Processor. | |
| ProcessorRouter * | getTopLevelRouter () const |
| Gets the topmost (root) ProcessorRouter by traversing parent routers. | |
| virtual void | registerInput (Input *input, int index) |
| Registers a new input, appending it to the input list. | |
| virtual Output * | registerOutput (Output *output, int index) |
| Registers a new Output in the output list at a specified index. | |
| virtual void | registerInput (Input *input) |
| Registers a new Input by appending it to the end of the input list. | |
| virtual Output * | registerOutput (Output *output) |
| Registers a new Output by appending it to the end of the output list. | |
| force_inline int | numInputs () const |
| Returns the total number of Input pointers (owned or otherwise). | |
| force_inline int | numOutputs () const |
| Returns the total number of Output pointers (owned or otherwise). | |
| force_inline int | numOwnedInputs () const |
| Returns how many Input objects this Processor owns. | |
| force_inline int | numOwnedOutputs () const |
| Returns how many Output objects this Processor owns. | |
| force_inline Input * | input (unsigned int index=0) const |
| Retrieves the Input pointer at a given index. | |
| force_inline bool | isInputSourcePolyphonic (int index=0) |
| Checks if the input source at a given index is polyphonic. | |
| force_inline Input * | ownedInput (unsigned int index=0) const |
| Retrieves an owned Input pointer at a given index. | |
| force_inline Output * | output (unsigned int index=0) const |
| Retrieves the Output pointer at a given index. | |
| force_inline Output * | ownedOutput (unsigned int index=0) const |
| Retrieves an owned Output pointer at a given index. | |
| void | setPluggingStart (int start) |
Sets the position at which plugNext starts searching for an open input. | |
Static Public Attributes | |
| static constexpr mono_float | kT60Amplitude = 0.001f |
| Amplitude at which we consider the reverb tail to effectively end (T60). | |
| static constexpr mono_float | kAllpassFeedback = 0.6f |
| Feedback coefficient for all-pass filter sections. | |
| static constexpr float | kMinDelay = 3.0f |
| Minimum delay (in samples) used for certain time-domain operations. | |
| static constexpr int | kBaseSampleRate = 44100 |
| Reference sample rate for the base reverb time calculations. | |
| static constexpr int | kDefaultSampleRate = 88200 |
| Default sample rate used for internal buffer initialization. | |
| static constexpr int | kNetworkSize = 16 |
| Number of feedback delay lines in the network. | |
| static constexpr int | kBaseFeedbackBits = 14 |
| Base bits used for feedback buffer size calculations. | |
| static constexpr int | kExtraLookupSample = 4 |
| Extra samples in the buffer to allow for interpolation overflow. | |
| static constexpr int | kBaseAllpassBits = 10 |
| Base bits used for the all-pass filters’ buffer size. | |
| static constexpr int | kNetworkContainers = kNetworkSize / poly_float::kSize |
| Number of poly_float-sized containers covering the entire network. | |
| static constexpr int | kMinSizePower = -3 |
| Minimum size exponent for reverb buffer scale. | |
| static constexpr int | kMaxSizePower = 1 |
| Maximum size exponent for reverb buffer scale. | |
| static constexpr float | kSizePowerRange = kMaxSizePower - kMinSizePower |
| The exponent range (max minus min). | |
| static const poly_int | kAllpassDelays [kNetworkContainers] |
| Fixed all-pass filter delays for each container. | |
| static const poly_float | kFeedbackDelays [kNetworkContainers] |
| Fixed feedback delays (in samples) for each container. | |
Additional Inherited Members | |
Protected Member Functions inherited from vital::Processor | |
| Output * | addOutput (int oversample=1) |
| Creates and registers a new Output. Handles control rate vs. audio rate. | |
| Input * | addInput () |
| Creates and registers a new Input, initially connected to null_source_. | |
Protected Attributes inherited from vital::Processor | |
| std::shared_ptr< ProcessorState > | state_ |
| Shared state (sample rate, oversample, etc.) | |
| int | plugging_start_ |
The index at which plugNext starts searching for an unplugged input. | |
| std::vector< std::shared_ptr< Input > > | owned_inputs_ |
| Inputs owned by this Processor. | |
| std::vector< std::shared_ptr< Output > > | owned_outputs_ |
| Outputs owned by this Processor. | |
| std::shared_ptr< std::vector< Input * > > | inputs_ |
| All inputs, owned or external. | |
| std::shared_ptr< std::vector< Output * > > | outputs_ |
| All outputs, owned or external. | |
| ProcessorRouter * | router_ |
| The ProcessorRouter that manages this Processor. | |
Static Protected Attributes inherited from vital::Processor | |
| static const Output | null_source_ |
| A null (dummy) source used for unconnected inputs. | |
A Processor implementing a dense feedback network reverb.
The Reverb uses multiple all-pass filters and feedback delay lines to create a spacious, reverberant sound. It can be controlled via decay time, cutoff filters, chorus modulation, stereo width, and more.
| anonymous enum |
| Enumerator | |
|---|---|
| kAudio | Audio input buffer. |
| kDecayTime | Reverb decay time in seconds. |
| kPreLowCutoff | Pre-filter low cutoff (MIDI note) |
| kPreHighCutoff | Pre-filter high cutoff (MIDI note) |
| kLowCutoff | Internal feedback low cutoff (MIDI note) |
| kLowGain | Low-frequency attenuation (dB) |
| kHighCutoff | Internal feedback high cutoff (MIDI note) |
| kHighGain | High-frequency attenuation (dB) |
| kChorusAmount | Amount of chorusing applied to feedback lines. |
| kChorusFrequency | Frequency of the chorus LFO (Hz) |
| kStereoWidth | Stereo width parameter (not used in all reverb modes) |
| kSize | Overall size (scales buffer size exponent) |
| kDelay | Additional pre-delay in samples. |
| kWet | Dry/wet mix. |
| kNumInputs | Total number of inputs. |
| vital::Reverb::Reverb | ( | ) |
|
inlinevirtual |
Default destructor.
|
inlineoverridevirtual |
Creates a clone of this Processor. (Not implemented for Reverb).
Implements vital::Processor.
|
inline |
Computes a buffer scaling factor based on current sample rate.
Doubling from kBaseSampleRate to keep the buffer sizes a power of two.
| sample_rate | The current sample rate. |
|
inline |
Returns the ratio of the current sample rate to kBaseSampleRate.
| sample_rate | The current sample rate. |
|
overridevirtual |
Resets the reverb, clearing buffer contents and resetting filters.
Resets the reverb to its default/initial state.
Clears feedback buffers, all-pass buffers, and filter states. Resets chorus amount based on the current parameter.
Reimplemented from vital::Processor.
|
overridevirtual |
Processes audio by pulling from the kAudio input buffer.
Processes the Reverb by reading from the kAudio input buffer.
| num_samples | Number of samples to process. |
Implements vital::Processor.
|
overridevirtual |
Processes a block of audio using a provided input buffer.
Processes the Reverb effect using an external input buffer.
| audio_in | Pointer to the input buffer. |
| num_samples | Number of samples to process. |
Applies the entire reverb network chain: wrapping buffers, reading from all-pass lines, writing into feedback delay lines, computing shelving filters, and blending the result with the dry signal.
| audio_in | Pointer to the input buffer. |
| num_samples | Number of samples to process. |
Reimplemented from vital::Processor.
|
inline |
Reads from the all-pass filters using integer offsets.
| lookup | Pointer to the all-pass delay line memory. |
| offset | The integer offset into the delay line. |
|
inline |
Reads from the feedback delay line with polynomial interpolation.
| lookups | Pointer array of pointers to delay line memory blocks. |
| offset | The fractional read offset (in samples). |
|
overridevirtual |
Overrides base class to handle changes in oversampling factor.
Updates oversampling and reconfigures the reverb buffers.
| oversample_amount | The new oversampling factor. |
| oversample_amount | The oversampling factor. |
Reimplemented from vital::Processor.
|
overridevirtual |
Overrides base class to update reverb internal buffers at a new sample rate.
Updates the sample rate and reconfigures the reverb buffers.
| sample_rate | The new sample rate in Hz. |
| sample_rate | The new sample rate. |
Reimplemented from vital::Processor.
| void vital::Reverb::setupBuffersForSampleRate | ( | int | sample_rate | ) |
Adjusts internal buffer sizes and states for the given sample rate.
Allocates buffer sizes and resets reverb memory for the given sample_rate.
| sample_rate | The current sample rate in Hz. |
|
inline |
Wraps the feedback buffer to preserve continuity for polynomial interpolation.
Copies the first few samples to the end so wrapping indices read correct data.
| buffer | Pointer to the feedback delay memory. |
|
static |
Fixed all-pass filter delays for each container.
|
staticconstexpr |
Feedback coefficient for all-pass filter sections.
|
staticconstexpr |
Base bits used for the all-pass filters’ buffer size.
|
staticconstexpr |
Base bits used for feedback buffer size calculations.
|
staticconstexpr |
Reference sample rate for the base reverb time calculations.
|
staticconstexpr |
Default sample rate used for internal buffer initialization.
|
staticconstexpr |
Extra samples in the buffer to allow for interpolation overflow.
|
static |
Fixed feedback delays (in samples) for each container.
|
staticconstexpr |
Maximum size exponent for reverb buffer scale.
|
staticconstexpr |
Minimum delay (in samples) used for certain time-domain operations.
|
staticconstexpr |
Minimum size exponent for reverb buffer scale.
|
staticconstexpr |
Number of poly_float-sized containers covering the entire network.
|
staticconstexpr |
Number of feedback delay lines in the network.
|
staticconstexpr |
The exponent range (max minus min).
|
staticconstexpr |
Amplitude at which we consider the reverb tail to effectively end (T60).