yoppa.org


Blog

SuperCollider自主練 – 基礎編その3

1.6 マルチチャンネル

「1.5 エンクロージャー」のセクションでは、大括弧[]は集合をあらわすという説明だった。ところが、SCの大括弧にはもう一つ意味があって、マルチチャンネルをあらわすという話。

UGen(ユニットジェレータ)の引数にArrayが用いられた場合には、いかなる場合にもマルチチャンネルとみなされる。

1.7 ヘルプ

大文字で始まるアイテム(SinOsc, LFSaw, LFNoise, PMOsc, Array, Mix …etc.)や、多くのメッセージ(midi cps, max, loop, random …)はヘルプを持つ。ヘルプを参照したい単語を選択し、cmd-dヘプルを参照できる。

新たなUGen、PMOscを例にヘルプの使いかたを考察。PMOScは位相を変調できるオシレータ、つまりFM合成に利用できる。少ないパラメータで豊かな倍音をもった音響を生成できる。

PMOscのヘルプを参照すると、その引数の内容が示されている。

※ キャリア周波数, モジューレタ周波数, インデックス値, モジュレータの位相、全体のスケール、直流成分

既に初期値が設定されている引数(pmindex, mod phase, mil, add)は省略することが可能であるということを意味している。

ネスティングを使用して、より面白いサウンドにしてみる。MouseXとMouseYを使用して、マウスからの入力でモジュレータの周波数とインデックス値を変更できるようにしている。

引数の記述に関するきまりごと。引数はあらかじめ指定された順番で記入していかなくてはならない。ひとつ飛ばしたり順番を変更は基本的にできない。

しかし、キーワードのあとにコロンを付けて引数を指定するという別の方法もある。こうすることで、確実に引数の内容を指定することができ、記述する順番なども関係なくなる。

ヘルプの活用の実践として、もうひとつ別のサンプルで考察。

VCO、VCF、VCAという構成の古典的なアナログシンセサイザーを模した減算合成のサンプル。ネストされた要素の内側から外側へと読み解いていく。

3つのLine.krのインスタンスが、それぞれImpulseへ数を送出している。それらが、LinenとTRandをトリガーしている。2つのTRandは、Blipの周波数とハーモニクスの数をランダムに決定している。

ここで、.krと.arの違いについての解説。UGenへのメッセージ.krと.arは、生成される数値のストリームの数を決定している。.arはオーディオレイトの略で、サンプリング周波数と同じ数のストリームを生成(44.1kHzだったら毎秒44100のストリーム)。.krはコントロールレイトの略で、一秒に1ダースほどしか数を生成しない。.krをコントロールに関する部分に使用する計算量の節約になる。

もう1つのImpulseは、Linenをトリガーしている。これはエンベロープと呼ばれるもので、音量の変化の形を作りだしている。Linenの引数は順番に、トリガー、アタックタイム、サステイン(持続)レベル、ディケイ(減衰)タイム。

このサンプルでは、3つのImpulseと2つのTRandと4つのLineといったUGenがそれぞれ独立して使用されてる。これらを連動させていくにはどうすれば良いのか? そのためには、変数を用いなければならない。

1.8 変数

SCでは、小文字のa〜zは、宣言なしに変数として使用できる。SCの変数は、数値、文字列、UGen、関数など様々な値を格納できる。代入にはイコール(=)を用いる。

変数を使用した簡単なサンプル。

)

これは、以下のプログラムと同じ。

次にマウスの位置でSinOscのエンベロープを変化させる例。変数を使用することで、Impuluseのタイミングと減衰時間を一致させている。

さらに変数を使用したより複雑なサンプル。「1.7 ヘルプ」で使用した減算合成のサンプルを変数を使用して書き直している。

変数を使用することで、すぐに全体の挙動を変更できる。たとえば、r = Line.kr(1, 20, 60); を r = LFTri.kr(1/10) * 3 + 7; に変更するだけで演奏タイミングが変化する。

周波数も、f = TRand.kr(1, 10, t); から f = e + 1 * 4; とするだけですぐに変化する。

ここで、テスト。

問題

  1. ステレオにせよ
  2. indexの範囲を、Linke.krを使って1から12まで変化するようにせよ
  3. それぞれのreceiver.messageのペアの引数を定義せよ
  4. 演奏スピードを、また別のLine.krを使用して、1から20まで変化するようにせよ
  5. 全ての引数をキーワード付きにせよ

実際に解いてみた。

ステレオにせよ。

indexの範囲を、Linke.krを使って1から12まで変化するようにせよ

それぞれのreceiver.messageのペアの引数を定義せよ。※これはちょっと面倒なんで省略

演奏スピードを、また別のLine.krを使用して、1から20まで変化するようにせよ

全ての引数をキーワード付きにせよ。→ これも省略…