2026년 7월 28일 화요일

드럼 패턴 데이터의 추상화와 정규화


드럼 연주 기능을 고리로 하여 과거(Nano Ardule, 과거라고 해 봐야 너무나 가까운 반년 전이지만)와 현재(Fluid Ardule)의 통섭이 일어나고 있다고 아주 좋아하고 있었다. 그 즐거움은 며칠 가지 않았다. 과거의 작업 결과물이 완벽하지 않았음을 깨닫는 계기가 되고 말았으니까. 고쳐야 할 곳이 꽤 많아져서 약간은 망연자실한 상태이다.

Nano Ardule 개발 시절에 내가 확립해 둔 드럼 패턴 체계는 오직 4박자를 위한 것이었다. 4박자만큼은 아니더라도 널리 쓰이는 3박자(예: 왈츠), 그리고 5박자나 7박자 같은 비정형 박자를 다루려면 드럼 패턴 체계 자체를 근본적으로 뜯어고쳐야 한다고 생각하고 있었다. 그런데 막상 Fluid Ardule에 드럼 재생 기능을 넣으면서 살펴보니 과거에 만든 체계가 꽤 견고하고 합리적이라서 3박자나 비정형 박자를 처리하는데 별다른 문제가 없었다. 

게다가 더욱 까다롭게 생각했던 flam 처리도 sidecar 파일 방식으로 어렵지 않게 구현할 수 있었다. 이러한 결과에 만족하면서 flam이 포함된 왈츠 패턴 하나를 재생하고 있는데 tom 소리가 빠져 있는 것이 아닌가? 분명히 이미지로 만든 패턴 정보에는 low 계열의 tom을 3박째에서 2회(8분음표) 두드리고 있는데 처리가 끝난 ADT/ADP에서는 소리가 들리지 않는다.

원본 MIDI 파일에는 분명히 노트가 남아 있었다. 원인을 찾아 보았다. Tom 계열의 노트를 처리하면서 누락이 된 것이었다! 현재 사용하는 12개 slot 정보는 다음과 같다.

SLOT0=KK@36,KICK
SLOT1=SN@38,SNARE
SLOT2=CH@42,HH_CL
SLOT3=OH@46,HH_OP
SLOT4=LT@45,TOM_L
SLOT5=MT@47,TOM_M
SLOT6=HT@50,TOM_H
SLOT7=RD@51,RIDE
SLOT8=CR@49,CRASH
SLOT9=RM@37,RIM
SLOT10=CL@39,CLAP
SLOT11=PH@44,HH_PED

Tom은 High-Middle-Low로 그럴싸하게 배열해 놓았지만, 노트 번호를 미련하게 할당한 것이다. 원본 MIDI 파일에서는 노트 번호 43번으로 low tom(실은 high floor tom)이라고 기록되어 있었는데, 내가 쓰는 슬롯 정보에서는 이 번호가 슬그머니 사라진 것이었다. 

Rack tom의 가장 낮은 것이라 해도 floor tom의 high보다는 높은 소리를 내는데, 타악기 명의 앞부분만 보고서 애초에 tom 할당 체계를 잘못 잡은 것이다. Nano Ardule 개발 당시에 만든 스크립트(adc-mid2report.py)를 고쳐서 모든 노트에 대한 분석을 해 보라고 하였다. 이 분석 작업에는 35개의 MIDI 드럼 패턴 파일이 투입되었다.

> python .\260728a_adc-mid2report.py ..\patterns\original-midi-files\
============================================================
Directory: ..\patterns\original-midi-files
MIDI files found: 35   processed: 35   errors: 0
============================================================

Note-On Frequencies (all channels, no grouping):
  total note_on events: 13625
  ch  note  count
  10    36      3244
  10    37       294
  10    38      3009
  10    39        84
  10    42      4160
  10    43       504
  10    44       408
  10    47       652
  10    50       266
  10    51       756
  10    56       248

GM Drum Note Frequencies (channel 10, no grouping):
  note  GM instrument                 count     percent
    36  Bass Drum 1                       3244    23.809%
    37  Side Stick                         294     2.158%
    38  Acoustic Snare                    3009    22.084%
    39  Hand Clap                           84     0.617%
    42  Closed Hi-Hat                     4160    30.532%
    43  High Floor Tom                     504     3.699%
    44  Pedal Hi-Hat                       408     2.994%
    47  Low-Mid Tom                        652     4.785%
    50  High Tom                           266     1.952%
    51  Ride Cymbal 1                      756     5.549%
    56  Cowbell                            248     1.820%
  total: 13625

실제 데이터에서는 43(High Floor Tom)-47(Low-Mid Tom)-50(High Tom)을 tom 계열의 노트로 사용하고 있다. 그런데 내가 만든 slot 체계에서는 45(Low Tom)-47-50이었다. 널리 쓰이는 43번이 아예 사라지도록 잘못 설계한 것이다. 근거가 되었던 계산적 드럼 패턴학('computational drum patternology' - 아마도 내가 처음 쓰기 시작한 말)에서 잘못된 분석을 하는 바람에 tom의 대표음을 엉뚱하게 배치하는 결과를 초래하였다. 추상화(abstraction)정규화(normalization)를 제대로 하지 않는 값을 치르고 있는 셈이다.

올바른 계산적 드럼 패턴학을 위해서는 추상화를 통해 실제 악기의 사용 현황을 조사해야 한다. 그 다음에는 성격이 비슷한 악기를 그룹화한 다음, 정규화를 통해서 각 그룹에 대해 가장 대표성이 높은 악기를 대표 노트로 선택한다. 그런데 오늘의 분석 작업에서는 총 11개의 노트가 쓰였다. 즉, 12개라는 slot 제한을 초과하지 않았다. 따라서 악기를 그룹으로 묶거나 대표 노트를 고를 일도 없었던 것이다. 

물론 앞으로 더 많은 데이터를 분석해 봐야 하겠지만, 오늘의 작업만으로도 실제 데이터가 어떤 경향이 있는지를 충분히 파악할 수 있었다.

과거의 잘못을 들추어냄에 따라서 해야 할 일도 많아졌다. Nano Ardule의 온갖 유틸리티 스크립트를 고쳐야 하고, ADT 안에 하드코딩되어 있던 슬롯 정보도 바꾸어야 하며, 패턴 이미지 파일도 개정하여  GitHub에 올려야 한다. 하지만 오늘이라도 알게 된 것이 어디인가? 

음악과 관련한 취미 코딩을 하면서 추상화와 정규화를 실천하게 된 것을 다행으로 여겨야 하겠다. 음악, 납땜, 코딩, 데이터 분석... 겉으로 보기에 별로 관계가 없어 보이는 일들이 한데 어우려져서 뭔가 산출물을 만들어 내고 이와 더불어 조금씩 나아지고 있는 듯하다.

댓글 없음: