#midi #byte-stream #music #smf #byte-sequences

无std midi-msg

这是一个完整的MIDI 1.0详细规范及其许多扩展和补充的表示,允许将MIDI字节流序列化和反序列化为类型表示

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 音频

Download history 46/week @ 2024-04-27 177/week @ 2024-05-04 48/week @ 2024-05-11 62/week @ 2024-05-18 24/week @ 2024-05-25 35/week @ 2024-06-01 27/week @ 2024-06-08 51/week @ 2024-06-15 41/week @ 2024-06-22 15/week @ 2024-06-29 44/week @ 2024-07-06 23/week @ 2024-07-13 16/week @ 2024-07-20 114/week @ 2024-07-27 22/week @ 2024-08-03 17/week @ 2024-08-10

每月下载量 173次
7 库中使用 (5 直接)

MIT 许可证

330KB
7.5K SLoC

midi-msg

Crates.io Docs.rs

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文件功能

默认的 sysexfile Cargo 功能可以被禁用,以排除与系统专用或标准MIDI文件(SMF)功能相关的代码,这有助于在资源受限的环境中减小二进制文件大小。如果未使用 sysex 并尝试解析系统专用消息,将返回错误。

待实现

  • 大多数 UniversalRealTimeMsgUniversalNonRealTimeMsg 的反序列化

支持

以下由以下 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如何解释接收到的消息的结果,您可以查看此存储库并运行以下命令以使用修改后的 midirtest_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反序列化并使其成为默认设置。请参阅RecieverContextControlChange。这将对ControlChange::UndefinedControlChange::UndefinedHighRes进行重命名,分别改为ControlChange::CCControlChange::CCHighRes
    • MidiMsg添加了is_*谓词(即is_note)。
    • Track::lenTrack::events方法添加了支持。
  • 0.6
    • 添加了对MIDI文件(SMF)的支持

依赖项

~220–500KB
~11K SLoC