/* Simple program to introduce robot commands for the scribbler robot
   this program causes the scribbler to beep once
*/

#include <MyroC.h>

/* ***********************************************************
 * define initial variables regarding tempo, beats, and pitch
 * ************************************************************ */

/* tempo gives seconds per beat */
/*const double tempo = 1.0/2.0; */ // a beat is 1/2 second 
/* C does not allow a constant identifier to be used in defining other 
   constants, so use #define to define tempo as a computable number */
#define tempo 0.5

/* variable beatm_n indicates m.n beats,
 *   so beat1_5 is 1 1/2 beats */
const double beat_5   = tempo / 2.0;
const double beat1    = tempo;
const double beat1_5  = tempo * 1.5;
const double beat2    = tempo * 2;
const double beat2_5  = tempo * 2.5;
const double beat3    = tempo * 3;
const double beat3_5  = tempo * 3.5;
const double beat4    = tempo * 4;
const double beat5    = tempo * 5;
const double beat6    = tempo * 6;
const double beat7    = tempo * 7;
    
/* pitches in treble clef, with octave 1 just above middle C
 *   all pitches are tuned to concert A = 440
 *   for variable names, s or f means sharp or flat
 *   number at end of variable name gives octave above middle C
 *   the following frequencies are from the Piano_key_frequencies article 
 in Wikipedia */
const int silence  = 0;
const int pitchB3  = 246;
const int pitchC4  = 261;
const int pitchDf4 = 277;
const int pitchCs4 = 277; /* = pitchDf4; */
const int pitchD4  = 293;
const int pitchEf4 = 311;
const int pitchDs4 = 311; /* = pitchEf4; */
const int pitchE4  = 329;
const int pitchF4  = 349;
const int pitchGf4 = 369;
const int pitchFs4 = 369; /* = pitchGf4; */
const int pitchG4  = 391;
const int pitchAf4 = 415;
const int pitchGs4 = 415; /* = pitchAf1; */
const int pitchA4  = 440;
const int pitchBf4 = 466;
const int pitchAs4 = 466; /* = pitchBf4; */
const int pitchB4  = 493;
const int pitchC5  = 523;
const int pitchDf5 = 554;
const int pitchCs5 = 554; 
const int pitchD5  = 587;
const int pitchEf5 = 622;
const int pitchDs5 = 622;
const int pitchE5  = 659;
const int pitchF5  = 698;
const int pitchGf5 = 739;
const int pitchFs5 = 739; 
const int pitchG5  = 783;
const int pitchAf5 = 830;
const int pitchGs5 = 830;
const int pitchA5  = 880;
const int pitchBf5 = 932;
const int pitchAs5 = 932;
const int pitchB5  = 987;
const int pitchC6 = 1046;

/* ***********************************************************
 * playing a note includes separating notes from each other 
 *     (by amount 0.1 * tempo)
 * ************************************************************ */
void play (double duration, double pitch) 
{
  rBeep (duration - 0.1 * tempo, pitch);
  rBeep (0.1 * tempo, 0.0);
}

/* ***********************************************************
 * play Spirit Song by John Wimbar (from Songs book, page 170A)
 * ************************************************************ */
void play_spirit_song ()
{
  // introduction
  //speak("Spirit Song by John Wimbar");

  /*
  rBeep (0.25, 0);
  if (tempo == 1)
    speak("The song is played with 1 beat taking 1 second.");
  else
    {
      char str[80];  
      sprintf (str, "The song is played with 1 beat taking %0.2f seconds.",
		      tempo);
      speak(str);    
	  }
  rBeep (0.25, 0);
  */
  
  // first phrase
  play (beat1  , pitchE5);
  play (beat1  , pitchF5);
  play (beat1  , pitchG5);
  play (beat1_5, pitchA5);
  play (beat_5 , pitchA5);
  play (beat1_5, pitchA5);
  play (beat_5 , pitchA5);
  play (beat1  , pitchA5);
  play (beat1  , pitchD5);
  play (beat1  , silence);
    
  // second phrase
  play (beat_5 , pitchE5);
  play (beat_5 , pitchF5);
  play (beat1_5, pitchG5);
  play (beat_5 , pitchG5);
  play (beat1_5, pitchG5);
  play (beat_5 , pitchA5);
  play (beat2  , pitchC5);
  play (beat1  , silence);
    
  // third phrase 
  play (beat_5 , pitchD5);
  play (beat_5 , pitchE5);
  play (beat1_5, pitchF5);
  play (beat_5 , pitchF5);
  play (beat1_5, pitchF5);
  play (beat_5 , pitchF5);
  play (beat1  , pitchF5);
  play (beat1  , pitchB4);
  play (beat1_5, pitchC5);
  play (beat_5 , pitchD5);
  play (beat4  , pitchE5);
  play (beat1  , silence);
    
  // fourth phrase = first phrase
  play (beat1  , pitchE5);
  play (beat1  , pitchF5);
  play (beat1  , pitchG5);
  play (beat1_5, pitchA5);
  play (beat_5 , pitchA5);
  play (beat1_5, pitchA5);
  play (beat_5 , pitchA5);
  play (beat1  , pitchA5);
  play (beat1  , pitchD5);
  play (beat1  , silence);
    
  // fifth phrase = second phrase
  play (beat_5 , pitchE5);
  play (beat_5 , pitchF5);
  play (beat1_5, pitchG5);
  play (beat_5 , pitchG5);
  play (beat1_5, pitchG5);
  play (beat_5 , pitchA5);
  play (beat2  , pitchC5);
  play (beat1  , silence);
    
  // sixth phrase = third phrase with different ending 
  play (beat_5 , pitchD5);
  play (beat_5 , pitchE5);
  play (beat1_5, pitchF5);
  play (beat_5 , pitchF5);
  play (beat1  , pitchF5);
  play (beat1  , pitchE5);
  play (beat1_5, pitchD5);
  play (beat_5 , pitchD5);
  play (beat1  , pitchC5);
  play (beat1  , pitchB4);
  play (beat7  , pitchC5);
  play (beat1  , silence);
    
  // Chorus
  play (beat4  , pitchA5);
  play (beat3  , pitchB5);
  play (beat1  , pitchA5);
  play (beat4  , pitchG5);
  play (beat3  , pitchE5);
  play (beat1  , silence);
    
  play (beat3  , pitchF5);
  play (beat1  , pitchA5);
  play (beat3  , pitchG5);
  play (beat1  , pitchF5);
  play (beat5  , pitchE5);
  play (beat3  , silence);
  
  play (beat4  , pitchA5);
  play (beat3  , pitchB5);
  play (beat1  , pitchA5);
  play (beat4  , pitchG5);
  play (beat3  , pitchE5);
  play (beat1  , silence);
    
  play (beat3  , pitchF5);
  play (beat1  , pitchE5);
  play (beat3  , pitchD5);
  play (beat1  , pitchC5);
  play (beat5  , pitchC5);
  play (beat1  , silence);
}

void pirates ()
{
  // First section (43 notes)
  rBeep (0.5, pitchE5);
  rBeep (0.25, pitchE5);
  rBeep (0.25, pitchF5);
  rBeep (0.25, pitchE5);
  rBeep (0.25, pitchF5);
  rBeep (0.5, pitchE5);
  rBeep (0.25, pitchE5);
  rBeep (0.25, pitchF5);
  rBeep (0.25, pitchE5);
  rBeep (0.25, pitchF5);
  rBeep (0.5, pitchE5);
  rBeep (0.25, pitchE5);
  rBeep (0.25, pitchF5);
  rBeep (0.25, pitchE5);
  rBeep (0.25, pitchF5);
  rBeep (0.5, pitchE5);
  rBeep (0.25, pitchE5);
  rBeep (0.25, pitchF5);
  rBeep (0.25, pitchG5);
  rBeep (0.25, pitchF5);
  rBeep (0.5, pitchE5);
  rBeep (0.25, pitchE5);
  rBeep (0.25, pitchF5);
  rBeep (0.25, pitchE5);
  rBeep (0.25, pitchF5);
  rBeep (0.5, pitchE5);
  rBeep (0.25, pitchE5);
  rBeep (0.25, pitchF5);
  rBeep (0.25, pitchE5);
  rBeep (0.25, pitchF5);
  rBeep (0.5, pitchE5);
  rBeep (0.25, pitchE5);
  rBeep (0.25, pitchF5);
  rBeep (0.25, pitchE5);
  rBeep (0.25, pitchF5);
  rBeep (0.5, pitchE5);
  rBeep (0.25, pitchE5);
  rBeep (0.25, pitchF5);
  rBeep (0.25, pitchG5);
  rBeep (0.25, pitchF5);
  rBeep (0.5, pitchE5);
  rBeep (0.5, pitchE5);
  rBeep (0.5, pitchE5);


  // Second section (21 notes)
  rBeep (0.5, pitchD5);
  rBeep (0.25, pitchC5);
  rBeep (0.25, pitchD5);
  rBeep (0.25, pitchE5);
  rBeep (0.25, pitchF5);
  rBeep (0.25, pitchA4);
  rBeep (0.5, pitchD5);
  rBeep (0.25, pitchF5);
  rBeep (0.25, pitchE5);
  rBeep (0.25, pitchC5);
  rBeep (0.25, pitchD5);
  rBeep (0.25, pitchA4);
  rBeep (0.5, pitchD5);
  rBeep (0.25, pitchC5);
  rBeep (0.25, pitchD5);
  rBeep (0.25, pitchE5);
  rBeep (0.25, pitchF5);
  rBeep (0.25, pitchG5);
  rBeep (0.5, pitchE5);
  rBeep (0.5, pitchA5);
  rBeep (0.5, pitchA5);


  // Pause
  rBeep (1.0, 0);

  // Third Section (29 notes)
  rBeep (0.5, pitchD5);
  rBeep (0.5, pitchE5);
  rBeep (1, pitchF5);
  rBeep (0.5, pitchG5);
  rBeep (0.5, pitchA5);
  rBeep (0.5, pitchG5);
  rBeep (0.5, pitchF5);
  rBeep (0.5, pitchE5);
  rBeep (0.5, pitchF5);
  rBeep (0.5, pitchG5);
  rBeep (0.5, pitchA5);
  rBeep (0.5, pitchG5);
  rBeep (0.25, pitchF5);
  rBeep (0.25, pitchG5);
  rBeep (0.5, pitchA5);
  rBeep (0.5, pitchG5);
  rBeep (0.5, pitchF5);
  rBeep (0.5, pitchE5);
  rBeep (0.5, pitchF5);
  rBeep (0.5, pitchE5);
  rBeep (1, pitchD5);
  rBeep (0.5, pitchF5);
  rBeep (0.5, pitchE5);
  rBeep (0.25, pitchC5);
  rBeep (0.25, pitchC5);
  rBeep (0.25, pitchG4);
  rBeep (0.25, pitchG4);
  rBeep (0.25, pitchG4);
  rBeep (0.25, pitchG4);


  // Pause
  rBeep (1.0, 0);

  // Fourth section (31 notes)
  rBeep (0.5, pitchD5);
  rBeep (0.25, pitchE5);
  rBeep (0.25, pitchFs5);
  rBeep (0.25, pitchG5);
  rBeep (0.25, pitchE5);
  rBeep (0.5, pitchFs5);
  rBeep (0.5, pitchE5);
  rBeep (0.5, pitchD5);
  rBeep (0.5, pitchE5);
  rBeep (0.25, pitchE5);
  rBeep (0.25, pitchFs5);
  rBeep (0.25, pitchG5);
  rBeep (0.25, pitchE5);
  rBeep (0.5, pitchFs5);
  rBeep (0.5, pitchG5);
  rBeep (0.5, pitchA5);
  rBeep (0.5, pitchA5);
  rBeep (0.25, pitchA5);
  rBeep (0.25, pitchB5);
  rBeep (0.25, pitchC6);
  rBeep (0.25, pitchE5);
  rBeep (0.5, pitchG5);
  rBeep (0.5, pitchFs5);
  rBeep (0.5, pitchE5);
  rBeep (0.5, pitchFs5);
  rBeep (0.5, pitchE5);
  rBeep (0.5, pitchD5);
  rBeep (0.5, pitchE5);
  rBeep (0.5, pitchE5);
  rBeep (0.5, pitchE5);
  rBeep (1, pitchE5);


  // Pause
  rBeep (1.0, 0);

  // Fifth section (33 notes)
  rBeep (0.5, pitchE5);
  rBeep (0.25, pitchE5);
  rBeep (0.25, pitchFs5);
  rBeep (0.25, pitchG5);
  rBeep (0.25, pitchE5);
  rBeep (0.5, pitchFs5);
  rBeep (0.5, pitchE5);
  rBeep (0.5, pitchD5);
  rBeep (0.5, pitchE5);
  rBeep (0.25, pitchE5);
  rBeep (0.25, pitchFs5);
  rBeep (0.25, pitchG5);
  rBeep (0.25, pitchE5);
  rBeep (0.5, pitchFs5);
  rBeep (0.5, pitchG5);
  rBeep (0.5, pitchA5);
  rBeep (0.5, pitchA5);
  rBeep (0.25, pitchA5);
  rBeep (0.25, pitchB5);
  rBeep (0.25, pitchC6);
  rBeep (0.25, pitchE5);
  rBeep (0.5, pitchG5);
  rBeep (0.5, pitchFs5);
  rBeep (0.5, pitchE5);
  rBeep (0.5, pitchFs5);
  rBeep (0.5, pitchE5);
  rBeep (0.5, pitchD5);
  rBeep (0.5, pitchE5);
  rBeep (0.25, pitchG5);
  rBeep (0.25, pitchG5);
  rBeep (0.25, pitchB5);
  rBeep (0.25, pitchB5);
  rBeep (0.5, pitchB5);
}

/* ***********************************************************
 * organize overall interaction with scribbler robot:
 *   correct to scribbler
 *        in connecting on Bluetooth, use password:
 *             1234
 *    play Spirit Song by John Wimbar (from Songs book, page 170A)
 *    disconnect from scribbler
 * ************************************************************ */

int main() 
{

   rConnect("/dev/rfcomm0");

   double left = 0.33;
   double right = 0.66;
   int i;

   for (i = 0; i < 3; i++)
     {
       rMotors (left, right);
       play_spirit_song();

       left = 1 - left;
       right = 1 - right;

       pirates ();
       left = 1 - left;
       right = 1 - right;
      }

   rDisconnect ();

} 
