| 先頭へ | 1つ前へ | 次へ |
【解説】
全プログラムを表示して解説していくよ。それぞれのパーツに追加されているテキストと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つ前へ | 次へ |