Skip to content

第5讲 音频文件的处理

本讲目标

学习音频文件的操作方法,目标是能够用 micro:bit 的传感器来操控声音。

具体来说,涉及以下内容。

  • 音频文件的播放・停止・循环播放
  • 变调(Pitch Shift)・时间拉伸(Time Stretch)
  • 淡入・淡出・交叉淡化
  • 录音

音频文件的播放・停止・循环播放

在 Pd 中,可以使用 else/play.file~ 对象播放音频文件。可以读取 WAV、AIFF 等音频文件,并控制播放・停止・循环播放。

使用方法

  1. 创建 else/play.file~ 对象
  2. 把音频文件放在 与 Pd 补丁相同的目录
  3. 使用消息对象发送以下命令

基本命令

消息动作
open 文件名打开音频文件
start开始播放
stop停止播放
loop 1启用循环播放
loop 0禁用循环播放

注意

请务必把音频文件放在与 Pd 补丁相同的文件夹中。放在其他文件夹的话,会因为找不到文件而报错。

补丁示例

音频播放

发送 start 消息就会开始播放,用 stop 停止。先发送 loop 1start,音频就会反复播放。


变调・时间拉伸

使用 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.wavdrum2.wav)的例子。把滑块的数值设为 0〜1 并送到 else/xfade~ 的右入口,两个音源的混合程度就会变化。

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~ 的右入口,音源就会以指定的淡化时间切换。

xselect~


录音

在 Pd 中,也可以录制来自麦克风的输入并保存为文件。

使用的对象

对象功能
adc~接收来自音频输入(麦克风)的信号
else/rec.file~把音频信号录制到文件

步骤

  1. adc~ 获取来自麦克风的音频信号
  2. 连接到 else/rec.file~
  3. open 文件名 消息指定文件名
  4. start 消息开始录音
  5. 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
  • 录音与播放要使用相同的文件名