『教育用G3Xパッチメイカー』(Step 11 ディレイも増設の巻)
【解説】
ここからは解説の必要のあるところだけ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