프로그래밍 기술/미디 파일 구조 및 미디 분석 프로그램 만들기

[미디 파일] 미디 파일 구조 분석 및 프로그래밍 3 - Track 청크 1, delta time 구하기

언제나휴일 2018. 4. 12. 15:45
반응형

[미디 파일] 미디 파일 구조 분석 및 프로그래밍 3 - Track 청크 1, delta time 구하기



 안녕하세요. 언제나 휴일, 언휴입니다.


 앞에서 미디 파일은 청크의 집합이라는 것과 청크에는 헤더 청크와 트랙 청크가 있다는 것을 확인하였습니다. 또한 헤더 청크의 내용을 분석하는 것까지 살펴보았습니다.

[미디 파일] 미디 파일 구조 분석 및 프로그래밍 1 - 청크 목록

[미디 파일] 미디 파일 구조 분석 및 프로그래밍 2 - Head 청크, Mthd


 이번에는 트랙 청크의 기본 구조를 확인하고 이 중에 메타 이벤트 부분을 분석하기로 할게요.


 트랙 청크는 청크 데이터 부분에 트랙 이벤트 정보들로 구성합니다. 트랙 이벤트 정보는 해당 이벤트가 미디가 시작하여 어느 시점에 발생할 이벤트인지를 결정하는 delta time 부분이 먼저 오며 이후에 이벤트 정보가 옵니다.


  이벤트 정보는 메타 이벤트, 시스템 이벤트, 미디 이벤트로 구분할 수 있습니다.

미디 파일에서 트랙 청크 구조

[트랙 청크 구조]




 먼저 delta time은 이벤트를 발생할 시점 정보를 갖고 있는 필드로 1바이트에서 4바이트까지 차지하는 가변 길이 필드입니다.

 delta time을 나타내는 각 바이트의 첫 번째 비트는 다음 바이트도 delta time에 해당하는지 여부(0:No, 1:Yes)를 나타냅니다.

 예를 들어 이벤트 필드 값이 16진수로 07 88 AB ... 같은 형태로 진행하면 첫 번째 바이트(0x07, 이진수로 0000 0111)의 맨 앞 비트가 0이므로 두 번째 바이트부터는 이벤트 정보입니다. 즉, 첫 번째 바이트인 0x07만 delta time이라는 것입니다.

 만약 이벤트 필드 값이 16진수로 CB 73 24 ... 같은 형태로 진행하면 첫 번째 바이트(0xCB, 이진수로 1100 1011)의 맨 앞 비트가 1이므로 두 번째 바이트로 delta time 필드입니다. 두 번째 바이트(0x73, 이진수로 0111 0011)의 맨 앞 비트가 0이므로 세 번째 바이트부터는 이벤트 정보입니다. 따라서 첫 번째 바이트의 7비트(100 1011)과 두 번째 바이트의 7비트(111 0011)값을 합친 이진수로 0010 0101 1111 0011 값이 delta time 입니다.


 다음은 delta time을 구하는 소스 코드입니다. (여기에서는 buffer의 offset 인덱스부터 delta time값이 있으며 메서드 수행 후에 호출한 곳에서 변화한 offset을 확인할 수 있게 하기 위해 offset을 ref 유형으로 정의하였습니다.)

        public static int ReadDeltaTime(byte[] buffer, ref int offset)

        {

            int time = 0;

            byte b;

            do

            {

                b = buffer[offset];

                offset++;

                time = (time<<7)|(b & 0x7F);

            } while (b > 127);

            return time;

        }


 다음 글에서 메타 이벤트 부분을 해석하는 부분부터 다시 설명하기로 할게요.

반응형