Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
pulp::signal::CharacterDelayT< SampleType > Class Template Reference

#include <character_delay.hpp>

Public Types

enum class  Character {
  clean , vintage_digital , tape , bbd ,
  diffusion
}
enum class  TapeTier { standard , physical }

Public Member Functions

void set_sample_rate (double sample_rate)
 Allocates every buffer for the 2 s left-channel maximum times the largest right-channel offset, recomputes coefficients, then resets.
void set_character (Character character)
void set_tape_tier (TapeTier tier)
void set_tape_speed_ips (SampleType ips)
void set_time_ms (SampleType left_ms)
void set_time_offset (SampleType multiplier)
 Right-channel time as a MULTIPLE of the left.
void set_right_time_ms (SampleType right_ms)
 Right-channel time in MILLISECONDS, independent of the left.
bool right_time_is_absolute () const noexcept
 True while the right channel is following set_right_time_ms().
double right_time_ms () const noexcept
 The right channel's target time in ms, whichever mode is selected.
void set_feedback (SampleType feedback)
void set_crossfeed (SampleType crossfeed)
void set_character_amount (SampleType amount)
void set_diffusion_amount (SampleType amount)
void set_mod (SampleType rate01, SampleType depth01)
void set_duck (SampleType amount01)
void set_freeze (bool on)
void set_reverse (bool on)
void set_loop_low_cut_hz (SampleType hz)
void set_loop_low_cut_resonance (SampleType q)
void set_loop_high_cut_hz (SampleType hz)
void set_loop_high_cut_resonance (SampleType q)
bool loop_tone_active () const noexcept
 True when the in-loop tone stage is doing anything at all.
int latency_samples () const noexcept
 Always 0.
void reset () noexcept
 Allocation-free.
void process (SampleType *left, SampleType *right, int num_samples) noexcept
 Stereo, in place, WET ONLY.
void set_bbd_compander_enabled (bool enabled) noexcept
 Bypass the BBD compander.
double bbd_bandwidth_hz () const noexcept
std::size_t bbd_stages () const noexcept
double vintage_band_edge_hz () const noexcept
double vintage_internal_rate_hz () const noexcept
std::size_t chew_state_index (int channel) const noexcept
const std::vector< double > & tape_gap_coefficients (int channel) const noexcept

Member Enumeration Documentation

◆ Character

template<typename SampleType>
enum class pulp::signal::CharacterDelayT::Character
strong
Enumerator
clean 
vintage_digital 
tape 
bbd 
diffusion 

◆ TapeTier

template<typename SampleType>
enum class pulp::signal::CharacterDelayT::TapeTier
strong
Enumerator
standard 
physical 

Member Function Documentation

◆ bbd_bandwidth_hz()

template<typename SampleType>
double pulp::signal::CharacterDelayT< SampleType >::bbd_bandwidth_hz ( ) const
inlinenoexcept

◆ bbd_stages()

template<typename SampleType>
std::size_t pulp::signal::CharacterDelayT< SampleType >::bbd_stages ( ) const
inlinenoexcept

◆ chew_state_index()

template<typename SampleType>
std::size_t pulp::signal::CharacterDelayT< SampleType >::chew_state_index ( int channel) const
inlinenoexcept

◆ latency_samples()

template<typename SampleType>
int pulp::signal::CharacterDelayT< SampleType >::latency_samples ( ) const
inlinenoexcept

Always 0.

See the header note: the physical tier's in-loop oversampler group delay is folded into the delay line, and every other stage is IIR (group delay is phase, not a bufferable constant).

◆ loop_tone_active()

template<typename SampleType>
bool pulp::signal::CharacterDelayT< SampleType >::loop_tone_active ( ) const
inlinenoexcept

True when the in-loop tone stage is doing anything at all.

◆ process()

template<typename SampleType>
void pulp::signal::CharacterDelayT< SampleType >::process ( SampleType * left,
SampleType * right,
int num_samples )
inlinenoexcept

Stereo, in place, WET ONLY.

◆ reset()

template<typename SampleType>
void pulp::signal::CharacterDelayT< SampleType >::reset ( )
inlinenoexcept

Allocation-free.

Zeroes buffers and filter/solver state, re-seeds every PRNG, and snaps smoothed values to their targets, so two renders after a reset() are bit-identical. Clear realtime state on the audio thread between blocks, or while processing is stopped. Never race this against process().

◆ right_time_is_absolute()

template<typename SampleType>
bool pulp::signal::CharacterDelayT< SampleType >::right_time_is_absolute ( ) const
inlinenoexcept

True while the right channel is following set_right_time_ms().

◆ right_time_ms()

template<typename SampleType>
double pulp::signal::CharacterDelayT< SampleType >::right_time_ms ( ) const
inlinenoexcept

The right channel's target time in ms, whichever mode is selected.

◆ set_bbd_compander_enabled()

template<typename SampleType>
void pulp::signal::CharacterDelayT< SampleType >::set_bbd_compander_enabled ( bool enabled)
inlinenoexcept

Bypass the BBD compander.

Proving the compander does anything requires comparing against the same signal path without it.

◆ set_character()

template<typename SampleType>
void pulp::signal::CharacterDelayT< SampleType >::set_character ( Character character)
inline

◆ set_character_amount()

template<typename SampleType>
void pulp::signal::CharacterDelayT< SampleType >::set_character_amount ( SampleType amount)
inline

◆ set_crossfeed()

template<typename SampleType>
void pulp::signal::CharacterDelayT< SampleType >::set_crossfeed ( SampleType crossfeed)
inline

◆ set_diffusion_amount()

template<typename SampleType>
void pulp::signal::CharacterDelayT< SampleType >::set_diffusion_amount ( SampleType amount)
inline

◆ set_duck()

template<typename SampleType>
void pulp::signal::CharacterDelayT< SampleType >::set_duck ( SampleType amount01)
inline

◆ set_feedback()

template<typename SampleType>
void pulp::signal::CharacterDelayT< SampleType >::set_feedback ( SampleType feedback)
inline

◆ set_freeze()

template<typename SampleType>
void pulp::signal::CharacterDelayT< SampleType >::set_freeze ( bool on)
inline

◆ set_loop_high_cut_hz()

template<typename SampleType>
void pulp::signal::CharacterDelayT< SampleType >::set_loop_high_cut_hz ( SampleType hz)
inline

◆ set_loop_high_cut_resonance()

template<typename SampleType>
void pulp::signal::CharacterDelayT< SampleType >::set_loop_high_cut_resonance ( SampleType q)
inline

◆ set_loop_low_cut_hz()

template<typename SampleType>
void pulp::signal::CharacterDelayT< SampleType >::set_loop_low_cut_hz ( SampleType hz)
inline

◆ set_loop_low_cut_resonance()

template<typename SampleType>
void pulp::signal::CharacterDelayT< SampleType >::set_loop_low_cut_resonance ( SampleType q)
inline

◆ set_mod()

template<typename SampleType>
void pulp::signal::CharacterDelayT< SampleType >::set_mod ( SampleType rate01,
SampleType depth01 )
inline

◆ set_reverse()

template<typename SampleType>
void pulp::signal::CharacterDelayT< SampleType >::set_reverse ( bool on)
inline

◆ set_right_time_ms()

template<typename SampleType>
void pulp::signal::CharacterDelayT< SampleType >::set_right_time_ms ( SampleType right_ms)
inline

Right-channel time in MILLISECONDS, independent of the left.

Selects absolute mode, which is what a dual-mono setup (two unrelated delay times) and a millisecond offset both need — neither can be expressed as a ratio, because a fixed ratio is a different millisecond spread at every delay time and a fixed spread is a different ratio.

Ratio mode is restored by calling set_time_offset().

◆ set_sample_rate()

template<typename SampleType>
void pulp::signal::CharacterDelayT< SampleType >::set_sample_rate ( double sample_rate)
inline

Allocates every buffer for the 2 s left-channel maximum times the largest right-channel offset, recomputes coefficients, then resets.

Must be called before process().

◆ set_tape_speed_ips()

template<typename SampleType>
void pulp::signal::CharacterDelayT< SampleType >::set_tape_speed_ips ( SampleType ips)
inline

◆ set_tape_tier()

template<typename SampleType>
void pulp::signal::CharacterDelayT< SampleType >::set_tape_tier ( TapeTier tier)
inline

◆ set_time_ms()

template<typename SampleType>
void pulp::signal::CharacterDelayT< SampleType >::set_time_ms ( SampleType left_ms)
inline

◆ set_time_offset()

template<typename SampleType>
void pulp::signal::CharacterDelayT< SampleType >::set_time_offset ( SampleType multiplier)
inline

Right-channel time as a MULTIPLE of the left.

Selects ratio mode; the right channel tracks the left, which is what a stereo-spread delay wants.

◆ tape_gap_coefficients()

template<typename SampleType>
const std::vector< double > & pulp::signal::CharacterDelayT< SampleType >::tape_gap_coefficients ( int channel) const
inlinenoexcept

◆ vintage_band_edge_hz()

template<typename SampleType>
double pulp::signal::CharacterDelayT< SampleType >::vintage_band_edge_hz ( ) const
inlinenoexcept

◆ vintage_internal_rate_hz()

template<typename SampleType>
double pulp::signal::CharacterDelayT< SampleType >::vintage_internal_rate_hz ( ) const
inlinenoexcept

The documentation for this class was generated from the following file: