summaryrefslogtreecommitdiff
path: root/src/mdaPianoVoice.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mdaPianoVoice.cpp')
-rw-r--r--src/mdaPianoVoice.cpp86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/mdaPianoVoice.cpp b/src/mdaPianoVoice.cpp
index 633fb5a..a1f9529 100644
--- a/src/mdaPianoVoice.cpp
+++ b/src/mdaPianoVoice.cpp
@@ -119,3 +119,89 @@ mdaPianoVoice::on(unsigned char note, unsigned char velocity)
}
}
}
+
+
+void mdaPianoVoice::process(float **inputs, float **outputs, uint32_t sampleFrames)
+{
+ float* out0 = outputs[0];
+ float* out1 = outputs[1];
+ uint32_t event=0, frame=0, frames, v;
+ float x, l, r;
+ uint32_t i;
+
+ while(frame<sampleFrames)
+ {
+ frames = notes[event++];
+ if(frames>sampleFrames) frames = sampleFrames;
+ frames -= frame;
+ frame += frames;
+
+ while(--frames>=0)
+ {
+ VOICE *V = voice;
+ l = r = 0.0f;
+
+ for(v=0; v<activevoices; v++)
+ {
+ V->frac += V->delta; //integer-based linear interpolation
+ V->pos += V->frac >> 16;
+ V->frac &= 0xFFFF;
+ if(V->pos > V->end) V->pos -= V->loop;
+
+ i = waves[V->pos];
+ i = (i << 7) + (V->frac >> 9) * (waves[V->pos + 1] - i) + 0x40400000;
+ x = V->env * (*(float *)&i - 3.0f); //fast int->float
+
+ /////////////////////
+ //TODO: This was used in processReplacing instead of the above
+ /*
+ //i = (i << 7) + (V->frac >> 9) * (waves[V->pos + 1] - i) + 0x40400000; //not working on intel mac !?!
+ i = waves[V->pos] + ((V->frac * (waves[V->pos + 1] - waves[V->pos])) >> 16);
+ x = V->env * (float)i / 32768.0f;
+ //x = V->env * (*(float *)&i - 3.0f); //fast int->float
+ */
+ /////////////////////
+
+ V->env = V->env * V->dec; //envelope
+ V->f0 += V->ff * (x + V->f1 - V->f0); //muffle filter
+ V->f1 = x;
+
+ l += V->outl * V->f0;
+ r += V->outr * V->f0;
+
+ //TODO: this was used in processReplacing
+ /////////////////////
+ /*
+ if(!(l > -2.0f) || !(l < 2.0f))
+ {
+ printf("what is this shit? %d, %f, %f\n", i, x, V->f0);
+ l = 0.0f;
+ }
+if(!(r > -2.0f) || !(r < 2.0f))
+ {
+ r = 0.0f;
+ }
+ */
+ /////////////////////
+
+ V++;
+ }
+ comb[cpos] = l + r;
+ ++cpos &= cmax;
+ x = cdep * comb[cpos]; //stereo simulator
+
+ // TODO: processReplacing simply assigned instead of adding
+ *out0++ += l + x;
+ *out1++ += r - x;
+ }
+
+ if(frame<sampleFrames)
+ {
+ uint32_t note = notes[event++];
+ uint32_t vel = notes[event++];
+ noteOn(note, vel);
+ }
+ }
+ for(v=0; v<activevoices; v++) if(voice[v].env < SILENCE) voice[v] = voice[--activevoices];
+ notes[0] = EVENTS_DONE; //mark events buffer as done
+}