bw_pan

Stereo panner with -3 dB center pan law.

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

API

Module type: DSP

bw_pan_coeffs

typedef struct bw_pan_coeffs bw_pan_coeffs;

Coefficients and related.

bw_pan_init()

static inline void bw_pan_init(
	bw_pan_coeffs * BW_RESTRICT coeffs);

Initializes input parameter values in coeffs.

bw_pan_set_sample_rate()

static inline void bw_pan_set_sample_rate(
	bw_pan_coeffs * BW_RESTRICT coeffs,
	float                       sample_rate);

Sets the sample_rate (Hz) value in coeffs.

bw_pan_reset_coeffs()

static inline void bw_pan_reset_coeffs(
	bw_pan_coeffs * BW_RESTRICT coeffs);

Resets coefficients in coeffs to assume their target values.

bw_pan_update_coeffs_ctrl()

static inline void bw_pan_update_coeffs_ctrl(
	bw_pan_coeffs * BW_RESTRICT coeffs);

Triggers control-rate update of coefficients in coeffs.

bw_pan_update_coeffs_audio()

static inline void bw_pan_update_coeffs_audio(
	bw_pan_coeffs * BW_RESTRICT coeffs);

Triggers audio-rate update of coefficients in coeffs.

bw_pan_process1()

static inline void bw_pan_process1(
	const bw_pan_coeffs * BW_RESTRICT coeffs,
	float                             x,
	float * BW_RESTRICT               y_l,
	float * BW_RESTRICT               y_r);

Processes one input sample x using coeffs, while using and updating state. The left and right output samples are put into y_l (left) and y_r (right) respectively.

bw_pan_process()

static inline void bw_pan_process(
	bw_pan_coeffs * BW_RESTRICT coeffs,
	const float *               x,
	float *                     y_l,
	float *                     y_r,
	size_t                      n_samples);

Processes the first n_samples of the input buffer x and fills the first n_samples of the output buffers y_l (left) and y_r (right), while using and updating coeffs (control and audio rate).

bw_pan_process_multi()

static inline void bw_pan_process_multi(
	bw_pan_coeffs * BW_RESTRICT coeffs,
	const float * const *       x,
	float * const *             y_l,
	float * const *             y_r,
	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_l (left) and y_r (right), while using and updating the common coeffs (control and audio rate).

bw_pan_set_pan()

static inline void bw_pan_set_pan(
	bw_pan_coeffs * BW_RESTRICT coeffs,
	float                       value);

Sets the panning value, where -1.f corresponds to hard left pan, 0.f to center pan, and 1.f to hard right pan.

Valid range: [-1.f (hard left pan), 1.f (hard right pan)].

Default value: 0.f.

bw_pan_coeffs_is_valid()

static inline char bw_pan_coeffs_is_valid(
	const bw_pan_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_pan_coeffs.

C++ wrapper

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

	void setSampleRate(
		float sampleRate);

	void reset();

	void process(
		const float * const * x,
		float * const *       yL,
		float * const *       yR,
		size_t                nSamples);

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

	void setPan(
		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_pan_process() to bw_pan_process_multi().
    • Added debugging checks in bw_pan_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:
    • Now using parabolic curves instead of trigonometric ones.
    • bw_pan_process() and bw_pan_process_multi() now use size_t to count samples and channels.
    • Added more const specifiers to input arguments.
    • Moved C++ code to C header.
    • Added overloaded C++ process() function taking C-style arrays as arguments.
    • 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_pan_process_multi().
    • bw_pan_process() does not accept NULL buffers anymore.
    • Added C++ wrapper.
  • Version 0.3.0:
    • First release.