제 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. 다음 페이지로 가서 알맞은 옵션을 클릭합니다.
2. 저는 PC에서 작업 중이기 때문에 Windows64 설치 파일을 선택했습니다.
3. Python 2.7을 C 드라이브의 루트 폴더에 설치했습니다 (이미 컴퓨터에 Python 3.7이 설치되어 있었기 때문에 Python 2.7의 .exe 파일 이름을 “python2”로 변경했습니다).
다음으로 환경 변수를 설정해 봅시다.
II.환경 변수 설정하기
1.'This PC(내 컴퓨터)'를 우클릭하고 'Properties(속성)'을 선택한 후 'Advanced system settings(고급 시스템 설정)'을 클릭합니다.
2.'Environment Variables...'를 클릭합니다.
3.아래 보이는 대로 'Path(경로)'를 더블 클릭한 후, 창의 오른쪽에 있는 'New(새 경로)'를 클릭한 후 Python 2.7과 'Scripts' 하위 폴더로의 설치 경로를 입력합니다.
이제 명령줄 도구에서 'python2'를 입력하면 Python 2.7이 실행됩니다.
III. Visual Studio 설정하기
Heavy에 의해 생성된 Wwise 데이터를 사용하여 플러그인을 제작하려면 Visual Studio(비주얼 스튜디오)를 설정해야 합니다.
1.Visual Studio를 열고 Tools 메뉴로 가서 'Get Tools and Features'를 선택합니다.
2.'Desktop development with C++' 체크 상자를 클릭합니다.
3.Visual Studio 2017을 사용할 경우 Installation Details에서 'VC++ 2015.3 v14.00’을 선택하였는지 확인하세요 (이 옵션은 기본으로 선택되지 않습니다).
다음으로 Heavy를 복제하고 설정해 봅시다.
IV. Heavy 복제 및 설정
먼저 Github에서 컴퓨터로 Heavy를 복제하거나 다운로드해야 합니다.
여기를 클릭해서 복제 혹은 다운로드해 주세요: https://github.com/enzienaudio/hvcc
1. SourceTree (소스 컨트롤 도구)로 이 주소를 복사해 넣거나 다운로드 후 ZIP 파일을 압축 해제하시면 됩니다.
2. Heavy 폴더로 이동합니다 (ZIP 파일을 사용하고 있을 경우 먼저 안에 든 파일을 추출해 주세요).
3. 위에 보이는 것처럼 초록색 원 안의 빈 공간을 클릭한 후, 'CMD'를 입력한 후 Enter 키를 누릅니다. 그러면 Windows 명령줄 도구가 Heavy 폴더에서 직접 열립니다.
이렇게 하면 주소를 직접 입력하지 않아도 됩니다.
4. 방금 Python 2를 설치했지만 이를 실행하기 위해서 Heavy는 라이브러리 파일을 필요로 합니다. 명령줄 도구에 'python2 -m pip install -r requirements.txt'를 입력해서 설치해 봅시다.
5. Heavy 코드에 있는 Wwise SDK 버전이 설치된 버전과 일치하는지 확인합니다. 그렇지 않으면 컴파일링 오류가 발생하게 됩니다.
제가 Wwise SDK 버전 2019.1.1.6977을 설치했다고 가정하고, c2wwise.py에 있는 58번째 줄의 입력값을 교체해 봅시다 (다음 이미지 상단에 있는 초록색 상자의 경로 참조).
참고: 이 부분은 Heavy 문서에서도 설명되어 있습니다.
자세한 내용은 이곳을 클릭해서 확인해 주세요: https://github.com/enzienaudio/hvcc/blob/master/generators/c2wwise/c2wwise.py#L58
6. 저는 Wwise SDK를 D 드라이브에 설치했지만, Heavy에서 제공한 VS Solution 템플릿에서처럼 SDK 설치 주소의 기본 드라이브 글자는 C입니다. 그렇기 때문에 이 부분을 변경해 주어야 합니다 (다음 이미지 상단에 있는 초록색 상자의 경로 참조).
7. 아래 보이는 경로로 이동합니다.
8. 각 vcxproj 파일을 열고 드라이브 글자를 C에서 D로 바꿉니다.
이제 플러그인을 생성할 수 있는 워크숍이 생겼습니다.
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\로 가면 다음 콘텐츠를 볼 수 있습니다.
4. wwise > vs2015로 가서 Hv_HvSampleDivider_WwiseFXPlugin.sln 파일을 더블 클릭하여 Visual Studio를 실행합니다.
5. 아래 보이는 것처럼 드롭다운 메뉴에서 'Release'를 선택합니다.
6. Build 열에서 'Build Solution'을 클릭하여 제작 과정을 시작합니다.
7. 모든 작업이 성공적으로 진행되면 아래와 같이 성공 메시지가 표시됩니다.
8. C:\Heavy_Build\HvSampleDivider\wwise\build\win\x64\release로 가서 생성된 플러그인을 확인합니다
배포
I.플러그인 배포하기
이제 이 플러그인을 저작 도구와 게임 프로젝트로 배포해야 합니다.
1. 플러그인을 저작 도구에서 사용하려면, 위에 보이는 dll과 xml 파일을 Wwise의 'plugins' 폴더로 복사합니다 (다음 이미지를 참고해 주세요).
참고: 파일 이름에 있는 'Auth' 입력란은 해당 파일이 저작 도구로 배포되어야 함을 나타냅니다.
2. 엔진 안에서 플러그인을 실행하고 게임으로 패키징하려면, 위에 있는 dll 파일을 게임 프로젝트 폴더의 'DSP' 폴더로 복사해야 합니다 (Assets->Wwise->Deployment->Plugin->Windows->x86_64->DSP).
참고: 제 데모 프로젝트에서는 안드레 카도소(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' 열에서 확인할 수 있습니다.
이제 위에서 보이는 것처럼 Wwise에서 플러그인이 보이시죠!
4. 이것을 Wwise에 Audio Object나 Audio Bus의 효과 체인에 추가합니다.
5. 플러그인을 더블 클릭하여 플러그인 인터페이스를 확인합니다. 제공되는 매개 변수가 기본값으로 설정된 것이 보입니다.
II. Game Parameter 생성 및 연결
제가 이 플러그인을 통해 성취하려는 한 가지 목표는, 게임 캐릭터가 뛰어다닐 때 음악과 환경음의 샘플 레이트를 감소하는 동시에 뛰는 소리의 볼륨은 높이는 것입니다.
그렇게 하기 위해서는 볼륨 변경을 반영할 Game Parameter를 만들어야 합니다.
1. 저는 좌우 채널의 정보를 반영할 수 있도록 뛰는 소리를 두 Sound SFX (WhooshL, WhooshR)로 나누고, 각 사운드에 Wwise Meter 플러그인을 추가해서 볼륨 엔벨로프(envelope)를 수집한 후 두 개의 다른 Game Parameter로 전송했습니다.
2. 이제 Music과 Ambience 버스에 적용한 HvSampleDivider에 대해 이 두 Game Parameter에 대한 RTPC를 만든 다음, 알맞은 곡선을 찾아야 합니다.
3. 마지막으로 게임을 패키징하고 실행해서 결과를 확인해봅시다.
Celeste 데모
다음은 게임에서 HvSampleDivider가 실제로 작동하는 모습을 보여줍니다.
참고로 제가 음악을 작곡했어요!
캐릭터가 뛰면서 음악과 환경음이 모두 변하는 것을 알아차리셨나요? 이건 Wwise만으로는 할 수 없는 효과랍니다. 굉장하지 않나요?
덧붙이는 말
지금까지 제 글을 읽어주셔서 감사합니다!
저는 가끔 이런 생각을 합니다. 이제 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~ |
댓글