STANDARD MIDI FILE의 개요(홍사철)
STANDARD MIDI FILE (SMF)... |
|
|
이번에는 SMF 즉 STANDARD MIDI FILE에 대한 궁금했던 내용들을 주제로 적어 보도록 하렵니다.
이미 음악 SOFT 세계에는 STANDARD한 Sequencer(시퀀서)의 MIDI FORMAT으로서 조용히 공통 수단으로 적용해 왔었으나 전 세계적인 MIDI 규격으로서는 오랫동안 인정되지 않고 있었든 게 사실 이였습니다. MIDI의 보급에 따라 서로 다른 컴퓨터 기종간의 호환, 또는 여러 종류의 서로 다른 음악용 SOFT에서의 호환성과 또 다른 기종과 기종간의 차이를 극복하고자 GM 즉 General midi를 비롯, DATA의 호환성이 중요시되어지게끔 된 것으로 점차 RP 즉 Recommended Practice( MIDI의 운용법)라고 하는 형식으로 정의 되어지기에 이르렀습니다. |
|
(이하 설명에서 이 약어를 주로 사용함) GM =(제너럴 미디) RP =( 미디운용의 예 ) SMF=(스탠더드 미디 화일) |
|
CONTENTS |
INTRODUCTION |
RP와 STANDARD MIDI FILE |
|
SMF의 주된 목적 |
|
SMF의 주 개요 |
CHAPTER 1 |
시퀀서 트랙과 각부의 구성 |
|
SMF 1.0 |
|
해더죤 과 트랙죤 |
CHAPTER 2 |
DATA교환시의 문제 |
|
SMF의 호환성 |
CHAPTER 3 |
음악 제작 프로세서에 SMF에 의한 SMF의 활용법 |
|
DATA 교환 도입 |
CATALOG |
SMF 대응기기 카탈로그 |
|
SMF대응기기 |
|
|
오랫동안 현안이 되어왔던 Sequencer(시퀀서) 데이터 포맷의 통일. 시퀀서 사이에서 연주데이터를 상호 이용하기 위해서는 공통으로 사용할 수 있는 DATA FORMAT이필요합니다. 각 MAKER의 Sequencer 기능과 성능 등의 레벨차도 거의 없어진 현재, 더욱더 그 중요도를 높이고 있습니다. |
RP와 SMF (미디운용의 예와 스탠더드 미디 화일) |
|
RP와 SMF (미디운용의 예와 스탠더드 미디 화일) MIDI규격은, 일본의 MIDI규격 협의회인 JMSC와 일본이외의 각국을 관할하는 미국의 MMA (MIDI MANU FACTURERS ASSOCIATION)에 의해 관리되고 있습니다. 현재 규격서의 최신 판은 1989년 발행한 4.1판인데, MIDI 규격의 개정, 추가 등은 JMSC와 MMA에 의해 필요에 따라 수시로 협의되고 있습니다. 그리고, 규격으로 승인되어진 것은 C/A (CONFIRMATION OF APPROVAL)로 수시 발행되고 있는 것입니다. 최근에는 MIDI의 보급에 따라, 당초 상정되어 있던 악기와~악기간, 악기와~컴퓨터간뿐 아니라, 예를들어 CD-G + MIDI(음악용 CD 디스크와 MIDI를 첨가한것), CD-ROM, CD-I등 읽어내기 전용(Rwad Only)매체에 MIDI 데이타를 수록 시킨것 등등 여러 경우에서 MIDI가 이용되어지게끔 되어왔습니다. 각종, 소위 멀티 미디어에 음악을 수록할 때에도 MIDI 데이타는 소리 신호(Sampling)보다 훨씬 데이터를 적게 차지하므로 많은 멀티미디어 플렛폼에서 MIDI의 채용이 검토되고 있고 일부는 벌써 채택되어 있습니다. 그러나 여러가지의 장점에도 불구하고 접속해서 곧바로 사용할 수 있도록 하기 위해 재생할 원음의 종류를 지정해서 데이타를 준비해야 하는 불편한 점도 있습니다. 근래에 들어서 컴퓨터 상에서 음악을 즐기는 이른바 DTM(Desk Top Music)이 널리퍼지고 있으나, 음색의 Mapping외에 드럼 음색을 건반으로 Mapping 하는 것 등도 사용하는 악기의 종류에 따라서 결과가 다를수 있으며. 그렇기 때문에 어떤 특정한 음원용으로 작성된 연주 데이타를 다른 음원으로 재생할 수 있도록 수정하는 것은 상당히 복잡하고 어렵게 됩니다. GM system Level 1 은 이러한 연주 데이타의 호환성을 필요로 하는 용도를 위해 연주 재현에 최저로 필요한 공통 부분을 정하는 공통음원 수단으로서 수년전에 제안 되었으며. 종래의 MIDI규격에서는 다 커버할 수 없는 이들 새 운용 예를 보다 유연하게 처리하기 위해 도입된 것이 RP(RECOMMENDED PRACTICE)입니다. 그러므로 RP는 MIDI규격의 일부가 아니라 JMSC와 MMA에 의해 합의되어진 MIDI의 운용 예라고 말해야만 하는 것입니다. JMSC및 MMA는 RP문서의 관리를 행하고 있습니다만, 그 운용은 각 RP를 채용하는 각 회사의 책임에 있어서 이루어집니다. 각 RP는, 반드시 그 운용 예에 있어서의 유일한 표준을 정하는 것이 아니라 채용여부는 각 회사의 판단에 맡겨지고 있는 것입니다. |
(2)SMF의 주된 목적 (스탠더드 미디화일의 주된 목적) |
|
SMF는, 1988년에 DAVE OPPENHEIM (OPCODE SYSTEM 사장)에 의해 MMA에 제안되었습니다. 당시 MMA를 통해 JMSC에 규격검토 의뢰가 왔었습니다만, 일본에서는 MIDI규격으로 승인되지 않아 성립하지 못했습니다. JMSC에서는 MIDI란 MIDI출력과 MIDI입력을 연결하는 MIDI케이블상의 송신 컨트롤이며 그 이외는 MIDI규격의 범위가 아니다라고 하는 입장을 취해왔기 때문입니다. Sequencer(시퀀서) 포맷의 통일은 다른 기종간의 DATA 상호 이용을 가능하게 해줍니다. 특히, DATA BUSINESS에는 커다란 장점이 있기 때문에 SOFT MAKER로서는 절실한 희망사항임은 말할 것까지도 없습니다. SOFT MAKER를 중심으로 구성되어져 있는 MMA에서 맨 먼저 제안되어진 것도 수긍이 가는 일이겠지요. 또한 USER로서도 간단하게 다른 Sequencer(시퀀서) DATA를 이동하여 사용할 수 있다면 그 편리한 점은 더더욱 말할 것도 없습니다. 그러므로 Sequencer(시퀀서) 기능은, DATA FORMAT에 크게 영향받습니다. 그러나 FORMAT의 통일을 위해선 각 메이커마다의 특색을 살릴 수 있었던 Sequencer(시퀀서)의 기능을 제약할지도 모르기에 기능이 다양해야만 하고 저마다 상품가치를 위해 독특한 기능을 내 세우고 있던 Sequencer Maker에게 있어서는 결코 바람직하다고는 말할 수 없는 것입니다. 따라서 내부 FORMAT에서는 독자적인 FORMAT를 채용하면서도, SMF의 SAVE와 LOAD등에서는 컴버터로 대응한다는 게 일반적이 되었습니다. 결과적으로 SMF는 홀로 걸어가기 시작한 것입니다. 그후 어찌 되였든 호환성의 중요도로 인하여 무시 또는 방관할 수도 없게 된 각 SOFT메이커들은 OPCODE의 "Sequencer(시퀀서)2.5" 시작으로 대부분의 Sequencer SOFT에서 SMF방식이 채용되어지게 됩니다. 아직 이것은 MIDI규격으로 승인된 것도 아닌데도 그 명칭에서 풍기듯 SMF(STANDARD MIDI FILE) 마치 STANDARD 인 것 같이 소문이 났기 때문이겠지요. SMF가 널리 퍼져 나간 것이 RP의 탄생을 촉진했다고 말해도 과언은 아닙니다. SMF는 그 명예에서도(?) RP의 제 1번에 등록되었습니다. 결국 나 몰라라 하던 JMSC로서도 MIDI의 다양화에 대처할 필요가 생겨난 것입니다. 그래서 결국은 다음과 같은 JMSC와 MMA 간의 RP에 대한 합의가 이루어집니다.
RP-001 STANDARD MIDI FILE(스탠더드 미디 화일) RP-002 MIDI CONTROL RP-003 GM 시스템 레벨1 RP-009 화일 덤프 RP-012 미디 튜닝 RP-013 미디머신 CONTROL |
(3)SMF의 주된 개요
* 가변할 수 있는 FORMAT이다. |
|
필요에 따라 DATA BITE수와, 델타 TIME의 바이트수 등이 증감할 수 있다. 튜닝 스테이더스도 사용할 수 있기 위해, 메모리를 효율 좋게 사용할 수 있게 한다. |
* 심플한 구조 |
|
기본은, MIDI 채널 메시지부터 구성되어 있으며 거기에 델타 TIME을 덧붙인 것이라 생각해 주십시오. NOTE ON 과 NOTE OFF는 별도의 이벤트로 취급되어지므로, 연주 PROGRAM의 부하를 최소한으로 할 수 있습니다. MIDI이벤트와 다른 점은, 시스템 메시지입니다. 특히 Exclusive는 F0스테이더스 외에 스테이더스에 의한 전송이 정의되어 있습니다. 또한, 델타 TIME의 시간단위에는 2개의 FORMAT이 준비되어 있으며, 통상 시퀀서에서 사용되어지는 상대 시간외에 TIME CODE에 대응하는 절대 시간표기가 가능합니다 |
* 3개의 FORMAT이 있다 |
|
통상은 복수트랙을 가지는 FORMAT 1 이 편리합니다. MIDI채널은 시퀀서 SOFT로 트랙에 대해 지정되어 연주되는 일이 많이 있습니다. 그러나 각 트랙에는 멀티채널로 들어올 가능성이 있으므로 시퀀서 PROGRAM은 이러한 것에 아무 문제가 없도록 대응해야만 합니다. 단순한 연주DATA의 주고받기(교환)에는 1트랙/멀티채널의 DATA로 구성되는 FORMAT O이 사용됩니다. 대개의 시퀀서 SOFT는 FORMAT O이나 1,내지는 그 양쪽으로 대응하고 있습니다. SMF에서는 또 한가지, FORMAT 2라고 하는 게 정의되어 있는데, 이는 한 MAGNETIC MUSIC의 TEXTURE정도밖에 대응하고 있지 않습니다. 이것은 주로 드럼머신의 시퀀서용으로, 시퀀서 패턴을 지정하여 연주하기 위한 FORMAT입니다. |
* 소절선의 개념이 없다. |
|
소절 선에 상담하는 이벤트는 정의되어 있지 않기 때문에, 대부분의 시퀀서가 행하고 있는 소절위치에는 계산이 필요합니다. 메타 이벤트에 정의 되어있는 박자에서 소절위치를 산출해 내는 것 외는 없습니다. 박자를 소절선의 대응으로서 하고 있는 PROGRAM도 있습니다만, 어디까지나 각자가 편리한대로 적용한 즉 로컬한 사용방법인 것입니다. |
(STANDARD MIDI FILE 1.0) |
|
이 글은 MMA/JMSC의 자료를 토대로 발췌하여 기록한 것으로, MIDI규격협의회에서 발간한 참고자료나 더 정확한 정보를 필요로 하실 경우에는 "자료실"에 수록된 MIDI SPEC Package 나 RP-001(영문)을 참조하시기 바랍니다. |
(4)SMF의 주목적 |
|
SMF의 주된 목적은 연주 DATA의 호환성을 얻는 것입니다. 동일, 또는 다른 컴퓨터상의 서로 다른 음악 SOFT(시퀀서 프로그램)상에서, 시간정보를 포함하는 MIDI DATA를 상호간에 서로 이용할 수 있도록 하는 것입니다. 이 FORMAT은 DATA를 콤팩트하게 하는 것을 목표의 하나로 하고 있으며, DISK BASE 의 FILE FORMAT에는 최적이라고 말할 수 있습니다. 그러나 시퀀서 프로그램이 신속하게 억세스하여 연주하거나, 편집을 행하는데는 부적당한 면이 있습니다. 이 때문에 MIDI FILE은 직접 연주하는 것이 아니라 DATA의 주고받기에 이용되어지고 있습니다. 화일 의 불러들이는 중이나, 뽑아 쓰는 중에 억세스 하기 쉬운 FORMAT으로 변환하는 것이 연주나 EDIT에는 편리합니다. 물론, 시퀀서 프로그램의 화일 포맷을 SMF로 하는 것도 가능합니다만, 그것을 의도한 것은 아닙니다. 콤팩트한 재생 전용프로그램 FILE로서는 최적이겠지요. |
(5)SMF포맷의 특징 |
|
SMF의 포맷은 MIDI이벤트+타이밍 정보라고 하는 매우 심플한 구조를 하고 있습니다. 각 MIDI이벤트마다 시간정보를 가지고 있으며, MOTE ON과 OFF는 별도 취급합니다. (게이트타임(음표의 시간적 진행)으로 관리하는 타입은 아닙니다.) 덧붙여 SONG, 시퀀서, 트랙구조, TEMPO, 박자기호 등이 지원되고 있습니다. 트랙명과 그 외의 기술 정보 등은, MIDI DATA와 같이 FILE로서 스토어 할 수 있습니다. 멀티 트랙및 멀티 시퀀서를 서포트(지원)하고 있으므로 멀티 트랙, 시퀀서를 가지는 사용자(USER)가 SMF를 사용하여 다른 시퀀서로 전송하는 것이 가능합니다. 스팩 7에서는, SMF에서 사용되어지는 8 BIT, 바이널리 데이터 예를 정의하고 있습니다. 본FORMAT 중의 DATA를, 바이널리 FILE로 스토어 하는 것, 4 BIT마다 분할하거나 효율적으로 MIDI에서 전송하기 위해 7 BIT로 변환하는 것, 16진 ASC(2)문자로 변환하는 것 프린트 가능한 텍스트 FILE로 변환하는 것 등 어느 것이나 가능합니다. 또한, 본 스팩에서는, 8 BIT의 내용에 대해서 정의하고는 있습니다만, MIDI 상에서 어떻게 전송되어지는지에 대해서는 정의하고 있지 않습니다. FILE전송에 관한 MIDI 프로토클, 통할 적으로 결정되어지는 것입니다. RP로서 정의되어있는 FILE, DUMP, STANDARD를 참조해도 좋겠지요. |
(6)시퀀서 트랙과 각부의 구성 |
|
<가변길이 수치표현에 대해>
본서에서는, BIT 0은 1 BITE의 최하위 BIT를, BIT 7은 최상위 BIT를 의미하고 있습니다. SMF중의 수치는 대부분의 경우, 가변길이 수치표현이라 불리는 형식으로 표현됩니다. 이들 수치는, 1 BIT당 7 BIT로 MSB(상위BITE)를 선두로 하여 표현됩니다. 그리고 BIT 7을 블록으로 사용하여, 최후의 1 BIT를 제외하는 모든 BITE의 BIT 7에는 1이 SET 되는 것입니다. 최후의 1 BIT 의 BIT 7에는 0이 SET 되어져, 이것을 블록으로서 수치의 구분을 구별할 수 있는 것입니다. 가변길이 수치표시는 수치를 효율 좋게 메모리 할 수 있어, 그 치의 범위가 무한에 가깝습니다. 그 대신 써넣기/불러내기 시에는 BIT 쉬프트 등의 연산처리가 필요합니다. 또한 SMF에서는, 일단 상한이 정해져 있으며, 최대 4 BIT 까지 입니다. 32 BIT(4BITE)가변길이 수치표현에 의해 표현가능한 최대의 수치는 0FFFFFFF입니다. SMF에서 취급하는 수치중 가장 큰 값을 취할 가능성이 있는 게 델타 TIME 입니다만, 설사(만약) TEMPO 500으로 1박 분해능(TIME BASE)을 96으로 한 경우라도, 2*10(8)은 약 4일간의 길이에 상당합니다. 이것은 델타 TIME의 길이로서는 지나치게 충분한 값이겠지요.
(FILE) 어떠한 FILE SYSTEM에 대해서도, SMF는 단순한 8BIT 9BIT가 순서대로 나열된 형태로 되어있습니다. 메캔토시 상에서는 이 BITE열은 FILE의 DATA 훠크(FILE 타입 MIDI)이든가, 또는 클립보드(DATA 타입MIDI)상으로 스토어 됩니다. 그 외의 COMPUTER에서는 8 BIT BIT 열의 바이널리 화일로서 스토어 됩니다. 물론 이들 컴퓨터에서의 FILE명과 스토어의 방법 등은 필요에 따라 제정되어 있습니다.
가변길이 수치표현 의 예 수(16진수)표현(16진수) 00000000 00 00000040 40 0000007F 7F 00000080 81 00 00002000 C0 00 00003FFF FF 7F 00004000 81 80 00 00100000 C0 80 00 001FFFFF FF FF 7F 00200000 81 80 80 00 08000000 C0 80 80 00 0FFFFFFF FF FF FF 7F
(CHANK라는 것은) SMF는 얼마간의 블록(헤더정보와 트랙DATA등)에서부터 구성되고 있습니다. SMF에서는 이 블록을 쟝크라고 부르고 있는 것입니다. 각각의 쟝크에는, 그 쟝크의 기능을 나타내는 아스키 -4문자의 (TYPE)과 쟝크내의 DATA. BITE 수를 나타내는 32 BIT의 (DATA 길이)를 가지고 있습니다. SMF는 헤더쟝크(HEADER CHANK)와 트랙쟝크(TRACK CHANK)라 불리는 2종류의 쟝크를 가지고 있습니다. HEADER쟝크는, SMF전체에 관한 최소한의 정보를 가지고 있습니다. TRACK쟝크는 최대 16채널의 시간정보를 수반하는 MIDI DATA를 가지고 있습니다. 멀티 트랙, 멀티 MIDI 출력, PATTERN, 시퀀서, SONG의 개념은 복수의 TRACK쟝크를 사용하는 것으로 모두 표현가능합니다. SMF는 항상 하나의 HEADER쟝크로 시작되며, 1 이상의 TRACK쟝크가 그 다음에 이어지고 있습니다.
*** SMF의 구조 ***
"MThd" ( 4 bite ASCII data )Header Chank Data길이 ( 4 bite )Header data.Section |
Header.Chank |
Format 0
|
Format 1/2 |
"MTrk" ( 4 bite ASCII data )Header.Chank의 data길이 ( 4 bite )TRACK data.Section |
Track.Chank_1 |
"MTrk" ( 4 bite ASCII data )Header.Chank의 data길이 ( 4 bite )TRACK data.Section |
Track.Chank_2 |
" " " "" |
" " " "" |
"MTrk" ( 4 bite ASCII data )Header.Chank의 data길이 ( 4 bite )TRACK data.Section |
Track.Chank_(nn) |
(CHANK의 구조) 각각의 CHANK는 아스키 4문자의 타입에서 시작되고 있으며, Header쟝크는 'MThd', TRACK쟝크는 'MTrk'라고 기술되어 있습니다. 장래 새로운 쟝크 타입이 도입 되었다하더라도, 쟝크의 타입을 알아내는 것으로 얼른 알 수 있습니다. SMF의 프로그램을 작성할 경우 미지의 쟝크와 만났을 때는 그 DATA BITE 가 있는 부분을 무시할 수 있도록 해야만 합니다.
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
A |
B |
C |
D |
4D |
54 |
68 |
64 |
00 |
00 |
00 |
06 |
00 |
00 |
00 |
01 |
00 |
06 |
Chank.Type |
Data길이 |
Format 0 |
Track수 |
시간단위 96 |
"MThd" |
6 |
Format 0 의 경우 |
Time Base 96의 경우 |
( Header Chank의 구조 )
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
bit |
0 |
4분음표 분의 분해능 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
bit |
1 |
SMPTE Format |
1 프레임의 분해능 |
*24:*25:*29:*30: |
24 프레임 25 프레임 30 드롭프레임 30 논드롭 프레임
|
(2가지 시간 단위 포맷)
물론 멋대로 CHANK타입을 정의하여 사용할 수는 없습니다. 어떤 시퀀서에서는 LOCAL한 쟝크를 사용하고 있는 예가 있습니다만 이것은 룰 위반입니다. 다음에 최상위 BITE를 선두로 한 32 BIT의 DATA 길이 (데이터 길이 6은 00 00 00 06으로 스토어 되어있음)로 이어집니다. 이 데이터 길이는 여기에 이어지는 DATA의 길이이며, 아스키문자와 DATA 길이 자신의 8 BITE는 포함하지 않습니다. |
(7)SMF와 IFF FILE |
|
이 CHANK의 구조는 일렉트릭아트사의 IFF FORMAT과 같은 종류이기 때문에 IFF FILE 내에 간단히 받아 드릴 수 있습니다. 다만 SMF화일=IFF화일 일리는 없으므로 약간의 컴버트가 필요합니다. IFF FILE에로의 변환은, 홀수길이 CHANK를 보충, FORM쟝크 내부에 전체를 끼워 넣는 것으로 쉽게 행할 수 있습니다. |
(해더 쟝크와 트랙쟝크) |
|
<해더 쟝크> SMF의 제일 처음에 있는 HEADER CHANK에는, 그 FILE중의 DATA에 대해서의 얼마간의 기본 적인 정보가 기술되어 있습니다. HEADER 쟝크는 쟝크 TYPE, DATA길이, FORMAT, TRACK수, 시간단위로 구성되어 있습니다.
*쟝크 타입
앞에서 서술한 4가지 아스키문자는「MThd」를 말합니다. 「MT」는 반각 대문자, 「hd」는 반각 소문자입니다.
*DATA길이숫자(6)가 32 BIT 표현이며, 상위에서부터 순서대로 들어갑니다. 이어지는 DATA, SECTION에는 상위 BITE를 먼저 스토어 되어진 3가지의 16 BITE Word 를 가지고 있습니다.
*FORMAT
최초의 워드인 FORMAT는 FILE의 전체적인 구조를 지정하는 것입니다. 현재 3가지의 포맷이 정의되어 있습니다. 각 FORMAT에 대한 자세한 것은 뒤에 기술되어 있는 FORMAT항을 참조해주십시오.
포맷 0: 1 TRACK으로 구성된다. 포맷 1: 복수 TRACK으로 구성된다. 포맷 2: PATTERN TRACK을 포함한다.
*트랙 수
다음 WORD인 트랙 수는 FILE중의 트랙쟝크의 수입니다. FORMAT 0인 FILE에서는 1로 해야만 합니다.
*시간단위
3번째 WORD인 시간단위에서는 델타 TIME의 의미를 정의하고 있습니다. 시간단위에는 2종류의 FORMAT이 있으며, 하나는 기보상의 시간, 또 하나는 TIME CODE에 근거하고 있습니다. 시간단위인 Bit 15가 0이면, Bit 0에서부터 Bit 14에 의해 4분음표의 길이가 되는 델타 TIME의 수를 나타냅니다. 예를 들면, 시간단위가 96이고 2가지의 이벤트의 시간 간격이 8분음표일때, FILE중에서는 48로 표현되는 것입니다. 또 시간단위인 Bit 15가 1이면, FILE의 델타 TIME은 SMPTE및 MIDI의 TIME CODE (MTC)와 일관성을 유지할 수 있도록 1초 분수로 표현됩니다. Bit 8부터 Bit 14는, -24,-25,-29,-30의 4가지 값 어느 것이나 SMPTE및 MTC의 4종의 표준에 대응하고 있으며, 1초간의 프레임 수를 나타내고 있습니다. (-29는 30의 드롭 프레임에 대응) 이들 부수는 그의 보수 표현으로 스토어 됩니다. 제 2 Bit(정수로서 스토어)는 1프레임내의 분해 능을 보입니다. 전형적인 값은 4(MIDI TIME CODE 의 분해능), 8,10,80(BIT 단위), 또는 100이겠지요 이 시스템에 의해, TIME CODE BASE 에서 정확하게 표현하는 것이 가능합니다. 또, 25프레임/초에서 프레임당 분해 능을 40이라고 지정함에 따라 트랙을 밀리초 단위로 할 수도 있습니다. FILE의 이벤트를 30프레임 TIME CODE의 Bit단위로 스토어 할 때는, 시간단위의 워드는 16진수인 E250이 되는 것입니다.
(8)SMF의 FORMAT)
SMF에는 3가지 포맷이 현재 정의되어 있습니다. 포맷 2의 사용 예는 거의 없습니다.
*<포맷 0>
포맷 0의 화일 은, HEADER 쟝크와 그에 이어지는 트랙 쟝크로 구성됩니다. 이것은 가장 호환성이 높은 DATA가 되는 것으로 단순한 싱글트랙 PLAYER의 프로그램에서도 재생 가능하여 상당히 도움이 되는 것이지요. 간단한 프로그램에서도 연주할 수 있도록 설령, 복수트랙을 가지는 프로그램이더라도 이 포맷을 작성할 수 있는 점이 높이 평가되어집니다.
*<포맷1>
포맷1의 FILE은, HEADER 쟝크와 그에 이어지는 하나 이상의 트랙 쟝크로 구성됩니다. 복수의 동시 트랙을 서포트하는 프로그램 (복수의 트랙을 동시각에서 세로로 쪼개어 취급하는 포맷)에는 포맷 1이 적합합니다.
*<포맷2>
포맷2의 FILE은, HEADER 쟝크와 그에 이어지는 하나이상의 트랙쟝크로 구성됩니다. 복수의 독립된 PATTERN을 서포트하는 프로그램은, 트랙마다 가로로 나누어 취급하는 포맷인 포맷 2가 적당합니다.
(TEMPO)
SONG, POSITION, POINTER와 TIMING CLOCK(?)을 사용하는 SMPTE 싱크로나이저와 컴퓨터에서 되는 MIDI SYSTEM에서는, 통상 컴퓨터 상에서 TEMPO MAP (소절수의 계산을 가능하게 하는 트랙의 처음부터 끝까지의 TEMPO 표시와 경우에 따라서는 박자기호 정보를 포함한 것)을 작성합니다. 싱크로나이저 상에서 TEMPO MAP을 사용하기 위해서는, 컴퓨터에서 TEMPO MAP을 미리 옮겨두어야 한다. 싱크로나이저가 SMF에서 간단히 이 DATA를 뽑아낼수 있도록 TEMPO 정보는 늘 최초의 "MTrk" 쟝크에 스토어해 둘 필요가 있습니다. 포맷 0의 FILE일 경우, TEMPO정보가 트랙에 분산되므로, TEMPO MAP LEADER는 사이에 들어가는 이벤트를 무시할 수 있어야 합니다. 또, FORMAT 1의 FILE일 경우, TEMPO MAP은 최초의 TRACK으로 스토어 되어 있어야만 합니다. FORMAT 1을 서포트하지 않을 경우를 고려해서, TEMPO MAP LEADER를 위해 사용자가 TEMPO만의 FORMAT 0 FILE을 작성할 수 있도록 해두면 고맙겠습니다. 모든 SMF에는 TEMPO와 박자기호를 명백하게 기록해 두어야 합니다. 지정되지 않을 경우, 박자기호는 4/4, TEMPO 120 (1분당의 박자수)로 됩니다. FORMAT 0에서는 트랙의 맨 처음이 되어야 합니다. 또, FORMAT 1에서는 최초의 트랙이 되어야 합니다. FORMAT 2에서는 시간적으로 독립된 PATTERN의 각각이 적어도 박자기호와 TEMPO 정보의 초기 값을 포함하고 있어야 합니다.
(TRACK CHANK)
트랙 쟝크("MTRK" 타입)를 실제의 SONG, DATA가 스토어 되어있는 부분입니다. 각각의 트랙 쟝크에는 델타타임 값을 가지는 MIDI 이벤트및 MIDI 이외의 이벤트가 연속되어 있습니다. 트랙 쟝크의 포맷은 SMF의 모든 포맷(0,1,2)에 대해 공통입니다.
4D |
54 |
72 |
6B |
|
|
|
|
data.section |
|
|
|
쟝크타입 "MTrk" |
data 길이 4 Bit |
|
"MTrk" 쟝크의 구분은 다음과 같습니다. 또한 '+'의 기호는 하나 이상을 의미하고 있습니다. 즉, 적어도 하나의 "MTrk" 이벤트가 있어야만 하는 것입니다.
("MTrk" 이벤트)=(델타 TIME) (이벤트)
"MTrk" 이벤트의 구분은 대단히 단순한 구조를 하고 있습니다. TIMING을 담당하는 델타 TIME과 이벤트로 구성되며, 이벤트에는 MIDI 이벤트, SYSEX 이벤트, 메타 이벤트가 있습니다.
<델타 TIME>
델타 TIME은 가변길이 수치표현으로 스토어 되며, 다음에 이어지는 이벤트까지의 시간을 표시합니다. 또한 델타 TIME은 반드시 붙일 필요가 있습니다. 트랙의 최초 이벤트가 트랙의 개시와 동시에 나타난 경우와 2개의 이벤트가 동시에 나타난 경우 등에는 제로 델타 TIME이 쓰입니다. 이때도 델타 TIME 0을 생략해서는 안됩니다. 델타타임은 HEADER 쟝크에 기록되어 있는 1박(SMPTE) 시간으로 트랙을 RECORDING 할 때에는 1초간의 분수로 표현됩니다.
(MIDI 이벤트)
MIDI 이벤트는 얼마간의 MIDI 채널 메시지입니다. 그리고 (RUNNING)스테이더스를 사용할 수 있습니다. MIDI 채널 메시지의 스테이더스 BITE는 만약 선행하는 이벤트가 같은 스테이더스의 MIDI채널 메시지이면 생략이 가능합니다. 따라서 각 "MTRK" 쟝크의 최초 이벤트에서는 반드시 스테이더스를 명시해야만 합니다. 델타 TIME자체는 이벤트가 아니라 "MTRK" 이벤트의 일부입니다. 러닝 스테이더스는 델타 TIME을 초과하여 발생할 경우에 주의할 필요가 있는 것입니다.
<SYSEX 이벤트>
SYSEX 이벤트는 MIDI시스템 Exclusive Message를 주로 스토아하기 위한 이벤트입니다. SYSEX 이벤트는 2종류(F0, F7)준비되어 있으며, 전체 또는 불럭으로 나누어 서의 전송 그 외의 전송해야만할 임의의 BITE를 전송하는 것이 가능합니다. 또한, MIDI시스템.Exclusive Message와는 스테이더스의 사용법이 조금 다릅니다. MIDI에서는 F7 스테이더스는 Exclusive Message의 끝을 나타내지만 SYSEX이벤트에서는 양방을 종류가 다른 전송 스테이더스로 사용합니다.
* F0 스테이더스
F0 <DATA길이> <F0뒤에 전송되는 DATA> MIDI의 통상적인 시스템 Exclusive Message는 F0 스테이더스를 사용합니다. SMF에는 아래와 같이 스토어 됩니다. 알맞게 DATA길이를 더한 형태를 하고 있습니다. END OFF Exclusive Message는 자동적으로 붙여질 리는 없으므로, F7을 DATA에 포함할 필요가 있습니다. 이어지는 SYSTEM Exclusive Message DATA길이 뒤에 F7을 조합하여 사용하면 시작조정이 가능합니다.
* F7 스테이더스
F7 <DATA길이> <전송되는 전DATA BITE> 시스템 Exclusive Message 이벤트의 또 한가지 형식은 F0이 전송되지 않는 것으로 F7을 스테이더스로서 스토어 합니다. 이것은, MIDI시스템 Exclusive Message의 불럭단위 전송및 Exclusive Message만이 아닌 다른 방법으로는 들어가지지 않는 메시지(리얼TIME 메시지, SONG POSITION POINTER, SONG SELECT, MIDI TIME CODE등)를 전송하는 데에 쓰입니다. 신디사이저의 기종에 따라서는, Exclusive Message가 조그만 불럭 단위로 전송되는 것 같은 사양도 있습니다. 예를 들면, CASIO의 CZ 시리즈에서 볼 수 있는 패치 범프와 YAMAHA의 음원 FB01 시스템 Exclusive Message 모드에서 송신되는 마이크로 톤의 DATA등이 있습니다. 이 경우, 각각의 불럭은 전체적으로는 시스템 Exclusive Message의 일부분에 지나지 않습니다만, 그 전송시점의 중요도 때문에 필요한 것입니다. F7의 SYSEX 이벤트는 전체의 완전한 MIDI 시스템 Exclusive Message를 시간단위로 조정한 불럭으로 분리하기 위해 F0과 같이 쓰이는 것입니다. 우선, SYSEX 이벤트인 F0이 최초의 불럭으로 사용됩니다. 이것은 물론 Exclusive Message의 선두인 F0을 전송하기 위한 것입니다. 남은 Exclusive Message DATA의 불럭은 SYSEX 이벤트인 F7로 시간조종하면서 전송됩니다. 올바른 시스템 Exclusive Message는 실제의 기기가 F7을 보내지 않았다고 해도 반드시 F7로 끝나야만 합니다. 이게 없으면, SMF내의 다음 이벤트를 발견할 때까지는 SYSEX 이벤트의 최후가 도착했는지 알 수 없습니다. 따라서, SYSEX 이벤트의 F0이 완결할 때는, 최후의 BITE는 반드시 F7이어야만 합니다. 불럭으로 분리되는 것이라면, 그 불럭의 최후 BITE는 F7이어야만 합니다. 또 멀티 불럭 시스템 Exclusive Message의 불럭 사이에는 전송가능한 MIDI 이벤트가 있어서는 안되는 것입니다.
멀티 불럭의 시스템 Exclusive Message의 예입니다.
F0 43 12 00 이 전송되어 이어서 200의 지연(델타타임) 계속해서 43 12 00 12 43 00, 이어서 100 의 지연(델타타임) 계속해서 43 12 00 F7이 보내진다고 하면 SMF를 읽었을 때 멀티 불럭
시스템 Exclusive를 구성할 때 선행하는 SYSEX 이벤트인 F0 이 없는 것에 관계없이 F7 이벤트가 나타난 경우 이때의 F7 이벤트는 END로 사용되고 있음을 추측해야만 하겠지요. 이 경우 F7을 전송하는 경우 이외는 꼭 F7로 종료할 필요는 없습니다.
F0 |
03 |
43 |
12 |
00 |
|
|
|
81 |
48 |
|
|
|
델타타임 200 |
F7 |
06 |
43 |
12 |
00 |
43 |
12 |
00 |
64 |
|
|
|
|
델타타임 100 |
F7 |
04 |
43 |
12 |
00 |
F7 |
|
|
F0 |
DATA길이 가변폭 |
Exclusive Message.DATA (DATA.길이_1) |
|
|
F7 |
|
|
|
|
|
|
|
F0 |
DATA길이 가변폭 |
Exclusive Message.DATA (DATA길이) |
|
|
|
* DATA길이
DATA길이는 가변길이 수치표현으로 스토어 됩니다. F0과 DATA길이 자체는 포함하지 않고, 그에 이어지는 BITE수가 기술됩니다. 예를 들면, 전송되는 메시지가 "F0 43120007 F7"이면, "F00543120007 F7"로 스토어 되는 것입니다. SMF 불러내기 할 때에 모든 메시지를 다 불러냈음을 판단할 수 있도록 DATA의 맨 끝에 F7을 부가해야만 하는 것입니다.
* 메타 이벤트
메타 이벤트는 다음의 구문에 의해 본 FORMAT 또는 시퀀서가 이용하는 MIDI이외의 정보를 지정하고 있습니다.
모든 메타 이벤트는 FF로 시작되며, 1 BITE의 이벤트 타입(128미만)과, 가변길이 수치표현으로 스토어된 DATA길이 그리고 DATA 그 자체로 구성되어 있습니다. 만일 DATA가 없으면, DATA길이는 0입니다. CHANK(쟝크)같은 현행의 프로그램에서는 인식되지 않는 메타 이벤트가 장래 추가될 가능성이 있습니다. 프로그램은 인식할 수 없는 메타 이벤트가 포함되는 것을 찾아내어 제대로 무시되어지게끔 만들어져야 합니다. 또한, 프로그램은 기존의 메타 이벤트에 대해 <DATA길이> 값을 무시해서는 안됩니다. 기존의 메타 이벤트의 SIZE보다는 클 경우도 있음을 상정해 둘 필요가 있습니다. 반드시 불러내기는 SIZE를 토대로 행하지 않는 기존의 부분이하는 모두 무시하는 프로그램으로 해둡니다. 물론, 메타 이벤트 후에 멋대로 정보를 추가하거나 메타 이벤트를 정의하는 일은 허용되지 않습니다. 또한, SYSEX 이벤트와 메타 이벤트는 유효했던 모든 러닝 스테이더스를 취소합니다. 그리고 러닝 스테이더스는, 이를 메시지에는 적용되지 않습니다. 모든 프로그램은 이하에 나타나는 모든 메타 이벤트를 서포트할 필요는 없습니다. 그 프로그램에 있던 것만을 채용하면 좋은 테지만. 서포트하지 않는 메타 이벤트는 제대로 무시할 필요가 있습니다.
FF |
00 |
02 |
ssss |
시퀀서 번호 |
01 |
len |
text |
Text |
02 |
len |
text |
저작권표시 |
03 |
len |
text |
시퀀서명/Track명 |
04 |
len |
text |
악기명 |
05 |
len |
text |
가사(노랫말) |
06 |
len |
text |
표식 |
07 |
len |
text |
큐 포인트 |
20 |
01 |
MIDI채널 |
미디채널.프리휙스 |
2F |
00 |
---- |
end.off.Track |
51 |
03 |
Tempo |
Set. Tempo |
54 |
05 |
시/분/초 프레임/ff |
SMPTE 옵세트 |
58 |
04 |
분자/분모/cc/bb |
박자 |
59 |
02 |
sf/mi |
조 (Key) |
7F |
len |
data |
시퀀서 고유의 메타 이벤트 |
각 메타 이벤트의 구문해설에 있어서 이후의 이벤트 파라미터를 설명하는 데에 이하의 규약이 사용됩니다. 각각의 이벤트를 개시시키는 FE, 이벤트 타입과 길이가 일정한 이벤트의 DATA길이는 16진수로 나타내고 있습니다. 2개의 소문자로 이루어지는 dd랑 se같은 표기는 8 BITE 수치를 의미하고 있습니다. wwww 와 같은 4개의 동일 소문자는, 상위 BITE를 앞서 스토어 되어진 16 BIT값을 나타냅니다. tttttt와 같은 6개의 동일 소문자는 최상위 BITE에서 스토어된 24BIT 값을 의미합니다. LEN의 표기는 메타 이벤트 구문의 DATA길이 부분을 나타내고 있습니다. 이것은 가변길이 수치표현으로 스토어 되어있는 수이며 메타 이벤트 내에서, 그 뒤에 어느 정도의 DATA가 이어지는가를 보여주고 있는 것입니다. TEXT와 DATA의 표기의 경우는, DATA(TEXT)의 BITE수는 이 DATA길이에 의해 지정됩니다. 일반적으로, TRACK내에서 동시에 발생하는 메타 이벤트의 순서는 임의입니다. 만약, 저작권 표시 이벤트가 사용되어진다면, 알아차리기 쉽도록 가능한 한 화일 의 처음부분에 두어야만 하겠지요. 또 시퀀서번호와 시퀀서명/TRACK명 이벤트는 존재한다면 TIME 0으로 해야만 합니다. 그리고, END OFF TRACK EVENT는 TRACK의 맨 마지막의 이벤트로서 반드시 있어야만 합니다.
* 시퀀서번호
FF 00 02 SSSS 시퀀서번호 ----------------------- 이 이벤트는 시퀀서번호를 나타내는 이벤트입니다. 사용할 경우는 TRACK의 맨 처음의 ZERO가 아닌 델타 타임의 앞에서 또한(동시에) 송신 가능한 MIDI 이벤트보다 앞에 둘 필요가 있습니다. SMF의 FORMAT 2에서는, 각 <PATTERN>을 불러내기 위해 사용하는 PATTERN의 식별번호를 지정합니다. 각 <PATTERN>의 SONG. 시퀀서는 큐 메시지에 의해 불러내어집니다. ID 넘버가 생략되어진 경우에는 FILE중에서의 시퀀서 순서가 디폴트로서 사용됩니다. 하나의 시퀀서만을 포함하고 있는 SMF의 FORMAT 0 또는, FORMAT 1에서는 시퀀서 번호는 최초(내지는 유일)의 TRACK에 포함되어야만 합니다. 복수의 멀티 트랙.시퀀서의 전송이 필요한 때에는 각각이 다른 시퀀서 번호를 가지는 복수의 FORMAT 1 FILE을 사용해야만 합니다.
* TEXT
FF 01 LEN TEXT -------------- 임의의 내용인 임의 길이의 TEXT를 기술할 수 있습니다. TRACK의 맨 처음에 TRACK 명과 더불어 오케스트레이션의 의도, 그 외의 정보를 넣기 위해 사용하는 것을 생각할 수 있습니다. 또, TRACK의 도중에서 가사나 큐 POINT의 설명을 넣는 것 등에도 쓸 수 있습니다. 호환성을 얻기 위해서 이들 이벤트의 TEXT는, PRINT 가능한 아스키 문자이어야 합니다. 그러나 확장 캐릭터 SET(확장 캐릭터 SET)를 서포트(지원)하고 있는 같은 컴퓨터에서 움직이는 다른 프로그램간의 화일 교환에는 고위 BIT를 사용한 캐릭터를 사용할 수 있습니다. 따라서, 비 아스키 문자를 지원하고 있지 않는 컴퓨터 프로그램은, 이들의 문자를 무시해야만 합니다. 또한, 01부터 0F까지의 메타 이벤트 타입은 텍스트 이벤트이지만, 다른 타입을 위해 예약되어 있습니다. 각각의 메타 이벤트는, 상술한 TEXT이벤트의 사양에 적합하지만 사용목적이 다른 것입니다.
*저작권표시
FF 02 LEN TEXT -------------- 프린트가능한 아스키 문자열에 의한 저작권표시를 기술합니다. 표시에는 (c) 문자와 저작권 취득에 의해 저작권자를 포함하고 있어야 합니다. 만일, 복수의 곡이 같은 SMF속에 있으면 모든 저작권 표시는 화일 의 맨 처음에 놓이도록 이 이벤트 내에 정리해 두어져야만 합니다. 이 이벤트는 TIME 0으로 최초의 TRACK쟝크내의 최초의 이벤트이어야만 합니다.
*시퀀서명/ TRACK명
FF 03 LEN TEXT --------------- FORMAT 01 인 트랙 내나, FORMAT 1인 화일 의 맨 처음 TRACK내에서는 시퀀서 명을 기술합니다. 그 외의 경우는, TRACK명입니다.
*악기명
FF 04 LEN TEXT -------------- TRACK내에서 사용되는 악기의 종류를 기술합니다. 어느 MIDI채널에 이 기술이 합당한가를 표시하기 위해 MIDI채널, 프리 팩스 메타 이벤트와 같이 사용해도 좋고, TEXT중에 채널을 기술해도 상관없습니다.
*가사
FF 05 LEN TEXT -------------- 노래가사를 기술하기 위한 이벤트입니다. 일반적으로 각 음절은 각각의 가사 이벤트로서 각각의 이벤트 TIME에서 시작됩니다.
*MARK
FF 06 LEN TEXT -------------- 통상, FORMAT 0인 TRACK이거나 FORMAT 1인 FILE의 최초의 TRACK에 놓입니다. 시퀀서내의 그 POINT 의 이름(예를 들면, 연습기호나 SECTION명("FIRST VERSE")등 입니다.
*큐 POINT
FF 07 LEN TEXT -------------- 악보상의 그 점으로 무엇이 FILM, VIDEO또는 스테이지에서 발생하는지를 기술합니다. "자동차가 집으로 뛰어든다", "커튼이 열린다", "그녀가 그의 얼굴을 때린다".등입니다.
*MIDI 채널 프리 맥스
FF 20 01 CC ----------- 이 이벤트에 포함되어 있는 MIDI채널(0~15) 을 SYSTEM Exclusive Message및 메타 이벤트를 포함하는 모든 이벤트에 대응시키기 위해 사용합니다. 이 채널은, 다음의(채널 포함)통상의 MIDI이벤트 또는, 다음의 MIDI채널 프리 맥스 메타 이벤트가 올 때까지 유효합니다. MIDI채널이 TRACK에 대응할 경우 이 메시지에 의해, 복수의 트랙이 1개의 FORMAT 0 FILE에 가득 채워진 때에 비 MIDI(DATA와 TRACK의 관계를 유지할 수가 있습니다. (이 기능은 YAMAHA의 ESEQ FILE. FORMAT과 유사합니다.)
*END OF TRACK
FF 2F 00 -------- 트랙의 끝에는 반드시 이 이벤트를 두어야 합니다. TRACK의 정확한 종료 점을 지시하고 트랙의 ROOF랑 연결에 필요한, 정확한 TRACK의 길이를 규정하는 것입니다.
*SET TEMPO
FF 51 03 TTTTTT --------------- 이 이벤트는 TEMPO를 설정합니다. 값은 마이크로 초 단위의 4분 음표 길이로, 마이크로 초 단위인 MIDI (CLOCK)주기의 24배라고도 말할 수 있습니다. 시간당의 박수가 아니라, 일박당의 시간으로 TEMPO를 표시하고 있는 것입니다. 이 때문에, SMPTE TIME CODE 내지는 MIDI TIME CODE와 같은 절대시간을 기준으로 한 동기 프로토클과의 장시간에 걸친 정확한 동기가 가능하게 됩니다. 이 TEMPO의 분해능에 의해 얻어지는 정확함은 1분당 120박입니다. 4분의 곡을 연주했을 경우, 곡의 최후에서 500마이크로 초 이내로 수습됩니다. 이상적으로는, 이 이벤트는 MIDI (CLOCK)이 있는 위치에 두어야만 합니다. 그럼으로 해서, 다른 동기 기기와의 호환성을 보증, 혹은 적어도 향상할 수 있습니다. 본 FORMAT에 의한 박자기호/ TEMPO MAP을 다른 기기에 쉽게 전송할 수 있게 되는 것입니다.
*SMPTE OFF SET
FF 54 05 HR MN SE FR FF ----------------------- 이 이벤트는, TRACT쟝크가 START 해야만 할 SMPTE 시간을 나타냅니다. SMPTE OFF SET은, TRACK의 시작의 모든 0이 아닌 델타 TIME및 모든 전송 가능한 MIDI이벤트의 앞이어야만 합니다. MIDI TIME CODE에 있어서의 경우와 같은 형식으로 HR에는 SMPTE FORMAT을 포함하여 CODE화 해야만 합니다.--미디인의 밝은 미래를 위해-- --HongMidi(홍사철)드림-- |