tn8's SuperCollider site
tdfc
SuperColliderについて

SuperColliderは、James McCartneyによって開発されたリアルタイム音響合成のためのプログラミング言語/環境だ。特別なハードウェアを必要とせず、PowerMacintoshのみで動作する。
SuperColliderには、音響処理や音響合成のためのオブジェクトが豊富に用意されている。そして、ユニークな音楽データ処理のためのオブジェクトも充実している。アルゴリズムによって生成される音楽の制作にも適したツールだと言えるだろう。ちなみに、SuperColliderの前身は「Pyrite」というMaxオブジェクトだ。「Pyrite」も音楽データのリスト処理を得意としている。プログラミングはMax/MSPと異なりテキストベースで行われる。

また、SuperColliderは画面上のコントローラーを作成するための、簡単なGUIビルド機能も備えており、作成したGUIによってプログラムをコントロールすることができる。この他にもマウスやMIDIコントローラなどの外部機器からの入力を利用することができる。

では、実際にSCでのプログラミングをのぞいてみることにしよう。 SuperColliderは本家のサイト(http://www.audiosynth.com/)からダウンロードすることができる。デモ版ではサウンドファイルの書き出しができない、プログラムの実行時間が限られている、などいくつかの制約はあるが、ちょっと試してみるにはこれでよいだろう。

SCフォルダ>Examplesフォルダの中には沢山のExampleプログラムが用意されているので、まずはこれを実行してみよう。Exampleファイルでは、1つのファイル内に複数のプログラムが記述されていることがあるが、SCのバージョン2.Xでは複数のプログラムを同時に実行することはできないので、注意しなければならない。まずはexamples 1ファイルを開く。「// analog bubbles」 と赤い文字でかかれた上の行の丸括弧( のあたりをダブルクリックする。するとその丸括弧に対応するとじ括弧 )までが選択される。これで1つのプログラムを選択したことになる。これを実行するためにはenterキーを押す。実行を中止するにはcommandと.ピリオドを同時に押せばよい。

次にPbindクラスとL-Sytemによるアルゴリズミック・コンポジションに挑戦してみよう。Pbindクラスにはあらかじめ沢山のパラメータが用意されており、それらは適切なデフォルト値を持っている。例えば、ピッチを指定するだけで、適切なオシレータが適切なエンベロープ、適切なアンプリチュードで鳴ってくれるのだ。

以下の例は、ピッチをmidiノート番号として指定したシンプルな例だ。これを実行するとMIDIノート番号60=ドがずっと鳴り続ける。指定したmidiノート以外のもの=音源になるオシレータ、エンベロープ、アンプリチュード等はデフォルトのものが適応されていることになる。

(
Pbind(
\midinote, 60
).play
)

次に、Pseqクラスを利用し音列を指定する。Pseqは最初のアーギュメントで指定されたアイテムのリストを、2番目のアーギュメントで指定された回数繰り返す。下ではinfが指定されているので、Pseqは永遠に繰り返される。
(
Pbind(
\midinote, Pseq([61,64, 69, 73, 76, 78, 80, 75, 71, 68, 63, 59], inf)


).play
)

この音列はある有名なピアノ曲の冒頭の一小節なのだが、なんの曲かお解りだろうか?もうすこしスピードをあげてみるとわかりやすいだろう。それを指定するには、durを用いて指定する。

(
Pbind(
\midinote, Pseq([61,64, 69, 73, 76, 78, 80, 75, 71, 68, 63, 59], inf),

\dur, 0.2
).play
)

そう、これはクロード・ドビュッシーのアラベクス1番の冒頭部分だ。リズムやエンベロープを変えたり、パンニングしてみよう。
(
Pbind(
\midinote, Pseq([61,64, 69, 73, 76, 78, 80, 75, 71, 68, 63, 59], inf),
\dur, Pseq([0.25, 0.125, 0.25, 0.25,0.5], inf),
\amp, Pseq([Pseq([0.5,0.2,0.5,0.2], 4)], inf),
\pan, Pseq([1,-1], inf),
\legato, Pseq([0.1,0.2], inf),
\env, Env.asr(0.5, 0.5, 0.5)

).play
)

さて、話は変わるが L-System(エルシステム)というのを御存じだろうか?L-Systemは、生物学者であるアリステッド・リンデンマイヤーが1960年代に提唱した、生物細胞の分割のアルゴリズミック・システムだ。CGの世界では植物の枝別れの状態の記述などにつかわれている。L-Systemでは、「初期状態」と、ある「ルール」を定義すると、初期状態のものが、ルールにしたがって成長、あるいは増殖していく。下の例を見てみよう。

・初期状態→A
・ルール→1.AはBCになる。2.BはCAになる。3.CはABになる。

というルールを定義する。すると初期状態のAは段階をおうごとに、ルールに従い成長していく。

A
BC
CAAB
ABBCBCCA
BCCACAABCAABABBC.....

これをPbindのピッチとデュレーションに利用したサンプルがある(ExmplesフォルダのPattern examples参照)。

(
// Lindenmayer systems take a trip south of the border
var degdict, durdict;

degdict = IdentityDictionary[
0 -> [0, 1, 2],
1 -> [0, 2],
2 -> [3, 2], 3 -> [0, 3, \, 4],
4 -> [5, 4, 2],
5 -> [8, 7, 6, 7, 3],
\ -> [\, 0, \]
];

durdict = IdentityDictionary[
0.5 -> [0.25, 0.5, 0.25],
1.0 -> [0.5, 0.125, 0.125, 0.25],
0.25 -> [1.0, 0.5],
0.125 -> [0.25, 0.25, 0.25]
];

Pbind(
\degree, Prewrite( Pseq([0]), degdict, 6) + [-7, 0, 2],
\dur, Prewrite( Pseq([0.5]), durdict, 6),
\pan, Pbrown(-0.7, 0.7, 0.2, inf),
\octave, 6,
\env, Env.adsr(0.04, 0.1, 0.7, 0.1),
\amp, 0.2,
\ugenFunc, { arg freq, amp, pan, env;
var eg;
eg = EnvGen.kr(env);
Pan2.ar(
Resonz.ar(
GrayNoise.ar(eg * 60),
freq,
0.0005,
4
).distort,
pan, eg * amp
);
}
).play(
effects: { arg in;
4.do({ in = AllpassN.ar(in, 0.04, [0.01.rand + 0.02, 0.01.rand + 0.02], 3); });
in
}
);
)

少し長いプログラムで難しそうだ、と感じる人もいるかもしれないが、部分づつみていけばそう難しくはない。下記の抜き出した部分がL-Systemのルールを定義している部分だ。ルール、durdictについて見てみよう。ここでは、0.5は0.25, 0.5, 0.25に変わり、0.25は1.0, 0.5に変わる、というように定義されている。これはPbindのデュレーションに使われており、degdictはピッチに使われている。
-----------------------------------------------
durdict = IdentityDictionary[
0.5 -> [0.25, 0.5, 0.25],
1.0 -> [0.5, 0.125, 0.125, 0.25],
0.25 -> [1.0, 0.5],
0.125 -> [0.25, 0.25, 0.25]
];
------------------------------------------------

次はPbindの中身を見ていこう。
---------------------------------------------------------------------
\degree, Prewrite( Pseq([0]), degdict, 6) + [-7, 0, 2],
---------------------------------------------------------------------

\degreeでは、このプログラムの音楽の音の高さを表している。Prewriteで、先ほどのL-Systemでかかれたdegdictを呼んできていると考えてもらいたい。Pseqの中身の[0]は、L-Systemの初期値を指定している。0から始まるので、音の高さは0 -> [0, 1, 2]、になるのだが、ここで音の高さをdegreeで指定していることに気を付けなければならない。Pbindの初期状態の音階は、ダイアトニック・メジャースケール(ド、レ、ミ、ファ、ソ、ラ、シ、ド、というやつですね)になっており、音の高さをdegreeで指定する場合、0はド、3はファ、6はシになる。つまり音楽は、0,1,2、ド、レ、ミ...という始まりになる。話をPrewriteに戻すと、3番目の引き数でL-Systemを何段回目まで使うのか、ということを指定する。最初のABCの例を思い出して欲しい。あの例では5段階目まで書き出してみたが、あれを永遠に書き続けることもできるのだ。degreeの行の最後の、 + [-7, 0, 2]は元の音に、3度上の音と1オクターブ下の音を足している。つまりド、が鳴るときは同時に、2つ上の鍵盤のミと7つ下の鍵盤の低いドも一緒に鳴ることになる。
ここではL-Systemを例にしたが、アルゴリズムによる作曲が簡単にできることがお分かりいただけただろうか。

James McCartney自身も述べているように、SuperColliderの習得は容易ではないが、多少のプログラミングの知識と音響合成の知識があれば、取り組む価値があるだろう。
また、現在OSXで動作する新バージョンの開発が進められており、SCの未来は明るいようだ。

                               2001.10.17 東京にて tn8ちゃん
                              http://www.iamas.ac.jp/~tn800

*この原稿は過去の原稿に加筆/修正を加えたものである。


→もどる