32
Interactive Music II SuperCollider入門 3 - 音を混ぜる (Mix)、楽器を定義(SynthDef ) 2013年10月17日 東京藝術大学芸術情報センター(AMC) 田所 淳

Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)

Embed Size (px)

Citation preview

Page 1: Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)

Interactive Music IISuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)

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

Page 2: Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)

先週の復習

Page 3: Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)

先週の復習‣ 下記のSuperColliderのコードを題材に、復習

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

Page 4: Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)

先週の復習‣ { ... } は関数(処理のかたまり)をあらわす

‣ この例では、Sin波の音を出力する処理のかたまり

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

Page 5: Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)

先週の復習‣ { ... } は関数(処理のかたまり)をあらわす

‣ 「.play」は、この関数へのメソッド(動作)

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

Page 6: Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)

先週の復習‣ { ... } は関数(処理のかたまり)をあらわす

‣ 「.play」は、この関数へのメソッド(動作)

‣ SuperColliderでは、動作を「メッセージ(Message)」とも呼ぶ‣ メッセージを受けとる側(この例では関数)は、「レシーバー (Receiver)」

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

Page 7: Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)

先週の復習‣ SinOscは、ユニットジェネレイター(Unit Generator)

‣ Unit Generator (UGen)は、音や信号を出力するオブジェクト(小さなプログラム)

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

Page 8: Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)

先週の復習‣ SinOscは、ユニットジェネレイター(Unit Generator)

‣ ユニットジェネレイターも、レシーバーとメッセージから構成されている

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

Page 9: Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)

先週の復習‣ SinOscは、ユニットジェネレイター(Unit Generator)

‣ .ar(...) : オーディオレイト、音声信号として使用できる精度の信号を出力

‣ .kr(...) : コントロールレイト、音量の変化など、あまり精度を要求しないラフな信号を出力

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

Page 10: Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)

先週の復習‣ ( ) は引数 (Arguments)

‣ 引数 (Arguments) - メソッドに渡す値のこと

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

Page 11: Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)

先週の復習‣ ( ) は引数 (Arguments)

‣ 引数 (Arguments) - メソッドに渡す値のこと‣ SinOscの場合は、順番に以下の意味となる‣ 周波数(Hz)‣ 位相‣ 音量

{ SinOsc.ar([440, 442], 0, 0.2) }.play;周波数 位相 音量

Page 12: Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)

先週の復習‣ [ ] は、集合 (配列) を表す

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

Page 13: Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)

先週の復習‣ [ ] は、集合 (配列) を表す

‣ ただし、音のパラメータの場合には特殊な意味をもつ‣ 出力チャンネルをあらわす

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

Page 14: Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)

先週の復習‣ [ ] は、集合 (配列) を表す

‣ 1つ目の値が左チャンネル、2つ目が右チャンネル‣ つまり、左右別々の周波数になっている

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

Page 15: Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)

先週の復習‣ ここまでのまとめ

‣ { ... } 関数、処理のかたまり‣ Receiver . message 動作とその受け手‣ ユニットジェネレイター(UGen) 音や信号を出力‣ Ugen.ar と Ugen.kr‣ ( ... ) は引数、レシーバーの種類のよって順番がある‣ [ ... ] は配列、ただし音の場合には出力チャンネル

Page 16: Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)

音を混ぜる、Mix

Page 17: Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)

音を混ぜる、Mix‣ 信号を足し算 ( + ) すると、音をミックスすることができる

// Mix 例1{! SinOsc.ar([440,442], 0, 0.2)! + SinOsc.ar([660,663], 0, 0.2)}.play;

// Mix 例2{! a = SinOsc.ar([440,442], 0, 0.2);! b = SinOsc.ar([660,663], 0, 0.2);! a + b;}.play;

Page 18: Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)

音を混ぜる、Mix‣ Mixクラスをつかうと、配列内の信号を全て足してくれる

// Mixクラス{! a = SinOsc.ar([440,442], 0, 0.2);! b = SinOsc.ar([660,663], 0, 0.2);! c = SinOsc.ar([220,221], 0, 0.2);! Mix([a, b, c]);}.play;

Page 19: Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)

音を混ぜる、Mix‣ Mix.arFill(【繰返し回数】, { 関数 } ) で、指定した回数音をミックスする

‣ 乱数 (数 .rand) と組合せるといろいろ面白い効果が// ランダムな周波数を重ねる(var num = 8;{ Mix.arFill(num, {! SinOsc.ar([50+1000.rand, 50+1000.rand], pi.rand, 1.0/num)})}.play;)

// number.rand から ExpRand(low, hi)へ(var num = 8;{Mix.arFill(num,{! SinOsc.ar([ExpRand(50,800), ExpRand(50,800)], pi.rand, 1.0/num)})}.play;)

Page 20: Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)

音を混ぜる、Mix‣ 周波数の比率による、アルゴリズミック・ハーモニー‣ 実験: 1.0, 3/2, 4/3の比率によるハーモニー// アルゴリズミック、ハーモニー(var num = 8;{Mix.arFill(num,{! var freqR, freqL;! freqL = 220 * [1.0, 3.0/2.0, 4.0/3.0].choose;! freqR = 220 * [1.0, 3.0/2.0, 4.0/3.0].choose;! SinOsc.ar([freqL, freqR], pi.rand, 1.0/num);})}.play;)

Page 21: Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)

音を混ぜる、Mix‣ 周波数の比率による、アルゴリズミック・ハーモニー‣ 実験: 1.0, 3/2, 4/3の比率によるハーモニー‣ そこにさらに、1.0, 3/2, 4/3 をかけ算してみる

// アルゴリズミック、ハーモニー 2(var num = 8;{ Mix.arFill(num,{! var freqR, freqL;! freqL = 220 * [1.0, 3.0/2.0, 4.0/3.0].choose! ! * [1.0, 3.0/2.0, 4.0/3.0].choose;! freqR = 220 * [1.0, 3.0/2.0, 4.0/3.0].choose! ! * [1.0, 3.0/2.0, 4.0/3.0].choose;! SinOsc.ar([freqL, freqR], pi.rand, 1.0/num);})}.play;)

Page 22: Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)

音を混ぜる、Mix‣ 周波数の比率による、アルゴリズミック・ハーモニー‣ 実験: 1.0, 3/2, 4/3の比率によるハーモニー‣ そこにさらに、1.0, 3/2, 4/3 をかけ算してみる‣ さらに、0~10Hzのランダムな数を足す(デチューン)// アルゴリズミック、ハーモニー 3(var num = 8;{ Mix.arFill(num, {! var freqR, freqL;! freqL = 220 * [1.0, 3.0/2.0, 4.0/3.0].choose! ! * [1.0, 3.0/2.0, 4.0/3.0].choose + 10.0.rand;! freqR = 220 * [1.0, 3.0/2.0, 4.0/3.0].choose! ! * [1.0, 3.0/2.0, 4.0/3.0].choose + 10.0.rand;! SinOsc.ar([freqL, freqR], pi.rand, 1.0/num);})}.play;)

Page 23: Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)

音を混ぜる、Mix‣ 演習‣ Mix.fillをつかった、アルゴリズミック・ハーモニーのプログラムを改造して、新たなハーモニー生成プログラムにしてみる

‣ 比率と乱数による和声

Page 25: Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)

音を混ぜる、Mix‣ 解答例‣ 「**」は、累乗(Exponentiation)の計算‣ 例: 2 ** 8 = 256;

// アルゴリズミック、ハーモニー 4(var num = 32;{ Mix.arFill(num,{! var freqR, freqL;! freqL = 440 * (1.5 ** rrand(1,6)) * (0.5 ** rrand(1, 8));! freqR = 442 * (1.5 ** rrand(1,6)) * (0.5 ** rrand(1, 8));! SinOsc.ar([freqL, freqR], pi.rand, 1.0/num);})}.play;)

Page 26: Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)

音を混ぜる、Mix‣ いろいろな比率で、響きを聞き比べてみる// アルゴリズミック・ハーモニー、バリエーション{Mix.arFill(24,{SinOsc.ar([440,441]*(3.0/2**rrand(1,6))*(0.5** rrand(1,8)),0,1.0/24)})}.play;

{Mix.arFill(24,{SinOsc.ar([440,441]*(4.0/3**rrand(1,6))*(0.5** rrand(1,8)),0,1.0/24)})}.play;

{Mix.arFill(24,{SinOsc.ar([440,441]*(5.0/3**rrand(1,8))*(0.5** rrand(1,8)),0,1.0/24)})}.play;

{Mix.arFill(24,{SinOsc.ar([440,441]*(9.0/8**rrand(1,20))*(0.5** rrand(1,8)),0,1.0/24)})}.play;

Page 27: Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)

「楽器」を定義する - SynthDef

Page 28: Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)

「楽器」を定義する - SynthDef‣ これまで使用してきた、{ }.play; という形式‣ 一時的に、楽器(Synth)を生成し、それをSC Serverに送って出力していた

‣ 例えば、SinOscを使用した際のPost Windowの出力

‣ これは、”temp__146” という名前の楽器を生成していた

// {}.playによる出力{SinOsc.ar}.play;

// Post Windowの表示Synth("temp__146" : 1000)

Page 29: Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)

「楽器」を定義する - SynthDef‣ SynthDef - 楽器を定義する‣ SynthDef(“楽器の名前”, { Ugen関数 });

‣ 先程の簡単な関数によるプログラムをSynthDef形式へ

‣ SynthDefの最終出力は、必ずOutオブジェクトに渡さなければならない (PdやMax/MSPの「dac~」のようなもの)

‣ Out.ar( バス番号, 出力信号);

// {}.playによる出力{SinOsc.ar}.play;

// SyntDefに変換SynthDef("sine", {Out.ar(0, SinOsc.ar)}).play; //leftSynthDef("sine", {Out.ar(1, SinOsc.ar)}).play; //right

Page 30: Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)

「楽器」を定義する - SynthDef‣ SynthDef、もう少し複雑な例//関数による記述{ SinOsc.ar(440, 0, 0.2) }.play;

//SynthDefをサーバーに追加SynthDef.new("test-SinOsc", {! Out.ar(0, SinOsc.ar(440, 0, 0.2))}).add;

//Synthを演奏Synth("test-SinOsc");

Page 31: Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)

「楽器」を定義する - SynthDef‣ SynthDef は、引数 (Arguments) を渡せる//SynthDefの定義(引数あり)SynthDef.new("test-SinOsc", {! arg freq = 440, amp = 0.2;! Out.ar(0, SinOsc.ar(freq, 0, amp))}).add;

//Synthを演奏a = Synth("test-SinOsc"); //440Hzb = Synth("test-SinOsc", [freq:660]); //660Hzc = Synth("test-SinOsc", [freq:880, amp:0.5]); //880Hz, amp:0.5

a.set("freq", 330); //440Hz -> 330Hzb.set("freq", 220, "amp", 0.3); //660Hz -> 220Hz, amp: 0.3

//終了a.free; b.free; c.free;

Page 32: Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)

今日はここまで!