Skip to content

Instantly share code, notes, and snippets.

@susisu
Created December 25, 2013 08:50
Show Gist options
  • Save susisu/8121493 to your computer and use it in GitHub Desktop.
Save susisu/8121493 to your computer and use it in GitHub Desktop.
DOL 仕様書

Dancing☆Onigiri 譜面記述言語「DOL」仕様

2013 Dec 25 version 0.1

Copyright(C) Susisu, All rights reserved.

目次

  1. 概要
  2. 文法
  3. データ型
  4. ヘッダ関数
  5. 関数
  6. Dolce拡張ヘッダ関数

1.概要

「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です、というのは後付けの理由。

2.文法

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; BA を実行した後、B を実行します。

逆順セパレータ : が命令の間にある場合、実行順が入れ替わります。 例えば A : B は B, A の順、 A : B : C は C, B, A の順に実行されます。

ヘッダ部はメタ関数の命令からなります。ヘッダ部はファイルの先頭に記述され、それ以外の命令が出現した後には記述することができません。

コメントは -- の後に記述します。家に帰るまで改行までがコメントです。

3.データ型

文字列

ダブルクオーテーション "" で囲まれた文字列です。エスケープ(\t \r \n 等)を使用することもできます。

"foobar" "hoge\tfuga" "\u2200"

数値

倍精度浮動小数点数です。

1 2.0 -0.4E+8

関数

命令を表します。上の例で spd bst $ 等は関数への参照となっています。

4.ヘッダ関数

#define

#define <name:string> <value:*>

name で指定した名前に value の値を割り当てます。

#define "piyo" 2
#init 5 piyo -- == #init 5 2

#init

#init <cols:number> <types:number>

譜面のキー数、およびノートの種類を指定します。 例えば 5key, 通常矢印とフリーズアローを使用する場合は #init 5 2 となります。

#version

#version <version:number>

DOL のバージョンを指定します。 バージョンが異なると警告が出ます。問題が発生する可能性があるため、変更点を確認して下さい。

5.関数

() 内の短縮名も使用可能です。

boost (bst)

boost <boost:number>

個別変速を指定します。変速はその時点でなく、それ移行のノートに対して適用されることに注意して下さい。

bpm

bpm <bpm:number>

曲のBPMを指定します。1 beat == 4分音符 です。

defer (def)

defer <n:number>

ノートの設置を n 分音符の分だけ遅延させます。0を指定した場合、遅延は0になります。 負の値も使用した場合、ノートの設置がその分だけ先行されます。

deferF (defF)

deferF <frame:number>

ノートの設置を frame フレームだけ遅延させます。

deferS (defS)

deferS <sec:number>

ノートの設置を sec 秒だけ遅延させます。

feed (\)

feed

拍を進めます。要は休符です。

frame (frm)

frame <frame:number>

現在のフレーム位置を指定します。

length (len)

length <n:number>

拍の長さを n 分音符の長さに変更します。

line ($)

line [...:number]

拍をまとめて記述します。 例えば、$ 1 0 0 1 0 とした場合、1 列にノート 14 列にノート 1 を置き、拍を進めます。 0#init で指定した範囲外の値を与えた場合は何も行いません。

metronome (mn)

metronome <col:number> <type:number> <times:number>

col 列に type ノートを times 回設置します。所謂4分間隔譜面を作成できます。

put (@)

put <col:number> <type:number>

col 列に type ノートを設置します。拍は進めません。

speed (spd)

speed <speed:number>

全体速度変化を指定します。

stop

stop

ストップです。speed 0 と等価です。

time

time <sec:number>

現在位置を秒単位で指定します。

Dolce拡張ヘッダ関数

#header

#header <name:string> <value:string>

譜面のヘッダ情報を書き出します。 例えば、#header "tuning" "Susisu" 等。

#merge

#merge <path:string>

path で指定したファイルの中身を譜面の最後に書き出します。複数譜面を作成する場合に使用すると便利かもしれません。

#override

#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"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment