나머지/midiSpec

표준 미디 파일 1.0 / 메타이벤트

일단은생각해놓은닉넴이없음 2020. 3. 2. 12:46
※영어 시바러ㅣㅏㅁ어깅기ㅏㅇ리ㅣ아라ㅏㅏ아악아 영어 씨발아 영어씨발 뭔소린지 모르겠네.

메타이벤트

몇몇 메타이벤트가 이 문서에 정의돼있다. 모든 프로그램이 모든 메타이벤트를 지원할 필요는 없다.

※딱 보니까 메타이벤트는 이렇게 구성된다.

FF [유형] [길이(가변길이량)] [전송될 바이트들 모두]

※여기서 [이 괄호]로 둘러싼 부분은 메시지 만드는 사람이 알아서 넣는 거고 아니면 미리 정해진 수(16진수)이다.

  • 각 이벤트를 시작하는 FF(※메타이벤트는 FF로 시작한다. 메타바이트의 상태바이트), 각 이벤트의 타입, 가변량의 데이터가 없는 이벤트의 길이는 직접 16진수로 주어진다(※즉, 이벤트의 길이가 고정이면 그 고정값을 직접 16진수로 써주고, 길이가 가변적이면 대충 len으로 표시한다는 소리).
  • ddse 따위의 소문자 두 자로 구성된 기호는 8비트 값을 `mnemonically 나타낸다.
  • wwww같이 같은 소문자 네 자는 16비트 값을 나타내며, `significant바이트순으로 저장된다.
  • tttttt같이 같은 소문자 여섯 자는 24비트 값을 나타내며, 상위바이트순으로 저장된다.
  • len 표시는 메타이벤트 구문의 부분을 나타낸다. 이것은 숫자인데, 메타이벤트에서 그 뒤에 데이터 바이트가 얼마나 많이 따르는지를 지정하는 가변길이 량으로서 저장된다.
  • 텍스트 기호와 데이터는 길이가 데이터를 얼마나 많은 바이트(텍스트일 수도 있음) 수만큼 지정했는지를 가리킨다.

일반적으로, 한 트랙에서 동시에 발생하는 메타이벤트들의 순서는 상관이 없다. 저작권 이벤트가 쓰일 경우, 파일 내에서 가능한 한 일찍 위치해야 쉽게 발견될 수 있다. 시퀀스 번호와 시퀀스/트랙이름 이벤트는 있을 경우 반드시 0시에 나타나야 한다. 트랙끝 이벤트는 반드시 트랙의 마지막 이벤트로 발생돼야 한다.

처음에 지정된 메타이벤트들은 다음과 같다.

바이트이름설명
FF 00 02 [시퀀스번호]시퀀스 번호
  • [시퀀스번호]: 2 바이트

시퀀스 번호를 지정하는 이벤트. 있어도 없어도 된다. 이 이벤트의 발생은 반드시 트랙의 시작점에서, 그 어느 0이 아닌 `델타타임보다도, 그 어느 보내지는(`transmittable) 미디이벤트보다도 앞서야 한다. 2형식 미디파일에서 각 "패턴"을 식별할 때 쓰인다. 그래서 패턴을 참조하려고 큐메시지(Cue message)를 쓰는 "노래" 시퀀스. (`In a format 2 MIDI file, it is used to identify each "pattern" so that a "song" sequence using the Cue message to refer to the patterns.????? 내가 영알못이라 그러는데 왜 so that 다음에 동사가 안 나오는지 설명좀.) ID번호가 빠져있으면 파일 내에서의 시퀀스들의 위치가 기본값으로 쓰인다. 시퀀스가 하나밖에 없는 0이나 1형식 미디파일에서는 첫 트랙에 이 숫자가 들어있어야 한다. 여러 다중트랙 시퀀스의 전송은 각기 다른 시퀀스 번호를 가진 1형식 파일의 묶음으로서 수행돼야 한다.

FF 01 [길이] [텍스트]텍스트 이벤트

`Any amount of text describing anything. It is a good idea to put a text event right at the beginning of a track, with the name of the track, a description of its intended orchestration, and any other information which the user wants to put there. Text events may also occur at other times in a track, to be used as lyrics, or descriptions of cue points. The text in this event should be printable ASCII characters for maximum interchange. However, other character codes using the high-order bit may be used for interchange of files between different programs on the same computer which supports an extended character set. Programs on a computer which does not support non-ASCII characters should ignore those characters.

Meta event types 01 through 0F are reserved for various types of text events, each of which meets the specification of text events(above) but is used for a different purpose:

FF 02 [길이] [텍스트]저작권 알림

인쇄가능한 아스키(ASCII) 텍스트인 저작권알림이 들어있음. 이 표시엔 저작권자, 저작권 년도, (C) 문자가 있어야 한다(※없어도 오류는 아닌데 걍 원래 저작권 표시는 이렇게 한다는 뜻인 듯.). 미디파일에서 음악의 몇몇 부분이 같으면, 저작권알림은 이 이벤트 안에 모두 함께 위치해야 하며 그것이 파일의 시작이 된다. 이 이벤트는 0시에 첫 트랙청크의 첫 이벤트가 돼야 한다.

FF 03 [길이] [텍스트]시퀀스/트랙 이름

0형식 트랙 또는 1형식 파일의 첫 트랙의 경우엔 시퀀스 이름이고 아니면 트랙 이름이다.

FF 04 [길이] [텍스트]악기 이름

해당 트랙에서 쓰일 악기의 종류를 설명. 이 설명이 어느 미디채널에 적용되는지 지정하려고 `MIDI Prefix meta-event와 함께 쓰일 수도 있다. 혹은, 이벤트 자체 안에서 채널이 텍스트로 지정될 수도 있다.

FF 05 [길이] [텍스트]가사

불리는 가사. 그 이벤트의 시간에 시작하는 가사이벤트로 각 음절이 떨어지는 게 보통이다.

FF 06 [길이] [텍스트]마커

보통은 0형식 트랙이나 1형식 파일의 첫 트랙에. 리허설 문자 (`?그게 뭐임?) 또는 섹션 이름 따위의 시퀀스에서 그 점의 이름 ("1절" 등) (`????)

FF 07 [길이] [텍스트]큐 포인트(Cue Point)

악보의 해당 지점에서 영화, 화면, 무대에서 일어나는 일을 설명 (“차가 집으로 돌진”, “커튼 젖히기”, “여자가 남자 뺨때림”, 기타 등등)

FF 20 01 [cc]`MIDI Channel Prefix
  • [cc]: 1 바이트

이 이벤트에 포함된 미디채널(0~15)은 시스템독점과 메타이벤트를 포함해서 뒤따르는 이벤트 모두를 미디채널 하나와 연결짓는 데 쓰일지도 모른다. (`그래서 뭐가 어떻게 된단 소린지 1도 이해를 못한 빡머갈 1인 is here.) 그 다음 평범한 미디이벤트 (채널을 포함하는 것) 또는 그 다음 MIDI Channel Prefix meta-event가 나오기 전까지 이 채널은 "유효"하다. 미디채널이 "트랙"을 `refer to는 경우, 이 메시지는 여러 트랙들을 0형식 파일으로 뭉쳐놓을 수 있으면서도 트랙 하나에 연관된 비(non)미디데이터를 유지한다. 이 기능은 Yamaha의 ESEQ 파일 형식으로도 제공된다. ※그래서 [cc] 부분에 넣어야하는 정보가 뭐라는 건지 이해를 못한 1ㅅ

FF 2F 00트랙끝

이 이벤트는 선택사항이 아니다. 이것이 트랙에 포함되어 트랙은 정확한 끝점이 지정되고 정확한 길이를 가진다. 반복되(`looped)거나 연쇄될(`concatenated) 트랙에 필수적이다.

FF 51 03 [빠르기]빠르기(tempo) 설정, 미디 4분음표 하나당 천분초 수로 표현됨
  • [빠르기]: 3 바이트

이 이벤트는 빠르기 변화를 지시한다. “4분음표 하나당 천분초 수”를 표시하는 다른 방법은 “`24ths of a microsecond per MIDI clock”이다. 시간당 박자수 대신 박자당 시간으로 빠르기를 표시하면, SMPTE 시간 코드 또는 미디 시간 코드 같은 시간 기반의 동기 프로토콜로써 절대적으로 정확한 장기적 동기화가 된다. 이 빠르기분해도(tempo resolution)가 제공하는 만큼의 정확도로는 분당 120박의 4분짜리 토막 하나가 만 분의 5초 이내로 정확히 끝난다. 이상적으로는 이 이벤트들은 미디클럭이 있을 곳에서만 발생한다. 이 규약은 다른 동기화 장치들과의 호환성을 보장 또는 가능성이라도 올리려는 것이다. 그래서 이 형식으로 저장된 박자표/조표 맵이 다른 장치로 쉽게 옮겨질 수 있다.

FF 54 05 [hr] [mn] [se] [fr] [ff]`SMPTE Offset
  • [hr], [mn], [se], [fr], [ff]: 각각 1 바이트

`This event, if present, designates the SMPTE time at which the track chunk is supposed to start. It should be present at the beginning of the track, that is, before any nonzero delta-times, and before any transmittable MIDI events. The hour must be encoded with the SMPTE format, just as it is in MIDI Time Code. In a format 1 file, the SMPTE Offset must be stored with the tempo map, and has no meaning in any of the other tracks. The ff field contains fractional frames, in 100ths of a frame, even in SMPTE-based tracks which specify a different frame subdivision for delta-times.

FF 58 04 [nn] [dd] [cc] [bb]박자표

(※4분의3박자 하는 그거)박자표는 숫자 네 개로 표현된다.

  • [nn]: 1 바이트. 박자표의 분자
  • [dd]: 1 바이트. 박자표의 분모는 2의 n승만 가능한데 여기서 그 지수 n을 담당함.
  • [cc]: 1 바이트. 메트로놈 1 째깍 안의 미디클럭 수를 나타낸다. (※여기 메트로놈 어딨냐??? 설마 그냥 "1박"을 길고 어려운 말로 늘어놓은 건 아니겠지?)
  • [bb]: 1 바이트. 미디가 4분음표(24 미디클럭)를 뭐라 생각하는지에서 기록된 32분음표의 수. 미디가 4분음표(24 clocks)를 뭐라 생각하는지가 다른 뭔가로 기록되거나 연관될 거라고 명기하길 사용자에게 허락하는 여러 프로그램이 이미 있기 때문에 덧붙은 것이다.(※`도대체 뭔소리????)the number of notated 32nd-notes in what MIDI thinks of as a quarter-note (24 MIDI Clocks). This was added because there are already multiple programs which allow the user to specify that what MIDI thinks of as a quarter-note (24 clocks) is to be notated as, or related to in terms of, something else.

Therefore, the complete event for 6/8 time, where the metronome clicks every three eighth-notes, but there are 24 clocks per quarter-note, 72 to the bar, would be (in hex):

FF 58 04 06 03 24 08

That is, 6/8 time (8 is 2 to the 3rd power, so this is 06 03), 36 MIDI clocks per dotted-quarter (24 hex!), and eight notated 32nd-notes per MIDI quarter note.

FF 59 02 [올림내림표개수] [장단조]조표

(※다장조 마단조 하는 그거)

  • [올림내림표개수]: 1 바이트. +n이면 올림표 n개, -n이면 내림표 n개. -7에서 7까지
  • [장단조]: 1 바이트. 0이면 장조, 1이면 단조.
FF 7F [길이] [data]Sequencer-Specific Meta-Event

`Special requirements for particular sequencers may use this event type: the first byte or bytes of data is a manufacturer ID (these are one byte, or, if the first byte is 00, three bytes). As with MIDI System Exclusive, manufacturers who define something using this meta-event should publish it so that others may know how to use it. After all, this is an interchange format. This type of event may be used by a sequencer which elects to use this as its only file format; sequencers with their established feature-specific formats should probably stick to the standard features when using this format.