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

當(dāng)前位置:首頁(yè) > 科技  > 軟件

聊聊使用Rust制作MIDI鋼琴程序,你學(xué)會(huì)了嗎?

來(lái)源: 責(zé)編: 時(shí)間:2024-04-29 09:09:15 263觀看
導(dǎo)讀本文讓我們使用Rust實(shí)現(xiàn)一個(gè)簡(jiǎn)單的MIDI Piano應(yīng)用程序。首先,使用以下命令創(chuàng)建一個(gè)Rust新項(xiàng)目:cargo new midi-rs然后在Cargo.toml文件中加入依賴項(xiàng):[dependencies]eframe = "0.27.2"itertools = "0.12.1"phf = { versio

本文讓我們使用Rust實(shí)現(xiàn)一個(gè)簡(jiǎn)單的MIDI Piano應(yīng)用程序。I0e28資訊網(wǎng)——每日最新資訊28at.com

首先,使用以下命令創(chuàng)建一個(gè)Rust新項(xiàng)目:I0e28資訊網(wǎng)——每日最新資訊28at.com

cargo new midi-rs

I0e28資訊網(wǎng)——每日最新資訊28at.com

然后在Cargo.toml文件中加入依賴項(xiàng):I0e28資訊網(wǎng)——每日最新資訊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"

I0e28資訊網(wǎng)——每日最新資訊28at.com

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

這個(gè)應(yīng)用程序?qū)⒋蜷_一個(gè)接收鍵盤事件的egui窗口,這些事件被發(fā)送到rustysynth庫(kù)作為midi音符并通過tinyaudio庫(kù)輸出聲音。I0e28資訊網(wǎng)——每日最新資訊28at.com

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

I0e28資訊網(wǎng)——每日最新資訊28at.com

接下來(lái),定義靜態(tài)變量和常量:I0e28資訊網(wǎng)——每日最新資訊28at.com

const OUTPUT_PARAMS: OutputDeviceParameters = OutputDeviceParameters {    channels_count: 2,    sample_rate: 44100,    channel_sample_count: 441, // 樣本的最大長(zhǎng)度};#[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,    },};

I0e28資訊網(wǎng)——每日最新資訊28at.com

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

讓我們定義SynthApp結(jié)構(gòu)體,它是一個(gè)egui應(yīng)用程序。它有合成器對(duì)象和方法來(lái)執(zhí)行音符的開/關(guān),在eframe::App的update方法中處理鍵盤事件。I0e28資訊網(wǎng)——每日最新資訊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));        });    }}

I0e28資訊網(wǎng)——每日最新資訊28at.com

在互聯(lián)網(wǎng)上有很多不錯(cuò)的音色庫(kù),我們使用TimGM6mb.sf2,I0e28資訊網(wǎng)——每日最新資訊28at.com

可以在以下地址下載:I0e28資訊網(wǎng)——每日最新資訊28at.com

https://github.com/craffel/pretty-midi/blob/main/pretty_midi/TimGM6mb.sf2I0e28資訊網(wǎng)——每日最新資訊28at.com

將下載好的文件放入到項(xiàng)目的根目錄下。I0e28資訊網(wǎng)——每日最新資訊28at.com

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

fn main() -> Result<(), eframe::Error> {    // 加載音色庫(kù)    let mut sf2 = File::open("TimGM6mb.sf2").unwrap();    let sound_font = Arc::new(SoundFont::new(&mut sf2).unwrap());    // 創(chuàng)建MIDI文件序列器    let settings = SynthesizerSettings::new(OUTPUT_PARAMS.sample_rate as i32);    let synthesizer = Arc::new(Mutex::new(        Synthesizer::new(&sound_font, &settings).unwrap(),    ));    // 運(yùn)行輸出設(shè)備    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,            })        }),    )}

I0e28資訊網(wǎng)——每日最新資訊28at.com

執(zhí)行cargo run,結(jié)果如圖:I0e28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片I0e28資訊網(wǎng)——每日最新資訊28at.com

一旦出現(xiàn)窗口,按鍵盤的ASDFG鍵,就會(huì)播放音符。I0e28資訊網(wǎng)——每日最新資訊28at.com

為了進(jìn)一步探索,你可以通過添加一些UI和樂器來(lái)嘗試egui和rustysynth的各種功能。I0e28資訊網(wǎng)——每日最新資訊28at.com

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

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: Python 處理圖片的十個(gè)庫(kù),你知道幾個(gè)?

下一篇: Python提速秘籍:九個(gè)讓你的代碼飛速運(yùn)行的巧妙技巧!

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 2023年Q2用戶偏好榜:12+256G版本成新主流

    3月份的性能榜、性價(jià)比榜和好評(píng)榜之后,就要輪到2023年的第二季度偏好榜了,上半年的新機(jī)潮已經(jīng)過去,最明顯的肯定就是大內(nèi)存和存儲(chǔ)的機(jī)型了,另外部分中端機(jī)也取消了屏幕塑料支架
  • Java NIO內(nèi)存映射文件:提高文件讀寫效率的優(yōu)秀實(shí)踐!

    Java的NIO庫(kù)提供了內(nèi)存映射文件的支持,它可以將文件映射到內(nèi)存中,從而可以更快地讀取和寫入文件數(shù)據(jù)。本文將對(duì)Java內(nèi)存映射文件進(jìn)行詳細(xì)的介紹和演示。內(nèi)存映射文件概述內(nèi)存
  • 本地生活這塊肥肉,拼多多也想吃一口

    出品/壹覽商業(yè) 作者/李彥編輯/木魚拼多多也看上本地生活這塊蛋糕了。近期,拼多多在App首頁(yè)&ldquo;充值中心&rdquo;入口上線了本機(jī)生活界面。壹覽商業(yè)發(fā)現(xiàn),該界面目前主要
  • 騰訊蓋樓,字節(jié)拆墻

    來(lái)源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之&ldquo;想重溫暴刷深淵、30+技能搭配暴搓到爽的游戲體驗(yàn)嗎?一起上晶核,即刻暴打!&rdquo;曾憑借直播騰訊旗下代理格斗游戲《DNF》一
  • 猿輔導(dǎo)與新東方的兩種“歸途”

    作者|卓心月 出品|零態(tài)LT(ID:LingTai_LT)如何成為一家偉大企業(yè)?答案一定是對(duì)&ldquo;勢(shì)&rdquo;的把握,這其中最關(guān)鍵的當(dāng)屬對(duì)企業(yè)戰(zhàn)略的制定,且能夠站在未來(lái)看現(xiàn)在,即使這其中的
  • 東方甄選單飛:有些鳥注定是關(guān)不住的

    作者:彭寬鴻來(lái)源:華爾街科技眼&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;東方甄選創(chuàng)始人俞敏洪帶隊(duì)的&ldquo;7天甘肅行&rdquo;直播活動(dòng)已在近日順利收官。成立后一
  • 微博大門常打開,迎接海外畫師漂洋東渡

    作者:互聯(lián)網(wǎng)那些事&ldquo;起猛了,我能看得懂日語(yǔ)了&rdquo;。&ldquo;為什么日本人說(shuō)話我能聽懂?&rdquo;&ldquo;中文不像中文,日語(yǔ)不像日語(yǔ),但是我竟然看懂了&rdquo;&hellip;&hell
  • 3699元!iQOO Neo8 Pro頂配版今日首銷:1TB UFS 4.0同價(jià)位唯一

    5月23日,iQOO推出了全新的iQOO Neo8系列,包含iQOO Neo8和iQOO Neo8 Pro兩個(gè)版本,其中標(biāo)準(zhǔn)版搭載高通驍龍8+,而Pro版更是首發(fā)搭載了聯(lián)發(fā)科天璣9200+旗艦
  • 電博會(huì)上海爾智家模擬500平大平層,還原生活空間沉浸式體驗(yàn)

    電博會(huì)為了更好地讓參展觀眾真正感受到智能家居的絕妙之處,海爾智家的程傳嶺先生同樣介紹了展會(huì)上海爾智家的模擬500平大平層,還原生活空間沉浸式體驗(yàn)。程傳
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
亚洲精品乱码久久久久久蜜桃麻豆| 国产精品美女视频网站| 欧美专区日韩视频| 久久久久久久999精品视频| 久久综合99re88久久爱| 欧美日本在线播放| 欧美体内谢she精2性欧美| 国产色综合久久| 亚洲人成免费| 一区二区三区高清不卡| 久久福利毛片| 欧美福利视频在线观看| 国产精品亚洲网站| 伊人精品久久久久7777| 亚洲色图综合久久| 久久精品最新地址| 欧美色中文字幕| 很黄很黄激情成人| 一区二区三区毛片| 久久久久久久综合色一本| 欧美四级伦理在线| 亚洲第一页在线| 亚洲免费一区二区| 欧美成人精品激情在线观看| 国产日韩精品综合网站| 亚洲人成网站在线播| 羞羞答答国产精品www一本| 欧美肥婆在线| 国产欧美精品一区 | 99国产精品久久| 久久精品中文字幕免费mv| 欧美日韩久久| 黄色欧美日韩| 亚洲永久精品大片| 欧美激情女人20p| 国产一区二区三区精品欧美日韩一区二区三区 | 午夜伦欧美伦电影理论片| 久久国产精品久久国产精品| 欧美日韩国产探花| 在线观看欧美一区| 亚洲欧美视频在线观看| 欧美日韩大片一区二区三区| 尤物yw午夜国产精品视频| 亚洲免费婷婷| 欧美日韩亚洲综合| 亚洲国产一区二区三区高清| 久久精品国产清高在天天线| 国产精品国产一区二区| 91久久精品美女高潮| 久久精品国产一区二区三区| 欧美色123| 亚洲精品系列| 免费亚洲电影在线| 国模大胆一区二区三区| 亚洲欧美春色| 国产精品99一区二区| 亚洲免费观看在线观看| 欧美国产日韩二区| 亚洲国产一区二区三区青草影视 | 欧美精品偷拍| 亚洲高清网站| 免费观看在线综合色| 极品少妇一区二区| 久久久精品国产99久久精品芒果| 国产精品影院在线观看| 亚洲欧美日韩中文播放| 国产精品va在线播放| 日韩亚洲欧美综合| 欧美精品激情在线观看| 亚洲国产日本| 农夫在线精品视频免费观看| 在线观看国产精品网站| 久久夜精品va视频免费观看| 黄色av日韩| 久久青草欧美一区二区三区| 国产一本一道久久香蕉| 久久国产精品99久久久久久老狼| 国产日产欧美精品| 久久av一区二区| 国产一二精品视频| 欧美专区中文字幕| 国产曰批免费观看久久久| 久久精品国产久精国产思思| 国产亚洲亚洲| 久久久五月天| 在线看片欧美| 欧美成人免费播放| 亚洲伦理在线| 欧美日韩一区二区三区四区五区| 夜夜嗨网站十八久久| 欧美日韩一区二区三区| 亚洲无毛电影| 国产精品午夜春色av| 欧美一站二站| 一区在线视频| 欧美成人精品福利| 99精品免费网| 国产精品视频你懂的| 久久av在线看| 激情久久综艺| 欧美国产日韩二区| 亚洲少妇自拍| 国产日韩精品电影| 久久婷婷国产综合精品青草| 亚洲国产第一页| 欧美日韩亚洲高清一区二区| 亚洲女性裸体视频| 国内精品久久国产| 欧美国产日韩免费| 亚洲视频一区二区免费在线观看| 国产美女一区| 美女爽到呻吟久久久久| 夜夜嗨av一区二区三区四季av| 午夜精品福利视频| 国产一区二区三区在线播放免费观看| 久久久久久综合网天天| 亚洲国产免费| 国产精品扒开腿做爽爽爽视频| 欧美一级大片在线免费观看| 136国产福利精品导航网址| 欧美日韩亚洲91| 久久成人免费日本黄色| 亚洲人成网站影音先锋播放| 国产精品女主播| 噜噜噜91成人网| 亚洲午夜高清视频| 狠狠做深爱婷婷久久综合一区 | 玖玖精品视频| 亚洲色图制服丝袜| 狠狠88综合久久久久综合网| 欧美日韩精品福利| 久久不见久久见免费视频1| 亚洲日本中文字幕免费在线不卡| 国产精品久久久久毛片软件 | 午夜精品久久久久| 亚洲国产欧美在线人成| 国产精品五月天| 欧美成人有码| 欧美伊久线香蕉线新在线| 亚洲区一区二| 国产日韩欧美二区| 欧美大片一区二区三区| 性8sex亚洲区入口| 亚洲精品欧美在线| 国产在线不卡精品| 国产精品www色诱视频| 美女脱光内衣内裤视频久久网站| 亚洲午夜久久久久久久久电影网| 精品成人在线视频| 国产精品人人做人人爽| 欧美国产在线观看| 久久国产手机看片| 亚洲视频在线播放| 亚洲片国产一区一级在线观看| 国产精品三级视频| 欧美人成在线视频| 另类欧美日韩国产在线| 午夜精品美女久久久久av福利| 亚洲三级电影在线观看| 激情欧美丁香| 国产欧美日韩激情| 欧美视频精品一区| 牛夜精品久久久久久久99黑人| 欧美在线免费观看视频| 一区二区三区 在线观看视频| 亚洲成人在线| 国产亚洲制服色| 国产精品久久毛片a| 欧美日韩国产a| 免费观看一区| 久久米奇亚洲| 香蕉久久一区二区不卡无毒影院| 9久re热视频在线精品| 亚洲国内欧美| 韩国av一区二区三区在线观看| 国产精品青草综合久久久久99 | 久久久国产精彩视频美女艺术照福利| 亚洲一区二区三区国产| 99在线热播精品免费| 亚洲精品一区二区三区av| 在线观看日韩av先锋影音电影院| 国产香蕉97碰碰久久人人| 国产精品久久久久久久久久尿| 欧美日本亚洲| 欧美精品亚洲| 欧美激情网友自拍| 欧美岛国在线观看| 欧美成人午夜免费视在线看片| 久久婷婷成人综合色| 久久久亚洲国产美女国产盗摄| 久久激情视频久久| 欧美一区国产在线| 欧美一区免费| 久久爱www.| 久久久国产一区二区| 久久av在线看| 欧美伊人久久| 久久riav二区三区| 欧美一区二视频| 久久久久国产一区二区三区| 久久精品麻豆| 久久综合久久综合久久综合| 麻豆91精品91久久久的内涵| 免费观看亚洲视频大全|