2017-01-19 17 views
0

私は、音楽からレベルを生成するUnityのゲームに取り組んでいます。標準の形式である必要のない単純なテキストファイルをゲームに組み込み、レベルを生成するためにそれらを解析する予定です。問題は、MIDIファイルをテキスト形式に変換できることです(MusicXMLほど複雑ではないことが好ましい)。ゲームに含めるテキストファイルは、理想的には長さと開始時間(任意の時間単位)を持つノートのリストで構成されます。私の弾丸地獄ゲームでは弾丸に正確にメモを付ける必要があるので、単に音楽ファイルを含めることはできません。MIDIファイルを長さと開始時間のノートのリストに変換する

このコードはゲームには含まれないため、これはどのようなプログラミング言語にも関わらず気にしません。また、以前はどのような形式でもMIDIを扱ったことがありません。私はこれに任意の図書館や無料のプログラムを使用して満足しています。

ありがとうございました!

答えて

1

MIDIファイルを解析するために任意のオープンソースライブラリを使用し、そのデータを目的の形式のテキストファイルに変換することができます。例えば、DryWetMIDIであなたは、このコードを使用することができます:最初の数字はノート番号(60 = C4)である

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); 

    File.WriteAllLines(textFilePath, 
         midiFile.GetNotes() 
           .Select(n => $"{n.NoteNumber} {n.Time} {n.Length}")); 
} 

ConvertMidiToText方法MIDIティックで始まる時間と、第3の時間は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 
関連する問題