[8호]2010 캡스톤 최우수 – 드럼 음원 분리와 Zigbee 통신을 이용한 전자드럼
2010 디바이스마트
캡스톤 디자인 공모전 최우수상
드럼 음원 분리와
Zigbee 통신을
이용한 전자드럼
글 | Magic Drum 팀[박병조, 이호섭, 이종혁, 박지훈]
1. 작품개요
1_1 선정 배경
드럼은 타악기로써, 여러 가지 장점을 가진 악기이다. 첫째, 두뇌를 자극하는 효과가 있다. 드럼의 연주 시 양손과 발을 따로 움직여야 하기 때문에 평소에 잘하지 않던 행동을 함으로써 뇌의 자극을 더 주게 된다. 두 번째, 타악기의 특성상 오장육부와 사지를 사용해 연주하는 종합적인 운동기구이다. 악기 중에서도 최고라 불릴 만큼 신체 에너지를 많이 사용한다고 알려져 있고, 운동의 기능도 겸비한다고 할 수 있다. 세 번째, 심리적 효과이다. 그 예로 음악 치료센터라든가 음악 치료사들이 가장 많이 활용하고 있다. 또한 일상생활에 지친 사람들에게 스트레스의 탈출구로도 각광받고 있다. 이 같이 드럼은 많은 장점을 가지고 있는 악기이다. 하지만 몇 가지 제약들로 인해 드럼은 대중화 되지 못하고 있다.
드럼은 필요한 구성품이 많은 악기이다. 따라서 다른 악기에 비해 연주할 공간이 많이 필요하다. 그리고 타악기의 특성상 소음도 많이 발생하기 때문에 가정집에서 연습하기에 적당하지 않다. 비싼 가격 또한 개인에게는 부담이 된다.
Magic Drum은 이 같이 드럼의 장점을 고스란히 담고 단점을 보완하여 일반대중들에게 좀 더 친근하게 다가가고자 개발되었다. 그리고 Magic Drum의 핵심 아이디어는 주위의 사물을 드럼으로 쓰면 어떨까 하는 발상의 전환으로부터 시작되었다.
1_2 작품 개요
타악기란 물체를 (도구로) 때리거나, 흔들거나, 문지르거나, 긁거나 하여 물체가 진동(혹은 공명)할 때 소리를 내는 악기를 의미한다. 따라서 주의의 사물에 충격을 가했을 때, 그 진동을 감지할 수 있다면 사물을 드럼으로 쓸 수 있다는 결론이 나온다.
Magic Drum은 사물에 가해진 충격으로 인한 진동을 감지하고, PC에서 감지된 데이터를 입력신호로 해서 알맞은 드럼의 소리를 재생시켜 준다. Magic Drum은 주위의 사물을 드럼의 구성품으로 사용하고, PC를 이용하므로 드럼의 공간의 제약으로부터 자유롭다. 그리고 사운드를 조절하거나, 스피커에 이어폰을 장착해 소리크기를 조절할 수 있으므로 가정에서도 드럼을 즐길 수 있다. 또한 사물의 진동을 감지하는 장치는 드럼의 가격에 비해 훨씬 저렴하며, 가정에 있는 PC에 프로그램을 설치하기만 하면 되므로 드럼의 금전적인 부담을 덜었다.
Magic Drum은 크게 사물의 진동을 감지하는 하드웨어 장치와 PC에 설치되는 소프트웨어 프로그램으로 구성되어 있다. Magic Drum의 사물의 진동을 감지하는 하드웨어 장치는 Drum Manager라고 부르며, 핸드폰 보다 조금 큰 크기이고 바닥 쪽에는 집게가 부착되어 사물에 쉽게 설치될 수 있다. 그리고 사물과 밀착되는 부분에 얇은 플라스틱 판이 있어 사물의 진동을 감지한다. 감지된 신호는 Magic Drum 소프트웨어 프로그램이 설치된 PC로 무선으로 전송이 된다. Drum Manager는 최대 7개까지 복수로 설치가 가능하여, 사용자의 입맛에 맞는 드럼을 구성 할 수 있다.
Drum Manager | Magic Drum PC Application |
Drum Manager로부터 전송된 신호는 PC에 설치된 프로그램에서 처리되어 사용자에게 드럼의 소리와 시각적 효과를 주게 된다. Magic Drum은 사용자가 지루하지 않고 드럼을 즐길 수 있도록 게임의 요소를 도입하였다. 그리고 디지털적인 장점을 살려 일반 MP3파일을 배경음악으로 등록해서 연주를 할 수도 있다.
2. 시스템 아키텍처
2_1 시스템 아키텍처
Magic Drum 시스템은 크게 입·출력 두 부분으로 나눌 수 있다. 입력 부분은 Drum Manager라 불리는 하드웨어 모듈이고 출력 부분은 WPF(Windows Presentation Foundation)으로 제작된 Windows용 응용 프로그램이다.
전체 흐름을 보았을 때 사용자는 Drum Manager를 책, 책상, 의자 등의 임의의 사물에 부착을 하고 이 사물을 ‘드럼스틱’으로 가격하는 것으로 드럼을 연주하는 것을 대신하게 된다. Drum Manager는 자신이 부착된 물품에 충격이 가해졌을 때 그 진동의 정도를 감지하여 컴퓨터로 전송하게 되고 컴퓨터는 전송 받은 데이터를 분석하여 드럼 소리를 내고 응용 프로그램 내에서 표시된 드럼 이미지가 가격된 것처럼 흔들리게 되는 등의 일을 수행하게 된다. 이러한 일련의 과정을 통해서 사용자는 Drum Manager가 부착된 임의의 사물을 하나의 드럼처럼 느낄 수 있게 된다.
2_2 하드웨어 아키텍처
Drum Manager는 일반의 사물을 드럼으로 바꿔 주는 기능을 하는 장치이다. Drum Manager의 전체적인 형태는 집게 위에 임베디드 모듈이 부착되고 집게가 물체를 집는 형태로 구성하였다.게임 진행 시에는 진동 필름 센서로 사물의 진동을 감지할 수 있게 된다. Drum Manager는 드럼 채로 가격한 사물의 진동을 감지하고, 데이터들을 컴퓨터로 전송한다.
Drum Manager는 크게 MCU, 진동 감지 센서, 배터리 및 충전회로, Zigbee 등으로 구성되어 있다.Drum Manager의 작동 원리는 다음과 같다.
1. (드럼 매니저가 부착된 물체에) 진동 발생
2. (진동 감지 센서인 Piezo film sensor에서) 진동 신호 감지
3. 신호 증폭
4. 아날로그 -> 디지털 데이터로 변환
5. 변환 된 데이터를 Zigbee를 통하여 PC로 송신
요약하자면, Drum Manager는 진동을 감지하고 감지한 진동을 디지털 데이터로 변환 후 자신의 Zigbee 모듈에서 PC에 연결된 Zigbee 모듈로 데이터를 송신하는 역할을 수행한다. 여기서 전송되는 데이터의 양식은 콤마 두 개로 구별되는 세 개의 숫자를 기본으로 하며 줄 바꾸기로 각각의 신호의 경계를 구분 한다. 예를 들자면, 우측 괄호 안의 내용처럼 신호가 전송될 수 있다. [ 3, 14, 55 ] 괄호 안의 내용은 3번 Zigbee 모듈에서 중간 세기의 진동이 14회, 강한 세기의 진동이 55회 발생했다는 뜻이다.
이러한 식으로 강한 진동과 약한 진동을 구별하여 전송함으로써 얻을 수 있는 효과로는 PC에서 구동되는 소프트웨어 입장에서는 현재 발생한 진동이 어느 사물에 부착 된 Drum Manager에게 발생했는지, 어느 정도의 세기로 발생한 것인지라는 두 가지의 내용을 포함하여 받게 될 수 있기 때문에 이를 응용하여 조금 더 풍부한 컨텐츠를 유도할 수 있다는 장점을 가지고 있다.
2_3 소프트웨어 아키텍처
컴퓨터에는 Magic Drum의 소프트웨어가 설치되게 된다. Magic Drum의 소프트웨어는 WPF로 제작되었으며 Windows의 .NET Framework가 설치된 환경에서 작동하게 된다. 컴퓨터에는 Drum Manager들로부터 데이터를 수신하기 위한 Zigbee모듈이 하나 부착되게 되고, 이 Zigbee 모듈을 Serial COM Port를 통해서 접근하게 된다. Magic Drum의 SW에서는 Zigbee가 연결된 Serial COM Port를 계속적으로 관찰하면서 COM Port에 수신된 데이터가 존재한다면 그 데이터를 분석하여 1번 드럼을 강하게 치는 사운드와 이미지 효과를 낸다는 등의 그 데이터가 표시하는 것에 알맞는 일을 수행하게 된다.
3. 결과물
3_1 Drum Manager
Drum Manager는 주위의 사물을 드럼으로 바꿔 주는 장치이다. 즉, Drum Manager는 사물에 설치되어 사물에 가해진 충격의 진동을 감지하여 PC로 신호를 전송하는 역할을 한다. Drum Manager는 중심에 하드웨어 장치들이 있고, 그 주위를 상자와 같은 외곽형틀이 감싸서 보호하고 있다. Drum Manager의 크기는 일반적인 핸드폰보다 조금 크고 바닥부분에는 집게가 부착되어 있다. 그리고 집게의 집는 부분의 끝에는 얇은 플라스틱 판이 있다. 이는 사물에 밀착되어 진동을 감지하는 성능을 향상 시켜주는 기능을 한다.
Drum Manager 외형 |
Drum Manager는 고정된 사물이거나 수평의 사물 위에서는 그냥 올려 놓는 것으로 설치가 끝나며, 경사가 있는 사물이거나 움직이는 있는 가벼운 사물일 경우는 바닥의 집게를 사용하여 설치를 한다.Drum Manager의 사물의 진동감지성능은 설치된 사물에 영향을 받는다. Drum Manger의 사물의 진동감지성능을 제대로 발휘하기 위해선 딱딱한 사물을 사용하는 것이 좋으며, 충격을 흡수하는 사물은 사용하지 않는 게 좋다. 그리고 Drum Manager가 설치된 사물에 충격을 줄 때 충격지점과 Drum Manager의 간격이 일정범위 이상을 넘어가면 진동감지성능이 저하되므로 주의해야 한다.
3_2 Magic Drum 소프트웨어
3.2.1 메인 화면
Magic Drum 소프트웨어 프로그램은 PLAY, MUSIC REGISTRATION, PRACTICE, OPTION 모드로 구성되어 있다. 그리고 조작은 키보드, Drum Manager 두 가지 방식으로 조작이 가능하다.
3.2.2 연주 모드
PLAY모드는 사용자가 원하는 음악을 선택해서 드럼을 연주할 수 있다. PLAY모드의 기본 인터페이스는 ‘비트매니아’와 유사하다. 7개의 수직의 통로에서 원모양의 물체가 내려오는데, 통로의 아래쪽에 위치한 수평선의 중앙에 오는 시점에 맞게 해당 드럼을 치면 점수로 환산된다.
점수는 원모양이 내려왔을 때 얼마나 정확한 타이밍에 드럼을 치느냐의 정확성과, 음악의 노트정보 내의 드럼의 세기에 따라서 산출되며, 연속으로 이와 같은 요건을 만족 하였을 시, 콤보 점수가 플러스가 되게 된다. 사용자가 드럼을 치면 일렬의 통로 밑의 드럼의 해당 부분이 불빛을 내고, 해당 드럼의 그래픽이 흔들리게 되어 자신이 직접 드럼을 친 것 같은 느낌을 제공해 준다.
3.2.3 연습 모드
PRACTICE모드는 이름 그대로 사용자가 드럼을 연습을 좀 더 자유롭게 할 수 있는 환경을 제공한다. 연습모드에서는 배경 음악이 제공되지 않으며, 그로 인해 사용자 자신의 드럼 소리에 더욱 집중해서 연습할 수 있다. 그리고 PLAY모드와 마찬가지로 사용자가 드럼을 쳤을 때, 화면에 보이는 해당드럼에 시각적 효과를 주어 사용자가 실제로 드럼을 친듯한 느낌을 준다.
4장에 설명되는 따라 하기 식의 강좌는 Magic Drum의 연습모드의 일부분을 만드는 형태로 진행될 것이다.
3.2.4 음악 등록 모드
음악 등록 모드에서는 기존에 리듬게임이 한정적인 음악 제공방식을 탈피해서 사용자가 직접 MP3파일을 게임의 배경음악으로 사용할 수 있다. 그리고 등록한 음악을 드럼음원 분리 처리를 해서 드럼 소리가 제거된 음악을 사용 하는 것이 가능하다. 드럼 소리가 제거된 음악은 PLAY모드에서 사용자에게 자신의 드럼소리로 음악을 완성하는 느낌을 주어 더욱 실제감을 높여준다. 또한 기본적으로 mp3 포맷을 지원하며 사용자가 원하는 곡을 선택했다면 그 곡의 mp3 헤더에서 음악의 전체 길이와 곡 이름 등의 정보를 가져 오게 된다. 음악의 총 재생 시간이 180초 라면 각 1초마다 0.1초 단위로 타이밍을 분해하여 사용자가 음악에 PLAY모드에서 사용할 태그(음악에서 드럼의 소리의 시점을 시각적으로 표시하는 원모양의 물체)를 직접 등록할 수 도 있다.
음악 등록 모드에서는 앞서 설명했듯이 단순히 mp3 파일을 가지고 연주할 곡을 만드는 작업만 하는 것은 아니다. 사용자의 선택 사항에 따라서 연주할 곡에 이미 들어 있는 드럼 음원을 제거 할 것인지 아닌지를 선택적으로 수행할 수 있다. 예를 들자면 A라는 곡이 원곡에는 드럼 소리가 들어있는데 Magic Drum에서 사용하려고 음악 등록 모드에서 곡 등록을 할 때 A라는 곡의 드럼 소리만 제거해서 저장할 수 있다는 것이다. 이러한 기능을 제작하기 위해 우리는 “비음수 행렬의 부분적 공동 분해를 이용한 드럼 음원 분리, 유지호, 한국정보과학회 2009 가을 학술발표논문집 36권 2호 p215~220”의 이론과 수식을 참고하였다.
4. 실습
4_1 개발 목표
지금부터 Magic Drum을 제작하는 과정을 구체적으로 살펴보겠다. 위에서 보여드렸던 모든 부분을 다 수록하기 위해서는 너무나 많은 분량과 시간이 필요하기 때문에 여기에서는 Magic Drum에서 중요한 역할을 하는 하드웨어 모듈 제작과, 제작한 모듈을 PC에 연결하여 Magic Drum 연습 모드를 구현하는 것을 목표로 한다. 실제 Magic Drum의 Drum Manager는 강약을 구별 하는 기능이 있지만 실습 예제에서는 강, 약 구별없이 진동 자체를 감지하는 내용으로 구성하였다.
4_2 하드웨어 제작
4.2.1 HW 모듈 구성
Magic Drum은 Snare, Small Tom, Large Tom, Floor Tom, Bass, Hi-hat, Crash 의 7가지로 구성되어 있다. 각 드럼마다 진동을 감지하여 신호를 날리고, 각각의 신호를 수신하여 PC로 전송해주려면 Drum Manager 7개와 PC에 연결 될 Zigbee 모듈 1개가 필요하다. 한 종류의 모듈로 수신, 발신 기능을 다 할 수 있도록 제작하여 사용 편의성을 높였다.
Drum Manager은 센서의 진동을 받아 증폭시켜주는 증폭 부분, 증폭된 신호를 처리하여 시리얼 통신을 통하여 전송해주는 MCU부분, MCU에서 받은 데이터를 전송해주는 인터페이스 부분으로 나누어져 있다. 또한 휴대 및 설치의 편의를 위한 배터리 및 전원부분을 함께 구성하였다.
4.2.2 회로도
Drum Manager의 회로도를 첨부하였다. 하드웨어 아키텍처에서도 알 수 있듯이 회로가 복잡하지 않고 간단한 편이다.
4.2.2.1 센서 증폭부
센서부이다. 피에조 필름 센서에서 들어오는 신호를 opamp를 이용하여 증폭한다.
4.2.2.2 MCU부
MCU부이다. MCU로는 ATmega32L을 사용하였으며, 기본 동작을 위한 주변 회로 외에 상태를 알 수 있도록 LED를 추가하였다. 이 부분은 MCU의 동작에만 필요한 부분이므로 시중에 판매되는 MCU 모듈을 사용해도 무방하다.
4.2.2.3 인터페이스 부
Drum Manager가 다른 모듈 또는 PC와 통신하기 위한 부분이다. PC와 연결을 USB로 쉽게 할 수 있도록 FT232RL을 사용하였다. FTDI 사의 FT232 칩은 UART통신을 USB로 연결할 수 있도록 해준다. 이 칩을 사용해서 PC에 드라이버를 설치하여 연결하면 Windows의 장치 관리자에서 COM 포트로 인식이 된다.
센서 값을 전송해주는 Zigbee 모듈의 경우 Digi사의 XBee 를 사용하였다. ATmega32L은 UART가 하나밖에 없기 때문에 스위치를 이용하여 드럼 모듈일 경우와 PC 수신 모듈일 경우를 선택하여 사용할 수 있도록 하였다.
4.2.2.4 전원부
Drum Manager에서는 USB를 연결할 경우 공급되는 전원이 5V, 배터리는 리튬폴리머 1cell 배터리를 사용하여 3.7 V이며, ATmega32L과 XBee는 동작전압이 3.3V, FT232RL은 5V에서 동작하므로 각각에 맞게 전원을 구성하였다.
또한 배터리 충전을 위해 충전IC를 부착하여 별도로 배터리를 분리하고 충전기를 별도로 이용해야 하는 불편함을 줄였다.
4.2.2.5 PCB제작
Drum Manager는 물건에 부착되어 지속적으로 진동의 영향을 받기 때문에 동작의 안정성과 소형화를 위해서 PCB로 제작하였다. 반드시 PCB제작을 하지 않아도 동작여부에는 큰 차이가 없다.
4.2.3 부품 목록
필요한 부품들은 모두 회로도 상에 나타나 있으나, 제작 시 편의를 위해 별도로 표로 정리해 두었다. 이 표는 모듈 1개를 기준으로 한 부품의 목록이며, 전체 제작을 위해서는 각 부품 수량의 7배와 Zigbee 모듈 1개 추가로 준비하여야 한다.
[Drum Manager 부품]
번호 | 품명 | 비고 | 수량 | 번호 | 품명 | 비고 | 수량 |
1 | 커패시터 | 20pF | 2 | 18 | 저항 | 470R | 3 |
2 | 커패시터 | 0.1uF | 7 | 19 | 저항 | 1MR | 1 |
3 | 커패시터 | 0.1uF | 2 | 20 | 저항 | 1.5kR | 2 |
4 | 커패시터 | 1uF | 1 | 21 | 저항 | 10kR | 1 |
5 | 커패시터 | 10uF | 4 | 22 | 저항 | 1.2kR | 3 |
6 | LED | Yellow | 2 | 23 | 스위치 | Tact Switch | 1 |
7 | LED | Blue | 1 | 24 | 스위치 | ITS12H | 2 |
8 | 다이오드 | SS14 | 1 | 25 | MCU | ATmega32 | 1 |
9 | LED | LED_Green | 1 | 26 | Opamp | TL072 | 1 |
10 | LED | LED_Red | 1 | 27 | USB UART IC | FT232R | 1 |
11 | 박스헤더 소켓 | 5X2 | 1 | 28 | Zigbee Module | XBee/XBee-Pro | 1 |
12 | 피에조 센서 | Piezo Film sensor | 1 | 29 | Battery charger | BQ24072 | 1 |
13 | USB Mini-5p 커넥터 | DS1104-W | 1 | 30 | LDO | TPS76333 | 1 |
14 | MOLEX | 5268-02 | 1 | 31 | Crystal | 16MHz | 1 |
15 | 저항 | 1kR | 1 | 32 | Li-po 배터리 | 500mA | 1 |
16 | 저항 | 22kR | 1 | 33 | USB 케이블 | USB mini | 1 |
17 | 저항 | 10kR | 1 | - | - | - | - |
4.2.4 예제 코드
Drum Manager의 소스 코드이다. 컴파일 환경 설정 및 기타 레지스터 설정은 생략하고, 센서 값을 받아서 PC 로 보내주는 부분만 수록하였다.
코드 내용은 단순한 방법으로 구현되어 있다. 10bit ADC를 Free Running 모드로 동작시키고, 들어온 값을 지속적으로 검사하여 진동으로서 감지하기 위한 특정 값을 넘을 경우 샘플을 여러 개 취하고, 다시 평균값을 내어 기준치를 두고 비교하여 드럼 타격 여부를 시리얼 통신으로 보내주는 방식이다. 이때 드럼 타격 여부를 결정하는 기준치는 실험적으로 얻은 값으로, 센서나 주변 환경에 따라 달라질 수 있다.
4_3 하드웨어 – 소프트웨어 연결
4.3.1 Zigbee 설정
XBee의 설정은 Digi 사에서 제공하는 X-CTU라는 프로그램을 이용해서 설정한다.
구체적인 설정 방법은 일일이 지면에 싣기보다는 툴 제공 회사의 가이드 파일을 참고하는 것이 좋을 듯 하여 아래에 링크를 기재하였다.
X-CTU 다운로드 링크 : http://ftp1.digi.com/support/utilities/40002637_c.exe
X-CTU 사용법 링크 : http://ftp1.digi.com/support/documentation/90001003_A.pdf
참고로 Drum Manager에서는 baud rate 를 19200으로 설정하였다.
4.3.2 PC와 하드웨어 모듈의 연결
PC와 모듈과의 연결은 USB to UART IC인 FT232RL을 사용하였다. FT232RL 드라이버를 설치하고 장치관리자를 확인하면 COM 포트가 추가되어 있는 것을 확인할 수 있다. 장치관리자에서 COM포트 번호를 확인하고, 추후 PC 소프트웨어 제작 시 해당 포트번호를 참고하여야 한다.
FT232RL의 드라이버는 아래 링크에서 다운로드 받을 수 있다.
FT232RL 드라이버 링크 : http://www.ftdichip.com/FTDrivers.htm
4_4 소프트웨어 제작
4.4.1 시리얼 포트 연결
Magic Drum 프로젝트는 WPF(Window Presentation Foundation)를 사용하여 만들어 졌다. WPF의 프로그래밍 로직은 C# 언어를 이용하여 코드를 작성되기 때문에 아래의 예제 코드들은 C# 언어를 이용하여 기술하였다. 이 예제를 이해하기 위한 기본적인 객체지향 개념이나 프로그래밍 언어의 문법을 설명하며 진행하기에는 이 실습의 목적과 부합하지 않으므로 생략하도록 하겠다.
Magic Drum는 2장의 아키텍처란에서 설명했듯이 기본적으로 하드웨어(Drum Manager)-소프트웨어(Windows Program) 간의 통신으로 진행된다. 사용자가 입력한 내용은 Zigbee 네트워크를 통해 Drum Manager로부터 PC로 전송되기 때문에 PC에서 해야 하는 일중 가장 중요한 부분은 일단 자신에게 수신된 Zigbee 네트워크의 메시지를 확인하여야 한다는 것이다.
Magic Drum에 사용된 XBee Zigbee 모듈은 4.3장에서 설명했듯이 Windows에서 PC에 부착 된 Zigbee 모듈을 SerialPort로 인식하고 있다. 내 컴퓨터->속성->장치관리자->포트를 통해서 PC에 장착 된 Zigbee 모듈의 포트 넘버를 확인 할 수 있으며 ‘COM1’~‘COM10’ 등으로 이름이 지어진다. Zigbee 모듈이 연결된 SerialPort에 들어오는 메시지가 있을 때를 이벤트 발생 시점으로 하여 이 이벤트가 발생하였을 때 드럼 소리가 나게 하는 것을 이 예제의 목표로 한다.
이 예제를 수행하기 위해서는 크게 아래의 세 가지 과정을 거치게 된다.
1. PC에 Zigbee 모듈이 연결된 시리얼 포트에 접근
2. 시리얼포트에 데이터가 왔을 때 이벤트를 발생 시키도록 설정
3. 이벤트가 발생 하였을 때 드럼 소리를 내도록 설정
C#에서 SerialPort를 접근하기 위해서는 상단의 그림에서 빨간색 테두리로 표시되어 되어있는 System.IO.Ports; 라는 네임스페이스를 라이브러리로 추가해 주어야 사용할 수 있다.
먼저 SerialPort를 사용하기 위해서는 SerialPort 객체를 생성하여야 하는데 예제 코드에서는 dmPort라는 이름으로 객체를 생성하였다. SerialPort 객체를 생성 한 후에는 해당 객체의 정보에 대해서 설정 할 수 있다.
상단에 표시 된 그림처럼 PortName, BaudRate, DataBits, Parity, StopBits 등을 설정하여 주어야 한다. 설정 값에 대한 부분에 있어서는 컴퓨터의 SerialPort에 연결 된 Zigbee 모듈의 스펙에 따라야 하는데 Magic Drum에서 사용한 Zigbee 모듈인 XBee모델의 스펙은 위 그림에 설정 되어있는 내용과 같다.
만약 시리얼 포트의 설정값의 의미에 대해서 자세히 알고 싶다면 위키피디아를 통해서 찾아 볼 수 있다. http://en.wikipedia.org/wiki/Serial_port
여기서 예외적으로 PortName에 대해서는 Windows에서 Zigbee 모듈을 인식한 SerialPort 이름을 기술하여야 한다. 필자의 경우에는 Zigbee 모듈을 연결 했을 시 Windows에서 “COM4”로 인식하였기 때문에 PortName에 “COM4”를 입력하였다.
모든 설정 값 입력이 끝났다면 생성한 객체에 Open() 메서드를 호출함으로써 자신이 작성한 프로그램에서 Windows 시스템의 SerialPort에 직접 접근할 수 있다. 여기까지의 내용이 이전 페이지의 ①의 과정에 해당한다.
4.4.2 시리얼 포트 이벤트 발생
SerialPort에 접근 하는 것까지 성공했다면 해당 포트에 데이터가 도착했을 때 이벤트를 발생하도록 코드를 작성하면 된다. 이는 사용자 관점에서 봤을 때 Magic Drum에서 사용자가 드럼을 가격하였을 때를 감지하는 이벤트를 지정하는 역할을 뜻한다.
해당 역할을 수행하는 코드는 아래와 같다.
dmPort.DataReceived += new SerialPortReceivedEventHandler(this.dmport_Received);
dmPort.DataReceived는 dmPort 객체에 연결된 SerialPort에 데이터가 도착했을 때를 뜻한다.
여기에 new SerialPortReceivedEventHandler(this.dmport_Received)를 추가하는 것(+=)은 SerialPort에 데이터가 도착했을 때 호출할 메서드를 지정하는 것이다. 이 예제에서 지정한 호출될 메서드의 이름은 this.dmport_Received이고 결과적으로 보았을 때 SerialPort에서 새로운 데이터가 감지되면 dmport_Received 메서드가 호출이 된다.
dmport_Received에 메서드에서 할 일을 지정하면 된다.
만약 이 메서드에서 수행하는 일 중에서 사용자 UI 부분을 제어하는 부분이 있다면 상단의 그림처럼 Dispatcher.invoke 함수를 이용하여야 한다.
이는 윈도우즈 프로그래밍에 관한 특성으로 UI Thread에서 분리된 Background Thread는 UI Thread에서 작성 된 Widget들을 직접적으로 업데이트 할 수 없기 때문이다. 만약 직접적으로 이 부분에서 UI를 업데이트 하려 한다면 프로그램에 오류가 발생 할 것이다.
만약 Dispatcher에 대해서 더 자세한 내용을 알고 싶다면 Microsoft사의 msdn 홈페이지에서 해당 내용을 찾을 수 있다. http://msdn.microsoft.com/ko-kr/library/system.windows.threading.dispatcher.aspx
4.4.3 이벤트에 드럼 사운드 설정
C#에서 소리를 재생시킬 수 있는 라이브러리를 제공하지만 프로젝트를 진행하며 실험해 본 결과 약간의 지연이 발생하였다. 그 문제를 해결하기 위하여 우리는 DirectX SDK를 사용하였다.
DirectX SDK를 사용하기 위해서는 Microsoft에서 제공하는 설치 파일을 다운받아서 설치하면 된다.
http://msdn.microsoft.com/en-us/directx/aa937788
상단의 그림에서 빨간 네모 박스 안에 있는 2가지의 라이브러리를 추가 시키면 DirectX SDK를 사용하여 소리를 재생할 수 있다. 이제 사운드로 재생시키기 위해서 사운드를 재생시키는 클래스를 한 개 생성해보도록 하겠다.
클래스의 이름은 Sound Manager라고 이름을 지었다. 그리고 클래스 내부에 Audio 클래스를 snd_kick라는 이름으로 만들고 Sound Manager가 인스턴스될 때 생성자가 호출되어서 드럼에서 Kick에 해당하는 음이 들어가 있는 kick.wav 을 불러와서 snd_kick로 인스턴스 되어 생성된다.
new Audio()의 생성자로는 wav 파일의 윈도우즈 상에서의 경로를 뜻한다. 필자는 이 프로그램의 경로 아래 (프로그램경로)\Sound\kick.wav 파일을 위치시킨 다음 진행을 하였다.
조금 전에 생성한 dmport_Received라는 메서드 안에서 play Kick()이라는 메서드를 호출 하면 Kick 소리가 재생되는 것을 들을 수 있을 것이다.
5. 음원추출
5_1 음원 추출 과정 개요
① 원본 음악mp3 파일을 가져온다.
② 연산을 좀더 쉽게 하기 위해 mp3를 WAV 포맷으로 변환해준다.
③ wav포맷의 사운드 데이터를 스펙트로그램(Spectrogram)화 시킨다. 스펙트로그램화된 데이터에 비음수 행렬 공동분해를 이용하여 드럼과 화성악기 부분을 분리한다.
④ 드럼이 분리된 사운드 행렬 데이터를 다시 WAV포맷으로 변환한다.
⑤ wav포맷을 mp3로 변환한다.
드럼음원을 분해하기 위한 mp3파일은 먼저 wav파일로 바뀌게 된다. 대부분의 mp3음악은 스테레오로 되어있으므로 변화된 wav파일을 채널별로 나누게 된다. wav파일의 데이터는 음수와 양수가 섞여 있다. 우리는 비음수 행렬분해를 이용한 방법을 써야 하므로, 절대 값을 취해준다. 또한 위상 값을 따로 담아 둔다. 앞서서 얻은 비음수 행렬로 업데이트 식을 연산한다. 여기서 필요하게 되는 사전드럼음원 정보를 로드해 연산에 이용한다. 연산된 데이터를 앞에서 저장해둔 위상 값과 합치고 역 스펙트로그램화 시키고 wav파일을 만든다. 앞서 채널을 스테레오로 2개가 존재하므로 각각의 채널에 위와 같은 순서를 적용한다. 각각의 채널의 웨이브 데이터가 생성되면 다시 합쳐 mp3파일의 형태로 재구성하게 된다.
6.역할 분담
담당 | 이름 | 역할 |
팀장 | 박병조 | · 각 모듈 간 명세 작성 · 메인 화면 제작 · 연습 모드 제작 · 커스터마이징 모드 제작 · 옵션 모드 제작 · 안드로이드 블루투스 통신 모듈 제작 · 안드로이드 GUI 제작 · 각 모듈 통합 · 프로그램 인터페이스 |
음원 분석 | 박지훈 | · 이미지 수집 및 편집 · NMF 알고리즘 분석 · NMF 알고리즘 구현 · 음원 분리 모듈 제작 · 분해 사운드 음질 테스트 및 음원 분리 · 연산 수식 수정 · 분해된 드럼 음원에서 드럼 타이밍 추출 · 게임 UI 이미지 재구성 · 드럼 음원 분해 속도 개선 |
드럼 매니저(HW) | 이호섭 | · 드럼 매니저 설계 및 부품 주문 · 연주 모드 제작 · 드럼 매니저 하드웨어, 펌웨어 제작 · 드럼 매니저 통신 모듈 · 음악 선택 모드 제작 · 연주 모드 tag 적용 · 연주 결과 모드 제작 · PC 프로그램 UI 재구성 · 드럼 매니저 |
외형 제작음원 제어 | 이종혁 | · mp3 파일 구조 분석 · mp3 디·인코더 모듈 제작(mp3 to wav) · wav 음원 분리 및 제어 · 드럼 음원 소스 수집 및 편집 · 음원 분리 매트랩 파일 dll생성 및 C# 제어 클래스 제작 · wav 음원 병합 · 드럼 매니저 강약 조절 보강 · 드럼 매니저 외형 제작 |
7. 개발 환경
OS | Software | Hardware |
·Windows XP SP3 ·Android Platform |
·MS VS 2008 (WPF) ·MS Expression Blend3 ·Eclipse 3.5(Android SDK) ·MySQL |
·AVR ATmega8 ·Zigbee(FZ750) ·Piezo firm Sensor(LDT0-028K) ·Android Phone (ADP1) |
8. 용어 정리
③ Tag(Tagging) : 리듬 게임에서 사용되는 일종의 모형, 사용자가 음악에 대해 입력할 박자를 가리킨다.
④ 주파수 : 진동수(주파수)는 주기적인 현상이 단위시간동안 몇 번 일어났는지를 뜻하는 말
⑤ 스펙트로그램 : 소리나 파동을 시각화하여 파악하기 위한 도구로, 파형과 스펙트럼의 특징이 조합되어 있다.
9. 참고 문헌
① WPF 프로그래밍(이상은 / 가메출판사)
② programming WPF(이안그리피스, 크리스셀즈, 정현희 역 / 한빛 미디어)
③ 찰스페졸드의 WPF(찰스페졸드 / 에이콘)
④ Pro WPF in C# 2008(매튜 맥도날드 / 웰북)
⑤ .NET 프로그래밍 정복(김상형 / 가메출판사)
⑥ 전자 회로(김봉열)
⑦ Multimedia sound programming(한학용, 하성욱, 허강인 / 영진닷컴)
⑧ 집단 지성 프로그래밍(토비 세가란 / 한빛 미디어)
⑨ 비음수 행렬의 부분적 공동 분해를 이용한 드럼 음원 분리(유지호 외 3명 / 논문)
⑩ Non-Negative Matrix Factorization for Polyphonic Music Transcription(Paris Smaragdis, Judith C. Brown / 논문)
⑪ Learning the Parts of Objects using Non-negative Matrix Factorization (Ralf Nikolaus/논문)
⑫ Adaptive Non-negative Matrix Factorization in a Computational Model of Language Acquisition(Joris Driesen, Louis ten Bosch2 Hugo Van hamme, 논문)
⑬ Fourier Transforms(Mark handley / ppt 자료)