topical media & game development
graphic-processing-site-examples-Libraries-Minim--Sound--FrequencyEnergy-FrequencyEnergy.pde / pde
Frequency Energy
by Damien Di Fede.
This sketch demonstrates how to use the BeatDetect object in FREQ_ENERGY mode.
You can use <code>isKick</code>, <code>isSnare</code>, </code>isHat</code>,
<code>isRange</code>, and <code>isOnset(int)</code> to track whatever kind
of beats you are looking to track, they will report true or false based on
the state of the analysis. To "tick" the analysis you must call <code>detect</code>
with successive buffers of audio. You can do this inside of <code>draw</code>,
but you are likely to miss some audio buffers if you do this. The sketch implements
an <code>AudioListener</code> called <code>BeatListener</code> so that it can call
<code>detect</code> on every buffer of audio processed by the system without repeating
a buffer or missing one.
This sketch plays an entire song so it may be a little slow to load.
import ddf.minim.*;
import ddf.minim.analysis.*;
Minim minim;
AudioPlayer song;
BeatDetect beat;
BeatListener bl;
float kickSize, snareSize, hatSize;
void setup()
{
size(512, 200, P3D);
minim = new Minim(this);
song = minim.loadFile("marcus_kellis_theme.mp3", 2048);
song.play();
// a beat detection object that is FREQ_ENERGY mode that
// expects buffers the length of song's buffer size
// and samples captured at songs's sample rate
beat = new BeatDetect(song.bufferSize(), song.sampleRate());
// set the sensitivity to 300 milliseconds
// After a beat has been detected, the algorithm will wait for 300 milliseconds
// before allowing another beat to be reported. You can use this to dampen the
// algorithm if it is giving too many false-positives. The default value is 10,
// which is essentially no damping. If you try to set the sensitivity to a negative value,
// an error will be reported and it will be set to 10 instead.
beat.setSensitivity(300);
kickSize = snareSize = hatSize = 16;
// make a new beat listener, so that we won't miss any buffers for the analysis
bl = new BeatListener(beat, song);
textFont(createFont("Helvetica", 16));
textAlign(CENTER);
}
void draw()
{
background(0);
fill(255);
if ( beat.isKick() ) kickSize = 32;
if ( beat.isSnare() ) snareSize = 32;
if ( beat.isHat() ) hatSize = 32;
textSize(kickSize);
text("KICK", width/4, height/2);
textSize(snareSize);
text("SNARE", width/2, height/2);
textSize(hatSize);
text("HAT", 3*width/4, height/2);
kickSize = constrain(kickSize * 0.95, 16, 32);
snareSize = constrain(snareSize * 0.95, 16, 32);
hatSize = constrain(hatSize * 0.95, 16, 32);
}
void stop()
{
// always close Minim audio classes when you are finished with them
song.close();
// always stop Minim before exiting
minim.stop();
// this closes the sketch
super.stop();
}
(C) Æliens
20/2/2008
You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.