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

Dependencies:   mbed USBDevice PinDetect

Committer:
ndelfino
Date:
Tue Apr 19 17:22:18 2016 +0000
Revision:
17:55e6132c54a8
Parent:
11:f65806ee5833
Child:
20:bf675ba2c454
Added in brickleds so now you will know the signature of the note. Did some refactoring to identifying the keys.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ndelfino 3:8f80e267a80d 1 #include "mbed.h"
ndelfino 8:deaedb59243e 2 #include "LEDController.h"
ndelfino 3:8f80e267a80d 3
ndelfino 17:55e6132c54a8 4 DigitalOut brickled1(p5);
ndelfino 17:55e6132c54a8 5 DigitalOut brickled2(p6);
ndelfino 17:55e6132c54a8 6 DigitalOut brickled3(p7);
ndelfino 17:55e6132c54a8 7 DigitalOut brickled4(p8);
ndelfino 3:8f80e267a80d 8
ndelfino 17:55e6132c54a8 9 DigitalOut myled1_1(p9);
ndelfino 17:55e6132c54a8 10 DigitalOut myled1_2(p10);
ndelfino 17:55e6132c54a8 11 DigitalOut myled1_3(p11);
ndelfino 4:bb9f50305401 12
ndelfino 17:55e6132c54a8 13 DigitalOut myled2_1(p12);
ndelfino 17:55e6132c54a8 14 DigitalOut myled2_2(p13);
ndelfino 17:55e6132c54a8 15 DigitalOut myled2_3(p14);
ndelfino 4:bb9f50305401 16
ndelfino 17:55e6132c54a8 17 DigitalOut myled3_1(p15);
ndelfino 17:55e6132c54a8 18 DigitalOut myled3_2(p16);
ndelfino 17:55e6132c54a8 19 DigitalOut myled3_3(p17);
ndelfino 17:55e6132c54a8 20
ndelfino 17:55e6132c54a8 21 DigitalOut myled4_1(p18);
ndelfino 17:55e6132c54a8 22 DigitalOut myled4_2(p19);
ndelfino 17:55e6132c54a8 23 DigitalOut myled4_3(p20);
ndelfino 3:8f80e267a80d 24
ndelfino 8:deaedb59243e 25 void identifyKeyForLed(int key, int type);
ndelfino 11:f65806ee5833 26 void chooseLedForKey(int colors[3], int type, int signature, int key);
ndelfino 11:f65806ee5833 27 void setLedToKey(int colors[3], int type, int signature, int led, int key);
ndelfino 4:bb9f50305401 28
ndelfino 4:bb9f50305401 29 //These are the notes numbers and RGB values.
ndelfino 17:55e6132c54a8 30 //int noteC[] = {24,1,0,1};
ndelfino 8:deaedb59243e 31 //int noteD[] = {26,1,0,0};
ndelfino 8:deaedb59243e 32 //int noteE[] = {16,0,1,0};
ndelfino 8:deaedb59243e 33 //int noteF[] = {17,0,0,1};
ndelfino 8:deaedb59243e 34 //int noteG[] = {32,1,1,0};
ndelfino 8:deaedb59243e 35 //int noteA[] = {34,0,1,1};
ndelfino 8:deaedb59243e 36 //int noteB[] = {36,1,1,1};
ndelfino 4:bb9f50305401 37
ndelfino 8:deaedb59243e 38 //A larger array of all the keys to be iterated over.
ndelfino 8:deaedb59243e 39 //int keys[7][4] = {noteC, noteD, noteE, noteF, noteG, noteA, noteB};
ndelfino 17:55e6132c54a8 40 int colors[12][3] = {{1,0,1},{1,0,1},{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}};
ndelfino 4:bb9f50305401 41
ndelfino 17:55e6132c54a8 42 //Midi Numbers
ndelfino 17:55e6132c54a8 43 //int keys[11][12] = {{0,1,2,3,4,5,6,7,8,9,10,11},
ndelfino 17:55e6132c54a8 44 // {12,13,14,15,16,17,18,19,20,21,22,23},
ndelfino 17:55e6132c54a8 45 // {24,25,26,27,28,29,30,31,32,33,34,35},
ndelfino 17:55e6132c54a8 46 // {36,37,38,39,40,41,42,43,44,45,46,47},
ndelfino 17:55e6132c54a8 47 // {48,49,50,51,52,53,54,55,56,57,58,59},
ndelfino 17:55e6132c54a8 48 // {60,61,62,63,64,65,66,67,68,69,70,71},
ndelfino 17:55e6132c54a8 49 // {72,73,74,75,76,77,78,79,80,81,82,83},
ndelfino 17:55e6132c54a8 50 // {84,85,86,87,88,89,90,91,92,93,94,95},
ndelfino 17:55e6132c54a8 51 // {96,97,98,99,100,101,102,103,104,105,106,107},
ndelfino 17:55e6132c54a8 52 // {108,109,110,111,112,113,114,115,116,117,118,119},
ndelfino 17:55e6132c54a8 53 // {120,121,122,123,124,125,126,127,0,0,0,0}};
ndelfino 11:f65806ee5833 54
ndelfino 11:f65806ee5833 55 int ledKeys[4] = {-1,-1,-1,-1};
ndelfino 5:a687cfa7be62 56
ndelfino 8:deaedb59243e 57 LEDController::LEDController() {
ndelfino 11:f65806ee5833 58
ndelfino 3:8f80e267a80d 59 }
ndelfino 4:bb9f50305401 60
ndelfino 8:deaedb59243e 61 void LEDController::identifyKeyForLed(int key, int type){
ndelfino 8:deaedb59243e 62 //pc.printf("\r\nGetting note");
ndelfino 17:55e6132c54a8 63 int octave = key%12;
ndelfino 17:55e6132c54a8 64
ndelfino 17:55e6132c54a8 65 if(octave == 1 || octave == 3 || octave == 6 || octave == 8 || octave == 10){
ndelfino 17:55e6132c54a8 66 chooseLedForKey(colors[octave], type,1, key);
ndelfino 17:55e6132c54a8 67 }else{
ndelfino 17:55e6132c54a8 68 chooseLedForKey(colors[octave], type,0, key);
ndelfino 17:55e6132c54a8 69 }
ndelfino 4:bb9f50305401 70 }
ndelfino 4:bb9f50305401 71
ndelfino 4:bb9f50305401 72 //Chooses which LED to use based upon which are set or if they needed to be turned off.
ndelfino 11:f65806ee5833 73 void LEDController::chooseLedForKey(int colors[3], int type, int signature, int key){
ndelfino 4:bb9f50305401 74
ndelfino 4:bb9f50305401 75 //Determines if the LED is not set and therefore can be used.
ndelfino 8:deaedb59243e 76 //Or if it is in use by the same key being passed in which means it needs to be turned off.
ndelfino 8:deaedb59243e 77 if(type == -1){
ndelfino 11:f65806ee5833 78 if(ledKeys[0] == key){
ndelfino 11:f65806ee5833 79 setLedToKey(colors, type, signature, 1, key);
ndelfino 11:f65806ee5833 80 }else if(ledKeys[1] == key){
ndelfino 11:f65806ee5833 81 setLedToKey(colors, type, signature, 2, key);
ndelfino 11:f65806ee5833 82 }else if(ledKeys[2] == key){
ndelfino 11:f65806ee5833 83 setLedToKey(colors, type, signature, 3, key);
ndelfino 11:f65806ee5833 84 }else if(ledKeys[3] == key){
ndelfino 11:f65806ee5833 85 setLedToKey(colors, type, signature, 4, key);
ndelfino 8:deaedb59243e 86 }
ndelfino 8:deaedb59243e 87
ndelfino 8:deaedb59243e 88 }else{
ndelfino 11:f65806ee5833 89 if(ledKeys[0] == -1){
ndelfino 8:deaedb59243e 90 //pc.printf("\r\nLED1 chosen.");
ndelfino 11:f65806ee5833 91 setLedToKey(colors, type, signature, 1, key);
ndelfino 11:f65806ee5833 92 }else if(ledKeys[1] == -1){
ndelfino 11:f65806ee5833 93 setLedToKey(colors, type, signature, 2, key);
ndelfino 11:f65806ee5833 94 }else if(ledKeys[2] == -1){
ndelfino 11:f65806ee5833 95 setLedToKey(colors, type, signature, 3, key);
ndelfino 11:f65806ee5833 96 }else if(ledKeys[3] == -1){
ndelfino 11:f65806ee5833 97 setLedToKey(colors, type, signature, 4, key);
ndelfino 8:deaedb59243e 98 }
ndelfino 8:deaedb59243e 99 }
ndelfino 4:bb9f50305401 100 }
ndelfino 4:bb9f50305401 101
ndelfino 8:deaedb59243e 102 //This sets the key or clears the previously set key if the type is off.
ndelfino 11:f65806ee5833 103 void LEDController::setLedToKey(int colors[3], int type, int signature, int led, int key){
ndelfino 17:55e6132c54a8 104 if(led == 1){
ndelfino 8:deaedb59243e 105 if(type == 1){
ndelfino 17:55e6132c54a8 106 // pc.printf("\r\nTurning on light 1");
ndelfino 11:f65806ee5833 107 ledKeys[0] = key;
ndelfino 11:f65806ee5833 108 myled1_1 = colors[0];
ndelfino 11:f65806ee5833 109 myled1_2 = colors[1];
ndelfino 11:f65806ee5833 110 myled1_3 = colors[2];
ndelfino 17:55e6132c54a8 111 if(signature == 1){
ndelfino 17:55e6132c54a8 112 brickled1 = 1;
ndelfino 17:55e6132c54a8 113 }
ndelfino 8:deaedb59243e 114 }else{
ndelfino 17:55e6132c54a8 115 // pc.printf("\r\nTurning off light 1");
ndelfino 11:f65806ee5833 116 ledKeys[0] = -1;
ndelfino 8:deaedb59243e 117 myled1_1 = 0;
ndelfino 8:deaedb59243e 118 myled1_2 = 0;
ndelfino 8:deaedb59243e 119 myled1_3 = 0;
ndelfino 17:55e6132c54a8 120 brickled1 = 0;
ndelfino 8:deaedb59243e 121 }
ndelfino 8:deaedb59243e 122 }else if(led == 2){
ndelfino 8:deaedb59243e 123 if(type == 1){
ndelfino 17:55e6132c54a8 124 // pc.printf("\r\nTurning on light 2");
ndelfino 11:f65806ee5833 125 ledKeys[1] = key;
ndelfino 11:f65806ee5833 126 myled2_1 = colors[0];
ndelfino 11:f65806ee5833 127 myled2_2 = colors[1];
ndelfino 11:f65806ee5833 128 myled2_3 = colors[2];
ndelfino 17:55e6132c54a8 129 if(signature == 1){
ndelfino 17:55e6132c54a8 130 brickled2 = 1;
ndelfino 17:55e6132c54a8 131 }
ndelfino 4:bb9f50305401 132 }else{
ndelfino 17:55e6132c54a8 133 // pc.printf("\r\nTurning off light 2");
ndelfino 11:f65806ee5833 134 ledKeys[1] = -1;
ndelfino 8:deaedb59243e 135 myled2_1 = 0;
ndelfino 8:deaedb59243e 136 myled2_2 = 0;
ndelfino 8:deaedb59243e 137 myled2_3 = 0;
ndelfino 17:55e6132c54a8 138 brickled2 = 0;
ndelfino 4:bb9f50305401 139 }
ndelfino 8:deaedb59243e 140 }else if(led == 3){
ndelfino 8:deaedb59243e 141 if(type == 1){
ndelfino 17:55e6132c54a8 142 // pc.printf("\r\nTurning on light 3");
ndelfino 11:f65806ee5833 143 ledKeys[2] = key;
ndelfino 11:f65806ee5833 144 myled3_1 = colors[0];
ndelfino 11:f65806ee5833 145 myled3_2 = colors[1];
ndelfino 11:f65806ee5833 146 myled3_3 = colors[2];
ndelfino 17:55e6132c54a8 147 if(signature == 1){
ndelfino 17:55e6132c54a8 148 brickled3 = 1;
ndelfino 17:55e6132c54a8 149 }
ndelfino 8:deaedb59243e 150 }else{
ndelfino 17:55e6132c54a8 151 // pc.printf("\r\nTurning off light 3");
ndelfino 11:f65806ee5833 152 ledKeys[2] = -1;
ndelfino 8:deaedb59243e 153 myled3_1 = 0;
ndelfino 8:deaedb59243e 154 myled3_2 = 0;
ndelfino 8:deaedb59243e 155 myled3_3 = 0;
ndelfino 17:55e6132c54a8 156 brickled3 = 0;
ndelfino 8:deaedb59243e 157 }
ndelfino 8:deaedb59243e 158 }else if(led == 4){
ndelfino 8:deaedb59243e 159 if(type == 1){
ndelfino 17:55e6132c54a8 160 // pc.printf("\r\nTurning on light 4");
ndelfino 11:f65806ee5833 161 ledKeys[3] = key;
ndelfino 11:f65806ee5833 162 myled4_1 = colors[0];;
ndelfino 11:f65806ee5833 163 myled4_2 = colors[1];
ndelfino 11:f65806ee5833 164 myled4_3 = colors[2];
ndelfino 17:55e6132c54a8 165 if(signature == 1){
ndelfino 17:55e6132c54a8 166 brickled4 = 1;
ndelfino 17:55e6132c54a8 167 }
ndelfino 8:deaedb59243e 168 }else{
ndelfino 17:55e6132c54a8 169 // pc.printf("\r\nTurning off light 4");
ndelfino 11:f65806ee5833 170 ledKeys[3] = -1;
ndelfino 8:deaedb59243e 171 myled4_1 = 0;
ndelfino 8:deaedb59243e 172 myled4_2 = 0;
ndelfino 8:deaedb59243e 173 myled4_3 = 0;
ndelfino 17:55e6132c54a8 174 brickled4 = 0;
ndelfino 8:deaedb59243e 175 }
ndelfino 8:deaedb59243e 176 }
ndelfino 8:deaedb59243e 177
ndelfino 4:bb9f50305401 178 }