2026년 7월 4일 토요일

아르페지오의 속도를 조절하려 했는데, 범인은 에코였다

새벽 네 시에 일어나 앉아서 맛없는 음료를 벌컥벌컥 마신다. 몇 시간 뒤에 있을 대장 내시경 검사를 위해 장을 깨끗이 비우기 위함이다. 어젯밤 7시에 먹었던 1차 복용제는 그런대로 먹을 만했는데, 새벽 네 시에 먹어야 하는 2차 복용제는 정말 고역이다. 잠을 깬 김에 어제 퇴근후 벌어졌던 Fluid Ardule 운영 스크립트 개발기를 쓴다. 어차피 속이 그득하고, 잠시 뒤면 또 화장실을 들락거려야 하니 다시 잠자리에 들기는 틀렸다.

Fluid Ardule에서 요즘 흥미를 느끼는 것은 Yoshimi의 아르페지오 계열 음색(preset)이다. 자주 쓰다 보니 한 가지 아쉬움이 생겼다. 현재는 고정된 속도로만 일정 패턴의 note가 발생한다. 실제 곡의 템포에 따라 아르페지오 속도를 바꾸고 싶었다. Yomishi의 프리셋을 전환할 때 발생하는 잡음을 없애는 것이 가장 최근의 도전 과제였었다. 하나를 해결하면, 그 다음 문제에 몰두하게 된다.

아르페지오를 로드한 뒤 건반 하나를 누르면 음이 일정한 패턴으로 반복된다. 음색을 고르는 것만으로도 꽤 그럴듯한 연주가 된다. 그런데 연주 중에 조금 빠르게, 혹은 조금 느리게 바꾸고 싶다는 생각이 드는 것은 당연하다. Fluid Ardule에는 로터리 인코더가 있다. 이것을 돌려 아르페지오의 속도를 조절하면 좋겠다.

말은 간단하다. 문제는 Yoshimi에서 무엇을 건드려야 하는가였다. 당연히 BPM이라고 생각했다. 

AI(ChatGPT)에게 물었다. Yoshimi에는 명령행 인터페이스가 있으니 실행 중인 프로그램에 명령을 보내어 BPM을 바꿀 수 있지 않겠느냐고. 처음에는 AI도 그렇게 생각했다.

나는 Yoshimi 매뉴얼을 AI에게 주었다. AI는 매뉴얼을 읽고 다음과 같은 명령을 찾아냈다.

BPM <n>    default BPM if none from MIDI

좋다. 답을 찾은 것 같았다.

라즈베리 파이에서 Yoshimi를 인터랙티브 모드로 실행했다.

yoshimi -i

아르페지오 프리셋을 불러왔다.

load instrument /home/pi/sf2/yoshimi_links/Arpeggios__0001-Arpeggio1.xiz

그리고 BPM을 바꾸었다.

set bpm 60
set bpm 180

60과 180이면 세 배 차이다. 건반을 눌러 보았다.

똑같다.

나는 말했다.

이상한데요? bpm 바꾸어도 아르페지에이터 속도는 그대로예요.

AI는 매뉴얼을 다시 뒤졌다. 이번에는 LFO 항목에서 BPM 동기화 기능을 찾아냈다.

Bpm <s>    sync frequency to MIDI clock

아마 LFO가 BPM에 동기화되지 않은 상태라서 global BPM을 바꾸어도 소용이 없는 것 같다는 설명이었다. 그럴듯했다.

문제는 Yoshimi의 CLI가 생각보다 만만하지 않았다는 것이다.

set part 1

여기까지는 좋았다.

add

라고 입력했더니,

add what?

이라고 했다. set add라고 해야 했다. LFO로 들어가려고 lfo라고 입력했더니 또 알아듣지 못했다. set lfo라고 해야 했다.

Frequency context에도 들어갔다.

set frequency

마침내 원하는 장소에 도착했다.

@ p1+, A+, LFO freq+

여기에서,

set bpm on

을 실행했다. 다음과 같이 표시된다. 드디어 정확한 명령어 입력 방법을 알아낸 것이다.

Part 1 Kit 1 AddSynth Freq LFO BPM - on

이번에는 정말 되는 줄 알았다. BPM을 바꾸고 건반을 눌렀다.

똑같다. Rate도 바꾸어 보았다. 그러나 달라지는 것이 없었다.

AI는 또 다른 가능성을 제시했다. ADDsynth의 Voice Delay가 반복을 만드는 것이 아닐까? Voice 1과 Voice 2로 들어갔다. Delay라는 명령도 발견했다. 값을 바꾸었다. 나는 건반을 눌렀다.

전혀 안됩니다.

이날 오전 AI와 나의 대화에서 가장 많이 등장한 문장은 아마 이것이었을 것이다.

안 바뀝니다.

AI는 가설을 제시했다. 나는 라즈베리 파이에 명령을 입력했다. 건반을 눌렀다.

안 달라져요.

다시 가설. 다시 명령. 다시 건반.

빠르기와는 무관합니다!

이쯤 되자 매뉴얼에 나오는 일반적인 기능 설명만으로는 답을 찾기 어려워졌다. 나는 이미 분석을 위해 Yoshimi의 아르페지오 프리셋 파일을 AI에게 올려 둔 상태였다. 그래서 말했다.

아까 업로드했으니 다시 살펴봐요.

이번에는 매뉴얼이 아니라 실제 프리셋 파일 자체를 분석하기 시작했다. 대상은 이것이었다.

Arpeggios__0001-Arpeggio1.xiz

이름은 Arpeggio1이다. 나는 당연히 이 파일 어딘가에 아르페지에이터의 속도를 결정하는 파라미터가 있을 것이라고 생각했다. BPM, LFO, Rate, Clock 같은 것 말이다.

그런데 프리셋의 구조를 따라가던 AI가 다른 것을 지목했다.

Part 1. Effect 2. Echo.

에코?

나는 아르페지오의 속도를 바꾸고 싶은데 갑자기 에코라니. 솔직히 처음에는 이것도 별로 믿음이 가지 않았다. 테스트하는 내내 이미 여러 번 틀렸기 때문이다.

그래도 실험은 간단하다. Yoshimi CLI에서 Part 1로 들어갔다.

/
set part 1

Effect 2를 Echo context로 열었다.

set effect 2 echo

프롬프트가 바뀌었다.

@ p1+ eff 2 ECho-3?

Echo의 파라미터 중에는 Delay가 있었다. 값을 바꾸었다. 건반을 눌렀다.

와, 드디어 연주가 달라졌다.

BPM을 바꾸고, LFO를 뒤지고, Voice Delay를 건드려도 꿈쩍하지 않던 반복 속도가 Echo Delay 값을 바꾸자 확연히 달라졌다.

우리가 찾던 아르페지오의 속도는 에코가 만들고 있었다.

물론 엄밀히 말하면 "아르페지에이터가 에코였다"는 표현은 정확하지 않을 것이다. 그러나 적어도 내가 사용하던 Yoshimi의 Arpeggio1 프리셋에서 귀에 들리는 반복 패턴의 속도를 실질적으로 좌우하는 파라미터는 Part 1 Effect 2의 Echo Delay였다.

이제 원인을 찾았다. 다음 문제는 Fluid Ardule의 화면에 무엇을 표시할 것인가였다.

Echo Delay 42

이렇게 표시할 수는 없다. 연주하는 사람이 알고 싶은 것은 Yoshimi 내부의 이펙트 파라미터 값이 아니다. 대략 얼마나 빠르게 반복되는가이다.

처음에는 BPM과 비슷한 숫자를 만들어 Echo Delay에 대응시키는 간단한 식을 만들었다.

echo_delay = round(6000 / raw_speed)

그리고 작은 Python 테스트 프로그램(test_yoshimi_arp_speed_calibrated.py, GitHub에 공개)을 만들었다. 숫자를 넣고 건반을 연주했다. 메트로놈과 비교하여 실제로 어느 정도의 BPM처럼 들리는지 측정했다.

처음 측정값은 조금 들쭉날쭉했다. 그래서 다시 측정했다.

60  → 52
75  → 66
100 → 83
120 → 100
140 → 126
160 → 133
180 → 140
200 → 162
220 → 181
240 → 200

정밀한 계측 장비를 쓴 것은 아니다. 내 귀와 메트로놈이다. 그래도 관계는 꽤 일정했다.

AI에게 계산을 시켰다. 단순 선형 회귀 결과는 다음과 같았다.

apparent_bpm ≈ 0.797 × raw_speed + 5.13

그러면 역으로 원하는 체감 속도에서 내부 값을 계산할 수 있다.

raw_speed ≈ (display_bpm - 5.13) / 0.797

그리고 이것을 다시 Echo Delay 값으로 변환한다.

echo_delay = round(6000 / raw_speed)

첫 번째 테스트 프로그램은 측정을 위한 것이었다. 측정이 끝난 뒤 AI에게 그 결과를 주고 프로그램을 한 번 고쳤다. 보정된 테스트 프로그램으로 다시 확인했다. 괜찮았다.

그제야 Fluid Ardule 본 프로그램에 넣었다.

이 기능의 이름을 BPM이라고 하지는 않았다. 진짜 BPM이 아니기 때문이다. MIDI clock과 동기화된 값도 아니다. 특정 Yoshimi 프리셋의 반복 속도를 귀로 측정하고 경험식으로 보정한 값이다.

그래서 이름은,

Arpeggio Speed.

인코더를 돌리면 1씩 변한다. 연주 중에도 바로 속도가 달라진다. 화면 오른쪽에는 작은 글씨로 이렇게 표시했다.

Rotate Encoder to adjust

기능 하나를 추가하는 데 오전 한나절이 걸렸다.

처음에는 내가 매뉴얼을 AI에게 주었다. AI가 매뉴얼을 분석하여 BPM을 찾았다. 틀렸다. 다시 매뉴얼에서 LFO BPM sync를 찾았다. 틀렸다. Voice Delay를 의심했다. 또 틀렸다.

결국 내가 이미 올려 둔 실제 프리셋 파일을 AI가 분석했다. 그 안에서 Echo를 찾아냈다. 나는 라즈베리 파이에서 CLI 명령을 하나씩 입력하고 건반을 눌러 검증했다. 마지막에는 테스트 프로그램을 만들고, 메트로놈으로 직접 속도를 재고, 측정값을 AI에게 주어 회귀식을 만들었다. 이를 바탕으로 Fluid Ardule 운영 스크립트를 최종적으로 수정하였다. 상세한 기술적인 내용은 GitHub에 Controlling the Apparent Arpeggio Speed of Yoshimi Presets라는 제목으로 따로 정리하였다.

요즘 AI와 하는 개발은 대략 이런 식이다.

실은 이 글도 첫 단락을 제외하면 AI가 써 준 것을 거의 그대로 옮긴 것이다. Fluid Ardule 운영 스크립트 개발을 위해 ChatGPT와 작업한 대화창은 나의 시행착오를 전부 기억하고 있기 때문에, 블로그 작성용 초안을 달라고 명령만 하면 이렇게 뚝딱 만들어 낸다. 처음에는 이런 방식으로 글을 쓰는 것에 대하여 상당한 거부감을 느꼈었는데, 나 역시 편리함과 효율 앞에서는 최신 기술과 적당히 타협하지 않을 수가 없다.