오디오 플러그인 SDK는 다양한 오디오 플러그인 타입을 포함합니다. SDK의 플러그인 코드는 공용 도메인에서 사용 가능하므로 이 코드를 템플릿으로 사용할 수 있습니다. 이 프로젝트에는 커스터마이즈된 GUI가 있는 네이티브 DSP 플러그인 예시와 해당 GUI가 없는 예시가 포함되어 있습니다.
IDE를 사용하여 예시 플러그인 코드를 편집하고 컴파일하려는 경우 SDK의 여러 IDE용 프로젝트를 활용할 수 있습니다. 다음 표에는 각 IDE의 프로젝트를 찾을 수 있는 위치가 나와 있습니다.
IDE | 위치 |
---|---|
Visual Studio |
NativeAudioPlugins-master\NativeCode\VisualStudio\AudioPluginDemo.sln (플러그인 프로젝트). |
Visual Studio |
NativeAudioPlugins-master\GUICode\AudioPluginDemoGUI\AudioPluginDemoGUI.sln (GUI 프로젝트). |
XCode | NativeAudioPlugins-master\NativeCode\Xcode\AudioPluginDemo.xcodeproj |
UWP | NativeAudioPlugins-master\NativeCode\UWP\AudioPluginDemo.sln |
Unity에서 예시 플러그인에 액세스하려면 다음 단계를 따르십시오.
demos
Unity 프로젝트를 엽니다(폴더: NativeAudioPlugin > Assets).
Unity 프로젝트에서 Assets > mixers로 이동합니다.
일부 믹서 옆에 있는 화살표를 클릭하여 믹서를 확장합니다.
Audio Mixer Group Controller를 클릭합니다. 인스펙터(Inspector)에 해당 Audio Mixer Group Controller와 연결된 효과가 표시됩니다.
효과를 추가하려면 Add Effect 버튼을 클릭합니다. 그러면 추가할 수 있는 예시 플러그인 효과가 모두 나열됩니다.
추가하려는 효과를 선택합니다. 그러면 Unity 인스펙터에 해당 효과가 표시됩니다.
인스펙터를 연 상태에서 플레이 모드를 실행하면 사운드가 변경됨에 따라 일부 효과가 업데이트됩니다.
이 섹션에는 커스텀 GUI 대신 기본 Unity 슬라이더가 있는 AudioNativePlugin
프로젝트에 포함된 몇 가지 예시 플러그인이 나열되어 있습니다.
플러그인 코드 파일에 직접 액세스하려면 SDK 폴더에서 NativeAudioPlugins/NativeCode
로 이동합니다.
NoiseBox 플러그인은 입력 신호에 가변 주파수의 백색 소음을 더하고 곱하는 플러그인입니다. Lofinator 플러그인 및 애니메이션 파라미터와 함께 사용하여 휴대폰 소리, 무선 수신 불량, 망가진 스피커 등의 효과를 시뮬레이션할 수 있습니다.
Ring Modulator 예시 플러그인은 수신되는 신호에 사인파를 곱하는 간단한 모듈레이터의 예시입니다. 이를 통해 전파 잡음 또는 수신 끊김과 같은 효과를 얻을 수 있습니다. 효과를 높이려면 주파수가 서로 다른 여러 링 모듈레이션 효과를 연결하십시오.
StereoWidener 플러그인은 스테레오 입력 신호를 가변 지연이 있는 모노 및 사이드 컴포넌트로 분해한 다음 다시 결합하여 인지되는 스테레오 효과를 증가시킵니다.
Lofinator 플러그인은 신호의 간단한 다운샘플링과 양자화를 수행합니다. NoiseBox 플러그인 및 애니메이션 파라미터와 함께 사용하여 휴대폰 소리, 무선 수신 불량, 망가진 스피커 등의 효과를 시뮬레이션할 수 있습니다.
이 섹션에서는 이퀄라이제이션 및 멀티밴드 압축 효과를 포함한 고급 플러그인 사용 사례를 제공합니다. 이러한 플러그인에는 이전 섹션의 플러그인보다 더 많은 수의 파라미터가 있습니다. 일부 플러그인 파라미터는 기본 슬라이더를 사용하기에 너무 복잡합니다.
예시 커스텀 GUI 코드에 직접 액세스하려면 SDK 폴더에서 NativeAudioPlugins-master\GUICode\AudioPluginDemoGUI
로 이동합니다.
이퀄라이저 플러그인에는 결과 커브와 개별 필터의 영향을 보여 주는 디스플레이 그래프가 포함되어 있습니다. 하나 또는 여러 개의 파라미터 값을 변경하려면 컨트롤 그래프에서 파라미터를 클릭하고 드래그합니다. 이렇게 하면 각 슬라이더를 개별적으로 변경할 필요가 없습니다.
필터 커브의 게인 및 주파수를 변경하려면 컨트롤 그래프에서 세 개의 밴드를 드래그합니다. 각 밴드의 셰이프를 변경하려면 Shift 키를 누른 상태에서 밴드를 클릭하고 드래그합니다.
Unity의 내부 API 함수를 사용하여 커브를 그리고 주파수 응답에 대한 안티앨리어싱된 커브를 그릴 수 있습니다.
이퀄라이저와 멀티밴드 플러그인 모두 플러그인의 효과를 시각화하기 위해 입력 및 출력 스펙트럼을 오버레이할 코드도 제공합니다. GUI 코드는 오디오 프로세싱보다 훨씬 낮은 업데이트 속도로 실행되며 오디오 스트림에 액세스할 수 없습니다. 따라서 이 데이터를 읽기 위해 네이티브 코드는 다음과 같은 함수를 제공합니다.
UNITY_AUDIODSP_RESULT UNITY_AUDIODSP_CALLBACK GetFloatParameterCallback(
UnityAudioEffectState* state,
int index,
float* value,
char *valuestr)
{
EffectData::Data* data = &state->GetEffectData<EffectData>()->data;
if(index >= P_NUM)
return UNITY_AUDIODSP_ERR_UNSUPPORTED;
if(value != NULL)
*value = data->p[index];
if(valuestr != NULL)
valuestr[0] = 0;
return UNITY_AUDIODSP_OK;
}
이 함수를 사용하면 GUI가 네이티브 플러그인에서 부동 소수점 데이터를 읽을 수 있습니다. GetFloatBufferCallback
이라는 배열 배리언트도 있습니다. 플러그인 시스템은 요청이 UI 또는 네이티브 코드의 성능에 영향을 미치지 않는 한 모든 데이터를 허용합니다.
이퀄라이저 및 멀티밴드 코드의 경우 FFTAnalyzer
라는 유틸리티 클래스를 사용하면 플러그인에서 손쉽게 입력 및 출력 데이터를 제공하고 스펙트럼을 회수할 수 있습니다. 그런 다음 GetFloatBufferCallback
이 이 스펙트럼 데이터를 리샘플링하여 C# GUI 코드로 보냅니다.
이 데이터를 리샘플링해야 FFTAnalyzer
가 고정 주파수 해상도에서 분석을 실행할 수 있습니다. GetFloatBufferCallback
은 요청된 샘플 수만 반환하며, 이는 데이터를 표시하는 뷰의 너비에 따라 결정됩니다.
CorrelationMeter 플러그인에는 최소량의 DSP 코드만 있습니다. 이 플러그인은 왼쪽 채널의 진폭을 오른쪽 채널의 진폭과 대조하여 신호의 스테레오 효과를 표시합니다.
이퀄라이저와 멀티밴드 효과는 의도적으로 단순하고 최적화되지 않은 상태로 유지되지만, 플러그인 시스템이 지원하는 더 복잡한 UI의 좋은 예시이기도 합니다.
3개의 서로 다른 타임 스케일에서 레벨을 측정하는 소리 크기 모니터링 툴의 예시입니다. 데모용이지만 최신 소리 크기 표준을 준수하는 모니터링 툴을 구축할 수 있습니다. 커브 렌더링 코드는 Unity에 내장되어 있습니다.
플러그인 시스템을 사용하여 사운드를 처리하는 대신 생성할 수도 있습니다.
Plugin_TeeBee.cpp
및 Plugin_TeeDee.cpp
는 다음과 같은 간단한 신디사이저입니다.
* 임의의 노트로 패턴 생성
* 합성 엔진에서 필터와 엔벨로프를 미세 조정하는 파라미터 포함
ProcessCallback
은 state->dsptick
파라미터를 읽어 곡에서의 위치를 결정합니다. 이 카운터는 전역 샘플 포지션입니다. 모든 플러그인 효과가 동일한 샘플 기반 클럭에 동기화되도록 하려면 다음 단계를 따르십시오.
카운터를 샘플에 지정된 각 노트의 길이로 나눕니다.
이 나눗셈의 나머지가 0이 되면 합성 엔진에 노트 이벤트를 실행합니다.
이러한 효과를 통해 알려진 템포에 미리 녹음된 음악을 재생하려면 타이밍 정보를 사용하여 음악에 템포 동기화된 필터 효과나 딜레이를 적용합니다.
공간화 SDK는 네이티브 오디오 플러그인 SDK를 기반으로 사용하는 플러그인의 예시입니다. 공간화 SDK를 사용하면 오디오 소스별로 인스턴스화하는 커스텀 공간화 효과를 개발할 수 있습니다. 자세한 내용은 오디오 공간화 SDK를 참조하십시오.