sonic_pi_tutorial

第 14 章:与 DAW / 插件 / 外设联动——把 Sonic Pi 放进你的制作流水线

14.1 总体架构:Sonic Pi 在哪里?

在这一章,我们需要重塑对 Sonic Pi 的认知。它不再只是一个“发声软件”,它可以是一个音序器 (Sequencer)信号发生器

我们可以构建三种不同深度的联动系统:

模式 A:音频源模式 (The Audio Source)

Sonic Pi 负责合成独特的声音(如算法生成的琶音、FM 噪音),将音频信号实时录入 DAW。

模式 B:指挥家模式 (The MIDI Conductor)

Sonic Pi 完全不发声。它只负责发送 MIDI 音符和 CC 控制信息,驱动 DAW 里的庞大音源库(如 Spitfire Audio, Kontakt)。

模式 C:回环采样模式 (The Glitch Looper)

DAW 录制好人声/乐器 -> 导出音频给 Sonic Pi -> Sonic Pi 进行粒子化/片处理 -> 再录回 DAW。

[ 你的大脑 / 算法逻辑 ]
        |
   (Sonic Pi)
   /    |    \
  /     |     \  <-- OSC (远程控制效果器参数)
 |      |      \
(A)    (B)     (C)
音频流  MIDI流  文件加载
 |      |       |
 v      v       v
+-----------------------+
|          DAW          |
| (Logic/Ableton/Reaper)|
|                       |
| [轨道1] 录制 Sonic Pi 音频
| [轨道2] 挂载 Kontakt (接收 MIDI)
| [轨道3] 人声干声 (导出给 SP)
+-----------------------+
        |
     [最终混音]

14.2 音频路由:如何把声音“无损”内录到 DAW

要将 Sonic Pi 的声音传输到 DAW,你不能用“外录”(麦克风对着扬声器)。你需要虚拟声卡

1. 工具准备 (Rule of Thumb)

2. 设置流程(以 macOS + BlackHole 为例)

Windows 用户的逻辑完全相同,只是设备名称不同。

第一步:系统与 Sonic Pi 设置

  1. 安装 BlackHole。
  2. 打开 Audio MIDI Setup (macOS 系统工具),创建一个 多输出设备 (Multi-Output Device)
    • 勾选 BlackHole 2ch
    • 勾选 你的耳机/扬声器
    • 解释:这一步是为了让你在录音时,耳机也能听到声音。如果只选 BlackHole,你会听不见。
  3. 打开 Sonic Pi -> Prefs -> Audio
  4. 在 Output 处,选择 BlackHole (如果你不想同时监听) 或刚才创建的 多输出设备

第二步:DAW 设置

  1. 打开 DAW (Ableton/Logic/Reaper)。
  2. 设置 Audio Input Device 为 BlackHole 2ch
  3. 新建一条 Audio Track。
  4. 关键步骤:开启该轨道的 Input Monitoring (监听)(通常是一个 I 或喇叭图标)。
    • 只有开了这个,声音信号才会进入 DAW 的混音台并被电平表显示出来。

3. 分轨录制策略 (Stem Recording)

做电影配乐或古风编曲,严禁只录一条立体声总线。你需要分轨(Stems)。 由于 Sonic Pi 的代码是确定性的(Deterministic),我们可以分多次“过带”。

推荐代码结构:使用变量控制开关

# --- 混音台开关 ---
opt_drums = 1   # 1=开, 0=关
opt_bass  = 0
opt_lead  = 0

# --- 鼓组 ---
live_loop :drums do
  if opt_drums == 1
    sample :bd_haus, amp: 2
    sleep 0.5
    sample :sn_dolf, amp: 1
    sleep 0.5
  else
    sleep 1 # 即使不发声,也要保持时间流逝,确保同步!
  end
end

# --- 贝斯 ---
live_loop :bass do
  if opt_bass == 1
    use_synth :fm
    play :c2, release: 0.8
  end
  sleep 1
end

操作流程

  1. opt_drums = 1, 其他为 0。点击 Run。在 DAW 录制轨道 1。
  2. opt_bass = 1, 其他为 0。点击 Run。在 DAW 录制轨道 2。
  3. …以此类推。 这样你就得到了完美对齐、互不干扰的分轨文件,方便后续在 DAW 里给贝斯加侧链压缩(Sidechain),给主音加混响。

14.3 MIDI 输出:驱动 Hans Zimmer 式的“大”音源

这是让 Sonic Pi 作品身价倍增的核心技术。

1. 基础连接

  1. 建立通道
    • Mac: 启用 IAC Driver (在 Audio MIDI Setup 中)。
    • Win: 使用 loopMIDI 创建一个虚拟端口。
  2. DAW 接收
    • 在 DAW 新建“软件乐器轨道” (Software Instrument)。
    • 加载 Kontakt / Spitfire Strings / Keyscape 等音源。
    • 设置该轨道的 MIDI From 为 IAC Driver (或 loopMIDI),通道设为 Ch 1

2. 编写“会呼吸”的弦乐 (Dynamics & Expression)

真实的管弦乐不是仅仅触发音符(Note On),更重要的是表情控制

代码示例:从静谧到宏大的推镜感

use_midi_defaults port: "iac_driver_bus_1", channel: 1

# 1. 触发长音 (Pad)
live_loop :strings_trigger do
  # 触发一个 C 小调和弦,持续 8 拍
  # 注意:sustain 稍微短一点点,避免重叠造成 MIDI 阻塞
  midi_chord chord(:c3, :minor), sustain: 7.8
  sleep 8
end

# 2. 自动化表情曲线 (Automation)
live_loop :strings_dynamics do
  # 使用 line 构造一个平滑的起伏:
  # 4拍从弱(20)到强(100),再4拍回落(20)
  
  # 上行
  (line 20, 100, steps: 32).each do |val|
    midi_cc 1, val       # 发送 CC #1
    midi_cc 11, val * 0.9 # 同时发送 CC #11 辅助
    sleep 0.125          # 8拍 / 64步 = 0.125
  end
  
  # 下行 (反转数组)
  (line 20, 100, steps: 32).reverse.each do |val|
    midi_cc 1, val
    midi_cc 11, val * 0.9
    sleep 0.125
  end
end

听感:这不再是死板的电子琴,而是仿佛指挥棒挥动下,弦乐群整齐划一的渐强渐弱。

3. 切换技法 (Keyswitching)

高级音源通常用低音区的键(如 C-1, C#-1)来切换技法(长音、顿音、颤音)。 在 Sonic Pi 里,可以在乐句开始前先发送这个“切换指令”。

define :set_articulation do |type|
  # 假设 Kontakt 库设定:C-2=Legato, C#-2=Spiccato
  case type
  when :legato
    midi :c-2, velocity: 127
  when :spiccato
    midi :cs-2, velocity: 127
  end
  sleep 0.1 # 给一点时间让音源切换
end

live_loop :action_music do
  set_articulation :spiccato
  # 开始演奏快速顿音...
  4.times do
    midi :c3, sustain: 0.1
    sleep 0.25
  end
end

当两个软件同时跑,必须解决“谁听谁的”以及“时间差”问题。

这是目前的工业标准。只要在同一个局域网下:

  1. Sonic Pi 底部点击 Link
  2. DAW (Ableton/Logic/Bitwig) 顶部点击 Link
  3. 效果
    • 速度同步:改 DAW 的 BPM,Sonic Pi 自动变。
    • 相位对齐:Sonic Pi 的 live_loop 会自动吸附到 DAW 的小节线上。

2. 延迟补偿 (Latency Compensation)

即便有了 Link,音频传输仍有延迟。你会发现 Sonic Pi 的鼓声录进 DAW 后,比网格慢了 20-50 毫秒。

3. “打板”对齐法 (Clap Sync) - 穷人的同步

如果你无法使用 Link(比如 DAW 版本太老),使用电影拍板原理:

  1. 在 Sonic Pi 代码最开头写一个极短的高频音。
  2. 同时录制。
  3. 在 DAW 里找到这个波形的尖峰,将其对齐到 Bar 1 Beat 1。
# Sync Clapper
play :c8, release: 0.05, amp: 2
sleep 4 # 留出 4 拍空白,让大家准备好
# ... 音乐开始

14.5 OSC 通信:让 Sonic Pi 控制 DAW 的效果器

除了音符,Sonic Pi 还可以通过 OSC (Open Sound Control) 协议控制 DAW 里的旋钮。 场景:当古风乐曲进入“高潮段落”时,自动打开 DAW 里的“大混响”效果器。

这使得 Sonic Pi 变成了 DAW 的自动化曲线生成器


14.6 戏腔与人声处理工作流 (Vocal Workflow)

结合本书的“古风/戏腔”目标,推荐以下流水线:

Phase 1: 伴奏制作

  1. 在 Sonic Pi 中编写好和声、旋律、鼓组。
  2. 通过 14.2 的方法,分轨录入 DAW。
  3. 在 DAW 中初步的 Balance(平衡音量),给留给一席之地。

Phase 2: 人声录制与修整

  1. 在 DAW 中对着 Sonic Pi 的伴奏录制人声。
  2. 修音 (Tuning):戏腔的“转音”和“滑音”非常微妙,自动修音(AutoTune)可能会把它拉直。建议使用 Melodyne 手动修音,保留转音的曲线,只把长音的音准修平。
  3. 共振峰 (Formant):如果戏腔不够“尖/亮”,可以用插件(如 SoundToys Little AlterBoy)提升 Formant 值(+1 ~ +2),这比单纯提 EQ 更自然,更有“旦角”味。

Phase 3: 回炉重造 (Re-Synthesis) —— 高级技巧

将处理好的一句干声(例如“啊~~”)导出为 WAV。 放回 Sonic Pi,使用 Granular 采样器制作“人声垫底”:

# 加载 DAW 处理过的完美人声
sample_path = "/Users/me/Music/vocals/opera_ah_clean.wav"

live_loop :vocal_pad do
  # 随机抓取人声的一小段(0.1秒),密集播放
  # 制造出一种空灵、静止但有纹理 Pad 音色
  sample sample_path, start: rrand(0.2, 0.5), finish: rrand(0.5, 0.8),
         rate: 1, attack: 0.1, release: 0.2, amp: 0.5, pan: rrand(-0.5, 0.5)
  sleep 0.1
end

这种“DAW 修整 -> Sonic Pi 粒子化”的循环,是制作现代电子古风的关键秘籍。


14.7 本章小结

  1. 思维转换:Sonic Pi 不仅是乐器,更是指挥家。用它来控制 Kontakt 等巨型音源库。
  2. 音质门槛:要达到久石让或 Zimmer 的质感,请将 MIDI 发送给专业的弦乐/钢琴插件,并使用 CC1/CC11 画出动态。
  3. 连接方式:音频走虚拟声卡 (BlackHole/VB-Cable),控制走虚拟 MIDI (IAC/loopMIDI),同步走 Ableton Link。
  4. 人声闭环:伴奏出 SP -> 进 DAW 录人声 -> 人声修好 -> 回 SP 做粒子化 -> 再回 DAW 混音。这是一个螺旋上升的过程。
  5. 分轨 (Stems):养成良好习惯,永远分轨导出,不要试图在一个立体声文件里解决所有混音问题。

14.8 练题

基础题 (50%)

  1. 连线测试:配置虚拟声卡,写一段简单的 play :c4 代码,成功将其录制到 DAW 的音轨上,并看到波形。
  2. MIDI 握手:在 DAW 加载一个钢琴音源。用 Sonic Pi 写一个无限循环的 C 大调琶音,让 DAW 发声。
  3. 同步练习:开启 Ableton Link。将 DAW 速度设为 120,观察 Sonic Pi 是否跟随。在 Sonic Pi 里改速度为 90,观察 DAW 是否跟随。

挑战题 (50%)

  1. Zimmer 的呼吸 (CC 控制)
    • 在 DAW 加载弦乐合奏 (Sustain)。
    • 编写 Sonic Pi 代码,使其按住一个和弦长达 8 小节。
    • 任务:使用 control_changemidi_cc,让弦乐的力度(CC1)呈现“波浪式”起伏(强-弱-强-弱),模拟海浪般的管弦乐效果。
  2. 故障戏腔 (Glitch Opera)
    • 找一段 2-3 秒的戏腔/人声采样。
    • 任务:编写代码,将其切成 8 等份。在一个 8 拍的循环中,随机播放这切片,并随机改变播放速率(rate -1 到 1),创造出一种破碎的、梦幻的古风电子背景。

参考答案

点击展开:练习 4 (Zimmer CC) 代码 ```ruby use_midi_defaults port: "iac_driver_bus_1", channel: 1 live_loop :zimmer_strings do # 1. 发送和弦,持续 16 拍 midi_chord [:c2, :g2, :c3, :eb3, :g3], sustain: 16 # 2. 制造起伏 (Swells) # 使用 time_warp 确保 CC 控制不影响主循环的时间逻辑 time_warp 0 do # 两个 8 拍的起伏 2.times do # 渐强 (4拍) (line 30, 110, steps: 32).each do |v| midi_cc 1, v sleep 0.125 end # 渐弱 (4拍) (line 110, 30, steps: 32).each do |v| midi_cc 1, v sleep 0.125 end end end sleep 16 end ```
点击展开:练习 5 (Glitch Opera) 代码 ```ruby # 假设采样名为 :opera_voice live_loop :glitch_opera do # 将采样分成 8 份 num_slices = 8 slice_size = 1.0 / num_slices # 随机选一个切片索引 slice_idx = rand_i(num_slices) # 计算起点和终点 s_start = slice_idx * slice_size s_finish = s_start + slice_size # 播放:随机反转(rate负数),加点混响 with_fx :reverb, room: 0.8 do sample :opera_voice, start: s_start, finish: s_finish, rate: choose([1, -1, 0.5]), amp: 1.5, attack: 0.05, release: 0.05 end # 按照切片的长度休眠 (假设原采样长度已知,或者用 sample_duration) sleep sample_duration(:opera_voice) / num_slices end ```

14.9 常见陷阱与错误 (Gotchas)

1. 死亡啸叫 (Audio Feedback Loop)

2. MIDI 只有第一声响 (Note Off Blocking)

3. CPU 爆红

4. 采样率错乱 (Pitch Shift)