#midi #parser #codec #encoding #buffer #no-std

no-std midly

适用于.mid文件和实时MIDI事件的快速MIDI解码器和编码器

14个版本

0.5.3 2023年1月1日
0.5.2 2021年6月15日
0.5.1 2020年11月1日
0.4.0 2020年2月1日
0.1.3 2018年2月2日

#19 in 音频

Download history 515/week @ 2024-03-13 575/week @ 2024-03-20 774/week @ 2024-03-27 809/week @ 2024-04-03 500/week @ 2024-04-10 1090/week @ 2024-04-17 616/week @ 2024-04-24 533/week @ 2024-05-01 577/week @ 2024-05-08 674/week @ 2024-05-15 530/week @ 2024-05-22 826/week @ 2024-05-29 611/week @ 2024-06-05 582/week @ 2024-06-12 515/week @ 2024-06-19 406/week @ 2024-06-26

2,268 每月下载量
27 个crates(23个直接) 中使用

无许可证

170KB
3.5K SLoC

Midly

Midly是一个功能齐全的MIDI解码器和编码器,旨在提高效率和易于使用。

有关示例、详细文档和可用的cargo功能,请参阅crate级文档

特性

  • 支持both .mid文件和实时MIDI数据包。
  • 非常完整,支持在读取和写入时处理MIDI规范中的所有边缘情况。
  • 简单的API,只需加载您的数据并调用Smf::parseLiveEvent::parse
  • 可选的no_std和noalloc支持。
  • 零拷贝,所有MIDI类型仅引用原始缓冲区。
  • 快速!请参阅下方的速度部分。

入门

首先,将以下行添加到您的Cargo.toml文件中的[dependencies]部分

midly = "0.5"

然后在crate根目录中使用Smf类型

// Load bytes first
let data = std::fs::read("Pi.mid").unwrap();

// Parse the raw bytes
let mut smf = midly::Smf::parse(&data).unwrap();

// Use the information
println!("midi file has {} tracks!", smf.tracks.len());

// Modify the file
smf.header.format = midly::Format::Sequential;

// Save it back
smf.save("PiRewritten.mid").unwrap();

或者使用LiveEvent类型来解析实时MIDI事件

use midly::{live::LiveEvent, MidiMessage};

fn on_midi(event: &[u8]) {
    let event = LiveEvent::parse(event).unwrap();
    match event {
        LiveEvent::Midi { channel, message } => match message {
            MidiMessage::NoteOn { key, vel } => {
                println!("hit note {} on channel {}", key, channel);
            }
            _ => {}
        },
        _ => {}
    }
}

要导入的大多数类型在crate根目录上,并在原地进行文档说明。有关更多信息,请参阅crate文档

速度

虽然性能在MIDI库中不是关键,但仍然是midly库的重要目标,为大型文件提供自动多线程和最小分配。以下图表显示了与其他能够读取.mid文件的生态系统中的MIDI库的基准测试结果。

文件名 文件大小 rimd0.0.1 nom-midi0.5.1 augmented-midi1.3.0 midly0.5.3
Clementi.mid 4 KB 4 ms Error 0.06 ms 0.07 ms
CrabRave.mid 53 KB 4 ms 0.48 ms 0.53 ms 0.15 ms
Beethoven.rmi 90 KB Error Error Error 0.48 ms
Pi.mid 24 MB 20575 毫秒 253 毫秒 214 毫秒 60 毫秒
π 损坏.mid 64 KB 冻结 Error Error 0.41 毫秒

上述结果仅供参考,实际性能取决于硬件和操作系统。基准测试是在带有热文件缓存的 Linux x64 机器上进行的。基准代码位于源代码的 /benchmark 目录中。

依赖项

~0-265KB