yoppa.org


immediate bitwave

芸大 – Interactive Music II 2014

第2回: SuperCollider入門 2 – 関数とUGen

今回も前回に引き続き、SuperColliderの入門的な解説をしていきます。SuperColliderで音を生成する簡単なプログラムを作成して、その構造を理解できるところまでを目標とします。

まず始めに、SuperColliderのコードの理解の鍵となる、3種類の括弧についてその意味を確実に理解します。

  • 小括弧 (…)
  • 中括弧 {…}
  • 大括弧 […]

次に、コードの実例を参照しながら、「変数」「関数」「引数」「オブジェクト」「メッセージ」「Ugen(ユニットジェネレータ)」といった概念について解説していきます。

スライド資料

今回の授業内容のスライド資料は下記のリンクを参照してください。

サンプルプログラム

スライドの中で紹介しているSuperColliderのプログラムです。

// Interactive Music 141009

// 今日の目標
{[SinOsc.ar(440, 0, 0.2), SinOsc.ar(442, 0, 0.2)]}.play;

// ---------------------------------------------------------------------------
// 言語の基本

// 関数
f = {"関数を評価しています。".postln;};
f;
f.value;

// 変数「a」に数値を代入
a = 1;
a;

// 計算結果を代入することも可能
b = 1 + 1;
b;

// 文字列だって入る
c = "Hello";
c;

// アルファベット1文字でない場合は、「var」が必要
{
  var num = 10;
  num = num * 2;
  num;
}.value;

// 足し算
f = {
    2 + 3;
};
f.value;

// もう少し複雑な例: 整数の二乗を出力
f = {
    a = 10.rand;
    a * a;
};
f.value;

// 引数
f = {
    arg a, b; // 引数
    a / b;
};

// 引数の指定 - 順番で区別
f.value(10, 2);

// 引数の指定 - キーワードで指定
f.value(b: 2, a: 10);

// ---------------------------------------------------------------------------
// 音
{ SinOsc.ar(440, 0, 0.2) }.play;

// 上のプログラムを分解
(
{             // 関数の開始
  SinOsc.ar(  // オーディオレイトでSinOscを出力
    440,      // 周波数 440Hz
    0,        // 位相 0
    0.2)      // 音量 0.2
}.play;       // 関数を閉じてPlayメソッドを実行
)

// scope
{ SinOsc.ar(440, 0, 0.2) }.scope;

// SinOscくみあわせ
(
{ var ampOsc;
    ampOsc = SinOsc.kr(0.5, 1.5pi, 0.5, 0.5);
    SinOsc.ar(440, 0, ampOsc);
}.play;
)

// 再度このコードについて
{[SinOsc.ar(440, 0, 0.2), SinOsc.ar(442, 0, 0.2)]}.play;

// 配列
a = ["foo", "bar"]; // "foo", "bar"の順にデータを格納
a.at(0);            // 1番目のデータ: "foo"
a.at(1);            // 2番目のデータ: "bar"
a.at(2);            // nil(空)が出力される

// 以下のような記述方法も
a[0];               // a.at(0)と同じ意味

// 2つは同じ意味

{[SinOsc.ar(440, 0, 0.2), SinOsc.ar(442, 0, 0.2)]}.play;
{ SinOsc.ar([440, 442], 0, 0.2) }.play;

// 応用例

// ハーモニー
(
{ var freq;
    freq = [[660, 880], [440, 660], 1320, 880].choose;
    SinOsc.ar(freq, 0, 0.2);
}.play;
)

// 音の移動(定位)
(
{
    Pan2.ar(SinOsc.ar(440, 0, 0.2), SinOsc.kr(0.5));
}.play;
)

// 移動する2つのSin波
(
{
    a = Pan2.ar(SinOsc.ar(220, 0, 0.2), SinOsc.kr(0.5));
    b = Pan2.ar(SinOsc.ar(330, 0, 0.2), SinOsc.kr(-0.6));
    a + b;
}.play;
)