revised process_multi buffer assumptions

This commit is contained in:
Stefano D'Angelo 2024-06-15 13:16:08 +02:00
parent 1d731eaafb
commit 10a2d1ff45
47 changed files with 612 additions and 58 deletions

View File

@ -20,7 +20,7 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_common bw_lp1 bw_math bw_one_pole }}} * requires {{{ bw_common bw_lp1 bw_math bw_one_pole }}}
* description {{{ * description {{{
* First-order allpass filter (90° shift at cutoff, approaching 180° shift * First-order allpass filter (90° shift at cutoff, approaching 180° shift
@ -28,6 +28,13 @@
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in <code>bw_ap1_process_multi()</code> to
* ensure that buffers used for both input and output appear at the
* same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -518,6 +525,9 @@ static inline void bw_ap1_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
#endif #endif
bw_ap1_update_coeffs_ctrl(coeffs); bw_ap1_update_coeffs_ctrl(coeffs);

View File

@ -20,7 +20,7 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_common bw_math bw_one_pole bw_svf }}} * requires {{{ bw_common bw_math bw_one_pole bw_svf }}}
* description {{{ * description {{{
* Second-order allpass filter (180° shift at cutoff, approaching 360° shift * Second-order allpass filter (180° shift at cutoff, approaching 360° shift
@ -28,6 +28,13 @@
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in <code>bw_ap2_process_multi()</code> to
* ensure that buffers used for both input and output appear at the
* same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -531,6 +538,9 @@ static inline void bw_ap2_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
#endif #endif
bw_ap2_update_coeffs_ctrl(coeffs); bw_ap2_update_coeffs_ctrl(coeffs);

View File

@ -20,13 +20,20 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_common bw_gain bw_math bw_one_pole }}} * requires {{{ bw_common bw_gain bw_math bw_one_pole }}}
* description {{{ * description {{{
* Stereo balance. * Stereo balance.
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in <code>bw_balance_process_multi()</code>
* to ensure that buffers used for both input and output appear at
* the same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -398,6 +405,13 @@ static inline void bw_balance_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++) for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(y_l[i] != y_r[j]); BW_ASSERT(y_l[i] != y_r[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++) {
BW_ASSERT(i == j || x_l[i] != y_l[j]);
BW_ASSERT(i == j || x_l[i] != y_r[j]);
BW_ASSERT(i == j || x_r[i] != y_l[j]);
BW_ASSERT(i == j || x_r[i] != y_r[j]);
}
#endif #endif
bw_balance_update_coeffs_ctrl(coeffs); bw_balance_update_coeffs_ctrl(coeffs);

View File

@ -28,14 +28,16 @@
* This is purely an audio effect, it doesn't actually produce an output * This is purely an audio effect, it doesn't actually produce an output
* signal with a different encoding. The algorithm is deliberately crude to * signal with a different encoding. The algorithm is deliberately crude to
* obtain the characteristic noise due to lo-fi A/D quantization. * obtain the characteristic noise due to lo-fi A/D quantization.
*
* It
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.2.0</strong>: * <li>Version <strong>1.2.0</strong>:
* <ul> * <ul>
* <li>Added gate parameter.</li> * <li>Added gate parameter.</li>
* <li>Added debugging check in
* <code>bw_balance_bd_reduce_multi()</code> to ensure that buffers
* used for both input and output appear at the same channel
* indices.</li>
* </ul> * </ul>
* </li> * </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
@ -409,6 +411,9 @@ static inline void bw_bd_reduce_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
#endif #endif
bw_bd_reduce_update_coeffs_ctrl(coeffs); bw_bd_reduce_update_coeffs_ctrl(coeffs);

View File

@ -20,13 +20,21 @@
/*! /*!
* module_type {{{ utility }}} * module_type {{{ utility }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_common }}} * requires {{{ bw_common }}}
* description {{{ * description {{{
* Common operations on buffers. * Common operations on buffers.
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in
* <code>bw_buf_{neg,add,scale,mix,mul}_multi()</code> to ensure
* that buffers used for both input and output appear at the same
* channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -362,6 +370,9 @@ static inline void bw_buf_neg_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(dest[i] != dest[j]); BW_ASSERT(dest[i] != dest[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || src[i] != dest[j]);
#endif #endif
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
@ -381,6 +392,9 @@ static inline void bw_buf_add_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(dest[i] != dest[j]); BW_ASSERT(dest[i] != dest[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || src[i] != dest[j]);
#endif #endif
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
@ -400,6 +414,9 @@ static inline void bw_buf_scale_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(dest[i] != dest[j]); BW_ASSERT(dest[i] != dest[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || src[i] != dest[j]);
#endif #endif
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
@ -419,6 +436,11 @@ static inline void bw_buf_mix_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(dest[i] != dest[j]); BW_ASSERT(dest[i] != dest[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++) {
BW_ASSERT(i == j || src1[i] != dest[j]);
BW_ASSERT(i == j || src2[i] != dest[j]);
}
#endif #endif
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
@ -438,6 +460,11 @@ static inline void bw_buf_mul_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(dest[i] != dest[j]); BW_ASSERT(dest[i] != dest[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++) {
BW_ASSERT(i == j || src1[i] != dest[j]);
BW_ASSERT(i == j || src2[i] != dest[j]);
}
#endif #endif
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)

View File

@ -20,7 +20,7 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.0.0 }}} * version {{{ 1.0.1 }}}
* requires {{{ bw_common bw_gain bw_math bw_one_pole bw_svf }}} * requires {{{ bw_common bw_gain bw_math bw_one_pole bw_svf }}}
* description {{{ * description {{{
* Cab simulator effect. * Cab simulator effect.
@ -30,6 +30,13 @@
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.0.1</strong>:
* <ul>
* <li>Added debugging check in <code>bw_cab_process_multi()</code> to
* ensure that buffers used for both input and output appear at the
* same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.0.0</strong>: * <li>Version <strong>1.0.0</strong>:
* <ul> * <ul>
* <li>First release.</li> * <li>First release.</li>
@ -528,6 +535,9 @@ static inline void bw_cab_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
#endif #endif
bw_cab_update_coeffs_ctrl(coeffs); bw_cab_update_coeffs_ctrl(coeffs);

View File

@ -20,7 +20,7 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ * requires {{{
* bw_buf bw_comb bw_common bw_delay bw_gain bw_math bw_one_pole bw_osc_sin * bw_buf bw_comb bw_common bw_delay bw_gain bw_math bw_one_pole bw_osc_sin
* bw_phase_gen * bw_phase_gen
@ -36,6 +36,13 @@
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in <code>bw_chorus_process_multi()</code>
* to ensure that buffers used for both input and output appear at
* the same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -662,6 +669,9 @@ static inline void bw_chorus_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
#endif #endif
bw_chorus_update_coeffs_ctrl(coeffs); bw_chorus_update_coeffs_ctrl(coeffs);

View File

@ -20,7 +20,7 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_common bw_math bw_one_pole }}} * requires {{{ bw_common bw_math bw_one_pole }}}
* description {{{ * description {{{
* Antialiased hard clipper with parametric bias and gain * Antialiased hard clipper with parametric bias and gain
@ -45,6 +45,13 @@
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in <code>bw_clip_process_multi()</code> to
* ensure that buffers used for both input and output appear at the
* same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -600,6 +607,9 @@ static inline void bw_clip_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
#endif #endif
if (coeffs->gain_compensation) if (coeffs->gain_compensation)

View File

@ -20,7 +20,7 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ * requires {{{
* bw_buf bw_common bw_delay bw_gain bw_math bw_one_pole * bw_buf bw_common bw_delay bw_gain bw_math bw_one_pole
* }}} * }}}
@ -37,6 +37,13 @@
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in <code>bw_comb_process_multi()</code> to
* ensure that buffers used for both input and output appear at the
* same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -718,6 +725,9 @@ static inline void bw_comb_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
#endif #endif
bw_comb_update_coeffs_ctrl(coeffs); bw_comb_update_coeffs_ctrl(coeffs);

View File

@ -20,7 +20,7 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ * requires {{{
* bw_common bw_env_follow bw_gain bw_math bw_one_pole * bw_common bw_env_follow bw_gain bw_math bw_one_pole
* }}} * }}}
@ -29,6 +29,13 @@
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in <code>bw_comp_process_multi()</code> to
* ensure that buffers used for both input and output appear at the
* same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Relaxed <code>bw_comp_reset_state_multi</code>, * <li>Relaxed <code>bw_comp_reset_state_multi</code>,
@ -658,6 +665,13 @@ static inline void bw_comp_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
if (x_sc != BW_NULL)
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x_sc[i] != y[j]);
#endif #endif
bw_comp_update_coeffs_ctrl(coeffs); bw_comp_update_coeffs_ctrl(coeffs);

View File

@ -20,7 +20,7 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_buf bw_common bw_math }}} * requires {{{ bw_buf bw_common bw_math }}}
* description {{{ * description {{{
* Interpolated delay line, not smoothed. * Interpolated delay line, not smoothed.
@ -31,6 +31,13 @@
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in <code>bw_delay_process_multi()</code>
* to ensure that buffers used for both input and output appear at
* the same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -667,6 +674,9 @@ static inline void bw_delay_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
#endif #endif
bw_delay_update_coeffs_ctrl(coeffs); bw_delay_update_coeffs_ctrl(coeffs);

View File

@ -20,7 +20,7 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ * requires {{{
* bw_clip bw_common bw_gain bw_hp1 bw_lp1 bw_math bw_mm2 bw_one_pole bw_peak * bw_clip bw_common bw_gain bw_hp1 bw_lp1 bw_math bw_mm2 bw_one_pole bw_peak
* bw_satur bw_svf * bw_satur bw_svf
@ -32,6 +32,13 @@
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in <code>bw_dist_process_multi()</code> to
* ensure that buffers used for both input and output appear at the
* same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -558,6 +565,9 @@ static inline void bw_dist_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
#endif #endif
bw_dist_update_coeffs_ctrl(coeffs); bw_dist_update_coeffs_ctrl(coeffs);

View File

@ -20,7 +20,7 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ * requires {{{
* bw_common bw_gain bw_hs1 bw_lp1 bw_math bw_mm2 bw_one_pole bw_peak * bw_common bw_gain bw_hs1 bw_lp1 bw_math bw_mm2 bw_one_pole bw_peak
* bw_satur bw_svf * bw_satur bw_svf
@ -32,6 +32,13 @@
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in <code>bw_drive_process_multi()</code>
* to ensure that buffers used for both input and output appear at
* the same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -561,6 +568,9 @@ static inline void bw_drive_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
#endif #endif
bw_drive_update_coeffs_ctrl(coeffs); bw_drive_update_coeffs_ctrl(coeffs);

View File

@ -32,6 +32,9 @@
* <li>Added <code>bw_dry_wet_get_wet()</code> and * <li>Added <code>bw_dry_wet_get_wet()</code> and
* <code>bw_dry_wet_get_wet_cur()</code>, and corresponding C++ * <code>bw_dry_wet_get_wet_cur()</code>, and corresponding C++
* API.</li> * API.</li>
* <li>Added debugging check in <code>bw_dry_wet_process_multi()</code>
* to ensure that buffers used for both input and output appear at
* the same channel indices.</li>
* </ul> * </ul>
* </li> * </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
@ -379,6 +382,11 @@ static inline void bw_dry_wet_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++) {
BW_ASSERT(i == j || x_dry[i] != y[j]);
BW_ASSERT(i == j || x_wet[i] != y[j]);
}
#endif #endif
bw_dry_wet_update_coeffs_ctrl(coeffs); bw_dry_wet_update_coeffs_ctrl(coeffs);

View File

@ -20,7 +20,7 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_common bw_math bw_one_pole }}} * requires {{{ bw_common bw_math bw_one_pole }}}
* description {{{ * description {{{
* Envelope follower made of a full-wave rectifier followed by * Envelope follower made of a full-wave rectifier followed by
@ -28,6 +28,14 @@
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in
* <code>bw_env_follow_process_multi()</code> to ensure that
* buffers used for both input and output appear at the same
* channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -521,10 +529,14 @@ static inline void bw_env_follow_process_multi(
#endif #endif
BW_ASSERT(x != BW_NULL); BW_ASSERT(x != BW_NULL);
#ifndef BW_NO_DEBUG #ifndef BW_NO_DEBUG
if (y != BW_NULL) if (y != BW_NULL) {
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] == BW_NULL || y[j] == BW_NULL || y[i] != y[j]); BW_ASSERT(y[i] == BW_NULL || y[j] == BW_NULL || y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
}
#endif #endif
bw_env_follow_update_coeffs_ctrl(coeffs); bw_env_follow_update_coeffs_ctrl(coeffs);

View File

@ -20,7 +20,7 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ * requires {{{
* bw_common bw_gain bw_hp1 bw_lp1 bw_math bw_mm2 bw_one_pole bw_peak * bw_common bw_gain bw_hp1 bw_lp1 bw_math bw_mm2 bw_one_pole bw_peak
* bw_satur bw_svf * bw_satur bw_svf
@ -32,6 +32,13 @@
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in <code>bw_fuzz_process_multi()</code> to
* ensure that buffers used for both input and output appear at the
* same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -547,6 +554,9 @@ static inline void bw_fuzz_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
#endif #endif
bw_fuzz_update_coeffs_ctrl(coeffs); bw_fuzz_update_coeffs_ctrl(coeffs);

View File

@ -20,13 +20,20 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_common bw_math bw_one_pole }}} * requires {{{ bw_common bw_math bw_one_pole }}}
* description {{{ * description {{{
* Gain. * Gain.
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in <code>bw_gain_process_multi()</code> to
* ensure that buffers used for both input and output appear at the
* same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -405,6 +412,9 @@ static inline void bw_gain_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
#endif #endif
bw_gain_update_coeffs_ctrl(coeffs); bw_gain_update_coeffs_ctrl(coeffs);

View File

@ -20,7 +20,7 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_common bw_lp1 bw_math bw_one_pole }}} * requires {{{ bw_common bw_lp1 bw_math bw_one_pole }}}
* description {{{ * description {{{
* First-order highpass filter (6 dB/oct) with gain asymptotically * First-order highpass filter (6 dB/oct) with gain asymptotically
@ -28,6 +28,13 @@
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in <code>bw_hp1_process_multi()</code> to
* ensure that buffers used for both input and output appear at the
* same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -514,6 +521,9 @@ static inline void bw_hp1_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
#endif #endif
bw_hp1_update_coeffs_ctrl(coeffs); bw_hp1_update_coeffs_ctrl(coeffs);

View File

@ -20,13 +20,20 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_common bw_gain bw_lp1 bw_math bw_mm1 bw_one_pole }}} * requires {{{ bw_common bw_gain bw_lp1 bw_math bw_mm1 bw_one_pole }}}
* description {{{ * description {{{
* First-order high shelf filter (6 dB/oct) with unitary DC gain. * First-order high shelf filter (6 dB/oct) with unitary DC gain.
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in <code>bw_hs1_process_multi()</code> to
* ensure that buffers used for both input and output appear at the
* same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -590,6 +597,9 @@ static inline void bw_hs1_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
#endif #endif
bw_hs1_update_coeffs_ctrl(coeffs); bw_hs1_update_coeffs_ctrl(coeffs);

View File

@ -20,13 +20,20 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_common bw_gain bw_math bw_mm2 bw_one_pole bw_svf }}} * requires {{{ bw_common bw_gain bw_math bw_mm2 bw_one_pole bw_svf }}}
* description {{{ * description {{{
* Second-order high shelf filter (12 dB/oct) with unitary DC gain. * Second-order high shelf filter (12 dB/oct) with unitary DC gain.
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in <code>bw_hs2_process_multi()</code> to
* ensure that buffers used for both input and output appear at the
* same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -618,6 +625,9 @@ static inline void bw_hs2_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
#endif #endif
bw_hs2_update_coeffs_ctrl(coeffs); bw_hs2_update_coeffs_ctrl(coeffs);

View File

@ -20,7 +20,7 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_common bw_math bw_one_pole }}} * requires {{{ bw_common bw_math bw_one_pole }}}
* description {{{ * description {{{
* First-order lowpass filter (6 dB/oct) with unitary DC gain. * First-order lowpass filter (6 dB/oct) with unitary DC gain.
@ -30,6 +30,13 @@
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in <code>bw_lp1_process_multi()</code> to
* ensure that buffers used for both input and output appear at the
* same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -565,6 +572,9 @@ static inline void bw_lp1_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
#endif #endif
for (size_t i = 0; i < n_samples; i++) { for (size_t i = 0; i < n_samples; i++) {

View File

@ -20,7 +20,7 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_common bw_gain bw_lp1 bw_math bw_mm1 bw_one_pole }}} * requires {{{ bw_common bw_gain bw_lp1 bw_math bw_mm1 bw_one_pole }}}
* description {{{ * description {{{
* First-order low shelf filter (6 dB/oct) with gain asymptotically * First-order low shelf filter (6 dB/oct) with gain asymptotically
@ -28,6 +28,13 @@
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in <code>bw_ls1_process_multi()</code> to
* ensure that buffers used for both input and output appear at the
* same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -588,6 +595,9 @@ static inline void bw_ls1_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
#endif #endif
bw_ls1_update_coeffs_ctrl(coeffs); bw_ls1_update_coeffs_ctrl(coeffs);

View File

@ -20,7 +20,7 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_common bw_gain bw_math bw_mm2 bw_one_pole bw_svf }}} * requires {{{ bw_common bw_gain bw_math bw_mm2 bw_one_pole bw_svf }}}
* description {{{ * description {{{
* Second-order low shelf filter (12 dB/oct) with gain asymptotically * Second-order low shelf filter (12 dB/oct) with gain asymptotically
@ -28,6 +28,13 @@
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in <code>bw_ls2_process_multi()</code> to
* ensure that buffers used for both input and output appear at the
* same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -624,6 +631,9 @@ static inline void bw_ls2_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
#endif #endif
bw_ls2_update_coeffs_ctrl(coeffs); bw_ls2_update_coeffs_ctrl(coeffs);

View File

@ -20,13 +20,20 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_common bw_gain bw_lp1 bw_math bw_one_pole }}} * requires {{{ bw_common bw_gain bw_lp1 bw_math bw_one_pole }}}
* description {{{ * description {{{
* First-order multimode filter. * First-order multimode filter.
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in <code>bw_mm1_process_multi()</code> to
* ensure that buffers used for both input and output appear at the
* same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Fixed computation of initial state in * <li>Fixed computation of initial state in
@ -557,6 +564,9 @@ static inline void bw_mm1_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
#endif #endif
bw_mm1_update_coeffs_ctrl(coeffs); bw_mm1_update_coeffs_ctrl(coeffs);

View File

@ -20,13 +20,20 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_common bw_gain bw_math bw_one_pole bw_svf }}} * requires {{{ bw_common bw_gain bw_math bw_one_pole bw_svf }}}
* description {{{ * description {{{
* Second-order multimode filter. * Second-order multimode filter.
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in <code>bw_mm2_process_multi()</code> to
* ensure that buffers used for both input and output appear at the
* same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Fixed computation of initial state in * <li>Fixed computation of initial state in
@ -618,6 +625,9 @@ static inline void bw_mm2_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
#endif #endif
bw_mm2_update_coeffs_ctrl(coeffs); bw_mm2_update_coeffs_ctrl(coeffs);

View File

@ -20,13 +20,21 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_common bw_env_follow bw_math bw_one_pole }}} * requires {{{ bw_common bw_env_follow bw_math bw_one_pole }}}
* description {{{ * description {{{
* Noise gate with independent sidechain input. * Noise gate with independent sidechain input.
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in
* <code>bw_noise_gate_process_multi()</code> to ensure that
* buffers used for both input and output appear at the same
* channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Relaxed <code>bw_noise_gate_reset_state_multi</code>, * <li>Relaxed <code>bw_noise_gate_reset_state_multi</code>,
@ -598,7 +606,8 @@ static inline void bw_noise_gate_process(
static inline void bw_noise_gate_process_multi( static inline void bw_noise_gate_process_multi(
bw_noise_gate_coeffs * BW_RESTRICT coeffs, bw_noise_gate_coeffs * BW_RESTRICT coeffs,
bw_noise_gate_state * BW_RESTRICT const * BW_RESTRICT state, bw_noise_gate_state * BW_RESTRICT const * BW_RESTRICT state,
const float * const * x, const float * const * x_sc, const float * const * x,
const float * const * x_sc,
float * const * y, float * const * y,
size_t n_channels, size_t n_channels,
size_t n_samples) { size_t n_samples) {
@ -617,6 +626,13 @@ static inline void bw_noise_gate_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
if (x_sc != BW_NULL)
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x_sc[i] != y[j]);
#endif #endif
bw_noise_gate_update_coeffs_ctrl(coeffs); bw_noise_gate_update_coeffs_ctrl(coeffs);

View File

@ -20,7 +20,7 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_common bw_math bw_one_pole bw_svf }}} * requires {{{ bw_common bw_math bw_one_pole bw_svf }}}
* description {{{ * description {{{
* Second-order notch filter with unitary gain at DC and asymptotically as * Second-order notch filter with unitary gain at DC and asymptotically as
@ -28,6 +28,13 @@
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in <code>bw_notch_process_multi()</code>
* to ensure that buffers used for both input and output appear at
* the same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -529,6 +536,9 @@ static inline void bw_notch_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
#endif #endif
bw_notch_update_coeffs_ctrl(coeffs); bw_notch_update_coeffs_ctrl(coeffs);

View File

@ -20,7 +20,7 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_common bw_math }}} * requires {{{ bw_common bw_math }}}
* description {{{ * description {{{
* One-pole (6 dB/oct) lowpass filter with unitary DC gain, separate attack * One-pole (6 dB/oct) lowpass filter with unitary DC gain, separate attack
@ -30,6 +30,14 @@
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in
* <code>bw_one_pole_process_multi()</code> to ensure that buffers
* used for both input and output appear at the same channel
* indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -901,10 +909,14 @@ static inline void bw_one_pole_process_multi(
#endif #endif
BW_ASSERT(x != BW_NULL); BW_ASSERT(x != BW_NULL);
#ifndef BW_NO_DEBUG #ifndef BW_NO_DEBUG
if (y != BW_NULL) if (y != BW_NULL) {
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] == BW_NULL || y[j] == BW_NULL || y[i] != y[j]); BW_ASSERT(y[i] == BW_NULL || y[j] == BW_NULL || y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
}
#endif #endif
bw_one_pole_update_coeffs_ctrl(coeffs); bw_one_pole_update_coeffs_ctrl(coeffs);

View File

@ -20,7 +20,7 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_common }}} * requires {{{ bw_common }}}
* description {{{ * description {{{
* Post-filter to decolorate oscillator waveshapers when antialiasing is on. * Post-filter to decolorate oscillator waveshapers when antialiasing is on.
@ -33,6 +33,14 @@
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in
* <code>bw_osc_filt_process_multi()</code> to ensure that buffers
* used for both input and output appear at the same channel
* indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -290,6 +298,9 @@ static inline void bw_osc_filt_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
#endif #endif
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)

View File

@ -20,7 +20,7 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_common bw_math bw_one_pole }}} * requires {{{ bw_common bw_math bw_one_pole }}}
* description {{{ * description {{{
* Pulse oscillator waveshaper with variable pulse width (actually, duty * Pulse oscillator waveshaper with variable pulse width (actually, duty
@ -37,6 +37,15 @@
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging checks in
* <code>bw_osc_pulse_process_multi()</code> to ensure that
* <code>x_inc</code> is not <code>BW_NULL</code> when antialiasing
* is on and that buffers used for both input and output appear at
* the same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -467,11 +476,19 @@ static inline void bw_osc_pulse_process_multi(
BW_ASSERT_DEEP(bw_osc_pulse_coeffs_is_valid(coeffs)); BW_ASSERT_DEEP(bw_osc_pulse_coeffs_is_valid(coeffs));
BW_ASSERT_DEEP(coeffs->state >= bw_osc_pulse_coeffs_state_reset_coeffs); BW_ASSERT_DEEP(coeffs->state >= bw_osc_pulse_coeffs_state_reset_coeffs);
BW_ASSERT(x != BW_NULL); BW_ASSERT(x != BW_NULL);
BW_ASSERT(coeffs->antialiasing ? x_inc != BW_NULL : 1);
BW_ASSERT(y != BW_NULL); BW_ASSERT(y != BW_NULL);
#ifndef BW_NO_DEBUG #ifndef BW_NO_DEBUG
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
if (coeffs->antialiasing)
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x_inc[i] != y[j]);
#endif #endif
if (coeffs->antialiasing) if (coeffs->antialiasing)

View File

@ -20,7 +20,7 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_common bw_math }}} * requires {{{ bw_common bw_math }}}
* description {{{ * description {{{
* Sawtooth oscillator waveshaper with PolyBLEP antialiasing. * Sawtooth oscillator waveshaper with PolyBLEP antialiasing.
@ -36,6 +36,15 @@
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging checks in
* <code>bw_osc_saw_process_multi()</code> to ensure that
* <code>x_inc</code> is not <code>BW_NULL</code> when antialiasing
* is on and that buffers used for both input and output appear at
* the same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -434,11 +443,19 @@ static inline void bw_osc_saw_process_multi(
BW_ASSERT_DEEP(bw_osc_saw_coeffs_is_valid(coeffs)); BW_ASSERT_DEEP(bw_osc_saw_coeffs_is_valid(coeffs));
BW_ASSERT_DEEP(coeffs->state >= bw_osc_saw_coeffs_state_reset_coeffs); BW_ASSERT_DEEP(coeffs->state >= bw_osc_saw_coeffs_state_reset_coeffs);
BW_ASSERT(x != BW_NULL); BW_ASSERT(x != BW_NULL);
BW_ASSERT(coeffs->antialiasing ? x_inc != BW_NULL : 1);
BW_ASSERT(y != BW_NULL); BW_ASSERT(y != BW_NULL);
#ifndef BW_NO_DEBUG #ifndef BW_NO_DEBUG
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
if (coeffs->antialiasing)
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x_inc[i] != y[j]);
#endif #endif
if (x_inc != BW_NULL) if (x_inc != BW_NULL)

View File

@ -20,7 +20,7 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_common bw_math }}} * requires {{{ bw_common bw_math }}}
* description {{{ * description {{{
* Sinusoidal oscillator waveshaper. * Sinusoidal oscillator waveshaper.
@ -30,6 +30,13 @@
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in <code>bw_osc_sin_process_multi()</code>
* to ensure that buffers used for both input and output appear at
* the same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -176,6 +183,9 @@ static inline void bw_osc_sin_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
#endif #endif
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)

View File

@ -20,7 +20,7 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_common bw_math bw_one_pole }}} * requires {{{ bw_common bw_math bw_one_pole }}}
* description {{{ * description {{{
* Triangle oscillator waveshaper with variable slope (increasing time over * Triangle oscillator waveshaper with variable slope (increasing time over
@ -37,6 +37,15 @@
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging checks in
* <code>bw_osc_tri_process_multi()</code> to ensure that
* <code>x_inc</code> is not <code>BW_NULL</code> when antialiasing
* is on and that buffers used for both input and output appear at
* the same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -474,11 +483,19 @@ static inline void bw_osc_tri_process_multi(
BW_ASSERT_DEEP(bw_osc_tri_coeffs_is_valid(coeffs)); BW_ASSERT_DEEP(bw_osc_tri_coeffs_is_valid(coeffs));
BW_ASSERT_DEEP(coeffs->state >= bw_osc_tri_coeffs_state_reset_coeffs); BW_ASSERT_DEEP(coeffs->state >= bw_osc_tri_coeffs_state_reset_coeffs);
BW_ASSERT(x != BW_NULL); BW_ASSERT(x != BW_NULL);
BW_ASSERT(coeffs->antialiasing ? x_inc != BW_NULL : 1);
BW_ASSERT(y != BW_NULL); BW_ASSERT(y != BW_NULL);
#ifndef BW_NO_DEBUG #ifndef BW_NO_DEBUG
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
if (coeffs->antialiasing)
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x_inc[i] != y[j]);
#endif #endif
if (coeffs->antialiasing) if (coeffs->antialiasing)

View File

@ -20,13 +20,20 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_common bw_gain bw_math bw_one_pole }}} * requires {{{ bw_common bw_gain bw_math bw_one_pole }}}
* description {{{ * description {{{
* Stereo panner with -3 dB center pan law. * Stereo panner with -3 dB center pan law.
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in <code>bw_pan_process_multi()</code> to
* ensure that buffers used for both input and output appear at the
* same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -390,6 +397,11 @@ static inline void bw_pan_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++) for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(y_l[i] != y_r[j]); BW_ASSERT(y_l[i] != y_r[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++) {
BW_ASSERT(i == j || x[i] != y_l[j]);
BW_ASSERT(i == j || x[i] != y_r[j]);
}
#endif #endif
bw_pan_update_coeffs_ctrl(coeffs); bw_pan_update_coeffs_ctrl(coeffs);

View File

@ -20,7 +20,7 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_common bw_gain bw_math bw_mm2 bw_one_pole bw_svf }}} * requires {{{ bw_common bw_gain bw_math bw_mm2 bw_one_pole bw_svf }}}
* description {{{ * description {{{
* Second-order peak filter with unitary gain at DC and asymptotically * Second-order peak filter with unitary gain at DC and asymptotically
@ -35,6 +35,13 @@
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in <code>bw_peak_process_multi()</code> to
* ensure that buffers used for both input and output appear at the
* same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -678,6 +685,9 @@ static inline void bw_peak_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
#endif #endif
bw_peak_update_coeffs_ctrl(coeffs); bw_peak_update_coeffs_ctrl(coeffs);

View File

@ -20,7 +20,7 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_common bw_math bw_one_pole }}} * requires {{{ bw_common bw_math bw_one_pole }}}
* description {{{ * description {{{
* Phase generator with portamento and exponential frequency modulation. * Phase generator with portamento and exponential frequency modulation.
@ -29,6 +29,17 @@
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in
* <code>bw_phase_gen_process_multi()</code> to ensure that buffers
* used for both input and output appear at the same channel
* indices.</li>
* <li>Fixed bug in <code>bw_phase_gen_process_multi()</code> by which
* debugging code could report false negatives when
* <code>BW_NULL</code> buffers are used.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Fixed rounding bug when frequency is tiny and negative.</li> * <li>Fixed rounding bug when frequency is tiny and negative.</li>
@ -682,15 +693,25 @@ static inline void bw_phase_gen_process_multi(
if (y != BW_NULL) if (y != BW_NULL)
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] == BW_NULL || y[j] == BW_NULL || y[i] != y[j]);
if (y_inc != BW_NULL) if (y_inc != BW_NULL)
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y_inc[i] != y_inc[j]); BW_ASSERT(y_inc[i] == BW_NULL || y_inc[j] == BW_NULL || y_inc[i] != y_inc[j]);
if (y != BW_NULL && y_inc != BW_NULL) if (y != BW_NULL && y_inc != BW_NULL)
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++) for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(y[i] != y_inc[j]); BW_ASSERT(y[i] == BW_NULL || y_inc[j] == BW_NULL || y[i] != y_inc[j]);
if (x_mod != BW_NULL) {
if (y != BW_NULL)
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x_mod[i] == BW_NULL || y[i] == BW_NULL || x_mod[i] != y[j]);
if (y_inc != BW_NULL)
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x_mod[i] == BW_NULL || y_inc[i] == BW_NULL || x_mod[i] != y_inc[j]);
}
#endif #endif
bw_phase_gen_update_coeffs_ctrl(coeffs); bw_phase_gen_update_coeffs_ctrl(coeffs);

View File

@ -20,7 +20,7 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ * requires {{{
* bw_ap1 bw_common bw_lp1 bw_math bw_one_pole bw_osc_sin bw_phase_gen * bw_ap1 bw_common bw_lp1 bw_math bw_one_pole bw_osc_sin bw_phase_gen
* }}} * }}}
@ -30,6 +30,13 @@
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in <code>bw_phaser_process_multi()</code>
* to ensure that buffers used for both input and output appear at
* the same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -548,6 +555,9 @@ static inline void bw_phaser_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(state[i] != state[j]); BW_ASSERT(state[i] != state[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
#endif #endif
BW_ASSERT(x != BW_NULL); BW_ASSERT(x != BW_NULL);
BW_ASSERT(y != BW_NULL); BW_ASSERT(y != BW_NULL);

View File

@ -20,7 +20,7 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_common }}} * requires {{{ bw_common }}}
* description {{{ * description {{{
* Pinking filter. * Pinking filter.
@ -40,6 +40,14 @@
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in
* <code>bw_pink_filt_process_multi()</code> to ensure that buffers
* used for both input and output appear at the same channel
* indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -576,6 +584,9 @@ static inline void bw_pink_filt_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
#endif #endif
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)

View File

@ -20,7 +20,7 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_common bw_env_follow bw_math bw_one_pole }}} * requires {{{ bw_common bw_env_follow bw_math bw_one_pole }}}
* description {{{ * description {{{
* Digital peak programme meter with adjustable integration time constant. * Digital peak programme meter with adjustable integration time constant.
@ -30,6 +30,13 @@
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in <code>bw_ppm_process_multi()</code> to
* ensure that buffers used for both input and output appear at the
* same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -509,10 +516,14 @@ static inline void bw_ppm_process_multi(
#endif #endif
BW_ASSERT(x != BW_NULL); BW_ASSERT(x != BW_NULL);
#ifndef BW_NO_DEBUG #ifndef BW_NO_DEBUG
if (y != BW_NULL) if (y != BW_NULL) {
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] == BW_NULL || y[j] == BW_NULL || y[i] != y[j]); BW_ASSERT(y[i] == BW_NULL || y[j] == BW_NULL || y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
}
#endif #endif
bw_ppm_update_coeffs_ctrl(coeffs); bw_ppm_update_coeffs_ctrl(coeffs);

View File

@ -20,7 +20,7 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ * requires {{{
* bw_buf bw_common bw_delay bw_dry_wet bw_gain bw_lp1 bw_math bw_one_pole * bw_buf bw_common bw_delay bw_dry_wet bw_gain bw_lp1 bw_math bw_one_pole
* bw_osc_sin bw_phase_gen * bw_osc_sin bw_phase_gen
@ -35,6 +35,13 @@
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in <code>bw_reverb_process_multi()</code>
* to ensure that buffers used for both input and output appear at
* the same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Fixed smoothing of decay parameter in * <li>Fixed smoothing of decay parameter in
@ -1004,6 +1011,13 @@ static inline void bw_reverb_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++) for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(y_l[i] != y_r[j]); BW_ASSERT(y_l[i] != y_r[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++) {
BW_ASSERT(i == j || x_l[i] != y_l[j]);
BW_ASSERT(i == j || x_l[i] != y_r[j]);
BW_ASSERT(i == j || x_r[i] != y_l[j]);
BW_ASSERT(i == j || x_r[i] != y_r[j]);
}
#endif #endif
bw_reverb_update_coeffs_ctrl(coeffs); bw_reverb_update_coeffs_ctrl(coeffs);

View File

@ -20,13 +20,21 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_common bw_math bw_one_pole }}} * requires {{{ bw_common bw_math bw_one_pole }}}
* description {{{ * description {{{
* Ring modulator with variable modulation amount. * Ring modulator with variable modulation amount.
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in
* <code>bw_ring_mod_process_multi()</code> to ensure that buffers
* used for both input and output appear at the same channel
* indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -362,6 +370,11 @@ static inline void bw_ring_mod_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++) {
BW_ASSERT(i == j || x_mod[i] != y[j]);
BW_ASSERT(i == j || x_car[i] != y[j]);
}
#endif #endif
for (size_t i = 0; i < n_samples; i++) { for (size_t i = 0; i < n_samples; i++) {

View File

@ -20,7 +20,7 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_common bw_math bw_one_pole }}} * requires {{{ bw_common bw_math bw_one_pole }}}
* description {{{ * description {{{
* Antialiased tanh-based saturation with parametric bias and gain * Antialiased tanh-based saturation with parametric bias and gain
@ -45,6 +45,13 @@
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in <code>bw_satur_process_multi()</code>
* to ensure that buffers used for both input and output appear at
* the same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Fixed gain compensation in <code>bw_satur_process_multi().</li> * <li>Fixed gain compensation in <code>bw_satur_process_multi().</li>
@ -621,6 +628,9 @@ static inline void bw_satur_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
#endif #endif
bw_satur_update_coeffs_ctrl(coeffs); bw_satur_update_coeffs_ctrl(coeffs);

View File

@ -20,13 +20,21 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_common bw_math }}} * requires {{{ bw_common bw_math }}}
* description {{{ * description {{{
* Slew-rate limiter with separate maximum increasing and decreasing rates. * Slew-rate limiter with separate maximum increasing and decreasing rates.
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in
* <code>bw_slew_lim_process_multi()</code> to ensure that buffers
* used for both input and output appear at the same channel
* indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -677,10 +685,14 @@ static inline void bw_slew_lim_process_multi(
#endif #endif
BW_ASSERT(x != BW_NULL); BW_ASSERT(x != BW_NULL);
#ifndef BW_NO_DEBUG #ifndef BW_NO_DEBUG
if (y != BW_NULL) if (y != BW_NULL) {
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] == BW_NULL || y[j] == BW_NULL || y[i] != y[j]); BW_ASSERT(y[i] == BW_NULL || y[j] == BW_NULL || y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
}
#endif #endif
bw_slew_lim_update_coeffs_ctrl(coeffs); bw_slew_lim_update_coeffs_ctrl(coeffs);

View File

@ -20,7 +20,7 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_common bw_math }}} * requires {{{ bw_common bw_math }}}
* description {{{ * description {{{
* Sample rate reducer. * Sample rate reducer.
@ -31,6 +31,14 @@
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in
* <code>bw_sr_reduce_process_multi()</code> to ensure that buffers
* used for both input and output appear at the same channel
* indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -494,6 +502,9 @@ static inline void bw_sr_reduce_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
#endif #endif
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)

View File

@ -20,7 +20,7 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_common bw_math bw_one_pole }}} * requires {{{ bw_common bw_math bw_one_pole }}}
* description {{{ * description {{{
* State variable filter (2nd order, 12 dB/oct) model with separated lowpass, * State variable filter (2nd order, 12 dB/oct) model with separated lowpass,
@ -28,6 +28,13 @@
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in <code>bw_svf_process_multi()</code> to
* ensure that buffers used for both input and output appear at the
* same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -773,18 +780,30 @@ static inline void bw_svf_process_multi(
BW_ASSERT(y_lp == BW_NULL || y_hp == BW_NULL || y_lp != y_hp); BW_ASSERT(y_lp == BW_NULL || y_hp == BW_NULL || y_lp != y_hp);
BW_ASSERT(y_bp == BW_NULL || y_hp == BW_NULL || y_bp != y_hp); BW_ASSERT(y_bp == BW_NULL || y_hp == BW_NULL || y_bp != y_hp);
#ifndef BW_NO_DEBUG #ifndef BW_NO_DEBUG
if (y_lp != BW_NULL) if (y_lp != BW_NULL) {
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y_lp[i] == BW_NULL || y_lp[j] == BW_NULL || y_lp[i] != y_lp[j]); BW_ASSERT(y_lp[i] == BW_NULL || y_lp[j] == BW_NULL || y_lp[i] != y_lp[j]);
if (y_bp != BW_NULL) for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y_lp[j]);
}
if (y_bp != BW_NULL) {
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y_bp[i] == BW_NULL || y_bp[j] == BW_NULL || y_bp[i] != y_bp[j]); BW_ASSERT(y_bp[i] == BW_NULL || y_bp[j] == BW_NULL || y_bp[i] != y_bp[j]);
if (y_hp != BW_NULL) for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y_bp[j]);
}
if (y_hp != BW_NULL) {
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y_hp[i] == BW_NULL || y_hp[j] == BW_NULL || y_hp[i] != y_hp[j]); BW_ASSERT(y_hp[i] == BW_NULL || y_hp[j] == BW_NULL || y_hp[i] != y_hp[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y_hp[j]);
}
if (y_lp != BW_NULL && y_bp != BW_NULL) if (y_lp != BW_NULL && y_bp != BW_NULL)
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++) for (size_t j = 0; j < n_channels; j++)

View File

@ -20,7 +20,7 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ * requires {{{
* bw_common bw_math bw_one_pole bw_osc_sin bw_phase_gen bw_ring_mod * bw_common bw_math bw_one_pole bw_osc_sin bw_phase_gen bw_ring_mod
* }}} * }}}
@ -29,6 +29,13 @@
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in <code>bw_trem_process_multi()</code> to
* ensure that buffers used for both input and output appear at the
* same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -511,6 +518,9 @@ static inline void bw_trem_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
#endif #endif
bw_trem_update_coeffs_ctrl(coeffs); bw_trem_update_coeffs_ctrl(coeffs);

View File

@ -20,7 +20,7 @@
/*! /*!
* module_type {{{ dsp }}} * module_type {{{ dsp }}}
* version {{{ 1.1.0 }}} * version {{{ 1.1.1 }}}
* requires {{{ bw_common bw_math bw_one_pole bw_svf }}} * requires {{{ bw_common bw_math bw_one_pole bw_svf }}}
* description {{{ * description {{{
* Wah effect. * Wah effect.
@ -29,6 +29,13 @@
* }}} * }}}
* changelog {{{ * changelog {{{
* <ul> * <ul>
* <li>Version <strong>1.1.1</strong>:
* <ul>
* <li>Added debugging check in <code>bw_wah_process_multi()</code> to
* ensure that buffers used for both input and output appear at the
* same channel indices.</li>
* </ul>
* </li>
* <li>Version <strong>1.1.0</strong>: * <li>Version <strong>1.1.0</strong>:
* <ul> * <ul>
* <li>Now using <code>BW_NULL</code> and * <li>Now using <code>BW_NULL</code> and
@ -501,6 +508,9 @@ static inline void bw_wah_process_multi(
for (size_t i = 0; i < n_channels; i++) for (size_t i = 0; i < n_channels; i++)
for (size_t j = i + 1; j < n_channels; j++) for (size_t j = i + 1; j < n_channels; j++)
BW_ASSERT(y[i] != y[j]); BW_ASSERT(y[i] != y[j]);
for (size_t i = 0; i < n_channels; i++)
for (size_t j = 0; j < n_channels; j++)
BW_ASSERT(i == j || x[i] != y[j]);
#endif #endif
bw_wah_update_coeffs_ctrl(coeffs); bw_wah_update_coeffs_ctrl(coeffs);