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 解析器实现

Download history 12/week @ 2024-03-29 4/week @ 2024-04-05

每月64次下载

Apache-2.0

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