読者です 読者をやめる 読者になる 読者になる

Daily Creative Coding

元「30 min. Processing」。毎日、Creative Codingします。

Minimでビートを検知する

f:id:aa_debdeb:20151209212645j:plain

中心の円は,外側からキック,スネア,ハイハットが検知されたかを表している. 周りの四角形は,各周波数帯でビートが検知されたかを表している.

/**
* BeatDetection
*
* @author aa_debdeb
* @date 2015/12/20
*/

import ddf.minim.*;
import ddf.minim.analysis.*;
import ddf.minim.effects.*;
import ddf.minim.signals.*;
import ddf.minim.spi.*;
import ddf.minim.ugens.*;

Minim minim;
AudioInput in;
BeatDetect beat;
int sensitivity;

void setup(){
  size(500, 500);
  minim = new Minim(this);
  in = minim.getLineIn(Minim.STEREO, 1024);
  beat = new BeatDetect();
  beat.detectMode(BeatDetect.FREQ_ENERGY);
  sensitivity = 300;
  beat.setSensitivity(sensitivity);
}

void draw(){
  background(255);
  beat.detect(in.mix);
  
  fill(128);
  text("sensitivity(+/-): " + sensitivity + "mills", 20, 30);
  
  translate(width/2, height/2);
  float initialAngle = (TWO_PI / (beat.detectSize() + 1) / 2.0);
  for(int i = 0; i < beat.detectSize(); i++){
    pushMatrix();
    rotate(i * (TWO_PI / beat.detectSize()) + initialAngle);
    if(beat.isOnset(i)){
      noStroke();
      fill(128);  
    } else {
      stroke(128);
      noFill();
    }
    rect(100, -5, 100, 10);
    popMatrix();
  }
  
  noStroke();  
  if(beat.isKick()){
    fill(192);
    ellipse(0, 0, 160, 160);
  } 
  if(beat.isSnare()){
    fill(128);
    ellipse(0, 0, 100, 100);
  } 
  if(beat.isHat()){
    fill(96);
    ellipse(0, 0, 60, 60);
  } 
}

void keyPressed(){
  switch(key){
    case '+':
      sensitivity += 10;
      break;
    case '-':
      sensitivity -= 10;
      break;
    default:
      return;
  }
  if(sensitivity < 0){
    sensitivity = 0;
  } else if(sensitivity > 1000){
    sensitivity = 1000;
  }
  beat.setSensitivity(sensitivity);
}