電爵士鼓入門(DIY一套便宜好用的電子爵士鼓)
2023-08-06 06:23:06
只需一塊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口,硬體部分就全部完成了!
這裡需要在安裝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的串口號,在「SerialMIDI 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架子鼓的一些經驗。基於這種思想,還可以做出很多不一樣的樂器,以及多用途控制器等產品。
,