『教育用G3Xパッチメイカー』(Step 11 ディレイも増設の巻)
先頭へ1つ前へ次へ

 /    (^)  (^) \   

今回はディレイセクションを追加するyo ディレイはパラメータの配置順が一部違うものもあるので
そこらあたりの例外処理も必要になってくるyo 完成まであと少しだne(微笑)
UNIT (1st) (2nd) (3rd) LEVEL
NR NRsel Thrsh lev1
DRIVE DRIVEsel Gain1 Tone lev2
AMP AMPsel Gain2 Tube Cab lev3
CHORUS CHsel Rate Depth Mix1 lev4
DELAY DLsel Time FB Mix2 lev5
Contents of patch group file 

Just copy this data and paste it to ".g3xa" file of Edit&Share on any text-editing software.

【解説】

ここからは解説の必要のあるところだけJavaScriptのプログラムを抜き出して説明するよ。プログラム全体を見るときは
各自でソースを見てね。ここまでの話についてこられてる人ならそれで大丈夫だろうからねw(微笑)

今回のキモは9種類のディレイを選べるんだけど、それぞれFeedBackやLevelのパラメータが入ってる位置がまちまち
という点だよw(苦笑) こういう場合、とりあず一番多いパターンに合わせて原則の処理を記述してから、「if」を使った
条件文でイレギュラーなやつを個別に処理してやるという流れでプログラムするよ。行数は増えるけど、やってること自
体は単純なことのくり返しだよ。まずは、指定情報の読み取り部分から見ていくyo


      //DELAYユニット選択
      DLU=edu.DLsel.value;
      if(DLU==888){
         DLU=Math.floor(Math.random()*9)+4;
         if(DLU>6)DLU=DLU+46;
         if(DLU>57)DLU=DLU+1;
      }
      //Time指定。"10,20,30,40,50,100,200,300,400,500,750,1000"のどれか。freeの場合もそのどれか。
      DLT=edu.Time.value;
         if(DLT==888){
            timedata="9,19,29,39,49,99,199,299,399,499,749,999";
            tdx=timedata.split(",");
            tnumber=Math.floor(Math.random()*12);
            DLT=tdx[tnumber];
         }
      //ReverseDL(id57)の場合はタイムの最短が10msからなので他のディレイよりも値を9引いてやる。
         if(DLU==57)DLT=DLT-9;
      //FeedBack指定。値は0から100まで。
      DLF=edu.FB.value;if(DLF==999)DLF=Math.floor(Math.random()*101);
      //Mix指定。値は0から100まで。
      DLM=edu.Mix2.value;if(DLM==999)DLM=Math.floor(Math.random()*101);
      //Level指定
      DLL=edu.lev5.value;


ユニット選択で「any of DELAY」(888)が選ばれているときは、対象ユニットのID番号(4,5,6,53,54,55,56,57,59)の中か
ら番号をランダムに選ぶようにしているよ。これはコーラスのときに解説したのと同じ手法だyo

Time指定で「free」(888)が選ばれている場合でも、37msとか241msとか中途半端なディレイタイムが選ばれてもほと
んど意味がないと思うので、セレクトにのせている"10,20,30,40,50,100,200,300,400,500,750,1000"のどれかから選
ばせるようにしたよ。Timeはデータ最小値が1からなので、パラメータ値にするときは1引いてやることを忘れずにw
ここでは、timedataというテキストリストからsplitで配列変数を作ってやり、その要素の個数までのランダムな整数を発
生させてその要素番号のデータを取り出すという手法を使ってるよ。パラメータデータベースの各行から個別のデータ
を取り出すときのやり方をそのまま応用してるのがわかるよねw(微笑)

次は、DELAYセクションのデータを書き出す部分を見ていくよ。Module4に書き込んでいくんだけど、選ばれたユニット
によってFBやLEVELの入っているPrm番号が異なるのでちょっと厄介だよw(苦笑)


      px=px+"<Module4><Prm0>1</Prm0><Prm1>"+DLU+"</Prm1><Prm2>"+DLT+"</Prm2>";  //ここまでは共通
      DLFpx="<Prm3>"+DLF+"</Prm3>";              //Prm3の基本パターン
      if(DLU==59)DLFpx="<Prm3>17</Prm3>";      //DynaDelayの場合
      if(DLU==6)DLFpx="<Prm3>14</Prm3>";        //PitchDelayの場合
      px=px+DLFpx;
      px=px+"<Prm4>"+DLM+"</Prm4>";              //Prm4は共通w
      DL5px="<Prm5>"+Math.floor(Math.random()*db(DLU,53))+"</Prm5>";    //Prm5の基本パターン
      if(DLU==59)DL5px="<Prm5>"+DLF+"</Prm5>";                                //DynaDelayの場合
      if(DLU==6)DL5px="<Prm5>"+DLF+"</Prm5>";                                  //PitchDelayの場合
      px=px+DL5px;
      //Prm6はIDが54,55,57,59のユニットはDLLを入れ、ほかはランダム値を入れる
      DL6px="<Prm6>"+Math.floor(Math.random()*db(DLU,63))+"</Prm6>";                         //ランダムパターン
      if((DLU==54)||(DLU==55)||(DLU==57)||(DLU==59))DL6px="<Prm6>"+DLL+"</Prm6>";    //DLL入れるパターン
      px=px+DL6px;
      //Prm7はIDが4,6,53,56のユニットはDLLを入れ、ほかはランダム値を入れる
      DL7px="<Prm7>"+Math.floor(Math.random()*db(DLU,73))+"</Prm7>";                      //ランダムパターン
      if((DLU==4)||(DLU==6)||(DLU==53)||(DLU==56))DL7px="<Prm7>"+DLL+"</Prm7>";    //DLL入れるパターン
      px=px+DL7px;
      //Prm8はIDが5のユニットはDLLを入れ、ほかはもうパラメータがないユニットなので0を入れる
      DL8px="<Prm8>0</Prm8>";                                 //ゼロパターン
      if(DLU==5)DL8px="<Prm8>"+DLL+"</Prm8>";         //DLL入れるパターン
      px=px+DL8px;
      //Prm9はどれも値がないので書き込む必要なし。これでDELAYセクション終了なのでModule4を閉じる。
      px=px+"</Module4>";


Prm2までは共通の様式で書き込めるよ。Prm3は基本FeedBackが入るんだけど、DynaDelayとPitchDelayはそれぞれ
違うパラメータが入るので、ここではランダム値ではなく、ボクが選んだ固定値をそれぞれに入れてやってるyo パラ
メータの内容によってはランダムにまかせず望ましい効果が得られるように固定値を入れてやるというのもパッチメイ
カーのプログラムでは有効な場合があるので覚えておいてyo その基準は各自で判断してne(おまかせ笑)

逆にPrm5ではDynaDelayとPitchDelayではFeedBackが入り、ほかのユニットでは別のパラメータが入るよ。ここではラ
ンダムを使ってそれぞれのデータベースの範囲から任意の値をとらせているよ。Prm6以降も同様で、Levelの値が入る
ユニットはDLLを入れ、それ以外はランダムにふってるよ。当該エフェクトの当該パラメータのとり得る値の中から任意
の値を決めて代入するという一連の処理がMath.floor(Math.random()*db(DLU,53))という短い記述だけで済んでしまっ
てる威力はもの凄いものがあるでしょ。これが関数を使う絶大なメリットだyo(超便利笑)

あと、if((DLU==4)||(DLU==6)||(DLU==53)||(DLU==56))という書き方は、「DLUが4か6か53か56のいずれかの場合」と
いう意味なので覚えておいてね。逆に「Aが4で、かつ、Bが6の場合」という風に指定したい場合はif((A==4)&&(B==6))
という風に書けばいいよ。まあ、JavaScriptの辞典とか買えば最初のほうに書いてあるけどねw

さてこんな感じでDELAYまで増設できたねw ほどよい設定を選んでパッチグループを作って実際にG3Xで鳴らしてみ
てよ。もう、十分実用的に使えるパッチメイカープログラムになっていることがわかると思うyo 次はREVERBセクション
の増設だね。ついでに、例外処理のやり方も今回でわかったと思うのでNRセクションで定番のZNRも選べるように改
良しようじゃなイカw いよいよ完成が近づいてきたne

先頭へ1つ前へ次へ