Fluid Ardule은 '전원을 넣고 키보드를 연결하면 즉시 연주 가능'한 MIDI 사운드 모듈을 지향한다. 인터넷 라디오, 각종 오디오 음원 파일 재생, 블루투스 오디오 재생 기능은 재미와 활용성을 높이기 위하여 추가한 것이다. 라즈베리파이 3B라는 제한된 하드웨어를 바탕으로 하기 때문에 샘플러라든가 작은 DAW와 같은 기능을 넣으려는 욕심을 철저히 차단하고 있다. 그래서 JACK이나 PortAudio 등을 절대 쓰지 않으며, 오로지 ALSA만을 이용한 단순하고 빠른 처리를 목표로 하였다.
하지만 드럼 재생 기능만큼은 넣어 보고 싶었다. Nano Ardule을 개발하면서 값진 자산으로 남은 드럼 패턴 라이브러리를 이용하면 어렵지 않게 Fluid Ardule의 운영 스크립트에서 드럼 패턴을 반복 재생하고, 연결된 키보드를 이용하여 드럼과 동시 연주도 가능할 것 같았다.
Nano Ardule 개발 당시 공개된 드럼 MID 파일을 분석하여 2-bar 단위의 패턴을 장르별로 정리해 둔 일이 있다. 이를 위한 두 가지의 전용 파일 포맷도 개발해 두었다. ADT는 사람이 읽고 편집할 수 있는 파일이고, 이를 검증하여 작은 바이너리 캐시로 만든 것은 ADP이다. ADP는 아두이노 나노(에브리)의 작은 메모리에도 비상용으로 수십개 정도는 넣을 수 있다.
사실 아두이노 나노보다 성능이 훨씬 좋은 라즈베리 파이에서는 ADT를 그대로 재생할 수 있다. 하지만 이를 위해서는 운영 스크립트 안에 텍스트 파서가 들어가야 하고, 잘못 작성된 패턴을 검사하는 코드도 필요하다. 예외 처리도 늘어났을 것이고, 앞으로 ADT 문법이 바뀔 때마다 Fluid Ardule도 함께 수정해야 했을지 모른다.
하지만 ADP는 대단히 단순하다. 이미 검증이 다 끝난 상태이기 때문이다. 텍스트 파일을 다룰 때 필요한 파서 같은 것을 요구하지 않는다.
- ADP 파일을 연다.
- 헤더를 확인한다.
- 스텝 데이터를 읽는다.
- 해당 스텝의 드럼 음을 출력한다.
이것으로 끝이다. "Play with Drums"라는 메뉴를 넣을 위치를 결정하고, 대략의 화면을 구상한 뒤 지시문을 만들어서 ChatGPT에 ADP 파일 사양 문서와 함께 밀어 넣었다. 그것으로 끝. 인코더를 돌려서 BPM을 조절하고, 키보드 입력 신호를 동시에 연주하는 기능도 순식간에 구현하였다. 오히려 화면 안에서 텍스트 배치를 보기 좋게 조절하는 것에 가장 많은 시간을 쏟았다.
Nano Ardule 개발 당시 꽤 신경을 써서 만든 '드럼 패턴 데이터 표준안'이 결국 미래의 나를 위한 좋은 선물이었던 것이다. 물론 앞으로도 ADT는 필요하다. 사람이 읽고 수정할 수 있는 원본이 있어야 하기 때문이다. 그러나 실제 연주를 담당하는 프로그램에게는 검증이 끝난 ADP가 더 적합하다. 만약 2-bar MIDI drum pattern을 재생 대상으로 삼았더라면 타이밍 계산과 MIDI 이벤트 해석, 스케줄링을 처리하느라 개발 과정은 그야말로 재앙이 되었을 것이다. MIDI drum pattern은 악기 사용 빈도를 계산하고 ADT → ADP를 만드는 과정에서 매우 유용한 raw data 역할을 한 것은 솔직하게 시인한다.
내가 만든 체계에서는 드럼킷을 구성하는 악기(slot)를 12개로 제한한다. 실용적으로는 큰 문제가 없다. ADP에서는 슬롯 번호마다 다음과 같이 정해진 악기가 할당된다. 반면 ADT는 12개 슬롯이라는 원칙을 지키기만 한다면 다른 악기를 넣을 수 있다. 예를 들어 카우벨이나 탬버린 같은 것. 따라서 새로운 패턴을 만들 때에는 ADT가 필요하다.
이러한 타악기 배치는 임의로 정한 것이 아니다. 인터넷에 공개된 다수의 드럼 패턴 파일(.MID)을 분석한 결과물이므로 일종의 (빅)데이터 분석을 통하여 얻은 결론이다. 이를 컴퓨터 키보드(16키) 또는 AKAI MPK MINI의 패드(8키 x 2뱅크)에 할당하여 입력하기 위해 나름대로 머리를 싸매서 고민을 한 결과가 바로 다음의 스펙 문서이다.
APS Drum Instrument Sets & Pad Mapping - Reference Specification
실은 요즘 며칠 작업을 하면서 이 문서가 조금 잘못된 것을 깨달았다. Legacy UI Set를 실질적인 표준으로 삼는 것이 더욱 바람직하다. 내가 만들어 놓은 450개 가까운 ADP는 실제로 Legacy UI Set를 따르고 있었다. 처음부터 목표를 세워서 이를 구현하기 위해 표준을 설계한 것이 아니라, 공개된 데이터를 분석하고 실제로 사용 가능한 형태로 다듬는 과정에서 자연스럽게 하나의 표준이 만들어졌던 것이다. 어쩌면 내가 숱하게 남긴 기록에도 불구하고 개발 과정을 정확하게 기억하지 못했을 수도 있지만.
결국 좋은 데이터 포맷이란 단순히 파일 크기가 작거나 처리 속도가 빠른 것이 아니다. 사람이 이해하고 수정할 수 있는 원본과, 기계가 빠르고 안정적으로 처리할 수 있는 표현을 적절히 분리하는 것이다. ADT와 ADP는 바로 그런 역할 분담을 목표로 만들어졌다. 몇 달이 지난 지금도 거의 수정 없이 새로운 프로젝트에서 다시 활용할 수 있었다는 사실이, 당시의 설계가 나쁘지 않았음을 증명해 주는 것 같다. 미래의 나는, 과거의 내가 남겨 둔 작은 선물을 기분 좋게 다시 꺼내 쓸 수 있었다.

댓글 없음:
댓글 쓰기