A MIDI piano synthesizer that implements the Karplus Strong physical modeling algorithm.
Dependencies: mbed USBDevice PinDetect
Diff: LEDController.cpp
- 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;