More Related Content
More from Atsushi Tadokoro
More from Atsushi Tadokoro (20)
Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)
- 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)」
- 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
‣ ( ... ) は引数、レシーバーの種類のよって順番がある
‣ [ ... ] は配列、ただし音の場合には出力チャンネル
- 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;
)
- 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;
- 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;