@@ -13,12 +13,13 @@ class MorphingOscillator : public Oscillator {
1313protected:
1414 Oscillator** osc;
1515 size_t osc_count;
16+ FloatArray buffer;
1617 Oscillator* lo = NULL ;
1718 Oscillator* hi = NULL ;
1819 float xf = 0 ;
1920public:
20- MorphingOscillator (Oscillator** osc, size_t count)
21- : osc(osc), osc_count(count){}
21+ MorphingOscillator (Oscillator** osc, size_t count, FloatArray buffer )
22+ : osc(osc), osc_count(count), buffer(buffer) {}
2223 void setFrequency (float value){
2324 lo->setFrequency (value);
2425 hi->setFrequency (value);
@@ -47,7 +48,20 @@ class MorphingOscillator : public Oscillator {
4748 float h = hi->generate (fm);
4849 return l + (h - l) * xf;
4950 }
50- using Oscillator::generate;
51+ void generate (FloatArray output){
52+ lo->generate (output);
53+ output.multiply (1 -xf);
54+ hi->generate (buffer);
55+ buffer.multiply (xf);
56+ output.add (buffer);
57+ }
58+ void generate (FloatArray output, FloatArray fm){
59+ lo->generate (output, fm);
60+ output.multiply (1 -xf);
61+ hi->generate (buffer, fm);
62+ buffer.multiply (xf);
63+ output.add (buffer);
64+ }
5165 /* *
5266 * Morph between all configured oscillators.
5367 * @param value a cross fade index between 0 and 1.
@@ -80,10 +94,12 @@ class MorphingOscillator : public Oscillator {
8094 lo = hi;
8195 hi = oscillator;
8296 }
83- static MorphingOscillator* create (size_t oscillator_count){
84- return new MorphingOscillator (new Oscillator*[oscillator_count], oscillator_count);
97+ static MorphingOscillator* create (size_t oscillator_count, size_t blocksize){
98+ return new MorphingOscillator (new Oscillator*[oscillator_count], oscillator_count,
99+ FloatArray::create (blocksize));
85100 }
86101 static void destroy (MorphingOscillator* obj){
102+ FloatArray::destroy (obj->buffer );
87103 delete[] obj->osc ;
88104 delete obj;
89105 }
0 commit comments