byte incomingByte; byte note; byte velocity; int statusLed = 13; // select the pin for the LED int action = 2; //0 =note off ; 1=note on ; 2= nada //setup: declaring iputs and outputs and begin serial void setup() { pinMode(statusLed, OUTPUT); // declare the LED's pin as output int inMin = 22; // Lowest input pin int inMax = 53; // Highest input pin for (int i = inMin; i <= inMax; i++) { pinMode(i, OUTPUT); } Serial1.begin(38400); digitalWrite(statusLed, HIGH); } //loop: wait for serial data, and interpret the message void loop () { if (Serial1.available() > 0) { // read the incoming byte: incomingByte = Serial1.read(); // wait for as status-byte, channel 1, note on or off if (incomingByte == 144) { // note on message starting starting action = 1; } else if (incomingByte == 128) { // note off message starting action = 0; } else if (incomingByte == 208) { // aftertouch message starting //not implemented yet } else if (incomingByte == 160) { // polypressure message starting //not implemented yet } else if ( (action == 0) && (note == 0) ) { // if we received a "note off", we wait for which note (databyte) note = incomingByte; playNote(note, 0); note = 0; velocity = 0; action = 2; } else if ( (action == 1) && (note == 0) ) { // if we received a "note on", we wait for the note (databyte) note = incomingByte; } else if ( (action == 1) && (note != 0) ) { // ...and then the velocity velocity = incomingByte; playNote(note, velocity); note = 0; velocity = 0; action = 0; } else { //nada } } } void blink() { digitalWrite(statusLed, HIGH); delay(100); digitalWrite(statusLed, LOW); delay(100); } void playNote(byte note, byte velocity) { int value = LOW; if (velocity > 10) { value = HIGH; } else { value = LOW; } if (note > 52 && note < 85) { digitalWrite((note - 31), value); } }