Index

  1. MIDI란?
  2. MIDI의 구조

MIDI (Musical Instrument Digital Interface) 란?

MIDI는 Musical Instrument Digital Interface 의 약자로서, 전자악기의 디지털 데이터를 주고 받기 위한 표준 규격이다.

MIDI의 구조

MIDI파일은 Chunk들의 집합으로서, 여러 개의 청크들로 구성되어있다. 청크는 다음과 같이 구성되며, 청크 타입은 크게 헤더, 트랙, 러닝 스테이터스로 구분할수 있다.

ds

Head 청크는 Mthd 로 표현되며, MIDI 청크 중 가장 앞에 단 하나만 존재한다. Head 청크의 길이는 14바이트이며, 다음과 같이 구성된다.

head

  1. Mthd: Head 청크의 가장 앞에서 해당 청크가 Head 청크임을 나타내주는 역할. 4D 54 68 64 로 고정됨.

  2. Length: Head 청크의 길이를 나타내주는 역할. 00 00 00 06으로 고정됨.

  3. Format: 음표, 박자, 트랙의 정보를 표시하는 역할. 00 00, 00 01, 00 02 세 가지로 정의될수 있으며, 각 의미는 다음과 같다. 00 00: 음표와 박자 정보를 갖는 하나의 단일 채널 트랙만이 존재함,00 01: 동시에 재생되는 1개 이상의 트랙으로 이루어짐. 00 01 포맷의 첫 번째 트랙은 Tempo Map이라고 일컬어지며, Time signature, Set tempo 등의 Meta events를 반드시 포함해야 한다. 00 02: 동시에 재생되지 않는 1개 이상의 트랙으로 이루어짐.

  4. Track numbers: 트랙의 개수를 나타내주는 역할.

  5. Division: 1delta time(단위 시간)이 어느정도의 길이를 나타내는지 의미함. Division이 양수일 시 1개의 4분음표를 n개로 나눈 값을 뜻하며, 음수일 시엔 하위 1바이트값은 프레임 당 Ticks(1초 / Frame * Ticks = 1delta time)를 나타내고, 상위 1바이트중 7비트는 초당 프레임 수를 나타낸다.

Track

Track 청크는 Header 청크가 끝난 뒤에 연속적으로 위치하며, 청크 데이터 부분이 트랙 이벤트 정보들로 구성된다.

track

  1. Mtrk: Track청크 가장 앞에 위치하여 해당 청크가 Track청크임을 알려주는 역할(4D 54 72 6B 고정).
  2. len: 트랙 데이터 길이를 나타내는 역할.
  3. delta time: 해당 이벤트가 미디가 시작하여 어느 시점에 발생할 이벤트인지를 결정하는 역할.
  4. Event data: Meta event, System event, Midi event로 구분됨.
    1. Delta TimeDelta time은 이벤트를 발생할 시점 정보를 가지고 있는 필드로서, 1~4바이트를 차지하는 가변 길이 필드이다. Delta time이 0x80(1000 0000(2))이상이라면 다음 바이트도 Delta time으로 활용하며, 이 경우엔 Delta time을 나타내는 각 바이트의 첫 번째 비트를 다음 바이트도 delta time에 해당하는지의 여부로 0(False) 과 1(True)을 사용하여 나타낸다.
    2. Event dataEvent data의 종류는 Delta time 뒤의 첫 번째 바이트를 통해 확인할 수 있다.
    3. Key signature0xFF 59 02 sf mi로 구성된다. sf는 –7에서 7 사이의 값으로, 0을 기준으로 가지며, 1에서 7로 올라갈수록 #이 1개~7개로 늘어나며, -1에서 –7로 내려갈수록 b이 1개~7개로 늘어난다.mi는 0 = Major, 1 = Minor로 나타낸다.

byte값 Event data 종류
0xFF meta event
0xF0 ~ 0xFE system event
0x00 ~ 0xEF midi event
  • Meta event
    Delta time + 0xFF + Meta data로 구성되는 이벤트이다.0xFF 이후의 1바이트 값에 따라 의미가 달라진다.
Status Byte 2nd byte other bytes Description
FF 00 02 ss ss Set track’s sequence #
FF 01 nn tt… Any Test user wants
FF 02 nn tt… Text for copyright info
FF 3 nn tt… Track name
FF 4 nn tt… Track instrument name
FF 5 nn tt… Lyric
FF 6 nn tt… Marker
FF 7 nn tt… Cue point
FF 20 01 channel Channel prefix
FF 21 01 pp Midi port
FF 2F 00 End of Track
FF 51 03 tt tt tt set tempo
FF 54 05 hh mm ss ff sf / hour/minute/second/frame/subframe set tempo SMPTE offset
FF 58 04 nn dd cc bb/numerator/ denominator/ Metronome ticks #/ 32nd notes# per quarter note Time signature
FF 59 02 sf mi key(sharp/flat#) scale (0: major 1:minor) Key signature (C when key = 0)
FF 7F nn tt… Sequencer specific info
  • Set tempo
    4분음표를 어느 길이만큼 연주하는지에 대한 값이다. 0xFF 51 0x tt tt tt 와 같은 형태로 진행하며 tt 부분은 microsecond를 의미한다. 예를 들어 0xff 51 03 07 A1 20 으로 진행하면 07A120(500000)microsecond/4분음표 라는 뜻이며, 이는 4분음표를 0.5초동안 연주하라는 뜻이다.

  • Time signature
    박자표와 메트로놈 및 32분음표가 4분음표 몇 개로 구성하는지 나타내는 값이다.0xFF 58 04 nn dd cc bb 로 나타난다.nn부분은 박자표의 분자 부분을 나타내며, dd부분은 박자표의 분모 부분을 2dd 형식으로 나타낸다. cc는 메트로놈의 주기를 나타내며, bb는 특수한 상황이 아닐 시 8로 고정된다.
    예) 0xFF 58 04 06 02 18 08 = 6/4 박자, 24번의 주기마다 메트로놈이 쳐짐.


System Event

Byte Description
0xF0 ~ 0xFE 상태 바이트 뒤에 데이터 길이(NN)와 데이터(DD)가 위치
0xF1 DD 상태 바이트 뒤에 MTC Quarter Frame 데이터(1바이트)가 위치
0xF2 pp pp 상태 바이트 뒤에 MTC Quarter Frame 데이터(2바이트)가 위치
0xF3 ss 상태 바이트 뒤에 Song select 데이터가 위치
0xF4 ~ 0xFE 상태 바이트만 존재함

Midi Event

Byte Description
8X Note off(소리 끄기)
9X Note on(소리 내기)
AX Key after touch(건반을 누른 뒤 다시 압력을 가함)
BX Control Change(효과 바꾸기)
CX Program change(악기 바꾸기)
DX Channel after touch
EX Pit wheel change

*X = Channel#

  1. Note on/off8X(9X)
    바이트 이후에 0~127 사이의 건반 번호가 위치하며, 다음 바이트에 소리의 세기가 위치한다. 다만, 9X 이벤트에서 소리의 세기가 0일때는 Note off로 간주할수 있다.
    예) 91 40 54 = Note on, 채널 1, 65(0x40+1)번째 건반, 0x54의 세기

  2. Key after touch
    상태바이트 이후의 바이트는 건반 번호와 누르는 속도를 나타낸다.

  3. Control change
    상태바이트 이후의 첫 번째 바이트는 컨트롤 번호이며, 두 번째 바이트는 새로운 값이다.

  4. Channel after touch
    상태바이트 이후의 바이트는 건반 번호와 누르는 속도를 나타낸다.

  5. pitch wheel change
    3개의 바이트로 구성된다. 2nd 바이트 이후의 바이트는 least 값을 나타내며, 다음 바이트는 most값을 나타낸다.

Running Status

0x80~0xEF 사이의 값을 갖는 동일한 Status code를 사용하는 메시지가 반복되어 전송될 때, Status가 없을 때 이전 Status를 다시 사용하게 하여 데이터 효율을 높힌 것이다.


본 포스팅은 Music Transfer팀원의 보고서를 기반으로 작성되었습니다