10个版本 (6个破坏性)
0.7.1 | 2024年5月6日 |
---|---|
0.7.0 | 2024年4月22日 |
0.6.1 | 2024年3月13日 |
0.5.0 | 2023年12月9日 |
0.1.0 | 2021年3月3日 |
#61 in 音频
每月下载量 173次
在 7 个 库中使用 (5 直接)
330KB
7.5K SLoC
midi-msg
midi-msg旨在成为MIDI 1.0详细规范及其许多扩展和补充的完整表示,以允许将MIDI字节流序列化和反序列化为类型表示。未来可能支持MIDI 2.0。
midi-msg类型遵循MIDI规范中详细说明的分类,并旨在完全安全地可序列化。也就是说,任何MidiMsg
都可以序列化为有效的MIDI字节序列。同样,由于它力求完整,任何有效的MIDI字节序列都可以反序列化为MidiMsg
。由此产生的一个推论是,“类似MIDI”的消息如果不遵循规范,则大多无法表示。此外,midi-msg还力求通过类型来捕捉MIDI的语义含义,而不仅仅是“字节包”。任何非数值原子值都将根据其含义表示。尽管如此,MIDI所取得的大部分成果都是基于传递数值,因此它们按照以下方法处理。
由于MIDI规范大量使用非字节对齐的整数,Rust的表示可以通过引入“奇特”的整数类型或将Rust的原始类型限制在所需范围内来实现。为了便于使用,采用了后一种方法,但这确实使得这种类型表示略微“有损”。这些表示之间的任何溢出都处理为最大值(或最小值,对于负有符号值)。有关这些设计决策的其他方法,可以在下面的库中找到。
安装
将以下行添加到您的Cargo.toml文件中
midi-msg = "0.7"
如果想在 no_std
环境中使用 midi-msg,请添加以下行
midi-msg = { version = "0.7", default-features = false, features=["sysex"/"file"] }
禁用系统专用或MIDI文件功能
默认的 sysex
和 file
Cargo 功能可以被禁用,以排除与系统专用或标准MIDI文件(SMF)功能相关的代码,这有助于在资源受限的环境中减小二进制文件大小。如果未使用 sysex
并尝试解析系统专用消息,将返回错误。
待实现
- 大多数
UniversalRealTimeMsg
和UniversalNonRealTimeMsg
的反序列化
支持
以下由以下 MIDI制造商协会(MMA)文件 描述的MIDI消息得到支持(如注解,包括相应的MIDI制造商协会[MMA]出版物编号、推荐实践[RP]编号或更改/添加[CA]编号)
- MIDI 1.0 详细规范 4.2.1(基础规范。除非另有说明,否则应假设所有类型都由本文件定义)
- 标准MIDI文件 1.0(RP-001)
- MIDI时间码(MTC)(MMA-001 / RP-004 / RP-008)
- 通用MIDI系统级1(GM1)(MMA-007 / RP-003)
- 通用MIDI 2 1.2(GM2)(RP-024/RP-036/RP-037/RP-045)
- 文件引用系统专用消息(CA-018)
- 样本转储大小、速率和名称扩展(CA-019)
- MIDI调音更新规范(CA-020/CA-021/RP-020)
- 控制器目标设置(CA-022)
- 基于键的乐器控制器(CA-023)
- 全局参数控制(CA-024)
- 主精确/粗调音(CA-025)
- 调制深度范围RPN(CA-026)
- 文件引用Sysex消息的扩展00-01(CA-028)
- CC #88 高分辨率速度前缀(CA-031)
- 对数据增/减控制器的响应(RP-018)
- 声音控制器默认设置(RP-021)
- RPN 01/02的重新定义(RP-022)
- CC91和CC93的重命名(RP-023)
- 三维声音控制器(RP-049)
- MIDI多声部表达1.0(RP-053)
以下附录目前尚不支持midi-msg,尽管提供了钩子以访问这些消息
- MIDI机器控制1.0(MMC)(MMA-016 / RP-013)(部分支持)
- MIDI演出控制1.1.1(MSC)(RP-002/RP-014)
- SMF设备名称和程序名称元事件(RP-019)
- SMF XMF补丁类型前缀元事件(RP-032)
以下附录已参考,但被认为与该库无关
- SMF歌词事件定义(RP-017)
- 对重置所有控制器的响应(RP-018)
- SMF语言和显示扩展(RP-026)
- 默认声像公式(RP-036)
其他Rust MIDI表示库
探索
如果您想查看midi-msg如何解释接收到的消息的结果,您可以查看此存储库并运行以下命令以使用修改后的 midir
的 test_read_input
示例。
cargo run --example test_read_input
这将生成类似以下输出
1816489080: ChannelVoice { channel: Ch1, msg: NoteOn { note: 62, velocity: 59 } }
1816643991: ChannelVoice { channel: Ch1, msg: NoteOff { note: 62, velocity: 53 } }
请注意,midir
作为开发依赖项安装,并且这不会对指定此crate作为依赖项时使用 midir
产生任何要求。
贡献
拉取请求 对于上面列出的尚未支持的功能、错误修复(任何规范中的遗漏都被认为是错误)或文档补充都是最受欢迎的,同样欢迎 错误报告。
变更日志
- 0.7
- 增加了“简单”CC反序列化并使其成为默认设置。请参阅RecieverContext和ControlChange。这将对
ControlChange::Undefined
和ControlChange::UndefinedHighRes
进行重命名,分别改为ControlChange::CC
和ControlChange::CCHighRes
。 - 为
MidiMsg
添加了is_*
谓词(即is_note
)。 - 为
Track::len
和Track::events
方法添加了支持。
- 增加了“简单”CC反序列化并使其成为默认设置。请参阅RecieverContext和ControlChange。这将对
- 0.6
- 添加了对MIDI文件(SMF)的支持
依赖项
~220–500KB
~11K SLoC