bw_bd_reduce

Bit depth reducer with input gate.

This is purely an audio effect, it doesn't actually produce an output signal with a different encoding. The algorithm is deliberately crude to obtain the characteristic noise due to lo-fi A/D quantization.

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

API

Module type: DSP

bw_bd_reduce_coeffs

typedef struct bw_bd_reduce_coeffs bw_bd_reduce_coeffs;

Coefficients and related.

bw_bd_reduce_init()

static inline void bw_bd_reduce_init(
	bw_bd_reduce_coeffs * BW_RESTRICT coeffs);

Initializes input parameter values in coeffs.

bw_bw_reduce_set_sample_rate()

static inline void bw_bd_reduce_set_sample_rate(
	bw_bd_reduce_coeffs * BW_RESTRICT coeffs,
	float                             sample_rate);

Sets the sample_rate (Hz) value in coeffs.

bw_bd_reduce_reset_coeffs()

static inline void bw_bd_reduce_reset_coeffs(
	bw_bd_reduce_coeffs * BW_RESTRICT coeffs);

Resets coefficients in coeffs to assume their target values.

bw_bd_reduce_update_coeffs_ctrl()

static inline void bw_bd_reduce_update_coeffs_ctrl(
	bw_bd_reduce_coeffs * BW_RESTRICT coeffs);

Triggers control-rate update of coefficients in coeffs.

bw_bd_reduce_update_coeffs_audio()

static inline void bw_bd_reduce_update_coeffs_audio(
	bw_bd_reduce_coeffs * BW_RESTRICT coeffs);

Triggers audio-rate update of coefficients in coeffs.

bw_bd_reduce_process1()

static inline float bw_bd_reduce_process1(
	const bw_bd_reduce_coeffs * BW_RESTRICT coeffs,
	float                                   x);

Processes one input sample x using coeffs. Returns the corresponding output sample.

bw_bd_reduce_process()

static inline void bw_bd_reduce_process(
	bw_bd_reduce_coeffs * BW_RESTRICT coeffs,
	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 coeffs (control and audio rate).

bw_bd_reduce_process_multi()

static inline void bw_bd_reduce_process_multi(
	bw_bd_reduce_coeffs * BW_RESTRICT coeffs,
	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 the common coeffs (control and audio rate).

bw_bd_reduce_set_bit_depth()

static inline void bw_bd_reduce_set_bit_depth(
	bw_bd_reduce_coeffs * BW_RESTRICT coeffs,
	char                              value);

Sets the output bit depth value in coeffs.

Valid range: [1, 64].

Default value: 16.

bw_bd_reduce_set_silence_dc()

static inline void bw_bd_reduce_set_silence_dc(
	bw_bd_reduce_coeffs * BW_RESTRICT coeffs,
	char                              value);

Sets whether the output value corresponding to silence has null dc (value 0) or not (non-0) in coeffs.

Default value: non-0 (non-null dc).

bw_bd_reduce_set_gate_lin()

static inline void bw_bd_reduce_set_gate_lin(
	bw_bd_reduce_coeffs * BW_RESTRICT coeffs,
	float                             value);

Sets the input gate threshold value (linear) in coeffs.

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

Default value: 0.f.

bw_bd_reduce_set_gate_dBFS()

static inline void bw_bd_reduce_set_gate_dBFS(
	bw_bd_reduce_coeffs * BW_RESTRICT coeffs,
	float                             value);

Sets the input gate threshold value (dBFS) in coeffs.

Valid range: [-INFINITY, 0.f].

Default value: -INFINITY.

bw_bd_reduce_coeffs_is_valid()

static inline char bw_bd_reduce_coeffs_is_valid(
	const bw_bd_reduce_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_bd_reduce_coeffs.

C++ wrapper

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

	void setSampleRate(
		float sampleRate);

	void reset();

	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 setBitDepth(
		char value);

	void setSilenceDc(
		char value);

	void setGateLin(
		float value);

	void setGateDBFS(
		float value);
...
}

Changelog

  • Version 1.2.0:
    • Added gate parameter.
    • Added support for BW_INCLUDE_WITH_QUOTES, BW_NO_CXX, and BW_CXX_NO_EXTERN_C.
    • Added debugging checks from bw_bd_reduce_process() to bw_bd_reduce_process_multi().
    • Added debugging checks in bw_bd_reduce_process_multi() to ensure that buffers used for both input and output appear at the same channel indices.
  • Version 1.1.0:
    • Added silence_dc parameter.
    • Now using BW_NULL and BW_CXX_NO_ARRAY.
  • Version 1.0.0:
    • Added bw_bd_reduce_set_sample_rate().
    • bw_bd_reduce_process() and bw_bd_reduce_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_bd_reduce_process_multi().
    • Added C++ wrapper.
  • Version 0.4.0:
    • Fixed unused parameter warnings.
  • Version 0.3.0:
    • First release.