이 글은 https://ehclub.co.kr/3361?category=762014 블로그에서 많은 것을 배워 다시 한번 정리를 해본 글 임을 밝힙니다.
[도전 프로젝트] 와 연계지어 하는 또다른 프로젝트. midi의 구조를 분석해서 실제 midi를 생성하는 과정에서 midi 의 구조는 꼭 알아야 될 것 같았다. 일단 다음 파일은 오늘 분석할 midi 파일이다.
midi 파일이 무엇일까?
midi은 악보라고 표현할 수 있다. midi 그 자체는 음이 언제시작하고 언제끝나는지, 무슨 악기인지에 대한 정보만 담고 있다. 단, 악기의 소리는 담고 있지 않다. 이런 binary로 표현되어 있어서 용량도 kb 단위이다.
midi는 소리를 담고있지 않아서 연주하려면 악기가 필요한데, 그 악기가 바로 midi player 다. 보통 윈도우에 기본으로 깔려있고, 다른 미디 플레이어를 쓸 수도 있다.
미디에 관한 간단한 설명은 여기까지 하고 실제 미디의 구조를 보겠다.
미디는 청크라는 단위로 구성되 있다. 그 청크는 헤드청크와 트랙청크로 나뉜다. 이름에서 알 수 있겠지만, 헤드청크는 midi 파일 맨 앞에 위치해 파일의 전반적인 정보를 담고있고, 트랙청크는 실질적인 음표나 기호등을 담고 있다.
먼저 헤드청크에 대해서 살펴보자 헤드처으는 다음과 같이 고정적으로 14byte 이다.
4byte / 4byte / 2byte/ 2byte/ 2byte로 구성되 있으며 각 요소들이 의미하는 바는 다음과 같다 .
1. Chunk Type
본 청크가 헤드청크인지 트랙 청크인지를 구분하는 용도. 아스키 코드로 인식되며
헤드청크일시 MThd (4D 54 68 64)
트랙청크일시 MTrk (4D 54 72 6B)
2. Length
단위는 바이트 단위이며 .데이터 영역의 크기인데, 트랙청크에서는 후에 오는 Data 영역의 크기가 가변이지만 헤드청크에서는 6바이트로 고정이다.
3. Data
3.1 Format
트랙을 어떻게 연주 할 것인지를 담고있다 . 0,1,2 세가지 중 하나로 이루어 졌으며
0 : 트랙 청크가 하나다. (이런경우는 거의 없을 것이다.)
1 : 트랙 청크가 둘 이상이고 동시에 연주(대부분의 경우)
2 : 1과 동일하나 동시에 연주하지 않음 (이 경우도 별로 없을 것 같다)
3.2 Track Count
트랙의 개수. 이해 쉽게 예를 들자면 보통 피아노 악보는 높은음자리표, 낮은음자리표 이렇게 2개로 이루어져있는데 이경우 트랙은 2개라고 볼 수 있다.
3.3 Divison
미디파일 내에서 시간단위를 정하는 곳. 미디에서는 1Ticks 으로 시간단위가 표현 된다.
상당히 복잡하게 계산이 되는데 1) 최상위 비트가 0 일때, 2) 최상위 비트가 1일때로 나뉜다. 이 부분은 이산수학을 배우신 분은 아시겠지만, 컴퓨터는 최상위 비트로 음수, 양수 판별을 한다.
1) 최상위 비트가 0일때 (양수)
단순하게 부호비트를 제외한 값 = a라고 놓았을 때, 4분음표길이/a =1 delta time= 1 ticks 이다.
2) 최상위 비트가 1일때 (음수)
가장 마지막 1바이트는 프레임당 Ticks, 상위 1바이트에서 부호비트를 제외한 7비트는 -fps(frame per second)를 의미한다. 만약 이 부분이 0xE71A 라면 이는 이진수로 1110 0111 0001 1010 이고 마지막 1바이트는 00011010이므로 1프레임당 26ticks, 부호비트 제외 7비트는 110 0111 인데, 이는 음수이므로 001 1000 이라는 양수로 변환해보면 10진수로 30이다. 즉 fps가 30이라는 것. 이를 총합해보면 초당 780ticks가 돌아간다. 이때의 delta time은 1ms 이다.
그런데 가지고 있는 몇개의 midi파일들을 다 보았는데 이 경우는 없었다.
1, 2번을 비교하자면 1번은 음표의 길이를 이용해 시간단위를 표현, 2번은 tick을 초라는 시간에 맞추어 표현한다는 것이다. 아직 전체적인 방식은 몰라서 뒤로 더 가봐야 알 수 있을 것 같다.
'개인 프로젝트 > 악보영상 midi 변환기' 카테고리의 다른 글
[도전 프로젝트] 악보영상으로 midi파일 만들기 #끝 (1) | 2020.06.09 |
---|---|
midi 파일 분석하기 #2 핵심부분만 (0) | 2020.06.09 |
[도전 프로젝트] 악보 동영상으로 midi 만들기 #3 (0) | 2020.06.07 |
[도전 프로젝트] 악보 동영상으로 midi 만들기 #2 (0) | 2020.06.07 |
[도전 프로젝트] 악보동영상으로 midi 만들기 #1 (0) | 2020.06.05 |