3个版本

0.1.2 2023年7月30日
0.1.1 2021年12月31日
0.1.0 2021年8月13日

#223音频

每月25次下载

MIT/Apache

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:使用midlycrate的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库。为了在两个线程之间通信,您可以使用rtrbcrate或其README中的“替代方案”部分中列出的任何crate

  • 解析MIDI
    • wmidi:实时MIDI事件的(高级)编码和解码
    • midi-consts:仅包含常量,适用于低级DIY MIDI处理(与本crate作者相同)。

贡献

有关更多信息,请参阅CONTRIBUTING.md

许可协议

midi-reader-writer采用Apache License,版本2.0或MIT许可协议,任选其一。

对于MIT许可协议的应用,文档注释中包含的示例不视为“本软件的实质性部分”。

依赖项

约150KB