3 个版本
0.1.2 | 2024年7月2日 |
---|---|
0.1.1 | 2024年6月25日 |
0.1.0 | 2024年6月22日 |
#102 在 游戏
22KB
369 行
rsnbs
一个简单的 Rust 库,用于读取和写入来自 Open Note Block Studio 的 .nbs 文件。
rsnbs
具有与 pynbs
相同的所有功能,例如迭代 Note Block Studio 歌曲
use rsnbs::read_nbs;
let song = read_nbs("song.nbs");
for note in song.notes {
println!("tick: {}, instrument: {}", note.tick.unwrap(), note.instrument.unwrap())
}
或通过编程生成新歌曲
use rsnbs::{Song, Note};
let song = Song::default();
for i in 0..10 {
Song.notes.push(Note {
tick: Some(i), layer: None, instrument: None,
velocity: 30, panning: None, pitch: None, key: Some(i+35)
})
}
主要区别在于每个字段都是一个选项(为了版本差异起见),其中 None 作为 0/""。
安装
可以使用 cargo
安装此软件包
$ cargo install rsnbs
读取 / 写入
您可以使用 read_nbs 函数读取并解析任何版本的特定 NBS 文件。
let song = rsnbs::read_nbs("song.nbs");
这返回一个 rsnbs::Song 对象,然后可以使用 Song::save 来写入
song.save("song.nbs", version);
Song 结构体
Song 实现了 Default 特性,因此您可以创建一个默认实例,具有 1 层和所有 None 字段
let song = Song::default();
字段
头部
第一个字段是 header
,文件头部,类型为结构体 Header
属性 | 类型 | 详细信息 |
---|---|---|
头部.版本 |
i8 |
文件保存的 NBS 版本。 |
头部.default_instruments |
i8 |
歌曲中来自原始 Minecraft 的乐器数量。 |
头部.song_length |
i16 |
歌曲长度,以节拍为单位。 |
头部.song_layers |
i16 |
至少有一个音符块的最后层 ID。 |
头部.song_name |
String |
歌曲名称。 |
头部.song_author |
String |
歌曲作者。 |
头部.original_author |
String |
歌曲原始作者。 |
头部.description |
String |
歌曲描述。 |
头部.tempo |
i16 |
歌曲速度乘以 100。 |
头部.auto_save |
bool |
是否启用了自动保存。 |
头部.auto_save_duration |
i8 |
每次自动保存之间的分钟数。 |
头部.time_signature |
i8 |
歌曲的拍号。 |
头部.minutes_spent |
i32 |
在项目上花费的分钟数。 |
头部.left_clicks |
i32 |
用户左键点击的次数。 |
头部.right_clicks |
i32 |
用户右键点击的次数。 |
头部.blocks_added |
i32 |
用户添加块的数量。 |
头部.blocks_removed |
i32 |
用户移除块次数。 |
头部.song_origin |
String |
原始MIDI或电路图的文件名。 |
头部.loop |
bool |
歌曲结束后是否应循环回起始处。 |
头部.max_loop_count |
i8 |
循环次数。0 = 无限。 |
头部.loop_start |
i16 |
歌曲播放结束时循环回的tick。 |
笔记
notes
字段按照顺序存储了所有类型的struct Note
笔记。
属性 | 类型 | 详细信息 |
---|---|---|
note.tick |
i32 |
音符播放的tick。 |
note.layer |
i32 |
音符放置的层的ID。 |
note.instrument |
i8 |
乐器ID。 |
note.key |
i8 |
音符的键。 (介于0和87之间) |
note.velocity |
i8 |
音符的力度。 (介于0和100之间) |
note.panning |
u8 |
音符的立体声声像。 (介于-100和100之间) |
note.pitch |
i16 |
音符的微调,以分贝为单位。 (介于-1200和1200之间) |
层
layers
字段是按照顺序存储的所有层的struct Layer
的vec。
属性 | 类型 | 详细信息 |
---|---|---|
layer.name |
String |
层的名称。 |
layer.lock |
bool |
层是否被锁定。 |
layer.volume |
i8 |
层的音量。 |
layer.panning |
u8 |
层的立体声声像。 |
乐器
instruments
字段按照顺序存储了歌曲中的所有自定义乐器,在一个vec中。
属性 | 类型 | 详细信息 |
---|---|---|
instrument.name |
String |
乐器名称。 |
instrument.file |
String |
乐器声音文件的名称。 |
instrument.pitch |
i8 |
乐器音调。 (介于0和87之间) |
instrument.press_key |
bool |
当标记经过时,钢琴是否应自动按下乐器的键。 |
依赖项
~165KB