|
8 | 8 | // Fixed point ideas from - Paul Stoffregen in the Teensy audio library https://github.com/PaulStoffregen/Audio/blob/master/effect_freeverb.cpp
|
9 | 9 | //
|
10 | 10 | #include "shared-bindings/audiofreeverb/Freeverb.h"
|
| 11 | +#include "shared-module/synthio/__init__.h" |
11 | 12 |
|
12 | 13 | #include <stdint.h>
|
13 | 14 | #include "py/runtime.h"
|
@@ -217,27 +218,6 @@ void common_hal_audiofreeverb_freeverb_stop(audiofreeverb_freeverb_obj_t *self)
|
217 | 218 | return;
|
218 | 219 | }
|
219 | 220 |
|
220 |
| -// cleaner sat16 by http://www.moseleyinstruments.com/ |
221 |
| -static int16_t sat16(int32_t n, int rshift) { |
222 |
| - // we should always round towards 0 |
223 |
| - // to avoid recirculating round-off noise |
224 |
| - // |
225 |
| - // a 2s complement positive number is always |
226 |
| - // rounded down, so we only need to take |
227 |
| - // care of negative numbers |
228 |
| - if (n < 0) { |
229 |
| - n = n + (~(0xFFFFFFFFUL << rshift)); |
230 |
| - } |
231 |
| - n = n >> rshift; |
232 |
| - if (n > 32767) { |
233 |
| - return 32767; |
234 |
| - } |
235 |
| - if (n < -32768) { |
236 |
| - return -32768; |
237 |
| - } |
238 |
| - return n; |
239 |
| -} |
240 |
| - |
241 | 221 | audioio_get_buffer_result_t audiofreeverb_freeverb_get_buffer(audiofreeverb_freeverb_obj_t *self, bool single_channel_output, uint8_t channel,
|
242 | 222 | uint8_t **buffer, uint32_t *buffer_length) {
|
243 | 223 |
|
@@ -301,35 +281,35 @@ audioio_get_buffer_result_t audiofreeverb_freeverb_get_buffer(audiofreeverb_free
|
301 | 281 | int16_t input, bufout, output;
|
302 | 282 | uint32_t channel_comb_offset = 0, channel_allpass_offset = 0;
|
303 | 283 |
|
304 |
| - input = sat16(sample_word * 8738, 17); // Initial input scaled down so we can add reverb |
| 284 | + input = synthio_sat16(sample_word * 8738, 17); // Initial input scaled down so we can add reverb |
305 | 285 | sum = 0;
|
306 | 286 |
|
307 | 287 | // Calculate each of the 8 comb buffers
|
308 | 288 | for (uint32_t j = 0 + channel_comb_offset; j < 8 + channel_comb_offset; j++) {
|
309 | 289 | bufout = self->combbuffers[j][self->combbufferindex[j]];
|
310 | 290 | sum += bufout;
|
311 |
| - self->combfitlers[j] = sat16(bufout * damp2 + self->combfitlers[j] * damp1, 15); |
312 |
| - self->combbuffers[j][self->combbufferindex[j]] = sat16(input + sat16(self->combfitlers[j] * feedback, 15), 0); |
| 291 | + self->combfitlers[j] = synthio_sat16(bufout * damp2 + self->combfitlers[j] * damp1, 15); |
| 292 | + self->combbuffers[j][self->combbufferindex[j]] = synthio_sat16(input + synthio_sat16(self->combfitlers[j] * feedback, 15), 0); |
313 | 293 | if (++self->combbufferindex[j] >= self->combbuffersizes[j]) {
|
314 | 294 | self->combbufferindex[j] = 0;
|
315 | 295 | }
|
316 | 296 | }
|
317 | 297 |
|
318 |
| - output = sat16(sum * 31457, 17); // 31457 = 0.24f with shift of 17 |
| 298 | + output = synthio_sat16(sum * 31457, 17); // 31457 = 0.24f with shift of 17 |
319 | 299 |
|
320 | 300 | // Calculate each of the 4 all pass buffers
|
321 | 301 | for (uint32_t j = 0 + channel_allpass_offset; j < 4 + channel_allpass_offset; j++) {
|
322 | 302 | bufout = self->allpassbuffers[j][self->allpassbufferindex[j]];
|
323 | 303 | self->allpassbuffers[j][self->allpassbufferindex[j]] = output + (bufout >> 1); // bufout >> 1 same as bufout*0.5f
|
324 |
| - output = sat16(bufout - output, 1); |
| 304 | + output = synthio_sat16(bufout - output, 1); |
325 | 305 | if (++self->allpassbufferindex[j] >= self->allpassbuffersizes[j]) {
|
326 | 306 | self->allpassbufferindex[j] = 0;
|
327 | 307 | }
|
328 | 308 | }
|
329 | 309 |
|
330 | 310 | word = output * 30; // Add some volume back don't have to saturate as next step will
|
331 | 311 |
|
332 |
| - word = sat16(sample_word * mix_sample, 15) + sat16(word * mix_effect, 15); |
| 312 | + word = synthio_sat16(sample_word * mix_sample, 15) + synthio_sat16(word * mix_effect, 15); |
333 | 313 | word = synthio_mix_down_sample(word, SYNTHIO_MIX_DOWN_SCALE(2));
|
334 | 314 | word_buffer[i] = (int16_t)word;
|
335 | 315 |
|
|
0 commit comments