ChucK入門 #2 - 代入文とループとプロパティと私

今回は、さっそくこのソースを試してみましょう

SinOsc s1 => dac;
SinOsc s2 => dac;

440 => s1.freq;
660 => s2.freq;

for (1.0 => float f; f>0.0; f - 0.1 => f) {
  f => s1.gain;
  1::second => now;
}

実行してみると、440Hzと660Hzの混じった音が聞こえます。そういう音です、それ。
で、時間をかけて少しずつ 440Hz の音のほうの音量が下がっていきます。

ポイントは

440 => s1.freq;

などで、これは 代入文 です。 s1 は SinOsc のインスタンスで、そのfreqというプロパティに440を代入/設定しているというわけです。Javaなどの言語と比較すると左辺右辺が逆で慣れないかもしれませんが、読めない、書けないってことはありませんね。

次に

for (1.0 => float f; f>0.0; f - 0.1 => f) {
  f => s1.gain;
  1::second => now;
}

これは C-style なforループです。これもなんだか慣れないと見にくいような気もしますが、

  1. float型のfという変数を宣言し、それに1.0を格納してループスタート
  2. fが0.0より大きい数値の場合は
  3. fの値を s1(SinOscのインスタンスでしたね) の gain プロパティにセット
  4. 1秒待つ
  5. fから0.1を引いて上の脱出条件チェックに戻る

という、ありがちなものです。float型は定義済みの型で、まあ intとかfloatとか、そういうものが使えます。説明省略。左辺と右辺が違うだけなのにちょっと気持ち悪いような気がしますか?私もまだ慣れません。

さきほど SinOscのfreq というプロパティは周波数をあらわすものでした。で、 gainというプロパティは名前のとおり音量を示すものです。このプログラムでは s2はいじってませんから、440Hzのほうのオシレータの出力ゲインがどんどん落ちていくわけですね。そう聴こえます。

ところで

SinOsc s1 => dac;
SinOsc s2 => dac;

となっていますが、そう、dacに対して複数のSinOsc(というか出力を持つユニットジェネレータ)を接続できます。チャネルごとの調整はここではできませんが、ミキサーの役目も果たしてくれるわけです。

代入と、freqとgainと、複数のオシレータをつなげて、ループも書けるようになって、すでに夢がひろがりんぐではないですか? ChucK面白いですねー。