나머지/midiSpec

표준 미디 파일 1.0 / 트랙 청크

일단은생각해놓은닉넴이없음 2020. 3. 9. 13:04

청크 상세설명

트랙 청크 (track chunk)

트랙청크(MTrk 형식)는 실제 노래 데이터가 저장되는 곳이다. 각 트랙청크는 단순히 미디이벤트와 비(non)미디이벤트들(델타타임값이 선행하는)의 스트림이다. 아래 나오는 트랙청크의 형식은 미디파일의 세 형식 모두에서 같다.

트랙청크의 구조는 이렇다.

[트랙청크] = [청크유형] [길이] [형식] [트랙이벤트](한개이상)

트랙이벤트의 구조는 매우 간단하다.

[트랙이벤트] = [델타타임] [이벤트]
[델타타임]

[델타타임]은 가변길이량으로 저장되며, 다음 이벤트 전까지의(※??? 이전~현재가 아니고???) 시간량을 나타낸다. 트랙의 첫 이벤트가 트랙의 맨 처음에 발생하거나 두 이벤트가 동시에 발생할 경우 델타타임 0이 쓰인다.(※`그니까 첫 이벤트는 이전이벤트가 없으니까 0이잖아. 그니까 델타타임은 현재~다음이 아니고 이전~현재지.) (델타타임을 0으로 저장하지 않으면 다른 아무 값에 최소 2바이트가 필요하다(`※뭔소리고. "다른 아무 값"이 누군데.). 델타타임은 대부분 0이 아니다.) 델타타임은 헤더청크에 명시된 틱 단위이다.

[이벤트] = [미디이벤트] 또는 [시스템독점이벤트] 또는 [메타이벤트]
[미디이벤트]

[미디이벤트]는 아무 미디채널메시지이다. 진행중상태가 쓰인다. 이전 이벤트가 같은 상태의 미디채널메시지인 경우, 미디채널메시지의 상태바이트는 생략될 수 있다. 트랙청크의 첫 이벤트는 무조건 상태를 명시해야 한다. 델타타임은 그 자체로는 이벤트 취급을 받지 않으며 트랙이벤트의 필수 부분이다. 델타타임을 지나서까지 진행중상태가 발생함을 보라.

[시스템독점이벤트]

시스템독점이벤트는 단위 하나로 아니면 패킷들 안에서, 혹은 보낼 임의의 아무 바이트를 지정하는 "escape"으로서 미디 시스템독점 메시지를 명기할 때 쓰인다. 완전한 시스템독점메시지는 미디파일에 보통 이런 식으로 저장된다.

F0 [길이] [F0 다음에 보내질 바이트들]
`이 뒷 내용은 대충 내일의 나에게 미룸.
[메타이벤트]

[메타이벤트]는 이 형식 또는 시퀀서들에 유용한 비(non)미디 정보들을 명시하며, 구조는 이렇다.

FF [유형] [길이] [전송될 바이트들 모두]

메타이벤트는 모두 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.

시스템독점이벤트와 메타이벤트는 작용중이던 어떤 진행중상태도 취소시키며 이 메시지들에는 진행중상태가 적용되지 않는다.