日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

聊聊使用Rust制作MIDI鋼琴程序,你學會了嗎?

來源: 責編: 時間:2024-04-29 09:09:15 177觀看
導讀本文讓我們使用Rust實現一個簡單的MIDI Piano應用程序。首先,使用以下命令創建一個Rust新項目:cargo new midi-rs然后在Cargo.toml文件中加入依賴項:[dependencies]eframe = "0.27.2"itertools = "0.12.1"phf = { versio

本文讓我們使用Rust實現一個簡單的MIDI Piano應用程序。ywi28資訊網——每日最新資訊28at.com

首先,使用以下命令創建一個Rust新項目:ywi28資訊網——每日最新資訊28at.com

cargo new midi-rs

ywi28資訊網——每日最新資訊28at.com

然后在Cargo.toml文件中加入依賴項:ywi28資訊網——每日最新資訊28at.com

[dependencies]eframe = "0.27.2"itertools = "0.12.1"phf = { version = "0.11", features = ["macros"] }rustysynth = "1.3.1"tinyaudio = "0.1.3"

ywi28資訊網——每日最新資訊28at.com

  • eframe:EGUI框架——編寫可以編譯為web或本機的GUI應用程序
  • itertools:擴展的迭代器適配器、函數和宏。
  • phf:使用完美的散列函數在編譯時生成高效的查找表。
  • rustysynth:用純Rust編寫的MIDI 音色庫合成器
  • tinyaudio:是一個跨平臺,易于使用,底層的音頻輸出庫。

這個應用程序將打開一個接收鍵盤事件的egui窗口,這些事件被發送到rustysynth庫作為midi音符并通過tinyaudio庫輸出聲音。ywi28資訊網——每日最新資訊28at.com

首先,在src/main.rs文件中引入這些庫:ywi28資訊網——每日最新資訊28at.com

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::*;

ywi28資訊網——每日最新資訊28at.com

接下來,定義靜態變量和常量:ywi28資訊網——每日最新資訊28at.com

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<&'static str, MidiNote> = phf_map! {    "A" => MidiNote {        note: 60,        velocity: 100,    },    "S" => MidiNote {        note: 62,        velocity: 100,    },    "D" => MidiNote {        note: 64,        velocity: 100,    },    "F" => MidiNote {        note: 65,        velocity: 100,    },    "G" => MidiNote {        note: 67,        velocity: 100,    },};

ywi28資訊網——每日最新資訊28at.com

OUTPUT_PARAMS是tinyaudio的參數。MidiNote持有MIDI音符的音符數和速度,用rustysynth播放它。它們被保存在一個靜態映射中,使用一個由按鍵值索引的phf_map!宏。ywi28資訊網——每日最新資訊28at.com

讓我們定義SynthApp結構體,它是一個egui應用程序。它有合成器對象和方法來執行音符的開/關,在eframe::App的update方法中處理鍵盤事件。ywi28資訊網——每日最新資訊28at.com

struct SynthApp {    synthesizer: Arc<Mutex<Synthesizer>>,    midi_channel: i32,}impl SynthApp {    fn note_on(&mut self, key: &str) {        let note = match NOTE_KEY_MAP.get(key) {            Some(note) => note,            None => return,        };        self.synthesizer            .lock()            .unwrap()            .note_on(self.midi_channel, note.note, note.velocity)    }    fn note_off(&mut self, key: &str) {        let note = match NOTE_KEY_MAP.get(key) {            Some(note) => note,            None => return,        };        self.synthesizer            .lock()            .unwrap()            .note_off(self.midi_channel, note.note);    }}impl eframe::App for SynthApp {    fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {        ctx.input(|i| {            for key_str in NOTE_KEY_MAP.keys() {                if let Some(key) = egui::Key::from_name(key_str) {                    if i.key_pressed(key) {                        self.note_on(key_str);                    } else if i.key_released(key) {                        self.note_off(key_str);                    }                }            }        });        egui::CentralPanel::default().show(ctx, |ui| {            ui.heading("My egui Application");            ui.label(format!("Midi channel {}", self.midi_channel));        });    }}

ywi28資訊網——每日最新資訊28at.com

在互聯網上有很多不錯的音色庫,我們使用TimGM6mb.sf2,ywi28資訊網——每日最新資訊28at.com

可以在以下地址下載:ywi28資訊網——每日最新資訊28at.com

https://github.com/craffel/pretty-midi/blob/main/pretty_midi/TimGM6mb.sf2ywi28資訊網——每日最新資訊28at.com

將下載好的文件放入到項目的根目錄下。ywi28資訊網——每日最新資訊28at.com

最后,我們編寫main函數,合成器保存在Arc<Mutex<…>>中,以便run_output_device和SynthApp都可以訪問它。ywi28資訊網——每日最新資訊28at.com

fn main() -> Result<(), eframe::Error> {    // 加載音色庫    let mut sf2 = File::open("TimGM6mb.sf2").unwrap();    let sound_font = Arc::new(SoundFont::new(&mut sf2).unwrap());    // 創建MIDI文件序列器    let settings = SynthesizerSettings::new(OUTPUT_PARAMS.sample_rate as i32);    let synthesizer = Arc::new(Mutex::new(        Synthesizer::new(&sound_font, &settings).unwrap(),    ));    // 運行輸出設備    let synth_c = synthesizer.clone();    let mut left: Vec<f32> = vec![0_f32; OUTPUT_PARAMS.channel_sample_count];    let mut right: Vec<f32> = vec![0_f32; OUTPUT_PARAMS.channel_sample_count];    let _device = run_output_device(OUTPUT_PARAMS, move |data| {        synth_c            .lock()            .unwrap()            .render(&mut left[..], &mut right[..]);        for (i, value) in left.iter().interleave(right.iter()).enumerate() {            data[i] = *value;        }    })    .unwrap();    // eframe    let options = eframe::NativeOptions {        viewport: egui::ViewportBuilder::default().with_inner_size([640.0, 480.0]),        ..Default::default()    };    eframe::run_native(        "My egui App",        options,        Box::new(|_cc| {            Box::new(SynthApp {                synthesizer,                midi_channel: 0,            })        }),    )}

ywi28資訊網——每日最新資訊28at.com

執行cargo run,結果如圖:ywi28資訊網——每日最新資訊28at.com

圖片圖片ywi28資訊網——每日最新資訊28at.com

一旦出現窗口,按鍵盤的ASDFG鍵,就會播放音符。ywi28資訊網——每日最新資訊28at.com

為了進一步探索,你可以通過添加一些UI和樂器來嘗試egui和rustysynth的各種功能。ywi28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-86352-0.html聊聊使用Rust制作MIDI鋼琴程序,你學會了嗎?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Python 處理圖片的十個庫,你知道幾個?

下一篇: Python提速秘籍:九個讓你的代碼飛速運行的巧妙技巧!

標簽:
  • 熱門焦點
  • 5月iOS設備好評榜:iPhone 14僅排第43?

    來到新的一月,安兔兔的各個榜單又重新匯總了數據,像安卓陣營的榜單都有著比較大的變動,不過iOS由于設備的更新換代并沒有那么快,所以相對來說變化并不大,特別是iOS好評榜,老款設
  • 十個可以手動編寫的 JavaScript 數組 API

    JavaScript 中有很多API,使用得當,會很方便,省力不少。 你知道它的原理嗎? 今天這篇文章,我們將對它們進行一次小總結。現在開始吧。1.forEach()forEach()用于遍歷數組接收一參
  • Rust中的高吞吐量流處理

    作者 | Noz編譯 | 王瑞平本篇文章主要介紹了Rust中流處理的概念、方法和優化。作者不僅介紹了流處理的基本概念以及Rust中常用的流處理庫,還使用這些庫實現了一個流處理程序
  • 十個簡單但很有用的Python裝飾器

    裝飾器(Decorators)是Python中一種強大而靈活的功能,用于修改或增強函數或類的行為。裝飾器本質上是一個函數,它接受另一個函數或類作為參數,并返回一個新的函數或類。它們通常用
  • 2023年,我眼中的字節跳動

    此時此刻(2023年7月),字節跳動從未上市,也從未公布過任何官方的上市計劃;但是這并不妨礙它成為中國最受關注的互聯網公司之一。從2016-17年的抖音強勢崛起,到2018年的&ldquo;頭騰
  • 共享單車的故事講到哪了?

    來源丨海克財經與共享充電寶相差不多,共享單車已很久沒有被國內熱點新聞關照到了。除了一再漲價和用戶直呼用不起了。近日多家媒體再發報道稱,成都、天津、鄭州等地多個共享單
  • 超級標準版旗艦!iQOO 11S全球首發iQOO超算獨顯芯片

    上半年已接近尾聲,截至目前各大品牌旗下的頂級旗艦都已悉數亮相,而下半年即將推出的頂級旗艦已經成為了數碼圈爆料的主流,其中就包括全新的iQOO 11S系
  • 最薄的14英寸游戲筆記本電腦 Alienware X14已可以購買

    2022年1月份在國際消費電子展(CES2022)上首次亮相的Alienware新品——Alienware X14現在已經可以購買了,這款筆記本電腦被譽為世界上最薄的 14 英寸游戲筆
  • 外交部:美方應停止在網絡安全問題上不負責任地指責他國

      中國外交部今天(16日)舉行例行記者會。會上,有記者問,美國情報官員稱,他們正在阻攔來自中國以及其他國家的黑客獲取相關科研成果。 中方對此有何評論?對此
Top 主站蜘蛛池模板: 九龙城区| 罗甸县| 项城市| 兴义市| 定结县| 蓬莱市| 泰兴市| 上杭县| 长汀县| 岑巩县| 永仁县| 夹江县| 广灵县| 灌阳县| 上饶市| 洛南县| 海林市| 雷州市| 横山县| 镇平县| 惠东县| 晋宁县| 墨玉县| 特克斯县| 桦南县| 精河县| 苏尼特右旗| 宝应县| 禹州市| 新建县| 时尚| 静海县| 麟游县| 灯塔市| 武宁县| 自治县| 龙川县| 城固县| 邢台县| 喀喇| 罗山县|