yoppa.org


芸大 – Interactive Music II 2014

第3回: SuperCollider入門 3 – 音を混ぜる(Mix)、ハーモニー

前回は、SuperColliderの基本的な文法について概観しました。

まず始めに前回の復習を簡単にした上で、今回は「音を混ぜる」つまり音のミキシングについて実践していきます。

SuperColliderでは、音を変数に格納して、数値を計算するように簡単に信号を足しあわせてミックスすることが可能です。また、Mix関数によって音を混ぜあわせることも可能です。まず前半で音を混ぜる基礎について解説します。

後半は、ランダムな関数や、周波数の比率によって、アリゴリズミックにハーモニーを作りだす手法について探っていきます。

スライド資料

授業内で使用するスライド資料は、下記から参照してください。

サンプルプログラム

今回使用したSuperColliderのプログラムです。

// インタラクティブ・ミュージックII
// 東京藝術大学
// 2014.10.16

// 先週の復習

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

// 音を混ぜる
// 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クラス
{
    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;

// ランダムな周波数を重ねる
(
var num = 8;
{ Mix.fill(num, {
    SinOsc.ar([50+1000.rand, 50+1000.rand], pi.rand, 1.0/num)
})}.play;
)

// number.rand から ExpRand(low, hi)へ
(
var num = 8;
{Mix.fill(num,{
    SinOsc.ar([ExpRand(50,800), ExpRand(50,800)], pi.rand, 1.0/num)
})}.play;
)

// アルゴリズミック、ハーモニー
(
var num = 8;
{Mix.fill(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;
)

// アルゴリズミック、ハーモニー 2
(
var num = 8;
{ Mix.fill(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;
)

// アルゴリズミック、ハーモニー 3
(
var num = 8;
{ Mix.fill(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;
)

// アルゴリズミック、ハーモニー 4
(
var num = 32.0;
{ Mix.fill(num,{
    var freqR, freqL;
    freqL = 440 * ((3.0/2.0) ** rrand(1,6)) * (0.5 ** rrand(1, 8));
    freqR = 442 * ((3.0/2.0) ** rrand(1,6)) * (0.5 ** rrand(1, 8));
    SinOsc.ar([freqL, freqR], pi.rand, 1.0/num);
})}.play;
)

// アルゴリズミック・ハーモニー、バリエーション
{Mix.fill(24,{SinOsc.ar([440,441]*(3.0/2.0**rrand(1,6))*(0.5** rrand(1,8)),0,1.0/24)})}.play;

{Mix.fill(24,{SinOsc.ar([440,441]*(4.0/3.0**rrand(1,6))*(0.5** rrand(1,8)),0,1.0/24)})}.play;

{Mix.fill(24,{SinOsc.ar([440,441]*(5.0/3.0**rrand(1,8))*(0.5** rrand(1,8)),0,1.0/24)})}.play;

{Mix.fill(24,{SinOsc.ar([440,441]*(9.0/8.0**rrand(1,20))*(0.5** rrand(1,8)),0,1.0/24)})}.play;


// 楽器を定義する - SynthDef

// {}.playによる出力
{SinOsc.ar}.play;

// Post Windowの表示
Synth("temp__146" : 1000)

// {}.playによる出力
{SinOsc.ar}.play;

// SyntDefに変換
SynthDef("sine", {Out.ar(0, SinOsc.ar)}).play; //left
SynthDef("sine", {Out.ar(1, SinOsc.ar)}).play; //right

//関数による記述
{ 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.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;