find next free voice
authorrekado <rekado@elephly.net>
Mon, 14 Jan 2013 14:00:30 +0000 (22:00 +0800)
committerrekado <rekado@elephly.net>
Mon, 14 Jan 2013 14:00:30 +0000 (22:00 +0800)
src/mdaPiano.cpp
src/mdaPiano.h
src/mdaPianoVoice.h

index a3c0311..bc9a5f8 100644 (file)
@@ -51,6 +51,30 @@ void mdaPiano::update() {
 }
 
 
+unsigned mdaPiano::find_free_voice(unsigned char key, unsigned char velocity) {
+  //is this a retriggered note during sustain?
+  if (sustain) {
+    for (unsigned i = 0; i < NVOICES; ++i) {
+      if ((voices[i]->get_key() == key) && (voices[i]->is_sustained()))
+        return i;
+    }
+  }
+
+  //take the next free voice if
+  // ... notes are sustained but not this new one
+  // ... notes are not sustained
+  for (unsigned i = 0; i < NVOICES; ++i) {
+    if (voices[i]->get_key() == LV2::INVALID_KEY)
+    {
+      return i;
+    }
+  }
+
+  //TODO: steal quietest note if all voices are used up
+  return 0;
+}
+
+
 void mdaPiano::setVolume(float value)
 {
   for (uint32_t v=0; v<NVOICES; ++v)
index 3697e5d..cebb777 100644 (file)
@@ -19,6 +19,7 @@ public:
   void load_kgrp(KGRP*);
   void load_samples(short**);
 
+  unsigned find_free_voice(unsigned char, unsigned char);
   void handle_midi(uint32_t size, unsigned char* data);
   void setVolume(float);
   void setParameter(unsigned char, float);
index ab37dc5..1cd393f 100644 (file)
@@ -57,6 +57,7 @@ class mdaPianoVoice : public LV2::Voice {
     void update(Param); // recalculates internal variables
     void on(unsigned char key, unsigned char velocity);
     void reset(void);
+    bool is_sustained(void) { return (note == SUSTAIN); }
     unsigned char get_key(void) const { return m_key; }
 };