Using minims beatdetect with line in or whatever output sound.
bvking opened this issue · comments
Hello,
Just a simple question, I hope. : smiling:
I would like to adapt the program from the Minim example. Rather than detecting the beat of an mp3 as was done in your example, I would like to be able to detect the audio signal of the music I play with the audio output of my Mac, or the input of the microphone. (I will plug the audio output into the microphone jack).
I have tried this, but it doesn't work.
`
/**
- This sketch demonstrates how to use the BeatDetect object in FREQ_ENERGY mode.
- You can use
isKick
,isSnare
, isHat,isRange
, - and
isOnset(int)
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
detect
- with successive buffers of audio. You can do this inside of
draw
, but you are likely to miss some - audio buffers if you do this. The sketch implements an
AudioListener
calledBeatListener
- so that it can call
detect
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.
-
- For more information about Minim and additional features,
- visit http://code.compartmental.net/minim/
*/
import ddf.minim.;
import ddf.minim.analysis.;
Minim minim;
AudioInput in;
AudioPlayer song;
BeatDetect beat;
BeatListener bl;
float kickSize, snareSize, hatSize;
class BeatListener implements AudioListener
{
private BeatDetect beat;
private AudioPlayer source;
BeatListener(BeatDetect beat, AudioPlayer source)
{
this.source = source;
this.source.addListener(this);
this.beat = beat;
}
void samples(float[] samps)
{
beat.detect(source.mix);
}
void samples(float[] sampsL, float[] sampsR)
{
beat.detect(source.mix);
}
}
void setup()
{
size(512, 200, P3D);
minim = new Minim(this);
in = minim.getLineIn();
song = minim.loadFile("marcus_kellis_theme.mp3", 1024);
song.play();
song.in();
// 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());
beat = new BeatDetect(in.bufferSize(), in.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.
// note that what sensitivity you choose will depend a lot on what kind of audio
// you are analyzing. in this example, we use the same BeatDetect object for
// detecting kick, snare, and hat, but that this sensitivity is not especially great
// for detecting snare reliably (though it's also possible that the range of frequencies
// used by the isSnare method are not appropriate for the song).
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);
bl = new BeatListener(beat, in);
beat.detect(in.mix);
textFont(createFont("Helvetica", 16));
textAlign(CENTER);
}
void draw()
{
background(0);
// draw a green rectangle for every detect band
// that had an onset this frame
float rectW = width / beat.detectSize();
for(int i = 0; i < beat.detectSize(); ++i)
{
// test one frequency band for an onset
if ( beat.isOnset(i) )
{
fill(0,200,0);
rect( i*rectW, 0, rectW, height);
}
}
// draw an orange rectangle over the bands in
// the range we are querying
int lowBand = 5;
int highBand = 15;
// at least this many bands must have an onset
// for isRange to return true
int numberOfOnsetsThreshold = 4;
if ( beat.isRange(lowBand, highBand, numberOfOnsetsThreshold) )
{
fill(232,179,2,200);
rect(rectW*lowBand, 0, (highBand-lowBand)*rectW, height);
}
if ( beat.isKick() ) kickSize = 32;
if ( beat.isSnare() ) snareSize = 32;
if ( beat.isHat() ) hatSize = 32;
fill(255);
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);
}
`
I believe detection on the AudioInput
will work if you change the type of source
in BeatListener
to AudioSource
. However, it is not typically easy to monitor the sound going out of your Mac if it does not originate from the Processing sketch. Connecting a cable from the output to the input will not work. I'd recommend taking questions like these to the Processing forum, as you can see I'm not checking in here very often.