3个版本
0.1.2 | 2023年7月30日 |
---|---|
0.1.1 | 2021年12月31日 |
0.1.0 | 2021年8月13日 |
#223 在 音频 中
每月25次下载
38KB
498 行
midi读写器
简化midi文件的读写。这个库不进行midi文件的序列化或反序列化,而是使用另一个库来完成。目前支持使用midly
库,在engine-midly-0-5
功能下。
特别支持以下功能:
- 创建一个遍历所有轨道的迭代器,合并;
- 给定一个迭代器,分离轨道,
- 将时间戳从ticks转换为微秒以及反向转换。
示例
以下示例说明了在转换midi数据的应用程序中可能通常使用的步骤。注意:此示例需要convert-time
功能、engine-midly-0-5
功能和read
功能。
use midi_reader_writer::{
ConvertTicksToMicroseconds, ConvertMicroSecondsToTicks,
midly_0_5::{exports::Smf, merge_tracks, TrackSeparator},
};
use std::{fs, error::Error, convert::TryFrom};
fn example(input_filename: &str, output_filename: &str) -> Result<(), Box<dyn Error>> {
// Read the midi file
let bytes = fs::read(input_filename)?;
let input_midi_file = Smf::parse(&bytes)?;
let mut ticks_to_microseconds = ConvertTicksToMicroseconds::try_from(input_midi_file.header)?;
let mut microseconds_to_ticks = ConvertMicroSecondsToTicks::from(input_midi_file.header);
let mut separator = TrackSeparator::new();
// Iterate over the events from all tracks:
for (ticks, track_index, event) in merge_tracks(&input_midi_file.tracks) {
// Convert the ticks to microseconds:
let microseconds = ticks_to_microseconds.convert(ticks, &event);
// Do something with the event:
// ... <- Insert your code here
// Convert from microseconds to ticks:
let new_ticks = microseconds_to_ticks.convert(microseconds, &event)?;
// Push the event to the appropriate track.
separator.push(ticks, track_index, event)?;
}
// Save the output:
let tracks = separator.collect();
let output_midi_file = Smf {
header: input_midi_file.header,
tracks,
};
output_midi_file.save(output_filename)?;
Ok(())
}
功能
这个crate有多个cargo功能
convert-time
(默认启用):将时间戳从ticks转换为微秒以及反向转换。read
(默认启用):创建一个遍历midi文件所有轨道的迭代器,合并engine-midly-0-5
:使用midly
crate的0.5.x版本。
请注意,目前这个crate没有engine-midly-0-5
功能可能并不是非常有用。
生态系统
播放midi文件的应用程序的依赖关系树目前可能类似于以下内容
(your crate that plays midi files)
├── midi-reader-writer : this crate
│ ├── timestamp-stretcher : high quality conversion from ticks to microseconds and vice versa
│ └── midly : midi file parser and writer
└── (a crate to play midi)
根据您想要针对的操作系统和您想要如何播放midi(作为音频或通过发送midi消息),有多种播放midi的选项。我建议在这里探索列表。您也可以在Rust音频论坛组中寻求您特定用例的建议。
请记住,在实时音频环境中,磁盘访问是不可行的,因为这可能导致音频中断。因此,最好在单独的线程中执行。如何管理这个线程取决于您使用的音频/midi库。为了在两个线程之间通信,您可以使用rtrb
crate或其README中的“替代方案”部分中列出的任何crate。
其他相关crate
- 解析MIDI
wmidi
:实时MIDI事件的(高级)编码和解码midi-consts
:仅包含常量,适用于低级DIY MIDI处理(与本crate作者相同)。
贡献
有关更多信息,请参阅CONTRIBUTING.md。
许可协议
midi-reader-writer
采用Apache License,版本2.0或MIT许可协议,任选其一。
对于MIT许可协议的应用,文档注释中包含的示例不视为“本软件的实质性部分”。
依赖项
约150KB