FM(頻率調變,Frequency Modulation)除了可以用來產生抖音(Vibrato)外,還可以用來模擬自然界的聲音。嚴格來說,音色並非由波的波形來決定,而是由波的頻譜包絡曲線來決定的。在古典音色理論(Classical Theory of Timbre)中,會利用傅利葉轉換,將波形轉成頻率-強度的頻譜,此時繪製出來的圖形曲線,就是頻譜的包絡曲線。然而,在實際上,在不同時間下所產生的包絡曲線並不相同,因此在現代音色理論(Modern Theory of Timbre)中,將時間軸加入頻譜的分析中,形成頻率-強度-時間的三維圖形。在使用電腦模擬聲音的時候,只要能夠模擬出同樣的頻譜出來,就可以模擬出相同的聲音。
自然界的聲音,大多可以使用FM來合成。而且FM在實作上相對簡單,只要有四個振盪器就能夠實作了。以下是FM的流程圖:
可以調整的參數有以下幾種:
- Amp:Amplitude,聲音強度。
- DUR:Duration,聲音持續時間。
- Fc:Carrier Frequency,載波頻率。
- Fm:Modulation Frequency,調變頻率。
- Imax:頻帶最大寬度。
- F1:振幅使用的波表。
- F2:調變頻率使用的波表。
除了Amp外,其他的參數都會影響到FM模擬出來的聲音音色。以下舉幾個聲音模擬例子:
鐘聲(Bell)
噹噹噹的鐘聲,特色在於聲音在敲響後,會拉出很長的尾音。因此DUR長度通常為5~15秒,Fc和Fm的比例為5:7(200:280),Imax為10。
F1和F2的波表相同,波形如下圖:
木鼓聲(Wood Drum)
咚咚咚的木鼓聲,特色在於聲音在打響後,一開始的頻率並不穩定,而且聲音強度很大,在很短的時間內聲音強度降到很小,頻率也很穩定。因此DUR長度通常為0.2秒,Fc和Fm的比例為16:11(80:35),Imax為25。
F1的波表如下:
F2的波表如下:
銅管聲(Brass)
銅管樂器都有個共同的特性,那就是在一開始吹奏的時候需要使用比較大的力道,因此聲音在一開始的強度會很高,接著趨於穩定,然後漸漸收尾。銅管的DUR長度常用值為0.6秒,Fc和Fm的比例為1:1(440:440),Imax為5。
F1和F2的波表相同,波形如下圖:
單簧管(豎笛)聲(Clarinet)
簧管樂器藉由空氣振動簧片,振動強度十分穩定,頻率變化會愈來愈小。單簧管的DUR長度的常用值為0.5秒,Fc和Fm的比例為3:2(900:600),Imax為2。
F1的波表如下:
F2的波表如下:
Csound FM實作
<CsoundSynthesizer>
<CsOptions>
</CsOptions>
<CsInstruments>
sr = 44100 ;sample rate
ksmps = 1 ;samples in a control period
nchnls = 1 ;number of channels
0dbfs = 100 ;value of 0db
gisine ftgen 100, 0, 16384, 10, 1
giexp10 ftgen 101, 0, 16384, 5, 1, 16384, 0.01
giexpdrum ftgen 102, 0, 16384, 5, .7, 511, .8, 1533, 1, 2044, .8, 4088, .2, 8208, .01
gilsegs ftgen 103, 0, 16384, 7, 0, 383, 1, 1660, 0, 14341, 0
gilsegadsr ftgen 104, 0, 16384, 7, 0, 512, 1, 512, 0.75, 14848, 0.75, 512, 0
giexpev ftgen 105, 0, 16384, 5, 0.01, 512, 1, 15360, 1, 512, 0.01
giexp105 ftgen 106, 0, 16384, 5, 1, 8192, 0.5, 8192, 0.5
instr 31
;BELL
isrt init p2
idur init p3 ;5
ipitch init p4
imax init 10
if1 init giexp10
if2 init giexp10
ifratio init 5./7.
iamp init 50
ilf init 280
ifp = ilf*cpspch(p4)/cpspch(8.00)
ifc = ifp
ifm = ifp/ifratio
a1 oscil iamp, 1./idur, if1
a2 oscil ifm*imax, 1./idur, if2
am oscil a2, ifm, gisine
ac oscil a1, ifc+am, gisine
out ac
endin
instr 32
;WOOD DRUM
isrt init p2
idur init p3 ;0.2
ipitch init p4
imax init 25
if1 init giexpdrum
if2 init gilsegs
ifratio init 16./11.
iamp init 50
ilf init 80
ifp = ilf*cpspch(p4)/cpspch(8.00)
ifc = ifp
ifm = ifp/ifratio
a1 oscil iamp, 1./idur, if1
a2 oscil ifm*imax, 1./idur, if2
am oscil a2, ifm, gisine
ac oscil a1, ifc+am, gisine
out ac
endin
instr 33
;BRESS
isrt init p2
idur init p3 ;0.6
ipitch init p4
imax init 5
if1 init gilsegadsr
if2 init gilsegadsr
ifratio init 1./1.
iamp init 50
ilf init 440
ifp = ilf*cpspch(p4)/cpspch(8.00)
ifc = ifp
ifm = ifp/ifratio
a1 oscil iamp, 1./idur, if1
a2 oscil ifm*imax, 1./idur, if2
am oscil a2, ifm, gisine
ac oscil a1, ifc+am, gisine
out ac
endin
instr 34
;CLARINET
isrt init p2
idur init p3 ;0.5
ipitch init p4
imax init 4
if1 init giexpev
if2 init giexp105
ifratio init 3./2.
iamp init 50
ilf init 900
ifp = ilf*cpspch(p4)/cpspch(8.00)
ifc = ifp
ifm = ifp/ifratio
a1 oscil iamp, 1./idur, if1
a2 oscil ifm*imax, 1./idur, if2
am oscil a2, ifm, gisine
ac oscil a1, ifc+am, gisine
out ac
endin
</CsInstruments>
<CsScore>
t 0 60
;ins strt dur pitch
i33 0.1 0.6 8.00
i. + 0.6 8.04
i. + 0.6 8.07
i. + 0.6 8.04
i. + 0.6 8.00
i34 3.1 0.5 8.00
i. + 0.5 8.04
i. + 0.5 8.07
i. + 0.5 8.04
i. + 0.5 8.00
i32 5.6 0.2 8.00
i. + 0.2 8.04
i. + 0.2 8.07
i. + 0.2 8.04
i. + 0.2 8.00
i31 6.6 5 8.00
e
</CsScore>
</CsoundSynthesizer>
進階FM
使用愈多個Carring Oscilator(載波振盪器)或是Modulation Oscilator(調變振盪器),可以合成出更複雜、更真實的自然聲音。這部份將在以後介紹。