top
Loading...
利用VB6.0實現五線譜作曲工具
摘 要 針對數字化音樂教學的需要,提出了基于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環境實現五線譜作曲的可視化編輯工具,目的在于探討數字音樂技術的基本原理。從功能上說這還是一個原型系統,在此基礎上還可進一步擴展功能,如多行編輯、音色選擇、樂器選擇等。

作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗