【创客玩音乐】用灯带让音乐可视化
一、缘起:长久以来一直想玩玩用灯带让音乐可视化的项目:
原作者地址:
https://github.com/scottlawsonbc/audio-reactive-led-strip
但苦于没有动力,这次借着论坛活动的东风,将这个项目走一遍。
因为原作者提供的程序是适合arduino和树莓派的,
作为一个创客当然不能拿来主义,所以准备将其改造为掌控板可玩的 micropython代码,
权当学习吧。
二、原理
原理大概需要这么这么几步骤:
1.获取本地的声音:这个原作者已经提供说明,只要把:
这里设置立体声混响,然后通过python的一个声源库:pyaudio获取内录音即可。
2.利用获取的声音频率进行音频特征提取:
通过分帧、加窗、快速傅里叶变换等将声音转换为频谱,最后将频谱映射为:RGB值。
参考资料:
https://blog.csdn.net/yunnangf/article/details/78965446
3.将RGB值通过UDP协议传输到主控板,进行彩灯控制。
4.
需要注意的是因为UDP每次处理的是1024位数据,而我们传送数据的格式是:|i|r|g|b|这样的4字节。
i (0 to 255): 表示彩灯的序号,rgb三个值表示灯的RGB值。
所以最多支持1024/4 = 256个灯珠。
(当然手头只有一条60个灯珠的灯带)
5.掌控本地端进行处理的内容,主要是将传过来的数据,按照4字节为一个批次进行解码就可以,然后将数据用 neopixel 库 进行处理显示。具体代码如下:
from mpython import *
import network
import time
import neopixel
import usocket
my_wifi = wifi()
my_wifi.connectWiFi("", "")
my_rgb = neopixel.NeoPixel(Pin(Pin.P8), n=60, bpp=3, timing=1)
while not my_wifi.sta.isconnected():
time.sleep(0.2)
print("...")
port = 7777
s=usocket.socket(usocket.AF_INET, usocket.SOCK_DGRAM)
# s.setsockopt(usocket.SOL_SOCKET,usocket.SO_REUSEADDR,1)
ip=my_wifi.sta.ifconfig()
oled.fill(0)
oled.DispChar(ip, 0, 0, 1)
oled.show()
s.bind((ip,port))
print('waiting...')
while True:
data,addr=s.recvfrom(1024)
print('received:','from',addr)
if data:
try:
# my_rgb.fill( (0, 0, 0) )
len_data = len(data)
oled.DispChar(str(len_data), 0, 16, 1)
oled.show()
for i in range(0,len_data,4):
my_rgb] = data, data, data
my_rgb.write()
time.sleep_ms(1)
except:
pass
三、本地发送端代码:
如果要运行,需安装:
Numpy
Scipy (for digital signal processing)
PyQtGraph (for GUI visualization)
PyAudio (for recording audio with microphone)
四个库。
四、实现效果:
五、演示视频:
https://www.bilibili.com/video/av94816060/
学习中,正需要
页:
[1]