2026년 8월 12일 수요일

Ardule 드럼 플레이어, 이제는 self-contained HTML로 발전하다

생성형 AI에서 지시문으로 원하는 이미지(원형 엠블럼)를 만들어 내기는 참 어렵다.

자체 포맷으로 만들어진 ADT/ADP 드럼 패턴 파일을 컴퓨터에서 재생하기 위하여 파이썬 기반의 별로 친절하지 못한 CLI 재생기를 만든 바 있다. 이를 사용하려면 PC에 파이썬을 설치해야 하고, 파워셸과 같은 터미널 창을 열어서 명령어를 일일이 타이핑해야 한다. PyInstaller 등으로 .exe로 패키징할 것이 아니라면 이러한 번거로움을 벗어나기 곤란하다.

원본 MIDI 파일의 드럼 패턴 분석 보고서는 HTML 형식이다. 패턴을 시각화한 이미지 자료가 들어가고, 약간의 수고를 더하여 FluidSynth + SF2 기반의 재생 기능까지 성공적으로 넣었다. 그러나 이를 이용하려면 터미널 창에서 작은 서버 스크립트를 구동해야 한다.

챗GPT와 대화를 나누며 시행착오를 거친 끝에 드럼 샘플(오디오)이 아예 내장된 HTML 기반의 패턴 재생기를 만들어 버렸다. GeneralUser-GS.sf2에서 대표적인 드럼킷의 오디오 샘플을 꺼내어 HTML 안에 임베드한다? 이게 된다는 것이 놀랍다. 더군다나 무손실 압축포맷인 FLAC을 사용하면서 HTML 파일의 크기는 25MB(최초 개발 버전)에서 7.6MB로 줄어들었다. 25MB를 넘으면 웹 인터페이스를 통해 GitHub에 올리기 곤란하고, 다운로드하여 쓰기에 다소 파일 용량이 큰 것도 사실이다.

첫 버전에서는 ADT 파일을 마우스로 끌어다 넣거나 직접 선택하여 로드하도록 만들었으나, 이어진 개선판에서는 아예 사용성이 높은 44개 패턴을 파일 내에 넣어 버렸다. 나의 GitHub 프로젝트 웹페이지에서 파일 하나(ardule-drum-player.html)만 다운로드 받으면, 데스크톱이든 휴대폰이든 드럼 패턴을 재생할 수 있다.

Ardule Drum Player의 스크린샷. Favicon까지 임베드하였다.

재생기의 기본 기능을 구현하는 데에는 채 두 시간이 걸리지 않았다. 참으로 놀랍다!

이 과정을 통해 드럼 연주 정보의 데이터과학적 접근에 대해서도 많은 것을 알게 되었다. 설마 나와 같은 작업을 한 사람이 세상에 나 혼자뿐이겠는가? 예를 들어 Groove MIDI Dataset(GMD)은 Google Magenta 연구진이 2019년에 공개한 인간 드러머의 실제 연주 데이터셋이다. 전문 드러머 등을 전자드럼으로 연주하게 하여 약 13.6시간, 1,150개의 MIDI 파일과 22,000마디 이상의 드럼 연주를 수집했으며, 장르·템포·박자표·beat/fill 등의 메타데이터도 함께 제공한다. 일반적인 정형 드럼 패턴 모음과 달리 GMD의 중요한 특징은 실제 연주에서 발생하는 미세한 타이밍 차이(microtiming)와 타격 강도(velocity)를 그대로 담고 있다는 것이다. 따라서 GMD는 단순히 ‘어떤 드럼을 어느 박자에 치는가’를 기록한 패턴 자료라기보다 인간이 하나의 리듬을 실제로 어떻게 연주하는가를 기록한 데이터에 가깝다. 이러한 특성 때문에 인간적인 드럼 연주의 생성과 복원, groove transfer, 스타일 분류, 자동 드럼 전사 등 다양한 연구에 활용되고 있다.

GMD와 이를 활용한 연구가 사람이 드럼을 어떻게 연주하는가에 초점을 맞춘다면, Ardule Drum Patternology는 그 연주에서 어떤 패턴을 추출하여 어떻게 기술하고 비교할 것인가에 초점을 맞춘다. GMD에서는 정확한 그리드에서 조금 앞서거나 뒤처지는 microtiming과 세밀한 velocity 차이가 인간적인 groove를 구성하는 중요한 정보이며, 실제로 이를 학습하여 quantized beat를 다시 인간적인 연주로 만드는 연구에 활용한다. 반면 Ardule은 다양한 MIDI 드럼 자료를 공통된 subdivision, slot, accent 구조로 추상화하여 재사용 가능한 drum pattern object로 만들고, 필요할 경우에만 세부 timing 정보를 ORN과 같은 별도 계층에 보존한다. 따라서 Ardule Drum Patternology의 관심은 연주를 사실적으로 재현하는 데 그치지 않고, 서로 다른 시대와 출처와 장르의 드럼 데이터를 같은 표현 체계 위에 올려 무엇이 같은 패턴이고 무엇이 변형이며, 어떤 리듬 어휘가 반복해서 등장하는가를 분석·비교·교환할 수 있게 하는 데 있다. 즉 GMD가 performance를 데이터로 만든 것이라면, Ardule Drum Patternology는 performance와 MIDI 자료에서 pattern이라는 연구 가능한 객체를 만들어 내는 것에 의미가 있다.

지금까지 총 세 세트의 drum pattern corpus를 분석하여 GitHub의 collections 아래에 정리하고, 이로부터 총 1,318개의 드럼 패턴을 집대성하였다. 그러나 패턴을 모으는 것 자체가 끝은 아니다. 이들을 일정한 방식으로 벡터화하고 심층 분석하면 패턴 사이의 거리를 계산하여 동일하거나 매우 유사한 패턴을 찾아낼 수 있고, 중복을 정리하거나 서로 다른 자료에서 반복해서 등장하는 리듬 구조를 발견할 수도 있다. 더 나아가 충분한 학습·참조 자료가 확보된다면 패턴의 특징만으로 장르를 추정하고 라벨을 부여하는 것도 시도해 볼 수 있을 것이다. 이를 위해서는 GMD(Groove MIDI Dataset)를 비롯한 양질의 corpus를 추가로 분석하여 비교 대상을 넓힐 필요가 있다. 재료는 부족하지 않다. MIDI로 기록되거나 변환된 드럼 연주 정보는 이미 세상에 널리고 널렸다. 이제 필요한 것은 그것을 수집하는 일을 넘어, 서로 비교하고 분류하고 해석할 수 있는 드럼 패턴 데이터로 바꾸는 일이다.

Drum Patternology, 그것은 생명정보학과 묘하게 닮았다.

그러나 어쩌면 나는 바퀴를 재발명하느라 애쓰고 있는지도 모른다.



정답이 없는 질문

 책임을 묻기 위해 사실을 확인하는 것과, 책임질 사람을 찾기 위해 사실을 확인하는 것은 전혀 다른 일이다.

전자는 먼저 무슨 일이 있었는지를 확인한다. 문제가 있었다면 원인이 무엇인지 살펴보고, 어떻게 바로잡을 것인지 고민한다. 그 과정에서 잘못된 판단이나 명백한 태만이 확인된다면 그때 책임을 묻는다. 사실의 확인이 먼저이고 책임은 그다음이다.

그러나 후자는 순서가 거꾸로다. 문제가 발견되는 순간부터 누가 책임져야 하는지를 먼저 찾는다. 사실을 확인하는 질문도 문제의 원인을 이해하기 위한 것이 아니라 책임자를 특정하기 위한 방향으로 흘러간다.

이런 조직에서는 질문에 정답이 없다.

“이 사실을 알고 있었습니까?”

몰랐다고 하면 관리자가 그것도 파악하지 못했느냐고 질책한다. 무능과 관리 소홀의 증거가 된다. 알고 있었다고 하면 더 곤란하다. 알고도 지금까지 아무 조치를 하지 않았느냐고 묻는다. 이번에는 방치와 직무유기의 증거가 된다.

몰랐으면 무능이고, 알았으면 직무유기다.

이런 질문이 반복되면 사람들은 질문의 의도를 학습한다. 질문을 받았을 때 사실을 정확하게 설명하는 것보다, 이 답변이 나중에 누구의 책임으로 돌아갈지를 먼저 생각하게 된다. 솔직하게 문제를 드러내는 것이 위험해지고, 새로운 사실을 발견하는 것조차 부담스러워진다.

결국 질문은 정보를 얻기 위한 수단이 아니게 된다.

무슨 일이 일어났는지를 이해하기 위한 질문이 아니라, 그 일의 책임을 누구에게 귀속시킬 것인지를 결정하기 위한 절차가 된다. 문제를 해결하기 위해 책임을 묻는 것이 아니라, 책임을 묻기 위해 문제를 들여다보는 것이다.

겉으로 보면 둘은 비슷하다. 둘 다 질문하고, 자료를 요구하고, 보고를 받는다.

그러나 하나는 문제를 해결하기 위해 사실을 찾고, 다른 하나는 책임질 사람을 찾기 위해 사실을 찾는다.

그 작은 순서의 차이가 조직의 문화를 완전히 다르게 만든다.

2026년 8월 11일 화요일

허리가 아파도 달렸다

일년에 두 번 정도 갑자기 허리가 아플 때가 있다. 이는 타고난 척추분리증 때문이다. 대학원생 시절 갑자기 일어나기도 힘들 정도로 허리가 심하게 아파서 병원을 간 뒤에 내가 이러한 선천성 질환을 갖고 있다는 사실을 알게 되었다. 증세가 심하면 가끔 한의원 신세를 지기도 하지만, 대개는 이틀 정도 지나면 저절로 나아진다. 하지방사통까지 생기지는 않는다.

지난 주말, 세면대에서 면도를 하던 중이었는지 이를 닦는 중이었는지 어쨌든 꼿꼿이 서서 뭔가를 하고 있는데 갑자기 허리가 삐끗하는 소리와 함께 통증이 밀려오면서 자세가 무너지고 말았다. 세면대를 부여잡고 거의 주저앉을 수준이었다. 허리가 아플 때에는 몸의 형태도 이상해진다. 통증은 늘 허리의 왼쪽 부분에 온다. 아플 때에는 허리도 그쪽으로 휘어진 모습을 관찰할 수 있다.

허, 이거 또 시작이네.

가까스로 몸을 추스리고 천안으로 문상을 다녀왔다. 자동차를 운전하는 정도는 큰 문제가 없으니까. 집에 돌아와서는 등산용 지팡이를 찾았다. 나머지 주말 외출은 지팡이에 의지했고, 일요일 저녁에는 그냥 누워버렸다.

월요일 아침, 지팡이를 짚고 출근을 하였다. 의자에 앉아 있다가 일어나는게 정말 고역이었다. 허리에 힘을 주고 일어서면 통증이 한결 덜하다. 관절이나 척추에 문제가 있지만 주변 근육과 인대를 단련하여 버티는 사람도 있다는데, 아마 힘을 주면 덜 아픈 것이 그런 꼴일 것이다.

오후가 되어 갑자기 통증이 한결 줄어들었다. 요추가 제자리를 찾았나? 지팡이도 필요가 없었고, 이만하면 저녁 달리기를 해도 문제가 없을 것 같았다. 그래서 퇴근 후 또다시 5km를 달렸다. 

달리면서 척추에 충격이 가해지므로 척주 전방 전위증이 생길지도 모른다는 합리적인 우려를 할 수도 있다. 몇 년 전에 건강검진에서 요추 CT를 찍었던 것 같다. 요추가 약간 앞으로 밀려났다는 진단을 받은 것 같기도 하다. 다음에 기회가 되면 다시 촬영을 해 본 뒤, 현재 상태의 운동을 그대로 유지해도 되는지 상담을 해 봐야 되겠다.

2026년 8월 10일 월요일

오래된 드럼 패턴 MIDI의 출처를 추적하다

이 글은 GitHub에서 운영하는 프로잭트인 ADX Drum(현재는 Ardule Drum Patternology로 명칭 변경)의 README 문서에 최근 새롭게 고쳐 쓴 문서를 국문으로 번역한 것이다. 패턴 분석 작업에 쓰인 MIDI 파일의 출처를 나름대로 탐색한 이야기이다.


Ardule Drum Patternology를 개발하면서 참조한 드럼 패턴은 주로 인터넷을 통해 오랫동안 유통되어 온 Standard MIDI 형식의 드럼 패턴 파일들이다. 이 프로젝트에서 사용한 자료는 Cakewalk 포럼에 공개된 460 Free GM MIDI Drum Patterns 에서 구했다.

압축 파일을 풀어 보면 세 종류의 GM 드럼 패턴 MIDI 모음이 들어 있다. 남아 있는 여러 흔적을 종합하면 이 자료들은 과거 FivePin Press라는 출판사에서 판매 또는 배포했던 것으로 보인다. 다만 정확한 저자, 제작자, 배포 경로를 명확하게 확인하기는 쉽지 않다.

이 가운데 두 묶음은 프랑스의 드럼 머신 패턴 저자인 René-Pierre Bardet의 저작물과 관련이 있는 것으로 보인다. Bardet는 다음 두 권의 책으로 잘 알려져 있다.

  • 200 Drum Machine Patterns
  • 260 Drum Machine Patterns

Bardet의 책들은 드럼 머신이 대중화되던 시기에 리듬 패턴을 하나의 재사용 가능한 음악적 단위로 정리하고 보급하는 데 상당한 역할을 한 자료로 보인다. 두 책은 지금도 중고 인쇄본을 구할 수 있으며, 인터넷에는 PDF 형태의 디지털 사본도 여러 경로를 통해 유통되고 있다.

그런데 실제 자료를 하나씩 대조해 보니 출처 관계는 생각보다 단순하지 않았다.

260개의 패턴은 Bardet의 책과 매우 잘 일치한다

Cakewalk 포럼에서 구한 MIDI 자료 가운데 260개의 패턴으로 이루어진 묶음은 Bardet의 260 Drum Machine Patterns에 수록된 패턴과 직접 비교했을 때 구조와 순서가 매우 잘 일치했다. 따라서 이 MIDI 모음과 Bardet의 책 사이에는 명백한 연관성이 있다고 판단할 수 있다.

흥미로운 점은, Archive 형태로 남아 있는 FivePin Press의 당시 설명에서는 René-Pierre Bardet라는 이름이 전혀 언급되지 않는다는 것이다. 따라서 이 MIDI 파일들이 FivePin Press에서 Bardet의 책을 공식적으로 MIDI화하여 판매한 것인지, 제3자가 별도로 '전사'(transcription)한 뒤 FivePin Press 자료와 함께 유통된 것인지, 혹은 이후 재배포 과정에서 서로 연결된 것인지는 현재 자료만으로는 확정하기 어렵다.

200개의 패턴은 출처가 훨씬 더 모호하다

문제는 200개의 패턴으로 이루어진 MIDI 모음이다. 처음에는 자연스럽게 Bardet의 200 Drum Machine Patterns를 MIDI로 옮긴 자료일 것이라고 생각했다. 그러나 실제 자료를 비교하면서 이상한 점이 발견되었다.

인터넷에서 Bardet의 200 Drum Machine Patterns라는 제목으로 널리 유통되는 PDF를 확인해 보면, 첫 두 페이지(표지와 목차)는 분명 Bardet의 책이다. 그런데 그 이후 대부분의 본문은 전혀 다른 책으로 바뀌어 있다.

그 책은 Ray F. BadnessDrum Programming: A Complete Guide to Program and Think Like a Drummer이다. 어떤 과정에서 이런 혼합 PDF가 만들어졌는지는 알 수 없지만, 동일하거나 유사한 파일이 오랫동안 인터넷에서 재배포되면서 Bardet의 200 패턴 자료를 찾는 데 상당한 혼란을 일으키고 있는 것으로 보인다.

Badness의 책 9쪽에 실린 그림.

물론 Badness의 책 자체는 매우 훌륭하다. 전통적인 드럼킷의 구성과 연주법으로부터 드럼 프로그래밍까지 매우 유용한 정보를 충실하게 담고 있으며 실용적인 설명과 예제가 풍부하여 지금 읽어도 가치가 있다.

그러나 중요한 것은 이 책의 내용이 Cakewalk 포럼에 공개된 200개의 MIDI 패턴과 일치하지 않는다는 점이다. 결국 현재까지 확인한 자료만으로는 파일명이 2로 시작하는 이 200개의 MIDI 패턴이 어떤 인쇄물에서 비롯된 것인지 확실하게 밝힐 수 없었다.

27 Instant Rap Patterns도 저자가 불분명하다

세 번째 묶음인 27 Instant Rap Patterns 역시 비슷한 문제를 가지고 있다. 패턴 자체는 정상적으로 사용할 수 있지만, 현재 확인 가능한 자료만으로는 원래의 저자나 편집자를 신뢰성 있게 특정하기 어렵다.

출처보다 중요한 것은 실제 데이터였다

이러한 출처의 혼란에도 불구하고 이 MIDI 자료들은 Ardule Drum Patternology 개발 과정에서 대단히 가치 있는 데이터셋이었다. 단순히 패턴을 복제하는 데 사용한 것이 아니라, 실제 MIDI 드럼 데이터가 어떤 방식으로 만들어져 있는지를 관찰하고 분석하는 자료로 활용했다.

이를 통해 리듬의 반복 구조뿐 아니라 MIDI 타이밍, subdivision, velocity 차이, 패턴의 변형, 그리고 미리 설계한 규칙에 잘 들어맞지 않는 예외적인 연주까지 실제 데이터 속에서 확인할 수 있었다.

특히 이런 실제 자료를 대량으로 분석하는 과정은 Ardule Drum Patternology의 패턴 추상화 방법과 표현 체계를 검증하고 수정하는 데 큰 역할을 했다. 어떤 규칙이 이론적으로 가능하다는 것과 수백 개의 실제 MIDI 패턴을 제대로 설명할 수 있다는 것은 전혀 다른 문제였기 때문이다.

그래서 이 MIDI 파일들을 ‘역사적 참조 데이터’로 취급한다

현재 Ardule Drum Patternology에서는 이 오래된 MIDI 파일들을 특정 책의 공식 디지털 판본으로 간주하지 않는다. 대신 historical reference dataset, 즉 역사적 참조 데이터셋으로 취급한다.

260 패턴처럼 실제 책과의 관계를 직접 비교하여 확인할 수 있는 경우에는 그 연관성을 기록한다. 반면 200 패턴이나 27 Instant Rap Patterns처럼 출처가 명확하지 않은 경우에는 확인 가능한 정보만 남기고 저자나 원전을 단정하지 않는다.

같은 이유로 Ardule Drum Patternology의 패턴 ID 역시 과거 MIDI 파일의 번호 체계를 그대로 계승하지 않는다. 대신 원본 MIDI 파일명, 원본 내 위치 등의 정보는 메타데이터로 보존하여 어디에서 유래한 패턴인지는 추적할 수 있도록 한다.

결국 이 오래된 MIDI 자료의 가치는 그 출처가 완벽하게 정리되어 있기 때문이 아니라, 오히려 수십 년 동안 실제 음악가와 프로그래머들이 사용하고 공유해 온 현실의 드럼 패턴 데이터라는 데 있다. Ardule Drum Patternology는 바로 그 데이터를 분석하고 추상화하여 현대적인 소프트웨어와 임베디드 시스템에서 다시 사용할 수 있는 형태로 만드는 데서 출발했다.

2026년 8월 4일 화요일

드럼 패턴 에디터의 진화, TUI에서 웹 GUI로!

PatternLab이 만들어진 뒤 드럼 패턴이나 MIDI 파일 재생 등의 기능이 모듈 형태로 추가되면서 새로운 아이디어를 떠올리고 이를 실제로 구현하는 속도가 점점 빨라지는 것을 느낀다. 최근에 있었던 가장 획기적인 개선은 사용자 인터페이스를 웹 기반으로 전환하였다는 점이다. 말 그대로 '대전환'에 해당하지만 개발 자체는 그다지 어렵지 않았다. 불과 6개월 전만 하더라도 CLI에서 APS.py의 텍스트 기반 UI를 구현하느라 얼마나 애를 먹었던가? 하지만 웹 브라우저에서 다채로운 그림을 포함하는 패턴 분석 리포트를 만들고, 분할한 각 패턴의 소리에 추상화를 적용한 뒤 원본과 더불어 각각의 실제 소리를 들어보고 싶다는 욕구를 충족해 나가는 과정은 그렇게 고생스럽지 않았다.

아래 이미지를 보라. 위의 것은 반년 전에 만들었던 aps.py(Ardule Pattern Studio)이고, 아래는 오늘 머리에 떠오르는 아이디어를 바이브 코딩으로 순식간에 구현한 웹 GUI 기반의 패턴 편집/재생기인 adx-web-editor.py이다. PowerShell에서 파이썬 스크립트를 실행하면 웹 화면이 뜸과 동시에 FluidSynth가 구동되면서 웹 GUI에서 조작한대로 사운드폰트 기반의 음성 합성이 일어난다. 이전에는 전혀 생각하지 못했던 방식이었다.


APS.py를 개발하느라 고생했던 순간들이 갑자기 한심하게 느껴지기 시작하였다. 왜 그때는 웹 GUI를 사용하려는 생각을 못했을까? 오로지 CLI에서 curses 라이브러리를 써서 텍스트 기반의 UI를 짜는 것이 가장 간단한 방법이라고만 생각했었다. 지금은 HTML, CSS, JavaScript만으로도 패턴 편집기와 재생기, 앞으로는 ORN 편집기와 패턴 체인 편집기까지 자연스럽게 구현할 수 있다는 사실을 깨닫고 있다.

나의 '개발 일지'를 전문가가 들여다 본다면 정말 기형적이고 희한하면서 비능률적인 방식으로 개발을 이어오고 있다고 평가할지도 모른다. 이론적 배경이나 경험 없이 그저 필요한 때마다 문제를 해결하면서 기능을 하나씩 쌓아 올렸기 때문이다. 실제로는 인공지능 덕분에 지시문을 던지고 검증하며 개선점을 찾아내는 일만 하는 셈이지만. 

어설프기는 해도 최근 생산성이 갑자기 높아졌다는 느낌이 든다. 이는 초기부터 ADT, ADP, ORN 등의 파일 형식과 슬롯맵, 액센트 체계 등을 명세서 형태로 표준화해 둔 때문일 것이다. 안정적으로 기반이 구축되면서 새로운 프로그램은 그 위에 모듈을 하나씩 얹듯이 빠르게 개발할 수 있게 되었다.

지금의 ADX 프로젝트는 더 이상 개별 프로그램들의 집합이 아니다. PatternLab, MIDI Inspector, ADX Player, 그리고 Web Editor는 하나의 공통된 데이터 구조와 명세를 공유하는 생태계로 성장하고 있다. 아이디어를 떠올리고 이를 실제 도구로 구현하는 시간이 계속 짧아지고 있다는 점에서, 이제야 비로소 플랫폼다운 모습을 갖추기 시작한 것 같다.

2026년 8월 3일 월요일

드럼 패턴 추상화(abstract)의 손익 계산

인터넷에서 구한 ALLSTARS.MID('The GS All-Stars, Live!')라는 파일은 1990년대 Roland가 자사의 GS 음원을 홍보하기 위해 배포했던 전설적인 번들 데모라고 한다. 물론 나는 바로 어제까지 ALLSTARS.MID라는 곡을 전혀 알지 못하였다. 웹 기반의 재생기인 Chip Player JS에서 이를 감상해 보자(GitHub). 이 애플리케이션은 고전 비디오 게임 음악 및 칩튠 포맷을 웹 브라우저에서 실시간으로 재생해 준다. ALLSTARTS.MID는 사이트 내 재생 목록에 이미 등록되어 있으며, 로컬 PC의 음악 파일을 로드하여 재생하는 것도 당연이 가능하다.

DOS 화면을 연상시키는 고풍스런 재생기 Chip Player JS. Visualizer 기능은 실로 놀랍다.

인터넷을 뒤져 보면 이렇게 특정 기기의 성능을 한껏 자랑하기 위해 만든 MIDI 파일이나 유명한 대중음악을 MIDI로 옮긴 것들이 많다. 이를 나의 ADX 플랫폼에서 분석하면 재사용 가능한 non-redundant 드럼 패턴으로 축약할 수 있을 것으로 기대하였다. MIDI 파일의 표현력은 매우 우수하지만, ADX 플랫폼에 활용하려면 목적에 맞는 정보만 남기고 나머지는 과감히 생략하는 추상화(abstraction) 과정이 필요하다.

ADX 플랫폼에서는 크게 세 가지의 추상화가 이루어진다.

  • Instrument abstraction - 수십 종의 GM 드럼 악기를 12개의 대표 슬롯으로 통합한다.
  • Temporal abstraction - 자유로운 MIDI 타이밍을 16-step, 8T(T=triplet), 16T 등의 subdivision grid로 정규화한다. 다른 추상화와는 달리 타이밍이 어긋난 노트를 그리드에 맞추기 위해 억지로 이동하지는 않는다.
  • Velocity abstraction - 1~127의 연속적인 velocity를 rest 포함 4단계 accent(6단계는 검토 중)로 변환한다.

추상화를 통해 무엇을 얻었는가? 패턴 비교가 쉬워지고, 사람이 쉽게 읽을 수 있으며, 저장 공간도 줄어들었다. 또한 검색과 분류가 쉬워졌다. 그러나 이를 통해 잃은 것도 있다. 연주의 미세한 타이밍, 세밀한 다이내믹(velocity 0~127), 악기의 개성 등이다.

MIDI 파일로부터 드럼 채널을 추출한 뒤, 패턴을 분석하여 그 결과를 제공하는 PatternLab은 하루가 다르게 발전하고 있다. 이를 이용하여 몇 가지 MIDI 파일을 분석하면서 새로운 사실을 많이 발견하였다. 다음은 ALLSTARS.MID를 PatternLab으로 분석한 보고서의 일부이다. 대부분의 note는 파란색을 띠고 있지만, 그리드에서 벗어나거나 ghost note(현재로서는 기준 velocity 이하인 것을 후보로 판정)인 경우 다른 색으로 표시하였다. 왼쪽 패턴 카드의 노랑-주황-빨강으로 표시된 tom 타격에 주목하라.

"Rushing or dragging?"

영화 <위플래시>의 테런스 플레처 교수가 다그치면서 하는 무시무시한 대사가 떠오른다. 물론 아래 이미지에 보낸 'off-grid' 노트는 의도적인 것이다. PatternLan은 이를 추상화(여기에서는 시간적 양자화)에서 어긋난 이벤트로 표시하지만, 실제로 들어보면 이러한 미세한 앞섬(rushing)과 늦춤(dragging)이 연주에 생동감과 그루브를 더해 준다.다. 

16 subdivision에 딱 맞게 tom을 치면 도저히 그 느낌이 나지 않는다.

자체 정의한 ORN 파일을 쓰면 거의 모든 예외적인 노트를 수용하여 재생하도록 만들 수 있다. 그러나 ALLSTARS.MID를 분석하면서 예외적인 상황이 너무나 많음을 확인하였다. 이 MIDI 파일은 패턴 재사용 목적이 아니라 GS 음원의 우수함과 표현력을 최대한으로 끌어내기 위해 만든 것이니 당연히 그럴 수 있다. 하지만 이를 과도하게 추상화하면 작곡가/연주가의 의도를 훼손하기 쉽다. 그렇다고 해서 MIDI 파일 수준의 세부적인 정보를 그대로 유지한다면 ADX 플랫폼의 단순함이라는 최대 장점이 사라진다.

바로 이 지점에서 추상화의 손익계산이 시작된다. ADX는 드럼 패턴의 본질을 추출하기 위해 여러 악기를 12개의 슬롯으로 통합하고, 시간을 일정한 그리드로 양자화하며, 연속적인 velocity를 몇 단계의 accent로 단순화한다. 이러한 추상화는 패턴을 비교하고 분류하기 쉽게 만들어 주지만, 그 대가로 연주자가 의도적으로 만들어 낸 미세한 타이밍과 다이내믹의 일부는 잃게 된다.

흥미로운 점은, 잃어버린 정보가 반드시 중요하지는 않다는 것이다. 오히려 대부분의 경우 추상화된 패턴만으로도 원래의 리듬적 특징은 충분히 유지된다. 반면, 이번 예제처럼 그리드에서 살짝 벗어난 몇 개의 note를 발견하면 원본 MIDI를 다시 들어 보고, 왜 연주자가 그렇게 표현했는지 살펴보게 된다. PatternLab는 단순히 양자화를 수행하는 도구가 아니라, 추상화 과정에서 무엇을 잃고 무엇을 얻는지를 눈으로 확인하게 해 주는 분석 도구인 셈이다.

많은 사람들이 추상화를 "정보 손실"이라고 생각한다. 그러나 소프트웨어 공학에서 추상화는 복잡성을 줄이는 가장 강력한 도구라고 한다. ADX 생태계는 실제 연주가 아니라 음악이라는 정보를 전달하기 위해 만든 것이다. 악보가 하나라고 해서 모든 사람이 다 같은 스타일로 연주하는 것은 아니다.

추상화를 통해 정보를 일부 잃었지만 그 대가로 패턴의 비교, 분석, 검색, 교환, 재생이라는 새로운 가능성을 얻었다. 잃은 정보 중 정말 필요한 것은 ORN이라는 sidecar 파일을 통해서 되살릴 수 있다. 

추상화는 단순화가 아니라 목적에 맞게 정보를 재구성하는 과정이다.

그리고 ALLSTARS.MID는 학습용으로는 아주 좋으나, 재사용 목적의 패턴 추출용으로는 너무 까다롭고 복잡한 드럼 연주 정보를 갖고 있다.



2026년 7월 29일 수요일

검증은 보는 것에서 시작한다—ADC PatternLab 개발

PatternLab 결과물(실제 분석 보고서: 6BLUES, 6RANDB)

Type 0 MIDI 파일(.MID) 형태의 드럼 연주 패턴 데이터를 나의 '드럼 패턴학(Drum Patternlology)' 생태계에 집어넣기에 앞서서 파일 전체를 사람의 눈으로 확인하고 싶다는 생각이 들었다. 이 욕심을 실물로 구현한 것이 바로 adc-patternlab.py이라는 파이썬 스크립트이다. 스크립트의 이름은 (Drum) Pattern Lab, 즉 드럼 연주 패턴을 분석하는 실험실이다. 이 도구를 이용하여 커맨드라인에서 분석을 실시하면 HTML 결과 파일이 만들어지는데, 이를 웹 브라우저에서 열면 MIDI 이벤트 데이터를 있는 시각화한 화면과 매트릭스 형태로 변환한 화면을 전환하며 볼 수 있다. 철저히 비침습적으로 구동되며, 원본 MIDI 파일의 2-bar 단위 분할과 ADT/ADP 전환은 다른 도구가 맡는다.

Subdivision 분석을 통해 straingt/triplet-8/triplet-16을 구별하는 알고리즘도 실 데이터로 계속 테스트를 거치면서 더욱 고도화되었다. 처음에는 노트의 시작 시간(Note On Time)만 참고하였으나, 노트의 길이(duration) 또한 꽤 좋은 힌트가 됨을 알게 되었다. 패턴을 처음 생성했던 사람이 만약 DAW에서 작업을 했다고 가정해 보자. 셋잇단음표 체계의 리듬이라면(예: 블루스 또는 셔플), 삼등분 체계의 그리드를 만든 뒤 거기에 음표를 채우지 않았겠는가. '스윙'이라는 이름의 파일 안에 각 비트마다 킥과 스네어를 한 번씩만 타격한 패턴이 있다고 가정하자. Note on time으로는 스트레이트인지 트리플렛인지 알 수가 없다. 그러나 note duration이 1/3박자라면 triplet-8임이 명백해진다. Tick으로 계산해도 되지만, duration이 한 박자의 몇 %인지를 보는 것이 더 간단하다.

메타데이터, 즉 파일 자체에 붙어 있는 장르명 힌트도 매우 강력한 근거가 된다.

다음 그림은 작년말에 어설프게 만들었던 패턴 이미지이다. 지금 생각하면 대단히 부끄러운 수준이고 오류도 많았다. 그러나 이런 어설픔이 쌓이고 쌓여서 최근 며칠 동안 급격한 발전을 이루었다. Fluid Ardule에서 드럼 패턴 재생을 해 보겠다고 옆길로 새지 않았다면, 과거의 부족함과 오류를 발견하지 못한 상태로 그냥 방치하였을 것이다.


Pattern Lab은 단순한 시각화 도구를 넘어 grace/ghost note 및 flam 후보까지 찾아낸다. 최종 결정은 사람의 몫이다. 구현이 가장 시급한 flam이 경우 별도의 sidecar file을 써서 ADP 파일의 재생 시에 원래의 연주 의도를 그대로 표현하게 만드는 초기 테스트에도 성공하였다. 한 마디를 16 또는 24 스텝으로 추상화한 나의 드럼 패턴학 생태계에서 flam의 구현은 애초에 불가능하다고 생각했었으나 전혀 그렇지 않았다. 그러나 실제로는 그렇지 않았다. ADP는 최대한 단순하게 하되, 연주에 맛깔스럽게 양념을 치는 부가 정보는 sidecar file로 보완하면 단순한 스텝 기반 패턴에서도 실제 연주에 가까운 표현이 가능했다.

이처럼 PatternLab은 단순히 MIDI 파일을 읽어 보여주는 프로그램이 아니라, 사람의 눈으로 데이터를 검증하고 알고리즘을 개선하는 실험실(Laboratory) 역할을 담당하고 있다. 결국 좋은 자동화는 충분한 관찰에서 시작된다. PatternLab 역시 "먼저 본다. 그리고 이해한다. 그 다음에 변환한다."는 원칙 위에서 조금씩 진화하고 있다.

데이터 분석을 통해 음악 장르에 따라서 널리 쓰이는 드럼/타악기 세트(12개 이내)를 다음과 같이 확정한 것도 큰 성과이다. 약간의 추상화를 거치면 GM 드럼 표준 배열에서 12개로 충분하다!

Slot map definition. 원본에 해당하는 JSON 파일은 여기에 있다.


[부록] Subdivision 판정과 confidence 계산

PatternLab은 드럼 패턴의 subdivision을 단순히 음표가 놓인 위치만으로 결정하지 않는다. 현재 구현에서는 각 후보에 대해 note-on 위상, note duration, 입력 MIDI 파일명에 포함된 힌트를 종합하여 점수를 계산한다. 비교 대상은 straight-16, triplet-8, triplet-16이다.

가장 중요한 근거는 note-on의 위상이다. 각 타격이 한 박 안에서 16분음표 격자에 가까운지, 8분 셋잇단음표 또는 16분 셋잇단음표 격자에 가까운지를 조사한다. 이 위상 분석이 전체 판단의 중심이며, 최대 약 70%의 가중치를 갖는다. 박의 시작점과 정확한 반박 위치처럼 straight와 triplet에 공통으로 나타나는 지점은 판별력이 없으므로 증거에서 제외한다. 또한 flam으로 추정된 선행 grace note도 subdivision 판정을 흐리지 않도록 분석 대상에서 제외한다.

Note duration은 보조 증거로 사용한다. 음표 길이가 16분음표, 8분음표 또는 4분음표 계열에 가까우면 straight 후보에 점수를 주고, 1/3박·2/3박 또는 1/6박 계열에 가까우면 해당 triplet 후보에 점수를 준다. MIDI 드럼 파일에서는 note duration이 연주 의도를 정확히 반영하지 않는 경우도 많으므로, 이 항목의 영향은 최대 약 22%로 제한하였다.

파일명도 제한적으로 참조한다. 예를 들어 파일명에 straight, 16th, 16beat가 있으면 straight 후보에, shuffle, swing, triplet, 8T, 16T가 있으면 해당 triplet 후보에 추가 점수를 준다. 다만 파일명은 잘못 붙을 수도 있으므로, 실제 note-on 위상보다 우선하지 않는 보조 정보로만 사용한다.

세 종류의 근거를 합산한 뒤 가장 높은 점수를 얻은 후보를 1위, 그다음 후보를 2위로 정한다. 최고 점수가 너무 낮으면 unknown, 1위와 2위의 점수 차이가 작으면 mixed로 판정한다. 명확한 승자가 있을 때 confidence는 다음과 같이 계산한다.

confidence = (1위 점수 - 2위 점수) / (1위 점수 + 2위 점수)

이 값은 단순히 1위 점수가 얼마나 큰지를 나타내는 것이 아니라, 1위가 가장 유력한 경쟁 후보를 얼마나 확실하게 앞서는가를 나타낸다. 예를 들어 1위가 0.80, 2위가 0.20이면 confidence는 0.60이다. 반면 1위가 0.80이라도 2위가 0.70이면 confidence는 약 0.067에 불과하다. 즉, 절대 점수가 높더라도 두 후보가 팽팽하면 낮은 confidence가 부여된다.

이러한 계산은 subdivision 판정을 절대적인 정답으로 선언하기 위한 것이 아니다. PatternLab의 역할은 사람이 전체 MIDI 파일을 검토하기 전에 가장 가능성 높은 격자를 제안하고, 애매한 패턴을 낮은 confidence로 표시하여 재검토가 필요한 부분을 드러내는 데 있다.