我正在尝试创建类似吉他 - 英雄的游戏(类似这样),我希望能够分析用户给出的音频文件并自动创建关卡,但我不知道该怎么做.
我想也许我应该使用BPM检测算法并在一些节拍和轨道上放置箭头,但我不知道如何实现这些.
另外,我正在使用NAudio的BlockAlignReductionStream,它有一个复制byte []数据的Read方法,但是当我读取2声道音频文件时会发生什么?它从第一个通道读取1个字节,从第二个通道读取1个字节吗?(因为它表示16位PCM)并且24位和32位浮点运行同样如此?
节拍检测(或更具体地说是BPM检测)
使用梳状滤波器的节拍检测算法概述:
http://www.clear.rice.edu/elec301/Projects01/beat_sync/beatalgo.html
他们看起来像这样:
一个快速傅立叶变换
汉宁窗,全波整治
多个低通滤波器 ; 每个FFT输出范围一个
差异化和半波整流
梳状滤波器
你需要在这里实现许多算法.但是,梳状滤波器应该很慢. 维基文章并未指出其他具体方法.
编辑:本文提供有关节拍检测的流统计方法的信息.这听起来是个好主意:http: //www.flipcode.com/misc/BeatDetectionAlgorithms.pdf - 我打赌他们实时运行得更好,但不太准确.
顺便说一句,我只是撇去并拔出了关键词.我只玩过FFT,整流和衰减滤波器(低通滤波器).其余我不知道,但你有链接.
这将使你获得歌曲的BPM,但它不会为你生成箭头.
等级生成
至于"在一些经常性模式上放置一个节拍和一个轨道上的箭头",实现这一点会变得有点棘手,以获得良好的结果.
您可以采用更积极的内容提取方法,并尝试将歌曲从歌曲中拉出来.
你也需要对这个部分使用节拍检测.这可能类似于上面的BPM检测,但在不同的范围内,使用仪器范围的带通滤波器.你也会换掉或删除算法的某些部分,并且必须对整首歌进行采样,因为你没有检测到全局 BPM.你还需要某种音高检测.
我认为这种方法会很混乱,并且可以保证你需要手工擦洗每首歌曲的结果.如果你对此感到满意,并且只是想避免最初的手动转录工作,这可能会很好.
您还可以尝试使用内容生成方法.
大多数程序内容生成都是以反复试验的方式完成的,人们发布或申请专利的算法并不完全糟糕.通常,没有可以对内容生成算法进行真正的定性分析,因为它们会产生美学效果.因此,您只需选择那些似乎可以提供令人满意的样本结果并尝试一下的方法.
大多数算法都以视觉内容生成为中心,包括地形,建筑,人形机器人,植物等.有一些关于音频内容生成,生成音乐等的研究.您的要求并不完全匹配其中任何一个.
我认为程序性"舞步"的算法(如果这样的事情存在 - 我只发现动画技术)或生成音乐将是最接近的匹配,如果你在歌曲中检测到的节奏驱动.
如果你想了解组合生成方法,请准备好许多完全不同的算法,这些算法通常只是暗示,但没有详细解释.
例如:
http://tones.wolfram.com/about/faqs/howitworks.html
http://research.microsoft.com/en-us/um/redmond/projects/songsmith/