Upload
atsushi-tadokoro
View
2.394
Download
7
Embed Size (px)
Citation preview
Interactive Music IISuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)
2013年10月17日東京藝術大学芸術情報センター(AMC)田所 淳
先週の復習
先週の復習‣ 下記のSuperColliderのコードを題材に、復習
{ 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;
先週の復習‣ { ... } は関数(処理のかたまり)をあらわす
‣ 「.play」は、この関数へのメソッド(動作)
‣ SuperColliderでは、動作を「メッセージ(Message)」とも呼ぶ‣ メッセージを受けとる側(この例では関数)は、「レシーバー (Receiver)」
{ SinOsc.ar([440, 442], 0, 0.2) }.play;Receiver Message
先週の復習‣ SinOscは、ユニットジェネレイター(Unit Generator)
‣ Unit Generator (UGen)は、音や信号を出力するオブジェクト(小さなプログラム)
{ SinOsc.ar([440, 442], 0, 0.2) }.play;
先週の復習‣ SinOscは、ユニットジェネレイター(Unit Generator)
‣ ユニットジェネレイターも、レシーバーとメッセージから構成されている
{ SinOsc.ar([440, 442], 0, 0.2) }.play;Receiver Message
先週の復習‣ SinOscは、ユニットジェネレイター(Unit Generator)
‣ .ar(...) : オーディオレイト、音声信号として使用できる精度の信号を出力
‣ .kr(...) : コントロールレイト、音量の変化など、あまり精度を要求しないラフな信号を出力
{ SinOsc.ar([440, 442], 0, 0.2) }.play;Receiver Message
先週の復習‣ ( ) は引数 (Arguments)
‣ 引数 (Arguments) - メソッドに渡す値のこと
{ SinOsc.ar([440, 442], 0, 0.2) }.play;
先週の復習‣ ( ) は引数 (Arguments)
‣ 引数 (Arguments) - メソッドに渡す値のこと‣ SinOscの場合は、順番に以下の意味となる‣ 周波数(Hz)‣ 位相‣ 音量
{ 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つ目が右チャンネル‣ つまり、左右別々の周波数になっている
{ SinOsc.ar([440, 442], 0, 0.2) }.play;
先週の復習‣ ここまでのまとめ
‣ { ... } 関数、処理のかたまり‣ 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)}.play;
// Mix 例2{! a = SinOsc.ar([440,442], 0, 0.2);! b = SinOsc.ar([660,663], 0, 0.2);! a + b;}.play;
音を混ぜる、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;
音を混ぜる、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;)
音を混ぜる、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;)
音を混ぜる、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;)
音を混ぜる、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;)
音を混ぜる、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%E5%BE%8B
音を混ぜる、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;)
音を混ぜる、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;
「楽器」を定義する - SynthDef
「楽器」を定義する - SynthDef‣ これまで使用してきた、{ }.play; という形式‣ 一時的に、楽器(Synth)を生成し、それをSC Serverに送って出力していた
‣ 例えば、SinOscを使用した際のPost Windowの出力
‣ これは、”temp__146” という名前の楽器を生成していた
// {}.playによる出力{SinOsc.ar}.play;
// Post Windowの表示Synth("temp__146" : 1000)
「楽器」を定義する - 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
「楽器」を定義する - 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");
「楽器」を定義する - 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;
今日はここまで!