오디오 모듈레이션 개요

언리얼 엔진의 오디오 모듈레이션 플러그인에 대해 살펴봅니다

Choose your operating system:

Windows

macOS

Linux

오디오 모듈레이션(Audio Modulation) 시스템은 블루프린트 및 컴포넌트 시스템으로부터 일반적인 부동 소수점 오디오 파라미터에 대한 제어를 제공합니다. 이 시스템에는 오디오 소스 믹스, 동적 제어 및 오디오 프로퍼티 파라미터화 측면에서 이전 버전의 언리얼 엔진 보다 한층 개선되고 보다 직관적이며 동적인 기능 서브세트가 포함되어 있습니다.

시스템:

  • 일반적이고, 유연하며, 분리된 일반 파라미터 모듈레이션 및 믹스 시스템을 노출합니다.

  • 게임 믹스 오디션 및 디버깅을 위한 강력한 툴세트를 구현합니다.

  • 플러그인을 통해 소스, 이펙트, 서브믹스 및 그 외 다양한 오디오 타입의 추가 모듈레이션을 손쉽게 확장 및 사용할 수 있도록 지원하는 API를 제공합니다.

오디오 모듈레이션은 언리얼 오디오 엔진 내 모든 플로트 또는 버퍼 기반의 파라미터를 가상으로 모듈레이션하도록 하는 강력한 기능입니다. 가장 기본적인 형태의 모듈레이션에서는 모듈레이션 소스를 모듈레이션 대상에 연결할 수 있습니다. 아무런 소스도 참조되지 않은 경우 디폴트 값모듈레이션 파라미터에서 디폴트 모듈레이션 대상 값으로 제공된 값(모듈레이션 소스 및 믹스 스테이지 참고)과 믹스됩니다. 이 시나리오는 기존 하드웨어 패치 케이블을 모듈레이션 입력에 연결하는 것으로 생각할 수 있으며, 출력의 끝은 지면 또는 전원과 같이 알려진 수량에 연결됩니다.

오디오 모듈레이션 활성화하기

모든 모듈레이션 기능은 오디오 모듈레이션 플러그인에 캡슐화되어 가벼운 엔진 측 API를 구현합니다.

오디오 모듈레이션 플러그인을 활성화하려면 편집(Edit) > 플러그인(Plugin) 으로 이동하여 왼쪽 패널에서 오디오(Audio) 를 클릭하고 오디오 모듈레이션에 대해 활성화됨(Enabled) 을 체크합니다.

플러그인을 활성화하고 에디터를 재시작하거나 Visual Studio를 리빌드하면 언리얼 엔진 오디오 모듈레이션 시스템의 언리얼 네이티브 구현이 활성화됩니다.

모듈레이션 값

모든 모듈레이션 값은 유닛 값 공간과 정규화 값 공간이라는 두 공간 사이에 트랜스폼될 수 있습니다. 유닛 공간은 에디터에서 편의를 위해 표시 및 제공되는 반면, 정규화 공간은 버스 값을 균등하게 전달 및 믹스할 수 있게 해줍니다. 모든 모듈레이션 값은 정규화된 [0.0f, 1.0f] 범위에 매핑됩니다. 하드웨어 신디사이저가 소스에서 대상으로 값을 전달하기 위한 표준으로 제어 전압(CV)을 사용하는 것과 유사한 방식으로 모듈레이션 시스템은 항상 정규화된 부동 소수점 내에 값을 포함하는 컨트롤 버스(Control Bus) 를 사용합니다.

볼륨의 경우, 유닛 공간은 -60dB(무음 한계치, 모듈레이션 파라미터를 통해 환경설정 가능)에서 0dB(최대 볼륨)의 범위를 가질 수 있으며, 여기에서 정규화된 값은 0.0f 및 1.0f의 정규화된 공간에 대수적으로 매핑됩니다. 세미톤은 유닛 공간에서 +/-의 최솟값/최댓값을 각각의 모듈레이션 파라미터 세팅에서 환경설정 가능한 또 한 가지 예시입니다. 정규화된 공간은 항상 0.0f와 1.0f 사이에 매핑됩니다. 가장 기본적인 경우, 유닛과 값 공간은 동일합니다. 즉, 모든 유닛 값은 0.0f와 1.0f 사이의 동일한 정규화 값에 해당합니다.

모듈레이션 파라미터

모듈레이션 파라미터 는 버스, 버스 믹스, 대상 및 패치와 관련된 값이 유닛 및 정규화된(유닛 없음) [0.0, 1.0] 값으로부터/값으로 표시, 믹스 및 트랜스폼되는 방식에 대한 컨텍스트를 제공합니다. 여기에는 모듈레이션 파라미터를 참조하는 모든 모듈레이터에 유닛 표시 방식을 지시하는 유닛 표시명(Unit Display Name) 프로퍼티와 디폴트 파라미터 값이 포함됩니다. 이 값은 해당 파라미터를 참조하는 모듈레이터가 다른 모듈레이터와 믹스될 때도 입력을 변경하지 않는 값으로 설정되어야 합니다. 수학적으로는 믹스 함수가 입력으로 설정되었을 때 Identity 함수로 효과적으로 감소될 수 있도록 값을 선택해야 합니다.

예를 들어 볼륨 디폴트 모듈레이션 파라미터는 정규화된 공간에서 디폴트 값 1.0f(유닛 공간에서는 0dB)를 가지며, 곱셈 방식으로 믹스할 경우 출력에 변경 사항이 발생하지 않습니다. 즉, 이 값과 입력을 믹스하면 출력은 동일한 값이 됩니다.

볼륨 디폴트 파라미터 값은 곱셈 방식으로 믹스되는 경우 출력이 변경되지 않습니다.

이와 유사하게, 피치는 정규화 공간에서 디폴트 값 0.5f(유닛 공간에서는 0.0 세미톤)을 갖는데, 0 세미톤을 추가하면 믹스된 값과 동일한 값이 생성되기 때문입니다.

개발자를 위한 파라미터 참고 사항: 코드에서 베이스 클래스 USoundModulationParameter`는 상속할 수 있으며, 값을 믹스하는 데 사용되는 오버로드된 함수(GetMixFunction)를 제공할 수 있고 값을 유닛 및 정규화된 공간(각각 GetUnitConversionFunctionGetNormalizedConversionFunction)으로/으로부터 트랜스폼할 수 있습니다. GetMixFunction`은 FModulationMixFunction`을 반환하여 플로트 버퍼 두 개 세트와 함께 전달합니다. 그 중 하나인 InValueBuffer`는 OutValueBuffer`로 믹스되며, 여기서 InValueBuffer`는 정규화된 공간에서의 값을 포함합니다.

모듈레이션 대상

모듈레이션 대상(엔진 모듈에서 찾을 수 있는 FModulationDestination)은 오디오 소스 또는 이펙트에 플로트 값을 제공하는 엔드포인트이며, 참조된 모듈레이팅 소스에 의해 모듈레이션될 수 있습니다.

1) 베이스 값으로, 모듈레이션할 수 있습니다. 2) 체크하면 모듈레이션을 활성화하거나 비활성화할 수 있습니다. 3) 모듈레이션할 소스 오브젝트입니다.

모듈레이션 대상은 서브믹스 이펙트 프리셋, 소스 이펙트 프리셋 또는 사운드 타입(SoundWaves, SoundCues 및 SoundBase 클래스에서 상속 받는 모든 항목)의 프로퍼티에서 찾을 수 있습니다. 사운드 타입에 대한 모듈레이션을 위한 표준 모듈레이션 대상으로는 볼륨, 피치, 하이패스 및 로우 패스 등이 있습니다.

모듈레이션 대상은 다음과 같은 기본적인 프로퍼티 세 가지를 포함합니다.

  • 모듈레이션이 가능한 베이스 값 (유닛)

  • 모듈레이션 활성화 여부를 나타내는 부울

  • 컨트롤 버스, 모듈레이션 제너레이터 또는 모듈레이션 패치와 같은 모듈레이션 소스 오브젝트

모듈레이터 소스 및 믹스 스테이지

오디오 모듈레이션 플러그인은 다양한 모듈레이션 소스 에셋 타입을 제공합니다. 이러한 타입은 `USoundModulatorBase`의 타입, 즉 엔진 모듈에서 찾을 수 있는 베이스 클래스를 상속합니다. 각각은 모듈레이션 대상에 의해 참조될 수 있으며 일부 경우에는 서로 참조하는 것도 가능합니다. 이러한 타입으로는 컨트롤 버스, 모듈레이션 제너레이터,및 모듈레이션 패치 등이 포함됩니다. 컨트롤 버스 믹스의 경우 모듈레이션 소스는 아니지만 컨트롤 버스에 의해 활용되는 값을 구동할 수 있습니다.

아래 플로차트에서 각 화살표는 믹스 스테이지, 즉 한 타입의 배열이 서로 믹스되는 단계를 나타내며, 코드에 명시된 입력 모듈레이터 파라미터 믹스 함수(USoundModulationParameter::GetMixFunction 참고)를 사용하여 결과 값을 수정합니다. 디폴트 믹스 함수는 모든 결과 값의 단순 곱셈입니다. 즉, 버스 믹스(또는 버스 믹스의 배열) 및/또는 모듈레이션 제너레이터(또는 제너레이터의 배열)은 버스를 구동 하는 데 사용될 수 있으며, 버스(또는 버스의 배열)는 패치를 구동하는 데 사용될 수 있습니다. 모듈레이션 제너레이터, 버스 또는 패치는 그런 다음 아래에 나와 있는 것처럼 모듈레이션 대상을 구동할 수 있습니다. 여러 개의 화살표는 모듈레이션 배열이 다른 타입에 영향을 미칠 수 있다는 것을 나타냅니다.

모듈레이션 파라미터 플로차트

1) 버스 믹스, 2) 제너레이터, 3) 버스, 4) 패치, 5) 대상

컨트롤 버스(USoundControlBus)

버스는 기본적으로 참조된 파라미터 프로퍼티에 의해 설정된 값을 취합니다. 바이패스(Bypass) 가 설정되어 되어 있는 경우 버스는 무시되고 버스에 의해 구동되는 입력에 믹스되지 않습니다.

바이패스 를 활성화하면 버스는 무시되고 버스에 의해 구동되는 입력에 믹스되지 않습니다.

버스 믹스(또는 버스 믹스 배열)를 통해 버스를 구동하는 경우 클라이언트는 OSC 스타일 어드레싱을 사용하여 믹스 값을 조정할 수 있습니다(필터로 컨트롤 버스 믹스 설정 참고).

모듈레이션 제너레이터 배열도 버스를 대수적으로 구동하기 위해 제공될 수 있습니다.

모듈레이션 제너레이터(USoundModulationGenerator)

모듈레이션 제너레이터는 시간 경과에 따라 값을 프로시저럴하게 생성할 수 있는 모듈레이터의 서브 클래스입니다. 제너레이터는 컨트롤 버스 또는 모듈레이션 대상에서 직접 참조되어 구동할 수 있습니다. LFO엔벨로프 팔로워(Envelope Follower) 는 오디오 모듈레이션 플러그인 내에 구현되어 있습니다.

LFO(USoundModulationGeneratorLFO)

LFO 모듈레이터는 오디오 모듈레이션 플러그인에서 사용 가능한 모듈레이션 제너레이터 중 가장 단순한 예시입니다.

각 LFO 셰이프는 제공된 진폭(Amplitude) , 주파수(Frequency)오프셋(Offset) 을 따릅니다. LFO 버스 모듈레이터는 셰이프 드롭다운에서 선택하는 대로 다음 기본 셰이프 중 무엇이든 될 수 있습니다.

  • 사인

  • 쏘우(위)

  • 쏘우(아래)

  • 스퀘어

  • 트라이앵글

  • 익스포넨셜

  • 랜덤

주기 함수는 루핑(Looping) 의 활성화 여부에 따라 루프를 할 수도 그렇지 않을 수도 있습니다. 모듈레이터를 바이패스 로 설정하면 생성된 값을 계산하지만 이를 참조하는 버스 또는 대상으로 구동 또는 믹스하지 않습니다.

엔벨로프 팔로워(USoundModulationGeneratorEnvelopeFollower)

엔벨로프 팔로워(Envelope Follower) 는 참조된 오디오 버스(Audio Bus) 입력의 진폭을 바탕으로 지속적으로 업데이트되는 엔벨로프 값을 생성합니다. 게인(Gain) 프로퍼티는 들어오는 엔벨로프를 제공된 스칼라로 감쇠할 수 있게 해줍니다. 시작 시간(Attack Time)릴리즈 시간(Release Time) 은 결과 엔벨로프를 효과적으로 스무딩할 수 있게 해줍니다. 모듈레이터를 바이패스 로 설정하면 생성된 값을 계산하지만 이를 리스닝하는 버스 또는 대상으로 구동 또는 믹스하지 않습니다.

커스텀 제너레이터 생성하기

USoundModulationGenerator 클래스에는 코드 생성 템플릿이 제공되어 개발자가 자신만의 모듈레이션 제너레이터를 빠르고 쉽게 생성할 수 있게 해줍니다. 코드를 생성하면 제너레이터 생성 및 등록에 필요한 보일러플레이트가 모두 생성됩니다. 툴(Tools) > 새 C++ 클래스(New C++ Class) 로 이동하여 부모 클래스 선택(Choose Parent Class) 모달 대화 상자에서 모든 클래스(All Classes) 를 선택하면 이 기능을 찾을 수 있습니다.

툴 > 새 C++ 클래스 로 이동합니다. 그러면 부모 클래스 선택 대화창이 표시됩니다. 모든 클래스 를 체크하여 활성화합니다.

개발자는 GetValueUpdate 함수만 구현하면 됩니다. GetValue 는 0.0f과 1.0f 사이의 캐시 및 정규화된 값을 유닛 없이 반환합니다.

Update 함수에서는 다음 프레임에서 캐시된 값의 계산이 이루어집니다. 이 값은 Update 호출을 통해 프레임당 한 번 생성되며, 리스닝 중인 모든 모듈레이션 대상에 GetValue 호출을 통해 제공됩니다.

선택 사항으로, IsBypassed, GetDebugValuesGetDebugCategories`도 구현할 수 있습니다. IsBypassed`는 제너레이터 값이 대상 계산에 포함되어야 하는지 여부를 반환합니다. 기본적으로 이것은 생성된 USoundModulationGenerator Bypass 프로퍼티가 제공한 값을 언리얼 오디오 엔진에 전달합니다. GetDebugValues`는 미출시 빌드의 au.Debug.SoundModulators 디버그 명령 집합을 사용하여 런타임에 표시할 제너레이터 인스턴스당 스트링 배열을 제공합니다. GetDebugCategories`는 이러한 인스턴스 값이 제공하는 값에 해당되는 필드 이름의 스태틱 배열을 제공해야 합니다.

모듈레이션 패치(USoundModulationPatch)

모듈레이션 패치는 하드웨어 모듈레이션 패치 베이의 언리얼 엔진 버전으로 볼 수 있지만, 입력 버스 값을 기능적으로 리매핑하는 기능을 제공한다는 측면에서 보다 강력합니다.

파라미터(Parameter) 버스 값을 잠재적으로 추상적이고 흥미로운 방식으로 대상에 리라우팅하고 믹스하지만, 컨트롤 버스 믹스(Control Bus Mixes) 처럼 버스 배열에 스테이지를 병렬로 적용하는 대신 버스 값을 결합하고 대상(또는 여러 대상)에 직렬로 믹스합니다.

패치는 버스 값을 결합하고 하나 또는 하나 이상의 대상으로 직렬로 믹스합니다.

패치는 버스 입력 슬롯 의 배열로 구성되어 있으며, 각각은 버스 참조 및 트랜스폼 정보를 포함합니다. 등록된 버스가 없는 경우 패치 참조 파라미터의 디폴트 입력 값(Default Input Value) 이 패치 출력으로 전송됩니다.

각 입력은 Sample-And-Hold 프로퍼티를 제공하며, 패치는 초기화되는 즉시 버스 값을 캡처하고 패치의 수명 동안 유지합니다. 이처럼 등록된 버스 트랜스폼 값 각각의 출력은 패치 모듈레이션 파라미터 믹스 함수를 사용하여 믹스됩니다. 각 입력은 공유 커브 에셋 , 커스텀 커브 (패치 에셋에 저장됨) 또는 표현식 (아래 예시와 함께 나열됨)을 사용하여 매핑될 수 있습니다.

  1. (빨간색) 로그, 2. (초록색) 익스포넨셜 (반전), 3. (파란색) 사인, 4. (주황색) S 커브 5. (보라색) 익스포넨셜

컨트롤 버스 믹스(USoundControlBusMix)

컨트롤 버스 믹스는 컨트롤 버스 값을 런타임에서 동적으로 구동 및 그룹화할 수 있게 해줍니다. 여러 믹스가 단일 버스를 구동할 수 있고, 여러 버스가 단일 믹스에 의해 동시에 구동될 수도 있습니다.

컨트롤 버스 믹스 기능을 사용하면 여러 믹스가 단일 버스를 구동할 수 있고, 여러 버스가 단일 믹스에 의해 동시에 구동될 수도 있습니다.

각 컨트롤 버스 믹스에는 믹스 스테이지(Mix Stages) 배열이 갖춰져 있습니다. 믹스 스테이지는 기존 하드웨어 믹서에서 볼 수 있는 채널 스트립과 비슷하게 생각하면 됩니다. 단, 컨트롤 버스 믹스는 동적이기 때문에 기존의 믹서와 달리 항목을 몇 개든 가질 수 있으며 볼륨, 피치, HPF 감쇠, LPF 감쇠 및 트림 등 믹서에서 볼 수 있는 표준 값뿐만 아니라 어떤 파라미터 타입이든 제어할 수 있습니다.

믹스 스테이지는 항상 단일 모듈레이션 값과 연관되어 있으며, 오디오 채널의 기존 정의, 즉 모노, 스테레오 또는 서라운드 등 오디오 파일 세트의 채널 수와는 직접적인 관련이 없습니다. 믹스 스테이지라는 이름은 볼륨 믹스 체인의 기존 게인 스테이지와 좀 더 관련이 있지만 볼륨에만 한정되지는 않습니다.

각 믹스 스테이지는 값(Value) (유닛 및 정규화 공간 모두에 표시), 시작 시간릴리즈 시간 을 제공합니다. '시작 시간'은 믹스 스테이지 값이 모듈레이션 파라미터에서 해당 버스에 대해 정의된 디폴트 값에서 믹스가 활성화 되었을 때 제공되는 값까지 진행하는 동안 걸리는 시간입니다. '릴리즈 시간'은 믹스 스테이지 값이 현재 값에서 디폴트 값으로 돌아가는 데 걸리는 시간입니다.

'디테일(Details)' 패널에는 컨트롤 버스 믹스 에셋을 편집할 때 다양한 함수가 툴로 노출됩니다. 이렇게 제공된 함수를 사용하여 활성화 및 비활성화 오디션을 수행할 수 있습니다. 또한 믹스를 솔로 처리하거나 오디션 중인 믹스를 모두 비활성화할 수도 있습니다.

믹스 프로파일링(Mix profiling) 은 느슨한 환경설정 파일로 저장된 다양한 세팅을 테스트할 수 있게 해줍니다. 개발자가 이를 사용하면 미출시 빌드에서 믹스를 매우 간단하게 테스트할 수 있어 빠른 반복작업으로 마무리하거나 개발 중에 새로운 믹스를 테스트할 수 있습니다. 심지어 출시된 빌드에서 사용자가 생성한 믹스를 로드할 수도 있습니다. 믹스 프로파일은 Load Mix from ProfileSave Mix to Profile 함수를 사용하여 <ProjectDirectory>Saved\Config\AudioModulation\<RelativeContentPathToObject> 경로의 .ini 파일에 저장됩니다. 믹스 프로파일은 Profile Index 프로퍼티를 사용하여 인덱싱됩니다.

모듈레이션 활성화

모든 모듈레이션 소스 는 오브젝트를 참조하는 대상이 포함된 오브젝트가 인스턴스화될 때 활성화됩니다. 예를 들어 컨트롤 버스 에 대한 참조를 갖는 사운드 웨이브가 오디오 컴포넌트에 의해 재생되지만 해당 컨트롤 버스가 현재 활성화되어 있지 않은 경우 컨트롤 버스는 오디오 렌더 스레드의 컨트롤 버스에 프록시를 효과적으로 인스턴스화하는 프로세스를 활성화합니다. 해당 컨트롤 버스에 대한 참조가 모두 소멸되면 컨트롤 버스가 비활성화되면서 오디오 렌더 스레드에 관련 프록시를 소멸시키라는 메시지를 보냅니다.

모듈레이션 소스는 해당 소스를 참조하는 다른 소스에 의해서도 활성화될 수 있습니다. 예를 들어 패치가 모듈레이션 대상에 의해 참조되는 경우, 그리고 해당 패치가 지정된 컨트롤 버스를 참조하는 경우 컨트롤 버스는 활성화될 수 있습니다.

선택 사항으로, 클라이언트 시스템은 블루프린트에서 모듈레이터에 핸들을 저장하여 인스턴스화되는 모듈레이션 대상의 참조와 관계없는 버스를 강제로 활성화할 수 있습니다. 이와 같은 명시적 관리 스타일 덕분에, 사용자는 모듈레이터가 어디에 등록되어 있든 상관없이 모듈레이터에 값을 입력할 수 있습니다. 하지만 명시적인 관리를 활용하는 데에는 모듈레이터의 수명을 확인하기 위해 클라이언트 시스템 측면에서 더 많은 노력이 필요할 수도 있습니다. 이 시스템이 유용할 수 있는 경우의 예시로는, 대상이 모듈레이터에 활성 등록되어 있는지 여부에 상관없이 캐릭터의 어빌리티 파워를 버스를 통해 오디오 엔진에 전달하는 것이 포함됩니다.

블루프린트 API

(De)ActivateBus/BusMix/Modulator

이러한 호출은 컨트롤 버스, 버스 믹스 및 모듈레이터를 수동으로 활성화 및 비활성화하는 기능을 제공합니다(모듈레이터 활성화 참고). 이미 요청된 상태(활성화 또는 비활성화)일 경우 각각 아무것도 하지 않습니다.

UpdateModulator

스레드 안전을 보존하려면 USoundModulatorBase`의 상속 타입 (USoundControlBus, USoundControlBusMix, USoundBusModulatorLFO)에 대한 변경 사항은 반드시 UpdateModulator`를 통해 커밋되어야 합니다. 타입과 함께 제공되는 경우 USoundModulatorBase 인스턴스에 적용 가능한 모든 변경 사항이 해당 런타임 인스턴스에 반영됩니다. 예를 들어 볼륨 컨트롤 버스가 USoundBase 타입에 의해 참조되고 활성화된 경우(믹스 미적용) 디폴트 값을 업데이트하면 해당 버스에서 제공되는 게인 스테이지가 해당하는 USoundBase 인스턴스에 즉시 업데이트됩니다.

CreateLPFBus/HPFBus/PitchBus/VolumeBus/BusMix/LFO

각 타입을 생성하고, 디폴트 값을 설정하고, 즉시 활성화 가능한 옵션을 제공하는 편의 함수입니다.

프로파일에 컨트롤 버스 믹스 저장

컨트롤 버스 믹스를 프로파일에 저장하여 .ini 파일로 시리얼라이즈합니다. 믹스가 로드되면 현재 프록시 상태를 사용합니다. 로드되지 않으면 디폴트 UObject 표현을 사용합니다.

프로파일에서 컨트롤 버스 믹스 로드

컨트롤 버스 믹스를 프로파일에서 UObject 믹스 정의로 로드하고, .ini 파일에서 디시리얼라이즈합니다.

컨트롤 버스 믹스 설정

스테이지가 믹스의 활성화 인스턴스 프록시에 제공되는 경우 제공된 스테이지 데이터로 믹스를 설정합니다. UObject 믹스 정의는 업데이트하지 않습니다.

필터로 컨트롤 버스 믹스 설정

지정된 클래스의 필터링된 스테이지를 믹스의 활성 인스턴스에 대해 제공된 타깃 값에 설정합니다. 별도로 지정되지 않은 경우 UObject 믹스 정의는 업데이트하지 않습니다.

컨트롤 버스 믹스 업데이트

버스 믹스의 UObject 정의에서 오디오 렌더 스레드의 활성 프록시로 업데이트를 커밋합니다. 믹스가 비활성인 경우 무시됩니다.

업데이트 모듈레이터

버스, 버스 믹스, LFO 같은 모듈레이터의 UObject 정의에서 오디오 렌더 스레드의 활성 프록시로 업데이트를 커밋합니다.