bw_osc_filt

Post-filter to decolorate oscillator waveshapers when antialiasing is on.

This linear time-invariant filter can be added in series of oscillator waveshapers that use PolyBLEP antialiasing (i.e., bw_osc_saw, bw_osc_pulse, bw_osc_tri) to compensate for high-frequency attenuation.

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
Monophonic subtractive synth Download
Polyphonic subtractive synth Download
Simple monophonic subtractive synth Download
VST® is a trademark of Steinberg Media Technologies GmbH, registered in Europe and other countries.

API

Module type: DSP

bw_osc_filt_state

typedef struct bw_osc_filt_state bw_osc_filt_state;

Internal state and related.

bw_osc_filt_reset()

static inline float bw_osc_filt_reset_state(
	bw_osc_filt_state * BW_RESTRICT state,
	float                           x_0);

Resets the given state to its initial values using the given initial input value x_0.

Returns the corresponding initial output value.

bw_osc_filt_reset_state_multi()

static inline void bw_osc_filt_reset_state_multi(
	bw_osc_filt_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 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_osc_filt_process1()

static inline float bw_osc_filt_process1(
	bw_osc_filt_state * BW_RESTRICT state,
	float                           x);

Processes one input sample x using and updating state. Returns the corresponding output sample.

bw_osc_filt_process()

static inline void bw_osc_filt_process(
	bw_osc_filt_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 state.

bw_osc_filt_process_multi()

static inline void bw_osc_filt_process_multi(
	bw_osc_filt_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 each of the n_channels states.

bw_osc_filt_state_is_valid()

static inline char bw_osc_filt_state_is_valid(
	const bw_osc_filt_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.

state must at least point to a readable memory block of size greater than or equal to that of bw_osc_filt_state.

C++ wrapper

Brickworks::OscFilt
template<size_t N_CHANNELS>
class OscFilt {
public:
	OscFilt();
	
	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
...
}

Changelog

  • Version 1.2.0:
    • Added support for BW_INCLUDE_WITH_QUOTES, BW_NO_CXX, and BW_CXX_NO_EXTERN_C.
    • Added debugging checks in bw_osc_filt_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 initial input value to bw_osc_filt_reset_state().
    • Added bw_osc_filt_reset_state_multi() and updated C++ API in this regard.
    • Now bw_osc_filt_reset_state() returns the initial output value.
    • Added overloaded C++ reset() functions taking arrays as arguments.
    • bw_osc_filt_process() and bw_osc_filt_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.
    • Changed implementation topology to use less memory.
    • Removed usage of reserved identifiers.
    • Added debugging code.
  • Version 0.6.0:
    • Removed dependency on bw_config.
  • Version 0.5.0:
    • Added bw_osc_filt_process_multi().
    • Added C++ wrapper.
  • Version 0.2.0:
    • Refactored API.
  • Version 0.1.0:
    • First release.