오전에 직원 채용을 위한 면접 자리에 갔다가 무세포(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을 개발하면서 정말 오랫동안 나를 괴롭혔던 문제를 해결하였다. 집에서 사용할 모니터를 새로 구입한 후 생산성이 절대적으로 높아졌음을 느낀다.











