• 沒有找到結果。

2 Java Orchestra Language

2.2 Implementation of JavaOL

public void render(Bus inputBus, Bus outputBus) {

// fill the outputBus while(!reachEndOfBuffer) {

float v[3];

//calculate the value of v :

: :

//output data to the buffer output(v);

//advance the cursor advanceCursor();

} } }

2.2 Implementation of JavaOL

這個系統的實作程式主要分成三個部份:播放器、伺服器、及樂譜編輯程式,

而且是架構在 client-server 下。SSA 播放器在客服端連上 SSA 伺服器後,將得到 一串資料流並將它計算後更進一步播放出聲音。

2.2.1 The SSAPlayer

SSA 播放器是用來播放 SSASBS(Scream Structured Audio Bitstream)的。當使用 者點擊 SSASBS 的連結,這個程式就會自動啟動並且打開 SSASBS 文件以取得連 線資訊,然後播放器會與伺服器建立好連線,送出需求,取得資料流,然後播放 聲音。

Fig 2 The SSA-Player architecture

圖 5 是 SSAPlayer 的架構。而內部的合成引擎則是 SA 系統的核心部份,我 們稱它為 Scream SA Engine (SSAE),我們將會在下面討論。SSAPlayer 的操作介 面如下圖[10]:

The SSA-Player screenshot

每個解碼器的部份都會被包成 DLL 檔,而且都會有一個出口是可以跟 SSAE 溝通。目前我們提供 Wavetable[11]與 JavaOL 兩種解碼器。在下圖是 SSA 的測試 網頁[12],我們提供 7 首歌測試用,每首歌的曲目旁有顯示這首歌是用哪個解碼 器播放的。

Screenshot of the test song page of the project [http://140.116.82.181/SSA/TestSong.html]

2.2.2 The Scream SA Engine (SSAE)

SSAE 包含以下四個部份:

1. Demuxer

因為每個 track 事件會依據單位時間來切片,在相同時間下的 track 事件 將一起被包成封包。如果我們要演奏這首歌曲,就得先將這些封包解開並把 事件放到正確的 track 中。

2. Scheduler

排程程式是以時間為基礎的音符處理程序,它的工作是根據記錄在事件 上的實行時間標籤來取得事件。

3. Mixer

一個音符將會被轉換成 PCM 音訊資料,在同一段時間內的音符我們都必 需將他們結合在一起,此時就需透過 Mixer。

4. Wave-out

由 Mixer 產生的資料需透過 Wave-out 送到音效卡播放。

2.2.3 Interactions between SA-Engine and Decoders

在 SSASBS 的 bitstream 裡有張表格指示哪個解碼器應該被使用,SSAE 從各 自的 DLL 文件載入這些解碼器並且發出初始化的訊息,在每次的 k-cycle 中,這 個引擎就會發出產生資料的訊息給每個解碼器,以便於在每個 event 的緩衝區上 產生音符。當被指定的解碼器一接到這個訊息,它就會把這一段時間的音符解成 純音訊資料。當 SSASBS bitstream 被解完後,那些解碼器就會收到「完成」的訊 息並且釋放資源。

2.2.4 JavaOL Decoder

JavaOL 解碼器看起來象在 SSAE 和 JVM(參閱圖 7)之間的一座橋,全部的 Java 指令在 JVM 上執行,當 SSAE 需執行樂器指令時,這些命令被送出,並且由 JavaOL 解碼器所管理,JavaOL 解碼器必需確定哪條 Java 指令將被執行。例如,如果樂 譜上顯示一個鋼琴的音符會在 T0 時間產生,SSAE 的排程程式將產生一個指令來 創造這個音符,JavaOL 解碼器得到命令後執行 Java VM 的”create instance”方法來 產生鋼琴的物件實體。

Fig 3 The threading mechanism of JavaOL decoder

相關文件