bw_comp

Feedforward compressor/limiter with independent sidechain input.

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
Compressor Download
VST® is a trademark of Steinberg Media Technologies GmbH, registered in Europe and other countries.

API

Module type: DSP

bw_comp_coeffs

typedef struct bw_comp_coeffs bw_comp_coeffs;

Coefficients and related.

bw_comp_state

typedef struct bw_comp_state bw_comp_state;

Internal state and related.

bw_comp_init()

static inline void bw_comp_init(
	bw_comp_coeffs * BW_RESTRICT coeffs);

Initializes input parameter values in coeffs.

bw_comp_set_sample_rate()

static inline void bw_comp_set_sample_rate(
	bw_comp_coeffs * BW_RESTRICT coeffs,
	float                        sample_rate);

Sets the sample_rate (Hz) value in coeffs.

bw_comp_reset_coeffs()

static inline void bw_comp_reset_coeffs(
	bw_comp_coeffs * BW_RESTRICT coeffs);

Resets coefficients in coeffs to assume their target values.

bw_comp_reset_state()

static inline float bw_comp_reset_state(
	const bw_comp_coeffs * BW_RESTRICT coeffs,
	bw_comp_state * BW_RESTRICT        state,
	float                              x_0,
	float                              x_sc_0);

Resets the given state to its initial values using the given coeffs and the initial input value x_0 and sidechain input value x_sc_0.

Returns the corresponding initial output value.

bw_comp_reset_state_multi()

static inline void bw_comp_reset_state_multi(
	const bw_comp_coeffs * BW_RESTRICT              coeffs,
	bw_comp_state * BW_RESTRICT const * BW_RESTRICT state,
	const float *                                   x_0,
	const float *                                   x_sc_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 and sidechain input value in the x_sc_0 array.

The corresponding initial output values are written into the y_0 array, if not BW_NULL.

If x_sc_0 is BW_NULL the initial sidechain input values are assumed to be 0.f.

bw_comp_update_coeffs_ctrl()

static inline void bw_comp_update_coeffs_ctrl(
	bw_comp_coeffs * BW_RESTRICT coeffs);

Triggers control-rate update of coefficients in coeffs.

bw_comp_update_coeffs_audio()

static inline void bw_comp_update_coeffs_audio(
	bw_comp_coeffs * BW_RESTRICT coeffs);

Triggers audio-rate update of coefficients in coeffs.

bw_comp_process1()

static inline float bw_comp_process1(
	const bw_comp_coeffs * BW_RESTRICT coeffs,
	bw_comp_state * BW_RESTRICT        state,
	float                              x,
	float                              x_sc);

Processes one input sample x and the corresponding sidechain input sample x_sc using coeffs, while using and updating state. Returns the corresponding output sample.

bw_comp_process()

static inline void bw_comp_process(
	bw_comp_coeffs * BW_RESTRICT coeffs,
	bw_comp_state * BW_RESTRICT  state,
	const float *                x,
	const float *                x_sc,
	float *                      y,
	size_t                       n_samples);

Processes the first n_samples of the input buffer x and the first n_samples of the sidechain input buffer x_sc, and fills the first n_samples of the output buffer y, while using and updating both coeffs and state (control and audio rate).

If x_sc is BW_NULL it behaves as if a zero-filled buffer was passed instead.

bw_comp_process_multi()

static inline void bw_comp_process_multi(
	bw_comp_coeffs * BW_RESTRICT                    coeffs,
	bw_comp_state * BW_RESTRICT const * BW_RESTRICT state,
	const float * const *                           x,
	const float * const *                           x_sc,
	float * const *                                 y,
	size_t                                          n_channels,
	size_t                                          n_samples);

Processes the first n_samples of the n_channels input buffers x and the first n_samples of the n_channels sidechain input buffers x_sc, 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).

If x_sc is BW_NULL it behaves as if zero-filled buffers were passed instead.

bw_comp_set_thresh_lin()

static inline void bw_comp_set_thresh_lin(
	bw_comp_coeffs * BW_RESTRICT coeffs,
	float                        value);

Sets the threshold value (linear) in coeffs.

Valid range: [1e-20f, 1e20f].

Default value: 1.f.

bw_comp_set_thresh_dBFS()

static inline void bw_comp_set_thresh_dBFS(
	bw_comp_coeffs * BW_RESTRICT coeffs,
	float                        value);

Sets the threshold value (dBFS) in coeffs.

Valid range: [-400.f, 400.f].

Default value: 0.f.

bw_comp_set_ratio()

static inline void bw_comp_set_ratio(
	bw_comp_coeffs * BW_RESTRICT coeffs,
	float                        value);

Sets the compression ratio value in coeffs.

value is actually the slope of the gain curve above the threshold, hence 1.f means no compression and 0.f is a hard limit.

Valid range: [0.f, 1.f].

Default value: 1.f.

bw_comp_set_attack_tau()

static inline void bw_comp_set_attack_tau(
	bw_comp_coeffs * BW_RESTRICT coeffs,
	float                        value);

Sets the attack time constant value (s) in coeffs.

value must be non-negative.

Default value: 0.f.

bw_comp_set_release_tau()

static inline void bw_comp_set_release_tau(
	bw_comp_coeffs * BW_RESTRICT coeffs,
	float                        value);

Sets the release time constant value (s) in coeffs.

value must be non-negative.

Default value: 0.f.

bw_comp_set_gain_lin()

static inline void bw_comp_set_gain_lin(
	bw_comp_coeffs * BW_RESTRICT coeffs,
	float                        value);

Sets the output makeup gain value (linear ratio) in coeffs.

value must be finite.

Default value: 1.f.

bw_comp_set_gain_dB()

static inline void bw_comp_set_gain_dB(
	bw_comp_coeffs * BW_RESTRICT coeffs,
	float                        value);

Sets the output makeup gain value (dB) in coeffs.

value must be less than or equal to 770.630f.

Default value: 0.f.

bw_comp_coeffs_is_valid()

static inline char bw_comp_coeffs_is_valid(
	const bw_comp_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_comp_coeffs.

bw_comp_state_is_valid()

static inline char bw_comp_state_is_valid(
	const bw_comp_coeffs * BW_RESTRICT coeffs,
	const bw_comp_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_comp_state.

C++ wrapper

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

	void setSampleRate(
		float sampleRate);

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

# ifndef BW_CXX_NO_ARRAY
	void reset(
		float                                       x0,
		float                                       xSc0,
		std::array<float, N_CHANNELS> * BW_RESTRICT y0);
# endif

	void reset(
		const float * x0,
		const float * xSc0,
		float *       y0 = nullptr);

# ifndef BW_CXX_NO_ARRAY
	void reset(
		std::array<float, N_CHANNELS>               x0,
		std::array<float, N_CHANNELS>               xSc0,
		std::array<float, N_CHANNELS> * BW_RESTRICT y0 = nullptr);
# endif

	void process(
		const float * const * x,
		const float * const * xSc,
		float * const *       y,
		size_t                nSamples);

# ifndef BW_CXX_NO_ARRAY
	void process(
		std::array<const float *, N_CHANNELS> x,
		std::array<const float *, N_CHANNELS> xSc,
		std::array<float *, N_CHANNELS>       y,
		size_t                                nSamples);
# endif

	// >> the following 2 methods only exist because of a typo, don't use
	void setTreshLin(
		float value);

	void setTreshDBFS(
		float value);
	// <<

	void setThreshLin(
		float value);

	void setThreshDBFS(
		float value);

	void setRatio(
		float value);

	void setAttackTau(
		float value);

	void setReleaseTau(
		float value);

	void setGainLin(
		float value);

	void setGainDB(
		float value);
...
}

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_comp_process() to bw_comp_process_multi().
    • Added debugging checks in bw_comp_process_multi() to ensure that buffers used for both input and output appear at the same channel indices.
  • Version 1.1.0:
    • Relaxed bw_comp_reset_state_multi, bw_comp_process, and bw_comp_process_multi APIs to accept BW_NULL as sidechain inputs.
    • Now using BW_NULL and BW_CXX_NO_ARRAY.
    • Added setThreshLin() and setThreshDB() methods to fix a typo in method names without breaking the API.
  • Version 1.0.0:
    • Added initial input values to bw_comp_reset_state().
    • Added bw_comp_reset_state_multi() and updated C++ API in this regard.
    • Now bw_comp_reset_state() returns the initial output value.
    • Added overloaded C++ reset() functions taking arrays as arguments.
    • bw_comp_process() and bw_comp_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.
    • Fixed missing smoothing filter initialization.
    • Fixed missing forced coefficients' update in bw_comp_reset_coeffs().
    • Improved and strengthened algorithm.
    • Removed usage of reserved identifiers.
    • Clearly specified parameter validity ranges.
    • Added debugging code.
  • Version 0.6.0:
    • Removed dependency on bw_config.
  • Version 0.5.0:
    • Added bw_comp_process_multi().
    • Fixed typo in bw_comp_set_ratio() documentation.
    • Added C++ wrapper.
  • Version 0.3.0:
    • First release.