interactive music ii supercollider入門 2 - 関数とugen

37
Interactive Music II SuperCollider入門 2 - 関数とUGen 2013年10月10日 東京藝術大学芸術情報センター(AMC) 田所 淳

Upload: atsushi-tadokoro

Post on 04-Jun-2015

1.767 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Interactive Music II SuperCollider入門 2 - 関数とUGen

Interactive Music IISuperCollider入門 2 - 関数とUGen

2013年10月10日東京藝術大学芸術情報センター(AMC)田所 淳

Page 2: Interactive Music II SuperCollider入門 2 - 関数とUGen

今日の内容‣ SuperColliderで音を生成する簡単なプログラムをサンプルにして、その構造を理解する

‣ キーワード:‣ 変数、関数、引数、オブジェクト、メッセージ、Ugen(ユニットジェネレータ)

Page 3: Interactive Music II SuperCollider入門 2 - 関数とUGen

‣ 以下のコードを今日中に完璧に理解したい!!

‣ まず音を聞いてみる‣ どんな音がしているか?

‣ ここからしばらく、あまり面白い音は出ませんが、基礎固めと考えて、頑張りましょう!

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

今日中に理解したいコード

Page 4: Interactive Music II SuperCollider入門 2 - 関数とUGen

変数と関数

Page 5: Interactive Music II SuperCollider入門 2 - 関数とUGen

‣ まず理解のキーとなるのが、{...} 「大括弧」

‣ { } は「関数 (Function) 」を意味している

‣ 関数(Function)とは…‣ 引数と呼ばれるデータを受け取り、定められた通りの処理を実行して結果を返す一連の命令群

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

関数

Page 6: Interactive Music II SuperCollider入門 2 - 関数とUGen

‣ SuperCollider関数のイメージ

‣ ざっくりとしたイメージ‣ { } の中を評価して、「.動作」の部分で結果を出す

{処理の内容}.動作

関数

Page 7: Interactive Music II SuperCollider入門 2 - 関数とUGen

関数‣ 関数のイメージ‣ 「引数」を入力すると、「戻り値」が出てくる

関数

引数1 引数2 引数3

戻り値

Page 8: Interactive Music II SuperCollider入門 2 - 関数とUGen

‣ SuperCollider、関数の例

‣ 1行目から順番に選択して、Command + Enter してみる‣ どんな結果が出てくるか?‣ Post Windowで確認してみる!

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

関数

Page 9: Interactive Music II SuperCollider入門 2 - 関数とUGen

‣ ところで、この例に出てくる「f」は何か?

‣ 「f」は「変数 (Variables)」

‣ 変数 (Variables) とは…‣ 値を格納する箱‣ プログラムで使われるデータに固有の名前を与えたもの

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

変数

Page 10: Interactive Music II SuperCollider入門 2 - 関数とUGen

‣ この例では、「変数」の箱に「関数」を入れている

変数

variables

{Function}

Page 11: Interactive Music II SuperCollider入門 2 - 関数とUGen

‣ 関数以外も格納できる - SuperColliderでの変数の例// 変数「a」に数値を代入a = 1;a;

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

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

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

変数

Page 12: Interactive Music II SuperCollider入門 2 - 関数とUGen

‣ 先程の関数の出力結果

‣ 最初に、関数(処理のかたまり)を、変数「f」に代入‣ 「f;」をそのまま評価すると、「a Function」が出力される‣ 「f.value;」で、関数が評価される ‣ → 「関数を評価しています。」が出力

a Functiona Function関数を評価しています。関数を評価しています。

関数

Page 13: Interactive Music II SuperCollider入門 2 - 関数とUGen

引数と戻り値

Page 14: Interactive Music II SuperCollider入門 2 - 関数とUGen

‣ 戻り値: 関数から出力される値‣ 例えば、計算をしてその結果を出力する

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

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

関数

Page 15: Interactive Music II SuperCollider入門 2 - 関数とUGen

‣ 引数: 関数に渡す値‣ 「arg」に続けて引数の名前を入れる

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

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

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

関数

Page 16: Interactive Music II SuperCollider入門 2 - 関数とUGen

関数と音

Page 17: Interactive Music II SuperCollider入門 2 - 関数とUGen

‣ 以下のプログラムについて考えてみる

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

関数と音

Page 18: Interactive Music II SuperCollider入門 2 - 関数とUGen

‣ { ... } の部分は関数

‣ 音を出す命令をまとめている‣ では、「SinOsc」とその後のメッセージ「ar」は何か?

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

関数と音

Page 19: Interactive Music II SuperCollider入門 2 - 関数とUGen

‣ SinOsc → オブジェクト‣ Sin波を生成するための機能をもった小さなプログラム

関数と音

SinOsc

Page 20: Interactive Music II SuperCollider入門 2 - 関数とUGen

‣ SinOscクラスは、「ar」「kr」「ir」などの動作を持つ‣ → メソッド

関数と音

SinOsc

arkr

ir

...

Page 21: Interactive Music II SuperCollider入門 2 - 関数とUGen

‣ .ar‣ Audio Rate‣ 音の波形を計算する際に用いる、高精度の信号を出力するメソッド

‣ .kr‣ Control Rate‣ 音量の変化など、あまり高精度のデータは必要としない信号を出力するメソッド

関数と音

Page 22: Interactive Music II SuperCollider入門 2 - 関数とUGen

‣ この例では、SinOsc.ar メソッドに3つの引数を指定している

‣ 引数の順番によって、意味を区別している

‣ 第1引数: 周波数(Hz)‣ 第2引数: 位相 (波形の時間軸方向のずれ)‣ 第3引数: 音量

関数と音

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

Page 23: Interactive Music II SuperCollider入門 2 - 関数とUGen

‣ より丁寧に分解すると、こんな感じ

関数と音

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

Page 24: Interactive Music II SuperCollider入門 2 - 関数とUGen

‣ 「.play」を「.scope」に変えてみる

‣ 波形がグラフで表示される

関数と音

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

Page 25: Interactive Music II SuperCollider入門 2 - 関数とUGen

‣ 3つの引数「440, 0, 0.2」をいろいろ変化させて、波形の変化と対応する音の変化を確認してみる!

関数と音

Page 26: Interactive Music II SuperCollider入門 2 - 関数とUGen

‣ 応用: SinOscをくみあわせる

関数と音

({ var ampOsc;    ampOsc = SinOsc.kr(0.5, 1.5pi, 0.5, 0.5);    SinOsc.ar(440, 0, ampOsc);}.play;)

Page 27: Interactive Music II SuperCollider入門 2 - 関数とUGen

UGen (ユニット・ジェネレイター)

Page 28: Interactive Music II SuperCollider入門 2 - 関数とUGen

UGen (ユニット・ジェネレイター)‣ ユニット・ジェネレイター‣ コンピュータ音楽用のプログラミング言語で用いられる用語‣ 音(信号)を出力したり、処理するためのオブジェクト

‣ SuperColliderには、大量のUgenが存在している‣ これらを使いこなすことが、多様な音を生みだす秘訣!

‣ 参考: Tour of Ugens‣ http://doc.sccode.org/Guides/Tour_of_UGens.html

Page 29: Interactive Music II SuperCollider入門 2 - 関数とUGen

配列と、音像の定位 (パン)

Page 30: Interactive Music II SuperCollider入門 2 - 関数とUGen

‣ いよいよ、今日冒頭のソースコードに突入

‣ 2つのSinOscが、大括弧 [ ] に格納されている‣ これはどういう意味なのか?

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

配列と、音像の定位 (パン)

Page 31: Interactive Music II SuperCollider入門 2 - 関数とUGen

‣ 大括弧 [ ] は基本的には、配列 (たくさんのデータ) をあらわす‣ たとえば以下のように使うことが可能a = ["foo", "bar"]; // "foo", "bar"の順にデータを格納a.at(0);     // 1番目のデータ: "foo"a.at(1); // 2番目のデータ: "bar"a.at(2); // nil(空)が出力される

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

配列と、音像の定位 (パン)

Page 32: Interactive Music II SuperCollider入門 2 - 関数とUGen

‣ Ugen を配列にした場合は、特殊な意味をもつ‣ 出力するチャンネルを意味する‣ 配列に2つのUgen → 左右のチャンネル‣ マルチチャンネル (4ch., 6ch., 8ch...) も可能

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

配列と、音像の定位 (パン)

ch.1 = Left ch.2 = Right

Page 33: Interactive Music II SuperCollider入門 2 - 関数とUGen

‣ UGenの引数のみ配列にしても、同じ効果を得られる

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

配列と、音像の定位 (パン)

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

Page 34: Interactive Music II SuperCollider入門 2 - 関数とUGen

‣ 応用例‣ どの周波数が、どう定位されているか確認してみる‣ 「.choose」: 配列のなかからランダムに要素を選択する({ var freq;    freq = [[660, 880], [440, 660], 1320, 880].choose;    SinOsc.ar(freq, 0, 0.2);}.play;)

配列と、音像の定位 (パン)

Page 35: Interactive Music II SuperCollider入門 2 - 関数とUGen

‣ Pan2を使うと、音像を移動を表現できる‣ 例: Sin波を音像の動きに適用({! Pan2.ar(SinOsc.ar(440, 0, 0.2), SinOsc.kr(0.5));}.play;)

配列と、音像の定位 (パン)

Page 36: Interactive Music II SuperCollider入門 2 - 関数とUGen

‣ 例2: 移動する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;)

配列と、音像の定位 (パン)

Page 37: Interactive Music II SuperCollider入門 2 - 関数とUGen

今日はここまで!