将 MIDI 文件转换为具有长度和开始时间的音符列表
Convert MIDI file to list of notes with length and starting time
我正在使用 Unity 开发一款游戏,该游戏会根据音乐生成关卡。我计划在游戏中包含简单的文本文件(不必采用标准格式)并解析它们以生成关卡。问题是,我需要能够将 MIDI 文件转换为文本格式(最好不要像 MusicXML 那样复杂)。我将包含在游戏中的文本文件最好包含一个注释列表,每个注释都有一个长度和一个开始时间(以任意时间单位)。我不能简单地包含一个音乐文件,因为我的子弹地狱游戏必须用音符精确计时子弹。
我不在乎这是用什么编程语言编写的,因为该代码不会包含在游戏中。此外,我以前从未以任何形式使用过 MIDI。我很乐意为此使用任何库 and/or 免费程序。
预先感谢您的帮助!
您可以使用任何开源库来解析 MIDI 文件并将其数据转换为所需格式的文本文件。例如,对于 DryWetMIDI,您可以使用此代码:
public static void ConvertMidiToText(string midiFilePath, string textFilePath)
{
var midiFile = MidiFile.Read(midiFilePath);
File.WriteAllLines(textFilePath,
midiFile.GetNotes()
.Select(n => $"{n.NoteNumber} {n.Time} {n.Length}"));
}
ConvertMidiToText
方法将生成如下文本文件:
37 0 480
37 960 480
37 1920 480
37 2400 480
70 2640 192
其中第一个数字是音符编号 (60 = C4),第二个是 MIDI 节拍的开始时间,第三个是 MIDI 节拍的长度。
您甚至可以用 小时:分钟:秒 格式书写时间和长度。此代码
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)}"));
}
将生成如下文本:
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
我正在使用 Unity 开发一款游戏,该游戏会根据音乐生成关卡。我计划在游戏中包含简单的文本文件(不必采用标准格式)并解析它们以生成关卡。问题是,我需要能够将 MIDI 文件转换为文本格式(最好不要像 MusicXML 那样复杂)。我将包含在游戏中的文本文件最好包含一个注释列表,每个注释都有一个长度和一个开始时间(以任意时间单位)。我不能简单地包含一个音乐文件,因为我的子弹地狱游戏必须用音符精确计时子弹。
我不在乎这是用什么编程语言编写的,因为该代码不会包含在游戏中。此外,我以前从未以任何形式使用过 MIDI。我很乐意为此使用任何库 and/or 免费程序。
预先感谢您的帮助!
您可以使用任何开源库来解析 MIDI 文件并将其数据转换为所需格式的文本文件。例如,对于 DryWetMIDI,您可以使用此代码:
public static void ConvertMidiToText(string midiFilePath, string textFilePath)
{
var midiFile = MidiFile.Read(midiFilePath);
File.WriteAllLines(textFilePath,
midiFile.GetNotes()
.Select(n => $"{n.NoteNumber} {n.Time} {n.Length}"));
}
ConvertMidiToText
方法将生成如下文本文件:
37 0 480
37 960 480
37 1920 480
37 2400 480
70 2640 192
其中第一个数字是音符编号 (60 = C4),第二个是 MIDI 节拍的开始时间,第三个是 MIDI 节拍的长度。
您甚至可以用 小时:分钟:秒 格式书写时间和长度。此代码
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)}"));
}
将生成如下文本:
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