SuperCollider:加法合成和减法合成

减法合成(Subtractive Synthesis)

减法合成就是从一段复杂的音源中减去一些部分,以获得一个更加可塑的声音。在SuperCollider里,这个功能是用source+filter的结构实现的。比如:

(
{
var source, line, filter; //首先定义三个变量:音源,线性变化,滤波器
source=LFNoise0.ar(400);//给音源变量赋值。(除了LFNoise0之外,常见的噪音音源还有WhiteNoise,PinkNoise
line=Line.kr(10000,1000,10);//给线性变化赋值,用10秒的时间从10000变化至1000
filter=Resonz.ar(source,line,0.1); //给滤波器赋值。这里常用的滤波函数还有LPF,HPF和BPH
filter // 这是大括号里返回的最后一个值
}.scope;
)

上述的代码结构和表述对大部分接触过编程的人来说都不会陌生,实际上,这也是一种比较清晰明了的方法。Having said that, SuperCollider里还有别的表述方式,使用了in-line的嵌套结构。

{Resonz.ar(LFNoise0.ar(400),Line.kr(10000,1000,10),0.1)}.scope

加法合成(Additive Synthesis)

与减法合成不同,加法合成从一个简单的音源开始,增加一些部分,得到一个更加复杂的声音。一个非常基本的声音是正弦音。比如:

{SinOsc.ar}.scope //默认值是A和音 (440Hz)
//在SuperCollider里,我们可以使用“+”将两个正弦音叠加
//比如:
{SinOsc.ar(400,0,0.1) + SinOsc.ar(660,0,0.1)}.scope
//按着之前的逻辑,我们可以将上边的代码该写成下面这样:
{SinOsc.ar([400,660],0,0.1)}.scope

如果你比较细心的话,可能会发现,上面代码生成的两个正弦音分别从左右声道发声。也许我们可以趁此机会介绍一个常用的声相UGen:Pan2

//Pan2的使用方法
Pan2.ar(input signal, pan position) 
//Pan position的值的范围是(-1,1),其中-1表示极左,1表示极右
//比如,如果我们要将一个单声道音源PinkNoise的声音信号按照鼠标横向位置变换声相位置
{Pan2.ar(PinkNoise.ar(0.1),MouseX.kr(-1,1))}.scope

//在SuperCollider里使用多声道是非常直接的,以之前的正弦音为例,[]之内的数字实际上是个array(序列),array里的值会被分配到不同的声道。如果我们希望生成一个5声道的正弦音:
{SinOsc.ar([400,600,500,700,1000],0,2)}.scope
//如果你尝试运行上面的代码,很大的可能是,你只听到两个声道的声音。因为大多数人家里都没有多声道的设备

//所以我们也许需要把多声道的声音包成单声道或者双声道的声音,其中一个方法是使用Mix
{Mix(SinOsc.ar([400,660],0,0.1))}.scope