본문

MIDI 파일 분석하기 #1. Header, Track 개요



MIDI 파일은 연속적인 미디 메시지를 가지는 트랙들으로 구성되어 있으며, 이 트랙들을 관리하기 위하여 최상위(헤더) 정보가 파일의 가장 앞부분에 위치하게 됩니다. 즉, 미디 파일은 하나의 Header부와 다수의 Track부로 이루어집니다. Header부에는 접두어로 MThd, Track부에는 접두어로MTrk를 사용하여 각 부위에 대해 구분을 하며, 결국 미디 파일은 아래와 같은 구조를 취하게 됩니다. MThd<헤더데이터길이><헤더데이터>MTrk<트랙데이터길이><트랙데이터>MTrk<트랙데이터길이><트랙데이터>...

Header부는 순서대로 다음과 같은 구조로 이루어져 있습니다
HThd : 32비트(4개공간차지, 4D 54 68 64) => 고정
<헤더데이터길이> : 32비트(00 00 00 06) => 고정
<포맷> : 16비트(2개공간차지, 00 01)
<트랙갯수> : 16비트(00 02) => 위 악보에서 왼손 오른손 2개의 트랙이 따로, 동시에 연주되므로
<단위시간> : 16비트(01 E0) 

포맷은 총 3가지의 값으로 존재할 수 있습니다. 0일 경우에는 음표와 박자 정보를 갖는 하나의 단일채널 트랙만이 존재하며, 1일경우는 동시에 재생되는 1개이상의 트랙으로 이루어지며, 2일경우에는 동시에 재생되지 않는 1개이상의 트랙으로 구성되게 됩니다. 특히 포맷1의 첫번째 트랙은 Tempo Map이라고 일컬어지며, Time Signature, Set Tempo 등의 메타 이벤트를 반드시 포함해야 합니다.  단위시간은 가장 앞 비트가 1일 경우에는 SMTPE frame 방식을 사용합니다, 0일경우는 4분음표를 표현하기위해 단위시간이 얼마나 존재해야 하는가(즉 4분음표시간/단위시간갯수)를 나타내줍니다. 이에 관해 설명하자면 복잡해지니 우선은 넘어가도록 하겠습니다 

Track부는 Header부가 끝난 다음부터 연속적으로 위치하게 됩니다.
MTrk : 32비트(4D 54 72 6B) => 고정
<트랙데이터길이> : 32비트(00 00 00 22) => 34개의 공간만큼 데이터가 들어갑니다
<트랙데이터>  : 실제 소리를 구성하는 명령이 위치하게 됩니다
저작자 표시 비영리 변경 금지
신고

댓글 12

  • 게스트 썸네일
    2012.08.29 01:48 신고

    제가 현재 미디와 관련한 졸업작품을 하고 있습니다.
    몇가지 질문을 드리고 싶은데 가능하세요?
    ㅠㅠ
    제가 님께서 올린 자료처럼 16진수로 변환해서 하나하나 분석하고 있거든요~
    그런데 이런 식으로 미디 포맷대로 해서 모든 곡을 미디로 표현할 수 있는 건가요?
    제가 하는 게 악보에 그려진 곡을 미디로 재생하는 작업을 하고 잇는데 가능할 지 궁금하네요~~~

    답장 기다리겠습니다!!!
    참고로 제 메일은 rjsrkd0084@naver.com입니다~

    ps. 미디에 관해서 이렇게 자세한 (한국어로 된)설명은 첨봅니당~
    많은 도움이 될 것 같네요!!!^^

  • 게스트 썸네일
    2013.02.24 00:08

    비밀댓글입니다

    • 게스트 썸네일
      2013.02.25 06:12 신고

      마음에 드신다니 다행이에요~
      출처만 남겨주신다면 저야 감사하지요ㅎㅎ

  • 게스트 썸네일
    박진범
    2013.12.18 20:50 신고

    안녕하세요 프로젝트 진행중인 학생입니다.
    질문 좀 드리고 싶어서요..
    지금 c#기반의 멀티패드 피아노 솔루션을 진행중인데 악보 인식후에
    그것을 MIDI파일로 변환 & MIDI파일을 읽어서 악보로 표현하는 작업에서 막혀서 진전이 없어서요..
    이렇게 16진수로 하나하나 변환해서 코딩을 해야하는지 아니면 DLL이 따로 존재하는지 알고싶습니다.

    혹시나 시간 되시거나 알고계시면 좀 부탁드려요 ㅜㅜ
    제메일은 spingpark@naver.com 네이트는 spingpark@nate.com입니다 ..

    이 글로 조금 길이 열린 것같아 혹시나해서 남깁니다 ㅠ_ㅠ..

    • 게스트 썸네일
      2013.12.23 14:52 신고

      저도 예전에 c#으로 midi프로그램을 만들어본적이 있어요, 특히 .net에서 미디 프레임워크를 지원해주기 때문에 더욱 쉽게 작업할 수 있어요. 거기에 midi-dot-net과 같은 라이브러리들을 사용하면 더욱 편하실 거에요.(적어도 16진수 하나하나 변환하는 일은 없을거에요).
      대신 '악보이미지' <-> 'midi파일' 간의 변환에 있어 미디 메시지를 처리하는 부분을 구현하기 위해서는 조금 말끔하지 못한 방법을 사용하셔야 할거에요. 요새 일정이 잡힌것도 있고 한동안 midi를 다루지 않아서 바로 도와드리지는 못하지만 혹시나 여유가 되면 좀 더 자세하게 메일을 보내드리겠습니다!

  • 게스트 썸네일
    extr
    2015.03.17 22:43 신고

    좋은 자료 잘 보고갑니다!

  • 게스트 썸네일
    extr
    2015.03.17 22:43 신고

    좋은 자료 잘 보고갑니다!

    • 게스트 썸네일
      2015.11.03 23:20 신고

      오랜만에 다시보니 좀 더 쉽게 작성할수도 있었겠다는 아쉬웁도 있네요~

  • 게스트 썸네일
    2015.08.06 11:48

    비밀댓글입니다

  • 게스트 썸네일
    2015.08.06 11:48

    비밀댓글입니다

    • 게스트 썸네일
      2015.11.03 23:21 신고

      그건 파일포맷을 분석하는 엄청난 고생을 해야하지 않을까 싶습니다....

Holic Spirit :: Tistory Edition

design by tokiidesu. powerd by kakao.

티스토리 툴바