亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

一種在midi文件嵌入和提取音色的方法

文檔序號:1839744閱讀:812來源:國知局
專利名稱:一種在midi文件嵌入和提取音色的方法
技術領域
本發(fā)明涉及一種在MIDI文件嵌入音色,實現(xiàn)擴展音色的方法;本發(fā)明還涉 及對在MIDI文件嵌入音色進行提取的方法。
背景技術
General MIDI規(guī)定了 MIDI必需有128種樂器和47個打擊樂,但為了擴展, 不少新的MIDI標準比如XG、 GS和GM2等都分別對音色進行了擴展,使其擁有 更多的音色和打擊樂。但使用這些標準制作的MIDI文件通常只能使用對應標準 中的音色,如果還想使用以外的音色,還是沒有辦法,比如不管是XG、 GS還是 GM2中,都沒有定義像二胡這樣的樂器。如果一個曲子要用這樣的音色,只能用 小提琴代替,其效果肯定是不如直接帶上這個音色的好。如果一個標準要帶上 所有的音色,基本上是不可能的,因為除了真實樂器發(fā)出的聲音是一種音色以 外,這些樂器的不同奏法從某種角度上看也可以是一種音色,比如GM中就有弦 樂的撥奏音色,同樣地,對于弦樂來說還有斷奏、顫音等奏法,而其他樂器也 存在這樣的情況。對于這種模擬真實樂器發(fā)出的音色,目前最好的辦法是使用 采樣,但如果要把所有的樂器的音色都通過采樣做到合成器中,通常在空間上 是不允許的,所以根本無法用采樣的算法來實現(xiàn)所有的樂器。

發(fā)明內容
本發(fā)明的目的在于提供一種能把一個或者幾個音色嵌入到標準MIDI文件 中的方法,本發(fā)明的另一個目的是提供一種能提取在MIDI文件嵌入音色的方法。
為了實現(xiàn)上述目的,本發(fā)明提供的一種在MIDI文件嵌入音色的方法,包 括以下步驟a. 選擇合成器所支持的音色庫進行編碼,使其轉換成該合成器支持的系統(tǒng) 碼;
b. 把編碼后的系統(tǒng)碼嵌入到MIDI文件中。
所述步驟a的音色庫格式包括音色庫中的音色數(shù)以及各音色的位置表, 該表位置記錄有各個音色所對應的主要庫號、次要庫號、程序號以及音色的描 述在音色庫中的偏移地址。
所述音色的描述是一種對應合成器支持的音色庫中音色的描述;如果通過 音色的描述不能確定整個描述的尺寸信息,則在整個描述前補上這個信息,或 者位置表中補上該信息。
所述步驟a的使音色庫轉換成系統(tǒng)碼的過程依次為把表示為開頭的FO寫 入到所要編碼轉換成系統(tǒng)碼的塊A中;依次將公司ID、表示本公司的音色庫事 件的00寫入到系統(tǒng)碼的塊B中;再把音色庫數(shù)據(jù)的長度編碼后寫入系統(tǒng)碼的塊 B;再把音色庫數(shù)據(jù)各字節(jié)的低7位,以及由音色庫數(shù)據(jù)各字節(jié)的最高位以7個 一組組成的一個字節(jié),分別寫入系統(tǒng)碼的塊C和塊D;把標識系統(tǒng)碼結束的F7 寫入系統(tǒng)碼的塊E;把B E部分的總尺寸按照可變長編碼方式編碼后寫入系統(tǒng) 碼的塊A;最后使A到E按順序合并一起成為要編碼轉換的系統(tǒng)碼總體。其中, 所述的各字節(jié)的最高位以7個一組組成的一個字節(jié),若在最后幾個不足7個, 則補0,其中,由其組成塊D的長度為(音色庫文件長度+7)/8。
所述的步驟b把編碼后的系統(tǒng)碼嵌入到MIDI文件中的過程依次為取得合 法MIDI文件第1軌內容的字節(jié)數(shù),存入軌道長;保存系統(tǒng)碼的字節(jié)數(shù)+ 1的值 到系統(tǒng)碼長;調整MIDI文件的長度為原長度+系統(tǒng)碼長;把從第一軌開始到 整個文件結尾的所有數(shù)據(jù)向結尾處方向移動系統(tǒng)碼長個字節(jié);在第一軌數(shù)據(jù)沒移動前的第一個字節(jié)上的位置寫入0,作為Midi事件的時間差,并緊接在其后
位置寫入系統(tǒng)碼A E的總體;更新第一軌的數(shù)據(jù)長度為系統(tǒng)碼長+軌道長;更 新整個MIDI文件的長度為原長度+系統(tǒng)碼長。
上述在MIDI文件嵌入音色的提取方法,包括如下步驟
1) 逐軌解析MIDI文件,若文件已經解析完,則結束解析;
2) 判斷是否是系統(tǒng)碼,如果是,則進入步驟5);
3) 判斷是否是音色選擇信息,如果是,則進入步驟6);
4) 如果是其他標準MIDI信息,則進行一般的相應的MIDI信息的操作;
5) 檢測是否是音色信息,如果是,則向系統(tǒng)中增加該音色;
6) 檢測是否找到該外部音色庫的地址表,如果找到,則在系統(tǒng)中選定該通 道的音色。
所述步驟5)的向系統(tǒng)中增加該音色,是通過對系統(tǒng)碼的解碼還原音色庫的 所有字節(jié),然后實現(xiàn)把還原的音色庫合并到系統(tǒng)音色庫的過程,其中合并到系 統(tǒng)音色庫的過程包括取得合成器當前的外部音色庫數(shù),并令其加l;把該音色 庫追加到外部音色庫的容器中。其中,所述的對系統(tǒng)碼的解碼過程為,把己編 碼過的系統(tǒng)碼的塊B的第2 5個字節(jié)取出,并存入數(shù)據(jù)長度變量,再把塊B的 第6個字節(jié)取出,然后逐位填入數(shù)據(jù)長度變量各字節(jié)的最高位,得出的數(shù)據(jù)就把 長度值及所有字節(jié)還原出來。
所述步驟6)的在系統(tǒng)中選定該通道的音色,是根據(jù)外部音色庫的地址表, 找到符合當前記錄的樂器庫號主要位、樂器庫號次要位以及樂器號的音色,而 實現(xiàn)為其裝載音色的過程,其中,外部音色庫的地址表接根據(jù)該外部音色庫的 音色數(shù)來査找獲得。
采用本發(fā)明所述的方法,可以把標準制作MIDI文件之外的音色能通過采樣 方便做到合成器中,使音色得到很大的擴展,從而很大程度的實現(xiàn)對各音色進 行渲染。此外,本發(fā)明設置的方法,即使當MIDI文件在其他不支持這種信息的 合成器上回放,也可根據(jù)音色庫中給各個音色指定樂器庫號主要位、樂器庫號 次要位以及樂器號,實現(xiàn)最大限度不失真的目的。


圖1為音色庫編碼成合法的系統(tǒng)碼的示意圖; 圖2為將音色庫嵌入MIDI文件的示意圖; 圖3為支持這種MIDI文件的合成器流程圖
具體實施例方式
本發(fā)明具體的實施方式可分成如下幾個部分
一、 音色庫的格式
二、 把音色庫轉換成系統(tǒng)碼
三、 把系統(tǒng)碼嵌入MIDI文件
四、 解析和渲染這種MIDI文件(含還原音色庫并與當前音色庫合并,以及 選擇音色庫和音色的具體方法)
現(xiàn)依次說明
一、音色庫的格式 音色庫的格式由以下兩部分構成-
1、 庫中含有多少個音色。
2、 各個音色的位置表。該表記錄了各個音色所對應的主要庫號(Bank Select MSB)、次要庫號(Bank Select LSB)、程序號(Program Select)以及音色的
描述在音色庫中的偏移地址。
其中,音色的描述應該是一種對應合成器的描述。比如對于使用FM算法的 合成器,這個描述應該包括合成矩陣ID、各個震蕩器的波型ID、 ADSR的參數(shù)等 用來定義音色的各種信息;而對于一個基于波表算法的合成器,該描述應該包 括該音色使用的波型數(shù)據(jù)(可能是壓縮過的),以及ADSR的參數(shù),甚至是波型 循環(huán)點信息等等。
如果通過音色的描述的首地址不能確定整個描述的尺寸信息,則需要在整 個描述前補上這個信息,或者在上述2的位置表中補上該信息,這里并沒有嚴 格要求。
二、音色庫轉換成系統(tǒng)碼
由于系統(tǒng)碼的要求是從F0開始到F7之間的內容必需是0x00 0x7F之間的 值,否則將被視為不標準的系統(tǒng)碼。而在FO后接上的表示尺寸的內容,是按照 MIDI文件的要求而設置的。
所以以下的步驟的根本目的就是把一個二進制數(shù)塊轉成標準的系統(tǒng)碼的過 程,如圖1所示,其過程如下
1、 根據(jù)系統(tǒng)碼要求寫入字節(jié)OxFO作為開頭,寫入該值到塊A
2、 根據(jù)系統(tǒng)碼的一般要求寫入公司ID到塊B。該值需要向MIDI組織 注冊申請,若不申請,至少要避開MIDI組織列出的公司ID。
3、 寫入0x00到塊B表示該系統(tǒng)碼事件是本公司的音色庫事件。如果 還有其他類型的事件,這里將不會再寫成OxOO?;蛘呷绻摴静辉?有打算擴展系統(tǒng)碼,可以跳過這個值。
4、 把音色庫文件的長度編碼后寫入塊B。該編碼方式跟第5 6步使
用的一樣,其理由是滿足系統(tǒng)碼的要求。具體如下
(1) 假設能支持最長的音色庫文件長度為32位整數(shù),則可以把前4
個字節(jié)的低7位寫入塊B。假如音色庫的文件長為0x02FFB28C,則其 前4個字節(jié)為0x8C, 0xB2, 0xFF, 0x02,保留低7位則變成0x0C, 0x32, 0x7F, 0x02。
(2) 把前4個字節(jié)的最高位(后4個由于沒有字節(jié),則補0)組合 成一個字節(jié),寫入塊B。比如本例中,則是組成00000111b這樣的字 節(jié)。
5、 把音色庫的數(shù)據(jù)的低7位寫入塊C,其方法如上述的4. (1)。把 音色庫的數(shù)據(jù)的最高位按7個一組,組成一個字節(jié),寫入塊D,最后幾 個若不足7個,則補0,就像4. (2)中描述的一樣;得到的塊D長度 就為(音色庫文件長度+7)/8。其中,采用最高位按7個一組以及要 補0的理由如下因為按照General MIDI標準對系統(tǒng)碼的規(guī)定,組成 Sysx數(shù)據(jù)部分的每一字節(jié)的最高位必需為0 ,即每個字節(jié)僅后7位有 效。故把整塊數(shù)據(jù)首先按各個字節(jié)的后7位直接送入塊C,然后把這 個數(shù)據(jù)的第1位按7個一組構成一個字節(jié)(其最高位為0 ),然后進行 合成編碼。如果原數(shù)據(jù)的字節(jié)個數(shù)不是7的倍數(shù),到最后必定會出現(xiàn) 不夠7個來群組,所以同時需要采取補O的方法。
6、 把表示系統(tǒng)碼結束的0xF7寫入塊E。
7、 把B E部分的總尺寸按照可變長編碼方式編碼后寫入A中。所謂 可變長編碼方式,就是跟MIDI文件的事件間的時間差(DeltaTime) 同樣的方式。
8、 把塊A E合并起來就成了整個編碼過的系統(tǒng)碼總體(SysxData)
三、 系統(tǒng)碼嵌入MIDI文件
如圖2所示,為音色庫嵌入MIDI文件的示意圖,其過程如下-
1、 根據(jù)一般解析MIDI文件的方法判斷是否是合法的MIDI文件,然 后找到第l軌所在的位置;
2、 保存第1軌的數(shù)據(jù)長度到軌道長(TrkLen);
3、 保存系統(tǒng)碼的長度+ 1的值到系統(tǒng)碼長(SysxLen);
4、 調整MIDI文件的長度為原長度(Midilen)+系統(tǒng)碼長(SysxLen);
5、 從第一軌開始到整個文件結尾的所有數(shù)據(jù)向向移動系統(tǒng)碼長 (SysxLen)個字節(jié);
6、 在第一軌數(shù)據(jù)原先的位置上寫入0,作為Midi事件的時間差 (DeltaTime);
7、 在其后寫入系統(tǒng)碼A E的總體(SysxData)
8、 更新第一軌的數(shù)據(jù)長度為系統(tǒng)碼(SysxLen) +軌道長(TrkLen)
9、 更新整個MIDI文件的長度為原長度(Midilen) +系統(tǒng)碼長 (SysxLenh
四、 解析和渲染這種MIDI文件
如圖3所示,解析和渲染MIDI文件經以下步驟1 8:
1、 按照通常解析MIDI文件的方式逐軌解析MIDI文件;
2、 若文件已經解析完,則結束解析;
3、 判斷是Sysx,則進入步驟7;
4、 判斷是控制器O、控制器32或者是音色選擇中任何一個信息,則進
入步驟8;
5、 若是其他MIDI信息,則進行一般的操作;
6、 回到步驟l;
7、 經過了一般是系統(tǒng)碼的判斷后,剩下的字節(jié)就是上述B D之間的 內容,如下過程
(1) 、根據(jù)公司ID判斷是否是本公司的ID,若是,則進入(4)。
(2) 、如果不是公司的ID,再檢査是否是GM標準的保留Sysx事件, 比如GMReset、 Master Volume等等。若是,則根據(jù)該合成器是否支持 這些事件而可選地去執(zhí)行。
(3) 、返回l (上級解析和渲染MIDI文件的步驟1);
(4) 、檢査是否是音色庫信息,若是,則進入(6);否則看是否是該 合成器支持的其他信息,若是,則進入相關的處理。
(5) 、返回l (上級解析和渲染MIDI文件的步驟1)。
(6) 、取得C塊的尺寸信息。該信息是就是對尺寸的解碼過程-
(a) 把B的第2 5個字節(jié)取出,并存入數(shù)據(jù)長度變量(DataLen)。 對于本例,此時的數(shù)據(jù)長度變量(DataLen)就是0x027F320C。
(b) 把B的第6個字節(jié)取出,然后逐位填入數(shù)據(jù)長度變量
(DataLen)各字節(jié)的最高位.本例中就是把00000111b取出, 再填完后的數(shù)據(jù)長度變量(DataLen)就是0x02FFB28C,這樣 就把長度值還原回來了。
(7) 、根據(jù)長度值,可讀出音色庫的所有字節(jié)的低7位。
(8) 、根據(jù)前面的方法換算出D的長度并讀取。再使用上述(6) .b
的方法還原音色庫的所有字節(jié)。 (9)、通過對音色庫的還原,現(xiàn)在可以進行對還原后的音色庫做合 并到系統(tǒng)音色庫,其步驟-
a) 得合成器當前的外部音色庫數(shù),并令其加l;
b) 把該音色庫追加到外部音色庫的容器后(比如是音色庫數(shù) 組、或者是音色庫鏈表)。
(10)、返回l (上級解析和渲染MIDI文件的步驟1)。 8、這里將分別對跟選擇音色有關的幾個MIDI事件做處理
(1) 、如果是控制器0或者32信息(Controller),就直接分別記錄 其值到樂器庫號主要位(BnkMsb)和樂器庫號次要位(BnkLsb)。然 后返回l (上級解析和渲染MIDI文件的步驟1);
(2) 、如果不是音色改變信息(ProgramChange),則返回1 (上級解 析和渲染MIDI文件的步驟1);
(3) 令ExLibNum等于合成器的"外部音色庫數(shù)";
(4) 、如果ExLibNum為0,則跳轉至lj (9);
(5) 、并取得第ExLibNum-l個外部音色庫;
(6) 、令ExPatchNum等于這個外部音色庫的音色數(shù);
(7) 、根據(jù)ExPatchNum査找該外部音色庫的地址表,看能否找到符 合當前記錄的樂器庫號主要位(BnkMsb)、樂器庫號次要位(BnkLsb) 以及樂器號(Program)的音色,若找到,則根據(jù)音色描述的地址裝 載音色,并返回l (上級解析和渲染MIDI文件的步驟1);
(8) 、令ExLibNum—,跳轉到(4);
(9) 、表明在所有外部音色庫中無法找到該組合的音色,則根據(jù)樂器 號(Program)在標準128號中找相應的音色;
(10) 、返回l (上級解析和渲染MIDI文件的步驟1)。
最后,關于音色庫中的音色的"位置"安排的建議。之所以在音色庫中需 要給各個音色指定樂器庫號主要位(BnkMsb)、樂器庫號次要位(BnkLsb)以及 樂器號(Program),就是為了當這個MIDI文件在其他不支持這種信息的合成器 上回放能最大限度不失真的目的。
舉例說明,假設要擴展一種二胡的樂器,而最好把這個二胡的樂器庫號主 要位(BnkMsb)、樂器庫號次要位(BnkLsb)設置成非0,比如一個是70,—個是 12,而樂器號(Program)最好設置成中提琴或者小提琴的樂器號(Program)。 這樣,當這個MIDI曲子在不支持這種擴展音色的合成器上播放時,就算找不到 二胡的音色,也會使用中提琴或者小提琴來播放,使其味道不會有太大的偏差。
此外,這里對"音色"的概念可以更廣義地理解,比如把人的說話或者 唱歌的聲音作為波表,這樣就相當于用這個說話聲或者歌聲來作為樂器演奏, 可以變相實現(xiàn)所謂的"人聲唱歌"的功能。而如果波表的聲音是一種GM沒有的 打擊樂,那就是擴展了打擊樂。所以上述說明并沒有專門對打擊樂進行特別的 說明。
權利要求
1、一種在MIDI文件嵌入音色的方法,其特征在于包括以下步驟a.選擇合成器所支持的音色庫進行編碼,使其轉換成該合成器支持的系統(tǒng)碼;b.把編碼后的系統(tǒng)碼嵌入到MIDI文件中。
2、 根據(jù)權利要求1所述的在MIDI文件嵌入音色的方法,其特征 在于所述步驟a的音色庫格式包括音色庫中的音色數(shù)以及各音色 的位置表,該表位置記錄有各個音色所對應的主要庫號、次要庫號、 程序號以及音色的描述在音色庫中的偏移地址。
3、 根據(jù)權利要求2所述的在MIDI文件嵌入音色的方法,其特征在于所述音色的描述是一種對應合成器支持的音色庫中音色的描 述;如果通過音色的描述不能確定整個描述的尺寸信息,則在整個描述前補上這個信息,或者位置表中補上該信息。
4、 根據(jù)權利要求1所述的在MIDI文件嵌入音色的方法,其特征在于所述步驟a的使音色庫轉換成系統(tǒng)碼的過程依次為把表示為開頭的FO寫入到所要編碼轉換成系統(tǒng)碼的塊A中;依次將公司ID、表示本公司的音色庫事件的00寫入到系統(tǒng)碼的塊B中;再把音色庫 數(shù)據(jù)的長度編碼后寫入系統(tǒng)碼的塊B;再把音色庫數(shù)據(jù)各字節(jié)的低7位,以及由音色庫數(shù)據(jù)各字節(jié)的最高位以7個一組組成的一個字節(jié), 分別寫入系統(tǒng)碼的塊C和塊D;把標識系統(tǒng)碼結束的F7寫入系統(tǒng)碼 的塊E;把B E部分的總尺寸按照可變長編碼方式編碼后寫入系統(tǒng) 碼的塊A;最后使A到E按順序合并一起成為要編碼轉換的系統(tǒng)碼總體。
5、 根據(jù)權利要求4所述的在MIDI文件嵌入音色的方法,其特 征在于所述的各字節(jié)的最高位以7個一組組成的一個字節(jié),若在最 后幾個不足7個,則補O,其中,由其組成塊D的長度為(音色庫 文件長度+7)/8。
6、 根據(jù)權利要求1所述的在MIDI文件嵌入音色的方法,其特 征在于所述的步驟b把編碼后的系統(tǒng)碼嵌入到MIDI文件中的過程依次為取得合法MIDI文件第1軌內容的字節(jié)數(shù),存入軌道長;保存系統(tǒng)碼的字節(jié)數(shù)+1的值到系統(tǒng)碼長;調整MIDI文件的長度為 原長度+系統(tǒng)碼長;把從第一軌開始到整個文件結尾的所有數(shù)據(jù)向結 尾處方向移動系統(tǒng)碼長個字節(jié);在第一軌數(shù)據(jù)沒移動前的第一個字節(jié) 上的位置寫入0,作為Midi事件的時間差,并緊接在其后位置寫入 系統(tǒng)碼A E的總體;更新第一軌的數(shù)據(jù)長度為系統(tǒng)碼長+軌道長; 更新整個MIDI文件的長度為原長度+系統(tǒng)碼長。
7、 一種提取權利要求1中所述的在MIDI文件嵌入音色的方法,其特征在于包括如下步驟1) 逐軌解析MIDI文件,若文件己經解析完,則結束解析;2) 判斷是否是系統(tǒng)碼,如果是,則進入步驟5);3) 判斷是否是音色選擇信息,如果是,則進入步驟6);4) 如果是其他標準MIDI信息,則進行一般的相應的MIDI信息的 操作;5) 檢測是否是音色信息,如果是,則向系統(tǒng)中增加該音色;6)檢測是否找到該外部音色庫的地址表,如果找到,則在系統(tǒng) 中選定該通道的音色。
8、 根據(jù)權利要求7所述的提取在MIDI文件嵌入音色的方法,其 特征在于所述步驟5)的向系統(tǒng)中增加該音色,是通過對系統(tǒng)碼的 解碼還原音色庫的所有字節(jié),然后實現(xiàn)把還原的音色庫合并到系統(tǒng)音色庫的過程,其中合并到系統(tǒng)音色庫的過程包括取得合成器當前的外部音色庫數(shù),并令其加1;把該音色庫追加到外部音色庫的容器中。
9、 根據(jù)權利要求8所述的提取在MIDI文件嵌入音色的方法,其 特征在于所述的對系統(tǒng)碼的解碼過程為,把已編碼過的系統(tǒng)碼的塊 B的第2 5個字節(jié)取出,并存入數(shù)據(jù)長度變量,再把塊B的第6個 字節(jié)取出,然后逐位填入數(shù)據(jù)長度變量各字節(jié)的最高位,得出的數(shù)據(jù) 就把長度值及所有字節(jié)還原出來。
10、 根據(jù)權利要求7所述的提取在MIDI文件嵌入音色的方法, 其特征在于所述步驟6)的在系統(tǒng)中選定該通道的音色,是根據(jù)外 部音色庫的地址表,找到符合當前記錄的樂器庫號主要位、樂器庫號 次要位以及樂器號的音色,而實現(xiàn)為其裝載音色的過程,其中,外部 音色庫的地址表接根據(jù)該外部音色庫的音色數(shù)來査找獲得。
全文摘要
本發(fā)明公開了一種在MIDI文件嵌入音色的方法,包括以下步驟a.選擇合成器所支持的音色庫進行編碼,使其轉換成該合成器支持的系統(tǒng)碼;b.把編碼后的系統(tǒng)碼嵌入到MIDI文件中。上述在MIDI文件嵌入音色的提取方法,包括如下步驟1)逐軌解析MIDI文件,若文件已經解析完,則結束解析;2)判斷是否是系統(tǒng)碼,如果是,則進入步驟5);3)判斷是否是音色選擇信息,如果是,則進入步驟6);4)如果是其他標準MIDI信息,則進行一般的相應的MIDI信息的操作;5)檢測是否是音色信息,如果是,則向系統(tǒng)中增加該音色;6)檢測是否找到該外部音色庫的地址表,如果找到,則在系統(tǒng)中選定該通道的音色。
文檔編號G10H1/00GK101162581SQ20061012272
公開日2008年4月16日 申請日期2006年10月13日 優(yōu)先權日2006年10月13日
發(fā)明者馮穗豫 申請人:安凱(廣州)軟件技術有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1