陳業欣,豐大軍,張 蓓
(華北計算機系統工程研究所,北京 100083)
聲音是人類感知世界和溝通交流的重要途經,蘊含著豐富的藝術、情感與信息。音樂更是人們表達情感的重要手段,中國古代就將音樂上升至“和民聲,善民心”的層面,且禮樂并重。電聲學交叉涵蓋數學、物理、電器電子、電磁學、計算機科學、生理、藝術等眾多學科知識,且學科間跨度很大,它是對聲音信號進行創造、加工、處理的學科[1]。我國的電聲行業起步較晚,盡管在21世紀初期電聲元器件和消費類數碼產品蓬勃發展的帶動下取得了巨大的經濟利益,但專業電聲產品領域的研究仍處在空白階段。中國的電聲企業幾乎沒有電子器樂產品,現階段國內所使用的合成器均為歐美國家及日本的產品。本文針對合成器的演奏控制部分(即音序器)進行研究,設計并開發了一種基于Arduino的多軌道Midi音序器,介紹了音序器的系統功能及硬件設計,給出了音序播放、錄制及其他控制的復雜邏輯的軟件解決辦法,實現了真正可實際應用在電子樂創作及現場表演的多軌道Midi音序器。
合成器因其區別于常規管弦樂器的聲音,而且擁有豐富多變的音色,因此在電子音樂創作中被作為主要的器樂來使用。其組成可分為演奏控制部分和音色合成部分,分別對應演奏樂句和調制音色的功能[2]。通常合成器的演奏控制部分均為帶有鍵盤的音序器,且與合成器集成于一體,而在某些種類電子音樂(如Techno、House等)的現場表演中,需要用到多臺合成器同時依靠音序器來演奏從而形成復雜的和聲、復調及音色結構。而合成器自帶的音序器一般較為簡單且各品牌產品功能及規格不統一,在多臺合成器自帶音序器上進行音序的編輯及播放給準備工作及現場演出都帶來了一定的麻煩。因此需要實現一種具有標準Midi接口[3]、操作簡便、可同時驅動多軌道的獨立音序器。
完整的音序器需要如下三個功能:實時演奏功能、音序播放功能、音序錄制功能。
實時演奏功能需要在系統待機狀態下實時接收鍵盤的輸入信號(包含音高信息與力度信息等)并將其轉化為Midi信號輸出;可調節演奏的Midi通道并可更改當前音序器的步進長度(默認16步進,最長32步進)。
當觸發音序播放功能時,系統將按照當前設置的拍速播放選定的已存儲音序工程(以下簡稱“工程”,包含三個最長32步進的音序),并分別將三個音序的音高、力度及Midi時鐘信息以預先設定的三個Midi通道輸出,同時在播放時可實時切換不同的工程、改變拍速。
當使用音序錄制功能時,使用鍵盤輸入每一步進的音高信息及力度信息,并可將任意步進空拍,分別錄制當前選定工程的三個音序。
硬件平臺的搭建以Arduino Mega 2560開發板為系統邏輯控制及存儲的核心。該控制板擁有54路數字輸入輸出接口,其中15路可作為PWM輸出,16路模擬輸入,4路UART接口,且擁有256 KB的Flash,8 KB動態內存及2 KB EEPROM存儲空間,可實現大量輸入輸出的復雜邏輯[4]。
本系統的外部硬件設備均采用簡單的數字、模擬按鍵或旋鈕輸入及數碼管、LED等簡單的顯示模塊,因5 V供電電壓且接口電流小,所以功耗較低。以Arduino Mega 2560為邏輯控制的核心,實現對復雜多變的輸入與輸出的控制[5]。系統硬件結構框圖如圖1所示。

圖1 系統硬件結構框圖
本系統輸入部分需完成模式控制、音符音高輸入、音符力度輸入、工程選擇、拍速設置、步進長度設置、Midi通道設置。
模式控制使用4鍵模擬鍵盤分別實現播放及停止、步進錄制及停止、激活步進長度修改模式、激活實時演奏Midi通道修改模式,只需占用一個模擬輸入接口;音符音高輸入由4×4矩陣鍵盤實現,占用8個數字接口,利用數字掃描實現信號的輸入,響應速度快,鍵盤共16個按鍵,其中13個按鍵用于滿足一個八度音及下一八度C的音高輸入需要,兩個按鍵用于實現鍵盤八度的移掉控制(使得一個八度的鍵盤也可輸入C0至G10的完整音域),剩余一個按鍵用于在步進錄制模式下音符的靜音(即空拍);音符力度輸入采用旋轉電位器模擬接口輸入,占用一個模擬輸入接口,可輸入從0至Midi標準值127的完整力度信息,且力度輸入與鍵盤分離的設計凸顯了本系統簡單創新的設計理念;工程選擇不僅在待機模式下需要完成選定,在播放音序時更需要實時響應工程選擇的變化,因此采用10擋位數字波段開關來實現,占用10個數字接口,用于快速選擇播放及錄制的工程編號;拍速設置范圍設置在60~160 BPM(Beats Per Minute,單位時間內的拍數)之間,需要準確控制速度,拍速穩定不漂移,并且在音序播放時要實時響應拍速變化,因此選用無限旋轉數字脈沖電位器作為輸入控制,占用一個外部中斷接口及數字接口,以外部中斷進行更改拍速寄存數值的方式實時響應速度控制;步進長度設置需要按下模式控制鍵盤對應按鍵來激活此模式,并復用數字脈沖電位器更改步進長度從1至32的變化;Midi通道設置需要按下模式控制鍵盤對應按鍵激活此模式,并復用矩陣鍵盤16個按鍵選擇所需的16個Midi通道之一。
本系統輸出部分需完成Midi信號標準接口的輸出、拍速的顯示、步進錄制時工程中音序編號的顯示、Midi通道的顯示、音序播放時步進位置的顯示、步進錄制時步進位置的顯示、步進長度修改時長度的顯示、實時演奏時力度輸入的顯示。
Midi接口采用標準5針Midi接口,占用一個串口輸出口;拍速、音序編號及Midi通道均為數字信息,因此選用TM1650芯片驅動4位數碼管實現相關信息的顯示,只需要占用兩路數字接口;步進位置、長度及力度輸入等信息的顯示采用16位RGB全彩內置WS2811芯片的LED燈條分別對應16步進(或32步進以顏色區分)或力度,且只需占用一個數字接口。
系統軟件設計基于Arduino IDE軟件開發環境,使用C/C++編程語言。Arduino有豐富的庫文件以供使用,利用庫文件適當地簡化了程序開發工作[6]。軟件設計時把整個系統程序分為三個模塊:實時演奏主程序、音序播放子程序、音序錄制子程序、多軌道Midi設置子程序及外部中斷子程序(拍速及步進長度設置),首先對主程序框架進行設計,并針對每個模塊進行獨立設計,最后將各模塊構建一個完整的工程,并燒錄進Arduino Mega 2560開發板。
由于在系統開機進入待機狀態后,需要實時響應鍵盤的輸入并輸出Midi信號,因此以實時演奏作為系統的主程序,主程序流程圖如圖2所示。
在正式進入主程序流程前,必須先進行初始化工作,包括完成串口、數碼管、LED的初始化設置,各數字、模擬引腳的初始化設置,開中斷,讀取Midi設置等流程。在初始化完成后判斷啟動模式,開始實時演奏或進入多軌道Midi設置子程序。拍速設置、步進長度設置、演奏Midi通道設置及選擇播放或錄制的音序均需要在判斷是否進入音序播放及音序錄制模式之前完成。若未進入音序播放及錄制模式,則讀取數字掃描鍵盤有無輸入,并將輸入按鍵映射為相應音高的Midi信號,旋轉電位器輸入映射為力度的Midi信號,并通過串口發送至外部。

圖2 主程序流程圖
進入音序播放子程序之前需要在主程序獲取拍速、步進長度、多軌道Midi設置及所要播放的工程編號。進入音序播放子程序后開始進入播放循環,長度與步進長度一致,每個步進即占用一個循環節,在4/4拍的音樂中,每一步進代表16分音符,4個步進占用4分音符的時值即為一拍,默認步進長度為16,即完整播放一次音序為4拍。在音樂演奏過程中,丟拍的代價遠比音符演奏錯誤要高,所以Midi協議采用異步串行的通信方式,并規定每16分音符需要包含6個Midi時鐘[7]。
因此,每個循環節內首先在LED燈條上顯示當前步進的位置(如第一個步進則點亮16個LED燈的第一個,如第17個步進則用不同顏色點亮第一個LED燈),向窗口發送6個時鐘信號(單字節數據0xF8),并分別從Arduino的EEPRom讀取及向串口發送由所存儲選定工程的三組音序的音高及力度信息組成的音符開始信號,通過拍速(定義為每分鐘包含的拍數)計算出每步進的時值并延遲響應時間后發送音符停止信號,從而保證每一步進的音符保持了當前拍速下16分音符的時值,而后判斷音序播放模式標志位,若為真則開始下一步進的循環節,否則跳出音序播放子程序回到主程序。若在多軌道Midi設置子程序中走帶控制位為真,則在以上流程發送Midi時鐘信號前向串口發送走帶開始信號(單字節數據0xFA),并在跳出音序播放子程序后發送走帶停止信號(單字節數據0xFC)再進入主程序。
與播放子程序一樣,進入錄制子程序之前需要在主程序獲取步進長度、多軌道Midi設置及所要播放的工程編號。進入音序錄制子程序后開始進入錄制循環,長度與步進長度一致,每個步進即占用一個循環節。每個循環節開始時判斷所選擇當前工程下的音序編號(由波段開關進行選擇),并在LED燈條顯示當前步進位置,當數字掃描鍵盤按鍵觸發時同時讀取旋轉電位器獲取力度信息,向串口發送音符開始信息,當按鍵釋放時錄入當前音序的數組,而后判斷音序錄制模式標志位,若為真則開始下一步進的循環節,否則將當前工程的三個音序數組寫入到EEPRom后跳出音序錄制子程序回到主程序。
開機啟動時按下模擬鍵盤的Midi設置鍵進入多軌道Midi設置子程序,通過波段開關選擇默認三個音序的Midi通道設置及Midi走帶控制標志位設置,選中其中一個設置并通過數字掃描鍵盤的輸入完成對當前設置的修改。Midi通道可完成16個通道的設置分別對應數字掃描鍵盤的16個按鍵。Midi協議中走帶控制信號用于控制對器樂演奏時各器樂自帶音序器的播放與停止,在本系統應用場景下只需控制鼓機的走帶控制即可,若無需鼓組的音樂則無需走帶控制信號,只需要利用Midi時鐘信號進行同步。
由于在音序播放模式下,演奏者可能會對當前演奏拍速進行調節,故需要利用外部中斷接收數字脈沖電位器發出的正脈沖與負脈沖兩種信號來分別控制拍速寄存數值及步進長度寄存數值的增減。高頻脈沖速度使得中斷時間微乎其微(人耳可辨識時延范圍大概為20 ms,中斷程序只進行簡單的加減運算,故不會被人耳察覺),因此不會影響音序播放的速度。
本文完成了基于Arduino的多軌道Midi音序器的設計與實現,并闡述了系統的功能和硬件設計以及程序結構的設計,編寫了完整的程序代碼。經過實際演奏及準備工作的測試,系統運行穩定。該系統實現了在一臺音序器上利用標準Midi接口驅動三臺合成器音源同時演奏的基本使用需求以及錄制工作的需求,解決了多臺合成器演奏及錄制工作復雜的問題。在硬件設計上采用簡單易于操作的顯示及輸入模塊,力度與音高輸入分離的設計提高了音序化合成器現場演奏的操作性,波段開關的設計替代了國外產品利用組合按鍵的設計使得歌曲工程的切換更快速準確,全彩LED燈條比同類產品單色LED燈條可顯示更復雜的步進位置信息。
本系統具有功耗低、通用性好、體積小、操作簡單及運行穩定的優點,在國產電聲器樂產品中較為先進且市場前景較大,可突破國外企業對世界專業電聲器樂市場的壟斷。