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

  • 1,971 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,971
On Slideshare
0
From Embeds
0
Number of Embeds
5

Actions

Shares
Downloads
33
Comments
0
Likes
4

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Interactive Music II SuperCollider入門 3 - 音を混ぜる (Mix)、楽器を定義(SynthDef) 2013年10月17日 東京藝術大学芸術情報センター(AMC) 田所 淳
  • 2. 先週の復習
  • 3. 先週の復習 ‣ 下記のSuperColliderのコードを題材に、復習 { SinOsc.ar([440, 442], 0, 0.2) }.play;
  • 4. 先週の復習 ‣ { ... } は関数(処理のかたまり)をあらわす { SinOsc.ar([440, 442], 0, 0.2) }.play; ‣ この例では、Sin波の音を出力する処理のかたまり
  • 5. 先週の復習 ‣ { ... } は関数(処理のかたまり)をあらわす { SinOsc.ar([440, 442], 0, 0.2) }.play; ‣ 「.play」は、この関数へのメソッド(動作)
  • 6. 先週の復習 ‣ { ... } は関数(処理のかたまり)をあらわす { SinOsc.ar([440, 442], 0, 0.2) }.play; Receiver Message ‣ 「.play」は、この関数へのメソッド(動作) ‣ SuperColliderでは、動作を「メッセージ(Message)」とも呼ぶ ‣ メッセージを受けとる側(この例では関数)は、「レシーバー (Receiver)」
  • 7. 先週の復習 ‣ SinOscは、ユニットジェネレイター(Unit Generator) { SinOsc.ar([440, 442], 0, 0.2) }.play; ‣ Unit Generator (UGen)は、音や信号を出力するオブジェクト (小さなプログラム)
  • 8. 先週の復習 ‣ SinOscは、ユニットジェネレイター(Unit Generator) { SinOsc.ar([440, 442], 0, 0.2) }.play; Receiver Message ‣ ユニットジェネレイターも、レシーバーとメッセージから構成 されている
  • 9. 先週の復習 ‣ SinOscは、ユニットジェネレイター(Unit Generator) { SinOsc.ar([440, 442], 0, 0.2) }.play; Receiver Message ‣ .ar(...) : オーディオレイト、音声信号として使用できる精度の 信号を出力 ‣ .kr(...) : コントロールレイト、音量の変化など、あまり精度を 要求しないラフな信号を出力
  • 10. 先週の復習 ‣ ( ) は引数 (Arguments) { SinOsc.ar([440, 442], 0, 0.2) }.play; ‣ 引数 (Arguments) - メソッドに渡す値のこと
  • 11. 先週の復習 ‣ ( ) は引数 (Arguments) { SinOsc.ar([440, 442], 0, 0.2) }.play; 周波数 位相 音量 ‣ 引数 (Arguments) - メソッドに渡す値のこと ‣ SinOscの場合は、順番に以下の意味となる ‣ 周波数(Hz) ‣ 位相 ‣ 音量
  • 12. 先週の復習 ‣ [ ] は、集合 (配列) を表す { SinOsc.ar([440, 442], 0, 0.2) }.play;
  • 13. 先週の復習 ‣ [ ] は、集合 (配列) を表す { SinOsc.ar([440, 442], 0, 0.2) }.play; ‣ ただし、音のパラメータの場合には特殊な意味をもつ ‣ 出力チャンネルをあらわす
  • 14. 先週の復習 ‣ [ ] は、集合 (配列) を表す { SinOsc.ar([440, 442], 0, 0.2) }.play; ‣ 1つ目の値が左チャンネル、2つ目が右チャンネル ‣ つまり、左右別々の周波数になっている
  • 15. 先週の復習 ‣ ここまでのまとめ ‣ { ... } 関数、処理のかたまり ‣ Receiver . message 動作とその受け手 ‣ ユニットジェネレイター(UGen) 音や信号を出力 ‣ Ugen.ar と Ugen.kr ‣ ( ... ) は引数、レシーバーの種類のよって順番がある ‣ [ ... ] は配列、ただし音の場合には出力チャンネル
  • 16. 音を混ぜる、Mix
  • 17. 音を混ぜる、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;
  • 18. 音を混ぜる、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;
  • 19. 音を混ぜる、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; )
  • 20. 音を混ぜる、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; )
  • 21. 音を混ぜる、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; )
  • 22. 音を混ぜる、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; )
  • 23. 音を混ぜる、Mix ‣ 演習 ‣ Mix.fillをつかった、アルゴリズミック・ハーモニーのプログラ ムを改造して、新たなハーモニー生成プログラムにしてみる ‣ 比率と乱数による和声
  • 24. 音を混ぜる、Mix ‣ 参考: ピタゴラス音律の各音程の周波数比率 ‣ http://ja.wikipedia.org/wiki/%E3%83%94%E3%82%BF %E3%82%B4%E3%83%A9%E3%82%B9%E9%9F %B3%E5%BE%8B
  • 25. 音を混ぜる、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; )
  • 26. 音を混ぜる、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;
  • 27. 「楽器」を定義する - SynthDef
  • 28. 「楽器」を定義する - SynthDef ‣ これまで使用してきた、{ }.play; という形式 ‣ 一時的に、楽器(Synth)を生成し、それをSC Serverに送って出 力していた ‣ 例えば、SinOscを使用した際のPost Windowの出力 // {}.playによる出力 {SinOsc.ar}.play; // Post Windowの表示 Synth("temp__146" : 1000) ‣ これは、 temp__146 という名前の楽器を生成していた
  • 29. 「楽器」を定義する - SynthDef ‣ SynthDef - 楽器を定義する ‣ SynthDef( 楽器の名前 , { Ugen関数 }); ‣ 先程の簡単な関数によるプログラムをSynthDef形式へ // {}.playによる出力 {SinOsc.ar}.play; // SyntDefに変換 SynthDef("sine", {Out.ar(0, SinOsc.ar)}).play; //left SynthDef("sine", {Out.ar(1, SinOsc.ar)}).play; //right ‣ SynthDefの最終出力は、必ずOutオブジェクトに渡さなければ ならない (PdやMax/MSPの「dac 」のようなもの) ‣ Out.ar( バス番号, 出力信号);
  • 30. 「楽器」を定義する - 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");
  • 31. 「楽器」を定義する - 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"); //440Hz b = Synth("test-SinOsc", [freq:660]); //660Hz c = Synth("test-SinOsc", [freq:880, amp:0.5]); //880Hz, amp:0.5 a.set("freq", 330); //440Hz -> 330Hz b.set("freq", 220, "amp", 0.3); //660Hz -> 220Hz, amp: 0.3 //終了 a.free; b.free; c.free;
  • 32. 今日はここまで!