language : Japanese | English

SAL(世界樹アプリケーション言語)

ホーム サンプル リファレンス ダウンロード 購入 FAQ フォーラム 作者


リファレンス

概要

1. SALはテキストファイルで、拡張子は、salとします。

2. テキストファイルの文字コードは、Winowsコントロールパネルで設定された文字コード(Windows ANSI Code Page)であると解釈されます。例えば、英語Windowsをご使用の場合は1252-Latin1、日本語Windowsをご使用の場合は、932-Shift-JISと解釈されます。このため、外国で作られたSALファイルは、アスキー文字以外は正しく認識されません。SALファイルを外国に配布する場合は、アスキー文字のみのテキストファイルとする必要があります。ただし、BOMを先頭に入れた場合は、UTF-8とUTF-16LEに限りUnicodeテキストファイルとして認識します。

3. テキストファイルの改行コードは、CR-LFとします。

4. テキストファイルの最大サイズは、65535文字までです。

5. テキストファイルの1行の最大サイズは、65535文字までです。

6. ;(セミコロン)以降は、その行はコメントであるものとみなします。

7. 各トークンは、半角スペース、タブ、又は改行で区切るものとします。

8. 各トークンは、1023文字以内とします。

9. 各トークンは、大文字と小文字を区別します。

10. 整数は、内部的にはすべて32ビット符号付int型扱いです。

11. 整数は、32ビット符号付int型のみ使用可能です。

12. 文字列は、内部的にはUTF16LEとして扱っていますので、どのような文字でも使用可能です。

13. 文字列の最長長さは、1023文字以内とします。これ以上長く連結しても、無視されます。

14. バイト配列は、内部的にはunsigned char型の配列となっています。

15. バイト配列の最大長さは、1024バイト以内とします。これ以上長く連結しても、無視されます。

16. 関数を定義することはできません。

17. includeを使うことはできません。

制御構造

(do <op1> [<op2> ... <opN>]) op1~opNを実行します。
(if <expression> <trueop> [<falseop>]) expressionの値が真(0以外)の時、trueopを実行し、expressionが偽(0)のとき、falseopを実行します。falseopは省略可能です。trueopを省略する場合は、trueop部にNILと記述します。trueop又はfalseopに複数のコマンドを記述したい場合は、それらを(doセクションで囲んでください。
(switch <expression>
<case1val> <case1op>
[<case2val> <case2op>
...
<caseNval> <caseNop>])
expressionの値がcase1valの時、case2opを実行し、case2valの時、case2opを実行し、caseNvalの時、caseNopを実行します。expression, 各caseKvalは整数値でなければなりません。C言語と異なり、各caseKop文にbreakを記述する必要はありません。caseKvalに複数のコマンドを記述したい場合は、それらを(doセクションで囲んでください。
(while <expression> <operation>) expressionの値が0以外である限り、operationを実行し続けます。永久ループに陥らないように、いつかは必ずexpressionの値が0になるようにスクリプトを組んでください。万一永久ループに陥った場合は、実行中にESCキーを押すことにより強制終了することができます。operationに複数のコマンドを記述したい場合は、それらを(doセクションで囲んでください。
(forEachEvent <operation>) 選択されているそれぞれのイベントに対して、operationを実行します。forEachEventはネストすることはできません。operationに複数のコマンドを記述したい場合は、それらを(doセクションで囲んでください。
(exit) SALを終了します。
(error) SALを終了します。終了時に"program called error"というエラーメッセージが表示されます。
NIL 何もしないコマンドです。if文のtrue部分などに使います。
SAL定義変数
VERSION R SALのヴァージョンを整数で返します。1.00の場合、100となります。
TIMEBASE R MIDIデータのタイムベースの値を返します。
Now R 現在の演奏位置を返します。
TRUE R 1を返します。
FALSE R 0を返します。
NIL R C言語のNULLと同じです。
SEEK_SET R C言語のSEEK_SETと同じです。
SEEK_END R C言語のSEEK_ENDと同じです。
リテラル定数
-45 整数は、半角の1234567890で記述します。負の値の場合は、最初に-(マイナス)をつけます。
0xF0 整数は、先頭に0xをつけることにより16進表記で記述することも可能です(SAL1.06以降)。
"somestring" 文字列はダブルクォーテーションで囲みます。文字列内にダブルクォーテーションを含ませる場合は、\記号でエスケープします。
ローカル変数定義
(int <varname> [<value>]) 32ビット符号付整数型のvarnameという名のローカル変数を作成し、valueで初期化します。varnameの最初の文字は、半角英字でなければなりません。varnameの2文字目以降は、半角英数でなければなりません。
(string <varname> [<value>]) UTF-16LE文字列型のvarnameという名のローカル変数を作成し、valueで初期化します。varnameの最初の文字は、半角英字でなければなりません。varnameの2文字目以降は、半角英数でなければなりません。
(bytearray <varname> [<value>]) 長さvalueバイトのバイト配列型のvarnameという名のローカル変数を作成し、0で初期化します。varnameの最初の文字は、半角英字でなければなりません。varnameの2文字目以降は、半角英数でなければなりません。
(fileptr <varname> [<value>]) C言語のFILE*と同じく、ファイルへのポインタを作成し、valueで初期化します。varnameの最初の文字は、半角英字でなければなりません。varnameの2文字目以降は、半角英数でなければなりません。
算術演算・比較演算・論理演算など
(! <op1>) op1が真(0以外)のとき、0を返し、op1が偽(0)のとき、1を返します。
(abs <op1>) op1の絶対値を返します。
(+ <op1> <op2>) op1+op2の結果を返します。
(- <op1> <op2>) op1-op2の結果を返します。
(* <op1> <op2>) op1*op2の結果を返します。
(/ <op1> <op2>) op1/op2の結果を返します。
(% <op1> <op2>) op1%op2の結果を返します。
(&& <op1> <op2>) op1&&op2の結果を返します。
(|| <op1> <op2>) op1||op2の結果を返します。
(== <op1> <op2>) op1とop2が等しければ1を、等しくなければ0を返します。
(!= <op1> <op2>) op1とop2が等しくなければ1を、等しければ0を返します。
(<= <op1> <op2>) op1<=op2ならば1を、そうでなければ0を返します
(>= <op1> <op2>) op1>=op2ならば1を、そうでなければ0を返します
(< <op1> <op2>) op1<op2ならば1を、そうでなければ0を返します
(> <op1> <op2>) op1>op2ならば1を、そうでなければ0を返します
(min <op1> <op2>) op1とop2の小さい方を返します。
(max <op1> <op2>) op1とop2の大きい方を返します。
(random <op1> <op2>) op1以上op2以下の乱数を返します。
(clip <op1> <op2> <op3>) op2の値をop1以上op3以下にクリッピングして返します。
数値代入
(= <var> <value>) 変数varにvalueを代入します。これに限り、文字列でも使用可能です。戻り値は未定義であることに注意してください。
(+= <var> <value>) 変数varにvar+valueを代入します。戻り値は未定義であることに注意してください。
(-= <var> <value>) 変数varにvar-valueを代入します。戻り値は未定義であることに注意してください。
(*= <var> <value>) 変数varにvar*valueを代入します。戻り値は未定義であることに注意してください。
(/= <var> <value>) 変数varにvar/valueを代入します。戻り値は未定義であることに注意してください。
(%= <var> <value>) 変数varにvar%valueを代入します。戻り値は未定義であることに注意してください。
(++ <var>) varの値を1上げます。SAL1.06まで戻り値は未定義であることに注意してください。
(-- <var>) varの値を1下げます。SAL1.06まで戻り値は未定義であることに注意してください。
文字列・配列処理関数
(format <string1> [<string2>... <stringN>]) 複数の文字列を連結したものを返します。stringkが数値である場合は、自動的に10進整数表記に置き換わります。
(getAt <op1> <index>) 文字列又はバイト配列op1のindex番目の要素を整数で取得します。
(setAt <op1> <index> <value>) 文字列又はバイト配列op1のindex番目の要素を整数で設定します。
(strlen <op1>) 文字列op1の長さを取得します。
(memlen <op1>) バイト配列op1の長さを取得します。
(strfind <op1> <pattern>) 文字列op1から最初にpatternに一致する箇所のインデックスを取得します。なければ-1を返します。
(memfind <op1> <pattern>) バイト配列op1から最初にpatternに一致する箇所のインデックスを取得します。なければ-1を返します。
(substr <op1> <start> <num>) 文字列op1のstart文字目からnum文字取り出した文字列を返します。
(submem <op1> <start> <num>) バイト配列op1のstartバイト目からnumバイト取り出したバイト配列を返します。
ファイル操作関数(SAL1.07のみ実験的)
(fopen <pszFileName> <pszMode>) MSVCのfopen (pszFileName, pszMode)と同じです。
(fclose <pFile>) MSVCのfclose (pFile)と同じです。
(fseek <pFile> <nOffset> <nOrigin>) MSVCのfseek (pFile, nOffset, nOrigin)と同じです。
(ftell <pFile>) MSVCのftell (pFile)と同じです。
(feof <pFile>) MSVCのfeof (pFile)と同じです。
(fflush <pFile>) MSVCのfflush (pFile)と同じです。
(fputs <pszString> <pFile>) MSVCのfputs (pszString, pFile)と同じです。
(fgets <pszString> <nBufSize> <pFile>) MSVCのfgets (pszString, nBufSize, pFile)と同じです。
(fread <byArray> <nElementSize> <nCount> <pFile>) MSVCのfread (byArray, nElementSize, nCount, pFile)と同じです。
(fwrite <byArray> <nElementSize>, <nCount> <pFile>) MSVCのfwrite (byArray, nElementSize, nCount, pFile)と同じです。
時刻演算関数
(meas <time>) 指定時刻time[tick]の小節番号(1オリジン)を返します。
(beat <time>) 指定時刻time[tick]の拍番号(1オリジン)を返します。
(tick <time>) 指定時刻time[tick]のティック番号(0オリジン)を返します。
(makeTime <measure> <beat> <tick>) 小節measure(1オリジン):拍beat(1オリジン):ティックtick(0オリジン)から、時刻[tick]を返します。
入出力関数
(getInt <varname> <prompt> <min> <max>) ユーザーに整数を入力するよう促すダイアログを表示します。ダイアログにはprompt文字列が表示されます。整数の範囲はmin以上max以下でなければなりません。初期値はvarnameの値で、入力結果はvarnameに格納されます。ユーザーがキャンセルボタンを押した場合、SALは"User Pressed Cancel"と表示して強制終了します。この関数は、ユーザーがOKボタンを押すまで制御を返しません。
(getTime <varname> <prompt>) ユーザーに時刻をM:B:T形式で入力するよう促すダイアログを表示します。ダイアログにはprompt文字列が表示されます。初期値はvarnameの値の時刻で、入力結果はvarnameに時刻で格納されます。時刻については、(meas, (beat, (tick, (makeTimeを参照してください。ユーザーがキャンセルボタンを押した場合、SALは"User Pressed Cancel"と表示して強制終了します。SALは強制終了します。この関数は、ユーザーがOKボタンを押すまで制御を返しません。
(getString <varname> <prompt> <min> <max>) ユーザーに文字列を入力するよう促すダイアログを表示します。ダイアログにはprompt文字列が表示されます。文字列の長さはmin文字以上max文字以下でなければなりません。文字列の初期値はvarnameの値で、入力結果はvarnameに格納されます。ユーザーがキャンセルボタンを押した場合、SALは"User Pressed Cancel"と表示して強制終了します。この関数は、ユーザーがOKボタンを押すまで制御を返しません。
(pause <prompt1> [<prompt2> ... <promptN>]) prompt1...promptNのテキストが表示されたダイアログボックスを表示します。ユーザーがOKを押すと次のコマンドに進みます。ユーザーがキャンセルを押すと、SALは"User Pressed Cancel"と表示して強制終了します。各promptは文字列でも整数でも構いません。この関数は、ユーザーがOKボタンを押すまで制御を返しません。
(message <prompt1> [<prompt2> ... <promptN>]) prompt1...promptNのテキストをステータスバーに表示します。各promptは文字列でも整数でも構いません。この関数は、直ちに制御を返します。
挿入・削除関数
(insert <time> <ch> <kind> <val1> <val2>...) イベントをtimeに挿入します。挿入されるトラックは、forEachEvent内で使われた場合の各イベントの存在するトラックとなり、forEachEventの外で使われた場合現在アクティブなトラックとなります。kindは、TEXTかTRACKNAMEかINSTNAMEかLYRICかMARKERかCUEPOINTかPROGNAMEかDEVNAMEかPORTPREFIXかCHANPREFIXかTEMPOかSMPTEOFFSETかTIMESIGかKEYSIGかSEQSPECかNOTEかKEYAFTかCONTROLかPATCHかCHANAFTかWHEELかSYSXDATAでなければなりません。chはMIDIチャンネル(0~15)を指定します(MIDIチャンネルイベントでない場合は無視)。val1以降は、イベントの種類によります。NOTEの場合、キー、ベロシティ、長さです。KEYAFTの場合、キー、値です。CONTROLの場合、ナンバー、値です。PATCHの場合、プログラムナンバー、バンクです。なお、バンクの値は無視されます。CHANAFTの場合、値です。WHEELの場合、ピッチベンドの値(-8192~8191)を指定します。SYSXDATAの場合、各バイト値を羅列します。
(delete) イベントを削除します。このコマンドは、forEachEvent内でのみ利用可能です。エンドオブトラックイベントは削除できないことに注意してください。一旦削除されたイベントは二度と参照することができません。そのため、このコマンドは、forEachEvent内の最後の行で使ってください。
Event.Kindの値
SEQNUM R シーケンス番号
TEXT R テキスト
COPYRIGHT R 著作権
TRACKNAME R トラック名
INSTNAME R インストゥルメント名
LYRIC R 歌詞
MARKER R マーカー
CUEPOINT R キューポイント
PROGNAME R プログラム名
DEVNAME R デバイス名
CHANPREFIX R チャンネルプリフィックス
PORTPREFIX R ポートプリフィックス
EOT R エンドオブトラック
TEMPO R テンポ
SMPTEOFFSET R SMPTEオフセット
TIMESIG R 拍子記号
KEYSIG R 調号
SEQSPEC R シーケンサー独自のイベント
NOTE R ノート
KEYAFT R キーアフタータッチ
CONTROL R コントロールチェンジ
PATCH R プログラムチェンジ
CHANAFT R チャンネルアフタータッチ
WHEEL R ピッチベンド
SYSXDATA R システムエクスクルーシヴ
forEachEvent内で使える変数
Event.Kind R イベントの種類を返します。上記の値のいずれかとなります。この値は読み取り専用です。
Event.Time R/W イベントの時刻をティック単位(SMPTEベースにおいてはサブフレーム単位)で取得/設定します。エンドオブトラックイベントを他のイベントより前の時刻に設定することはできません。
Event.Chan R/W イベントのチャンネル(0~15)を取得/設定します。これはMIDIチャンネルイベント(ノート・キーアフタータッチ・コントロールチェンジ・プログラムチェンジ・チャンネルアフタータッチ・ピッチベンド)に対してのみ有効です。その他の種類のイベントに対して使用した場合の動作は未定義です。
Event.Text R/W イベントのテキストをUTF16-LE文字列形式で取得/設定します。これはテキスト系イベント(テキスト・著作権・トラック名・楽器名・歌詞・マーカー・キューポイント・デバイス名・プログラム名イベント)に対してのみ有効です。その他の種類のイベントに対して使用した場合の動作は未定義です。MIDIデータの文字コードに対応していない文字を設定しようとした場合の動作は未定義です。
Event.Track R/W イベントの所属するトラック番号(1~65536)を取得/設定します。フォーマット1のMIDIデータにおいては、テンポ・拍子記号・調号・SMPTEオフセットイベントは、最初のトラックのみ設置可能です。MIDIチャンネルイベント(ノート・キーアフタータッチ・コントロールチェンジ・プログラムチェンジ・チャンネルアフタータッチ・ピッチベンド)は、第二トラック以降のみ設置可能です。例えばノートイベントを最初のトラックに移動するなど、不正なトラックに移動を行った場合、又は存在しないトラックに設置しようとした場合、このコマンドは何もしません。また、エンドオブトラックイベントを他のトラックに移動することはできません。
Tempo.Val R/W テンポの値を取得/設定します。単位はBPM(1分当たりの4分音符の数)を100倍したものです。
SmpteOffset.Mode R/W SMPTEオフセットのタイムモード(0~3)を取得/設定します。
SmpteOffset.Hour R/W SMPTEオフセットの時(0~23)を取得/設定します。
SmpteOffset.Min R/W SMPTEオフセットの分(0~59)を取得/設定します。
SmpteOffset.Sec R/W SMPTEオフセットの秒(0~59)を取得/設定します。
SmpteOffset.Frame R/W SMPTEオフセットのフレーム(0~29)を取得/設定します。
SmpteOffset.SubFr R/W SMPTEオフセットのサブフレーム(0~99)を取得/設定します。
TimeSig.Num R/W 拍子記号の分子(1~255)を取得/設定します。なおこの値は楽譜の外見のみに影響を与え、演奏内容には影響を及ぼしません。
TimeSig.Den R/W 拍子記号の分母を取得/設定します。値は1,2,4,8,16,32のいずれかでなければなりません。なおこの値は楽譜の外見のみに影響を与え、演奏内容には影響を及ぼしません。
TimeSig.Clo R/W 拍子記号の四分音符あたりのクロック数を取得/設定します。通常この値は24です。なおこの値は楽譜の外見のみに影響を与え、演奏内容には影響を及ぼしません。
TimeSig.Blo R/W 拍子記号の四分音符あたりの32分音符の数を取得/設定します。通常この値は8です。なおこの値は楽譜の外見のみに影響を与え、演奏内容には影響を及ぼしません。
KeySig.Sf R/W 調号のシャープの数又はフラットの数を取得/設定します。値が正のときはシャープの数、負のときはフラットの数です。例えばホ長調の場合#が4つなので4となります。なおこの値は楽譜の外見のみに影響を与え、演奏内容には影響を及ぼしません。
KeySig.Mi R/W 調号のメイジャー(0)かマイナー(1)かを取得/設定します。例えばハ短調の場合1となります。なおこの値は楽譜の外見のみに影響を与え、演奏内容には影響を及ぼしません。
SeqSpec.Data R/W シーケンサ独自のイベントのデータをバイト配列形式で取得/設定します。
Note.Key R/W ノートイベントのキー(0~127)を取得/設定します。
Note.Vel R/W ノートイベントのベロシティ(1~127)を取得/設定します。
Note.Dur R/W ノートイベントの長さ(1~65535)を取得/設定します。
KeyAft.Key R/W キーアフタータッチイベントのキー(0~127)を取得/設定します。
KeyAft.Val R/W キーアフタータッチイベントの値(0~127)を取得/設定します。
Control.Num R/W コントロールチェンジイベントのナンバー(CC#)(0~127)を取得/設定します。
Control.Val R/W コントロールチェンジイベントの値(0~127)を取得/設定します。
Patch.Val R/W プログラムチェンジイベントの値(0~127)を取得/設定します。
Patch.Bank R/W パッチチェンジイベント(CC#0+CC#32+プログラムチェンジイベントを結合したもの)のバンク(0~16383)を取得/設定します。通常のプログラムチェンジイベントに対して使うと無視されます。
ChanAft.Val R/W チャンネルアフタータッチイベントの値(0~127)を取得/設定します。
Wheel.Val R/W ピッチベンドの値(-8192~8191)を取得/設定します。
Sysx.Data R/W システムエクスクルーシヴイベントのデータをバイト配列形式で取得/設定します。
SAL0.5以降でサポートされたコマンド
(sendMIDI <port> <ch> <kind> <val1> <val2>...) MIDIメッセージを指定番号のポート(0~15)に送信します。kindは、NOTEかKEYAFTかCONTROLかPATCHかCHANAFTかWHEELかSYSXDATAでなければなりません。chはMIDIチャンネル(0~15)を指定します(MIDIチャンネルイベントでない場合は無視)。val1以降は、イベントの種類によります。NOTEの場合、キー、ベロシティです。KEYAFTの場合、キー、値です。CONTROLの場合、ナンバー、値です。PATCHの場合、プログラムナンバーのみです。CHANAFTの場合、値のみです。WHEELの場合、MSBとLSBを指定します。SYSXDATAの場合、先頭の240(0xF0)を含む各バイト値を羅列します。
(delay <millisec>) 指定ミリ秒間何もせず待機します。


(C)2017-2022 くず All rights reserved.