statically declare comb array
[software/lv2-mdametapiano.git] / src / mdaPianoVoice.cpp
index 86203eb..322b534 100644 (file)
@@ -21,7 +21,6 @@ mdaPianoVoice::mdaPianoVoice(double rate, short * samples, KGRP * master_kgrp) {
   default_preset[p_offset(p_random_detuning)]      = 0.246f;
   default_preset[p_offset(p_stretch_tuning)]       = 0.500f;
 
-  comb = new float[256];
   reset();
 }
 
@@ -50,10 +49,8 @@ void mdaPianoVoice::on(unsigned char note, unsigned char velocity)
   // store key that turned this voice on (used in 'get_key')
   m_key = note;
 
-  // TODO: replace with this voice's local copy
-  float * param = programs[curProgram].param;
   float l=99.0f;
-  uint32_t  v, k, s;
+  uint32_t k, s;
 
   if(velocity>0)
   {
@@ -93,7 +90,7 @@ void mdaPianoVoice::on(unsigned char note, unsigned char velocity)
 
     env = (0.5f + velsens) * (float)pow(0.0078f * velocity, velsens); //velocity
 
-    l = 50.0f + param[4] * param[4] * muff + muffvel * (float)(velocity - 64); //muffle
+    l = 50.0f + *p(p_muffling_filter) * *p(p_muffling_filter) * muff + muffvel * (float)(velocity - 64); //muffle
     if(l < (55.0f + 0.25f * (float)note)) l = 55.0f + 0.25f * (float)note;
     if(l > 210.0f) l = 210.0f;
     ff = l * l * iFs;
@@ -106,8 +103,8 @@ void mdaPianoVoice::on(unsigned char note, unsigned char velocity)
     outl = l + l - outr;
 
     if(note < 44) note = 44; //limit max decay length
-    l = 2.0f * param[0];
-    if(l < 1.0f) l += 0.25f - 0.5f * param[0];
+    l = 2.0f * *p(p_envelope_decay);
+    if(l < 1.0f) l += 0.25f - 0.5f * *p(p_envelope_decay);
     dec = (float)exp(-iFs * exp(-0.6 + 0.033 * (double)note - l));
   }
   else //note off
@@ -140,110 +137,82 @@ void mdaPianoVoice::release(unsigned char velocity)
 }
 
 
-void mdaPianoVoice::process(float **inputs, float **outputs, uint32_t sampleFrames)
+void mdaPianoVoice::render(uint32_t from, uint32_t to)
 {
-  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;
+  for (uint32_t frame = from; frame < to; ++frame) {
+    l = r = 0.0f;
 
-    while(--frames>=0)
-    {
-      VOICE *V = voice;
-      l = r = 0.0f;
+    frac += delta;  //integer-based linear interpolation
+    pos += frac >> 16;
+    frac &= 0xFFFF;
+    if(pos > end) pos -= loop;
 
-      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;
- }
-        */
-        /////////////////////
+    i = waves[pos];
+    i = (i << 7) + (frac >> 9) * (waves[pos + 1] - i) + 0x40400000;
+    x = env * (*(float *)&i - 3.0f);  //fast int->float
 
-        V++;
-      }
-      comb[cpos] = l + r;
-      ++cpos &= cmax;
-      x = cdep * comb[cpos];  //stereo simulator
+    /////////////////////
+    //TODO: This was used in processReplacing instead of the above
+    /*
+    //i = (i << 7) + (frac >> 9) * (waves[pos + 1] - i) + 0x40400000;   //not working on intel mac !?!
+i = waves[pos] + ((frac * (waves[pos + 1] - waves[pos])) >> 16);
+x = env * (float)i / 32768.0f;
+    //x = env * (*(float *)&i - 3.0f);  //fast int->float
+    */
+    /////////////////////
 
-      // TODO: processReplacing simply assigned instead of adding
-      *out0++ += l + x;
-      *out1++ += r - x;
-    }
+    env = env * dec;  //envelope
+    f0 += ff * (x + f1 - f0);  //muffle filter
+    f1 = x;
 
-    if(frame<sampleFrames)
-    {
-      uint32_t note = notes[event++];
-      uint32_t vel  = notes[event++];
-      noteOn(note, vel);
-    }
+    l += outl * f0;
+    r += outr * 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, f0);
+l = 0.0f;
+}
+if(!(r > -2.0f) || !(r < 2.0f))
+{
+r = 0.0f;
+}
+    */
+    /////////////////////
+    comb[cpos] = l + r;
+    ++cpos &= 0x7F;
+    x = cdep * comb[cpos];  //stereo simulator
+
+    // TODO: processReplacing simply assigned instead of adding
+    // write to output
+    p(p_left)[frame] += l + x;
+    p(p_right)[frame] += r - x;
   }
-  for(v=0; v<activevoices; v++) if(voice[v].env < SILENCE) voice[v] = voice[--activevoices];
-  notes[0] = EVENTS_DONE;  //mark events buffer as done
 }
 
 
 void mdaPianoVoice::update(Param par)
 {
-  //TODO: use local copy
-  float * param = programs[curProgram].param;
-  size = (uint32_t)(12.0f * param[2] - 6.0f);
-  sizevel = 0.12f * param[3];
-  muffvel = param[5] * param[5] * 5.0f;
+  size = (uint32_t)(12.0f * p_helper(p_hardness_offset, par) - 6.0f);
+  sizevel = 0.12f * p_helper(p_velocity_to_hardness, par);
+  muffvel = p_helper(p_velocity_to_muffling, par) * p_helper(p_velocity_to_muffling, par) * 5.0f;
 
-  velsens = 1.0f + param[6] + param[6];
-  if(param[6] < 0.25f) velsens -= 0.75f - 3.0f * param[6];
+  velsens = 1.0f + p_helper(p_velocity_sensitivity, par) + p_helper(p_velocity_sensitivity, par);
+  if(p_helper(p_velocity_sensitivity, par) < 0.25f) velsens -= 0.75f - 3.0f * p_helper(p_velocity_sensitivity, par);
 
-  fine = param[9] - 0.5f;
-  random = 0.077f * param[10] * param[10];
-  stretch = 0.000434f * (param[11] - 0.5f);
+  fine = p_helper(p_fine_tuning, par) - 0.5f;
+  random = 0.077f * p_helper(p_random_detuning, par) * p_helper(p_random_detuning, par);
+  stretch = 0.000434f * (p_helper(p_stretch_tuning, par) - 0.5f);
 
-  cdep = param[7] * param[7];
+  cdep = p_helper(p_stereo_width, par) * p_helper(p_stereo_width, par);
   trim = 1.50f - 0.79f * cdep;
-  width = 0.04f * param[7];  if(width > 0.03f) width = 0.03f;
+  width = 0.04f * p_helper(p_stereo_width, par);  if(width > 0.03f) width = 0.03f;
 
-  poly = 8 + (uint32_t)(24.9f * param[8]);
+  poly = 8 + (uint32_t)(24.9f * p_helper(p_polyphony, par));
 }