User:Lieven Van Speybroeck/Prototyping/5-Playback Pattern: Difference between revisions

From XPUB & Lens-Based wiki
mNo edit summary
 
(11 intermediate revisions by the same user not shown)
Line 11: Line 11:
int toneArray[100];
int toneArray[100];
int delayTime=0;
int delayTime=0;
int g=0;
int i=0;
int i=0;
 
int g=1;
int q=0;
void setup(){
void setup(){
   pinMode(spkrPin, OUTPUT);
   pinMode(spkrPin, OUTPUT);
Line 19: Line 20:
   Serial.begin(9600);
   Serial.begin(9600);
   tone(spkrPin, 400, 10);
   tone(spkrPin, 400, 10);
 
}
}
 
void loop(){
void loop(){
   while (delayTime < 5000) { // While there's no delay of 5 seconds, keep making a 'record'.
 
     Serial.println("Waiting for press...");   
  Serial.println(" ");
     while (btnActive==LOW){ // While the button is not pressed
  Serial.println("RECORD STARTED");
         delayTime=(millis()-toneArray[i-1]); // how long is the button left unpressed?
  Serial.println("--------------");
  Serial.println(" ");
 
   while (delayTime < 5000) { // Keep 'recording' until the buttons is untouched for a minimum of 5 seconds
     btnActive=digitalRead(btnPin); // Read the buttonstate
   
     while (btnActive==LOW){ // Go through this loop as long as the button is left unpressed
         delayTime=(millis()-toneArray[i-1]); // Measure the time the button is left unpressed
         btnActive=digitalRead(btnPin);
         btnActive=digitalRead(btnPin);
     }
     }
    // ok, pressed now...
     toneArray[i]=millis(); // Put the time of pressing in an array that stores the times
// ok, pressed now...
     i++; // add 1 to the array pointer
   
     toneArray[i]=millis(); // Store 'time of press' into an array
    Serial.println("Waiting for release...");  
    Serial.print("WAITED: ");Serial.print(delayTime, DEC);Serial.println(" milliseconds"); // Print how long you've waited to push the button
     btnActive=digitalRead(btnPin);
     i++; // Move up the pointer in the array 1 position
     while (btnActive==HIGH){
   
     btnActive=digitalRead(btnPin); // Read the buttonstate
     while (btnActive==HIGH){ // Go through this loop as long as the button is pressed
         btnActive=digitalRead(btnPin);
         btnActive=digitalRead(btnPin);
         tone(spkrPin, 400, 10);
         tone(spkrPin, 400, 10); // Play tone while pushing the button
     }
     }
    //ok, released now...
     toneArray[i]=millis(); // Put the time of releasing in the array that stores the times
// ok, released now...
     i++; // add one to the array pointer
     toneArray[i]=millis(); // Store 'time of release' into the array
    Serial.print ("PUSHED: ");Serial.print((toneArray[i]-toneArray[i-1]), DEC);Serial.println(" milliseconds"); // Print how long you've pushed the button
     i++; // Move up the pointer in the array 1 position
  }
 
// record ended
 
  Serial.println(" ");
  Serial.println("RECORD ENDED");
  Serial.println("------------");
  Serial.println(" ");
 
// print the array so we see which values are in there...
 
  Serial.println("These values are in the array:");
  Serial.println(" ");
 
  for (q=0; q<i; q++){
    Serial.print("toneArray[");Serial.print(q);Serial.print("]: ");Serial.println(toneArray[q]);
   }
   }
   
   
   for (g=0; g<(i-2); g=g+2) { // this function gets triggered when the button has been left unpressed for 5 seconds and then pressed 1 more time.
// playback time
     tone(spkrPin, 400, (toneArray[g+1]-toneArray[g])); // play the tones based on the time values stored in the array
 
     delay(toneArray[g+2]-toneArray[g+1]); // olay the delay based on the time values stored in the array
  Serial.println(" ");
   Serial.println("PLAYBACK");
  Serial.println("--------");
  Serial.println(" ");
  // This gets triggered when the 'record' is ended, so the button was left untouched for 5 seconds and then got pushed 1 more time
  for (g=0; g<(i-2); g=g+2){
     tone(spkrPin, 400, (toneArray[g+1]-toneArray[g])); // Playback the tones based on the values in the array
     delay(toneArray[g+2]-toneArray[g+1]); // Define the delay between tones based on the values in the array
    Serial.print("TONE: " );Serial.print((toneArray[g+1]-toneArray[g]), DEC);Serial.println(" milliseconds"); // Print out the length of the tone that was played
    Serial.print("DELAY: ");Serial.print((toneArray[g+2]-toneArray[g+1]), DEC);Serial.println(" milliseconds"); // Print out the length of the delay
   }
   }
 
   while(1){}; // 'stop' the program
   while(1){}; // 'Stop the program: go into an endless empty loop
}
}
</source>
An example of a record in the serial monitor:
<source lang="text">
RECORD STARTED
--------------
WAITED: 563 milliseconds
PUSHED: 979 milliseconds
WAITED: 665 milliseconds
PUSHED: 1815 milliseconds
WAITED: 1534 milliseconds
PUSHED: 223 milliseconds
WAITED: 362 milliseconds
PUSHED: 188 milliseconds
WAITED: 568 milliseconds
PUSHED: 3535 milliseconds
WAITED: 3852 milliseconds
PUSHED: 1064 milliseconds
WAITED: 10342 milliseconds
PUSHED: 83 milliseconds
RECORD ENDED
------------
These values are in the array:
toneArray[0]: 563
toneArray[1]: 1542
toneArray[2]: 2207
toneArray[3]: 4022
toneArray[4]: 5556
toneArray[5]: 5779
toneArray[6]: 6141
toneArray[7]: 6329
toneArray[8]: 6897
toneArray[9]: 10432
toneArray[10]: 14284
toneArray[11]: 15348
toneArray[12]: 25690
toneArray[13]: 25773
PLAYBACK
--------
TONE: 979 milliseconds
DELAY: 665 milliseconds
TONE: 1815 milliseconds
DELAY: 1534 milliseconds
TONE: 223 milliseconds
DELAY: 362 milliseconds
TONE: 188 milliseconds
DELAY: 568 milliseconds
TONE: 3535 milliseconds
DELAY: 3852 milliseconds
TONE: 1064 milliseconds
DELAY: 10342 milliseconds
</source>
</source>

Latest revision as of 13:02, 16 November 2010

Recording music with a pushbutton on Arduino

This program lets you make a record of tones by pushing a pushbutton on Arduino.
Waiting 5 seconds ends the 'record-session'.
By pushing 1 more time, the pattern you recorded will be played back.

int btnPin=2;
int spkrPin=13;
int btnActive=0;
int toneArray[100];
int delayTime=0;
int i=0;
int g=1;
int q=0;
 
void setup(){
  pinMode(spkrPin, OUTPUT);
  pinMode(btnPin, INPUT);
  Serial.begin(9600);
  tone(spkrPin, 400, 10);
 
}
 
void loop(){
  
  Serial.println(" ");
  Serial.println("RECORD STARTED");
  Serial.println("--------------");
  Serial.println(" ");
  
  while (delayTime < 5000) { // Keep 'recording' until the buttons is untouched for a minimum of 5 seconds
 
    btnActive=digitalRead(btnPin); // Read the buttonstate
 
    while (btnActive==LOW){ // Go through this loop as long as the button is left unpressed
        delayTime=(millis()-toneArray[i-1]); // Measure the time the button is left unpressed
        btnActive=digitalRead(btnPin);
    }
 
// ok, pressed now...
 
    toneArray[i]=millis(); // Store 'time of press' into an array
    Serial.print("WAITED: ");Serial.print(delayTime, DEC);Serial.println(" milliseconds"); // Print how long you've waited to push the button
    i++; // Move up the pointer in the array 1 position
 
    btnActive=digitalRead(btnPin); // Read the buttonstate
 
    while (btnActive==HIGH){ // Go through this loop as long as the button is pressed
        btnActive=digitalRead(btnPin);
        tone(spkrPin, 400, 10); // Play tone while pushing the button
    }
 
// ok, released now...
 
    toneArray[i]=millis(); // Store 'time of release' into the array
    Serial.print ("PUSHED: ");Serial.print((toneArray[i]-toneArray[i-1]), DEC);Serial.println(" milliseconds"); // Print how long you've pushed the button
    i++; // Move up the pointer in the array 1 position
  }
  
// record ended
  
  Serial.println(" ");
  Serial.println("RECORD ENDED");
  Serial.println("------------");
  Serial.println(" ");
  
// print the array so we see which values are in there...

  Serial.println("These values are in the array:");
  Serial.println(" ");

  for (q=0; q<i; q++){
     Serial.print("toneArray[");Serial.print(q);Serial.print("]: ");Serial.println(toneArray[q]);
  }
 
// playback time

  Serial.println(" ");
  Serial.println("PLAYBACK");
  Serial.println("--------");
  Serial.println(" ");
 
  // This gets triggered when the 'record' is ended, so the button was left untouched for 5 seconds and then got pushed 1 more time
  for (g=0; g<(i-2); g=g+2){
     tone(spkrPin, 400, (toneArray[g+1]-toneArray[g])); // Playback the tones based on the values in the array
     delay(toneArray[g+2]-toneArray[g+1]); // Define the delay between tones based on the values in the array
     Serial.print("TONE: " );Serial.print((toneArray[g+1]-toneArray[g]), DEC);Serial.println(" milliseconds"); // Print out the length of the tone that was played
     Serial.print("DELAY: ");Serial.print((toneArray[g+2]-toneArray[g+1]), DEC);Serial.println(" milliseconds"); // Print out the length of the delay
  }
 
  while(1){}; // 'Stop the program: go into an endless empty loop
}

An example of a record in the serial monitor:

 

RECORD STARTED

--------------

 

WAITED: 563 milliseconds

PUSHED: 979 milliseconds

WAITED: 665 milliseconds

PUSHED: 1815 milliseconds

WAITED: 1534 milliseconds

PUSHED: 223 milliseconds

WAITED: 362 milliseconds

PUSHED: 188 milliseconds

WAITED: 568 milliseconds

PUSHED: 3535 milliseconds

WAITED: 3852 milliseconds

PUSHED: 1064 milliseconds

WAITED: 10342 milliseconds

PUSHED: 83 milliseconds

 

RECORD ENDED

------------

 

These values are in the array:

 

toneArray[0]: 563

toneArray[1]: 1542

toneArray[2]: 2207

toneArray[3]: 4022

toneArray[4]: 5556

toneArray[5]: 5779

toneArray[6]: 6141

toneArray[7]: 6329

toneArray[8]: 6897

toneArray[9]: 10432

toneArray[10]: 14284

toneArray[11]: 15348

toneArray[12]: 25690

toneArray[13]: 25773

 

PLAYBACK

--------

 

TONE: 979 milliseconds

DELAY: 665 milliseconds

TONE: 1815 milliseconds

DELAY: 1534 milliseconds

TONE: 223 milliseconds

DELAY: 362 milliseconds

TONE: 188 milliseconds

DELAY: 568 milliseconds

TONE: 3535 milliseconds

DELAY: 3852 milliseconds

TONE: 1064 milliseconds

DELAY: 10342 milliseconds