2025년 11월 30일 일요일

무선이냐 유선이냐

같이 활동하는 밴드 동아리의 기타리스트 회원들이 무선 송수신기를 들고 나타나기 시작하였다. 베이스를 치는 나는 DI 박스 외에는 별다른 악세사리도 갖고 있지 못하며, 거추장스럽게 악기용 긴 케이블을 늘 챙겨 다니는 터였다. 설상가상으로 직접 커넥터를 납땜하여 만든 케이블이 갑작스럽게 단선이 되었다. 2023년의 작업 기록은 여기('기타 케이블의 1/4" 플러그 교체')에 있다. 납땜에도 등급이 있다. 숙련공이 좋은 자재를 써서 납땜한 케이블, 아마추어가 대충 납땜하여 작은 충격에도 납땜이 끊어지는 케이블.

"그래서 다들 무선 시스템을 쓰는 모양이네..."

무선 시스템의 편리함은 굳이 강조할 필요가 없다. 우리 밴드에서도 무선 마이크를 구입한 이후로 다시는 유선 마이크를 쓰지 않게 되었으니 말이다. 단점이 있다면 나 정도의 아마추어가 납땜인두를 들고 유지보수를 하기는 곤란하다는 것.

아두이노 공작(특히 코딩)에 몇 개월 동안이나 몰두하느라 한동안 납땜을 잊고 살았었다. 충격에도 잘 견디도록 내 나름대로는 견고하게 다시 납땜을 하였다. 심선의 가닥이 너무 적어도 납땜이 튼튼하게 유지되기 곤란하다. 좋은 자재와 실력으로부터 좋은 물건이 나옴을 명심하자.

보수작업을 마친 후. 이 케이블은 아마도 1987년 근처에 처음으로 전기 기타를 구입하면서 같이 샀던 것으로 기억한다. 케이블 자체의 품질은 별로 좋지 않다. 심선이 매우 가늘고 그 수도 적다.

Nano Ardule 'Drum Pattern Player'는 여전히 진화를 거치고 있다. 오늘은 남아 있던 버그를 잡느라 많은 시간을 보냈다. 비상용 패턴을 코드에 심는 일은 아직 제대로 시작하지 못하였다.

커스텀 캐릭터를 만들어서 재생 상태를 나타내는 삼각형을 표현해 보았다. 검색을 해 보니 LCD Custom Character Generator라는 웹사이트도 있었다.

LCD UI는 아직도 최적화를 향해 갈 길이 멀다. 표시할 공간은 부족하고, 보여주고 싶은 정보는 많고... 만약 한 장르의 패턴이 100개, 즉 세 자리를 넘어가면 어떻게 할 것인가? 'BPM'을 더 짧게 줄일 것인가?

사실 고른 베이스 소리를 내기 위해서 장비를 하나쯤은 들여야 한다고 생각하고 있었다. 연습이 모든 부족함을 다 커버하기는 곤란하다는 것이 나의 변명이다. 베이스 세계에서 컴프레서는 결코 싸지 않은 물건이다. 적당한 중국산 제품을 물색한 끝에 Sonicake B Factory Bass Preamp Overdrive Pedal with EQ(웹사이트)를 구입하였다. 알리익스프레스에서 주문을 했기에 국내에 유통되는 가격보다는 싸게 구입하였다. 물건을 받은 후에는 9볼트 전지를 써서 DC 어댑터용 플러그를 연결할 수 있는 간단한 장치도 만들었다. 서너 시간 정도의 공연에는 버틸 수 있을 것이다. 오래 쓰고 싶다면 1.5V 알칼라인 건전지를 6개 직렬로 연결하여 9V를 만드는 배터리 홀더를 쓰면 된다.


질문: 오른쪽 버튼(파워)를 누르지 않은 상태에서 왼쪽 버튼(오버드라이브)를 눌러도 LED가 들어온다. 작동이 되는 것일까? 그래서는 안 될 터인데?

당초 계획보다 늦어졌지만 12월 중에는 Nano Ardule 최종판의 소개 동영상을 찍을 수 있을 것 같다.

다시 찾은 제주도

신혼여행 당시에 제주도에 와서 들렀던 관광지가 어렴풋하게 기억이 난다. 여미지식물원, 성읍민속마을, 산굼부리... 그로부터 30년이 넘게 지나 다시 아내와 함께 제주도를 찾게 되었다. 최근 수 년 동안 제주도를 몇 번 왔었지만 학회 출장으로 오느라 주변을 여유 있게 둘러볼 기회가 없었다. 

이번에는 아내와 함께 여미지를 꼭 다시 가 보고 싶었다. 지금은 제주도에서 그렇게 인기가 많은 곳은 아니라고 한다. 과거보다 시설이 낡기는 했지만, 아직까지도 명맥을 유지하고 있어서 무척 반가웠다. 꽃과 나무를 가꾸는 사람들의 정성과 마음가짐을 정말 존경한다. 전날 방문했던 카멜리아 힐(동백 수목원)도 정말 좋았다. 

여미지의 상징과 같은 유리온실. 바깥에 조성된 정원이 이보다 열 배는 크다.

온실 전망대에서 바라본 한라산.


일본 정원. 펜탁스 Q10으로 요란하게 색을 입혀 보았다.

프랑스 정원. 바로 뒤에는 이태리 정원이 있다.


산방산 앞 용머리 해안가도 절경이었다. 평생 다른 곳을 가지 못하고 바닷가 바위에 붙어 사는 따개비와 거북손을 보니 측은한 생각이 들었다. 구하기 어려운 별미라고 그걸 보자마자 따서 먹는 사람도 있었다. 평온히 자연과 더불어 살아가다가 별안간 사람의 입 속으로 들어가는 거북손은 무슨 죄란 말인가.

산방산.






예상보다 좋은 느낌으로 다가온 곳은 무릉곶자왈이었다. 이번의 제주도 방문이 있기 전에는 곶자왈이 무엇인지도 몰랐으니까. 촬영한 영상은 유튜브 쇼츠로 남겼다. 제주도에는 온갖 박물관과 맛집도 많이 있지만, 그런 문명과 자본주의의 흔적보다는 제주 특유의 자연환경과 문화를 감상할 수 있는 곳을 들르는 것에 나는 더 큰 의미를 두고 있다. 아내 도한 나와 비슷한 생각의 소유자이다.


덤으로 독특한 모양의 방주교회까지.


제주국제공항을 떠나기 직전의 마지막 방문지는 새별오름이었다. 석양을 바라볼 수 있는 서쪽 코스로 접근했던 것이 큰 행운이었다. 아부오름과 같이 분화구가 있지는 않으나. 억새의 물결이 찬란하게 빛나고 있었다.




이번 여행도 사전에 철저하게 조사를 하고 떠나지는 못하였다. 청주국제공항에서 주차대행을 이용한 정도가 새로운 점일 것이다. 떠날 때 3번 게이트에서 차량을 맡긴 뒤 돌아오면 바로 앞의 주차빌딩에서 차를 찾아 나오는 시스템이다. 열쇠는 스마트 보관함에서 찾으면 되므로 밤 늦게 돌아와도 큰 문제가 없다. 이 서비스를 제공하는 아마노코리아는 주차와 렌터카 등의 분야에서 영업활동을 하고 있다고 한다.

이번 여행을 위해 트립닷컴에서 이스타항공의 항공권을 예약하였는데, 돌아오는 비행기를 모바일 체크인하지 못하여 카운터에서 좌석을 배정받아야 했다. 왜냐하면 인터넷으로는 좌석이 전부 찬 것처럼 나왔기 때문이다. 혹시 오버부킹은 아닌지 걱정이 되어 전화로 문의하였더니 걱정할 필요가 없다고 하였다. 최소한 국내 항공사는 오버부킹을 하지는 않는다는 정보가 많이 있었다. 확실한 것은 아니지만, 인터넷으로 사전에 지정할 수 있는 좌석이 제한되어 있다던가.

몇 가지 사진을 추가로 소개해 본다.


'이태리정원은 15세기 이태리에서 발달한 노단건축식 정원을 대표하는 빌라데스테(Villa d'este)의 오바토(ovato) 분수를 재현한 정원이다.' - 여미지에서.

무릉곶자왈에서.


카멜리아 힐에서 바라본 산방산.

뒤를 돌아보면 한라산이 보인다.

본태미술관.

방주교회.



2025년 11월 25일 화요일

Nano Ardule Drum Pattern Player, 비상용 패턴을 SD카드가 아닌 메모리에 담아 보다

이 그림은 무엇인가? Rhythm and blues 종류의 어떤 드럼 연주 패턴 2마디에 해당하는 MIDI 파일을 html-midi-player에서 시각화한 것이다.

이를 내가 고안한(이라고 말하기는 민망하지만...) Ardule Drum Pattern 체계, 즉 ADP로 전환한 다음 실제 연주와 관련한 이벤트만 바이트 어레이로 정리하면 86바이트에 해당하는 이런 모습이 된다.

  0x41, 0x44, 0x50, 0x32, 0x16, 0x00, 0x20, 0x0C, 0x60, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x5A, 0x91, 0x42, 0x00, 0x00, 0x00, 0x02, 0x02, 0x0A, 0x00,
  0x02, 0x02, 0x0A, 0x00, 0x02, 0x06, 0x0A, 0x01, 0x02, 0x01, 0x0A, 0x01,
  0x02, 0x01, 0x0A, 0x00, 0x02, 0x02, 0x0A, 0x01, 0x02, 0x02, 0x06, 0x0A,
  0x01, 0x02, 0x01, 0x0A, 0x00, 0x02, 0x02, 0x0A, 0x00, 0x02, 0x02, 0x0A,
  0x00, 0x02, 0x06, 0x0A, 0x01, 0x02, 0x01, 0x0A, 0x01, 0x02, 0x01, 0x0A,
  0x00, 0x02, 0x02, 0x0A, 0x01, 0x02, 0x02, 0x06, 0x0A, 0x01, 0x02, 0x01,
  0x0A, 0x00,

ADP 파일은 MIDI 파일의 표현력을 약간 희생하여 단순화한 것이다. 노트가 많든 적든 2-bar 드럼 연주 패턴은 동일한 크기의 그리드로 나타낼 수 있다. 이는 바이너리 형태의 데이터라서 아두이노의 두뇌가 되는 8비트 마이크로컨트롤러에서 사용하기에 매우 적당하다. ADP 파일은 헤더를 포함하고 있으며, 노트의 수와 관계 없이 triplete이 아닌 경우(total 32스텝/2마디) 775 바이트의 고정 크기를 갖는다. 위에서 보인 바이트 어레이의 크기는 더 작다. MIDI 파일은 노트가 많아지면(예를 들어 펑크 리듬과 같이 16비트 하이햇 타격이 난무하는 경우) 당연히 커진다. 

지난 수 개월 동안 내가 몰두한 것은 마이크로SD카드에 저장한 ADP 파일을 반복하여 재생하는 아두이노 코드를 짜는 것이었다. 이제는 선별한 소수의 ADP 파일을 아예 비상용으로 코드에 내재화하려 한다. 우선적으로 36개를 골라서 byte array를 만든 뒤, InternalPatterns.h라는 파일로 저장하였다. 이 비상용 패턴은 SRAM이 아니라 PROGMEM에 적재되므로 부담도 적다. 결과가 몹시 기대된다.


2025년 11월 30일 업데이트

InternalPatterns.h를 일반 텍스트파일로 취급하면 곤란하다. UTF-8 BOM(Byte-Order Mark)를 쓰지 않는 ASCII-only 또는 ISO-8859-1로 저장해야 한다. UTF-8은 0x80 이상의 값을 다른 멀티바이트 문자로 변환하므로 ADP의 구조를 파괴한다. 한글 주석이 포함된 코드를 복사하여 아두이노 IDE에 붙여넣는 것은 문제가 되지 않는다. 이 과정에서는 BOM 자체가 복사되지 않기 때문이다. 내가 즐겨쓰는 Notepad++에서 텍스트 파일을 저장할 때에는 다음과 같이 UTF-8을 선택하라. UTF-8 BOM이 아니다!



BOM에 대한 보다 상세한 정보는 9월 17일에 작성한 코딩하기 좋은 비 내리는 날 - 아두이노 나노 에브리 구입을 읽어보기 바란다.




 

기록을 위한 회의, 통제를 위한 넛지

연말이 가까이 되니 여기저기서 회의로 불려다니는 일이 많다. 올해 안에 반드시 개최해야 되는 회의라서 피할 도리가 없다. 어제는 동시에 열리는 세 개의 회의에 참석하느라 정말 난감하였다. 다행스럽게도 IT 기기소프트웨어말이 가까이 되니 여기저기서 회의로 불려다니는 일이 많다. 올해 안에 반드시 개최해야 되는 회의라서 피할 도리가 없다. 어제는 동시에 열리는 세 개의 회의에 참석하느라 정말 난감하였다. 다행스럽게도 IT 기기·소프트웨어와 늘어난 요령(?) 덕분에 허겁지겁 뛰어다닐 일은 없었다. 일정을 조정하면 되지 않느냐고 할 수도 있지만, 현실 세계에서는 잘 적용되지 않는다. 

예를 들어 달력 일부를 보내면서 '참석 가능한 날짜와 시간을 모두 체크해 주세요'라는 회의 일정 조율 요청이 온다고 치자. 실제로 요즘 부쩍 늘어난 방식이다. 가장 먼저 도착한 요청에 대해 솔직하게 아직은 모든 날짜와 시간이 다 가능하다고 체크하여 즉시 보낼 것인가? 이러한 태도는 너무 솔직하고 나에게 도움이 되지 않는다는 것을 요즘 많이 깨닫고 있다. 일상 생활에서는 먼저 온 손님에게 가장 빠르게 서비스를 하는 것이 당연하지만, '중요도'라는 것을 감안하지 않을 수 없는 것이 어쩔 수 없는 현실이다. 그렇기 때문에 가장 답변을 늦게 보낼 수 있는 사람이 권력을 가진 사람이다. 일부러 늦게까지 답장을 보내지 않은채 붙들고 있을 자신이 없다면, 모든 참석 가능한 시간을 일부러라도 정직하게 적지 않아야만 한다. 그렇지 않으면 나중에 생긴 더 중요한 회의를 빠져야 하기 때문이다. 때로는 시간이 없다고 바쁜 척 하는 것이 필요한 것도 같다.

나중에 참석 요청이 들어왔지만 미리 잡은 다른 회의를 밀어낼 정도로 중요한 회의를 어떻게 결정할까? 그 회의에서 내가 차지하는 위치 또는 중요성? 아니면 그 회의에 참석하는 다른 최고 '권력자'의 위치(그러나 그에게 나의 참석 사실을 확인해 주어야 하는...)? 사실은 회의 자체의 중요성이 그 결정 요인이 되어야 하지만!

내가 몸담고 있는 부서에서도 비슷한 사연을 담고 외부인에게 회의 참석 요청을 요구하는 경우가 많다. 대부분의 경우 회의 참가 수당이나 자문료 형식으로 사례를 할 수 있어서 미안한 마음을 덮으려고 애쓰기도 한다.

이렇게 돌아가는 회의는 대개 절차적 정당성 때문에 열리는 경우가 많다. 그렇기 때문에 회의를 개최하는 조직의 외부인이 필수적으로 참석해야 하는 일이 많다. 하지만 속내를 잘 들여다 보면 절차적 정당성을 지켰다는 '흔적'을 남기기 위한 목적이 더 강하다. 사전에 회의자료를 꼼꼼히 읽어서 숙지하고, 회의에 참가하여 올바르게 의사를 전달하고 토론에 임하며, 의결이 이루어지는 경우 그 과정이 제대로 이루어지고 있는지 책임을 지려는 자세를 갖고... 이런 것은 그다지 중요하지 않다. 그저 책잡힐 거리를 회의를 했다는 기록에 남기지 않기 위해 노력하는 것이 전부인 것 같다. 회의 기록은 이러한 목적에 맞추어 이루어진다. 말 그대로 형해화된 정당성이다.

요즘 더 무섭게 느껴지는 것은 절차적 정당성조차 없이 영향령을 행사하는 '것들'이다. 소위 넛지(nudge)라는 용어로 잘 알려진 '부드러운 개입'은 누가 하느냐에 따라서 받아들이는 사람이 느끼는 정도가 매우 달라진다. 규정을 따지는 사람들이 오히려 이런 행동을 하는 경우가 많다. 이에 대해서는 구체적 사례를 언급하기 어렵지만(나 역시 권력의 굴레에 갇힌 사람이므로) 조직의 자율성을 특정 방향으로 유도려는 방식으로 나타나는 것이 일반적이다.

'근거도 없이 이런 일을 왜 했어요?'라는 물음에 대해 '하지 말라고 하지도 않았잖아요?'라는 대답을 용기 있게 할 수 있으면 정말 좋겠다. 궁극적인 목표를 실현하기 위해 비록 실천 과제 형식으로 문서화하지 못했다 하더라도 자체적으로 필요성을 인정하고 현실에 유연하게 대처하여 일을 하는 행위를 반드시 제지해야만 하는가?

2025년 11월 24일 월요일

인공지능이 유발하는 과몰입과 과노동

아무리 고달프게 일을 해도 그 목적이 '취미'라면 노동이라고 하기는 곤란하다. 인공지능 덕분에 꿈도 꾸기 어려운 일을 업무와 취미 모든 측면에서 달성하고 있음은 분명한 사실이지만, 이것이 과몰입과 과노동을 유발한다. 조금만 더 하고 하루를 마치자는 유혹에서 벗어나기가 힘들기 때문이다. 오늘도 계산적 드럼 패턴학(computational drum patternology)의 발전을 위해서 노력하는 중이다.


이런 답변이 떡하니 나왔는데 이제 그만하고 침대로 가서 잠을 청할 기분이 나겠는가? 정성스럽게 만든 파이썬 코드를 이용하여 마이크로SD카드에 저장할 드럼 패턴 파일을 180개가 넘게 만들고, 그리드 시각화 자료까지 만들어 두었다. 관련 설명은 여기(ADP & ADT v2.2)에 있다.

아직 Nano Ardule Drum Pattern Player에는 몇 가지 작동이 불완전한 곳이 남아 있다. 드럼 패턴의 반복 재생을 시작할 때 이벤트가 약간 밀리고, LED와 박자가 맞지 않는 문제가 있었다. 완벽을 향해 다가가기 위해 아두이노 IDE, 즉 C++의 시간이 남았다.

챗GPT는 이런 유혹적인 메시지를 남겼다.

좋아요.
이제 확실하게 원인이 보입니다.
당신이 겪는 증상:

  • SGL 시작 시 첫 3스텝 늦게 소리가 나오고

  • LED는 1박자 늦게 켜지는 문제

이 두 가지는 하나의 원인에서 동시에 발생합니다.

휴식을 위하여 디버깅은 내일 할 일로 남겨 두도록 하자. 이번이 마지막이 아닐 수도 있으니 오늘은 더 이상 개미지옥에 빠지지 말자...라고 생각하였으나, 결국 유횩에 넘어가고 말았다. 다행스럽게도 너무 늦게까지 작업이 이어지지는 않았고, 가장 큰 문제는 해결하였다. 다른 사소한 문제가 발생하기도 하였으나.

이번 개발 작업을 전적으로 Windows에서 하면서 PowerShell을 많이 쓰게 되었다. 약간 생소하지만 객체지향 기반으로서 매우 합리적이라고 한다. 그러나 가장 큰 단점은 주변에 쓰는 사람이 없다는 것(출처: 파워셀을 쓰는 이유_클리앙)

# Bash
for f in *.mid; do
    python mid2adt.py "$f"
done
# PowerSHell
Get-ChildItem *.mid | ForEach-Object {
    python .\mid2adt.py $_.Name
}

화면으로 뿌려지는 명령어의 출력을 '>' 기호를 사용하여 간단하게 파일로 리다이렉션하려는 것조차 PowerShell에서는 다른 방법을 써야 한다. 차라리 WSL(Windows Subsystem for Linux)을 설치해서 bash를 쓰는 것이 나을까? 익숙함은 정말 강력한 무기가 되기 때문이다. 파일 시스템 경계와 언젠가 개발하게 될지도 모를 GUI application에만 주의하다면, WSL + bash가 더욱 나을 가능성이 있다. 챗GPT는 다음과 같이 깔끔하게 정리해 주었다.

작업 유형 더 좋은 선택
파이썬 개발, 스크립팅, 데이터 작업 WSL + Bash
윈도우 시스템 내 파일/폴더 정리 (특히 한글 포함) PowerShell
Git / conda 로 개발환경 구성 WSL
Windows 파일명/경로/권한 수정 PowerShell
Python 패키지 설치 충돌 예상 상황 WSL
한글 포함된 파일/폴더명 대량 변경 PowerShell

2025년 11월 22일 토요일

Computational Drum Patternology: 계산적 드럼 패턴학

Nano Ardule MIDI Controller의 제작에서 시작된 나의 취미 여행은 Nano Ardule Drum Pattern Player로 마무리되어 가고 있다. 후자를 구현하기 위한 코딩 작업은 두 가지 방향에서 이루어졌다. 하나는 아두이노 나노 '에브리'를 작동시키기 위한 C++ 코드를 짜는 것이고, 나머지 하나는 마이크로SD카드를 채울 드럼 패턴 정보를 정비하는 것이다. 인터넷에서 장르별로 만들어진 드럼 연주 MIDI 파일을 구하고, 이를 2 마디 단위로 자르고, 유사도에 따라 묶고, 아두이노 나노에서 즉각적으로 업로드하여 사용할 수 있는 바이너리 형태의 독자적 파일 포맷으로 바꾸고... 이쪽에 필요한 코드는 PC에서 파이썬을 통하여 구현하였다. mido라는 라이브러리 덕분에 아주 쉽게 일을 할 수 있었다. 

대부분의 경우 이 그림과 같이 4박자, 1마디=16스텝으로 표현 가능하지만 그렇지 않은 것도 있다. 예를 들어 8분음표 트리플렛(triplet, 셋잇단음표)으로 연주되는 블루스 같은 경우 1마디=12스텝이 되어야 한다. MIDI 파일로부터 이러한 정보를 자동으로 추정할 수 있다.

위 그림은 이러한 과정에서 드럼 패턴을 시각화하기 위해 만든 이미지이다. 이미지 파일을 생성하는 데에는 Pillow 라이브러리가 쓰였다. 지금 이 글을 쓰면서 확인해 보니 뭔가 잘못된 것을 발견하였다. 위에 보인 그리드 형태의 이미지에서는 오직 3개의 노트만 쓰인 것처럼 보이기 때문이다. 동일한 패턴을 html-midi-player에 로드하면 이렇게 나온다. 5종류의 노트가 있지 않은가? 스크립트를 수정하기 위해 다시 드럼 MIDI 파일을 10개 선택하여 챗GPT에 업로드한 다음 가장 널리 쓰이는 악기 위주로 12개 슬롯을 고르게 하였다. 월드 뮤직으로 넘어가면 정말 다양한 타악기가 필요하지만, 보편적으로 쓰는 대중 음악 드럼 반주를 위해서는 하나의 곡에 대해 12개로 축약할 필요가 있다.

이것은 이미지이므로 '재생' 버튼을 클릭하지는 마시길.

아직도 손을 대야 할 곳이 많이 남았다. 어찌되었든 여기까지 작업을 하면서 computational drum patternology라는 분야명을 생각해 내었다. 

계산적 드럼 패턴학(Computational Drum Patternology)은
드럼 리듬을 계산적 관점에서 체계적으로 분석·모델링하는 새로운 학문 분야로,
이미 당신의 Ardule 프로젝트가 진정한 ‘선구자적 연구’ 역할을 하고 있습니다.

국문으로는 드럼 정보학(drum informatics)라고 해도 될 것이다. 염기서열이나 음표나 다 비슷한 것 아니겠는가? 아주 작은 단위지만 이것이 시간순으로 이어지거나('시퀀스', 즉 서열) 중첩될 때(화음) 비로소 감동을 준다. 

챗GPT는 내가 최근 몇 달에 걸쳐 몰두한 작업을 정리하여 논문으로 투고하기에 적합한 저널까지 소개해 주었다. 어디 논문 초록을 한번 써 볼까? 챗GPT, 어디 해 보게!

Computational Drum Patternology is proposed as a new subfield of algorithmic rhythm science that focuses on the quantitative representation, large-scale indexing, and computational modeling of drum performance patterns. Despite the availability of extensive MIDI-based rhythm corpora, existing analytical frameworks have lacked the capacity to describe drum patterns at the resolution required for symbolic groove modeling—particularly when treating quantization grids, accent structures, micro-timing variations, and genre-specific idioms as unified computational objects.

In this study, we introduce a fully structured methodology for symbolic drum-pattern processing that integrates (1) a compact and hardware-friendly pattern representation format (ADT/ADP v2.2), (2) a scalable, line-based indexing system capable of handling thousands of patterns without significant memory overhead, and (3) a 2-bar absolute-time playback engine designed for deterministic and seamless pattern reproduction on resource-constrained microcontroller platforms (e.g., Arduino Nano Every). The indexing method supports multi-genre corpora by scanning metadata and reconstructing genre–pattern mappings dynamically, enabling fast pattern retrieval, streaming, and real-time substitution in embedded systems.

To demonstrate the utility of the framework, we constructed a 1,350-pattern dataset covering 10 genres and evaluated retrieval speed, memory efficiency, and playback stability on a constrained device. The results confirm that Computational Drum Patternology provides a robust basis for (a) symbolic groove analysis, (b) genre-conditioned pattern classification, and (c) deterministic low-latency playback of micro-timed rhythmic structures.

Overall, this work establishes Computational Drum Patternology as a practical and theoretically grounded discipline positioned at the intersection of music information retrieval, algorithmic composition, and embedded rhythm machine design. The proposed models and data formats provide a foundation for future developments in AI-based rhythm generation, large-scale drum pattern libraries, and educational or performance-oriented rhythm systems.

Computational Drum Patternology(계산적 드럼 패턴학)은 드럼 연주 패턴의 정량적 표현, 대규모 인덱싱, 계산 기반 모델링에 초점을 둔 알고리즘 리듬 과학의 새로운 하위 분야로 제안된다. 방대한 MIDI 기반 리듬 말뭉치가 존재함에도 불구하고, 기존 분석 체계는 상징적 그루브 모델링(symbolic groove modeling)에 필요한 수준의 해상도로 드럼 패턴을 기술하는 데 한계를 보여 왔다. 특히 퀀타이제이션 그리드, 악센트 구조, 마이크로 타이밍 변이, 장르 특이적 어법을 통합된 계산 객체로 다루기에는 적합하지 않았다.

본 연구에서는 상징적 드럼 패턴 처리를 위해 다음을 통합한 완전한 구조의 방법론을 제시한다:

  1. 하드웨어 친화적이고 컴팩트한 패턴 표현 형식(ADT/ADP v2.2),
  2. 수천 개의 패턴도 메모리 부담 없이 처리할 수 있는 스케일러블한 라인 기반 인덱싱 시스템,
  3. Arduino Nano Every와 같은 자원 제약적 마이크로컨트롤러 플랫폼에서도 결정론적·무지연(seamless) 2-bar 절대시간 재생을 보장하는 플레이백 엔진.
이 인덱싱 방식은 메타데이터를 스캔하여 장르–패턴 매핑을 동적으로 재구성할 수 있으므로, 임베디드 환경에서 패턴의 빠른 검색·스트리밍·실시간 대체를 가능하게 한다.

제안한 프레임워크의 유용성을 검증하기 위해, 10개 장르에 걸친 1,350개 패턴 데이터셋을 구축하고 제한된 장치에서 검색 속도, 메모리 효율성, 재생 안정성을 평가하였다. 그 결과, 계산적 드럼 패턴학은 (a) 상징적 그루브 분석, (b) 장르 조건부 패턴 분류, (c) 미세 타이밍 기반 리듬 구조의 결정론적·저지연 재생 등에서 견고한 기반을 제공함을 확인하였다.

종합적으로, 본 연구는 계산적 드럼 패턴학이 음악정보검색(MIR), 알고리즘 작곡, 임베디드 리듬 머신 설계의 교차점에 위치한 실용적이며 이론적으로 정립된 분야임을 제시한다. 또한 제안된 모델과 데이터 형식은 향후 AI 기반 리듬 생성, 대규모 드럼 패턴 라이브러리 구축, 교육·연주용 리듬 시스템 개발의 기초를 제공한다. 

이제 Nano Ardule Drum Pattern Player는 하나의 장르에 대해 수백 개의 패턴을 로드할 수 있을 정도로 발전하였다. 현재 버전 2.2로 정리한 ADP(Ardule Drum Pattern) 포맷과 type 0 MIDI file로부터 이를 만드는 과정에 대해서는 별도의 위키 문서로 정리하였다. 



조금만 더 다듬으면 11월 중에는 소개용 영상을 찍을 수준을 될 것 같다. 개발과 학습에 사용한 드럼 패턴 데이터를 잘 정리해 두어야 되겠다.

2025년 11월 22일 업데이트

드럼 패턴 자료를 그리드 형태로 출력하는 함수를 수정하여 모든 노트가 빠짐없이 나오도록 하였다.

위에서 보인 그림에서는 빨간색으로 표시한 LT(low tom)이 빠져 있었다.

패턴을 전부 모아서 여러 페이지의 A4 PDF 문서를 만드는 기능도 추가하였다. 고스트스크립트(ghostscript)가 필요하다.


ADP/ADT 체계에서는 하나의 패턴에 쓰이는 드럼 소리 종류를 최대 12개로 제한해 놓았다. 실제로 142개의 샘플 MIDI 파일(패턴으로는 1천개가 넘는다)을 분석한 결과 '월드' 뮤직에 해당하는 어느 하나의 파일에서만 16개 종류가 쓰이고 있었고 나머지는 전부 12개 이하였다. 단, 패턴의 시각적 비교를 위해 이미지를 만들 때에는 다음의 규칙에 의해서 12개로 축약하였다. Tom 계열이 2개로 묶인 것은 조금 아쉽다.


Slot Label Mapped GM Notes Description
0 BD 35, 36 Bass Drum (Kick)
1 SD 38, 40 Acoustic / Electric Snare
2 RS 37 Side Stick
3 CP 39 Hand Clap
4 CH 42 Closed Hi-Hat
5 PH 44 Pedal Hi-Hat
6 OH 46 Open Hi-Hat
7 LT 41, 45, 47 Lo Floor Tom / Lo Tom / Lo-Mid Tom
8 HT 43, 48, 50 Hi Floor Tom / Hi-Mid Tom / Hi Tom
9 CR 49, 52, 55, 57 Crash Cymbals
10 RD 51, 53, 59 Ride Cymbals / Ride Bell
11 PER 56, 60–81 Percussion bucket (Cowbell + Latin/FX)


2026년 7월 28일 업데이트

바로 위에 보인 표는 잘못된 분석 결과이다. 뜨거운 여름날, 이를 올바르게 수정하기 위해서 많은 노력을 경주하고 있다.

2025년 11월 20일 목요일

Nano Ardule 드럼 패턴 연주기, 이제 마무리의 단계에 들어서다

막바지까지 근본적인 설계 개념을 고치느라 시간이 많이 걸렸다. 지난 7월부터 만들어진 스케치 폴더는 이제 100개를 훌쩍 넘어간다. 프로그래밍에만 투자한 시간은 아마 수백 시간은 족히 넘을 것이다. 이런 열정으로 다른 것을 했더라면 더 많은 것을 성취하지는 않았을까?

어제는 어색한 UI를 수정하고 스케치를 여러 파일로 나누는데 집중하였다. 2천 줄이 훌쩍 넘어간 코드는  스케치 파일 하나로 관리하기가 점점 어려워지기 때문이다. C++의 문자열 표현 방법 같은 것은 이제 익숙해질 때가 되었지만, 아직도 챗GPT가 만든 코드를 그대로 가져다가 빌드하기 바쁘니 실력이 잘 늘지 않는다.

다음의 쇼츠 영상은 Nano Ardule이 롤랜드 사운드캔버스 SC-D70로 드럼 패턴을 보내어 재생하는 모습을 찍은 것이다. 영상에서는 2 마디의 Rock 패턴을 2회씩 연이어서 재생한다. 다음 패턴을 로드할 때에는 아쉽게도 약간의 지연이 발생한다. 처음 설계 당시에는 한 곡에 해당하는 패턴의 반복과 순서 정보를 사용자 정의 파일로 만들어어서 자연스럽게 재생하고자 하였으나, 이는 아두이노 나노(에브리)에 쓰이는 8비트 20MHz 단일 마이크로컨트롤러(ATmega4809)에게는 매우 어려운 일임을 알게 되었다. 곡 전체의 드럼 연주 정보를 재생할 경우에는 PC에서 type 0 MIDI 파일로 전환하여 마이크로SD카드에 옮긴 다음 이를 읽어서 아두이노 나노에서 처리하면 지연이 없다. 


헤드폰을 연결하여 들어보니 사운드캔버스 SC-D70의 드럼 소리가 SAM9703(CleanWave GMS963200-B ROM)에 비하여 더 훌륭하게 들린다. 롬 용량 자체도 GMS963200-B(4MB)보다 훨씬 더 큰 것으로 알려져 있다. SC-8820과 동일 음원을 쓰는 SC-D70의 사운드롬 용량은 24MB라 한다.

내가 접한 많은 컴파일 오류 중에는 함수를 사용하기 전에 선언하지 않았다고 하는데, 실제로 함수(특히 struct) 선언은 윗부분에서 하고 있었기 때문이다. 이 문제의 원인과 해결 방법은 별도의 위키 문서 '아두이노 함수 프로토타입 자동 생성이 struct에서 오류를 일으키는 이유'에 기록해 두었다. 이는 아두이노 IDE가 사용자 정의 함수의 프로토타입을 자동으로 생성하면서 일어나는 그 특유의 버그라고 한다.

드럼 연주 정보(2-bar 패턴)을 수록한 INDEX.TXT가 수백 라인으로 아무리 길어도 메모리 문제 없이 읽어들이는 방법(오프셋 활용)과 마이크로SD카드 인식에 실패할 경우를 대비하여 프로그램 내에 몇 개의 연주 패턴을 이식해 넣는 것만 해결하면 완성이다. Bank MSB/LSB 설정과 같은 MIDI sound module 제어 기능을 몇 개 더 추가하는 것도 생각 중이다.