diff options
Diffstat (limited to 'src/mdaPianoVoice.cpp')
-rw-r--r-- | src/mdaPianoVoice.cpp | 86 |
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 +} |