2025년 12월 2일 화요일

도스 시절의 향수를 느끼게 하는 드럼 패턴 재생기 Ardule Pattern Studio(aps.py)

Nano Ardule Drum Pattern Player에서 사용할 드럼 패턴 자료 파일(ADP/ADT)을 PC에서 미리 확인하기 위한 프로그램을 만들어 보았다. 이름은 Ardule Pattern Studio(APS). 예전 DOS 시절의 향수를 불러 일으키는 텍스트 기반의 도구이다. 아마 80년대 Norton Commander의 느낌이 날 것이다. 바탕을 파랑색으로 바꾸면 더 비슷해 보이지 않을까? 이미 만들어 둔 adt2adp.py를 재사용하는 조건으로 이 파이썬 스크립트를 만들고 테스트하는 데에는 두 시간 정도 밖에 걸리지 않았다. 놀라운 챗GPT의 힘이여! 핵심 기능을 먼저 구현한 뒤 추가적인 기능을 덧붙여 나가는 과정을 택했기에 오류도 거의 발생하지 않았다.

파이썬으로 짜여진 APS v0.7은 주석을 포함하여 약 1100줄 정도. 눈으로 보고, 소리를 귀로 듣는다! 

드럼 패턴을 화면에 보여주고, MIDI 기능을 이용하여 재생도 할 수 있다. 추가할 기능도 몇 가지 생각해 두었다. 패턴을 조합하여 전체 곡에 해당하는 자료를 만드는 체인 에디터 기능이 다음 목표이다. 체인 에디터란, 이미 준비된 패턴을 조합하여 한 곡 전체에 해당하는 데이터를 만드는 것이다. 저장 방식은 전용 문법을 사용한 텍스트 파일 형태(.ARR), 또는 이를 바이너리로 전환한 것 모두를 고려하고 있다. 다음은 어제 촬영한 v0.7의 작동 영상이다.


아두이노 나노 에브리에서 체인 에디팅을 하는 것도 가능할 것이다. 그러나 몇 개 되지 않는 버튼과 인코더 하나, 그리고 1602 LCD라는 열악한 환경에서 이를 힘겹게 구현하는 것은 쉽지 않을 것이다. 

APS는 PC에서 ADP/ADT를 관리하고 ARR 관련 작업을 하는 도구로서 매우 유용하게 쓰일 것이다. 하나의 목적을 위해 관리하는 프로그램과 문서가 점점 많아지고 있기 때문에 처음에는 전혀 생각하지 않았던 GitHub를 활용하는 것을 심각하게 고려하게 되었다. 나도 일이 이렇게까지 전개될 줄은 몰랐다.

여담이지만 ADP는 원래 Microsoft Access Project 파일의 확장자라고 한다. 그래서 Gmail이나 네이버 메일에서 이를 첨부하는 것을 금지하고 있으며, 심지어 zip 파일의 내부까지도 검사를 하여 차단한다. 이러한 사실을 미리 알았다면 나의 드럼 패턴 정보 파일에 ADP(Ardule Drum Pattern)라는 확장자를 붙이지는 않았을 것이다. 그러나 동일한 정보를 수록한 텍스트 파일(ADT)를 별도로 갖고 있었기 때문에 메일에 첨부할 수 있었다. ADT를 유지하는 것이 과연 필요한지 고민을 하고 있었는데 아직 쓸모는 남아 있는 것 같다.


PC 쪽에서 해야 할 일

인터넷을 뒤져서 드럼 패턴이 수록된 MIDI 파일을 구하는 것으로부터 시작한다. 드럼 패턴 들어있는 파일도 있고, 유명한 8-90년대 팝송을 MIDI 파일로 만들어 놓은 것도 있다. 두번째의 경우라면 드럼 채널에 해당하는 것을 뽑아내는 유틸리티를 파이썬으로 만들 수 있다.

만약 MIDI 파일이 type 1이라면 type 0으로 전환한다. 그 다음, 이를 2-bar 단위로 분할하여 작은 MIDI 파일을 만든다. 이것으로부터 ADT를 먼저 만들고, adt2adp.py를 이용하여 바이너리 형태의 파일인 ADP를 만들게 된다. ADP는 마이크로SD카드에 저장하여 Nano Ardule에 연결한다. 물론 ADP 파일과 더불어 별도의 인덱스 파일을 만들어서 같이 저장해야 한다.

오늘 소개한 aps.py는 ADT 또는 ADP 파일을 PC쪽에서 간편하게 확인하기 위하여 하룻저녁에 뚝딱 개발한 것이다. 일반적인 패턴과 '브레이크' 패턴을 구분하여 패턴 파일명을 변경하기 위한 것이 근본적인 개발 목표였다. 인공지능으로 하여금 자동으로 브레이크를 구별하게 만든다면? 불가능한 일은 아니지만, 처리할 패턴이 수만 개 정도 된다면 모를까, 차라리 눈과 귀에 의존하는 것이 더욱 정확할 것이다.

aps.py의 다음 단계 개발 목표는 ADT/ADP 파일을 엮는 체인 에디팅 기능을 구현하는 것이다. 이 단계에 이르면 Ardule Pattern Studio라는 이름이 비로소 의미를 갖게 될 것이다. 그리드 형태의 패턴 자체를 편집하는 기능까지... 글쎄, 욕심이 과하다. DIY로 드럼 패턴 자체의 에디팅을 하는 도구를 만드느니 차라리 라즈베리 파이에서 Hydrogen을 쓰는 것이 더 낫겠다.

배움의 목적이라는 GitHub 생태계에 들어가는 것이 더 중요하고도 시급하다. 그 다음에는 패턴을 이어서 곡 단위의 파일을 만들도록('체인 에디팅') aps.py를 매만지는 것이고, 패턴 에디팅은 그 다음에 생각하도록 하자.


쿠팡 정보유출 사건과 관련한 집단 손해배상 소송에 참여하다

쿠팡의 정보유출 사태 관련 뉴스가 연일 언론을 가득 채우고 있다. 편리함 이면에는 배송 노동자의 과로사가 있고, 욕망의 껍질(즉 포장재)은 산더미를 이룬다. 나 역시 쿠팡을 편리하게 이용해 온 사람이다. 잠자리에 들기 전, 휴대폰을 꺼내 만지작거리기만 하면 다음날 아침거리가 도착하기 때문이다. 그러나 고객의 이러한 쇼핑 방식 전환에 따라서 정작 지역 시장에서는 좋은 식재료를 찾기가 어렵게 되었다. 이미 조리가 다 되어 있거나 간편하게 먹을 수 있는 밀키트가 진열대를 차지하고 있으니 말이다. 가장 최근의 놀라운 경험은 코트를 수선하기 위한 단추조차 소량으로 쿠팡에서 살 수 있었다는 것. 실정이 이러하니 지역 백화점이나 대형 마트 및 수퍼마켓과 문구점 등을 비롯한 오프라인 시장은 편의점과 다이소만 남긴채 붕괴하고 있다.

편리함이 세상을 너무 이상한 방식으로 변하게 만든다는 우려 때문에 '쿠팡 없이 살아볼까?'라는 생각을 가끔 하고 있었다. 그러던 중, 쿠팡 탈퇴라는 결심을 하게 만든 사건이 발생했으니 바로 최근의 정보유출 사건이다. 생각보다 매우 심각한 사건인데, 당사자인 쿠팡은 너무나 태연하고 미온적인 태도를 보였다. 이번 사태는 김범석 전 의장의 과거 언행을 다시 찾아보게 만들었다. 

2019년 12월 쿠팡 고위관계자의 발언을 보도한 뉴스에 따르면 김범석 전 의장은 "한국인은 큰 물에서 놀지 못해 시야가 좁고, 스마트하지 못하며 정직하지 않은 민족"이라고 말했다는 것입니다. 관련 보도 기사는 모두 삭제돼 버렸습니다. (뉴스웰 링크)

물류센터 화재나 노동자 과로사 문제 등이 불거질 때, 책임을 지려 한다기보다 국내의 법적 책임을 회피하려는 듯한 모습을 보여 왔기 때문이다. 그래서 나는 쿠팡 회원 탈퇴는 물론, 김경호 변호사를 통한 단체소송에도 참가하였다.

쿠팡 정보유출에 시민들 “소송 참여합니다”···수천명 ‘본격 소송전’ 나서 (경향신문 링크)

이번 사태에 대한 별도의 자동생성 글을 위키 사이트에 등록하였다.

쿠팡 고객정보 유출 사태는 선택적, 한시적 분노로 끝날 것인가

이번 사태가 일시적인 분노로 끝날 것이 아니라 세상을 더욱 안전하고 편리하게 바꾸는 데 기여하기를 바랄 뿐이다.

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 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 모니터 단점')

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