dampen/undampen notes on pedal
authorrekado <rekado@elephly.net>
Mon, 14 Jan 2013 14:18:45 +0000 (22:18 +0800)
committerrekado <rekado@elephly.net>
Mon, 14 Jan 2013 14:18:45 +0000 (22:18 +0800)
src/mdaPiano.cpp
src/mdaPianoVoice.h

index 3e44cc7..fbd0665 100644 (file)
@@ -144,10 +144,13 @@ void mdaPiano::handle_midi(uint32_t size, unsigned char* data) {
         case 0x40:  //sustain pedal
         case 0x42:  //sustenuto pedal
           sustain = data[2] & 0x40;
-          if(sustain==0)
-          {
-            notes[npos++] = SUSTAIN; //end all sustained notes
-            notes[npos++] = 0;
+
+          for (unsigned i = 0; i < NVOICES; ++i) {
+            voices[i]->set_sustain(sustain);
+            //if pedal was released: dampen sustained notes
+            if((sustain==0) && (voices[i]->is_sustained())) {
+              voices[i]->release(0);
+            }
           }
           break;
 
index 22f8218..e50c176 100644 (file)
@@ -50,6 +50,7 @@ class mdaPianoVoice : public LV2::Voice {
 
   public:
     mdaPianoVoice(double, short*, KGRP*);
+    void set_sustain(unsigned short v) { sustain = v; }
     void set_volume(float v) { volume = v; }
     void set_muff(float v) { muff = v; }