Nonlinear digital model of the Ibanez® Tube Screamer® input/output buffer circuit with near-unity gain and variable input and output highpass component values.
Version: 1.0.0
License: proprietary license
Part of Brickworks Pro.
This algorithm is not licensed by itself, but rather in bundle with other algorithms that use it.
Module type: DSP
typedef struct bwp_pan_drive_buf_coeffs bwp_pan_drive_buf_coeffs;
Coefficients and related.
typedef struct bwp_pan_drive_buf_state bwp_pan_drive_buf_state;
Internal state and related.
static inline void bwp_pan_drive_buf_init(
bwp_pan_drive_buf_coeffs * BW_RESTRICT coeffs,
float Rin,
float Cin,
float Rout,
float Cout);
Initializes input parameter values in coeffs.
Rin and Rout indicate total resistances (Ohm) in the input and output parts of the circuit, respecitvely. Likewise, Cin and Cout indicate capacitances (F) in the input and output parts of the circuit, respectively.
Rin, Rout, Cin, and Cout must be finite and strictly positive.
static inline void bwp_pan_drive_buf_set_sample_rate(
bwp_pan_drive_buf_coeffs * BW_RESTRICT coeffs,
float sample_rate);
Sets the sample_rate (Hz) value in coeffs.
static inline void bwp_pan_drive_buf_reset_coeffs(
bwp_pan_drive_buf_coeffs * BW_RESTRICT coeffs);
Resets coefficients in coeffs to assume their target values.
static inline float bwp_pan_drive_buf_reset_state(
const bwp_pan_drive_buf_coeffs * BW_RESTRICT coeffs,
bwp_pan_drive_buf_state * BW_RESTRICT state,
float x_0);
Resets the given state to its initial values using the given coeffs and the initial input value x_0.
Returns the corresponding initial output value.
Due to internal approximations the initial state will not be perfect. If you need better results you can process a bunch of "silence" right after resetting.
static inline void bwp_pan_drive_buf_reset_state_multi(
const bwp_pan_drive_buf_coeffs * BW_RESTRICT coeffs,
bwp_pan_drive_buf_state * BW_RESTRICT const * BW_RESTRICT state,
const float * x_0,
float * y_0,
size_t n_channels);
Resets each of the n_channels states to its initial values using the given coeffs and the corresponding initial input value in the x_0 array.
The corresponding initial output values are written into the y_0 array, if not BW_NULL.
Due to internal approximations the initial states will not be perfect. If you need better results you can process a bunch of "silence" right after resetting.
static inline void bwp_pan_drive_buf_update_coeffs_ctrl(
bwp_pan_drive_buf_coeffs * BW_RESTRICT coeffs);
Triggers control-rate update of coefficients in coeffs.
static inline void bwp_pan_drive_buf_update_coeffs_audio(
bwp_pan_drive_buf_coeffs * BW_RESTRICT coeffs);
Triggers audio-rate update of coefficients in coeffs.
static inline float bwp_pan_drive_buf_process1(
const bwp_pan_drive_buf_coeffs * BW_RESTRICT coeffs,
bwp_pan_drive_buf_state * BW_RESTRICT state,
float x);
Processes one input sample x using coeffs, while using and updating state. Returns the corresponding output sample.
static inline void bwp_pan_drive_buf_process(
bwp_pan_drive_buf_coeffs * BW_RESTRICT coeffs,
bwp_pan_drive_buf_state * BW_RESTRICT state,
const float * x,
float * y,
size_t n_samples);
Processes the first n_samples of the input buffer x and fills the first n_samples of the output buffer y, while using and updating both coeffs and state (control and audio rate).
static inline void bwp_pan_drive_buf_process_multi(
bwp_pan_drive_buf_coeffs * BW_RESTRICT coeffs,
bwp_pan_drive_buf_state * BW_RESTRICT const * BW_RESTRICT state,
const float * const * x,
float * const * y,
size_t n_channels,
size_t n_samples);
Processes the first n_samples of the n_channels input buffers x and fills the first n_samples of the n_channels output buffers y, while using and updating both the common coeffs and each of the n_channels states (control and audio rate).
static inline char bwp_pan_drive_buf_coeffs_is_valid(
const bwp_pan_drive_buf_coeffs * BW_RESTRICT coeffs);
Tries to determine whether coeffs is valid and returns non-0 if it seems to be the case and 0 if it is certainly not. False positives are possible, false negatives are not.
coeffs must at least point to a readable memory block of size greater than or equal to that of bwp_pan_drive_buf_coeffs.
static inline char bwp_pan_drive_buf_state_is_valid(
const bwp_pan_drive_buf_coeffs * BW_RESTRICT coeffs,
const bwp_pan_drive_buf_state * BW_RESTRICT state);
Tries to determine whether state is valid and returns non-0 if it seems to be the case and 0 if it is certainly not. False positives are possible, false negatives are not.
If coeffs is not BW_NULL extra cross-checks might be performed (state is supposed to be associated to coeffs).
state must at least point to a readable memory block of size greater than or equal to that of bwp_pan_drive_buf_state.
template<size_t N_CHANNELS = 1>
class PanDriveBuf {
public:
PanDriveBuf(
float Rin,
float Cin,
float Rout,
float Cout);
void setSampleRate(
float sampleRate);
void reset(
float x0 = 0.f,
float * BW_RESTRICT y0 = BW_NULL);
# ifndef BW_CXX_NO_ARRAY
void reset(
float x0,
std::array<float, N_CHANNELS> * BW_RESTRICT y0);
# endif
void reset(
const float * x0,
float * y0 = BW_NULL);
# ifndef BW_CXX_NO_ARRAY
void reset(
std::array<float, N_CHANNELS> x0,
std::array<float, N_CHANNELS> * BW_RESTRICT y0 = BW_NULL);
# endif
void process(
const float * const * x,
float * const * y,
size_t nSamples);
# ifndef BW_CXX_NO_ARRAY
void process(
std::array<const float *, N_CHANNELS> x,
std::array<float *, N_CHANNELS> y,
size_t nSamples);
# endif
...
}