Skip to content

第3讲 Pure Data 基础 ​

学习 Pure Data(Pd)的基本操作,掌握生成与加工声音的方法。

本讲目标 ​

  • 掌握 Pd 的基本操作(对象的放置、连接)
  • 能够生成正弦波,并控制频率与音量
  • 理解包络、滤波器、延迟等声音处理
  • 通过练习题巩固所学内容

准备 ​

Pd 的安装 ​

请确认已按上一讲的步骤安装好 Pd。启动后能显示 Pd 控制台就 OK 了。

库的安装 ​

本课程要使用 cyclone 和 else 这两个外部库。请按以下步骤安装。

  1. 启动 Pd
  2. 从菜单中选择 帮助(Mac 的情况是 Tools)→ 查找 external(Find externals)
  3. 在搜索栏输入 cyclone 进行搜索
  4. 从搜索结果中选择 cyclone
  5. 点击 Install 按钮进行安装
  6. 同样地搜索并安装 else

使用 plugdata 的情况

本课程使用的 plugdata 已经预先内置了 cyclone 与 else,因此不需要上述安装操作。

安装后的重启(使用 Pure Data 的情况)

安装完库之后,请先退出 Pd 再重新启动。不重启的话有时库不会被加载。

Pd 的基本操作 ​

操作WindowsMac
放置对象Ctrl+1Cmd+1
放置消息Ctrl+2Cmd+2
放置数字框Ctrl+3Cmd+3
切换编辑模式Ctrl+ECmd+E
DSP 开/关Ctrl+/Cmd+/

编辑模式与运行模式

  • 编辑模式(光标为箭头): 可以放置・连接・移动对象
  • 运行模式(光标为手指): 可以操作滑块和数字框
  • 用 Ctrl+E(Cmd+E)切换

正弦波的生成 ​

声音的基础是 正弦波(sine wave)。让我们在 Pd 中生成正弦波吧。

使用的对象 ​

对象功能
osc~正弦波振荡器。生成指定频率的正弦波
output~Pd 标准的输出对象(带音量滑块)
else/out~else 库的输出对象(功能更丰富)

~(波浪号)的含义

对象名末尾带 ~ 的是处理 信号(音频信号) 的对象。不带 ~ 的则处理 值(数值或消息)。这个区别非常重要。

步骤 ​

  1. 新建一个补丁(Ctrl+N / Cmd+N)
  2. 用 Ctrl+1(Cmd+1)放置对象,输入 osc~ 440
  3. 同样地放置 output~(或 else/out~)
  4. 从 osc~ 的输出(下边)连线到 output~ 的输入(上边)
  5. 打开 DSP(Ctrl+/ / Cmd+/,或控制台的 DSP 复选框)
  6. 能听到 440 Hz 的正弦波就成功了

正弦波的生成

注意音量

打开 DSP 之前,先把电脑的扬声器音量调小。有时会突然发出很大的声音。使用耳机时请格外注意。


频率的控制 ​

学习实时改变正弦波频率(音高)的方法。

方法1: 用消息改变 ​

  1. 放置消息框(Ctrl+2 / Cmd+2)
  2. 在消息中输入 440
  3. 再做一个消息,输入 880
  4. 分别从各消息连接到 osc~ 的左入口(输入)
  5. 切换到运行模式,点击消息即可改变频率

方法2: 用数字框改变 ​

  1. 放置数字框(Ctrl+3 / Cmd+3)
  2. 连接到 osc~ 的左入口
  3. 在运行模式下拖动数字框,即可连续改变数值

方法3: 用滑块改变 ​

  1. 选择菜单 放置 → H 滑块(或 V 滑块)
  2. 把滑块连接到 osc~ 的左入口
  3. 设定滑块的范围:
    • 在编辑模式下 右键点击 滑块 → 选择 属性
    • 将 下限(lower) 设为 100,上限(upper) 设为 2000
  4. 在运行模式下移动滑块,频率就会在 100〜2000 Hz 的范围内变化

频率的控制


MIDI 音符编号与频率的转换 ​

在音乐中,一般使用 MIDI 音符编号 来指定音高。用 mtof 对象可以把 MIDI 音符编号转换为频率(Hz)。

MIDI 音符音名频率 (Hz)
60C4(中央 Do)261.6
69A4(La)440.0
72C5(高音 Do)523.3

步骤 ​

  1. 放置数字框
  2. 放置 mtof 对象
  3. 按数字框 → mtof → osc~ 的顺序连接
  4. 在数字框中输入 69 就会发出 440 Hz(La 音)

mtof

ftom

反过来,要把频率转换为 MIDI 音符编号,请使用 ftom。


音量的控制 ​

要控制音量,就把信号与数值 相乘。

使用的对象 ​

对象功能
*~信号的乘法。用于调整音量
toggle开/关开关(在 0 与 1 之间切换)

方法1: 用开关控制声音的开/关 ​

  1. 放置 toggle(放置 → Toggle)
  2. 放置 *~ 对象
  3. 按 osc~ 440 → *~ → output~ 连接
  4. 把 toggle 连接到 *~ 的右入口
  5. 点击开关即可开关声音

音量控制1

方法2: 用消息指定音量 ​

output~ 和 else/out~ 可以用消息控制音量。

level $1

把滑块或数字框的值代入 $1 就可以改变音量。

音量控制2


音量・数值的自动变化(包络) ​

要让声音听起来自然,让音量随时间变化的 包络(envelope) 非常重要。

line~ - 直线式的变化 ​

line~ 会在指定的时间内让数值直线式地变化。

  • 消息 1 1000: 用 1000 毫秒把数值变化到 1
  • 消息 0 500: 用 500 毫秒把数值变化到 0

vline~ - 更精确的变化 ​

vline~ 以比 line~ 更高精度的定时工作。

vline~ 的消息格式

在 vline~ 中,可以用逗号 , 把多段变化写在一条消息里。

1 10, 0 1000 500

这个例子的意思是「用 10ms 升到 1,从 500ms 之后开始用 1000ms 降到 0」。请注意逗号前后要加空格。

delay - 延迟执行 ​

delay 对象会在指定的毫秒数之后输出一个 bang。

delay 1000

1000 毫秒(1秒)后输出 bang。

包络发生器 ​

else 库中有便利的包络对象。

对象功能
else/asr~Attack-Sustain-Release 包络
else/adsr~Attack-Decay-Sustain-Release 包络
else/envgen~可以自由绘制曲线的包络发生器

else/envgen~ 可以用 -curve 选项改变曲线的形状。

包络1

包络2

包络3


四则运算 ​

这些是在 Pd 中进行数值计算的对象。

对象功能例
+加法+ 10 → 给输入加上 10
-减法- 5 → 从输入中减去 5
*乘法* 2 → 把输入变为 2 倍
/除法/ 3 → 把输入除以 3
expr书写数学式expr $f1 * 2 + 100

* 与 *~ 的区别

  • *(不带波浪号): 值(数值)的乘法
  • *~(带波浪号): 信号(音频信号)的乘法

值和信号是不同的东西。注意不要混淆。

使用 expr 可以用一个对象写出复杂的数学式。$f1 表示第 1 个输入(float)。

四则运算1

四则运算2


发送/接收 ​

补丁变复杂之后,连线会变多,变得难以辨认。使用 发送(s) 与 接收(r),就可以不连线地收发数据。

使用方法 ​

  1. 放置 s freq 对象(发送侧)
  2. 放置 r freq 对象(接收侧)
  3. 用相同的名称(本例中为 freq)对应起来

从数字框直接发送 ​

可以从数字框的属性中直接发送。

  1. 在编辑模式下 右键点击 数字框 → 选择 属性
  2. 在 「发送符号(Send symbol)」 中输入名称(例: freq)
  3. 这样一来,每当数字框的值变化,数值就会被送到 r freq

发送・接收

无线连接

使用发送/接收可以让补丁更容易整理。特别是在大型补丁中,请积极加以运用。


和弦的生成 ​

试着用多个 osc~ 来演奏和弦吧。

步骤 ​

  1. 放置 3 个 osc~(例: osc~ 261, osc~ 329, osc~ 392)
    • C4(Do)、E4(Mi)、G4(Sol)的和弦(C 大调)
  2. 用 +~ 混合 3 个声音
  3. 用 *~ 0.3 降低音量(因为 3 个音混合后会变大)
  4. 连接到 output~

和弦


加法合成 ​

加法合成 是把多个正弦波叠加起来制造复杂音色的技法。加入基频的 泛音(整数倍的频率),就能接近各种乐器的音色。

泛音列 ​

泛音频率(基频 = 440 Hz)
第1泛音(基音)440 Hz
第2泛音880 Hz
第3泛音1320 Hz
第4泛音1760 Hz

改变各泛音的 音量比,就能做出不同的音色。

加法合成


其他振荡器 ​

除了正弦波,也有生成其他波形的振荡器。

对象波形特征
osc~正弦波最基本的波形。柔和的声音
phasor~锯齿波明亮,含有丰富的泛音
noise~白噪声包含所有频率的随机信号
else/tri~三角波接近正弦波,但含有奇数泛音
else/square~方波中空的声音。奇数泛音较强

振荡器1

振荡器2

波形与音色的关系

音色的差异由 泛音的构成 决定。试着听比各种波形,亲身体会音色的不同吧。


延迟(Delay 效果) ​

延迟是让声音延后并重复的效果,可以营造出回声或混响那样的空间扩展感。

使用的对象 ​

对象功能
delwrite~写入延迟缓冲区
delread~从延迟缓冲区读出
cyclone/delay~简单的延迟
else/delay.m~else 库的延迟

基本使用方法 ​

  1. 放置 delwrite~ $0-delay 1000(创建 1000ms 的缓冲区)
  2. 放置 delread~ $0-delay 500(读出延后 500ms 的声音)
  3. 用 +~ 把原声与延迟声混合

$0-delay 的含义

$0 会被替换为每个补丁固有的编号。这样即使同时打开多个相同的补丁,缓冲区名称也不会冲突。$0-delay 的意思是「本补丁专用的、名为 delay 的缓冲区」。

延迟


信号与值的转换 ​

Pd 中有 信号(音频信号,粗线)与 值(数值或消息,细线)两种数据。有些场合需要在两者之间相互转换。

信号 → 值 ​

对象功能
snapshot~获取信号当前的值(与 metro 组合使用)
else/s2f~把信号转换为值(else 库)
else/numbox~显示信号数值的数字框

snapshot~ 要与 metro(节拍器)组合使用。metro 100 每 100ms 输出一个 bang,在该时刻获取信号的值。

值 → 信号 ​

对象功能
sig~把值转换为信号
else/f2s~把值转换为信号(else 库)

请打开 DSP

信号相关的对象在 DSP 未打开 时不会工作。如果数值不显示・不变化,请先确认 DSP 是否已打开。

信号与值1

信号与值2


滤波器 ​

滤波器是强调或削减特定频段的对象。

基本滤波器 ​

对象种类功能
lop~低通滤波器让 低于 指定频率的声音通过
hip~高通滤波器让 高于 指定频率的声音通过
bp~带通滤波器只让指定频率的 周边 通过

使用方法 ​

noise~ → lop~ 1000 → output~

这个例子只从噪声中取出 1000 Hz 以下的成分(会变成沉闷的声音)。

滤波器与 vline~ 的注意事项

lop~ 可以在右入口连接 vline~ 来平滑地改变截止频率,但是 hip~ 与 bp~ 无法在右入口直接连接 vline~。请改用 sig~ 把值转换为信号后再连接。

值与信号的连线区别

连接补丁时,请注意 细线(值)与 粗线(信号)的区别。信号对象之间用信号(粗线)连接。如果把值的对象与信号的对象混在一起,有时会无法按预期工作。

滤波器1

滤波器2

滤波器3


练习题 ​

来挑战以下的练习题吧。请组合到目前为止学过的对象来制作。

问题1: 输出 1000 Hz 的正弦波 ​

请制作一个从 output~ 输出 1000 Hz 正弦波的补丁。

提示

只需把 osc~ 1000 与 output~ 连接起来。

问题2: 用两个消息切换频率 ​

请制作两个消息框(500 与 1000),做出一个点击就能把 osc~ 的频率在 500 Hz 与 1000 Hz 之间切换的补丁。

提示

做两个消息框,分别连接到 osc~ 的左入口。

问题3: 用按钮只发声 1 秒 ​

请制作一个补丁:点击 bang(按钮)后,1000 Hz 的正弦波 只响 1 秒 就自动停止。

提示

用 vline~ 控制音量。按 bang → 消息 1 10, 0 10 990 → vline~ → *~ 这样连接。用 10ms 淡入,990ms 后用 10ms 淡出。

问题4: 淡入并在 1 秒后停止 ​

请制作一个补丁:点击 bang 后,音量从 0 逐渐上升(淡入),1 秒后声音停止。

提示

在 vline~ 的消息中写成 1 500, 0 10 1000 这样,就会用 500ms 淡入,并从 1000ms 后开始用 10ms 淡出。

问题5: 加入回声 ​

请在问题 3 的补丁上追加 delwrite~ 与 delread~,让它在 0.5 秒后产生回声(重复的声音)。

提示

用 delwrite~ $0-echo 1000 创建 1 秒的缓冲区,用 delread~ $0-echo 500 读出延后 500ms 的声音。把延迟声的音量用 *~ 0.5 减半后再与原声混合,就能得到自然的回声。

问题6:【进阶】广播提示音(叮咚当咚) ​

试着做出「叮咚当咚」那样的提示音吧。

提示

依次发出 4 个音。例如:

  • 叮: G5(784 Hz)
  • 咚: E5(659 Hz)
  • 当: C5(523 Hz)
  • 咚〜: G4(392 Hz,稍长)

用 delay 对象错开各个音的时刻,并给每个音用 vline~ 加上包络,就会有提示音的感觉了。最后一个音请拉长一些。