電音の工場ブログ

趣味の電子工作を中心としたブログです.音モノの工作が多いです.

ChucK楽しい

ChucK楽しい

いや、自分のハンドルのことを云っているのではなく…

suikanさんがコメントで教えてくれたコンピュータ言語 ChucKはてブでも盛り上がっていたんですね。

コメントにも書いたようにいつだったかどこか(CDMだったかなぁ)で知って、そのときにプリンストンのサイトにも見にいっていた。

ChucK => Strongly-timed, On-the-fly Music Programming Language

Strongly-timedというところにいたく感動したりして。System Cの代わりにならないかな(ならん)。

初めて見たときは「みんないろんな言語を考えるなぁ」という感想だったのだけれど、suikanさんに教えていただいたこちらの記事(d:id:KZR:20090128:p1)で動いているところを見たら俄然興味が出てきた。

新しい言語に手を出す前に先にProcessingをやれとか、pdも身につかないのにとか、MAX/MSPは買えないしていうかその前にMacBookとDigital Performer欲しい*1とか、Arduinoはどうしたとか、digital0010はどうなったとか、やることにもあるだろうとか思うけれど、興味が出ちゃったものは仕方がない。とりあえずダウンロードしてきてサンプルコードを動かしてみた。

しかし…

よくわからない。動かし方もわからない

ということでチュートリアルを読んでみたら取っ掛かりとしてはなんとなくながら、すぐにわかった。

SawOsc s => Gain g => dac;
.5 => g.gain;

とか

SinOsc s => dac;
SinOsc lfo => s.freq;

といった記述を見れば、アナログシンセを作っているような人はすぐにわかるのではないかと思う。

MIDIやOSCについても考えられていて、MIDIなんかはMIDIノート番号を周波数に変換するメソッド(?)(Std.mtof)を持つ標準オブジェクト(ライブラリ)が用意されていたりその逆(Std.ftom)もあったり。

だから、ペンタトニックとかのスケールを配列に入れておいて、配列添え字をランダムに振ってノート番号を生成したものを周波数に変換して、発振器に突っ込んで音を出すなんていうことが最初から考えられているみたい。

[ 0, 2, 4, 7, 9 ] @=> int scale[];
…
scale[ Math.rand2(0,4) ] => float freq;
Std.mtof( 69 + (Std.rand2(0,3)*12 + freq) ) => s.freq;

うたい文句であるところの、Strongly-timedConcurrentOn-the-flyといったあたりは現在勉強中。time とか durationとか、Thread ならぬ Shred を fork ならぬ spork するとか、あとは event とかいうあたりのキーワード。

いや実はもっと書きたいことがあった(昨日からドキュメントを読み出したばかりなのに偉そう)。

Unit Generator(ugen)と呼ばれるクラスオブジェクトが既に充実している。上で書いた dac とか Gain とか SinOsc とかもそう。信号源(ノイズ/インパルス/ステップ/sin/saw/rect…)、窓、ゼロクロス、フィルタ(バイカッド/単極/2極/単零/2零/零極/LPF/HPF…)、エフェクト(delay/echo/reverb…) などたくさん揃っている。信号処理屋さんも嬉しい。

楽音生成のクラスオブジェクトも既に用意されていて口笛/人の声/ブラス/クラリネット/シタール/FM… はては moog や FMで作ったローズ まで!

音を出して遊ぶことが主体だったら、ScilabよりもChucKを起動してしまいそう。それにしても私が学生だったときはこんなことやろうとしたら大型計算機でかなり長い時間演算をしていたような… 

とりあえず、片っ端からデモを動かしてみてパラメータを弄ったり、エフェクトのパラメータを換えたり、ローズでランダムにノートをぱらぱらと弾くデモを改造してmoogの音色になるように変更してみたり。

そんなこんなで遊んでいたらあっという間に2時間ほど経ってしまった。うわーん、今日はMIDI2CV3アナログ回路部分のハンダ付けを多少なりとも進めようと思っていたのに…