TaskやRoutineでコード進行を一挙に変える


 久々にまとまった時間がとれたので、SC3にチャレンジしました。以前に書いたエントリでPbindはコード進行が1行で書けて便利と書いたけど、どうもmtransposeとかがうまく使いこなせていなかったことに気づいたり(汗)、デフォルトでメジャースケールが指定されていたり、パターンを組み合わせるのが面倒といったこともあって、最近はTaskを利用しています。
 で、TaskやRoutineなどで全体のコード進行の一挙変更ができる方法を考えてみました。ソースはこちら

 ソースは Im-bVI-Vsus4-V(bはフラットのつもりです)という進行でパッドとベースを鳴らすという例ですが、まず41行目からメジャー、マイナー、sus4のそれぞれの構成音を配列に入れています(進行の都合上メジャーは転回形になってます)。
major=[-5,0,4];
minor=[0,3,7];
sus4=[0,5,7];
 続いて46行目で変数keyに48(キーがCってことです)を代入。キーを変えたい場合はこの数値を変えるだけでOK。

 以下5行で全体のコード進行を指定します。
まずコードネームの進行を指定。
chord=Pseq([minor,major,sus4,major],inf).asStream;
次に度数を指定。
degree=Pseq([0,8,7,7],inf).asStream;
次いで、コードの長さを指定。今回は2小節ずつという単純なもの。
chorddur=Pseq([8],inf).asStream;
 続いて71行目のようにSystemClock.shedでスタート時からchorddurの長さで、パッドに弾かせる音程padnoteをchordから持ってきてチェンジさせます。
SystemClock.sched(0,{padnote=chord.next;chorddur.next*tbeat;});
 72行目ではその都度の度数をtmpdegに、やはりchoddurの長さでチェンジさせています。
SystemClock.sched(0,{tmpdeg=degree.next;chorddur.next*tbeat;});
 これで全体のコード進行が決まるので、あとはシンセごとにこれを参照しながらフレーズなりを作っていけばよいということになります。進行を変えたいときには上記のみを変更すればよいので便利ではないかと。

 ちなみにパッドは以下のようになっています。Pbindのように配列を指定しただけでは和音を弾いてくれないので、配列の中身の数だけdo(for文のようなものですね。i の初期値は0、配列のlength以下なら i ++ なんてやんなくてよいのは便利だけど、逆にスパコのとっつきにくさでもありますね)で繰返し、配列の中身にkeyとtmpdegを足して弾かせています。
pad=Task.new({
  loop({
    padnote.size.do({arg i;
      var note;
      note=padnote.at(i);
      Synth("pad",[\out,0,\amp,0.5,\freq,(key+tmpdeg+note),\tbeat,tbeat]);
    });
    chorddur.next.wait;
  });
},TempoClock(fbeat));
 ベースは8分音符でルートを弾かせるだけなので、以下のように、bsdurが1/2、freqはtempdegの1オクターブ下を指定しているだけです。フレーズなどを弾かせたい場合は、bsnoteといった変数にPseqで音を並べて足してやればよいということです。
bsdur=Pseq([1/2],inf).asStream;
bs=Task.new({
  loop({
    Synth("bass",[\out,0,\amp,0.5,\freq,(key+tmpdeg-12),\tbeat,tbeat]);
    bsdur.next.wait;
  });
},TempoClock(fbeat));
 あるいはもっと簡単な方法があったりするのかもしれませんが、一応初心者なりに考えてみましたです。

Posted: 金 - 5月 6, 2005 at 03:43 午後 | | | | |