사운드 디자이너가 PureData + Heavy를 사용하여 DSP 플러그인을 개발하는 법 - 제 2부

게임 오디오 / 사운드 디자인

제 1부에서는 Patch 파일을 사용하여 '블루프린트'를 제작하는 법을 설명해 드렸습니다. 이제 Heavy 컴파일러를 사용하여 '자동 워크숍'을 제작한 후, 이 자동 워크숍을 사용하여 플러그인을 생성해서 게임에 배포하는 법을 살펴봅시다.

왜 워크숍을 제작할까요?

기존의 Heavy 컴파일러 환경은 웹을 기반으로 하기 때문에 Patch 파일을 온라인으로 제출할 수 있습니다. 그러면 Heavy 컴파일러가 컴파일링 보고를 반환해 주며 코드와 플러그인을 다운로드할 수 있는 링크가 제공되죠.

하지만 Enzien Audio가 작년에 Heavy를 오픈 소스로 만들었기 때문에 로컬로 사용하기 위해 컴파일러 코드를 복제해야 합니다. 그래서 제가 이 과정을 '워크숍 제작하기'라고 부르는 것입니다. 그렇지 않으면 ' 급행 소포 받기'라고 설명될 테니까요.

계속하기 전에 먼저 Wwise SDK 버전이 설치되었는지 확인해 주세요. 저는 SDK 2019.1.1.6977 버전을 사용하고 있습니다.

I. Python 2 다운로드 및 설치하기

Heavy를 실행하려면 먼저 Python(파이썬) 2.7을 다운로드해야 합니다.

여기를 클릭해서 다운로드해 주세요: https://www.python.org/downloads/release/python-2716/

1. 다음 페이지로 가서 알맞은 옵션을 클릭합니다.

image001

2. 저는 PC에서 작업 중이기 때문에 Windows64 설치 파일을 선택했습니다.

image002

3. Python 2.7을 C 드라이브의 루트 폴더에 설치했습니다 (이미 컴퓨터에 Python 3.7이 설치되어 있었기 때문에 Python 2.7의 .exe 파일 이름을 “python2”로 변경했습니다).

image003

다음으로 환경 변수를 설정해 봅시다.

II.환경 변수 설정하기

1.'This PC(내 컴퓨터)'를 우클릭하고 'Properties(속성)'을 선택한 후 'Advanced system settings(고급 시스템 설정)'을 클릭합니다.

image004

2.'Environment Variables...'를 클릭합니다.

image005

3.아래 보이는 대로 'Path(경로)'를 더블 클릭한 후, 창의 오른쪽에 있는 'New(새 경로)'를 클릭한 후 Python 2.7과 'Scripts' 하위 폴더로의 설치 경로를 입력합니다.

image006

이제 명령줄 도구에서 'python2'를 입력하면 Python 2.7이 실행됩니다.

III. Visual Studio 설정하기

Heavy에 의해 생성된 Wwise 데이터를 사용하여 플러그인을 제작하려면 Visual Studio(비주얼 스튜디오)를 설정해야 합니다.

1.Visual Studio를 열고 Tools 메뉴로 가서 'Get Tools and Features'를 선택합니다.

image007

2.'Desktop development with C++' 체크 상자를 클릭합니다.

image008

3.Visual Studio 2017을 사용할 경우 Installation Details에서 'VC++ 2015.3 v14.00’을 선택하였는지 확인하세요 (이 옵션은 기본으로 선택되지 않습니다).

image009

다음으로 Heavy를 복제하고 설정해 봅시다.

IV. Heavy 복제 및 설정

먼저 Github에서 컴퓨터로 Heavy를 복제하거나 다운로드해야 합니다.

여기를 클릭해서 복제 혹은 다운로드해 주세요: https://github.com/enzienaudio/hvcc

1. SourceTree (소스 컨트롤 도구)로 이 주소를 복사해 넣거나 다운로드 후 ZIP 파일을 압축 해제하시면 됩니다.

image010

2. Heavy 폴더로 이동합니다 (ZIP 파일을 사용하고 있을 경우 먼저 안에 든 파일을 추출해 주세요).

image011

3. 위에 보이는 것처럼 초록색 원 안의 빈 공간을 클릭한 후, 'CMD'를 입력한 후 Enter 키를 누릅니다. 그러면 Windows 명령줄 도구가 Heavy 폴더에서 직접 열립니다.

image012

이렇게 하면 주소를 직접 입력하지 않아도 됩니다.

4. 방금 Python 2를 설치했지만 이를 실행하기 위해서 Heavy는 라이브러리 파일을 필요로 합니다. 명령줄 도구에 'python2 -m pip install -r requirements.txt'를 입력해서 설치해 봅시다.

image013

5.  Heavy 코드에 있는 Wwise SDK 버전이 설치된 버전과 일치하는지 확인합니다. 그렇지 않으면 컴파일링 오류가 발생하게 됩니다.

제가 Wwise SDK 버전 2019.1.1.6977을 설치했다고 가정하고, c2wwise.py에 있는 58번째 줄의 입력값을 교체해 봅시다 (다음 이미지 상단에 있는 초록색 상자의 경로 참조).

image014

참고: 이 부분은 Heavy 문서에서도 설명되어 있습니다.

자세한 내용은 이곳을 클릭해서 확인해 주세요:  https://github.com/enzienaudio/hvcc/blob/master/generators/c2wwise/c2wwise.py#L58

6.  저는 Wwise SDK를 D 드라이브에 설치했지만, Heavy에서 제공한 VS Solution 템플릿에서처럼 SDK 설치 주소의 기본 드라이브 글자는 C입니다. 그렇기 때문에 이 부분을 변경해 주어야 합니다 (다음 이미지 상단에 있는 초록색 상자의 경로 참조).

7. 아래 보이는 경로로 이동합니다.

image015

8. 각 vcxproj 파일을 열고 드라이브 글자를 C에서 D로 바꿉니다.

image016

이제 플러그인을 생성할 수 있는 워크숍이 생겼습니다.

V. Heavy 제작 파이프라인 실행하기

이제 가장 흥미로운 부분을 시작해 볼까요!

1. 이전에 말씀드린 것처럼 Heavy의 주소 바에 'CMD'를 입력하여 명령줄을 연 후 'python2 hvcc.py J:\HeavyAudioPlayground\bitcrusher.pd -n HvSampleDivider -o C:\Heavy_Build\HvSampleDivider\ -g wwise'를 입력합니다.

  • J:\HeavyAudioPlayground\bitcrusher.pd는 우리가 아까 생성한 Patch 파일로의 경로입니다.
  • -n HvSampleDivider는 생성된 플러그인의 이름을 'HvSampleDivider'로 변경합니다. 그렇지 않으면 'Heavy'라는 기본 이름을 사용합니다.
  • -o C:\Heavy_Build\HvSampleDivider\는 컴파일된 에셋으로의 출력 경로입니다 (필요한 경우 이 경로를 지정할 수 있습니다).
  • -g wwise는 Heavy가 Wwise 플러그인을 제작하는 데이터를 생성하고 있음을 나타냅니다. Heavy는 다른 플랫폼도 지원합니다.

참고: Heavy 사용법에 대한 더 자세한 정보는 여기에서 설명한 Usage 섹션을 참고해 주세요.

2. Enter를 누릅니다. 보고된 오류가 없으면 Heavy가 컴파일링을 완료합니다.

3. C:\Heavy_Build\HvSampleDivider\로 가면 다음 콘텐츠를 볼 수 있습니다.

image017

4. wwise > vs2015로 가서 Hv_HvSampleDivider_WwiseFXPlugin.sln 파일을 더블 클릭하여 Visual Studio를 실행합니다.

image018

5. 아래 보이는 것처럼 드롭다운 메뉴에서 'Release'를 선택합니다.

image019

6. Build 열에서 'Build Solution'을 클릭하여 제작 과정을 시작합니다.

image020

7. 모든 작업이 성공적으로 진행되면 아래와 같이 성공 메시지가 표시됩니다.

image021

8. C:\Heavy_Build\HvSampleDivider\wwise\build\win\x64\release로 가서 생성된 플러그인을 확인합니다

image022

배포

I.플러그인 배포하기

이제 이 플러그인을 저작 도구와 게임 프로젝트로 배포해야 합니다.

image023

1.  플러그인을 저작 도구에서 사용하려면, 위에 보이는 dll과 xml 파일을 Wwise의 'plugins' 폴더로 복사합니다 (다음 이미지를 참고해 주세요).

image024

참고: 파일 이름에 있는 'Auth' 입력란은 해당 파일이 저작 도구로 배포되어야 함을 나타냅니다.

image025

2. 엔진 안에서 플러그인을 실행하고 게임으로 패키징하려면, 위에 있는 dll 파일을 게임 프로젝트 폴더의 'DSP' 폴더로 복사해야 합니다 (Assets->Wwise->Deployment->Plugin->Windows->x86_64->DSP).

image026

참고: 제 데모 프로젝트에서는 안드레 카도소(André Cardoso)가 제작한 프로젝트를 사용했습니다. Mix and Jam이라는 YouTube 채널로 가면 안드레가 제작한 훌륭한 동영상을 감상하실 수 있어요. 강력 추천합니다!

그리고 플러그인을 UE4로 배포하는 법을 알고 싶으시다면 사운드 디자이너 데릭 레이예스(Derrick Reyes)의  YouTube 채널을 확인해 주세요.

3. Wwise를 엽니다.

Patch 파일에 adc~ 오브젝트를 추가했기 때문에 Heavy가 음원 플러그인이 아닌 효과 플러그인을 생성하게 됩니다. 이 플러그인은 Sound SFX > Contents Editor의 Add Source 메뉴가 아니라 Audio Object나 Audio Bus의 'Effect' 열에서 확인할 수 있습니다.

image027

이제 위에서 보이는 것처럼 Wwise에서 플러그인이 보이시죠!

4. 이것을 Wwise에 Audio Object나 Audio Bus의 효과 체인에 추가합니다.

image028

5. 플러그인을 더블 클릭하여 플러그인 인터페이스를 확인합니다. 제공되는 매개 변수가 기본값으로 설정된 것이 보입니다.

image029

II. Game Parameter 생성 및 연결

제가 이 플러그인을 통해 성취하려는 한 가지 목표는, 게임 캐릭터가 뛰어다닐 때 음악과 환경음의 샘플 레이트를 감소하는 동시에 뛰는 소리의 볼륨은 높이는 것입니다.

그렇게 하기 위해서는 볼륨 변경을 반영할 Game Parameter를 만들어야 합니다.

1. 저는 좌우 채널의 정보를 반영할 수 있도록 뛰는 소리를 두 Sound SFX (WhooshL, WhooshR)로 나누고, 각 사운드에 Wwise Meter 플러그인을 추가해서 볼륨 엔벨로프(envelope)를 수집한 후 두 개의 다른 Game Parameter로 전송했습니다.

image030

2. 이제 Music과 Ambience 버스에 적용한 HvSampleDivider에 대해 이 두 Game Parameter에 대한 RTPC를 만든 다음, 알맞은 곡선을 찾아야 합니다.

image031

3. 마지막으로 게임을 패키징하고 실행해서 결과를 확인해봅시다.

Celeste 데모

다음은 게임에서 HvSampleDivider가 실제로 작동하는 모습을 보여줍니다.

참고로 제가 음악을 작곡했어요!

 

캐릭터가 뛰면서 음악과 환경음이 모두 변하는 것을 알아차리셨나요? 이건 Wwise만으로는 할 수 없는 효과랍니다. 굉장하지 않나요?

덧붙이는 말

image033

지금까지 제 글을 읽어주셔서 감사합니다!

저는 가끔 이런 생각을 합니다. 이제 Max4Live가 있으니 PD4Wwise가 있을 수는 없는 걸까요?

Heavy 컴파일러 파이프라인을 Wwise로 통합할 수 있을까요? 마치 테크니컬 비주얼 아티스트가 셰이더를 만드는 것처럼, PD를 사용하여  Wwise에서 플러그인과 같은 오디오 에셋을 만드는 것이 사운드 디자이너들에게 더 쉽지 않을까요? 그렇다면 그들만의 HLSL이 필요하겠죠!

과연 어떻게 될지 기다려봅시다!

작은 깜짝 선물

아 참, 이 데모에서 음악을 제외한 모든 사운드는 SynthOne에서 음원으로 제작되었습니다.

저는 오랜 시간 동안 이런 의문을 가졌어요. 이제 SynthOne이 있으니 SynthTwo나 SynthThree도 생길 수 있으려나?

이제 제가 직접 만들어볼 수 있게 되었죠!

FMOne을 감상해보세요!

 

부록 - Heavy가 지원하지 않는 PD 오브젝트

이 오브젝트는 블루프린트를 만들 때 사용하지 않아야 합니다. 그렇지 않으면 컴파일링 오류가 발생하게 됩니다.

makefilename polytouchout netreceive fft~ print~ filledpolygon setsize pd~
value midiout glist iff~ delread4~ drawtext append stdout
list stripenote textfile rfft~ pd drawsymbol scalar rev1~
cputime oscparse text rifft~ clone plot sigmund~ rev2~
realtime oscformat openpanel log~ block~ drawnumber bonk~ rev3~
expr fudiparse savepanel framp~ switch pointer choice bob~
midiin fudiformat bag vline~ struct get hilbert~ scope~
polytouchin array key bang~ drawcurve set complex-mod~ namecanvas
sysexin savestate keyup readsf~ filledcurve element loop~ template
midirealtimein netsend keyname writesf~ drawpolygon getsize lrshift~  

천종 호우 (Chenzhong Hou)

제품 전문, 개발자 관계 - 대중화권

천종 호우 (Chenzhong Hou)

제품 전문, 개발자 관계 - 대중화권

천종 호는 사운드 디자이너 겸 작곡가 및 음악 기술 연구자입니다. Ubisoft Shanghai(유비소프트 상하이)에서 일한 경력이 있으며 저스트 댄스(Just Dance)와 파 크라이(Far Cry) 시리즈의 사운드 디자인에 참여했습니다. 현재 Audiokinetic(오디오키네틱)의 대중화권에서 제품 전문가로 활동하고 있습니다.

댓글

댓글 달기

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

다른 글

머더러스 퍼수츠(Murderous Pursuits)의 대사와 대화 설계 - 제 2부

안녕하세요, 머더러스 퍼수츠의 대화와 대사 시스템의 제 2부로 다시 돌아온 제이미입니다. 제 1부를 아직 보지 않으셨다면 여기를 클릭하여 읽어주세요! 제 1부에서는 게임에서의...

20.5.2020 - 작성자: 제이미 크로스(JAIME CROSS)

합성 만으로 빗소리 만들기

몇 년 전 저는 원하는 모든 사운드를 합성할 수 있을까 하는 궁금증이 생겼습니다. 바람, 새의 노랫소리, 곤충 소리 등 다양한 자연 소리를 합성하기 시작했죠. 이런 작업에서는...

3.9.2020 - 작성자: 알렉산더 킬코(ALEKSANDR KHILKO)

UI 설계 관점에서 UI 오디오 접근하기 - 제 1부

어떤 게임에서는 사용자 인터페이스가 플레이어의 전체 경험에 궁극적으로 영향을 거의 미치지 않습니다. 수많은 모바일 게임과 같이 어떤 게임에서는 거의 전체 게임플레이 동안 UI를...

14.10.2020 - 작성자: 조셉 마척(JOSEPH MARCHUK)

아우터 월드(Outer Worlds)의 사운드: 제 2부

아우터 월드(Outer Worlds)의 사운드를 심층적으로 알아보는 블로그 제 2부에 오신 것을 환영합니다!...

12.1.2021 - 작성자: 옵시디언 엔터테인먼트 (Obsidian Entertainment)

Wwise Unity 커닝 페이퍼

Wwise Unity 통합에 대해 말해봅시다. 언제든지 참조할 수 있는 수년간 제작된 교육 자료가 꽤나 많습니다. Audiokinetic 교육 자료로 말하자면 Youtube에도...

2.2.2021 - 작성자: 매스 마라티 소노로 (MADS MARETTY SØNDERUP)

가상 현실을 위한 훌륭한 잔향 제작하기

이 시리즈에서는 과거, 현재, 그리고 새로운 잔향 기술을 집중적으로 살펴보고 몰입적 공간적 관점에서 이 기술을 검토해봅니다. 이전 글에서 저희는 왜 가상 현실에서 몰입적인 잔향을...

17.2.2021 - 작성자: 브누아 알라리 (BENOIT ALARY)

다른 글

머더러스 퍼수츠(Murderous Pursuits)의 대사와 대화 설계 - 제 2부

안녕하세요, 머더러스 퍼수츠의 대화와 대사 시스템의 제 2부로 다시 돌아온 제이미입니다. 제 1부를 아직 보지 않으셨다면 여기를 클릭하여 읽어주세요! 제 1부에서는 게임에서의...

합성 만으로 빗소리 만들기

몇 년 전 저는 원하는 모든 사운드를 합성할 수 있을까 하는 궁금증이 생겼습니다. 바람, 새의 노랫소리, 곤충 소리 등 다양한 자연 소리를 합성하기 시작했죠. 이런 작업에서는...

UI 설계 관점에서 UI 오디오 접근하기 - 제 1부

어떤 게임에서는 사용자 인터페이스가 플레이어의 전체 경험에 궁극적으로 영향을 거의 미치지 않습니다. 수많은 모바일 게임과 같이 어떤 게임에서는 거의 전체 게임플레이 동안 UI를...