ddf / Minim

A Java audio library, designed to be used with Processing.
http://code.compartmental.net/tools/minim
GNU Lesser General Public License v3.0
668 stars 136 forks source link

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

Open bvking opened 3 years ago

bvking commented 3 years ago

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.

` /**

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(rectWlowBand, 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); } `

ddf commented 3 years ago

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.