Ssaw08 1111
-
Upload
atsushi-tadokoro -
Category
Technology
-
view
2.176 -
download
1
Transcript of Ssaw08 1111
SSAW08 後期第8回
作品制作のヒントProcessing + Minim で音響を視覚化する2008年11月11日
本日の内容
• 前半:制作のヒント、その1• Processing と Minimを用いて、音響を視覚化してみる• Processing 0149以降のLibraryの扱いかたの変更について
• 後半:108スタジオ使用講習会 (矢坂先生)
Processin 0149以降の重要な変更点
• Processing 0149以降から、重要な変更あり• 参照:http://processing.org/download/revisions.txt
• ライブラリの扱いが変更となった• 全てのライブラリはSketchのフォルダ内の "libraries" フォルダに入れら
れていなければならない• 以前はProcessingのLibraryフォルダにあった• 以下の理由から変更されたらしい
• ユーザは以前のフォルダにアクセスできないかもしれない• またOS Xでは隠されている
Processin 0149以降の重要な変更点
• Sketchフォルダの場所を確認する• Pricessingのメニューから、" Sketch " > "Show Sketch Folder" を選択
• Sketchフォルダが表示される
• Processingの環境設定• Sketchbook location: で表示されている場所
Processin 0149以降の重要な変更点
• また、この変更に伴い、ライブラリの対応が必要なため、多くのライブラリの互換性が無くなっている• PGraphicsを使う全てのレンダラ
• 外部のLibraryを使用している場合は、古いバージョンと併用しながら、徐々に切り替えていく必要あり
Minimを使ってみる
• Minimとは• Processing用に開発された、オーディオを扱うためのライブラリ• 音を扱うための様々な機能をバンドル
• オーディオファイルの再生• ID3 (オーディオの情報 )タグの扱い• 録音・再生• サウンド入力・出力• 音響合成• ユニットジェネレータ群 (オシレータ、フィルタ)• 音響解析 (FFT, IFFT)• ビートの検出
Minimを使ってみる
• Minimとは• Processing用に開発された、オーディオを扱うためのライブラリ• 音を扱うための様々な機能をバンドル
• オーディオファイルの再生• ID3 (オーディオの情報 )タグの扱い• 録音・再生• サウンド入力・出力• 音響合成• ユニットジェネレータ群 (オシレータ、フィルタ)• 音響解析 (FFT, IFFT)• ビートの検出
• 今回はMinim使用の一例として、音響解析 (FFT) を用いて、音響を視覚化してみる
Minimを使ってみる1:サウンド出力
• sin波を生成し、サウンド出力する• Minimオブジェクトをインスタンス化する( = minim)• minimのメソッド、getLineOut() で出力先を指定 ( = out)• SineWave関数を用いて、sin波のデータを生成 ( = sin)• 出力先に、sin波のシグナルを追加 out.addSignal(sin);
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();}
Minimを使ってみる2:波形の表示
• 生成したシグナルの波形を表示する• 出力先 (minim.getLineOut) が out の場合
• out.left:左チャンネルのサウンドの値• out.right:左チャンネルのサウンドの値
• 特定位置のサンプルを読みだし• out.left.get(i) : 左チャンネル、i番目のサンプル• out.right.get(i) : 右チャンネル、i番目のサンプル• この情報を利用して波形を描く
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); }}
Minimを使ってみる2:波形の表示
void stop(){ out.close(); minim.stop(); super.stop();}
Minimを使ってみる2:波形の表示
Minimを使ってみる3:サウンド入力+波形表示
• sin波を生成し、サウンド入力する• Minimオブジェクトをインスタンス化する( = minim)• minimのメソッド、getLineIn() で入力を指定( = in)
• minim.getLineIn(int type, int bufferSize);
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); }}
Minimを使ってみる3:サウンド入力+波形表示
void stop(){ in.close(); minim.stop(); super.stop();}
Minimを使ってみる3:サウンド入力+波形表示
Minim: FFT
• FFT:高速フーリエ変換 (Fast Fourier Transform)• フーリエ変換を高速に演算するアルゴリズム
• 使用法• FFT(int timeSize, float sampleRate);
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値
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());}
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); }}
Minim - FFT1 :解析結果をグラフにする
Minim: FFT - より効果的にビジュアライズ
• もう少し面白く視覚化できないか?• 音のハーモニーを視覚的に感じられるように工夫してみる
• グラフではなく半透明の円にする• 左右のチャンネルを個別に解析• 円の配置中心から左右に別れていく• レベルが円の半径になる• OpenGLで描画する (パフォーマスの向上)
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);}
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); }}
Minim: FFT - より効果的にビジュアライズ
外のアプリケーションとの連携
• 外の音響合成のソフトを用いて、音響を生成し、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
外のアプリケーションとの連携
• 設定:• SoundFlowerをインストールして再起動• System環境設定 → サウンド• 入力をSoundFlower (2ch) にする
外のアプリケーションとの連携
• 出力側の設定• Soundflowerbed.appを軌道
• ツールバーに表示される• オーディオ出力先をBuilt-in Outputにする