MIDI

/*
  MIDI player
 by Tom Igoe
 
 Reads an analog value in on analog channel 0, and if a switch on pin 10 is pressed,
 plays a note in the middle C octave corresponding to the analog value. 
 
 Thanks to Ryan Holsopple for getting MIDI out working using serialWrite()
 
 Created 19 Jan. 2006
 updated  
 
 */
// The switch is on Arduino pin 10:
#define switchPin 10
// Middle C (MIDI note value 60) is the lowest note we'll play:
#define middleC 60
//  Indicator LED:
#define LEDpin 13

// Variables:
char note = 0;            // The MIDI note value to be played
int AnalogValue = 0;           // value from the analog input
int lastNotePlayed = 0;   // note turned on when you press the switch
int lastSwitchState = 0;  // state of the switch during previous time through the main loop

//Function prototype:
void noteOn(char cmd, char data1, char data2);
void blink();

void setup() {
  //  set the states of the I/O pins:
  pinMode(switchPin, INPUT);
  pinMode(LEDpin, OUTPUT);
  //  Set MIDI baud rate:
  beginSerial(31250);
  blink(3);
}


void loop() {
  //  My potentiometer gave a range from 0 to 1023:
  AnalogValue = analogRead(0);
  //  convert to a range from 0 to 11:
  note = AnalogValue / 100;

  // Check to see that the switch is pressed:
  if (digitalRead(switchPin) == 1) {
    //  check to see that the switch wasn't pressed last time
    //  through the main loop:
    if (lastSwitchState == 0) {
      // set the note value based on the analog value
      note = note + middleC;
      // start a note playing:
      noteOn(0x90,  note, 0x40);
      // save the note we played, so we can turn it off:
      lastNotePlayed = note;
    }
    else    // if the switch is not pressed:
    //  but the switch was pressed last time through the main loop:
    if (lastSwitchState == 1) {
      //  stop the last note played:
      noteOn(0x90, lastNotePlayed, 0x00);
    } 
  }

  //  save the state of the switch for next time
  //  through the main loop:
  lastSwitchState = switchPin;
}

//  plays a MIDI note.  Doesn't check to see that
//  cmd is greater than 127, or that data values are  less than 127:
void noteOn(char cmd, char data1, char data2) {
  serialWrite(cmd);
  serialWrite(data1);
  serialWrite(data2);
}

// Blinks an LED 3 times
void blink() {
  int i;
  for (i=0; i<2; i++) {
    digitalWrite(LEDpin, HIGH);
    delay(100);
    digitalWrite(LEDpin, LOW);
    delay(100);
  }
}