Skip to content

第3讲 Pure Data 基础

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

本讲目标

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

准备

Pd 的安装

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

库的安装

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

  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+ECmd+E)切换

正弦波的生成

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

使用的对象

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

~(波浪号)的含义

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

步骤

  1. 新建一个补丁(Ctrl+N / Cmd+N
  2. Ctrl+1Cmd+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. 按数字框 → mtofosc~ 的顺序连接
  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~ 1000output~ 连接起来。

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

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

提示

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

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

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

提示

vline~ 控制音量。按 bang → 消息 1 10, 0 10 990vline~*~ 这样连接。用 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~ 加上包络,就会有提示音的感觉了。最后一个音请拉长一些。