WAAPI 간소화하기

오디오 프로그래밍 / Wwise에 대한 팁과 도구

Wwise 저작 API (Wwise Authoring API, WAAPI)를 사용하신 적이 없으시다면 이 글을 통해 사용해볼 기회가 생기기를 바랍니다.

네, 프로그래머가 아닌 분들에게 WAAPI가 너무 복잡하고 이해하기 힘들게 느껴질 수 있지만 제 얘기를 한 번 들어보세요. 함께 (글을 쓰는 저와 글을 읽는 여러분) 작업 방식에 엄청난 변화를 만들어볼 테니까요.

여러분의 시간을 낭비하지 않을 것을 약속드립니다.

Wwise 저작 API란 무엇일까요?

제가 그렇게 WAAPI를 좋아하며 어떻게 여러분이 더 쉽게 접근할 수 있는지 깊게 얘기해보기 전에, 먼저 WAAPI가 무엇인지 알아봅시다.

Wwise 저작 API는 Wwise 2017.1과 함께 출시되었습니다. 이름에서 알 수 있듯이 WAAPI는 다른 프로그램을 조작할 수 있게 해주는 코드인 API (저작 프로그래밍 인터페이스) 입니다.

WAAPI는 여러 정보를 앞뒤로 전송하여 네트워크를 통해 Wwise와 통신할 수 있게 해줍니다. 그렇게 하기 위해서 프로그래밍 언어에 애그노스틱한 'WAMP' (Web Application Messaging Protocol, 웹 애플리케이션 메시징 프로토콜)이라는 통신을 사용하죠. 쉽게 말해 여러분이 많은 다양한 언어를 사용하여 WAAPI 코드를 제작하고 로컬이나 네트워크를 통해 Wwise와 통신할 수 있습니다.

WAAPI를 사용하면 오디오 파일 가져오기를 오토메이션(자동화) 하거나, Event를 생성하고, 속성을 대량으로 변경하고, SoundBank를 생성하고, 심지어 GUI를 맞춤 제작할 수도 있습니다 (예: 믹서 맞춤 제작). 심지어 여러 인스턴스의 Wwise가 서로 통신하도록 할 수도 있죠 (예를 들어 오래된 버전의 프로젝트를 새로운 버전과 비교하고 싶은 경우처럼요. 네, 물론 저도 사용해본 방법입니다).

참 흥미롭지 않나요?

저도 그렇게 생각합니다. 하지만 여기에도 단점이 없는 것은 아닙니다.

진입 장벽

제가 처음 WAAPI Wwise 사용자들에게 소개되는 것을 보았을 때 저는 조금 놀랐습니다. 이 API의 잠재력은 그때나 지금이나 참 놀라워요! 조금만 기존의 방식에서 벗어나 생각하면 이 API를 적용할 수 있는 곳이 굉장히 많으며 작업 과정을 상당히 개선할 수 있습니다.

하지만 다른 사람들이 이 부분을 잘 알아차리지 못한 것을 볼 수 있었습니다.

Audiokinetic은 이 다재다능한 WAAPI가 얼마나 많은 것을 할 수 있는지 훌륭하게 보여주었어요! 하지만 프로그래머가 아닌 분들에게는 이 WAAPI라는 것이 정확히 무엇인지 알기가 어려운 것 같았습니다. 이것이 '새로운 Wwise 기능'이라고 생각하실 수 있겠지만, 이 기능은 사실 여러분이 직접 기능을 맞춤 제작할 수 있게 해주는 기능입니다.

이 부분을 이해하고 API 설명서를 읽기 시작하면, 두 가지 현상이 일어납니다.

  • 눈앞에 펼쳐진 가능성에 대해 아주 신이 날 겁니다.
  • 초보 프로그래머라면 위압적이고 사용하기 불가능하게 느껴질 겁니다.

두 번째는 제 마음을 참 아프게 합니다.

이 상황을 생각해보세요.

먼저 WAAPI가 무엇을 할 수 있는지 이해한 후에 새로운 유용한 기능을 만들 생각에 굉장히 신이 납니다. 예를 들어 스케줄에 맞춰 SoundBank를 자동으로 생성하는 도구를 만들려고 한다고 가정해봅시다.

두 번째로 API 설명서를 읽어봅니다. 처음에는 꽤 이해하기가 쉬운 것 같습니다. 적어도 각 함수의 이름을 이해할 수가 있죠. 하지만 샘플 WAMP 코드를 볼 때 아주 빨리 이해력이 떨어지게 됩니다. 

그리고 겁이 나면서 '이건 프로그래머가 하는 일이야!' 라고 생각하면서 여러분의 멋진 아이디어를 만드는 것을 도와줄 수 있는지 프로그래머에게 물어보게 됩니다.

아, 잠시만요... 물어볼 수 있는 프로그래머가 없을 수도 있겠네요. 이런.

혹은 여러분이 프로그래머이지만 중요한 엔진 버그를 수정하거나 새로운 게임 내 사용자 기능을 제작하는 데에 너무 바쁠 수도 있습니다.

그리고 WAAPI가 아주 멋지게 느껴지면서도 빠르게 뒷전이 되어버리죠. 이렇게 여러분은 이 기술을 사용해야 하며 사용할 수 있지만 진입 장벽이 다소 너무 높아서 멈칫하게 되는 수많은 사람들 중 한 사람이 되었습니다.

바로 이 부분을 제가 해결해드리고자 합니다.

진입 장벽 넘어서기

저보다 더 똑똑한 사람들의 도움을 통해서, 저는 WAAPI를 C#을 사용하여 좀 더 쉽게 사용해보는 것을 처음 목표로 삼았습니다.

이 말은 다음과 같습니다.

  • WAMP와 JSON는 범위에서 제외해서 최종 사용자가 볼 수 없게 하기 (숨기기).
  • WAAPI 사용의 난이도를 낮춰서 기술적 사운드 디자이너나 구현 전문가가 딱히 (혹은 아예) 프로그래머의 도움 없이 사용할 수 있게 하기.
  • 기존의 WAAPI 문법과 충분히 비슷하게 유지해서 사용자가 오브젝트 속성 (이 속성의 목록이 아주 깁니다) 과 같은 것에 대해 WAAPI 설명서를 참고할 수 있게 하기.

저는 몇 주간 WaapiCS라는 '래퍼(wrapper)' (여러분 대신 WAAPI와 직접 상호작용하는 코드 레이어)를 제작해서 위에서 제시한 모든 것들이 가능하도록 만들었습니다. 이 래퍼는 현재 MIT 라이선스로 사용할 수 있습니다 (상용으로 사용하고, 배포하고, 변경할 수 있습니다. 단지 원저자가 저임을 알려주시면 됩니다). 소스를 다운로드할 수 있는 링크는 이 글 아랫부분에서 찾으실 수 있습니다.

이것이 여러분에게 실용적으로 무엇을 의미하는지 알려드리기 위해서 일부 코드를 서로 비교해볼까요.

ak.wwise.core.getInfo 호출하기

‘ak.wwise.core.getInfo’ 로의 함수 호출을 살펴봅시다. 이 호출을 Wwise로 전송하면 실행 중인 Wwise 버전이나 Wwise .exe로의 경로 등 Wwise에 대한 일반적인 데이터가 리턴됩니다.

설명서에서 제공된 샘플 프로젝트 코드는 다음과 같습니다.

2

3

WaapiCS를 사용하면 이 모든 코드가 다음과 같이 바뀝니다.

Dictionary<string, object> results = ak.wwise.core.GetInfo();

간단하죠. 'ak.wwise.core.GetInfo’를 호출하면 루프를 통해 반복할 수 있는 Dictionary가 주어집니다. C# 프로그래밍에 대해 조금 알고 계신다면 충분히 작업실 수 있습니다.

프로그래밍 용어

바로 사용해보기 전에 이 기능이 정확히 어떻게 작동하는지 알려드리고 싶습니다. 이보다 조금이라도 더 광범위한 작업을 하려고 할 경우, 여전히 프로그래머의 도움이 필요할 가능성이 높습니다.  프레임워크를 편집하지 않으실 계획이라면 이 부분을 건너뛰셔도 좋습니다.

두 개의 레이어

WaapiCS는 두 개의 레이어를 염두에 두고 제작되었습니다. 아래에 있는 레이어인 'WaapiCS.Communication'은 WAMP/JSON Wwise로 혹은 Wwise로부터의 통신을 처리합니다. 이 레이어는 몇 개의 단순한 오브젝트로 제작되었어요.

  • Connection – 단발성 호출을 사용할 경우 Wwise와의 연결을 설립함.
  • Subscription – 특정한 Wwise 호출로 구독하며 콜백을 기다림.
  • Packet – 사용자의 모든 전달인자를 담고 있는 오브젝트. 이 오브젝트는 WAMP 처리에서 JSON으로 전송 및 변환됩니다.
  • Results – 모든 콜백의 결과를 담는 일반 C# 오브젝트. Wwise가 다양한 타입의 JSON을 보낼 수 있기 때문에, 콜백 후 JSON으로부터 번역할 때 특정한 타입으로 캐스트 됩니다.

'위에 있는' 레이어는 ('ak' 명칭 공간 내) 실제로 사용자가 볼 수 있는 API 호출이 있는 곳입니다. 모든 메소드는 WAAPI 문법과 아주 유사할 수 있도록 고정적입니다 (이건 제가 선택한 방식이며, WaapiCS는 이 부분을 변경하거나 제거할 수 있도록 제작되었습니다). 아래에 있는 레이어의 packet 오브젝트는 사용자에게 주어진 전달인자로부터 제작되었습니다. Wwise가 리턴 결과를 다시 보내줄 경우, 함수 호출의 끝에 다시 사용자에게로 리턴됩니다. 이는 다음 예시와 같이 표시될 수 있습니다:

4

위에 보이는 것은 ' ak.wwise.core.remote.Connect '로의 호출입니다. 원격으로 연결하고자 하는 게임의 호스트 IP 인 문자열 전달 인자를 필요로 하죠. 나머지 코드는 packet 오브젝트의 결과를 비우고 (이미 사용되었을 경우), WAAPI와 사용할 절차를 설정하고, 호스트 IP를 packet으로 추가하고, Wwise가 다시 우리에게 호출할 함수가 무엇인지를 선언하고, 다음으로 'connection.Execute'를 통해 Wwise로 packet을 전송합니다. 이 모든 작업이 끝나면 packet 오브젝트가 다시 다른 사용을 위해 비워집니다. 이 패턴은 API에 있는 각 함수를 통해 비슷하게 반복됩니다.

물론 사용자에게 보이는 고정적 호출의 시스템이 모든 팀에서 사용할 수 있는 것은 아닙니다. 바로 이 이유로 WaapiCS가 여러 레이어를 사용하여 제작되었습니다. '아래에 있는' 레이어는 WAMP/JSON을 통한 WAAPI와의 통신은 꽤나 견고하기 때문에 편집할 필요가 없을 겁니다. 하지만, 여러분의 팀이 사용자가 사용할 코드에 대한 다른 아이디어를 가지고 있다면, WAMP 통신 레이어를 그대로 유지하면서 이 레이어를 제거하거나 위에 있는 레이어를 다시 제작하실 수 있습니다.

어디에 사용할 수 있나요?

일반적으로 WAAPI와 WaapiCS를 사용하여 다음과 같이 Wwise 저작 도구의 기능을 오토메이션(자동화), 일괄 처리, 재현할 수 있습니다.

  • 오디오 파일 대량으로 가져오기, Event와 SoundBank 생성
  • 매개 변수, 버스 등 대규모 프로젝트 변경
  • SoundBank 생성 오토메이션/스케줄
  • Wwise와 다양한 프로그램 간의 통신
  • Wwise 저작 도구를 위한 제어 인터페이스 맞춤 제작하기
  • TTS VO 일괄 생성 및 Wwise에 자동으로 가져오기

...등등 정말로 많은 것들이 있습니다.

WaapiCS의 개념을 시험해보기 위해 간단한 믹스 인터페이스를 맞춤 제작해보았습니다.

5

위의 GUI는 C#으로 제작되었으며 Wwise 내에서 어떠한 버스나 오브젝트 노드 볼륨도 제어할 수 있습니다. 현대 최신 디지털 믹싱 콘솔에 '페이지' 기능이 있으며, Wwise 계층 구조 안으로 깊게 들어가서 한 오브젝트나 상위 레벨 믹스 버스를 단 몇 번의 클릭만으로, Wwise가 게임에 연결되었을 때 실시간으로 변경할 수 있다고 상상해보세요. 이 맞춤 '데스크 스냅샷'을 저장해서 특정 속성이나 보조 센드의 페이더 및 슬라이더를 불러올 수도 있습니다. 여러분의 상상력을 무한히 펼쳐볼 수 있죠!

이 이미지는 별것 아닌 것처럼 보이지만 (프로토타입이에요), 정말 괜찮지 않나요? Wwise 밖에서 여러분이 원하는 대로 믹서 GUI를 쉽게 맞춤 제작하실 수 있습니다.

하지만 프로토타입 C# GUI가 아니어도 됩니다. Unity, Unreal, 혹은 전용 엔진이나 어떤 게임 엔진에서든지 쉽게 제작해 넣으실 수 있습니다. 심지어 OSC로 매핑하여 Wwise를 아이패드 컨트롤 서피스에서 믹스하실 수도 있습니다!

활용하기

여러분이나 여러분의 팀이 아직 WAAPI를 활용해볼 생각을 해보지 않으셨다면, 이 글을 통해 충분히 활용해볼 수 있다는 것을 아셨으면 좋겠습니다. WaapiCS는 무료로 제공되며, 아직 작업 중이지만 지금 바로 다운로드하셔서 원하는 대로 변경해 보실 수 있습니다. 상용적 제한도 없으며 지불하실 필요도 없어요.

제가 위에서 설명해드린 것처럼 이러한 도구를 제작해보고 싶지만 시간이나 리소스가 없으시다면, 저에게 연락해 주세요! 저는 고객과 함께 일하기도 하며, 여러분이 Wwise 플랫폼을 보다 쉽게 사용할 수 있도록 기쁜 마음으로 도움을 드릴 수 있습니다.

Subscribe  

Adam T. Croft

Audio and Software Professional

Adam T. Croft

Audio and Software Professional

Adam T. Croft is a devoted audio and software professional out of Seattle, WA. He’s helped bring ideas to life with 343 Industries, Turn 10 Studios, and Bungie. Adam could be described as a BBQ snob, and commits to making ridiculous ideas a reality. You can find his rants, books, and software products at https://adamtcroft.com/

 @adamtcroft

댓글

댓글 달기

이메일 주소는 공개되지 않습니다.

다른 글

보이스 제어 방법- CPU에 최적화하기(제 1부)

프로젝트 개발 과정 동안 성능 문제가 일어나는 것은 꽤나 흔한 일입니다. 문제의 원인은 다양하지만 대부분의 경우 동시 재생되는 사운드의 수와 직접 관련된 경우가 많죠. 볼륨만...

12.5.2020 - 작성자: 마튜 장 (Mathieu Jean)

Impacter와 Unreal - 게임 물리를 사용하여 Impacter 플러그인 제어하기

소개 Impacter(임팩터)는 Wwise를 위한 새로운 타격음 모델링 플러그인입니다. 플러그인 소개는 이 글을 통해 확인해주세요. 이 글에서는 Impacter를 사용하여...

3.6.2021 - 작성자: 션 소라한 (Sean Soraghan)

Wwise Spatial Audio 2023.1의 새로운 기능 | 위상 완화 (Phasing Mitigation)

오늘 이 글에서는 '위상(phasing)'이라는 흥미로운 음향적인 현상에 대해 알아보겠습니다. 이 현상은 특정 환경에서 음향을 모델링할 때 나타날 수 있죠. Wwise 23.1의...

25.1.2024 - 작성자: Allen Lee

Unreal Engine에서 AudioLink를 사용하는 방법

소개 이 글에서는 Unreal Engine의 AudioLink를 집중적으로 살펴보려고 합니다.이 작업은 다음 버전을 사용하여 검토되었습니다....

15.8.2024 - 작성자: 히로시 고다 (Hiroshi Goda)

Wwise 2024.1 새로운 기능

Wwise 2024.1이 출시되었으며 Audiokinetic 런처를 통해 다운받으실 수 있습니다. 이 버전이 제공하는 새로운 기능을 간략하게 소개해드리려고...

8.11.2024 - 작성자: Audiokinetic (오디오키네틱)

ReaWwise를 사용한 ReaScript(Lua)에서의 WAAPI

ReaWwise에서 잘 알려지지 않은 기능 중 하나는 원시적 WAAPI 함수를 REAPER에 노출하여 사용자 정의 ReaScript에서 사용할 수 있다는 것입니다. 이 블로그...

20.11.2024 - 작성자: 앤드류 코스타 (Andrew Costa)

다른 글

보이스 제어 방법- CPU에 최적화하기(제 1부)

프로젝트 개발 과정 동안 성능 문제가 일어나는 것은 꽤나 흔한 일입니다. 문제의 원인은 다양하지만 대부분의 경우 동시 재생되는 사운드의 수와 직접 관련된 경우가 많죠. 볼륨만...

Impacter와 Unreal - 게임 물리를 사용하여 Impacter 플러그인 제어하기

소개 Impacter(임팩터)는 Wwise를 위한 새로운 타격음 모델링 플러그인입니다. 플러그인 소개는 이 글을 통해 확인해주세요. 이 글에서는 Impacter를 사용하여...

Wwise Spatial Audio 2023.1의 새로운 기능 | 위상 완화 (Phasing Mitigation)

오늘 이 글에서는 '위상(phasing)'이라는 흥미로운 음향적인 현상에 대해 알아보겠습니다. 이 현상은 특정 환경에서 음향을 모델링할 때 나타날 수 있죠. Wwise 23.1의...