在 Rust 中解析 MIDI 消息

主要观点:作者在一个使用 MIDI 的糟糕项目上工作,选择使用现有库 [midir] 连接设备和接收消息,但因想理解 MIDI 而决定自己实现通信协议。介绍了 MIDI 的定义、历史、基本工作原理(包括消息类型、结构等),以及如何用 Rust 实现 MIDI 解析器(包括定义各种消息结构和对应的解析函数),最后提到该代码暂未开源且不建议使用,还有其他更好的库可供选择,若对 MIDI 或 Rust 有有趣的成果可联系作者。

关键信息:

  • MIDI 是 Musical Instrument Digital Interface 标准,1983 年发布首个设备,虽有新功能添加但核心未变,仍广泛使用。
  • MIDI 消息基本单位是一个状态字节后跟若干数据字节,分为语音消息、系统通用消息和系统实时消息等类别。
  • 用 Rust 实现 MIDI 解析器时定义了各种消息结构枚举和对应的解析函数,如 voice 消息的解析较为复杂,包含多种情况。
  • 代码暂未开源,不建议使用,有其他更好的 MIDI 库。

重要细节:

  • 不同 MIDI 消息的状态字节范围和数据字节含义不同,如语音消息的状态字节前四位表示消息类别,后四位表示通道。
  • 系统实时消息简单但放置位置随意,会使解析更复杂。
  • 实现解析器时使用了 parser combinator 方法,定义了多个辅助函数来处理不同情况的消息解析。
  • 系统通用消息中的 SysEx 消息长度不固定,以特定字节结束。
  • 代码中存在一些待办事项(如实现运行状态)和注释说明(如关于 CV/gate 的信息等)。
阅读 8
0 条评论