SuperCollider模式指南04:从单词到乐句的模式嵌套与组合

SuperCollider模式指南04:从单词到乐句的模式嵌套与组合

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

前言

在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用户可以构建从简单旋律到复杂音乐结构的各种声音作品。掌握这些技巧将大大提升你的实时音乐编程能力,使代码更具表现力和音乐性。

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
发出的红包

打赏作者

贡沫苏Truman

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

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

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

打赏作者

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

抵扣说明:

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

余额充值