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

Dependencies:   mbed USBDevice PinDetect

LEDController.cpp

Committer:
ndelfino
Date:
2016-04-13
Revision:
8:deaedb59243e
Parent:
5:a687cfa7be62
Child:
11:f65806ee5833

File content as of revision 8:deaedb59243e:

#include "mbed.h"
#include "LEDController.h"

DigitalOut myled1_1(p5);
DigitalOut myled1_2(p6);
DigitalOut myled1_3(p7);

DigitalOut myled2_1(p8);
DigitalOut myled2_2(p9);
DigitalOut myled2_3(p10);

DigitalOut myled3_1(p11);
DigitalOut myled3_2(p12);
DigitalOut myled3_3(p13);

DigitalOut myled4_1(p14);
DigitalOut myled4_2(p15);
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;

//These are the notes numbers and RGB values.
//int noteC[] = {24,0,0,0};
//int noteD[] = {26,1,0,0};
//int noteE[] = {16,0,1,0};
//int noteF[] = {17,0,0,1};
//int noteG[] = {32,1,1,0};
//int noteA[] = {34,0,1,1};
//int noteB[] = {36,1,1,1};

//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}};

const int keysSize = 7;

LEDController::LEDController() {
    
}

void LEDController::identifyKeyForLed(int key, int type){
    //pc.printf("\r\nGetting note");
    for(int i = 0; i < keysSize; i++){
        if(key % keys[i][0] == 0){
           //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");        
        }    
    }
} 

//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){
    
    //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);
          }
            
        }else{
            if(myLed1 == -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);
            }
        }
}

//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){
    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];
         }else{
            //pc.printf("\r\nTurning off light 1");
            myLed1 = -1;
            myled1_1 = 0;
            myled1_2 = 0;
            myled1_3 = 0;
         }
    }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];
     }else{
    //        pc.printf("\r\nTurning off light 2");
            myLed2 = -1;
            myled2_1 = 0;
            myled2_2 = 0;
            myled2_3 = 0;
     }
    }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];
     }else{
    //        pc.printf("\r\nTurning off light 3");
            myLed3 = -1;
            myled3_1 = 0;
            myled3_2 = 0;
            myled3_3 = 0;
     }
    }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];
     }else{
    //        pc.printf("\r\nTurning off light 4");
            myLed4 = -1;
            myled4_1 = 0;
            myled4_2 = 0;
            myled4_3 = 0;
     }
    }
        
}