소개
안녕하세요. 저는 덴마크 출신의 사운드 디자이너로, 마크 하셀바크(Marc Hasselbalch)라고 합니다.
제가 개발한 게임 오디오 구현 도구인 ReaperToWwise에 대해 소개하고, 개발 과정에서 구상과 의사 결정 과정 및 접근 방법에 대해 이야기하려 합니다. ReaperToWwise는 사용자가 Reaper 타임라인 환경에서 편리하게 Event를 게시하고 Game Sync를 Wwise 세션에 직접 설정할 수 있도록 하는 맞춤형 Reaper 스크립트로, 엔진이 연동되어 있지 않더라도 사용할 수 있습니다.

이 도구의 목적은 다소 개방적이지만, 주된 의도는 개발 과정에서 어떤 이유로든 게임 엔진이 연동되어 있지 않은 상황에서 구현 시스템과 디자인을 테스트하는 데 도움을 주는 것입니다.
사운드 디자이너가 프리프로덕션 단계에서나 구현 시스템을 테스트하는 데 활용할 수 있습니다. 또한 컷씬과 시네마틱의 사운드 타이밍 작업이나, 전체 스크립트나 게임 엔진에 의존하지 않고 Wwise 시스템을 설정하는 실무 교육 목적으로도 활용할 수 있습니다.
또한 사운드 디자이너가 구현 시스템을 다른 팀원들에게 시연하고 설명하는 데 활용할 수도 있습니다. 다만, 결국 어떻게 활용할지는 전적으로 사용자에게 달려 있죠.
결론적으로, 이 도구는 사용자의 Reaper 세션을 더 유연하고 변형 가능한 Soundcaster 세션으로 바꿔주는 역할을 합니다.
도구 사전 요구 사항
REAPER
https://www.reaper.fm/
참고: 이 도구는 Reaper v.7.07 환경에서 작성 및 테스트 되었지만, Lua 인터프리터가 Lua 5.3을 기반으로 하는 대부분의 Reaper 버전(공식 웹사이트 기준 Reaper v.6.x 및 하위 버전)과도 호환됩니다.
Reaper v7에서 Lua 5.4 기능이 소개되었지만 저는 이전에는 이 기능을 사용하지 않았습니다.
Wwise 2019.1 이상
(ReaWwise 설치 필요)
https://www.audiokinetic.com/ko/products/wwise/
ReaWwise
(Reaper 내 ReaPack을 통해 설치 가능)
https://blog.audiokinetic.com/ko/reawwise-connecting-reaper-and-wwise/ (앤드류 코스타(Andrew Costa)의 블로그 게시물)
ReaWwise는 블로그 게시물에서 설명했듯이, 'REAPER 프로젝트에서 Wwise로 오디오 애셋을 전송하는 과정을 간소화하는 Audiokinetic의 새로운 REAPER 확장 기능' 입니다.
또 하나 유용한 점은 Reaper 내부의 Lua에서 원시 WAAPI 기능을 사용할 수 있도록 제공한다는 것으로, ReaperToWwise가 작동하는데 필요한 부분입니다.
Lokasenna의 Lua 용 GUI 라이브러리 v2
(Reaper 내 ReaPack을 통해 설치)
GUI 요소를 처리합니다.
도구 소개
이 도구의 0.9 버전을 살펴보겠습니다.
ReaperToWwise 는 Reaper 타임라인의 빈 아이템에 작성된 Notes 필드의 텍스트 명령을 파싱하여 재생 커서가 해당 아이템의 시작 지점을 지날 때 Wwise에 존재하는 Event를 게시하고 Game Sync를 설정합니다.
스크립트를 사용하기 위해서는 Reaper와 Wwise 세션을 모두 열어야 합니다.
Reaper에서 스크립트를 실행하면 다음과 같은 독립 창 메뉴가 표시됩니다.

이제 아래에 표시된 통신 포트를 통해 Wwise 프로젝트에 연결해야 합니다.
Project -> Project Settings -> Network로 이동하여 통신 포트('Game Discovery Broadcast Port (game side)')를 확인하세요.
물론 충돌이 없는 포트를 자유롭게 입력할 수 있습니다.
성공하면 사용할 준비가 된 것입니다.
Reaper 세션에서 빈 아이템을 추가하고 e/Footstep 과 같은 명령을 입력하면 도구가 Wwise에 'Footstep' Event를 게시하고 트리거합니다. 단, 해당 Event가 Wwise 프로젝트에 존재하고 올바르게 설정되어 있어야 합니다.
'e/' 는 'Footstep'이라는 이름의 Event를 게시하려고 시도하는 명령입니다.
각 명령을 쉼표와 개행으로 구분하면 하나의 블록에 두 개 이상의 Event나 Game Sync를 게시할 수 있습니다.
이러한 명령은 다음과 같이 작성할 수 있습니다:

이렇게 하면 Footstep, playAmbience, playRain라는 이름의 Event를 게시합니다.
또한 Switch와 같은 Game Sync를 설정할 수도 있습니다.
sw/ 명령으로 이를 수행할 수 있습니다.

위 명령은 GroundTexture 라는 Switch Group에 Dirt라는 Switch를 설정합니다.
전체 명령 목록은 다음과 같습니다:
Event:
e/eventName
지정한 'eventName'의 Event를 게시합니다.
Switch:
sw/switchGroup/switchName
지정한 'switchGroup'에서 'switchName' Switch를 설정합니다.
State:
st/stateGroup/stateName
지정한 'stateGroup'에서 'stateName' State를 설정합니다.
Trigger:
t/triggerName
지정한 'triggerName'의 Trigger를 게시합니다.
RTPC:
r/rtpcName/rtpcValue
지정한 RTPC를 지정한 값으로 설정합니다.
재생 중에 RTPC 값을 설정하는 오토메이션(자동화) 레인을 생성할 수도 있습니다.
지정한 RTPC를 제어하는 오토메이션 레인을 추가하는 방법은 다음과 같습니다:
- 도구 창에서 'Add RTPC Lane'을 클릭합니다.
- 제어하려는 RTPC의 이름을 입력하고 최소값과 최대값을 설정합니다.
- 별도의 JSFX 플러그인이 자동으로 생성되어 선택한 Reaper 트랙의 FX 목록에 추가됩니다.
- 선택한 트랙 아래에 오토메이션 레인이 자동으로 생성됩니다.
- 필요한 모든 RTPC에 대해 이 과정을 반복합니다.
참고: 빈 아이템으로 RTPC 값을 설정하면서 동시에 RTPC 레인을 생성하려는 경우, 해당 오토메이션 레인을 비활성화(disarm) 하는 것이 좋습니다. 그렇지 않으면 매 업데이트마다 오토메이션 값이 계속 갱신되어 빈 Event 아이템에서 설정한 값에 간섭하게 됩니다.
따라서 특별한 사용 사례가 없는 한 두 기능을 동시에 사용할 수 없습니다.
중요한 점은 이 도구가 (현재 버전에서는) Event 나 Game Sync를 처음부터 생성하지 않는다는 것입니다. 단지 Wwise 프로젝트에 이미 존재하고 설정된 경우에만 이를 트리거하거나 설정할 수 있습니다.
대략 이 정도가 전부입니다. 이 도구를 다운로드해서 사용해 보고 원하는 기능을 충족하는지 직접 확인해 보시기 바랍니다.
왜 이 도구를 개발했나요?
제가 게임 오디오 직무에 지원할 때 기술적 구현 역량을 보여주고자 하는 의지와 필요성을 느껴 이 작업을 시작했습니다.
하지만 기술 구현에 특화된 포트폴리오가 많지 않다면 어떻게 해야 할까요?
그런 경우 기술 구현 데모 영상을 만들면 됩니다.
하지만 저처럼 아직 공개할 수 있는 출시작이 없거나, 있더라도 아직 공개할 수 없는 경우에는 보통 직접 소규모 게임을 만들거나 게임 엔진 데모 프로젝트를 기반으로 작업하게 됩니다.
저는 예전부터 저의 포트폴리오에 게임 엔진 데모 프로젝트를 사용하는 데 약간의 거부감이 있었습니다. 하지만 이는 어디까지나 저의 개인적인 문제이지 그것을 선택하는 사람들의 문제가 아닌 것 같습니다. 게임플레이나 시네마틱의 선형의 짧은 영상의 리디자인으로만 보여주는데 지쳐 있다면, 그 외에 무엇을 할 수 있을까요? 게임과 게임 오디오의 비선형성과 적응형 프레임워크를 이해하고 그것을 능숙하게 다룰 수 있다는 것을 보여줄 필요가 있습니다.
그래서 선형과 비선형, 두 가지를 결합한 방법을 고안하게 되었습니다.
처음으로 시도한 방법은 Reaper, Wwise, Max/MSP를 이용한 지나치게 복잡한 작업 흐름이었습니다. 선형 영상의 모든 오디오 이벤트마다 마커를 배치하고, 이 마커 목록을 내보낸 뒤 Max에서 이를 파싱하여 MIDI를 통해 Wwise에서 Event와 Switch를 트리거하고 RTPC를 제어하는 방식이었습니다.
여기에서 시연합니다:
게임 오디오 구현 시연: Wwise + Max를 활용한 선형 영상용 다이내믹 시스템 (2023년 10월)
이것은 정상적으로 작동하긴 했지만 너무 복잡했습니다. 그래서 이후 다른 사운드 디자이너들도 사용할 수 있는 공유 가능한 형태로 만들고 싶었습니다. 하지만 Max라는 복잡한 추가 단계를 거쳐야 한다면 설득하기는 쉽지 않을 것이라고 생각했습니다.
시간이 지난 뒤, Max가 더 이상 필요 없도록 최적화하여 모든 작업을 Reaper 내에서만 처리하고자 했습니다. 그래서 Reaper의 기능 확장을 위해 사용할 수 있는 언어 중 하나인 Lua 프로그래밍을 더 깊이 공부하기 시작했고, 타임라인 마커를 활용한 간단하고 새로운 시스템을 고안해냈습니다. Event 게시용 마커를 배치하고 이름을 'Footstep'으로 지정하면, 스크립트가 해당 마커의 이름을 Wwise로 보내고 동일한 이름의 Event를 트리거합니다.
여기에서 그 버전을 시연합니다: 게임 오디오 구현 시연: Reaper 마커를 활용한 Wwise Event 트리거
이 방법도 꽤 잘 작동했지만, Event 게시에만 사용할 수 있었습니다. 이제 RTPC를 포함한 다른 모든 Game Sync가 필요했습니다.
이 도구를 만드는 과정은 구체적인 과제가 주어진 상황에서 Lua를 배우는 훌륭한 방법이었습니다. 이 도구에 새로운 기능 아이디어가 떠오를 때마다 Lua 문서에서 관련 문법과 로직을 찾아보고, 스크립팅하고, 시도해 보고, 때론 좌절하면서도 결국 배워나갔거든요.
조금씩 틀이 잡히기 시작했고, 버그도 많았습니다. 지금도 여전히 버그가 있지만요 (저장소의 README를 보면 알 수 있습니다). 몇 가지 적절한 조정과 우회 방법을 적용하면 다른 사람들도 사용할 수 있는 도구로 발전할 수 있습니다. 이는 제가 처음부터 이 작성을 시작한 가장 큰 동기이기도 했습니다. 제 요구에만 맞는 도구를 만드는 데 그치지 않고, 같은 요구를 가진 다른 사람들과도 공유할 수 있도록 하기 위해서죠
다양한 창의성, 기술적 역량, 문제 해결 능력, 노하우가 모여 이런 도구를 만들 수 있다는 사실을 깨달았을 때, 정말 뿌듯합니다.
이제 저는 이런 종류의 도구가 필요하다면 대부분 직접 만들 수 있다는 것을 알게 되었습니다.
그리고 만약 만들 수 없다면, 분명 그것을 만드는 방법을 배울 수도 있죠.
어떤 면에서 보더라도 저는 전문가 수준의 프로그래머는 아닙니다. 기술적인 게임 오디오 작업을 시작하기 전에는 주로 Max, Pure Data, Supercollider와 같은 도구로 프로그래밍 경험을 쌓았죠.
이런 기술적인 작업을 배울 때 꼭 필요한 생각하는 힘과 끈기, 저는 그게 참 매력적이라고 생각합니다.
저와 비슷한 분이 계시다면, 기술적인 게임 오디오라는 멋진 분야를 탐구해 보세요. 궁금한 게 있는데 막막하다면, 작게 쪼갠 목표를 한 두개 잡아 프로젝트로 시작해보세요. 그리고 그걸 완성해나갈 때 필요한 것부터 차근차근 배워보세요.
게임 오디오를 위한 맞춤형 도구는 분야가 매우 넓지만, 특정 사운드 디자인과 구현에는 반드시 필요합니다. 개발 과정을 짧고 빠르게 만드는 데 그치지 않고, 사운드 디자이너가 에너지를 가장 필요한 곳에 집중할 수 있도록 돕기 때문입니다.
제가 알기로 ReaWwise와 그에 따라 공개된 Lua 기능들은 2022년 9월부터 사용 가능했습니다. 전체적으로 보면 그리 오래되진 않았지만, 그때부터 이 접근 방식을 활용할 수 있었음을 의미하죠.
가능성과 필요성이 잘 맞아떨어진 결과라고 봅니다.
발명은 필요에서 비롯된다는, 뭐 그런 말이죠.
제가 Reaper 마커 기반 버전의 스크립트를 시연하는 첫 영상을 공개할 당시, 토마스 프리츠(Thomas Fritz)도 비슷한 접근 방식의 Wwhisper 라는 도구를 만들었습니다 (인정하건데 'ReaWwise'라는 이름이 이미 사용 중이었던 만큼 훨씬 더 좋은 이름인 것 같습니다).
몇 가지 아이디어와 접근 방식은 비슷했지만, 토마스는 다른 기능에 집중했습니다. 기초가 마련되면 사람들이 비슷한 방향으로 나아가 비슷한 구조를 만든다는 좋은 방증이죠.
이처럼 활발한 아이디어와 접근 방식의 교류는 게임 오디오 커뮤니티를 특별하게 만드는 중요한 요소 중 하나입니다.
어떻게 이 도구를 사용하나요?
이 도구를 만들 때 매우 구체적인 사용 사례를 염두에 두고 있었지만, 앞서 언급했듯이 다양한 용도로 활용할 수 있습니다.
제 아이디어는 게임 오디오 직무를 위한 의미 있는 경험을 선보일 수 있도록 선형의 영상에 다이내믹하고 인터렉티브한 시스템을 만드는 것이었습니다. 그런데 이를 다양한 플랫폼에 공유하자 게임 엔진에서 설정하고 구현하는 과정을 거치지 않고도 게임 오디오 구현을 직접 체험해 보고 싶은 아이디어가 떠올랐습니다. 누군가는 이 도구가 게임의 컷씬 사운드 타이밍 작업에 유용할 수 있다고 언급했습니다. 또한 게임 개발팀 내 오디오가 아닌 다른 부서에 기술적 아이디어를 전달하고 시연하는 용도로도 활용할 수 있죠.
도구의 사용은 항상 그것을 만든 사람에게 달려 있는 것은 아닙니다. 그러니 이 도구를 사용해 보고 적합하다고 생각되는 방식으로 활용해 보세요.
이 도구를 정말 독특하게 활용한 사례가 있다면 꼭 알려주세요. 도구가 점점 더 다양한 곳에 쓰이고 발전하는 걸 지켜보는 일은 참 뿌듯한 일이거든요.
더 나아가
이 도구는 아직 v1.0으로 출시되지 않았습니다. 기능을 추가하고, 놓쳤을지 모를 모든 버그와 잠재적인 nil 참조 문제를 수정하려면 시간이 더 필요하기 때문입니다.
현재 계획 중인 몇 가지 기능이 있는데, 그중에는 'Event Manager'라고 불리는, 여러 Reaper 빈 아이템 이벤트를 더 체계적으로 관리하고 처리하는 기능이 포함됩니다. 이는 사용자 피드백에서 받은 제안으로 매우 감사하게 생각합니다.
이 도구를 더 발전시키고 싶지만 v0.9 출시 이후로는 시간이 거의 없었습니다.
하지만 결국에는 완성해낼 겁니다.
이 도구는 어디에서 받을 수 있나요?
전용 Github 저장소에서 다운로드할 수 있습니다: https://github.com/mhasselbalch/MH_ReaperToWwise
v1.0이 완성되면 Reaper 내 ReaPack을 통해 배포하고 사용할 수 있도록 할 예정이지만, 당분간은 그렇게 하지 않기로 했습니다.
오늘은 여기까지
읽어 주셔서 정말 감사합니다.
지금까지 이 작업에 관심을 보여주고 피드백과 의견을 주신 친구, 동료, 뜻을 같이하는 모든 분들께 감사드립니다. 그리고 이에 대해 글을 쓸 기회를 준 Audiokinetic에도 깊이 감사드립니다.
관심이 있다면 언제든 주저하지 말고 https://www.linkedin.com/in/marc-hasselbalch/를 팔로우해 연락 주세요. 그냥 간단한 인사도 좋습니다.
안녕히 계세요.

댓글