多摩美 - サウンド・パフォーマンス 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