ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Instrument Training Simulator (스크랩)
    정리필요2 2008. 3. 11. 11:03
    Instrument Training Simulator

    학습 신촌 시뮬레이터 실제악기 HCI 리듬게임 DIRECTX




     본 프로그램의 주된 목적은 게임 상의 단순한 컨트롤러를 벗어나 실제 악기를 이용하여 게임을 진행하는데 있다. 즉 단순한 게임이 아니라 실제 악기를 학습하고 다른 사용자와 협연이 가능한 시스템을 개발 하는데 목적을 둔다.

    [프로젝트 주요기능]

      - 실시간 음정추출

     실제 악기를 이용하여 게임을 진행하기 위해서는 음정추출 알고리즘이 필요하다.음정추출 알고리즘은 크게 시간영역 기반과 주파수 영역 기반으로 구분된다. 본 연구에서는 시간영역 기반의 음정추출 알고리즘을 이용하여, 실제 악기 중 기타와 베이스의 음정을 인식했다.

      - 미디 데이터를 이용한 알고리즘 개발

     미디 데이터 파일은 각 악기에 대한 시간 정보와 음정 정보가 들어있으며, 배경음악으로 재생 할 수 있는 데이터이다. 미디파일에 입력된 음정 정보를 이용하여 시각적으로 표현하기 위해서는 기존에 없던 새로운 알고리즘이 필요했다. 기타, 베이스와 같은 현악기의 악보는 플랫과 줄 번호가 함께 출력 되어야 하기 때문에 음정 정보만으로 악보를 출력할 수 없다. 본 연구에서는 미디 파일의 음정 정보의 관계를 이용하여 최적운지 탐색 알고리즘을 제안한다. 최적운지 탐색 알고리즘은 사용자가 게임을 진행할 때에 단순한 음정 정보 악보가 아닌 실제 기타 악보와 같이 출력할 수 있도록 만들어준다.

      - IOCP 서버 구현

     음악이란 다른 악기와 협연하는 것에 즐거움이 더해지기 때문에 본 연구에서는 IOCP 모델을 이용하여 온라인 협연 시스템을 구현하였다. 각 클라이언트는 게임 시작 전에 악기를 선택하고 함께 게임을 진행하면서 협연을 할 수 있다.
     




    소아람  김영규  양태연 





     본 프로그램의 주된 목적은 게임 상의 단순한 컨트롤러를 벗어나 실제 악기를 이용하여 게임을 진행하는데 있다. 즉 단순한 게임이 아니라 실제 악기를 학습하고 다른 사용자와 협연이 가능한 시스템을 개발 하는데 목적을 둔다. 다음에 보여지는 그림은 과거의 인기를 끌었던 기타프릭스의 실제 사진이다.

     

     과거에 인기를 끌었던 리듬 게임 시장이 점차 축소되는 것은 사용자가 단순한 게임 컨트롤러의 한계를 느끼고 있기 때문이다. 미래의 게임 산업은 이와 같이 단순한 컨트롤러의 한계를 벗어나 다양한 센서 등을 이용하여 발전할 것으로 전망된다.

     실제 악기를 이용하여 게임을 진행하기 위해서는 음정추출 알고리즘이 필요하다. 음정추출 알고리즘은 크게 시간영역 기반과 주파수 영역 기반으로 구분된다. 본 연구에서는 시간영역 기반의 음정추출 알고리즘을 이용하여, 실제 악기 중 기타와 베이스의 음정을 인식했다. 그리고 시각적으로 악보를 출력하고 배경음악을 출력하기 위해서 미디 데이터 파일을 분석하였다.

     미디 데이터 파일은 각 악기에 대한 시간 정보와 음정 정보가 들어있으며, 배경음악으로 재생 할 수 있는 데이터이다. 미디파일에 입력된 음정 정보를 이용하여 시각적으로 표현하기 위해서는 기존에 없던 새로운 알고리즘이 필요했다. 기타, 베이스와 같은 현악기의 악보는 플랫과 줄 번호가 함께 출력 되어야 하기 때문에 음정 정보만으로 악보를 출력할 수 없다.



     리듬게임에서는 게임을 진행하기 위해서 곡을 선택하게 된다. 한 개의 곡에 필요한 정보는 크게 세 가지로 구분 할 수 있다. 첫째는 선택한 곡의 배경음악이 재생되어야 한다. 두 번째는 선택된 곡을 게임에 맞게 악보화 시켜야 하는데 이를 위하여 최적운지 알고리즘이 필요하다.  세 번째는 사용자가 입력한 음정과 시간 데이터를 이용하여 점수 화 시키기 위하여 선택한 곡에서 사용자가 선택한 악기의 정보와 비교할 데이터가 필요하다.  미디 데이터에는 트랙으로 구분된 악기 정보와 시간 정보가 있다. 그리고 재생도 가능하다. 이와 같이 리듬게임에서 필요한 세 가지 정보를 모두 충족하는 미디 포맷을 이용하여 제작하였다. 다음은 MIDI File Parsing에 대한 세부적인 기법 및 추출한 데이터의 활용 방안에 대하여 설명한다. 다음에 보이는 그림은 본 프로젝트에서 사용한 미디 모듈의 구조이다.


    [그림 1 ] 미디 모듈의 구조

     Header Chunk의 경우 전술한 Format에 따라 Track 갯수와 Time Base를 추출한다.Track 갯수의 경우, 총 몇개의 Track을 parsing할 것인지를 결정하는 데이터로 사용된다.Time Base는 분해능이라고도 부르는데, 분해능은 1박자를 숫자로 표현한 것으로써, 이를 활용하여 음의 Delta Time을 확인하였을 때 그 음이 몇 자인지를 알 수 있게 된다.음의 지속시간을 구하는 순서를 나타내면 다음과 같다.

      ① Track내에서 음의 Delta time을 얻는다.
      ② Time Base를 보고 Delta time이 몇 박자인지 알아낸다.
      ③ Tempo를 확인한다. 이때 Tempo란 Track의 어느 위치에서든 정의될 수 있는 값으로써,한 박자의
         연주시간을 나타낸다. Tempo의 정의 방법은 다음과 같다. Tempo set : FF 51 03 tt tt tt
      ④ Tempo를 보고 Delta Time이 몇 초 연주되는지 계산한다.

     얻은 값을 시간값으로 바꾸는 공식은 다음과 같다. 시간값 = (1000000 * 60) / tempo; (예 : Delta Time이 1박자이고, Tempo가 100인 경우 : 1 * 0.6초) Track Chunk의 경우 ("MTrk" 이벤트)=(Delta Time) (이벤트) 로 구성되어 있다. 이벤트의 구성 방식은 간단히 설명해서, 수 개의 바이트들이 한 이벤트를 구성하고 있다고 할수 있으며, 이때 이벤트를 구성하는 바이트들은 크게 Command와 Data로 구분할 수 있다.Command와 Data를 구분하는 방법은, 해당 바이트의 숫자 크기를 보면 된다. 만약, 해당 바이트의 크기가 0x80이하라면 Data이고, 이상이라면 Command이다. 또한, Command의 경우 0xF0이하인 경우 Voice Command이며, 0xF0이상인 경우에는 Real Time message이다. 이제 이벤트의 종류에 대해서 살펴보면,이벤트의 종류는 Command 이벤트, Meta 이벤트가 있으며, Command 이벤트는 다시 Voice Command와 Real Time message로 나뉘어진다. Command의 구성 방식은 상위 4비트는 command이고 하위 4비트는 그 command가 적용될 channel을 표현한다. 데이터 바이트는 크게 가변길이 데이터인지 그렇지 않은 지로 구분된다. 가변길이의 데이터의 경우에는 이어지는 바이트 최대 4개를 사용하여 데이터를 표현하며, 가변길이 데이터가 아닌 경우 0x80이하의 크기를 표현하는데 사용된다.

     다음에 보여지는 그림은 본 프로젝트의 전체 시스템 아키텍쳐를 그림으로 보인 것이다.


    [ 그림 2] 시스템 아키텍쳐

     유저 블럭에서는 기타와 마우스가 Input Manager 로 전달된다. Input Manager 에는 본 과제에서 구현된 IME 모듈과 실시간 음정 추출 모듈이 반복 실행된다. 유저의 입력 또는 시간 데이터로 판별되어 Stage 가 구성되며, 각 Stage 에는 매번 다른 노래를 선택하는 사용자를 위해 최적운지 탐색 모듈(E.F.P Module)이 연결되어 있다.
    이 모듈은 어떤 미디 데이터 라도 현악기의 운지법을 찾아주는 알고리즘이다. 여기서 결정된 데이터는 비트맵으로 출력된다. data Store 블럭에서는 서버에 저장된 유저의 정보와 게임데이터들이 연결된다.

    1. 과제 목표

     본 프로젝트는 네트워크 기능이 추가된 프로젝트로 기존에 개발된 프로토타입의 버젼에서 부족했던 부분을 강화시키고 개선 시킨다. Pitch Detection의 근본적인 FFT 연산을 GPU에서 가속화 하며, 기존에 문제가 제기되었던 노트 생성을 위해서 Dynamic Note Moudle을 제작한다. 또한 MIDI 파일에서 읽어들인 Chord를 이용하여 E.F.P.(Efficent Fingering Postion) 알고리즘을 적용 시킨다. 온라인 기능을 지원하는 모듈과 미디생성 모듈은 그리고 FFT 가속화 기능이 추가되어  전체적인 모습을 보여주고 있다. 또한 사용자 중심의 UI를 바탕으로 디자이너와의 협력을 통한 톺은 퀄리티의 작품이 기대된다.

    2. 실제 완성 결과

     Instrument Training Simulator 에서는 단순한 버튼이 아닌 실제 악기를 이용하여 게임을 하는 새로운 시스템이기 때문에 어려운 부분이 많았다. 실제 악기에서 음정을 추출하여 게임처럼 재미있고 레슨을 받지 않아도 음감과 박자감각을 키울 수 있는 프로그램을 제작하고자 했다.  PC에 연결 된 베이스기타로부터 음원을 추출하고, 원음 midi data의 베이스기타 음을 비교하여, 현재 베이스기타 연주가 올바른지 체크한다. 그리고 밴드와 같이 여러 사람이 합주를 할 수 있는 시스템을 개발하기 위해 온라인 게임 방식으로 전환 하여 개발하였다. 베이스 기타만 지원까지를 목표로 하였으나 본 시스템에서는 일렉기타와도 협연이 가능하도록 추가 개발 되었다. 실제 악기에서 음정을 추출하여 게임을 진행하기 위해서는 빠르고 정확한 Pitch Detection 알고리즘이 필요했다. 기안서에서 제안했었던 GPU 가속은 실시간 음정 추출에 적합하지 않다는 실험결과에 따라 자기 상관법을 이용하였다. 그리고 많은 노래와 많은 사용자가 게임을 진행하기 위해서는 널리 사용되고 있는 MIDI 파일을 이용하는 것이 좋다고 판단되었다. 그리고 MIDI 파일에서 특정 악기의 음정을 추출하여, 게임상의 악보로 출력하기 위해서는 특별한 알고리즘이 필요했는데, 이것은 단순한 음정 데이터 밖에 없는 MIDI 파일을 링크드 리스트에 넣고 이웃 노드들을 이용하여 실제 운지법(Fingering Position)에 맞게 화면에 출력하는 것이다.  네트워크 온라인 게임화를 위해서는 IOCP 서버를 제작하였다. 많은 사용자들을 한꺼번에 수용할 수 있으며, 접속자들을 컨트롤 할 수 있게 제작하였다.

    1. 실시간 음정 추출

     음정 추출에 대한 알고리즘은 처리 영역에 따라 크게 시간영역과 주파수 영역으로 나눌 수 있다.  본 연구에서는 악기 연주를 음정 추출하기 위하여 시간 영역에서 자기상관법을 적용 하였다. 시간 영역 음정 검출법은 시간 영역에서 직접 처리하기 때문에 다른 영역으로의 변환이 불필요하다. 시간 영역에서 분석할 수 있는 방법으로 영 교차율, 자기 상관함수, 무음비율 등이 있다. 영교차율은 특정 구간에서 진폭 값이 ‘0’이 되는 비율로 잡음을 고려하여 ‘0’ 근처의 값도 적당한 기준 값을 가지고 ‘0’으로 근사 시켜서 처리한다. 자기 상관함수는 특정 구간에서 주기적인 정보를 찾는데 사용되는 함수이다. 주파수 영역에서의 분석 방법 중 대표적인 것으로 FFT가 있다. FFT는 모든 파형은 단순한 정현파의 합으로 표현 가능하다는 성질을 사용해서 시간영역의 신호를 주파수 영역으로 변환한다. 음악 데이터인 경우 하모닉 사운드를 검출함으로써 음정을 검출할 수 있지만 FFT가 낮은 주파수 대역에서 신호를 처리하기 힘들고 표준 FFT의 빈(Bin)이 주파수에 대하여 선형적으로 위치함으로써 생기는 문제점을 보완시킨constant Q-변환을 이용하는 방법 또한 연구된다.

    2. MIDI 를 이용한 세부사항

    동적 노트를 생성하기 위해서는 해당 음정을 연주하기 위하여 연주자가 짚어야 할 현의 Line및 Flat, 그리고 해당 음정이 연주되어야 할 시점에 대한 시간 값, 마지막으로 생성한 동적 노트비트맵의 화면에 대한 스크롤 시간과 연관된 간격 비율 값이 필요하다.Line과 Flat은 EFP알고리즘에 의하여 결정되어 리스트 형태의 자료구조에 저장되어 있으며, 해당 음들의 Delta time에 근거한 연주될 시간 값 역시 보관되고 있다. 따라서, 이 세 가지 데이터들을 이용하여 기본적인 노트 위치를 지정하고, 마지막으로 스크롤 속도를 고려한 비례 상수를 곱하여 정확한 노트의 위치 및 간격을 지정한다. 노트 비트맵을 생성할 때에는 메모리에 DDB방식으로 원하는 출력을 write하고, 해당 메모리에 존재하는 데이터들을 DIB 포맷으로 변환하여 BMP파일로 저장하는 방식을 사용하였다. BMP형태로 저장된 동적 노트 파일은 게임이 진행될 때 사용자가 연주 음을 입력하는 기준이 되는 노트로 활용된다.

    3. IOCP 서버의 설계 및 구현

    최근 온라인 게임과 같은 대규모 클라이언트의 네트워크 트래픽을 처리하기 위한 서버 네트워크 I/O방식으로 IOCP(I/O Completion Port)가 가장 효과적이다. IOCP는 서버의 처리 성능을 극대화 시켜 하드웨어 비용을 감소시키는데 크게 기여 하고 있다. 클라이언트 세션마다 연결을 유지해야 하는 서버의 부담을 줄이기 위해 기존에는 UDP가 많이 사용 됐지만 클라이언트와의 상호작용이 많아지면서 서버에서의 여러 가지 기능을 구현하기 어렵고, 패킷 손실과 이에 따른 재전송 부담이 있기 때문에 최근에는 각광을 받지 못하고 있다. 또한, 세션마다 연결을 유지하는 TCP 방식에서도 각각의 클라이언트와 연결되어 네트워크 I/O를 처리하는 서버 측 작업 쓰레드가 과다할 경우 문맥전환(Context Switching)의 오버헤드가 발생해 높은 성능을 기대하기가 어려웠다. 이런 기존의 문제점을 IOCP는 해결할 수 있다.




    -Software

      [IDE] Visual Studio 2005
      [Libray] DX SDK
      [OS] Window XP




    [ 추후 개발 사항 ]

     실시간 음정 인식과 리듬게임을 잊는 것은 신호처리 분야 뿐 아니라 영상처리, 센서 등 다양한 분야에 걸쳐서 생각해 볼 수 있다. 음정 인식의 다양한 방법에 대해 연구해 보고, 본 과제에서 개발 된 네트워크 기반 시스템을 더욱 강화하는 방법을 연구해본다. 베이스를 재미있고 쉽게 배울 수 있는 환경을 제공하는 연습용 시뮬레이터로서, 게임으로도 활용할 수 있을 것이다. 또한 향후 연계 과제에서는 베이스뿐만 아니라 다른 악기도 개발하여 합주 게임화 시키고, 센서와 임베디드 장비를 연동하여 자세를 교정하는 기술도 개발할 계획이다.






     다음에 보이는 그림은 본 프로젝트의 Credit 메뉴의 영상이다. 직접 제작한 노래 '지존'과 함께 재미있는 애니메이션이 펼쳐진다.

     처음에 우리 팀원들이 모여서 공통점이 무엇인지 찾기로 한 적이 있었다. 그런데 아주 정확히 한가지로 모여지는 공통점이 있었다. 바로 음악이였다. 우리는 처음에 이 사실을 알고나서 놀라게 되었고, 음악에 대한 프로젝트를 진행하기로 마음먹었다. PL 소아람 회원은 평소 피아노와 작곡을 위주로 음악 활동을 하고 있었고, 김영규 회원은 클럽에서 유명한 기타리스트였다. 그리고 양태연 회원은 폭발적인 가창력을 자랑하는 보컬이였다. 우리는 그렇게 시작하게 되었고, 프로젝트 진행 중에 힘든 일이 있어도 서로를 하나로 모아주는 음악이 있기에 성공할 수 있었다.




     실제 악기에서 나는 소리를 분석하여 음정 추출을 통해 게임이 진행된다는 것이 재미있었습니다. 다만 아쉬운 점은 음정추출 부분에서 반응이 약간 느리다는 점이 있었습니다. 다음 연계과제에서는 이러한 점을 보안하여 여러 악기들이 합주하는 모습을  기대해 봅니다. [대한민국 소프트웨어공모전 은상]



     

Designed by Tistory.