v0.3.0
パターンシーケンスみたいなのを簡単に出来るように新しくオブジェクトを足したので、とりあえずだらだらと解説を書いておく。
パターン
http://mohayonao.github.com/timbre/documents/array.html
T([0, 1, 2, 3, 4]).set("repeat", 4);
まずパターンを定義するオブジェクト、最初のバージョンからあったオブジェクトをそのまま流用した。T関数に配列を入れると生成される。このオブジェクトは bang() を呼び出す度に一つ進む (0 -> 1 -> 2 -> 3 という具合に)。数値は周波数でも良いし、何番目の音とかでも何でもよい。後でこのオブジェクトを入力するオブジェクト次第。
配列は入れ子にすることも出来る。パターンは終端に来ると無限にループするので repeat プロパティで繰り返し回数をしないといけない。
p = T([0, [1, 2], 3, 4, 5]); p.value[1].repeat = 2; // bangする度に 0 -> 1 -> 2 -> 1 -> 2 -> 3 -> 4 -> 5 -> 0 ...
仕様が変わっている部分があって、以前はオブジェクト生成時に先頭の値をさしていたけど、bang() を呼び出さないと最初の値を指さなくなった。
スケール
http://mohayonao.github.com/timbre/documents/scale.html
T("scale", "major", root, octave).append(input);
スケールを適用するオブジェクト、スケールの種類は major や minor 、lydian とか wholetone とか自分で定義することもできる。入力はスケールのインデックスで出力は周波数となる。たとえば、major スケールで 入力が 2 のときなら、rootの音から長三度の周波数を出力する。octaveで8度ずつシフトさせることもできる。インデックスは実数でもOKで、例えば増五度なら 4.5 と指定出来る。
さっきのパターンを入力にして、周波数を出力するので T("sin") 等のオシレータに突っ込むのが一般的な使い方になると思う。
T("scale").setScale("hoge", [0,1,2,5,6,7])
で、スケールを登録して使うことができる。複数の音列で同じスケールを参照しながら、スケールデータ自体を変化させたりとか面白いかもしれない。
スケジュール
http://mohayonao.github.com/timbre/documents/schedule.html
T("schedule", "bpm (142, 16)", [/* time table */], true);
タイマーのオブジェクトで指定したタイミングで関数を実行させたりできる。
2つめの引数は "msec" または "bpm(..)" で bpmの時はテンポて何分音符かを指定する。
タイムテーブルは以下のように設定する。"msec"の時は開始してからの時間。"bpm"のときは何個目の音符かで指定出来る。タイミングの後に音を出す処理を書いたり、パターンを変更したり、何かを実行する関数を書ける。オブジェクトを入れると bang() が呼ばれるので、エンベロープの開始だけしたいときはオブジェクトを入れておけば良い。
[ [0, envelope], [2, function() {}] ]
ユーティリティ関数
Pythonっぽい random 関数を作った。seedを指定すれば再現性のある乱数が使える。
timbre.utils.random.seed(seed)
timbre.utils.random.random()
timbre.utils.random.randint(a, b)
timbre.utils.random.choice()
timbre.utils.random.shuffle()
Pythonっぽい range 関数を作った。
timbre.utils.range(start, stop, step)
これらは
timbre.utils.exports("random", "range")
とすれば windowオブジェクトしバインドできる。長々と書きたくないときは便利。
ランダムなパターンを作る例
T(shuffle(range(8))
あとFM音源的なことも出来るようになっている。
http://mohayonao.github.com/timbre/documents/cook.fmbell.html