4621| 1
|
[入门教程] 【创客玩音乐】用灯带让音乐可视化 |
一、缘起: 长久以来一直想玩玩用灯带让音乐可视化的项目: 原作者地址: 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 库 进行处理显示。具体代码如下: [mw_shl_code=python,false]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()[0] 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[i+1], data[i+2], data[i+3] my_rgb.write() time.sleep_ms(1) except: pass [/mw_shl_code] 三、本地发送端代码: audio-reactive-led-strip.zip 如果要运行,需安装: Numpy Scipy (for digital signal processing) PyQtGraph (for GUI visualization) PyAudio (for recording audio with microphone) 四个库。 四、实现效果: 五、演示视频: |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed