專利名稱:一種實現(xiàn)midi合成器同時播放midi音樂和音效的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及MIDI合成器播放聲音技術(shù),特別涉及一種實現(xiàn)MIDI合成器同時播放MIDI音樂和音效的方法。
背景技術(shù):
目前,很多電子設(shè)備都采用MIDI合成器芯片來播放MIDI音樂和音效,比如手機(jī)播放音樂鈴聲或按鍵音效或游戲音效等、計算機(jī)播放音樂或游戲音效等。
參見圖1,圖1為現(xiàn)有技術(shù)MIDI合成器的結(jié)構(gòu)和連接關(guān)系示意圖。其中,電子設(shè)備的處理器100將MIDI數(shù)據(jù)或音效事件(Effect Event)或PCM聲音數(shù)據(jù)(一般是WAVE文件)分別發(fā)送給MIDI合成器110中的事件先入先出存儲器(Event FIFO)111或命令FIFO(Command FIFO)112或數(shù)據(jù)流FIFO(Stream FIFO)113。
一個MIDI曲子的數(shù)據(jù)由很多的成對的Note On Event和,Note OffEvent和控制信息組成,其中Note On Event包含了指定樂器、音調(diào)、音量以及該Event播放的起始時間信息,對應(yīng)的Note Off Event包含了該Event播放的持續(xù)時間信息。
按鍵音效或游戲音效通常只播放一個MIDI音符,比如手機(jī)的按鍵音等。這樣,一個Effect Event只包含一對Note On Event和Note Off Event,Note On Event和Note Off Event包含的信息同上。聲音音效一次只能播放一個,如果上一個音效正在播放,則取消掉上一個音效的播放,直接播放下一個,因此通常Command FIFO112中,也只有一對Note On Event和Note OffEvent。
解釋器114對事件FIFO111中的MIDI Event和命令FIFO112中的EffectEvent進(jìn)行解釋,按照Event中的信息控制MIDI合成模塊115生成聲音數(shù)據(jù)進(jìn)行播放。
MIDI合成模塊115根據(jù)解釋器114的的控制信息生成聲音數(shù)據(jù)進(jìn)行播放,或從Stream FIFO113中讀取聲音數(shù)據(jù)進(jìn)行播放,或?qū)⑸陕曇魯?shù)據(jù)和從Stream FIFO113中讀取聲音數(shù)據(jù)混合播放。
由于PCM聲音數(shù)據(jù)已經(jīng)是聲音波形文件,所以播放PCM聲音數(shù)據(jù)的過程與播放MIDI數(shù)據(jù)和音效聲音有所區(qū)別,可以實現(xiàn)MIDI音樂與PCM聲音數(shù)據(jù)同時播放。
參見圖2,圖2為現(xiàn)有技術(shù)播放PCM數(shù)據(jù)的流程圖。該流程包括以下步驟步驟201,判斷當(dāng)前是否有MIDI在播放,如果是則直接執(zhí)行步驟203;否則執(zhí)行步驟202。本步驟中可以通過判斷是否已將MIDI數(shù)據(jù)發(fā)送給了MIDI合成器110中的Event FIFO111來完成。
步驟202,對MIDI合成器110進(jìn)行初始化。
步驟203,將PCM數(shù)據(jù)寫入到Stream FIFO113。
步驟204,向Command FIFO112發(fā)送數(shù)據(jù)流播放Event(Stream OnEvent),通過該Event指示MIDI合成器110何時播放Stream FIFO113中的PCM聲音數(shù)據(jù)。
如果當(dāng)前MIDI合成器110正在播放MIDI音樂,則將根據(jù)解釋器114生成聲音數(shù)據(jù)和從Stream FIFO113中讀取聲音數(shù)據(jù)混合播放。
這樣,就實現(xiàn)了MIDI音樂與CPM數(shù)據(jù)同時播放。
然而,解釋器114對Event FIFO111和Command FIFO112中的Event是串行處理的,解釋完一個Note Off Event才能去解釋下一個Event或Command FIFO112中的Event。雖然解釋器114優(yōu)先解釋執(zhí)行CommandFIFO112中的Event,但是如果MIDI Event相對于上一個Event的時間比較長或者說Note Off Event中指示的播放持續(xù)時間較長,Event的解釋執(zhí)行會處于阻塞狀態(tài),影響到Command FIFO112中Event的處理,可能會出現(xiàn)聲音音效延時播放的情況,使得音效播放的實時性較差。
發(fā)明內(nèi)容
有鑒于此,本發(fā)明的主要目的在于提供一種實現(xiàn)MIDI合成器同時播放MIDI音樂和音效的方法,提高音效播放的實時性。
為達(dá)到上述目的,本發(fā)明的技術(shù)方案具體是這樣實現(xiàn)的一種實現(xiàn)MIDI合成器同時播放MIDI音樂和音效的方法,將MIDI數(shù)據(jù)中播放持續(xù)時間超過預(yù)定時長的事件,拆分為多個事件;將拆分后的事件和未拆分的事件發(fā)送給MIDI合成器。
所述拆分為多個事件的方法可以為將原事件的持續(xù)時間平均分為固定個數(shù)時間段,一個時間段對應(yīng)設(shè)置一個事件。
所述拆分為多個事件的方法以可以為預(yù)先設(shè)置拆分后的時長;將原事件的持續(xù)時間按照該拆分后的時長,分為多個時間段,一個時間段對應(yīng)設(shè)置一個事件。
所述一個時間段對應(yīng)設(shè)置一個事件的方法可以為將原Note Off Event的持續(xù)時間修改為拆分后的時間段的時長;在原Note Off Event前插入多個持續(xù)時間為拆分后的時間段的空操作Event;插入的空操作的個數(shù)為拆分后時間段個數(shù)減一。
所述的拆分過程可以包括以下步驟A1、讀取MIDI數(shù)據(jù)中的Note Off Event,判斷其中的播放持續(xù)時間是否超過預(yù)定時長,如果是則執(zhí)行步驟B;否則返回步驟A讀取下一個Note OffEvent;B1、將該Note Off Event拆分為一個Note Off Event和多個空操作Event。
所述將拆分后的事件和未拆分的事件發(fā)送給MIDI合成器可以是將未拆分的事件和被拆分修改的原事件發(fā)送給MIDI合成器的事件先入先出存儲器;將拆分后多出的事件發(fā)送給MIDI合成器的命令先入先出存儲器。
所述將拆分后的事件和未拆分的事件發(fā)送給MIDI合成器也可以是將拆分后的事件和未拆分的事件發(fā)送給MIDI合成器的事件先入先出存儲器。
由上述的技術(shù)方案可見,本發(fā)明的這種實現(xiàn)MIDI合成器同時播放MIDI音樂和音效的方法,將MIDI數(shù)據(jù)中播放持續(xù)時間超過預(yù)定時長的事件,拆分為多個事件;將拆分后的事件和未拆分的事件發(fā)送給MIDI合成器,縮短了MIDI合成器解釋持續(xù)時間較長的MIDI數(shù)據(jù)事件的時間。使得MIDI合成器能夠及時地去解釋Command FIFO112中Event,縮短聲音音效播放的延時,提高了音效播放的實時性。
圖1為MIDI合成器的結(jié)構(gòu)和連接關(guān)系示意圖;圖2為現(xiàn)有技術(shù)播放PCM數(shù)據(jù)的流程圖;圖3為本發(fā)明實現(xiàn)MIDI合成器同時播放MIDI音樂和其他音效的流程圖。
具體實施例方式
為使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下參照附圖并舉實施例,對本發(fā)明進(jìn)一步詳細(xì)說明。
本發(fā)明的這種實現(xiàn)MIDI合成器同時播放MIDI音樂和音效的方法,將MIDI數(shù)據(jù)中播放持續(xù)時間超過預(yù)定時長的事件,拆分為多個事件;將拆分后的事件和未拆分的事件發(fā)送給MIDI合成器。
圖3為本發(fā)明實現(xiàn)MIDI合成器同時播放MIDI音樂和其他音效的流程圖。該方法包括以下步驟步驟301,電子設(shè)備的處理器讀取MIDI數(shù)據(jù)中的MIDI Event。
步驟302,判斷是否為Note Off Event,如果是則執(zhí)行步驟303;否則執(zhí)行步驟305。
步驟303,判斷其中播放持續(xù)時間是否大于預(yù)定時長,如果是則執(zhí)行步驟304;否則執(zhí)行步驟305。
步驟304,拆分該Note Off Event。本實施例中拆分Note Off Event至少有以下兩種方法方法1、將原事件的持續(xù)時間平均分為固定個數(shù)時間段,一個時間段對應(yīng)設(shè)置一個事件。例如預(yù)定時長為100ms,固定個數(shù)為5,如果有一個Note OffEvent的持續(xù)時間為200ms,則拆分為5個時間段,每個時間段40ms。
方法2、預(yù)先設(shè)置拆分后的時長;將原事件的持續(xù)時間按照該拆分后的時長,分為多個時間段,一個時間段對應(yīng)設(shè)置一個事件。例如預(yù)定時長為100ms,拆分后的時長為50ms,如果有一個Note Off Event的持續(xù)時間為200ms,則拆分為4個時間段。
拆分時,可以將原Note Off Event的持續(xù)時間修改為拆分后的時間段的時長;在原Note OffEvent前插入多個持續(xù)時間為拆分后的時間段的空操作Event;插入的空操作的個數(shù)為拆分后時間段個數(shù)減一。
例如將200ms拆分為4個時間段,則將原來的Note Off Event中持續(xù)時間修改該50ms,再拆出3個空操作Event插入到修改后的Note Off Event前發(fā)送給MIDI合成器,每個空操作Event中的持續(xù)時間為50ms。
步驟305,將MIDI Event寫入Event FIFO。本實施例中,是將拆分后的事件和未拆分的事件都發(fā)送給MIDI合成器的Event FIFO。
實際應(yīng)用中,也可以將未拆分的事件和被拆分修改的原事件發(fā)送給MIDI合成器的Event FIFO;將拆分后多出的事件發(fā)送給MIDI合成器的Command FIFO。
步驟306,判斷是否還有未讀的Event,如果是則返回步驟301,讀取下一個MIDI Event,否則結(jié)束流程。
這樣,解釋器就可以很快解釋完Note Off Event,及時去解釋CommandFIFO的Event。
由上述的實施例可見,本發(fā)明的這種實現(xiàn)MIDI合成器同時播放MIDI音樂和音效的方法,縮短了MIDI合成器解釋持續(xù)時間較長的MIDI數(shù)據(jù)事件的時間。使得MIDI合成器能夠及時地去解釋Command FIFO112中Event,縮短聲音音效播放的延時,提高了音效播放的實時性。而且,本發(fā)明不需要對MIDI合成器芯片進(jìn)行任何改動,降低了MIDI合成器芯片設(shè)計的復(fù)雜度。
權(quán)利要求
1.一種實現(xiàn)MIDI合成器同時播放MIDI音樂和音效的方法,其特征在于將MIDI數(shù)據(jù)中播放持續(xù)時間超過預(yù)定時長的事件,拆分為多個事件;將拆分后的事件和未拆分的事件發(fā)送給MIDI合成器。
2.如權(quán)利要求1所述的方法,其特征在于,所述拆分為多個事件的方法為將原事件的持續(xù)時間平均分為固定個數(shù)時間段,一個時間段對應(yīng)設(shè)置一個事件。
3.如權(quán)利要求1所述的方法,其特征在于,所述拆分為多個事件的方法為預(yù)先設(shè)置拆分后的時長;將原事件的持續(xù)時間按照該拆分后的時長,分為多個時間段,一個時間段對應(yīng)設(shè)置一個事件。
4.如權(quán)利要求2或3所述的方法,其特征在于,所述一個時間段對應(yīng)設(shè)置一個事件的方法為將原Note Off Event的持續(xù)時間修改為拆分后的時間段的時長;在原Note Off Event前插入多個持續(xù)時間為拆分后的時間段的空操作Event;插入的空操作的個數(shù)為拆分后時間段個數(shù)減一。
5.如權(quán)利要求4所述的方法,其特征在于,所述的拆分過程包括以下步驟A1、讀取MIDI數(shù)據(jù)中的Note Off Event,判斷其中的播放持續(xù)時間是否超過預(yù)定時長,如果是則執(zhí)行步驟B;否則返回步驟A讀取下一個Note OffEvent;B1、將該Note Off Event拆分為一個Note Off Event和多個空操作Event。
6.如權(quán)利要求4所述的方法,其特征在于,所述將拆分后的事件和未拆分的事件發(fā)送給MIDI合成器是將未拆分的事件和被拆分修改的原事件發(fā)送給MIDI合成器的事件先入先出存儲器;將拆分后多出的事件發(fā)送給MIDI合成器的命令先入先出存儲器。
7.如權(quán)利要求1所述的方法,其特征在于,所述將拆分后的事件和未拆分的事件發(fā)送給MIDI合成器是將拆分后的事件和未拆分的事件發(fā)送給MIDI合成器的事件先入先出存儲器。
全文摘要
本發(fā)明公開了一種實現(xiàn)MIDI合成器同時播放MIDI音樂和音效的方法,將MIDI數(shù)據(jù)中播放持續(xù)時間超過預(yù)定時長的事件,拆分為多個事件;將拆分后的事件和未拆分的事件發(fā)送給MIDI合成器。應(yīng)用本發(fā)明方法,能夠縮短聲音音效播放的延時,提高音效播放的實時性,降低MIDI合成器芯片設(shè)計的復(fù)雜度。
文檔編號G10H7/00GK1632859SQ200410082208
公開日2005年6月29日 申請日期2004年12月31日 優(yōu)先權(quán)日2004年12月31日
發(fā)明者劉世偉, 劉延波, 鄒曉紅 申請人:北京中星微電子有限公司