0
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)

2,542

Published on

0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,542
On Slideshare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
36
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Transcript of "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. 今日はここまで!
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×