王維濤


摘 要:對于音樂愛好者來說,學習音律學的內(nèi)容是件非常有意義的事情,音律的學習必須以聲音音響作為基礎(chǔ),轉(zhuǎn)換分析計算的數(shù)據(jù)為人耳可感知的音高(pitch),從內(nèi)心深處理解不同律制(temperament)的差異。
關(guān)鍵詞:Excel VBA;音律學;律制
微軟辦公軟件Microsoft Office中的Excel,是人們廣為熟知的處理數(shù)據(jù)的工具。我們用這款數(shù)據(jù)處理軟件,計算生成所需律制的數(shù)據(jù),使用Excel VBA編寫代碼,調(diào)用Windows API函數(shù),產(chǎn)生所需律制的音高音響。
音分(cent)是計量音程(interval)的對數(shù)單位,以等律(十二平均律Twelve-tone equal temperament)八度(octave)等分為十二個半音(semitone),每半音為100音分計。此方法由英國數(shù)學家、語言學家、語音學家亞歷山大J.埃利斯(Alexander J.Ellis 1814-1890)所倡導(dǎo)使用,埃利斯選擇半音(semitone)的百分之一,為計量基礎(chǔ)值,即12002,音分值(cent value)是當今普遍使用測量計算音高和音程的標準方法。
音分值從0至1200,音高頻率從261.6256Hz至523.2513Hz,涵蓋鋼琴小字一組范圍。
我們使用Windows API中的硬件與系統(tǒng)類函數(shù)Beep或APIBeep生成簡單的聲音。在Excel VBA編程調(diào)用Beep或APIBeep函數(shù)聲明如下:
Declare Function Beep Lib "kernel32" Alias "Beep"(ByVal dwFreq As Long,ByVal dwDuration As Long)As Long
參數(shù):dwFreq 聲音頻率(從37Hz到32767Hz)。
dwDuration 聲音的持續(xù)時間,以毫秒為單位。
我們給出十二平均律C大調(diào)音階示例。
在已打開計算好的音分值與音高頻率的Excel工作簿(sheet1)中,選擇“開發(fā)工具”選項卡(可通過“文件”菜單中“選項”菜單的“自定義功能區(qū)”添加),點擊代碼功能區(qū)的Visual Basic圖標,打開Microsoft Visual Basic for Applications窗口,點擊窗口中“插入”菜單,選擇“模塊”菜單,打開代碼窗格,鍵入代碼:
Declare Function APIBeep Lib "kernel32" Alias "Beep"(ByVal dwFreq As Long,ByVal dwDuration As Long)As Long
Public Sub array_get_value()
Dim cent_frequ(1201,2)As Single '數(shù)組
Dim i,j As Integer '循環(huán)變量
Sheets(1).Activate
For i=0 To 1200 '數(shù)組賦值
For j=0 To 1
cent_frequ(i,j)=Sheets(1).Cells(i+1,j+1).Value
Next
Next
APIBeep cent_frequ(0,1),2000 '生成聲音
APIBeep cent_frequ(200,1),2000
APIBeep cent_frequ(400,1),2000
APIBeep cent_frequ(500,1),2000
APIBeep cent_frequ(700,1),2000
APIBeep cent_frequ(900,1),2000
APIBeep cent_frequ(1100,1),2000
APIBeep cent_frequ(1200,1),2000
End Sub切換窗口,在音分值與音高頻率的Excel工作簿(sheet1)中,選擇“開發(fā)工具”選項卡,點擊“控件”功能區(qū)“插入”圖標,添加“按鈕”控件,窗口會自動彈出“指定宏”對話框,選擇鍵入代碼的子過程名array_get_value,編輯“按鈕”名稱“十二平均律C大調(diào)音階”。
點擊“十二平均律C大調(diào)音階”按鈕可聽到每個音符持續(xù)2秒鐘聲音序列。
代碼中,以讀取音分值與頻率二維表組成的數(shù)組元素發(fā)出音響,使數(shù)組下標值與音分值一致,是為方便初學者修改代碼產(chǎn)生其他律制音響序列,也可以直接使用音分值與頻率二維表單元格數(shù)值,因為表中值以0音分值開始,所以在引用音分值時,需做加1處理,例如APIBeep Cells(901,2).Value,2000,括號中的值,為音分值與頻率二維表中的行、列值,901行、2列,對應(yīng)音分值900,頻率為440Hz的值。鍵入代碼:
Declare Function APIBeep Lib "kernel32" Alias "Beep"(ByVal dwFreq As Long,ByVal dwDuration As Long)As Long
Public Subcell_get_value()
Sheets(1).Activate
APIBeepCells(1,2).Value,2000 '生成聲音
APIBeep Cells(201,2).Value,2000
APIBeep Cells(401,2).Value,2000
APIBeep Cells(501,2).Value,2000
APIBeep Cells(701,2).Value,2000
APIBeep Cells(901,2).Value,2000
APIBeep Cells(1001,2).Value,2000
APIBeep Cells(1201,2).Value,2000
End Sub
可產(chǎn)生相同效果。下面我們做分析,都使用音分值與頻率二維表組成的數(shù)組元素的值。
五度相生律(Pythagorean temperament)由基礎(chǔ)律(音)開始,以頻率比3∶2(完美五度)產(chǎn)生新律(音),每律(音)相隔五度的律制。
以音分值與音高頻率表中的0,204,408,498,702,906,1110,1200,音分值可生成五度相生律大調(diào)音階。以音分值與音高頻率表中的0,204,294,498,702,792,996,1200,音分值可生成五度相生律小調(diào)音階。
純律(Pure temperament)由基礎(chǔ)律(音)開始,以頻率比3∶2,頻率比5∶4產(chǎn)生新律(音)的律制。
以音分值與音高頻率表中的0,204,386,498,702,884,1088,1200,音分值可生成純律大調(diào)音階。以音分值與音高頻率表中的0,204,316,498,702,814,1018,1200,音分值可生成純律小調(diào)音階。
中庸全音律(Meantone temperament)是在歐洲應(yīng)用數(shù)百年,兼有五度相生律和純律優(yōu)點的律制。
以音分值與音高頻率表中的0,193,386,504,697,890,1083,1200,音分值可生成中庸全音律大調(diào)音階。以音分值與音高頻率表中的0,193,311,504,697,814,1007,1200,音分值可生成中庸全音律小調(diào)音階。
比照前述十二平均律C大調(diào)音階示例,在音分值與音高頻率的Excel工作簿(sheet1)中,選擇“開發(fā)工具”選項卡,打開Microsoft Visual Basic for Applications窗口,點擊窗口中“插入”菜單,選擇“模塊”菜單,在代碼窗格,鍵入代碼(各律制代碼,可輸入在單模塊中,也可輸入在各自獨立模塊中;各律制代碼輸入在單模塊中,最好做代碼優(yōu)化,輸入在多模塊中,模塊名稱,按序號自動增加),切換至“開發(fā)工具”選項卡,選擇“控件”功能區(qū)“插入”圖標,添加“按鈕”控件,在自動彈出的“指定宏”對話框中,選擇鍵入代碼相關(guān)的子過程名,編輯按鈕名稱為對應(yīng)律制名稱。
此方法也可應(yīng)用在民族律制的學習中。
參考文獻:
[1]繆天瑞.律學[M].北京:人民音樂出版社,1996.
[2]王光祈.中國音樂史[M].上海:三聯(lián)書店,2014.