#midi #real-time #music #memory-safe #codec

no-std wmidi

MIDI解析库

22个稳定版本 (4个主要版本)

使用旧的Rust 2015

4.0.10 2023年12月20日
4.0.8 2023年8月30日
4.0.6 2021年5月14日
4.0.4 2021年2月18日
0.2.0 2018年1月22日

#1 in #realtime

Download history 581/week @ 2024-04-23 442/week @ 2024-04-30 279/week @ 2024-05-07 185/week @ 2024-05-14 114/week @ 2024-05-21 120/week @ 2024-05-28 207/week @ 2024-06-04 91/week @ 2024-06-11 79/week @ 2024-06-18 75/week @ 2024-06-25 140/week @ 2024-07-02 47/week @ 2024-07-09 402/week @ 2024-07-16 165/week @ 2024-07-23 451/week @ 2024-07-30 187/week @ 2024-08-06

1,215 每月下载量
2 个crate中(通过 lv2-midi)使用

MIT 许可证

80KB
1.5K SLoC

WMIDI

MIDI编码和解码库。

crates.io docs.rs

License: MIT Build Status

用法

use std::convert::TryFrom;

// Decoding messages from bytes.
fn handle_midi_message(bytes: &[u8]) -> Result<(), wmidi::FromBytesError> {
    let message = wmidi::MidiMessage::try_from(bytes)?;
    if let wmidi::MidiMessage::NoteOn(_, note, val) = message {
        let volume = u8::from(val) as u8 / 127.0;
        println!("Singing {} at volume {}", note, volume);
    }
    Ok(())
}

// Encoding messages to bytes.
fn midi_to_bytes(message: wmidi::MidiMessage<'_>) -> Vec<u8> {
    let mut bytes = vec![0u8; message.bytes_size()];
    message.copy_to_slice(bytes.as_mut_slice()).unwrap();
    bytes
}

特性

  • 支持 no_std 环境。
  • 解析和编码过程中没有内存分配(因此实时安全)。
  • 除了 MidiMessage::OwnedSysEx 之外,创建 MidiMessage 时没有内存分配。

测试和基准测试

  • 使用 cargo build 构建。
  • 使用 cargo test 进行测试。
  • 使用 cargo bench 进行基准测试。结果将在 ./target/criterion/report/index.html 下。

变更日志

4.0.0

  • 引入了新的 ControlFunction 类型,它简单地包装了一个U7。
  • 为所有 ControlFunction 值提供了常量和文档。
  • 重新编号Note枚举/常量,使其与midi更一致;例如,C0现在是C1。

3.1.0

  • MidiMessage::wire_size() 重命名为 MidiMessage::bytes_size()
  • 引入了 MidiMessage::copy_to_slice() 方法。

3.0.0

  • U7和U14的实例现在有边界检查。
  • 现在Note是一个枚举而不是u8。可以使用 Note::try_fromu8::from 进行转换。

没有运行时依赖