陳業(yè)欣,豐大軍,張 蓓
(華北計(jì)算機(jī)系統(tǒng)工程研究所,北京 100083)
聲音是人類感知世界和溝通交流的重要途經(jīng),蘊(yùn)含著豐富的藝術(shù)、情感與信息。音樂更是人們表達(dá)情感的重要手段,中國(guó)古代就將音樂上升至“和民聲,善民心”的層面,且禮樂并重。電聲學(xué)交叉涵蓋數(shù)學(xué)、物理、電器電子、電磁學(xué)、計(jì)算機(jī)科學(xué)、生理、藝術(shù)等眾多學(xué)科知識(shí),且學(xué)科間跨度很大,它是對(duì)聲音信號(hào)進(jìn)行創(chuàng)造、加工、處理的學(xué)科[1]。我國(guó)的電聲行業(yè)起步較晚,盡管在21世紀(jì)初期電聲元器件和消費(fèi)類數(shù)碼產(chǎn)品蓬勃發(fā)展的帶動(dòng)下取得了巨大的經(jīng)濟(jì)利益,但專業(yè)電聲產(chǎn)品領(lǐng)域的研究仍處在空白階段。中國(guó)的電聲企業(yè)幾乎沒有電子器樂產(chǎn)品,現(xiàn)階段國(guó)內(nèi)所使用的合成器均為歐美國(guó)家及日本的產(chǎn)品。本文針對(duì)合成器的演奏控制部分(即音序器)進(jìn)行研究,設(shè)計(jì)并開發(fā)了一種基于Arduino的多軌道Midi音序器,介紹了音序器的系統(tǒng)功能及硬件設(shè)計(jì),給出了音序播放、錄制及其他控制的復(fù)雜邏輯的軟件解決辦法,實(shí)現(xiàn)了真正可實(shí)際應(yīng)用在電子樂創(chuàng)作及現(xiàn)場(chǎng)表演的多軌道Midi音序器。
合成器因其區(qū)別于常規(guī)管弦樂器的聲音,而且擁有豐富多變的音色,因此在電子音樂創(chuàng)作中被作為主要的器樂來使用。其組成可分為演奏控制部分和音色合成部分,分別對(duì)應(yīng)演奏樂句和調(diào)制音色的功能[2]。通常合成器的演奏控制部分均為帶有鍵盤的音序器,且與合成器集成于一體,而在某些種類電子音樂(如Techno、House等)的現(xiàn)場(chǎng)表演中,需要用到多臺(tái)合成器同時(shí)依靠音序器來演奏從而形成復(fù)雜的和聲、復(fù)調(diào)及音色結(jié)構(gòu)。而合成器自帶的音序器一般較為簡(jiǎn)單且各品牌產(chǎn)品功能及規(guī)格不統(tǒng)一,在多臺(tái)合成器自帶音序器上進(jìn)行音序的編輯及播放給準(zhǔn)備工作及現(xiàn)場(chǎng)演出都帶來了一定的麻煩。因此需要實(shí)現(xiàn)一種具有標(biāo)準(zhǔn)Midi接口[3]、操作簡(jiǎn)便、可同時(shí)驅(qū)動(dòng)多軌道的獨(dú)立音序器。
完整的音序器需要如下三個(gè)功能:實(shí)時(shí)演奏功能、音序播放功能、音序錄制功能。
實(shí)時(shí)演奏功能需要在系統(tǒng)待機(jī)狀態(tài)下實(shí)時(shí)接收鍵盤的輸入信號(hào)(包含音高信息與力度信息等)并將其轉(zhuǎn)化為Midi信號(hào)輸出;可調(diào)節(jié)演奏的Midi通道并可更改當(dāng)前音序器的步進(jìn)長(zhǎng)度(默認(rèn)16步進(jìn),最長(zhǎng)32步進(jìn))。
當(dāng)觸發(fā)音序播放功能時(shí),系統(tǒng)將按照當(dāng)前設(shè)置的拍速播放選定的已存儲(chǔ)音序工程(以下簡(jiǎn)稱“工程”,包含三個(gè)最長(zhǎng)32步進(jìn)的音序),并分別將三個(gè)音序的音高、力度及Midi時(shí)鐘信息以預(yù)先設(shè)定的三個(gè)Midi通道輸出,同時(shí)在播放時(shí)可實(shí)時(shí)切換不同的工程、改變拍速。
當(dāng)使用音序錄制功能時(shí),使用鍵盤輸入每一步進(jìn)的音高信息及力度信息,并可將任意步進(jìn)空拍,分別錄制當(dāng)前選定工程的三個(gè)音序。
硬件平臺(tái)的搭建以Arduino Mega 2560開發(fā)板為系統(tǒng)邏輯控制及存儲(chǔ)的核心。該控制板擁有54路數(shù)字輸入輸出接口,其中15路可作為PWM輸出,16路模擬輸入,4路UART接口,且擁有256 KB的Flash,8 KB動(dòng)態(tài)內(nèi)存及2 KB EEPROM存儲(chǔ)空間,可實(shí)現(xiàn)大量輸入輸出的復(fù)雜邏輯[4]。
本系統(tǒng)的外部硬件設(shè)備均采用簡(jiǎn)單的數(shù)字、模擬按鍵或旋鈕輸入及數(shù)碼管、LED等簡(jiǎn)單的顯示模塊,因5 V供電電壓且接口電流小,所以功耗較低。以Arduino Mega 2560為邏輯控制的核心,實(shí)現(xiàn)對(duì)復(fù)雜多變的輸入與輸出的控制[5]。系統(tǒng)硬件結(jié)構(gòu)框圖如圖1所示。
圖1 系統(tǒng)硬件結(jié)構(gòu)框圖
本系統(tǒng)輸入部分需完成模式控制、音符音高輸入、音符力度輸入、工程選擇、拍速設(shè)置、步進(jìn)長(zhǎng)度設(shè)置、Midi通道設(shè)置。
模式控制使用4鍵模擬鍵盤分別實(shí)現(xiàn)播放及停止、步進(jìn)錄制及停止、激活步進(jìn)長(zhǎng)度修改模式、激活實(shí)時(shí)演奏Midi通道修改模式,只需占用一個(gè)模擬輸入接口;音符音高輸入由4×4矩陣鍵盤實(shí)現(xiàn),占用8個(gè)數(shù)字接口,利用數(shù)字掃描實(shí)現(xiàn)信號(hào)的輸入,響應(yīng)速度快,鍵盤共16個(gè)按鍵,其中13個(gè)按鍵用于滿足一個(gè)八度音及下一八度C的音高輸入需要,兩個(gè)按鍵用于實(shí)現(xiàn)鍵盤八度的移掉控制(使得一個(gè)八度的鍵盤也可輸入C0至G10的完整音域),剩余一個(gè)按鍵用于在步進(jìn)錄制模式下音符的靜音(即空拍);音符力度輸入采用旋轉(zhuǎn)電位器模擬接口輸入,占用一個(gè)模擬輸入接口,可輸入從0至Midi標(biāo)準(zhǔn)值127的完整力度信息,且力度輸入與鍵盤分離的設(shè)計(jì)凸顯了本系統(tǒng)簡(jiǎn)單創(chuàng)新的設(shè)計(jì)理念;工程選擇不僅在待機(jī)模式下需要完成選定,在播放音序時(shí)更需要實(shí)時(shí)響應(yīng)工程選擇的變化,因此采用10擋位數(shù)字波段開關(guān)來實(shí)現(xiàn),占用10個(gè)數(shù)字接口,用于快速選擇播放及錄制的工程編號(hào);拍速設(shè)置范圍設(shè)置在60~160 BPM(Beats Per Minute,單位時(shí)間內(nèi)的拍數(shù))之間,需要準(zhǔn)確控制速度,拍速穩(wěn)定不漂移,并且在音序播放時(shí)要實(shí)時(shí)響應(yīng)拍速變化,因此選用無限旋轉(zhuǎn)數(shù)字脈沖電位器作為輸入控制,占用一個(gè)外部中斷接口及數(shù)字接口,以外部中斷進(jìn)行更改拍速寄存數(shù)值的方式實(shí)時(shí)響應(yīng)速度控制;步進(jìn)長(zhǎng)度設(shè)置需要按下模式控制鍵盤對(duì)應(yīng)按鍵來激活此模式,并復(fù)用數(shù)字脈沖電位器更改步進(jìn)長(zhǎng)度從1至32的變化;Midi通道設(shè)置需要按下模式控制鍵盤對(duì)應(yīng)按鍵激活此模式,并復(fù)用矩陣鍵盤16個(gè)按鍵選擇所需的16個(gè)Midi通道之一。
本系統(tǒng)輸出部分需完成Midi信號(hào)標(biāo)準(zhǔn)接口的輸出、拍速的顯示、步進(jìn)錄制時(shí)工程中音序編號(hào)的顯示、Midi通道的顯示、音序播放時(shí)步進(jìn)位置的顯示、步進(jìn)錄制時(shí)步進(jìn)位置的顯示、步進(jìn)長(zhǎng)度修改時(shí)長(zhǎng)度的顯示、實(shí)時(shí)演奏時(shí)力度輸入的顯示。
Midi接口采用標(biāo)準(zhǔn)5針Midi接口,占用一個(gè)串口輸出口;拍速、音序編號(hào)及Midi通道均為數(shù)字信息,因此選用TM1650芯片驅(qū)動(dòng)4位數(shù)碼管實(shí)現(xiàn)相關(guān)信息的顯示,只需要占用兩路數(shù)字接口;步進(jìn)位置、長(zhǎng)度及力度輸入等信息的顯示采用16位RGB全彩內(nèi)置WS2811芯片的LED燈條分別對(duì)應(yīng)16步進(jìn)(或32步進(jìn)以顏色區(qū)分)或力度,且只需占用一個(gè)數(shù)字接口。
系統(tǒng)軟件設(shè)計(jì)基于Arduino IDE軟件開發(fā)環(huán)境,使用C/C++編程語言。Arduino有豐富的庫文件以供使用,利用庫文件適當(dāng)?shù)睾?jiǎn)化了程序開發(fā)工作[6]。軟件設(shè)計(jì)時(shí)把整個(gè)系統(tǒng)程序分為三個(gè)模塊:實(shí)時(shí)演奏主程序、音序播放子程序、音序錄制子程序、多軌道Midi設(shè)置子程序及外部中斷子程序(拍速及步進(jìn)長(zhǎng)度設(shè)置),首先對(duì)主程序框架進(jìn)行設(shè)計(jì),并針對(duì)每個(gè)模塊進(jìn)行獨(dú)立設(shè)計(jì),最后將各模塊構(gòu)建一個(gè)完整的工程,并燒錄進(jìn)Arduino Mega 2560開發(fā)板。
由于在系統(tǒng)開機(jī)進(jìn)入待機(jī)狀態(tài)后,需要實(shí)時(shí)響應(yīng)鍵盤的輸入并輸出Midi信號(hào),因此以實(shí)時(shí)演奏作為系統(tǒng)的主程序,主程序流程圖如圖2所示。
在正式進(jìn)入主程序流程前,必須先進(jìn)行初始化工作,包括完成串口、數(shù)碼管、LED的初始化設(shè)置,各數(shù)字、模擬引腳的初始化設(shè)置,開中斷,讀取Midi設(shè)置等流程。在初始化完成后判斷啟動(dòng)模式,開始實(shí)時(shí)演奏或進(jìn)入多軌道Midi設(shè)置子程序。拍速設(shè)置、步進(jìn)長(zhǎng)度設(shè)置、演奏Midi通道設(shè)置及選擇播放或錄制的音序均需要在判斷是否進(jìn)入音序播放及音序錄制模式之前完成。若未進(jìn)入音序播放及錄制模式,則讀取數(shù)字掃描鍵盤有無輸入,并將輸入按鍵映射為相應(yīng)音高的Midi信號(hào),旋轉(zhuǎn)電位器輸入映射為力度的Midi信號(hào),并通過串口發(fā)送至外部。
圖2 主程序流程圖
進(jìn)入音序播放子程序之前需要在主程序獲取拍速、步進(jìn)長(zhǎng)度、多軌道Midi設(shè)置及所要播放的工程編號(hào)。進(jìn)入音序播放子程序后開始進(jìn)入播放循環(huán),長(zhǎng)度與步進(jìn)長(zhǎng)度一致,每個(gè)步進(jìn)即占用一個(gè)循環(huán)節(jié),在4/4拍的音樂中,每一步進(jìn)代表16分音符,4個(gè)步進(jìn)占用4分音符的時(shí)值即為一拍,默認(rèn)步進(jìn)長(zhǎng)度為16,即完整播放一次音序?yàn)?拍。在音樂演奏過程中,丟拍的代價(jià)遠(yuǎn)比音符演奏錯(cuò)誤要高,所以Midi協(xié)議采用異步串行的通信方式,并規(guī)定每16分音符需要包含6個(gè)Midi時(shí)鐘[7]。
因此,每個(gè)循環(huán)節(jié)內(nèi)首先在LED燈條上顯示當(dāng)前步進(jìn)的位置(如第一個(gè)步進(jìn)則點(diǎn)亮16個(gè)LED燈的第一個(gè),如第17個(gè)步進(jìn)則用不同顏色點(diǎn)亮第一個(gè)LED燈),向窗口發(fā)送6個(gè)時(shí)鐘信號(hào)(單字節(jié)數(shù)據(jù)0xF8),并分別從Arduino的EEPRom讀取及向串口發(fā)送由所存儲(chǔ)選定工程的三組音序的音高及力度信息組成的音符開始信號(hào),通過拍速(定義為每分鐘包含的拍數(shù))計(jì)算出每步進(jìn)的時(shí)值并延遲響應(yīng)時(shí)間后發(fā)送音符停止信號(hào),從而保證每一步進(jìn)的音符保持了當(dāng)前拍速下16分音符的時(shí)值,而后判斷音序播放模式標(biāo)志位,若為真則開始下一步進(jìn)的循環(huán)節(jié),否則跳出音序播放子程序回到主程序。若在多軌道Midi設(shè)置子程序中走帶控制位為真,則在以上流程發(fā)送Midi時(shí)鐘信號(hào)前向串口發(fā)送走帶開始信號(hào)(單字節(jié)數(shù)據(jù)0xFA),并在跳出音序播放子程序后發(fā)送走帶停止信號(hào)(單字節(jié)數(shù)據(jù)0xFC)再進(jìn)入主程序。
與播放子程序一樣,進(jìn)入錄制子程序之前需要在主程序獲取步進(jìn)長(zhǎng)度、多軌道Midi設(shè)置及所要播放的工程編號(hào)。進(jìn)入音序錄制子程序后開始進(jìn)入錄制循環(huán),長(zhǎng)度與步進(jìn)長(zhǎng)度一致,每個(gè)步進(jìn)即占用一個(gè)循環(huán)節(jié)。每個(gè)循環(huán)節(jié)開始時(shí)判斷所選擇當(dāng)前工程下的音序編號(hào)(由波段開關(guān)進(jìn)行選擇),并在LED燈條顯示當(dāng)前步進(jìn)位置,當(dāng)數(shù)字掃描鍵盤按鍵觸發(fā)時(shí)同時(shí)讀取旋轉(zhuǎn)電位器獲取力度信息,向串口發(fā)送音符開始信息,當(dāng)按鍵釋放時(shí)錄入當(dāng)前音序的數(shù)組,而后判斷音序錄制模式標(biāo)志位,若為真則開始下一步進(jìn)的循環(huán)節(jié),否則將當(dāng)前工程的三個(gè)音序數(shù)組寫入到EEPRom后跳出音序錄制子程序回到主程序。
開機(jī)啟動(dòng)時(shí)按下模擬鍵盤的Midi設(shè)置鍵進(jìn)入多軌道Midi設(shè)置子程序,通過波段開關(guān)選擇默認(rèn)三個(gè)音序的Midi通道設(shè)置及Midi走帶控制標(biāo)志位設(shè)置,選中其中一個(gè)設(shè)置并通過數(shù)字掃描鍵盤的輸入完成對(duì)當(dāng)前設(shè)置的修改。Midi通道可完成16個(gè)通道的設(shè)置分別對(duì)應(yīng)數(shù)字掃描鍵盤的16個(gè)按鍵。Midi協(xié)議中走帶控制信號(hào)用于控制對(duì)器樂演奏時(shí)各器樂自帶音序器的播放與停止,在本系統(tǒng)應(yīng)用場(chǎng)景下只需控制鼓機(jī)的走帶控制即可,若無需鼓組的音樂則無需走帶控制信號(hào),只需要利用Midi時(shí)鐘信號(hào)進(jìn)行同步。
由于在音序播放模式下,演奏者可能會(huì)對(duì)當(dāng)前演奏拍速進(jìn)行調(diào)節(jié),故需要利用外部中斷接收數(shù)字脈沖電位器發(fā)出的正脈沖與負(fù)脈沖兩種信號(hào)來分別控制拍速寄存數(shù)值及步進(jìn)長(zhǎng)度寄存數(shù)值的增減。高頻脈沖速度使得中斷時(shí)間微乎其微(人耳可辨識(shí)時(shí)延范圍大概為20 ms,中斷程序只進(jìn)行簡(jiǎn)單的加減運(yùn)算,故不會(huì)被人耳察覺),因此不會(huì)影響音序播放的速度。
本文完成了基于Arduino的多軌道Midi音序器的設(shè)計(jì)與實(shí)現(xiàn),并闡述了系統(tǒng)的功能和硬件設(shè)計(jì)以及程序結(jié)構(gòu)的設(shè)計(jì),編寫了完整的程序代碼。經(jīng)過實(shí)際演奏及準(zhǔn)備工作的測(cè)試,系統(tǒng)運(yùn)行穩(wěn)定。該系統(tǒng)實(shí)現(xiàn)了在一臺(tái)音序器上利用標(biāo)準(zhǔn)Midi接口驅(qū)動(dòng)三臺(tái)合成器音源同時(shí)演奏的基本使用需求以及錄制工作的需求,解決了多臺(tái)合成器演奏及錄制工作復(fù)雜的問題。在硬件設(shè)計(jì)上采用簡(jiǎn)單易于操作的顯示及輸入模塊,力度與音高輸入分離的設(shè)計(jì)提高了音序化合成器現(xiàn)場(chǎng)演奏的操作性,波段開關(guān)的設(shè)計(jì)替代了國(guó)外產(chǎn)品利用組合按鍵的設(shè)計(jì)使得歌曲工程的切換更快速準(zhǔn)確,全彩LED燈條比同類產(chǎn)品單色LED燈條可顯示更復(fù)雜的步進(jìn)位置信息。
本系統(tǒng)具有功耗低、通用性好、體積小、操作簡(jiǎn)單及運(yùn)行穩(wěn)定的優(yōu)點(diǎn),在國(guó)產(chǎn)電聲器樂產(chǎn)品中較為先進(jìn)且市場(chǎng)前景較大,可突破國(guó)外企業(yè)對(duì)世界專業(yè)電聲器樂市場(chǎng)的壟斷。