芸大 – Interactive Music II 2014
第5回: SuperCollider入門 5 – 時間構造をつくる、エンベロープと反復
SuperCollider入門編も大詰めです。今回は、時間構造について考えていきます。音楽は時間の中で展開される表現形式です。これまでは、音を生成したタイミングで鳴らすということをしてきました。
しかし、これを音楽作品にしていくためには、どのタイミングで何を行うかを、細かくコントロールする必要があります。今回はSuperColliderを用いて時間構造を作成する方法について解説していきます。
スライド資料
授業内で使用するスライド資料は、下記から参照してください
サンプルプログラム
今回使用したSuperColliderのプログラムです。
// インタラクティブミュージックII 2014.10.30 // 東京藝術大学AMC // エンベロープ (Enbalope) // Env.linen - アタック、サステイン、リリース、レベルで指定 Env.linen(0.05, 0.2, 0.5, 0.7).plot; ( { var env = Env.linen(0.05, 0.1, 0.5); SinOsc.ar(440).dup * EnvGen.kr(env, doneAction: 2) }.play ) // Env.perk - パーカッシブなエンベロープ Env.perc(0.01, 2.0).plot; ( { var env = Env.perc(0.01, 1.0); SinOsc.ar(440).dup * EnvGen.kr(env, doneAction: 2) }.play ) // Env.triangle - 三角形のエンベロープ Env.triangle(1, 1).plot; ( { var env = Env.triangle(1, 1); SinOsc.ar(440).dup * EnvGen.kr(env, doneAction: 2) }.play ) // Env.sine - ハニング窓 Env.sine(1, 1).plot; ( { var env = Env.sine(1, 1); SinOsc.ar(440).dup * EnvGen.kr(env, doneAction: 2) }.play ) // Env.new - 完全に自由なエンベロープ生成 // レベルの配列と、時間の配列で指定 Env.new([0, 1, 0.9, 0], [0.1, 0.5, 1]).plot; ( { var env = Env.new([0, 1, 0.9, 0], [0.1, 0.5, 1]); SinOsc.ar(440).dup * EnvGen.kr(env, doneAction: 2) }.play ) // スケジューリング (Scheduling) // Routineをスケジューリング- 1 ( Routine({ 12.do{ arg i; // カウンタ変数 "Count = ".post; i.postln; // カウンタ出力 1.yield; // 1秒待つ } }).play; ) // Routineをスケジューリング - 2 ( r = Routine({ //待ち時間を記録する変数 var delta; 12.do { //待ち時間、1~5秒をランダムに生成 delta = rrand(1,5); //メッセージを出力 "Will wait ".post; delta.postln; //1~5秒待つ delta.yield; } }).play; ) // アルゴリズミックシーケンス // Routine実験用、Synth "singrain" ( SynthDef("singrain", { arg freq = 440, amp = 0.2, sustain = 1; var env, sig; env = EnvGen.kr(Env.perc(0.01, sustain), doneAction: 2); sig = SinOsc.ar([freq, freq * 1.01], 0, amp) * env; Out.ar(0, sig); }).add; ) //反復して演奏 ( Routine({ loop{ Synth("singrain"); 1.yield; } }).play; ) //等比的に上昇 ( Routine({ var freq; 24.do{ arg i; freq = i * 1.5 * 55; Synth("singrain", ["freq", freq]); 0.2.yield; } }).play; ) //12音階をランダムに ( Routine({ var freq; loop{ freq = [60,61,62,63,64,65,66,67,68,69,70,71].choose.midicps; Synth("singrain", ["freq", freq]); 0.5.yield; } }).play; ) //音程、長さ、音量をランダムに ( Routine({ var freq, amp, sustain; loop{ freq = [60,61,62,63,64,65,66,67,68,69,70,71].choose.midicps; amp = exprand(0.1, 0.5); sustain = rrand(1, 4) * 0.5; Synth("singrain", ["freq", freq, "amp", amp, "sustain", sustain]); (sustain * 0.8).yield; } }).play; ) //2つの音程 ( Routine({ var freq1, freq2, amp, sustain; loop{ freq1 = [60,61,62,63,64,65,66,67,68,69,70,71].choose.midicps; freq2 = [60,61,62,63,64,65,66,67,68,69,70,71].choose.midicps; amp = exprand(0.1, 0.3); sustain = rrand(1, 4) * 0.5; Synth("singrain", ["freq", freq1, "amp", amp, "sustain", sustain]); Synth("singrain", ["freq", freq2, "amp", amp, "sustain", sustain]); (sustain * 0.8).yield; } }).play; ) //2つの音程 - 2 ( Routine({ var freq1, freq2, amp, sustain; loop{ freq1 = [60,61,62,63,64,65,66,67,68,69,70,71].choose.midicps; freq2 = freq1 * [1.0/1.0, 2.0/1.0, 3.0/2.0, 4.0/3.0, 5.0/4.0].choose; amp = exprand(0.1, 0.3); sustain = rrand(1, 4) * 0.5; Synth("singrain", ["freq", freq1, "amp", amp, "sustain", sustain]); Synth("singrain", ["freq", freq2, "amp", amp, "sustain", sustain]); (sustain * 0.8).yield; } }).play; ) //4つの音程2 ( Routine({ var note1, note2, note3, note4, amp, sustain; loop{ note1 = [60,61,62,63,64,65,66,67,68,69,70,71].choose; note2 = note1 + [0, 5, 7].choose - [0, 12].choose; note3 = note2 + [0, 5, 7].choose - [0, 12].choose; note4 = note3 + [0, 5, 7].choose - [0, 12].choose; amp = exprand(0.1, 0.2); sustain = rrand(1, 8); Synth("singrain", ["freq", note1.midicps, "amp", amp, "sustain", sustain]); Synth("singrain", ["freq", note2.midicps, "amp", amp, "sustain", sustain]); Synth("singrain", ["freq", note3.midicps, "amp", amp, "sustain", sustain]); Synth("singrain", ["freq", note4.midicps, "amp", amp, "sustain", sustain]); (sustain * 0.8).yield; } }).play; ) //4つの音程 x 2 ( r = Routine({ var note1, note2, note3, note4, amp, sustain; loop{ note1 = [60,61,62,63,64,65,66,67,68,69,70,71].choose; note2 = note1 + [0, 5, 7].choose - [0, 12, 24].choose; note3 = note2 + [0, 5, 7].choose - [0, 12, 24].choose; note4 = note3 + [0, 5, 7].choose - [0, 12, 24].choose; amp = exprand(0.05, 0.1); sustain = rrand(1, 8); Synth("singrain", ["freq", note1.midicps, "amp", amp, "sustain", sustain]); Synth("singrain", ["freq", note2.midicps, "amp", amp, "sustain", sustain]); Synth("singrain", ["freq", note3.midicps, "amp", amp, "sustain", sustain]); Synth("singrain", ["freq", note4.midicps, "amp", amp, "sustain", sustain]); (sustain * 0.8).yield; } }); r.play; r.play; )