呂博
(寶雞文理學(xué)院 音樂(lè)學(xué)院,寶雞 721013)
隨著現(xiàn)代科技的進(jìn)步,人們的學(xué)習(xí)和工作變得更加智能化,現(xiàn)代信息技術(shù)逐漸代替了人們基本的人工勞動(dòng),很多行業(yè)也開(kāi)始借助計(jì)算機(jī)來(lái)進(jìn)行工作[1]。本文分析的數(shù)字音符主要是利用單片機(jī)技術(shù),讓高低音調(diào)音頻可以在顯示屏上以音樂(lè)簡(jiǎn)譜的方式展示出來(lái),這樣可以更好人工代替“翻譯”,從而幫助音樂(lè)愛(ài)好者學(xué)習(xí),有助于地方音樂(lè)的數(shù)字化記錄。本文將用到具有Arduino的設(shè)備作為開(kāi)發(fā)板,以及LCD顯示器、音頻傳感器等[2-3]。Arduino就像C語(yǔ)言、java所處的Processing/Wiring開(kāi)發(fā)環(huán)境。
Arduino是建立在Simple I/O平臺(tái)上開(kāi)放原始代碼,它的功能比較豐富,使用比較方面,價(jià)格低廉,所以在電子系統(tǒng)、互動(dòng)功能開(kāi)發(fā)方面使用比較廣泛。該開(kāi)發(fā)并平臺(tái)是以ArduinoUNO為控制核心平臺(tái),它具有以數(shù)組形式的節(jié)拍數(shù)據(jù)、樂(lè)曲音高等數(shù)據(jù),可以與外圍設(shè)備接口連接實(shí)現(xiàn)通信,從而實(shí)現(xiàn)音樂(lè)播放[4-5]。音符簡(jiǎn)譜顯示包括字母簡(jiǎn)譜、數(shù)字簡(jiǎn)譜兩種,而本文主要分析的是數(shù)字簡(jiǎn)譜,每種頻率都有自己對(duì)應(yīng)音符。
在聲學(xué)中,“樂(lè)音”是指發(fā)音物體表現(xiàn)有規(guī)律的震動(dòng)產(chǎn)生的固定音頻,如小提琴、鋼琴、西府曲子伴奏樂(lè)器二胡、三弦等樂(lè)器發(fā)出的樂(lè)音。從聲學(xué)原理中分析樂(lè)音的主要特征包括:音色、響度、音調(diào),而音調(diào)是不同的樂(lè)音基波頻率決定,通常使用音符進(jìn)行表示,比如:494 Hz這個(gè)基波頻率就自己對(duì)應(yīng)的音符[6-7]。利用快速傅里葉對(duì)任意一個(gè)樂(lè)音信號(hào)進(jìn)行變換,可以得到每個(gè)頻率變換后基波頻率對(duì)應(yīng)的幅值大小。通過(guò)該功能可以先提取基波頻率在完成之后的系列換算,從而實(shí)現(xiàn)音符的轉(zhuǎn)變并顯示。數(shù)字音符硬件實(shí)時(shí)顯示連接圖,如圖1所示。
本文主要利用奈奎斯特采樣定理進(jìn)行信號(hào)的采集和輸入,該定理就是如果在有限的頻帶寬度下,從抽樣信號(hào)中完全恢復(fù)原來(lái)的信號(hào),這時(shí)的抽樣頻率需要大于2倍最高信號(hào)頻率。也就說(shuō)在采集信號(hào)的時(shí)候需要選擇大于最高頻率的2倍頻率,這樣才不會(huì)出現(xiàn)信號(hào)重疊情況。本次研究主要以2 000 Hz以下的中低音頻信號(hào)進(jìn)行分析,其中采樣的頻率是5 120 Hz(每個(gè)195 μs進(jìn)行一次采樣)[8-9]。這里使用音頻傳感器將檢測(cè)的聲音變成輸入的音頻信號(hào)到Arduino接口ADC(A0)處,在將每個(gè)250 ms采集一次信息輸入系統(tǒng)中,每次采樣的點(diǎn)數(shù)是256點(diǎn),這里使用fs、f0、n作為采樣的頻率、頻率分辨率、采樣點(diǎn)數(shù)等,而f0=fs/n,之后將音頻信號(hào)256點(diǎn)進(jìn)行FFT轉(zhuǎn)變,得到頻率分辨率是20 Hz。
圖1 硬件實(shí)時(shí)連接的數(shù)字音符示意圖
FFT提取基波頻率時(shí),需要CIA楊頻率大于基波頻率,這樣才能保證基波頻率采集的完整性。將采取數(shù)據(jù)進(jìn)行FFT轉(zhuǎn)變之后,確定轉(zhuǎn)變之后的幅值最大點(diǎn)以及其對(duì)應(yīng)的序號(hào),給其賦值num變量,之后在將num變量與頻率分辨率20 Hz相乘,即可得到基波頻率,這里使用的公式是fn=num×f0,其中f0=20 Hz,fn是基波頻率)。
本次研究主要顯示十六分音符、四分音符、八分音符等。這里假設(shè)十六分音符有250 ms的時(shí)長(zhǎng),而四份音符時(shí)長(zhǎng)是1 s,八分音符的是500 ms,之后分析每個(gè)音符之間存在的時(shí)值關(guān)系。
在實(shí)際中獲得樂(lè)器聲音頻率無(wú)法得到準(zhǔn)確的理論值,需要對(duì)這些頻率規(guī)定一定的區(qū)間范圍。本次研究是選擇相鄰音符之間的平均值作為分界,比如:3、4、5音符對(duì)應(yīng)的音符頻率是658 Hz、697 Hz、783 Hz等,根據(jù)上述分析本次研究使用的頻率分辨率是20 Hz,所以這里選擇的頻率是680~740 Hz(&num≤37,num≥34),而選擇的音符可以用“4”表示。為了方便編程,這里使用數(shù)字1~7、11~17、111~117來(lái)表示音符“1”~“7”、“1”~“7”、“1”~“7”,這里使用數(shù)字“8”表示休止符“0”。
根據(jù)預(yù)先規(guī)定好的音符范圍提取基波頻率,將這些轉(zhuǎn)換成對(duì)應(yīng)的數(shù)字,之后根據(jù)每16個(gè)數(shù)字構(gòu)成一組數(shù)據(jù),根據(jù)先后順序添加一個(gè)整形數(shù)組大小是16的m[]。之后將m[]中元素相同或是相鄰的參數(shù)進(jìn)行合并,將合并得到的元素與10相乘,在進(jìn)行以此循環(huán)合并。在合并后這些元素還是不能整除10,就需要在顯示音符后面增加一個(gè)“=”;如果能被10整除但是不能被100整除,需要在音符下面添加一個(gè)“-”。在計(jì)算下一組數(shù)據(jù)時(shí),需要清空m[]數(shù)據(jù),在重新建立下一組數(shù)據(jù)。因?yàn)樘崛∶總€(gè)基波頻率是時(shí)間是相隔0.25 s,提取每組數(shù)據(jù),以及LCD上的音符顯示時(shí)間都是4 s(16×0.25 s)。
關(guān)于音符實(shí)時(shí)顯示程序的編輯如下:
For(int i=0;i<512;i+=2){//輸入256個(gè)點(diǎn)
delayMicroseconds(195);//每個(gè)195 μs進(jìn)行時(shí)間采樣
Wile(!(ADCSRA & 0×10));//進(jìn)行數(shù)據(jù)采樣
ADCSRA=0xf5;
Byte m=ADCL;
byte j=ADCH;
int k=(j<<8)|m;
k-=0×0200;
K<<=6;
FFT_input[i]=k;//轉(zhuǎn)變成了整型數(shù)據(jù)16位的
FFT_input[i]=k;//把收集到的數(shù)據(jù)輸入數(shù)組實(shí)部中
FFT_input[i+1]=0;//將虛部數(shù)據(jù)清空
}
FFT_window();FFT_reoder(); //對(duì)FFT_input[]中的數(shù)據(jù)進(jìn)行調(diào)整方便采取FFT轉(zhuǎn)變
FFT_run(); //將該部分的數(shù)據(jù)進(jìn)行FFT轉(zhuǎn)變
FFT_mag_lin(); //將轉(zhuǎn)變FFT后的每個(gè)頻率幅值按照順序保存在該部分中
for(byte i=3,max=0,num=3;i<128;i++){
/*為了減少直流信號(hào)的影響,將最大值點(diǎn)的頻率序號(hào)提取出來(lái),i是從3開(kāi)始不是由0開(kāi)始/
if(FFT_mag_lin_out[i]>max)max=FFT_mag_lin_out[i],num=i;
If(i==127){ //把num變成自己對(duì)應(yīng)的頻率數(shù)字
If(2 else if(2 //其他部分相似的程度結(jié)構(gòu)在這里不予多說(shuō) …… else if(num>94){m[1]=117;1=1+1;} } for( byte i=0;i<16;i++){ //將兩個(gè)相同或是相鄰的元素合并,在之后與10相乘 for(byte i=0;i<16;i++){ if(m[i]==m[i+2] & m[i+1]==0){m[i]=0;m[i+1]=10*m[i+2]; } for(byte i=0;i<16;i++){ if(m[i]==m[i+1]){m[i]=0;m[i+1]=10*m[i+1]; }})}} 之后將這些代碼編入Arduino IDE計(jì)算機(jī)程序中,與USB接口進(jìn)行連接,將Arduino開(kāi)發(fā)板連接到計(jì)算機(jī)上。編譯完這些程序之后,將其下載到開(kāi)發(fā)板上,之后將信號(hào)發(fā)生器形成的單一正弦頻率信號(hào)寫(xiě)入到Arduino開(kāi)發(fā)板上,這時(shí)LCD屏幕會(huì)根據(jù)接受到的信號(hào)顯示相應(yīng)的音符。這里將箏弦單一頻率信號(hào)進(jìn)行轉(zhuǎn)變,可以使音頻傳感器可以輸入的信號(hào),因?yàn)闀?huì)受到噪聲等因素的影響,還有Arduino自身運(yùn)行的速度限制,而LCD屏幕顯示的音符和實(shí)際音符是存在誤差的,誤差程度和出現(xiàn)位置沒(méi)有確定性。其事物測(cè)試連接,如圖2所示。 圖2 數(shù)字音符實(shí)物實(shí)時(shí)顯示圖 這里長(zhǎng)按“2”、“4”、“2”、“4”等音符相對(duì)應(yīng)的電子琴按鍵,進(jìn)行相應(yīng)的測(cè)試,得到的結(jié)果5安全與要求符合,如圖3、圖4所示。 根據(jù)上述分析,本次研究在國(guó)內(nèi)關(guān)于音符的實(shí)時(shí)顯示也得到的突破了,目前關(guān)于該內(nèi)容的研究還是比較少,而市場(chǎng)上關(guān)于這種產(chǎn)品的銷(xiāo)售還是比較少。在后期的設(shè)計(jì)中可以選擇更好的語(yǔ)音處理設(shè)備,將Arduino 開(kāi)發(fā)板換成DSP開(kāi)發(fā)平臺(tái),并對(duì)程序算法進(jìn)行相應(yīng)的完善,實(shí)現(xiàn)在屏幕上可以有重音記號(hào)、連音線(xiàn)等功能,同時(shí)可以是這樣的產(chǎn)品大量生產(chǎn),向音樂(lè)結(jié)推廣,給音樂(lè)愛(ài)好者提供更好的設(shè)備。3 Arduino平臺(tái)數(shù)字音符顯示效果
4 總結(jié)