SuperCollider教程:使用Patterns进行音乐序列编排

SuperCollider教程:使用Patterns进行音乐序列编排

supercollider An audio server, programming language, and IDE for sound synthesis and algorithmic composition. supercollider 项目地址: https://gitcode.com/gh_mirrors/su/supercollider

什么是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的工作原理:

  1. 生成包含音符描述信息的Event对象
  2. 从每个Pattern流中读取值并添加到Event
  3. 播放Event,默认行为是在服务器上创建新合成器
  4. 根据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参数确保所有模式在节拍上对齐。

学习建议

  1. 从简单的Pattern开始,逐步构建更复杂的序列
  2. 尝试将熟悉的旋律转换为Pbind表达式
  3. 实验不同的Pattern组合和嵌套方式
  4. 探索Pmono(用于单音合成器线)的使用

Pattern系统是SuperCollider音乐创作的核心,掌握它将大大提升你的音乐编程能力。开始时可能会觉得复杂,但随着实践,你会发现它提供了无与伦比的灵活性和表现力。

supercollider An audio server, programming language, and IDE for sound synthesis and algorithmic composition. supercollider 项目地址: https://gitcode.com/gh_mirrors/su/supercollider

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何蒙莉Livia

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值