Skip to content

Commit 41a1c97

Browse files
committed
Stereo packed mode implemented; mix mode switches collapsed
1 parent f3d3fff commit 41a1c97

2 files changed

Lines changed: 45 additions & 66 deletions

File tree

platform/nutekt-digital/looper/looper.hpp

Lines changed: 44 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,18 @@
1010
*/
1111

1212
#include "fx_api.h"
13-
//#include "fixed_math.h"
13+
#include "fixed_math.h"
1414
#include "float_math.h"
1515
#include "osc_api.h"
1616
#include "userrevfx.h"
1717

1818
#include "delayline.hpp"
1919

20-
#define MAX_MEM (2400 * 1024) //exact BPM limits, 32K reserved
21-
#define BUF_SIZE (MAX_MEM / (sizeof(float) * 2))
20+
#define MAX_MEM (2400 * 1024) // exact BPM limits, 32K reserved
21+
#define BUF_SIZE (MAX_MEM / (sizeof(float) * 2)) // loop buffer size in samples, stereo
2222
#define BEAT_MAX 16 // maximum loop length, beats
2323
#define BEAT_MIN 16 // minimum loop length, beat fractions
24-
#define BEAT_STEPS 9 // = log2(BEAT_MAX * BEAT_MIN) + 1
24+
#define BEAT_STEPS 9 // precalculated = log2(BEAT_MAX * BEAT_MIN) + 1
2525

2626
enum {
2727
mix_mode_overwrite = 0,
@@ -37,19 +37,19 @@ enum {
3737
record_format_mono_packed,
3838
record_format_count
3939
};
40-
/*
41-
typedef struct {
42-
q15_t a;
43-
q15_t b;
44-
} q15pair_t;
4540

4641
typedef union {
4742
float f;
48-
q15pair_t q;
49-
} q15f32_t;
43+
struct {
44+
q15_t a;
45+
q15_t b;
46+
} q;
47+
} __attribute__ ((packed)) f32packed_t;
48+
49+
#define f32pack(f1,f2) (f32packed_t){.q={f32_to_q15(f1),f32_to_q15(f2)}}.f
50+
#define f32unpack1(f1) (q15_to_f32(((f32packed_t){.f=f1}).q.a))
51+
#define f32unpack2(f1) (q15_to_f32(((f32packed_t){.f=f1}).q.b))
5052

51-
#define f32x2_to_q15(f1, f2) (q15pair_t){f32_to_q15(f1), f32_to_q15(f2)}
52-
*/
5353
static dsp::DelayLine s_delay;
5454

5555
static __sdram float s_delay_ram[BUF_SIZE * 2];
@@ -84,62 +84,41 @@ void looper_process(float *xn, uint32_t frames)
8484
float valf, valf2;
8585
switch (s_record_format) {
8686
case record_format_stereo:
87-
case record_format_stereo_packed: //ToDo
8887
len *= 2;
89-
switch (s_mix_mode) {
90-
case mix_mode_overwrite:
91-
for (; x != x_e; x) {
92-
valf = s_delay.read(len);
93-
s_delay.write(*x);
94-
*(x++) = (*x + valf) * .5f;
95-
}
96-
break;
97-
case mix_mode_play:
98-
for (; x != x_e;) {
99-
valf = s_delay.read(len);
100-
*(x++) = (*x + valf) * .5f;
101-
}
102-
break;
103-
case mix_mode_overdub:
104-
for (; x != x_e; x++) {
105-
valf = s_delay.read(len);
106-
*(x++) = (*x + valf) * .5f;
107-
s_delay.write(valf);
108-
}
109-
break;
110-
default:
111-
break;
88+
for (; x < x_e;) {
89+
valf2 = valf = s_delay.read(len);
90+
if (s_mix_mode == mix_mode_overwrite)
91+
valf2 = *x;
92+
else if (s_mix_mode == mix_mode_overdub)
93+
valf2 += *x;
94+
s_delay.write(valf2);
95+
*(x++) = (*x + valf) * .5f;
96+
}
97+
break;
98+
case record_format_stereo_packed:
99+
for (; x < x_e;) {
100+
valf2 = valf = s_delay.read(len);
101+
if (s_mix_mode == mix_mode_overwrite)
102+
valf2 = f32pack(*x, x[1]);
103+
else if (s_mix_mode == mix_mode_overdub)
104+
valf2 = f32pack(*x + f32unpack1(valf), x[1] + f32unpack2(valf));
105+
s_delay.write(valf2);
106+
*(x++) = (*x + f32unpack1(valf)) * .5f;
107+
*(x++) = (*x + f32unpack2(valf)) * .5f;
112108
}
113109
break;
114-
case record_format_mono:
115110
case record_format_mono_packed: //ToDo
116-
switch (s_mix_mode) {
117-
case mix_mode_overwrite:
118-
for (; x != x_e; x) {
119-
valf = s_delay.read(len);
120-
s_delay.write((*x + x[1]) * .5f);
121-
*(x++) = (*x + valf) * .5f;
122-
*(x++) = (*x + valf) * .5f;
123-
}
124-
break;
125-
case mix_mode_play:
126-
for (; x != x_e;) {
127-
valf = s_delay.read(len);
128-
*(x++) = (*x + valf) * .5f;
129-
*(x++) = (*x + valf) * .5f;
130-
}
131-
break;
132-
case mix_mode_overdub:
133-
for (; x != x_e; x) {
134-
valf = s_delay.read(len) ;
135-
valf += (*x + x[1]) * .5f;
136-
*(x++) = (*x + valf) * .5f;
137-
*(x++) = (*x + valf) * .5f;
138-
s_delay.write(valf);
139-
}
140-
break;
141-
default:
142-
break;
111+
112+
case record_format_mono:
113+
for (; x < x_e;) {
114+
valf2 = valf = s_delay.read(len);
115+
if (s_mix_mode == mix_mode_overwrite)
116+
valf2 = (*x + x[1]) * .5f;
117+
else if (s_mix_mode == mix_mode_overdub)
118+
valf2 += (*x + x[1]) * .5f;
119+
s_delay.write(valf2);
120+
*(x++) = (*x + valf) * .5f;
121+
*(x++) = (*x + valf) * .5f;
143122
}
144123
break;
145124
default:

platform/nutekt-digital/looper/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"api" : "1.1-0",
77
"dev_id" : 1701541188,
88
"prg_id" : 0,
9-
"version" : "0.3-0",
9+
"version" : "0.4-0",
1010
"name" : "Looper",
1111
"num_param" : 0
1212
}

0 commit comments

Comments
 (0)