AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

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

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

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

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

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

cargo new midi-rs

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

標簽:
  • 熱門焦點
  • 影音體驗是真的強 簡單聊聊iQOO Pad

    大公司的好處就是產品線豐富,非常細分化的東西也能給你做出來,例如早先我們看到了新的vivo Pad2,之后我們又在iQOO Neo8 Pro的發布會上看到了iQOO的首款平板產品iQOO Pad。雖
  • 7月安卓手機好評榜:三星S23Ultra好評率第一

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年7月1日至7月31日,僅限國內市場。第一名:三星Galaxy S23 Ultra好評率:95.71%在即將迎來新
  • 女孩租房開2小時空調用完100元電費引熱議:5級能耗惹不起 月薪過萬電費也交不起

    近日,江蘇蘇州一女孩租房當天充值了100元電費,開著空調不到2小時發現電費已用完。對于為什么這個快,房東表示,電表壞了這種情況很多,之前也遇到過,給租客換
  • 三言兩語說透設計模式的藝術-單例模式

    寫在前面單例模式是一種常用的軟件設計模式,它所創建的對象只有一個實例,且該實例易于被外界訪問。單例對象由于只有一個實例,所以它可以方便地被系統中的其他對象共享,從而減少
  • 讓我們一起聊聊文件的操作

    文件【1】文件是什么?文件是保存數據的地方,是數據源的一種,比如大家經常使用的word文檔、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存數據,它既可以保
  • 一篇文章帶你了解 CSS 屬性選擇器

    屬性選擇器對帶有指定屬性的 HTML 元素設置樣式。可以為擁有指定屬性的 HTML 元素設置樣式,而不僅限于 class 和 id 屬性。一、了解屬性選擇器CSS屬性選擇器提供了一種簡單而
  • 零售大模型“干中學”,攀爬數字化珠峰

    文/侯煜編輯/cc來源/華爾街科技眼對于絕大多數登山愛好者而言,攀爬珠穆朗瑪峰可謂終極目標。攀登珠峰的商業路線有兩條,一是尼泊爾境內的南坡路線,一是中國境內的北坡路線。相
  • 猿輔導與新東方的兩種“歸途”

    作者|卓心月 出品|零態LT(ID:LingTai_LT)如何成為一家偉大企業?答案一定是對&ldquo;勢&rdquo;的把握,這其中最關鍵的當屬對企業戰略的制定,且能夠站在未來看現在,即使這其中的
  • 網紅炒股不為了賺錢,那就是耍流氓!

    來源:首席商業評論6月26日高調宣布入市,網絡名嘴大v胡錫進居然進軍了股市。在一次財經媒體峰會上,幾個財經圈媒體大佬就&ldquo;胡錫進炒股是否知道認真報道&rdquo;展開討論。有
Top