2016-12-22 5 views
0

미디 파일을 생성하기위한 간단한 인터페이스를 작성하려고합니다. 테스트로서 필자는 같은 길이의 모든 음표를 주요 스케일로 연주하는 파일을 만들려고했습니다. 내가 얻는 파일은 다음과 같습니다 (가독성을 위해 들여 쓰기)MIDI 파일 생성 및 이벤트 시간 인코딩 : 왜 시간 간격을두고 음표를 배치해야 실제로 실제로 느려 집니까?

4d 54 68 64 00 00 00 06 00 01 00 02 00 08 
    4d 54 72 6b 00 00 00 0b 
     00 ff 51 03 00 27 0f 
     00 ff 2f 00 
    4d 54 72 6b 00 00 00 54 
     00 c0 00 
     00 90 40 7f 
     7d 80 40 7f 
     7d 90 42 7f 
     81 7a 80 42 7f 
     81 7a 90 44 7f 
     82 77 80 44 7f 
     82 77 90 45 7f 
     83 74 80 45 7f 
     83 74 90 47 7f 
     84 71 80 47 7f 
     84 71 90 49 7f 
     85 6e 80 49 7f 
     85 6e 90 4b 7f 
     86 6b 80 4b 7f 
     86 6b 90 4c 7f 
     87 68 80 4c 7f 
     00 ff 2f 00 

설명 : 1 행은 파일 헤더입니다. 2 행은 트랙 헤더입니다. (필자의 인터페이스에서는 타악기 하나의 트랙을 예약하고 템포를 설정합니다.이 예제에서는 타악기가 없기 때문에 노트가 없습니다.) 3 행은 템포를 설정하고 4 행은 트랙을 끝냅니다. 5 행은 또 다른 트랙 헤더입니다. 이 트랙에는 멜로디가 있습니다. 라인 6은 채널 0을위한 인스트루먼트를 설정합니다. 다음으로 채널 0에 대해 8 회의 노트 온 및 8 노트 오프 이벤트가 발생하고 트랙 종료가 발생합니다. 시작 노트를 끝내는 시간은 다음과 같습니다

00, 7d, 81 7a, 82 77, 83 74, 84 71, 85 6e, 86 6b, 87 68 

지금까지 내가 이해, 그들은 균일 간격해야한다, 이벤트 시간에 대한 MIDI는 숫자의 길이가 모두 유연하고있는 7 비트 바이트 형식을 사용하기 때문에 마지막 바이트를 제외한 바이트는 msnzb가 설정됩니다. 그래서 00은 0으로 변환되어야하고, 7d는 125로 변환되어야하고, 81a는 850으로 변환되어야합니다. 그러나 어떤 이유로 파일을 재생할 때, 그것은 시간이 많이 걸리지 않고 오히려 느려집니다. 왜 그래야만하지? 이벤트 타이밍을 인코딩하는 정확한 방법을 잘못 이해 했습니까? 그렇다면 올바른 방법은 무엇입니까? 또는 문제를 일으키는 파일에 다른 문제가 있습니까?

답변

1

MIDI 파일의 타임 스탬프는 델타 타임입니다 - 이벤트가 발생하는 시간을 인코딩하지 않으면 해당 트랙의 순차적 이벤트 사이의 시간차를 인코딩합니다. 이벤트가 일정한 간격을두고 있으면 델타 시간이 같아야합니다. 표준에서

:

MTrk 이벤트의 구문은 매우 간단하다

<MTrk event> = <delta-time><event>

<delta-time>는 가변 길이의 데이터로서 저장된다. 다음 이벤트가 발생하기까지 걸리는 시간을 나타냅니다. 트랙의 첫 번째 이벤트가 트랙의 맨 처음에 발생하거나 두 이벤트가 동시에 발생하면 0의 델타 시간이 사용됩니다. 델타 시간은 항상 존재합니다. (0의 델타 시간을 저장하지 않으면 다른 값에 대해 적어도 2 바이트가 필요하며 대부분의 델타 시간은 0이 아닙니다.) 델타 시간은 비트의 일부분입니다 (또는 SMPTE times), 헤더 청크에 지정된대로.

http://www.music.mcgill.ca/~ich/classes/mumt306/StandardMIDIfileformat.html