用按钮来控制LED灯,是树莓派比较经典的一种应用。
那用按钮来控制音乐呢?
我们这次的任务是做个树莓派音乐盒,以便你能像DJ一样,通过它不停的切换和调整音乐。
硬件需求:
- 树莓派1个
- 面包板1个
- 接触式开关4个
- 公对母跳线5根
- 母对母跳线4根
- 扬声器或耳机1个
软件需求:
Raspbian 最新版
制作过程:
先找到你想播放的音频文件,如果你自己没有什么准备,可以在Raspbian系统的/usr/share/sonic-pi/samples目录中找一些示例音乐。
不过你要用Python播放声音的话,得将里面的.flac
文件转换为.wav
文件。
批量转换命令:
for f in *.flac; do ffmpeg -i "$f" "${f%.flac}.wav"; done
如果没出错,你现在应该得到大量的wav文件了。
挑出四个备用,对应4个按钮。将其保存在gpio-music-box
目录中
drum_tom_mid_hard.wav
drum_cymbal_hard.wav
drum_snare_hard.wav
drum_cowbell.wav
电路最基本的接法:
当然,用面包板会让你更方便。
示例程序中有四个按钮,所以我们要分别接入GPIO4、10、17、27四个口。
接下来开始撸代码。
import pygame
from gpiozero import Button
pygame.init()
drum = pygame.mixer.Sound("/home/pi/gpio-music-box/samples/drum_tom_mid_hard.wav")
cymbal = pygame.mixer.Sound("/home/pi/gpio-music-box/samples/drum_cymbal_hard.wav")
snare = pygame.mixer.Sound("/home/pi/gpio-music-box/samples/drum_snare_hard.wav")
bell = pygame.mixer.Sound("/home/pi/gpio-music-box/samples/drum_cowbell.wav")
btn_drum = Button(4)
btn_cymbal = Button(17)
btn_snare= Button(27)
btn_bell = Button(10)
btn_drum.when_pressed = drum.play
btn_cymbal.when_pressed = cymbal.play
btn_snare.when_pressed = snare.play
btn_bell.when_pressed = bell.play
以上的代码应该能正常工作,但不够简洁优雅,我们用Python的字典功能来优化一下。
创建一个字典。
button_sounds = {Button(4): pygame.mixer.Sound("/home/pi/gpio-music-box/samples/drum_tom_mid_hard.wav"),
Button(17): pygame.mixer.Sound("/home/pi/gpio-music-box/samples/drum_cymbal_hard.wav"),
Button(27): pygame.mixer.Sound("/home/pi/gpio-music-box/samples/drum_snare_hard.wav"),
Button(10): pygame.mixer.Sound("/home/pi/gpio-music-box/samples/drum_cowbell.wav")}
然后用Button
作为键,Sound
作为值。
优化后的代码:
import pygame
from gpiozero import Button
pygame.init()
button_sounds = {Button(4): pygame.mixer.Sound("/home/pi/gpio-music-box/samples/drum_tom_mid_hard.wav"),
Button(17): pygame.mixer.Sound("/home/pi/gpio-music-box/samples/drum_cymbal_hard.wav"),
Button(27): pygame.mixer.Sound("/home/pi/gpio-music-box/samples/drum_snare_hard.wav"),
Button(10): pygame.mixer.Sound("/home/pi/gpio-music-box/samples/drum_cowbell.wav")}
for button, sound in button_sounds.items():
button.when_pressed = sound.play
是不是简洁多了?
好了,拿去玩吧。
视频讲解地址:
https://v.qq.com/x/page/x0967xsxe7j.html
线索:Raspberrypi.org
编译:王文文