인공지능의 도움으로 Nano Ardule MIDI Controller를 구동할 코드를 작성하면서 오늘 쓴 글의 제목과 같은 교훈을 뼈저리게 느끼고 있다. ChatGPT에게 요구사항을 하나씩 제시하여 C++ 코드를 얻어내고, 이를 컴파일하여 아두이노 나노에 업로드한 뒤 오류를 수정하고 새로운 기능을 추가하는 방식으로 내 나름대로는 개발 목표에 빠르고 능률적으로 근접하고 있다고 착각을 하였었다. 코드가 어떻게 돌아가는지 근본 원리를 배우려는 생각은 별로 없이, 그저 기기를 돌아가게만 하면 된다는 생각으로.
왜 착각인가? Sound Module을 제어하는 기능 목표치의 60% 정도를 달성해 놓은 뒤 이어서 마이크로SD카드에 수록된 MIDI 파일을 재생하는 기능을 추가하려는 단계에서 한계에 도달하였다. 바로 메모리가 부족하게 된 것이다. 여기까지를 제1기 개발이라고 부르겠다.
메모리 한계에 부딪친 Nano Ardule 컨트롤러 (2025년 9월 9일 작성)
ChatGPT가 제시하는 최적화 방안을 적용하기 이전에, 악기의 목록 정의를 재정비하기로 하였다. SAM9703 + GSM963200-B(CleanWave32) synthesizer ROM 보드의 sound variation은 GS의 그것과 완벽하게 같지는 않기 때문이다. GSM963200-B와 같은 CleanWave32 계열의 ROM인 GMS973201B의 데이터시트를 입수하여 악기 목록을 다시 만들었다. 엑셀 파일로 악기 배치를 정리한 다음 ChatGPT에 업로드한 뒤 헤더 파일을 제대로 만들게 하였다. 그런데 표준이라고 알려진 Roland의 GS와 확장 사운드의 맵이 너무나 다름을 알게 되었다. Roland SoundCanvas SC-D70 매뉴얼의 34쪽 Playing the Internal Sound Generator를 살펴보자.
■ Using MIDI message to switch sounds from another device or sequencer software
By sending MIDI messages from sequencer software that is running on your computer, you can specify the sound (instrument) for each of the SC-D70’s parts.
Sounds are specified by variation number and instrument number (p. 33). However, you should be aware that the way in which numbers are displayed may differ depending on your software. On the SC-D70, variation numbers begin from 0, and instrument numbers begin from 1.
The variation number corresponds to the MIDI bank number, and the instrument number corresponds to the MIDI program number.
(Note) The MIDI bank number consists of a “Most Significant Byte” (MSB) and a “Least Significant Byte” (LSB). Since each can have a value of 0–127, a total of 128 x 128 = 16384 banks can be specified. The most significant byte of the bank number corresponds to the variation number of the SC-D70. The least significant byte of the bank number is used to switch between the SC-55 map/SC-88 map/SC-88Pro/SC8820 map.
예를 들어 SC-D70의 파트 1(1번 채널)을 SC-8820 map의 005 Dist. E.Piano(variation 17)로 바꾸고 싶다면 다음의 순서로 명령을 전송하면 된다.
- MIDI CH = 01
- CC#00 017 ...select variation number 017
- CC#32 004 ...select the SC-8820 map
- PC# 004 ...select instrument number 005
반면 Dream의 사운드 체계에서는 CC#32를 쓰지 않으며, 대부분의 variation sound는 CC#00=127에 몰려있다. 더군다나 variation sound와 주 악기 소리가 서로 연관성이 없는 것이 많다. 예를 들어 PC = 12(Vibraphone)의 variation sound는 Elec Organ이다. 이런 상황에서는 유사한 악기를 패밀리로 묶기도 곤란하다. 1기 개발은 이 데이터시트를 접하기 전이라서 패밀리 개념으로 악기를 묶어서 선택하는 계층형 사운드 브라우저를 만들고 있었다.
Ardule Controller 하나를 이용하여 내가 보유한 두 개의 사운드 모듈(Roland SoundCanvas SC-D70과 SAM9703 기반 제품)을 같이 제어하려던 당초의 목표는 빗나가고 말았다. 더 큰 문제는 Dream 제품 체계에 맞게 악기 목록을 재정의한 헤더 파일을 쓸 수 있도록 기존의 코드를 수정해 달라고 하였더니 꼬인 구조가 많아서 거의 처음부터 다시 만들어내는 것이 아닌가. 그것도 단계별로... 예를 들어 아두이노 나노의 A6 핀은 아날로그 전용이라서 이를 버튼 스위치에 연결하여 쓰려면 풀업저항이 필요하다. 이미 지난번 개발 단계에서 이를 감안하여 하드웨어적으로 수정을 다 해 놓았는데, ChatGPT는 원론적인 접근부터 다시 시작하고 있었다. 풀업저항을 연결하지 않은 상태라고 가정하고!
수 주에 걸쳐 나눈 대화의 맥락을 전부 기억하는 것이 아닌데다가, 결론적으로는 어차피 대수술이 필요한 상태였던 것이다. 모든 기능을 1500라인이 넘는 하나의 .ino 파일에 쑤셔넣은 1기의 코드를 분리하여 모듈화하는 것까지 포함하여 상당히 방대한 개조를 해야 한다. 이러한 대수술이 한 단계로 이루어지는 것은 불가능하다. 파트 선택 기능부터 하나씩 추가하여 성공하면 다음 단계의 것을 넣는 방법이 유일하다. 다음은 왜 이렇게 해야만 하는지에 대한 ChatGPT의 대답.
그렇다. 1기 개발에서는 '지름길'로 가고 있다고 착각을 했던 것이다. 어쩌겠는가. 다소 시간이 걸리더라도 처음부터 다시 시작한다고 생각하자.
2025년 가을에 20여년 전 제조된 Legacy MIDI 장비를 (재)활용하기 위한 이런 노력을 들이는 것이 과연 가치가 있는 일인지는 잘 모르겠다. 하지만 그 과정에서 최신의 기술(인공지능)을 충분히 활용하고 있으며 취미 생활의 지평을 넓혀 가고 있으니 아주 무의미한 일은 아닐 것이다. 원래 본업이 아니라 취미에 빠져드는 일이 더 자연스럽고 또 즐겁기까지 하다. 다만 퇴근 후 개발에 몰두하느라 과로를 하지 않도록 주의해야 할 것이다.
댓글 없음:
댓글 쓰기