본문

MIDI의 컨트롤러 메시지(Controller Message)에 대하여

[그림 1] 건반 주위에있는 다양한 버튼과 노브(knob), 휠(wheel)들을 통틀어 컨트롤러라 할 수 있다.


컨트롤러 메시지는 미디 채널에 따라서 0xB0에서 0xBF에 이르는 상태(Status) 바이트를 가집니다. 거기에 두개의 바이트를 추가로 가집니다. 그중의 첫번째는 컨트롤러 번호(Controller Number)입니다. 컨트롤 번호는 0부터 127까지 이르는 128개의 숫자 중 하나를 사용할 수 있습니다. 몇몇은 특정 목적을 위해 미리 사용용도가 지정되었고, 몇몇은 추후 사용을 위해 번호가 예약되었으며, 그리고 몇몇은 사용용도가 지정되지 않았습니다.  그리고 두번째 바이트로는 컨트롤러에 사용될 값(Value)이 들어갑니다.

대부분의 컨트롤러는 MIDI 기기가 소리를 만들어 내는 동안에도 효과를 적용할 수 있으며, 이 효과는 소리에 직접적인 영향을 미칩니다. 다시말해, MIDI 컨트롤러 메시지는 음악가가 기기를 조작하는 동안(예를들어 건반을 치는 동안)에도 효과를 적용하도록 하기 위한 일종의 수단인 것입니다.

만약 장비가 다중음색(MultiTimbral) 모듈이라면(여러 채널을 동시에 사용할 수 있는), 각각의 음색(Parts; 위의 예를 따르자면, 키보드에서 특정 건반을 눌렀을때 나는 소리)은 특정 컨트롤러 번호에 따라 다르게 반응하거나, 혹은 전혀 반응을 안할 수도 있을 것입니다. 또한 각각의 음색은 모든 컨트롤 번호에 따라 각기 다른 설정을 가지고 있으며, 그 음색은 그 음색이 지정된 채널에서 발생되는 컨트롤러 메시지에만 응답할것입니다. 그러므로 특정음색을 위한 컨트롤러 메시지는 다른 음색이 발생하는 동안에는 영향을 미치지 못할것입니다.

몇몇 연속적인 컨트롤러(Continuous Controller; 노브(knob)나 조절 휠(wheel)같은 버튼식이 아닌 사람의 손으로 값이 입력되는 컨트롤러)는 일정범위내의 어떠한 값으로도 설정이 가능합니다. 즉, 컨트롤러가 14bit 해상도를 지원할 경우에는 0에서 16,384까지, 그리고 7bit 해상도를 지원할 경우(대부분의 경우)에는 0에서 127까지 사이의 어떠한 값이라도 지원 가능합니다. 스위치 형태의 컨트롤러도 있는데, 이들은 0으로 꺼짐상태를 나타내고, 127으로 켜짐상태를 나타냅니다. 하지만 이것이 0과 127만 구분하면 된다는 의미는 아닙니다. 0에서 63사이의 값이 입력되었을 경우엔 이를 꺼짐상태로 인식하고, 64부터 127사이의 값이 입력되었을 경우엔 이를 켜짐상태로 인식해야 합니다.

많은 (연속적인 컨트롤러)컨트롤러는 사용자의 대강적인 조절(Coarse Adjustment)에 의해 관리됩니다. 그리고 좀 더 세밀한 조절(Fine Adjustment)을 위하여 추가적인 컨트롤러 번호를 가지게 됩니다. 예를들어 컨트롤러 번호 1번은 모듈레이션 휠에 의하여 대강적으로 조절됩니다. 1번 컨트롤러 번호를 사용하여 메시지를 보낼 경우, 갑작스러운 입력값의 증가가 이루어질 수 있습니다.(갑자기 휠을 확 올려버릴 경우 128단계가 훌쩍 올라가게 됩니다). 만약 이보다 좀 더 세밀한 조절을 하고 싶다면, 컨트롤러 번호 33번을 사용할 하여 해당 값을 변경할 수 있습니다.

위와같은 대강적인 조절과 세밀한 조절 두개를 갖는 컨트롤러는 14bit 해상도를 가질 수 있습니다. 즉, 1번과 33번 컨트롤러 번호를 통하여 모듈레이션은 0x0000에서 0x3FFF까지의 범위사이에서 설정될 수 있습니다. 모듈레이션 데이터의 7번쨰에서 13번째 bit는 대강적인 조절을 위한 것이고, 0번째부터 6번째에 이르는 bit는 세밀한 조절을 위한 것입니다. 예를들어, 모듈레이션 휠의 값을 0x2005(0010 0000 , 0000 0101)로 맞추고 싶다 하면, 이를 두개의 바이트로 나누고, 0~6번째 비트(뒤의 두자리, 즉 컴마 뒷부분)를 세밀한 조절을 위해 할당하고 7~13번째 비트(앞의 두자리)를 대강적인 조절을 위해 할당하는것입니다. MIDI 채널이 0일때(0xB0) 모듈레이션 값을 0x2005로 바꾸는 두개의 메시지로 이루어진 아래 예제를 참고해주세요.

1. 0xB0 0x01 0x40 (0100 0000) -> 대강적인 조절 : 
0번 채널에서 1번 컨트롤러 번호를 사용하여 00100000을 갖는 컨트롤러 메시지를 보냅니다.
(각 자리를 오른쪽부터 채워넣는것. 리틀 엔디안(little endian) 방식을 따릅니다.)

2. 0xB0 0x33 0x05 (0000 0101) -> 세밀한 조절 : 
0번 채널에서 33번 컨트롤러 번호를 사용하여 00000101을 갖는 컨트롤러 메시지를 보냅니다.
(위의 대강적인 조절과 달리 값을 그냥 넣으면 됩니다.)

몇몇 장비들은 대강적인 조절만 구현하고 세밀한 조절에 대해서는 구현하지 않는 경우가 있습니다, 예를들어 어떤 장비는 33번 컨트롤러에 대해 고려하지 않고 1번 컨트롤러만 구현했을 수도 있습니다. 이는, 기기가 모듈레이션에 대해서 7bit 해상도를 사용할 경우엔 전혀 문제가 없습니다. 단, 33번 컨트롤러 번호를 통하여 세밀한 조절을 하려 할때, 효과는 없을것입니다. 같은 원리로, 만약 현재 대강적인 조절을 통해 값을 변화시키는것 대신 세밀한 조절만을 통해 값을 변화시키길 원하신다면, 세밀한 조절에 대한 컨트롤러 숫자를 사용한 메시지만을 보내면 될것입니다. (물론 그 반대도 마찬가지입니다.) 그러므로, 만약 장비가 대강적인 조절과 세밀한 조절 둘 다에 반응할 수 있다면(즉, 14bit 해상도를 지원한다면) 다른 부분이 같이 따라올 필요 없이 (대강적인 조절 혹은 세밀한 조절중의)하나의 부분만 따로 입력이 되더라도 이를 처리할 수 있어야 할것입니다.
*참고 : 대부분의 MIDI 환경에서, 대강적인 조절은 MSB, 세밀한 조절은 LSB로 불리우지만 필자는 '대강적인', '세밀한'이라는 단어를 더욱 선호합니다.
 

====================
원문 자체가 너무나 지루하게 작성이 된데다가 해석이 애매한 단어가 있어서 이걸 해 말아 라는 의문을 가지면서 번역한 글이다. 대강적인 조절(Coarse Adjustment)과 세밀한 조절(Fine Adjustment)이 그 대표적인 예이다. 의역도 어느정도 했는데 그중 하나가 little endian. right-justified을 우측정렬이라고 하면 되겠지만 전혀 의미가 살지않아서 그나마 익숙한 리틀엔디안 방식이라고 썼는데..아마도 이것도 기기간의 통신이니 동일한 이유에서 이런 방식이 쓰인거겠지?? 본문 중간중간에 이해를 돕기 위하여 사족을 좀 달아놨는데(사실 사족 달 부분은 많은데 너무 많으면 잔소리같을까봐..) 잘했는가 모르겠다.

그리고 참고로 위에선 MIDI Controller Message라고 적었지만 MIDI 공식사이트에서는 MIDI Message Table 항목의 Control Change Messages 를 참고하면 된다. 의미상 컨트롤러 메시지라고 적는게 더 좋은것 같아서 우선 이렇게 적어놓았다. 그리고 본문에서 컨트롤러와 컨트롤을 병용했으므로 읽는데 주의가 필요하다.(메시지 전송시에는 역시 스펙에 나와있는대로 컨트롤이라는 단어를 많이들 쓰는것 같다.) 그리고 사실 위의 본문보다는 이 본문과 같이 따라온(혹은 그 반대인) 컨트롤러 숫자에 대해서 조사하다가 번역을 한것이다. 아래에도 출처를 적어놓았지만 http://home.roadrunner.com/~jgglatt/tech/midispec.htm 에 방문하여 MIDI 스펙관련 여러 사항을 확인할 수 있다.



 

댓글

Holic Spirit :: Tistory Edition

design by tokiidesu. powerd by kakao.