妻子要求使用一种装置,用最好的音乐制作圣诞灯“摇滚”。我将使用Arduino微控制器来控制连接到灯的继电器,从C#winforms发送6个信号以关闭和打开它们。我想用NAduio分离振幅和节奏来发送六个信号。对于特定范围的赫兹,如均衡器,六个信号为六个条,然后从节奏的时间。我见过WPF演示,波形似乎就是答案。我想知道如何在播放歌曲时实时获取这些值。 我在想 ... 1.创建一个简单的MP3播放器并加载我的所有歌曲。 2.开始播放歌曲。 3.对歌曲的当前动态进行采样并将其放入一个整数,我可以通过usb将其发送到Arduino微控制器上的哪个通道。
我不确定如何捕获实时当前声音信息并为该时刻提供整数值。我可以在播放歌曲的同时实时读取e.MaxSampleValues [0]值,但我希望能够区分当时活动的频率范围。
对于这个有趣的项目,任何帮助或方向都会受到赞赏。
谢谢
答案 0 :(得分:2)
听起来像一个有趣的信号处理项目。
使用NAudio.Wave.WasapiLoopbackCapture
对象,您可以从本地计算机上的声卡中获取音频数据。这使您可以跳过“创建MP3播放器”步骤,但代价是声音和灯光之间会有轻微延迟。为了获得更好的同步,您可以进行MP3解码并在播放期间预先计算节拍模式和输出状态。这将允许您调整发送输出和播放输出所生成的音频块之间的延迟,使灯光和音乐之间达到完美同步。
获得样本后,下一步是使用FFT查找频率分量。幸运的是,NAudio
包含了一个可以帮助解决此问题的课程:NAudio.Dsp.FastFourierTransform
。 (谢谢Mark!)获取FFT()
函数的输出,并为每个受控灯光求和所需的频率范围。
下一步是节拍检测。有一篇关于这个here的有趣文章。主要区别在于,您不会在样本块流上进行能量检测,而是使用光谱分析阶段的数据来提供节拍检测算法。您总结的那些范围成为各个节拍检测处理器的输入,为您定义的每个频率范围提供一个输出。您可能希望为每个频率组添加单独的缩放/阈值因子,并使用某种屏幕控制来调整这些因素以获得最佳效果。
在流程结束时,您将拥有一个样本块流,每个样本块都带有一组输出标志。将标志推出到你的Arduino并将样本排队进行播放,延迟其中任何一个操作以实现同步。