SMCには、変数機能が搭載されています。変数とは、「数値や文字列を格納できるもの」のことです。マクロと似た部分がありますが、「内容が書き換えられる、または自動的に書き換わる」「引数の代わりにのみ使用できる」などにおいて違う部分があります。
変数には、任意の数値または文字列が格納できます。型はありませんが、数値は「32ビット符号付き」の範囲が使用できます。
変数には、ユーザーが自由に内容を書き換えることができる「ユーザー変数」と、SMCが状況に応じて自動的に内容を書き換える「システム変数」があります。
ユーザー変数に値を格納するには、“@?”を使用します。ユーザー変数を使用するには、引数を書くところで“?A”〜“?Z”・“?a”〜“?z”と書きます。以下は、ユーザー変数を使用する例です。
3 @?G,32 ; ?Gに32を格納 3 C?G ; C32と同じになる 3 @0+?G ; @32と同じになる
“@”命令の値に変数を使うときは、そのまま書くと“@?”命令と同じ表記になってしまいます。これを回避するには、頭に“0+”を付加します。
“X”命令の値に変数を使うときは、そのまま書くと変数の内容を文字列として解釈します。これを回避する(数値として解釈させる)ときも、同様に“0+”を付加します。
3 @?A,127 ; ?Aに127を格納 3 X ?A ; X "127"と同じになる 3 X 0+?A ; X 127と同じになる
システム変数を使用するには、引数を書くところで“??A”〜“??Z”・“??a”〜“??z”と書きます。以下は、システム変数を使用する例です。
3 @?C,"ABC" ; ?Cに"ABC"を格納 3 @?B,"DEFG" ; ?Bに"DEFG"を格納 3 @?D,??W ; ?Dに??W(文字列?Cに文字列?Bを結合したもの)を格納 ; @?D,"ABCDEFG"と同じになる
システム変数の多くは、“?A”・“?B”・“?C”を自動的に使用します。ですから、ユーザーが値を保持したいときは、これらを使わないようにしたほうがいいでしょう。
以下は、システム変数の一覧です。
変数名 解説 ??A ?AのMSB(ビット13〜ビット7)を返します。 ??B ?AのLSB(ビット6〜0)を返します。 ??C ?A×?Bを返します。 ??D ?A÷?Bを返します。 ??E ?A and ?B(論離積)を返します。 ??F ?A or ?B(論理和)を返します。 ??G not ?A(否定)を返します。 ??H ?A << ?B(左シフト)を返します。 ??I ?A >> ?B(右シフト)返します。 ??J ?A == ?B(等しい)なら1を、そうでなければ0を返します。 ??K ?A != ?B(等しくない)なら1を、そうでなければ0を返します。 ??L ?A > ?Bなら1を、そうでなければ0を返します。 ??M ?A < ?Bなら1を、そうでなければ0を返します。 ??N ?A >= ?Bなら1を、そうでなければ0を返します。 ??O ?A <= ?Bなら1を、そうでなければ0を返します。 ??P 文字変数?Cの?A文字目のアスキーコードを返します。 ??Q 数値変数?Aをアスキーコードとした文字を返します。 ??R ?Aの数値内容を10進文字列化したものを返します。 ??S ?Aの数値内容を16進文字列化したものを返します。 ??T ?Cの文字列内容を10進数値化したものを返します。 ??U ?Cの文字列内容を16進数値化したものを返します。 ??V ?Cの文字列の?A文字目から?B文字を返します。 ??W ?Cの文字列に?Bの文字列を結合したものを返します。 ??X ?Aが0なら?Cを、そうでなければ?Bを返します。 ??Y
??Z
変数名 解説 ??a
??b 現在のピッチベンド値(“@B”)を返します。 ??c 現在のチャンネル・プレッシャー値(“@C”)を返します。 ??d 現在のディビジョン値(“#DIVISION”)を返します。 ??e
??f
??g ?Aをコントロール・チェンジ番号とした場合のコントロール値(@G)を返します。 ??h
??i 現在の移調値(“@I”)を返します。 ??j
??k
??l 現在の省略時音長(“L”)をMIDIクロック数(mc)単位で返します。 ??m
??n
??o
??p 現在の半音分の差に相当するピッチベンドの値を返します。 ??q
??r
??s 現在のピッチベンド・センシティビティを返します。 ??t
??u 現在の省略時ベロシティ(“U”)を返します。 ??v 現在の省略時音量(“V”)を返します。 ??w 現在の省略時エクスプレッション(“W”)を返します。 ??x 現在の処理トラック番号を返します。 ??y 現在の出力MIDIチャンネル(“@Z”)をローランドGS型に変換したものを返します。
CH ??Y 10 0 1〜9 1〜9 11〜16 10〜15 ??z 現在の出力チャンネル(“@Z”-1)を返します。