POOOLING FOREST
맨날 짜는 API 말고, 이번 주말엔 파이썬으로 교향곡 한번 짜보시죠: SCAMP 라이브러리 탐방기 - 풀링포레스트 테크리드가 전하는 파이썬 음악 라이브러리 SCAMP 탐방기. 반복되는 개발 일상 속에서 코드로
Engineering & Tech

맨날 짜는 API 말고, 이번 주말엔 파이썬으로 교향곡 한번 짜보시죠: SCAMP 라이브러리 탐방기

풀링포레스트 테크리드가 전하는 파이썬 음악 라이브러리 SCAMP 탐방기. 반복되는 개발 일상 속에서 코드로 음악을 만드는 창의적인 즐거움을 발견해 보세요.

김영태

테크리드

안녕하세요. 풀링포레스트 테크리드 김영태입니다.

개발자로서 8년 정도 밥벌이를 하다 보니, 가끔은 '코드'라는 것이 단순히 데이터를 옮기고 저장하는 도구로만 느껴질 때가 있습니다. 하루 종일 트래픽과 씨름하고, 데드락이 왜 걸렸는지 로그를 뒤지다 보면, 정작 창의적인 무언가를 만들고 있다는 감각이 무뎌지곤 하죠. 저도 최근에 반복되는 마이크로서비스 아키텍처 작업에 약간의 매너리즘을 느끼고 있었습니다. 그러다 문득 "이 코드로 소리를 제어할 수는 없을까?"라는 엉뚱한 생각이 들더군요. 그래서 주말 동안 파이썬으로 음악을 만들 수 있는 라이브러리를 뒤적이다가 아주 흥미로운 물건을 하나 발견했습니다. 바로 SCAMP입니다.

솔직히 말해 처음엔 반신반의했습니다. 파이썬으로 소리를 다룬다는 게 보통 쉬운 일이 아니거든요. C++이나 SuperCollider 같은 전문 도구가 꽉 잡고 있는 영역이기도 하고, 파이썬 특유의 GIL(Global Interpreter Lock) 때문에 실시간 오디오 처리에 딜레이가 생기지 않을까 걱정부터 앞섰습니다. 하지만 SCAMP 문서를 읽어보고 직접 코드를 돌려보면서, 제 편견이 보기 좋게 깨졌습니다.

SCAMP(Suite for Computer-Assisted Music in Python)는 이름 그대로 컴퓨터 보조 작곡을 위한 파이썬 스위트입니다. 쉽게 말해, 우리가 파이썬으로 로직(알고리즘)을 짜면, SCAMP가 그걸 음악으로 바꿔줍니다. 단순히 "도레미" 소리만 내는 게 아니라, 미디(MIDI) 신호를 쏘거나, 사운드폰트(SoundFonts)를 연결해 실제 악기 소리를 내고, 심지어 그 결과물을 MusicXML이나 LilyPond 같은 악보 파일로 만들어주기까지 합니다.

백엔드 개발자 관점에서 비유하자면, SCAMP는 '음악을 위한 ORM' 같습니다. 우리가 SQL 쿼리를 직접 짜는 대신 JPA나 SQLAlchemy 객체를 다루듯, 복잡한 오디오 파형이나 미디 프로토콜을 직접 건드리는 대신 `play_note` 같은 직관적인 메서드를 호출하면 되니까요.

가장 인상 깊었던 건 '시간'을 다루는 방식이었습니다. 서버 개발할 때도 비동기 처리나 타임스탬프 동기화가 골치 아픈 문제잖아요? 음악에서도 타이밍은 생명입니다. SCAMP는 내부적으로 클럭을 관리하는 방식이 아주 정교해서, 복잡한 박자나 템포 변화도 코드 몇 줄로 제어할 수 있습니다.

설치는 의외로 간단했습니다. `pip install scamp` 한 줄이면 끝나는데, 소리를 제대로 듣기 위해서는 `FluidSynth` 같은 신디사이저 소프트웨어가 필요합니다. 저도 맥북 세팅 과정에서 경로 문제로 잠깐 헤맸는데, 공식 문서의 "New to Python" 가이드가 꽤 친절하게 되어 있어서 금방 해결했습니다.

간단한 예제를 한번 볼까요? 피아노 소리로 랜덤한 멜로디를 만드는 코드는 대략 이런 느낌입니다.

from scamp import *
import random

# 세션 시작 (트랜잭션 시작과 비슷합니다)
s = Session()

# 피아노 악기 생성 (인스턴스화)
piano = s.new_part("piano")

# 멜로디 생성 루프
for _ in range(8):
    pitch = random.randint(60, 72) # 60은 미디에서 가온 다(C4)입니다.
    volume = random.uniform(0.5, 0.8)
    duration = random.choice([0.5, 1.0])
    
    # 노트 연주: 피치, 볼륨, 길이
    piano.play_note(pitch, volume, duration)

이 코드를 실행하면 스피커에서 뚱땅거리는 피아노 소리가 들립니다. 별거 아닌 것 같지만, 터미널 로그만 보던 제 눈과 귀에는 꽤나 신선한 충격이었습니다. `while` 루프와 `if` 문으로 음악의 흐름(Flow)을 제어한다는 게 생각보다 훨씬 창의적인 자극을 주더군요.

SCAMP의 진가는 '양자화(Quantization)' 기능에서 드러납니다. 우리가 코드로 연주한 건 사람이 연주한 것처럼 미묘하게 타이밍이 어긋날 수 있는데(혹은 의도적으로 그렇게 할 수도 있고), 이걸 깔끔한 악보로 변환해 줍니다. 개발 용어로 치면 지저분한 레거시 코드를 린터(Linter)가 싹 정리해서 예쁜 포맷으로 맞춰주는 느낌이랄까요.

물론 시행착오도 있었습니다. 처음엔 노트를 너무 짧은 간격으로 수천 개씩 생성했다가 오디오 버퍼가 터지는 바람에 귀가 찢어질 듯한 노이즈를 경험하기도 했습니다. 리소스 관리는 서버나 악기나 똑같이 중요하다는 걸 뼈저리게 느꼈죠. 또, LilyPond 같은 악보 생성 도구와 연동할 때는 환경 변수 설정 때문에 꽤 애를 먹었습니다. 하지만 이런 삽질 끝에 제가 짠 알고리즘이 그럴싸한 악보 PDF로 출력되어 나왔을 때의 쾌감은 정말 대단했습니다.

학습 자료도 꽤 풍부합니다. 개발자인 Marc Evanstein이 직접 만든 튜토리얼 비디오들이 있고, Kadenze라는 플랫폼에 강좌도 개설되어 있습니다. 문서화 수준(API Reference)도 오픈소스 프로젝트치고는 상당히 훌륭한 편이라, `help()`를 쳐가며 멘땅에 헤딩할 필요가 별로 없었습니다.

우리는 매일 '유용한' 코드를 짜야 한다는 압박 속에 삽니다. 성능을 최적화하고, 비용을 줄이고, 장애를 막아야 하죠. 하지만 가끔은 이렇게 '쓸모'보다는 '재미'에 집중하는 코딩이 필요합니다. SCAMP는 그런 면에서 아주 훌륭한 장난감이자 도구입니다.

이번 주말에는 복잡한 비즈니스 로직은 잠시 내려놓고, 파이썬으로 나만의 작은 오케스트라를 지휘해보는 건 어떨까요? `for` 루프가 반복될 때마다 들려오는 멜로디가 여러분의 지친 개발자 뇌를 말랑말랑하게 만들어 줄 겁니다. 저도 이번 주에는 팀원들에게 들려줄 '배포 완료 알림음'을 이걸로 한번 만들어볼 생각입니다.

지금 읽으신 내용, 귀사에 적용해보고 싶으신가요?

상황과 목표를 알려주시면 가능한 옵션과 현실적인 도입 경로를 제안해드립니다.