청크 상세설명
트랙 청크 (track chunk)
트랙청크(MTrk 형식)는 실제 노래 데이터가 저장되는 곳이다. 각 트랙청크는 단순히 미디이벤트와 비(non)미디이벤트들(델타타임값이 선행하는)의 스트림이다. 아래 나오는 트랙청크의 형식은 미디파일의 세 형식 모두에서 같다.
트랙청크의 구조는 이렇다.
트랙이벤트의 구조는 매우 간단하다.
[델타타임]
[델타타임]은 가변길이량으로 저장되며, 다음 이벤트 전까지의(※??? 이전~현재가 아니고???) 시간량을 나타낸다. 트랙의 첫 이벤트가 트랙의 맨 처음에 발생하거나 두 이벤트가 동시에 발생할 경우 델타타임 0이 쓰인다.(※`그니까 첫 이벤트는 이전이벤트가 없으니까 0이잖아. 그니까 델타타임은 현재~다음이 아니고 이전~현재지.) (델타타임을 0으로 저장하지 않으면 다른 아무 값에 최소 2바이트가 필요하다(`※뭔소리고. "다른 아무 값"이 누군데.). 델타타임은 대부분 0이 아니다.) 델타타임은 헤더청크에 명시된 틱 단위이다.
[미디이벤트]
[미디이벤트]는 아무 미디채널메시지이다. 진행중상태가 쓰인다. 이전 이벤트가 같은 상태의 미디채널메시지인 경우, 미디채널메시지의 상태바이트는 생략될 수 있다. 트랙청크의 첫 이벤트는 무조건 상태를 명시해야 한다. 델타타임은 그 자체로는 이벤트 취급을 받지 않으며 트랙이벤트의 필수 부분이다. 델타타임을 지나서까지 진행중상태가 발생함을 보라.
[시스템독점이벤트]
시스템독점이벤트는 단위 하나로 아니면 패킷들 안에서, 혹은 보낼 임의의 아무 바이트를 지정하는 "escape"으로서 미디 시스템독점 메시지를 명기할 때 쓰인다. sysex is used to specify a MIDI system exclusive message, either as one unit or in packets, or as an "escape" to specify any arbitrary bytes to be transmitted. 완전한 시스템독점메시지는 미디파일에 보통 이런 식으로 저장된다.
`The length is stored as a variable-length quantity. It specifies the number of bytes which follow it, not including the F0 or the length itself. For instance, the transmitted message F0 43 12 00 07 F7 would be stored in a MIDI file as F0 05 43 12 00 07 F7. It is required to include the F7 at the end so that the reader of the MIDI file knows that it has read the entire message.
`Another form of sysex event is provided which does not imply that an F0 should be transmitted. This may be used as an "escape" to provide for the transmission of things which would not otherwise be legal, including system realtime messages, song pointer or select, MIDI Time Code, etc. This uses the F7 code:
`Unfortunately, some synthesizer manufacturers specify that their system exclusive messages are to be transmitted as little packets. Each packet is only part of an entire syntactical system exclusive message, but the times they are transmitted at are important. Examples of this are the bytes sent in a CZ patch dump, or the FB-01's "system exclusive mode" in which microtonal data can be transmitted. The F0 and F7 sysex events may be used together to break up syntactically complete system exclusive messages into timed packets.
`An F0 sysex event is used for the first packet an a series — it is a message in which the F0 should be transmitted. An F7 sysex event is used for the remainder of the packets, which do not begin with F0. (Of course, the F7 is not considered part of the system exclusive message).
`A syntactic system exclusive message must always end with an F7, even if the real-life device didn't send one, so that you know when you've reached the end of an entire sysex message without looking ahead to the next event in the MIDI file. If it's stored in one complete F0 sysex event, the last byte must be an F7. If it is broken up into packets, the last byte of the last packet must be an F7. There also must not be any transmittable MIDI events in between the packets of a multi-packet system exclusive message. This principle is illustrated in the paragraph below.
`Here is an example of a multi-packet system exclusive message: suppose the bytes F0 43 12 00 were to be sent, followed by a 200-tick delay, followed by the bytes 43 12 00 43 12 00, followed by a 100-tick delay, followed by the bytes 43 12 00 F7, this would be in the MIDI File:
`When reading a MIDI File, and an F7 sysex event is encountered without a preceding F0 sysex event to start a multi-packet system exclusive message sequence, it should be presumed that the F7 event is being used as an "escape". In this case, it is not necessary that it end with an F7, unless it is desired that the F7 be transmitted.
[메타이벤트]
[메타이벤트]는 이 형식 또는 시퀀서들에 유용한 비(non)미디 정보들을 명시하며, 구조는 이렇다.
메타이벤트는 모두 FF로 시작해서 이벤트 유형 바이트(항상 128보다 작은`※? 큰 아니고?? 맨 첫 비트는 취급 안 하는 건가?)를 가진다. 그 다음, 가변길이량으로 저장된 데이터길이를 가지고 그 다음엔 데이터 자체. 데이터가 없는 경우 길이는 0이다. 청크와 마찬가지로, 기존 프로그램에 알려지지 않은 메타이벤트가 미래에 셜계될 수 있으므로 프로그램들은 인식이 안 되는 메타이벤트를 적절히 무시해야 하며 그것들을 마주칠 수도 있음을 예상해야 한다. 인식이 안 되는 메타이벤트의 길이를 무시해선 안 되고 길이가 예상보다 커도 당황하면 안 된다. `If so, they must ignore everything past what they know about. However, they must not add anything of their own to the end of a meta-event.
시스템독점이벤트와 메타이벤트는 작용중이던 어떤 진행중상태도 취소시키며 이 메시지들에는 진행중상태가 적용되지 않는다.