다시 뵙게 되어 반갑습니다! 이 시리즈에서는 Wwise에서의 간단한 반복 재생 기반 자동차 엔진을 구성 및 설계를 함께 살펴보게 됩니다. 디자인을 제어하기 위해 필요한 엔진 매개 변수와 에셋 편집에 대한 일반적인 지침을 알아보는 제 1부를 아직 읽지 않으셨다면 여기서 먼저 읽어주세요!
시리즈의 이 부분에서는 Bugbear Entertainment(버그베어 엔터테인먼트)가 제작하고 THQ Nordic(THQ 노르딕)이 출판한 강렬한 포크 레이싱(folk racing) 게임인 렉페스트(Wreckfest)에서 사용된 공식 엔진 오디오 모딩 번들을 가장 집중적으로 살펴보게 됩니다. 이 모딩 번들은 튜토리얼과 Wwise 예시 프로젝트로 구성되어 있으며, Bugbear 커뮤니티 포럼에 있는 주제글에서 다운로드하실 수 있습니다.
Wwise를 새로 접하시는 분이라면 먼저 이 모딩 튜토리얼을 통해 Wwise GUI의 관련 기본 지식을 배우실 것을 추천해드립니다. 그 외에도 이 글은 여러분이 Wwise Authoring을 어느 정도 알고 계신다는 전제 하에 진행됩니다. 그럼 시작해볼까요?
예시 프로젝트에 대해
예시 프로젝트를 Wwise 2019.2로 열고 어떤 Actor-Mixer 오브젝트와 RTPC 게임 싱크가 들어 있는지 살펴보세요. 거의 모든 오브젝트에 특정 및 관련된 기능을 기록해 둔 메모가 포함된 것을 보실 수 있습니다.
이 Project에서 제 1부를 통해 살펴본 주요 엔진 매개 변수는 다음과 같습니다.
1. RTPC_Player_Example: 플레이어 차량의 Rpm용 RTPC이며, 범위는 실제 Rpm입니다.
2. RTPC_Player_Load: 엔진 Load용 RTPC이며, 범위는 0~1입니다.
3. RTPC_Player_Throttle: 플레이어가 설정하는 스로틀(throttle) 양에 대한 RTPC이며, 범위는 0~1입니다.
특히 Load RTPC의 경우 렉페스트에서 사용되는 매개 변수의 범위에서는 중간값인 0.5이 중립(공회전) 부하임을 의미합니다. 또한 이러한 RTPC의 NPC 차량 변형도 있습니다. NPC 차량용 RTPC는 'Player_' 대신 'AI_'로 표기되어 있습니다.
이 Project는 예시 에셋도 함께 제공됩니다. 이 에셋들은 이 프로젝트 전용 사용을 목적으로 Pole Position Production(폴 포지션 프로덕션)에 의해 녹음, 편집 및 기부되었으며 렉페스트의 자동차 오디오 디자인과 오디오 모드 제작을 배우기 위한 목적만을 위해 제공됩니다.
이 프로젝트에 포함된 모든 내용은 Creative Commons(크리에이티브 커먼즈) 라이선스 By-NC-SA, Attribution-NonCommercial-ShareAlike(비영리-동일조건허락)에 의해 보호됩니다.
렉페스트에서 저희 디자인을 살펴보려면 Steam에서 게임을 다운로드해주세요.
오브젝트 구성 개요
Wwise에서 반복 재생 기반 엔진 설계는 Blend Container 오브젝트를 사용하여 이 컨테이너 안에 있는 Blend Track에 사운드 오브젝트를 추가함으로서 구성됩니다. 이 트랙들은 Rpm 데이터에 따라 각 하위 사운드 오브젝트의 길이와 순서를 정의합니다.
전체적으로 엔진 설계를 완료하려면 다음 작업을 완료해야 합니다.
1. 에셋을 제작하고 프로젝트 안으로 가져와서 사운드 오브젝트를 만듭니다.
2. 사운드 오브젝트가 반복 재생되며 피치를 추적하도록 구성합니다.
3. Blend Track과 사운드 오브젝트를 사용하여 Blend Container 오브젝트를 구성합니다.
4. 인접한 사운드의 재생 범위와 크로스페이드를 구성합니다.
5. Blend Track의 RTPC 오토메이션을 정의합니다.
6. 전체 Rpm 범위와 Blend Track에 따른 피치 튜닝이 일정한지 확인하고 필요에 따라 조정합니다.
다음으로 각 작업을 단계별로 실행해봅시다. 여기 있는 모든 그림들은 예시 프로젝트의 'Tutorial Engine' Work Unit에 있는 오브젝트를 참조합니다. 이 Work Unit은 튜토리얼의 실습 부분으로 사용됩니다.
사운드 오브젝트 구성
'Imported Assets' 폴더를 보면 이미 부하 실행(on-load)과 부하 해제(off-load) 반복 재생 에셋을 제작했으며 Wwise Authoring로 가져온 것이 보입니다. 이 폴더에서 오브젝트의 반복 재생을 활성화해 주세요. Multi Editor 뷰를 사용하면 편리하게 작업할 수 있습니다.
이 사운드 오브젝트의 피치가 게임 내 Rpm 시뮬레이션에 반응하도록 하려면 둘 사이의 오토메이션을 만들어야 합니다. 엔진 반복 재생 구간과 같이 여러 사운드 오브젝트간의 일정한 피치 추적 구성을 오토메이션하기 위해 Wwise는 주어진 RTPC 매개 변수 범위와 사운드 오브젝트의 피치(자연적 Rpm)에 따라 자동으로 작업을 실행할 수 있는 도구를 제공합니다.
'Demo_Idle_1170' 오브젝트를 선택하고 Property Editor의 RTPC 탭에서 Y Axis에 Voice Pitch를, X Axis에 RTPC_Player_Example을 추가하세요. 오토메이션 곡선을 우클릭하고 컨텍스트 메뉴에서 'Build Smart Pitch Curve'를 선택하세요. 이 도구의 설정 상자에서 사운드 오브젝트의 숫자 값(1170)을 입력하고 'Ok'를 클릭하세요. 그러면 다음과 같이 됩니다.
곡선이 모두 올바르게 설정되었는지 확인하기 위해서 ‘RTPC_Player_Example’ 플래그를 Y Axis가 0인 곳으로 옮겨보세요. 그러면 사운드 오브젝트의 숫자 값과 맞춰져야 합니다. 그렇지 않을 경우 ‘Build Smart Pitch Curve’ 도구를 다시 사용해 오타가 있는지 확인하세요.
작업이 끝나면 모든 사운드에 동일한 과정을 반복해줘야 합니다. 하지만 먼저 방금 만든 X-Y 매핑을 복사해서 붙여넣은 다음 각 사운드 오브젝트에 알맞은 값을 사용하여 ‘Build Smart Pitch Curve’ 도구를 다시 사용하면 작업을 더욱 빠르게 진행할 수 있습니다.
Blend Container 구성
튜토리얼을 간단하게 하기 위해 ‘Tutorial Blend Container’ 오브젝트에는 부하 실행(on-load)과 부하 해제(off-load)용 Blend Track 두 개가 이미 정의되어 있으며, 일부 RTPC 오토메이션 매핑이 설정되어 있습니다. 완전히 새로운 컨테이너를 만들려면 먼저 디자인에서 필요로 하는 수만큼 Blend Track을 추가한 다음 관련 RTPC 매핑을 정의하고 조정해야 합니다.
먼저 컨테이너에 하위 오브젝트를 구성해야 합니다. Shift + 클릭하여 ‘Imported Assets’ 아래 있는 모든 사운드 오브젝트를 선택하고 Ctrl + 클릭 + 드래그하여 컨테이너로 가져오세요. 그러면 사운드 오브젝트의 복사본이 생깁니다. 이제 컨테이너의 Contents Editor를 보세요. 여기에서는 방금 추가한 오브젝트를 알맞은 Blend Track으로 할당할 수 있습니다.
파일을 올바른 Blend Track (오브젝트의 이름에 'On'과 'Off'에 따라) 재생 목록으로 드래그하고 자연적 Rpm(공회전에서부터 최상값까지)에 따라 오름차순으로 정렬하세요. 목록의 순서는 Blend Track Editor에서 오브젝트의 순서를 정의하며 오브젝트를 드래그해서 순서를 바꿀 수 있습니다.
새로운 Blend Container를 만들 경우에는 Play Mode를 ‘Step’이나 ‘Continuous’ 중 어느 것으로 설정한 것인지를 고려하는 것이 중요합니다. 여기에서는 사운드가 무제한 반복 재생되도록 설정되었기 때문에 엔진 컨테이너를 ‘Step’ 모드로 실행할 경우 프로젝트에서 가상 보이스의 개수가 순식간에 많아질 수 있습니다. 특히 하위 오브젝트가 많은 설계를 사용하며 컨테이너의 여러 복사본이 런타임에서 인스턴스화될 경우 더욱 그렇죠.
Blend Track 구성
다음으로 Blend Track Editor 뷰로 가봅시다. 여기에서는 부하 해제와 부하 실행 Blend Track에 오토메이션이 미리 정의되어 있으며 각 Blend Track 재생 목록에 배치한 오브젝트를 나타내는 상자가 있는 것을 볼 수 있습니다. ‘Crossfade’ 옵션은 특정 용도에 맞게 활성화되어 있으며 (활성화되어야 함) RTPC_Player_Example 트랙에 지정되어 있는 것이 보입니다.
Blend Container가 ‘Continuous’ Play Mode로 구성될 경우 이 상자 경계선은 시뮬레이션 매개 변수가 주어진 경계선을 통과함에 따라 Wwise에게 각 사운드 오브젝트의 재생을 시작/중단해야 할 지점을 알려줍니다.
오브젝트 상자 간에 빈 공간이 있을 경우 RTPC 값이 이 공간 안에 있을 때 아무 사운드도 재생되지 않습니다. 이 공간은 상황에 따라 유용하게 사용할 수 있습니다. 예를 들어 사운드 오브젝트가 상위/하위 범위가 아닌 중간 Rpm 범위에서만 재생되도록 하고 싶을 경우처럼요.
상위 Rpm 오브젝트부터 시작해서 두 Blend Track에 있는 각 상자의 위치와 크기를 조정해서 자연적 Rpm 범위의 중앙에 위치하며 인접한 오브젝트와 약간씩 겹치도록 하세요. 그리고 각 상자의 좌우 끝을 우클릭하고 컨텍스트 메뉴에서 ‘Sine(Constant Power Fade In)’이나 ‘Sine (Constant Power Fade Out)’을 선택하세요.
이 유형의 가장자리 크로스페이드는 크로스페이드의 중간 지점에서 일정한 볼륨 레벨을 유지해주기 때문에 이 경우 가장 알맞습니다. 혹은 둘 다 Sine을 사용하는 대신 ‘Base 3’과 ‘S-Curve’를 함께 사용해도 비슷한 크로스페이드가 형성됩니다. 경우에 따라 Sine보다 더 매끄럽게 들릴 수 있죠.
오브젝트를 자연적 Rpm에 배치하고 가장자리의 페이드를 구성했으니 이제 각 크로스페이드의 너비를 미세 조정해봅시다. Blend Container가 재생되도록 설정한 후 ‘RTPC_Player_Load’를 1로 옮기고 부하 실행 Blend Track의 최대 Rpm부터 공회전(idle)까지 선호에 따라 너비를 조정하세요.
크로스페이드는 최대한 좁으면서 전환과 피치 조정이 여전히 매끄러운 너비가 가장 좋습니다. 사운드 오브젝트는 인접한 오브젝트 간의 음정 변경을 자연스럽게 유지하면서 자연적 Rpm에서 너무 멀리 떨어지지 않도록 하는 것이 좋습니다.
설정이 끝나면 ‘RTPC_Player_Load’를 0으로 설정하고 다시 부하 해제 Blend Track의 최대 Rpm부터 조정하세요. 마지막으로 방금 설정한 Blend Container를 ‘Engine Example Plr’의 설정과 비교해보세요. 이 설정은 동일한 반복 재생 구간을 사용하기 때문에 하위 오브젝트 배치 위치를 참조하기에 좋습니다.
여기서 한 가지 최적화 팁을 드리자면, 음원 녹음 파일을 사용해서 실행과 부하 해제 Blend Track에서 크로스페이드가 동시에 일어나지 않도록 반복 재생 에셋을 구성할 수 있는지 확인해보세요. 크로스페이드가 동시에 일어나지 않도록 하면 특히 수많은 오브젝트 인스턴스가 생겨날 때 런타임에서 활성화된 보이스의 개수를 절약할 수 있습니다.
여러 Blend Track이 동일한 Rpm 범위에서 크로스페이드할 경우 인스턴스당 Blend Track마다 활성화된 보이스의 개수가 2개나 실행되기 때문에 Tutorial 컨테이너의 경우 총 4개가 실행되게 됩니다. 마찬가지로 Blend Container에 추가하는 플러그인의 경우에도 런타임 때 각 하위 오브젝트에서 인스턴스화됩니다.
Blend Track의 RTPC 오토메이션
엔진 구성에서 이 부분은 여러분이 어떤 엔진 소리를 원하느냐에 따라 완전히 달라집니다. 새로 구성한 엔진 디자인을 작업할 경우 시뮬레이션 작동 방식을 충족하기 위해서는 보통 부하 실행과 부하 해제 레이어 사이의 전환 효과를 제어하기 위해 Load 오토메이션을 구성해야 합니다.
렉페스트 모딩 번들의 튜토리얼 문서에서 'How Engine Load Works(엔진 부하가 작동하는 법)' 챕터를 찾아 거기에서 설명한 작동 방식이 'Tutorial Blend Container'에서 세 가지 Load 상태 간에 미리 정의된 RTPC 오토메이션과 어떻게 다른지 비교해보세요. 지금 우리에겐 Wwise Authoring을 직접 렉페스트의 Steam 빌드와 연결할 수 있는 옵션이 없기 때문에 이 챕터를 읽어보면 여러분이 미리 구성된 오토메이션을 파악하는 데에 도움이 될 것입니다.
(Load에 따른) Voice Volume 오토메이션의 전반적인 모양은 작업 중인 시뮬레이션에 따라 다르지만 일반적으로 부하 해제와 부하 실행 Blend Track이 중립 부하 값의 범위를 주변으로 크로스페이드되도록 설정됩니다.
전반적인 모양이 부하 실행과 해제 작동 방식에 대해 어느 정도 정해졌다고 하더라도 볼륨 레벨과 필터링을 위해 특정 오토메이션 주요 지점을 조정할 수 있습니다. 예시 엔진을 사용해서 간단한 오토메이션 디자인을 조정해봅시다.
RTPC 시뮬레이션 값이 중립 Load와 공회전 Rpm으로 설정된 채로 부하 실행 Blend Track의 1000~2500 Rpm 사이에서 추가적인 Voice Volume 오토메이션을 찾아보세요 (위의 그림 참조). 이 부분은 이렇게 들립니다.
Blend Track의 Rpm 기반 High-Pass filter 오토메이션과 더불어 이 오토메이션은 베이스 주파수를 흐뜨러트리지 않으면서 부하 실행 반복 재생 구간에서 벨브가 덜그럭거리는 텍스처를 공회전 Rpm에서의 부하 해제 사운드와 믹싱해줍니다. 1000 Rpm(공회전) 지점에서 부하 실행 오토메이션의 볼륨을 높여보세요. 그러면 덜그럭거리는 소리가 믹스에서 더 분명해져서 자동차의 공회전 소리가 더 '마모된 것처럼' 혹은 심지어 디젤 엔진인 것처럼 들리게 해줍니다. 다음은 오디오 예시입니다.
이제 부하 실행 High-Pass filter 오토메이션을 부하 해제 Blend Track으로 복사하고 부하 실행에서 해당 오토메이션을 제거하거나 대신 Low-Pass filtering을 제어하도록 해보세요. 그런 다음 부하 실행과 부하 해제 볼륨 사이의 균형을 1000 Rpm과 중립 Load (0.5)로 조절해보세요. 부하 실행 베이스 주파수가 포함되어 있으며 전반적인 볼륨이 증가하고 하이패스된 부하 해제 사운드를 어느 정도 믹싱하면 다음과 같이 들립니다.
공회전하는 차도 이렇게 들리지 않을 정도로 소리가 꽤나 빈 것이 들리실 거예요. 이제 부하 실행 반복 재생 구간이 믹스의 주요 요소가 되어서 튜브와 같은 음색이 강해졌으며, 공회전 Rpm 시뮬레이션 값이 1000인 반면 반복 재생 구간의 자연적 Rpm은 1670이기 때문에 반복 재생 구간의 피치가 낮아진 버전을 재생하게 되어 이 음색이 더욱 강조됩니다.
이 튜브같은 음색은 녹음 세션 도중 배기관에 마이크를 근접 배치하여 녹음했고 그런(이 마이크 배치를 사용한) 레이어가 최종 에셋에 많이 믹싱되었을 확률이 높습니다. 이미 제작된 믹스가 게임 내 추적 카메라 뷰와 일치하도록 설계된 것이죠. 그런데 이제 부하 실행 레이어가 믹스의 주요 부분을 차지하도록 구성되었으니 마이크가 근접 배치된 배기관과 피치를 내린 소리가 꽤나 이상하고 부자연스러운 공회전 소리를 만들어내게 됩니다.
이런 설계적 부분은 기본 반복 재생 구간만으로 선택할 수 있는 부분입니다. 주요 지점을 조정하면 자동차의 외형과 느낌에 맞는 특성을 부여하거나, 또는 너무 지나칠 경우 제거할 수도 있죠. 하지만 오토메이션을 조정하는 것은 자동차 사운드를 독특하게 만들기 위해서뿐만이 아닙니다. 이 예시에서의 덜그럭거리는 소리의 경우 자동차가 훼손된 정도에 따라 볼륨을 높일 수도 있죠. 이렇게 하면 음색의 변화에 따라 플레이어에게 의미 있는 정보를 내포할 수 있습니다 (혹은 몰입도를 향상).
여기서 주목할 것은 에셋을 더 추가할 필요 없이 간단한 조정만으로 자동차의 공회전 사운드를 꽤나 다르게 바꿀 수 있다는 것입니다.
참고: RTPC 오토메이션이 Blend Track의 모든 오브젝트가 아니라 단일 하위 오브젝트만 변경할 경우 이 오토메이션을 오브젝트에 직접 구성해야 합니다. 앞서 추가한 자연적 Rpm에 따른 피치 추적과 비슷하게 말이죠.
완벽한 피치
가져온 에셋을 모니터링하고 구성하면서 원본 피치 추적 구성만으로는 Blend Track에서 인접한 오브젝트가 서로 튜닝이 약간씩 안맞는 경우가 생길 수 있습니다.
피치 문제는 보통 피치가 떨어지거나 Hertz-Rpm 변환으로 인해 생기는 경우가 많습니다 (제 1부 참고). Blend Track 재생이 문제 있는 크로스페이드에서 많이 머물 경우 급격한 튜닝 변화에서부터 콤 필터링으로 인한 스위핑 톤(sweeping tone)에 이르기까지 다양한 형태로 문제가 들릴 수 있습니다. 이러한 문제는 Blend Container의 Contents Editor에 있는 Voice Pitch를 조정해서 해결해야 합니다.
피치를 미세 조정하는 과정은 앞서 크로스페이드의 너비를 조정하는 작업과 비슷합니다. 부하 실행과 해제 레이어를 하나씩 들어보면서 최대~공회전 Rpm까지 작업하세요. 엔진 사운드는 보통 최고 범위에서 가장 음색이 강하기 때문에 최대 Rpm부터 시작하면 문제를 해결하기가 쉽습니다.
전반적인 미세 조정 과정에서 때때로 완전한 부하 해제와 부하 실행 사이로 RTPC 시뮬레이션 값을 전환하여 두 Blend Track 간의 피치 추적이 서로 일정한지 확인하는 것이 좋습니다. 배음 주파수 간의 라우드니스는 녹음 파일에 따라 특정 Rpm에서 변경될 수 있기 때문에 이에 따라 잘못된 주파수로 미세 조정하게 만들 수 있습니다.
이 균형 변경의 예시로, 예시 엔진을 최대 Rpm에서 3600 정도까지 재생해서 완전한 부하 실행부터 부하 해제까지의 과정을 들어보세요. 최대 Rpm에서 내려가면서 3600쯤에서 부하 해제 사운드가 부하 실행 사운드와 많이 다른 것이 들립니다. 상위 두 개의 부하 해제 에셋간의 크로스페이드에서 피치가 올바르게 추적되며 최대 Rpm에서 두 레이어 간의 음색적 균형이 근접하게 일치함에도 불구하고 말이죠.
작업 완료!
이렇게 모든 과정을 거쳐 드디어 작업이 끝났습니다!우주선이든, 자동차든, 샘플 기반 악기든, 이 튜토리얼이 여러분에게 Wwise에서의 튜닝 및 피치 추적 Blend Container 디자인 시도를 할 때 유용한 팁이 되었기를 바랍니다.
엔진 사운드 디자인을 직접 만들어 제공해보고 싶으시다면 공식 렉페스트 Discord 서버의 Modding 채널을 방문해주세요. 창의적인 엔진 사운드를 제공해서 자동차 모더들이 디자인을 완료하는 데 도움을 줄 수 있습니다. 또는 Steam Community Workshop에서 제공되는 수많은 렉페스트 자동차 모드를 커스터마이징해보세요 (이 글이 쓰여진 시점 기준으로 총 256개가 존재한답니다!).
이 튜토리얼에 대해 질문이나 더하실 말씀이 있으시다면 아래 댓글에 남겨주시거나 Wwise_Discord 서버에서 저에게 말씀해주세요. 그럼 또 뵙겠습니다!
댓글