2017-01-19 4 views
0

Я работаю над игрой в Unity, которая будет генерировать уровни из музыки. Я планирую включить простые текстовые файлы (которые не должны быть в стандартном формате) с игрой и проанализировать их для генерации уровней. Проблема в том, что мне нужно иметь возможность конвертировать MIDI-файлы в текстовый формат (желательно не такой сложный, как MusicXML). Текстовые файлы, которые я буду включать в игру, в идеале состоят из списка заметок, каждый из которых имеет длину и время начала (в произвольных единицах времени). Я не могу просто включить музыкальный файл, так как моя игра в пуле-ад должна будет точно разбить патроны с нотами.Конвертировать MIDI-файл в список заметок с длиной и временем начала

Мне все равно, на каком языке программирования это, поскольку этот код не будет включен в игру. Кроме того, я никогда не работал с MIDI раньше в любой форме. Я рад использовать любую библиотеку и/или бесплатную программу для этого.

Заранее благодарю вас за помощь!

ответ

1

Вы можете использовать любую библиотеку с открытым исходным кодом для разбора 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 = С4), второй из них является время начала в тиках 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