Server.default=s=Server.internal; s.boot;
// 这个使用了Lance Putnam的频率范围。我将始终在后台运行它 // 以为我们描绘我们探索声音的图释 FreqScope.new
在调制合成(modulation synthesis)中,一个波,载体,被调制器所影响。
根据载体及调制器相互插入的方式,有很多常用的方式存在。
调制合成很容易执行,为获得复杂动态光谱提供了计算机高效的捷径。那些方法(method)同样有它们各自不同的声音,在音乐上,是很有帮助的。
在本课中,我将使用一个小型GUI(图形化用户界面)来控制合成的参数。
环调制(Ring Modulation)
对于两个信号的直接倍增
载体*调制器
( { var carrier, modulator, carrfreq, modfreq; carrfreq= MouseX.kr(440,5000,'exponential'); modfreq= MouseY.kr(1,5000,'exponential'); carrier= SinOsc.ar(carrfreq,0,0.5); modulator= SinOsc.ar(modfreq,0,0.5); carrier*modulator; }.scope )
对于简单的正弦波,频谱结束于两个频率(两个边带(sideband)):C+M和C-M,在这里,C是载体频率,M是调制器频率。
对于比正弦波更复杂的波形来说,我们触及到了相乘信号频谱的更多组件。
但如果C和M是谐波(harmonic),那么边带也是谐波。
对于想看到一些证实的人来说,这个过程全部遵循于以下数学公式:
cos(C)*cos(M) = 0.5*(cos(C-M) + cos(C+M))
振幅调制(AM)
我们已经见过了AM——使用振幅包络,或一个颤音,都是AM的形态。
AM类似环调制,但有一个细微的差异:调制器是单极性的,即,始终是正的。
{SinOsc.ar(440,0,0.5)}.scope // 双极性, -0.5 到 0.5
/////////
{SinOsc.ar(440,0,0.5,0.5)}.scope // 单极性, 0 to 1 (0.5 加上或减去 0.5)
( { var carrier, modulator, carrfreq, modfreq; carrfreq= MouseX.kr(440,5000,'exponential'); modfreq= MouseY.kr(1,5000,'exponential'); carrier= SinOsc.ar(carrfreq,0,0.5); modulator= SinOsc.ar(modfreq,0,0.25, 0.25); carrier*modulator; }.scope )
光谱以总和结束,这是一个与我们在环调制中所见不同的频率。数学公式如下:
cos(C)*(1+cos(M)) = cos(C)+ 0.5*(cos(C-M) + cos(C+M))
频率调制(FM)
FM于1967年被John Chowning应用于声音合成领域,尽管他在1973年才公布了这个成果。Yamaha注册了这个专利,并于1983年推出了Yamaha DX7合成器,它随后被卖出了300,000台,是有史以来在商业上最成功的合成器。
你可能已经知道“慢版”的FM:震音(vibrato)。
相对将调制器插入载体振幅中的做法,我们即将把调制器插入载体频率中。有三个引数,载体频率C,调制器频率M,以及调制深度或频率偏差D。
因为要控制三个变量,因此我将使用一个GUI而不是一个二维的鼠标。我将在后边的课程中适当解释GUI。
[以下为Mac GUI代码——如果你想在Windows下尝试,在所有东西前加一个“j”]
( var w, carrfreqslider, modfreqslider, moddepthslider, synth; w=SCWindow("frequency modulation", Rect(100, 400, 400, 300)); w.view.decorator = FlowLayout(w.view.bounds); synth= {arg carrfreq=440, modfreq=1, moddepth=0.01; SinOsc.ar(carrfreq + (moddepth*SinOsc.ar(modfreq)),0,0.25) }.scope; carrfreqslider= EZSlider(w, 300@50, "carrfreq", ControlSpec(20, 5000, 'exponential', 10, 440), {|ez| synth.set(\carrfreq, ez.value)}); w.view.decorator.nextLine; modfreqslider= EZSlider(w, 300@50, "modfreq", ControlSpec(1, 5000, 'exponential', 1, 1), {|ez| synth.set(\modfreq, ez.value)}); w.view.decorator.nextLine; moddepthslider= EZSlider(w, 300@50, "moddepth", ControlSpec(0.01, 5000, 'exponential', 0.01, 0.01), {|ez| synth.set(\moddepth, ez.value)}); w.front; )
在现在的频率里,有无数个边带,但是它们有各自不同的强度(strength)。基于我们为参数C,M和D选择的参数,我们可以制作很粗的频谱,或者仅仅一个很轻的调制效果。边带在C+kM(k为任何整数)的地方出现,例如C. C+M, C-M, C+2M, C-2M, …
通过改变调制频率和深度,你可以看到边带中的能量是如何重新分布的;这里实际的公式使用了(Bessel function),这超出了本教程的范围,在此不做详述。
有一个在音乐上更有效的方式来控制FM,通过第I个调制,定义为:
I = D / M
频率偏移于调制频率的比率。如果I很小,则可听到的FM效果就很小。I越大,边带的能量越强。
( var w, carrfreqslider, modfreqslider, modindexslider, synth; w=SCWindow("frequency modulation via modulation index", Rect(100, 400, 400, 230)); w.view.decorator = FlowLayout(w.view.bounds); synth= {arg carrfreq=440, modfreq=1, modindex=0; SinOsc.ar(carrfreq + (modindex*modfreq*SinOsc.ar(modfreq)),0,0.25) }.scope; carrfreqslider= EZSlider(w, 300@50, "carrfreq", ControlSpec(20, 5000, 'exponential', 10, 440), {|ez| synth.set(\carrfreq, ez.value)}); w.view.decorator.nextLine; modfreqslider= EZSlider(w, 300@50, "modfreq", ControlSpec(1, 5000, 'exponential', 1, 1), {|ez| synth.set(\modfreq, ez.value)}); w.view.decorator.nextLine; modindexslider= EZSlider(w, 300@50, "modindex", ControlSpec(0.0, 10, 'linear', 0.01, 0.0), {|ez| synth.set(\modindex, ez.value)}); w.front; )
或者经由鼠标控制:
( { var modf, ind; modf= MouseX.kr(1,440, 'exponential'); ind=MouseY.kr(0.0,10.0); SinOsc.ar(SinOsc.ar(modf,0,modf*ind, 440),0,0.25) }.scope )
相位调制 (Phase Modulation)
如果你有一个相位控制的输入,你同样可以调制相位。
(回忆正弦的引数,SinOsc.ar(freq, phase, mul, add))
( var w, carrfreqslider, modfreqslider, moddepthslider, synth; w=SCWindow("frequency modulation", Rect(100, 400, 400, 300)); w.view.decorator = FlowLayout(w.view.bounds); synth= {arg carrfreq=440, modfreq=1, moddepth=0.01; SinOsc.ar(carrfreq, 2pi*(moddepth*SinOsc.ar(modfreq)),0.25) }.scope; carrfreqslider= EZSlider(w, 300@50, "carrfreq", ControlSpec(20, 5000, 'exponential', 10, 440), {|ez| synth.set(\carrfreq, ez.value)}); w.view.decorator.nextLine; modfreqslider= EZSlider(w, 300@50, "modfreq", ControlSpec(1, 5000, 'exponential', 1, 1), {|ez| synth.set(\modfreq, ez.value)}); w.view.decorator.nextLine; moddepthslider= EZSlider(w, 300@50, "moddepth", ControlSpec(0.01, 5000, 'exponential', 0.01, 0.01), {|ez| synth.set(\moddepth, ez.value)}); w.front; )
( var w, carrfreqslider, modfreqslider, modindexslider, synth; w=SCWindow("frequency modulation via modulation index", Rect(100, 400, 400, 300)); w.view.decorator = FlowLayout(w.view.bounds); synth= {arg carrfreq=440, modfreq=1, modindex=0; SinOsc.ar(carrfreq, (modindex*modfreq*SinOsc.ar(modfreq)),0.25) }.scope; carrfreqslider= EZSlider(w, 300@50, "carrfreq", ControlSpec(20, 5000, 'exponential', 10, 440), {|ez| synth.set(\carrfreq, ez.value)}); w.view.decorator.nextLine; modfreqslider= EZSlider(w, 300@50, "modfreq", ControlSpec(1, 5000, 'exponential', 1, 1), {|ez| synth.set(\modfreq, ez.value)}); w.view.decorator.nextLine; modindexslider= EZSlider(w, 300@50, "modindex", ControlSpec(0.0, 10, 'linear', 0.01, 0.0), {|ez| synth.set(\modindex, ez.value)}); w.front; )
或者经由鼠标控制
( { var modf, ind; modf= MouseX.kr(1,440, 'exponential'); ind=MouseY.kr(0.0,10.0); SinOsc.ar(440, SinOsc.ar(modf,0,modf*ind),0.25) }.scope )
相位改变率是频率。因此,相位调制与频率调制有关。
[PMOsc] // 一个自带的相位调制振荡器
实际上,任何你可以控制的东西都可以被调制,即,被一些振荡器或其它信号所始终改变。
See also: