3 Simple Ways to
Share What You Make

With Instructables you can share what you make with the world — and tap into an ever-growing community of creative experts.

PhotosPhotos

Share one or more photos of a project, recipe, or whatever you've made, quickly and easily.

Step by StepStep-By-Step

Share your step-by-step photos with text instructions of what you made so others can do it too!

VideoVideo

Share your how-to video. You'll need your embed code from a video site such as YouTube.

Play the French Can Can Using an Arduino and Buzzer

Step 10Enhance, Texturize, Dance!

Enhance, Texturize, Dance!


Now that the Arduino plays the Can Can, it's time to finish with finesse!

To make things more interesting, the playNote() function in the code below plays each note in 4 octaves, sequencing through octaves rapidly to give an interesting texture to the sound. Additionally, 4 play modes have been added to play the main course of the Can Can in different octave patterns. The possibilities are almost limitless. Try it out and enjoy!

----------------copy after this line----------------

// Buzzer example function for the CEM-1203 buzzer (Sparkfun's part #COM-07950).
// by Rob Faludi
// http://www.faludi.com

// Additions by Christopher Stevens
// http://www.christopherstevens.cc

//referenced from http://www.phy.mtu.edu/~suits/notefreqs.html
//starting with F noteFreqArr[1]
int noteFreqArr[] = {
49.4, 52.3, 55.4, 58.7, 62.2, 65.9, 69.9, 74, 78.4, 83.1, 88, 93.2,
98.8, 105, 111, 117, 124, 132, 140, 148, 157, 166, 176, 186,
198, 209, 222, 235, 249, 264, 279, 296, 314, 332, 352, 373,
395, 419, 444, 470, 498, 527, 559, 592, 627, 665, 704, 746,
790, 837, 887, 940, 996, 1050, 1110, 1180, 1250, 1320, 1400, 1490,
1580, 1670, 1770, 1870, 1990, 2100};

long mode = 0;

void setup() {
  pinMode(4, OUTPUT); // set a pin for buzzer output
}

void playNote(long noteInt, long length, long mode, long breath = 25) {
  length = length - breath;
 
  long noteInt2 = noteInt + 12; //1 octave up
  long noteInt3 = noteInt + 24; //2 octaves up
  long noteInt4 = noteInt + 36; //3 octaves up
 
  long playLoop = length / 100; //divide length by 4, for use in play sequence
 
  if(mode == 0) { //mode 0 sequence
    for (long i=0; i < playLoop; i++){
      buzz(4, noteFreqArr[noteInt], 20);
      delay(5);
      buzz(4, noteFreqArr[noteInt2], 20);
      delay(5);
      buzz(4, noteFreqArr[noteInt3], 20);
      delay(5);
      buzz(4, noteFreqArr[noteInt4], 20);
      delay(5);
    }
  } else if(mode == 1) { //mode 1 sequence
    for (long i=0; i < playLoop; i++){
      buzz(4, noteFreqArr[noteInt3], 20);
      delay(5);
      buzz(4, noteFreqArr[noteInt4], 20);
      delay(5);
      buzz(4, noteFreqArr[noteInt3], 20);
      delay(5);
      buzz(4, noteFreqArr[noteInt4], 20);
      delay(5);
    }
  } else if(mode == 2) { //mode 2 sequence
    for (long i=0; i < playLoop; i++){
      buzz(4, noteFreqArr[noteInt3], 20);
      delay(5);
      buzz(4, noteFreqArr[noteInt3], 20);
      delay(5);
      buzz(4, noteFreqArr[noteInt3], 20);
      delay(5);
      buzz(4, noteFreqArr[noteInt2], 20);
      delay(5);
    }
  } else if(mode == 3) { //mode 3 sequence
    for (long i=0; i < playLoop; i++){
      buzz(4, noteFreqArr[noteInt4], 40);
      delay(5);
      buzz(4, noteFreqArr[noteInt2], 40);
      delay(5);
    }
  }
  if(breath > 0) { //take a short pause or 'breath' if specified
    delay(breath);
  }
}

void loop() {
  //main course
  playNote(12, 500, mode);
 
  playNote(5, 1000, mode);
  playNote(7, 250, mode);
  playNote(10, 250, mode);
  playNote(9, 250, mode);
  playNote(7, 250, mode);
  playNote(12, 500, mode);
  playNote(12, 500, mode);
  playNote(12, 250, mode);
  playNote(14, 250, mode);
  playNote(9, 250, mode);
  playNote(10, 250, mode);
  playNote(7, 500, mode);
  playNote(7, 500, mode);
  playNote(7, 250, mode);
  playNote(10, 250, mode);
  playNote(9, 250, mode);
  playNote(7, 250, mode);
  playNote(5, 250, mode);
  playNote(17, 250, mode);
  playNote(16, 250, mode);
  playNote(14, 250, mode);
  playNote(12, 250, mode);
  playNote(10, 250, mode);
  playNote(9, 250, mode);
  playNote(7, 250, mode);
 
  playNote(5, 1000, mode);
  playNote(7, 250, mode);
  playNote(10, 250, mode);
  playNote(9, 250, mode);
  playNote(7, 250, mode);
  playNote(12, 500, mode);
  playNote(12, 500, mode);
  playNote(12, 250, mode);
  playNote(14, 250, mode);
  playNote(9, 250, mode);
  playNote(10, 250, mode);
  playNote(7, 500, mode);
  playNote(7, 500, mode);
  playNote(7, 250, mode);
  playNote(10, 250, mode);
  playNote(9, 250, mode);
  playNote(7, 250, mode);
  playNote(5, 250, mode);
  playNote(12, 250, mode);
  playNote(7, 250, mode);
  playNote(9, 250, mode);
  playNote(5, 250, mode);
  delay(250);
 
  if(mode == 0) {
    mode = 1;
  } else if(mode == 1) {
    mode = 2;
  } else if(mode == 2) {
    mode = 3;
  } else if(mode == 3) {
    mode = 0;
  }
}

void buzz(int targetPin, long frequency, long length) {
  long delayValue = 1000000/frequency/2; // calculate the delay value between transitions
  //// 1 second's worth of microseconds, divided by the frequency, then split in half since
  //// there are two phases to each cycle
  long numCycles = frequency * length/ 1000; // calculate the number of cycles for proper timing
  //// multiply frequency, which is really cycles per second, by the number of seconds to
  //// get the total number of cycles to produce
  for (long i=0; i < numCycles; i++){ // for the calculated length of time...
    digitalWrite(targetPin,HIGH); // write the buzzer pin high to push out the diaphram
    delayMicroseconds(delayValue); // wait for the calculated delay value
    digitalWrite(targetPin,LOW); // write the buzzer pin low to pull back the diaphram
    delayMicroseconds(delayValue); // wait againf or the calculated delay value
  }
}

----------------copy before this line----------------


All finished! Now get on the floor, stage, or furniture of choice, and celebrate with dance!

« Previous StepDownload PDFView All StepsNext Step »

Pro

Get More Out of Instructables

Already have an Account?

close

All Steps Viewing
View all steps of an Instructable on the same page when you're a Pro Member.

Upgrade to Pro today!
2
Followers
1
Author:Ultrus(Christopher Stevens)
Web developer and designer who loves renovating and empowering over-sized web projects. Experience in developing and integrating ground breaking creative solutions online. Enjoys solving complex devel...
more »