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





