Skip to content

Using minims beatdetect with line in or whatever output sound. #112

@bvking

Description

@bvking

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 called BeatListener
  • 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);
}
`

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions