SuperCollider模式指南04:从单词到乐句的模式嵌套与组合
前言
在SuperCollider的实时音频编程中,模式(Pattern)系统是最强大的工具之一。本教程将深入探讨如何通过模式嵌套技术,将简单的音乐"单词"组合成复杂的"乐句",从而构建更丰富的音乐结构。
模式嵌套基础
单个模式就像音乐中的一个单词,而通过将多个模式组合嵌套,我们可以创造出完整的乐句甚至段落。SuperCollider中的列表模式(如Pseq、Prand等)不仅可以包含简单的数值,还可以包含其他模式,形成多层次的嵌套结构。
基本嵌套原理
当列表模式遇到其列表中的另一个模式时,内部模式会被嵌入到流中。这意味着内部模式会接管控制权,直到它耗尽所有返回值,然后控制权才返回给外部列表模式。这种机制类似于在函数中调用另一个函数。
// 示例:上升、上升、下降的音阶片段循环
(
TempoClock.default.tempo = 1;
p = Pbind(
\degree, Pseq([
Pseries({ rrand(0, 7) }, 1, { rrand(4, 8) }), // 上升
Pseries({ rrand(0, 7) }, 1, { rrand(4, 8) }), // 上升
Pseries({ rrand(7, 14) }, -1, { rrand(4, 8) }) // 下降
], inf),
\dur, 0.125
).play;
)
乐句组合的高级技巧
1. 事件模式嵌套
列表模式不仅可以嵌套值模式,还可以嵌套完整的事件模式(如Pbind)。这使得我们可以将不同的音乐乐句组合在一起:
// 定义贝斯合成器
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.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)),
Pmono(\bass, \midinote, Pseq([36, 48, 36], 1), \dur, Pseq([0.25, 0.25, 0.5], 1)),
Pmono(\bass, \midinote, Pseq([36, 42, 41, 33], 1), \dur, Pseq([0.25, 0.25, 0.25, 0.75], 1))
], inf).play(quant: 1);
)
2. 快捷连接模式
类似于数组可以使用++连接,模式也支持这种简洁的连接方式:
pattern1 ++ pattern2 // 等同于 Pseq([pattern1, pattern2], 1)
乐句组织策略
1. 顺序与随机组合
- 顺序执行:使用Pseq或Pser
- 完全随机:Prand(可重复)、Pxrand(不重复)
- 加权随机:Pwrand(按概率选择)
- 预定义随机顺序:Pshuf(创建一次随机顺序并重复使用)
2. 有限状态机(Pfsm/Pdfsm)
有限状态机提供了一种更结构化的方式来组织乐句之间的过渡关系。它类似于音乐语法,定义了哪些乐句可以跟随当前乐句:
// 示例:使用Pfsm创建简单的乐句网络
(
p = Pfsm([
#[0], // 初始状态
Pbind(\degree, Pseq([0, 2, 4, 5]), \dur, 0.25), // 状态0
Pbind(\degree, Pseq([7, 5, 4, 2]), \dur, 0.25), // 状态1
nil, // 状态0只能转到1或2
#[1, 2], // 状态1可以转到1或2
#[0, 1] // 状态2可以转到0或1
], 0).play;
)
3. 模式库与Psym
对于更复杂的项目,使用Dictionary建立模式库,然后通过Psym调用它们,可以使代码更清晰:
// 创建乐句库
~phrases = (
repeated: Pbind(\midinote, 36, \dur, Pseq([0.75, 0.25, 0.25, 0.25, 0.5])),
octave: Pmono(\bass, \midinote, Pseq([36, 48, 36]), \dur, Pseq([0.25, 0.25, 0.5])),
tritone: Pmono(\bass, \midinote, Pseq([36, 42, 41, 33]), \dur, Pseq([0.25, 0.25, 0.25, 0.75]))
);
// 高级控制模式
p = Psym(Pxrand(#[repeated, octave, tritone], inf), ~phrases).play;
事件级模式切换
有时我们需要在每个事件上切换模式,而不是完整执行一个模式。这时可以使用Pswitch1、Psym1和Pnsym1:
// 每个音符随机选择高音区或低音区
(
p = Pbind(
\degree, Pswitch1([Pwhite(7, 14, inf), Pwhite(-7, 0, inf)], Pfunc { 0.7.coin.binaryValue }),
\dur, 0.25
).play;
)
条件模式(Pif)
对于简单的二元选择,Pif提供了更直观的语法:
// 70%概率选择低音区,30%选择高音区
(
p = Pbind(
\degree, Pif(Pwhite(0.0, 1.0, inf) < 0.7, Pwhite(-7, 0, inf), Pwhite(7, 14, inf)),
\dur, 0.25
).play;
)
结语
通过模式嵌套和组合技术,SuperCollider用户可以构建从简单旋律到复杂音乐结构的各种声音作品。掌握这些技巧将大大提升你的实时音乐编程能力,使代码更具表现力和音乐性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考