Event-based timer interrupts

As you wish.

#include <OpenDeckRewrite.h>
#include <MIDI.h>
#include <HDDJ.h>

//input shift register pins
#define SR_DATA_PIN 8
#define SR_LATCH_PIN 9
#define SR_CLOCK_PIN 10

//output shift register pins
#define LED_DATA_PIN 19
#define LED_CLOCK_PIN 18
#define LED_LATCH_PIN 17

//multiplexer pins
#define SLAVE_S0 4
#define SLAVE_S1 12
#define SLAVE_S2 11

#define MASTER_S0 7
#define MASTER_S1 6
#define MASTER_S2 5

//rotary encoder 1 pins
#define HDDJ1_PIN1 16
#define HDDJ1_PIN2 2

//rotary encoder 2 pins
#define HDDJ2_PIN1 15
#define HDDJ2_PIN2 3

//define interrupt pins for rotary encoders
#define INTERRUPT_PIN_1 0
#define INTERRUPT_PIN_2 1

#define ANALOGUE_READ_PIN 0

//enable DEBUG in OpenDeck.h and define all buttons with leds
#define PLAY_LEFT_NOTE 7
#define PLAY_RIGHT_NOTE 43
#define BROWSER_NOTE 30
#define FILTER_LEFT_NOTE 5
#define FILTER_RIGHT_NOTE 41
#define HIGH_KILL_LEFT_NOTE 22
#define HIGH_KILL_RIGHT_NOTE 25
#define MID_KILL_LEFT_NOTE 17
#define MID_KILL_RIGHT_NOTE 28
#define LOW_KILL_LEFT_NOTE 21
#define LOW_KILL_RIGHT_NOTE 27
#define LEFT_CUE_NOTE 18
//#define RIGHT_CUE_NOTE 20
#define FX_1_LEFT_NOTE 11
#define FX_2_LEFT_NOTE 2
#define FX_1_RIGHT_NOTE 46
#define FX_2_RIGHT_NOTE 36
#define FX_LEFT_BUTTON_1_NOTE 20
#define FX_LEFT_BUTTON_2_NOTE 16
#define FX_LEFT_BUTTON_3_NOTE 19
#define FX_RIGHT_BUTTON_1_NOTE 31
#define FX_RIGHT_BUTTON_2_NOTE 26
#define FX_RIGHT_BUTTON_3_NOTE 29

//define LED numbers for buttons
#define PLAY_LEFT_LED 8
#define PLAY_RIGHT_LED 3
#define BROWSER_LED 16
#define FILTER_LEFT_LED 0
#define FILTER_RIGHT_LED 24
#define HIGH_KILL_LEFT_LED 22
#define HIGH_KILL_RIGHT_LED 25
#define MID_KILL_LEFT_LED 17
#define MID_KILL_RIGHT_LED 28
#define LOW_KILL_LEFT_LED 21
#define LOW_KILL_RIGHT_LED 27
#define LEFT_CUE_LED 1
#define FX_1_LEFT_LED 4
#define FX_2_LEFT_LED 6
#define FX_1_RIGHT_LED 46
#define FX_2_RIGHT_LED 36
#define FX_LEFT_BUTTON_1_LED 7
#define FX_LEFT_BUTTON_2_LED 9
#define FX_LEFT_BUTTON_3_LED 2
#define FX_RIGHT_BUTTON_1_LED 31
#define FX_RIGHT_BUTTON_2_LED 26
#define FX_RIGHT_BUTTON_3_LED 29

//define LEDs which blink when pressed
#define BLINK_LED_1 PLAY_LEFT_LED
#define BLINK_LED_2 PLAY_RIGHT_LED

OpenDeckRewrite openDeck(SR_LATCH_PIN, SR_CLOCK_PIN, SR_DATA_PIN, 
                        LED_DATA_PIN, LED_CLOCK_PIN, LED_LATCH_PIN, 
                        SLAVE_S0, SLAVE_S1, SLAVE_S2, 
                        MASTER_S0, MASTER_S1, MASTER_S2, 
                        ANALOGUE_READ_PIN);
                                          
HDDJ hddj1 = HDDJ(HDDJ1_PIN1, HDDJ1_PIN2);
HDDJ hddj2 = HDDJ(HDDJ2_PIN1, HDDJ2_PIN2);

void setup() {

  //initialize Timer1
  //disable global interrupts
  cli();
  //set entire TCCR1A register to 0
  TCCR1A = 0;
  //same for TCCR1B
  TCCR1B = 0;
  //set compare match register to desired timer count
  OCR1A = 15624;
  //turn on CTC mode
  TCCR1B |= (1 << WGM12);
  //set CS10 and CS12 bits for 1024 prescaler:
  TCCR1B |= (1 << CS10);
  TCCR1B |= (1 << CS12);
  //enable timer compare interrupt:
  TIMSK1 |= (1 << OCIE1A);
  //enable global interrupts
  sei();
  
  //initialise all pins
  initPins();
  //turn off all leds
  openDeck.resetLEDs();
  
  //set interrupt pins for rotary encoders
  attachInterrupt(INTERRUPT_PIN_1, startEncoder0, CHANGE);
  attachInterrupt(INTERRUPT_PIN_2, startEncoder1, CHANGE);
  
  //read incoming MIDI messages on channel 6
  MIDI.begin(6);
  //define funnction for handling incoming MIDI data
  MIDI.setHandleNoteOn(callSetLEDstate);
  
  //assign index to each disk so we could differentiate them
  hddj1.setDiskNumber(0);
  hddj2.setDiskNumber(1);
  
  //start serial
  Serial.begin(115200);
  
}

void loop() {
  
  //read incoming MIDI data
  MIDI.read();
  //get data from shift registers
  openDeck.readButtons();
  //get data from potentiometers
  openDeck.readPotentiometers(); 
}


void startEncoder0() {
  hddj1.readRotaryEncoder();
}

void startEncoder1() {
  hddj2.readRotaryEncoder();
}

void callSetLEDstate(byte channel, byte pitch, byte velocity) {
 
 switch(pitch) {
  
  case PLAY_LEFT_NOTE:
  openDeck.changeBlinkState(0, velocity);
  break;
  
  case PLAY_RIGHT_NOTE:
  openDeck.changeBlinkState(1, velocity);
  break;
  
  case BROWSER_NOTE:
  openDeck.setLEDstate(BROWSER_LED, velocity);
  break;
  
  case FILTER_LEFT_NOTE:
  openDeck.setLEDstate(FILTER_LEFT_LED, velocity);
  break;
  
  case FILTER_RIGHT_NOTE:
  openDeck.setLEDstate(FILTER_RIGHT_LED, velocity);
  break;
  
  case HIGH_KILL_LEFT_NOTE:
  openDeck.setLEDstate(HIGH_KILL_LEFT_LED, velocity);
  break;
  
  case HIGH_KILL_RIGHT_NOTE:
  openDeck.setLEDstate(HIGH_KILL_RIGHT_LED, velocity);
  break;
  
  case MID_KILL_LEFT_NOTE:
  openDeck.setLEDstate(MID_KILL_LEFT_LED, velocity);
  break;
  
  case MID_KILL_RIGHT_NOTE:
  openDeck.setLEDstate(MID_KILL_RIGHT_LED, velocity);
  break;
  
  case LOW_KILL_LEFT_NOTE:
  openDeck.setLEDstate(LOW_KILL_LEFT_LED, velocity);
  break;
  
  case LOW_KILL_RIGHT_NOTE:
  openDeck.setLEDstate(LOW_KILL_RIGHT_LED, velocity);
  break;
  
  case LEFT_CUE_NOTE:
  openDeck.setLEDstate(LEFT_CUE_LED, velocity);
  break;
  
  case FX_1_LEFT_NOTE:
  openDeck.setLEDstate(FX_1_LEFT_LED, velocity);
  break;
  
  case FX_2_LEFT_NOTE:
  openDeck.setLEDstate(FX_2_LEFT_LED, velocity);
  break;
  
  case FX_1_RIGHT_NOTE:
  openDeck.setLEDstate(FX_1_RIGHT_LED, velocity);
  break;
  
  case FX_2_RIGHT_NOTE:
  openDeck.setLEDstate(FX_2_RIGHT_LED, velocity);
  break;
  
  case FX_LEFT_BUTTON_1_NOTE:
  openDeck.setLEDstate(FX_LEFT_BUTTON_1_LED, velocity);
  break;
  
  case FX_LEFT_BUTTON_2_NOTE:
  openDeck.setLEDstate(FX_LEFT_BUTTON_2_LED, velocity);
  break;
  
  case FX_LEFT_BUTTON_3_NOTE:
  openDeck.setLEDstate(FX_LEFT_BUTTON_3_LED, velocity);
  break;
  
  case FX_RIGHT_BUTTON_1_NOTE:
  openDeck.setLEDstate(FX_RIGHT_BUTTON_1_LED, velocity);
  break;
  
  case FX_RIGHT_BUTTON_2_NOTE:
  openDeck.setLEDstate(FX_RIGHT_BUTTON_2_LED, velocity);
  break;
  
  case FX_RIGHT_BUTTON_3_NOTE:
  openDeck.setLEDstate(FX_RIGHT_BUTTON_3_LED, velocity);
  break;
  
  default:
  break;

 }
}

void initPinsDigitalInput() {
  
   pinMode(SR_DATA_PIN, INPUT);
   pinMode(SR_CLOCK_PIN, OUTPUT);
   pinMode(SR_LATCH_PIN, OUTPUT);
}

void initPinsAnalogueInput() {
  
   pinMode(SLAVE_S0, OUTPUT);
   pinMode(SLAVE_S1, OUTPUT);
   pinMode(SLAVE_S2, OUTPUT);
   
   pinMode(MASTER_S0, OUTPUT);
   pinMode(MASTER_S1, OUTPUT);
   pinMode(MASTER_S2, OUTPUT);
   
   pinMode(ANALOGUE_READ_PIN, INPUT);
   
   digitalWrite(SLAVE_S0, HIGH);
   digitalWrite(SLAVE_S1, HIGH);
   digitalWrite(SLAVE_S2, HIGH);
   
   digitalWrite(MASTER_S0, HIGH);
   digitalWrite(MASTER_S1, HIGH);
   digitalWrite(MASTER_S2, HIGH);
   
   pinMode(A1, OUTPUT);
   pinMode(A2, OUTPUT);
   pinMode(A3, OUTPUT);
   
   digitalWrite(A1, LOW);
   digitalWrite(A2, LOW);
   digitalWrite(A3, LOW);
   
}

void initPinsDigitalOutput() {
  
  pinMode(LED_DATA_PIN, OUTPUT);
  pinMode(LED_CLOCK_PIN, OUTPUT);
  pinMode(LED_LATCH_PIN, OUTPUT);

}

void initRotaryEncPins() {
 
  pinMode(HDDJ1_PIN1, INPUT);
  pinMode(HDDJ1_PIN2, INPUT);
  pinMode(HDDJ2_PIN1, INPUT);
  pinMode(HDDJ2_PIN2, INPUT);
  
}

void initPins() {
  
  initPinsDigitalInput();
  initPinsAnalogueInput();
  initPinsDigitalOutput();
  initRotaryEncPins();
  
}

ISR(TIMER1_COMPA_vect)
{
    openDeck.blinkLED(BLINK_LED_1, BLINK_LED_2);
}
//LEDs
void OpenDeckRewrite::writeLEDs() {

  int j = NUMBER_OF_595_REGISTERS*8;

   digitalWrite(_led_latchPin, LOW);

  for (i=0; i<NUMBER_OF_595_REGISTERS*8; i++)    {
    digitalWrite(_led_clockPin, LOW);
    digitalWrite(_led_dataPin, ledState[--j]);
    digitalWrite(_led_clockPin, HIGH);
  }

  digitalWrite(_led_latchPin, HIGH);

}

void OpenDeckRewrite::allLEDsOn() {

  //turn on all LEDs
  for (int i=0; i<NUMBER_OF_595_REGISTERS*8; i++)   ledState[i] = true;
  writeLEDs();
}

void OpenDeckRewrite::resetLEDs() {

  //turn off all LEDs
  for (int i=0; i<NUMBER_OF_595_REGISTERS*8; i++)   ledState[i] = false;
  writeLEDs();
}

void OpenDeckRewrite::setLEDstate(int led, boolean state) {

    ledState[led] = state;
   openDeck.writeLEDs();
}

void OpenDeckRewrite::changeBlinkState(int ledIndex, boolean state) {

  switch (ledIndex) {

  case 0:
  if (state) blinkLedOn[0] = true;  else blinkLedOn[0] = false;
  break;

  case 1:
  if (state) blinkLedOn[1] = true;  else blinkLedOn[1] = false;
  break;

  default:
  break;

  }
}

void OpenDeckRewrite::blinkLED(int blinkLED_1, int blinkLED_2)  {

    int arrayOfBlinkLeds[NUMBER_OF_BLINK_LEDS] = {blinkLED_1, blinkLED_2};

    for (int i=0; i<NUMBER_OF_BLINK_LEDS; i++) {

    if (blinkLedOn[i]) {

    // if the LED is off turn it on and vice-versa
    ledState[arrayOfBlinkLeds[i]] = !ledState[arrayOfBlinkLeds[i]];
    }

        else ledState[arrayOfBlinkLeds[i]] = false;
  }
openDeck.writeLEDs();
}