本文让我们使用Rust实现一个简单的MIDI Piano应用程序。
首先,使用以下命令创建一个Rust新项目:
cargo new midi-rs
然后在Cargo.toml文件中加入依赖项:
[dependencies]
eframe = "0.27.2"
itertools = "0.12.1"
phf = { version = "0.11", features = ["macros"] }
rustysynth = "1.3.1"
tinyaudio = "0.1.3"
- eframe:EGUI框架——编写可以编译为web或本机的GUI应用程序
- itertools:扩展的迭代器适配器、函数和宏。
- phf:使用完美的散列函数在编译时生成高效的查找表。
- rustysynth:用纯Rust编写的MIDI 音色库合成器
- tinyaudio:是一个跨平台,易于使用,底层的音频输出库。
这个应用程序将打开一个接收键盘事件的egui窗口,这些事件被发送到rustysynth库作为midi音符并通过tinyaudio库输出声音。
首先,在src/main.rs文件中引入这些库:
use eframe::egui;
use itertools::Itertools;
use phf::{phf_map, Map};
use rustysynth::{SoundFont, Synthesizer, SynthesizerSettings};
use std::{
fs::File,
sync::{Arc, Mutex},
};
use tinyaudio::prelude::*;
接下来,定义静态变量和常量:
const OUTPUT_PARAMS: OutputDeviceParameters = OutputDeviceParameters {
channels_count: 2,
sample_rate: 44100,
channel_sample_count: 441, // 样本的最大长度
};
#[derive(Debug)]
pub struct MidiNote {
pub note: i32,
pub velocity: i32,
}
pub static NOTE_KEY_MAP: Map