ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • MIDI 인터페이스와 프로그래밍
    노래방 /홍사철의 미디교실 2022. 7. 24. 12:13
     
    Midi 인터페이스와  미디 프로그래밍(홍사철)


    미디 인터페이스와 미디 프로그래밍..
     
    동 제목의 원서를 알기 쉽게 보충 보안한 것이다

    바로찾기 - 미디 인터페이스란 ? 
    - 이해를위한 기초지식

    - 미 디 의 개 관

    - 미디에서 정의된 내용
    - 미디 인터페이스의 연결
    - 미디의 데이터

    - 미 디 채 널 메 세 지

    - 채널 모드 메세지 . 미 디 시 스 템 메 세 지

    - 시스템 리얼 타임 메세지

    - 시스템 전용 메세지

    - 미 디 모 니 터 프 로 그 램 .  

     1 . 미디 인터페이스란 ? 
     
     
    인터페이싱을 한다는 것은 한 시스템의 둘 이상 부분사이에서
    정보의 흐름을 이어주는 것을 의미한다.
    즉 인터페이스란
    '어떤 정보의 흐름이 지나가는 경로'를 말하는 것이다.
    신디싸이저에 있어서 인터페이스는
    연주자의 행동과 악기 자체내의 소리 발생 장치간의 정보를
    전달하는 도관(Pipe)과 같은 역할을 한다.
    피아노를 예로 들면
    연주자와 소리를 내는 현(String)사이의 인터페이스는
    건반과, 특정 현들과 연결된 헤머와 레버들 사이의 기계적인 시스템인 것이다.
    이와 비슷하게 초창기의 단음만 나는 신디싸이저들(Monophonic Synthesizer)은
    각각의 건반이나 손잡이들이
    연주자와 소리 발생 하드웨어간의 인터페이스를 이루면서
    특정 회로에 직접적으로 연결되어 있었다.
    이런 인터페이스는 구현하기가 쉬웠다.
    각각의 컨트롤은 단지 일 대 일로만 소리 발생 부분에 대응되면 되었던 것이다.
    그러나 오늘날의 여러 화음을 내는 신디싸이저(Polyphonic Synthesizer)의 컨트롤은
    그냥 1 대 1로 인터페이스해서는 안되게 되어있다.
    이것은 음색의 갯수보다도 상당히 많은 건반을 가지고 있으므로
    연주에  대한 정보는 연주자가 지금 무엇을 하고 있느냐에 따라
    다르게 결정되어지기 때문이다.
    그래서 오늘날의 대부분 신디싸이저들은
    이런 복잡한 인터페이스에 대한 요구를 만족시키기 위해서
    내부에 마이크로 프로세서를 가지고 있다.
    신디싸이저에 들어오고 나가는 모든 정보는
    내부 프로세서를 통해서 수행되는 것이다.
    다시 말하면 연주자의 연주에 대한 정보(이것을 Performance Data 라하며
    앞으로 연주라는 뜻으로 '퍼포먼스'를 많이 쓸 것이다.)는
    프로세서에 전달되어지고, 여기서 정보가 분석(Interpret)되어져서
    소리 발생 부분에 전달되는 것이다.

    미디(MIDI)란
    악기간의 디지털 인터페이스(Musical Instrument Digital Interface)를
    말하는 것이므로,이런 마이크로 프로세서를 쓰는 전자적인 음악 기구간의
    인터페이스를 하는 하나의 ( 거의 표준적인 ) 방법인 것이다.
    우리는 이 글을 통해서
    미디의 아주 독특하고 효율적인 방법을 발견하게 될 것이다.
    거기에 앞서서 이해를 위한 기본 지식을 먼저 정리하고 넘어가도록 하자.

    2 . 이해를위한 기초지식
       
    ( 1 ) 이벤트( Event )의 개념
     
    악기사이에서나 악기 내에서의 인터페이스에 의해서 전달되어지는 정보는
    '이벤트'라는 것에 의해서 표시된다.
    이벤트란
    '연주자가 악기를 연주하 거나 동작시키는 것에 관련된 모든 행위'를 말한다.
    연주에 대한 이벤트(Performance Event)는 음을 연주한다거나
    휠이나 페달을 움직이는 등의 행위를 말하는 것이고,
    동작에 대한 이벤트(Operation Event)는 음색 프로그램을 바꾸는 것이나
    프로그램의 파라미터를 바꾸는 것 같은 작업을 말하는 것이다.
    이런 각기 다른 이벤트는 '메시지( Message )'라는 것에 의해서 표현되는데
    이것은 한 이벤트가 수행되면 악기에 의해서 생성되어져서
    인터페이스에 의해 전달된다.
    즉 어떤 한 이벤트는 하나의 메시지로 표현가능한 것이다.
    그리고 메시지는 하나의 커멘드와 그에 따르는 데이터로 구성되어 진다.

    ( 2 ) 음악 정보의 전달
     
    이제 한 악기( Synthesizer ) 안에서 어떻게 정보가 전달되는가를 알아보자.
    우리는 신디싸이저를 크게 보아서
    각기 다른 역할을 하는 두 부분으로 나누어 볼 수 있다.
    첫째는 악기를 조종하는 모든 부분을 들 수 있다.
    건반, 스위치, 레버, 페달 버튼 등등
    신디싸이저를 다루는 모든 물리적인 장치가 그것이다.
    다른 한 부분으로는
    소리를 내는 부분을 들 수 있다.
    위의 첫 번째 부분에서 생겨난 정보를 가지고서
    소리를 내는 회로나 칩등의 여러 내부 요소들이 이 부분에 속한다.
    신디싸이저 안에서 첫째 부분에서 만들어진 정보는
    마이크로 프로세서에 의해서 소리발생 장치로 전송된다.
    앞에서 이벤트를 표시하는 메시지는 커멘드와 데이터로 구성되고
    이들은 인터페이스를 통해서 전달된다고 했는데
    이 메시지가 프로세서에 들어와서 분석(Interpret),변환된 후에
    각 음 발생장치로 전달되는 것이다.
    이런 마이크로 프로세서의 작업은
    바쁜 기차역에서의 역무원의 일과 유사하다고 볼 수 있다.
    마이크로 프로세서는 기차역이고,
    인터페이스는 상행 선과 하행선,
    그리고 그것들을 연결하는 대합실이라 볼 수 있으며,
    메시지라는 손님들은 상행 선에서 도착해서 대합실에서 기다린 후
    다시 하행 선을 타고 다음 목적지로 간다고 보면 되는 것이다.
    역무원은 이 손님들이 들어오는 것을 체크하고 선별하여서
    지정된 시각에 특정 손님들을 내보내는 일을 하는 것이다.
    메시지라는 손님들은 철도로 여행하여
    다음 행선지  에서 맡은바 임무를 수행하게 되는 것이다.
    그런데 기차여행을 하는 손님들은 상행 선으로 도착하고서
    다시 출발하기를 기다리는 손님 뿐 아니라
    역 밖에서 택시를 타고 와서 출발선 앞에서 기다리는 외부 손님들도 있을 수 있다.
    마찬가지로 신디싸이저에서도 악기 내부의 건반이나 페달 등의
    조종기구에서 나온 정보와 외부에서 들어온 정보가
    내부 프로세서에 똑같이 입력되어
    음 발생 장치에 전달되는 것이다.
    우리가 미디를 쓰면
    하나의 악기로 다른 악기에서 소리나게 할 수 있는 것도 이런 이유 때문이다.
    또한 프로세서에서 나가는 정보는 소리 생성부분뿐 아니라
    외부로 전송되어 다른 악기의 프로세서로 들어갈 수도 있다.
    이런 악기 내부에서 또는 외부로 정보가 전송되는 기본 개념을 가지고서
    각 악기간을 인터페이스 하는 방법이 미디인 것이다.

    ( 3 ) 미디 인터페이스에서 생성되는 신호들
     
    신디싸이저의 컨트롤을 들여다보면
    안에서는 매우 다양한 신호가 생성되는 것을 알 수 있다.
    어떤 신호는 아날로그 값이고
    어떤 것은 디지탈값인데
    이런 신호들이 인터페이스를 통해 마이크로 프로세서에 전해질 때
    하나의 메시지를 이루는 것이다.
    악기내부의 마이크로 프로세서는 오직 디지털 정보만 다룬다.
    어떤 한 작용에 대한 처음의 악기 신호는 아날로그 값이다.
    그러나 이것은 곧 디지털의 값으로 바뀌게 된다.
    우리는 이 변환작업에 까지는 관련할 필요없이
    메시지가 인터페이스에 들어갈 때에는 디지털 값이라는 것만 기억하고서
    이 디지털 정보를 이용만 하면 되는 것이다.

    ( 4 ) 뮤직 메시지의 주고받기
     
    뮤직 인터페이스에 의해서 연결되는 각기 다른 악기들은
    그들이 받는 메시지의 두 부분중 하나를 수행하게 된다.
    두 부분이란 메시지를 받자마자 수행하느냐,
    나중에 수행하기 위해서 메모리에 저장하느냐 하는 것을 말하는 것이다.
    들어오는 메시지를 처리하는 가장 쉬운 방법은
    메시지가 들어오는 대로 그 내용을 수행하는 것이다.
    이것을 신디싸이저에서는 리얼 타임 모드( Real_Time Mode )라고 한다.
    건반을 누르면 그 소리가 바로 나는 것이나
    스위치의 조작으로 음색을 바꾸는 등의 작업이
    리얼 타임모드의  처리인 것이다.
    그러나 악기내의 마이크로 프로세서는
    거의 대부분의 메시지를 들어오는 데로 수행시키지 않는다.
    대부분의 경우 신디싸이저는 메시지가 들어오면
    이들을 일단 메모리에 저장했다가 필요할 때 다시 꺼내 쓰는 것이다.
    이제 그 자세한 과정을 알아보도록 하자.

    1) 이벤트의 저장
     
    이진 코드로 메시지를 정의하는 가장 큰 장점은
    이것이 저장하고 꺼내기에 매우 편리하다는 것이다.
    단지 필요한 것이라고는 메시지의 묶음을 저장할 장소만 있으면 되는 것이다.
    대부분의 신디싸이저는 그 장소로 램( RAM , Random Access Memory )을 가지고 있다.
    프로세서는 금고에 돈을 저장하듯이 메시지를 램에 넣으면 되는 것이다.
    이 저장된 메시지가 다시 불려지면,
    마이크로 프로세서는 메시지의 리스트를 읽어서
    신디싸이저의 내부 음 발생부분에 메시지를 전송하는 것이다.

    2) 타이밍 맞추기
     
    신디싸이저의 마이크로 프로세서는
    연주에 대한 이벤트의 정확한 리듬을 유지하기 위해서
    내부 클럭을 억세스해야 한다.
    우리는 이것을 ' 이벤트 클락( Event Clock )이라고 한다.
    이것은 일정하게 나누어진 게이트의 연속된 집합인데
    프로세서에 의해서 타이밍을 참조하는 데에 사용되어진다.
    신디사이저안에는 프로세서에 의해 사용되어지는 카운터가 있다.
    이것은 이벤트 클럭이  흘러서 하나의 게이트가 발생할 때마다 하나씩 카운트된다.
    메시지가 들어오면 프로세서는 카운터를 '0'으로 세트한 후
    다음 메시지를 기다리면서 카운터를 증가시킨다.
    메시지가 들어오면 프로세서는 그 메시지와 함께
    그때의 카운터 값도 메모리에 저장한다.
    계속해서 카운터를 리셋 시키고서
    다시 카운터를 증가시키면서 다음 메시지 를 기다리는 작업이 반복되는 것이다.
    그 결과 메모리에는 퍼포먼스 메시지뿐만 아니라
    각 메시지 사이의 이벤트 클럭의 카운터 값도 저장되는 것이다.
    이제 저장된 메시지가 다시 불려지는 과정을 이야기해 보자.

    저장된 음악이 다시 불려질 때에는
    프로세서는 메모리의 연주 데이터의 리스트 중에서 하나의 메시지를 읽어들인다.
    프로세서는 이벤트 클럭의 타이밍을 참조하여 저장된 카운터 값만큼 기다린 후
    그 메시지를 음 발생 장치로 보내는 것이다.
    그런 다음 프로세서는
    다음 메시지와 카운터를 읽어서 카운터만큼 기다렸다 전송한다.
    즉 저장된 음악을 다시 연주할 때에는
    읽고 기다렸다가 전송하고,
    읽고 기다리고 전송하는 작업이 프로세서에서는 되풀이되는 것이다.
    이런 작업을 메모리에 더이상 읽을 자료가 없을 때까지 계속하는 것이다.
    그런데 여기서 유의해야 할 것은
    저장할 때와 다시 연주할 때의 클락 스피드는 같지 않아도 된다는 것이다.
    즉 카운터의 값은 단지 메시지사이의 비례적인 시간을 나타낸다는 것이다.
    그러므로 연주하기 전에 클락 스피드를 다르게 해서,
    입력할 때보다 빠르거나 느리게 재생할 수 있으며,
    심지어는 재생 도중에
    클락 스피드를 점점 이르거나 느리게 함으로 써
    연주되는 음악의 템포를 바꿀 수도 있는 것이다.
    그래도 각 메시지 사이의 카운터 값은 변하지 않으므로
    음악의 리듬은 바꿔지 않는 것이다.
    이것이 시퀀서
    ( 전자음악의 데이터를 디지탈적으로 처리하는 하나의 녹음기로 보면 될 것이다. )
    와 드럼 머신이 연주된 곡을 '기억'했다가 '재생'하는 방법인 것이다.

    ( 5 ) 이벤트와 타이밍의 복합된 인터페이스
     
    앞에서 뮤직 인터페이스를 하려면
    두 가지 중요한 사실을 고려해야 한다 는 것을 알았다.  
    만약 한 악기가 다른 악기를 '플레이'시키려면
    인터페이스는 어떤 퍼포먼스나 오퍼레이션 이벤트가 일어나고 있더라도
    메시지를 전송할 수 있어야 한다.
    또한 두개나 그 이상의 기기 간에 타이밍을 맞추려면
    ( 이것을 Synchronization이라고 한다 )
    인터페이스는 타이밍을 참조하기 위한 이벤트 클럭이 준비되어 있어야 하는 것이다.
    이런 조건을 만족시키는 인터페이스라야지 만이
    이벤트 메시지와 타이밍 카운터를 동시에 전송하는
    복합 인터페이싱이 가능한 것이다.
    미디 인터페이스에서는 위의 두 조건을 만족시키는 복합 인터페이싱을 한다.
    그래서 한 미디 시스템에서
    여러 종류의 다양한 악기를 효율적으로 쓸 수 있는 것이다.
    이제 어느 정도 뒤에 나올 내용들을 이해할 수 있는 기초가 깔린 것 같다.
    만약 앞의 내용을 대강 읽은 독자가 있다면
    이런 내용을 알고 있는지 다시 한번 생각해 보기 바란다.
     
    ooo 인터페이스( Interface )
    ooo 인터페이싱을 한다
    ooo 신디싸이저 내부의 마이크로 프로세서( Micro Processor )
    ooo 이벤트( Event ) 와 메시지( Message )
    ooo 커맨드( Command ) 와 데이터( Data )
    ooo 퍼포먼스 이벤트(Performance Event) 와 오퍼레이션 이벤트(Operation Event)
    ooo 기차역과 마이크로 프로세서
    ooo 이벤트 클럭( Event Clock )
    ooo 복합 인터페이스( Compound Interface )

    3 . 미 디 의 개 관
     
    신디싸이저가 발전함에 따라
    시퀀서나 드럼머신 같은 다양한 주변기기들이 함께 발전해 왔다.
    이 모든 주변기기들을
    하나의 큰 유니트에 넣는다는 것은 효율적이지 못하므로
    주변기기 각각을 인터페이스 하는 기법이 개발될 필요가 생겼다.
    그래서 각 악기의 메이커에서는 그들의 악기를 위한
    복합 인터페이스를 개발하기 시작했다.
    이들 인터페이스는 잘 작동했지만
    그 브랜드의 제품에서만 작동한다는 심각한 결함이 있었다.
    그러다가 사람들이 점점 많은 악기를 한 시스템으로 쓰려고 하니
    '모든 기기에 함께 쓰이는 하나의 공통된 인터페이스'가 필요하게 되기에 이르렀다.
    그래서 신디싸이저 업계에서는
    모두 한자리에 모여서 각 회사간의 표준 인터페이스를 정하게 되었다.
    그 표준 인터페이스에서는
    이벤트(Event)와 타이밍 참조(Timing Reference)를 정의한
    '이진 코드'( 이것이 곧 미디의 자료구조인 것이다 )와
    이들 디지털 신호를 '전송하는 속도( Transmission Rate )'를 정하였다.
    이것이 모든 신디싸이저 메이커들과
    그 주변기기회사들이 함께 모여 만든
    최초의 공동 인터페이스 계획이었던 것인데
    그들은 이것을
    미디( MIDI = Musical Instrument Digital INterface )라고 부르기로 하고서
    오늘날에 이르고 있다.
    미디는 원어가 말하듯이
    음악 악기간의 디지탈적인 인터페이스를 말하는 것으로
    31.250 Boud( = 31.25 KBoud, 1 Boud 는
    1초동안에 전송되는 비트의 수( BPS = BIt Per Second)를 말하는 것으로
    그냥 보오라고도 읽는다. )의 전송 속도와
    이벤트 메시지와 타이밍 참조를 둘다 전송하는
    이진 코드를 가지는 복합 인터페이스인 것이다.
    미디는 많은 독특하고 강력한 옵션을 가지고 있다.
    메이커들은 원한다면 그 기능들을 이용할 수 있으며
    갈수록 미디의 모든 기능을 제공하는 신디싸이저를 만들려고 하고 있다.

    ( 1 ) 미디에서 정의된 내용
     
    @ 미디는 31.25 KBoud 의 전송속도를 가지는 직렬 인터페이스이다.

    @ 이벤트 메시지와 타이밍 참조가 둘 다 전송되며
    이것들은 이진 코드의 디지털 워드로 구성된다.

    @ 이들은 각 악기간에 연결된 하나의 선을 통해서 전송된다.

    @ 미디 메시지는 악기에 의해서 사용되는 커맨드와 데이터로 구성되며
    이들은 다양한 퍼포먼스와 오퍼레이션 이벤트들을 표시한다.

    @ 미디 메시지는 다음 다섯 가지로 나뉜다.

    1.채널 보이스 메시지( Channel Voice message )
     
    퍼포먼스와 관련된 모든 이벤트를 전달하는데 사용되는 메시지로서
    16개 의 각기 다른 채널에 할당되어질 수 있다.

    2.채널 모드 메시지( Channel Mode Message )
     
    각 악기의 채널과 소리 할당( Voice Assignment )을 지정하기 위해서
    사용되는 메시지로 제일 처음 미디를 디자인할 때
    각 악기간의 통합된 정보전달을 위해서 만들어진 메시지이다.
    1. 2. 를 합해서 채널 메시지라고 한다.

    3.시스템 공용 메시지 ( System Common Message )
     
    한 미디 시스템 내의 모든 악기에 유효한 메시지로서
    미디시스템의 마스터 컨트롤러( Master Controller )나
    시퀀서 또는 드럼 머신에서 사용하기 위해서 만들어진 메시지이다.

    4.시스템 리얼 타임 메시지( System Real Time Message )
     
    이 또한 시스템 내의 모든 유니트에 다 효력을 미치는 메시지로
    메세지중 에서 타이밍 참조 정보를 전달하는데 쓰인다.

    5.시스템 전용 메시지 ( System Exclusive Message )
     
    이 메시지는 특정 회사나 모델의 고유한 정보를 전달하기 위한 것으로
    최근에는 샘플러( Sampler )의 데이터( Sampling Data )전송에 많이 이용되고 있다.
    3,4,5를 합해서 시스템 메시지라고 한다.

    그 외 인터페이스를 위한 하드웨어적인 표준 규격도 정의되어 있으 나
    이 글에서는 논외로 한다.

    ( 2 ) 미디 인터페이스의 연결
     
    미디 악기들은 미디 포트를 통해서 인터페이스 된다.
    그러기 위해서는 3개 의 케이블이 있어야 하는데,
    그 끝에는 5핀 짜리 DIN 잭이 연결되어 있다.
    신디싸이저에서 미디잭들이 꽂히는 곳을 미디 포트라고 하는 것이다.
    여기에서는 오디오 신호가 전달되는 것이 아니고
    오직 미디 메시지만이 입출력되는 것이다.
    이 3개의 미디 포트는 미디 시스템을 구성하는데 굉장한 유연성을 제공한다.
    각각의 미디 포트는 고유한 기능을 가지고 있는데
    이제 그 자세한 이야기를 해 보기로 하자.

    1.미디-아웃 포트( OUT Port )
      미디 악기의
    건반이나 악기 표면에 있는 보턴이나
    스위치 등의 조작으로 구성되는 모든 메시지들은
    미디아웃 포트로 전송되어 나간다.

    2.미디-인 포트 ( MIDI IN Port )
     
    미디-인( MIDI IN )포트로 전송되어 도착한 메시지들은
    악기의 내부 음 발생 장치로 전달된다.
    신디사이저는 인 포트(IN Port)로 들어온 메시지도
    악기 자체내의 건반으로 생성되는 메시지와 똑같이 취급한다.

    3.미디-스루 포트 ( MIDI THRU Port )
     
    미디-스루( MIDI THRU )포트에서는
    미디-인 포트로 들어온 메세지를 그대로 다시 내보낸다.
    여기서 주의할 것은
    스루( THRU )포트에서는
    악기 자체의 건반이나 보턴으로 생성된 메세지 는 전송하지 않는다는 것이다.
    그런 메세지는 미디-아웃을 통해서 나간다.
    단지 스루(THRU)포트에서는
    인(IN)으로 들어온 신호만 다시 내보냄으로써
    미디 악기들이 여러 개 연결되어 있을 때
    외부의 마스터 키보드에서 생성된 메세지를 그 악기에서 받고
    다시 다른 악기에도 보내야 할 때 유용하게 쓰이는 포트인 것이다.
    여기서 같은 메세지를 다른 악기가 구별해서 취하는 방법으로는
    나중에 자세히 설명할 채널이라는 개념을 씀으로써 해결한다.
     
    마이크로 프로세서는 MIDI IN으로 들어온 메세지와
    악기 자체에서 생성된 메세지를 받아서 내부 소리 발생 부분에는 둘 다 전송하고
    MIDI OUT 포트로는 악기 자체에서 생성된 메세지만 내보낸다.
    MIDI IN포트로 들어온 메세지는 MIDI OUT포트로 못나가는 것이다.
    그대신 MIDI IN 포트로 들어온 메세지는 그대로 MIDI THRU포트로 나간다.
    그러나 MIDI THRU 포트는 악기 자체에서 생성된 메세지는 전송하지 않는다.

    ( 3 ) 미디의 데이타
     
    앞에서 개개의 이벤트를 표시하는 하나의 메세지는
    커멘드와 데이타로 구성된다고 했다.
    미디에서는 이메세지들을
    바이트( Byte = 8 Bit ) 단위의 이진 코드( Binary Code )로 처리하는데
    이 한 바이트의 데이타를 '미디 코드( MIDI Code )'라고 한다.
    이 미디 코드가 미디 케이블을 통해서 전송될 때에는
    10비트단위로 끊어져서 직렬로 전송된다.
    10비트 중에서 처음과 끝의 1비트씩은 데이타의 올바른 전송을 위한것으로
    첫비트가 '0'이고 마지막 10번째 비트가 '1'이면
    올바른 미디 코드로 인식하여
    미디 악기에서는 중간의 8비트를 취하여 디지털적으로 처리해서
    미디정보로 처리한다.
    그러나 처음과 마지막의 한비트씩을 버리고
    한바이트( 8bit = 1Byte )를 미디정보로 인식하게 하는 것은
    악기 내부의 인터페이스 부분에서 해주므로
    우리는 미디 코드,즉
    중간의 8비트(=1바이트)의 내용에 대해서만 알아보면 되는것이다.

    1) 미디 코드의 형태
     
    미디에서의 바이트 단위의 정보,
    즉 미디코드는
    상태 바이트( Status Byte )와 데이타 바이트( Data Byte )로 나누어 진다.
    한 바이트중 최상위 비트( MSB = Most Significant Bit )가 '1'이면
    상태 바이트이며,
    최상위 비트가 '0'이면 데이타 바이트인 것이다.
    즉 데이타가 127보다 크면 상태 바이트,
    작으면 데이터 바이트이다.
    미디에서는 하나의 상태 바이트에 이어서 0 - 2개의 데이타 바이트가 전송된다.
    이것을 묶어서 미디 메세지라고 한다.
    즉 메세지중에서 커맨드 부분이 상태 바이트이고
    데이타 부분은 데이타 바이트가 되는 것이다.
    MIDI Messege = ( Status Byte ) * 1개 + ( Data Byte ) * ( 0 - 2 )개.
    궁극적으로 미디 데이타를 처리한다는것은
    미디 신호를 메세지 단위로 처리하는 것을 말하는 것이다.

    2) 미디 메세지 개관.
     
    미디 메세지는 상태 바이트에 따라서 그 종류가 구분된다.
    데이타 바이트는 말그대로 데이타이며
    이것의 의미도 그 앞의 상태바이트에 따라서 달라지는 것이다.
    한 미디 메세지의 구분을 위한 상태 바이트도
    다시 상위 4비트와 하위 4비트로 나누어서 표시한다.
    일반적으로 미디에서는 ' 1aaabbbb '의 형태로 상태 바이트를 표시하는데,
    'aaa'가 '111'이 아니면
    그 미디 메세지를 " 채널 메세지 (Channel Message) " 라 하며
    뒤의 'bbbb'의 값은 0 - 15 까지의 16개 채널을 나타내게 된다.
    즉 채널 메세지를 나타내는 상태바이트의 값은
    80h( =128d )에서 0EFh( =239d )까지의 값을 가지는 것이다.  
    그리고 'aaa'의 값이 '111' 이면
    " 시스템 메세지(System Message) "라는 미디정보가 되며
    'bbbb'의 값은 채널값이 아닌 다른 특별한 의미를 지니게 된다.
    채널 메세지는 다시 "채널 보이스 메세지"와 "채널 모드 메세지"로 나뉜다.
    즉 'aaa'값이 '011'이고 첫 번째 데이타 바이트가 122 - 127 의 값이면
    "채널 모드 메세지"가 되며
    나머지 채널 메세지들은 "보이스 메세지"가 되는 것이다.
    시스템 메세지도
    " 익스클루시브 메세지(System Exclusive Message) "와
    " 컴먼 메세지(System Common Message) ",
    " 리얼 타임 메세지(Real-time message) "로 나뉘는데
    이들 데이타 값이 어떻게 정의되어 있는가에 대한 자세한 정보는
    < TABLE I - VII >을 참조하기 바란다.

    4. 미 디 채 널 메 세 지( MIDI Channel Message )
     
    미디 채널의 개념은
    인터페이스에서 가장 강력하고 효율적인 생각이다.
    메세지들은 각기 다른 16개의 채널중의 하나에 할당되어 진다.
    각각의 채널들은 각기다른 악기나 음색에 의해서 연주되어질 수 있는 것이다.

    ( 1 ) 채널 보이스 메세지( Channel Voice Message )
     
    미디 인터페이스를 통해서 전송되는 미디 메세지의 거의 대부분은
    채널 보이스 메세지이다.
    이들은 연주의 물리적인 작용으로 생성되는 모든 메세지를 포함한다.
    어떤 건반이 눌렸는지,
    어떤 스위치가 눌려졌는가?라든지
    아날로그적인 컨트롤러
    ( 모듈레이션 휠(Modulation Wheel)볼륨 페달 같은 것들 )가
    움직였는지에 대한 것이나 건반 치는 쎄기나
    누른후에 흔드는것(Pressure)같은 것에 대한 메세지가 보이스 메세지인 것이다.
    한 미디 시스템의 각각의 악기는 1-16까지의 채널중 하나가 지정되어 있다.
    한번 채널이 악기에 지정되면
    그 악기는 오직 할당된 채널에 대해서만 보내거나 받게되며
    나머지 다른 채널값으로 들어오는 메세지는 무시해 버린다.
    이것이 하나의 케이블을 통해서 나가는 미디 데이타가
    한 미디 시스템에서 각기 다른 악기에게
    각기 다른 연주를 하게 하는 방법인 것이다.

    ooo 채널 보이스 메세지의 종류
     
    이제 앞으로 나올 채널 보이스 메세지들을 보는 법을 설명하겠다.
    " "로 둘러쌓인 부분은 커맨드 부분으로
    상태바이트( Status Byte )가 표시하는 부분이다.
    그리고 '/'뒤에 따라 나오는 한개나 두개의 부분은
    데이타로서 데이타 바이트가 나타내는 부분이다.
    " "안의 커멘드 뒤에 ( )로 묶인 속에는
    상태바이트의 16진수값이 표시되는데
    하위 4비트는 채널을 나타내는 유동적인 값이므로 그냥 'n'으로 표시한다.
    < " 노우트 ON( 9nH )" / 음높이 / 음의 쎄기 > 이라고 나와 있으면
    커멘드는 음을 소리나게 하는 것이고
    상태 바이트는 '1001nnnn(2진수)'의 값을 가지며
    이뒤에 2바이트의 데이타 바이트가 따라오는데  
    이들은 각각 음높이와 음의 쎄기를 나타내는 데이타인 것이다.

    1) "노우트 ON ( 9nH )" / 그리고 음높이( key Number )
        음의 쎄기( Attack Velocity )
     
    이 메세지는 한 건반이 눌러졌다는 것을 표시한다.
    신디사이저에서는 각 건반에 따라 음 높이가 다르므로
    음 높이는 각 건반의 번호를 나타내고 음의 쎄기는
    건반을 누르는 속도로서 표시한다.
    음 높이를 나타내는 건반 번호( Key Number )는
    건반 128개 중의 하나를 나타내는 것으로
    데이타 바이트의 최대 범위인 0 - 127의 값을 가진다.
    ( 상태 바이트는 최상위 비트가 '1'이므로
    128 - 255의 값을 가지고 데이타 바이트는
    최상위 비트가 '0'이므로 0 - 127의 값을 가지는 것이다.)
    '가온 다'( MIddle C = C3, 건반 중앙의 '도'음 )를
    60으로 두고서 반음에 1씩 증감하여
    10 옥타브 이상의 음역을 표시할 수 있다.
    음의 쎄기를 나타내는 건반을 치는 속도( Attack Velocity )는
    말 그대로 건반이 얼마나 쎄게( = 빠르게 )눌려졌나를 나타내는 값으로
    0 - 127의 값을 가지는데 그 내용은 아래와 같다.
     
    pff ppp pp p mp f ff fff
                   
    10     64     127
     
    그런데 신디사이저중에는
    건반에서 눌려지는 속도를 인식하는 것도 있지만 그렇지 않는것도 있다
    뒤의 것에는 속도가 전혀 의미가 없는 값이되는데
    이때에는 항상 V=64의 값이 들어가게 된다.
    벨로시티가 '0'인 것은 미디에서 특별한 의미를 갖는다.
    모든 미디 악기들은
    < "노우트 ON " / 음높이 / 건반 속도 = 0 >인 메세지를
    '노우트 OFF' 메시지로 인식한다.

    2) "노우트 OFF( 8nH )" / 음높이(Key Number)
        건반 떼는 속도(Release Velocity)
     
    '노우트 ON' 메세지와 같이 '노우트 OFF' 메세지도
    128개의 건반 중 하나를 눌렀다가 떼는 것을 표시한다.
    만약신디사이저가 건반떼는 속도도 전송한다면
    둘째번의 데이타 바이트는 0 - 127 의 값을 가지면서 그 값을 나타낸다.
    만약 전송하지 않는다면
    그 악기는 앞의 '노우트 ON'에서 말한대로
    건반 누르는 속도를 '0'으로 하는
    '노우트 ON'메세지를 '노우트 OFF'메세지 대신 사용하게 된다.
    미디에서는 같은 상태 바이트가 계속되면서 데이타만 바뀔때에는
    상태바이트를 생략할 수 있게 하고 있다.  
    즉 상태 바이트가 들어와야할 순서인데
    다음 바이트의 최상위비트가 '0'이면
    미디에서는 바로 앞의 상태바이트와 같은 상태바이트가 들어온 것으로
    인식하게끔 정의되어 있는것이다.
    이렇게 상태 바이트는 생략된 채 데이타만 들어오고 있는 상태를
    '런닝 상태( Running Status )'라고 하는데
    거의 대부분이 '노우트 ON'메세지가 생략되어서 들어오는 경우이다.
    '노우트 ON'이 되었으면 곧이어 '노우트 OFF'메세지가 와야 하는데
    이것대신 벨로시티가 '0'인 음높이데이타만 전송됨으로써
    '노우트 OFF'를 나타내게 되는 것이다.
    대부분의 악기들이 음정 데이타를 전송할 때에는
    '런닝 상태'로 전송을 하는데
    이렇게 함으로써 상태바이트를 전송하는 시간을 절약할 수 있는 것이며
    이것이 '노우트 OFF'메세지는 거의 쓰지 않는 이유인 것이다.

    3) "피치 밴더 체인지( EnH )" / 벤더 위치1( Bender Position)
        벤더 위치 2
     
    이 메세지는 피치벤더( Pitch Bender )가 움직인 것을 표시하는 데 쓰인다.
    즉 벤더의 위치가 바뀔 때마다 이 메세지가 생성되어 전송되는 것이다.
    피치 벤더란
    신디사이저에서 손잡이 모양으로나 바퀴모양으로 생겨서 건반 옆에 있는 것인데
    건반을 누르고서 소리가 나는 상태에서 이것을 움직임으로써
    미세한 단위로 음높이의 변화를 일으키는 장치인 것이다.
    이것이 움직이는 것은 아날로그의 연속된 값이므로
    볼륨을 조정하는 페달 등과 같이
    '연속적인 조종기구(Continueous Controller)'에 속하는 장치이지만
    미디 악기 안에서는 그 변하는 단위를 디지탈적으로 정해줄 수 있다.
    벤더 위치( Bender Position )값은
    0 - 127의 값을 가지며 현재의 벤더 위치를 나타낸다. '
    64'의 값은 벤더가 중앙으로 왔을 때 전송된다.
    신디사이저를 만드는 회사측에서는
    피치 벤더의 음정을 니누는 단위를 더욱 세밀하게 하기위해서
    이 메세지와 함께 부가적으로 한바이트를 더 전송할 것을 선택할 수 있다.
    2 바이트의 벤더 위치데이타를 전송함으로써
    좀 더 정밀한위치값을 얻을 수 있는 것이다.

    4) "컨트롤 체인지( BnH )" / 컨트롤러 번호 / 컨트롤러 위치
     
    이 메세지는 옵션으로 확장될 수 있는 컨트롤러들의 움직임을 나타내는 것이다.
    즉 모듈레이션 휠(Modulation Wheel)이나 각종 레버나 스위치로써
    음향효과를 내개위한 것에 관계된 메세지가 '컨트롤 체인지'인 것이다.
    이어지는 데이타 바이트중에서
    첫번째가 컨트롤러의 종류를 나타내며
    두번째 바이트가 그 데이터이다.  
    '컨트롤러 번호' 바이트는
    미디의 자료구조중에서도 상당히 이해하기 어렵게 구성되어 있는데
    정신 바싹 차리고 보아주기 바란다.
    이 바이트는 아래와 같이 비트단위로 의미를 부여할 수 있다.
    컨트롤러 번호 바이트 = 0ccccccc = 0edccccc
    앞의 0ccccccc는 뒤의 테이블에서 쓰는 기호로서
    단지 컨트롤러 종류를 나타내는 바이트라는 의미이다.
    뒤의 0edccccc는 그 바이트를 더욱 세분한 것으로
    'e'는 'Effector'를 나타내는 것으로
    컨트롤러( = Effector )가 아날로그 값을 갖는 것이냐
    스위치의 ON, OFF로서 나타내어지는 것이냐를 구분하는 비트로서
    0 - 63까지의 값과 64 - 127의 범위로 나누어 준다.
    'ccccc'는 컨트롤러 번호를 나타내는 것으로
    32가지의 컨트롤러를 표시할 수 있다.
    이것이 앞의 'e'비트와 조합되어
    0 - 31은 아날로그 컨트롤러를 나타내는데 쓰이며
    64 - 95의 값은 스위치조작에 의한 컨트롤러를 표시하게 되는 것이다.
    'd'는 'Detail bit'로서 'ccccc'비트에 종속된다.
    0 - 31의 아나로그 컨트롤러의 경우
    뒤따라오는'컨트롤러 위치'바이트의 0 - 127 값을 가지고서는
    정확한 표현이 어렵다.
    그래서 32 - 63의 값은
    0 - 31이 나타내는 컨트롤러의 데이타를 더 전송한다는 신호로 쓰인다.
    이렇게 함으로써 좀 더 세밀한 위치 데이타의 전달이 가능한 것이다.
    또한 'e'비트 값이 '1'인 경우
    'd'비트 값도 '1'이면 96 - 127의 값을 가지게 되는데
    논리상 64 -95의 스위치 컨트롤러의 확장 명령으로 써야 하지만
    스위치는 ON,OFF의 값만 전달하면 되므로 다른 용도로 쓰이는데,
    122 - 127 값을 제외한 나머지 값들은 지금 쓰이지않고
    나중의 확장을 위해 남겨둔 것이고
    122 - 127의 값은 범위가 바뀌어 "채널 모드 메세지"를 나타내는데 쓰인다.
    다시 말하면 '채널 모드 메세'는
    '채널 보이스 메세지' 안의 '컨트롤러 체인지' 메세지 안에 숨어 있는 것이다.
    컨트롤 체인지의 둘째번 데이타 바이트는
    컨트롤러의 위치를 나타내는데
    아날로그 컨트롤러의 경우
    0 - 127 의 값으로 그 위치를 나타내며 스위치 컨트롤러의 경우
    '0'은 'OFF'를 나타내고 '127'은 'ON'을 표시한다.

    5) "키 프레슈어(Key Pressure) ( AnH )" / 건반 번호
        애프터 터치(After touch)
     
    " 키 프레슈어"는 말 그대로
    악기의 건반이 눌려진 후의 압력( After Touch )에
    얼마나 반응하느냐에 대한 메세지이다.
    회사에 따라,모델에 따라 지원하는 것도 있고 안하는 것도 있다.
    이런 효과를
    '애프터 터치(After touch)라고 하는데
    비브라토(Vibrato)나 트레몰로(Tremolo) 등의 효과를 내는데 쓰인다.
    이것은 건반 한개에 대해 작용한다는 것이
    다음의 "채널 1프레슈어"와 구분되는 점이다.

    6) "채널 프레슈어(Channel Presure) ( DnH )"
        애프터 터치( After touch )
     
    "채널 프레슈어"는 악기 전체에서
    '키 프레슈어'가 걸리도록 하는 기능으로
    한개 건반의 프레슈어 신호가 그 소리의 모든 음에서 적용되도록 하는 것이다.
    예를 들어'도'와 '솔'을 동시에 누르고서
    '도'음에만 프레슈어( Pressure )를 걸어서 비브라토 효과를 낼 경우
    '솔'음에도 갇은 효과가 생기도록 하는 기능이다.
    이 메세지는 다음의 "프로그램 체인지"와 함께
    데이타 바이트가 하나뿐 이라는 것도 특기할만 하다.

    7) "프로그램 체인지( Program Change ) ( DnH )
        프로그램 번호
     
    이 메세지는
    음색 선택 버튼을 누르거나 음색번호 증감 키로써
    음색을 변화시키 때 생성되는 메시지로
    다음의 한 바이트는 128가지의 음색 프로그램 번호를 가리킨다.
    미디에서는 데이타값들이 통일되어 있지 않으므로
    수신측에서 연주시에 맞추어 주어야 한다.
    즉 10번 프로그램으로 나간 "프로그램 체인지" 메세지가
    다른 수신하는 악기에서는 5씩 더해져서 15번 음색으로 연주할 수도 있는 것이다.
    그러나 그 변화량은 회사에서 악기를 디자인 할때 정해져서 나온다.

    ( 2 ) 채널 모드 메세지 ( Channel Mode Massege )
     
    미디 채널의 이점을 최대한으로 이용하기 위해서
    몇개의 미디( 채널 )모드가 정의되었다.
    그러나 불행히도,이것이 미디가 생기면서 바로 생긴 개념이 아니라서
    이것을 설명하는 옴니, 폴리,모노( OMNI,POLY,MONO )의 용어가
    다른 미디악기의 기능이나 특성을 나타내는데 중복되 어 사용된 관계로
    조금은 혼란을 가져올 수도 있는 개념이다.잘 이해하기 바란다.
    미디 (채널)모드를 구성하는 데에는 두가지 요소가 있다.
    하나는 채널의 할당에 관한 것으로
    '옴니 ON'과 '옴니 OFF'로 나타내어 진다.
    어떤 악기가 '옴니 모드( OMNI Mode )로 세트되어 있으면
    그 악기에 들어오는 모든 정보는 소리가 나는 것이다.
    다른 하나는 소리의 할당에 관한 것으로
    단음으로 나느냐 화음이 날 수 있냐( MONO인지 POLY 인지)를 결정하는 것이다.
    '채널 할당'은 한 악기에 대해서
    어떤 채널의 메세지에 대해서 응답할 것인가를 결정하는 것이며
    '소리 할당'은 한 악기의 소리가 채널에 단음만 나게 대응되느냐,
    화음을 내면서 대응되느냐 하는 것을 결정하는 것이다.
    이런 메세지의 조합에 의해서
    한 악기에 들어온 소리는 모두 소리나는 것이 아니라는 것도 중요하다.

    oooo 채널 할당 ooooooo
       
    1) 옴니 ON ( OMNI ON )
     
    '옴니 ON'으로 세트 되어 있으면
    그 악기는 채널이 지정된 것에 관계없이
    미디 IN으로 들어오는 소리를 내거나 음색을 변화시키는 것 등의
    모든 메세지에 대해서 반응을 한다.

    2) 옴니 OFF ( OMNI OFF )
     
    악기가 '옴니 OFF'로 설정되어 있으면
    그 악기는 특정 미디 채널에 할당되어 질 수 있다.
    그러면 그것은 오직 할당된 채널에 대한 메세지에 대해서만 반응하려고 하며,
    다른 채널의 데이타는 무시한다.
    또 보이스 메세지를 미디 OUT을 통해서 보낼 때에도
    할당된 채널로만 메세지를 전송한다.
    보통 수신 채널과 전송 채널을 같은 것으로 두는 것이 일반적이다.
    그러나 어떤 악기들은 각기 다른 채널로 메세지를 수신하고 전송하기도 한다.
    이 채널 할당에 관련된 기능들은 일반적으로
    '옴니 ON'으로 지정되어 있으면 '옴니'라든지
    '올(ALL)'이라고 표시되며,'옴니 OFF' 로 세트되면
    1 - 16까지의 채널 번호로 표시된다.

    oooo 소리 할당 oooooo
     
    대부분의 신디사이저는 그것의 내부 음색을 한번에 하나씩 지정하게 되어 있다.
    즉 건반을 누른 소리는 음색을 바꿔주지 않는 이상 같은 것이다.
    어떤 신디사이저는
    두개나 그 이상의 음색을 건반에 나누어서 '뿌려줄' 수 있는 것도 있다.
    예를 들어 음색 두개가 건반의 오른쪽과 왼쪽으로 나누어져서 뿌려진다면
    각 부분은 각각의 음색을 가지는 것이다.
    미디에서는 한 악기의 음색을 채널에 지정할 때
    그 소리가 화음으로 나느냐 단음으로 나느냐를 결정할 수 있게 하고 있다.
    즉 한 채널의 소리가 동시에 여러개 나느냐,
    한음씩만 나느냐를 결정하는 것이다.

    1) 폴리( POLY ) : 화음이 나온다.
     
    한 신디사이저가 그것의 음색을 화음이 나게( Polyphonically )할당하는 것을
    '폴리 모드'라고 한다.
    대부분의 신디사이저는
    그들의 건반에서 나는 음을 하나의 음색에 할 당하게 되어 있다.
    그러나 어떤 것은 음색을 건반이나 음역의 각 그룹에 뿌릴 수 있다고 했다.
    이때 그 기기는
    마치 두개나 그 이상의 화음이 나는 신디사이저로 동작하는 것이다.

    2) 모노 ( MONO ) : 단음만 나온다.
     
    한 신디사이저가
    그 음색을 각기 다른 음역에 한번에 한음씩만 나게 할당하는 것을
    '모노 모드'라고 한다.
    예를 들어 여섯 음색을 가진 신디사이저가 모노 모드로 설정되어 있으면
    그것은 여섯개의 독립적인 단음만 나는 신디사이저로 동작하 게 되는 것이다.

    oooo 네 가지 미디 모드 oooooooooo
     
    옴니 ON/OFF 와 폴리/모노의 조합은 네가지 미디 모드를 만든다.
    한 악기는 항상 아래의 네가지 미디모드 중의 하나에 있는 것이다.

    1) 옴니 ON / 폴리 ( 미디 모드 1 )
     
    이것이 스텐다드 미디모드로
    악기가 처음 켜질 때에는 자동적으로 이 모드가 설정된다.
    여기서는 신디사이저가
    미디 IN 포트로 들어오는 모든 메세지에 대해서
    채널에 관계없이 반응하며 모든 음들은 하나의 음색에 할당된다.
    또한 이 '옴니 ON / 폴리'모드에서는
    신디사이저가 미디 OUT을 통해서 내보내는 보이스 메세지는
    하나의 채널로 나가게 된다.
    만약 이 모드만 지원하는 악기가 있다면
    이때는 항상 채널 1번으로 메시지를 내보내게된다.
    대부분 '옴니 ON / 폴리'모드에사의 메세지 전송은
    채널 1번을 통해서 하고 있다.

    2) 옴니 OFF / 폴리 ( 미디 모드 3 )
     
    이 모드에서는
    신디사이저가 어떤 채널(들)에 대해서 반응할 것인가에 대해서 정해줄 수 있다.
    예를 들자면,
    악기가 채널 2번에 세트되어 있다면
    그것은 오직 채널 2번으로 할당된 메세지에 대해서만 동작하고
    나머지 채널로 들어오는 메세지는 무시한다.
    대부분의 경우,
    각 건반의 음들은 하나의 음색에 할당된다.
    악기에 의해서 전송되는 모든 보이스 메세지들은
    하나의 채널에 할당된다.
    아래의 < 그림 9 >에는 특별히 수신 채널과 송신 채널이 같지만
    어떤 악기에서는 그것을 다르게 해주어도 되는 것도 있다.
    만약 신디사이저가 그 음들을 각기 다른 음색에 할당할 수 있다면
    각 그룹의 소리들은 각기 다른 채널을 가질 수 있다.
    이때에는 한 신디사이저가
    두개이상의 화음을 내는 독립된 신디사이저로 바뀌는 것이다.
     
    이 모드에서는 선택된 채널을 베이스 채널이라고 한다.
    앞에서 말한 음들을 각기 다른 음색 에 할당할 수 있는 신디사이저라면
    각 그룹의 소리들은 각기 다른 채널에 대응한다.
    즉 베이스 채널과 그 다음( +1 )채널로 대응되는 것이다.
    어떤 악기에서는
    각각의 분리된 건반이 어떤 채널 번호라도 할당이 가능한 것이 있다.
    이 경우는 "베이스 채널 + 1"의 할당기법만 가능하다는 제약이 없다.

    3) 옴니 OFF / 모노 ( 미디 모드 4 )
     
    이 모드는 오직
    그 악기가 각 음이 각기 다른 음색에 대응될 수 있을 때에만 유용하다.
    각 음색은 각기 다른 채널에 대해서 반응하는 것이다.
    이것응 그 악기를 하나의 모노포닉 신디사이저의 그룹으로 만들어 준다.
    이들 각각의 모노포닉 보이스들은 각기 다른 연속된 채널 번호가 주어진다.
    이들은 옴니 OFF 를 선택할 때 베이스 채널을 정하면
    자동적으로 그 1 이 더해진 채널이 각각에 할당되는 것이다.
    만약 한 악기가 여섯 부분으로 나누어져서 미디 모드 4 로 세팅되어 있으면
    그들은 각각 베이스 채널과 그 위의 다섯 채널에 대응되는 것이다.
    그리고 그 채널 번호가 16이 넘으면 다시 1부터 시작한다.
    베이스 채널이 13이고 다섯 부분이 나누어져 있다면
    채널은 13,14,15,16하고 1이 대응되는 것이다.

    4) 옴니 ON / 모노 ( 미디 모드 2 )
     
    이것은 거의 안쓰이는 미디 모드로 단지 짝을 맞추기 위해서 집어 넣었다.
    이 모드에서는
    모든 채널 보이스 메세지들이 단 한개의 음색에 그것도 단음만 나오게 할당된다.
    이 모드에서 전송할 때는
    오직 한 음색에 대한 메세지만이 한 채널로 전송될 수 있다.
    이 모드는
    모노포닉 신디사이저와
    폴리포닉 신디사이저간의 인터페이스 에 사용되도록 만들어졌다.
    폴리포닉 신디사이저간의 인터페이싱에는 필요가 없는 것이다.

    5 . 미 디 시 스 템 메 세 지
     
    한 미디 시스템 내에서 특정 기기에 보내는 채널 메세지와는 달리,
    시스템 메세지는 미디를 통해서 모든 악기들에 의해 받아들여진다.
    이들 메세지는 미디 시스템 전체에 유용한 정보를 교환하는데 쓰인다.
    시스템 메세지는 채널 정보를 가지지 않으므로
    미디 모드나 채널 할당에 관계없이 어떤 악기에서도 사용가능한 메세지이다.
    아래는 대체적으로 자주 쓰이는 미디 시스템 메세지의 리스트이다.

    ( 1 ) 시스템 공용 메세지( System Common Message )
     
    이 메세지들은
    매스터 컨트롤러와 시퀀서나
    드럼 머신 같은 기계에 사용하기 위한 메세지이다.
    지금은 모든 악기들이 이 메세지들을 다 활용하지는 못하지만
    미디에는 확장을 위해서 남겨놓은 부분이 제법 있기 때문에
    제법 유연성은 있다.

    1) " 곡 위치( Song Position )( F2h ) " / 포인터(Pointer) 1 /포인터 2
    이 메세지는
    미디 시퀀스( Sequence , 시퀀서에 저장된 곡의 데이타 ) 의
    위치를 나타내는데 사용된다.
    포인터 값은 한 시퀀스의 시작으로 부터의 16분 음표의 갯수를 나타낸다.
    이 포인터를 나타내는데는 2 바이트를 쓰지만 데이타 바이트라서
    최상위 비트는 '0'이므로
    128 * 128 = 16384 개의 16분 음표가 표시 가능한 것이다.

    2) " 곡 선택( Song Select ) ( F3h ) " / 곡의 번호( Song Number )
    이 메세지는 드럼 머신이나 시퀀서에 저장된
    특정 미디 곡(Song)을 선택하는 메세지로서 전송된다.
    이 메세지는 퍼포먼스 정보는 가지지 않고,
    저장된 곡의 번호를 가리키는 곡의 번호값( 0 - 127 )만 가진다.

    3) " 튠 요구( Tune Request )( F6h ) /
    이 메세지는
    아날로그 신디사이저 내부의 오실레이터를 튠( Tune )하라는 명령이다.
    이것은 데이타 바이트가 없이
    상태바이트 하나만으로 메세지를 구성한다는 데 주의할 필요가 있다.

    ( 2 ) 시스템 리얼 타임 메세지 ( System real Time Message )
     
    이 메세지는
    아날로그 신디사이저 내부의 이 메세지들은
    미디 인터페이스에서 타이밍 참조부분에 관한 메세지들로서
    다른 메세지에 우선해서 처리되는 특성이 있다.
    심지어는 메세지중간의 상태 바이트와 데이타 바이트의 사이에는 물론
    데이타 바이트가 전송 되는 도중에도 이 메세지가 끼워져서 전송될 수 있는 것이다.
    또한 이 리얼 타임 메세지는
    런닝 상태( Running Status )의 효력을 소멸 시키지 않는 특례가 있다.
    여기서 런닝 상태에 대해서 복습을 해 보면,
    이것은 같은 상태바이트에 뒤따르는 데이타들이 계속 전송될 때
    상태 바이트를 뺀 데이타 바이트만 전송하는 상태를 말하는 것인데,
    새로운 상태바이트가 들어오면 해제된다.
    그러나,리얼 타임 메세지의 상태 바이트가
    런닝 상태의 중간에 끼어 들어도
    수신측에서는 리얼 타임 메세지의 전후를 다시 조합하여
    런닝 상태를 계속유지하는 것이다.
    런닝 상태가 아니더라도 메세지의 중간에 리얼 타임 이벤트가 발생하면
    송신측에서는 즉시 그 메시지를 전송하며,
    수신측에서도 그 메세지가 당장에는 필요치 않아도
    일단 받아두고서 그 전후의 메시지를 접속해서 신호를 처리하게끔
    미디에는 정의되어 있다.
    이 점이 미디 메세지를 받는네 고려해야될 중요한 점인 것이다.
    이 리얼 타임 메세지도 시스템 공용 메세지와 같이
    미디 시스템 내의 모든 악기에
    채널할당이나 미디 모드에 관계없이 영향을 주는 메세지이다.
    또한 이들은 데이타 바이트 없이 상태 바이트만으로 메세지를 구성한다.

    1) 미디 클럭 ( MLDI Clock ) ( F8h ) /
     
    미디 클럭은 다른 미디 메세지와 같은 선을 통해서 전솔된다.
    이것은 한 박을 24등분해서 단위 클럭으로 쓰는데
    이는 64분음-셋잇단 음표와 같은 크기이다.
    미디 클럭은 시퀀서나 드럼 머신에서 타이밍 참조를 위해서 쓰인다.

    2) 연주 시작( Start ) ( F9h ) /
     
    이 메세지는 마스터 컨트롤러의 '플레이' 버튼이 눌려졌을 때 전송되는 것으로
    접속된 시퀀서나 드럼 머신에
    그것들이 저장하는 음악( 시퀀스(Sequence) )을 처음부터연주하라는 명령이다.

    3) 연주 그만( Stop ) ( FBh ) /
     
    이 메세지는
    마스터 컨트롤러의 '스톱( Stop )' 버튼이 눌려졌을 때 전송되는 것으로
    접속된 시퀀서나 드럼 머신에 그것들이 연주하는 음악을 그만두라는 명령이다.
    그러나 '송 포지션 포인터'는 '0'으로 되지 않고 끝날 때의 값을
    그대로 가지고 있다.

    4) 연주 계속( Continue ) ( FAh )
     
    시퀀서의 '컨티뉴'버튼이 눌려지면 발생하는 메세지로
    이것을 받은 시퀀서나 리듬 박스는
    그전의 '스톱'명령으로 멈추었던 그 자리에서 부터 계속 연주를 한다.

    5) 액티브 센싱( Active Sensing ) ( FEh ) /
     
    미디에서는 '액티브 센싱'이라는 모드를 정의해 놓았다.
    이 모드에서는, 송신측에서 아무 메세지가 생기지 않을 때에는
    이 메세지( FEh )를 주기적으로 보내게 되어있다.
    이런 모드를 둔 이유는
    수신하는 기기에서
    송신측과의 미디 접속과 송신측에 이상이 없는지를 체크하기 위해서이다.
    만약 액티브 센싱을 사용하는 악기에서
    이 메세지를 받으면 다음의 미디 신호 를 IN 포트에서 기다리다가.
    더이상 새로운 메세지나 액티브 센싱 메세지가
    300ms( Mili-Second )안에 안들어오면
    수신하는 악기는 송신하는 악기와 의 접속이 끊어진 것으로 인식하고
    그때 소리내고 있던 음을 OFF해 버린다.

    6) 시스템 리셋( System Reset ) ( FFh ) /
     
    이 메세지가 들어오면
    그 악기는 전원이 처음 온(ON) 되었을때의 상태로 돌아가는
    위험한 메세지로
    악기를 만드는 측에서는 될 수 있으면 전송하지 않게 하며
    수신측에서도 대부분 이 메세지를 무시한다.

    ( 3 ) 시스템 전용 메세지( System Exclusive Messages )
     
    시스템 전용 메세지는
    특정회사나 악기간의 메세지 전달을 위한 것으로
    전용 메세지 시작 코드( F0h )와
    등록된회사 인식번호( Table VII 참조 )에 이어서
    0 - 127까지의 값을 가지는 데이타 바이트들이 계속될 수 있으며
    마지막에 '전용 메세지 끝( EOX , End Of Exclusive = F7h )' 신호를 만나면
    전용 메시지를 수신하는 상태를 벗어나게 된다.
    이는 'EOX'까지의 다량의 메세지를 자유롭게 보낼 수 있으므로
    같은 회사 악기간의 데이타 전송이나
    시퀀서간의 연주 데이타 입출력 등,여러 용도로 쓰이며
    최근에는 쌤플러의 샘플링 데이타 송수신에 많이 쓰인다.

    1) 시스템 전용 신호(System Exclusive = F0h )
       회사 인식 번호( Manufacture ID No.)
     
    전용 메세지의 시작을 알리는 'F0h'의 상태 바이트 다음의 데이타는
    회사 인식 번호가 온다.
    이 인식번호에 따라
    수신하는 기계는
    다음 메세지를 인식할 것인지
    그냥 'EOX'가 들어올 때까지 데이터를 흘려 보낼 것인가를 결정한다.
    만약 인식한다면
    이 다음 데이타들은 그 메이커에서 정한 독자적인 의미를 가지는 것이다.
    어떤 것은 음색 프로그램의 덤프일 수도 있으며
    시퀀서나 드럼머신의 데이타일 수도 있다.
    그것은 회사에서 정하기 나름인 것이다.

    2) 전용 메세지 끝( EOX , End of Exclusive = F7h )
     
    시스템 전용 메세지의 마지막에는 그 끝을 나타내는 'F7h'의 코드가 전송된다.

    6. 미 디 모 니 터 프 로 그 램 .
     
    이제 미디의 데이타가 어떻게 구성되어 있는지 어느정도 알 수 있을 것이다.
    위의 글들은 매우 지루하였겠지만
    정독을 한 독자들께서는
    "미디 인터페이스의 원리는 바로 이런 것이그나! "하며
    지금 한참 기뻐하실 것이다.
    대충 읽은 독자들은 아직 감이 잡히지 않을 수도 있겠지만
    가능한 한 새로운 용어는 처음 나올때 설명을 하는 방향으로 이 글을 썼으니
    필자 탓만은 아니라고 본다.
    이렇게 미디데이타들을 알았으면 이제 활용을 해야 할 것이다.
    그래서 여기에
    IBM-PC와 MPU-401 컴패티블한 미디 인터페이스 기기( I-1.-(3)절에서
    IBM 컴퓨터와 미디 신디사이저를 접속해 주는 유니트는
    모두 MPU-401과 호환성이 있다고 했다.
    앞으로는 MPU-401 과
    호환성있는 미디 인터페이스
    (유니트를 통틀어서 그냥 MPU-401이라고 지칭하겠다.)간에
    입출력되는 데이타를 컴퓨터의 모니터를 통해서 보는
    ' 미디 라인 모니터( MIDI Line-Moniter ) 프로그램을 소개한다.  
    이 프로그램은 Turbo Pascal 4.0으로 만들어 졌으며
    IBM-PC와 MPU-40 1유니트,
    그리고 거기에 연결된 하나이상의 신디사이저가 있어야만 정상적으로 작동한다.
    만약 MPU-401이 연결되어 있지 않다면
    그냥 ' MPU-401 Uninstalled !!! '라는 메세지만 출력하고 끝나게 된다.
    비록 미디는 연결되어 있지 않더라도
    파스칼을 아는 독자들은 이 프로그램의 흐름을 따라 한번 훑어보시면
    앞에서 설명한 데이타 구조를 확실히 이해하실 수 있으리라 믿는다.
    서론은 거창하지만 이 프로그램이 하는 일은 아주 간단하다.
    MPU-401로 들어오는 미디 신호를 받아서
    이것이 위의 다섯가지 메세지 중에서 어디에 해당하는 것이며
    그 데이타가 의미하는 것이 무엇인지를 나타낼 뿐인 것이다.
    이 프로그램을 이용하면
    신디사이저의 하나 하나의 동작에
    어떤 미디 신호가 발생하는지를 아는데 많은 도움이 될 것이다.
    그러나 이 프로그램도 몇가지 개선되어야 할 점이 있으니
    이 프로그램을 참고해서 미디 프로그램을 짜려는 분이 있다면 주의하시기 바란다.
    미디 데이타를 받아서 이를 처리하는 루틴을 개발하는 데 있어서
    제일 귀찮은 부분이 리얼 타임 메시지를 처리하는 부분이다.
    리얼 타임 메세지는 미디 데이타의 어떤 것이전송되고 있는 중에라도
    '출현'할 수 있으므로
    이 메세지를 받아들일 준비를 해 두어야 한다는 점이다.
    게다가 그 리얼 타임 메세지가 끊은 데이타의 흐름을
    다시 조합해 서 연결 시키는 루틴도 필요하다.
    만약 이런 점들을 생각 안한다면
    상태 바이트에 따르는 데이타의 갯수대로
    데이타 바이트를 읽어서 처리해 주면 그만인 것이다.
    또 한가지 신경 쓰이는
    부분은 액티브 센싱 처리이다.
    액티브 센싱 코드( FEh )가 한번이라도 들어오면
    액티브 센싱 처리 플래그를 ON 시키고서
    그때부터 액티브 센싱 처리를 해 주어야 하는데
    이때 신경쓰이는 것은
    매 300ms마다 메세지가 전송되고 있는지
    주기적으로 채크하는데 있어서 기준이 되는 클럭을 찾기가 쉽지 않다는 것이고
    또한 그 문제를 해결했 다고 해도 300ms이상 계속해서 메세지가 안들어오면
    현재 소리내고 있는 음들의 소리를 꺼야 하는데
    이를 위해서는 현재 '노우트 ON'된 음들의 리스트를 준비해야 하는 것이다.
    그 이외에도 여러 가지 문제에 많이 부딪치게 되겠지만
    여기서 모두 언급하기는 무리가 따르므로 그만 줄이고
    다음으로 넘어가도록 하자.
    넘어가도 이제는 마무리밖에는 남지 않았지만
    아무쪼록 이 프로그램이 미디를 처리하는 프로그램을 개발하는데
    많은 도움이 되었으면 하는 것이 필자의 바램이다.

    ( 원서본 인용 .... )

    --미디인의 밝은 미래를 위해--
     --HongMidi(홍사철)드림-- 

     

    '노래방 > 홍사철의 미디교실' 카테고리의 다른 글

    MIDI SPEC 1  (0) 2022.07.24
    Standard MIDI File의 개요  (0) 2022.07.24
    MIDI란 무엇인가?  (0) 2022.07.24
    NRPN과 RPN 이란?  (0) 2022.07.24
    MIDI Controller' 사용법...(홍사철)  (0) 2022.07.24
Designed by Tistory.