読者です 読者をやめる 読者になる 読者になる

音の鳴るブログ

鳴らないこともある

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 という組込み型みたいなオブジェクトになる。FunctionWrapperbang メソッドを呼び出す事で、保存されている関数を実行する。

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 です。なんか格好いいとおもったから。