많은 사운드 디자이너들이 오디오 플러그인 개발을 오디오 프로그래머의 '흑마법' 영역이라 생각합니다. 보통 코딩 기술뿐만 아니라 수학, 물리학, 디지털 신호 처리 등 사운드 디자이너에게 꼭 필요하지 않은 기술을 필요로 하기 때문이죠.
사운드 디자이너가 Wwise에서 제공되지 않는 DSP 효과를 다른 프로젝트에서 들을 경우, 아마도 이 효과가 어떻게 작동하는지 빠르게 이해하고 일반적인 도구를 사용하여 동일한 기능을 재현하는 기술적 프로토타입을 만들어낼 수 있을 겁니다. 하지만 성능에 제약이 있거나 이러한 도구의 출력을 저작 도구나 엔진 안에서의 플러그인으로 배포하기가 어렵기 때문에, 대부분의 아이디어가 프로토타입 단계에서 멈추고 실제 게임에서 활용되지 않는 경우가 많죠.
다행히 PureData(퓨어데이터)와 Heavy(헤비)라는 도구를 사용하면 저작 도구에서 사용하고 실제 게임에서 실행할 수 있는 효과나 음원 플러그인을 사운드 디자이너가 직접 제작할 수 있습니다.
PureData란 무엇인가요?
PureData (PD)는 1990년대에 밀러 퍼켓(Miller Puckette)라는 사람이 상호작용 음악 제작과 멀티미디어 작업을 위해 개발한 시각적 프로그래밍 언어입니다. PD는 오픈 소스 프로젝트이며 새로운 확장을 작업하는 대규모의 개발자 기반을 갖고 있습니다. 이제는 심지어 이 안에 VST 플러그인도 로드할 수 있죠!
PD 코드를 담은 파일은 Patch(패치)라고 부릅니다. 그리고 PD는 SubPatch(하위패치)도 지원합니다. 모듈식 코드 단위를 사용하면 사용자가 복잡한 PD 프로젝트를 만들어낼 수 있습니다.
하지만 이 글은 PD 초보자 튜토리얼이 아닙니다. 이 도구에 대해 더 알고 싶은 분들은 https://puredata.info/를 참고해 주세요.
위의 동영상에서 볼 수 있듯이 PD는 모듈식 신시사이저와 거의 동일한 방식으로 사용됩니다. 서로 다른 오브젝트를 연결하여 신호 시스템을 제작하고 매개 변수를 조절하여 실시간으로 상호작용할 수 있죠.
PD는 사운드 디자이너가 일반 도구를 사용해서 기술적 프로토타입을 제작한 후 올바른 컴파일러로 플러그인을 생성하게 해주는 '블루프린트 환경'이라고 할 수 있습니다.
Heavy는 무엇인가요?
Heavy는 Enzien Audio(엔지안 오디오)가 개발한 PD Patch 컴파일러로, 사운드 디자이너가 제작한 PD Patch를 C/C++ 코드로 변환해 줍니다. 이 도구를 사용하면 사운드 디자이너가 직접 코드를 제작할 필요 없이 PD 환경에서 대상 플랫폼에서 실행할 수 있는 코드를 생성할 수 있죠.
Heavy는 사운드 디자이너가 제작한 '블루프린트'로 무언가를 제작해 낼 수 있는 '자동 워크숍'이라고 생각하시면 됩니다.
그러면 이 도구로 무엇을 할 수 있을까요?
PD + Heavy로 제작한 플러그인으로 무엇을 할 수 있을까요?
1. 사운드 디자이너가 설계한 PD Patch를 기반으로 실시간 DSP 작동하기.
2. 오디오 입력과 출력 지원하기. 음원 Patch에 adc~ 오브젝트가 있을 경우 효과 플러그인이 생성됩니다. 이 오브젝트가 없을 경우 음원 플러그인 (예: Wwise SoundSeed Wind, Wwise SynthOne) 이 생성됩니다.
3. 제어 매개 변수의 입력과 출력 지원 제공. Wwise Sound Engine의 Game Parameter에 의해 제어되거나 Game Parameter로 데이터를 전송하여 LFO와 같은 여러 기능으로 사용될 수 있습니다.
4. UI 이벤트의 입력과 출력 지원 (Unity에만 해당).
이제 사운드 디자이너가 이러한 도구로 무엇을 할 수 있는지 알아보았으니, 이 도구로 무언가를 제작해봅시다.
Sample Divider(샘플 분리기)
Sample Divider 효과는 보통 Bitcrusher(비트크러셔)와 같은 디스토션 플러그인에 들어있습니다. 이 기능을 PD + Heavy를 사용해서 재현해봅시다.
이 효과를 재현해보려는 이유는 다음과 같습니다:
1. Wwise에는 Sample Divider 플러그인이 없습니다.
2. Sample Divider는 사실 굉장히 유용합니다. 특히 사이버펑크가 다시 인기 있어진다면요 (예를 들어 니어 오토마타나 타이탄 폴 2에서 흔히 등장하는 오작동 효과를 사용하고 싶다면 Sample Divider 없이 어떻게 이 효과를 낼 수가 있을까요?).
걱정 없는 DSP 처리
Patch 파일을 사용해서 '블루프린트'를 제작하기 전에 먼저 Sample Divider가 어떻게 작동하는지 이해해야 합니다.
Sample Divider는 원래의 샘플 레이트(표본화율)보다 낮은 주파수로 입력 신호를 다시 샘플링한 후 보다 낮은 출력 음질로 원본 신호를 왜곡합니다.
다음 이미지는 Sample and Hold (S/H) 모듈이 작동하는 방식을 보여줍니다 (밀러 퍼켓의 '전자 음악의 이론과 기술'에서 가져옴).
입력 신호
샘플 클록
샘플 출력
S/H 모듈
위의 이미지에서는 정현파 신호가 S/H 모듈의 IN 지점으로 전송되며, 톱니파 신호가 Sample & Hold 작업을 트리거 하기 위해 OUT 지점으로 전송됩니다. 톱니파 값이 0으로 떨어지면, S/H 오브젝트가 남은 시간 동안 샘플값을 그대로 유지하면서 입력 신호를 다시 샘플링하도록 트리거 합니다. 이렇게 하면 톱니파 주파수가 입력 신호의 샘플 레이트와 비슷해져서 출력 신호가 입력 신호와 비슷해집니다. 그렇지 않으면 디스토션이 더 심하게 되죠.
다음은 VCVRack (물리적 신시사이저와 비슷함)에서 S/H 모듈이 작동하는 방식을 보여줍니다.
블루프린트 제작하기
이제 S/H 모듈이 작동하는 방식을 알아보았으니 Patch 파일을 사용해서 '블루프린트'를 제작해봅시다.
Heavy로 Patch 파일을 올바르게 컴파일하기 위해서는 지원되는 PD 오브젝트만 사용해야 합니다. 그렇지 않으면 컴파일 오류가 생기게 됩니다. Heavy가 지원하지 않는 PD 오브젝트의 목록은 제 2부에서 알려드리겠습니다.
대상 플랫폼 (이 경우 Wwise)에서 매개 변수가 보이도록 하기 위해서는 다음 방식으로 매개 변수를 선언해야 합니다.
- PD에서 Ctrl+1을 눌러 오브젝트를 생성하고 'r SampleRateDivisionL @hv_param 4 24000 24000'을 입력합니다.
- 'r'은 PD 밖에서 정보를 수신하는 오브젝트를 나타냅니다.
- SampleRateDivisionL이 플러그인 UI에서 매개 변수 이름을 표시합니다.
- '@hv_param'은 이 오브젝트가 Heavy에 의해 인터페이스 매개 변수로 컴파일될 것을 의미합니다.
- 4, 24000, 24000은 최소, 최대, 기본 매개 변수 값입니다.
r은 이 오브젝트가 외부에서 매개 변수 값을 수신함을 의미합니다.
(필수) @hv-param은 입력/출력값이 매개 변수임을 의미합니다. @hv_event는 이 매개 변수가 이벤트임을 의미합니다.
SampleRateDivisionL은 Wwise 안의 플러그인 UI에서 매개 변수 이름을 표시해 줍니다.
최소값
최대값
기본값
1. 좌우 채널에서 입력 신호를 개별적으로 처리하여 더 비대칭적으로 만들기 위해서 각 채널에 매개 변수를 만들어봅시다.
- phasor~ 오브젝트는 샘플 클록으로 사용되는 톱니파 발진기입니다.
- samphold~ 오브젝트는 S/H 모듈 자체입니다.
- dac~ 오브젝트는 오디오 신호가 출력되는 대상입니다.
참고: 이 Patch에서 adc~는 입력 신호를 말합니다. 음원 Patch에 adc~ 오브젝트가 들어있을 경우 효과 플러그인이 생성되며, 그렇지 않을 경우 음원 플러그인이 생성됩니다.
2. Patch 코드가 작동하는 방식을 살펴봅시다.
참고: 샘플 레이트를 제어하기 위해 hslider 오브젝트를 추가했습니다. 플러그인을 생성한 후에는 이 오브젝트가 불필요하기 때문에 꼭 제거해 주세요.
3. 이 Patch 파일을 J:\HeavyAudioPlayground\bitcrusher.pd로 저장하세요.
이제 '블루프린트'가 생겼습니다. 이 블로그의 제 2부에서는 Heavy 컴파일러를 사용하여 '자동 워크숍'을 제작하고 이 워크숍을 사용하여 플러그인을 생성하고 게임에 배포하는 법을 알아보겠습니다. 기대해 주세요!
이 블로그는 중국어에서 영어로 번역되었으며, 그 후 한글로 번역되었습니다.
댓글