2013 Dec 25 version 0.1
Copyright(C) Susisu, All rights reserved.
- 概要
- 文法
- データ型
- ヘッダ関数
- 関数
- Dolce拡張ヘッダ関数
「DOL」はDancing☆Onigiriの譜面を記述するための言語です。 既存のGUIのエディタよりも柔軟に譜面を作れるように(あと構文解析が楽なように)設計したつもりです。
見た目は大体こんな感じです。
#init 5 2
bpm 204.65
spd 1.0
bst 1.0
frm 241; len 4 -- ちくパちくパ
$ 1 0 0 0 0
$ 0 0 0 1 0
$ 0 0 0 1 0
$ 1 0 0 0 0
$ 0 0 0 1 0
$ 0 0 0 1 0
len 8 -- ちくわのパフェなんだよ
$ 1 0 0 0 0
$ 0 1 0 0 0
$ 1 0 0 0 0
\
$ 0 1 0 0 0
\
$ 0 0 0 1 0
$ 0 0 1 0 0
$ 1 0 0 0 0
\
$ 0 1 0 0 0
\
めっちゃ $
を使うのでDOLです、というのは後付けの理由。
DOL は以下の(形式的な)BNFで定義されます(たぶん)(めんどくさいから終端記号は正規表現です)。
dol ::= opt-whitespace (separator | reverser | operation)* eof
opt-whitespace ::= (whitespace | comment)*
whitespace ::= /[ \f\t]/
comment ::= /\-\-.*(?=[\n\r\v])/
separator ::= (/[\n\r\v;]/ opt-whitespace)+
reverser ::= (/\:/ opt-whitespace)+
operation ::= (identifier | meta-identifier) (value opt-whitespace)*
value ::= identifier | string | number
id-name ::= /[^ \f\n\r\t\v;:#\".,+-\d][^ \f\n\r\t\v;:#\".,+-]*/
identifier ::= id-name
meta-identifier ::= "#" id-name
string ::= /\"(\\(u[\dA-Fa-f]{4}|[^u\f\n\r\v])|[^\\\"\f\n\r\v])*\"/
number ::= /\-?(\d+(\.\d+)?|\.\d+)([Ee][\+\-]?\d+)?/
命令(operation)はセパレータ(1つ以上の改行または ;
)で区切られ、最左の関数に右側のパラメータを適用します。
命令は指定がない場合は上、左から順に実行されます。
例えば f a b
は 関数 f
にパラメータ a
b
を適用します。A; B
は A
を実行した後、B
を実行します。
逆順セパレータ :
が命令の間にある場合、実行順が入れ替わります。
例えば A : B
は B, A の順、 A : B : C
は C, B, A の順に実行されます。
ヘッダ部はメタ関数の命令からなります。ヘッダ部はファイルの先頭に記述され、それ以外の命令が出現した後には記述することができません。
コメントは --
の後に記述します。家に帰るまで改行までがコメントです。
ダブルクオーテーション ""
で囲まれた文字列です。エスケープ(\t
\r
\n
等)を使用することもできます。
"foobar"
"hoge\tfuga"
"\u2200"
倍精度浮動小数点数です。
1
2.0
-0.4E+8
命令を表します。上の例で spd
bst
$
等は関数への参照となっています。
#define <name:string> <value:*>
name
で指定した名前に value
の値を割り当てます。
#define "piyo" 2
#init 5 piyo -- == #init 5 2
#init <cols:number> <types:number>
譜面のキー数、およびノートの種類を指定します。
例えば 5key, 通常矢印とフリーズアローを使用する場合は #init 5 2
となります。
#version <version:number>
DOL のバージョンを指定します。 バージョンが異なると警告が出ます。問題が発生する可能性があるため、変更点を確認して下さい。
() 内の短縮名も使用可能です。
boost <boost:number>
個別変速を指定します。変速はその時点でなく、それ移行のノートに対して適用されることに注意して下さい。
bpm <bpm:number>
曲のBPMを指定します。1 beat == 4分音符 です。
defer <n:number>
ノートの設置を n
分音符の分だけ遅延させます。0を指定した場合、遅延は0になります。
負の値も使用した場合、ノートの設置がその分だけ先行されます。
deferF <frame:number>
ノートの設置を frame
フレームだけ遅延させます。
deferS <sec:number>
ノートの設置を sec
秒だけ遅延させます。
feed
拍を進めます。要は休符です。
frame <frame:number>
現在のフレーム位置を指定します。
length <n:number>
拍の長さを n
分音符の長さに変更します。
line [...:number]
拍をまとめて記述します。
例えば、$ 1 0 0 1 0
とした場合、1
列にノート 1
、4
列にノート 1
を置き、拍を進めます。
0
や #init
で指定した範囲外の値を与えた場合は何も行いません。
metronome <col:number> <type:number> <times:number>
col
列に type
ノートを times
回設置します。所謂4分間隔譜面を作成できます。
put <col:number> <type:number>
col
列に type
ノートを設置します。拍は進めません。
speed <speed:number>
全体速度変化を指定します。
stop
ストップです。speed 0
と等価です。
time <sec:number>
現在位置を秒単位で指定します。
#header <name:string> <value:string>
譜面のヘッダ情報を書き出します。
例えば、#header "tuning" "Susisu"
等。
#merge <path:string>
path
で指定したファイルの中身を譜面の最後に書き出します。複数譜面を作成する場合に使用すると便利かもしれません。
#override <col:number> <type:number> <name:string>
譜面の書き出し時のデータの名前を変更します。
デフォルトは data1_1=...
のような非常に合理的な名前で書き出されるため、それを上書きする際に使用します。
5keyの場合は以下のものを使用すると一般的なソースに互換性のある譜面を書き出すことができます。
#override 1 1 "left_data"
#override 2 1 "down_data"
#override 3 1 "up_data"
#override 4 1 "right_data"
#override 5 1 "space_data"
#override 1 2 "frzLeft_data"
#override 2 2 "frzDown_data"
#override 3 2 "frzUp_data"
#override 4 2 "frzRight_data"
#override 5 2 "frzSpace_data"