利用VB6.0實(shí)現(xiàn)五線譜作曲工具

字號(hào):

目前在數(shù)字化音樂(lè)教學(xué)過(guò)程中需要用到許多編輯軟件和作曲軟件。許多音樂(lè)教育工作者對(duì)如何開(kāi)發(fā)自己的數(shù)字音樂(lè)工具很感興趣,而一般的計(jì)算機(jī)類書(shū)刊對(duì)此類問(wèn)題探討和介紹的比較少,本文試圖從這一領(lǐng)域做些原理性的研究工作,以供音樂(lè)教育工作者和其他相關(guān)愛(ài)好者發(fā)揮、擴(kuò)展,起到拋磚引玉的作用。因此本文以業(yè)余程序員最熟悉的開(kāi)發(fā)工具VB為平臺(tái),開(kāi)發(fā)設(shè)計(jì)了一個(gè)基本的五線譜編輯工具,并實(shí)現(xiàn)了數(shù)字音樂(lè)的合成、播放、保存和讀寫(xiě)。
    可視化圖形界面的設(shè)計(jì)
    首先在VB環(huán)境中建立一個(gè)新的窗體并保存,然后在窗體中建立菜單和工具條,為簡(jiǎn)便起見(jiàn),工具條用Option控件組來(lái)實(shí)現(xiàn)(需要把風(fēng)格設(shè)為Graphical模式),并把事先做好的圖標(biāo)加載到控件上。圖1是五線譜作曲工具的主界面,其中Picture1控件作為可視化編輯工具的客戶操作區(qū),Picture2控件中所加載的位圖包含了作曲過(guò)程中需要的基本音符,在操作過(guò)程中通過(guò)位圖提取的方式來(lái)獲得相應(yīng)的音符,然后插入到所需的位置。
    五線譜作曲功能的實(shí)現(xiàn)
    在工具條上的五個(gè)Option控件構(gòu)成一個(gè)控件組,根據(jù)Option控件本身的特性,其中一個(gè)選中時(shí)其它的自動(dòng)設(shè)為非選擇項(xiàng),因此操作起來(lái)很方便。當(dāng)選中其中的一個(gè)音符圖標(biāo)后,自動(dòng)觸發(fā)相應(yīng)的事件。事件處理代碼如下:
    Private Sub Option1_Click(Index As Integer)
    Picture1.SetFocus ‘ 焦點(diǎn)集中到客戶區(qū)
    Yinfu = Index ‘ 獲得音符序號(hào)
    End Sub
    其中整型數(shù)Yinfu是一個(gè)全局變量,通過(guò)控件組中的索引Index可以知道哪個(gè)音符按鈕被選中。為了記錄作曲過(guò)程中的操作,定義一個(gè)二維數(shù)組Music用來(lái)存放數(shù)據(jù),光標(biāo)點(diǎn)取在Picture1客戶區(qū)中的坐標(biāo)經(jīng)過(guò)圓整后作為數(shù)組的行、列序號(hào),數(shù)組元素記錄所選的音符。整個(gè)處理過(guò)程放在Picture1控件的MouseDown事件中進(jìn)行,代碼如下:
    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 ‘在客戶區(qū)顯示當(dāng)前音符
    End Sub
    當(dāng)程序運(yùn)行時(shí),首先通過(guò)主窗體的Form Load事件在Picture1的客戶區(qū)繪出五線譜的五條平行的水平線,作曲者便可以根據(jù)不同的音高在相應(yīng)位置插入音符。插入音符的過(guò)程是通過(guò)上面的DisplayNotes函數(shù)來(lái)實(shí)現(xiàn)的,利用Windows系統(tǒng)的API(應(yīng)用程序接口)函數(shù)Bitblt所具有的內(nèi)存數(shù)據(jù)傳送的功能將Picture2中位圖的一部分提取出來(lái)并按照一定的變換后插入到Picture1的客戶區(qū)制定位置,主要代碼如下:
    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
    …