学习SuperCollider纯属图一乐。关于SuperCollider的中文资料较少,在这里稍微记录一下学习过程,内容基于A Gentle Introduction to SuperCollider。
1. Basics
SuperCollider由两部分组成:server (叫做scsynth) 和language/client/interpreter (叫做sclang)。server是一个声音引擎,负责产生声音。我们在language中写代码、执行命令,控制声音的产生。
Start up
一些快捷键:
Ctrl + n
新建文件Ctrl + b
开启serverCtrl + +
放大字体Ctrl + Enter
执行程序(光标要放在要执行的指令那一行/代码块里)Ctrl + .
停止播放声音Ctrl + Shift + p
将Post window清屏
第一个程序
写一个Hello World程序并在Post Window中显示:
"Hello World".postln;
产生正弦波:
{SinOsc.ar}.play;
显示控制音量的图形界面:
s.volume.gui
可以通过调整参数,产生不一样的正弦波:
{SinOsc.ar(LFNoise0.kr(10).range(500, 1500), mul: 0.1)}.play;
运算优先级
按照从左到右的顺序进行计算,和数学运算符自身的优先级(比如乘除优先级大于加减)没有关系。如果要以另外的顺序进行计算,必须使用括号。
// In high school, the result was 9; in SC, it is 14:
5 + 2 * 2;
// Use parentheses to force a specific order of operations:
5 + (2 * 2); // equals 9.
代码块
一次执行几行代码可以选中再Ctrl + Enter
,也可以用一对括号()将代码包起来,光标在代码块中任意位置,按下Ctrl + Enter
。
保存输出的音频
// QUICK RECORD
// Start recording:
s.record;
// Make some cool sound
{Saw.ar(LFNoise0.kr([2, 3]).range(100, 2000), LFPulse.kr([4, 5]) * 0.1)}.play;
// Stop recording:
s.stopRecording;
// Optional: GUI with record button, volume control, mute button:
s.makeWindow;
Post window中会显示文件保存的路径。
变量
小写字母中,除了s
(保留,默认指代server),其他都可以直接用作变量名。
a = "Hello, World"; // a string of characters
b = [0, 1, 2, 3, 5]; // a list
c = Pbind(\note, Pwhite(0, 10), \dur, 0.1); // you'll learn all about Pbind later, don't worry
// ...and now you can use them just like you would use the original data:
a.postln; // post it
b + 100; // do some math
c.play; // play that Pbind
d = b * 5; // take b, multiply by 5, and assign that to a new variable
可以用~
声明更长的变量名,变量名必须以小写字母开头,后面可以用数字,下划线和大写字母。
~myFreqs = [415, 220, 440, 880, 220, 990];
~myDurs = [0.1, 0.2, 0.2, 0.5, 0.2, 0.1];
Pbind(\freq, Pseq(~myFreqs), \dur, Pseq(~myDurs)).play;
全局变量和局部变量
前面说的都是全局变量,一旦声明,就会在任何地方工作,直到退出SuperCollider。如果要定义局部变量,要用保留字var
。局部变量只在代码块的范围内存在。
// Environment variables
~galaApples = 4;
~bloodOranges = 5;
~limes = 2;
~plantains = 1;
["Citrus", ~bloodOranges + ~limes];
["Non−citrus", ~plantains + ~galaApples];
// Local variables: valid only within the code block.
// Evaluate the block once and watch the Post window:
(
var apples = 4, oranges = 3, lemons = 8, bananas = 10;
["Citrus fruits", oranges + lemons].postln;
["Non−citrus fruits", bananas + apples].postln;
"End".postln;
)
~galaApples; // still exists
apples; // gone
本章代码示例:example_1
2. Patterns
Pattern Family
Pbind
和Pseries
中的大写P指的就是Pattern。
Pbind(\degree, 0).play;
关键字\degree
表示scale degrees,数字0意味着第一个scale degree(默认中央C大调)。C, D, E, F, G…被表示为0, 1, 2, 3, 4…
关键字\dur
指定持续时间,单位是秒。
// C大调音阶
Pbind(\degree, Pseq([0, 1, 2, 3, 4, 5, 6, 7], 1), \dur, 0.2).play;
Pseq
可以作为\degree
和\dur
的输入,由两部分组成:
- 一个有序的列表,列表用方括号包起来
- 列表重复的次数
如果要用十二平均律的音符,用\note
替换\degree
;如果要用MIDI音符数字表示,用\midinote
替换\degree
(60=middle C, 61=C#, etc);如果要用频率表示,用\freq
替换\degree
。\midinote
和\note
还能用浮点数表示微分音。
其他关键字:\amp
表示强度,范围是0到1;\legato
表示连奏,在0.1到1之间比较好。
\Prand
类似Pseq
,但是从列表里随机挑选音符。\PWhite
是均匀分布的随机数生成器。
(
Pbind(
\note, Prand([0, 2, 3, 5, 7, 9, 11], inf),
\dur, Prand([0.1, 0.2, 0.3, 0.4], inf),
\amp, 0.2,
\legato, 0.5
).play;
)
(
Pbind(
\note, Pwhite(100, 500),
\dur, Prand([0.1, 0.2, 0.3, 0.4], inf),
\amp, 0.2,
\legato, 0.3
).trace.play;
)
如果Pwhite
后面括号中的数字不带小数点,那么随机产生的值都是整数;如果想产生浮点数,其中某个数字就必须是浮点数,比如Pwhite(0, 1.0)
。
有用的trick:在play
前面加上trace
,就可以在Post window中输出每次活动的值。
更多Pattern可以看example_2。在这里能看到更多Pattern相关的帮助。
更多的Pattern tricks
和弦:Pseq
中本来存的是单音的序列,把单音替换成列表,就可以表示一个和弦。
\strum
关键字表示琶音,后面的数字表示琶音之间的间隔。
用\degree
指定音高时,可以用\scale
指定调式。如果不特意指定调式,默认为大调Scale.major
。可以用Scale.directory;
查看所有可用的调式。
\ctranspose
可以进行转调,不可以和freq
同时使用。
速度:默认的速度是60 BPM。
(
Pbind(
\degree, Pseq([0, 0.1, 1, 2, 3, 4, 5, 6, 7]), // repeats=1 by default
\dur, 1
).play(TempoClock(120/60)); // 120 beats over 60 seconds: 120 BPM
)