yoppa.org


Blog

SuperCollider自主練 – 基礎編その2

1.5 エンクロージャー (Enclosures)

ここまでで出てきた、4種類のエンクロージャー(つまり括弧)を整理。個人的には、この括弧の種類によって何をしているのか正しく類推できるようになるのが、SC理解のポイントのような気がしている。

  • (parentheses) 丸括弧
  • [brackets] 大括弧
  • {braces} 中括弧
  • “some text” ダブルクォーテイション

これらの括弧の開始と終了をマッチさせていかないといけないよという話。エディタで括弧の先頭や末尾でダブルクリックするとその括弧の範囲が選択されるので、それを利用するのも一つの方法。

クォーテイション “”, ‘’

“” ダブルクォーテイションは文字列をあらわす。それに対して’‘シングルクォーテイションは、シンボルをあらわす ‘aSymbol’ シンボルはパラメータのラベルなどに用いられる。ちなみに、’aSymbol’ と \aSymbol は同じ。

(parentheses) 丸括弧

() 丸括弧は引数のリストをあらわす

msg(arg1, arg2, arg3…)

また丸括弧は計算の順序を指定する際にも使用される。

5 + 10 * 4

これは、普通の数学では45になるが、SCでは60になる(意外…)。SCでは演算子の種類を考慮せず左から右に評価される。かけ算を先に計算させる場合は明示的に

5 + (10 * 4)

と書かなくてはならない。丸括弧はまた二項演算とメッセージを一体化する際にも使用される。

(5 + 10).squared

[brackets] 大括弧

[]大括弧はアイテムの集合(collection)をあらわす。集合の一種Arrayは数字、テキスト、関数、パッチ全体など様々な種類のアイテムを含むことができる。さらには、一つのArrayでデータの種類を混ぜることも可能。

またArrayには様々なメッセージが定義されている。reverse, scramble, mirror, rotate, midicps, choose, permuteなど。

実際に提示されている例が、音列の操作と関連づけられていて楽しい。

[0, 11, 10, 1, 9, 8, 2, 3, 7, 4, 6, 5].reverse // 12音技法の逆行形
12 - [0, 11, 10, 1, 9, 8, 2, 3, 7, 4, 6, 5].reverse // 逆行形の反行形
[0, 2, 4, 5, 6, 7, 9, 11].scramble // ダイアトニックスケール
[60, 62, 64, 67, 69].mirror // ペンタトニック
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11].rotate
[60, 62, 64, 65, 67, 69, 71].midicps.round(0.1) // MIDIから周波数へ
[1, 0.75, 0.5, 0.25, 0.125].choose // 音の長さなど?
0.125 * [1, 2, 3, 4, 5, 6, 7, 8].choose // クォンタイズ
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11].permute(6) // 順序の変更

{} 中括弧

{}中括弧は関数(functions)をあらわす。まず初めの例として以下の2つの結果の違いについて。

exprand(1, 1000.0)
{exprand(1, 1000.0)}

上のほうは、毎回評価する度に1から1000の間の指数的な乱数を出力する。ところが下の例では、常に”a Function”という出力がされる。では関数(Function)とは何なのか? 以下のサンプルで考察してみる。

dup(rand(1000.0), 5)   // ランダムに数を選択して、それをくりかえす
dup({rand(1000.0)}, 5) // ランダムに選択するという関数(機能)を、くりかえす

上の行は、ランダムに選択された数値を5回同じ値でくりかえす。それに対して下の行の場合は、毎回違う値を5回くりかえすことになる。(つまりは、ランダムな値をピックアップするという機能をくりかえしているということか?)

下の行のケースは、下記のように理解するとわかりやすい。

[rand(1000.0), rand(1000.0), rand(1000.0), rand(1000.0), rand(1000.0)]

関数は様々なメッセージを解釈する。plot, play, scope, dup… など。

{LFNoise0.ar}.play  // ランダムな数列を再生(ノイズ)
{LFNoise0.ar(10000)}.plot // ランダムな数列をプロット
{LFNoise0.ar(10000)}.scope // 再生して波形を表示

{100.rand}.dup(10) // 10コのランダムな数を選択
{100.rand} ! 10 // 上と同じ
{100.rand}.dup(10).postln.plot // 10個の数を選択し、表示した後プロット
{100.rand}.dup(100).sort.plot // 100個の数を選択し、ソートした後プロット

まとめ

ここまで出てきた括弧の機能をまとめると…

  • 丸括弧 – レシーバ、メッセージ、引数のリスト: Object.message(arglist)
  • 大括弧 – 集合: [items]
  • 中括弧 – 関数: {複数行にまたがるコード}
  • ダブルクォーテイション – 文字列: “word inside quote”
  • シングルクォーテイション – シンボル: ‘word inside single quote’