Open bvking opened 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.
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.
` /**
isKick
,isSnare
, isHat,isRange
,isOnset(int)
to track whatever kind of beats you are looking to track, they will reportdetect
draw
, but you are likely to miss someAudioListener
calledBeatListener
detect
on every buffer of audio processed by the system without repeating a bufferimport 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); } `