import ddf.minim.*; import ddf.minim.signals.*; import ddf.minim.analysis.*; import ddf.minim.effects.*; ParticleSystem ps; Minim minim; AudioPlayer song; AudioInput input; AudioMetaData meta; FFT fft; BeatDetect beat; BeatListener bl; float oRadius, sRadius, hRadius, kRadius; int ys = 15; int yi = 35; void setup() { size(720,480, P3D); // frameRate(30); ps = new ParticleSystem(1, new PVector(width/2,height/2,0)); smooth(); minim = new Minim(this); song = minim.loadFile("doubtful.mp3", 1024); input = minim.getLineIn(); meta = song.getMetaData(); fft = new FFT(song.bufferSize(), song.sampleRate()); beat = new BeatDetect(song.bufferSize(), song.sampleRate()); beat.setSensitivity(300); bl = new BeatListener(beat, song); textFont( loadFont("arial.vlw") ); textMode(SCREEN); // song.loop(); song.play(); } void draw() { background(0); meta(); waveForm(); freq2(); freq(); beatWatch(); ps.run(); } void meta() { int y = ys; noStroke(); fill(100); rect(0,0,width,20); fill(180); textSize(10); text(meta.fileName(), 5, y); text("Author: " + meta.author(), 100, y); text("Album: " + meta.album(), 250, y); } void waveForm() { stroke(0,255,0,128); strokeWeight(1); int waveYa = width/2 - 50; int waveYb = width/2 - 60; for(int i = 0; i < song.bufferSize() - 1; i++) { stroke(251,195,164,128); line(i, waveYa + song.left.get(i)*50, i+1, waveYa + song.left.get(i+1)*50); stroke(251,120,164,128); line(i, waveYa + song.left.get(i)*60, i+1, waveYa + song.left.get(i+1)*50); stroke(251,70,164,128); line(i, waveYa + song.left.get(i)*70, i+1, waveYa + song.left.get(i+1)*50); stroke(251,40,164,128); line(i, waveYa + song.left.get(i)*80, i+1, waveYa + song.left.get(i+1)*50); stroke(251,0,164,128); line(i, waveYa + song.left.get(i)*90, i+1, waveYa + song.left.get(i+1)*50); stroke(0, 255, 0, 128); line(i, waveYb + song.right.get(i)*50, i+1, waveYb + song.right.get(i+1)*50); stroke(0, 200, 0, 128); line(i, waveYb + song.right.get(i)*60, i+1, waveYb + song.right.get(i+1)*50); stroke(0, 175, 0, 128); line(i, waveYb + song.right.get(i)*70, i+1, waveYb + song.right.get(i+1)*50); stroke(0, 120, 0, 128); line(i, waveYb + song.right.get(i)*80, i+1, waveYb + song.right.get(i+1)*50); stroke(0, 70, 0, 128); line(i, waveYb + song.right.get(i)*90, i+1, waveYb + song.right.get(i+1)*50); } } void freq() { fft.forward(song.mix); stroke(255,255,255,128); strokeWeight(3); for(int i = 0; i < fft.specSize(); i++) { line(i, height, i, height - fft.getBand(i)*3); } stroke(255,255,255,128); for(int i = 0; i < fft.specSize(); i++) { line(width - i, height, width - i, height - fft.getBand(i)*3); } } void freq2() { fft.forward(song.mix); stroke(255,255,255,128); strokeWeight(3); for(int i = 0; i < width/2; i++) { point(i, 20 + fft.getBand(i)*3); point(width - i, 20 + fft.getBand(i)*3); } } void beatWatch() { fill(60, 255, 0, 50); noStroke(); if ( beat.isOnset() ) oRadius = 80; if ( beat.isKick() ) kRadius = 80; if ( beat.isSnare() ) sRadius = 80; if ( beat.isHat() ) hRadius = 80; ellipse(width/2, height/2 - 10, oRadius, oRadius); ellipse(width/2, height/2, kRadius, kRadius); ellipse(width/2, height/2 - 10, sRadius, sRadius); ellipse(width/2, height/2, hRadius, hRadius); ellipse(width/2, height/2 - 20, oRadius, oRadius); ellipse(width/2, height/2 - 30 , kRadius, kRadius); ellipse(width/2, height/2 - 20, sRadius, sRadius); ellipse(width/2, height/2 - 30, hRadius, hRadius); oRadius *= 0.95; kRadius *= 0.95; sRadius *= 0.95; hRadius *= 0.95; if (beat.isHat()) ps.addParticle(width/2, height/2 - 10); } void stop() { song.close(); input.close(); minim.stop(); super.stop(); }