周期を合わせる
プログラムからshredの追加や置き換えのタイミングを操作せずに、好きなときに"Add Shred"したりしてもshredを同期させるにはどうすればいいか。マニュアルを見ると
The concurrency is 'sample-synchronous', meaning that inter-process audio timing is guaranteed to be precise to the sample.
Concurrency & Shreds
ということで、何も書かなくてもサンプリングのタイミングに関してはやってくれる。
もっと長い周期で合わせるには、少しだけコードを書く必要がある。まずは、examplesにあるtick2.ckが分かりやすい。
// tick tock // wait until the start of the next second second - (now % second) => now; // infinite time loop while( true ) { // print now in seconds <<< "tick:", (now / second) $ int, "seconds" >>>; 1::second => now; }
これを実行すると、nowについてきっかり一秒*1ごとに秒単位で計ったnowが出力される。何回か"Add Shred"を押すと、追加のタイミングに関わらず全てのshredが同期して動くことがわかる。ポイントは当然「second - (now % second) => now;」で、この行をコメントアウトしたら同期しない。
「now % second」は「time型 % dur型」という形で結果はdur型になる。この式でnowが「きっかり一秒」からコンマ何秒分ずれているかが得られるので、それをsecondから引いた時間だけ待てば、次の「きっかり一秒」にそろえることができる。
一般的には次のようにやる。
.25::second => dur T; // Tに合わせたい周期を入れる T - (now % T) => now; // 周期を合わせる while(true) { /* 音を鳴らしてみたり */ T => now; }
音が鳴るプログラムは、examplesのotf_01.ckからotf_07.ckに用意されている。ファイルを開いて順に好きなタイミングで"Add Shred"していけばドラムとサイン波の音が合わさった音楽らしきものが聴ける。前もって周期を決めてからこの仕組みを使えば、ライブコーディングで書いたコードを片っ端からどんどん追加していってもちゃんと全部の周期が合った音楽を作っていくことができる。上手く書ければ楽しいかも。
*1:「きっかり一秒」というのを確かめるにはコード中の「$ int」を削った方がいい