聲音是由聲波產生,聲波的形狀代表著聲音的音色,聲波的振幅代表著聲音的大小,聲波的頻率代表著聲音的高低。聲波是形成聲音最基本的物理現象,因此若要製造聲音,就必須先製造「波(Wave)」。在Csound中,產生聲波必須要靠Function Table(波表)、GEN Routine和Oscillator(振盪器)來共同完成。
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就是用來紀錄一個波形在每個時間點上的值,就是用來儲存取樣結果的表格啦!在Csound中又稱為「f Statement」,因為要定義一個Function Table,就必須要用到f Statement。格式如下:
- p1:表格的代號。
- p2:波的起始時間。
- p3:表格的大小,就是波的取樣率。數值必須為2n或是2n+1。
- p4:產生出波的規則(GEN Routine的號碼)。
- p5... PMAX:GEN Routine的參數。
GEN Routine
GEN Routine全名應為Generating Routine,就是產生波的規則,可以藉由定義規則,來生成任意形狀的波形。在Csound中,GEN Routine有好幾種,皆以數字代號來表示。例如代號10(GEN10),就是用來產生出sin或是sin的諧波組成的波形,因此除了基本的正弦波外還可以產生出方波、脈衝波、三角波。不同代號的GEN,後面所接的參數差異頗大。
GEN10
產生出sin或是sin的諧波組成的波形。格式如下:
- hw:順序為諧坡次數(從1次諧坡開始),數值決定諧波的振幅權重。
GEN5
產生出多個曲現線段組成的波形。格式如下:
- a,b,c,d...:波的值。
- la,lb,lc...:從這波值變化到下個波值的長度,加總應小於或等於p3。
GEN7
產生出多個直線線段組成的波形。格式如下:
- a,b,c,d...:波的值。
- la,lb,lc...:從這波值變化到下個波值的長度,加總應小於或等於p3。
GEN21
產生出亂數波表,用來產生雜訊。格式如下:
- type:1~11,亂數的種類,常會使用1號。
- level:振幅。
- arg1:type 9,10需要傳入,type 6可選擇是否要傳入。
- arg1:type 9需要傳入。
GEN01
從音訊檔案中取Sample,產生出波表。格式如下:
- filcod:檔案號碼(soundin.filcod)或路徑。支援WAV和OGG檔案。
- 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:在目前時間點下,波的數值。
- amp:波的振幅。
- cps:波的頻率(Cycles of one second)。
- fn:Function Table的代號。
- phs:波形的相位移。數值為0~1,若一個波周期為2π,那麼數值0.5就是代表π。如果不設定這項參數,預設值為0。
常用波形的振盪方式
下面是一個正弦波的振盪範例程式,振幅為0db、頻率為1、週期為1秒,一共振盪出兩個全波(共2秒)。
<CsoundSynthesizer>
<CsOptions>
</CsOptions>
<CsInstruments>
sr = 44100 ;sample rate
ksmps = 16 ;samples in a control period
nchnls = 1 ;number of channels
0dbfs = 100 ;value of 0db
instr 1
;p4=frequent
;p3=duration
a1 oscil 100, p4, 1 ;oscillate f1
out a1 ;output
endin
</CsInstruments>
<CsScore>
f1 0 16384 10 1
t 0 60
;ins strt dur freq
i1 0 2 1
e
</CsScore>
</CsoundSynthesizer>
正弦波
要振盪出正弦波,可用GEN10,參數傳入:
方波
要振盪出方波,可用GEN10,參數傳入:
鋸齒波
要振盪出鋸齒波,可用GEN10,參數傳入:
三角波
要振盪出三角波,可用GEN10,參數傳入:
脈衝波
要振盪出脈衝波,可用GEN10,參數傳入:
正脈衝方波
要振盪出正脈衝方波,可用GEN7,參數傳入:
其他波形因為牽扯到組合複雜波形的問題,日後有了對應文章再慢慢補充。