# SDK에 포함된 네이티브 오디오 플러그인 예시

> Example DSP plug-ins with and without GUI customization.

[오디오 플러그인 SDK](https://github.com/Unity-Technologies/NativeAudioPlugins)에는 다양한 오디오 플러그인 유형이 포함되어 있습니다. 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에서 예시 플러그인에 액세스하려면 다음 단계를 따르십시오.

1. `demos` Unity 프로젝트(폴더: **NativeAudioPlugin** > **Assets**)를 엽니다.

2. Unity 프로젝트에서 **Assets** > **mixers**로 이동합니다.

3. 일부 믹서 옆에 있는 화살표를 클릭하여 믹서를 확장합니다.

4. Audio Mixer Group Controller를 클릭합니다. 인스펙터에 해당 Audio Mixer Group Controller와 연결된 효과가 표시됩니다.

5. 효과를 추가하려면 **Add Effect** 버튼을 클릭합니다. 그러면 추가할 수 있는 예시 플러그인 효과가 모두 나열됩니다.

6. 추가하려는 효과를 선택합니다. Unity가 인스펙터에 효과를 표시합니다.

인스펙터를 연 상태에서 플레이 모드를 실행하면 사운드가 변경됨에 따라 일부 효과가 업데이트됩니다.

## 커스텀 GUI가 없는 플러그인 예시##example-no-gui

이 섹션에는 커스텀 GUI 대신 기본 Unity 슬라이더가 있는 `AudioNativePlugin` 프로젝트에 포함된 몇 가지 예시 플러그인이 나열되어 있습니다.

플러그인 코드 파일에 직접 액세스하려면 SDK 폴더에서 `NativeAudioPlugins/NativeCode`로 이동합니다.


**커스텀 GUI가 없는 플러그인 예시:**
![](/api/media?file=/engine/6000.0/media/images/AudioMixerStereoWidener.png)

### NoiseBox 플러그인##the-noisebox-plug-in

NoiseBox 플러그인은 입력 신호에 가변 주파수의 백색 소음을 더하고 곱하는 플러그인입니다. Lofinator 플러그인 및 애니메이션 파라미터와 함께 사용하여 휴대폰 소리, 무선 수신 불량, 망가진 스피커 등의 효과를 시뮬레이션할 수 있습니다.

### Ring Modulator 예시 플러그인##the-ring-modulator-example-plug-in

Ring Modulator 예시 플러그인은 수신되는 신호에 사인파를 곱하는 간단한 모듈레이터의 예시입니다. 이를 통해 전파 잡음 또는 수신 끊김과 같은 효과를 얻을 수 있습니다. 효과를 높이려면 주파수가 서로 다른 여러 링 모듈레이션 효과를 연결하십시오.

### StereoWidener 예시 플러그인##the-stereowidener-example-plug-in

StereoWidener 플러그인은 스테레오 입력 신호를 가변 지연이 있는 모노 및 사이드 컴포넌트로 분해한 다음 다시 결합하여 인지되는 스테레오 효과를 증가시킵니다.

### Lofinator 플러그인##the-lofinator-plug-in

Lofinator 플러그인은 신호의 간단한 다운샘플링과 양자화를 수행합니다. NoiseBox 플러그인 및 애니메이션 파라미터와 함께 사용하여 휴대폰 소리, 무선 수신 불량, 망가진 스피커 등의 효과를 시뮬레이션할 수 있습니다.

## 커스텀 GUI가 있는 오디오 플러그인 예시##example-with-gui

이 섹션에서는 이퀄라이제이션 및 멀티밴드 압축 효과를 포함한 고급 플러그인 사용 사례를 제공합니다. 이러한 플러그인에는 이전 섹션의 플러그인보다 더 많은 수의 파라미터가 있습니다. 일부 플러그인 파라미터는 기본 슬라이더를 사용하기에 너무 복잡합니다.

예시 커스텀 GUI 코드에 직접 액세스하려면 SDK 폴더에서 `NativeAudioPlugins-master\GUICode\AudioPluginDemoGUI`로 이동합니다.

### 이퀄라이저 예시 플러그인##the-equalizer-example-plug-in

이퀄라이저 플러그인에는 결과 커브와 개별 필터의 영향을 보여 주는 디스플레이 그래프가 포함되어 있습니다. 하나 또는 여러 개의 파라미터 값을 변경하려면 컨트롤 그래프에서 파라미터를 클릭하고 드래그합니다. 이렇게 하면 각 슬라이더를 개별적으로 변경할 필요가 없습니다.


**Frame:**
![](/api/media?file=/engine/6000.0/media/images/AudioMixerCustomGUI.png)

필터 커브의 게인 및 주파수를 변경하려면 컨트롤 그래프에서 세 개의 밴드를 드래그합니다. 각 밴드의 셰이프를 변경하려면 Shift 키를 누른 상태에서 밴드를 클릭하고 드래그합니다.

Unity의 내부 API 함수를 사용하여 커브를 그리고 주파수 응답에 대한 안티앨리어싱된 커브를 그릴 수 있습니다.

### 플러그인 데이터 및 GUI 성능을 분석하는 코드##code-to-analyze-plug-in-data-and-gui-performance

이퀄라이저와 멀티밴드 플러그인 모두 플러그인의 효과를 시각화하기 위해 입력 및 출력 스펙트럼을 오버레이할 코드도 제공합니다. 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 예시 플러그인##the-correlationmeter-example-plug-in

CorrelationMeter 플러그인에는 최소량의 DSP 코드만 있습니다. 이 플러그인은 왼쪽 채널의 진폭을 오른쪽 채널의 진폭과 대조하여 신호의 스테레오 효과를 표시합니다.


**CorrelationMeter 플러그인의 커스텀 GUI:**
![](/api/media?file=/engine/6000.0/media/images/AudioMixerDemoCorrelationMeter.png)


**오버레이된 스펙트럼 분석 이퀄라이저 GUI(초록색 커브는 소스, 빨간색 곡선은 처리된 것임):**
![](/api/media?file=/engine/6000.0/media/images/AudioMixerDemoMultiband.png)

이퀄라이저와 멀티밴드 효과는 의도적으로 단순하고 최적화되지 않은 상태로 유지되지만, 플러그인 시스템이 지원하는 더 복잡한 UI의 좋은 예시이기도 합니다.

### 음량 모니터링 툴##loudness-monitoring-tool

3개의 서로 다른 타임 스케일에서 레벨을 측정하는 음량 모니터링 툴의 예입니다. 이는 데모 목적으로만 사용되지만 최신 음량 표준화를 준수하는 모니터 툴을 빌드할 수 있습니다. 커브 렌더링 코드는 Unity에 내장되어 있습니다.


**Frame:**
![](/api/media?file=/engine/6000.0/media/images/AudioMixerDemoLoudnessMeter.png)

### DSP 클럭에 동기화##synchronizing-to-the-dsp-clock

플러그인 시스템을 사용하여 사운드를 처리하는 대신 생성할 수도 있습니다.

`Plugin_TeeBee.cpp` 및 `Plugin_TeeDee.cpp`는 다음과 같은 단순한 합성기입니다.

* 임의의 노트로 패턴 생성
* 합성 엔진에서 필터와 엔벨로프를 조정하는 파라미터 포함

`ProcessCallback`은 `state->dsptick` 파라미터를 읽고 노래의 위치를 결정합니다. 이 카운터는 전역 샘플 위치입니다. 모든 플러그인 효과가 동일한 샘플 기반 클럭에 동기화되도록 하려면 다음 단계를 따르십시오.

1. 카운터를 샘플에 지정된 각 노트의 길이로 나눕니다.

2. 이 나눗셈의 나머지가 0이 되면 합성 엔진에 노트 이벤트를 실행합니다.

이러한 효과를 통해 알려진 템포에 미리 녹음된 음악을 재생하려면 타이밍 정보를 사용하여 음악에 템포 동기화된 필터 효과나 딜레이를 적용합니다.

## 공간화##spatialization

공간화 SDK는 네이티브 오디오 플러그인 SDK를 기반으로 사용하는 플러그인의 예시입니다. 공간화 SDK를 사용하면 오디오 소스별로 인스턴스화할 수 있는 커스텀 공간화 효과를 개발할 수 있습니다. 자세한 내용은 [Audio Spatializer SDK](/engine/6000.0/manual/audio/mixer-native-audio-plugin/spatializer-sdk.md)를 참조하십시오.

## 추가 리소스##additional-resources

* [오디오 믹서](/engine/6000.0/manual/audio/mixer.md)

* [네이티브 오디오 플러그인 SDK](/engine/6000.0/manual/audio/mixer-native-audio-plugin.md)

* [오디오 스페이셜라이저](/engine/6000.0/manual/audio/mixer-native-audio-plugin/spatializer-sdk.md)

***
