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, LOW);
}
//loop: wait for serial data, and interpret the message
void loop () {
if (Serial1.available() > 0) {
digitalWrite(statusLed, HIGH);
// 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 > 84 && note < 109) {
digitalWrite((note - 63), value);
}
}