利用 Arduino 的演示程序,構(gòu)建一個音樂播放器
打開 MIDI 示例代碼
編譯以檢查代碼。此操作無需新的庫或附加文件。調(diào)用 Setup() 函數(shù)即可開啟 UART 電路,并通過 Serial.begin(31250) 設(shè)置默認(rèn)的串行波特率或速度(適用于 MIDI)。
“Loop( )”會反復(fù)執(zhí)行操作,直到整數(shù)變量“note”等于一個十六進制數(shù)為止。每個數(shù)代表一個不同的音符。函數(shù)“noteOn”會接收三個值來計算返回值。
關(guān)于此代碼
這是一個簡單的程序。該代碼通過 UART 串行端口輸出數(shù)字。我們循環(huán)遍歷一系列音高或音符值。MIDI 協(xié)議將特定的音樂音符與十六進制數(shù)字進行對應(yīng)關(guān)聯(lián)。
函數(shù) noteOn(int cmd, int pitch, int velocity) 接受三個整數(shù)參數(shù)。Serial.write(cmd) 發(fā)送第一個參數(shù),而 Serial.write(pitch) 和 Serial.write(velocity) 則說明要使該音符發(fā)出多大的音量。
從整體來看。我們的示例代碼會使用三個參數(shù)調(diào)用“noteOn”函數(shù),以 50% 的音量在合成器中開啟一個音符。然后,它會再次調(diào)用“noteOn”函數(shù),但這次將音量設(shè)置為 0%,從而關(guān)閉該音符。
搭建一個閃爍電路
搭建這個電路,并將 MIDI 示例程序代碼上傳至電路板。我們的程序會在串行 TXD 線路上傳輸脈沖。模擬器會顯示所發(fā)送的位。這些脈沖的頻率太快(每秒 31,250 位)以至于我們無法看到 LED 的閃爍。
我們的串行傳輸引腳 1(TX)在無數(shù)據(jù)傳輸時會保持 +5 伏電壓或處于高電平狀態(tài)。要發(fā)送一個比特時,該引腳會降至地電位或極低電壓。這樣便于查看設(shè)備是否在總線上,并檢測到來自外部的信號。
100 歐姆的電阻足夠嗎?可能不夠。讓我們來算一算。我們 Arduino 板的數(shù)字引腳 1 可以吸收 20 毫安的電流。我們需要至少 250 歐姆的電阻來確保芯片的安全。我們以后還會再提到這一點的。
波形
如果你有示波器,就能看到每次傳輸?shù)膯蝹€字節(jié)。要注意接地問題,為了安全起見,請用電池為 Arduino 供電。我們降低電壓的目的是為了使信號檢測更加容易。
我們的波形速率為 31,250 波特。屏幕上的脈沖寬度是多少呢?Sparkfun 網(wǎng)站上有一篇關(guān)于 MIDI 字節(jié)如何組合的精彩教程。在這個腳本中發(fā)送的大多數(shù) MIDI 命令都需要 3 個字節(jié)。
演奏音樂
我們的最終目標(biāo)是在電腦或樂器上播放音樂,讓我們的草圖以聲音的形式呈現(xiàn)出來。本項目的其余部分則專注于硬件、適配器和連接器。
我們將要探討的電子設(shè)備非常簡單。
MIDI 連接器適配器
許多 MIDI 設(shè)備都通過 USB 來傳輸我們在本項目中所看到的信號。本項目涉及的是 DIN-5 接口,它們看起來像 XLR 接口,但有 5 個引腳。這是從 MIDI OUT 接口(通過將第 4 個引腳接地來實現(xiàn)信號傳輸)內(nèi)部觀察到的景象。
USB-MIDI 適配器很容易就能買到,您的電腦也已準(zhǔn)備好將其識別為 MIDI 輸入/輸出設(shè)備。更多相關(guān)信息請參閱“USB MIDI 適配器插件”項目。
MIDI 接口板
將你的護盾小心地連接到 Arduino 上。仔細(xì)對齊引腳并插入。UART 的發(fā)送和接收端口被引出至 DIN-5 連接器上,并在電路中添加了適當(dāng)?shù)碾娮?。我們的程序僅傳輸 MIDI,因此我們只使用 MIDI 輸出連接器。
優(yōu)諾板和護板組合起來就變成了一臺電子樂器。想想看,用它們能做出什么樣的作品吧。
仔細(xì)觀察盾牌
讓我們來看一下 Arduino MIDI 保護板的原理圖中的 MIDI OUT 端口。在這里,我們可以看到 TXD 電路由電阻器 R14 和 R15 維護,每個電阻的阻值均為 220 歐姆。
我們這款 Arduino 板的數(shù)字引腳 1 能夠吸收 20 毫安的電流。為了確保芯片的安全,我們需要至少 250 歐姆的電阻。而這款護套的設(shè)計者為了更加安全,將這個數(shù)值加倍了。
LED 可以插入接口中,但不應(yīng)長時間保持該狀態(tài)。
一份改進后的草圖
新建一個草圖,并將這段代碼復(fù)制粘貼進去。接下來讓我們快速了解一下它與 MIDI 草圖的區(qū)別。它仍然會開啟串行端口,并依次運行一系列音符值,然后重復(fù)這個過程。
對于每個音符(i),我們都會發(fā)送一個命令,使其以半音量開啟,暫停后播放該音符,然后關(guān)閉該音符。Serial.write(0xFC) 是一個停止所有音符播放的命令。有時合成器會在未接收到停止命令的情況下播放音符。
本文編譯自hackster.io





