0

妻子要求使用最好的音乐使圣诞灯“摇滚”的设备。我将使用 Arduino 微控制器来控制连接到灯的继电器,从 C# winforms 发送 6 个信号来关闭和打开它们。我想用NAduio把幅度和节奏分开来发送六个信号。对于特定的赫兹范围,例如六个信号的六个小节的均衡器,然后是节奏的时间。我看过 WPF 演示,波形似乎就是答案。我想知道如何在歌曲播放时实时获取这些值。我在想... 1. 创建一个简单的 mp3 播放器并加载我所有的歌曲。2. 开始播放歌曲。3. 对歌曲的当前动态进行采样并将其放入一个整数中,我可以通过 USB 将其发送到 Arduino 微控制器上的哪个通道。

我不确定如何实时捕获当前声音信息并为那一刻提供整数值。我可以在歌曲播放时实时读取 e.MaxSampleValues[0] 值,但我希望能够区分当时处于活动状态的频率范围。

对于这个有趣的项目,任何帮助或指导将不胜感激。

谢谢

4

1 回答 1

3

听起来像是一个有趣的信号处理项目。

使用该NAudio.Wave.WasapiLoopbackCapture对象,您可以获得从本地计算机上的声卡生成的音频数据。这可以让您跳过“创建 MP3 播放器”步骤,尽管代价是声音和灯光之间的轻微延迟。为了获得更好的同步,您可以在播放期间进行 MP3 解码并预先计算节拍模式和输出状态。这将使您可以调整发送输出和播放生成这些输出的音频块之间的延迟,从而在灯光和音乐之间获得近乎完美的同步。

获得样本后,下一步是使用 FFT 来查找频率分量。幸运的是NAudio包括一个类来帮助解决这个问题:NAudio.Dsp.FastFourierTransform. (谢谢马克!)获取FFT()函数的输出并总结出每个受控灯所需的频率范围。

下一步是节拍检测。这里有一篇有趣的文章。主要区别在于,您将使用来自光谱分析阶段的数据来提供节拍检测算法,而不是对样本块流进行能量检测。您求和的这些范围成为单个节拍检测处理器的输入,为您定义的每个频率范围提供一个输出。您可能希望为每个频率组添加单独的缩放/阈值因子,并使用某种屏幕控件来调整这些以获得最佳效果。

在该过程结束时,您将获得一个样本块流,每个样本块都有一组输出标志。将标志推送到您的 Arduino 并将样本排队播放,其中任何一个操作都有延迟以实现您的同步。

于 2013-11-06T05:14:27.850 回答