• 沒有找到結果。

聲音合成機制

三、 物件與結構設計

4.3 聲音合成機制

4.3.1 波表即時動態運算

在 3.4 章時有提到動態波表隨球缺數(n)而改變,實作上就是設一個充滿變數的空矩 陣,以!{    }表示,因為球缺是球體被切的球面,因此端點數會比球缺數多 1,又因為有 兩個端點,所以矩陣變成!{   ! − 1 + 2  },討論到此時,是最理想的狀態,但是在實 作上卻不然,以下便以掃描索引物件和動態波表物件兩方向來做討論。

4.3.1.1 掃描索引物件

在掃描索引所用到的物件是 Pure Data 裡一個讀表的物件tabread4~,此物件的特 性就是以四點內插的方式讀表,因此讀出來數值間的曲線會圓滑(如圖 49)。而四點內

插需要在所處的區間前後各留兩個索引值輔助內插,因此矩陣!的前後兩端點需要再各

加上兩個索引值,所以此矩陣的長度變成!{ ! − 1 + 2 + 4}。

圖 49 tabread4~讀表輸出曲線

4.3.1.2 動態波表物件

動態波表物件是針對本論文研究所寫的副程式dynamic_array.pd ,此物件有兩個

功能,一是針對動態的讀表的過程中,會因為pmpd 影格率與音訊緩衝的運算時間不

足,造成聲音有破音(clipping),因此需要做一點音量上的修飾,作法就是把原本的波 表複製成兩個,如圖 50 所示,傳到theta(n)a 和 theta(n)b 兩個波表後,快速切換讀表,

並且在音量上做交疊(overlap),把波表看做是音框(frame)來看,這樣波表的頭尾就會因

-­‐     -­‐  43  

為交疊而不致破音。二是透過字串切割與拼貼的方式,讓矩陣不斷寫入變數,隨著球 缺與波表類型的轉換,來承接運動中質點即時的位置,存入波表theta(n)a 和 theta(n)b 內。

圖 50 動態波表的矩陣運算

4.3.2 掃描波形的對應

掃描波形的對應,有三種波形做切換,分別是鋸齒波、三角波和正弦半波。基礎 波形中,唯獨無法用到方波的原因就是因為方波在振幅上的表現只有 1 和 0,即便乘上 矩陣的長度,也只能讀到頭和尾,因此無法使用。而正弦波因為是振幅 1 至-1 的波形,

在索引值的列表中沒有負的,因此取絕對值,變成正弦半波。

鋸齒波由物件phasor~直接產生。如圖 51 所示,給定數值當做頻率。以輸出的振 幅範圍 1 至-1 來看,鋸齒波輸出的是範圍從 0 至 1 的連續訊號。

圖 51 鋸齒波實作

三角波是由鋸齒波做簡單的訊號演算,將兩個波形相反的鋸齒波做訊號放大兩倍 後,再取最小值就是。因為是鋸齒波改寫,所以震盪範圍是從 0 至 1 而不是-1 至 1。三

-­‐     -­‐  44  

角波輸出的波形是從 0 跑到 1,再從 1 跑回 0,但是因為取完最小值後,週期變成原本 鋸齒波的一半,頻率變成兩倍,因此避免掃描頻率不一致,給定的頻率為鋸齒波的一 半(圖 52)。

圖 52 三角波實作

正弦半波主要先由物件osc~ 產生,以正弦波的一個週期來看,在相位上的變化

歷經 4 個90°,取絕對值後便出現兩個半波,是三角波的兩倍週期,因此避免掃描頻率

不一致,給定的頻率為三角波的一半,也就是鋸齒波的四分之一,如圖 53。而跟三角 波不一樣的是,三角波在數值上是線性升降,正弦半波則是非線性升降。

圖 53 正弦半波實作

最後做訊號的加總後,乘上球缺數 n,加上 2(跳過兩個內插索引值從端點開始掃 描讀表),快速地在兩個波表的音量上做交疊後,加總起來作一個 DC 平移,就是完整 的掃描機制(圖 54)。

-­‐     -­‐  45  

圖 54 掃描波形實作 4.3.3 動態倍頻與對應倍頻

!方向的有 20 個球缺面,兩個面夾一條!方向線段,即使用固定且單一頻率掃描 每一條!方向線段後產生的波表,還是會因為波形即時動態的變化而不斷消長隱藏在聲 音裡的高低頻率,聲音延續得越久,聽覺上動態的程度也越大;反之如果用對應倍頻 的話,頻率成分的變動就是靠球面波的震盪程度決定。就頻率成分構成聲音的織度而 言,前者需要較長的時間而使聲音細緻,後者時間短即可聽到豐富的音色。更多聲音 的特色與特性會在後面第五章做更多的討論。

相關文件