『教育用G3Xパッチメイカー』(Step 6 歪みメイカー2へ改造の巻)
先頭へ1つ前へ次へ

 /    (^)  (^) \   

データ構造を勉強したところで、さらにプログラムを発展させていこうじゃなイカ!
NRもつけて、パラメータ値をランダムに選択させて、10パッチのパッチグループファイルをつくるyo
UNIT (1st) (2nd) (3rd) LEVEL
NR NRsel Thrsh lev1
DRIVE DRIVEsel Gain Tone lev2
Contents of patch group file 

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

【解説】

全プログラムを表示して解説していくよ。それぞれのパーツに追加されているテキストとvalueなどは自分でソース
を開いて確認してね。一応やり方の一つを書いておくと、ファイルメニューから「別名で保存」を選んで、フォーマット
というセレクトメニューで「ページのソース」というのを選んで保存を実行すると、ソースファイルが保存できるから
それをテキストエディタで開けばHTMLの中身を見ることができるよw(Safariの場合笑)

<script language="JavaScript">
  function g3xpm(){
   PGX="";   //パッチを10個後ろに足し込んでいくための空っぽの変数を用意する
   for(ct=0;ct<10;ct++){       //★★★ここから10回ループしますという目印
      NRU=edu.NRsel.value;   //NRセクションのユニット番号を読み込む
      NRT=edu.Thrsh.value;   //Thrshの値を読み込む
      //◆もしNRTの値が999の場合、NRTには0-24のいずれかの整数を入れる
      if(NRT==999)NRT=Math.floor(Math.random()*25);
      NRL=edu.lev1.value;   //LEVELの値を読み込む
      DRU=edu.DRIVEsel.value;   //DRIVEセクションのユニット番号を読み込む
      DRG=edu.Gain.value;   //Gainの値を読み込む
      //◆もしDRGの値が999の場合、DRGには0-100のいずれかの整数を入れる
      if(DRG==999)DRG=Math.floor(Math.random()*101);
      DRT=edu.Tone.value;   //Toneの値を読み込む
      //◆もしDRTの値が999の場合、DRTには0-100のいずれかの整数を入れる
      if(DRT==999)DRT=Math.floor(Math.random()*101);
      DRL=edu.lev2.value;   //LEVELの値を読み込む
      //Module0にNRセクションの値を書き込む
      px="<Module0><Prm0>1</Prm0><Prm1>"+NRU+"</Prm1>";
      px=px+"<Prm2>"+NRT+"</Prm2><Prm3>"+NRL+"</Prm3></Module0>";
      //Module1に値を書き込む
      px=px+"<Module1><Prm0>1</Prm0><Prm1>"+DRU+"</Prm1>";
      px=px+"<Prm2>"+DRG+"</Prm2><Prm3>"+DRT+"</Prm3><Prm4>"+DRL+"</Prm4></Module1>";
      //パッチ音量を所定の場所に書き込む
      px=px+"<Module6><Prm0>100</Prm0></Module6>";
      //パッチヘッダーの書き込み
      header="<PatchData><Name>TestPatch</Name>";
      header=header+"<Tooltip></Tooltip><Keywords></Keywords><Version>0.12</Version>";
      //パッチフッターの書き込み
      footer="</PatchData>";
      //ヘッダー(header)と本体(px)とフッター(footer)を合体
      patch=header+px+footer;
      //できたパッチ1個を変数PGXの末尾に足し込む
      PGX=PGX+patch;
   }        //★★★ここまでの処理を10回ループしますよという終わりの括弧がコレ!
   //パッチグループヘッダーの書き込み
   gheader="<PatchSet><Product>G3X</Product>";
   gheader=gheader+"<Version>1</Version><Name>TestGroup</Name><Patches>";
   //パッチグループフッターの書き込み
   gfooter="</Patches></PatchSet>";
   //ヘッダー(gheader)と本体(PGX)とフッター(gfooter)を合体
   PatchGroup=gheader+PGX+gfooter;
   //テキストエリアに出来上がったパッチグループを書き込んで完成
   edu.kekka.value=PatchGroup;
}
</script>


行数は増えたけど、ヘッダーやフッターを書き込んだり合体させたりしてる行も多いので、実際はまだそうたいした
ことはしてないよw 新しい処理をしているところに★と◆のマークをつけているから注目してくれyo

まず、★★★印をつけてるループ処理だね。これは、
for(ct=0;ct<10;ct++){

}
という構造になっていて、ctという変数が0から1周ごとに1ずつ増えて10になる前までの間(つまりctが9までの間)
大括弧でくくられた行の処理を繰り返すという意味だよ。あらゆるコンピュータープログラムに出てくる基本中の基本
のループ処理だから必ず覚えておいてne あっ、このforを書いてる行と、最後の閉じ括弧の行は行末に「;」をつけ
なくていい例外的な行だということも覚えておいてね。

次は◆印をつけてる行だね。代表として一番最初にでてくる行を取り上げるよ。
 if(NRT==999)NRT=Math.floor(Math.random()*25);
まず前半部分だけど、「もし変数NRTが999なら」行の後ろに書いてある処理をする、という意味だよ。「==」と
2つ続けて書くルールになっているのでこれはしっかり覚えておいてね。ちなみに(NRT<999)と書けば「もしNRTが
999より小さいなら」、(NRT>999)と書けば「もしNRTが999より大きいなら」、(NRT!=999)と書けば「もしNRTが
999ではないなら」という意味になるよ。このifを使った条件文もコンピュータープログラムの基本中の基本なので
覚えておく必要があるyo

そして後半部分。まず「Math.random()」が何を意味しているかというと、これこそ乱数の発生装置で、0から1未満
の数を毎回不規則に決定するランダム関数とよばれるものだyo とる値は、「0」「0.013528」「0.1715」「0.4343」
「0.773211」「0.911522」「0.999999201」などさまざまだけど、絶対に「1」という値にはなれないことに注意が必要
だよ。次に、「Math.floor()」という部分。これは、()の中に入った数の小数部分を切り捨てるという処理をする関数
だよ。つまり、単純にMath.floor(Math.random())としたら、常に0にしかならないことになるよw このプログラムでは
そうならないように先にMath.random()に25を掛けているね。あっ、「*」というのはパソコンでは算数の「掛ける」の
意味で使われるというルールだからねw つまりMath.random()*25は最小で0、最大で限りなく25に近いけど25に
はならない数ということになるよ。こいつの小数部分を切り捨ててやると0から24までのいずれかの整数ということ
になるよ。こいつをNRTに代入してやることで、NRセクションのThresholdの値が1から25までのいずれかの値にな
るというわけだよ。乱数を掛け算して大きくしてやってから小数切り捨てすることで、ほしい範囲の乱数値を得ると
いう手法はよく使うので覚えておくといいyo

あとはStep3で解説したとおりだから分からないところがあればStep3をおさらいしてne

パッチグループヘッダーが出てきたけど、Step4をしっかり理解していれば難しくないよね。単にパッチデータ内の
入れ子構造の定義だけの話なので、まあこういう風にパッチグループファイルが構成されてるんだって理解してよ。

「MAKE PATCH DATA!」ボタンを押して出来上がったデータファイルは実際にG3X用のパッチグループとして動くの
で試しにインポートしてみるといいよ。なぜか10個だけの保存エリアしかないEdit&Share上でしっかり動くからw
しかも、残りのユニットはなぜかすべてM-filterがoffでつながってるからw これらの謎もいずれ解説するyo(微笑)

先頭へ1つ前へ次へ