fftLines

import ddf.minim.*; // [lib] Minim
import ddf.minim.effects.*;
import ddf.minim.ugens.*;
import ddf.minim.analysis.*; //FFTオブジェクトを扱う
import codeanticode.syphon.*;// [lib]Syphon

Minim minim; // Minim型変数minimの宣言/Minimライブラリに含まれるメソッドを使うため、Minimクラスのインスタンスを生成
AudioInput input01;  //音入力用のオブジェクト変数
FFT fft; // FFT型変数fftの宣言
SyphonServer server; // [lib]Syphon

PFont font;

int BUFFERSIZE = 1024;
float inputLevel01;
float specSize;

void settings() {
  size(600, 800, P3D);
  PJOGL.profile=1; // [lib]Syphon
}

void setup() {
  server = new SyphonServer(this, "Processing Syphon"); // [lib]Syphon
  background(0);
  colorMode(HSB, 360, 100, 100);
  minim = new Minim(this); // Minimオブジェクトを生成
  input01 = minim.getLineIn(Minim.MONO, BUFFERSIZE); // バッファ(ここでは512個のfloat型の配列)を確保し、ライン入力用変数input01を設定する。
  fft = new FFT(input01.bufferSize(), input01.sampleRate()); //FFTオブジェクトを作成。bufferSize()は1024、sampleRateは初期設定では44100Hz。
  println("fft.specSize(): " + fft.specSize());
  println("input01.bufferSize(): " + input01.bufferSize());
  println("input01.sampleRate(): " + input01.sampleRate());
  smooth();
}

void draw() {
  server.sendScreen(); // [lib]Syphon
  inputLevel01 = map(input01.mix.level(), 0, 0.5, 0, width); // 音量の変数 0〜スケッチ幅まで変化
  specSize = fft.specSize();
  fft.forward(input01.mix); // FFTを左右の音を混ぜて解析
  
  // 描画
  //drawLines();
  //drawLinesRev();
  drawLinesRevNarrow();
  
  drawResetBlur();
}

void drawLines() {
  // レベルメーターの変化を高さでなく線の終点位置に置いた描画
  // 同じ描画を上下左右に反転して計4つ配置した状態
  float boostLevel = 5; // inputの具合によって変化の値を大きくする
  int adjust = 15; // specSizeの0からのあたりが極端に変化しすぎるのでadjustで取得開始値をずらす
  for (int i = adjust; i < specSize; i = i + 20) {
    float posistionReversal = random(-1, 1);
    if (posistionReversal > 0) { // ランダムで*-1して数値反転
      posistionReversal = 1;
    } else {
      posistionReversal = -1;
    }
    
    float positionY = map(i, adjust, specSize, 0, height/2); //1024個に分けた帯域縦方向に並べるために高さに合わせて範囲割り当て
    float bandLevel = (positionY - fft.getBand(i) * boostLevel * posistionReversal) + (height / 2); //変化するとこ。1,-1をランダムにかけて上下方向にばらけさせる
    float bandLevelMinus = (-positionY - fft.getBand(i) * boostLevel * posistionReversal) + (height / 2); //反転して並べる用
    stroke(0, 0, 100);
    strokeWeight(1);
    if(fft.getBand(i) > 10.0){
      float hsbColor = fft.getBand(i) * 5;
      strokeWeight(random(1, 4));
      stroke(130, 50, hsbColor);
    }
    
    line(width/2, positionY + (height / 2), width, bandLevel); // 右下
    line(width/2, positionY + (height / 2), 0, bandLevel); // 左下
    line(width/2, -positionY + (height / 2), width, bandLevelMinus); // 右上
    line(width/2, -positionY + (height / 2), 0, bandLevelMinus); // 左上
  }
}

void drawLinesRev() {
  float boostLevel = 5;
  int adjust = 15;
  for (int i = adjust; i < specSize; i = i + 20) {
    float posistionReversal = random(-1, 1);
    if (posistionReversal > 0) { // ランダムで*-1して数値反転
      posistionReversal = 1;
    } else {
      posistionReversal = -1;
    }
    float positionY = map(i, adjust, specSize, 0, height/2);
    float bandLevel = (positionY - fft.getBand(i) * boostLevel * posistionReversal) + (height / 2);
    float bandLevelMinus = (-positionY - fft.getBand(i) * boostLevel * posistionReversal) + (height / 2);
    stroke(0, 0, 100);
    strokeWeight(1);
    if(fft.getBand(i) > 10.0){
      float hsbColor = fft.getBand(i) * 5;
      strokeWeight(random(1, 4));
      stroke(130, 50, hsbColor);
    }
    line(0, positionY + (height / 2), width/2, bandLevel);
    line(width, positionY + (height / 2), width/2, bandLevel);
    line(0, -positionY + (height / 2), width/2, bandLevelMinus);
    line(width, -positionY + (height / 2), width/2, bandLevelMinus);
  }
}

void drawLinesRevNarrow() {
  float boostLevel = 1;
  int adjust = 0;
  for (int i = adjust; i < specSize; i = i + 2) {
    float posistionReversal = random(-1, 1);
    if (posistionReversal > 0) { // ランダムで*-1して数値反転
      posistionReversal = 1;
    } else {
      posistionReversal = -1;
    }
    float positionY = map(i, adjust, specSize, 0, height*5);
    float bandLevel = (positionY - fft.getBand(i) * boostLevel * posistionReversal) + (height / 2);
    float bandLevelMinus = (-positionY - fft.getBand(i) * boostLevel * posistionReversal) + (height / 2);
    stroke(0, 0, 100);
    strokeWeight(1);
    if(fft.getBand(i) > 10.0){
      float hsbColor = fft.getBand(i) * 5;
      strokeWeight(random(1, 4));
      stroke(130, 50, hsbColor);
    }
    line(0, positionY + (height / 2), width/2, bandLevel);
    line(width, positionY + (height / 2), width/2, bandLevel);
    line(0, -positionY + (height / 2), width/2, bandLevelMinus);
    line(width, -positionY + (height / 2), width/2, bandLevelMinus);
  }
}

void drawResetBlur() {
  fill(0, 100, 0, 50);
  rectMode(CORNERS);
  rect(0, 0, width, height);
}

void stop() { // Minimを終了
  input01.close();
  minim.stop();
  super.stop();
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください