@@ -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