Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Interactive Music II
SuperCollider入門 3 - 音を混ぜる
(Mix)、楽器を定義(SynthDef)
2013年10月17日
東京藝術大学芸術情報センター(AMC)
田所 淳
先週の復習
先週の復習
‣ 下記のSuperColliderのコードを題材に、復習

{ SinOsc.ar([440, 442], 0, 0.2) }.play;
先週の復習
‣ { ... } は関数(処理のかたまり)をあらわす

{ SinOsc.ar([440, 442], 0, 0.2) }.play;
‣ この例では、Sin波の音を出力する処理のかたまり
先週の復習
‣ { ... } は関数(処理のかたまり)をあらわす

{ SinOsc.ar([440, 442], 0, 0.2) }.play;
‣ 「.play」は、この関数へのメソッド(動作)
先週の復習
‣ { ... } は関数(処理のかたまり)をあらわす

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

Message

‣ 「.play」は、この関数へのメソッド(動作)
‣ ...
先週の復習
‣ SinOscは、ユニットジェネレイター(Unit Generator)

{ SinOsc.ar([440, 442], 0, 0.2) }.play;
‣ Unit Generator (UGen)は、音や信号を出力するオブジ...
先週の復習
‣ SinOscは、ユニットジェネレイター(Unit Generator)

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

Message

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

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

Message

‣ .ar(...) : オーディオ...
先週の復習
‣ ( ) は引数 (Arguments)

{ SinOsc.ar([440, 442], 0, 0.2) }.play;
‣ 引数 (Arguments) - メソッドに渡す値のこと
先週の復習
‣ ( ) は引数 (Arguments)

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

位相 音量

‣ 引数 (Arguments) - メソッドに渡す値のこと
‣ SinOscの場...
先週の復習
‣ [ ] は、集合 (配列) を表す

{ SinOsc.ar([440, 442], 0, 0.2) }.play;
先週の復習
‣ [ ] は、集合 (配列) を表す

{ SinOsc.ar([440, 442], 0, 0.2) }.play;
‣ ただし、音のパラメータの場合には特殊な意味をもつ
‣ 出力チャンネルをあらわす
先週の復習
‣ [ ] は、集合 (配列) を表す

{ SinOsc.ar([440, 442], 0, 0.2) }.play;
‣ 1つ目の値が左チャンネル、2つ目が右チャンネル
‣ つまり、左右別々の周波数になっている
先週の復習
‣ ここまでのまとめ
‣ { ... } 関数、処理のかたまり
‣ Receiver . message 動作とその受け手
‣ ユニットジェネレイター(UGen) 音や信号を出力
‣ Ugen.ar と Ugen.kr
‣ ( .....
音を混ぜる、Mix
音を混ぜる、Mix
‣ 信号を足し算 ( + ) すると、音をミックスすることができる
// Mix 例1
{
! SinOsc.ar([440,442], 0, 0.2)
! + SinOsc.ar([660,663], 0, 0.2)
}....
音を混ぜる、Mix
‣ Mixクラスをつかうと、配列内の信号を全て足してくれる
// Mixクラス
{
! a = SinOsc.ar([440,442], 0, 0.2);
! b = SinOsc.ar([660,663], 0, 0.2)...
音を混ぜる、Mix
‣ Mix.arFill(【繰返し回数】, { 関数 } ) で、指定した回数音をミッ
クスする
‣ 乱数 (数 .rand) と組合せるといろいろ面白い効果が
// ランダムな周波数を重ねる
(
var num = 8;
...
音を混ぜる、Mix
‣ 周波数の比率による、アルゴリズミック・ハーモニー
‣ 実験: 1.0, 3/2, 4/3の比率によるハーモニー
// アルゴリズミック、ハーモニー
(
var num = 8;
{Mix.arFill(num,{
! v...
音を混ぜる、Mix
‣ 周波数の比率による、アルゴリズミック・ハーモニー
‣ 実験: 1.0, 3/2, 4/3の比率によるハーモニー
‣ そこにさらに、1.0, 3/2, 4/3 をかけ算してみる
// アルゴリズミック、ハーモニー 2
(
...
音を混ぜる、Mix
‣ 周波数の比率による、アルゴリズミック・ハーモニー
‣ 実験: 1.0, 3/2, 4/3の比率によるハーモニー
‣ そこにさらに、1.0, 3/2, 4/3 をかけ算してみる
‣ さらに、0∼10Hzのランダムな数を足す...
音を混ぜる、Mix
‣ 演習
‣ Mix.fillをつかった、アルゴリズミック・ハーモニーのプログラ
ムを改造して、新たなハーモニー生成プログラムにしてみる
‣ 比率と乱数による和声
音を混ぜる、Mix
‣ 参考: ピタゴラス音律の各音程の周波数比率
‣ http://ja.wikipedia.org/wiki/%E3%83%94%E3%82%BF
%E3%82%B4%E3%83%A9%E3%82%B9%E9%9F
%B3%...
音を混ぜる、Mix
‣ 解答例
‣ 「**」は、累乗(Exponentiation)の計算
‣ 例: 2 ** 8 = 256;
// アルゴリズミック、ハーモニー 4
(
var num = 32;
{ Mix.arFill(num,{
! ...
音を混ぜる、Mix
‣ いろいろな比率で、響きを聞き比べてみる
// アルゴリズミック・ハーモニー、バリエーション
{Mix.arFill(24,{SinOsc.ar([440,441]*(3.0/2**rrand(1,6))*(0.5**
r...
「楽器」を定義する - SynthDef
「楽器」を定義する - SynthDef
‣ これまで使用してきた、{ }.play; という形式
‣ 一時的に、楽器(Synth)を生成し、それをSC Serverに送って出
力していた
‣ 例えば、SinOscを使用した際のPost Win...
「楽器」を定義する - SynthDef
‣ SynthDef - 楽器を定義する
‣ SynthDef( 楽器の名前 , { Ugen関数 });
‣ 先程の簡単な関数によるプログラムをSynthDef形式へ
// {}.playによる出力
...
「楽器」を定義する - SynthDef
‣ SynthDef、もう少し複雑な例
//関数による記述
{ SinOsc.ar(440, 0, 0.2) }.play;
//SynthDefをサーバーに追加
SynthDef.new("test-...
「楽器」を定義する - SynthDef
‣ SynthDef は、引数 (Arguments) を渡せる
//SynthDefの定義(引数あり)
SynthDef.new("test-SinOsc", {
! arg freq = 440, ...
今日はここまで!
Upcoming SlideShare
Loading in …5
×

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

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

  1. 1. Interactive Music II SuperCollider入門 3 - 音を混ぜる (Mix)、楽器を定義(SynthDef) 2013年10月17日 東京藝術大学芸術情報センター(AMC) 田所 淳
  2. 2. 先週の復習
  3. 3. 先週の復習 ‣ 下記のSuperColliderのコードを題材に、復習 { SinOsc.ar([440, 442], 0, 0.2) }.play;
  4. 4. 先週の復習 ‣ { ... } は関数(処理のかたまり)をあらわす { SinOsc.ar([440, 442], 0, 0.2) }.play; ‣ この例では、Sin波の音を出力する処理のかたまり
  5. 5. 先週の復習 ‣ { ... } は関数(処理のかたまり)をあらわす { SinOsc.ar([440, 442], 0, 0.2) }.play; ‣ 「.play」は、この関数へのメソッド(動作)
  6. 6. 先週の復習 ‣ { ... } は関数(処理のかたまり)をあらわす { SinOsc.ar([440, 442], 0, 0.2) }.play; Receiver Message ‣ 「.play」は、この関数へのメソッド(動作) ‣ SuperColliderでは、動作を「メッセージ(Message)」とも呼ぶ ‣ メッセージを受けとる側(この例では関数)は、「レシーバー (Receiver)」
  7. 7. 先週の復習 ‣ SinOscは、ユニットジェネレイター(Unit Generator) { SinOsc.ar([440, 442], 0, 0.2) }.play; ‣ Unit Generator (UGen)は、音や信号を出力するオブジェクト (小さなプログラム)
  8. 8. 先週の復習 ‣ SinOscは、ユニットジェネレイター(Unit Generator) { SinOsc.ar([440, 442], 0, 0.2) }.play; Receiver Message ‣ ユニットジェネレイターも、レシーバーとメッセージから構成 されている
  9. 9. 先週の復習 ‣ SinOscは、ユニットジェネレイター(Unit Generator) { SinOsc.ar([440, 442], 0, 0.2) }.play; Receiver Message ‣ .ar(...) : オーディオレイト、音声信号として使用できる精度の 信号を出力 ‣ .kr(...) : コントロールレイト、音量の変化など、あまり精度を 要求しないラフな信号を出力
  10. 10. 先週の復習 ‣ ( ) は引数 (Arguments) { SinOsc.ar([440, 442], 0, 0.2) }.play; ‣ 引数 (Arguments) - メソッドに渡す値のこと
  11. 11. 先週の復習 ‣ ( ) は引数 (Arguments) { SinOsc.ar([440, 442], 0, 0.2) }.play; 周波数 位相 音量 ‣ 引数 (Arguments) - メソッドに渡す値のこと ‣ SinOscの場合は、順番に以下の意味となる ‣ 周波数(Hz) ‣ 位相 ‣ 音量
  12. 12. 先週の復習 ‣ [ ] は、集合 (配列) を表す { SinOsc.ar([440, 442], 0, 0.2) }.play;
  13. 13. 先週の復習 ‣ [ ] は、集合 (配列) を表す { SinOsc.ar([440, 442], 0, 0.2) }.play; ‣ ただし、音のパラメータの場合には特殊な意味をもつ ‣ 出力チャンネルをあらわす
  14. 14. 先週の復習 ‣ [ ] は、集合 (配列) を表す { SinOsc.ar([440, 442], 0, 0.2) }.play; ‣ 1つ目の値が左チャンネル、2つ目が右チャンネル ‣ つまり、左右別々の周波数になっている
  15. 15. 先週の復習 ‣ ここまでのまとめ ‣ { ... } 関数、処理のかたまり ‣ Receiver . message 動作とその受け手 ‣ ユニットジェネレイター(UGen) 音や信号を出力 ‣ Ugen.ar と Ugen.kr ‣ ( ... ) は引数、レシーバーの種類のよって順番がある ‣ [ ... ] は配列、ただし音の場合には出力チャンネル
  16. 16. 音を混ぜる、Mix
  17. 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. 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. 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. 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. 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. 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. 23. 音を混ぜる、Mix ‣ 演習 ‣ Mix.fillをつかった、アルゴリズミック・ハーモニーのプログラ ムを改造して、新たなハーモニー生成プログラムにしてみる ‣ 比率と乱数による和声
  24. 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. 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. 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. 27. 「楽器」を定義する - SynthDef
  28. 28. 「楽器」を定義する - SynthDef ‣ これまで使用してきた、{ }.play; という形式 ‣ 一時的に、楽器(Synth)を生成し、それをSC Serverに送って出 力していた ‣ 例えば、SinOscを使用した際のPost Windowの出力 // {}.playによる出力 {SinOsc.ar}.play; // Post Windowの表示 Synth("temp__146" : 1000) ‣ これは、 temp__146 という名前の楽器を生成していた
  29. 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. 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. 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. 32. 今日はここまで!

×