変数と関数


 ここでは、サクラ独自のスクリプト機能について説明します。単純な機能しかありませんが、自分なりの関数を作ったりすることで、作業の効率化がはかれます。


変数

変数とは、数学にも出てきたxとかyとか、数値を入れることのできる入れ物のことです。

例えば、何度も、出てくる数値があったとして、それを後から一気に直したいときなど、その何度も出てくる数値を変数にしておけば、修正が楽になるというものです。

変数の種類には、整数型、配列型、文字列型の3種類があります。それらを使うには、まず、変数の宣言が必要になります。
整数型変数について
・整数型は普通の-3とか、77とか、このような数値を言います。
宣言 Int 変数名 [=初期値];
//変数宣言例
Int A = 0;
Int B = 50;
Int C = 9;
//A,B,Cの3つの整数型変数を作った。

//内容の表示
Print(A);//Aの内容を表示
Print(B);//Bの内容を表示
Print(C);//Cの内容を表示

//計算と表示の例
A = 3*(B*C/10)+3;
Print(A);//計算結果を表示
(*Printの表示先は、エディタバージョンなら、表示-コンパイラからのメッセージで見られます。)

変数を使えば、計算が出来ます。四則演算+αできますので、サクラを電卓の代わりに使うことも出来ます!(そんな使い方する人いないと思うけど。)

使用可能な演算子の説明
* 掛け算
/ 割り算
% 割り算の余りを求める
+ 足し算
- 引き算
| ビットごとの論理和(OR)
& ビットごとの論理積(AND)
^ ビットごとの排他的論理和(XOR)
== 等しい時1、等しくない0
!= 等しくないとき1、等しいとき0
< より小さいとき1、それ以外0
> より大きいとき1、それ以外0
<= <= 以下のとき1、それ以外0
>= >= 以上のとき1、それ以外1
四則演算は、解ると思いますが、ビットごとの論理演算とはなんだ〜!!という方もいると思いますが、話すと長くなりそうなのでここには書きません。たぶん、あまり使わないと思います。
音源をマニアックに操作したい場合に有効な演算です。
その下の水色のパネルの演算子は、変数と変数の比較に使います。次の章の制御構造にて詳しく説明します。


配列型変数について

配列変数とは、たくさんの値を持つことの出来る変数です。
オプションを指定するときなど、変数を使うといくつも値をかかなければなりませんが、配列変数は、その中に多くの値を持つことが出来るので、表記が簡潔になります。
宣言 Array 変数名 [ =(初期値1,値2,値3...)];
//配列変数の宣言
Array A = ( 100,10,80,10 );
Array B = ( 10,100,30,100 );
Array C = ( 20,20,100,20 );

//内容の表示
Print(A);
Print(B);

//配列同士をまとめる
A = (A, B, C);
Print(A);
これだけ(↑)では、いったい何の役に立つのかと思いますが、以下に役立つ例を紹介します。
Array m = (10,10,!16);
Array A = (100,100,!16);
q.onTime( m,A,m,m,A,m,A,A);
l16 o6[16 'ceg' ];//cegの和音を16個鳴らす
と、このように、たくさん書くと面倒に感じられたノートオンオプションの.onTimeの指定がすっきりとまとまりました。
*配列のサイズを得るには、SizeOfという関数を使います。

文字列型変数について
これは、文字列を覚えておく変数です。何度も使うフレーズを登録しておいて、使いまわす場合に有効です。
また、文字列型変数は、オプション指定( .s )で、文字列置換を行うことができます。
宣言 Str 変数名 [ = { 初期値 }];
//文字列変数の宣言
Str A = {cdefg}
Str B = {efgab}

//内容の表示
Print(A);
Print(B);

//文字列同士を足す
A = A + B;
Print(A);
A;//←これだけで A の内容を演奏する意味

//文字列の内容を置換する例
Str C = { irii rirr irii riri };
C.s({i},{'cega'});
l16 o5 C;

関数

MMLを打ちこんでいると、似たようなコマンドの繰返しが何度も出てきて、打ちこむのが面倒になります。
全く同じ内容のものなら、上記の文字列変数を使えば、良いのですが、部分的に数値やフレーズを変えたいというとき、関数を使うことで、作業が楽になります。

また音源操作など、比較的よく使うと思われる関数は、前回も紹介しましたが、Includeフォルダーに収録しています。スクリプトがなんとなく解ってきたら眺めてみてください。

関数について
定義
Function 関数名(型 引数1=省略値,引数2=省略値,引数3=省略値...){
  定義内容
}
・上のように定義した関数は、その関数名(引数)と書くことで呼び出すことができます。
・引数の型は、Int型、Array型,Str型が使えます。
・引数の型を省略すると、Int型変数と見なされます。
・関数の引数は省略できます。引数を省略すると、その引数には省略値(設定がない時は0)が代入されたことになります。
・また、関数は普通、関数名()という形で使われますが、引数が何も無い時は、()を省略して、関数名だけでも、呼び出すことが出来ます。
・関数の呼び出し時に、引数を与えるのですが、引数の与え方は、"Func(a1,a2,a3...)"と書くのが普通ですが、"Func=a1,a2,a3"のように書くことが出来ます。もし、文字列が第1引数ならば、"Func{ str }"のように () を使わず直接、{} を記述することができます。
//定義例
Function Nanika(Int A, Int B,Int C){
  Print(A);
  Print(B);
  Print(C);
}//引数A,B,Cの内容を打ち出すだけの関数

//利用例
Nanika(50,30,100);//50 30 100と表示
Nanika(1,2,3);//1 2 3と表示
Int AAA = 1000;
Nanika(AAA,AAA,AAA);//1000 1000 1000と表示
/*
 オプションコマンドなど引数がたくさん必要なコマンドを、簡単な関数にまとめる例
*/
//ベンドアップ関数定義
Function BendUp(Int Len){
  PitchBend.onTime(-$2000, 0, Len);
}
//関数使用
l4 cdef BendUp(!8)cdef BendUp(!4)g1
//引数の省略の例

Function FUNC(A,B=100,C=101){
  Print(A);
  Print(B);
  Print(C);
}
FUNC(1,2,3);//省略しないで関数呼び出し
FUNC(1); //第2,第3引数を省略して関数呼び出し。
FUNC; //すべての引数を省略して関数呼び出し。

・文字列マクロ

文字列マクロは、必ず#から始まります。主な機能は、文字列型変数と同じようなものですが、文字列に引数を取る事が出来ます。また、文字列マクロには、マクロの使用を宣言しなくても良いのです。(その分、誤って同じ名前のマクロを他で使ってしまってもエラー表示されないという欠点があります。)

普通の文字列マクロ
定義 #マクロ名 = { 文字列 };
//定義
#test1 = { l8 cdef gfed };
#test2 = { l8 efga bagf };

//使用
#test1; #test2;

//連結
#test3 = #test1 + #test2;
Print(#test3);//文字列の表示
#test3;//使用

引数付き文字列マクロ
文字列マクロの任意の場所に引数を与えたい時は、引数を与えた居場所に、#?1 #?2 #?3 ...と、引数の番号を書いておきます。
引数が与えられれば、#?番号が、その引数に置き代わります。引数を省略すると、#?番号は無になります。
//引数付き文字列マクロ定義
#Hiki = { #?1;cdef #?2;gfed #?3;c1 }

//引数付き文字列マクロ使用
#Hiki({l8o4},{l4o5},{o4});
//→展開するとl8o4;cdef l4o5;gfed o4;c1

#Hiki({l8o5});
//→展開するとl8o5;cdef ;gfed ;c1

戻る次へ