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

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

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

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

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

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

cargo new midi-rs

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

然后在Cargo.toml文件中加入依賴項:UjP28資訊網——每日最新資訊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"

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

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

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

首先,在src/main.rs文件中引入這些庫:UjP28資訊網——每日最新資訊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::*;

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

接下來,定義靜態變量和常量:UjP28資訊網——每日最新資訊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,    },};

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

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

讓我們定義SynthApp結構體,它是一個egui應用程序。它有合成器對象和方法來執行音符的開/關,在eframe::App的update方法中處理鍵盤事件。UjP28資訊網——每日最新資訊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));        });    }}

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

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

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

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

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

最后,我們編寫main函數,合成器保存在Arc<Mutex<…>>中,以便run_output_device和SynthApp都可以訪問它。UjP28資訊網——每日最新資訊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,            })        }),    )}

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

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

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

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

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

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

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

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

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

標簽:
  • 熱門焦點
  • 直屏旗艦來了 iQOO 12和K70 Pro同臺競技

    旗艦機基本上使用的都是雙曲面屏幕,這就讓很多喜歡直屏的愛好者在苦等一款直屏旗艦,這次,你們等到了。據博主數碼閑聊站帶來的最新爆料稱,Redmi下代旗艦K70 Pro和iQOO 12兩款手
  • 石頭自清潔掃拖機器人G10S評測:多年黑科技集大成之作 懶人終極福音

    科技圈經常能看到一個詞叫“縫合怪”,用來形容那些把好多功能或者外觀結合在一起的產品,通常這樣的詞是貶義詞,但如果真的是產品縫合的好、縫合的實用的話,那它就成了中性詞,今
  • Golang 中的 io 包詳解:組合接口

    io.ReadWriter// ReadWriter is the interface that groups the basic Read and Write methods.type ReadWriter interface { Reader Writer}是對Reader和Writer接口的組合,
  • 分享六款相見恨晚的PPT模版網站, 祝你做出精美的PPT!

    1、OfficePLUSOfficePLUS網站旨在為全球Office用戶提供豐富的高品質原創PPT模板、實用文檔、數據圖表及個性化定制服務。優點:OfficePLUS是微軟官方網站,囊括PPT模板、Word模
  • 之家push系統迭代之路

    前言在這個信息爆炸的互聯網時代,能夠及時準確獲取信息是當今社會要解決的關鍵問題之一。隨著之家用戶體量和內容規模的不斷增大,傳統的靠"主動拉"獲取信息的方式已不能滿足用
  • 一文搞定Java NIO,以及各種奇葩流

    大家好,我是哪吒。很多朋友問我,如何才能學好IO流,對各種流的概念,云里霧里的,不求甚解。用到的時候,現百度,功能雖然實現了,但是為什么用這個?不知道。更別說效率問題了~下次再遇到,
  • 自律,給不了Keep自由!

    來源 | 互聯網品牌官作者 | 李大為編排 | 又耳 審核 | 谷曉輝自律能不能給用戶自由暫時不好說,但大概率不能給Keep自由。近日,全球最大的在線健身平臺Keep正式登陸港交所,努力
  • 三星Galaxy Z Fold5官方渲染圖曝光:13.4mm折疊厚度依舊感人

    據官方此前宣布,三星將于7月26日在韓國首爾舉辦Unpacked活動,屆時將帶來帶來包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy Z Flip 5、
  • iQOO Neo8 Pro即將開售:到手價3099元起 安卓性能最強旗艦

    5月23日,iQOO如期舉行了新品發布會,全新的iQOO Neo8系列也正式與大家見面,包含iQOO Neo8和iQOO Neo8 Pro兩個版本,其中標準版搭載高通驍龍8+,而Pro版更
Top 主站蜘蛛池模板: 循化| 抚远县| 陕西省| 酒泉市| 普兰店市| 宁德市| 高密市| 保靖县| 宁陵县| 平顶山市| 桂林市| 涟水县| 桐梓县| 湖口县| 东乡| 武宁县| 金昌市| 饶河县| 肇庆市| 区。| 长子县| 横峰县| 富顺县| 佛坪县| 竹北市| 朔州市| 滁州市| 长岛县| 长岭县| 大石桥市| 商都县| 黑龙江省| 高清| 疏勒县| 临夏县| 宾川县| 义马市| 朔州市| 辉县市| 大同市| 濉溪县|