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 音频
2,268 每月下载量
在 27 个crates(23个直接) 中使用
170KB
3.5K SLoC
Midly
Midly是一个功能齐全的MIDI解码器和编码器,旨在提高效率和易于使用。
有关示例、详细文档和可用的cargo功能,请参阅crate级文档。
特性
- 支持both
.mid
文件和实时MIDI数据包。 - 非常完整,支持在读取和写入时处理MIDI规范中的所有边缘情况。
- 简单的API,只需加载您的数据并调用
Smf::parse
或LiveEvent::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