c# - 分析音频以自动创建吉他英雄关卡

标签 c# .net naudio audio-processing

我正在尝试创建一个类似吉他英雄的游戏(类似于 this )并且我希望能够分析用户提供的音频文件并自动创建关卡,但我不确定如何这样做。

我想也许我应该使用 BPM 检测算法并在节拍上放置一个箭头,在一些循环模式上放置一个轨道,但我不知道如何实现这些。

此外,我正在使用 NAudio 的 BlockAlignReductionStream,它有一个读取字节 [] 数据的读取方法,但是当我读取一个 2 声道音频文件时会发生什么?它从第一个 channel 读取 1 个字节,从第二个 channel 读取 1 个字节吗? (因为它说的是 16 位 PCM)24 位和 32 位 float 是否也会发生同样的情况?

最佳答案

节拍检测(或更具体地说是 BPM 检测)

使用梳状滤波器的节拍检测算法概述:

看起来像他们:

您必须在此处实现许多算法。不过,梳状滤波器据说速度很慢。 The wiki article没有向我指出其他具体方法。

编辑:这篇文章有关于节拍检测的流统计方法的信息。这听起来是个好主意:http://www.flipcode.com/misc/BeatDetectionAlgorithms.pdf - 我打赌它们实时运行得更好,但准确性较低。

顺便说一句,我只是浏览并提取了关键字。我只玩过 FFT、整流和衰减滤波器(低通滤波器)。其余的我一无所知,但你有链接。

这将为您提供歌曲的 BPM,但不会为您生成箭头。

关卡生成

至于“在节拍上放置箭头,在某些循环模式上放置轨道”,要获得良好的结果,实现起来会有点棘手。

您可以采用更积极的内容提取方法,并尝试从歌曲中提取音符。

您还需要对这部分使用节拍检测。这可能类似于上面的 BPM 检测,但在不同的范围内,对乐器范围使用带通滤波器。您还可以换出或删除算法的某些部分,并且必须对整首歌曲进行采样,因为您没有检测到全局 BPM。您还需要某种 pitch detection .

我认为这种方法会很困惑,并且会保证您需要手动删除每首歌曲的结果。如果您对此没有意见,并且只是想避免最初的手写转录工作,那么这可能会很有效。

您也可以尝试采用内容生成方法。

大多数程序性内容生成都是通过反复试验的方式完成的,人们发布或申请专利的算法并不完全糟糕。通常无法对内容生成算法进行真正的定性分析,因为它们会产生美感。因此,您只需要选择那些似乎能提供令人满意的样本结果的样本并进行尝试即可。

大多数算法都围绕视觉内容生成,包括地形、建筑、人形、植物等。有一些关于音频内容生成的研究,Generative Music等。您的要求并不完全符合其中任何一项。

我认为程序“舞步”(如果存在这样的东西 - 我只找到动画技术)或生成音乐的算法将是最接近的匹配,如果由您在歌曲中检测到的节奏驱动的话。

如果你想深入了解合成生成方法,请准备好了解许多完全不同的算法,这些算法通常只是暗示,而不是详细解释。

例如:

关于c# - 分析音频以自动创建吉他英雄关卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8200010/

相关文章:

c# - 月和年 View 日历

c# - parallel linq : AsParallel(). forAll() 使某些对象为空

c#-4.0 - 如何使用C#.net解码amr文件

c# - 为什么在所有初始订阅者断开连接后 RefCount 不工作? (减少)

c# - 如何自动保存和自动加载 winforms C# 中的所有属性?

c# - 为 .Net 选择图表库

c# - NAudio:正确使用 MixingSampleProvider 和 VolumeSampleProvider

audio - fft 数据的分贝结果错误

c# - 如何将此查询写成 lambda 表达式?

c# - 对象引用在多层异步等待操作中丢失