Song-Playing Shirt

For exercise three, I used a buzzer embedded in a shirt to play two holiday-themed songs, each activated by a button.  The buzzer plays songs by using an array of notes and an array of beats.  The notes are found by converting standard pitch notes into frequencies and then into periods using the formula period = 1/frequency.

Video:

http://www.vimeo.com/2049436

Code (adapted from buzzer code on Arduino website):

// TONES  ==========================================
// Start by defining the relationship between
//       note, period, &  frequency.
#define  lowa  4545    // 220 Hz
#define  lowb  4048    // 247 Hz
#define  c     3830    // 261 Hz
#define  d     3400    // 294 Hz
#define  e     3038    // 329 Hz
#define  f     2865    // 349 Hz
#define  g     2550    // 392 Hz
#define  a     2272    // 440 Hz
#define  as    2145    // 466 Hz  – calculated using period = 1/frequency
#define  b     2028    // 493 Hz
#define  C     1912    // 523 Hz
// Define a special note, ‘R’, to represent a rest
#define  R     0

// SETUP ============================================
// Set up speaker on a PWM pin (digital 9, 10 or 11)
int speakerOut = 9;
int button1 = 2;
int button2 = 4;
int state1 = LOW;
int state2 = LOW;
int reading1;
int previous1 = LOW;
int reading2;
int previous2 = LOW;

long time = 0;
long debounce = 200;

// Do we want debugging on serial out? 1 for yes, 0 for no
int DEBUG = 1;
int counter = 0;
int plays = 1;

void setup() {
pinMode(speakerOut, OUTPUT);
pinMode(button1, INPUT);
pinMode(button2, INPUT);
if (DEBUG) {
Serial.begin(9600); // Set serial out if we want debugging
}
}

// MELODY and TIMING  =======================================
//  melody[] is an array of notes, accompanied by beats[],
//  which sets each note’s relative length (higher #, longer note)
int melody[] = {
C,  b,  g,  C,  b,   e,  R,  C,  c,  g, a, C };
int happybirthday[] = {
c,c,d,c,f,e,R, c,c,d,c,g,f,R, c,c,C,a,f,e,d,R, as,as,a,f,g,f,R,R};
int heartandsoul[] = {
c,c,c, c,lowb,lowa,lowb,c,d, e,e,e, e,d,c,d,e,f, g,c, a,g,f,e,d,c,R,R };
int beats[]  = {
16, 16, 16,  8,  8,  16, 32, 16, 16, 16, 8, 8 };
int beatsHB[] = {
16,16,32,32,32,32,16, 16,16,32,32,32,32,16, 16,16,32,32,32,32,16, 16,16,32,32,32,32,16,16};
int beatsHS[] = {
32,32,96, 16,16,16,16,16,32, 32,32,96, 16,16,16,16,16,32, 64,96, 16,16,16,32,32,96, 32,32};
//int MAX_COUNT = sizeof(melody) / 2; // Melody length, for looping.
int MAX_COUNT = sizeof(heartandsoul) / 2;

// Set overall tempo
long tempo = 10000;
// Set length of pause between notes
int pause = 1000;
// Loop variable to increase Rest length
int rest_count = 100; //<-BLETCHEROUS HACK; See NOTES

// Initialize core variables
int tone = 0;
int beat = 0;
long duration  = 0;

// PLAY TONE  ==============================================
// Pulse the speaker to play a tone for a particular duration
void playTone() {
long elapsed_time = 0;
if (tone > 0) { // if this isn’t a Rest beat, while the tone has
//  played less long than ‘duration’, pulse speaker HIGH and LOW
while (elapsed_time < duration) {

digitalWrite(speakerOut,HIGH);
delayMicroseconds(tone / 2);

// DOWN
digitalWrite(speakerOut, LOW);
delayMicroseconds(tone / 2);

// Keep track of how long we pulsed
elapsed_time += (tone);
}
}
else { // Rest beat; loop times delay
for (int j = 0; j < rest_count; j++) { // See NOTE on rest_count
delayMicroseconds(duration);
}
}
}

void loop() {

reading1 = digitalRead(button1);
reading2 = digitalRead(button2);

if(reading1 == LOW) {
if(counter < plays) {
for (int i=0; i<MAX_COUNT; i++) {
//tone = melody[i];
tone = happybirthday[i];
//tone = heartandsoul[i];
//beat = beats[i];
beat = beatsHB[i];
//beat = beatsHS[i];

duration = beat * tempo; // Set up timing

playTone();
// A pause between notes…
delayMicroseconds(pause);

if (DEBUG) { // If debugging, report loop, tone, beat, and duration
Serial.print(i);
Serial.print(“:”);
Serial.print(beat);
Serial.print(” “);
Serial.print(tone);
Serial.print(” “);
Serial.println(duration);
}
}
counter = counter + 1;
}
}
else if (reading2 == LOW) {
if(counter < plays) {
for (int i=0; i<MAX_COUNT; i++) {
//tone = melody[i];
//tone = happybirthday[i];
tone = heartandsoul[i];
//beat = beats[i];
//beat = beatsHB[i];
beat = beatsHS[i];

duration = beat * tempo; // Set up timing

playTone();
// A pause between notes…
delayMicroseconds(pause);

if (DEBUG) { // If debugging, report loop, tone, beat, and duration
Serial.print(i);
Serial.print(“:”);
Serial.print(beat);
Serial.print(” “);
Serial.print(tone);
Serial.print(” “);
Serial.println(duration);
}
}
counter = counter + 1;
}
}
else {
//do nothing
}
counter = 0;
}

Advertisements

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s