• 沒有找到結果。

1 MPEG-4 Structured Audio

1.4 Structured Audio 資料流的句法和語意

這部分描述 MPEG-4 Structured Audio 中資料流格式的定義,包括了符號表格、管絃樂檔案、

樂譜檔案、MIDI 的定義,樣本資料,樣本資料庫。

1.4.1 符號表格(Symbol Table)的定義

資料流的格式中可能會包含著一個符號表格,但不是一定必須的。這個符號表格可以將原本資 料流中以 token 表示的 SAOL 和 SASL 轉換為文字(text)模式。而一個符號最多只能對應到一個名稱。

因為 SAOL 和 SASL 的的實作是需要以文字方式的輸入,而不是 token 方式的輸入,所以在做 解碼前必須先對資料流做一個 detokenise 的工作把其轉換成文字格式的表示方法。在這種情況下,

其他在符號表格中所沒有定義的符號我們也建議給他一個預設的名字,利用特定的表示名稱 _sym_x,x 為該符號的值。這樣的建議下我們要保證這些名稱不會和符號表格中所定義的名稱相衝 突,也就是重複。

1.4.2 管絃樂檔案(SAOL)的定義

一個 SAOL 的檔案是由一些 tokens 所組成的字串。表示這些 tokens 的組成元素包括位使用的 保留字元,核心的 opcode 名稱,和一些標點符號。這些 tokens 可以分為五大部分:

15. Token 0xF0:符號 token,當在資料流中出現符號 token 時,其之後的 16 bit 即代表該符號 的號碼。

16. Token 0xF1:值的 token,當在資料流中出現值的 token 時,其之後的 32 bit 即代表該數以 浮點數表示的值。

17. Token 0xF2:整數 token,當在資料流中出現整數的 token 時,其之後的 32 bit 即代表該數 以無號整數表示的值。

18. Token 0xF3:字串 token,當在資料流中出現字串的 token 時,其之後的幾個 bit 即代表字 元字串。

19. Token 0xF4:位元組 token,當在資料流中出現位元組的 token 時,其之後的 8 bit 即代表 無號整數表示的值(0-255)。

20. Token 0xFF:end-of-orchestra token ,代表資料流中 SAOL 檔案部分的結束。

1.4.3 樂譜檔案(SASL)的定義

一個 SASL 的檔案是一些由樂譜資訊命令列所組成的集合,他是存在於資料流中的資訊檔頭,

因為在即時的資料流傳輸時,他必須先被知道,如此才能立即被解壓縮。組成 SASL 的命令列可以 分為五大事件,每一種在解碼時分別代表不同的作用和行程處理,分述如下:

21. 樂器事件:其組成是開始時間,樂器名稱的符號,樂器演奏經過的時間,加上一些其他控 制播放 SAOL 樂器的參數。

22. 控制事件:利用參數來控制一些樂器或樂器正在產生的聲音。

23. 波形表事件:會動態地產生或摧毀 SAOL 中所產生的波形表。

24. 結束事件:表示 SASL 已經結束去對 SAOL 中樂器的控制處理。

25. 節拍事件:可以動態地改變樂器播放的節奏。

1.4.4 MIDI 的定義

MIDI 區塊允許把 MIDI 樂譜中的資訊放在 MPEG-4 Structured Audio 的資料流或其檔頭中。一

個 MIDI 事件即是代表一個 MIDI 的指令,而標準的 Format 0 和 Format 1 的 MIDI 檔案是由位元組 的陣列組成的。合法的 MIDI 事件和 MIDI 檔案也已經標準化地可以存在 MPEG-4 Structured Audio 的資料流中。

1.4.5 樣本資料(Sample)

這部分包含了一區塊的資料,將會被包含在 SAOL 管絃樂中的波形表內。每一個樣本包含了 名字、長度、資料以及四個隨意的參數,分別是取樣頻率、迴路的開始與結束點與基本的頻率。要 存取樣本中的資料即是利用樣本核心波形表產生器。

1.4.6 樣本資料庫(Sample Bank)

樣本資料庫即是描述了一些使用於樣本資料庫合成法上的波形表資料和相關處理的參數。

1.5 Structured Audio 的物件型式

在 Structured Audio 中有四種標準的物件型式(Object type),每一種物件型式均可符合一些特定 的應用的需求。物件型式的預設值是 Object type 4,就是當 Structured Audio 的格式沒有指定物件型 式時,均為 Object type 4。

1. MIDI only:在這類的物件型式中,資料流的資訊標頭只有 MIDI 檔案的區塊,資料流中 的資料只有 MIDI 的事件資料。因為是使用到 General MIDI 的對應,所以這類的物件型式 是用於和過去相容如現存的 MIDI 的應用上。但是此類物件型式對聲音的品質是沒辦法控 制的。

2. Wavetable synthesis:在這類的物件型式中,資料流的資訊標頭只有 MIDI 檔案和 SASBF 的區塊,資料流中的資料只有 MIDI 的事件資料。這類的物件型式是在不需使用到 SAOL 的情況下,來描述音樂或聲音效果。

3. Algorithmic synthesis and AudioFX:在這類的物件型式中,資料流的資訊標頭中不能有 MIDI 檔案和 SASBF 的區塊。這類的物件型式是用來描述合成的演算法,並在不使用到 SASBF 下提供聲音效果。我們研究實體合成法時需要注意如何將之嵌入到 MPEG-4 SA 中,也是最重要的部分。

4. Main synthetic:所有的資料流和資料流資訊的元素都可能包含在其中,亦即包含上述三種 資訊。

以上為 MPEG-4 Structured Audio 的基本定義、主要的組成元素和物件的型式等。它已經是一 個 ISO/IEC 的標準,在執行的時候以電腦語言來產生聲音,利用一連串的合成控制序列來指出哪些 聲音合成法要拿來產生聲音。最後以巧妙的編碼方式將這些電腦語言編碼成極低的資料量,如此便 可以很容易的在有限頻寬下的網路上傳輸高品質的音樂。

2 九十一年工作成果

2.1 MPEG-4 Structured Audio 的編解碼處理

九十一年度已完成 MPEG-4 Structured Audio 在網路上以 Streaming 的方式傳送及接收資料。由 於目前 MPEG-4 在 Structured Audio 傳輸資料壓縮的方式,尚未完全訂好標準,因此目前是以自行 定義的格式(參考 MPEG-4 在 Video 與 Audio 方面的傳輸方式)進行解、壓的動作。

2.2 SAOL 語法及語意研究

經分析整理參考文件後,吾人已將 SAOL 重點部分,通盤了解。並已實作 SAOL 語言轉譯成 80x86 機器語言的 Compiler。Compiler 包含下列幾個步驟(參見圖三):

1. [Input data]->Translator->[Parse tree]

預計要完成兩種輸入資料,一種是從 SAOL 文字檔輸入,另一種是由 SAOL 所壓成的 bitstream,這種 bitstream 通常是放在 Server 端,經由網路傳送的。這兩種輸入資料格式,經由各 自的 Translator,轉換成為相同的內部資料型式,也就是 parse tree,再送給下層去處理。這裏使用 到的工具為 Lex&Yacc,幫助產生 parser。

2. [Parse tree]->Compiler->[Assemble code]

當要發出樂器聲之前,要先將所有用到樂器的演算法,轉換為電腦可執行的程式碼,而由於本 系統的 client 端定位在使用 80x86 CPU 的個人電腦,Compiler 所產生的組合語言,即為 80x86 組合 語言指令。每一個 Instrument,都會產生出三段組合指令碼,分別為 I-cycle、K-cycle 及 A-cycle 的 運算命令。

Compiler 還包括了變數是否宣告、變數型態檢查(陣列大小比對)、變數速度比對、最佳化這幾 個部份。宣告的變數,會存在 variable table 裡,包括變數名字、大小、速度等,而往後每當有運 算式(expression)或敘述句(statement)引用到變數,都會來這個表裡檢查。如果名字找不到,就產生 var_not_declared Exception,並告知使用者;若是陣列大小、或是速度的指定上有違規,也會產生 不同的 Exception 及錯誤訊息。

目前最佳化,包括了常數運算式最佳化、重覆指令最佳化以及乘 2 最佳化等。常數運算式最佳 化如 a=51.36+8.54; 將之轉為 a=59.9; ,即可在運算聲音時,減少運算量。重覆指令最佳化,如在 迴圈內重覆指定相同值給一個變數,但之後的運算又沒有對他的值再做改變,就將這個變數的初值 設定提到迴圈之外。乘 2 最佳化,即 b=a*2; 改為 b=a+a; 。還有其他的最佳化,將在往後的時間 陸續增加。

3. [Assemble code]->Assemabler->[Machine code]

經由 Compiler 產生的 Assemble Code,再經由組譯器,產生出 80x86 的機器碼,而此機器碼,

即為机器可執行的指令;和 Compiler 一樣,此階段也有最佳化的工作要做,但是處理的問題和最

佳化的方式,有所不同。在這個階段,我們使用 peephole 的方式做最佳化,減少一些記憶體、暫 存器的存取。

SAOL FILE instr t one () {

// va riable decla rat ion a sig a , x, y, init;

// comput ing st art s here a = 0.196307;

PARSE TREE

MACHINE CODE IN MEM 33 F F x or e di , ed i The input data maybe from local

file or bit stream from internet.

Translate various types of input data into the same format.

Convers inner stored data structure into assemble language

Translate assemable language into machine code.One important difference betweens general assemblers, it writes result (Machine code) into memory, not file.

Runnable machine code.

ASSEMABLE CODE 80X86 assemable code

includes floating point instructions.

圖(三) 實作 SAOL 語言轉成 80x86 機器語言

其次是 SAOL 語言的整合寫作環境,為了日後設計樂器聲音演算法的方便測試,所以計畫設 計這個類似 Virtual Studio 的發展環境(參見圖四),其功能包括

1. 基本文書編輯能力

提供基本的文書功能,如剪下、貼上。

2. 即時語法分析

設計每當使用者打了字後持續半秒沒再動鍵盤,就自動進行語法分析,並將分析的結果,顯示 出來。左方的樹狀結構視窗,顯示出目前的樂器、及其內部變數。

下方的列表視窗,列出分析後的警告、錯誤。

3. 即時執行測試結果

不像 Visual C++等的 IDE,需要先將修改的檔案存到磁碟內,再呼叫外部編譯器去做編譯、連 結、輸出執行檔的動作;本計畫要求,只須按一個快連鍵,即可立即測試演算結果,因為本程式,

將使用者輸入的資料,透過上述的 SAOL Compiler 技術,直接編繹到記憶體中,成為可執行的程 式碼;然後再和測試樂譜一起經下一段所述的排程器,產生出聲音。在使用方便性上,大大的提昇。

圖(四) SAOL parser 程式介面

2.3 SAOL 核心的 opcode 之定義及語意研究

SAOL core opcode 均是標準中有規範的處理函式,各有其特別的功能如數學的計算、音高轉 換、濾波器等等…以使用於 SAOL 語言中。我們於製作解碼器上也對這些 core opcode 作處理,以 在編譯時能做到如同函式庫的連結。

以下部分簡述了 SAOL 中的每一個核心 opcode,這些核心 opcode 均可應用在 MPEG-4 Structured Audio 中的第三種和第四種之標準物件型式。SAOL 核心 opcode 的語法與功能在 MPEG-4 Structured Audio 的標準中均有詳細定義,各 SAOL 核心 opcode 的詳細語法與用法請參照標準 5.9 節[1],在此不再做詳述。我們可以依據其主要功能將所有的核心 opcode 做分類與列表,如下:

Math functions

int, frac, dbamp, ampdb, abs, sgn, exp, log, sqrt, sin, cos, atan, pow, log10, asin, acos, floor, ceil, min, max

Pitch converters gettune, settune, octpch, pchoct, cpspch, pchcps, cpsoct, octcps, midipch, pchmidi, midioct, octmidi, midicps, cpsmidi

Table operations ftlen, ftloop, ftloopend, ftsr, ftbasecps, ftsetloop, ftsetend, ftsetbase, ftsetsr, tableread, tablewrite, oscil, loscil, doscil, koscil

Signal generators kline, aline, kexpon, aexpon, kphasor, aphasor, pluck, buzz, grain

Noise generators irand, krand, arand, ilinrand, klinrand, alinrand, iexprand, kexprand, aexprand, kpoissonrand, apoissonrand, igaussrand, kgaussrand, agaussrand

Filters port, hipass, lopass, bandpass, bandstop, biquad, allpass, comb, fir, iir, firt, iirt Spectral analysis fft, ifft

Gain control rms, gain, balance, compressor

Sample conversion decimate, upsamp, downsamp, samphold, sblock Delays delay, delay1, fracdelay

Effects reverb, chorus, flange, speedt, fx_speedc Tempo changes gettempo, settempo

表(一) SAOL 核心的 opcode 分類表

對每個核心 opcode 而言,都有其所屬的頻率型態(rate type)和使用的參數。使用時如發生下述

對每個核心 opcode 而言,都有其所屬的頻率型態(rate type)和使用的參數。使用時如發生下述

相關文件