yoppa.org


多摩美 - サウンド・パフォーマンス 2016

Sonic Pi 応用 3 – 楽器をデザインする

Sonic Piの応用編の3回目は、オリジナルのSonic Piの楽器 (Synths) を作成します。beep、fm、prophet、tb303など、Sonic Piでは最初から様々な楽器が定義され「use_synth」をつかって読み込むことですぐに利用可能となっています。内蔵されている楽器を使うだけでも多くのことができるのですが、自分自身の楽器をオリジナルに作成できれば、可能性はさらに大きく拡がります。Sonic Piでは、SuperColliderでプログラミングすることで楽器を新規に定義して読み込むことが可能です。今回は、この方法で楽器を定義してSonic Piで演奏してみます。

スライド資料

サンプルプログラム

  • SuperCollider
//-----------------------------------------------------

( // 01: Sin波基本形
SynthDef("piTest", {
    //出力バスの番号指定
    arg out_bus = 0;
    //Sin波の生成
    var mix = SinOsc.ar(440).dup;
    //DACへ
    Out.ar(out_bus, mix);
}
//ファイルの出力先を指定
).writeDefFile("/Users/tado/Desktop/my-synths");
)

//-----------------------------------------------------

(// 02: Envelope追加
SynthDef("piTest", {
    arg out_bus = 0;
    var mix = SinOsc.ar(440).dup;
    //Envelope生成
    var env = EnvGen.ar(Env.perc(0.0, 1.0, 1.0), doneAction: 2);
    //Envelope適用
    mix = mix * env;
    Out.ar(out_bus, mix);
}
//ファイルの出力先を指定
).writeDefFile("/Users/tado/Desktop/my-synths");
)

//-----------------------------------------------------

(// 03: 音程と音量を指定
SynthDef("piTest", {
    //音程と音量を引数を指定
    arg out_bus = 0, note = 52, amp = 1;
    //音程(MIDI番号)から周波数へ
    var freq = note.midicps;
    //周波数をSin波に適用
    var mix = SinOsc.ar(freq).dup;
    var env = EnvGen.ar(Env.perc(0.0, 1.0, 1.0), doneAction: 2);
    mix = mix * env;
    Out.ar(out_bus, mix);
}
).writeDefFile("/Users/tado/Desktop/my-synths");
)

//-----------------------------------------------------

(// 04: Pan(定位)とエンベロープを指定
SynthDef("piTest", {
    arg out_bus = 0, note = 52, amp = 1, attack = 0, release = 1, pan=0;
    var freq = note.midicps;
    var mix = SinOsc.ar(freq);
    var env = EnvGen.ar(Env.perc(attack, release, 1.0), doneAction: 2);
    //Panを適用
    mix = Pan2.ar(mix * env, pan);
    Out.ar(out_bus, mix);
}
).writeDefFile("/Users/tado/Desktop/my-synths");
)

//-----------------------------------------------------

(// 05: Detune追加
SynthDef("piTest", {
    arg out_bus = 0, note = 52, amp = 1, attack = 0, release = 1, detune = 1.01, pan=0;
    var freq = note.midicps;
    //Detuneを追加
    var mix = (SinOsc.ar(freq) + SinOsc.ar(freq*detune))/2.0;
    var env = EnvGen.ar(Env.perc(attack, release, 1.0), doneAction: 2);
    mix = Pan2.ar(mix * env, pan);
    Out.ar(out_bus, mix);
}
).writeDefFile("/Users/tado/Desktop/my-synths");

//-----------------------------------------------------

(// 06: Moogシンセ風
SynthDef("piTest", {
    arg out_bus = 0, note = 52, amp = 1, attack = 0, release = 1, detune = 1.01, pan=0;
    var freq = note.midicps;
    var mix =  MoogFF.ar(
        Pulse.ar([freq,freq*0.5], 0.8),
        freq*2.5,
        128
    );
    var env = EnvGen.ar(Env.perc(attack, release, amp), doneAction: 2);
    mix = Pan2.ar(mix * env, pan);
    Out.ar(out_bus, mix);
}
).writeDefFile("/Users/tado/Desktop/my-synths");
)
  • Sonic Pi
load_synthdefs "/Users/tado/Desktop/my-synth"
use_synth :piTest

live_loop :live do
  use_random_seed 8
  32.times do
    3.times do
      ns = (scale :c1, :mixolydian, num_octaves: 8)
      play ns.choose, attack: 0.0, release: 2.0, amp: 1.5
    end
    sleep 0.25
  end
end