set pos = 0 and get end from sample size
authorrekado <rekado@elephly.net>
Sat, 19 Jan 2013 13:41:14 +0000 (21:41 +0800)
committerrekado <rekado@elephly.net>
Sat, 19 Jan 2013 13:57:22 +0000 (21:57 +0800)
src/mdaPianoVoice.cpp
src/mdaPianoVoice.h

index 86edcb5..80f55da 100644 (file)
@@ -1,11 +1,11 @@
 #include "mdaPianoVoice.h"
 
-mdaPianoVoice::mdaPianoVoice(double rate, short * samples, KGRP * master_kgrp) {
+mdaPianoVoice::mdaPianoVoice(double rate, Sample * master_samples, KGRP * master_kgrp) {
   //set tuning
   Fs = rate;
   iFs = 1.0f/Fs;
 
-  waves = samples;
+  samples = master_samples;
   kgrp  = master_kgrp;
 
   default_preset[p_offset(p_envelope_decay)]       = 0.500f;
@@ -65,14 +65,15 @@ void mdaPianoVoice::on(unsigned char note, unsigned char velocity)
 
     k = 0;
     while(note > (kgrp[k].high + s)) k++;  //find keygroup
+    sample_index = k; //store sample index
 
     l += (float)(note - kgrp[k].root); //pitch
     l = 22050.0f * iFs * (float)exp(0.05776226505 * l);
     delta = (uint32_t)(65536.0f * l);
     frac = 0;
-    pos = kgrp[k].pos;
-    end = kgrp[k].end;
-    loop = kgrp[k].loop;
+    pos = 0;
+    end = samples[sample_index].size;
+    loop = kgrp[sample_index].loop;
 
     env = (0.5f + velsens) * (float)pow(0.0078f * velocity, velsens); //velocity
 
@@ -137,8 +138,8 @@ void mdaPianoVoice::render(uint32_t from, uint32_t to)
     frac &= 0xFFFF;
     if(pos > end) pos -= loop;
 
-    i = waves[pos];
-    i = (i << 7) + (frac >> 9) * (waves[pos + 1] - i) + 0x40400000;
+    i = samples[sample_index].buffer[pos];
+    i = (i << 7) + (frac >> 9) * (samples[sample_index].buffer[pos + 1] - i) + 0x40400000;
     x = env * (*(float *)&i - 3.0f);  //fast int->float
 
     env = env * dec;  //envelope
index 3276d74..3eb62e1 100644 (file)
@@ -18,7 +18,8 @@ class mdaPianoVoice : public LV2::Voice {
 
     /// global internal variables
     KGRP  *kgrp;
-    short *waves;
+    Sample *samples;
+    uint32_t sample_index;
     float default_preset[NPARAMS]; // contains the default preset
     short sustain;
     float comb[256];
@@ -50,7 +51,7 @@ class mdaPianoVoice : public LV2::Voice {
     unsigned char m_key;
 
   public:
-    mdaPianoVoice(double, short*, KGRP*);
+    mdaPianoVoice(double, Sample*, KGRP*);
     void set_sustain(unsigned short v) { sustain = v; }
     void set_volume(float v) { volume = v; }
     void set_muff(float v) { muff = v; }