Skip to content

Commit dafe82f

Browse files
author
Martin Klang
committed
added block-based generate() method
1 parent c4b7520 commit dafe82f

1 file changed

Lines changed: 43 additions & 5 deletions

File tree

LibSource/SampleOscillator.h

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,49 @@ class SampleOscillator : public Oscillator {
8484
pos += rate;
8585
return sample;
8686
}
87-
using Oscillator::generate;
88-
// void generate(FloatArray out){
89-
// // todo: unwind interpolation
90-
// // use circular buffer to retrieve blocks of samples
91-
// }
87+
void generate(FloatArray output){
88+
size_t len = output.getSize();
89+
float* dest = output;
90+
if(rate > 0){
91+
while(pos + rate*len > size){
92+
float remain = size - pos;
93+
size_t steps = (size_t)(remain/rate);
94+
for(size_t i=0; i<steps; ++i){
95+
*dest++ = interpolate(pos, buffer);
96+
pos += rate;
97+
}
98+
len -= steps;
99+
if(repeat_mode == REPEAT_FORWARD){
100+
pos -= size;
101+
}else if(repeat_mode == REPEAT_REVERSE){
102+
rate *= -1;
103+
pos = size;
104+
}else{
105+
return;
106+
}
107+
}
108+
}else{
109+
while(pos + rate*len < 0){
110+
float remain = pos;
111+
size_t steps = (size_t)(remain/rate);
112+
for(size_t i=0; i<steps; ++i){
113+
*dest++ = interpolate(pos, buffer);
114+
pos += rate;
115+
}
116+
len -= steps;
117+
if(repeat_mode == REPEAT_REVERSE){
118+
rate *= -1;
119+
pos = 0;
120+
}else{
121+
return;
122+
}
123+
}
124+
}
125+
for(size_t i=0; i<len; ++i){
126+
*dest++ = interpolate(pos, buffer);
127+
pos += rate;
128+
}
129+
}
92130
size_t findZeroCrossing(size_t index) {
93131
size_t len = buffer.getSize()-1;
94132
size_t i = min(index, len);

0 commit comments

Comments
 (0)