bw_slew_lim

Slew-rate limiter with separate maximum increasing and decreasing rates.

Examples

Here you can download one or more example VST3 plugins for Windows, macOS and Linux. Source code of the audio engine(s) is included in the archive(s).

DescriptionLink
Slew-rate limiter Download
VST® is a trademark of Steinberg Media Technologies GmbH, registered in Europe and other countries.

API

Module type: DSP

bw_slew_lim_coeffs

typedef struct bw_slew_lim_coeffs bw_slew_lim_coeffs;

Coefficients and related.

bw_slew_lim_state

typedef struct bw_slew_lim_state bw_slew_lim_state;

Internal state and related.

bw_slew_lim_init()

static inline void bw_slew_lim_init(
	bw_slew_lim_coeffs * BW_RESTRICT coeffs);

Initializes input parameter values in coeffs.

bw_slew_lim_set_sample_rate()

static inline void bw_slew_lim_set_sample_rate(
	bw_slew_lim_coeffs * BW_RESTRICT coeffs,
	float                            sample_rate);

Sets the sample_rate (Hz) value in coeffs.

bw_slew_lim_reset_coeffs()

static inline void bw_slew_lim_reset_coeffs(
	bw_slew_lim_coeffs * BW_RESTRICT coeffs);

Resets coefficients in coeffs to assume their target values.

bw_slew_lim_reset_state()

static inline float bw_slew_lim_reset_state(
	const bw_slew_lim_coeffs * BW_RESTRICT coeffs,
	bw_slew_lim_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.

bw_slew_lim_reset_state_multi()

static inline void bw_slew_lim_reset_state_multi(
	const bw_slew_lim_coeffs * BW_RESTRICT              coeffs,
	bw_slew_lim_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.

bw_slew_lim_update_coeffs_ctrl()

static inline void bw_slew_lim_update_coeffs_ctrl(
	bw_slew_lim_coeffs * BW_RESTRICT coeffs);

Triggers control-rate update of coefficients in coeffs.

bw_slew_lim_update_coeffs_audio()

static inline void bw_slew_lim_update_coeffs_audio(
	bw_slew_lim_coeffs * BW_RESTRICT coeffs);

Triggers audio-rate update of coefficients in coeffs.

bw_slew_lim_process1*()

static inline float bw_slew_lim_process1(
	const bw_slew_lim_coeffs * BW_RESTRICT coeffs,
	bw_slew_lim_state * BW_RESTRICT        state,
	float                                  x);

static inline float bw_slew_lim_process1_up(
	const bw_slew_lim_coeffs * BW_RESTRICT coeffs,
	bw_slew_lim_state * BW_RESTRICT        state,
	float                                  x);

static inline float bw_slew_lim_process1_down(
	const bw_slew_lim_coeffs * BW_RESTRICT coeffs,
	bw_slew_lim_state * BW_RESTRICT        state,
	float                                  x);

static inline float bw_slew_lim_process1_none(
	const bw_slew_lim_coeffs * BW_RESTRICT coeffs,
	bw_slew_lim_state * BW_RESTRICT        state,
	float                                  x);

These function process one input sample x using coeffs, while using and updating state. They return the corresponding output sample.

In particular:

  • bw_slew_lim_process1() assumes that both the maximum upgoing and downgoing variation rates are finite;
  • bw_slew_lim_process1_up() assumes that both the maximum upgoing variation rate is finite and the maximum downgoing variation rate is infinite;
  • bw_slew_lim_process1_down() assumes that both the maximum upgoing variation rate is infinite and the maximum downgoing variation rate is finite.
  • bw_slew_lim_process1_none() assumes that both the maximum upgoing and downgoing variation rates are infinite;

Whether maximum upgoing and downgoing variation rates are actually infinite is unchecked even for debugging purposes.

bw_slew_lim_process()

static inline void bw_slew_lim_process(
	bw_slew_lim_coeffs * BW_RESTRICT coeffs,
	bw_slew_lim_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).

y may be BW_NULL.

bw_slew_lim_process_multi()

static inline void bw_slew_lim_process_multi(
	bw_slew_lim_coeffs * BW_RESTRICT                    coeffs,
	bw_slew_lim_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).

y or any element of y may be BW_NULL.

bw_slew_lim_set_max_rate()

static inline void bw_slew_lim_set_max_rate(
	bw_slew_lim_coeffs * BW_RESTRICT coeffs,
	float                            value);

Sets both the maximum increasing and decreasing variation rate to the given value (1/s) in coeffs.

value represents the maximum variation per second and must be non-negative.

This is equivalent to calling both bw_slew_lim_set_max_inc_rate() and bw_slew_lim_set_max_dec_rate() with same coeffs and value.

Default value: INFINITY.

bw_slew_lim_set_max_rate_up()

static inline void bw_slew_lim_set_max_rate_up(
	bw_slew_lim_coeffs * BW_RESTRICT coeffs,
	float                            value);

Sets the maximum increasing variation rate to the given value (1/s) in coeffs.

value represents the maximum variation per second and must be non-negative.

Default value: INFINITY.

bw_slew_lim_set_max_inc_rate()

static inline void bw_slew_lim_set_max_rate_down(
	bw_slew_lim_coeffs * BW_RESTRICT coeffs,
	float                            value);

Sets the maximum decreasing variation rate to the given value (1/s) in coeffs.

value represents the maximum variation per second and must be non-negative.

Default value: INFINITY.

bw_slew_lim_get_y_z1()

static inline float bw_slew_lim_get_y_z1(
	const bw_slew_lim_state * BW_RESTRICT state);

Returns the last output sample as stored in state.

bw_slew_lim_coeffs_is_valid()

static inline char bw_slew_lim_coeffs_is_valid(
	const bw_slew_lim_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 bw_slew_lim_coeffs.

bw_slew_lim_state_is_valid()

static inline char bw_slew_lim_state_is_valid(
	const bw_slew_lim_coeffs * BW_RESTRICT coeffs,
	const bw_slew_lim_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 bw_slew_lim_state.

C++ wrapper

Brickworks::SlewLim
template<size_t N_CHANNELS>
class SlewLim {
public:
	SlewLim();

	void setSampleRate(
		float sampleRate);

	void reset(
		float               x0 = 0.f,
		float * BW_RESTRICT y0 = nullptr);

# 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 = nullptr);

# ifndef BW_CXX_NO_ARRAY
	void reset(
		std::array<float, N_CHANNELS>               x0,
		std::array<float, N_CHANNELS> * BW_RESTRICT y0 = nullptr);
# 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

	void setMaxRate(
		float value);

	void setMaxRateUp(
		float value);

	void setMaxRateDown(
		float value);

	float getYZ1(
		size_t channel);
...
}

Changelog

  • Version 1.2.0:
    • Added support for BW_INCLUDE_WITH_QUOTES, BW_NO_CXX, and BW_CXX_NO_EXTERN_C.
    • Added debugging checks from bw_slew_lim_process() to bw_slew_lim_process_multi().
    • Added debugging checks in bw_slew_lim_process_multi() to ensure that buffers used for both input and output appear at the same channel indices.
  • Version 1.1.0:
    • Now using BW_NULL and BW_CXX_NO_ARRAY.
  • Version 1.0.0:
    • Added bw_slew_lim_reset_state_multi() and updated C++ API in this regard.
    • Now bw_slew_lim_reset_state() returns the initial output value.
    • Added overloaded C++ reset() functions taking arrays as arguments.
    • Added bw_slew_lim_process1_none().
    • bw_slew_lim_process() and bw_slew_lim_process_multi() now use size_t to count samples and channels.
    • Added more const and BW_RESTRICT specifiers to input arguments and implementation.
    • Moved C++ code to C header.
    • Added overloaded C++ process() function taking C-style arrays as arguments.
    • Removed usage of reserved identifiers.
    • Fixed setting of default parameter values in bw_slew_lim_init().
    • Fixed documentation of bw_slew_lim_update_coeffs_audio().
    • Clearly specified parameter validity ranges.
    • Added debugging code.
  • Version 0.6.0:
    • Removed dependency on bw_config.
  • Version 0.5.0:
    • Added bw_slew_lim_process_multi().
    • Fixed documentation of bw_slew_lim_process().
    • Fixed unused parameter warnings.
    • Added C++ wrapper.
  • Version 0.2.0:
    • Refactored API.
  • Version 0.1.0:
    • First release.