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)」となっている。
公式サイトにはキメラ画像紹介ページがあって、更にはキメラ画像を募集している。開発者のキメラへの愛執を感じる一面である・・
ChucKでまず音を出す
キメラ画像が手元にないので、まずはChucKで音を出す方法をみてみよう。
ソースコード
基本フローは、「音の波をスピーカーに送って音を出す」。
(正確にはスピーカーではない)
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開発者が目指す新しいスタイルの音楽パフォーマンスである。
お気に入りの音を探る
では、先ほどの波の音について、プロパティをいじってみる
SinOsc s => dac;
1000.0 => s.freq;
2::second => now;
frequency(周波数)を高くしたことにより、音程が上がった。
、、ふーむ、、音程は変わったけど、もっと音色や音の表現をカスタマイズしたいですねぇ。
そう。音作りは本当はとても複雑で、究極的に自分の好きな音を表現するには、様々な形の波を、いくつもいくつも緻密に重ね合わせる必要がある。
音を形作るために、波を1つ1つ重ね合わせていくとすると・・・あっという間にクリスマスになってしまいますね。
波の形を滑らかにしたいよー!音量をうまーくフェードイン・アウトさせるような感じにしたいよー!等等、あるパターンを音へ全体適用するためには、ChucKに用意されている多種多様なunit generatorやfilterを使えばよい。
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アナライザーなんてのが出来るらしい。FFTアナライザー製品の価格がン十万もするのが見受けられるなか、フリーで使えるChucKはかなりすごいのでは・・・どうなんでしょう・・(`・д´・; )ゴクリ
-
もちろん、ハノイの塔もね
注意※プログラミングで音を調整する際はイヤホン非推奨。パラメーターをたった数桁いじるだけで、とてつもない大音量やありえない波長の音が出力されるので、耳がやられてしまうよ。
雑感
ChucKは本格的なかっこいい音楽を作るための道具ではもちろんなく、実験的に音を組み立てるためのお手軽ツールである。
もっと壮大なことをいうと、on-the-fly = プログラム実行中に変更後ソースを即時反映できる、という特徴のChucKは、あくまでも、新しいスタイルでの即興演奏を実現できるよ!なビジョンの元作られた言語なのです。
自分の思い通りの音波を作るのは、本当はグラフィカルなソフトが一番ラクだと思うけれど、音の表現においては、プログラミング独特のものに自然となるので面白いですね〜。
ということでLivesense Advent Calendar 21日目でした。明日は分析チームの貴公子 @taise です。がんばれ〜!
P.S.
今日たまたま知り合った女性エンジニアの方が、Python Advent Calendar 2014の21日目担当だったw がんばれ〜!> @amacbee