MIDI或WAV文件到频率和持续时间的数组

时间:2011-03-20 07:22:41

标签: c# audio signal-processing

是否有任何脚本/软件/算法允许将MIDI(或WAV)文件转换为<frequency, duration>列表,以便我们可以重播“&#39;图像”。这个声音文件,例如,通过C#中的System.Console.Beep(frequency, duration)函数?

3 个答案:

答案 0 :(得分:2)

您需要将MIDI,WAV或其他声音文件转换为原始音频样本。然后对于连续的样本块(通常将每个块重叠50%),应用窗口函数(例如汉宁),然后进行FFT,然后取FFT输出区的大小,然后对于音频,通常需要20 * log10的这个幅度得到一个dB值。

答案 1 :(得分:2)

对于MIDI,你必须自己解析文件(我已经完成了,我推荐以下两个引用:onetwo),或者获取一个MIDI工具包。我不知道.NET的任何内容,here is a Google search

一旦你得到它,它应该相当容易。使用工具包读入MIDI文件,这将为您提供一组曲目。每个轨道都包含一系列事件,每个事件都有一个相对于前一个事件的时间戳。事件可以是“记录”,“记录关闭”,或者您可能不关心的数百个其他事件之一,并且可以忽略此练习。只需查看“注意事项”和“注意事项”事件。通常,每个音符都是“音符开启”(具有一定的音高和速度,即音量),然后是一段时间后的“音符关闭”(音高相同,速度为0)。

如此武装这些信息,您可以构建一个四重音符表(开始时间,持续时间,音高,速度),其中开始时间是“音符开启”事件的时间,持续时间是两者之间的时间差。 “音符开”和“音符关”,音高/速度是“音符开”的音高/速度。您可以使用this formula将音高转换为频率。

至于WAV / MP3 / AAC / OGG,所有这些技术都与保罗在答案中建议的技术相同。

答案 2 :(得分:1)

Paul R对WAV的解释很好。

对于MIDI,你将不得不选择一个曲目并读入MIDI数据。你如何决定哪个曲目取决于你,但你真的只能选择一个,因为你只能使用你的方法从PC扬声器中一次得到一个“音符”。

C#MIDI教程:http://www.codeproject.com/KB/audio-video/MIDIToolkit.aspx

阅读完毕后,您应该知道如何读取MIDI文件。从那里,您可以将其转换为频率和持续时间。持续时间取决于速度和音符持续的刻度数,音高取决于音符编号及其对应的频率,符合equal temperament。 (如果你想变得非常疯狂,你甚至可以处理其他调音,但我现在不用担心它。)

另外,我相信NAudio has some MIDI classes for reading files,但它们可能不完整。

虽然我们正在疯狂......如果你能有效地解决它(这几乎是不可能的,我想,但是......),对于WAV播放,你可以使用PWM to drive the PC speaker and emulate PCM audio playback。我记得有一些旧的DOS games from Necrobones用来做这个,并且有一个Windows 3.1的驱动程序在我的33MHz笔记本电脑上运行良好,通常点击和叮当。虽然来自托管框架(甚至在没有实时优先级的Windows中)的这种方法可能非常困难。