本帖最后由 云天 于 2021-12-18 22:58 编辑
【项目设计】
见过网络上的声控炫灯,多数需要使用模拟拾音模块。本项目使用Python来播放和分析音频,再通过Pinpong库,让Arduino控制LED根据音乐亮灯。
【设计分析】
1、使用WAV格式的音乐文件,从网络上下载的MP3音乐文件,可通过在线转换成WAV格式:https://convertio.co/zh/audio-converter/
2、使用“wave”库对音频数据进行分析
3、使用“pyaudio”库播放音频
【程序设计】使用Mind+Python模式
程序代码:
-
-
- import warnings
- warnings.simplefilter("ignore", DeprecationWarning)#防止报警告
- import pyaudio
- import wave
-
- import numpy as np
- import pygame,random
- from pygame.locals import *
- from pinpong.board import Board,Pin,NeoPixel
- NEOPIXEL_PIN = Pin.D2
- PIXELS_NUM = 60 #灯数
- Board("uno").begin() #初始化,选择板型和端口号,不输入端口号则进行自动识别
- npy = NeoPixel(Pin(NEOPIXEL_PIN), PIXELS_NUM)
- CHUNK = 2048#我把它理解为缓冲流
-
-
- wf = wave.open("ydy.wav", 'rb')#以只读的方式打开"1qom8-vi8uq.wav"文件
-
- #创建播放器
- p = pyaudio.PyAudio()
- #打开数据流 output=True表示音频输出
- stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
- channels=wf.getnchannels(),#设置声道数
- rate=wf.getframerate(),#设置流的频率
- output=True)
-
-
- data = wf.readframes(CHUNK)#音频数据初始化
-
- while data != '':#直到音频放完
-
- stream.write(data)#播放缓冲流的音频
- data = wf.readframes(CHUNK)#更新data
- numpydata = np.fromstring(data, dtype=np.int16)#把data由字符串以十六进制的方式转变为数组
- transforamed=np.real(np.fft.fft(numpydata))#傅里叶变换获取实数部分
-
-
- count=64#设置间隔区
- max_data=0
- for n in range(0,transforamed.size,count):#从频域中的2048个数据中每隔count个数据中选取一条
- hight=abs(int(transforamed[n]/10000))#对这么多数据取整和绝对值
- if hight>max_data:
- max_data=hight
- print(max_data)
- if max_data>255:
- max_data=255
- max_data1=0
- max_data2=0
- max_data3=0
- i=random.randint(1, 12)
- if i<4:
- max_data1=max_data
- elif i<8:
- max_data2=max_data
- else:
- max_data3=max_data
- npy.range_color(0,60,(max_data1,max_data2,max_data3))
-
- stream.stop_stream()
- stream.close()
- #关闭流
- p.terminate()
-
复制代码
【修改库文件】
因NeoPixel 的range_color第三个参数默认的是十六制颜色,形式如“#0xFF0000”,我想使用元组表示颜色,如“(255,0,0)”。找到pymata4.py(C:\Program Files (x86)\Mind+\Arduino\python\site-packages\pinpong\base)
【组装硬件】
硬件使用的是“Mind+Python流光溢彩灯https://mc.dfrobot.com.cn/thread-311681-1-1.html”
【效果图】
【演示视频】
界面视频只用演示用,歌曲由Python播放。
|