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

Univibe-style phase vibrato: four allpass stages at deliberately unequal corners, all swept together by one lamp-and-photocell control chain. More...

#include <vibrato.hpp>

Public Types

enum class  Mode : std::uint8_t { vibrato , chorus }
 The documented physical switch. More...

Public Member Functions

 UniVibeT ()
void prepare (double sample_rate)
void set_rate_hz (double hz)
double rate_hz () const
void set_depth (double depth)
double depth () const
void set_mode (Mode mode)
Mode mode () const
double control () const
 Conditioned control in [0, 1] — the photocell's state, after the lag.
double stage_corner_hz (int index) const
 Live corner of stage index in Hz.
std::size_t latency_samples () const
void reset ()
void process (SampleType input, SampleType &out_left, SampleType &out_right)

Static Public Member Functions

static double corner_scale (double control, double depth)
 The corner scale a given conditioned control produces.

Static Public Attributes

static constexpr int kStageCount = 4
static constexpr std::array< double, kStageCount > kStageBaseHz {200.0, 430.0, 900.0, 1900.0}
 Staggered base corners, roughly a geometric 2.1x spread across the guitar midrange.
static constexpr double kDefaultRateHz = 3.0
 [design parameter] default 3.0 Hz, range 0.3 .. 8 Hz.
static constexpr double kMinRateHz = 0.3
static constexpr double kMaxRateHz = 8.0
static constexpr double kDefaultDepth = 0.7
 [design parameter] default 0.7, range 0 .. 1.
static constexpr double kSweepOctaves = 1.0
 [design parameter] default 1.0 octave, range 0.5 .. 2.0.
static constexpr double kVactrolRiseMs = 0.8
 Vactrol timings for a lamp-driven photocell.
static constexpr double kVactrolFallMs = 35.0
static constexpr double kControlExponent = 1.2
 Control-to-corner-scale shaping exponent, the same c^k convention the lowpass gate uses.
static constexpr double kVibratoMix = 0.9
 Wet proportion in vibrato mode — near-total, mono.
static constexpr double kChorusBlend = 0.5
 Wet proportion on the right output in chorus mode; the left stays dry.
static constexpr double kSinusoidalGainBound = 1.0
 As PhaseVibratoT::kSinusoidalGainBound, and for the same reason.

Detailed Description

template<typename SampleType = float>
class pulp::signal::UniVibeT< SampleType >

Univibe-style phase vibrato: four allpass stages at deliberately unequal corners, all swept together by one lamp-and-photocell control chain.

Two things make this not a phaser and not PhaseVibratoT:

  • The four corners are staggered, so some part of the band is always sitting in a region of strong phase shift no matter where the sweep currently is. The stagger is documented topology; the actual four frequencies below are design parameters, because no standardised capacitor set exists across published circuit descriptions, so the model uses its own explicit calibration rather than any one clone's values.
  • The control passes through a vactrol, not straight from the LFO. The photoresistor's conductance rises in under a millisecond and decays over tens, so the sweep is late arriving and later leaving. That asymmetry is the "loping, behind-the-beat" quality; symmetric would be a phaser.

All four stages move by the SAME multiplicative scale, so the staggered ratios hold at every instant — one dimensionless shape over four base frequencies, not four independently fitted curves.

Member Enumeration Documentation

◆ Mode

template<typename SampleType = float>
enum class pulp::signal::UniVibeT::Mode : std::uint8_t
strong

The documented physical switch.

Enumerator
vibrato 
chorus 

Constructor & Destructor Documentation

◆ UniVibeT()

template<typename SampleType = float>
pulp::signal::UniVibeT< SampleType >::UniVibeT ( )
inline

Member Function Documentation

◆ control()

template<typename SampleType = float>
double pulp::signal::UniVibeT< SampleType >::control ( ) const
inline

Conditioned control in [0, 1] — the photocell's state, after the lag.

◆ corner_scale()

template<typename SampleType = float>
double pulp::signal::UniVibeT< SampleType >::corner_scale ( double control,
double depth )
inlinestatic

The corner scale a given conditioned control produces.

Exposed because it is the one formula a test has to be able to predict from the shipped constants rather than restate.

◆ depth()

template<typename SampleType = float>
double pulp::signal::UniVibeT< SampleType >::depth ( ) const
inline

◆ latency_samples()

template<typename SampleType = float>
std::size_t pulp::signal::UniVibeT< SampleType >::latency_samples ( ) const
inline

◆ mode()

template<typename SampleType = float>
Mode pulp::signal::UniVibeT< SampleType >::mode ( ) const
inline

◆ prepare()

template<typename SampleType = float>
void pulp::signal::UniVibeT< SampleType >::prepare ( double sample_rate)
inline

◆ process()

template<typename SampleType = float>
void pulp::signal::UniVibeT< SampleType >::process ( SampleType input,
SampleType & out_left,
SampleType & out_right )
inline

◆ rate_hz()

template<typename SampleType = float>
double pulp::signal::UniVibeT< SampleType >::rate_hz ( ) const
inline

◆ reset()

template<typename SampleType = float>
void pulp::signal::UniVibeT< SampleType >::reset ( )
inline

◆ set_depth()

template<typename SampleType = float>
void pulp::signal::UniVibeT< SampleType >::set_depth ( double depth)
inline

◆ set_mode()

template<typename SampleType = float>
void pulp::signal::UniVibeT< SampleType >::set_mode ( Mode mode)
inline

◆ set_rate_hz()

template<typename SampleType = float>
void pulp::signal::UniVibeT< SampleType >::set_rate_hz ( double hz)
inline

◆ stage_corner_hz()

template<typename SampleType = float>
double pulp::signal::UniVibeT< SampleType >::stage_corner_hz ( int index) const
inline

Live corner of stage index in Hz.

Member Data Documentation

◆ kChorusBlend

template<typename SampleType = float>
double pulp::signal::UniVibeT< SampleType >::kChorusBlend = 0.5
staticconstexpr

Wet proportion on the right output in chorus mode; the left stays dry.

[design parameter] default 0.5, range 0.3 .. 0.7.

◆ kControlExponent

template<typename SampleType = float>
double pulp::signal::UniVibeT< SampleType >::kControlExponent = 1.2
staticconstexpr

Control-to-corner-scale shaping exponent, the same c^k convention the lowpass gate uses.

[design parameter] default 1.2, range 0.8 .. 2.0.

◆ kDefaultDepth

template<typename SampleType = float>
double pulp::signal::UniVibeT< SampleType >::kDefaultDepth = 0.7
staticconstexpr

[design parameter] default 0.7, range 0 .. 1.

◆ kDefaultRateHz

template<typename SampleType = float>
double pulp::signal::UniVibeT< SampleType >::kDefaultRateHz = 3.0
staticconstexpr

[design parameter] default 3.0 Hz, range 0.3 .. 8 Hz.

◆ kMaxRateHz

template<typename SampleType = float>
double pulp::signal::UniVibeT< SampleType >::kMaxRateHz = 8.0
staticconstexpr

◆ kMinRateHz

template<typename SampleType = float>
double pulp::signal::UniVibeT< SampleType >::kMinRateHz = 0.3
staticconstexpr

◆ kSinusoidalGainBound

template<typename SampleType = float>
double pulp::signal::UniVibeT< SampleType >::kSinusoidalGainBound = 1.0
staticconstexpr

As PhaseVibratoT::kSinusoidalGainBound, and for the same reason.

◆ kStageBaseHz

template<typename SampleType = float>
std::array<double, kStageCount> pulp::signal::UniVibeT< SampleType >::kStageBaseHz {200.0, 430.0, 900.0, 1900.0}
staticconstexpr

Staggered base corners, roughly a geometric 2.1x spread across the guitar midrange.

Unequal is the documented fact; these values are [design parameter], defaults with ranges 100-500, 250-900, 500-1800, and 1000-3800 Hz respectively.

◆ kStageCount

template<typename SampleType = float>
int pulp::signal::UniVibeT< SampleType >::kStageCount = 4
staticconstexpr

◆ kSweepOctaves

template<typename SampleType = float>
double pulp::signal::UniVibeT< SampleType >::kSweepOctaves = 1.0
staticconstexpr

[design parameter] default 1.0 octave, range 0.5 .. 2.0.

◆ kVactrolFallMs

template<typename SampleType = float>
double pulp::signal::UniVibeT< SampleType >::kVactrolFallMs = 35.0
staticconstexpr

◆ kVactrolRiseMs

template<typename SampleType = float>
double pulp::signal::UniVibeT< SampleType >::kVactrolRiseMs = 0.8
staticconstexpr

Vactrol timings for a lamp-driven photocell.

Fast on, slow off. [design parameter] rise default 0.8 ms, range 0.3 .. 3 ms; fall default 35 ms, range 15 .. 80 ms.

◆ kVibratoMix

template<typename SampleType = float>
double pulp::signal::UniVibeT< SampleType >::kVibratoMix = 0.9
staticconstexpr

Wet proportion in vibrato mode — near-total, mono.

[design parameter] default 0.9, range 0.7 .. 1.0.


The documentation for this class was generated from the following file:
  • /home/runner/work/pulp/pulp/core/signal/include/pulp/signal/vibrato.hpp