A MIDI piano synthesizer that implements the Karplus Strong physical modeling algorithm.

Dependencies:   mbed USBDevice PinDetect

Revision:
11:f65806ee5833
Parent:
8:deaedb59243e
Child:
17:55e6132c54a8
--- a/LEDController.cpp	Wed Apr 13 17:44:36 2016 +0000
+++ b/LEDController.cpp	Thu Apr 14 03:00:08 2016 +0000
@@ -18,14 +18,8 @@
 DigitalOut myled4_3(p16);
 
 void identifyKeyForLed(int key, int type);
-void chooseLedForKey(int key[4], int type, int signature);
-void setLedToKey(int key[4], int type, int signature, int led);
-
-//If the LED is -1 then it is not in use or free to use.
-int myLed1 = -1;
-int myLed2 = -1;
-int myLed3 = -1;
-int myLed4 = -1;
+void chooseLedForKey(int colors[3], int type, int signature, int key);
+void setLedToKey(int colors[3], int type, int signature, int led, int key);
 
 //These are the notes numbers and RGB values.
 //int noteC[] = {24,0,0,0};
@@ -38,69 +32,83 @@
 
 //A larger array of all the keys to be iterated over.
 //int keys[7][4] = {noteC, noteD, noteE, noteF, noteG, noteA, noteB};
-int keys[7][4] = {{12,0,0,0}, {14,1,0,0},{16,0,1,0},{17,0,0,1},{19,1,1,0},{21,0,1,1},{23,1,1,1}};
+int colors[12][3] = {{0,0,0},{0,0,0},{1,0,0},{1,0,0},{0,1,0},{0,0,1},{0,0,1},{1,1,0},{1,1,0},{0,1,1},{0,1,1},{1,1,1}};
+
 
-const int keysSize = 7;
+int keys[11][12] = {{0,1,2,3,4,5,6,7,8,9,10,11},
+                    {12,13,14,15,16,17,18,19,20,21,22,23},
+                    {24,25,26,27,28,29,30,31,32,33,34,35},
+                    {36,37,38,39,40,41,42,43,44,45,46,47},
+                    {48,49,50,51,52,53,54,55,56,57,58,59},
+                    {60,61,62,63,64,65,66,67,68,69,70,71},
+                    {72,73,74,75,76,77,78,79,80,81,82,83},
+                    {84,85,86,87,88,89,90,91,92,93,94,95},
+                    {96,97,98,99,100,101,102,103,104,105,106,107},
+                    {108,109,110,111,112,113,114,115,116,117,118,119},
+                    {120,121,122,123,124,125,126,127,0,0,0,0}};
+
+const int keysSize = 12;
+
+int ledKeys[4] = {-1,-1,-1,-1};
 
 LEDController::LEDController() {
-    
+
 }
 
 void LEDController::identifyKeyForLed(int key, int type){
     //pc.printf("\r\nGetting note");
+    int octave = key/12;
+    
     for(int i = 0; i < keysSize; i++){
-        if(key % keys[i][0] == 0){
+        if(keys[octave][i] == key){
            //pc.printf("\r\nNote Chosen, no signature");
-           chooseLedForKey(keys[i], type,0);     
-        }else if(key % keys[i][0] == 1){
-           chooseLedForKey(keys[i], type, 1);
-           //pc.printf("\r\nNote Chosen, no signature");        
-        }    
+           chooseLedForKey(colors[i], type,0, keys[octave][i]);     
+        }
     }
 } 
 
 //Chooses which LED to use based upon which are set or if they needed to be turned off.
-void LEDController::chooseLedForKey(int key[4], int type, int signature){
+void LEDController::chooseLedForKey(int colors[3], int type, int signature, int key){
     
     //Determines if the LED is not set and therefore can be used. 
     //Or if it is in use by the same key being passed in which means it needs to be turned off.
     if(type == -1){
-        if(myLed1 == key[0] || myLed1 == (key[0] + 1)){
-          setLedToKey(key, type, signature, 1);
-        }else if(myLed2 == key[0] || myLed2 == (key[0] + 1)){
-          setLedToKey(key, type, signature, 2);
-        }else if(myLed3 == key[0] || myLed3 == (key[0] + 1)){
-          setLedToKey(key, type, signature, 3);  
-        }else if(myLed4 == key[0] || myLed4 == (key[0] + 1)){
-          setLedToKey(key, type, signature, 4);
+        if(ledKeys[0] == key){
+          setLedToKey(colors, type, signature, 1, key);
+        }else if(ledKeys[1] == key){
+          setLedToKey(colors, type, signature, 2, key);
+        }else if(ledKeys[2] == key){
+          setLedToKey(colors, type, signature, 3, key);
+        }else if(ledKeys[3] == key){
+          setLedToKey(colors, type, signature, 4, key);
           }
             
         }else{
-            if(myLed1 == -1){
+            if(ledKeys[0] == -1){
                 //pc.printf("\r\nLED1 chosen.");
-                setLedToKey(key, type, signature, 1);
-            }else if(myLed2 == -1){
-                setLedToKey(key, type, signature, 2);
-            }else if(myLed3 == -1){
-                setLedToKey(key, type, signature, 3);
-            }else if(myLed4 == -1){
-                setLedToKey(key, type, signature, 4);
+                setLedToKey(colors, type, signature, 1, key);
+            }else if(ledKeys[1] == -1){
+                setLedToKey(colors, type, signature, 2, key);
+            }else if(ledKeys[2] == -1){
+                setLedToKey(colors, type, signature, 3, key);
+            }else if(ledKeys[3] == -1){
+                setLedToKey(colors, type, signature, 4, key);
             }
         }
 }
 
 //This sets the key or clears the previously set key if the type is off.
-void LEDController::setLedToKey(int key[4], int type, int signature, int led){
+void LEDController::setLedToKey(int colors[3], int type, int signature, int led, int key){
     if(led == 1){
         if(type == 1){
             //pc.printf("\r\nTurning on light 1");
-            myLed1 = key[0];
-            myled1_1 = key[1];
-            myled1_2 = key[2];
-            myled1_3 = key[3];
+            ledKeys[0] = key;
+            myled1_1 = colors[0];
+            myled1_2 = colors[1];
+            myled1_3 = colors[2];
          }else{
             //pc.printf("\r\nTurning off light 1");
-            myLed1 = -1;
+            ledKeys[0] = -1;
             myled1_1 = 0;
             myled1_2 = 0;
             myled1_3 = 0;
@@ -108,13 +116,13 @@
     }else if(led == 2){
         if(type == 1){
             //pc.printf("\r\nTurning on light 2");
-            myLed2 = key[0];
-            myled2_1 = key[1];
-            myled2_2 = key[2];
-            myled2_3 = key[3];
+            ledKeys[1] = key;
+            myled2_1 = colors[0];
+            myled2_2 = colors[1];
+            myled2_3 = colors[2];
      }else{
     //        pc.printf("\r\nTurning off light 2");
-            myLed2 = -1;
+            ledKeys[1] = -1;
             myled2_1 = 0;
             myled2_2 = 0;
             myled2_3 = 0;
@@ -122,13 +130,13 @@
     }else if(led == 3){
         if(type == 1){
     //        pc.printf("\r\nTurning on light 3");
-            myLed3 = key[0];
-            myled3_1 = key[1];
-            myled3_2 = key[2];
-            myled3_3 = key[3];
+            ledKeys[2] = key;
+            myled3_1 = colors[0];
+            myled3_2 = colors[1];
+            myled3_3 = colors[2];
      }else{
     //        pc.printf("\r\nTurning off light 3");
-            myLed3 = -1;
+            ledKeys[2] = -1;
             myled3_1 = 0;
             myled3_2 = 0;
             myled3_3 = 0;
@@ -136,13 +144,13 @@
     }else if(led == 4){
         if(type == 1){
     //        pc.printf("\r\nTurning on light 4");
-            myLed4 = key[0];
-            myled4_1 = key[1];
-            myled4_2 = key[2];
-            myled4_3 = key[3];
+            ledKeys[3] = key;
+            myled4_1 = colors[0];;
+            myled4_2 = colors[1];
+            myled4_3 = colors[2];
      }else{
     //        pc.printf("\r\nTurning off light 4");
-            myLed4 = -1;
+            ledKeys[3] = -1;
             myled4_1 = 0;
             myled4_2 = 0;
             myled4_3 = 0;