Go Down

Topic: Make the Arduino funky (Read 1 time) previous topic - next topic

fingerfarm

Was feeling a bit bored, so I thought I'd train my Arduino to play the bassline from 'Good Times'  (also heard on 'Rappers Delight').

enjoy...

Code: [Select]

/**
* Arduino playing 'Good Times' Bassline by Chic
* Some code used and repurposed from:
* http://rob.gubler.net/devel/ArduinoJingleBells/jinglebells.pde
*
* Hook up a Piezo Buzzer or small speaker's ground (-) to pin 13, and (+) to 5v
*
* Note frequencies courtesy of:
* http://www.phy.mtu.edu/~suits/notefreqs.html
*
*/

#define FREQ_C2 65.41
#define FREQ_CS2 69.30
#define FREQ_D2 73.42
#define FREQ_DS2 77.78
#define FREQ_E2 82.41
#define FREQ_F2 87.31
#define FREQ_FS2 92.5
#define FREQ_G2 98
#define FREQ_GS2 103.83
#define FREQ_A2 110.00
#define FREQ_B2 123.47

#define FREQ_C3 130.81
#define FREQ_CS3 138.59
#define FREQ_D3 146.83
#define FREQ_DS3 155.56
#define FREQ_E3 164.81
#define FREQ_F3 174.61
#define FREQ_FS3 185
#define FREQ_G3 196
#define FREQ_GS3 207.65
#define FREQ_A3 220.00
#define FREQ_AS3 233.08
#define FREQ_B3 246.94

#define FREQ_C4 261.63 //Middle C
#define FREQ_CS4 277.18
#define FREQ_DF4 277.18
#define FREQ_D4 293.66
#define FREQ_DS4 311.13
#define FREQ_E4 329.63
#define FREQ_F4 349.23
#define FREQ_FS4 369.99
#define FREQ_G4 392.00
#define FREQ_GS4 415.30
#define FREQ_A4 440.00
#define FREQ_B4 493.88

#define FREQ_C5 523.25
#define FREQ_D5 587.33

#define WHOLE_NOTE_TIME 2000


#define OUTPIN 13

void setup() {
}
void loop() {
 char music[] =
   "ee eee eee q seeesfegeaebecedeEeae eae eae q saeasFsasGsasFeaeasbsesge e";
 PlayMusicString(music,OUTPIN);
}

void PlayMusicString(char* music, int outputPin){
 int noteCount=strlen(music);
 float freq;
 int duration;
 for (int i=0; i < noteCount; i += 2) {
   switch(music[i]){
     case ' ' :
       freq=0;
       break;
     case 'D' :
       freq=FREQ_D2;
       break;
     case 'e' :
       freq=FREQ_E2;
       break;
     case 'f' :
       freq=FREQ_FS2;
       break;
     case 'g' :
       freq=FREQ_G2;
       break;
     case 'a' :
       freq=FREQ_A2;
       break;
     case 'b' :
       freq=FREQ_B2;
       break;
     case 'c' :
       freq=FREQ_CS3;
       break;
     case 'd' :
       freq=FREQ_D3;
       break;
     case 'E' :
       freq=FREQ_E3;
       break;
     case 'F' :
       freq=FREQ_FS3;
       break;
     case 'G' :
       freq=FREQ_G3;
       break;
       
   }
   //Note Timing
   switch(music[i+1]){
     case 'w' :
       duration=WHOLE_NOTE_TIME;
       break;
     case 'h' :
       duration=WHOLE_NOTE_TIME/2;
       break;
     case 'q' :
       duration=WHOLE_NOTE_TIME/4;
       break;
     case 'e' :
       duration=WHOLE_NOTE_TIME/8;
       break;
     case 's' :
       duration=WHOLE_NOTE_TIME/16;
       break;  
   }
   Sound(freq,duration,outputPin);
   delay(WHOLE_NOTE_TIME/64);
 }
}

void Sound(float freq, int durationMS, int outputPin) {
 int halfPeriod;
 float period;
 int durationCycles;
 //Check for rest, 0 frequency is a rest for durationMS.
 if(freq==0.0) {
   //0 frequency so we stay quiet for duration
   delay (durationMS);
 }
 else { //Frequency is not zero so we have work to do
   // turn on output pin
   pinMode(outputPin, OUTPUT);
   //calculate the period or cycle time for the given frequency
   period=1/freq; //Take the reciprocal to get time in seconds
   period=period*1.0E6; //to covert seconds to uS.
   //divide that by 2 to get the 1/2 cycle time. convert to int at the same time
   halfPeriod = (int)(period/2.0) - 7; // subtract 7 us to make up for digitalWrite overhead

   // calculate cycles for duration.
   durationCycles = (int)(((float)durationMS*1000.0)/period); // play note for duration ms
   for (int i=0; i<durationCycles; i++){
     digitalWrite(outputPin, HIGH);
     delayMicroseconds(halfPeriod);
     digitalWrite(outputPin, LOW);
     delayMicroseconds(halfPeriod - 1); // - 1 to make up for fractional microsecond                                              in digitaWrite overhead
   }
   // shut off pin to avoid noise from other operations
   pinMode(outputPin, INPUT);
 }
}

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy