timbre.js の使い方メモ:bang メソッド
あたらしい timbre.js のドキュメントのドラフトみたいな感じで書く。第二弾。
timbre.js のオブジェクトは timbre.Object
というルートクラスを継承している。そこで全オブジェクトに共通のメソッドを定義しているのだけど、 その中に bang
というメソッドがある。ルートクラスの bang
メソッドは呼び出すと bang
イベントを呼び出すだけで特になにもしない。bang
は オブジェクトごとに定義された何らかの動作をする。
var a = T(10).on("bang", function() { console.log("BANG!!"); }); a.bang();
T(Function) の場合
T関数 に関数を入れた場合、FunctionWrapper
という組込み型みたいなオブジェクトになる。FunctionWrapper
は bang
メソッドを呼び出す事で、保存されている関数を実行する。
var func = T(function(value) { console.log(value); // 引数が渡せるので "hoge-" と表示される }); func.bang("hoge-");
エンベロープの場合
T("perc") や T("adsr") などのエンベロープの場合は、エンベロープを開始する。以下の例ではサイン波に減衰エンベロープを積算して出力する。注意しないといけないのは、エンベロープは bangしないと起動しないので、これを忘れると無音のままになってしまう。
T("perc", T("sin")).bang().play(); // set をつかって T("perc", {bang:true}, T("sin")).play();
T("buffer") / T("audio") の場合
bang
することで最初から再生しなおす。また bang(false)
とすると次の bang()
までバッファの内容は再生しない。ちょっとややこしいけど、例えばドラム音をサンプリングして bang
きっかけに再生する場合(デモ)などに使える。
var a = T("audio", {load:"hoge.wav", bang:false}).play(); // 音は鳴らない setInterval(function() { a.bang(); // bang することで繰り返し再生する }, 1000);
なんで bang か?
オブジェクトごとに execute
とか restart
にせずに bang
なのにはもちろん理由がある。
T("interval")
などのタイマー系オブジェクトは自信のタイミングで入力オブジェクトの bang
を呼び出す。またEventEmitterのコールバックに Tオブジェクト を指定した場合も、イベントのタイミングで bang
を呼び出す。
例えば以下の場合だと、1000msecごとに perc の bang
を呼び出す。この仕様によってあまりごちゃごちゃ書かなくても良くなっている。
var sin = T("perc", {r:50}, T("sin", {freq:1760})).play(); T("interval", sin).start();
なんで bang なの?
名前の由来は Max/MSP です。なんか格好いいとおもったから。