将MIDI文件转换为具有长度和开始时间的音符列表

时间:2017-01-19 23:05:49

标签: midi midi-interface

我正在开发Unity中的游戏,它将从音乐中生成关卡。我打算在游戏中加入简单的文本文件(不必采用标准格式)并解析它们以生成关卡。问题是,我需要能够将MIDI文件转换为文本格式(最好不要像MusicXML那样复杂)。我将包含在游戏中的文本文件理想地包括一个音符列表,每个音符都有一个长度和一个开始时间(以任意时间单位)。我不能简单地包含一个音乐文件,因为我的子弹地狱游戏必须精确计算带有音符的子弹。

我不关心这是什么编程语言,因为这段代码不会包含在游戏中。此外,我以前从未使用任何形式的MIDI。我很乐意为此使用任何库和/或免费程序。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

您可以使用任何开源库来解析MIDI文件,并将其数据转换为所需格式的文本文件。例如,使用DryWetMIDI,您可以使用以下代码:

ConvertMidiToText

37 0 480 37 960 480 37 1920 480 37 2400 480 70 2640 192 方法将生成如下文本文件:

public static void ConvertMidiToText(string midiFilePath, string textFilePath)
{
    var midiFile = MidiFile.Read(midiFilePath);
    TempoMap tempoMap = midiFile.GetTempoMap();

    File.WriteAllLines(textFilePath,
                        midiFile.GetNotes()
                                .Select(n => $"{n.NoteNumber} {n.TimeAs<MetricTimeSpan>(tempoMap)} {n.LengthAs<MetricTimeSpan>(tempoMap)}"));
}

其中第一个数字是音符编号(60 = C4),第二个是MIDI音阶开始时间,第三个是MIDI音符的长度。

您甚至可以用小时:分钟:秒格式编写时间和长度。这段代码

37 00:00:00 00:00:00.4800000
37 00:00:00.9600000 00:00:00.4800000
37 00:00:01.9200000 00:00:00.4800000
37 00:00:02.4000000 00:00:00.4800000
70 00:00:02.6400000 00:00:00.1920000

会产生这样的文字:

.var
相关问题