leo3065

[Arduino] Midi-controlled LED Ring

May 9th, 2017
2,285
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.07 KB | None | 0 0
  1. #include <Adafruit_NeoMatrix.h>
  2. #include <gamma.h>
  3.  
  4. #include <MIDIUSB.h>
  5.  
  6. #define LED_RING 3
  7. #define LED_PIN 13
  8. #define NUM 24
  9.  
  10. Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUM, LED_RING, NEO_GRB + NEO_KHZ800);
  11.  
  12. int led[NUM][3];
  13. int notes[NUM];
  14.  
  15. void setup() {
  16.   pinMode(LED_PIN, OUTPUT);
  17.  
  18.   Serial.begin(9600);
  19.   pixels.begin();
  20.  
  21.   for (int i = 0; i < NUM; i++) {
  22.     for (int j = 0; j < 3; j++) {
  23.        led[i][j]=0;
  24.     }
  25.   }
  26. }
  27.  
  28. void loop() {
  29.   midiEventPacket_t rx;
  30.   do {
  31.     rx = MidiUSB.read();
  32.     MidiUSB.sendMIDI(rx);
  33.     if (rx.header == 9) {
  34.       digitalWrite(LED_PIN,1);
  35.       int note=rx.byte2;
  36.       int vol=rx.byte3;
  37.       int group=note/NUM;
  38.       int number=note%NUM;
  39.      
  40.       notes[number]+=3*vol+128;
  41.       notes[number]=max(notes[number],4096);
  42.       int r=0,g=0,b=0;
  43.       switch(group){
  44.         case 0:
  45.           r=16;g=0;b=0; break;
  46.         case 1:
  47.           r=12;g=6;b=0; break;
  48.         case 2:
  49.           r=0;g=16;b=0; break;
  50.         case 3:
  51.           r=0;g=6;b=12; break;
  52.         case 4:
  53.           r=0;g=0;b=16; break;
  54.         default:
  55.           r=6;g=6;b=6;
  56.       }
  57.       r*=vol;g*=vol;b*=vol;
  58.       led[number][1]=max(led[number][1],r);
  59.       led[number][2]=max(led[number][2],g);
  60.       led[number][3]=max(led[number][3],b);
  61.      
  62.       digitalWrite(LED_PIN,0);
  63.     }
  64.    
  65.     if (rx.header == 8) {
  66.       digitalWrite(LED_PIN,1);
  67.       int note=rx.byte2;
  68.       int number=note%NUM;
  69.      
  70.       notes[number]=max(notes[number]-512,0);
  71.      
  72.       digitalWrite(LED_PIN,0);
  73.     }
  74.   } while (rx.header != 0);
  75.  
  76.   for (int i = 0; i < NUM; i++) {
  77.     pixels.setPixelColor(NUM-i-1, pixels.Color(led[i][1]/16,led[i][2]/16,led[i][3]/16) ) ;
  78.    
  79.     led[i][1]-=max(led[i][1]/(24+notes[i]/64),notes[i]?0:5);
  80.     led[i][2]-=max(led[i][2]/(24+notes[i]/64),notes[i]?0:5);
  81.     led[i][3]-=max(led[i][3]/(24+notes[i]/64),notes[i]?0:5);
  82.     led[i][1]=max(led[i][1],0);
  83.     led[i][2]=max(led[i][2],0);
  84.     led[i][3]=max(led[i][3],0);
  85.  
  86.     notes[i]=max(notes[i]-64,0);
  87.   }
  88.   pixels.show();
  89.   delay(2);
  90. }
Advertisement
Add Comment
Please, Sign In to add comment