kylinpoet 发表于 2020-3-8 23:43:36

【创客玩音乐】用灯带让音乐可视化

一、缘起:
长久以来一直想玩玩用灯带让音乐可视化的项目:
原作者地址:
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/








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

学习中,正需要
页: [1]
查看完整版本: 【创客玩音乐】用灯带让音乐可视化