16个不稳定版本 (3个破坏性更新)
0.4.4 | 2023年11月9日 |
---|---|
0.4.3 | 2023年10月8日 |
0.3.0 | 2023年4月17日 |
0.2.0 | 2023年3月22日 |
0.1.3 | 2021年12月19日 |
#641 in 解析器实现
每月64次下载
105KB
2K SLoC
bms-rs
BMS格式解析器。
Be-Music Source,简称BMS,是由Urao Yane于1998年为Konami的游戏Beatmania模拟器设计的文件格式。它描述了音符的排列方式和音乐元数据。它是一个以“#
”字符开始的“命令”行纯文本文件。
用法
首先,您可以使用lex::parse
获取令牌流。然后将其和随机生成器传递给parse::Bms::from_token_stream
以获取音符数据。因为BMS格式有一些随机化的语法。
use bms_rs::{
lex::parse,
parse::{rng::RngMock, Bms},
};
let source = std::fs::read_to_string("tests/lilith_mx.bms").unwrap();
let token_stream = parse(&source).expect("must be parsed");
let rng = RngMock([1]);
let bms = Bms::from_token_stream(&token_stream, rng).expect("must be parsed");
关于格式
命令
每个命令以“#
”字符开始,其他行将被忽略。一些命令需要用空格或制表符等空白字符分隔的参数。
#PLAYER 1
#GENRE FUGA
#TITLE BAR(^^)
#ARTIST MikuroXina
#BPM 120
#PLAYLEVEL 6
#RANK 2
#WAV01 hoge.WAV
#WAV02 foo.WAV
#WAV03 bar.WAV
#00211:0303030303
头部命令
头部命令用于表示音乐的元数据或音符排列的定义。
消息命令
消息命令以“#XXXYY:ZZ...
开始。其中,XXX
是小节号,YY
是消息通道,ZZ...
是对象ID序列。
小节必须从1开始,但某些玩家可能允许0小节(例如,Lunatic Rave 2)。
通道通常表示音符应排列到的通道。
对象ID由36进制([0-9a-zA-Z]
)整数组成。因此,序列长度必须是偶数。00对象ID是特殊ID,表示剩余(没有对象)。对象位于小节中对象数量均等的位置上。例如
#00211:0303000303
这将放置为
003|--|--------------|
| |03 |
| |03 |
| | |
| |03 |
002|--|03------------|
| | [] [] [] |
|()|[] [] [] []|
|-----------------|
依赖项
~1.1–1.9MB
~40K SLoC