作為一個積累了許多樂器和雜音箱的音樂家,不起眼的Arduino是創(chuàng)建自定義MIDI控制器的理想工具。盡管樹莓派(Raspberry Pi)可能已經(jīng)贏得了物聯(lián)網(wǎng)(IoT)項目的桂冠,但是一個簡單的Arduino Uno(什么是Arduino的不同類型?)為該項目提供了足夠的功能。
第一次使用Arduino嗎?不用擔(dān)心,在您完成該項目之前,我們已經(jīng)閱讀了完整的Arduino初學(xué)者指南。
什么是MIDI?
MIDI代表樂器數(shù)字接口。它概述了音樂設(shè)備相互通信的標(biāo)準(zhǔn)方法。如果您擁有電子鍵盤,則可能具有MIDI接口。盡管MIDI的實現(xiàn)涉及一些技術(shù)細(xì)節(jié),但重要的是要記住MIDI不是音頻! MIDI數(shù)據(jù)是一組簡單的指令(一個指令稱為“消息”),另一臺設(shè)備可以實現(xiàn)該指令來發(fā)出不同的聲音或控制參數(shù)。
MIDI支持16個通道。這意味著每條電纜可以支持16個彼此獨立通信的設(shè)備。使用5針DIN電纜連接設(shè)備。 DIN代表“德國標(biāo)準(zhǔn)化協(xié)會”,并且只是連接器內(nèi)部具有五個針腳的電纜。經(jīng)常使用USB代替5針DIN,或者可以使用USB-MIDI接口。
控制更改和程序更改
MIDI消息有兩種主要類型:控制更改和程序更改。
控制更改(CC)消息包含一個控制器號和一個介于0到127之間的值。通常使用CC消息。更改音量或音調(diào)等設(shè)置。接受MIDI的設(shè)備應(yīng)隨附一本手冊,說明默認(rèn)情況下設(shè)置了哪些通道和消息以及如何更改它們(稱為MIDI映射)。
程序更改(PC)消息比CC消息更簡單。 PC消息由一個數(shù)字組成,用于更改設(shè)備上的預(yù)設(shè)或補丁。 PC消息有時被稱為“補丁更改”。與CC消息類似,制造商應(yīng)提供文檔,概述特定消息會更改哪些預(yù)設(shè)。
您需要什么
Arduino
5針DIN母插座
2個220歐姆電阻器
2個10k歐姆電阻器
2個瞬時開關(guān)
連接線
面包板
MIDI電纜
MIDI設(shè)備或USB接口
構(gòu)建計劃
此項目將非常簡單。當(dāng)然,您可以添加更多按鈕或硬件以滿足您的需求。幾乎任何Arduino都適用-此示例僅需要三個引腳。該項目包括兩個用于控制程序的按鈕,一個用于發(fā)送數(shù)據(jù)的MIDI端口以及一個用于接收消息的設(shè)備。此電路是在面包板上構(gòu)建的,但是可以將其轉(zhuǎn)移到項目盒和焊接的連接器中,以提供可靠的解決方案。
CircuitAssembly
MIDI連接
按如下所示連接MIDI插槽:
MIDI針5到Arduino通過220歐姆電阻器傳輸(TX)1
MIDI引腳4到Arduino + 5V通過220歐姆電阻器
MIDI引腳2到Arduino接地
按鈕連接
按鈕通過更改Arduino“看到”的電阻來工作。 Arduino引腳通過一個10k歐姆的電阻器(“下拉”電阻器,確保該值保持較低),將開關(guān)直接接地( LOW )。按下按鈕后,在沒有電阻( HIGH )的情況下,電路看到的值將變?yōu)? 5v。 Arduino可以使用 digitalRead(pin)命令檢測到此更改。將按鈕連接到Arduino數(shù)字輸入/輸出(I/O)上的引腳6和7。連接兩個按鈕:
按鈕的左側(cè)到+ 5V
按鈕的右側(cè)通過10k歐姆電阻連接到Arduino接地
Arduino引腳(6或7)上的按鈕
MIDI測試
現(xiàn)在所有的硬件都完成了,現(xiàn)在該進(jìn)行測試了。您將需要一個USB-MIDI接口(許多音頻接口可以做到這一點)和MIDI電纜。面包板上連接的MIDI端口正在發(fā)送數(shù)據(jù),因此它是輸出。您的計算機正在接收數(shù)據(jù),因此它是輸入。該項目使用了47種效果出色的Arduino MIDI庫v4.2。安裝庫之后,可以通過轉(zhuǎn)到草圖》包含庫》 MIDI 將其包含在代碼中。
您還需要一個程序來監(jiān)視傳入的MIDI數(shù)據(jù):
用于OS X的MIDI監(jiān)視器
用于Windows的MIDI-OX
KMidimon(用于Linux)
將Arduino連接到計算機并上傳以下測試代碼(不要忘記從 Tools》 Board 和 Tools》 Port 選擇正確的電路板和端口》菜單)。
#include
#include
#include
#include
#include
MIDI_CREATE_INSTANCE(HardwareSerial,Serial, midiOut); // create a MIDI object called midiOut
void setup() {
Serial.begin(31250); // setup serial for MIDI
}
void loop() {
midiOut.sendControlChange(56,127,1); // send a MIDI CC -- 56 = note, 127 = velocity, 1 = channel
delay(1000); // wait 1 second
midiOut.sendProgramChange(12,1); // send a MIDI PC -- 12 = value, 1 = channel
delay(1000); // wait 1 second
}
此代碼將發(fā)送CC消息,等待1秒鐘,發(fā)送PC消息,然后無限期等待1秒鐘。如果一切正常,您應(yīng)該會在MIDI監(jiān)視器中看到一條消息。
如果什么都沒有發(fā)生,請不要驚慌!嘗試進(jìn)行故障排除:
確保所有連接正確
檢查MIDI端口是否正確接線–外部邊緣應(yīng)有2個備用引腳
再次檢查電路是否正確
使用MIDI電纜驗證電路是否已連接到USB-MIDI接口
檢查MIDI電纜是否已連接到輸入
確保Arduino具備電源
為您的USB-MIDI接口安裝正確的驅(qū)動程序
如果您仍然有問題,可能值得檢查一下面包板。廉價板有時可能會非常不一致且質(zhì)量低下–這是我在從事此項目時遇到的。
按鈕測試
現(xiàn)在是時候測試按鈕是否正常工作了。上載以下測試代碼。無需連接MIDI即可測試此部分。
const int buttonOne = 6; // assign button pin to variable
const int buttonTwo = 7; // assign button pin to variable
void setup() {
Serial.begin(9600); // setup serial for text
pinMode(buttonOne,INPUT); // setup button as input
pinMode(buttonTwo,INPUT); // setup button as input
}
void loop() {
if(digitalRead(buttonOne) == HIGH) { // check button state
delay(10); // software de-bounce
if(digitalRead(buttonOne) == HIGH) { // check button state again
Serial.println(“Button One Works!”); // log result
delay(250);
}
}
if(digitalRead(buttonTwo) == HIGH) { // check button state
delay(10); // software de-bounce
if(digitalRead(buttonTwo) == HIGH) { // check button state again
Serial.println(“Button Two Works!”); // log result
delay(250);
}
}
}
運行此代碼(但保持USB電纜連接)并打開串行監(jiān)視器(右上角》串行監(jiān)視器)。當(dāng)您按下一個按鈕時,根據(jù)所按下的按鈕,您應(yīng)該會看到“ Button OneWorks!”或“ Button Two Works!”。
此示例中有一個重要說明-軟件de -彈跳。這是檢查按鈕與再次檢查按鈕之間的簡單10毫秒(ms)延遲。這可以提高按鈕按下的準(zhǔn)確性,并有助于防止噪聲觸發(fā)Arduino。盡管建議這樣做,但您不必這樣做。
創(chuàng)建控制器
現(xiàn)在所有的東西都已經(jīng)連接好并且可以正常工作了,現(xiàn)在該組裝完整的控制器了。
此示例將為每個按下的按鈕發(fā)送不同的CC消息。我正在使用它來控制OS X上的Ableton Live 9.6。代碼與上面的兩個測試示例相似。
#include
#include
#include
#include
#include
const int buttonOne = 6; // assign button pin to variable
const int buttonTwo = 7; // assign button pin to variable
MIDI_CREATE_INSTANCE(HardwareSerial,Serial, midiOut); // create a MIDI object called midiOut
void setup() {
pinMode(buttonOne,INPUT); // setup button as input
pinMode(buttonTwo,INPUT); // setup button as input
Serial.begin(31250); // setup MIDI output
}
void loop() {
if(digitalRead(buttonOne) == HIGH) { // check button state
delay(10); // software de-bounce
if(digitalRead(buttonOne) == HIGH) { // check button state again
midiOut.sendControlChange(56,127,1); // send a MIDI CC -- 56 = note, 127 = velocity, 1 = channel
delay(250);
}
}
if(digitalRead(buttonTwo) == HIGH) { // check button state
delay(10); // software de-bounce
if(digitalRead(buttonTwo) == HIGH) { // check button state again
midiOut.sendControlChange(42,127,1); // send a MIDI CC -- 42 = note, 127 = velocity, 1 = channel
delay(250);
}
}
}
注意-您將無法使用具有MIDI輸出的Serial.println()。
如果要發(fā)送PC消息而不是CC,只需替換:
midiOut.sendControlChange(42,127,1);
使用以下內(nèi)容:
midiOut.sendProgramChange(value, channel);
實際操作
以下是作為Ableton Live(每種預(yù)算的最佳DJ軟件)的控制器的演示。
您已經(jīng)制作了一個MIDI控制器嗎?
其中有一個自定義MIDI控制器的許多實際用途。您可以建造一個大型的腳踏控制單元,或者一個時尚的錄音棚控制器。如果您有興趣購買一個,這里是您可以購買的最好的USB MIDI控制器。
責(zé)任編輯:wv
-
控制器
+關(guān)注
關(guān)注
114文章
17116瀏覽量
184442 -
MIDI
+關(guān)注
關(guān)注
0文章
78瀏覽量
16197 -
Arduino
+關(guān)注
關(guān)注
190文章
6498瀏覽量
192267
發(fā)布評論請先 登錄


WT588F02B-8S(B2)語音芯片MIDI版本說明V1
基于Arduino的MIDI架子鼓創(chuàng)建



Y1620工程機械主機控制器 車載智能控制器 CAN總線 #工程機械控制器 #整車控制器 #車載控制器
MIDI Unit:專業(yè)音頻控制單元,玩轉(zhuǎn)MIDI音樂制作


LabVIEW運動控制(一):EtherCAT運動控制器的SCARA機械手應(yīng)用 #正運動技術(shù) #運動控制器
如何使用Arduino實現(xiàn)CAN總線通信呢
開源項目!基于 Arduino 的 MIDI 架子鼓
stm32與Arduino的比較
如何選擇合適的PID控制器

國產(chǎn)控制器廠家 整車控制器 以太網(wǎng)控制器 CAN控制器 國產(chǎn)化替代

車載智能控制器 工程機械控制器 CAN總線控制器 碩博電子 #控制器 #can總線 #國產(chǎn)化替代

評論