隻需一塊Arduino MEGA闆,再配置好電腦(Linux操作系統)上免費或者開源的MIDI應用程序,即可制成一套真正能夠用來演奏的電子爵士鼓。根據你的心願,它可以被做成任何樣式:可以是自己設計的鼓架,也可以是薄膜狀,甚至可以用更加高端的傳感器,玩出各種花樣來。
準備材料筆者的鼓架由Φ28mm的透明PC管和金屬連接件構成,上面安裝有7個鼓面和2個踏闆,有一個腳踏的低音大鼓(Bass Drum,又稱“底鼓”)、一個軍鼓、兩個嗵嗵鼓(Tom-Tom Drum)、一個吊镲(Crash Cymbal)、一個節奏镲(Ride Cymbal)和一個帶踏闆的踩镲(Hi-Hat)。
主要的電子設備是一塊Arduino MEGA開發闆,還有壓電陶瓷片——它可以用電壓表示其表面壓力的變化率,從而起到采集鼓面震動情況的作用。
制作過程1 先從制作鼓面開始。為了降低敲擊噪聲,我用雙面膠在木闆上粘貼了一層2mm厚的軟橡膠(你也可以用鼠标墊代替)。這樣既可以靈敏地測到數據,木闆本身又不會發出太大的聲響。
2 然後在沒有橡膠的一面粘上壓電陶瓷片(也叫壓電震動傳感器,或者piezo)。如果是新的元器件,焊接導線可能有一點難度,需要塗上助焊劑,用合适的溫度快速焊上。此外提醒,傳感器片不可以用502膠水粘貼,502膠水會腐蝕壓電陶瓷。在元器件兩端并聯一個1kΩ的電阻,防止元器件産生太高的電壓。完成後可以用示波器測試元器件的輸出電壓,确保即使大力敲擊木闆,元器件也不會産生高于5V的電壓,因為Arduino的ADC最大隻可以承受5V的輸入。将這些元器件用膠布固定好,制作出不同大小的多個鼓面。
3 然後就可以将制作好的鼓面固定在支架上了。我用了M10絲杆和螺帽,以及自己設計的3D打印件。
4 踏闆很好制作。如果不需要力度響應,用兩個鍵盤的延音踏闆即可(實際為腳踏開關)。
5 接下來測試下位機端的程序。圖中所示為Arduino Nano,因為其模拟輸入口數量不夠,最終換用Arduino MEGA。設計一塊擴展闆,以便用你喜歡的接口連接各個鼓面。
6 将鼓面按程序中設定好的順序分别連接闆子的I/O口,硬件部分就全部完成了!
PC端軟件
這裡需要在安裝Linux操作系統的PC上安裝以下軟件:
(1)Jackd:這是一個簡單易用的MIDI、ALSA接口管理器;
(2)Qjackctl:Jackd的GUI界面,可能會自動安裝上;
(3)Fluidsynth:MIDI合成器;
(4)Qsynth:Fluidsynth的GUI;
(5)Fluid-soundfont-gm:免費的MIDI音色庫;
(6)Hairless-Midiserial:MIDI-串口轉換器。
如果需要編曲、伴奏等更高級的功能,還需要rosegarden等音序器應用程序。
将它們分别打開,進行一些設置。
1 打開Hairless的Settings,設置好對應的波特率,然後選擇Arduino的串口号,在“Serial<->MIDI Bridge On”前打鈎,此時Arduino會重啟。
2 打開QSynth的Setup,切換到Soundfonts選項卡,單擊“Open”加載Fluid音色庫。
3 最後一步,打開Qjackd 的Connects窗口,在ALSA選項卡中,将Hairless的輸出端口連接到Fluid的輸入端口上,大功告成!
4 在QSynth的Channels窗口中選擇第10通道,可以切換很多種鼓的聲音。
設置好這些後,就可以試着演奏了,電腦的揚聲器中會實時播放出你敲擊的鼓面所對應的聲音。
MIDI協議Arduino向PC發送信息的代碼片段如下:
void midiSend (int cmd, int pitch, int velocity) {
Serial.write(cmd);
Serial.write(pitch);
Serial.write(velocity);
}
這種通信協議就是MIDI協議。标準的樂器MIDI有其特定的波特率(31250)。因為我們這裡可以使用串口-MIDI轉換,所以可以随意設置波特率。一句MIDI指令包含3字節數據:
(1)MIDI命令,就是啟動或者停止一個音符;
(2)音符,指定要傳送的是哪個音符;
(3)力度,這個音符的演奏力度強弱。
//Adjust this if your pads are
dull or too sensitive
//{crash, hat, snare, tom_bass, crash_right, tom_high, tom_low}
unsigned char adc_cutoff[7]=
{3,3,10,7,3,3,3};
//minimum strength
unsigned char adc_limit[7]=
{40,10,30,50,40,10,10};
//maximum strength
以上這段代碼是每個鼓面力度範圍設置,請根據制作所用的材料和結構不同進行設置,如果某些鼓面不靈敏,或者過于靈敏,這些值有可能需要大幅調節。
然後,程序會輪詢收集來自各個傳感器的數據并判斷兩個踏闆的開關量。
for(byte count=0;count<=6;count )
{
adc_sample[count]=map(analogRead (adc_channel[count]),0,1023,0,254);
}
因為在一次敲擊過程中,鼓面可能會振動一小段時間,可能會使Arduino采集了太多次,向電腦發送大量數據,導緻電腦停止響應。簡單的解決方法是,在每次采集過程的最後加一句“delay(5);”。這種方法不會降低實時性。
以上這些就是制作這套Arduino架子鼓的一些經驗。基于這種思想,還可以做出很多不一樣的樂器,以及多用途控制器等産品。
,