将变量与音频文件

时间:2016-07-10 03:33:02

标签: c++ audio

我有一个音频文件,我想要一个浮动变量与它同步。然后,float变量将用于创建正在播放的音频文件的图形指示。

我想要发生什么:

音频文件中的每个其他节拍(第一拍,第三拍,第五拍等),变量应为0.0f。 其他节拍(第二拍,第四拍,第六拍等),变量应为1.0f。

最重要的是,我希望随着时间的推移,在节拍之间,变换"滑动"在0.0和1.0之间,我首先想到的是在C ++标准库中使用sin函数。

我对音频文件的信息:

  • 文件的速度/ BPM
  • 文件的长度(以秒为单位)
  • 音频文件总共包含多少次节拍
  • 文件的位置,正在播放。 我知道这首歌在哪里,几秒钟之内,我现在在。例如,如果歌曲播放了3秒半,我使用
  • 功能获得3.5f

除此之外,我还有一个deltatime和一个生命周期,它告诉应用程序执行了多长时间(以秒为单位)。

由于sin函数采用float(或double)作为参数,我需要帮助的是计算,然后可以作为参数传递给函数,然后将其用于生成正弦波同步与音频文件。

1 个答案:

答案 0 :(得分:0)

虽然这个解决方案并非坚如磐石,但它应该能够检测到简单音频文件的节拍: image 在这里,您可以看到一个简单的音频文件,您可以清楚地看到节拍。我们的目标是找到偏移值,以便我们可以创建我们的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 ++使用的程度