Skip to content

Commit d2173ae

Browse files
committed
Changes to stereo handling
1 parent c7991ad commit d2173ae

File tree

2 files changed

+36
-27
lines changed

2 files changed

+36
-27
lines changed

shared-module/audiodelays/Reverb.c

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -71,16 +71,16 @@ void common_hal_audiodelays_reverb_construct(audiodelays_reverb_obj_t *self, mp_
7171
synthio_block_assign_slot(mix, &self->mix, MP_QSTR_mix);
7272
common_hal_audiodelays_reverb_set_mix(self, mix);
7373

74-
// Set up the comb filters * 2 for L/R (for now)
75-
self->combbuffersizes[0] = 1116 * 2;
76-
self->combbuffersizes[1] = 1188 * 2;
77-
self->combbuffersizes[2] = 1277 * 2;
78-
self->combbuffersizes[3] = 1356 * 2;
79-
self->combbuffersizes[4] = 1422 * 2;
80-
self->combbuffersizes[5] = 1491 * 2;
81-
self->combbuffersizes[6] = 1557 * 2;
82-
self->combbuffersizes[7] = 1617 * 2;
83-
for (uint32_t i = 0; i < 8; i++) {
74+
// Set up the comb filters
75+
self->combbuffersizes[0] = self->combbuffersizes[8] = 1116;
76+
self->combbuffersizes[1] = self->combbuffersizes[9] = 1188;
77+
self->combbuffersizes[2] = self->combbuffersizes[10] = 1277;
78+
self->combbuffersizes[3] = self->combbuffersizes[11] = 1356;
79+
self->combbuffersizes[4] = self->combbuffersizes[12] = 1422;
80+
self->combbuffersizes[5] = self->combbuffersizes[13] = 1491;
81+
self->combbuffersizes[6] = self->combbuffersizes[14] = 1557;
82+
self->combbuffersizes[7] = self->combbuffersizes[15] = 1617;
83+
for (uint32_t i = 0; i < 8 * channel_count; i++) {
8484
self->combbuffers[i] = m_malloc(self->combbuffersizes[i] * sizeof(uint16_t));
8585
if (self->combbuffers[i] == NULL) {
8686
common_hal_audiodelays_reverb_deinit(self);
@@ -93,11 +93,11 @@ void common_hal_audiodelays_reverb_construct(audiodelays_reverb_obj_t *self, mp_
9393
}
9494

9595
// Set up the allpass filters
96-
self->allpassbuffersizes[0] = 556 * 2;
97-
self->allpassbuffersizes[1] = 441 * 2;
98-
self->allpassbuffersizes[2] = 341 * 2;
99-
self->allpassbuffersizes[3] = 225 * 2;
100-
for (uint32_t i = 0; i < 4; i++) {
96+
self->allpassbuffersizes[0] = self->allpassbuffersizes[4] = 556;
97+
self->allpassbuffersizes[1] = self->allpassbuffersizes[5] = 441;
98+
self->allpassbuffersizes[2] = self->allpassbuffersizes[6] = 341;
99+
self->allpassbuffersizes[3] = self->allpassbuffersizes[7] = 225;
100+
for (uint32_t i = 0; i < 4 * channel_count; i++) {
101101
self->allpassbuffers[i] = m_malloc(self->allpassbuffersizes[i] * sizeof(uint16_t));
102102
if (self->allpassbuffers[i] == NULL) {
103103
common_hal_audiodelays_reverb_deinit(self);
@@ -290,14 +290,15 @@ audioio_get_buffer_result_t audiodelays_reverb_get_buffer(audiodelays_reverb_obj
290290

291291
for (uint32_t i = 0; i < n; i++) {
292292
int32_t sample_word = sample_src[i];
293-
int32_t word;
293+
294+
int32_t word, sum;
294295
int16_t input, bufout, output;
295-
int32_t sum;
296+
uint32_t channel_comb_offset = 0, channel_allpass_offset = 0;
296297

297298
input = sat16(sample_word * 8738, 17);
298299
sum = 0;
299300

300-
for (uint32_t j = 0; j < 8; j++) {
301+
for (uint32_t j = 0 + channel_comb_offset; j < 8 + channel_comb_offset; j++) {
301302
bufout = self->combbuffers[j][self->combbufferindex[j]];
302303
sum += bufout;
303304
self->combfitlers[j] = sat16(bufout * damp2 + self->combfitlers[j] * damp1, 15);
@@ -309,7 +310,7 @@ audioio_get_buffer_result_t audiodelays_reverb_get_buffer(audiodelays_reverb_obj
309310

310311
output = sat16(sum * 31457, 17); // 31457 = 0.96f
311312

312-
for (uint32_t j = 0; j < 4; j++) {
313+
for (uint32_t j = 0 + channel_allpass_offset; j < 4 + channel_allpass_offset; j++) {
313314
bufout = self->allpassbuffers[j][self->allpassbufferindex[j]];
314315
self->allpassbuffers[j][self->allpassbufferindex[j]] = output + (bufout >> 1); // bufout >> 1 same as bufout*0.5f
315316
output = sat16(bufout - output, 1);
@@ -322,6 +323,14 @@ audioio_get_buffer_result_t audiodelays_reverb_get_buffer(audiodelays_reverb_obj
322323

323324
word = synthio_mix_down_sample(word, SYNTHIO_MIX_DOWN_SCALE(2));
324325
word_buffer[i] = (int16_t)word;
326+
327+
if ((self->base.channel_count == 2) && (channel_comb_offset == 0)) {
328+
channel_comb_offset = 8;
329+
channel_allpass_offset = 4;
330+
} else {
331+
channel_comb_offset = 0;
332+
channel_allpass_offset = 0;
333+
}
325334
}
326335

327336
// Update the remaining length and the buffer positions based on how much we wrote into our buffer

shared-module/audiodelays/Reverb.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,14 @@ typedef struct {
2929
bool loop;
3030
bool more_data;
3131

32-
int16_t combbuffersizes[8];
33-
int16_t *combbuffers[8];
34-
int16_t combbufferindex[8];
35-
int16_t combfitlers[8];
36-
37-
int16_t allpassbuffersizes[4];
38-
int16_t *allpassbuffers[4];
39-
int16_t allpassbufferindex[4];
32+
int16_t combbuffersizes[16];
33+
int16_t *combbuffers[16];
34+
int16_t combbufferindex[16];
35+
int16_t combfitlers[16];
36+
37+
int16_t allpassbuffersizes[8];
38+
int16_t *allpassbuffers[8];
39+
int16_t allpassbufferindex[8];
4040

4141
mp_obj_t sample;
4242
} audiodelays_reverb_obj_t;

0 commit comments

Comments
 (0)