//MIDI experiment //takes midi input and converts to parallel nibble at pins 2-5 //remember to disconnect rx pin before uploading //variables int pin2=2; int pin3=3; int pin4=4; int pin5=5; int midiNote=0; int remappedNote=0; int midiVolume=0; byte incomingByte=0; int midiValue=0; int statevariable=0; //functions //pin 10 display note is sharp int checkMidi () { remappedNote=-1; if (Serial.available() > 0) { // read the incoming byte: incomingByte = Serial.read(); if ((incomingByte & 0xF0) == 0x90) // note on message starting { statevariable=1; } else if (statevariable==1) //"note on", could be real "note on" or effective "note off" { if (incomingByte!=0) //real "note on" { midiNote=incomingByte; remappedNote= (midiNote+8) % 12; //+8 maps c=0 to e=0 midiNote=0; //reset for next new event statevariable=3; //a velocity will follow } else statevariable=0; //effective note off, done } else if (statevariable==3) //get velocity, done { midiVolume=incomingByte; statevariable=0; } else if (statevariable==3) //real note off, done { statevariable=0; midiNote=0; } } return remappedNote; } void setup () { //start serial with Midi baudrate 31250 or 38400 for debugging Serial.begin(31250); pinMode (pin2,OUTPUT); digitalWrite (pin2,LOW); pinMode (pin3,OUTPUT); digitalWrite (pin3,LOW); pinMode (pin4,OUTPUT); digitalWrite (pin4,LOW); pinMode (pin5,OUTPUT); digitalWrite (pin5,LOW); } void loop () { midiValue=checkMidi(); if (midiValue!=-1) //output note on four pins { if ((midiValue & 0x01)>0) digitalWrite(pin2,HIGH); //lsb else digitalWrite(pin2,LOW); if ((midiValue & 0x02)>0) digitalWrite(pin3,HIGH); else digitalWrite(pin3,LOW); if ((midiValue & 0x04)>0) digitalWrite(pin4,HIGH); else digitalWrite(pin4,LOW); if ((midiValue & 0x08)>0) digitalWrite(pin5,HIGH); else digitalWrite(pin5,LOW); } }