搜尋
首頁web前端css教學用WebMidi將腳趾浸入硬件

用WebMidi將腳趾浸入硬件

您是否知道有一個良好支持的瀏覽器API,可以使用更早的Web的成熟協議與有趣甚至自定義的硬件進行連接?讓我向您介紹MIDI和Webmidi API,並向您展示它如何為前端開發人員提供獨特的機會,使其在硬件編程世界中闖入瀏覽器並涉足硬件編程世界,而不會留下JavaScript和DOM的相對舒適感。

MIDI和Webmidi到底是什麼?

MIDI是一種用於樂器互相交流的利基協議。它在1983年進行了標準化,直到今天由由音樂行業公司和代表組成的組織維持。從某種意義上說,這與W3C的指示和保留​​網絡標準的方式並沒有大不相同。

WebMIDI API是基於瀏覽器的該協議的實現,它允許我們的Web應用程序“說” MIDI並與可能連接到用戶設備的任何具有MIDI功能的硬件進行通信。

不是音樂家嗎?不用擔心!我們會很快發現,為電子樂器設計的這個簡單協議可用於構建有趣,互動和完全非音樂的事物。

我為什麼要這樣做?

很棒的問題。最短的答案:因為很有趣!

如果這個答案對您來說不足以滿足,我會提供的:創建一些跨越物理世界和虛擬世界之間的界限,我們花費大部分時間來建立事物,這是一種很好的練習。這是一個創造性修補以及考慮和創建新的用戶界面和經驗進行導航的機會。我真的認為,這種有趣的探索有助於我們使用大腦的不同部分,並使我們在長途旅行中更好地開發人員。

我可以建造什麼樣的東西?

我需要開始什麼?

以下是開始嘗試WebMidi的先決條件:

MIDI控制器

這可能是最棘手的部分。您需要採購具有MIDI功能的硬件進行實驗。您也許可以在Craigslist,Amazon或Aliexpress上找到便宜的東西。或者 - 如果您真的很雄心勃勃,並且擁有一個Arduino,則可以建立自己的(有關此信息的更多信息,請參見本文的結尾)。

具有Webmidi的瀏覽器

此瀏覽器支持數據來自Caniuse,其中有更多詳細信息。一個數字表明瀏覽器在該版本及以上支持該功能。

桌面

移動 /平板電腦

根據Caniuse.com的說法,在撰寫本文時,大約有73%的瀏覽器支持它,儘管大多數重型是由Chromium完成的。任何基於鉻的瀏覽器都將支持WebMidi,其中包括電子應用和較新的基於鉻的Microsoft Edge。它也支持Opera和Samsung Internet瀏覽器。在Firefox上,它仍在討論中,但希望更快地來臨。

您好,Webmidi

一旦您購買了這兩種內容,我們就可以開始編寫一些代碼!使用WebMidi與使用其他瀏覽器API(如GeOlocation或MediaDevices API)合作,如果您熟悉這兩個API。

高級流程看起來像這樣:

  • 我們在瀏覽器中檢測到Webmidi API的可用性。
  • 如果檢測到,我們請求用戶許可訪問它。
  • 一旦獲得許可,我們現在就可以訪問其他方法來檢測並與任何連接的MIDI設備進行通信。

讓我們看看這一點:

 if(Navigator中的“ requestMidiaCcess”){
  // Web Midi API可供我們使用!
}

現在,假設我們在具有Webmidi的瀏覽器中,讓我們請求訪問:

 navigator.requestmidiaccess()
。
  //用戶授予我們許可。現在我們可以
  //訪問連接的MIDI功能設備
  //到用戶的計算機。
}))
.catch((error)=> {
  //未授予許可。 :(
});

如果用戶授予我們許可,我們現在應該可以訪問Midiaccess接口。這有助於我們構建可以從中收到MIDI輸入並將MIDI輸出發送到的設備列表。

接下來讓我們這樣做。這是我們傳遞到的函數內部的代碼,然後從上一個代碼片段中傳遞到的代碼:

 const inputs = access.inputs;
const輸出= access.outputs;

//遍歷每個連接的MIDI輸入設備
inputs.foreach((MIDIINPUT)=> {
  //使用MIDI輸入設備做點什麼
});

//遍歷每個連接的MIDI輸出設備
outputs.foreach(((midiOutput)=> {
  //使用MIDI輸出設備做點什麼 
});

您可能想知道MIDI輸入設備和輸出設備之間的區別是什麼。設置了一些設備,僅將MIDI信息發送到計算機(這些將被列為輸入),而其他設備可以從計算機接收信息(這些將以輸出形式出現)。可以發送和接收設備並不少見,因此您會在兩者下都列出。

現在,我們有可以迭代所有連接的MIDI設備的代碼,基本上只有兩件事要做。

  • 如果是輸入設備,我們將要收聽從中發出的任何傳入的MIDI消息。
  • 如果是輸出設備,我們可能需要向其發送MIDI消息。

設置事件偵聽器以響應我們輸入設備的任何傳入的MIDI消息的代碼看起來與您可能為其他DOM事件設置的事件偵聽器非常相似,除非在這種情況下,我們正在偵聽的事件是Midimessage事件:

 midiinput.AddeventListener('Midimessage',(event)=> {
  //`event'對象將具有`data'屬性
  //包含3個數字的數組。例如:
  // [144,63,127]
}))

如果我們想向輸出設備發送MIDI消息,則可以這樣做的代碼;

 outputsend([144,63,127]);

這是一個編碼epen演示,其中大部分都為您組合在一起。它將讓您知道連接到系統的所有MIDI輸入和輸出設備,並向您展示傳入的MIDI消息時:

看到筆
喬治·曼迪斯(@georgemandis)的WebMidi基本測試
在Codepen上。

在這一點上,您可能想知道幾件事:

  • 當您收聽中等事件時,如何在Event.data中製作三個數字數組的頭或尾巴?
  • 您為什麼要向MIDI輸出設備發送三個數字的數組,為什麼要發送這些特定的數字?

這兩個問題的答案在於進一步探索和了解MIDI協議的工作原理及其旨在解決的問題。

MIDI消息的解剖

當MIDI控制器對另一台具有MIDI功能的設備或計算機“說話”時,他們將彼此發送和接收MIDI消息。在實踐中,這種通信的基礎協議非常簡單,但是在解釋時有點詳細。不過,我會嘗試的。

每個MIDI消息由三個字節組成,由8位組成(0-255)。在二進制中代表,一條消息可能看起來像這樣:

 10010000 | 00111100 | 0111111

MIDI消息只有兩種類型:狀態和數據。每個消息都將包含一個狀態字節和兩個數據字節。

狀態字節旨在傳達要傳遞哪種信息,包括以下內容:

  • 注意
  • 注意
  • 音高彎曲變化
  • 控制/模式更改
  • 程序更改

……還有許多其他。

如果您是從非音樂背景來的,這些狀態消息似乎有點奇怪,但不要擔心它太多。數據字節旨在為狀態提供更多信息和上下文。舉個例子,如果我將MIDI鋼琴插入我的計算機上,然後按鍵彈奏音符,它將發送“註釋”狀態字節,並附有數據字節,指示我播放了哪個音符,也許我按下了它的難度。

狀態字節將始終從數字1和數字0開始。

 1x0010000 | 0x0111100 | 0x111111
    ^狀態 ^data1 ^data2

對於留下7位以表達該字節中數據的數據字節。這使我們的整數範圍為0-127。

對於狀態字節,第一次描述狀態消息類型後的下一個3位,其餘4位描述了頻道。分解我們的二進製表示:

 1x001x0000

這如何轉化為Webmidi和JavaScript

正如您之前從代碼示例中猜到的那樣,使用WebMidi API,我們很少必須直接處理這些二進製表示。當我們在JavaScript中發送和接收這些消息時,我們只需使用這樣的數組:

 [144,63,127]

如果您正在使用現有的音樂硬件,那麼對信息的結構方式和為什麼以它們的方式進行了更深入的了解是有幫助的。知道在第一個字節中接收144的意思是在第一個頻道中打開音符,並且128表示正在關閉音符,這是有幫助的。

但是,如果我們正在建立非音樂體驗並創建自己的硬件,則可以重新使用這些數字以表示您想要的任何東西!

我可以使用什麼樣的硬件?

可以通過WebMidi API訪問可以連接到計算機的任何具有MIDI功能的設備。能夠將MIDI數據發送到另一個具有MIDI功能的設備的設備通常稱為MIDI控制器。一個常見的例子是一個簡單的鋼琴風格的鍵盤,例如Korg Nanokey2:

但是它們的外觀和相互作用方式可能會差異很大。當然,按鈕很常見,但是您可能還會發現一些包含錶盤或壓力敏感墊,例如Akai LPD8:

其他人則使用更抽象和有趣的互動方式,包括將運動或呼吸映射到MIDI信號。例如,該控制器(來自源音頻的Hothand)使用三個加速度計將手勢映射到MIDI消息:

一些控制器都可以發送和接收MIDI消息,從而使您與物理世界進行真正的雙向對話。 Novation LaunchPad是一個典型的示例 - 可以按下按鈕發送消息,也可以收到消息以動態更改設備上的顏色:

我可以構建自己的硬件嗎?

事實證明,它們並不難於建造,您可以在野外找到很多自製的MIDI控制器。他們可以急忙獲得更多的詳盡。有些可以是徹底的香蕉

構建自己的MIDI控制器將帶您在JavaScript世界之外,但是如果您熟悉或對Arduino平台感興趣,仍然可以訪問它。 Adafruit的電路遊樂場經典賽是開始使用的絕佳設備,您可以找到啟動代碼閃爍到設備,並將其插入GitHub上的多方面MIDI控制器。

概括

Webmidi API是前端開發人員開始嘗試基本硬件和軟件交互的低速度進入方式。與其他一些硬件Web API(例如藍牙)相比,該實現相對簡單,並且MIDI標準有據可查。有很多現有的具有MIDI功能的設備可以進行實驗或構建酷炫的東西,如果您真的想全力以赴並開始為您的項目構建自己的自定義MIDI硬件,那麼也可以做到這一點。

去那裡做點什麼!

以上是用WebMidi將腳趾浸入硬件的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
什麼是CSS網格?什麼是CSS網格?Apr 30, 2025 pm 03:21 PM

CSS網格是創建複雜,響應式Web佈局的強大工具。它簡化了設計,提高可訪問性並提供了比舊方法更多的控制權。

什麼是CSS Flexbox?什麼是CSS Flexbox?Apr 30, 2025 pm 03:20 PM

文章討論了CSS FlexBox,這是一種佈局方法,用於有效地對齊和分佈響應設計中的空間。它說明了FlexBox用法,將其與CSS網格進行了比較,並詳細瀏覽了瀏覽器支持。

我們如何使用CSS使網站迅速響應?我們如何使用CSS使網站迅速響應?Apr 30, 2025 pm 03:19 PM

本文討論了使用CSS創建響應網站的技術,包括視口元標籤,靈活的網格,流體媒體,媒體查詢和相對單元。它還涵蓋了使用CSS網格和Flexbox一起使用,並推薦CSS框架

CSS盒裝屬性有什麼作用?CSS盒裝屬性有什麼作用?Apr 30, 2025 pm 03:18 PM

本文討論了CSS盒裝屬性,該屬性控制了元素維度的計算方式。它解釋了諸如Content-Box,Border-Box和Padding-Box之類的值,以及它們對佈局設計和形式對齊的影響。

我們如何使用CSS動畫?我們如何使用CSS動畫?Apr 30, 2025 pm 03:17 PM

文章討論使用CSS,關鍵屬性並與JavaScript結合創建動畫。主要問題是瀏覽器兼容性。

我們可以使用CSS向我們的項目添加3D轉換嗎?我們可以使用CSS向我們的項目添加3D轉換嗎?Apr 30, 2025 pm 03:16 PM

文章討論了Web項目的3D轉換,關鍵屬性,瀏覽器兼容性和性能注意事項的討論。 (角色計數:159)

我們如何在CSS中添加梯度?我們如何在CSS中添加梯度?Apr 30, 2025 pm 03:15 PM

文章討論了使用CSS梯度(線性,徑向,重複)來增強網站視覺效果,添加深度,焦點和現代美學。

CSS中的偽元素是什麼?CSS中的偽元素是什麼?Apr 30, 2025 pm 03:14 PM

文章討論了CSS中的偽元素,它們在增強HTML樣式方面的使用以及與偽級的差異。提供實用的例子。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器