/**********************************************************
 * NAME:                 Sound Generation via MIDI
 * WRITTEN BY:           TOM SCARFF
 * DATE:                 12/1/2009
 * FILE SAVED AS:        MIDI_RANDOM.pde
 * FOR:                  Miduino ATmega168
 * CLOCK:                16.00 MHz CRYSTAL                                        
 * PROGRAMME FUNCTION:   Output MIDI Note ON/OFF data to produce a random 'tune' 
 * 
 *************************************************************************/

#define LedPin 13
long randNumber;
byte note;
byte velocity;
byte wait1;
byte wait2;
byte x;

void setup() {
  pinMode(LedPin, OUTPUT);
  pinMode(12, INPUT);     // switch for midi 31250 or 38400
  digitalWrite(12, HIGH); // Set inputs Pull-up resistors High

  randomSeed(analogRead(0));
  
   pinMode(LedPin,OUTPUT);   // declare the LED's pin as output

  for (x=1; x<=4; x++){
    digitalWrite( LedPin, HIGH );
    delay(300);
    digitalWrite( LedPin, LOW );
    delay(300);
  }

  if(digitalRead(12)==HIGH){
    Serial.begin(38400);  //start serial with midi baudrate 38400 Roland MIDI
  }
  else if(digitalRead(12)==LOW){
    Serial.begin(31250);  //start serial with midi baudrate 31250
  }
  Serial.flush();

}

void loop() {
  
  randNumber = random(24, 127);
  note = randNumber;
  randNumber = random(10, 127);
  velocity = randNumber;
  randNumber = random(1, 250);
  wait1 = randNumber;
  randNumber = random(1, 250);
  wait2 = randNumber;
  

  noteOn(0,note,velocity);
  delay(wait1); // Delay 
  noteOff(0,note,velocity);
  delay(wait2); // Delay 
}

// End of main programme Loop++++++++++++++++++++++++++++++++++++++++++++++++++++++



// Send a MIDI note-on message.  Like pressing a piano key
void noteOn(byte channel, byte note, byte velocity) {
  midiMsg( (0x90 | channel), note, velocity);
}

// Send a MIDI note-off message.  Like releasing a piano key
void noteOff(byte channel, byte note, byte velocity) {
  midiMsg( (0x80 | channel), note, velocity);
}

// Send a general MIDI message
void midiMsg(byte cmd, byte data1, byte data2) {
  digitalWrite(LedPin,HIGH);  // indicate we're sending MIDI data
  Serial.print(cmd, BYTE);
  Serial.print(data1, BYTE);
  Serial.print(data2, BYTE);
  digitalWrite(LedPin,LOW);
}