ChucKで発見！自分の好きな音。

Livesense Advent Calendar 21日目。

残暑厳しいとある日、on-the-flyなオーディオプログラミング言語ChucKをいじっていた。「ポー」という何の味付けもされてない正弦波で、音叉から出るような音をいじっていた気がする。でももっとちゃんとChucKを使えば、自由自在に好みの音を作り出すことだって簡単にできるのでは？寒波身に沁みるとある日、そんな期待が湧いた。
音楽理論を知らなくたって、きっと自分の好きな音色を発見できる！ChucKならね。

# ChucKの入手

以下よりダウンロード。
http://chuck.cs.princeton.edu/release/
MacOSX、Linux、Windows対応してて親切！

同時にminiAudicleという、ChucK動作のためのIDEもインストールしよう。インストーラーを使う場合はChucKに同梱されている。

ChucK1.3系は多種のモジュールを組み合わせて使えるようなアーキテクチャであるため、コードネームが「キメラ(chimera)」となっている。
公式サイトには[キメラ画像紹介ページがあって、更にはキメラ画像を募集している](http://chuck.cs.princeton.edu/release/chimera-examples/)。開発者のキメラへの愛執を感じる一面である・・

# ChucKでまず音を出す

キメラ画像が手元にないので、まずはChucKで音を出す方法をみてみよう。

## ソースコード
基本フローは、「音の波をスピーカーに送って音を出す」。
(正確にはスピーカーではない)

```example.ck
SinOsc s => dac;
2::second => now;
// (´- `)oOO(まあ、ChucKのシンタックスハイライターは・・無いよねー・・)
```
以上の3行で、至極単純な正弦波の音が2秒間出力される。

`SinOsc`はsine(正弦)のoscillator(音を作り出す発信器)を作るクラス。組込み変数`dac`はdigital to analog converterの略で、サウンドボードと思ってもらえれば。

もっと言うと、`SinOsc`クラスは`Ugen`クラス(unit generatorを指す)を継承していて、unitは波のうねうねの1周期のこと。つまり`Ugen`一つ作れば、あとはそれを一定時間繰り返すだけで音となるのです。

発信器`s`をD/Aコンバーターへ、`=>`オペレーターによって「ChucKed」しているのが1行目。
この「ChucK(投げる、の意)」してるような形のオペレーターが度々使われるのだけど、言語名の由来だったんだね。

2行目では、time型の組込み変数`now`に対して、音の「通過」時間を指定。"2 sec from now"ですね。
3行目は`//`でコメントアウト。

以上までで「音波情報」と「音の通過時間」という2つの概念を用意した。これだけでもう音が出る。音量指定も、`play`みたいな再生の明示もいらないのだー(・∀・)


## 音の再生
実際に音を出すには`chuck`コマンドで。

```
$ chuck example.ck
```

もしくは、miniAudicleでも再生可能。
miniAudicleでChucK VMを立ち上げておき、ChucKプログラムのまとまり("Shred(小片)"と呼ばれる)をVMに渡してあげると音が鳴る。

※各々がShredを持ち寄ってChucK VMに投げ入れれば、複数人でコラボレーショナルなChucK大演奏会ができるのだ！！これはChucK開発者が目指す新しいスタイルの音楽パフォーマンスである。

# お気に入りの音を探る

では、先ほどの波の音について、プロパティをいじってみる

```frequency.ck
SinOsc s => dac;
1000.0 => s.freq;
2::second => now;
```

frequency(周波数)を高くしたことにより、音程が上がった。

、、ふーむ、、音程は変わったけど、もっと音色や音の表現をカスタマイズしたいですねぇ。
そう。音作りは本当はとても複雑で、究極的に自分の好きな音を表現するには、様々な形の波を、いくつもいくつも緻密に重ね合わせる必要がある。

音を形作るために、波を1つ1つ重ね合わせていくとすると・・・あっという間にクリスマスになってしまいますね。

波の形を滑らかにしたいよー！音量をうまーくフェードイン・アウトさせるような感じにしたいよー！等等、あるパターンを音へ全体適用するためには、ChucKに用意されている**多種多様なunit generatorやfilter**を使えばよい。

```chime.ck
SinOsc s => JCRev r => Echo e => dac;
.2 => s.gain;
.1 => r.mix;

[0, 2, 4, 7, 9, 11] @=> int scale[];

while(true)
{
    75 + scale[Math.random2(0, scale.cap() - 1)] => Std.mtof => s.freq;
    800::ms => now;
}
```

例えばこのようにリバーブとエコーを加えることにより、味気なかった正弦波を材料にして「幻想的なチャイム」をつくることができる。1つのunit generatorに対して、所謂「エフェクター」をこのように噛ませてあげれば、音の表現の幅はいくらでも広げられる。

↓ChucKのunit generator、filter一覧
http://chuck.cs.princeton.edu/doc/program/ugen.html

エフェクト対象の波も、正弦波ではなくパルス波にしても三角波にしてもよい。実は、ChucKには色々な「楽器」がプリセットされているので、楽器に対してエフェクトをかけていくこともできる。

# ChucKで出来ることその他
* マイクからの音の取り込み
    * digital to analog converterがあれば、analog to digital converterだってあるよ
* 各入力機器との連携
    * キーボード、マウス、ジョイスティックが楽器になったり
* MIDIの操作
* 音の分析
    * ChucK1.2から追加された機能。例えば[FFTアナライザーなんてのが出来るらしい](http://chuck.cs.princeton.edu/doc/language/uana.html)。FFTアナライザー製品の価格がン十万もするのが見受けられるなか、フリーで使えるChucKはかなりすごいのでは・・・どうなんでしょう・・(`･д´･; )ｺﾞｸﾘ

* もちろん、ハノイの塔もね
    * http://chuck.cs.princeton.edu/doc/examples/hanoi.ck

注意※プログラミングで音を調整する際はイヤホン非推奨。パラメーターをたった数桁いじるだけで、とてつもない大音量やありえない波長の音が出力されるので、耳がやられてしまうよ。

# 雑感
ChucKは本格的なかっこいい音楽を作るための道具ではもちろんなく、実験的に音を組み立てるためのお手軽ツールである。
もっと壮大なことをいうと、on-the-fly ＝ プログラム実行中に変更後ソースを即時反映できる、という特徴のChucKは、あくまでも、新しいスタイルでの即興演奏を実現できるよ！なビジョンの元作られた言語なのです。

自分の思い通りの音波を作るのは、本当はグラフィカルなソフトが一番ラクだと思うけれど、音の表現においては、プログラミング独特のものに自然となるので面白いですね〜。

ということでLivesense Advent Calendar 21日目でした。明日は分析チームの貴公子 @taise です。がんばれ〜！

P.S.
今日たまたま知り合った女性エンジニアの方が、[Python Advent Calendar 2014](http://qiita.com/advent-calendar/2014/python)の21日目担当だったｗ がんばれ〜！＞ @amacbee