yoppa.org


Blog

SuperCollider自主練 – 基礎編その5

1.11 配列、反復、論理構造 (Arrays, Iteration, and Logical Expression)

音楽の演奏は、しばしば集合として表現される。12音技法、倍音構造、モード(ピッチの集合)、旋律、ピッチクラスなど。配列はこうした集合を管理することができる。SCのステレオ出力もこれと同様に配列のひとつ。

配列から要素をとりだすには、.atメッセージを使用する。at()の引数に入るインデックス番号は0から開始しているのに注意。

ここで新たにdoというメッセージが登場している。これは反復(iteration)の一種。反復はこの他にも loop, while, for, forby などがある。doの第1引数は反復する数、第2引数は反復する関数。

doをTaskの中に入れることで、一定間隔の時間を置いて反復するようになる。

Arrayのデータを別のタイプにマッピングすることも可能。例えば、音程名をMIDIナンバーと対応させる。こうすることでよりコンピュータが理解しやすい形式に変換できる。

Taskを実際に音に応用した例。まず始めに楽器PMCrotaleを定義。

これをTaskを利用してくりかえし演奏する。

この例では、if文による条件判定を使用している。SCでのifはやや特殊な書き方となる。

if文による条件式やその使用法などのサンプルあれこれ。

次の例は、より音楽的で面白い。MIDI番号をカウントアップしていって、そのノートがCの三和音に含まれるかを判別している。12の剰余計算をすることでオクターブを単位でループしている。

音の出現する確率などを操作する際に重宝できそうな、coin演算子について。

1.12 どうやって配列を実行(Do)するのか?

doの構文と配列(Array)をどうやって結びつけるのか。カウンタを使用して配列の要素を順番にとりだすサンプル。

この構文はよりシンプルに書き換え可能。

これを応用し、MIDI番号を音階に変換して出力するサンプル。

これを実行すると、C, D, E, F, G, A, B と順番に音階が出力される。

doをネストして使用することもできる。doのネストを活用して、12音のマトリクスを生成するサンプル。

このコードを実行した結果の一例:

配列を利用してシグナルをミックスすることも可能。Mixを使用する。arメッセージを指定して、1つ目の引数にミックスするシグナルを配列を入れる。例えば、LFNoise1で音量をコントロールした加算合成の例。

Mixとあわせて、Arrayのメッセージfillを利用するという方法もある。これは、Arrayの中にUGen(音を生成する関数)の集合を生成できる。第1引数に生成するアイテムの数を指定し、第2引数に音を生成する関数を入れる。例えば、基音の周波数に110Hz間隔でハーモニクスを生成しミックスするという例。

このコードの SinOsc.kr(count+¼)) の部分を、SinOsc.kr(¼, 2pi.rand) とか LFNoise1.kr(1) とか LFNoise0.kr(rrand(1, 5)) などと変えてみると倍音の音量の変化が様々な表情を見せて面白い。

さらに、Array.fill は、Klangを用いると面白い効果を発揮する。Klangは共鳴する倍音構造を指定することで仮想の物理モデルを再現可能。ここでは、ベルのような音を鳴らしている。