User:Fabien Labeyrie/Clapping Arduino Modulo: Difference between revisions

From XPUB & Lens-Based wiki
No edit summary
No edit summary
Line 44: Line 44:
      
      
       // The following loop will be completed first, then launched again by the previous one.
       // The following loop will be completed first, then launched again by the previous one.
       for (int iBeat=0; iBeat<patlen; iBeat++){
       for (int iNote1=0; iNote1<patlen; iNote1++){
        
        
           // This gives a number value to each note
           // iNote2, which represents the notes of the second channel, will be assigned a number value resulting from the addition of the two nested loops
           int iNote = iBeat+iLine;
           int iNote2 = iNote1+iLine;
            
            
             // When the number value is bigger than 11, it's been resetted to 0  
             // When the number value of iNote2 is bigger than 11, it's been resetted to 0, so that all the number values will correspond to a position in the pattern 
             if (iNote > (patlen-1)){
             if (iNote2 > (patlen-1)){
               iNote = iBeat-patlen+iLine;
               iNote2 = iNote1-patlen+iLine;
             }
             }
    
    
           // Channel one  
           // Channel one  
           if (pat[iBeat] == 'x') {
          // The if condition will match each note number value with a position in the pattern, checking if it refers to an "x" or a blank space
           if (pat[iNote1] == 'x') {
             // We have to shut the other speaker in order to make this one play
             // We have to shut the other speaker in order to make this one play
             noTone(speakerHigh);
             noTone(speakerHigh);
            // The note is finally played
             tone(speakerLow, noteValue, theDelay);
             tone(speakerLow, noteValue, theDelay);
             delay(theDelay);
             delay(theDelay);
           }
           }
          // Channel two
           // The second channel is played 10 milliseconds after the first, simulating a simultaneous playing.
           // The second channel is played 10 milliseconds after the first, simulating a simultaneous playing.
           if (pat[iNote] == 'x') {
           if (pat[iNote2] == 'x') {
             noTone(speakerLow);
             noTone(speakerLow);
             tone(speakerHigh, noteValue, theDelay);
             tone(speakerHigh, noteValue, theDelay);

Revision as of 12:54, 7 November 2010

Clapping Arduino

The following exercise puts Steve Reich into an italian chip, using its tone functionality. As a result, it should be able to play the clapping music by itself.

Version I : two speakers and two loops

How does it work ?

The Clapping music consists in one pattern being played and shifted by two people. We will use two speakers to differentiate the two musical lines and to produce a stereo effect. The Arduino board will dispatch the tone information to the speakers thanks to two nested for loops and two if conditions. [1]

Technologies involved

The Arduino program is very close to C.

Steps
  1. We are defining the pattern
  2. Each speaker will act as a different channel
  3. The pattern is being repeated and shifted
  4. Because the tone function in Arduino cannot play several notes simultaneously, we are tricking human sound perception : two sounds played one after the other very quickly (10 milliseconds in this example) will be interpreted by our brain as simultaneous.

Source code

// This is telling the board which pin to use as an output
int speakerHigh = 8;
int speakerLow = 7;

// This will be the frequency of the notes
int noteValue = 3000;

// This will be the duration of the notes and the pause between them
int theDelay = 10;

// This is the pattern 
char pat[] = "xxx xx x xx ";

// This is the pattern lenght
int patlen = strlen(pat);
 
void setup(){} 
  void loop (){
    
    // This tells the program to begin a new measure after twelve notes have been played 
    for (int iLine=0; iLine<patlen; iLine++){
    
      // The following loop will be completed first, then launched again by the previous one.
      for (int iNote1=0; iNote1<patlen; iNote1++){
      
          // iNote2, which represents the notes of the second channel, will be assigned a number value resulting from the addition of the two nested loops
          int iNote2 = iNote1+iLine;
          
            // When the number value of iNote2 is bigger than 11, it's been resetted to 0, so that all the number values will correspond to a position in the pattern  
            if (iNote2 > (patlen-1)){
              iNote2 = iNote1-patlen+iLine;
            }
  
          // Channel one 
          // The if condition will match each note number value with a position in the pattern, checking if it refers to an "x" or a blank space
          if (pat[iNote1] == 'x') {
            // We have to shut the other speaker in order to make this one play
            noTone(speakerHigh);
            // The note is finally played
            tone(speakerLow, noteValue, theDelay);
            delay(theDelay);
          }
          // Channel two
          // The second channel is played 10 milliseconds after the first, simulating a simultaneous playing.
          if (pat[iNote2] == 'x') {
            noTone(speakerLow);
            tone(speakerHigh, noteValue, theDelay);
          }
   
      delay(theDelay*theDelay);    
    }  
  }
}
  1. This code couldn't have been completed without the help of Birgit.