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
2626enum {
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
4641typedef 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- */
5353static dsp::DelayLine s_delay;
5454
5555static __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 :
0 commit comments