2017-01-19 5 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 틱의 시작 시간과 세 번째 것은 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