利用VB6.0實現五線譜作曲工具
摘 要 針對數字化音樂教學的需要,提出了基于VB環境開發五線譜作曲工具的可行性,并對其中技術原理、關鍵問題給出了具體的解決方法,實現了一個基本的可視化作曲工具,對一般音樂教育工作者具有很好的啟發性。
關鍵詞 數字化音樂;五線譜;音樂軟件
目前在數字化音樂教學過程中需要用到許多編輯軟件和作曲軟件。許多音樂教育工作者對如何開發自己的數字音樂工具很感興趣,而一般的計算機類書刊對此類問題探討和介紹的比較少,本文試圖從這一領域做些原理性的研究工作,以供音樂教育工作者和其他相關愛好者發揮、擴展,起到拋磚引玉的作用。因此本文以業余程序員最熟悉的開發工具VB為平臺,開發設計了一個基本的五線譜編輯工具,并實現了數字音樂的合成、播放、保存和讀寫。
可視化圖形界面的設計
首先在VB環境中建立一個新的窗體并保存,然后在窗體中建立菜單和工具條,為簡便起見,工具條用Option控件組來實現(需要把風格設為Graphical模式),并把事先做好的圖標加載到控件上。圖1是五線譜作曲工具的主界面,其中Picture1控件作為可視化編輯工具的客戶操作區,Picture2控件中所加載的位圖包含了作曲過程中需要的基本音符,在操作過程中通過位圖提取的方式來獲得相應的音符,然后插入到所需的位置。

圖1 VB環境中的設計界面
五線譜作曲功能的實現
在工具條上的五個Option控件構成一個控件組,根據Option控件本身的特性,其中一個選中時其它的自動設為非選擇項,因此操作起來很方便。當選中其中的一個音符圖標后,自動觸發相應的事件。事件處理代碼如下:
其中整型數Yinfu是一個全局變量,通過控件組中的索引Index可以知道哪個音符按鈕被選中。為了記錄作曲過程中的操作,定義一個二維數組Music用來存放數據,光標點取在Picture1客戶區中的坐標經過圓整后作為數組的行、列序號,數組元素記錄所選的音符。整個處理過程放在Picture1控件的MouseDown事件中進行,代碼如下:
當程序運行時,首先通過主窗體的Form Load事件在Picture1的客戶區繪出五線譜的五條平行的水平線,作曲者便可以根據不同的音高在相應位置插入音符。插入音符的過程是通過上面的DisplayNotes函數來實現的,利用Windows系統的API(應用程序接口)函數Bitblt所具有的內存數據傳送的功能將Picture2中位圖的一部分提取出來并按照一定的變換后插入到Picture1的客戶區制定位置,主要代碼如下:

圖2 五線譜作曲工具的運行效果
曲譜的保存和讀取
在可視化編輯工具中所作的曲目應當能夠保存為數據文件。保存和讀取的操作是通過通用對話框CommonDialog來實現的,設計程序界面時在窗體上加載一個通用對話框控件。當點取程序菜單上的“保存”時,彈出文件保存對話框,然后設置文件路徑對音樂數據進行保存,其代碼如下:
文件的讀取過程與保存過程類似,只要通過Input語句將文件中的數據加載到二維數組Music中去就可以了。
曲譜的合成與播放
曲譜的合成是通過Windows自帶的多媒體API函數來實現的,這些API函數在winmm.dll文件中,因此需要把該文件引用到程序中。該動態鏈接庫中包含了多個數字音樂(Midi)輸入、輸出、合成等方面的庫函數。在對曲譜進行Midi合成播放時,首先將二維數組Music中的數據轉化為數字音頻信號,然后通過計算機的聲卡播放出來,其中的關鍵代碼如下:
結束語
本文介紹了一種利用VB環境實現五線譜作曲的可視化編輯工具,目的在于探討數字音樂技術的基本原理。從功能上說這還是一個原型系統,在此基礎上還可進一步擴展功能,如多行編輯、音色選擇、樂器選擇等。
關鍵詞 數字化音樂;五線譜;音樂軟件
目前在數字化音樂教學過程中需要用到許多編輯軟件和作曲軟件。許多音樂教育工作者對如何開發自己的數字音樂工具很感興趣,而一般的計算機類書刊對此類問題探討和介紹的比較少,本文試圖從這一領域做些原理性的研究工作,以供音樂教育工作者和其他相關愛好者發揮、擴展,起到拋磚引玉的作用。因此本文以業余程序員最熟悉的開發工具VB為平臺,開發設計了一個基本的五線譜編輯工具,并實現了數字音樂的合成、播放、保存和讀寫。
可視化圖形界面的設計
首先在VB環境中建立一個新的窗體并保存,然后在窗體中建立菜單和工具條,為簡便起見,工具條用Option控件組來實現(需要把風格設為Graphical模式),并把事先做好的圖標加載到控件上。圖1是五線譜作曲工具的主界面,其中Picture1控件作為可視化編輯工具的客戶操作區,Picture2控件中所加載的位圖包含了作曲過程中需要的基本音符,在操作過程中通過位圖提取的方式來獲得相應的音符,然后插入到所需的位置。

圖1 VB環境中的設計界面
五線譜作曲功能的實現
在工具條上的五個Option控件構成一個控件組,根據Option控件本身的特性,其中一個選中時其它的自動設為非選擇項,因此操作起來很方便。當選中其中的一個音符圖標后,自動觸發相應的事件。事件處理代碼如下:
| Private Sub Option1_Click(Index As Integer) Picture1.SetFocus ‘ 焦點集中到客戶區 Yinfu = Index ‘ 獲得音符序號 End Sub |
其中整型數Yinfu是一個全局變量,通過控件組中的索引Index可以知道哪個音符按鈕被選中。為了記錄作曲過程中的操作,定義一個二維數組Music用來存放數據,光標點取在Picture1客戶區中的坐標經過圓整后作為數組的行、列序號,數組元素記錄所選的音符。整個處理過程放在Picture1控件的MouseDown事件中進行,代碼如下:
| Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Dim LineY&, ColoumX& LineY& = Round((Y - 13) / 5) ‘行圓整 ColoumX& = Round((X - 30) / 16) ‘列圓整 If Not (ColoumX& > 0 And LineY& > 0) Then Exit Sub End If If Music(LineY&, ColoumX& + HScroll1.Value) = 0 Then Music(LineY&, ColoumX& + HScroll1.Value) = Selection ‘ 記錄音符 End If DisplayNotes ‘在客戶區顯示當前音符 End Sub |
當程序運行時,首先通過主窗體的Form Load事件在Picture1的客戶區繪出五線譜的五條平行的水平線,作曲者便可以根據不同的音高在相應位置插入音符。插入音符的過程是通過上面的DisplayNotes函數來實現的,利用Windows系統的API(應用程序接口)函數Bitblt所具有的內存數據傳送的功能將Picture2中位圖的一部分提取出來并按照一定的變換后插入到Picture1的客戶區制定位置,主要代碼如下:
| Select Case ID Case 1 BitBlt Picture1.hdc, X& - 7, Y& - 18, 20, 30, Picture2.hdc, 66, 0, SRCAND Case 2 BitBlt Picture1.hdc, X& - 5, Y& - 18, 20, 30, Picture2.hdc, 0, 0, SRCAND … |

圖2 五線譜作曲工具的運行效果
曲譜的保存和讀取
在可視化編輯工具中所作的曲目應當能夠保存為數據文件。保存和讀取的操作是通過通用對話框CommonDialog來實現的,設計程序界面時在窗體上加載一個通用對話框控件。當點取程序菜單上的“保存”時,彈出文件保存對話框,然后設置文件路徑對音樂數據進行保存,其代碼如下:
| CommonDialog1.FileName = App.Path & "*.txt" CommonDialog1.ShowOpen ‘顯示保存對話框 If CommonDialog1.FileName = App.Path & "*.txt" Then Exit Sub Me.MousePointer = 11 For LineY& = 1 To 40 OutputS = "Tone" & LeadingZeros$(LineY&, 2) & ": " For ColoumX = 1 To 150 A = Chr(Music(LineY&, ColoumX) + Asc("0")) OutputS = OutputS & A ‘寫入文件 Next ColoumX Whole$ = Whole$ & OutputS & vbCrLf Next LineY Open CommonDialog1.FileName For Output As #1 Print #1, Whole$ Close #1 ‘關閉文件 |
文件的讀取過程與保存過程類似,只要通過Input語句將文件中的數據加載到二維數組Music中去就可以了。
曲譜的合成與播放
曲譜的合成是通過Windows自帶的多媒體API函數來實現的,這些API函數在winmm.dll文件中,因此需要把該文件引用到程序中。該動態鏈接庫中包含了多個數字音樂(Midi)輸入、輸出、合成等方面的庫函數。在對曲譜進行Midi合成播放時,首先將二維數組Music中的數據轉化為數字音頻信號,然后通過計算機的聲卡播放出來,其中的關鍵代碼如下:
| For LineY& = 1 To 30 If Music(LineY&, X) <> 0 And Not ISAgainFlag Then midimsg = &H90 + ((46 + LineY&) * &H100) + (volume * &H10000) + TempChannel ‘定義音高 midiOutShortMsg hmidi, midimsg ‘輸出音頻 End If Next LineY |
結束語
本文介紹了一種利用VB環境實現五線譜作曲的可視化編輯工具,目的在于探討數字音樂技術的基本原理。從功能上說這還是一個原型系統,在此基礎上還可進一步擴展功能,如多行編輯、音色選擇、樂器選擇等。