#include "Note.h"

const int outputPin = 11 ;

struct noteInfo {
   int  frequency ;    /* frequency in Hz */
   long duration ;     /* duration in mSec */
} ;

#define MIDDLEC 261.625

Note song[] = {
  Note((int)MIDDLEC, 750),
  Note(0, 250),
  Note((int)(MIDDLEC*5/4), 750),
  Note(0, 250),
  Note((int)(MIDDLEC*3/2), 750),
  Note(0, 250),
  Note((int)(MIDDLEC*2), 750),
  Note(0, 250)  
} ;

void playTone(int pin, Note *note) ;
void playTone(int pin, int frequency, int duration) ;

/*
   pin:        input pin for playing note
   frequency:  frequency of the tone in cycles per second (Hz)
               if frequency is 0, play no tone, that is, take a rest
   duration:   length of the tone (or rest) in milliseconds (msec)
 */

void setup() {
  pinMode(outputPin, OUTPUT) ;
}

void loop() {
  int i ;
  for (i = 0; i < sizeof(song)/sizeof(song[0]); ++i) {
    playTone(outputPin, &song[i]) ;
  }
}

void playTone(int pin, Note *note) {
  playTone(pin, note->getFrequency(), note->getDuration()) ;
}

void playTone(int pin, int frequency, int durationMS) {
  if (frequency > 0) {
    int periodUSec = 1000000l / frequency ;
    int halfPeriodUSec = periodUSec/2 ;
    long int durationUSec = durationMS * (long) 1000 ;    
    long int timeSoFarUSec = 0 ;
    while(timeSoFarUSec <= durationUSec) {
      digitalWrite(pin, HIGH) ;
      delayMicroseconds(halfPeriodUSec) ;
      digitalWrite(pin, LOW) ;
      delayMicroseconds(halfPeriodUSec) ;
      timeSoFarUSec = timeSoFarUSec + periodUSec ;
    }
  } else {
    delay(durationMS) ;
  }
}
