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

Daily Creative Coding

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

マイク入力の音の大きさに応じて波紋をつくる

f:id:aa_debdeb:20151111105726j:plain
/**
* Ripple By Sound
*
* @author aa_debdeb 
* @date 2015/11/15
*/

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

Minim minim;
AudioInput in;
ArrayList<Ripple> ripples;
float pLevel;

void setup(){
  size(500, 500);
  frameRate(60);
  minim = new Minim(this);
  in = minim.getLineIn(Minim.STEREO, 512);
  ripples = new ArrayList<Ripple>();
  pLevel = 0.0;
}

void draw(){
  background(0);
  float level = in.mix.level();
  println(level);
  if(level > 0.1 && pLevel < 0.1){
    float alpha = level < 0.2 ? 255 * ((level - 0.1) / (0.2 - 0.1)): 255.0;
    ripples.add(new Ripple(alpha));
  }
  pLevel = level;
  ArrayList<Ripple> deads = new ArrayList<Ripple>();
  for(Ripple ripple: ripples){
    ripple.drawMe();
    ripple.update();
    if(ripple.isDead()){
      deads.add(ripple);
    }
  }
  for(Ripple dead: deads){
    ripples.remove(dead);
  }
  
}
 
void stop(){
  in.close();
  minim.stop();
  super.stop();
}

class Ripple {
  
  float x;
  float y;
  float radious;
  float alpha;
  
  Ripple(float alpha){
    x = random(0, width);
    y = random(0, height);
    radious = 0.0;
    this.alpha = alpha;
  }
  
  void drawMe(){
    stroke(255, alpha);
    strokeWeight(2);
    noFill();
    ellipse(x, y, radious * 2, radious * 2);
  }
  
  void update(){
    radious += 3.0;
    alpha -= 5.0;
  }
  
  boolean isDead(){
    if(alpha < 30){
      return true;
    } else {
      return false;
    }
  }
}