Function Table 和 GEN Routine 如何產生聲波?


聲音是由聲波產生,聲波的形狀代表著聲音的音色,聲波的振幅代表著聲音的大小,聲波的頻率代表著聲音的高低。聲波是形成聲音最基本的物理現象,因此若要製造聲音,就必須先製造「波(Wave)」。在Csound中,產生聲波必須要靠Function Table(波表)、GEN RoutineOscillator(振盪器)來共同完成。

Function Table

由於數位化的限制,沒辦法產生出完全連續的數位波形,勢必得把一個波形切成細小塊來逼近,這個過程就稱為「取樣(Sampling)」。舉例:若要產生一個由數值0~1線性成長的波形,若要數位化表示,可能就得表示成「0, 0.5, 1」(3個樣本點)、「0, 0.25, 0.5 0.75, 1」(4個樣本點)。若是取4個樣本點(Sample),若我們原先需要0.3這個值的話,取樣後就會變成0.25,造成波形的失真。因此,取樣數愈多,愈能夠還原出原本的波形,失真的狀況也會更加輕微。取樣率(Sample Rate)就是一個週期的波有幾個樣本數量。

下圖是三角函數sin波,上下兩個sin波的取樣率分別是16和8196。可以明顯看出,取樣率太低的波形,非常的不圓滑!

Function Table 和 GEN Routine 如何產生聲波?

Function Table就是用來紀錄一個波形在每個時間點上的值,就是用來儲存取樣結果的表格啦!在Csound中又稱為「f Statement」,因為要定義一個Function Table,就必須要用到f Statement。格式如下:

f p1 p2 p3 p4 p5 ... PMAX

  • p1:表格的代號。
  • p2:波的起始時間。
  • p3:表格的大小,就是波的取樣率。數值必須為2n或是2n+1。
  • p4:產生出波的規則(GEN Routine的號碼)。
  • p5... PMAXGEN Routine的參數。

GEN Routine

GEN Routine全名應為Generating Routine,就是產生波的規則,可以藉由定義規則,來生成任意形狀的波形。在Csound中,GEN Routine有好幾種,皆以數字代號來表示。例如代號10(GEN10),就是用來產生出sin或是sin的諧波組成的波形,因此除了基本的正弦波外還可以產生出方波、脈衝波、三角波。不同代號的GEN,後面所接的參數差異頗大。

GEN10

產生出sin或是sin的諧波組成的波形。格式如下:

f p1 p2 p3 10 hw1 [hw2 ...]

  • hw:順序為諧坡次數(從1次諧坡開始),數值決定諧波的振幅權重。

GEN5

產生出多個曲現線段組成的波形。格式如下:

f p1 p2 p3 5 a la [b lb [c lc [d ...] ]]

  • a,b,c,d...:波的值。
  • la,lb,lc...:從這波值變化到下個波值的長度,加總應小於或等於p3。

GEN7

產生出多個直線線段組成的波形。格式如下:

f p1 p2 p3 7 a la [b lb [c lc [d ...] ]]

  • a,b,c,d...:波的值。
  • la,lb,lc...:從這波值變化到下個波值的長度,加總應小於或等於p3。

GEN21

產生出亂數波表,用來產生雜訊。格式如下:

f p1 p2 p3 21 type level [arg1 [arg2]]

  • type:1~11,亂數的種類,常會使用1號。
  • level:振幅。
  • arg1:type 9,10需要傳入,type 6可選擇是否要傳入。
  • arg1:type 9需要傳入。

GEN01

音訊檔案中取Sample,產生出波表。格式如下:

f p1 p2 p3 1 filcod skiptime format channel

  • filcod:檔案號碼(soundin.filcod)或路徑。支援WAVOGG檔案。
  • skiptime:跳過時間,要從哪個時間點後開始取樣。(單位:秒)
  • format:0~6,常用的數值是0,4,5,6。0是讀入檔案的格式,4是16位元的短整數;5是32位元的長整數;6是32位元的浮點數。一般設0或6都可以正常使用。
  • channel:要使用的聲道數量,0為所有聲道。

其他GEN的用法日後再慢慢補充。

Oscillator

Oscillator,可稱為振盪器,可用來將Function Table振盪成真正的波,就是可以算出在某時間點下的波應該要為什麼數值。Function Table決定的是波的波形,而Oscillator所決定的是波的振幅和頻率,若要產生出波,兩者缺一不可。在Csound中,可用oscil來簡單地振盪出波。oscil的格式如下:

av oscil amp, cps, fn [, phs]

  • av:在目前時間點下,波的數值。
  • amp:波的振幅。
  • cps:波的頻率(Cycles of one second)。
  • fn:Function Table的代號。
  • phs:波形的相位移。數值為0~1,若一個波周期為2π,那麼數值0.5就是代表π。如果不設定這項參數,預設值為0。

常用波形的振盪方式

下面是一個正弦波的振盪範例程式,振幅為0db、頻率為1、週期為1秒,一共振盪出兩個全波(共2秒)。

正弦波

要振盪出正弦波,可用GEN10,參數傳入:

1

Function Table 和 GEN Routine 如何產生聲波?

正弦波試聽

方波

要振盪出方波,可用GEN10,參數傳入:

1 0 0.33333 0 0.2 0 0.14286 0 0.11111 0 0.09091 0 0.07692 0 0.06667 0 0.05882 0 0.05263 0 0.04762 0 0.04348 0 0.04 0 0.03704 0 0.03448 0 0.03226 0 0.0303 0 0.02857 0 0.02703 0 0.02564 0 0.02439 0 0.02326 0 0.02222 0 0.02128 0 0.02041 0

Function Table 和 GEN Routine 如何產生聲波?

方波試聽

鋸齒波

要振盪出鋸齒波,可用GEN10,參數傳入:

1 -0.5 0.33333 -0.25 0.2 -0.16667 0.14286 -0.125 0.11111 -0.1 0.09091 -0.08333 0.07692 -0.07143 0.06667 -0.0625 0.05882 -0.05556 0.05263 -0.05 0.04762 -0.04545 0.04348 -0.04167 0.04 -0.03846 0.03704 -0.03571 0.03448 -0.03333 0.03226 -0.03125 0.0303 -0.02941 0.02857 -0.02778 0.02703 -0.02632 0.02564 -0.025 0.02439 -0.02381 0.02326 -0.02273 0.02222 -0.02174 0.02128 -0.02083 0.02041 -0.02

Function Table 和 GEN Routine 如何產生聲波?

鋸齒波試聽

三角波

要振盪出三角波,可用GEN10,參數傳入:

1 0 -0.11111 0 0.04 0 -0.02041 0 0.01235 0 -0.00826 0 0.00592 0 -0.00444 0 0.00346 0 -0.00277 0 0.00227 0 -0.00189 0 0.0016 0 -0.00137 0 0.00119 0 -0.00104 0 0.00092 0 -0.00082 0 0.00073 0 -0.00066 0 0.00059 0 -0.00054 0 0.00049 0 -0.00045 0 0.00042 0

Function Table 和 GEN Routine 如何產生聲波?

三角波試聽

脈衝波

要振盪出脈衝波,可用GEN10,參數傳入:

1 1 1 1 1 0.8 0.6 0.4 0.2 0

Function Table 和 GEN Routine 如何產生聲波?

脈衝波試聽

正脈衝方波

要振盪出正脈衝方波,可用GEN7,參數傳入:

1 4098 1 0 0 4098 0

Function Table 和 GEN Routine 如何產生聲波?

正脈衝方波試聽

其他波形因為牽扯到組合複雜波形的問題,日後有了對應文章再慢慢補充。

關於作者

Magic Len

各位好,我是Magic Len,是這網站的管理員。我是台灣台中大肚山上人,畢業於台中高工資訊科和台灣科技大學資訊工程系,曾在桃機航警局服役。我熱愛自然也熱愛科學,喜歡和別人分享自己的知識與經驗。如果你有興趣認識我,可以加我的Facebook,並且請註明是從MagicLen來的。

相關文章