ignoring incoming value if it's same as previous incoming value. Or LED freaks out!

Status
Not open for further replies.

nicnut

Well-known member
Hi everyone,

I think it's mostly a coding question.

I have had a lot of trouble figuring out how to send SPI hardware messages from a Teensy 3.6 to an Adafruit TLC5947 board to control RGB LEDs. But that got figured out in this thread:

https://forum.pjrc.com/threads/59605-Teensy-3-6-is-very-slow-for-some-reason

But I am having a new issue. I am using MIDI messages to control these LEDs and change their colors.

I tested this out, if I alternate between two values, to alternate colors, it works great. I can even alternate the values every 10 milliseconds and it seems fine.

However, if I send the same value, even at every 50 milliseconds, the LED freaks out, sometimes even sending messages to other LEDs.

I think this is a coding issue. I tried to make a variable, pled16, that stores the last incoming value for controller 16 and ignores it if its the same a new incoming value. If a new different value comes in then it will send that to setLEDspi(), which will then send that value to SPIwrite(), where all the new LED values will get sent out to the TLC5947.

Is this the best way to write this out? Seems like it's buggy. I'm guessing there is a more elegant solution.

Thank you for taking a look.


Code:
const int channel = 1;
const int MIDIchannel = 1;   // this will only apply to midi channel 1

int  pled16 = 0;       // previous incoming LED value for controller 16

void myControlChange(byte channel, byte control, byte value) 


  if (channel == MIDIchannel) {

 if (control == ledcontroller16) {

    if (value == pled16) {
    
    }

      if ( value == 0)
        setLEDspi( 1, 0, 0, 0);   // off              

      if (value == 10)
        //light pink
        setLEDspi( 1, 90, 2, 10);


      if (value == 20)
        //blue                                           
        setLEDspi( 1, 0, 0, 100);

      if (value == 30)
        //lavender
        setLEDspi( 1, 70, 2, 10);

      if (value == 40)
        //pink                                   
        setLEDspi( 1, 90, 2, 2);

      if (value == 50)
        setLEDspi( 1, 100, 0, 0);       //red           

      if (value == 60)
        setLEDspi( 1, 100, 8, 0);        //orange      

      if (value == 70)
        setLEDspi( 1, 100, 60, 0);     // yellow

      if (value == 80)
        setLEDspi( 1, 0, 100, 0);        // green        

      if (value == 90)
        setLEDspi( 1, 2, 100, 2);        //light green    

      if (value == 100)
        setLEDspi( 1, 0, 50, 20);       //turquoise      

      if (value == 110)
        setLEDspi( 1, 0, 50, 40);        //light blue    

      if (value == 120)
        setLEDspi( 1, 0, 100, 41);    //   aqua turquoise

      if (value == 127)
        setLEDspi( 1, 100, 90, 100);    // white         

        value = pled16;

    }

}


void setLEDspi(uint16_t i, uint16_t r, uint16_t g, uint16_t b) {
  tlc.setLED(i, r, g, b);
  SPIwrite();


void SPIwrite() {
#define TSPEED 1000000 //1Mhz
  unsigned int chan1 = 0;
  unsigned int chan2 = 0;
  byte address1 = 0;
  byte address2 = 0;
  byte address3 = 0;
  SPISettings TLC5947(TSPEED , MSBFIRST, SPI_MODE0);
  // packing each 2 channel (12bit*2) to 3 byte (8bit*3) for transfering
  SPI.beginTransaction(TLC5947);
  // digitalWriteFast(latch, HIGH);
  digitalWriteFast(latch, LOW);
  for (unsigned int ledpos = 24  * NUM_TLC5974 ; ledpos > 0; ledpos = ledpos - 2) {
    chan1 = tlc.getCHAN(ledpos - 1);
    chan2 = tlc.getCHAN(ledpos - 2);
    address1 = (byte)(chan1 >> 4) ;
    address2 = (byte)((chan1 << 4) & (B11110000)) + (byte)((chan2 >> 8) & (B00001111));
    address3 = (byte)chan2;
    /* address1 = B00000000;
      address2 = B00000000;
      address3 = B00000000;*/
    SPI.transfer(address1);
    SPI.transfer(address2);
    SPI.transfer(address3);
  }

  SPI.endTransaction();
  //  digitalWriteFast(latch, LOW);
  digitalWriteFast(latch, HIGH);
  digitalWriteFast(latch, LOW);
  digitalWriteFast(clock, LOW);
}
 
Well i doubt this is the full code, as clock is not defined anywhere. Why exactly are you writing the SPI's clock line anyways? And why are you setting the latch (chipselect) low after the transfer? Is the latch or clock part of the tlc (i dont know that chip) because its definately no way to control the SPI bus behaviour.
 
Hi @tonton81,

I thought I would just post the part of the code relevant to my question so it would be less code to parse through. But I will post the whole thing since you have these questions. Please note that it's a work in progress and that all I am concerned with at the moment is controlling the RGB LEDs. But the incoming midi sensor data is working.

I honestly don't know much at all about SPI. I copied the SPIwrite() function from someone who used it in this forum. If you think I should change digitalWriteFast(latch, LOW); to HIGH I can try that.

The main thing I am trying to figure out is how to ignore an incoming value for an LED if that value equals the last value that came in. If it is different it the code should do something, but if it is the same as the last incoming value it should ignore it.

I plan on encapsualting a lot of this code btw and simplifing it. I just want to figure all this LED and SPI stuff while i am doing that.

Thanks for taking a look.




Code:
#include <Bounce.h>
#include <Adafruit_NeoPixel.h>
#include <Wire.h> // wire library for LED matrix

#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"

#include "Adafruit_TLC5947.h"  // for LED breakout board

//  #include <Adafruit_TLC5947.h>
#include <SPI.h>

const int slaveSelectPin = 10;
#define clock 13 // 10 
#define data 11
#define oe  15  //  12
#define latch  10 // 11
#define NUM_TLC5974 2     // how many LED boards


unsigned long frame;
Adafruit_TLC5947 tlc = Adafruit_TLC5947(NUM_TLC5974, clock, data, latch,  oe);
//unsigned long tick, dur;

// the MIDI channel number to send messages
const int channel = 1;
const int MIDIchannel = 1;   // this will only apply to midi channel 1


// the MIDI continuous controller for each analog input
const int controllerA0 = 1; //  control change 1, ribbon
const int controllerA1 = 2; //control change 2
const int controllerA2 = 3; //control change 3
const int controllerA3 = 4; // control change 4
const int controllerA4 = 5; // control change 5
const int controllerA5 = 6; // control change 6
const int controllerA6 = 7; // control change 7
const int controllerA7 = 8; // control change 8
const int controllerA8 = 9; // control change 9  last ribbon
const int controllerA9 = 10; // control change 10 joystick
const int controllerA10 = 11; // joystick
const int controllerA11 = 12; // control change 12
const int controllerA12 = 13; // control change 13  joystick

const int controllerD14 = 14; // toggle, control change 14
const int controllerD15 = 15; //  Button, control change 15
const int controllerD16 = 16; //
const int controllerD17 = 17;
const int controllerD18 = 18;  //
const int controllerD19 = 19;
const int controllerD20 = 20;
const int controllerD21 = 21;
const int controllerD22 = 22;
const int controllerD23 = 23;
const int controllerD24 = 24;
const int controllerD25 = 25;
const int controllerD26 = 26;
const int controllerD27 = 27;

int pled16 = 0;




// Create Bounce objects for each button.  The Bounce object
// automatically deals with contact chatter or "bounce", and
// it makes detecting changes very simple.
Bounce button0 = Bounce(0, 5);
Bounce button1 = Bounce(1, 5);  // 5 = 5 ms debounce time
Bounce button2 = Bounce(2, 5);  // which is appropriate for good
Bounce button3 = Bounce(3, 5);  // quality mechanical pushbuttons
Bounce button4 = Bounce(4, 5);
Bounce button5 = Bounce(5, 5);  // if a button is too "sensitive"
Bounce button6 = Bounce(6, 5);  // to rapid touch, you can
Bounce button7 = Bounce(7, 5);  // increase this time.
Bounce button8 = Bounce(8, 5);
Bounce button9 = Bounce(9, 5);
Bounce button10 = Bounce(10, 5);
Bounce button11 = Bounce(11, 5);
Bounce button12 = Bounce(12, 5);  // goes out of order because other pins double as analog inputs

Bounce button24 = Bounce(24, 5);
Bounce button25 = Bounce(25, 5);
Bounce button26 = Bounce(26, 5);
Bounce button27 = Bounce(27, 5);

//const int ledPin28 = 28;    // digital pin 28 For LED
//const int ledPin29 = 29;    // digital pin 29 For LED
//const int ledPin30 = 30;    // digital pin 30 For LED
//const int ledPin31 = 31;    // digital pin 29 For LED
//const int ledPin32 = 32;    // digital pin 29 For LED
//const int ledPin33 = 33;    // digital pin 29 For

const int ledcontroller15 = 15;    // midi control change 15
const int ledcontroller16 = 16;    // midi control change 16
const int ledcontroller17 = 17;    // midi control change 15
const int ledcontroller18 = 18;    // midi control change 16
const int ledcontroller19 = 19;    // midi control change 15
const int ledcontroller20 = 20;    // midi control change 16
const int ledcontroller23 = 23;    // midi control change 16

const int numMatrixControllers = 5;
const int firstMatrixController = 76;


// led matrix
Adafruit_7segment matrix = Adafruit_7segment();
// Adafruit_7segment matrix1 = Adafruit_7segment();
Adafruit_8x16matrix matrix2 = Adafruit_8x16matrix();

void setup() {

  pinMode(latch, OUTPUT);
  digitalWrite(latch, LOW);
  pinMode(clock, OUTPUT);
  digitalWrite(clock, LOW);
  pinMode(data, OUTPUT);
  digitalWrite(data, LOW);


  SPI.setCS(10);
  SPI.setMOSI(11);
  SPI.setSCK(13);
  SPI.begin();
  //tlc.begin();

  // Serial.begin(38400); if you don't comment this out the board goes off line

  // wire 3.3V to AREF for 3.3V reference
  analogReference(DEFAULT);

  pinMode(0, INPUT_PULLUP);   // for button swithces
  pinMode(1, INPUT_PULLUP);
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  // pinMode(10, INPUT_PULLUP);
  // pinMode(11, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);
  pinMode(24, INPUT_PULLUP);
  pinMode(25, INPUT_PULLUP);
  pinMode(26, INPUT_PULLUP);
  pinMode(27, INPUT_PULLUP);


  usbMIDI.setHandleControlChange(myControlChange);
  setupLedDisplays();


}

// store previously sent values, to detect changes
int previousA0 = -1;
int previousA1 = -1;
int previousA2 = -1;
int previousA3 = -1;
int previousA4 = -1;
int previousA5 = -1;
int previousA6 = -1;
int previousA7 = -1;
int previousA8 = -1;
int previousA9 = -1;
int previousA10 = -1;
int previousA11 = -1;
int previousA12 = -1;

// store previous LED values



elapsedMillis msec = 0;



void loop() {

  {

    button0.update();    //  this button code works, goes from 0 to 127 when pressed
    button1.update();
    button2.update();
    button3.update();
    button4.update();
    button5.update();
    button6.update();
    button7.update();
    button8.update();
    button9.update();
    button10.update();
    button11.update();
    button12.update();
    button24.update();
    button25.update();
    button26.update();
    button27.update();



    if (button0.fallingEdge()) {                               // this deals with reading the button swithces
      usbMIDI.sendControlChange(controllerD14, 127, channel);
    }

    if (button0.risingEdge()) {
      usbMIDI.sendControlChange(controllerD14, 0, channel);
    }

    if (button1.fallingEdge()) {
      usbMIDI.sendControlChange(controllerD15, 127, channel);
    }

    if (button1.risingEdge()) {
      usbMIDI.sendControlChange(controllerD15, 0, channel);
    }

    if (button2.fallingEdge()) {
      usbMIDI.sendControlChange(controllerD16, 127, channel);
    }

    if (button2.risingEdge()) {
      usbMIDI.sendControlChange(controllerD16, 0, channel);
    }

    if (button3.fallingEdge()) {
      usbMIDI.sendControlChange(controllerD17, 127, channel);
    }

    if (button3.risingEdge()) {
      usbMIDI.sendControlChange(controllerD17, 0, channel);
    }

    if (button4.fallingEdge()) {
      usbMIDI.sendControlChange(controllerD18, 127, channel);
    }

    if (button4.risingEdge()) {
      usbMIDI.sendControlChange(controllerD18, 0, channel);
    }

    if (button5.fallingEdge()) {
      usbMIDI.sendControlChange(controllerD19, 127, channel);
    }

    if (button5.risingEdge()) {
      usbMIDI.sendControlChange(controllerD19, 0, channel);
    }

    if (button6.fallingEdge()) {
      usbMIDI.sendControlChange(controllerD20, 127, channel);
    }

    if (button6.risingEdge()) {
      usbMIDI.sendControlChange(controllerD20, 0, channel);
    }

    if (button7.fallingEdge()) {
      usbMIDI.sendControlChange(controllerD21, 127, channel);
    }

    if (button7.risingEdge()) {
      usbMIDI.sendControlChange(controllerD21, 0, channel);
    }

    if (button8.fallingEdge()) {
      usbMIDI.sendControlChange(controllerD22, 127, channel);
    }

    if (button8.risingEdge()) {
      usbMIDI.sendControlChange(controllerD22, 0, channel);
    }

    if (button9.fallingEdge()) {
      usbMIDI.sendControlChange(controllerD23, 127, channel);
    }

    if (button9.risingEdge()) {
      usbMIDI.sendControlChange(controllerD23, 0, channel);
    }

    if (button10.fallingEdge()) {
      usbMIDI.sendControlChange(controllerD24, 127, channel);
    }

    if (button10.risingEdge()) {
      usbMIDI.sendControlChange(controllerD24, 0, channel);
    }

    if (button11.fallingEdge()) {
      usbMIDI.sendControlChange(controllerD25, 127, channel);
    }

    if (button11.risingEdge()) {
      usbMIDI.sendControlChange(controllerD25, 0, channel);
    }

    if (button12.fallingEdge()) {
      usbMIDI.sendControlChange(controllerD26, 127, channel);
    }

    if (button12.risingEdge()) {
      usbMIDI.sendControlChange(controllerD26, 0, channel);
    }

    if (button24.fallingEdge()) {
      usbMIDI.sendControlChange(controllerD27, 127, channel);
    }

    if (button24.risingEdge()) {
      usbMIDI.sendControlChange(controllerD27, 0, channel);
    }

    /*

      if (button25.fallingEdge()) {
      usbMIDI.sendControlChange(controllerD28, 127, channel);
      }

      if (button25.risingEdge()) {
      usbMIDI.sendControlChange(controllerD28, 0, channel);
      }

      if (button26.fallingEdge()) {
      usbMIDI.sendControlChange(controllerD29, 127, channel);
      }

      if (button26.risingEdge()) {
      usbMIDI.sendControlChange(controllerD29, 0, channel);
      }

      if (button27.fallingEdge()) {
      usbMIDI.sendControlChange(controllerD30, 127, channel);
      }

      if (button27.risingEdge()) {
      usbMIDI.sendControlChange(controllerD30, 0, channel);
      }

    */

  }


  // only check the analog inputs 50 times per second,
  // to prevent a flood of MIDI messages
  if (msec >= 3) {               //  i changed this value to 10 from 20 for faster updates
    msec = 0;

    int n0 = map(analogRead(A0), 0, 1023, 0, 127);
    int n1 = map(analogRead(A1), 0, 1023, 0, 127);
    int n2 = map(analogRead(A2), 0, 1023, 0, 127);
    int n3 = map(analogRead(A3), 0, 1023, 0, 127);
    //  int n4 = map(analogRead(A4), 0, 1023, 0, 127);   //commented this out for SCL0 and SDA0
    //  int n5 = map(analogRead(A5), 0, 1023, 0, 127);
    int n6 = map(analogRead(A6), 0, 1023, 0, 127);
    int n7 = map(analogRead(A7), 0, 1023, 0, 127);
    int n8 = map(analogRead(A8), 0, 1023, 0, 127);
    int n9 = map(analogRead(A9), 0, 1023, 0, 127);
    int n10 = map(analogRead(A14), 0, 1023, 0, 127);
    int n11 = map(analogRead(A15), 0, 1023, 0, 127);
    int n12 = map(analogRead(A16), 0, 1023, 0, 127);


    // only transmit MIDI messages if analog input changed
    if (n0 != previousA0) {
      previousA0 = n0;
      if (n0 < 2) n0 = 0;
      usbMIDI.sendControlChange(controllerA0, n0, channel);
    }

    if (n1 != previousA1) {
      previousA1 = n1;
      if (n1 < 2) n1 = 0;
      usbMIDI.sendControlChange(controllerA1, n1, channel);
    }

    if (n2 != previousA2) {
      previousA2 = n2;
      if (n2 < 2) n2 = 0;
      usbMIDI.sendControlChange(controllerA2, n2, channel);

    }
    if (n3 != previousA3) {
      previousA3 = n3;
      if (n3 < 2) n3 = 0;
      usbMIDI.sendControlChange(controllerA3, n3, channel);
    }

    /*

        if (n4 != previousA4) {
          previousA4 = n4;
          if (n4 < 2) n4 = 0;
          usbMIDI.sendControlChange(controllerA4, n4, channel);

        }

        if (n5 != previousA5) {
          previousA5 = n5;
          if (n5 < 2) n5 = 0;
          usbMIDI.sendControlChange(controllerA5, n5, channel);

        }

    */

    if (n6 != previousA6) {
      previousA6 = n6;
      if (n6 < 2) n6 = 0;
      usbMIDI.sendControlChange(controllerA6, n6, channel);

    }

    if (n7 != previousA7) {
      previousA7 = n7;
      if (n7 < 2) n7 = 0;
      usbMIDI.sendControlChange(controllerA7, n7, channel);

    }

    if (n8 != previousA8) {
      previousA8 = n8;
      if (n8 < 2) n8 = 0;
      usbMIDI.sendControlChange(controllerA8, n8, channel);
    }

    if (n9 != previousA9) {
      previousA9 = n9;
      if (n9 < 3) n9 = 0;
      usbMIDI.sendControlChange(controllerA9, n9, channel);
    }

    if (n10 != previousA10) {
      previousA10 = n10;
      if (n10 < 3) n10 = 0;
      usbMIDI.sendControlChange(controllerA10, n10, channel);
    }

    if (n11 != previousA11) {
      previousA11 = n11;
      if (n11 < 3) n11 = 0;
      usbMIDI.sendControlChange(controllerA11, n11, channel);
    }

    if (n12 != previousA12) {
      previousA12 = n12;
      if (n12 < 3) n12 = 0;
      usbMIDI.sendControlChange(controllerA12, n12, channel);
    }



  }

  // MIDI Controllers should discard incoming MIDI messages.
  // http://forum.pjrc.com/threads/24179-Teensy-3-Ableton-Analog-CC-causes-midi-crash
  while (usbMIDI.read()) {
    // ignore incoming messages
  }
}


/////////////////////////
// TO OPTIMIZE
// NEXT: calculate the color in one set of conditions and the controller in another, and then combine them to send the color
//////////////////////////
void myControlChange(byte channel, byte control, byte value) { // for LEDs, MIDI output

  if (channel == MIDIchannel) {

    if (control == ledcontroller15) {

      if (value == 0)
        tlc.setLED(0, 0, 0, 0);    //off

      if (value == 10)
        tlc.setLED(0, 246, 84, 106);  //light pink

      if (value == 20)
        tlc.setLED(0, 0, 0, 255);        //blue

      if ( value == 30)
        tlc.setLED(0, 90, 0, 255);        //lavender

      if (value == 40)
        tlc.setLED(0, 255, 0, 255);        //pink

      if (value == 50)
        tlc.setLED(0, 255, 0, 0);        //red

      if ( value == 60)
        tlc.setLED(0, 255, 128, 0);        //orange

      if (value == 70)
        tlc.setLED(0, 255, 255, 0);      // yellow

      if (value == 80)
        tlc.setLED(0, 0, 255, 0);        // green

      if (value == 90)
        tlc.setLED(0, 50, 255, 50);        //light green

      if (value == 100)
        tlc.setLED(0, 0, 255, 90);        //turquoise

      if (value == 110)
        tlc.setLED(0, 0, 180, 255);        //light blue

      if (value == 120)
        tlc.setLED(0, 0, 255, 180);   //   aqua turquoise

      if (value == 127)
        tlc.setLED(0, 255, 255, 255);    // white

    }

    /////// new 16

    if (control == ledcontroller16) {

  //  if (value == pled16) {

   //   }

      if ( value == 0)
        setLEDspi( 1, 0, 0, 0);   // off              check

      if (value == 10)
        //light pink
        setLEDspi( 1, 90, 2, 10);


      if (value == 20)
        //blue                                           check
        setLEDspi( 1, 0, 0, 100);

      if (value == 30)
        //lavender
        setLEDspi( 1, 70, 2, 10);

      if (value == 40)
        //pink                                   check
        setLEDspi( 1, 90, 2, 2);

      if (value == 50)
        setLEDspi( 1, 100, 0, 0);       //red           check

      if (value == 60)
        setLEDspi( 1, 100, 8, 0);        //orange      check

      if (value == 70)
        setLEDspi( 1, 100, 60, 0);     // yellow

      if (value == 80)
        setLEDspi( 1, 0, 100, 0);        // green        check

      if (value == 90)
        setLEDspi( 1, 2, 100, 2);        //light green     x

      if (value == 100)
        setLEDspi( 1, 0, 50, 20);       //turquoise       x

      if (value == 110)
        setLEDspi( 1, 0, 50, 40);        //light blue    x

      if (value == 120)
        setLEDspi( 1, 0, 100, 41);    //   aqua turquoise

      if (value == 127)
        setLEDspi( 1, 100, 90, 100);    // white         check

   //  value = pled16;

    }

    ////////   17
    if (control == ledcontroller17 && value == 0)
      tlc.setLED(2, 0, 0, 0);    //off

    if (control == ledcontroller17 && value == 10)
      tlc.setLED(2, 246, 84, 106);  //light pink

    if (control == ledcontroller17 && value == 20)
      tlc.setLED(2, 0, 0, 255);        //blue

    if (control == ledcontroller17 && value == 30)
      tlc.setLED(2, 90, 0, 255);        //lavender

    if (control == ledcontroller17 && value == 40)
      tlc.setLED(2, 255, 0, 255);        //pink

    if (control == ledcontroller17 && value == 50)
      tlc.setLED(2, 255, 0, 0);        //red

    if (control == ledcontroller17 && value == 60)
      tlc.setLED(2, 255, 128, 0);        //orange

    if (control == ledcontroller17 && value == 70)
      tlc.setLED(2, 255, 255, 0);      // yellow

    if (control == ledcontroller17 && value == 80)
      tlc.setLED(2, 0, 255, 0);        // green

    if (control == ledcontroller17 && value == 90)
      tlc.setLED(2, 50, 255, 50);        //light green

    if (control == ledcontroller17 && value == 100)
      tlc.setLED(2, 0, 255, 90);        //turquoise

    if (control == ledcontroller17 && value == 110)
      tlc.setLED(2, 0, 180, 255);        //light blue

    if (control == ledcontroller17 && value == 120)
      tlc.setLED(2, 0, 255, 180);   //   aqua turquoise

    if (control == ledcontroller17 && value == 127)
      tlc.setLED(2, 255, 255, 255);    // white


    /////   new 18
    if (control == ledcontroller18 && value == 0)
      tlc.setLED(3, 0, 0, 0);    //off

    if (control == ledcontroller18 && value == 10)
      tlc.setLED(3, 246, 84, 106);  //light pink

    if (control == ledcontroller18 && value == 20)
      tlc.setLED(3, 0, 0, 255);        //blue

    if (control == ledcontroller18 && value == 30)
      tlc.setLED(3, 90, 0, 255);        //lavender

    if (control == ledcontroller18 && value == 40)
      tlc.setLED(3, 255, 0, 255);        //pink

    if (control == ledcontroller18 && value == 50)
      tlc.setLED(3, 255, 0, 0);        //red

    if (control == ledcontroller18 && value == 60)
      tlc.setLED(3, 255, 128, 0);        //orange

    if (control == ledcontroller18 && value == 70)
      tlc.setLED(3, 255, 255, 0);      // yellow

    if (control == ledcontroller18 && value == 80)
      tlc.setLED(3, 0, 255, 0);        // green

    if (control == ledcontroller18 && value == 90)
      tlc.setLED(3, 50, 255, 50);        //light green

    if (control == ledcontroller18 && value == 100)
      tlc.setLED(3, 0, 255, 90);        //turquoise

    if (control == ledcontroller18 && value == 110)
      tlc.setLED(3, 0, 180, 255);        //light blue

    if (control == ledcontroller18 && value == 120)
      tlc.setLED(3, 0, 255, 180);   //   aqua turquoise

    if (control == ledcontroller18 && value == 127)
      tlc.setLED(3, 255, 255, 255);    // white


    ////////// 23
    if (control == ledcontroller23 && value == 0)
      tlc.setLED(8, 0, 0, 0);    //off

    if (control == ledcontroller23 && value == 10)
      tlc.setLED(8, 246, 84, 106);  //light pink

    if (control == ledcontroller23 && value == 20)
      tlc.setLED(8, 0, 0, 255);        //blue

    if (control == ledcontroller23 && value == 30)
      tlc.setLED(8, 90, 0, 255);        //lavender

    if (control == ledcontroller23 && value == 40)
      tlc.setLED(8, 255, 0, 255);        //pink

    if (control == ledcontroller23 && value == 50)
      tlc.setLED(8, 255, 0, 0);        //red

    if (control == ledcontroller23 && value == 60)
      tlc.setLED(8, 255, 128, 0);        //orange

    if (control == ledcontroller23 && value == 70)
      tlc.setLED(8, 255, 255, 0);      // yellow

    if (control == ledcontroller23 && value == 80)
      tlc.setLED(8, 0, 255, 0);        // green

    if (control == ledcontroller23 && value == 90)
      tlc.setLED(8, 50, 255, 50);        //light green

    if (control == ledcontroller23 && value == 100)
      tlc.setLED(8, 0, 255, 90);        //turquoise

    if (control == ledcontroller23 && value == 110)
      tlc.setLED(8, 0, 180, 255);        //light blue

    if (control == ledcontroller23 && value == 120)
      tlc.setLED(8, 0, 255, 180);   //   aqua turquoise

    if (control == ledcontroller23 && value == 127)
      tlc.setLED(8, 255, 255, 255);    // white

    // write LED changes
    //   tlc.write();

    // SPIwrite();

    // handle matrix
    if (control >= firstMatrixController && control < (firstMatrixController + numMatrixControllers))
      handleMatrix(control, value);

  }
}

void setLEDspi(uint16_t i, uint16_t r, uint16_t g, uint16_t b) {
 tlc.setLED(i,r, g, b);
  SPIwrite();

}

/////////////////////////
// TO OPTIMIZE
// NEXT: reduce number of conditions by grouping and encapulating like in the myControlChange function
//////////////////////////
void handleMatrix(byte number, byte value)



{
  if (number == 76 && value == 0) {
    display11Clear();
  }

  else if (number == 76 && value == 127) {
    display11Full();
  }

  else if (number == 76 && value == 1) {
    display11Ascending();
  }

  else if (number == 76 && value == 0) {
    display11Clear();
  }
  else if (number == 76 && value == 2) {
    display11Descending();
  }

  else if (number == 76 && value == 3) {
    display12Ascending();
  }
  else if (number == 76 && value == 4) {
    display12Descending();
  }

  else if (number == 76 && value == 5) {
    display13Ascending();
  }
  else if (number == 76 && value == 6) {
    display13Descending();
  }
  else if (number == 76 && value == 7) {
    display14Ascending();
  }
  else if (number == 76 && value == 8) {
    display14Descending();
  }
  else if (number == 76 && value == 9) {
    display15Ascending();
  }
  else if (number == 76 && value == 10) {
    display15Descending();
  }

  else if (number == 76 && value == 11) {
    display16Ascending();
  }
  else if (number == 76 && value == 12) {
    display16Descending();
  }

  else if (number == 76 && value == 13) {
    display17Ascending();
  }

  else if (number == 76 && value == 14) {
    display18Ascending();
  }

  else if (number == 76 && value == 15) {
    display19Ascending();
  }

  else if (number == 76 && value == 16) {
    display19Descending();
  }

  else if (number == 76 && value == 17) {
    display110Ascending();
  }

  else if (number == 76 && value == 18) {
    display110Descending();
  }

  else if (number == 76 && value == 19) {
    display111Ascending();
  }

  else if (number == 76 && value == 20) {
    display111Descending();
  }

  else if (number == 76 && value == 21) {
    display112Ascending();
  }

  else if (number == 76 && value == 22) {
    display112Descending();
  }

  else if (number == 76 && value == 23) {
    display113Ascending();
  }

  else if (number == 76 && value == 24) {
    display113Descending();
  }

  else if (number == 76 && value == 25) {
    display114Ascending();
  }

  else if (number == 76 && value == 26) {
    display114Descending();
  }

  else if (number == 76 && value == 27) {
    display115Ascending();
  }

  else if (number == 76 && value == 28) {
    display115Descending();
  }

  else if (number == 76 && value == 29) {
    display116Ascending();
  }

  else if (number == 76 && value == 30) {
    display116Descending();
  }

  else if (number == 76 && value == 31) {
    display117Ascending();
  }

  else if (number == 76 && value == 32) {
    display117Descending();
  }

  else if (number == 76 && value == 33) {
    display118Ascending();
  }

  else if (number == 76 && value == 34) {
    display119Ascending();
  }

  else if (number == 76 && value == 35) {
    display120Ascending();
  }

  else if (number == 76 && value == 36) {
    display121Ascending();
  }

  else if (number == 76 && value == 37) {
    display121Descending();
  }

  else if (number == 76 && value == 38) {
    display122Ascending();
  }

  else if (number == 76 && value == 39) {
    display122Descending();
  }

  else if (number == 76 && value == 40) {
    display123Ascending();
  }

  else if (number == 76 && value == 41) {
    display123Descending();
  }

  else if (number == 76 && value == 42) {
    display124Ascending();
  }

  else if (number == 76 && value == 43) {
    display124Descending();
  }

  else if (number == 76 && value == 44) {
    display125Ascending();
  }

  else if (number == 76 && value == 45) {
    display125Descending();
  }


  else if (number == 76 && value == 46) {
    display126Ascending();
  }

  else if (number == 76 && value == 47) {
    display126Descending();
  }


  else if (number == 76 && value == 48) {
    display127Ascending();
  }

  else if (number == 76 && value == 49) {
    display127Descending();
  }

  else if (number == 76 && value == 50) {
    display128Ascending();
  }

  else if (number == 76 && value == 51) {
    display128Descending();
  }

  else if (number == 76 && value == 52) {
    display129Ascending();
  }

  else if (number == 76 && value == 53) {
    display130Ascending();
  }

  else if (number == 76 && value == 54) {
    display131Ascending();
  }

  else if (number == 76 && value == 55) {
    display131Descending();
  }

  else if (number == 76 && value == 56) {
    display132Ascending();
  }

  else if (number == 76 && value == 57) {
    display133Ascending();
  }

  else if (number == 76 && value == 58) {
    display134Ascending();
  }

  else if (number == 76 && value == 59) {
    display135Ascending();
  }

  else if (number == 76 && value == 60) {
    display135Descending();
  }

  else if (number == 76 && value == 61) {
    display136Ascending();
  }


  else if (number == 76 && value == 62) {
    display137Ascending();
  }

  else if (number == 76 && value == 63) {
    display137Descending();
  }

  else if (number == 76 && value == 64) {
    display138Ascending();
  }

  else if (number == 76 && value == 65) {
    display138Descending();
  }

  else if (number == 76 && value == 66) {
    display139Ascending();
  }

  else if (number == 76 && value == 67) {
    display140Ascending();
  }

  else if (number == 76 && value == 68) {
    display141Ascending();
  }

  else if (number == 76 && value == 69) {
    display142Ascending();
  }

  else if (number == 76 && value == 70) {
    display143Ascending();
  }

  else if (number == 76 && value == 71) {
    display143Descending();
  }

  else if (number == 76 && value == 72) {
    display144Ascending();
  }

  else if (number == 76 && value == 73) {   // 6animation
    display145Ascending();
  }

  else if (number == 76 && value == 74) {
    display146Ascending();
  }

  else if (number == 76 && value == 75) {
    display147Ascending();
  }

  else if (number == 76 && value == 76) {
    display148Ascending();
  }

  else if (number == 76 && value == 77) {
    display148Descending();
  }

  else if (number == 76 && value == 78) {
    display149Ascending();
  }

  else if (number == 76 && value == 79) {
    display150Ascending();
  }

  else if (number == 76 && value == 80) {
    display151Ascending();
  }

  else if (number == 76 && value == 81) {
    display152Ascending();
  }

  else if (number == 76 && value == 82) {
    display152Descending();
  }

  else if (number == 76 && value == 83) {
    display153Ascending();
  }

  else if (number == 76 && value == 84) {
    display154Ascending();
  }

  else if (number == 76 && value == 85) {
    display155Ascending();
  }

  else if (number == 76 && value == 86) {
    display156Ascending();
  }

  else if (number == 76 && value == 87) {
    display156Descending();
  }

  else if (number == 76 && value == 88) {
    display157Ascending();
  }

  else if (number == 76 && value == 89) {
    display157Descending();
  }

  else if (number == 76 && value == 90) {
    display158Ascending();
  }

  else if (number == 76 && value == 91) {
    display159Ascending();
  }

  else if (number == 76 && value == 92) {
    display160Ascending();
  }

  else if (number == 76 && value == 93) {
    display161Ascending();
  }

  else if (number == 76 && value == 94) {
    display161Descending();
  }

  else if (number == 76 && value == 95) {
    display162Ascending();
  }

  else if (number == 76 && value == 96) {
    display162Descending();
  }

  else if (number == 76 && value == 97) {
    display163Ascending();
  }

  else if (number == 76 && value == 98) {
    display164Ascending();
  }

  else if (number == 76 && value == 99) {
    display165Ascending();
  }

  else if (number == 76 && value == 100) {
    display166Ascending();
  }

  else if (number == 76 && value == 101) {
    display167Ascending();
  }

  else if (number == 76 && value == 102) {
    display168Ascending();
  }

  else if (number == 76 && value == 103) {
    display169Ascending();
  }

  else if (number == 76 && value == 104) {
    display170Ascending();
  }

  else if (number == 76 && value == 105) {
    display171Ascending();
  }
  else if (number == 76 && value == 106) {
    display172Ascending();
  }
  else if (number == 76 && value == 107) {
    display173Ascending();
  }
  else if (number == 76 && value == 108) {
    display174Ascending();
  }
  else if (number == 76 && value == 109) {
    display175Ascending();
  }
  else if (number == 76 && value == 110) {
    display176Ascending();
  }
  else if (number == 76 && value == 111) {
    display177Ascending();
  }
  else if (number == 76 && value == 112) {
    display178Ascending();
  }
  else if (number == 76 && value == 113) {
    display179Ascending();
  }
  else if (number == 76 && value == 114) {
    display180Ascending();
  }
  else if (number == 76 && value == 115) {
    display181Ascending();
  }
  else if (number == 76 && value == 116) {
    display182Ascending();
  }
  else if (number == 76 && value == 117) {
    display182Descending();
  }
  else if (number == 76 && value == 118) {
    display183Ascending();
  }
  else if (number == 76 && value == 119) {
    display184Ascending();
  }
  else if (number == 76 && value == 120) {
    display185Ascending();
  }
  else if (number == 76 && value == 121) {
    display186Ascending();
  }
  else if (number == 76 && value == 122) {
    display187Ascending();
  }
  else if (number == 76 && value == 123) {
    display188Ascending();
  }
  else if (number == 76 && value == 124) {
    display188Descending();
  }
  else if (number == 76 && value == 125) {
    display189Ascending();
  }
  else if (number == 76 && value == 126) {
    display190Ascending();
  }
  if (number == 77 && value == 0) {
    display31Clear();
  }
  else if (number == 77 && value == 127) {
    display31Full();
  }
  else if (number == 77 && value == 126) {
    display31Randomx();
  }
  else if (number == 77 && value == 125) {
    display31Rpp();
  }
  else if (number == 77 && value == 124) {
    display31Rpp2();
  }
  else if (number == 77 && value == 123) {
    display31Rpp4();
  }
  else if (number == 77 && value == 122) {
    display31Rpp8();
  }
  else if (number == 77 && value == 121) {
    display31Rss();
  }
  else if (number == 77 && value == 120) {
    display31Rsr();

  }
  else if (number == 77 && value == 119) {
    display31Rsc();
  }
  else if (number == 77 && value == 118) {
    display31Rbs();
  }
  else if (number == 77 && value == 117) {
    display31R4c();
  }
  else if (number == 77 && value == 116) {
    display31R4cs();
  }
  else if (number == 77 && value == 115) {
    display31Twoblockssmall();
  }
  else if (number == 77 && value == 114) {
    display31Twoblocksverysmall();
  }
  else if (number == 77 && value == 113) {
    display31Twocirclesb();
  }
  else if (number == 77 && value == 112) {
    display31Twocircles();
  }
  else if (number == 77 && value == 111) {
    display31randomlsquare();
  }
  else if (number == 77 && value == 110) {
    display31random2lines();
  }
  else if (number == 77 && value == 109) {
    display31random4lines();
  }
  else if (number == 77 && value == 108) {
    display31twonoisesquare();
  }
  else if (number == 77 && value == 107) {
    display31fournoisesquare();
  }
  else if (number == 77 && value == 106) {
    display31fournoiseblocks();
  }
  else if (number == 77 && value == 105) {
    display32Ascending();
  }
  else if (number == 77 && value == 104) {
    display33Ascending();
  }
  else if (number == 77 && value == 103) {
    display34Ascending();
  }
  else if (number == 77 && value == 102) {
    display34Descending();
  }
  else if (number == 77 && value == 101) {
    display35Ascending();
  }
  else if (number == 77 && value == 100) {
    display36Ascending();
  }
  else if (number == 77 && value == 99) {
    display37Ascending();
  }
  else if (number == 77 && value == 98) {
    display38Ascending();
  }
  else if (number == 77 && value == 97) {
    display38Descending();
  }
  else if (number == 77 && value == 96) {
    display39Ascending();
  }
  else if (number == 77 && value == 95) {
    display391Ascending();
  }
  else if (number == 77 && value == 94) {
    display392Ascending();
  }
  else if (number == 77 && value == 93) {
    display393Ascending();
  }
  else if (number == 77 && value == 92) {
    display394Ascending();
  }
  else if (number == 77 && value == 91) {
    display395Ascending();
  }
  else if (number == 77 && value == 90) {
    display396Ascending();
  }
  else if (number == 77 && value == 89) {
    display396Descending();
  }
  else if (number == 77 && value == 88) {
    display310Ascending();
  }
  else if (number == 77 && value == 87) {
    display310Descending();
  }
  else if (number == 77 && value == 86) {
    display311Ascending();
  }
  else if (number == 77 && value == 85) {
    display311Descending();
  }
  else if (number == 77 && value == 84) {
    display312Ascending();
  }
  else if (number == 77 && value == 83) {
    display313Ascending();
  }
  else if (number == 77 && value == 82) {
    display314Ascending();
  }
  else if (number == 77 && value == 81) {
    display314Descending();
  }
  else if (number == 77 && value == 80) {
    display315Ascending();
  }
  else if (number == 77 && value == 79) {
    display315Descending();
  }
  else if (number == 77 && value == 78) {
    display316Ascending();
  }
  else if (number == 77 && value == 77) {
    display317Ascending();
  }
  else if (number == 77 && value == 76) {
    display317Descending();
  }
  else if (number == 77 && value == 75) {
    display318Ascending();
  }
  else if (number == 77 && value == 74) {
    display318Descending();
  }
  else if (number == 77 && value == 73) {
    display319Ascending();
  }
  else if (number == 77 && value == 72) {
    display320Ascending();
  }
  else if (number == 77 && value == 71) {
    display320Descending();
  }
  else if (number == 77 && value == 70) {
    display321Ascending();
  }
  else if (number == 77 && value == 69) {
    display321Descending();
  }
  else if (number == 77 && value == 68) {
    display322Ascending();
  }
  else if (number == 77 && value == 67) {
    display322Descending();
  }
  else if (number == 77 && value == 66) {
    display323Ascending();
  }
  else if (number == 77 && value == 65) {
    display323Descending();
  }
  else if (number == 77 && value == 64) {
    display324Ascending();
  }
  else if (number == 77 && value == 63) {
    display324Descending();
  }
  else if (number == 77 && value == 62) {
    display325Ascending();
  }
  else if (number == 77 && value == 61) {
    display325Descending();
  }
  else if (number == 77 && value == 60) {
    display326Ascending();
  }
  else if (number == 77 && value == 59) {
    display326Descending();
  }
  else if (number == 77 && value == 58) {
    display327Ascending();
  }
  else if (number == 77 && value == 57) {
    display327Descending();
  }
  else if (number == 77 && value == 56) {
    display328Ascending();
  }
  else if (number == 77 && value == 55) {
    display328Descending();
  }
  else if (number == 77 && value == 54) {   //triangls5
    display329Ascending();
  }
  else if (number == 77 && value == 53) {   //triangls4
    display330Ascending();
  }
  else if (number == 77 && value == 52) {   //triangls3
    display331Ascending();
  }
  else if (number == 77 && value == 51) {   //2randHorrectangles
    display332Ascending();
  }
  else if (number == 77 && value == 50) {   //triangleMove_rect
    display333Ascending();
  }
  else if (number == 77 && value == 49) {   //diamonds
    display3344Ascending();
  }
  else if (number == 77 && value == 48) {   //diamonds2
    display334Ascending();
  }
  else if (number == 77 && value == 47) {   //triangle5
    display335Ascending();
  }
  else if (number == 77 && value == 46) {   //triangle5Desc
    display335Descending();
  }

  else if (number == 77 && value == 45) {   //triangle4
    display336Ascending();
  }
  else if (number == 77 && value == 44) {   //triangle3
    display337Ascending();
  }
  else if (number == 77 && value == 43) {   //triangle3Desc
    display337Descending();
  }
  else if (number == 77 && value == 42) {   //triangle2Rotate
    display338Ascending();
  }
  else if (number == 77 && value == 41) {   //triangle2
    display339Ascending();
  }
  else if (number == 77 && value == 40) {   //triangle2Desc
    display339Descending();
  }
  else if (number == 77 && value == 39) {   //triangle1
    display340Ascending();
  }
  else if (number == 77 && value == 38) {   //triangle1Desc
    display340Descending();
  }
  else if (number == 77 && value == 37) {   //triangle_rect
    display341Ascending();
  }
  else if (number == 77 && value == 36) {   //transform
    display342Ascending();
  }
  else if (number == 77 && value == 35) {   //stretched_circle
    display343Ascending();
  }
  else if (number == 77 && value == 34) {   //star3
    display344Ascending();
  }
  else if (number == 77 && value == 33) {   //star2
    display345Ascending();
  }
  else if (number == 77 && value == 32) {   //squares
    display346Ascending();
  }
  else if (number == 77 && value == 31) {   //rectround1
    display347Ascending();
  }
  else if (number == 77 && value == 30) {   //rect6
    display348Ascending();
  }
  else if (number == 77 && value == 29) {   //rect5
    display349Ascending();
  }
  else if (number == 77 && value == 28) {   //rect5Desc
    display349Descending();
  }
  else if (number == 77 && value == 27) {   //rect4
    display350Ascending();
  }
  else if (number == 77 && value == 26) {   //rect3
    display351Ascending();
  }
  else if (number == 77 && value == 25) {   //rect2
    display352Ascending();
  }
  else if (number == 77 && value == 24) {   //rect1
    display353Ascending();
  }
  else if (number == 77 && value == 23) {   //rect1Desc
    display353Descending();
  }
  else if (number == 77 && value == 22) {   //pixelLtoR
    display354Ascending();
  }
  else if (number == 77 && value == 21) {   //pixel2
    display355Ascending();
  }
  else if (number == 77 && value == 20) {   //pixel1
    display356Ascending();
  }
  else if (number == 77 && value == 19) {   //pillars2
    display357Ascending();
  }
  else if (number == 77 && value == 18) {   //pillars1
    display358Ascending();
  }
  else if (number == 77 && value == 17) {   //moving_circle
    display359Ascending();
  }
  else if (number == 77 && value == 16) {   //lines91
    display360Ascending();
  }
  else if (number == 77 && value == 15) {   //Ex
    display361Ascending();
  }
  else if (number == 77 && value == 14) {   //ExDesc
    display361Descending();
  }
  else if (number == 77 && value == 13) {   //Ex2
    display362Ascending();
  }
  else if (number == 77 && value == 12) {   //circles_transform
    display363Ascending();
  }
  else if (number == 77 && value == 11) {   //circles_stripe
    display364Ascending();
  }
  else if (number == 77 && value == 10) {   //circle1
    display365Ascending();
  }
  else if (number == 77 && value == 9) {   //_4randvertlines2
    display366Ascending();
  }
  else if (number == 77 && value == 8) {   //_4randvertlines
    display367Ascending();
  }
  else if (number == 77 && value == 7) {   //_4randHorrectangles
    display368Ascending();
  }
  else if (number == 77 && value == 6) {   //_3randrec
    display369Ascending();
  }
  else if (number == 77 && value == 5) {   //_3circles
    display370Ascending();
  }
  else if (number == 77 && value == 4) {   //_2windmills2
    display371Ascending();
  }
  else if (number == 77 && value == 3) {   //_2randvertlines
    display372Ascending();
  }
  else if (number == 77 && value == 2) {   //_2randrec_line
    display373Ascending();
  }
  else if (number == 77 && value == 1) {   //_2randhorlines
    display374Ascending();
  }

  else if (number == 78 && value == 1) {   // A
    displayA1();
  }

  else if (number == 78 && value == 2) {   // B
    displayB1();
  }

  else if (number == 78 && value == 3) {   //
    displayC1();
  }

  else if (number == 78 && value == 4) {   //
    displayD1();
  }

  else if (number == 78 && value == 5) {   // A
    displayE1();
  }

  else if (number == 78 && value == 6) {   // B
    displayF1();
  }

  else if (number == 78 && value == 7) {   //
    displayG1();
  }

  else if (number == 78 && value == 8) {   //
    displayH1();
  }

  else if (number == 78 && value == 9) {   //
    displayI1();
  }

  else if (number == 78 && value == 10) {   //
    displayJ1();
  }

  else if (number == 78 && value == 11) {   // A
    displayK1();
  }

  else if (number == 78 && value == 12) {   // B
    displayL1();
  }

  else if (number == 78 && value == 13) {   //
    displayM1();
  }

  else if (number == 78 && value == 14) {   //
    displayN1();
  }

  else if (number == 78 && value == 15) {   // A
    displayO1();
  }

  else if (number == 78 && value == 16) {   // B
    displayP1();
  }

  else if (number == 78 && value == 17) {   //
    displayQ1();
  }

  else if (number == 78 && value == 18) {   //
    displayR1();
  }

  else if (number == 78 && value == 19) {   // A
    displayS1();
  }

  else if (number == 78 && value == 20) {   // B
    displayT1();
  }

  else if (number == 78 && value == 21) {   //
    displayU1();
  }

  else if (number == 78 && value == 22) {   //
    displayV1();
  }

  else if (number == 78 && value == 23) {   // A
    displayW1();
  }

  else if (number == 78 && value == 24) {   // B
    displayX1();
  }

  else if (number == 78 && value == 25) {   //
    displayY1();
  }

  else if (number == 78 && value == 26) {   //
    displayZ1();
  }

  else if (number == 78 && value == 27) {   //  lower case a
    displaya2();
  }

  else if (number == 78 && value == 28) {   //
    displayb2();
  }

  else if (number == 78 && value == 29) {   // A
    displayc2();
  }

  else if (number == 78 && value == 30) {   // B
    displayd2();
  }

  else if (number == 78 && value == 31) {   //
    displaye2();
  }

  else if (number == 78 && value == 32) {   //
    displayf2();
  }

  else if (number == 78 && value == 33) {   //
    displayg2();
  }

  else if (number == 78 && value == 34) {   // A
    displayh2();
  }

  else if (number == 78 && value == 35) {   // B
    displayi2();
  }

  else if (number == 78 && value == 36) {   //
    displayj2();
  }

  else if (number == 78 && value == 37) {   //
    displayk2();
  }

  else if (number == 78 && value == 38) {   //
    displayl2();
  }

  else if (number == 78 && value == 39) {   //
    displaym2();
  }

  else if (number == 78 && value == 40) {   //
    displayn2();
  }

  else if (number == 78 && value == 41) {   //
    displayo2();
  }

  else if (number == 78 && value == 42) {   //
    displayp2();
  }

  else if (number == 78 && value == 43) {   //
    displayq2();
  }

  else if (number == 78 && value == 44) {   //
    displayr2();
  }

  else if (number == 78 && value == 45) {   //
    displays2();
  }

  else if (number == 78 && value == 46) {   //
    displayt2();
  }

  else if (number == 78 && value == 47) {   //
    displayu2();
  }

  else if (number == 78 && value == 48) {   //
    displayv2();
  }

  else if (number == 78 && value == 49) {   //
    displayw2();
  }

  else if (number == 78 && value == 50) {   //
    displayx2();
  }

  else if (number == 78 && value == 51) {   //
    displayy2();
  }

  else if (number == 78 && value == 52) {   //
    displayz2();
  }

  else if (number == 78 && value == 53) {   //
    displayone1();
  }


  else if (number == 78 && value == 54) {   //
    displaytwo1();
  }

  else if (number == 78 && value == 55) {   //
    displaythree1();
  }


  else if (number == 78 && value == 56) {   //
    displayfour1();
  }

  else if (number == 78 && value == 57) {   //
    displayfive1();
  }


  else if (number == 78 && value == 58) {   //
    displaysix1();
  }

  else if (number == 78 && value == 59) {   //
    displayseven1();
  }


  else if (number == 78 && value == 60) {   //
    displayeight1();
  }

  else if (number == 78 && value == 61) {   //
    displaynine1();
  }

  else if (number == 78 && value == 62) {   //
    displayzero1();
  }

  else if (number == 78 && value == 63) {   //
    displaya3();
  }

  else if (number == 78 && value == 64) {   //
    displayb3();
  }

  else if (number == 78 && value == 65) {   //
    displayc3();
  }

  else if (number == 78 && value == 66) {   //
    displayd3();
  }

  else if (number == 78 && value == 67) {   //
    displaye3();
  }

  else if (number == 78 && value == 68) {   //
    displayf3();
  }

  else if (number == 78 && value == 69) {   //
    displayg3();
  }

  else if (number == 78 && value == 70) {   //
    displayh3();
  }

  else if (number == 78 && value == 71) {   //
    displayi3();
  }

  else if (number == 78 && value == 72) {   //
    displayface1();
  }

  else if (number == 78 && value == 73) {   //
    displayface2();
  }

  else if (number == 78 && value == 74) {   //
    displayface3();
  }

  else if (number == 78 && value == 75) {   //
    displayface4();
  }

  else if (number == 78 && value == 76) {   //
    displayface5();
  }

  else if (number == 78 && value == 77) {   //
    displayface6();
  }

  else if (number == 78 && value == 78) {   //
    displayface7();
  }

  else if (number == 78 && value == 79) {   //
    displayface8();
  }

  else if (number == 78 && value == 80) {   //
    displayface9();
  }

  else if (number == 78 && value == 81) {   //
    displayflake2();
  }

  else if (number == 78 && value == 82) {   //
    displayflake1();
  }

  else if (number == 78 && value == 83) {   //
    displayflake3();
  }


  else if (number == 78 && value == 86) {   //
    displayflake4();
  }


  else if (number == 78 && value == 85) {   //
    displayflake5();
  }


  else if (number == 78 && value == 84) {   //
    displayflake6();
  }

  else if (number == 78 && value == 87) {   //
    displayflake7();
  }


  else if (number == 78 && value == 88) {   //
    displayflake8();
  }


  else if (number == 78 && value == 89) {   //
    displayflake9();
  }

  else if (number == 78 && value == 90) {   //
    displayflake10();
  }


  else if (number == 78 && value == 91) {   //
    displayflake11();
  }


  else if (number == 78 && value == 92) {   //
    displayflake12();
  }

  else if (number == 78 && value == 93) {   //
    displayflake13();
  }


  else if (number == 78 && value == 94) {   //
    displayflake14();
  }


  else if (number == 78 && value == 95) {   //
    displayflake15();
  }

  else if (number == 78 && value == 96) {   //
    displayflake16();
  }


  else if (number == 78 && value == 97) {   //
    displayflake17();
  }


  else if (number == 78 && value == 98) {   //
    displayflake18();
  }

  else if (number == 78 && value == 99) {   //
    displayflake19();
  }


  else if (number == 78 && value == 100) {   //
    displayflake20();
  }


  else if (number == 78 && value == 101) {   //
    displayflake21();
  }

  else if (number == 78 && value == 102) {   //
    displayflake22();
  }


  else if (number == 78 && value == 103) {   //
    displayflake23();
  }


  else if (number == 78 && value == 104) {   //
    displayflake24();
  }

  else if (number == 78 && value == 105) {   //
    displayflake25();
  }


  else if (number == 78 && value == 106) {   //
    displayflake26();
  }


  else if (number == 78 && value == 107) {   //
    displayflake27();
  }

  else if (number == 78 && value == 108) {   //
    displayflake28();
  }


  else if (number == 78 && value == 109) {   //
    displayflake29();
  }


  else if (number == 78 && value == 110) {   //
    displayflake30();
  }

  else if (number == 78 && value == 111) {   //
    displayflake31();
  }


  else if (number == 78 && value == 112) {   //
    displayflake32();
  }


  else if (number == 78 && value == 113) {   //
    displayflake33();
  }

  else if (number == 78 && value == 114) {   //
    displayalien1();
  }

  else if (number == 78 && value == 115) {   //
    displayalien2();
  }


  else if (number == 78 && value == 116) {   //
    displayalien3();
  }

  else if (number == 78 && value == 117) {   //
    displayalien4();
  }

  else if (number == 78 && value == 118) {   //
    displayalien5();
  }

  else if (number == 78 && value == 119) {   //
    displayalien6();
  }

  else if (number == 78 && value == 120) {   //
    displayalien7();
  }

  else if (number == 78 && value == 121) {   //
    displaytriangle1();
  }

  else if (number == 78 && value == 122) {   //
    displaytriangle2();
  }

  else if (number == 78 && value == 123) {   //
    displaytriangle3();
  }

  else if (number == 78 && value == 124) {   //
    displaytriangle4();
  }

  else if (number == 78 && value == 125) {   //
    displaytriangle5();
  }

  else if (number == 78 && value == 126) {   //
    displaytriangle6();
  }

  else if (number == 78 && value == 127) {   //
    displaytriangle7();
  }

  else if (number == 79 && value == 0) {   //
    display7count0();
  }
  else if (number == 79 && value == 1) {   //
    display7count1();
  }

  else if (number == 79 && value == 2) {   //
    display7count2();
  }
  else if (number == 79 && value == 3) {   //
    display7count3();
  }

  else if (number == 79 && value == 4) {   //
    display7count4();
  }
  else if (number == 79 && value == 5) {   //
    display7count5();
  }

  else if (number == 79 && value == 6) {   //
    display7count6();
  }
  else if (number == 79 && value == 7) {   //
    display7count7();
  }

  else if (number == 79 && value == 8) {   //
    display7count8();
  }
  else if (number == 79 && value == 9) {   //
    display7count9();
  }

  else if (number == 79 && value == 10) {   //
    display7count10();
  }
  else if (number == 79 && value == 11) {   //
    display7count11();
  }

  else if (number == 79 && value == 12) {   //
    display7count12();
  }
  else if (number == 79 && value == 13) {   //
    display7count13();
  }

  else if (number == 79 && value == 14) {   //
    display7count14();
  }
  else if (number == 79 && value == 15) {   //
    display7count15();
  }

  else if (number == 79 && value == 16) {   //
    display7count16();
  }

  else if (number == 79 && value == 17) {   //
    display7count17();
  }
  else if (number == 79 && value == 18) {   //
    display7count18();
  }

  else if (number == 79 && value == 19) {   //
    display7count19();
  }
  else if (number == 79 && value == 20) {   //
    display7count20();
  }

  else if (number == 79 && value == 21) {   //
    display7count21();
  }
  else if (number == 79 && value == 22) {   //
    display7count22();
  }

  else if (number == 79 && value == 23) {   //
    display7count23();
  }
  else if (number == 79 && value == 24) {   //
    display7count24();
  }

  else if (number == 79 && value == 25) {   //
    display7count25();
  }
  else if (number == 79 && value == 26) {   //
    display7count26();
  }

  else if (number == 79 && value == 27) {   //
    display7count27();
  }
  else if (number == 79 && value == 28) {   //
    display7count28();
  }

  else if (number == 79 && value == 29) {   //
    display7count29();
  }
  else if (number == 79 && value == 30) {   //
    display7count30();
  }

  else if (number == 79 && value == 31) {   //
    display7count31();
  }
  else if (number == 79 && value == 32) {   //
    display7count32();
  }

  else if (number == 79 && value == 33) {   //
    display7count33();
  }
  else if (number == 79 && value == 34) {   //
    display7count34();
  }

  else if (number == 79 && value == 35) {   //
    display7count35();
  }
  else if (number == 79 && value == 36) {   //
    display7count36();
  }

  else if (number == 79 && value == 37) {   //
    display7count37();
  }
  else if (number == 79 && value == 38) {   //
    display7count38();
  }

  else if (number == 79 && value == 39) {   //
    display7count39();
  }
  else if (number == 79 && value == 40) {   //
    display7count40();
  }

  else if (number == 79 && value == 41) {   //
    display7count41();
  }

  else if (number == 79 && value == 42) {   //
    display7count42();
  }

  else if (number == 79 && value == 43) {   //
    display7count43();
  }
  else if (number == 79 && value == 44) {   //
    display7count44();
  }

  else if (number == 79 && value == 45) {   //
    display7count45();
  }

  else if (number == 79 && value == 46) {   //
    display7count46();
  }

  else if (number == 79 && value == 47) {   //
    display7count47();
  }

  else if (number == 79 && value == 48) {   //
    display7count48();
  }
  else if (number == 79 && value == 49) {   //
    display7count49();
  }

  else if (number == 79 && value == 50) {   //
    display7count50();
  }

  else if (number == 79 && value == 51) {   //
    display7count51();
  }

  else if (number == 79 && value == 52) {   //
    display7count52();
  }

  else if (number == 79 && value == 53) {   //
    display7count53();
  }
  else if (number == 79 && value == 54) {   //
    display7count54();
  }

  else if (number == 79 && value == 55) {   //
    display7count55();
  }

  else if (number == 79 && value == 56) {   //
    display7count56();
  }

  else if (number == 79 && value == 57) {   //
    display7count57();
  }

  else if (number == 79 && value == 58) {   //
    display7count58();
  }
  else if (number == 79 && value == 59) {   //
    display7count59();
  }

  else if (number == 79 && value == 60) {   //
    display7count60();
  }

  else if (number == 79 && value == 61) {   //
    display7count61();
  }

  else if (number == 79 && value == 62) {   //
    display7count62();
  }

  else if (number == 79 && value == 63) {   //
    display7count63();
  }
  else if (number == 79 && value == 64) {   //
    display7count64();
  }

  else if (number == 79 && value == 65) {   //
    display7count65();
  }

  else if (number == 79 && value == 66) {   //
    display7count66();
  }

  else if (number == 79 && value == 67) {   //
    display7count67();
  }

  else if (number == 79 && value == 68) {   //
    display7count68();
  }
  else if (number == 79 && value == 69) {   //
    display7count69();
  }

  else if (number == 79 && value == 70) {   //
    display7count70();
  }

  else if (number == 79 && value == 71) {   //
    display7count71();
  }

  else if (number == 79 && value == 72) {   //
    display7count72();
  }

  else if (number == 79 && value == 73) {   //
    display7count73();
  }
  else if (number == 79 && value == 74) {   //
    display7count74();
  }

  else if (number == 79 && value == 75) {   //
    display7count75();
  }

  else if (number == 79 && value == 76) {   //
    display7count76();
  }

  else if (number == 79 && value == 77) {   //
    display7count77();
  }

  else if (number == 79 && value == 78) {   //
    display7count78();
  }
  else if (number == 79 && value == 79) {   //
    display7count79();
  }

  else if (number == 79 && value == 80) {   //
    display7count80();
  }

  else if (number == 79 && value == 81) {   //
    display7count81();
  }

  else if (number == 79 && value == 82) {   //
    display7count82();
  }

  else if (number == 79 && value == 83) {   //
    display7count83();
  }
  else if (number == 79 && value == 84) {   //
    display7count84();
  }

  else if (number == 79 && value == 85) {   //
    display7count85();
  }

  else if (number == 79 && value == 86) {   //
    display7count86();
  }

  else if (number == 79 && value == 87) {   //
    display7count87();
  }

  else if (number == 79 && value == 88) {   //
    display7count88();
  }
  else if (number == 79 && value == 89) {   //
    display7count89();
  }

  else if (number == 79 && value == 90) {   //
    display7count90();
  }

  else if (number == 79 && value == 91) {   //
    display7count91();
  }

  else if (number == 79 && value == 92) {   //
    display7count92();
  }

  else if (number == 79 && value == 93) {   //
    display7count93();
  }
  else if (number == 79 && value == 94) {   //
    display7count94();
  }

  else if (number == 79 && value == 95) {   //
    display7count95();
  }

  else if (number == 79 && value == 96) {   //
    display7count96();
  }

  else if (number == 79 && value == 97) {   //
    display7count97();
  }

  else if (number == 79 && value == 98) {   //
    display7count98();
  }
  else if (number == 79 && value == 99) {   //
    display7count99();
  }

  else if (number == 79 && value == 100) {   //
    display7count100();
  }

  else if (number == 79 && value == 101) {   //
    display7count101();
  }

  else if (number == 79 && value == 102) {   //
    display7count102();
  }

  else if (number == 79 && value == 103) {   //
    display7count103();
  }
  else if (number == 79 && value == 104) {   //
    display7count104();
  }

  else if (number == 79 && value == 105) {   //
    display7count105();
  }

  else if (number == 79 && value == 106) {   //
    display7count106();
  }

  else if (number == 79 && value == 107) {   //
    display7count107();
  }

  else if (number == 79 && value == 108) {   //
    display7count108();
  }
  else if (number == 79 && value == 109) {   //
    display7count109();
  }

  else if (number == 79 && value == 110) {   //
    display7count110();
  }

  else if (number == 79 && value == 111) {   //
    display7count111();
  }

  else if (number == 79 && value == 112) {   //
    display7count112();
  }

  else if (number == 79 && value == 113) {   //
    display7count113();
  }
  else if (number == 79 && value == 114) {   //
    display7count114();
  }

  else if (number == 79 && value == 115) {   //
    display7count115();
  }

  else if (number == 79 && value == 116) {   //
    display7count116();
  }

  else if (number == 79 && value == 117) {   //
    display7count117();
  }

  else if (number == 79 && value == 118) {   //
    display7count118();
  }
  else if (number == 79 && value == 119) {   //
    display7count119();
  }

  else if (number == 79 && value == 120) {   //
    display7count120();
  }

  else if (number == 79 && value == 121) {   //
    display7count121();
  }

  else if (number == 79 && value == 122) {   //
    display7count122();
  }

  else if (number == 79 && value == 123) {   //
    display7count123();
  }
  else if (number == 79 && value == 124) {   //
    display7count124();
  }

  else if (number == 79 && value == 125) {   //
    display7count125();
  }

  else if (number == 79 && value == 126) {   //
    display7count126();
  }

  else if (number == 79 && value == 127) {   //
    display7count127();
  }



}

void SPIwrite() {
#define TSPEED 1000000 //1Mhz
  unsigned int chan1 = 0;
  unsigned int chan2 = 0;
  byte address1 = 0;
  byte address2 = 0;
  byte address3 = 0;
  SPISettings TLC5947(TSPEED , MSBFIRST, SPI_MODE0);
  // packing each 2 channel (12bit*2) to 3 byte (8bit*3) for transfering
  SPI.beginTransaction(TLC5947);
  // digitalWriteFast(latch, HIGH);
  digitalWriteFast(latch, LOW);
  for (unsigned int ledpos = 24  * NUM_TLC5974 ; ledpos > 0; ledpos = ledpos - 2) {
    chan1 = tlc.getCHAN(ledpos - 1);
    chan2 = tlc.getCHAN(ledpos - 2);
    address1 = (byte)(chan1 >> 4) ;
    address2 = (byte)((chan1 << 4) & (B11110000)) + (byte)((chan2 >> 8) & (B00001111));
    address3 = (byte)chan2;
    /* address1 = B00000000;
      address2 = B00000000;
      address3 = B00000000;*/
    SPI.transfer(address1);
    SPI.transfer(address2);
    SPI.transfer(address3);
  }

  SPI.endTransaction();
  //  digitalWriteFast(latch, LOW);
  digitalWriteFast(latch, HIGH);
  digitalWriteFast(latch, LOW);
  digitalWriteFast(clock, LOW);
}
 
For most devices (i dont know the chip details of yours) deasserting it usually ends with chipselect (latch) being HIGH. When accessing it, asserting it, you drop it LOW. If your chip is the opposite, then follow the way it describes in the datasheet. You should not control the clock line of the SPI. It's done by the hardware, if you mess with the clock it can cause erratic behaviour (not sure if the core supresses this but would be a waste of overhead).

Data clock and oe seem to be related to the SPI hardware pins. I would refrain touching them in code, and just ensure the latch asserts and deasserted with proper polarity between SPI transactions
 
Hi @tonton81,

Thank you for going over that code for me. I think all the SPI stuff is fine. I think my issue has to do with the way I am coding it.

For example, in myControlChange() if I send a value of 50 the LED turns red. If I send a value of 70 it turns yellow. If I alternate between the two numbers, even super fast, at 10 millisec, it still works great.

But if I send a 50 and the LED turns red, then I send 50 again and again, the LED starts to act erratically. Eventually it will turn to another color and other LEDs will start to change colors as well.

So what I would like to do is set up the code so that when a value comes in it is stored. The next value that comes in is compared to that. If they are the same then nothing should happen.

Maybe this is a boolean comparison? I'm just trying to figure out how to spell this out in code.
 
Well you have for example an oldValue and newValue.
Before you set it, start a value comparison:

Code:
if (oldValue != newValue ) {
  // process your led code here
  oldValue = newValue; // finally update with new value
}
 
Ok thanks @tonton81 I'll try and incorporate this into the code and post what I come up with.
 
Hey everyone,

I sat down with a expert coding friend of mine for a few hours yesterday. He streamlined the code I have and we trouble shooted this situation for several hours yesterday. We couldn't figure it out. At this point I am on the verge of just giving up on this, I've spent weeks trying to resolve it.

I'm posting all the code. It's a lot, but it seems like people want to see everything.

Again, the issue I am having is with the RGB LEDs. I am trying to control them with hardware SPI. When I send a value to one LED usually all of them change colors. I can't just control one. Also, mostly when I send a value to ledcontroller17 or ledcontroller18 they don't change to the correct color, or if they do the other LEDs will change colors slightly, or get brighter. I am almost positive that the hardware is set up correctly. I have a feeling the way the messages are formatted to the SPI hardware is not correct, but I am just guessing and we tried lot's of options yesterday.

There is a lot of code here. Most of the LED stuff is near the beginning before void setup(). void myControlChange() (after loop) has the messages to send out the LED changes to SPIwrite(), which is at the bottom of the code.

My friend thinks it's possible that hardware SPI is too fast, that the bandwidth is too small for the TLC5947 to handle. I think I will try software SPI and see how that works out. Now that the code is streamlined maybe that will work out better. At least the timing of everything is very fast.

I can post a video of what i'm seeing if that will help as well.

Code:
#include <Bounce.h>
#include <Adafruit_NeoPixel.h>
#include <Wire.h> // wire library for LED matrix

#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"

#include "Adafruit_TLC5947.h"  // for LED breakout board

//  #include <Adafruit_TLC5947.h>
#include <SPI.h>

const int slaveSelectPin = 10;
#define clock 13 // 10 
#define data 11
#define oe  15  //  12
#define latch  10 // 11
#define NUM_TLC5974 2     // how many LED boards


unsigned long frame;
Adafruit_TLC5947 tlc = Adafruit_TLC5947(NUM_TLC5974, clock, data, latch,  oe);
//unsigned long tick, dur;

// the MIDI channel number to send messages
const int channel = 1;
const int MIDIchannel = 1;   // this will only apply to midi channel 1


// the MIDI continuous controller for each analog input
const int controllerA0 = 1; //  control change 1, ribbon
const int controllerA1 = 2; //control change 2
const int controllerA2 = 3; //control change 3
const int controllerA3 = 4; // control change 4
const int controllerA4 = 5; // control change 5
const int controllerA5 = 6; // control change 6
const int controllerA6 = 7; // control change 7
const int controllerA7 = 8; // control change 8
const int controllerA8 = 9; // control change 9  last ribbon
const int controllerA9 = 10; // control change 10 joystick
const int controllerA10 = 11; // joystick
const int controllerA11 = 12; // control change 12
const int controllerA12 = 13; // control change 13  joystick

const int controllerD14 = 14; // toggle, control change 14
const int controllerD15 = 15; //  Button, control change 15
const int controllerD16 = 16; //
const int controllerD17 = 17;
const int controllerD18 = 18;  //
const int controllerD19 = 19;
const int controllerD20 = 20;
const int controllerD21 = 21;
const int controllerD22 = 22;
const int controllerD23 = 23;
const int controllerD24 = 24;
const int controllerD25 = 25;
const int controllerD26 = 26;
const int controllerD27 = 27;

int pled16 = 0;




// Create Bounce objects for each button.  The Bounce object
// automatically deals with contact chatter or "bounce", and
// it makes detecting changes very simple.
Bounce button0 = Bounce(0, 5);
Bounce button1 = Bounce(1, 5);  // 5 = 5 ms debounce time
Bounce button2 = Bounce(2, 5);  // which is appropriate for good
Bounce button3 = Bounce(3, 5);  // quality mechanical pushbuttons
Bounce button4 = Bounce(4, 5);
Bounce button5 = Bounce(5, 5);  // if a button is too "sensitive"
Bounce button6 = Bounce(6, 5);  // to rapid touch, you can
Bounce button7 = Bounce(7, 5);  // increase this time.
Bounce button8 = Bounce(8, 5);
Bounce button9 = Bounce(9, 5);
Bounce button10 = Bounce(10, 5);
Bounce button11 = Bounce(11, 5);
Bounce button12 = Bounce(12, 5);  // goes out of order because other pins double as analog inputs

Bounce button24 = Bounce(24, 5);
Bounce button25 = Bounce(25, 5);
Bounce button26 = Bounce(26, 5);
Bounce button27 = Bounce(27, 5);

//const int ledPin28 = 28;    // digital pin 28 For LED
//const int ledPin29 = 29;    // digital pin 29 For LED
//const int ledPin30 = 30;    // digital pin 30 For LED
//const int ledPin31 = 31;    // digital pin 29 For LED
//const int ledPin32 = 32;    // digital pin 29 For LED
//const int ledPin33 = 33;    // digital pin 29 For

const int ledcontroller15 = 15;    // midi control change 15
const int ledcontroller16 = 16;    // midi control change 16
const int ledcontroller17 = 17;    // midi control change 15
const int ledcontroller18 = 18;    // midi control change 16
const int ledcontroller19 = 19;    // midi control change 15
const int ledcontroller20 = 20;    // midi control change 16
const int ledcontroller23 = 23;    // midi control change 16

// currentLed = index in ledControllers
const byte ledControllers[] = {15, 16, 17, 18, 19, 20, 23};    // list LEDs by controllerNumber
const uint16_t ledControllersAddress[] = {0, 1,  2,  3,  127, 127, 8};    // addresses for each LEDs linked by Index
byte ledControllersStatus[sizeof(ledControllers)];              // store status for each LED

int ledSetColor(int index, byte colorNumber, bool doSendUpdate = false) {

    uint16_t address = 127;
    if (index < 0 && index >= sizeof(ledControllersAddress)) {
        return 127;   // address not found
    } else {
        address = ledControllersAddress[index];
    }
    // if address is -1, skip
    if (address == 127 || address == -1) {
        return 127;
    }
    // if color is same as previously set color, skip
    if (colorNumber == ledControllersStatus[index]) {
        return colorNumber;
    }

    // set RGB for led based on colorNumber
    switch (colorNumber) {
        
        default:
            colorNumber = 0;    // if not in the list, set the color to 0
        case 0:
            tlc.setLED(address, uint16_t(0), uint16_t(0), uint16_t(0));       // OFF
            break;
        case 10:
            tlc.setLED(address, uint16_t(90), uint16_t(2), uint16_t(10));     // light pink
            break;
        case 20:
            tlc.setLED(address, uint16_t(0), uint16_t(0), uint16_t(100));     // blue
            break;
        case 30:
            tlc.setLED(address, uint16_t(40), uint16_t(0), uint16_t(40));     // lavender
            break;
        case 40:
            tlc.setLED(address, uint16_t(90), uint16_t(2), uint16_t(2));      // pink
            break;
        case 50:
            tlc.setLED(address, uint16_t(100), uint16_t(0), uint16_t(0));     // red
            break;
        case 60:
            tlc.setLED(address, uint16_t(100), uint16_t(8), uint16_t(0));     // orange
            break;
        case 70:
            tlc.setLED(address, uint16_t(100), uint16_t(20), uint16_t(0));    // yellow
            break;
        case 80:
            tlc.setLED(address, uint16_t(0), uint16_t(100), uint16_t(0));     // green
            break;
        case 90:
            tlc.setLED(address, uint16_t(15), uint16_t(100), uint16_t(2));    // light green
            break;
        case 100:
            tlc.setLED(address, uint16_t(0), uint16_t(80), uint16_t(7));      // turquoise
            break;
        case 110:
            tlc.setLED(address, uint16_t(0), uint16_t(60), uint16_t(50));     // light blue
            break;
        case 120:
            tlc.setLED(address, uint16_t(0), uint16_t(100), uint16_t(21));    // aqua-turquoise
            break;
        case 127:
            tlc.setLED(address, uint16_t(100), uint16_t(90), uint16_t(100));  // white
            break;
    }

    // if requested, send update
    if (doSendUpdate == true) {
        // tlc.write();
        SPIwrite();
    }
    
    // update state and return number
    ledControllersStatus[index] = colorNumber;
    return colorNumber;
}



const int numMatrixControllers = 5;
const int firstMatrixController = 76;


// led matrix
Adafruit_7segment matrix = Adafruit_7segment();
// Adafruit_7segment matrix1 = Adafruit_7segment();
Adafruit_8x16matrix matrix2 = Adafruit_8x16matrix();

void setup() {

  pinMode(latch, OUTPUT);
  digitalWrite(latch, LOW);
  pinMode(clock, OUTPUT);
  digitalWrite(clock, LOW);
  pinMode(data, OUTPUT);
  digitalWrite(data, LOW);


  SPI.setCS(10);
  SPI.setMOSI(11);
  SPI.setSCK(13);
  SPI.begin();
  //tlc.begin();

  // Serial.begin(38400); if you don't comment this out the board goes off line

  // wire 3.3V to AREF for 3.3V reference
  analogReference(DEFAULT);

  pinMode(0, INPUT_PULLUP);   // for button swithces
  pinMode(1, INPUT_PULLUP);
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  // pinMode(10, INPUT_PULLUP);
  // pinMode(11, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);
  pinMode(24, INPUT_PULLUP);
  pinMode(25, INPUT_PULLUP);
  pinMode(26, INPUT_PULLUP);
  pinMode(27, INPUT_PULLUP);


  usbMIDI.setHandleControlChange(myControlChange);
  setupLedDisplays();

    // initialize all defined LEDs to 0
    for (int i = 0; i < sizeof(ledControllers); i++) {
        ledControllersStatus[i] = 0;    // init state
        ledSetColor(i, 0, false);              // set color
    }
    //tlc.write();
    SPIwrite();

}

// store previously sent values, to detect changes
int previousA0 = -1;
int previousA1 = -1;
int previousA2 = -1;
int previousA3 = -1;
int previousA4 = -1;
int previousA5 = -1;
int previousA6 = -1;
int previousA7 = -1;
int previousA8 = -1;
int previousA9 = -1;
int previousA10 = -1;
int previousA11 = -1;
int previousA12 = -1;

// store previous LED values



elapsedMillis msec = 0;



void loop() {

  {

    button0.update();    //  this button code works, goes from 0 to 127 when pressed
    button1.update();
    button2.update();
    button3.update();
    button4.update();
    button5.update();
    button6.update();
    button7.update();
    button8.update();
    button9.update();
    button10.update();
    button11.update();
    button12.update();
    button24.update();
    button25.update();
    button26.update();
    button27.update();



    if (button0.fallingEdge()) {                               // this deals with reading the button swithces
      usbMIDI.sendControlChange(controllerD14, 127, channel);
    }

    if (button0.risingEdge()) {
      usbMIDI.sendControlChange(controllerD14, 0, channel);
    }

    if (button1.fallingEdge()) {
      usbMIDI.sendControlChange(controllerD15, 127, channel);
    }

    if (button1.risingEdge()) {
      usbMIDI.sendControlChange(controllerD15, 0, channel);
    }

    if (button2.fallingEdge()) {
      usbMIDI.sendControlChange(controllerD16, 127, channel);
    }

    if (button2.risingEdge()) {
      usbMIDI.sendControlChange(controllerD16, 0, channel);
    }

    if (button3.fallingEdge()) {
      usbMIDI.sendControlChange(controllerD17, 127, channel);
    }

    if (button3.risingEdge()) {
      usbMIDI.sendControlChange(controllerD17, 0, channel);
    }

    if (button4.fallingEdge()) {
      usbMIDI.sendControlChange(controllerD18, 127, channel);
    }

    if (button4.risingEdge()) {
      usbMIDI.sendControlChange(controllerD18, 0, channel);
    }

    if (button5.fallingEdge()) {
      usbMIDI.sendControlChange(controllerD19, 127, channel);
    }

    if (button5.risingEdge()) {
      usbMIDI.sendControlChange(controllerD19, 0, channel);
    }

    if (button6.fallingEdge()) {
      usbMIDI.sendControlChange(controllerD20, 127, channel);
    }

    if (button6.risingEdge()) {
      usbMIDI.sendControlChange(controllerD20, 0, channel);
    }

    if (button7.fallingEdge()) {
      usbMIDI.sendControlChange(controllerD21, 127, channel);
    }

    if (button7.risingEdge()) {
      usbMIDI.sendControlChange(controllerD21, 0, channel);
    }

    if (button8.fallingEdge()) {
      usbMIDI.sendControlChange(controllerD22, 127, channel);
    }

    if (button8.risingEdge()) {
      usbMIDI.sendControlChange(controllerD22, 0, channel);
    }

    if (button9.fallingEdge()) {
      usbMIDI.sendControlChange(controllerD23, 127, channel);
    }

    if (button9.risingEdge()) {
      usbMIDI.sendControlChange(controllerD23, 0, channel);
    }

    if (button10.fallingEdge()) {
      usbMIDI.sendControlChange(controllerD24, 127, channel);
    }

    if (button10.risingEdge()) {
      usbMIDI.sendControlChange(controllerD24, 0, channel);
    }

    if (button11.fallingEdge()) {
      usbMIDI.sendControlChange(controllerD25, 127, channel);
    }

    if (button11.risingEdge()) {
      usbMIDI.sendControlChange(controllerD25, 0, channel);
    }

    if (button12.fallingEdge()) {
      usbMIDI.sendControlChange(controllerD26, 127, channel);
    }

    if (button12.risingEdge()) {
      usbMIDI.sendControlChange(controllerD26, 0, channel);
    }

    if (button24.fallingEdge()) {
      usbMIDI.sendControlChange(controllerD27, 127, channel);
    }

    if (button24.risingEdge()) {
      usbMIDI.sendControlChange(controllerD27, 0, channel);
    }

    /*

      if (button25.fallingEdge()) {
      usbMIDI.sendControlChange(controllerD28, 127, channel);
      }

      if (button25.risingEdge()) {
      usbMIDI.sendControlChange(controllerD28, 0, channel);
      }

      if (button26.fallingEdge()) {
      usbMIDI.sendControlChange(controllerD29, 127, channel);
      }

      if (button26.risingEdge()) {
      usbMIDI.sendControlChange(controllerD29, 0, channel);
      }

      if (button27.fallingEdge()) {
      usbMIDI.sendControlChange(controllerD30, 127, channel);
      }

      if (button27.risingEdge()) {
      usbMIDI.sendControlChange(controllerD30, 0, channel);
      }

    */

  }


  // only check the analog inputs 50 times per second,
  // to prevent a flood of MIDI messages
  if (msec >= 3) {               //  i changed this value to 10 from 20 for faster updates
    msec = 0;

    int n0 = map(analogRead(A0), 0, 1023, 0, 127);
    int n1 = map(analogRead(A1), 0, 1023, 0, 127);
    int n2 = map(analogRead(A2), 0, 1023, 0, 127);
    int n3 = map(analogRead(A3), 0, 1023, 0, 127);
    //  int n4 = map(analogRead(A4), 0, 1023, 0, 127);   //commented this out for SCL0 and SDA0
    //  int n5 = map(analogRead(A5), 0, 1023, 0, 127);
    int n6 = map(analogRead(A6), 0, 1023, 0, 127);
    int n7 = map(analogRead(A7), 0, 1023, 0, 127);
    int n8 = map(analogRead(A8), 0, 1023, 0, 127);
    int n9 = map(analogRead(A9), 0, 1023, 0, 127);
    int n10 = map(analogRead(A14), 0, 1023, 0, 127);
    int n11 = map(analogRead(A15), 0, 1023, 0, 127);
    int n12 = map(analogRead(A16), 0, 1023, 0, 127);


    // only transmit MIDI messages if analog input changed
    if (n0 != previousA0) {
      previousA0 = n0;
      if (n0 < 2) n0 = 0;
      usbMIDI.sendControlChange(controllerA0, n0, channel);
    }

    if (n1 != previousA1) {
      previousA1 = n1;
      if (n1 < 2) n1 = 0;
      usbMIDI.sendControlChange(controllerA1, n1, channel);
    }

    if (n2 != previousA2) {
      previousA2 = n2;
      if (n2 < 2) n2 = 0;
      usbMIDI.sendControlChange(controllerA2, n2, channel);

    }
    if (n3 != previousA3) {
      previousA3 = n3;
      if (n3 < 2) n3 = 0;
      usbMIDI.sendControlChange(controllerA3, n3, channel);
    }

    /*

        if (n4 != previousA4) {
          previousA4 = n4;
          if (n4 < 2) n4 = 0;
          usbMIDI.sendControlChange(controllerA4, n4, channel);

        }

        if (n5 != previousA5) {
          previousA5 = n5;
          if (n5 < 2) n5 = 0;
          usbMIDI.sendControlChange(controllerA5, n5, channel);

        }

    */

    if (n6 != previousA6) {
      previousA6 = n6;
      if (n6 < 2) n6 = 0;
      usbMIDI.sendControlChange(controllerA6, n6, channel);

    }

    if (n7 != previousA7) {
      previousA7 = n7;
      if (n7 < 2) n7 = 0;
      usbMIDI.sendControlChange(controllerA7, n7, channel);

    }

    if (n8 != previousA8) {
      previousA8 = n8;
      if (n8 < 2) n8 = 0;
      usbMIDI.sendControlChange(controllerA8, n8, channel);
    }

    if (n9 != previousA9) {
      previousA9 = n9;
      if (n9 < 3) n9 = 0;
      usbMIDI.sendControlChange(controllerA9, n9, channel);
    }

    if (n10 != previousA10) {
      previousA10 = n10;
      if (n10 < 3) n10 = 0;
      usbMIDI.sendControlChange(controllerA10, n10, channel);
    }

    if (n11 != previousA11) {
      previousA11 = n11;
      if (n11 < 3) n11 = 0;
      usbMIDI.sendControlChange(controllerA11, n11, channel);
    }

    if (n12 != previousA12) {
      previousA12 = n12;
      if (n12 < 3) n12 = 0;
      usbMIDI.sendControlChange(controllerA12, n12, channel);
    }



  }

  // MIDI Controllers should discard incoming MIDI messages.
  // http://forum.pjrc.com/threads/24179-Teensy-3-Ableton-Analog-CC-causes-midi-crash
  while (usbMIDI.read()) {
    // ignore incoming messages
  }
}


void myControlChange(byte channel, byte control, byte value) { // for LEDs, MIDI output

  if (channel == MIDIchannel) {

    for (byte i = 0; i < sizeof(ledControllers); i++) {
        if (control == ledControllers[i])
            ledSetColor(i, value, false);   // set color
    }


    SPIwrite();

    // handle matrix
    if (control >= firstMatrixController && control < (firstMatrixController + numMatrixControllers))
      handleMatrix(control, value);

  }
}



void handleMatrix(byte number, byte value) {


  if (number == 76) {


    if ( value == 0) {
      display11Clear();
    }

    if (value == 127) {
      display11Full();
    }

    if ( value == 1) {
      display11Ascending();
    }


    if (value == 2) {
      display11Descending();
    }



    if (value == 3) {
      display12Ascending();
    }
    if ( value == 4) {
      display12Descending();
    }

    if (value == 5) {
      display13Ascending();
    }
    if ( value == 6) {
      display13Descending();
    }
    if ( value == 7) {
      display14Ascending();
    }
    if (value == 8) {
      display14Descending();
    }
    if ( value == 9) {
      display15Ascending();
    }
    if (value == 10) {
      display15Descending();
    }

    if ( value == 11) {
      display16Ascending();
    }
    if ( value == 12) {
      display16Descending();
    }

    if (value == 13) {
      display17Ascending();
    }

    if ( value == 14) {
      display18Ascending();
    }

    if ( value == 15) {
      display19Ascending();
    }

    if (value == 16) {
      display19Descending();
    }

    if (value == 17) {
      display110Ascending();
    }

    if (value == 18) {
      display110Descending();
    }

    if ( value == 19) {
      display111Ascending();
    }

    if ( value == 20) {
      display111Descending();
    }

    if ( value == 21) {
      display112Ascending();
    }

    if ( value == 22) {
      display112Descending();
    }

    if (value == 23) {
      display113Ascending();
    }

    if (value == 24) {
      display113Descending();
    }

    if ( value == 25) {
      display114Ascending();
    }

    if (value == 26) {
      display114Descending();
    }

    if (value == 27) {
      display115Ascending();
    }

    if ( value == 28) {
      display115Descending();
    }

    if (value == 29) {
      display116Ascending();
    }

    if (value == 30) {
      display116Descending();
    }

    if (value == 31) {
      display117Ascending();
    }

    if (value == 32) {
      display117Descending();
    }

    if ( value == 33) {
      display118Ascending();
    }

    if ( value == 34) {
      display119Ascending();
    }


    else if (value == 35) {
      display120Ascending();
    }

    else if ( value == 36) {
      display121Ascending();
    }

    else if (value == 37) {
      display121Descending();
    }

    else if (value == 38) {
      display122Ascending();
    }

    else if (value == 39) {
      display122Descending();
    }

    else if ( value == 40) {
      display123Ascending();
    }

    else if (value == 41) {
      display123Descending();
    }

    else if ( value == 42) {
      display124Ascending();
    }

    else if (value == 43) {
      display124Descending();
    }

    else if (value == 44) {
      display125Ascending();
    }

    else if (value == 45) {
      display125Descending();
    }


    else if (value == 46) {
      display126Ascending();
    }

    else if (value == 47) {
      display126Descending();
    }


    else if (value == 48) {
      display127Ascending();
    }

    else if (value == 49) {
      display127Descending();
    }

    else if ( value == 50) {
      display128Ascending();
    }

    else if ( value == 51) {
      display128Descending();
    }

    else if ( value == 52) {
      display129Ascending();
    }

    else if ( value == 53) {
      display130Ascending();
    }

    else if ( value == 54) {
      display131Ascending();
    }

    else if ( value == 55) {
      display131Descending();
    }

    else if (value == 56) {
      display132Ascending();
    }

    else if (value == 57) {
      display133Ascending();
    }

    else if ( value == 58) {
      display134Ascending();
    }

    else if (value == 59) {
      display135Ascending();
    }

    else if ( value == 60) {
      display135Descending();
    }

    else if ( value == 61) {
      display136Ascending();
    }


    else if (value == 62) {
      display137Ascending();
    }

    else if ( value == 63) {
      display137Descending();
    }

    else if ( value == 64) {
      display138Ascending();
    }

    else if (value == 65) {
      display138Descending();
    }

    else if ( value == 66) {
      display139Ascending();
    }

    else if ( value == 67) {
      display140Ascending();
    }

    else if (value == 68) {
      display141Ascending();
    }

    else if ( value == 69) {
      display142Ascending();
    }

    else if (value == 70) {
      display143Ascending();
    }

    else if ( value == 71) {
      display143Descending();
    }

    else if ( value == 72) {
      display144Ascending();
    }

    else if ( value == 73) {   // 6animation
      display145Ascending();
    }

    else if ( value == 74) {
      display146Ascending();
    }

    else if (value == 75) {
      display147Ascending();
    }

    else if ( value == 76) {
      display148Ascending();
    }

    else if ( value == 77) {
      display148Descending();
    }

    else if ( value == 78) {
      display149Ascending();
    }

    else if (value == 79) {
      display150Ascending();
    }

    else if ( value == 80) {
      display151Ascending();
    }

    else if (value == 81) {
      display152Ascending();
    }

    else if (value == 82) {
      display152Descending();
    }

    else if (value == 83) {
      display153Ascending();
    }

    else if (value == 84) {
      display154Ascending();
    }

    else if ( value == 85) {
      display155Ascending();
    }

    else if ( value == 86) {
      display156Ascending();
    }

    else if ( value == 87) {
      display156Descending();
    }

    else if ( value == 88) {
      display157Ascending();
    }

    else if ( value == 89) {
      display157Descending();
    }

    else if ( value == 90) {
      display158Ascending();
    }

    else if ( value == 91) {
      display159Ascending();
    }

    else if ( value == 92) {
      display160Ascending();
    }

    else if ( value == 93) {
      display161Ascending();
    }

    else if ( value == 94) {
      display161Descending();
    }

    else if ( value == 95) {
      display162Ascending();
    }

    else if (value == 96) {
      display162Descending();
    }

    else if ( value == 97) {
      display163Ascending();
    }

    else if ( value == 98) {
      display164Ascending();
    }

    else if ( value == 99) {
      display165Ascending();
    }

    else if ( value == 100) {
      display166Ascending();
    }

    else if ( value == 101) {
      display167Ascending();
    }

    else if ( value == 102) {
      display168Ascending();
    }

    else if ( value == 103) {
      display169Ascending();
    }

    else if ( value == 104) {
      display170Ascending();
    }

    else if ( value == 105) {
      display171Ascending();
    }
    else if ( value == 106) {
      display172Ascending();
    }
    else if ( value == 107) {
      display173Ascending();
    }
    else if ( value == 108) {
      display174Ascending();
    }
    else if ( value == 109) {
      display175Ascending();
    }
    else if ( value == 110) {
      display176Ascending();
    }
    else if ( value == 111) {
      display177Ascending();
    }
    else if (value == 112) {
      display178Ascending();
    }
    else if ( value == 113) {
      display179Ascending();
    }
    else if ( value == 114) {
      display180Ascending();
    }
    else if ( value == 115) {
      display181Ascending();
    }
    else if ( value == 116) {
      display182Ascending();
    }
    else if (value == 117) {
      display182Descending();
    }
    else if ( value == 118) {
      display183Ascending();
    }
    else if ( value == 119) {
      display184Ascending();
    }
    else if ( value == 120) {
      display185Ascending();
    }
    else if ( value == 121) {
      display186Ascending();
    }
    else if ( value == 122) {
      display187Ascending();
    }
    else if ( value == 123) {
      display188Ascending();
    }
    else if ( value == 124) {
      display188Descending();
    }
    else if ( value == 125) {
      display189Ascending();
    }
    else if ( value == 126) {
      display190Ascending();
    }
  }

  if (number == 77) {

    if (value == 0) {
      display31Clear();
    }
    else if ( value == 127) {
      display31Full();
    }
    else if ( value == 126) {
      display31Randomx();
    }
    else if ( value == 125) {
      display31Rpp();
    }
    else if (value == 124) {
      display31Rpp2();
    }
    else if ( value == 123) {
      display31Rpp4();
    }
    else if (value == 122) {
      display31Rpp8();
    }
    else if ( value == 121) {
      display31Rss();
    }
    else if (value == 120) {
      display31Rsr();
    }
    else if (value == 119) {
      display31Rsc();
    }
    else if (value == 118) {
      display31Rbs();
    }
    else if ( value == 117) {
      display31R4c();
    }
    else if (value == 116) {
      display31R4cs();
    }
    else if (value == 115) {
      display31Twoblockssmall();
    }
    else if (value == 114) {
      display31Twoblocksverysmall();
    }
    else if ( value == 113) {
      display31Twocirclesb();
    }
    else if (value == 112) {
      display31Twocircles();
    }
    else if (value == 111) {
      display31randomlsquare();
    }
    else if (value == 110) {
      display31random2lines();
    }
    else if (value == 109) {
      display31random4lines();
    }
    else if ( value == 108) {
      display31twonoisesquare();
    }
    else if ( value == 107) {
      display31fournoisesquare();
    }
    else if ( value == 106) {
      display31fournoiseblocks();
    }
    else if (value == 105) {
      display32Ascending();
    }
    else if ( value == 104) {
      display33Ascending();
    }
    else if (value == 103) {
      display34Ascending();
    }
    else if ( value == 102) {
      display34Descending();
    }
    else if ( value == 101) {
      display35Ascending();
    }
    else if (value == 100) {
      display36Ascending();
    }
    else if ( value == 99) {
      display37Ascending();
    }
    else if ( value == 98) {
      display38Ascending();
    }
    else if ( value == 97) {
      display38Descending();
    }
    else if (value == 96) {
      display39Ascending();
    }
    else if ( value == 95) {
      display391Ascending();
    }
    else if ( value == 94) {
      display392Ascending();
    }
    else if ( value == 93) {
      display393Ascending();
    }
    else if (value == 92) {
      display394Ascending();
    }
    else if ( value == 91) {
      display395Ascending();
    }
    else if ( value == 90) {
      display396Ascending();
    }
    else if ( value == 89) {
      display396Descending();
    }
    else if (value == 88) {
      display310Ascending();
    }
    else if ( value == 87) {
      display310Descending();
    }
    else if ( value == 86) {
      display311Ascending();
    }
    else if ( value == 85) {
      display311Descending();
    }
    else if ( value == 84) {
      display312Ascending();
    }
    else if ( value == 83) {
      display313Ascending();
    }
    else if ( value == 82) {
      display314Ascending();
    }
    else if (value == 81) {
      display314Descending();
    }
    else if ( value == 80) {
      display315Ascending();
    }
    else if ( value == 79) {
      display315Descending();
    }
    else if ( value == 78) {
      display316Ascending();
    }
    else if (value == 77) {
      display317Ascending();
    }
    else if ( value == 76) {
      display317Descending();
    }
    else if ( value == 75) {
      display318Ascending();
    }
    else if ( value == 74) {
      display318Descending();
    }
    else if (value == 73) {
      display319Ascending();
    }
    else if ( value == 72) {
      display320Ascending();
    }
    else if (value == 71) {
      display320Descending();
    }
    else if ( value == 70) {
      display321Ascending();
    }
    else if ( value == 69) {
      display321Descending();
    }
    else if (value == 68) {
      display322Ascending();
    }
    else if (value == 67) {
      display322Descending();
    }
    else if ( value == 66) {
      display323Ascending();
    }
    else if (value == 65) {
      display323Descending();
    }
    else if (value == 64) {
      display324Ascending();
    }
    else if (value == 63) {
      display324Descending();
    }
    else if (value == 62) {
      display325Ascending();
    }
    else if ( value == 61) {
      display325Descending();
    }
    else if ( value == 60) {
      display326Ascending();
    }
    else if ( value == 59) {
      display326Descending();
    }
    else if ( value == 58) {
      display327Ascending();
    }
    else if (value == 57) {
      display327Descending();
    }
    else if ( value == 56) {
      display328Ascending();
    }
    else if ( value == 55) {
      display328Descending();
    }
    else if ( value == 54) {   //triangls5
      display329Ascending();
    }
    else if ( value == 53) {   //triangls4
      display330Ascending();
    }
    else if (value == 52) {   //triangls3
      display331Ascending();
    }
    else if (value == 51) {   //2randHorrectangles
      display332Ascending();
    }
    else if ( value == 50) {   //triangleMove_rect
      display333Ascending();
    }
    else if ( value == 49) {   //diamonds
      display3344Ascending();
    }
    else if ( value == 48) {   //diamonds2
      display334Ascending();
    }
    else if ( value == 47) {   //triangle5
      display335Ascending();
    }
    else if ( value == 46) {   //triangle5Desc
      display335Descending();
    }

    else if ( value == 45) {   //triangle4
      display336Ascending();
    }
    else if ( value == 44) {   //triangle3
      display337Ascending();
    }
    else if ( value == 43) {   //triangle3Desc
      display337Descending();
    }
    else if (value == 42) {   //triangle2Rotate
      display338Ascending();
    }
    else if ( value == 41) {   //triangle2
      display339Ascending();
    }
    else if ( value == 40) {   //triangle2Desc
      display339Descending();
    }
    else if ( value == 39) {   //triangle1
      display340Ascending();
    }
    else if ( value == 38) {   //triangle1Desc
      display340Descending();
    }
    else if (value == 37) {   //triangle_rect
      display341Ascending();
    }
    else if ( value == 36) {   //transform
      display342Ascending();
    }
    else if (value == 35) {   //stretched_circle
      display343Ascending();
    }
    else if (value == 34) {   //star3
      display344Ascending();
    }
    else if ( value == 33) {   //star2
      display345Ascending();
    }
    else if ( value == 32) {   //squares
      display346Ascending();
    }
    else if (value == 31) {   //rectround1
      display347Ascending();
    }
    else if ( value == 30) {   //rect6
      display348Ascending();
    }
    else if ( value == 29) {   //rect5
      display349Ascending();
    }
    else if ( value == 28) {   //rect5Desc
      display349Descending();
    }
    else if ( value == 27) {   //rect4
      display350Ascending();
    }
    else if (value == 26) {   //rect3
      display351Ascending();
    }
    else if ( value == 25) {   //rect2
      display352Ascending();
    }
    else if ( value == 24) {   //rect1
      display353Ascending();
    }
    else if (value == 23) {   //rect1Desc
      display353Descending();
    }
    else if ( value == 22) {   //pixelLtoR
      display354Ascending();
    }
    else if (value == 21) {   //pixel2
      display355Ascending();
    }
    else if ( value == 20) {   //pixel1
      display356Ascending();
    }
    else if ( value == 19) {   //pillars2
      display357Ascending();
    }
    else if ( value == 18) {   //pillars1
      display358Ascending();
    }
    else if ( value == 17) {   //moving_circle
      display359Ascending();
    }
    else if ( value == 16) {   //lines91
      display360Ascending();
    }
    else if (value == 15) {   //Ex
      display361Ascending();
    }
    else if (value == 14) {   //ExDesc
      display361Descending();
    }
    else if ( value == 13) {   //Ex2
      display362Ascending();
    }
    else if (value == 12) {   //circles_transform
      display363Ascending();
    }
    else if ( value == 11) {   //circles_stripe
      display364Ascending();
    }
    else if ( value == 10) {   //circle1
      display365Ascending();
    }
    else if ( value == 9) {   //_4randvertlines2
      display366Ascending();
    }
    else if ( value == 8) {   //_4randvertlines
      display367Ascending();
    }
    else if ( value == 7) {   //_4randHorrectangles
      display368Ascending();
    }
    else if ( value == 6) {   //_3randrec
      display369Ascending();
    }
    else if ( value == 5) {   //_3circles
      display370Ascending();
    }
    else if ( value == 4) {   //_2windmills2
      display371Ascending();
    }
    else if ( value == 3) {   //_2randvertlines
      display372Ascending();
    }
    else if ( value == 2) {   //_2randrec_line
      display373Ascending();
    }
    else if ( value == 1) {   //_2randhorlines
      display374Ascending();
    }
  }

  if (number == 78) {

    if ( value == 1) {   // A
      displayA1();
    }

    else if ( value == 2) {   // B
      displayB1();
    }

    else if (value == 3) {   //
      displayC1();
    }

    else if (value == 4) {   //
      displayD1();
    }

    else if ( value == 5) {   // A
      displayE1();
    }

    else if ( value == 6) {   // B
      displayF1();
    }

    else if ( value == 7) {   //
      displayG1();
    }

    else if (value == 8) {   //
      displayH1();
    }

    else if ( value == 9) {   //
      displayI1();
    }

    else if ( value == 10) {   //
      displayJ1();
    }

    else if ( value == 11) {   // A
      displayK1();
    }

    else if ( value == 12) {   // B
      displayL1();
    }

    else if (value == 13) {   //
      displayM1();
    }

    else if ( value == 14) {   //
      displayN1();
    }

    else if (value == 15) {   // A
      displayO1();
    }

    else if ( value == 16) {   // B
      displayP1();
    }

    else if ( value == 17) {   //
      displayQ1();
    }

    else if ( value == 18) {   //
      displayR1();
    }

    else if ( value == 19) {   // A
      displayS1();
    }

    else if ( value == 20) {   // B
      displayT1();
    }

    else if ( value == 21) {   //
      displayU1();
    }

    else if (value == 22) {   //
      displayV1();
    }

    else if (value == 23) {   // A
      displayW1();
    }

    else if (value == 24) {   // B
      displayX1();
    }

    else if (value == 25) {   //
      displayY1();
    }

    else if (value == 26) {   //
      displayZ1();
    }

    else if ( value == 27) {   //  lower case a
      displaya2();
    }

    else if (value == 28) {   //
      displayb2();
    }

    else if ( value == 29) {   // A
      displayc2();
    }

    else if (value == 30) {   // B
      displayd2();
    }

    else if ( value == 31) {   //
      displaye2();
    }

    else if ( value == 32) {   //
      displayf2();
    }

    else if ( value == 33) {   //
      displayg2();
    }

    else if ( value == 34) {   // A
      displayh2();
    }

    else if (value == 35) {   // B
      displayi2();
    }

    else if ( value == 36) {   //
      displayj2();
    }

    else if ( value == 37) {   //
      displayk2();
    }

    else if (value == 38) {   //
      displayl2();
    }

    else if ( value == 39) {   //
      displaym2();
    }

    else if (value == 40) {   //
      displayn2();
    }

    else if (value == 41) {   //
      displayo2();
    }

    else if ( value == 42) {   //
      displayp2();
    }

    else if (value == 43) {   //
      displayq2();
    }

    else if (value == 44) {   //
      displayr2();
    }

    else if (value == 45) {   //
      displays2();
    }

    else if (value == 46) {   //
      displayt2();
    }

    else if ( value == 47) {   //
      displayu2();
    }

    else if ( value == 48) {   //
      displayv2();
    }

    else if (value == 49) {   //
      displayw2();
    }

    else if (value == 50) {   //
      displayx2();
    }

    else if (value == 51) {   //
      displayy2();
    }

    else if (value == 52) {   //
      displayz2();
    }

    else if (value == 53) {   //
      displayone1();
    }


    else if (value == 54) {   //
      displaytwo1();
    }

    else if ( value == 55) {   //
      displaythree1();
    }


    else if (value == 56) {   //
      displayfour1();
    }

    else if ( value == 57) {   //
      displayfive1();
    }


    else if (value == 58) {   //
      displaysix1();
    }

    else if ( value == 59) {   //
      displayseven1();
    }


    else if (value == 60) {   //
      displayeight1();
    }

    else if ( value == 61) {   //
      displaynine1();
    }

    else if ( value == 62) {   //
      displayzero1();
    }

    else if (value == 63) {   //
      displaya3();
    }

    else if ( value == 64) {   //
      displayb3();
    }

    else if ( value == 65) {   //
      displayc3();
    }

    else if ( value == 66) {   //
      displayd3();
    }

    else if ( value == 67) {   //
      displaye3();
    }

    else if ( value == 68) {   //
      displayf3();
    }

    else if ( value == 69) {   //
      displayg3();
    }

    else if (value == 70) {   //
      displayh3();
    }

    else if ( value == 71) {   //
      displayi3();
    }

    else if ( value == 72) {   //
      displayface1();
    }

    else if ( value == 73) {   //
      displayface2();
    }

    else if ( value == 74) {   //
      displayface3();
    }

    else if ( value == 75) {   //
      displayface4();
    }

    else if ( value == 76) {   //
      displayface5();
    }

    else if ( value == 77) {   //
      displayface6();
    }

    else if ( value == 78) {   //
      displayface7();
    }

    else if ( value == 79) {   //
      displayface8();
    }

    else if ( value == 80) {   //
      displayface9();
    }

    else if ( value == 81) {   //
      displayflake2();
    }

    else if (value == 82) {   //
      displayflake1();
    }

    else if (value == 83) {   //
      displayflake3();
    }


    else if ( value == 86) {   //
      displayflake4();
    }


    else if ( value == 85) {   //
      displayflake5();
    }


    else if (value == 84) {   //
      displayflake6();
    }

    else if ( value == 87) {   //
      displayflake7();
    }


    else if (value == 88) {   //
      displayflake8();
    }


    else if ( value == 89) {   //
      displayflake9();
    }

    else if (value == 90) {   //
      displayflake10();
    }


    else if ( value == 91) {   //
      displayflake11();
    }


    else if ( value == 92) {   //
      displayflake12();
    }

    else if ( value == 93) {   //
      displayflake13();
    }


    else if ( value == 94) {   //
      displayflake14();
    }


    else if (value == 95) {   //
      displayflake15();
    }

    else if (value == 96) {   //
      displayflake16();
    }


    else if ( value == 97) {   //
      displayflake17();
    }


    else if (value == 98) {   //
      displayflake18();
    }

    else if ( value == 99) {   //
      displayflake19();
    }


    else if (value == 100) {   //
      displayflake20();
    }


    else if ( value == 101) {   //
      displayflake21();
    }

    else if ( value == 102) {   //
      displayflake22();
    }


    else if (value == 103) {   //
      displayflake23();
    }


    else if ( value == 104) {   //
      displayflake24();
    }

    else if (value == 105) {   //
      displayflake25();
    }


    else if ( value == 106) {   //
      displayflake26();
    }


    else if ( value == 107) {   //
      displayflake27();
    }

    else if ( value == 108) {   //
      displayflake28();
    }


    else if ( value == 109) {   //
      displayflake29();
    }


    else if ( value == 110) {   //
      displayflake30();
    }

    else if (value == 111) {   //
      displayflake31();
    }


    else if ( value == 112) {   //
      displayflake32();
    }


    else if (value == 113) {   //
      displayflake33();
    }

    else if (value == 114) {   //
      displayalien1();
    }

    else if (value == 115) {   //
      displayalien2();
    }


    else if ( value == 116) {   //
      displayalien3();
    }

    else if (value == 117) {   //
      displayalien4();
    }

    else if (value == 118) {   //
      displayalien5();
    }

    else if (value == 119) {   //
      displayalien6();
    }

    else if ( value == 120) {   //
      displayalien7();
    }

    else if (value == 121) {   //
      displaytriangle1();
    }

    else if ( value == 122) {   //
      displaytriangle2();
    }

    else if (value == 123) {   //
      displaytriangle3();
    }

    else if ( value == 124) {   //
      displaytriangle4();
    }

    else if ( value == 125) {   //
      displaytriangle5();
    }

    else if (value == 126) {   //
      displaytriangle6();
    }

    else if ( value == 127) {   //
      displaytriangle7();
    }
  }

  if (number == 79) {
    if ( value == 0) {   //
      display7count0();
    }
    else if ( value == 1) {   //
      display7count1();
    }

    else if (value == 2) {   //
      display7count2();
    }
    else if (value == 3) {   //
      display7count3();
    }

    else if ( value == 4) {   //
      display7count4();
    }
    else if ( value == 5) {   //
      display7count5();
    }

    else if (value == 6) {   //
      display7count6();
    }
    else if ( value == 7) {   //
      display7count7();
    }

    else if ( value == 8) {   //
      display7count8();
    }
    else if ( value == 9) {   //
      display7count9();
    }

    else if ( value == 10) {   //
      display7count10();
    }
    else if ( value == 11) {   //
      display7count11();
    }

    else if ( value == 12) {   //
      display7count12();
    }
    else if ( value == 13) {   //
      display7count13();
    }

    else if (value == 14) {   //
      display7count14();
    }
    else if ( value == 15) {   //
      display7count15();
    }

    else if (value == 16) {   //
      display7count16();
    }

    else if ( value == 17) {   //
      display7count17();
    }
    else if ( value == 18) {   //
      display7count18();
    }

    else if (value == 19) {   //
      display7count19();
    }
    else if ( value == 20) {   //
      display7count20();
    }

    else if ( value == 21) {   //
      display7count21();
    }
    else if ( value == 22) {   //
      display7count22();
    }

    else if ( value == 23) {   //
      display7count23();
    }
    else if (value == 24) {   //
      display7count24();
    }

    else if ( value == 25) {   //
      display7count25();
    }
    else if ( value == 26) {   //
      display7count26();
    }

    else if ( value == 27) {   //
      display7count27();
    }
    else if ( value == 28) {   //
      display7count28();
    }

    else if ( value == 29) {   //
      display7count29();
    }
    else if (value == 30) {   //
      display7count30();
    }

    else if ( value == 31) {   //
      display7count31();
    }
    else if ( value == 32) {   //
      display7count32();
    }

    else if ( value == 33) {   //
      display7count33();
    }
    else if ( value == 34) {   //
      display7count34();
    }

    else if ( value == 35) {   //
      display7count35();
    }
    else if ( value == 36) {   //
      display7count36();
    }

    else if ( value == 37) {   //
      display7count37();
    }
    else if ( value == 38) {   //
      display7count38();
    }

    else if (value == 39) {   //
      display7count39();
    }
    else if ( value == 40) {   //
      display7count40();
    }

    else if ( value == 41) {   //
      display7count41();
    }

    else if ( value == 42) {   //
      display7count42();
    }

    else if ( value == 43) {   //
      display7count43();
    }
    else if (value == 44) {   //
      display7count44();
    }

    else if ( value == 45) {   //
      display7count45();
    }

    else if ( value == 46) {   //
      display7count46();
    }

    else if ( value == 47) {   //
      display7count47();
    }

    else if (value == 48) {   //
      display7count48();
    }
    else if ( value == 49) {   //
      display7count49();
    }

    else if ( value == 50) {   //
      display7count50();
    }

    else if ( value == 51) {   //
      display7count51();
    }

    else if (value == 52) {   //
      display7count52();
    }

    else if ( value == 53) {   //
      display7count53();
    }
    else if (value == 54) {   //
      display7count54();
    }

    else if ( value == 55) {   //
      display7count55();
    }

    else if ( value == 56) {   //
      display7count56();
    }

    else if ( value == 57) {   //
      display7count57();
    }

    else if (value == 58) {   //
      display7count58();
    }
    else if (value == 59) {   //
      display7count59();
    }

    else if (value == 60) {   //
      display7count60();
    }

    else if ( value == 61) {   //
      display7count61();
    }

    else if ( value == 62) {   //
      display7count62();
    }

    else if ( value == 63) {   //
      display7count63();
    }
    else if ( value == 64) {   //
      display7count64();
    }

    else if ( value == 65) {   //
      display7count65();
    }

    else if ( value == 66) {   //
      display7count66();
    }

    else if ( value == 67) {   //
      display7count67();
    }

    else if ( value == 68) {   //
      display7count68();
    }
    else if ( value == 69) {   //
      display7count69();
    }

    else if ( value == 70) {   //
      display7count70();
    }

    else if ( value == 71) {   //
      display7count71();
    }

    else if ( value == 72) {   //
      display7count72();
    }

    else if ( value == 73) {   //
      display7count73();
    }
    else if ( value == 74) {   //
      display7count74();
    }

    else if ( value == 75) {   //
      display7count75();
    }

    else if ( value == 76) {   //
      display7count76();
    }

    else if ( value == 77) {   //
      display7count77();
    }

    else if ( value == 78) {   //
      display7count78();
    }
    else if ( value == 79) {   //
      display7count79();
    }

    else if ( value == 80) {   //
      display7count80();
    }

    else if ( value == 81) {   //
      display7count81();
    }

    else if ( value == 82) {   //
      display7count82();
    }

    else if ( value == 83) {   //
      display7count83();
    }
    else if ( value == 84) {   //
      display7count84();
    }

    else if ( value == 85) {   //
      display7count85();
    }

    else if ( value == 86) {   //
      display7count86();
    }

    else if (value == 87) {   //
      display7count87();
    }

    else if (value == 88) {   //
      display7count88();
    }
    else if ( value == 89) {   //
      display7count89();
    }

    else if ( value == 90) {   //
      display7count90();
    }

    else if ( value == 91) {   //
      display7count91();
    }

    else if (value == 92) {   //
      display7count92();
    }

    else if ( value == 93) {   //
      display7count93();
    }
    else if ( value == 94) {   //
      display7count94();
    }

    else if ( value == 95) {   //
      display7count95();
    }

    else if ( value == 96) {   //
      display7count96();
    }

    else if (value == 97) {   //
      display7count97();
    }

    else if ( value == 98) {   //
      display7count98();
    }
    else if ( value == 99) {   //
      display7count99();
    }

    else if ( value == 100) {   //
      display7count100();
    }

    else if ( value == 101) {   //
      display7count101();
    }

    else if ( value == 102) {   //
      display7count102();
    }

    else if ( value == 103) {   //
      display7count103();
    }
    else if ( value == 104) {   //
      display7count104();
    }

    else if (value == 105) {   //
      display7count105();
    }

    else if (value == 106) {   //
      display7count106();
    }

    else if ( value == 107) {   //
      display7count107();
    }

    else if ( value == 108) {   //
      display7count108();
    }
    else if ( value == 109) {   //
      display7count109();
    }

    else if ( value == 110) {   //
      display7count110();
    }

    else if ( value == 111) {   //
      display7count111();
    }

    else if (value == 112) {   //
      display7count112();
    }

    else if (value == 113) {   //
      display7count113();
    }
    else if ( value == 114) {   //
      display7count114();
    }

    else if ( value == 115) {   //
      display7count115();
    }

    else if ( value == 116) {   //
      display7count116();
    }

    else if ( value == 117) {   //
      display7count117();
    }

    else if ( value == 118) {   //
      display7count118();
    }
    else if (value == 119) {   //
      display7count119();
    }

    else if ( value == 120) {   //
      display7count120();
    }

    else if ( value == 121) {   //
      display7count121();
    }

    else if ( value == 122) {   //
      display7count122();
    }

    else if ( value == 123) {   //
      display7count123();
    }
    else if ( value == 124) {   //
      display7count124();
    }

    else if ( value == 125) {   //
      display7count125();
    }

    else if ( value == 126) {   //
      display7count126();
    }

    else if ( value == 127) {   //
      display7count127();
    }
  }


}




void SPIwrite() {
#define TSPEED 1000000 //1Mhz
  unsigned int chan1 = 0;
  unsigned int chan2 = 0;
  byte address1 = 0;
  byte address2 = 0;
  byte address3 = 0;
  SPISettings TLC5947(TSPEED , MSBFIRST, SPI_MODE0);
  // packing each 2 channel (12bit*2) to 3 byte (8bit*3) for transfering
  SPI.beginTransaction(TLC5947);
  // digitalWriteFast(latch, HIGH);
  digitalWriteFast(latch, LOW);
  for (unsigned int ledpos = 24  * NUM_TLC5974 ; ledpos > 0; ledpos = ledpos - 2) {
    chan1 = tlc.getCHAN(ledpos - 1);
    chan2 = tlc.getCHAN(ledpos - 2);
    address1 = (byte)(chan1 >> 4) ;
    address2 = (byte)((chan1 << 4) & (B11110000)) + (byte)((chan2 >> 8) & (B00001111));
    address3 = (byte)chan2;
    /* address1 = B00000000;
      address2 = B00000000;
      address3 = B00000000;*/
    SPI.transfer(address1);
    SPI.transfer(address2);
    SPI.transfer(address3);
  }

  SPI.endTransaction();
  //  digitalWriteFast(latch, LOW);
  digitalWriteFast(latch, HIGH);
  digitalWriteFast(latch, LOW);
  digitalWriteFast(clock, LOW);
}
 
Status
Not open for further replies.
Back
Top