2008. 10. 6. 14:53

소프트웨어적인 동시음 처리방법



가상드럼에서 실시간으로 연주하는 악기에 대한 녹음 기능을 추가하기로 결정되었습니다.

가상드럼에서 총 입력되는 곳은 두개의 스틱과 두개의 페달입니다.
총 4개의 입력을 동시에 입력 받아 하나의 미디음으로 동기화 하기 위해서, 그리고 미디내의 트랙수도 최소 4개로 늘어나기 때문에 미디메시지의 상태메시지간의 동기화도 맞춰줘야 되고 하니 자료구조의 관리가 중요했습니다..

먼저 동시음인지를 알기 위해 하나의 버퍼를 두고 연주될 때마다 한 입력값씩 그 악기정보를 넣어줍니다.
버퍼에서 값을 뺄때는 일정한 시간을 두고 빼는거죠..그러면 동시음에 대한 소프트웨어적인 구현자체는
가능합니다..의외로 성능도 괜찮더군요..ㅎㅎ 따로 동시화문제가 생길 것도 없고...ㅎㅎ

자료구조에서는 입력되는 악기에 대한 정보를 저장하고 그에 대한 연주된 타이밍을 입력합니다.
이때 타이밍(delta time)은 동시에 연주된 음에 대해서 같은 타이밍(delta time)을 입력하는 것이 주된 과제였죠..

그러니까 타이밍(delta time)값은 결국 전에 입력된 연주정보에서 갱신되어야 미디포멧으로 맞기 때문에
동시음들이 줄줄이 저장되어 있는 경우 그 전에 따로 연주된 음을 찾아서 타이밍값(delta time)을
갱신해야 나중에 관리하기가 편합니다.  

세그먼트내의 Tick값을 이용하여 현재 연주되는 악기의 타이밍값(delta time)을 계산하고..
대충 Tick값이 7.5배 큽니다..대충 이정도에서 값을 바꾸며 타이밍을 잡으시면 될듯..

아무튼 문제는 동시음에 대해서 처리인데...만일 두개의 드럼스틱과 페달에서
동시음에 대한 정보를 같이 던져준다면 별로 번거로움이 없었을 겁니다.

문제는 팀원파트에서 하드웨어적으로 제공을 해주지 않았던거죠.ㅡㅡ;;;;;;
별수없이 소프트웨어적으로 해결을...~~