#minecraft #music #file-format #read-write #nbs

rsnbs

OpenNBS .nbs 格式的 IO 功能

3 个版本

0.1.2 2024年7月2日
0.1.1 2024年6月25日
0.1.0 2024年6月22日

#102游戏

MIT 许可证

22KB
369

rsnbs

GitHub Actions crates.io Rust Version Code style: rustfmt

一个简单的 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