学习SuperCollider纯属图一乐。关于SuperCollider的中文资料较少,在这里稍微记录一下学习过程,内容基于A Gentle Introduction to SuperCollider

1. Basics

SuperCollider由两部分组成:server (叫做scsynth) 和language/client/interpreter (叫做sclang)。server是一个声音引擎,负责产生声音。我们在language中写代码、执行命令,控制声音的产生。

Start up

一些快捷键:

  • Ctrl + n 新建文件
  • Ctrl + b 开启server
  • Ctrl + + 放大字体
  • 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

PbindPseries中的大写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还能用浮点数表示微分音。

Alt text

其他关键字:\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
)

其他参考资料

代码资源

论坛

Scoring Sound

Computer Music

C/C++用法补漏 «
Prev «
» Generative Models
» Next