制御構造とは、同じ部分を繰返し実行したり、条件によって処理の内容を変えたりする場合に使います。
これによって、コンパイルの度に違う演奏をさせたり、演算による演奏が可能になったり、実験的な試みが出来たりします。
// ... (行末の改行までコメント) |
/* ... */ /*から*/まで、囲まれた領域をコメントにします。 このコメントは、/* cdefg /* check nest */ */ のように、ネストにもできます。 |
[num 文 : 文 ] |
MMLでよく使う単純ループです。[ ... ]の間をnum回ループします。':'は、省略可能です。ループからの脱出を意味し、num回目にそのループから抜けます。 |
[4 cdef ] // cdefの4回繰返し [2 cd [2 bb] ] // 展開→cd bbbb cd bbbb [2 [2c][2d] ] // 展開→ccdd ccdd |
[4 ccc : d ] e //展開→ ccc d ccc d ccc d
ccc e [2 [2 ee:gg] aa]//展開→eeggeeaa eeggeeaa [2[2 c:d]:e]f//展開→cdce cdcf |
IF(条件){ true }ELSE{ false } | ||||||||||||
・条件分岐です。条件が正しければ{ true }を、正しくなければ、{
false }を実行します。 ・条件には数値計算式が使えます。(今のところ文字列は条件になれません。) ・内部では、条件が0ならELSE{ false }部分を実行し、0以外なら{ true }部分を実行することになっています。以下、条件に有用な演算子と返却値です。
・文字列の比較もできますが、#name 形式の文字列マクロを使って、比較せねばなりません。 |
||||||||||||
//変数と定数の比較 Int AAA = 3; IF(AAA>0){ cccc }ELSE{ cgcg } IF(AAA<10){ cccc }ELSE{ cgcg } IF(AAA==3){ cccc }ELSE{ cgcg } //変数と変数の比較 Int A = 100; Int B = 300; IF(A>=B){ cccc }ELSE{ g1 } IF(A!=B){ cccc }ELSE{ g1 } //直接数値を指定した場合 IF(0){ Print({TRUE}) }ELSE{ Print({FALSE}) } IF(1){ Print({TRUE}) }ELSE{ Print({FALSE}) } IF(5){ Print({TRUE}) }ELSE{ Print({FALSE}) } |
WHILE(条件){ 文 } |
・条件が正しい間(1以上の時)、文を繰返します。(一応安全のため、同じ文を長時間繰返し続けるとエラー表示して止まります。) ・ループから強制的に脱出するには、EXITを使います。 |
Int A=40; WHILE(A<127){ A = A+Random(8); Print(A); IF(A==80){ EXIT; }//強制脱出 l8n(A); } |
FOR(初期化;条件;増分){ 文 } |
まず、変数を初期化し、条件が正しい(1以上)か判断します。もし、条件が正しければ、文を実行し、その後、増分を実行します。それから、再び条件が正しいか判断し、正しければ、文と増分を実行します。これは、条件が正しい間繰返されます。 |
FOR(Int A=1; A<=10; A=A+1){ Print(A); }//1から10までを表示する FOR(Int B=0; B<16; B++){//B++はB=B+1と同義 l16c }//{ l16c }を16回実行する FOR(Int C=0; C==0;){ cdef C=Random(3);//Cに0〜2の乱数を代入する }//Cに0が代入されるまで繰返される FOR(Int I=0; I<32; I++){ Int C = 40+Random(20)+I; l8n(C);//C番のノートナンバーを発音する Print(C); }//ランダムに32個のノートを発音する |
EXIT |
ループ内から強制的に脱出します。 |