Midi文件解碼方法和系統(tǒng)的制作方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及解碼技術(shù)領(lǐng)域,尤其涉及一種MIDI文件解碼方法和系統(tǒng)。
【背景技術(shù)】
[0002]MIDI (Musical Instrument Digital Interface,樂器數(shù)字接口)文件存儲的信息是事件,而不是具體的音頻內(nèi)容,所以一個MIDI文件相對的壓縮比往往很高,方便使用。
[0003]現(xiàn)有的MIDI文件,為了錄制的方便,各個軌道是相互獨立的,只需要修改文件頭中的軌道信息,就可以插入或者刪除各個軌道。但是對于小系統(tǒng),沒有足夠的Buf (緩沖區(qū))來緩存各個軌道的事件,如果不預(yù)先緩存事件,則需要文件跳著獲取事件,對事件進行處理,而跳著獲取事件則會帶來數(shù)據(jù)的速度的浪費。即,若不丟棄上一個軌道還未使用的數(shù)據(jù),則需要Buf來緩存;若丟棄上一個軌道還未使用的數(shù)據(jù),則需要回跳后重新讀取,浪費系統(tǒng)時鐘,而且按照MIDI文件的壓縮比來看,對數(shù)據(jù)的重讀量會是極大的。上述情況會導(dǎo)致MIDI文件的解碼成本較高。
【發(fā)明內(nèi)容】
[0004]基于此,有必要提供一種成本較低的MIDI文件解碼方法。
[0005]—種MIDI文件解碼方法,包括以下步驟:
[0006]按照MIDI文件的各個軌道的時間信息參數(shù)對MIDI文件進行排序;
[0007]將排序后的所述MIDI文件進行解碼。
[0008]在其中一個實施例中,所述按照MIDI文件的各個軌道的時間信息參數(shù)對所述MIDI文件進行排序步驟包括:
[0009]檢測所述MIDI文件的各個軌道的時間信息參數(shù);
[0010]在所述時間信息參數(shù)表示當(dāng)前軌道所處理的事件結(jié)束時,跳轉(zhuǎn)到當(dāng)前軌道的文件位置,進行事件讀取處理,并寫入所述MIDI文件;
[0011]重復(fù)上述過程,直至對所述MIDI文件的排序完成。
[0012]在其中一個實施例中,所述將排序后的所述MIDI文件進行解碼步驟包括:
[0013]檢測所述MIDI文件的各個軌道的時間信息參數(shù);
[0014]在所述時間信息參數(shù)表示當(dāng)前軌道處理完當(dāng)前事件時,將下一個事件由所述當(dāng)前軌道進行解碼處理;
[0015]重復(fù)上述過程,直至解碼完成。
[0016]在其中一個實施例中,所述時間信息參數(shù)為所述MIDI文件的各個軌道所包含的delta。
[0017]在其中一個實施例中,所述方法還包括:事件通訊設(shè)備將接收到的事件傳入到文件寫入系統(tǒng)時,按照時間順序?qū)⒔邮盏降氖录判虻剿鯩IDI文件中。
[0018]在其中一個實施例中,所述方法還包括:插入新軌道數(shù)據(jù)時,按照時間順序?qū)⑺鲂萝壍罃?shù)據(jù)插入所述MIDI文件中。
[0019]本發(fā)明還提供一種MIDI文件解碼系統(tǒng),包括排序模塊和解碼模塊;
[0020]所述排序模塊,被配置以按照MIDI文件的各個軌道的時間信息參數(shù)對MIDI文件進行排序;
[0021]所述解碼模塊,被配置以將排序后的所述MIDI文件進行解碼。
[0022]在其中一個實施例中,所述排序模塊包括第一時間信息檢測單元和讀取寫入單元;
[0023]所述時間信息檢測單元,被配置以檢測所述MIDI文件的各個軌道的時間信息參數(shù);
[0024]所述讀取寫入單元,被配置以在所述時間信息參數(shù)表示當(dāng)前軌道所處理的事件結(jié)束時,跳轉(zhuǎn)到當(dāng)前軌道的文件位置,進行事件讀取處理,并寫入所述MIDI文件。
[0025]在其中一個實施例中,所述解碼模塊包括第二時間信息檢測單元和解碼單元;
[0026]所述第二時間信息檢測單元,被配置以檢測所述MIDI文件的各個軌道的時間信息參數(shù);
[0027]所述解碼單元,被配置以在所述時間信息參數(shù)表示當(dāng)前軌道處理完當(dāng)前事件時,將MIDI文件的下一個事件由所述當(dāng)前軌道進行解碼處理。
[0028]在其中一個實施例中,所述時間信息參數(shù)為所述MIDI文件的各個軌道所包含的deltaD
[0029]在其中一個實施例中,所述系統(tǒng)還包括錄入排序模塊,所述錄入排序模塊被配置為在事件通訊設(shè)備將接收到的事件傳入到文件寫入系統(tǒng)時,按照時間順序?qū)⒔邮盏降氖录判虻剿鯩IDI文件中。
[0030]在其中一個實施例中,所述系統(tǒng)還包括新軌道排序模塊,所述新軌道排序模塊被配置為在插入新軌道數(shù)據(jù)時,按照時間順序?qū)⑺鲂萝壍罃?shù)據(jù)插入所述MIDI文件中。
[0031]上述MIDI文件解碼方法和系統(tǒng),按照MIDI文件的各個軌道的時間信息參數(shù)對MIDI文件進行排序,并將排序后的MIDI文件進行解碼,不需要跳著獲取各個軌道的事件,也不需要預(yù)解各個軌道的所有事件,能夠降低解碼資源,節(jié)省MIDI文件的解碼成本。
【附圖說明】
[0032]圖1為本發(fā)明MIDI文件解碼方法一個實施例的流程示意圖;
[0033]圖2為本發(fā)明MIDI文件解碼方法一個實施例中的按照時間順序?qū)IDI文件進行排序的流程示意圖;
[0034]圖3為本發(fā)明MIDI文件解碼方法一個實施例中的將按照時間順序排序后的MIDI文件進行解碼的流程示意圖;
[0035]圖4為本發(fā)明MIDI文件解碼系統(tǒng)一個實施例的結(jié)構(gòu)示意圖;
[0036]圖5為本發(fā)明MIDI文件解碼系統(tǒng)一個實施例中的排序模塊的結(jié)構(gòu)示意圖;
[0037]圖6為本發(fā)明MIDI文件解碼系統(tǒng)一個實施例中的解碼模塊的結(jié)構(gòu)示意圖。
【具體實施方式】
[0038]為使本發(fā)明的目的、技術(shù)方案及優(yōu)點更加清楚明白,以下結(jié)合附圖對本發(fā)明MIDI文件解碼方法和系統(tǒng)的【具體實施方式】進行說明。應(yīng)當(dāng)理解,此處所描述的具體實施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
[0039]參見圖1,一個實施例中,本發(fā)明MIDI文件解碼方法包括以下步驟:
[0040]S100,按照MIDI文件的各個軌道的時間信息參數(shù)對MIDI文件進行排序。
[0041]—般的,現(xiàn)有的MIDI文件編碼方法是按照軌道為單元進行排序的,方便不同軌道的單獨錄制。但是實際的播放過程是各個軌道的聲音加權(quán)疊加后合成的結(jié)果。而本發(fā)明MIDI文件解碼方法,按照MIDI文件的各個軌道的時間信息參數(shù)對MIDI文件進行排序,不需要跳轉(zhuǎn)文件,也不會有Buf預(yù)存的限制。
[0042]參見圖2,一個實施例中,步驟SlOO具體可以包括以下步驟:
[0043]SI 10,檢測MIDI文件的各個軌道的時間信息參數(shù)。
[0044]在MIDI文件的各個軌道中,均包含有一個時間信息參數(shù),該時間信息參數(shù)表示對應(yīng)的軌道中的事件的持續(xù)時間長度。因此,可以通過該時間信息參數(shù)對MIDI文件進行排序。
[0045]具體的,可以檢測各個軌道的時間信息參數(shù),當(dāng)檢測到某一軌道的時間信息參數(shù)表示該軌道所處理的事件結(jié)束時,執(zhí)行步驟S120。其中,可以設(shè)置成:某一軌道的時間信息參數(shù)的時間計數(shù)遞減至零時,表示該軌道所處理的當(dāng)前事件結(jié)束。各個軌道的時間信息參數(shù)所表示的該軌道所處理的事件的剩余時間會隨著時間遞減,直至為零。
[0046]S120,在時間信息參數(shù)表示當(dāng)前軌道所處理的事件結(jié)束時,跳轉(zhuǎn)到當(dāng)前軌道的文件位置,進行事件讀取處理,并寫入MIDI文件。
[0047]其中,可以逐一檢測各個軌道的時間信息參數(shù),當(dāng)檢測到某一軌道的時間信息參數(shù)表示該軌道所處理的事件結(jié)束時(例如時間信息參數(shù)的時間計數(shù)為零),則說明該軌道所處理的當(dāng)前事件結(jié)束。跳轉(zhuǎn)到該軌道的文件位置,然后進行時間讀取處理,并寫入新文件。
[0048]重復(fù)步驟SllO和S120,直至對MIDI文件的排序完成。
[0049]以下通過一詳細(xì)實例,對步驟SlOO進行進一步說明。每個軌道中均有一個包含時間信息參數(shù)的delta,因此可以通過檢測各個軌道的delta