1.6. 如何让计算机发出声音¶
现在你已经知道BlueFi能够产生绚丽的光效,BlueFi能产生声音吗?当然可以,本节我们来认识BlueFi的音频输出设备——喇叭及其周边的用法, 使用这些设备可以产生基本音调、播放音乐文件。
BlueFi的喇叭在B按钮的反面,出声孔正好对准板子的右边缘,用手握住BlueFi板时,请勿堵住出声孔!
1.6.1. 自制钢琴¶
我们可以借助于BlueFi的三个触摸盘模拟一个钢琴,虽然仅有三个琴键。示例程序如下:
将本示例程序保存到/CIRCUITPY/code.py文件,BlueFi将立即执行该程序。用你的右手大拇指和食指夹住BlueFi的Gnd信号盘,左右的食指 去触摸或按压触摸盘P0、P1和P2,你将有“弹钢琴”的感觉,只不过此时每次声音持续的时间比较长,你可以修改后面持续时间的数值来改变音 调持续时间。如何才能实现更多的钢琴琴键呢?
示例代码分析:
- 第1行,初始化程序,相当与程序下载进Bluefi之后告知Bluefi从此开始执行程序
- 第2行,设置音量为0.8,合理取值范围:0.0(音量最小)~1.0(音量最大)
- 第3行,开始一个无穷循环的程序块
- 第4行(无穷循环程序块的第1行),判断触摸盘P0是否被触摸
- 第5行(无穷循环程序块的第2行),如果触摸盘P0被触摸则开始播放频率为1047Hz的音调,时间持续1秒
- 第6行(无穷循环程序块的第3行),否则,判断触摸盘P1是否被触摸
- 第7行(无穷循环程序块的第4行),如果触摸盘P1被触摸则开始播放频率为1175Hz的音调,时间持续1秒
- 第8行(无穷循环程序块的第5行),否则,判断触摸盘P2是否被触摸
- 第9行(无穷循环程序块的第6行),如果触摸盘P2被触摸则开始播放频率为1319Hz的音调,时间持续1秒
本示例程序的无穷循环程序块内包含一个逻辑嵌套的程序结构:如果。。。否则如果。。。否则如果。。。,这种嵌套逻辑的程序流程不难 理解,逻辑上能够执行否则如果这个语句时表面前一个测试条件为假,判断当前这一行的否则如果后面条件是否为真,如果为真则执行本程 序块,否则就继续测试下一个条件。
结合本示例,或许能帮助你理解这种结构的条件嵌套。我们首先判断P0是否被触摸,如果被触摸则播放1047Hz音调并忽略后续的条件判断和否则如果的情况;如果P0未被 触摸则跳到第2个否则如果语句,即判断P1是否被触摸,如果被触摸则播放1175Hz音调并忽略后续的条件判断和否则如果的情况;如果P1未被触摸则跳到第2个否则如果语句, 即判断P2是否被触摸,如果被触摸则播放1319Hz音调;如果P2也未被触摸(即三个触摸盘都未被触摸),则不播放音调。
触摸P0/P1/P2时我们播放不同频率的声音输出,你的耳朵肯定也完全能分辨出三种不同的音调。的确,忽略声音的高低,声音不同就是频率不同。 无论是钢琴或是其他弦乐器,不同弦的粗细不同,发出的声音频率不同,我们的耳朵能根据声音频率分辨音调。
1.6.2. 自制旋律¶
使用频率-音调的对照关系,我们只需要让BlueFi喇叭输出不同频率的声音就是产生不同音调,每个音调持续的节拍数不同、暂停时间不同,我们就能用编程 的方式产生不同的旋律。当你用百度查找“频率-音调”的对照关系时,你会发现那些数字很难直接使用。这一节我们使用midi号和节拍来设计旋律。先用下面这个 示例来了解midi号和节拍的用法:
本示例的逻辑没有逻辑嵌套,仅仅是判断P0/P1/P2触摸盘被触摸时就分别播放第84/86/88号midi音调,并持续1/2拍。我们这里不必逐行说明每个语句的执行 效果。请你先在BlueFi上执行本示例程序,并尝试改变节拍数:1代表1拍,2代表1/2拍,依次类推8代表1/8拍。如果你需要改变节拍的时长,修改本示例的第 6行语句中spk的bpm属性值,120bpm相当于每拍时长为0.5秒:1分钟(60秒)120拍–>0.5s/bea。增加spk的bpm属性值将导致更短的节拍,减小bpm属性值 意味着拉长每个节拍时间。
关于midi编号与钢琴琴键之间的关系,请你使用搜索引擎自行查找、阅读,当你get到这一关系后,你可以把自己在钢琴上弹奏的旋律给记录下来,包括 琴键序列和持续时长,很容使用BlueFi重复播放你弹奏的旋律,如果需要修改某些不满意的音节(音调和节拍)是很容易的,然后再重新播放。如此一来, BlueFi将成为你谱曲的小助手。
1.6.3. 播放音频文件¶
或许你觉得播放基本音调并不能满足自己的需要,BlueFi支持wav格式音频文件中的音乐或声音。BlueFi采用磁盘映射和文件拖放等操作,你很容易把 音频文件拖放至/CIRCUITPY/sound/文件夹,然后使用音乐积木块抽屉中的播放WAV格式文件播放这种格式的音频文件。对于wav格式的文件,要求采用 16KHz采样率,16位分辨率。关于wav格式的文件更多属性和介绍,请使用搜索引擎自行查阅。
此处我们使用A和B按钮播放不同的音频文件作为示例,帮助你掌握使用BlueFi播放wav格式音频文件的编程方法:
运行本示例程序之前,务必将两个wav格式文件保存在BlueFi的/CIRCUITPY/cound/文件夹内,此处可以下载本示例程序使用到的两个音乐文件
Coin.wav 和
rise.wav 到你的电脑磁盘上,
然后在BlueFi的CIRCUITPY磁盘根目录新建一个sound文件夹,并把这两个音频文件拖放至/CIRCUITPY/sound/文件夹。过程如下图所示:
请注意,BlueFi的SPI文件系统仅有2MB空间,存放Python库文件和用户程序会占用1/4空间,其余空间可以用于保存你的sound、image等格式文件, 但务必注意文件大小,有限的存储空间务必节约使用,否则一不小心就把BlueFi磁盘塞满了。
总结:
- 喇叭和声音输出
- 声音和频率
- WAV格式文件播放
- 本节中,你总计完成了22行代码的编写工作
重要
出现的代码块
- 设置bpm (有效值:30~360), 每分钟的节拍数(Beats Per Minute),指定节拍的长短
- 播放频率的基本音调(输入参数: 频率和持续时长), 播放指定频率的音调并持续指定的时长
- 播放midi编号 (输入参数: midi号和节拍数), 播放指定midi号的音调并持续指定的节拍
- 播放wav格式文件 (输入参数: wav格式文件名和路径), 播放指定音频文件