User Tools

Site Tools


courses:intro.prototyping.fall.2016.oct07

Sound in Processing

Today we worked with a library for sound called Minim. Minim documentation

Free sound for downloading

http://www.mediacollege.com/downloads/sound-effects/

http://www.freesoundeffects.com/

There are also a whole heap of sounds on the server under the “public” folder.

We moved on to a brief look into object oriented programming and on to play with sound using the Minim library. The full documentation is here.

Two of the classes we played around with was audioSample and audioPlayer.

Audiosample - short samples
import ddf.minim.*;
 
Minim minim;
AudioSample money, gun;
 
void setup()
{
  size(640, 480);
  // always start Minim before you do anything with it
  minim = new Minim(this);
  // load soundfile from the data folder
  money = minim.loadSample("CASH2.WAV");
  gun = minim.loadSample("SHOTGUN-X3.WAV");
 
}
 
void draw()
{
  //nothing to actually draw
}
 
void keyPressed()
{  
  if ( key == 'y' ) 
  {
    money.trigger();
  }
 
  if ( key == 'p' ) 
  {
    gun.trigger();
  }
}
 
void stop()
{
  // always close Minim audio classes when you are done with them
  money.close();
  gun.close();
  minim.stop();
}
AudioPlayer - longer audio files
import ddf.minim.*;
 
Minim minim;
AudioPlayer soundtrack;
 
void setup()
{
  size(640, 480);
  // always start Minim before you do anything with it
  minim = new Minim(this);
  //load a file, 
  soundtrack = minim.loadFile("song2.mp3");
}
 
void draw()
{
  //nothing to actually draw
}
 
void keyPressed()
{
  if ( key == 'q' ) 
  {
    if(soundtrack.isPlaying()) //checking if the song is playing to choose play/pause
     soundtrack.pause();
    else
     soundtrack.play();
  }
 
  if ( key == 'w')
  {
    soundtrack.skip(3000); //skipping three seconds
  }
 
  if( key == 'e')
  {
    soundtrack.rewind(); //well...yeah, guess. :-)
  }
}
 
void stop()
{
  // always close Minim audio classes when you are done with them
  soundtrack.close();
  minim.stop(); 
}
 
States/Modes

Some of you got caught in the situation where you wanted things to trigger on things with keyPressed, for example, but only got a very quick reaction and then back to the original behavior. That is because the trigger concepts we've worked with are just a brief interaction. If you want to make lasting changes it's better to use what is called a “state machine” in programming. You have a variable to keep track of what “state” or “mode” the program is in and use keyPressed and it's siblings to change that variable. In draw() you instead have a bunch of if-statements that say what to do depending on that variable. In the example below the background color will change depending on the variable that is set by the user pressing arrow-buttons.

int mode;
 
 
void setup()
{
  size(640,480);
  mode=0;
}
 
void draw()
{
  if(mode==0)
  {
    background(128,128,255);
  }
 
  if(mode==1)
  {
    background(128,255,128);
  }
 
  if(mode==2)
  {
    background(255,128,128);
  }
 
  if(mode==3)
  {
    background(255,255,128);
  }
}
 
void keyPressed()
{
   if(key==CODED)
   {
     if(keyCode==UP)
     {
       mode=0;
     }
     if(keyCode==DOWN)
     {
       mode=1;
     }
     if(keyCode==LEFT)
     {
       mode=2;
     }
     if(keyCode==RIGHT)
     {
       mode=3;
     }
   }
}
Concepts we worked with
audioPlayer
play()
pause()
rewind()
isPlaying()
position()
skip()
cue()
 
 
audioSample
trigger()
length()
stop()
courses/intro.prototyping.fall.2016.oct07.txt · Last modified: 2016/10/10 01:09 by rickard