Your SlideShare is downloading. ×
  • Like
Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Now you can save presentations on your phone or tablet

Available for both IPhone and Android

Text the download link to your phone

Standard text messaging rates apply

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

  • 2,109 views
Published

 

  • 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
2,109
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. 今日はここまで!