#midi-file #midi #parser #smf #builder #file-format

ghakuf

用于解析/构建 SMF (标准 MIDI 文件) 的 Rust 库

13 个版本

使用旧的 Rust 2015

0.5.6 2020年10月4日
0.5.5 2020年5月6日
0.5.4 2020年1月28日
0.5.3 2019年2月2日
0.2.2 2017年7月11日

#742解析器实现

Download history 34/week @ 2024-03-11 20/week @ 2024-03-18 6/week @ 2024-03-25 87/week @ 2024-04-01 9/week @ 2024-04-08 15/week @ 2024-04-15 36/week @ 2024-04-22 14/week @ 2024-04-29 16/week @ 2024-05-06 14/week @ 2024-05-13 40/week @ 2024-05-20 11/week @ 2024-05-27 27/week @ 2024-06-03 15/week @ 2024-06-10 16/week @ 2024-06-17 20/week @ 2024-06-24

80 每月下载量
用于 chord-composer

MIT/Apache

66KB
1K SLoC

ghakuf

用于解析/构建 SMF (标准 MIDI 文件) 的 Rust 库。

Build Status Crates.io

示例

ghakuf 有独立的解析模块和构建模块。

解析器

ghakuf 的解析器是通过事件驱动的在线算法制作的。您必须准备原始的处理程序实现 Handler 特性以捕获 SMF 消息。您可以添加任意数量的处理程序到解析器。

use ghakuf::messages::*;
use ghakuf::reader::*;
use std::path;

let path = path::Path::new("test.mid");
let mut handler = HogeHandler{};
let mut reader = Reader::new(
    &mut handler,
    &path,
).unwrap();
let _ = reader.read();

struct HogeHandler {}
impl Handler for HogeHandler {
    fn header(&mut self, format: u16, track: u16, time_base: u16) {
      // Something
    }
    fn meta_event(&mut self, delta_time: u32, event: &MetaEvent, data: &Vec<u8>) {
      // you
    }
    fn midi_event(&mut self, delta_time: u32, event: &MidiEvent) {
      // want
    }
    fn sys_ex_event(&mut self, delta_time: u32, event: &SysExEvent, data: &Vec<u8>) {
      // to
    }
    fn track_change(&mut self) {
      // do
    }
}

构建器

ghakuf 通过消息枚举构建 SMF。消息枚举包括 MetaEvent、MidiEvent、SysExEvent 和 TrackChange。如果您想使用运行状态,可以使用它。在轨道更改时,您不仅应使用 MetaEvent::EndOfTrack 消息,还应使用 TrackChange 消息。

use ghakuf::messages::*;
use ghakuf::writer::*;
use std::path;

let tempo: u32 = 60 * 1000000 / 102; //bpm:102
let write_messages: Vec<Message> = vec![
    Message::MetaEvent {
        delta_time: 0,
        event: MetaEvent::SetTempo,
        data: [(tempo >> 16) as u8, (tempo >> 8) as u8, tempo as u8].to_vec(),
    },
    Message::MetaEvent {
        delta_time: 0,
        event: MetaEvent::EndOfTrack,
        data: Vec::new(),
    },
    Message::TrackChange,
    Message::MidiEvent {
        delta_time: 0,
        event: MidiEvent::NoteOn {
            ch: 0,
            note: 0x3c,
            velocity: 0x7f,
        },
    },
    Message::MidiEvent {
        delta_time: 192,
        event: MidiEvent::NoteOn {
            ch: 0,
            note: 0x40,
            velocity: 0,
        },
    },
    Message::MetaEvent {
        delta_time: 0,
        event: MetaEvent::EndOfTrack,
        data: Vec::new(),
    }
];
let path = path::Path::new("examples/example.mid");
let mut writer = Writer::new();
writer.running_status(true);
for message in &write_messages {
    writer.push(&message);
}
let _ = writer.write(&path);

支持的 SMF 事件

您可以使用三种类型的事件。在消息枚举中,这些事件具有时间戳和数据。

元事件

  • 序列号
  • 文本事件
  • 版权声明
  • 序列或轨道名称
  • 乐器名称
  • 歌词
  • 标记
  • 提示点
  • MIDI 通道前缀
  • 轨道结束
  • 设置速度
  • SMTPE 偏移
  • 拍号
  • 调号
  • 序列器特定元事件

MIDI 事件

  • NoteOff { ch: u8, note: u8, velocity: u8 }
  • NoteOn { ch: u8, note: u8, velocity: u8 }
  • PolyphonicKeyPressure { ch: u8, note: u8, velocity: u8 }
  • ControlChange { ch: u8, control: u8, data: u8 }
  • ProgramChange { ch: u8, program: u8 }
  • ChannelPressure { ch: u8, pressure: u8 }
  • PitchBendChange { ch: u8, data: i16 }

系统独占事件

  • (F0 事件)
  • (F7 事件)

许可证

ghakuf 主要在 MIT 许可证和 Apache 许可证(版本 2.0)的条款下分发,部分受各种类似 BSD 的许可证保护。

请参阅 LICENSE-APACHE 和 LICENSE-MIT 以获取详细信息。

依赖关系

~210KB