在前几章中,我们使用振荡器(Synth)从零开始构建声音。这很像用数学公式画画,线条干净、纯粹,但往往缺乏“尘土味”和“现实感”。
对于本书设定的目标风格,采样(Sampling) 是不可或缺的灵魂:
本章的目标不是让你仅仅“播放”一个 MP3 文件,而是学会像捏橡皮泥一样改变采样的时间、音高、质感和颗粒,将其变成你代码中的一部分。
在 Sonic Pi 中使用 sample 命令时,请彻底抛弃“媒体播放器”的概念,想象你面前有一台可物理变速的磁带机。
这是与现代 DAW(数字音频工作站)最不同的地方,也是声音设计的物理基础。 在 Sonic Pi 的默认采样引擎中: \(\text{播放时长} = \frac{\text{原始时长}}{|\text{rate}|}\)
rate: 2) $\rightarrow$ 音高升高八度 $\rightarrow$ 时间缩短一半。rate: 0.5) $\rightarrow$ 音高降低八度 $\rightarrow$ 时间延长一倍。rate: -1) $\rightarrow$ 音高不变,时间倒流。Rule of Thumb(风格化建议):
- Zimmer 式恐怖氛围:将普通的“金属敲击”或“小提琴拨奏”采样,设置
rate: 0.125(慢 8 倍,低 3 个八度)。你会听到原本听不见的高频瞬态变成了深沉、隆隆作响的巨大怪兽脚步声。- 古风空灵感:将钢琴或风铃采样设为
rate: -1(倒放)。倒放的声音没有明显的“敲击头(Attack)”,只有慢慢涌现的音量,非常适合做 Pad(铺底)。
即使是录好的音频,也可以被“雕刻”。sample 命令同样支持 ADSR(Attack, Decay, Sustain, Release)包络。
原始采样波形: |########################| (长达 10 秒)
↓ 设置 release: 0.1
实际听感: |#| (变成了短促的 0.1 秒打击声)
这允许你把长段的古琴独奏采样,修剪成极短的、带有木质感的打击乐颗粒。
beat_stretch 的魔法痛点:你下载了一个 100 BPM 的“史诗战鼓”循环,但你的项目速度是 use_bpm 120。如果直接播放,鼓点会和你的代码虽然对不上拍,导致“跑马”。
解决方案:beat_stretch。
这个参数告诉 Sonic Pi:“不管这个音频原本多长(几秒或几毫秒),请通过改变播放速度,强行把它拉伸/压缩到 X 拍的长度。”
[你的代码节拍] : | 1 beat | 1 beat | 1 beat | 1 beat |
[原始音频采样] : |----- 1.3 秒 (不尴不尬的长度) ------|
↓ beat_stretch: 4
[处理后的采样] : |---------- 刚好填满 4 拍 -----------|
注意:
beat_stretch会导致音高变化(像磁带加速一样)。如果你需要保持音高不变但改变速度(Time Stretching without Pitch Shift),Sonic Pi 的基础sample命令做不到这一点(需要复杂的颗粒合成算法),但在打击乐上,音高的小幅变化通常可以接受。
这是人声处理和现代古风节奏的核心技巧。Sonic Pi 提供了两种强大的切片方式。
num_slices)适用于节奏规整的素材(如鼓组 Loop)。 假设你有一个 4 拍的鼓组,你想把它打散重组。
num_slices: 16:把采样平均切成 16 份。slice: 3:只播放第 4 份(索引从 0 开始)。应用场景:IDM / Glitch 风格节奏
在 Hans Zimmer 的动作场景配乐中,经常会有极高频的、破碎的电子节奏作为背景驱动。你可以把一个普通的鼓组切成 16 份,然后用 pick 随机选择切片播放,形成一种“高科技、不稳定”的律动。
onsets) —— 戏腔的救星适用于节奏自由、不规整的素材(如人声清唱、独奏乐器)。
戏腔通常是“散板”,没有固定的 BPM。如果你用均匀切片,可能会把一个字切成两半。
onset 算法会自动分析波形的能量峰值(即声音开始的地方),按“发音点”来切。
波形: [ 我... ] [ 身... ] [ 骑... ] [ 白... ] [ 马... ]
↑ onset:0 ↑ onset:1 ↑ onset:2
应用场景:Vocal Chops(人声切片乐器)
onset: pick 随机选取一个字。除了切分明显的段落,我们还可以进入微观界。 粒子合成是指播放采样中极其微小(比如 0.05 秒到 0.2 秒)的片段,并大量重复或叠加。这能把一段“具体的旋律”变成一团“抽象的材质”。
你需要控制两个核心参数:
start: 播放起点的百分比(0.0 到 1.0)。finish: 播放终点的百分比。公式: finish = start + 极小值
live_loop 中极快地(例如每 0.05 秒)触发采样。start 设为随机值,包络极短(attack/release 0.01),左右声道随机平移(pan)。start 固定在某个点(例如 0.5),finish 设为 0.505。在管弦乐配乐中,力度(Velocity) 不仅仅是音量大小,还意味着音色的改变。
如果你只有一个采样文件(One-shot),仅仅改变 amp(音量)是不够真实的。
在 Sonic Pi 中,我们可以用滤波器(LPF)来模拟这种物理特性。
\[\text{Cutoff Frequency} \propto \text{Amplitude}\]amp 调小,还要把 lpf(低通截止频率)调低,切掉高频。sample :drum_snare_hard, amp: 0.5, lpf: 80。当你开始大量使用外部采样时,代码很快会变乱。
路径管理:
建议在你的 Sonic Pi 脚本头部定义一个变量指向你的采样文件夹:
root = "/Users/YourName/Music/SonicPiProject/Samples/"
然后调用时:sample root, "gu_zheng_01"。
格式支持: Sonic Pi 完美支持 WAV (16/24 bit) 和 FLAC。尽量避免使用 MP3,因为 MP3 在做循环(looping)时首尾会有极短的静音,导致节奏对不齐。
单声道 vs 立体声:
rate 同时改变速度和音高。负数 rate 是倒放,是制作氛围的神器。beat_stretch 强行让 Loop 类采样适应你的 BPM,防止“跑马”。num_slices:适合切分机械节奏。onset:适合切分人声、独奏乐器等自然素材。lpf 随 amp 变化来模拟真实乐器的力度响应。练习 1:变速变调实验 找一个说话的人声采样(Sonic Pi 自带或你自己的)。
rate 参数的值(1, 2, 0.5, -1)。练习 2:强制对齐
找一个明显的鼓组 Loop(Sonic Pi 自带 loop_amen 或 loop_garzul)。
beat_stretch 参数。练习 3:简单的切片重组
使用 loop_amen。
live_loop 中,每隔 0.5 拍播放这个 Loop 的第 4 片(slice index 3)。挑战 1:手动制作“古风颗粒云”(Gufeng Drone) 选择一个具有长延音的吉他或古琴采样。编写一个循环,每隔 0.125 拍播放一次该采样。 要求:
挑战 2:人声切片乐器(Vocal Chops) 录制或选取一段长人声(最好是清唱)。 编写代码,通过随机数触发人声的不同瞬态(onset)。 要求:
num_slices,用 onset: pick。rate 使其产生和声效果(例如有的切片 rate: 1,有的 rate: 1.5 即纯五度)。start/finish 切割时),声音开头或结尾可能会有“咔”的一声。attack: 0.01 和 release: 0.01,即使原本不需要渐入渐出。这叫“去点击(De-clicking)”。\ 需写成双反斜杠 \\ 或单斜杠 /。beat_stretch 还是觉得不稳,听起来像是在拖拍。beat_stretch 假设你的采样文件被剪裁得非常完美(首尾正好是循环点)。如果你的采样文件开头有 0.2 秒的空白静音,beat_stretch 会把这段静音也算进 4 拍里,导致真正的鼓声滞后。