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

사운드 디자인 / Wwise에 대한 팁과 도구

 

많은 사운드 디자이너들이 오디오 플러그인 개발을 오디오 프로그래머의 '흑마법' 영역이라 생각합니다. 보통 코딩 기술뿐만 아니라 수학, 물리학, 디지털 신호 처리 등 사운드 디자이너에게 꼭 필요하지 않은 기술을 필요로 하기 때문이죠. 

사운드 디자이너가 Wwise에서 제공되지 않는 DSP 효과를 다른 프로젝트에서 들을 경우, 아마도 이 효과가 어떻게 작동하는지 빠르게 이해하고 일반적인 도구를 사용하여 동일한 기능을 재현하는 기술적 프로토타입을 만들어낼 수 있을 겁니다. 하지만 성능에 제약이 있거나 이러한 도구의 출력을 저작 도구나 엔진 안에서의 플러그인으로 배포하기가 어렵기 때문에, 대부분의 아이디어가 프로토타입 단계에서 멈추고 실제 게임에서 활용되지 않는 경우가 많죠.

다행히 PureData(퓨어데이터)와 Heavy(헤비)라는 도구를 사용하면 저작 도구에서 사용하고 실제 게임에서 실행할 수 있는 효과나 음원 플러그인을 사운드 디자이너가 직접 제작할 수 있습니다.

PureData란 무엇인가요?

image001

PureData (PD)는 1990년대에 밀러 퍼켓(Miller Puckette)라는 사람이 상호작용 음악 제작과 멀티미디어 작업을 위해 개발한 시각적 프로그래밍 언어입니다. PD는 오픈 소스 프로젝트이며 새로운 확장을 작업하는 대규모의 개발자 기반을 갖고 있습니다. 이제는 심지어 이 안에 VST 플러그인도 로드할 수 있죠!

PD 코드를 담은 파일은 Patch(패치)라고 부릅니다. 그리고 PD는 SubPatch(하위패치)도 지원합니다. 모듈식 코드 단위를 사용하면 사용자가 복잡한 PD 프로젝트를 만들어낼 수 있습니다.

하지만 이 글은 PD 초보자 튜토리얼이 아닙니다. 이 도구에 대해 더 알고 싶은 분들은 https://puredata.info/를 참고해 주세요.

 

'Hello World'의 PD 버전 (중국어를 원하시면 여기를 클릭하여 동영상을 시청하세요)

 

위의 동영상에서 볼 수 있듯이 PD는 모듈식 신시사이저와 거의 동일한 방식으로 사용됩니다. 서로 다른 오브젝트를 연결하여 신호 시스템을 제작하고 매개 변수를 조절하여 실시간으로 상호작용할 수 있죠.

PD는 사운드 디자이너가 일반 도구를 사용해서 기술적 프로토타입을 제작한 후 올바른 컴파일러로 플러그인을 생성하게 해주는 '블루프린트 환경'이라고 할 수 있습니다.

image004마치 레고 블록으로 흥미로운 것들을 제작하는 것과 같죠

 

Heavy는 무엇인가요?

Heavy는 Enzien Audio(엔지안 오디오)가 개발한 PD Patch 컴파일러로, 사운드 디자이너가 제작한 PD Patch를 C/C++ 코드로 변환해 줍니다. 이 도구를 사용하면 사운드 디자이너가 직접 코드를 제작할 필요 없이 PD 환경에서 대상 플랫폼에서 실행할 수 있는 코드를 생성할 수 있죠.

Heavy는 사운드 디자이너가 제작한 '블루프린트'로 무언가를 제작해 낼 수 있는 '자동 워크숍'이라고 생각하시면 됩니다.

image006

그러면 이 도구로 무엇을 할 수 있을까요?

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(샘플 분리기)

 

image008래스터화(rasterized) 효과의 오디오 버전이라고 할 수 있습니다

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) 모듈이 작동하는 방식을 보여줍니다 (밀러 퍼켓의 '전자 음악의 이론과 기술'에서 가져옴).

image009입력 신호
샘플 클록
샘플 출력

S/H 모듈

위의 이미지에서는 정현파 신호가 S/H 모듈의 IN 지점으로 전송되며, 톱니파  신호가 Sample & Hold 작업을 트리거 하기 위해 OUT 지점으로 전송됩니다. 톱니파 값이 0으로 떨어지면, S/H 오브젝트가 남은 시간 동안 샘플값을 그대로 유지하면서 입력 신호를 다시 샘플링하도록 트리거 합니다. 이렇게 하면 톱니파 주파수가 입력 신호의 샘플 레이트와 비슷해져서 출력 신호가 입력 신호와 비슷해집니다. 그렇지 않으면 디스토션이 더 심하게 되죠.

다음은 VCVRack (물리적 신시사이저와 비슷함)에서 S/H 모듈이 작동하는 방식을 보여줍니다.

SCOPE를 사용하여 계단 모앙을 만드는 법 (중국어를 원하시면 여기를 클릭하여 동영상을 시청하세요)

블루프린트 제작하기

이제 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은 최소, 최대, 기본 매개 변수 값입니다.

image014

r은 이 오브젝트가 외부에서 매개 변수 값을 수신함을 의미합니다.
(필수) @hv-param은 입력/출력값이 매개 변수임을 의미합니다. @hv_event는 이 매개 변수가 이벤트임을 의미합니다.
SampleRateDivisionL은 Wwise 안의 플러그인 UI에서 매개 변수 이름을 표시해 줍니다.
최소값
최대값
기본값

1. 좌우 채널에서 입력 신호를 개별적으로 처리하여 더 비대칭적으로 만들기 위해서 각 채널에 매개 변수를 만들어봅시다.

  • phasor~ 오브젝트는 샘플 클록으로 사용되는 톱니파 발진기입니다.
  • samphold~ 오브젝트는 S/H 모듈 자체입니다.
  • dac~ 오브젝트는 오디오 신호가 출력되는 대상입니다.

image015

참고: 이 Patch에서 adc~는 입력 신호를 말합니다. 음원 Patch에 adc~ 오브젝트가 들어있을 경우 효과 플러그인이 생성되며, 그렇지 않을 경우 음원 플러그인이 생성됩니다.

2. Patch 코드가 작동하는 방식을 살펴봅시다.

 

참고: 샘플 레이트를 제어하기 위해 hslider 오브젝트를 추가했습니다. 플러그인을 생성한 후에는 이 오브젝트가 불필요하기 때문에 꼭 제거해 주세요.

3. 이 Patch 파일을 J:\HeavyAudioPlayground\bitcrusher.pd로 저장하세요.

image019

이제 '블루프린트'가 생겼습니다. 이 블로그의 제 2부에서는 Heavy 컴파일러를 사용하여 '자동 워크숍'을 제작하고 이 워크숍을 사용하여 플러그인을 생성하고 게임에 배포하는 법을 알아보겠습니다. 기대해 주세요!

 

이 블로그는 중국어에서 영어로 번역되었으며, 그 후 한글로 번역되었습니다.
 

 

천종 호우 (Chenzhong Hou)

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

천종 호우 (Chenzhong Hou)

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

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

댓글

댓글 달기

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

다른 글

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

이 글에서는 UI 디자이너*의 관점에서 UI 오디오에 접근하는 방식을 보여드리려고 합니다. 이를 통해 심미적으로나 기능적으로 화합적인 UI를 제작하는 데에 도움이 되었으면 합니다....

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

누구나 사용할 수 있는 WAAPI - 제 1부: 개요

안녕하세요. 저는 왕양 (汪洋) 이라고 합니다 (혹은 ‘씨 예’, 溪夜라고도 불립니다). 저는 작년 하반기에 WAAPI에 대해 알게 되었습니다 (Wwise 저작 API). 저같이...

30.3.2021 - 작성자: 토마스 왕 (THOMAS WANG, 汪洋)

Wwise 2022.1에서의 SDK 런타임 성능 개선

이 글에서는 Wwise 2022.1의 런타임에서 CPU 사용량에 대한 몇 가지 개선 사항을 살펴보게...

5.12.2022 - 작성자: 데이비드 크룩스 (David Crooks)

Wwise를 사용한 반복 재생 기반 자동차 엔진음 디자인 | 제 1부

이 시리즈에서는 Wwise Authoring과 오디오 및 자동차 전문 지식을 알맞게 사용해서 간단한 반복 재생 기반 자동차 엔진 사운드를 디자인하는 방법을 살펴보려고 합니다! ...

18.4.2023 - 작성자: 아르토 코이비스토 (Arto Koivisto)

Wwise 2024.1 새로운 기능

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

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

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

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

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

다른 글

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

이 글에서는 UI 디자이너*의 관점에서 UI 오디오에 접근하는 방식을 보여드리려고 합니다. 이를 통해 심미적으로나 기능적으로 화합적인 UI를 제작하는 데에 도움이 되었으면 합니다....

누구나 사용할 수 있는 WAAPI - 제 1부: 개요

안녕하세요. 저는 왕양 (汪洋) 이라고 합니다 (혹은 ‘씨 예’, 溪夜라고도 불립니다). 저는 작년 하반기에 WAAPI에 대해 알게 되었습니다 (Wwise 저작 API). 저같이...

Wwise 2022.1에서의 SDK 런타임 성능 개선

이 글에서는 Wwise 2022.1의 런타임에서 CPU 사용량에 대한 몇 가지 개선 사항을 살펴보게...