프로시저럴 사운드 생성
MetaSounds를 활용한 절차적 사운드 디자인: FM 합성, 그래뉼러 합성, 런타임 파라미터 제어
절차적 사운드 디자인이란?
녹음된 Wave 파일 대신 알고리즘으로 사운드를 생성하는 기법
절차적 사운드 디자인(Procedural Sound Design)은 미리 녹음된 오디오 파일에 의존하지 않고, 수학적 알고리즘과 실시간 파라미터로 사운드를 런타임에 생성하는 기법입니다. MetaSounds의 오실레이터, 필터, 엔벨로프를 조합하여 구현합니다.
Wave 기반 vs 절차적 사운드 비교
| 항목 | Wave 기반 | 절차적 |
|---|---|---|
| 메모리 | WAV 파일 크기에 비례 | 노드 그래프만 (수 KB) |
| 변형성 | 녹음된 범위 내 제한적 | 파라미터로 무한 변형 |
| 반응성 | 미리 준비된 파일 교체 | 게임 상태에 실시간 반응 |
| CPU 비용 | 디코딩만 (낮음) | DSP 연산 (높음) |
| 적합한 사운드 | 음악, 대사, 복잡한 자연음 | UI, 레이저, 엔진, 바람, 알림 |
실무에서는 Wave 기반과 절차적 방식을 혼합하는 것이 일반적입니다. 예: 총소리의 기본 발사음은 Wave, 잔향과 거리 변형은 절차적으로 처리합니다.
FM 합성
주파수 변조(Frequency Modulation)로 복잡한 음색 생성
FM 합성은 하나의 오실레이터(Modulator)의 출력으로 다른 오실레이터(Carrier)의 주파수를 변조하여 풍부한 하모닉스를 생성하는 기법입니다. 메탈릭, 벨, 레이저 등의 사운드에 적합합니다.
FM 합성 노드 그래프
FM 합성 핵심 파라미터
| 파라미터 | 범위 예시 | 효과 |
|---|---|---|
| Carrier Frequency | 100 ~ 2000 Hz | 기본 음높이 결정 |
| Modulator Frequency | 100 ~ 5000 Hz | 하모닉 구조 결정 (비율이 중요) |
| Modulation Depth | 0 ~ 10000 | 음색 복잡도 (높을수록 메탈릭) |
| Carrier:Modulator 비율 | 1:1, 1:2, 1:3... | 정수비 = 조화음, 비정수비 = 비조화음(벨, 종) |
레이저: C:M = 1:3, Mod Depth 높음, 빠른 피치 스윕
벨/종: C:M = 1:1.4 (비정수비), Mod Depth 중간, 긴 디케이
메탈릭 히트: C:M = 1:7, 매우 높은 Mod Depth, 짧은 AD 엔벨로프
그래뉼러 합성과 웨이브테이블
샘플을 재구성하여 새로운 텍스처를 만드는 고급 합성 기법
그래뉼러 합성 (Granular Synthesis)
오디오 샘플을 아주 작은 조각("그레인", 10~100ms)으로 분할하고, 이를 재조합/중첩하여 새로운 사운드 텍스처를 생성하는 기법입니다. 앰비언트, 패드, 텍스처 사운드에 탁월합니다.
| 파라미터 | 범위 | 효과 |
|---|---|---|
| Grain Size | 10 ~ 200 ms | 작을수록 추상적/텍스처, 클수록 원본에 가까움 |
| Grain Density | 1 ~ 100/sec | 높을수록 연속적인 사운드 |
| Position | 0.0 ~ 1.0 | 소스 파일 내 재생 위치 |
| Position Spread | 0.0 ~ 1.0 | 위치 랜덤화 범위 |
| Pitch Shift | -24 ~ +24 st | 각 그레인의 피치 변형 |
웨이브테이블 합성
WaveTable Oscillator 노드는 커스텀 파형 테이블을 읽어 재생합니다. 미리 정의된 여러 파형 사이를 보간하여 시간에 따라 음색이 변화하는 사운드를 만들 수 있습니다.
그래뉼러 합성은 많은 수의 그레인을 동시에 처리하므로 CPU 부하가 높습니다. 동시에 여러 그래뉼러 인스턴스를 실행하는 것은 피하고, 앰비언트 등 1~2개의 지속적인 사운드에 사용하는 것이 적합합니다.
런타임 파라미터 연동 실전
게임 상태에 따라 절차적 사운드를 실시간으로 변화시키기
절차적 사운드의 진정한 가치는 게임 상태와의 실시간 연동에 있습니다. Blueprint/C++에서 MetaSounds 파라미터를 매 프레임 업데이트하여, 게임의 변화에 즉각 반응하는 사운드를 만들 수 있습니다.
예시: 차량 엔진 사운드 시스템
// 차량 엔진의 MetaSound 파라미터를 매 프레임 업데이트
void AVehicle::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
if (!EngineAudioComp || !EngineAudioComp->IsPlaying())
return;
// RPM을 MetaSound의 "RPM" Input에 전달
EngineAudioComp->SetFloatParameter(
FName("RPM"), EngineRPM);
// 스로틀 입력을 "Throttle" Input에 전달
EngineAudioComp->SetFloatParameter(
FName("Throttle"), ThrottleInput);
// 차량 속도를 "Speed" Input에 전달
EngineAudioComp->SetFloatParameter(
FName("Speed"), CurrentSpeed);
// 엔진 부하량을 "Load" Input에 전달
EngineAudioComp->SetFloatParameter(
FName("Load"), EngineLoad);
}
// MetaSound 내부에서:
// RPM -> Map Range -> Sine Osc Frequency (엔진 기본음)
// Throttle -> Map Range -> Noise Volume (터빈/흡기 노이즈)
// Load -> Map Range -> Filter Cutoff (배기음 밝기)
MetaSound 내부 파라미터 매핑 구조
급격한 파라미터 변화는 오디오 아티팩트(클릭, 팝)를 유발할 수 있습니다. MetaSounds의 Interpolate 또는 One-Pole Low Pass 노드로 파라미터를 스무딩하거나, C++ 측에서 FMath::FInterpTo로 보간하세요.
핵심 요약
- 절차적 사운드는 알고리즘으로 런타임에 사운드를 생성하여, 메모리를 절약하고 무한 변형을 가능하게 한다
- FM 합성은 Carrier와 Modulator 오실레이터로 레이저, 벨, 메탈릭 사운드를 생성한다
- 그래뉼러 합성은 오디오 샘플을 작은 그레인으로 분할/재조합하여 새로운 텍스처를 만든다
- 게임 상태(RPM, Speed 등)를 MetaSound 파라미터로 매핑하여 실시간 반응 사운드를 구현한다
- 급격한 파라미터 변화는 보간/스무딩으로 처리하여 아티팩트를 방지한다
도전 과제
배운 내용을 직접 실습해보세요
MetaSound에서 Sine, Saw, Square 오실레이터를 사용하여 레이저 발사음을 만드세요. Envelope로 감싸고, 주파수를 시간에 따라 하강시키는(Pitch Sweep) 기법을 적용하세요. Trigger 입력으로 재생을 제어하세요.
White Noise 생성기와 Band-Pass Filter를 조합하여 바람 소리를 만드세요. LFO로 필터 파라미터를 변조하여 바람 세기가 자연스럽게 변화하는 앰비언스를 구현하세요.
물리 충돌 정보(Impact Normal, Velocity, Material)를 MetaSound 파라미터로 전달하여 충돌 사운드를 절차적으로 생성하는 시스템을 구현하세요. 금속, 나무, 돌 등 재질별로 다른 합성 파라미터를 적용하세요.