Note: 这份笔记专为没有或很少编程基础的人士准备的,未来将会循序渐进。个人能力有限,如有错漏之处,还请方家指正。
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