ChucK入門 #1 - 音をならす

ChucKという、オーディオ処理用の言語、環境があります。同種のものにはSuperCollidorなどが挙げられます。SuperColliderは相対的にメジャーなようなのですが、このChucKはまだまだ日本語での記事/ドキュメントが不足しているようなので、(リファレンス的なものは到底無理ですが)少しずつ「入門記事」のような形にまとめていければいいな、と思ってはじめてみます。

なお、前提として 他のIDEとか、プログラミング言語を知っている人が対象になってしまうかもしれません。JavaとかC++とかに似ている側面もあるので知識や経験は少なからず活きます。

インストール編

ChucKを生のままインストールするのもいいのですが、もっとイイものがあります。miniAudicleというChucK用のIDEがそれです。

こちらを使ったほうが入門としてはハードルが低いので、ぜひこちらを使いましょう。
上記リンクからダウンロードしてきてインストールしてください。

miniAudicle/ChucKの基礎

miniAudicleを起動します。

miniAudicle上でプログラムを走らせるためには、Virtual Machineを起動する必要があります。Virtual Machineのウインドウの下部にStart Virtual Machineというボタンがありますのでこちらを押しておいてください。

まずは、音を鳴らしてみましょう。以下のソースコードをいかにもソースコードを入力するようなウインドウに入力してください。

SinOsc s => dac;
2::second => now;

で、このプログラムを走らせるのですがその前に。

ChucKでは Shred という概念があり、並列処理を前提としたプログラミングをすることになっています。しゅれっど、つまりスレッドだったんだよ!なんだってー!みたいな感じで理解しておけばいいかと思います。
で、プログラムを走らせる、というのは、つまり今書いたソースコードに対応する Shred を1つ作成する、ということになります。

ソースコードのウインドウの上に Add Shred というボタンがありますのでこちらをクリックしてみてください。すると、2秒ほどサイン波が鳴って終了します。このとき、Virtual MachineのウインドウにShredが追加され、終了する様が見えます。

解説

まず

SinOsc s

という部分ですが、これはSinOscクラスのインスタンスsを宣言および生成していると考えれば良いでしょう。ChucKでは、Javaのように参照を保持し、C++のように宣言時にインスタンス化されます。newを使ってインスタンスを明示的に生成、する必要はないわけです。

SinOsc s => dac;

これは、

SinOsc s;
s => dac;

と同じです。では、分解後の2行目は一体何をしているのでしょうか。

"=>"は、文脈によって異なる意味を持ちます(比較演算子ではありません)。このケースでは接続を意味しています。

また、dac はChucKによって定義済みのインスタンスで "Digital-Analog-Converter"の略になっていますが、実際にアナログ変換処理があるわけではなくて、ここへ信号を流し込むと「音がなります」という意味あいでオーディオ用語として"DAC"を引用しているものと思われます*1

SinOscクラスは「サイン波を生成する」クラス*2で、これをdacに接続すると音がなる。そういう仕掛けです。

では、次の行はどうでしょうか?

2::second => now;

まず 2::second は「2秒」という期間を示す表現です。ChucKの時間表現はいろいろなバリエーションがあります。今後の回で紹介できればいいなと思っています。

で、先ほどまでの説明だと、その2秒をnowに接続する、という風に読めるのですがどういう意味なのでしょうか。

実は、この "=> now"は接続ではなくて、「その時間まで待つ」とか「その期間だけ待つ」という意味になります。=>は演算子のように見えますが、複数の意味を持った構文なので厄介ですね。その他、変数への代入などにもこの構文を使います。

ですので、この文は「2秒待つ」ことを指示していることになります。

サイン波を発生させるインスタンスdacにつないで、2秒待つ。すると2秒だけ音が聴こえる。そういったプログラムだったわけです。

というわけで一回目終了。

*1:同じようにして、外部からの入力は adc, "Analog-Digital-Converter"となっています。感覚的な理解で良いかと思われます

*2:厳密にはUGen, ユニット・ジェネレータが正しいかと思われます