미디 파일을 생성하기위한 간단한 인터페이스를 작성하려고합니다. 테스트로서 필자는 같은 길이의 모든 음표를 주요 스케일로 연주하는 파일을 만들려고했습니다. 내가 얻는 파일은 다음과 같습니다 (가독성을 위해 들여 쓰기)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으로 변환되어야합니다. 그러나 어떤 이유로 파일을 재생할 때, 그것은 시간이 많이 걸리지 않고 오히려 느려집니다. 왜 그래야만하지? 이벤트 타이밍을 인코딩하는 정확한 방법을 잘못 이해 했습니까? 그렇다면 올바른 방법은 무엇입니까? 또는 문제를 일으키는 파일에 다른 문제가 있습니까?