音の鳴るブログ

鳴らないこともある

音楽用CoffeeScriptを作ろう (8) タスク

タスクっていのうはスケジューリングできる関数です。

Demo - CoffeeCollider

s = Synth.def (freq=440, amp=1)->
  Out.ar(0, SinOsc.ar([freq, freq * 1.25]) * amp)
.play()
 
l = Task.loop ->
  freq = Math.random() * 880 + 220
  s.set freq:freq * 1, amp:1
  @wait 300
  s.set freq:freq * 2, amp:0.25
  @wait 300
  s.set freq:freq * 1, amp:0.5
  @wait 200
.play()

こういう感じで wait することができる。ただしスレッドのある言語のような純粋な wait/sleep ではなく同期に対応しているメソッド (この場合 s.set ) をタイムラインに登録して、タイミングに応じて呼び出すみたいな感じ。1回だけ実行する Task.do、繰り返す Task.loop、配列を捜査する Task.each、setInterval的な Task.interval、setTimeout的な Task.timeout がある。再帰的に呼べるのが書けたらクールだと思うけど無理そう。

試しにタイムラインをひとつ用意してそこにがんがんイベントを挿入するやりかたで実装してみたら意外と簡単にできたのだけど、入れ子にしたサブタスクを待つとか、ちょっと複雑なことをやろうとすると厳しそうなので書き直し。カクカク~