본문

MIDI 파일 분석하기 #3. Delta time과 가변길이값

 

바이트는 8개의 비트로 이루어져 있으며 하나의 비트는 0또는 1을 갖습니다. 미디에서는 모든 데이터의 단위가 바이트이며, 1바이트로는 0부터 255사이의 값을 표시할 수 있습니다. 물론 대부분의 경우(명령, 건반이나 누르는 강도등의 수치)에는 한계가 존재하지만 시간이라는 값을 나타내기에는 255라는 범위가 너무 좁습니다. 따라서 시간을 나타내기 위해 가변길이값(Variable Length Values, VLV) 을 사용하여 표현합니다.

원리는 이렇습니다. 만약 시간값이 0x80보다 큰 경우(10진수로 128, 2진수로 1000 0000) 다음값 역시 VLV의 값입니다. 하지만 시간값이 0x7F이하일 경우(10진수로 127, 2진수로 0111 1111) 현재값이 VLV의 마지막 값으로 존재합니다. 즉, 가장 앞자리가 1인 경우 다음 바이트 역시 시간을 가리키는 부분으로 이해할 수 있습니다. 물론 VLV를 사용하여 무한대의 값을 설정할 수 있겠지만 MIDI 스펙에 따르면 VLV의 최대 길이는 5바이트이며, 최대 4바이트를 사용하여 숫자를 표기하게끔 제한됩니다. 이 설명의 기반이 된, 상세한 설명은 Variable Length Values에서 확인하세요 

그림의 보라색 사각형으로 둘러싸인, 두개의 건반 이벤트를 예로 들어 설명해보겠습니다. 이전 게시물에서 잠깐 언급했듯(MIDI 파일 분석하기 #2. Meta-events), 트랙 데이터는 [<delta time><데이터>]들의 나열로 이루어져 있으며, 건반이벤트(midi message) 역시 트랙데이터의 데이터로 존재합니다. 

00 90 43 50 : 0 delta time 후 90 43 50 건반 이벤트를 실행시킵니다.(건반 누름)
8E 77 90 43 00 : 8E 77 delta time 후 90 43 00(건반 뗌)

여기서 중요한 것은 두번째 8E 77입니다. 이를 2진수로 표기하자면 1000 1110 0111 0111 으로 나타낼 수 있습니다. 가장 첫번째 8E는 0x80보다 크기 때문에(가장 앞자리에 1이 붙기 떄문에) VLV가 뒤에 붙는다는 사실을 알 수 있습니다. 두번째 77은 0x80보다 작기 때문에(가장 앞자리에 1이 붙지 않기 때문에) 이것이 VLV의 가장 마지막 부분이라는것을 알 수 있습니다. 가장 앞자리는 그저 VLV의 연속 여부를 알려주는 역할이기 때문에 실제 데이터에는 포함되지 않습니다. 

따라서 8E에서 000 1110, 77의 111 0111을 떼어다가 서로 연결시켜주기만 하면 값을 알아낼 수 있습니다 00 0111 0111 0111 이는 10진수로 1911을 나타냅니다. MIDI 파일 분석하기 #1. Header, Track 개요 에서 헤더부에서 단위시간(4분음표를 표현하기위해 단위시간이 얼마나 존재해야 하는가)이 01 E0(10진수로 480) 으로 설정되었다는것을 기억한다면, 한 마디를 표현하기 위해 480*4=1920이라는 단위시간이 필요하다는것을 알게됩니다. 건반이벤트 사이에 노란색 사각형으로 둘러진 부분(중복되는 부분)에서 2*4=8만큼의 delta time이 존재하며, 이후 건반 떼기 이벤트에서 1911만큼의 delta time이 존재하므로 이를 더한다면, 건반의 누름과 뗌 사이에는 1919의 delta time이 존재하며 건반을 누르고 건반이 완전히 떼지는데 1920(한마디)만큼의 시간이 소요된다는것을 알 수 있습니다.

댓글

Holic Spirit :: Tistory Edition

design by tokiidesu. powerd by kakao.