domenica 3 aprile 2011

MIDI Rainbow

English version below.

Un'altra applicazione del MIDI Shield. Questa volta, invece di generare messaggi MIDI come nell'applicazione "MIDI Sequencer", i messaggi in ingresso alla porta MIDI IN vengono interpretati per visualizzare pattern luminosi su una striscia di LED RGB indirizzabile.

Componenti principali del sistema:
  • Arduino
  • MIDI Shield qui e qui
  • Striscia di LED RGB basata sul chip HL1606
  • Alimentatore 5VDC 1.5A per alimentare la striscia (la corrente in uscita dalla porta USB non è sufficiente)
  • Libreria FastSPI_LED  

Collegamenti tra la striscia e Arduino:
Striscia
Pin di Arduino
GND<--->GND
SI<--->12
DI<--->11
CI<--->13
LI<--->10

I messaggi MIDI provenienti dalla tastiera (vera o simulata da PC) entrano nella porta MIDI IN del MIDI Shield e vengono presentati ad Arduino sulla porta seriale. Il firmware in Arduino interpreta i messaggi MIDI NoteOn e NoteOff, associa ogni tasto sulla tastiera a cinque ottave (60 tasti) ad un LED della striscia e lo accende del colore associato alla nota. Nel Firmware per controllare la striscia abbiamo usato la libreria FastSPI_LED che permette di indirizzare ogni singolo LED ed accenderlo del colore desiderato (R, G, B).




Una cosa interessante da notare nel firmware è l'utilizzo della funzione millis() per implementare una sorta di multitasking elementare. L'idea è stata presa da questo post dell'utente "westfw" sul forum di Arduino.


unsigned long now, nextMIDI, nextNote, nextPot, nextBTN, nextDemo;

void setup() {
  ...
  ...
  nextMIDI = millis();
  nextNote = millis();
  nextPot = millis();
  nextBTN = millis();
  nextDemo = millis();

  ...
  ...
}

void loop()
{
  now = millis();
  if (demo) {
    if (now >= nextDemo) {
      nextDemo = now + bvel * 2;
      playDemo();
    }
  }
  else {
    if (now >= nextMIDI) {
      nextMIDI = now + 2;
      readMIDI();
    }
  }
  if (now >= nextNote) {
    nextNote = now + 2;
    playNote();
  }
  if (now >= nextPot) {
    nextPot = now + 100;
    readPot();
  }
  if (now >= nextBTN) {
    nextBTN = now + 100;
    readButton();
  }
}



Premendo il tasto in alto sul MIDI Shield si accede alla modalità demo. Nella modalità demo i LED vengono accesi in sequenza con un effetto tipo rinbalzo, il potenziometro in alto controlla la velocità del movimento e il potenziometro in basso il fading.

Link per scaricare il firmware:





Another Arduino MIDI Shield application. This time, instead of generating MIDI messages as in the "MIDI Sequencer", incoming messages to the MIDI IN port are interpreted to display light patterns on a strip of addressable RGB LED.

Main components:

Connections from strip to Arduino:
Strip
Arduino Pin
ND <---> GND
SI <---> 12
DI <---> 11
CI <---> 13
LI <---> 10

MIDI messages from the keyboard (real or simulated on PC) enter the MIDI Shield's MIDI IN and are presented to the Arduino serial port. The Arduino firmware interprets the MIDI messages NoteOn NoteOff, associates each key on the five octaves (60 keys) keyboard to a strip LED and lights it with color associated with the note. In the firmware to control the strip we used the FastSPI_LED library that allows you to address every single LED and turn the desired color (R, G, B).


One interesting thing to note is the use of the firmaware function millis() to implement a sort of elementary multitasking. The idea was taken from this post after user "westfw" on the Arduino forum.


For the code look the italian section.


Pressing the first button of the MIDI Shield demo mode is entered. In demo mode, the LEDs are turned on sequentially with a bouncing effect, the first potentiometer controls the speed of movement and the second potentiometer controls the fading.

Link for firmware downloading:
MIDI_Rainbow.zip

4 commenti:

  1. Hi,
    There is a piano in my house so I plan to set up
    a device with similar function on it. My question is the midi shield can work as fast as the casio LED keyboard with learning function? Such as Privia PX-500L, Cause there seems to be some delay in the video

    RispondiElimina
  2. I am sorry but I don't know the casio LED keyboard nor the Privia PX-550L. Anyway I don't remember of any delay when I played with this little project (more then an year ago) maybe the delay is only on the video. You can try, is a low cost project, and if you need some help don't hesitate to ask.

    RispondiElimina
  3. Thanks for the reply,the HW is ready
    will start to test it this week

    RispondiElimina
  4. Hello,

    The URL below is my work with special circuit
    http://www.youtube.com/watch?v=kgfg2BVtO2w

    Do you think the same result could be achieved with Arduino?

    Thanks for your comment

    RispondiElimina