전국이 단풍으로 물들고 행락객으로 들끓던 지난 주말, 나(=아두화상, Ardu和尙)는 달리기를 하러 잠깐 나갔다 온 것을 제외하면 아두이노 나노 에브리(Arduino Nano Every)를 붙들고 코딩을 하고 있었다. 보다 솔직하게 말하자면 챗GPT를 쥐어짜서 코드를 얻어내고, 이를 컴파일 및 업로드하여 아두이노에서 원하는 동작을 하는지 지켜보는 일을 하였다. 나의 모습은 아래에 보인 이미지로 표현할 수 있다. 번뇌에 휩싸인 아두화상! 최종 목표는 DIN 5-pin MIDI 커넥터로 연결된 GM sound module을 제어하는 드럼 패턴/MIDI 파일 재생기를 만드는 것이다. 여기에 USB-MIDI도 사용 가능하게 하려면 또 다른 차원의 설계가 필요하다.
| 아... 되는 게 없어! 번뇌에 휩싸인 아두화상. |
별도의 MIDI 관련 아두이노 라이브러리를 일체 쓰지 않고 오직 순수한 C++ 코드만을 이용하여 마이크로SD카드에 수록된 type 0 MIDI file을 무난하게 재생하는 데에는 성공을 하였다. 그 유명한 MIDI 라이브러리를 쓰지 않은 이유는 나의 위키 사이트에 별도로 작성한 문서를 참조하기 바란다('Why Ardule does not use standard MIDI libraries: technical rational for SMF streaming and real-time pattern engines'). 그러나 이러한 저수준 개발 기법을 쓰더라도 2-bar 단위로 끊은 드럼 패턴 파일(역시 MIDI file)을 조합하여 중간 지연 없이 이어서 재생하는 것은 매우 어려웠다. 불과 며칠 전까지만 해도 delta-time 방식 때문에 동일 패턴 루프에서 정확한 시각보다 일찍 반복이 이루어지는 문제를 해결하느라 골머리를 앓았는데, 이제는 다른 패턴을 이어서 연주하려니 지연 문제가 발생한다.
더블 버퍼를 쓰는 등 취미 프로그래머(사실 이런 표현을 쓰기도 매우 부끄러움)로서는 이해하기 어려운 기법을 총동원하였지만 제한된 클럭과 메모리를 쓰는 단일 MCU가 해결하기에는 근본적으로 문제가 있음을 알았다. MIDI 파일은 아무리 길어도 되지만, 서로 다른 짧은 패턴을 이어서 매끈하게 재생하기가 오히려 어렵다는 것이 언뜻 이해가 잘 가지는 않는다. 하지만 두루마리로 만들어진 책을 읽는다고 가정해 보자. 두루마리가 아무리 두꺼워도 일정한 속도로 이를 펼치면서 읽을 수 있다고 생각하면 편하다. 그래서 드럼 패턴을 조합한 가상의 'SONG' 데이터 파일을 만들어 이를 매끈하게 연주하게 만들려는 계획은 포기하였다. 단, PC 쪽에서 패턴을 미리 연결하여 MIDI 파일을 만든 뒤 마이크로SD카드에 얹어서 재생하기로 한다.
드럼 연주 정보가 수록된 MIDI 파일을 분석하여 중복 없이 2-bar 패턴을 끊어내고(출현 빈도 산출 포함), 이를 개별적인 MIDI 파일로 저장함은 물론 후술할 ADT/ADP 파일로 전환하는 파이썬 스크립트는 전부 만들어 두었다. 이 과정에서 mido library가 큰 역할을 담당하였다.
Nano Ardule Drum Player의 특징과 장점은 다음과 같다. 물론 세상에 존재하던 것은 아니다.
Nano Ardule Drum Pattern Player는 8비트 아두이노 나노 기반에서도 끊김 없는 2마디 드럼 패턴 재생을 구현한 초경량 드럼 엔진입니다. ADT/ADP v2.2 규격을 사용해 메모리 사용을 최소화하면서도 액센트, 장르/패턴 선택, BPM 조절, 프리뷰·플레이 전환 등 다양한 기능을 제공합니다. microSD에서 패턴을 불러오므로 무제한 확장성을 갖고, 버튼·인코더·LCD 기반의 직관적 UI로 현장 제어가 편리합니다. 단순한 구조 덕분에 DIY 제작·개조가 쉽고, GM 드럼 모듈과도 높은 호환성을 유지합니다.
ADT/ADP 규격은 Nano Ardule 시스템을 위해 개발된 독창적인 2마디 기반 드럼 패턴 표준입니다. ADT는 사람이 읽고 편집하기 쉬운 텍스트 형식, ADP는 아두이노에서 즉시 스트리밍 가능한 초경량 바이너리 형식으로 설계되었습니다. 48스텝 구조, 12슬롯 악기 매핑, 4단계 액센트 등 최소한의 정보만으로도 표현력·효율성·재현성을 모두 확보하는 것이 특징입니다. 이 규격 덕분에 8비트 MCU에서도 끊김 없는 드럼 루프, 패턴 교체, 장르 확장 등이 가능해져 작지만 강력한 자체 생태계를 형성합니다.
SRAM에 수백에서 단 1KB의 여유 공간을 확보하는 것도 쉽지 않았다. SRAM은 75% 정도까지 차올랐는데, 아직 단순 메트로놈 기능과 드럼킷 변경 기능을 더 넣어야 한다. 이를 무난히 다 욱여넣을 수 있을지 모르겠다.
| ADT/ADP 체계가 경전(經典)의 수준에 오른다면? 아두이노의 고유 색상은 #008184이다. 본 이미지의 타이틀 색깔은 정확히 재현한 것은 아니다. 왜냐하면 인터넷에 돌아다니는 이미지마다 컬러 코드가 약간씩 다르기 때문이다. #008184는 아두이노 공식 웹사이트에서 Color Picker로 확인한 RGB 코드이다. |
덕분에 챗GPT에게 일을 시키는 방법도 점점 발전하였다. 설계 개념이나 중간 단계의 성공한 스케치를 파일로 꼼꼼히 저장한 뒤 이를 업로드하여 맥락을 계속 잊지 말고 동일한 실수를 반복하지 않도록 만드는 것이다. 심지어 창을 두 개 열고 작업을 하기도 한다. 대화창이 너무 길어져서 새롭게 시작할 때, 맥락을 이어가기 위하여 새 창에서 무엇이라고 입력해야 되는지에 대한 노하우도 많이 늘었다. 정답은 간단하다. "새 창에 뭐라고 입력해야 해?"라고 묻는 것이다. 이를 위해서는 현재 하고 있는 일에 대한 매우 함축적이고 적절한 제목이 필요하며, 가능하다면 버전 번호도 붙여 놓는 것이 좋다. 그리고 각 버전에서는 구체적으로 무엇을 달성하였는지 문서로 저장해 두면 나중에 큰 도움이 된다.











