SuperCollider教程:使用Patterns进行音乐序列编排
什么是Patterns
在SuperCollider中,Patterns(模式)是一种强大的音乐序列编排工具,它提供了一种比常规Routine更简洁、更直观的方式来生成和控制音乐参数序列。Pattern本质上是一个数据流的工厂,它封装了你想要流式输出的数据,并根据Pattern类型决定数据如何被流式传输。
从Routine到Pattern
让我们先看一个使用Routine播放《Over the Rainbow》片段的例子:
r = Routine({
[60, 72, 71, 67, 69, 71, 72, 60, 69, 67].do({ |midi| midi.yield });
});
while { (m = r.next).notNil } { m.postln };
使用Pseq Pattern可以更简洁地表达相同的功能:
p = Pseq([60, 72, 71, 67, 69, 71, 72, 60, 69, 67], 1);
r = p.asStream;
while { (m = r.next).notNil } { m.postln };
Pseq会按顺序输出数组中的值,第二个参数指定重复次数。Pattern本身不可流式传输,但调用asStream方法后会创建一个Routine。
常用Pattern类型
SuperCollider提供了丰富的Pattern类库(超过120种),下面介绍几种最常用的:
列表处理Patterns
- Pseq: 按顺序返回列表值
- Pshuf: 随机打乱列表顺序
- Prand: 从列表中随机选择值
- Pxrand: 随机选择但不会连续两次选择相同值
- Pwrand: 按权重概率随机选择值
数值生成Patterns
- Pseries: 算术序列(如1,2,3,4,5)
- Pgeom: 几何序列(如1,2,4,8,16)
- Pwhite: 均匀分布随机数
- Pexprand: 指数分布随机数
过滤Patterns
- Pn: 重复整个Pattern指定次数
- Pdup: 重复Pattern中的每个值指定次数
Pattern组合与嵌套
Pattern可以嵌套使用,创建更复杂的行为。例如,生成一个范围逐渐增大的随机数序列:
p = Pwhite(0.0, Pseries(0.01, 0.01, inf), 100).asStream;
p.all.plot;
或者使用Pn重复一个Pshuf,确保所有数字都出现后才重新排序:
p = Pn(Pshuf([1, 2, 3, 4, 5], 1), inf).asStream;
p.nextN(15);
使用Pbind播放音符
Pbind是用于播放音符的强大Pattern,它将多个Pattern组合成一个事件流:
(
SynthDef(\smooth, { |out, freq = 440, sustain = 1, amp = 0.5|
var sig;
sig = SinOsc.ar(freq, 0, amp) * EnvGen.kr(Env.linen(0.05, sustain, 0.1), doneAction: Done.freeSelf);
Out.ar(out, sig ! 2)
}).add;
)
(
p = Pbind(
\instrument, \smooth,
\midinote, Pseq([60, 72, 71, 67, 69, 71, 72, 60, 69, 67], 1),
\dur, Pseq([2, 2, 1, 0.5, 0.5, 1, 1, 2, 2, 3], 1)
).play;
)
Pbind的工作原理:
- 生成包含音符描述信息的Event对象
- 从每个Pattern流中读取值并添加到Event
- 播放Event,默认行为是在服务器上创建新合成器
- 根据Event中的delta值等待下一事件
高级应用示例
下面是一个更复杂的例子,使用Pxrand随机选择不同的贝斯乐句:
(
SynthDef(\bass, { |out, freq = 440, gate = 1, amp = 0.5, slideTime = 0.17, ffreq = 1100,
width = 0.15, detune = 1.005, preamp = 4|
var sig, env;
env = Env.adsr(0.01, 0.3, 0.4, 0.1);
freq = Lag.kr(freq, slideTime);
sig = Mix(VarSaw.ar([freq, freq * detune], 0, width, preamp)).distort * amp
* EnvGen.kr(env, gate, doneAction: Done.freeSelf);
sig = LPF.ar(sig, ffreq);
Out.ar(out, sig ! 2)
}).add;
TempoClock.default.tempo = 132/60;
p = Pxrand([
Pbind(
\instrument, \bass,
\midinote, 36,
\dur, Pseq([0.75, 0.25, 0.25, 0.25, 0.5], 1),
\legato, Pseq([0.9, 0.3, 0.3, 0.3, 0.3], 1),
\amp, 0.5, \detune, 1.005
),
// 更多Pbind/Pmono模式...
], inf).play(quant: 1);
)
这个例子展示了如何将多个乐句模式组合成一个随机序列,quant参数确保所有模式在节拍上对齐。
学习建议
- 从简单的Pattern开始,逐步构建更复杂的序列
- 尝试将熟悉的旋律转换为Pbind表达式
- 实验不同的Pattern组合和嵌套方式
- 探索Pmono(用于单音合成器线)的使用
Pattern系统是SuperCollider音乐创作的核心,掌握它将大大提升你的音乐编程能力。开始时可能会觉得复杂,但随着实践,你会发现它提供了无与伦比的灵活性和表现力。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考