ならば

音とかで遊んでいたログ

Chuc句

ChucK開発者の一人Ge Wangスタンフォード大学の准教授で、今冬はChucKを使った音響学Music 220bを教えている。この講義の最初の課題に、Chuc句を二句作れというのがある。Chuc句とは俳句っぽいChucKプログラムのことで、具体的には次の条件が指定されている。

  • ちょうど三行のコード。ただし一行は80字未満
  • 実行すると音が鳴る
  • 外部ファイルは使わない
  • オプション:五・七・五形式で、見た目の良いコードを目指す

オプションの五・七・五形式を無視したら単なる三行プログラムなんだけど、これは組み入れるのが難しいというか、どうやったらいいか分からん。何を単位にするのがいいんだろう。
課題に合わせて二句載せる。
一句目。一行一文縛り。豪雨風。

Impulse imp => LPF f => dac;
2008 => f.freq;
while(Std.rand2f(.01, 1)::ms => now) Std.rand2f(1, 5) => imp.next => f.Q;

前にユニットジェネレータImpulseの使い道を模索したとき作っておいたプログラム。未だに上手い使い方は見つからない。
Impulseはfloat型パラメータ.nextにセットされた値を次のサンプリングで出力する。Stepとは違ってImpulseが設定値を出力するのはあくまでその値がセットされた直後のサンプリング一度だけで、それ以降は0になる。Impulseの出力を.lastで読む場合、セットした値は次のサンプリングまで出てこない。テストプログラム。

Impulse imp => blackhole;
<<<imp.next(), imp.last()>>>;
-1.23456 => imp.next;
now + 5::samp => time later;
while(now < later) {
    <<<imp.next(), imp.last()>>>;
    samp => now;
}

コンソール出力は以下。ちなみにImpulseをStepに置き換えて実行すると、出力の四行目以降は三行目と同じになる。

1.000000 0.000000 
-1.234560 0.000000 
-1.234560 -1.234560 
-1.234560 0.000000 
-1.234560 0.000000 
-1.234560 0.000000 


二句目。安易に各行の文字数の二桁目を五・七・五にした。内容的に新しいことは何も。

TriOsc s => Gain g => dac; TriOsc t => g; .1 => g.gain;
fun void f() { while(50::ms => now) {t.freq(s.freq()*.575);} } spork ~ f();
while(9::ms => now) {s.freq(t.freq()*Std.rand2f(1.5, 2));}


それにしても面白そうな講義でいいなー。