Csound-004.02 來創造自己的樂器吧!之建立波表
來自專欄我的創想與雜談
在上一章所提到的波表合成器中,oscil指令默認調用的是正弦波,只包含一個泛音。但是,在現代的作曲與應用中,非常有必要利用更多有意思的波表。在這一篇我帶領大家利用在樂譜區創建的ftable命令來創建一個能被振蕩器所使用的波表。
我們之前得知了oscil指令可以接受一個可選的命令,也就是波表序號。這一點是與樂譜區域的ftable所對應。那麼什麼是ftable呢?它即是一個計算機中常用的查找表,用一定指令來計算出一個x與y對應的點對點的函數。這時輸入x值就可以輸出對應的y值。在振蕩器的應用中,可以將它理解為生成出來的一個基礎波形,在任何頻率去播放這個波表都可以讓它發出在這個頻率上的此波形。若將它利用到adsr生成,或者lfo生成,則會產生不一樣的作用。
在這裡我們首先來看一段典型的ftable(如圖4-1或以下的例子)
;f命令 序號 波表產生時間(0為無限長)波表大小 生成演算法 第一個參數 第二個參數 第三個參數 第四個參數 第五個參數 第六個參數 第七個參數
f 1 0 1024 10 1 0 0.5 0 0.3 0 0.2
- f命令 即是告訴計算機產生一段查找表
- 序號1 是告訴計算機這個波表的序號是1,0表示這個波表一直產生
- 波表大小 1024代表了這個波表有1024段,波表大小越大,其數字失真越小,且越接近連續信號。
- 生成演算法 代表了這個波表調用GEN10來生成波表
- 往後的所有參數都是屬於調用GEN10演算法時需要的參數
那麼我們首先來了解一下GEN Routines。GEN Routines是Csound所使用的一種填滿波表的命令。根據調用GEN Routines的序號以及後面所跟隨著序號的參數,即可使用該GEN來產生信號。要注意一點的是,f statement仍然存儲於樂譜區域,所以所有的命令都不必要用頓號分隔開。在Csound中,GEN Routine有千千萬的種類,關於其詳細請點擊以下鏈接:http://www.csounds.com/manual/html/ScoreGenRef.html
在上面的例子中,我所使用的GEN為GEN10,也就是頻域的泛音權重疊加合成。其排序方法是10 諧波1 [諧波2 諧波3 諧波4 諧波5]。其中,中括弧[]的內容同樣是可以省略的。若省略了特定諧波往後的諧波,則代表此諧波後沒有諧波。
既然我們得知了此命令,我們就可以通過填補諧波的成分來還原一個波形:
1,正弦波
由於其只存在基頻,因此我們可以得到以下ftable:
f1 0 1024 10 1
2,方波
由於其只存在奇次諧波,且奇次諧波的權重按照泛音數量漸漸變少,因此我們可以得到以下ftable:
f2 0 1024 10 1 0 0.3 0 0.2 0 0.14 0 .111
備註:其中的0即代表按次序排列的偶次諧波
3,鋸齒波
由於其存在所有諧波,且諧波的權重按照泛音數量漸漸變少,因此我們可以得到以下ftable:
f3 0 1024 10 1 0.5 0.3 0.25 0.2 0.167 0.14 0.125 .111
擁有以下波表之後,我們就可以將它導入我們的振蕩器。由於上面正弦波對應波表1,方波對應波表2,鋸齒波對應波表3,我們需要將它的序號填到oscil指令的第三項中,如下所示:
instr 1
a1 oscil 10000, 440, 1/2/3 ;1代表正弦波,2代表方波,3代表鋸齒波,選其中1個即可
outs a1, a1
endin
那麼我們可以生成以下csd,同樣,只需要拷貝進csound即可運行
<CsoundSynthesizer>
<CsOptions>
-odac -d
</CsOptions>
<CsInstruments>
sr = 44100
ksmps = 32
nchnls = 2
instr 1
a1 oscil 10000, 440, 1
outs a1, a1
endin
instr 2
a1 oscil 10000, 440, 2
outs a1, a1
endin
instr 3
a1 oscil 10000, 440, 3
outs a1, a1
endin
</CsInstruments>
<CsScore>
f1 0 1024 10 1 ; Sine
f2 0 1024 10 1 0 0.3 0 0.2 0 0.14 0 .111 ; Square
f3 0 1024 10 1 0.5 0.3 0.25 0.2 0.167 0.14 0.125 .111 ; Sawtooth
i1 0 2
i2 2 2
i3 4 2
</CsScore>
</CsoundSynthesizer>
當然,同學們也可以創建自己所感興趣的波表,可以有非常複雜的諧波結構,也可以利用更大的波表區域來創建數字失真更小的波形。或者根據上面提供的網站來學習更多創建波表的方式。接下來的教程中我也會提到更多有意思的GEN Routine來幫助各位同學得到自己需要的波表。
總結:
利用GEN10可以創建被oscil命令所利用的波表。
ftable的生成被存放在樂譜區,所以不能使用逗號分隔命令。
oscil命令的第三項參數即是對應的波表序號。
推薦閱讀:
※直接數字式頻率合成器(DDS)的基本原理
※TB 303是什麼?
※合成器的模擬合成器,採樣器,工作站等分類有什麼區別? ?