第3讲 Pure Data 基础
学习 Pure Data(Pd)的基本操作,掌握生成与加工声音的方法。
本讲目标
- 掌握 Pd 的基本操作(对象的放置、连接)
- 能够生成正弦波,并控制频率与音量
- 理解包络、滤波器、延迟等声音处理
- 通过练习题巩固所学内容
准备
Pd 的安装
请确认已按上一讲的步骤安装好 Pd。启动后能显示 Pd 控制台就 OK 了。
库的安装
本课程要使用 cyclone 和 else 这两个外部库。请按以下步骤安装。
- 启动 Pd
- 从菜单中选择 帮助(Mac 的情况是 Tools)→ 查找 external(Find externals)
- 在搜索栏输入
cyclone进行搜索 - 从搜索结果中选择 cyclone
- 点击 Install 按钮进行安装
- 同样地搜索并安装
else
使用 plugdata 的情况
本课程使用的 plugdata 已经预先内置了 cyclone 与 else,因此不需要上述安装操作。
安装后的重启(使用 Pure Data 的情况)
安装完库之后,请先退出 Pd 再重新启动。不重启的话有时库不会被加载。
Pd 的基本操作
| 操作 | Windows | Mac |
|---|---|---|
| 放置对象 | Ctrl+1 | Cmd+1 |
| 放置消息 | Ctrl+2 | Cmd+2 |
| 放置数字框 | Ctrl+3 | Cmd+3 |
| 切换编辑模式 | Ctrl+E | Cmd+E |
| DSP 开/关 | Ctrl+/ | Cmd+/ |
编辑模式与运行模式
- 编辑模式(光标为箭头): 可以放置・连接・移动对象
- 运行模式(光标为手指): 可以操作滑块和数字框
- 用
Ctrl+E(Cmd+E)切换
正弦波的生成
声音的基础是 正弦波(sine wave)。让我们在 Pd 中生成正弦波吧。
使用的对象
| 对象 | 功能 |
|---|---|
osc~ | 正弦波振荡器。生成指定频率的正弦波 |
output~ | Pd 标准的输出对象(带音量滑块) |
else/out~ | else 库的输出对象(功能更丰富) |
~(波浪号)的含义
对象名末尾带 ~ 的是处理 信号(音频信号) 的对象。不带 ~ 的则处理 值(数值或消息)。这个区别非常重要。
步骤
- 新建一个补丁(
Ctrl+N/Cmd+N) - 用
Ctrl+1(Cmd+1)放置对象,输入osc~ 440 - 同样地放置
output~(或else/out~) - 从
osc~的输出(下边)连线到output~的输入(上边) - 打开 DSP(
Ctrl+//Cmd+/,或控制台的 DSP 复选框) - 能听到 440 Hz 的正弦波就成功了

注意音量
打开 DSP 之前,先把电脑的扬声器音量调小。有时会突然发出很大的声音。使用耳机时请格外注意。
频率的控制
学习实时改变正弦波频率(音高)的方法。
方法1: 用消息改变
- 放置消息框(
Ctrl+2/Cmd+2) - 在消息中输入
440 - 再做一个消息,输入
880 - 分别从各消息连接到
osc~的左入口(输入) - 切换到运行模式,点击消息即可改变频率
方法2: 用数字框改变
- 放置数字框(
Ctrl+3/Cmd+3) - 连接到
osc~的左入口 - 在运行模式下拖动数字框,即可连续改变数值
方法3: 用滑块改变
- 选择菜单 放置 → H 滑块(或 V 滑块)
- 把滑块连接到
osc~的左入口 - 设定滑块的范围:
- 在编辑模式下 右键点击 滑块 → 选择 属性
- 将 下限(lower) 设为
100,上限(upper) 设为2000
- 在运行模式下移动滑块,频率就会在 100〜2000 Hz 的范围内变化

MIDI 音符编号与频率的转换
在音乐中,一般使用 MIDI 音符编号 来指定音高。用 mtof 对象可以把 MIDI 音符编号转换为频率(Hz)。
| MIDI 音符 | 音名 | 频率 (Hz) |
|---|---|---|
| 60 | C4(中央 Do) | 261.6 |
| 69 | A4(La) | 440.0 |
| 72 | C5(高音 Do) | 523.3 |
步骤
- 放置数字框
- 放置
mtof对象 - 按数字框 →
mtof→osc~的顺序连接 - 在数字框中输入
69就会发出 440 Hz(La 音)

ftom
反过来,要把频率转换为 MIDI 音符编号,请使用 ftom。
音量的控制
要控制音量,就把信号与数值 相乘。
使用的对象
| 对象 | 功能 |
|---|---|
*~ | 信号的乘法。用于调整音量 |
toggle | 开/关开关(在 0 与 1 之间切换) |
方法1: 用开关控制声音的开/关
- 放置
toggle(放置 → Toggle) - 放置
*~对象 - 按
osc~ 440→*~→output~连接 - 把
toggle连接到*~的右入口 - 点击开关即可开关声音

方法2: 用消息指定音量
output~ 和 else/out~ 可以用消息控制音量。
level $1把滑块或数字框的值代入 $1 就可以改变音量。

音量・数值的自动变化(包络)
要让声音听起来自然,让音量随时间变化的 包络(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 10001000 毫秒(1秒)后输出 bang。
包络发生器
else 库中有便利的包络对象。
| 对象 | 功能 |
|---|---|
else/asr~ | Attack-Sustain-Release 包络 |
else/adsr~ | Attack-Decay-Sustain-Release 包络 |
else/envgen~ | 可以自由绘制曲线的包络发生器 |
else/envgen~ 可以用 -curve 选项改变曲线的形状。



四则运算
这些是在 Pd 中进行数值计算的对象。
| 对象 | 功能 | 例 |
|---|---|---|
+ | 加法 | + 10 → 给输入加上 10 |
- | 减法 | - 5 → 从输入中减去 5 |
* | 乘法 | * 2 → 把输入变为 2 倍 |
/ | 除法 | / 3 → 把输入除以 3 |
expr | 书写数学式 | expr $f1 * 2 + 100 |
* 与 *~ 的区别
*(不带波浪号): 值(数值)的乘法*~(带波浪号): 信号(音频信号)的乘法
值和信号是不同的东西。注意不要混淆。
使用 expr 可以用一个对象写出复杂的数学式。$f1 表示第 1 个输入(float)。


发送/接收
补丁变复杂之后,连线会变多,变得难以辨认。使用 发送(s) 与 接收(r),就可以不连线地收发数据。
使用方法
- 放置
s freq对象(发送侧) - 放置
r freq对象(接收侧) - 用相同的名称(本例中为
freq)对应起来
从数字框直接发送
可以从数字框的属性中直接发送。
- 在编辑模式下 右键点击 数字框 → 选择 属性
- 在 「发送符号(Send symbol)」 中输入名称(例:
freq) - 这样一来,每当数字框的值变化,数值就会被送到
r freq

无线连接
使用发送/接收可以让补丁更容易整理。特别是在大型补丁中,请积极加以运用。
和弦的生成
试着用多个 osc~ 来演奏和弦吧。
步骤
- 放置 3 个
osc~(例:osc~ 261,osc~ 329,osc~ 392)- C4(Do)、E4(Mi)、G4(Sol)的和弦(C 大调)
- 用
+~混合 3 个声音 - 用
*~ 0.3降低音量(因为 3 个音混合后会变大) - 连接到
output~

加法合成
加法合成 是把多个正弦波叠加起来制造复杂音色的技法。加入基频的 泛音(整数倍的频率),就能接近各种乐器的音色。
泛音列
| 泛音 | 频率(基频 = 440 Hz) |
|---|---|
| 第1泛音(基音) | 440 Hz |
| 第2泛音 | 880 Hz |
| 第3泛音 | 1320 Hz |
| 第4泛音 | 1760 Hz |
改变各泛音的 音量比,就能做出不同的音色。

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


波形与音色的关系
音色的差异由 泛音的构成 决定。试着听比各种波形,亲身体会音色的不同吧。
延迟(Delay 效果)
延迟是让声音延后并重复的效果,可以营造出回声或混响那样的空间扩展感。
使用的对象
| 对象 | 功能 |
|---|---|
delwrite~ | 写入延迟缓冲区 |
delread~ | 从延迟缓冲区读出 |
cyclone/delay~ | 简单的延迟 |
else/delay.m~ | else 库的延迟 |
基本使用方法
- 放置
delwrite~ $0-delay 1000(创建 1000ms 的缓冲区) - 放置
delread~ $0-delay 500(读出延后 500ms 的声音) - 用
+~把原声与延迟声混合
$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 是否已打开。


滤波器
滤波器是强调或削减特定频段的对象。
基本滤波器
| 对象 | 种类 | 功能 |
|---|---|---|
lop~ | 低通滤波器 | 让 低于 指定频率的声音通过 |
hip~ | 高通滤波器 | 让 高于 指定频率的声音通过 |
bp~ | 带通滤波器 | 只让指定频率的 周边 通过 |
使用方法
noise~ → lop~ 1000 → output~这个例子只从噪声中取出 1000 Hz 以下的成分(会变成沉闷的声音)。
滤波器与 vline~ 的注意事项
lop~ 可以在右入口连接 vline~ 来平滑地改变截止频率,但是 hip~ 与 bp~ 无法在右入口直接连接 vline~。请改用 sig~ 把值转换为信号后再连接。
值与信号的连线区别
连接补丁时,请注意 细线(值)与 粗线(信号)的区别。信号对象之间用信号(粗线)连接。如果把值的对象与信号的对象混在一起,有时会无法按预期工作。



练习题
来挑战以下的练习题吧。请组合到目前为止学过的对象来制作。
问题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~ 加上包络,就会有提示音的感觉了。最后一个音请拉长一些。