我有一个音频文件,我想要一个浮动变量与它同步。然后,float变量将用于创建正在播放的音频文件的图形指示。
我想要发生什么:
音频文件中的每个其他节拍(第一拍,第三拍,第五拍等),变量应为0.0f。 其他节拍(第二拍,第四拍,第六拍等),变量应为1.0f。
最重要的是,我希望随着时间的推移,在节拍之间,变换"滑动"在0.0和1.0之间,我首先想到的是在C ++标准库中使用sin函数。
我对音频文件的信息:
除此之外,我还有一个deltatime和一个生命周期,它告诉应用程序执行了多长时间(以秒为单位)。
由于sin函数采用float(或double)作为参数,我需要帮助的是计算,然后可以作为参数传递给函数,然后将其用于生成正弦波同步与音频文件。
答案 0 :(得分:0)
虽然这个解决方案并非坚如磐石,但它应该能够检测到简单音频文件的节拍: 在这里,您可以看到一个简单的音频文件,您可以清楚地看到节拍。我们的目标是找到偏移值,以便我们可以创建我们的cos函数。找到偏移值的方法是首先计算文件的平均音量(通过获取音频数据的绝对值,因为值变为零度,如下所示)。我们计算这个平均音量以消除可能的噪音。接下来,我们遍历所有样本(您可以只选择一个音频通道)并找到绝对值高于此平均值的第一个样本。这会在样本中产生偏移值(NOT SECONDS)。
由于我们知道当前正在播放的是哪一秒,我们现在可以计算cos函数的值,该函数通过填充我们先前计算的函数的频率和偏移来可视化音频。
请纠正我,我吮吸数学
给定BPM的常规节拍应如下所示。
<强> BPS = BPM / 60 强>
<强> G(X)= COS((X * BPS)* 360)强>
带偏移的节拍应该如下所示:
<强> OFFSET_IN_SECONDS = OFFSET_IN_SAMPLES / SAMPLERATE 强>
<强> G(X)= COS((X * BPS + OFFSET_IN_SECONDS)* 360)强>
重要提示:这些功能使用了对于RADIANS C ++使用的程度