サウンドプログラミング用のJavaScriptライブラリをつくっている
アイデア
例えば Cメジャー のコードは ド ミ ソ で構成される。
和音は加算で書けるので、
ド + ミ + ソ
これを、lispよろしくこう記述する。
(+ ド ミ ソ)
ドっていうのは、
(sin 523.25)
みたいな感じで、523Hzのサイン波 みたいな感じ。位相や振幅も指定できるけど省略している。音色は sin でなくて tri とか saw とかでも良いし、サンプリングした音でも良い。
ピアノみたいな減衰音は、
(adsr 0 1000)
こう書くとする。ADSRエンベロープで Attack が 0msec、Decay が 1000msec、Sustain と Release は省略。この場合、1000ミリ秒で減衰する。
振幅はかけ算で書けるので、さっきのコードと合わせて書くと
(* (+ ド ミ ソ) (adsr 0 1000))
こう書ける。
詳細に書くなら
(* (+ (sin 523.25) (sin 659.25) (sin 783.99)) (adsr 0 1000))
これを演奏すると、1秒で減衰するドミソの和音が鳴る。
カッコに括られているものは信号処理オブジェクトで、実行時に繰り返し評価されて信号処理を行う。変数に代入してプロパティを変更したりできるし、なんらかのメソッドを実行できる。lisp風ではなくなってきた。
s = (sin 440) s.freq = 880 s.off().bang().set("phase", 0.25)
最初は、Max/MSP のように信号処理をするオブジェクトをグラフとして扱い、 lisp のように記述するって考えていたけど、 SuperCollider の亜種でしかない気もする。どれもチュートリアル程度しか知らないので何とも言えない。
timbre
まぁ、そういうアイデアがあって JavaScript のライブラリを作っている。名前を timbre (ティンバー)ってしたのだけど、字面が tumblr っぽすぎて失敗したかもしれない。インターフェイスを見直したりしながら何回か書き直していている。
JavaScript なので制御的な部分は簡単に書けるし、Webコンソールを使ってライブコーディングしながら演奏できる。node.js でも動かせる(予定)。WebSocketを使ってデータを飛ばせるとかも面白い(予定)。最終的には emacs で C-x C-e とかしたら評価されて音が鳴るみたいになれば面白いと思う。
少しのデモ
http://mohayonao.github.com/timbre/examples/001_oscillators.html
GitHub
https://github.com/mohayonao/timbre