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박자 늦게 켜지는 문제

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

휴식을 위하여 디버깅은 내일 할 일로 남겨 두도록 하자. 이번이 마지막이 아닐 수도 있다.

2025년 11월 22일 토요일

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

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


위 그림은 이러한 과정에서 드럼 패턴을 시각화하기 위해 만든 이미지이다. 이미지 파일을 생성하는 데에는 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 Low / Low-Mid Tom
8 HT 43, 48, 50 Mid / High 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)



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 제어 기능을 몇 개 더 추가하는 것도 생각 중이다.


2025년 11월 17일 월요일

번뇌에 휩싸인 아두화상(Ardu和尙)

전국이 단풍으로 물들고 행락객으로 들끓던 지난 주말, 나(=아두화상, 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에게 일을 시키는 방법도 점점 발전하였다. 설계 개념이나 중간 단계의 성공한 스케치를 파일로 꼼꼼히 저장한 뒤 이를 업로드하여 맥락을 계속 잊지 말고 동일한 실수를 반복하지 않도록 만드는 것이다. 심지어 창을 두 개 열고 작업을 하기도 한다. 대화창이 너무 길어져서 새롭게 시작할 때, 맥락을 이어가기 위하여 새 창에서 무엇이라고 입력해야 되는지에 대한 노하우도 많이 늘었다. 정답은 간단하다. "새 창에 뭐라고 입력해야 해?"라고 묻는 것이다. 이를 위해서는 현재 하고 있는 일에 대한 매우 함축적이고 적절한 제목이 필요하며, 가능하다면 버전 번호도 붙여 놓는 것이 좋다. 그리고 각 버전에서는 구체적으로 무엇을 달성하였는지 문서로 저장해 두면 나중에 큰 도움이 된다.



 

2025년 11월 14일 금요일

쌀-프리 도시락 그리고 아두화상(Ardu和尙)

오전에 직원 채용을 위한 면접 자리에 갔다가 무세포(cell-free) 단백질 발현 시스템에 관한 이야기를 들었다. 대학원 시절에 토끼의 망상적혈구(reticulocyte) 추출물을 이용한 cell-free translation system으로 실험을 했던 기억이 떠올랐다.

면접을 마치고 위원들에게 점심 도시락이 제공되었다. 뚜껑을 열어 보니 밥이 보이지 않는다. 나중에 발견한 것이었지만 김밥과 유부초밥과 같은 형태로 가려져 있었기 때문에 즉시 눈에 뜨이지 않았던 것이다.

"흠, 셀-프리 이야기를 듣다 보니 쌀-프리(free) 도시락인 줄 알았어요"

탄수화물이 좋지 않다는 정보가 워낙 넘쳐나는 세상이라 쌀이나 빵과 같이 정제 탄수화물에 가까운 음식을 되도록 배제하면 좋을 것만 같다. 이런 점을 배려한 것이라 생각하고 농담을 던졌다.

...

어제 출장차 김천을 들른 김에 황악산(최고봉은 1,111m의 비로봉) 입구에 자리잡은 직지사를 방문하였다. 직지사는 아도화상(阿道和尙)이 창건하였다고 한다. '화상'은 승려에 대한 존칭의 하나라는 것을 얼마전 청주 고인쇄박물관의 해설사를 통해 알게 되었다. 

  • 선사: 선수행을 오래한 스님
  • 율사: 계율 공부와 지계에 철저한 스님
  • 강백: 교학·경전에 매진한 스님
  • 종사: 종파를 계승·발전 시킨 스님
  • 화상: 계를 내려주신 스승(스님들이 사용)
  • 대사: ‘큰스님’으로 풀어 사용 [출처 : 법보신문(https://www.beopbo.com)]

아도는 신라에 최초로 불교를 전한 사람으로 알려져 있다. 하지만 자료에 의하면 아도는 어느 한 명을 특정할 수 없는 이름이라는 견해도 있다. 직지사는 418년 아도화상에 의해 창건되었으며, 구미 도리사에 이어 신라에 세워진 두 번째 절이라고 하는데...

'아도화상'을 되뇌다가 요즘 내가 한창 몰두하고 있는 '아두이노(Arduino)'를 떠올렸다. 아도, 아두... 아두화상(Ardu和尙)! 별명으로 아주 적당한 것 같다.

아두이노 나노를 이용한 DIY에 열중인 아두화상(Ardu和尙).

그래서 Nano Ardule Drum Pattern Player는 어떻게 되어 가고 있는가?

이렇게 어려운 일이 될 것임을 미리 알았더라면 아마 시작을 하지 않았을 것이다. 클래식 아두이노 나노보다 성능이 더 좋은 아두이노 나노 에브리로 바꿈으로써 최종 목적을 향해 가까이 가고 있지만, 같은 실수를 반복하는 챗GPT를 잘 달래 가면서 더 나은 스케치(.ino)를 만드는 것이 참 어렵다. 요즘은 중간 단계 문서를 만들어 저장하고 이를 다시 업로드하면서 아주 구체적으로 추가 기능을 요구하고 있다. 다시 말해서 일종의 설계 요약문와 바로 직전 버전의 스케치를 같이 업로드한 다음 개선된 스케치를 다운로드하게 요청하는 것이다.

Nano Ardule 드럼 패턴 플레이어는 특별한 파이썬 스크립트를 써서 드럼 연주 정보가 담긴 type 0 MIDI 파일을 2-bar 단위의 패턴으로 잘라서 SD카드에 장르별로 저장한 뒤(ROCK_P01.MID, ROCK_P02.MID...) 원하는 것을 선택하여 반복 재생을 하는 것을 기본으로 하고 있다. 이외에도 비상용으로 사용하기 위하여 드럼 패턴을 그리드화하는 초소형 자료 체계(Ardule Drum Pattern, ADP)를 만들어 놓기까지 하였다. MIDI 파일을 이용할 경우에는 음악적 표현력을 최대한으로 유지할 수 있다. 그러나 두 마디가 끝난 뒤 다시 처음으로 돌아가 재생을 반복할 때, 타이밍이 잘 맞지 않아서 무척 애를 먹었다. MIDI 데이터는 근본적으로 이전 이벤트로부터 지정된 시간(이를 '델타 타임'이라고 함)이 지난 뒤 다음 이벤트를 처리하게 설계되어 있다고 한다. 따라서 마지막 노트 뒤 '쉼표'에 해당하는 것이 마디의 끝에 딱 맞게 채워지지 않은 상태로 패턴이 끝나면, 조금씩 앞으로 당겨지는 일이 발생한다. 영화 <위플래쉬>에서 프레처 교수가 마일스를 무섭게 쏘아붙이던 질문, 'Rushing or dragging?'이 생각나는 순간이다. 지금까지의 스케치는 계속 rushing이었기 때문이다.

많은 노력 끝에 델타-타임이 아니라 절대시간에 기반한 루프 재생 개념을 수립하고 스케치로 구현하게 되었다. 이를 자동 생성된 문서로 정리하였다.

Absolute-Time Loop Playback(절대시간 기반 루프 재생) <- GenoGlobe.com 위키 

그러나 나를 몇 달 동안이나 괴롭히던 여전히 '당겨짐' 현상이 없어지지 않았다. 반복 시작 지점에서 템포가 빨라진다고 아무리 텍스트 입력으로 설명해 봐도 소용이 없었다. 고민 끝에 현재 재생되는 결과물을 녹음하여 파일로 만든 후 업로드하니 훨씬 정확한 분석이 이루어졌고, 구체적인 개선 포인트가 드러나는 것 같다. 약 120~130msec 정도의 rush가 분명히 존재하였고, 빠른 점검에 의하면 기존 스케치에는 분명히 오차가 발생할 소지가 있다고 하였다.

한 박자에 해당하는 피크 사이의 간격이 유난히 좁은 곳이 있다. 두꺼운 세로선으로 해당 위치를 표시하였다. 2-bar 패턴의 재생이 끝나고 다음 회차로 넘어가는 순간이다.

모든 분석이 끝난 뒤 챗GPT도 기존 코드의 문제점을 순순히 인정하였다. 개선된 코드에서는 이러한 rush 현상이 완전히 사라졌다. 위 GenoGlobe.com 위키의 문서에 다음의 내용을 추가하였다.

3-1. 절대시간 방식에서도 “루프 길이를 정확히 정의하는 것”이 중요하다

절대시간 기반 루프 엔진은 이벤트 재생 자체에는 오차가 없다. 그러나 루프 전체 구간(loopLength)을 잘못 정의하면, 루프를 반복할 때마다 시작점이 당겨지거나 늦어지는 문제가 발생할 수 있다.

특히 MIDI 패턴에서:

마지막 노트의 절대 tick(absTicks)은 “패턴이 끝나는 지점”이 아니라 마지막 노트가 있는 지점이다. 마지막 노트 뒤에 존재하는 음악적 ‘쉼(rest)’ 구간은 absTicks에 포함되지 않음. 따라서 absTicks를 loopLength로 사용하면 실제 루프가 원래보다 짧아진다. 이 경우 반복할 때마다 루프 시작점이 일정한 양만큼 앞당겨져 rushing이 발생한다.

이를 방지하려면 루프 길이를 다음처럼 고정 그리드로 정의해야 한다:

loopLengthTicks = PPQ × beatsPerBar × numberOfBars
예: 480 × 4 × 2 = 3840 ticks

이렇게 하면 패턴의 내용과 무관하게 항상 정확히 동일한 길이의 루프가 만들어지고, 완전히 안정적인 반복이 가능해진다.

Nano Ardule을 개발하면서 정말 오랫동안 나를 괴롭혔던 문제를 해결하였다. 집에서 사용할 모니터를 새로 구입한 후 생산성이 절대적으로 높아졌음을 느낀다. 


2025년 11월 13일 목요일

자벌레를 건드리면 일어나는 일

열심히 갈 길을 가는 자벌레를 건드리면?



화를 내는 것도 아니고, 부풀어 오르는 것도 아니다. 그저 몸을 꼿꼿이 세우고 나뭇가지인 척하다가 위험이 사라졌다고 판단하면 다시 제 갈 길을 열심히 간다.


자벌레는 자나방(geometrid moths)의 애벌레이다. Geometrid moth라! 기하학을 아주 잘 이해하는 나방 종류라고 해도 과언이 아니다. 영어로는 geometer moth라고도 하는데, geometer는 바로 'r기하학자'라는 뜻이다. 자나방과에 속하는 나방은 국내에만 무려 700종 가까이 확인되었다고 한다. 자벌레를 만난 곳, 가을이 깊어가는 김천 직지사는 정말 포근하고 아름다웠다. 4:3 비율의 사진은 펜탁스 Q10으로 찍은 것이다.

챗GPT가 그린 자벌레.




사명대사(泗溟大師, 법명은 유정, 1544-1610)로 더 많이 알려진 는 직지사에서 출가하고 18세 때에 승과에 장원 급제한 뒤 30세에 직자사의 주지가 되었다. 직지사 사명각.








2025년 11월 11일 화요일

LG FHD급 모니터(27U421A)의 새벽 배송

집에서 14인치급 노트북 컴퓨터을 펼쳐놓고 고개를 수그리고 일을 하는 것이 너무나 불편하여 제대로 된 모니터를 구입하기로 하였다. 쿠팡을 적당히 뒤져서 미개봉 반품된 LG전자의 27U421A라는 2025년도 출시 제품을  모니터 받침대와 함께 주문하였더니 새벽 배송으로 덜컥 도착하였다. 출근길을 재촉하는 입장에서 새벽 배송은 편리하지만, 누군가는 잠을 설쳐 가면서 노동을 한 댓가 아닐까. 비용을 지불하였으니 마땅히 내가 누려야 할 권리라고 생각하기 이전에 감사히 여길 일이다.

출근 전 바쁜 시간에 상자를 풀고 설치한 뒤 화면까지 나오는 것을 확인하였다.

상자를 뜯는 행위, 즉 언박싱(unboxing)은 언제나 가슴을 설레게 한다.


해상도는 FHD라서 노트북 컴퓨터(ThinkPad E14 G3)의 그것과 완전히 똑같다.


내 기억에 의하면 신품 모니터를 구입한 일은 거의 없다. 늘 주변에서 굴러다니던 것을 얻어서 쓰고는 했기 때문이다. 2024년 8월에 작성한 '집에서 일하기 위한 컴퓨터 활용 환경 정비하기'라는 글에 비교적 최근까지 사용하던 2007년 제조 LG Flatron L226WTP-PF에 대한 내용이 있다.

이 모니터의 해상도는 1920 x 1080(FHD), 최대 주사율은 100Hz, 픽셀피치 0.3114mm이다. 일반적인 사무용 모니터로 적당한 극히 평범한 사양을 갖추었다. 비슷한 가격대에서는 평면 혹은 곡면의 차이가 있는 것 같고, 20만원대 후반으로 가면 해상도가 2560 x 1440(QHD)으로 높아진다. 사무실에서 쓰는 삼성 모니터는 더욱 길쭉한 모양인데(아마도 울트라와이드?), 해상도는 3840 x 1200이다. 이번에 새로 구입한 모니터의 글씨가 좀 커 보인다 했더니 아마도 수직 해상도가 1080이라서 더 크게 느껴지는 것 같다. 사무실 모니터 중 우분투 데스크톱에 물린 것은 LG전자 32UN500인데, 이것은 3840 x 2160(4K/UHD)에 해당한다. 나열한 모니터 중 생각해 보니 '더 작은 글씨, 더 많은 정보'를 보여주었던 가장 마지막 것은 32인치 제품 아니었던가. 

구글 검색의 AI 개요('모니터 해상도 일람표').


[LG전자] 나에게 딱 맞는 모니터 구매 가이드 

10만원쯤 더 주고 27인치 모니터에서 얻을 수 있는 최대 해상도인 QHD급 모니터를 고를 것을 그랬나? 하지만 고해상도 영상 작업을 하는 것도 아니고, 현재 내가 갖고 있는 노트북에서 출력을 제대로 지원할지 알 수가 없다. 찾아보니 HDMI 출력에서 최대 4K를 지원하지만 주사율인 30Hz에 그친다. 주사율 60Hz가 되려면 USB-C 포트로 연결해야 된다고 한다. 주사율 문제는 차치하고서라도 작업을 위해서 단지 화면에 더 많은 창을 띄위기 위함이라면 고해상도일수록 좋은 선택일지 모르겠으나, 글씨가 작아지니 이를 가까이 보기 위해 고개를 더 수그리게 될지도 모른다. 

QHD 모니터의 주요 단점은 작은 아이콘과 글씨로 인한 불편함, 고화질 영상 시청 시 화질 열화 현상, 그리고 게임 시 더 높은 그래픽 성능 요구입니다. 27인치 모니터의 경우 QHD 해상도를 기본 설정으로 사용하면 아이콘과 글자가 작게 보여 불편할 수 있으며, FHD 이하의 영상을 QHD 모니터에서 보면 화질 열화가 발생할 수 있습니다. 또한, QHD는 FHD보다 더 많은 픽셀을 처리해야 하므로 게임에서 더 높은 성능의 그래픽카드가 요구됩니다. (구글 검색의 AI 개요 'QHD 모니터 단점')

신속한 결정, 빠른 배송, 그리고 출근 전 '후다닥' 설치 후 테스트! 이것으로 만족한다.