『教育用G3Xパッチメイカー』(Step 7 配列変数と関数の巻)
【解説】
これまでに、forを使った「ループ構文」、ifを使った「条件文」、Math.random()を使った「乱数処理」という3つの大きな
項目を解説してきたけど、今回やる「配列変数」と「関数」もそれらと並んでパッチメイカーの重要な構成要素になって
いるものだyo 上の表を見ただけで、エフェクトたった1個分でも管理すべきデータは何十個もあることがわかるよね。
これをいちいちifを使った条件文で「◯◯が△△のときは□□という値にする」のように記述していたらプログラムは
何万行書いても終わらないよねw(大苦笑) それを劇的に圧縮してシンプルな記号で記述できるのが「配列変数」
だよ。まずは配列変数の仕組みから解説していこうか。
たとえばcという名前の配列変数をつくるとするよ。プログラム上では、c=new Array();と記述すればいいだけ。この
配列変数cはいくつもの配列要素を持つことができるよ。配列要素とは「行」のようなもので、たとえばc[0]="一行目";
と書けば、配列変数cの先頭である0番目の配列要素には"一行目"というテキストが格納されるよ。同様に
c[1]="二行目";c[2]="三行目";と書けばそれぞれ"二行目"、"三行目"というテキストが格納されるよ。それのどこが
便利なのかと思うかもしれないけど、「配列変数cのn番目の要素をちょうだい」と言われたときにc[n]と書くだけで用
がすんでしまうところが配列変数を使う最大のメリットだyo 単純に8行×8列の上のようなマス目に順番にデータを
書き出すだけならばforを使ったループ構文で64回ループする指定をしてnを1ずつ増やしていくと、c[n]を毎回代入
するという1行を書くだけで処理が終わってしまうyo すごい威力でしょw(簡潔笑)
でも、配列変数の要素の仕込みに結構手間がかかるじゃないかという反論が出そうだね。たしかに64回もいちいち
c[△]="◯◯";と記述するんじゃその手間も馬鹿にならないね。だけど、それにもうまい対処法があるんだよw
「.split(",")」というのをテキストがはいった変数の後ろにつけてやると、そのテキストをコンマごとに配列要素に区切っ
て代入した配列変数をワンタッチでつくってくれちゃうというワザがあるyo(超便利笑) 具体的な例で書くと
TX="あ,い,う,え,お,か,き,く,け,こ"; という平仮名とコンマが入った変数TXをつくるとするよ。
hTX=TX.split(","); そいつにsplitをつけて、配列変数hTXというのをつくるよ。
すると、この配列変数hTXの中身の配列要素はこうなるよ。
hTX[0]="あ"、hTX[1]="い"、hTX[2]="う"、、、、、hTX[9]="こ" という感じで1個ずつコンマで区切られた範囲で
配列要素に切り出して格納してくれるyo
この仕組みを利用してやると、100個以上のエフェクターがそれぞれ数十個の必要情報を持っているという状況で
ほしい情報を簡単に取り出すうまいシステムが構築できるよ。ボクがいつも利用してるのはこういう方法だyo
//ID番号n番のエフェクトのk個目の情報を変数xに入れたいとき(nもkも先頭は0番目として数えるので注意!)
d=new Array();
d[0]="M-Filter,Freq,0,100,101,100,0,1,Sense,0,10,11,10,0,0";
d[1]="The Vibe,Speed,0,50,51,50,0,1,Depth,0,100,101,100,0,1";
d[2]="Z-Organ,Upper,0,100,101,100,0,1,Lower,0,100,101,100,0,1";
hd=d[n].split(",");
x=hd[k];
d[0]-d[2]が必要情報をコンマ区切りで列挙したデータベースの部分だよ。実際はもっと長いけどはしょってるよ。
これが配列変数dの中に格納されてるよ。The Vibeの情報がほしいならd[1]と指定してやれば、"The Vibe,Speed,
0,50,51,50,0,1,Depth,0,100,101,100,0,1"という中身がいったん選択されるよね。こいつにsplitをつけてやれば
hdという配列変数を生成できるよ。そいつのk個目の要素を取り出してxに代入してやれば完了だyo つまり、仕込
みとしてはd[0]="M-Filter,Freq,0,100,101,100,0,1,Sense,0,10,11,10,0,0";というような書式で各エフェクトのデータを
入力しておけばいいだけということになるよ。これならそう面倒ではないでしょw ボクの場合はこれをエクセルの
表で管理していて、上のような書式でデータベースを書く必要があるときは複写したシートを加工して、d[ ]=" ";
なんかを分けて書いた列も挿入したりした後、タブ区切りテキスト形式で出力して、余計なタブなどを一括置換で
削除したりしてからプログラムにコピペして使ってるyo まあそのあたりは各自で工夫してみてよne
ところで、こういうデータベースをプログラムでは何度も何度も参照することになるんだけど、その都度いちいち
コピペして全部データを貼ってたら行数が爆発しちゃうよねw(苦笑) ましてや実際のデータベースは100行以上
あるんだからねw そこで「関数」というものを利用して、プログラムのどこからでも呼び出せるようにしておけば
1カ所に記述しておくだけでOKになるというわけだよ。メンテナンスもそうしておいたほうが断然楽だしねw
上の例だとこんな風になるよ。
function d(n,k){
d=new Array();
d[0]="M-Filter,Freq,0,100,101,100,0,1,Sense,0,10,11,10,0,0";
d[1]="The Vibe,Speed,0,50,51,50,0,1,Depth,0,100,101,100,0,1";
d[2]="Z-Organ,Upper,0,100,101,100,0,1,Lower,0,100,101,100,0,1";
hd=d[n].split(",");
x=hd[k];
return x;
}
メインのプログラムとは別に、上のような「関数」のスクリプトをJavaScriptのタグで挟まれたエリアに書いておくよ。
すると、そのページのプログラム中でd(1,3)というふうに表記すれば、必ずこの関数を参照しに来て、The Vibeの
データの3番目(先頭は0番なので注意!)の「50」を取り出して代入してくれるよ。d(ax,ct)のように既に数値の
入ってる変数を使って指定することもできるから、ループ構文の中で順番に呼び出したいようなときでもOKだよ。
関数と通常のプログラムは形は一見似ているんだけど、最後の行が大きな違いだね。return x; と書いてあること
でこのd(◯,△)の書いてあるところにxという値を戻して代入しますよ、という指定が最後にあるのが「関数」だと覚
えておくといいよ。プログラム中で他のプログラムを呼び出す場合もあるけど、その場合は行の中で
makepatch();
kaiseki(1);
のように単独で使われて、すぐ後ろに「;」が付いてるのが見分けるポイントだろうね。プログラムに対しても括弧内
に書いた値や変数が送られる場合があるので形の上で関数と似ているよね。
以上、非常に込み入った話で難しかったかもしれないけど、配列変数を使えばデータベース的に大量の情報を
管理しやすいこと、splitを使えばデータ入力の仕込みも簡単になること、関数を使ってデータベース部分を独立
させておくと使い勝手がよくなってメンテも楽になること、くらいを漠然と理解しておいてもらえばいいと思うyo
実際に自分でプログラムを書いていくうちになるほどと納得することばかりだと思うyo(先は長いよ笑)