Ssaw08 1111

29
SSAW08 後期第8回 作品制作のヒント Processing + Minim で音響を視覚化する 2008年11月11日

Transcript of Ssaw08 1111

Page 1: Ssaw08 1111

SSAW08 後期第8回

作品制作のヒントProcessing + Minim で音響を視覚化する2008年11月11日

Page 2: Ssaw08 1111

本日の内容

• 前半:制作のヒント、その1• Processing と Minimを用いて、音響を視覚化してみる• Processing 0149以降のLibraryの扱いかたの変更について

• 後半:108スタジオ使用講習会 (矢坂先生)

Page 3: Ssaw08 1111

Processin 0149以降の重要な変更点

• Processing 0149以降から、重要な変更あり• 参照:http://processing.org/download/revisions.txt

• ライブラリの扱いが変更となった• 全てのライブラリはSketchのフォルダ内の "libraries" フォルダに入れら

れていなければならない• 以前はProcessingのLibraryフォルダにあった• 以下の理由から変更されたらしい

• ユーザは以前のフォルダにアクセスできないかもしれない• またOS Xでは隠されている

Page 4: Ssaw08 1111

Processin 0149以降の重要な変更点

• Sketchフォルダの場所を確認する• Pricessingのメニューから、" Sketch " > "Show Sketch Folder" を選択

• Sketchフォルダが表示される

• Processingの環境設定• Sketchbook location: で表示されている場所

Page 5: Ssaw08 1111

Processin 0149以降の重要な変更点

• また、この変更に伴い、ライブラリの対応が必要なため、多くのライブラリの互換性が無くなっている• PGraphicsを使う全てのレンダラ

• 外部のLibraryを使用している場合は、古いバージョンと併用しながら、徐々に切り替えていく必要あり

Page 6: Ssaw08 1111

Minimを使ってみる

• Minimとは• Processing用に開発された、オーディオを扱うためのライブラリ• 音を扱うための様々な機能をバンドル

• オーディオファイルの再生• ID3 (オーディオの情報 )タグの扱い• 録音・再生• サウンド入力・出力• 音響合成• ユニットジェネレータ群 (オシレータ、フィルタ)• 音響解析 (FFT, IFFT)• ビートの検出

Page 7: Ssaw08 1111

Minimを使ってみる

• Minimとは• Processing用に開発された、オーディオを扱うためのライブラリ• 音を扱うための様々な機能をバンドル

• オーディオファイルの再生• ID3 (オーディオの情報 )タグの扱い• 録音・再生• サウンド入力・出力• 音響合成• ユニットジェネレータ群 (オシレータ、フィルタ)• 音響解析 (FFT, IFFT)• ビートの検出

• 今回はMinim使用の一例として、音響解析 (FFT) を用いて、音響を視覚化してみる

Page 8: Ssaw08 1111

Minimを使ってみる1:サウンド出力

• sin波を生成し、サウンド出力する• Minimオブジェクトをインスタンス化する( = minim)• minimのメソッド、getLineOut() で出力先を指定 ( = out)• SineWave関数を用いて、sin波のデータを生成 ( = sin)• 出力先に、sin波のシグナルを追加 out.addSignal(sin);

Page 9: Ssaw08 1111

Minimを使ってみる1:サウンド出力

import ddf.minim.*;import ddf.minim.signals.*;

Minim minim;AudioOutput out;SineWave sine;

void setup(){ size(512, 200, P3D); minim = new Minim(this); out = minim.getLineOut(Minim.STEREO, 2048); sine = new SineWave(440, 0.5, out.sampleRate()); out.addSignal(sine);}

void draw(){}

void stop(){ out.close(); minim.stop(); super.stop();}

Page 10: Ssaw08 1111

Minimを使ってみる2:波形の表示

• 生成したシグナルの波形を表示する• 出力先 (minim.getLineOut) が out の場合

• out.left:左チャンネルのサウンドの値• out.right:左チャンネルのサウンドの値

• 特定位置のサンプルを読みだし• out.left.get(i) : 左チャンネル、i番目のサンプル• out.right.get(i) : 右チャンネル、i番目のサンプル• この情報を利用して波形を描く

Page 11: Ssaw08 1111

Minimを使ってみる2:波形の表示

import ddf.minim.*;import ddf.minim.signals.*;

Minim minim;AudioOutput out;SineWave sine;

void setup(){ size(512, 200, P3D); minim = new Minim(this); out = minim.getLineOut(Minim.STEREO, 2048); sine = new SineWave(440, 0.5, out.sampleRate()); out.addSignal(sine);}

void draw(){ background(0); stroke(255); for(int i = 0; i < out.bufferSize() - 1; i++) { line(i, 50 + out.left.get(i)*50, i+1, 50 + out.left.get(i+1)*50); line(i, 150 + out.right.get(i)*50, i+1, 150 + out.right.get(i+1)*50); }}

Page 12: Ssaw08 1111

Minimを使ってみる2:波形の表示

void stop(){ out.close(); minim.stop(); super.stop();}

Page 13: Ssaw08 1111

Minimを使ってみる2:波形の表示

Page 14: Ssaw08 1111

Minimを使ってみる3:サウンド入力+波形表示

• sin波を生成し、サウンド入力する• Minimオブジェクトをインスタンス化する( = minim)• minimのメソッド、getLineIn() で入力を指定( = in)

• minim.getLineIn(int type, int bufferSize);

Page 15: Ssaw08 1111

Minimを使ってみる3:サウンド入力+波形表示

import ddf.minim.*;

Minim minim;AudioInput in;

void setup(){ size(512, 200, P3D); minim = new Minim(this); minim.debugOn(); in = minim.getLineIn(Minim.STEREO, 512);}

void draw(){ background(0); stroke(255); for(int i = 0; i < in.bufferSize() - 1; i++) { line(i, 50 + in.left.get(i)*50, i+1, 50 + in.left.get(i+1)*50); line(i, 150 + in.right.get(i)*50, i+1, 150 + in.right.get(i+1)*50); }}

Page 16: Ssaw08 1111

Minimを使ってみる3:サウンド入力+波形表示

void stop(){ in.close(); minim.stop(); super.stop();}

Page 17: Ssaw08 1111

Minimを使ってみる3:サウンド入力+波形表示

Page 18: Ssaw08 1111

Minim: FFT

• FFT:高速フーリエ変換 (Fast Fourier Transform)• フーリエ変換を高速に演算するアルゴリズム

• 使用法• FFT(int timeSize, float sampleRate);

Page 19: Ssaw08 1111

Minim: FFT

• void setup()• mini.getLineInでサウンドを入力 ( = in )• FFTオブジェクトをインスタンス化( = fft)

• fft = new FFT(in.bufferSize(), in.sampleRate());

• void draw()• fftインスタンスを用いて、入力信号inをFFT解析する

• fft.forward(in.mix); ← 左右チャンネルをMIX• 解析した情報を画像として描画• fft解析結果のとりだし方

• fft.getBand(i) ー i番目の周波数帯のPower値

Page 20: Ssaw08 1111

Minim - FFT1 :解析結果をグラフにする

import ddf.minim.analysis.*;import ddf.minim.*;

Minim minim;AudioInput in;FFT fft;String windowName;float fftSize = 128;float graphScale = 16;

void setup(){ size(640, 480, P3D); colorMode(HSB, 360, 100, 100, 100); noStroke(); minim = new Minim(this); minim.debugOn(); in = minim.getLineIn(Minim.STEREO, int(fftSize)); fft = new FFT(in.bufferSize(), in.sampleRate());}

Page 21: Ssaw08 1111

Minim - FFT1 :解析結果をグラフにする

void draw(){ background(0); fft.forward(in.mix); for(int i = 0; i < fft.specSize(); i++) { fill(360 / fftSize * 2 * i, 100, 100); rect(width/fftSize * 2 * i, height - fft.getBand(i)*graphScale, width/fftSize * 2, fft.getBand(i)*graphScale); }}

Page 22: Ssaw08 1111

Minim - FFT1 :解析結果をグラフにする

Page 23: Ssaw08 1111

Minim: FFT - より効果的にビジュアライズ

• もう少し面白く視覚化できないか?• 音のハーモニーを視覚的に感じられるように工夫してみる

• グラフではなく半透明の円にする• 左右のチャンネルを個別に解析• 円の配置中心から左右に別れていく• レベルが円の半径になる• OpenGLで描画する (パフォーマスの向上)

Page 24: Ssaw08 1111

Minim: FFT - より効果的にビジュアライズ

import processing.opengl.*;import ddf.minim.analysis.*;import ddf.minim.*;

Minim minim;AudioInput in;FFT fft;String windowName;float fftSize = 1024;float graphScale = 20;

void setup(){ size(1024, 768, OPENGL); minim = new Minim(this); minim.debugOn(); in = minim.getLineIn(Minim.STEREO, int(fftSize)); fft = new FFT(in.bufferSize(), in.sampleRate()); background(0);}

Page 25: Ssaw08 1111

Minim: FFT - より効果的にビジュアライズ

void draw(){ background(0); noStroke(); fill(0,0,255,10); ellipseMode(CENTER); fft.forward(in.left); for(int i = 0; i < fft.specSize(); i++) { ellipse(width / 2 - width/fftSize * i, height/2, fft.getBand(i)*graphScale, fft.getBand(i)*graphScale); } fft.forward(in.right); for(int i = 0; i < fft.specSize(); i++) { ellipse(width / 2 + width/fftSize * i, height/2, fft.getBand(i)*graphScale, fft.getBand(i)*graphScale); }}

Page 26: Ssaw08 1111

Minim: FFT - より効果的にビジュアライズ

Page 27: Ssaw08 1111

外のアプリケーションとの連携

• 外の音響合成のソフトを用いて、音響を生成し、Processing + Minimで視覚化したい

• サウンドの出力をProcessingにルーティングする必要がある• SounfFlowerを用いると便利

• http://code.google.com/p/soundflower/• 外のアプリケーションのサウンド出力を全て取得して、別のアプリケー

ションの入力として扱うことができる

• 例• iTunes → SoundFlower → Processing + Minim• Max/MSP → SoundFlower → Processing + Minim• SuperCollider → SoundFlower → Processing + Minim• Chuck → SoundFlower → Processing + Minim• ...etc

Page 28: Ssaw08 1111

外のアプリケーションとの連携

• 設定:• SoundFlowerをインストールして再起動• System環境設定 → サウンド• 入力をSoundFlower (2ch) にする

Page 29: Ssaw08 1111

外のアプリケーションとの連携

• 出力側の設定• Soundflowerbed.appを軌道

• ツールバーに表示される• オーディオ出力先をBuilt-in Outputにする