查看: 486|回复: 1

[入门教程] 【创客玩音乐】用灯带让音乐可视化

[复制链接]
一、缘起:
长久以来一直想玩玩用灯带让音乐可视化的项目:
原作者地址:
https://github.com/scottlawsonbc/audio-reactive-led-strip
但苦于没有动力,这次借着论坛活动的东风,将这个项目走一遍。
因为原作者提供的程序是适合Arduino和树莓派的,
作为一个创客当然不能拿来主义,所以准备将其改造为掌控板可玩的 micropython代码,
权当学习吧。

二、原理
原理大概需要这么这么几步骤:
1.获取本地的声音:这个原作者已经提供说明,只要把:
202003098408..png
这里设置立体声混响,然后通过python的一个声源库:pyaudio获取内录音即可。

2.利用获取的声音频率进行音频特征提取:
通过分帧、加窗、快速傅里叶变换等将声音转换为频谱,最后将频谱映射为:RGB值。
参考资料:
https://blog.csdn.net/yunnangf/article/details/78965446
202003099450..png


3.将RGB值通过UDP协议传输到主控板,进行彩灯控制。

4.
需要注意的是因为UDP每次处理的是1024位数据,而我们传送数据的格式是:|i|r|g|b|这样的4字节。
i (0 to 255): 表示彩灯的序号,rgb三个值表示灯的RGB值。
所以最多支持1024/4 = 256个灯珠。
(当然手头只有一条60个灯珠的灯带)

5.掌控本地端进行处理的内容,主要是将传过来的数据,按照4字节为一个批次进行解码就可以,然后将数据用 neopixel 库 进行处理显示。具体代码如下:
[Python] 纯文本查看 复制代码
from mpython import *
import network
import time
import neopixel
import usocket[/backcolor]
[backcolor=initial]
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[i]] = data[i+1], data[i+2], data[i+3]
            my_rgb.write()
            time.sleep_ms(1)
        except:
            pass

三、本地发送端代码:
audio-reactive-led-strip.zip (21.17 KB, 下载次数: 36)

DFrJ5KYVQaH  中级技匠

发表于 2020-3-9 13:28:10

学习中,正需要
回复

使用道具 举报

高级模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2020 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail