미디(MIDI) 신호의 byte 변환 처리 방법 - Whitmem
미디(MIDI) 신호의 byte 변환 처리 방법
Sound Development
2023-06-09 12:49 게시 8d9a800252485495d0c4

0
0
90
이 페이지는 외부 공간에 무단 복제할 수 없으며 오직 있는 그대로 게시되며 부정확한 내용을 포함할 수 있습니다. 법률이 허용하는 한 가이드 라인에 맞춰 게시 내용을 인용하거나 출처로 표기할 수 있습니다.
This page is not to be distributed to external services; it is provided as is and may contain inaccuracies.
MIDI 신호의 해독 및 처리 방법
기본적으로 윈도우 운영체제에서 피아노의 신호를 받거나 전자 악기의 신호를 받기 위해서는 MIDI 신호를 사용해야 합니다. 기본적으로 이러한 작업에 대해서는 winmm.dll의 자체 제공 함수인 midiInOpen 을 통해 콜백함수로서 신호를 받을 수 있습니다.
상기 콜백 함수를 통해 미디의 새로운 신호가 발생했을 때 이벤트를 받아볼 수 있지만, 실제 미디 작업에서 중요한 노트 번호, 상태 신호, 세기 정도를 직접 각 개별의 변수로 제공하지는 않기 때문에 직접 신호를 분류하는 작업이 필요합니다.
기본적으로 Parameter1 의 int 형 데이터에 신호 노트 번호 노트 세기가 포함되어 있으며, 이를 비트 연산을 통해 분류해 내야 합니다.
첫 바이트 부분에는 신호 정보 1바이트가, 두 번째 바이트 부분에는 노트 위치 1바이트가, 세 번째는 노트 세기 1바이트가 포함되어 있습니다. 특이한 점은, 각 1바이트의 제일 첫 비트는 사용하지 않기 때문에 실제 범위 영역은 char 데이터 형인 0~127 신호레벨 사이에서 구성됩니다.
상태 정보
먼저 status를 가져오는 부분입니다. status는 노트가 켜지고 꺼지는 등 MIDI 신호의 대 타이틀 부분을 의미합니다. 다만, 첫 바이트에 MIDI 신호가 포함되어 있는데, LSB 기준인지 MSB 기준인지에 대해서는 명확한 정보를 찾아봐야 할 것으로 보입니다. 이 게시물을 작성하는 시점에서는 int의 제일 낮은 메모리 부분에 신호 정보가 담겨 있음을 확인하였습니다. 메모리의 낮은 영역의 8비트와 0xFF 를 and 비트 연산하여 해당 부분만 남기고 1 바이트로 캐스팅합니다. 결국 status 공간에는 신호 정보만 남게 됩니다.
노트 위치 정보
다음으로 noteLocation를 가져오는 부분입니다. 노트 정보는 낮은 메모리 주소에서 1바이트 다음에 위치한 2바이트의 시작 위치에 존재합니다. 따라서 >>8 비트 연산을 통해 1바이트 부분을 버리면서 앞으로 가져오며, 가져와진 8비트 범위에서 0xFF와 and 연산하여 노트 위치 정보만 남깁니다.
Velocity 신호 세기
마지막으로 Velocity를 가져오는 부분입니다. 이는 마지막 3바이트 시작 위치에 존재하므로, 나머지 2바이트 (16비트)를 당겨온 후 0xFF와 and 연산하여 velocity 데이터만 남깁니다.
요약
byte status = (byte)(Param1 & 0xFF); byte noteLocation = (byte)((Param1 >> 8) & 0xFF); byte velocity = (byte)((Param1 >> 16) & 0xFF);
댓글 0개
댓글은 일회용 패스워드가 발급되며 사이트 이용 약관에 동의로 간주됩니다.
확인
Whitmemit 개인 일지 블로그는 개인이 운영하는 정보 공유 공간으로 사용자의 민감한 개인 정보를 직접 요구하거나 요청하지 않습니다. 기본적인 사이트 방문시 처리되는 처리 정보에 대해서는 '사이트 처리 방침'을 참고하십시오. 추가적인 기능의 제공을 위하여 쿠키 정보를 사용하고 있습니다. Whitmemit 에서 처리하는 정보는 식별 용도로 사용되며 기타 글꼴 및 폰트 라이브러리에서 쿠키 정보를 사용할 수 있습니다.
이 자료는 모두 필수 자료로 간주되며, 사이트 이용을 하거나, 탐색하는 경우 동의로 간주합니다.