본 프로젝트의 핵심은 Ruby 언어를 사용하여 신시사이저와 시퀀서를 구현하는 것입니다.
신시사이저 구현
신시사이저는 크게 네 가지 주요 구성 요소로 이루어져 있습니다.
* 오실레이터 (Oscillator): 사인파, 톱니파, 삼각파, 구형파 등 다양한 파형을 생성합니다. Ruby의 Math
모듈을 활용하며, 여러 음이 동시에 울릴 때 파형을 합산하고 클리핑 방지를 위한 리미터 기능을 포함합니다.
* 앰프 (Amplifier): PortAudio API를 사용하여 생성된 파형 데이터를 오디오 장치로 전달, 소리를 출력합니다.
* 엔벨로프 제너레이터 (Envelope Generator): 소리의 시간적 변화(Attack, Decay, Sustain, Release)를 제어하여 다양한 음색 변화를 가능하게 합니다.
시퀀서 구현
시퀀서는 음표와 리듬 정보를 시간 축에 배열하여 자동으로 연주하는 기능을 담당합니다.
* 기능: 멀티트랙 시퀀싱 및 MIDI 파일 가져오기/내보내기 기능을 지원합니다.
* 구조: 각 트랙은 스텝으로 구성되며, 각 스텝은 활성화 여부, 음표, 벨로시티 정보를 가집니다.
* 연동 (DRb): 신시사이저와 시퀀서는 DRb(Distributed Ruby)를 사용하여 프로세스 간 통신을 합니다. Groovebox
클래스가 메인 컨테이너 역할을 하며, 시퀀서는 DRb를 통해 Groovebox
인스턴스에 접근하여 소리를 제어합니다.
* 타이밍 제어의 한계: 현재 sleep
함수를 사용하고 있어 정밀도가 낮습니다. 발표자는 MIDI 표준의 PPQN 및 운영체제 레벨의 정밀한 오디오 API(예: CoreAudio)를 통한 개선 계획을 밝혔습니다.
개발 환경 및 시연
‘Groovebox Ruby’는 터미널 사용자 인터페이스(TUI)를 통해 조작 가능하며, 발표 중 다양한 신시사이저 음색, 엔벨로프 변화, 시퀀서를 통한 연주 및 MIDI 파일 로딩 등을 시연했습니다.