interactive music ii supercollider入門 2 - 関数とugen
TRANSCRIPT
Interactive Music IISuperCollider入門 2 - 関数とUGen
2013年10月10日東京藝術大学芸術情報センター(AMC)田所 淳
今日の内容‣ SuperColliderで音を生成する簡単なプログラムをサンプルにして、その構造を理解する
‣ キーワード:‣ 変数、関数、引数、オブジェクト、メッセージ、Ugen(ユニットジェネレータ)
‣ 以下のコードを今日中に完璧に理解したい!!
‣ まず音を聞いてみる‣ どんな音がしているか?
‣ ここからしばらく、あまり面白い音は出ませんが、基礎固めと考えて、頑張りましょう!
{[SinOsc.ar(440, 0, 0.2), SinOsc.ar(442, 0, 0.2)]}.play;
今日中に理解したいコード
変数と関数
‣ まず理解のキーとなるのが、{...} 「大括弧」
‣ { } は「関数 (Function) 」を意味している
‣ 関数(Function)とは…‣ 引数と呼ばれるデータを受け取り、定められた通りの処理を実行して結果を返す一連の命令群
{[SinOsc.ar(440, 0, 0.2), SinOsc.ar(442, 0, 0.2)]}.play;
関数
‣ SuperCollider関数のイメージ
‣ ざっくりとしたイメージ‣ { } の中を評価して、「.動作」の部分で結果を出す
{処理の内容}.動作
関数
関数‣ 関数のイメージ‣ 「引数」を入力すると、「戻り値」が出てくる
関数
引数1 引数2 引数3
戻り値
‣ SuperCollider、関数の例
‣ 1行目から順番に選択して、Command + Enter してみる‣ どんな結果が出てくるか?‣ Post Windowで確認してみる!
f = {"関数を評価しています。".postln;};f;f.value;
関数
‣ ところで、この例に出てくる「f」は何か?
‣ 「f」は「変数 (Variables)」
‣ 変数 (Variables) とは…‣ 値を格納する箱‣ プログラムで使われるデータに固有の名前を与えたもの
f = {"関数を評価しています。".postln;};f;f.value;
変数
‣ この例では、「変数」の箱に「関数」を入れている
変数
variables
{Function}
‣ 関数以外も格納できる - SuperColliderでの変数の例// 変数「a」に数値を代入a = 1;a;
// 計算結果を代入することも可能b = 1 + 1;b;
// 文字列だって入るc = "Hello";c;
// アルファベット1文字でない場合は、「var」が必要{ var num = 10; num = num * 2; num;}.value;
変数
‣ 先程の関数の出力結果
‣ 最初に、関数(処理のかたまり)を、変数「f」に代入‣ 「f;」をそのまま評価すると、「a Function」が出力される‣ 「f.value;」で、関数が評価される ‣ → 「関数を評価しています。」が出力
a Functiona Function関数を評価しています。関数を評価しています。
関数
引数と戻り値
‣ 戻り値: 関数から出力される値‣ 例えば、計算をしてその結果を出力する
// 足し算f = {2 + 3;};f.value;
// もう少し複雑な例: 整数の二乗を出力f = {! a = 10.rand;! a * a;};f.value;
関数
‣ 引数: 関数に渡す値‣ 「arg」に続けて引数の名前を入れる
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.ar(440, 0, 0.2) } .play;
関数と音
‣ SinOsc → オブジェクト‣ Sin波を生成するための機能をもった小さなプログラム
関数と音
SinOsc
‣ SinOscクラスは、「ar」「kr」「ir」などの動作を持つ‣ → メソッド
関数と音
SinOsc
arkr
ir
...
‣ .ar‣ Audio Rate‣ 音の波形を計算する際に用いる、高精度の信号を出力するメソッド
‣ .kr‣ Control Rate‣ 音量の変化など、あまり高精度のデータは必要としない信号を出力するメソッド
関数と音
‣ この例では、SinOsc.ar メソッドに3つの引数を指定している
‣ 引数の順番によって、意味を区別している
‣ 第1引数: 周波数(Hz)‣ 第2引数: 位相 (波形の時間軸方向のずれ)‣ 第3引数: 音量
関数と音
{ SinOsc.ar(440, 0, 0.2) }.play;
‣ より丁寧に分解すると、こんな感じ
関数と音
({ // 関数の開始 SinOsc.ar( // オーディオレイトでSinOscを出力 440, // 周波数 440Hz 0, // 位相 0 0.2) // 音量 0.2}.play; // 関数を閉じてPlayメソッドを実行)
‣ 「.play」を「.scope」に変えてみる
‣ 波形がグラフで表示される
関数と音
{ SinOsc.ar(440, 0, 0.2) }.scope;
‣ 3つの引数「440, 0, 0.2」をいろいろ変化させて、波形の変化と対応する音の変化を確認してみる!
関数と音
‣ 応用: SinOscをくみあわせる
関数と音
({ var ampOsc; ampOsc = SinOsc.kr(0.5, 1.5pi, 0.5, 0.5); SinOsc.ar(440, 0, ampOsc);}.play;)
UGen (ユニット・ジェネレイター)
UGen (ユニット・ジェネレイター)‣ ユニット・ジェネレイター‣ コンピュータ音楽用のプログラミング言語で用いられる用語‣ 音(信号)を出力したり、処理するためのオブジェクト
‣ SuperColliderには、大量のUgenが存在している‣ これらを使いこなすことが、多様な音を生みだす秘訣!
‣ 参考: Tour of Ugens‣ http://doc.sccode.org/Guides/Tour_of_UGens.html
配列と、音像の定位 (パン)
‣ いよいよ、今日冒頭のソースコードに突入
‣ 2つのSinOscが、大括弧 [ ] に格納されている‣ これはどういう意味なのか?
{[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)と同じ意味
配列と、音像の定位 (パン)
‣ 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
‣ UGenの引数のみ配列にしても、同じ効果を得られる
{[SinOsc.ar(440, 0, 0.2), SinOsc.ar(442, 0, 0.2)]}.play;
配列と、音像の定位 (パン)
{ SinOsc.ar([440, 442], 0, 0.2) }.play;
‣ 応用例‣ どの周波数が、どう定位されているか確認してみる‣ 「.choose」: 配列のなかからランダムに要素を選択する({ var freq; freq = [[660, 880], [440, 660], 1320, 880].choose; SinOsc.ar(freq, 0, 0.2);}.play;)
配列と、音像の定位 (パン)
‣ Pan2を使うと、音像を移動を表現できる‣ 例: Sin波を音像の動きに適用({! Pan2.ar(SinOsc.ar(440, 0, 0.2), SinOsc.kr(0.5));}.play;)
配列と、音像の定位 (パン)
‣ 例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;)
配列と、音像の定位 (パン)
今日はここまで!