Processing 恐るべし
アルゴリズムでアートな絵を描くComputational Artって分野がありまして、私も学生時代にのめりこみました。SIGGRAPHなども参加してました(見に行くだけですけど)。
当時、ゲーム会社の人とかが参戦していて、日本のレベルは高かったです。
そんなComputational Artの世界では有名なツールとして、Processingってのあるのですが、最近、いろいろと本が出ていて、
「お、マニアックな本だすなあ」
と思っていたのですが、なかなかどうして流行ってるみたいですね(たぶん)。
話は変わりますが、私の知人に「音楽異種格闘技戦」みたいなイベントをやっているミュージシャンの人がいて、前々から、
音楽とプログラミングの異種格闘(コラボ)
みたいなことができないかなあという話が出てたので、Silverlight4もマイク入力(ライン入力でもOK)に対応したことだし、
いっちょ何か作ってみるか!
とは思っていたのですが、サンプルは無いわ、FFTのライブラリは作らなあかんわで、しんどいなーと思っていたのですが、
「Processingなら、音楽とのシンクロとかも簡単だよ」
という噂を聞いたので、ちょっと調べてみたところ、
むちゃくちゃ簡単にできて驚きました!
これで、異種格闘技戦に参戦できそうです。
まあ、プログラミングで格闘といっても、まあ、音に合わせて映像が変化するみたいなことしか思いつかないのですが、普通そういうことをするには、まず、音を取り込んで、フーリエ変換で分解、量子化して、そこで得られた数字を何かと合わせて映像化みたいなことになるのですが、それがあっという間にできるんです!!!!
C#だと、Direct X (DirectSound)呼び出して、FFT実装してみたいな感じで、そこそこのコードを書かないといけないのですが、数行の標準コードで書けてしまいます。
L,Rのライン入力情報から、波形を書くコード。
こんな感じ。
import ddf.minim.signals.*;
import ddf.minim.*;
AudioInput in;
Minim minim;
void setup()
{
size(600,400);
minim = new Minim(this);
in = minim.getLineIn(Minim.STEREO,1024);
}
void draw()
{
background(0);
stroke(255);
int range = 100;
for(int i = 0; i < in.left.size()-1; i++)
{
line(i,100 + in.left.get(i)*range, i+1, 100 + in.left.get(i+1)*range);
line(i,300 + in.right.get(i)*range, i+1, 300 + in.right.get(i+1)*range);
}
}
void stop()
{
in.close();
minim.stop();
}
初心者なので、かなりテキトーですが、サンプル見ながら5分くらいで書けました。
で、実行すると、
こんな感じ。
すごーい。(実際は波形は入力値に合わせアニメーションします)
ここまでできれば、後は入力値を適当な映像や3Dのパラメータとして放り込んでやれば意外とそれっぽい画像ができます!!
私はライブでの利用を想定してライン入力しましたが、MP3とからかもloadFileとか一発で入力できます。
すごーい。
Processingダウンロードして、コピペして、再生ボタン押すだけで動くと思うので皆さんも試してみてください。
これでProcessingのエディタがインテリセンスなんかに対応してくれればもう最高!なんですけどね。