#include <MIDI.h>

//#define BUTTON A6     /// Bouton de clock divider
#define LED1 3
#define LED2 4
#define LED3 5
#define LED4 6
#define LED5 7
#define LED6 8
#define LED7 9
#define LED8 10
#define LED9 11
#define LED10 12
#define LED11 13
#define LED12 A0
#define LED13 A1
#define LED14 A2
#define LED15 A3
#define LED16 A4
#define CLK A5                  // Clock/tempo
#define RST 2                  // Synced Reset 

MIDI_CREATE_DEFAULT_INSTANCE();

void MyHandleNoteOff(byte channel, byte pitch, byte velocity) {
  switch (pitch) {
    case 60:
      digitalWrite(LED1,LOW);
      break;
    case 61:
      digitalWrite(LED2,LOW);
      break;
    case 62:
      digitalWrite(LED3,LOW);
      break;
    case 63:
      digitalWrite(LED4,LOW);
      break;
    case 64:
      digitalWrite(LED5,LOW);
      break;
    case 65:
      digitalWrite(LED6,LOW);
      break;
    case 66:
      digitalWrite(LED7,LOW);
      break;
    case 67:
      digitalWrite(LED8,LOW);
      break;
    case 68:
      digitalWrite(LED9,LOW);
      break;
    case 69:
      digitalWrite(LED10,LOW);
      break;
    case 70:
      digitalWrite(LED11,LOW);
      break;
    case 71:
      digitalWrite(LED12,LOW);
      break;
    case 72:
      digitalWrite(LED13,LOW);
      break;
    case 73:
      digitalWrite(LED14,LOW);
      break;
    case 74:
      digitalWrite(LED15,LOW);
      break;
    case 75:
      digitalWrite(LED16,LOW);
      break;
  }
}

void MyHandleNoteOn(byte channel, byte pitch, byte velocity) {
  switch (pitch) {
    case 60:
      digitalWrite(LED1,HIGH);
      break;
    case 61:
      digitalWrite(LED2,HIGH);
      break;
    case 62:
      digitalWrite(LED3,HIGH);
      break;
    case 63:
      digitalWrite(LED4,HIGH);
      break;
    case 64:
      digitalWrite(LED5,HIGH);
      break;
    case 65:
      digitalWrite(LED6,HIGH);
      break;
    case 66:
      digitalWrite(LED7,HIGH);
      break;
    case 67:
      digitalWrite(LED8,HIGH);
      break;
    case 68:
      digitalWrite(LED9,HIGH);
      break;
    case 69:
      digitalWrite(LED10,HIGH);
      break;
    case 70:
      digitalWrite(LED11,HIGH);
      break;
    case 71:
      digitalWrite(LED12,HIGH);
      break;
    case 72:
      digitalWrite(LED13,HIGH);
      break;
    case 73:
      digitalWrite(LED14,HIGH);
      break;
    case 74:
      digitalWrite(LED15,HIGH);
      break;
    case 75:
      digitalWrite(LED16,HIGH);
      break;

  }
  
}

///////////////////////////////////////////////////////////////////
/////////////////////////// CLOCK /////////////////////////////////
///////////////////////////////////////////////////////////////////

void trCLK() {
   digitalWrite(CLK,HIGH);
   delay(20);
   digitalWrite(CLK,LOW);
}

///////////////////////////////////////////////////////////////////
/////////////////////////// RESET / START /////////////////////////
///////////////////////////////////////////////////////////////////

void trRST() {  
    digitalWrite(RST,HIGH);
    delay(2);
    digitalWrite(RST,LOW);
}

///////////////////////////////////////////////////////////////////
/////////////////////////// SETUP /////////////////////////////////
///////////////////////////////////////////////////////////////////

void setup() {

  
//  pinMode(BUTTON, INPUT_PULLUP);
  pinMode(CLK, OUTPUT);
  pinMode(RST, OUTPUT);
//  digitalWrite(RST,LOW);
  pinMode (LED1, OUTPUT); 
  pinMode (LED2, OUTPUT); 
  pinMode (LED3, OUTPUT); 
  pinMode (LED4, OUTPUT); 
  pinMode (LED5, OUTPUT); 
  pinMode (LED6, OUTPUT); 
  pinMode (LED7, OUTPUT); 
  pinMode (LED8, OUTPUT); 
  pinMode (LED9, OUTPUT); 
  pinMode (LED10, OUTPUT); 
  pinMode (LED11, OUTPUT); 
  pinMode (LED12, OUTPUT); 
  pinMode (LED13, OUTPUT); 
  pinMode (LED14, OUTPUT); 
  pinMode (LED15, OUTPUT);
  pinMode (LED16, OUTPUT);
  
  MIDI.setHandleNoteOn(MyHandleNoteOn);
  MIDI.setHandleNoteOff(MyHandleNoteOff);

  MIDI.begin(10); // Listen to channel 10

}

int i=0; //clock counter

int nDiv=12;    // nDiv est la division de la Clock

///////////////////////////////////////////////////////////////////
/////////////////////////// LOOP  /////////////////////////////////
///////////////////////////////////////////////////////////////////

void loop() {

///////////////////////////////////////////////////////////////////
/////////////////////////// CLOCK BUTTON  /////////////////////////
///////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////
/////////////////////////// CLOCK /START  //////////////////////////
///////////////////////////////////////////////////////////////////

  if (MIDI.read()) {                    
    byte type = MIDI.getType();
    switch (type) {
        
      case midi::Clock:

        i++;                     
        if (i==nDiv){              //Note Value Division
          trCLK();          
          i=0;
          break;
        }
        break;
        
      case midi::Start:
          trRST();
          i=1; 
      break;
  break;
  }

  }
}