SuperCollider:调制合成

Server.default=s=Server.internal;
s.boot;
// 这个使用了Lance Putnam的频率范围。我将始终在后台运行它
// 以为我们描绘我们探索声音的图释
FreqScope.new


可调三个参数的GUI
可调三个参数的GUI

在调制合成(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]	// 一个自带的相位调制振荡器

实际上,任何你可以控制的东西都可以被调制,即,被一些振荡器或其它信号所始终改变。

Be Sociable, Share!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.