[피아노 코드 연습 프로그램] 코드의 보이싱 순서, 코드 연습 프로그램 개발 - Whitmem
[피아노 코드 연습 프로그램] 코드의 보이싱 순서, 코드 연습 프로그램 개발
Software Portfolios
2023-05-31 08:56 게시 67c3b57b8d81d64cdd79

0
0
107
이 페이지는 외부 공간에 무단 복제할 수 없으며 오직 있는 그대로 게시되며 부정확한 내용을 포함할 수 있습니다. 법률이 허용하는 한 가이드 라인에 맞춰 게시 내용을 인용하거나 출처로 표기할 수 있습니다.
This page is not to be distributed to external services; it is provided as is and may contain inaccuracies.
피아노 연습 프로그램
이번에 개발한 프로그램은 피아노 연습을 도와주는 도구로, 디짙털 피아노 또는 마스터 키보드와 연동하여 코드를 연습할 수 있도록 도와주는 소프트웨어 입니다.
구조
기본적인 클래스 구조는 다음과 같습니다.
클래스는 크게 코드의 특징을 관리하고 이 정보를 바탕으로 노트를 생성하는 ChordProperties ChordGenerator가 있으며, 스케일 내 다이아토닉 코드들의 특징을 관리하고 이 정보를 바탕으로 스케일을 생성하는 ScaleProperties ScaleGenerator가 있습니다. 그 외 MIDI 입 출력을 담당하는 MidiInputSignalReaderMidiOutputSignalReader가 존재합니다.
핵심 기능
이 소프트웨어의 핵심 기능을 매우 간략하게 추상화하면 다음과 유사합니다.
1. 사용자가 연습하길 원하는 코드를 직접 등록할 수 있으며
2. 사용자가 미디 장치를 선택할 수 있으며
3. 연습할 때 각 노트를 인식함으로써 코드가 맞는지 확인하는 기능
스케일 정보로 코드를 생성
스케일은 기본적으로 다양하게 존재합니다. 우리가 현대 음악에서 흔히 접하는 메이저 스케일은 "아이오니아 스케일"로, 그 외 도리안, 프리지안, 리디안, 믹소리디안, 에어리안, 로크리안 등이 존재합니다만, 이러한 다양한 스케일들에 대한 스케일 정보를 담고 있으며, 이 정보를 바탕으로 스케일에 대한 다이아토닉 코드들을 직접 생성할 수 있게끔 구현하였습니다.
즉 코드를 직접 쳐 넣는 것이 아닌, 각 스케일들의 특징에 따라 자동생성 할 수 있도록 구현하였습니다.
상대 코드 진행을 바탕으로 절대 코드 생성
기본적으로 특정 코드 진행에 대해서 다양한 스케일을 기반으로 공부하고 싶은 경우를 고려하여, 상대 코드를 기입하면 아이오니아 스케일을 기준으로 자동 생성할 수 있게끔 구현하였습니다. 지금은 제가 직접 연습하는 단계로 다양한 스케일이 직접 필요는 없어 아이오니아 스케일에서만 생성하도록 구현하였습니다.
도 코드를 기반으로 자동으로 생성된 코드 진행들
특히 시스템은 재 사용가능한 형태와 유지 보수에 용이한 형태로 클래스를 구현해 놓았기 때문에 추후 다른 스케일에서의 코드 진행 생성이 필요하다면 클래스-인스턴스를 생성한 뒤 몇 가지 구성 요소 (스케일 properties)만 변경 해 주면 즉시 적용이 가능합니다.
미디 선택 및 신호 교환
직접 피아노와 연결하여 코드 연습을 할 수 있도록 하기 위해 미디 장치를 연결할 수 있게끔 하였습니다. winmm.dll에서 MIDI 장치와 정보 교환을 위한 기본 메소드, 콜백 구조체를 제공하고 있으며 이 메소드들을 활용하였습니다. 예를 들어 인풋 미디의 개수를 가져오는 API는 다음과 같습니다.
[DllImport("winmm.dll")] private static extern int midiInGetNumDevs();
MIDI IN 장치들
특히 디지털 피아노의 경우는 미디 신호를 받은 경우 피아노 소리가 피아노에서만 나는 문제가 존재, 더 나아가 마스터 키보드의 경우 소리가 아예 나지 않고 신호만 수신되기 때문에, 이 노트 신호들을 DAW나 가상악기로 라우팅할 수 있도록 미디 아웃 장치를 선택할 수 있게끔 하였습니다. 즉 입력 장치에 연결된 미디 장비들의 신호를 모두 출력 장치로 그대로 라우팅합니다.
특히 윈도우 운영체제 자체에 내장된 미디 출력으로 신호를 내보내면 기본 탑재된 사운드폰트 피아노 음색으로 피아노 신호가 재생됩니다. 즉, 마스터 키보드로 신호를 받아, 윈도우 시스템에 탑재된 피아노 미디 출력 시스템에 라우팅합니다.
미디 신호 규격
기본적으로 운영체제에서 전해주는 미디 신호 규격은 int 형 데이터에 담겨있습니다. 이 데이터는 하나의 값을 의미하지 아니하며 각 데이터들이 비트에 할당되어 이를 해독하는 작업이 필요합니다. 예를 들어 노트가 ON인지 OFF인지, 어느 노트(음)이 눌렸는지, 얼마나의 세기로 눌렸는지가 모두 int 형 하나의 데이터에 적용되어 있습니다. 그렇기 때문에 비트 연산을 통해서 각 데이터들을 byte로 나눕니다. MIDI 신호의 경우 기본적으로 byte 3개의 신호로 int형이 구성되어 있다고 합니다. 따라서 status 신호, note 위치, velocity를 각각 나누어주는 클래스를 만들었습니다. 이 클래스는 추후 Form이나 가져다 쓰는 입장에서 비트 신호에 관여할 필요가 없도록하며, 단순 메소드로 데이터를 손 쉽게 조작할 수 있도록 하였습니다.
rawData로 받는 경우 각 byte 위치에 비트 연산을 통해 분리합니다.
피아노 그리기 처리자
피아노를 시각적으로 표시하기 위해 피아노를 그리는 클래스 역시 존재합니다. 다만 이번에는 특이하게끔 구현하였는데, 추후 나중에 재 사용할 수 있도록 다양한 그래픽 라이브러리와 적용하여 사용할 수 있게끔 클래스를 구현하였습니다. 예를 들어 C#에서 그래픽을 그리기 위해 대표적으로 GDI+ 를 사용할 수 있는데, 더 나아가 나중에 OpenGL을 사용하거나 DirectX를 사용할 수도 있습니다. 기본적으로 1. 배경을 지우고 2. 그림을 그리고 3. 이미지를 swapping 하는 과정으로 구현됨을 알 수 있습니다. 즉 자신이 원하는 그래픽 라이브러리를 활용하여 피아노를 그릴 수 있게끔 콜백함수로 그래픽 라이브러리의 메소드를 대리하게끔 하였습니다. 즉 이 클래스에서는 음악 이론에 따라 피아노를 배치하고 지정된 위치 및 크기, 색상으로 그리는 역할을 담당합니다.
상기 렌더는 피아노를 그리는 부분을 담고 있습니다. 여기서 다음과 같은 소스코드가 보이는데,
paintingInterface.clear(getColorRGB(255, 255, 255, 255));
paintingInterface.clear는 존재하는 메소드가 아닙니다. 인터페이스의 메소드이며, 사용하는 입장에서 대리할 수 있도록 대리자를 넘겨야 합니다.
즉 사용할만한 그래픽 메소드들을 interface로 명시 해 두고, 이 인터페이스 형식에 맞춰 그리기 요청을 보냅니다. 이 피아노 그리기 처리자를 가져다 쓰는 Form 입장에서는 이 인터페이스를 상속받는 클래스를 하나 만들어 각 상황에 맞는 그래픽 라이브러리 메소드를 기입해야 합니다.
이 클래스를 가져다 쓰는 Form 입장에서는 GDI+를 사용하기 위해 GDI 메소드로 다시 대리해주고 있습니다.
즉 Form에서는 GDI+ 로 그리고자 하기에, GDI+에 대한 drawLine fillRectangle등을 그대로 콜백 함수로 동작함으로써 그릴 수 있도록 합니다.
추후 프로젝트의 성격이나 다양한 프로젝트에서 사용할 때 GDI+가 아닌 OpenGL을 기반으로 사용하는 경우 사용하는 입장에서 OpenGL 의 그리기 메소드들을 여기에 대신 넣어주어 구성할 수도 있게끔 고려하였습니다. (재사용의 가능성 고려)
동작 모습
피아노 미디 신호가 들어오면 피아노 뷰에 그대로 렌더링 해주고, 이 신호들은 선택된 아웃 풋 장치로 라우팅되어 소리로 들립니다.
개발 기간
놀면서 1-2일 소요, 단순 개발 시간으로만 따지면 약 5시간-6시간 내외(오류 수정 포함) 기능 추가 2시간 추가 소요...
댓글 0개
댓글은 일회용 패스워드가 발급되며 사이트 이용 약관에 동의로 간주됩니다.
확인
Whitmemit 개인 일지 블로그는 개인이 운영하는 정보 공유 공간으로 사용자의 민감한 개인 정보를 직접 요구하거나 요청하지 않습니다. 기본적인 사이트 방문시 처리되는 처리 정보에 대해서는 '사이트 처리 방침'을 참고하십시오. 추가적인 기능의 제공을 위하여 쿠키 정보를 사용하고 있습니다. Whitmemit 에서 처리하는 정보는 식별 용도로 사용되며 기타 글꼴 및 폰트 라이브러리에서 쿠키 정보를 사용할 수 있습니다.
이 자료는 모두 필수 자료로 간주되며, 사이트 이용을 하거나, 탐색하는 경우 동의로 간주합니다.