第5讲 音频文件的处理
本讲目标
学习音频文件的操作方法,目标是能够用 micro:bit 的传感器来操控声音。
具体来说,涉及以下内容。
- 音频文件的播放・停止・循环播放
- 变调(Pitch Shift)・时间拉伸(Time Stretch)
- 淡入・淡出・交叉淡化
- 录音
音频文件的播放・停止・循环播放
在 Pd 中,可以使用 else/play.file~ 对象播放音频文件。可以读取 WAV、AIFF 等音频文件,并控制播放・停止・循环播放。
使用方法
- 创建
else/play.file~对象 - 把音频文件放在 与 Pd 补丁相同的目录 中
- 使用消息对象发送以下命令
基本命令
| 消息 | 动作 |
|---|---|
open 文件名 | 打开音频文件 |
start | 开始播放 |
stop | 停止播放 |
loop 1 | 启用循环播放 |
loop 0 | 禁用循环播放 |
注意
请务必把音频文件放在与 Pd 补丁相同的文件夹中。放在其他文件夹的话,会因为找不到文件而报错。
补丁示例

发送 start 消息就会开始播放,用 stop 停止。先发送 loop 1 再 start,音频就会反复播放。
变调・时间拉伸
使用 else/stretch.shift~ 对象,可以实时改变音频的音高(pitch)与速度(tempo)。
入口的说明
else/stretch.shift~ 有多个入口,分别控制不同的参数。
| 入口 | 参数 | 说明 |
|---|---|---|
| 第1入口 | 缓冲区大小 | 处理时使用的缓冲区大小 |
| 第2入口 | 音高 | 音高的改变量(单位:音分 cent) |
| 第3入口 | 速度 | 播放速度(百分比) |
音高的设定
音高以音分(cent)为单位指定。
- 0 : 原本的音高(不变)
- 1200 : 高 1 个八度
- -1200 : 低 1 个八度
- 700 : 高纯五度
音高的参考
100 音分 = 1 个半音。1200 音分 = 12 个半音 = 1 个八度。
速度的设定
速度以百分比指定。
- 100 : 原本的速度(不变)
- 200 : 2 倍速
- 50 : 一半的速度
补丁示例

淡入・淡出・交叉淡化
要平滑地切换多个音源,或让音量逐渐变化,可以使用淡化类的对象。
使用的对象
| 对象 | 功能 |
|---|---|
else/xselect~ | 从多个输入中选择一个输出 |
else/xfade~ | 把两个音源交叉淡化 |
else/xgate~ | 通过门的开闭让声音通过・停止 |
交叉淡化的原理
交叉淡化(crossfade)是一边逐渐降低某个音源的音量,一边逐渐提高另一个音源的音量,从而平滑切换声音的技法。
使用 else/xfade~,可以用 -1 到 1 的数值控制两个音源的混合比例。
- -1 : 只能听到输入 1
- 0 : 输入 1 与输入 2 以相同音量混合
- 1 : 只能听到输入 2
补丁示例(xfade~)
这是用滑块切换两个音源(drum.wav 与 drum2.wav)的例子。把滑块的数值设为 0〜1 并送到 else/xfade~ 的右入口,两个音源的混合程度就会变化。

切换多个音源(xselect~)
想切换 3 个以上的音源时,使用 else/xselect~。用参数指定 输入数 与 淡化时间(毫秒),并用整数(0〜输入数−1)选择想播放的音源。它会在指定的淡化时间内,从上一个音源平滑地切换到新的音源。
例:else/xselect~ 3 1000 … 以 1000 毫秒的交叉淡化切换 3 个输入
- 0 : 听到输入 1
- 1 : 听到输入 2
- 2 : 听到输入 3
else/xfade~ 用 0〜1 的连续值控制两个音源的混合比例,而 else/xselect~ 则是用整数切换「播放哪个音源」,这是两者的区别。
补丁示例(xselect~)
这是用整数(0・1・2)切换 3 个音源的例子。把单选按钮或数值送到 else/xselect~ 的右入口,音源就会以指定的淡化时间切换。

录音
在 Pd 中,也可以录制来自麦克风的输入并保存为文件。
使用的对象
| 对象 | 功能 |
|---|---|
adc~ | 接收来自音频输入(麦克风)的信号 |
else/rec.file~ | 把音频信号录制到文件 |
步骤
- 用
adc~获取来自麦克风的音频信号 - 连接到
else/rec.file~ - 用
open 文件名消息指定文件名 - 用
start消息开始录音 - 用
stop消息停止录音
文件的保存位置
录制的文件会保存在与 Pd 补丁相同的目录中。请注意,如果没有保存补丁,文件的保存位置就会不确定。
补丁示例

练习题
来做做以下的练习题吧。会用到之前学过的与 micro:bit 的联动。
练习1: 鼓循环的播放・停止
请制作一个补丁,使用 micro:bit 的 A 按钮与 B 按钮控制鼓循环的播放与停止。
提示
- 用
else/play.file~读取鼓循环音源 - 用 micro:bit 的 A 按钮(按钮数值变化时)发送
start消息 - 用 micro:bit 的 B 按钮发送
stop消息 - 事先设定
loop 1就会变成循环播放 - 使用
select对象,根据按钮的数值切换消息
练习2: 用倾斜改变速度
请给练习 1 的补丁追加一个功能:用 micro:bit 的倾斜(加速度传感器)改变播放速度。
提示
- 用
else/stretch.shift~控制播放速度 - 用
scale等把 micro:bit 倾斜的数值映射到速度的百分比值(例: 50〜200) - 先确认倾斜数值的范围,再转换到合适的范围
练习3: 用光线传感器做交叉淡化
请制作一个补丁,根据光线传感器的数值按如下方式切换音源。
| 光线传感器的数值 | 动作 |
|---|---|
| 70 以上 | 停止(不发声) |
| 30〜70 | 播放音源 1 |
| 小于 30 | 播放音源 2 |
提示
- 用
else/xfade~或else/xselect~实现交叉淡化 - 用
moses对象等对光线传感器的数值进行分支 - 根据数值的范围,映射到交叉淡化的参数(0〜1)
- 70 以上时,也可以用
else/xgate~等方法停止声音
练习4: 用光线传感器录音、用 A 按钮播放
请制作一个补丁,用光线传感器的数值控制录音的开始・停止,并用 A 按钮播放录制的声音。
提示
- 用
adc~与else/rec.file~做出录音功能 - 光线传感器的数值低于某一值时发送
start,高于某一值时发送stop - 用
else/play.file~播放录制的文件 - 按下 A 按钮时,依次发送
open 文件名与start - 录音与播放要使用相同的文件名