ラベル minim の投稿を表示しています。 すべての投稿を表示
ラベル minim の投稿を表示しています。 すべての投稿を表示

木曜日, 10月 11, 2007

sonic typeface interactive


processingでは、例えばPImage型の変数imgを作って、
img = get();
とすればスクリーンをキャプチャできるので、テキスト入力しながら音を出すことは簡単にできた。
画像はHello worからHello worlになるところ。波形エディタでこれくらいにまで拡大して、再生するとアニメーションみたいなものにもなる。再生ポイントに合わせて動いてくれないと駄目だけど。
hello world.wav

波形エディタはaudacityってソフト使ってます。
フォント変えると音も違う。Helvetica Neue UltraLightとか音も細いよ。

最初気づかなかったけど、波形エディタでみると音の始めにずっと1.0が入ってた(ヘッドフォンしてるとバツッときてあと無音で圧迫感)。なんだろうと思ってたんだけど、setup()メソッドの中でbackgroundを明示的に初期化してなかったせいで、デフォルトの値がマッピングされちゃってた。processingのwindowを目で見ただけではわかんなかったけど、耳ではバツッてのがわかって、波形エディタで確認するとよくわかるのが面白い。

スポイルされちゃう部分もあるから絶対最強最高って訳じゃないし、方向性もぶれちゃったりするけど、とにかくものができると色々発見もあるし考えられる。

applet

テキストエディタ感覚で文字打てる。文字数多いとピッチも上がる。deleteで消せる。領域内をクリックしないと動かないかも。アルファベットのみ。

月曜日, 10月 08, 2007

sonic typeface src



minimで任意の波形テーブルを作るのはすごく簡単で、AudioSignalインターフェースを実装すればいい。exampleにあるので、参考に。

generate()メソッドに渡されるsamp[]の中に-1から1の値を突っ込む。
512サンプルの波形テーブルにするため、512ピクセルの画像を用意して、上から下、左から右にスキャン。

解説というか、自分でちゃんとわかってるか確認のためメモ(下のリンク先にあるソース参照)。
まずピクセル全てに番号を振る。

色が閾値以下の値を持っている場合(元画像を黒で作ってあるので、適当に赤成分が50以下、としました)、その番号。それ以外は0にして、sndArrayに入れる。

sndArrayの中で最大値と最小値を出す。最小値は0が最初に0でない数値を受け取ったときの値になるはず。boolean型の変数startで判別。

0の数はoffsetという変数に入れて最終的に振幅をそんだけ分持ち上げる。

次のif文でまずsndArray内に0でない値が入っているか(描画すべきピクセルがあるか)を判別し、
x%2==1が真のときに下のエッジ(highとlowの差+offset)、偽のときに上のエッジ(offset)をプロット。
(10/10訂正:上下が逆だったので直しました。)

あとはmap関数に任せれば、0から1の間で適当に補完してくれる。lowを1に、highを0にすることで、元画像と書き出された波形を一致させることができた。

タイポグラフィの専門用語で言うところのカウンター(counter)、文字の中の閉じられて中空になっている部分とか、入り組んだ部分、つまりhighとlowの間に0が入ってるところは潰されてしまう。描画の密度に差を持たせれば擬似的に空間を見せることは可能かもしれない。miujunさんのは多分そういう感じ。

今のところ画像読み込んでるだけだけど、テキスト編集する感じで音に直結できればいいなと。カーニングとか、長体とか、フォントを変えることによって音が変化する。それでプログラミングができて、さらにその音の解析からまたコードが生成されて、フィードバックする。

sourceの方はprocessingで実行してクリックすると画像と音を書き出します。色々試してみて下さい。minimライブラリが必要です。
applet
source(zip file)

土曜日, 10月 06, 2007

sonic typeface

先日衝撃を受けたオシロスコープに猫及びポルノ画像。

これはtex/tspの音響生成エンジンに使えるのではと思い試してみた。とりあえず文字の画像データを用意して、そいつを2値化して振幅に変換。とりあえず読めるレベルにはなってるのではないだろうか。詳しい解説はまた後で公開します。このアルゴリズムは多分最終成果物にはしない感じなので...。
Helvetica Neue 75 Boldを240ptで使用。



オシロスコープで出したいなー。

元画像。コード書き換えて反転なしでできるようにしよう。



processingではこんな画像ができる。



音はこんな感じ。ご家庭の波形エディタなどで読めるかどうか試してみて下さい。
ktkr.wav

木曜日, 8月 09, 2007

ess vs minim

processingで音を扱うライブラリのessminimのどっちがどっちだって話。徹底比較した訳ではないので、自分が使った範囲で覚えておこうと思うところのメモです。

ess
メリット
FFTを使う場合、damp()メソッドで値を滑らかにできたりして、ビジュアライゼーションには便利。
envelopeクラスがあるので、オシレータを組み合わせて音を作っていくのには向いてるかも。フィルターなどエフェクトもminimよりかは充実してる。

デメリット
サウンドファイルを読み込む場合、モノラルでしか扱えない。
mp3ファイルを読み込みたい場合は下記のファイルが必要。
tritonus_share.jar
mp3spi1.9.2.jar
jl1.0.jar
スケッチのあるフォルダにcodeというフォルダを作って入れておく。

長いサウンドファイルを読み込む場合はAudioStreamクラスを使う。その際

void audioStreamWrite(AudioStream theStream) {
// read the next chunk
int samplesRead=myFile.read(myStream);
}

というようなメソッドを作ってFileクラスから読み込んだ音をチャンクに入れていく(theStreamという仮引数は何をしてるんだろう...)。

minim
メリット
サウンドファイルが使いやすい。mp3ファイルが外部ファイルなしでそのまま使える。AudioSnippetクラス、AudioSampleクラス、AudioPlayerクラスなど用途に合わせていくつかクラスが存在する。AudioPlayerクラスはステレオでファイルが扱えてleftやrightというフィールド変数を持っているので、FFTなどで左右の値を取得できる。

BeatDetectクラスもあったりして解析系は便利(精度は怪しいかも知れない)。

デメリット
envelopeなどがなく、複雑な音の加工には向いてないかも。envelope、自分で用意するのだろうか(pythonだけど、ここのSound11 Kick drumみたいに)...。

僕の場合、現状ではできることとかやりやすさに合わせて使うライブラリを変えてます。まだまだどちらも発展途上。

興味があるのは、相変わらず自分で波形を定義する方法。
ess
Processing 1.0 (BETA) - Functional example of ESS Generative Audio

minim
exampleにUserDefinedSignalってのがあります。UserDefinedEffectってのもある。面白そう。

知らなかったけど、processing公式サイトにライブラリのサンプルコードがありますね。ライブラリの配布元とは違う内容で、参考になります。今日記事書いて良かった!
Learning \ Processing 1.0 (BETA)

金曜日, 7月 27, 2007

brainf*cksp

bfsp

brainf*ckをp5に移し替えて、tex/tspと混ぜ合わせてちょっと改変。現在オシレータのみ実装。ロジックの部分はbrainf*ckそのまま。while文にあたる[]を()に変えた。+-でポインタ内の数値を上げ下げして、オシレータにはその数値を渡す。ここが迷ってるなぁって感じ。[]でループを作る場合は強制的に矩形波を鳴らしてしまう、という設計にしてもいい気がする。

書き方は
> ポインタを1進める
< ポインタを1戻す
+ ポインタの指す要素の値を1増やす(インクリメント)
- ポインタの指す要素の値を1減らす(デクリメント)
. ポインタの指す要素の値を外に出力、音を鳴らす
( ポインタの指す要素の値が0であれば対応する次の)までジャンプ
) ポインタの指す要素の値が0でなければ対応する前の(までジャンプ
~ サイン波を生成
/ ノコギリ波を生成
^ 三角波を生成
[ または ] 矩形波を生成

440Hzのサイン波を鳴らすには
++++++++++++++++++++++(>++++++++++++++++++++<-)>~.
とすればいい。簡単に説明すると(の前の+の数だけ()の中を繰り返している。
以下、詳しい説明(本当に自分がわかってるか確認用)。

ソースコードのmがポインタ、mpがポインタの要素の値。初期値は0。

左から右に処理が流れる。
m[0]の要素の値mpがどんどん+で増やされていく。
+は22個なのでm[0]=22。
(にぶつかる。m[0]の要素の値は22で0ではないので、そのまま進む。
>でポインタをインクリメントしm[1]にする。以後の+はm[1]の要素の値に対して行われる。初期値は0。
+が20個。m[1]=20になったところで
<でポインタを1戻してm[0]に。
-でm[0]の数値をデクリメント。
m[0]=21
)にぶつかる。m[0]=21で0でないので(に戻る。
>でポインタがm[1]になる。
+が20個。m[1]=40になるまでインクリメント。
<でまたポインタがm[0]に戻る。
-でm[0]の数値をデクリメント。
m[0]=20
という感じで、20足すループを22回繰り返す。m[0]=0の時は)を通り抜ける。
<でポインタをm[1]にし、その数値440を~に渡してあげて、.で出力すれば440Hzのサイン波が鳴る。ついでにクという字もコンソールに出力される。

適当なエディタに上記のコードを書いて保存(拡張子はbとかtxtとか)し、processingのコードを実行してみて下さい。ウィンドウが出るので、クリックして、ファイルを選びます。
うまくいけば実行されます。元々のbrainf*ckは,でコンソールからの入力とかもとれるのですが、processingではちょっと面倒だったので実装してません。eclipseとかで動かしてれば別ですが。

音を鳴らすにはminimライブラリが必要です。
Code Log » Minim

brainf*ck参考リンク。
彼のInterpreterをほぼそのまま使ってます。
UMMO Letters » The Java Brainfuck Compiler
brainf*ckのコーディングについて参考にしたページ。
Brainf*ck
Brainfuck - Wikipedia, the free encyclopedia

もうちょっと使いながら何ができるか考えていこう...。
こういうのも面白いかもしれない。
西尾泰和のブログ: GRINEditを使ってソースコードの可視化


インタプリタ部分のライセンスです。僕のとこに関してはpublic domainで。
Copyright (C) 2002 Petter E. Stokke

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

金曜日, 7月 20, 2007

sketch20070719

今回はFFT使って周波数帯域毎に分けるsketch。

FFTクラスのインスタンスにgetBand()メソッドを送り、引数にインデックスを与えてその周波数帯の値を得る。
サンプリングレートが44100HzでFFTサイズ(timeSize)を512にしているので、帯域幅は44100/512≒86Hz。つまりgetBand(0)は86*0=0Hz、getBand(1)は86*1=86Hz、getBand(2)は86*2=172Hz...という風に86Hz毎に周波数のエネルギーを解析する。0から20までのインデックスをfor文で回す。さらにその中でif文を使って高域・中域・低域に分けている。やっとMax/MSPでやってたことがコードになってきた。

fftstudy : Built with Processing

マウスの位置をサイン波の周波数にマッピングしたものも作った(processingIDEで実行すると周波数がprintされてます)。

mousine : Built with Processing

木曜日, 7月 12, 2007

sketch20070712


minimで音響解析(といってもfftは関係なく、AudioPlayerのインスタンスからget()メソッドで音量取ってるだけです)。最終的にはこういう感じにしたい。

動いてる様子。
sketch20070712

金曜日, 6月 15, 2007

textsp_minim

minim1.1が出たのでtex/tspをminimで実装してみた。
textsp_minim

essと音の作り方が違ってるので、結果出てくる音もだいぶ変わってる。essだとAudioChannel()をnewする時にdurationを設定できるので、それが一文字当たりの音の鳴る長さにしてたんだけど、
minimの場合

AudioOutput out = Minim.getLineOut(Minim.STEREO, 512);

のところでサンプル数を指定する。で、512サンプルだから、44100Hzの場合、86.1328125msec。一文字だけだと音が鳴らないのは短過ぎるからなのだろうか。
サンプリングレートを直接変える方法がすぐ分かんなかったから{}では周波数を変えることにした。

オシレータを鳴らす文字を読み込む毎にaddSignalしてるので、数が増えるとクリップする。
行末まで読み込んだら頭に戻ってclearSignals()でオシレータをクリアしてる。

こういう感じで解釈を変えると音が変わるのは当然なんだけど、解釈しやすいように解釈してるってのがポイントで、それによる影響(インターフェースによる規定)ってのを考えたい。ある箇所を緩めたり、厳しくしたら一気に何かが開けた、みたいなことが起こる気がする。

やっぱ今くらいのワイルドな状態が一番面白い。洗練させてくと普通になっちゃう。ワイルドさを保ちながら成長させるとか、とりあえず普通レベルまで持って行ってそこ超えなきゃとも思うんだけど。すげー馬鹿でシンプルか、すげー賢くてシンプル。どっちか。

ドキュメント和訳とかしようかな。これに限らず色々和訳したい。別に誰かのためとかじゃなくて、ライフワークとして。日本語を英語にするのでもいい。技術的な文献もいいけど、何か面白いやつ翻訳したい。これ翻訳すんの?っていう。何にしても僕はどこかに乗っかった状態で何かやるのがいいみたい。0から1を作るタイプじゃない。こっそり考えてはいるけどね。

月曜日, 5月 07, 2007

dragsound

minimライブラリ使ってマウスオン、ドラッグしたら音が鳴ったり加工できたりするアプリ作った。左右でパン、上下でバンドパスフィルタがかかる。本当は音量にしたかったんだけど、lineがどうのとかわからなかったので挫折。そのうち。重ねると(むりやり)mix。DSP本気でやるのは無理だからこういうの(で面白いの)をすぐ作れる力を磨こうと思う。twitterからxml取ってどうのってのもまぁできるようになったし、第三者に介入されつつ何とかみたいなやつもできそう。max版も作ってるよ。色々違うけど。

dragsound

月曜日, 4月 16, 2007

scratcher

minim使ってみた。とてもスムーズ。
四角の上にマウスを持ってくと音がループします。
simple break beats.

これ書いてる時にブラウザ落ちたけど気にしない。
次はドラッグ&ドロップでエフェクトかける予定。パンとか。まずはわかりやすいところから。

水曜日, 4月 11, 2007

minim

processingのサウンドライブラリ。
ドキュメンテーションも親切だしいいかも。sourceも入ってるしね。僕が学ぶべきはむしろそっち方面かな。
minim