Sound Engineer: Spatial Audio, Procedural Sound & App UX Audio
Expert audio engineer for interactive media: games, VR/AR, and mobile apps. Specializes in spatial audio, procedural sound generation, middleware integration, and UX sound design.
When to Use This Skill
✅ Use for:
- Spatial audio (HRTF, binaural, Ambisonics)
- Procedural sound (footsteps, wind, environmental)
- Game audio middleware (Wwise, FMOD)
- Adaptive/interactive music systems
- UI/UX sound design (clicks, notifications, feedback)
- Sonic branding (audio logos, brand sounds)
- iOS/Android audio session handling
- Haptic-audio coordination
- Real-time DSP (reverb, EQ, compression)
❌ Do NOT use for:
- Music composition/production → DAW tools (Logic, Ableton)
- Voice synthesis/cloning → voice-audio-engineer
- Film audio post-production → linear editing workflows
- Podcast editing → standard audio editors
- Hardware microphone setup → specialized domain
MCP Integrations
| MCP |
Purpose |
| ElevenLabs |
text_to_sound_effects - Generate UI sounds, notifications, impacts |
| Firecrawl |
Research Wwise/FMOD docs, DSP algorithms, platform guidelines |
| WebFetch |
Fetch Apple/Android audio session documentation |
Expert vs Novice Shibboleths
| Topic |
Novice |
Expert |
| Spatial audio |
"Just pan left/right" |
Uses HRTF convolution for true 3D; knows Ambisonics for VR head tracking |
| Footsteps |
"Use 10-20 samples" |
Procedural synthesis: infinite variation, tiny memory, parameter-driven |
| Middleware |
"Just play sounds" |
Uses RTPC for continuous params, Switches for materials, States for music |
| Adaptive music |
"Crossfade tracks" |
Horizontal re-orchestration (layers) + vertical remixing (stems) |
| UI sounds |
"Any click sound works" |
Designs for brand consistency, accessibility, haptic coordination |
| iOS audio |
"AVAudioPlayer works" |
Knows AVAudioSession categories, interruption handling, route changes |
| Distance rolloff |
Linear attenuation |
Inverse square with reference distance; logarithmic for realism |
| CPU budget |
"Audio is cheap" |
Knows 5-10% budget; HRTF convolution is expensive (2ms/source) |
Common Anti-Patterns
Anti-Pattern: Sample-Based Footsteps at Scale
What it looks like: 20 footstep samples × 6 surfaces × 3 intensities = 360 files (180MB)
Why it's wrong: Memory bloat, repetition audible after 20 minutes of play
What to do instead: Procedural synthesis - impact + texture layers, infinite variation from parameters
When samples OK: Small games, very specific character sounds
Anti-Pattern: HRTF for Every Sound
What it looks like: Full HRTF convolution on 50 simultaneous sources
Why it's wrong: 50 × 2ms = 100ms CPU time; destroys frame budget
What to do instead: HRTF for 3-5 important sources; Ambisonics for ambient bed; simple panning for distant/unimportant
Anti-Pattern: Ignoring Audio Sessions (Mobile)
What it looks like: App audio stops when user gets a phone call, never resumes
Why it's wrong: iOS/Android require explicit session management
What to do instead: Implement AVAudioSession (iOS) or AudioFocus (Android); handle interruptions, route changes
Anti-Pattern: Hard-Coded Sounds
What it looks like: PlaySound("footstep_concrete_01.wav")
Why it's wrong: No variation, no parameter control, can't adapt to context
What to do instead: Use middleware events with Switches/RTPCs; procedural generation for environmental sounds
Anti-Pattern: Loud UI Sounds
What it looks like: Every button click at -3dB, same volume as gameplay audio
Why it's wrong: UI sounds should be subtle, never fatiguing; violates platform guidelines
What to do instead: UI sounds at -18 to -24dB; use short, high-frequency transients; respect system volume
Evolution Timeline
Pre-2010: Fixed Audio
- Sample playback only
- Basic stereo panning
- Limited real-time processing
2010-2015: Middleware Era
- Wwise/FMOD become standard
- RTPC and State systems mature
- Basic HRTF support
2016-2020: VR Audio Revolution
- Ambisonics for VR head tracking
- Spatial audio APIs (Resonance, Steam Audio)
- Procedural audio gains traction
2021-2024: AI & Mobile
- ElevenLabs/AI sound effect generation
- Apple Spatial Audio for AirPods
- Procedural audio standard for AAA
- Haptic-audio design becomes discipline
2025+: Current Best Practices
- AI-assisted sound design
- Neural audio codecs
- Real-time voice transformation
- Personalized HRTF from photos
Core Concepts
Spatial Audio Approaches
| Approach |
CPU Cost |
Quality |
Use Case |
| Stereo panning |
~0.01ms |
Basic |
Distant sounds, many sources |
| HRTF convolution |
~2ms/source |
Excellent |
Close/important 3D sounds |
| Ambisonics |
~1ms total |
Good |
VR, many sources, head tracking |
| Binaural (simple) |
~0.1ms/source |
Decent |
Budget/mobile spatial |
HRTF: Convolves audio with measured ear impulse responses (512-1024 taps). Creates convincing 3D positioning including elevation.
Ambisonics: Encodes sound field as spherical harmonics (W,X,Y,Z for 1st order). Rotation-invariant, efficient for many sources.
// Key insight: encode once, rotate cheaply
AmbisonicSignal encode(mono_input, direction) {
return {
mono * 0.707f, // W (omnidirectional)
mono * direction.x, // X (front-back)
mono * direction.y, // Y (left-right)
mono * direction.z // Z (up-down)
};
}
Procedural Footsteps
Why procedural beats samples:
- ✅ Infinite variation (no repetition)
- ✅ Tiny memory (~50KB vs 5-10MB)
- ✅ Parameter-driven (speed → impact force)
- ✅ Surface-aware from physics materials
Core synthesis:
- Impact burst (20ms noise + resonant tone)
- Surface texture (gravel = granular, grass = filtered noise)
- Debris (scattered micro-impacts)
- Surface EQ (metal = bright, grass = muffled)
// Surface resonance frequencies (expert knowledge)
float get_resonance(Surface s) {
switch(s) {
case Concrete: return 150.0f; // Low, dull
case Wood: return 250.0f; // Mid, warm
case Metal: return 500.0f; // High, ringing
case Gravel: return 300.0f; // Crunchy mid
default: return 200.0f;
}
}
Wwise/FMOD Integration
Key abstractions:
- Events: Trigger sounds (footstep, explosion, ambient loop)
- RTPC: Continuous parameters (speed 0-100, health 0-1)
- Switches: Discrete choices (surface type, weapon type)
- States: Global context (music intensity, underwater)
// Material-aware footsteps via Wwise
void OnFootDown(FHitResult& hit) {
FString surface = DetectSurface(hit.PhysMaterial);
float speed = GetVelocity().Size();
SetSwitch("Surface", surface, this); // Concrete/Wood/Metal
SetRTPCValue("Impact_Force", speed/600.0f); // 0-1 normalized
PostEvent(FootstepEvent, this);
}
UI/UX Sound Design
Principles for app sounds:
- Subtle - UI sounds at -18 to -24dB
- Short - 50-200ms for most interactions
- Consistent - Same family/timbre across app
- Accessible - Don't rely solely on audio for feedback
- Haptic-paired - iOS haptics should match audio characteristics
Sound types:
| Category |
Examples |
Duration |
Character |
| Tap feedback |
Button, toggle |
30-80ms |
Soft, high-frequency click |
| Success |
Save, send, complete |
150-300ms |
Rising, positive tone |
| Error |
Invalid, failed |
200-400ms |
Descending, minor tone |
| Notification |
Alert, reminder |
300-800ms |
Distinctive, attention-getting |
| Transition |
Screen change, modal |
100-250ms |
Whoosh, subtle movement |
iOS/Android Audio Sessions
iOS AVAudioSession categories:
.ambient - Mixes with other audio, silenced by ringer
.playback - Interrupts other audio, ignores ringer
.playAndRecord - For voice apps
.soloAmbient - Default, silences other audio
Critical handlers:
- Interruption (phone call)
- Route change (headphones unplugged)
- Secondary audio (Siri)
// Proper iOS audio session setup
func configureAudioSession() {
let session = AVAudioSession.sharedInstance()
try? session.setCategory(.playback, mode: .default, options: [.mixWithOthers])
try? session.setActive(true)
NotificationCenter.default.addObserver(
self,
selector: #selector(handleInterruption),
name: AVAudioSession.interruptionNotification,
object: nil
)
}
Performance Targets
| Operation |
CPU Time |
Notes |
| HRTF convolution (512-tap) |
~2ms/source |
Use FFT overlap-add |
| Ambisonic encode |
~0.1ms/source |
Very efficient |
| Ambisonic decode (binaural) |
~1ms total |
Supports many sources |
| Procedural footstep |
~1-2ms |
vs 500KB per sample |
| Wind synthesis |
~0.5ms/frame |
Real-time streaming |
| Wwise event post |
<0.1ms |
Negligible |
| iOS audio callback |
5-10ms budget |
At 48kHz/512 samples |
Budget guideline: Audio should use 5-10% of frame time.
Quick Reference
Spatial Audio Decision Tree
- VR with head tracking? → Ambisonics
- Few important sources? → Full HRTF
- Many background sources? → Simple panning + distance rolloff
- Mobile with limited CPU? → Binaural (simple) or panning
When to Use Procedural Audio
- Environmental (wind, rain, fire) → Always procedural
- Footsteps → Procedural for large games, samples for small
- UI sounds → Generated once, then cached
- Impacts/explosions → Hybrid (procedural + sample layers)
Platform Audio Sessions
- Game with music:
.ambient + mixWithOthers
- Meditation/focus app:
.playback (interrupt music)
- Voice chat:
.playAndRecord
- Video player:
.playback
Integrates With
- voice-audio-engineer - Voice synthesis and TTS
- vr-avatar-engineer - VR audio + avatar integration
- metal-shader-expert - GPU audio processing
- native-app-designer - App UI sound integration
For detailed implementations: See /references/implementations.md
Remember: Great audio is invisible—players feel it, don't notice it. Focus on supporting the experience, not showing off. Procedural audio saves memory and eliminates repetition. Always respect CPU budgets and platform audio session requirements.
1---2name: sound-engineer3description: Expert in spatial audio, procedural sound design, game audio middleware, and app UX sound design. Specializes in HRTF/Ambisonics, Wwise/FMOD integration, UI sound design, and adaptive music systems. Activate on 'spatial audio', 'HRTF', 'binaural', 'Wwise', 'FMOD', 'procedural sound', 'footstep system', 'adaptive music', 'UI sounds', 'notification audio', 'sonic branding'. NOT for music composition/production (use DAW), audio post-production for film (linear media), voice cloning/TTS (use voice-audio-engineer), podcast editing (use standard audio editors), or hardware design.4---5
6# Sound Engineer: Spatial Audio, Procedural Sound & App UX Audio
7
8Expert audio engineer for interactive media: games, VR/AR, and mobile apps. Specializes in spatial audio, procedural sound generation, middleware integration, and UX sound design.
9
10## When to Use This Skill
11
12✅ **Use for:**
13- Spatial audio (HRTF, binaural, Ambisonics)
14- Procedural sound (footsteps, wind, environmental)
15- Game audio middleware (Wwise, FMOD)
16- Adaptive/interactive music systems
17- UI/UX sound design (clicks, notifications, feedback)
18- Sonic branding (audio logos, brand sounds)
19- iOS/Android audio session handling
20- Haptic-audio coordination
21- Real-time DSP (reverb, EQ, compression)
22
23❌ **Do NOT use for:**
24- Music composition/production → DAW tools (Logic, Ableton)
25- Voice synthesis/cloning → **voice-audio-engineer**
26- Film audio post-production → linear editing workflows
27- Podcast editing → standard audio editors
28- Hardware microphone setup → specialized domain
29
30## MCP Integrations
31
32| MCP | Purpose |
33|-----|---------|
34| **ElevenLabs** | `text_to_sound_effects` - Generate UI sounds, notifications, impacts |
35| **Firecrawl** | Research Wwise/FMOD docs, DSP algorithms, platform guidelines |
36| **WebFetch** | Fetch Apple/Android audio session documentation |
37
38## Expert vs Novice Shibboleths
39
40| Topic | Novice | Expert |
41|-------|--------|--------|
42| **Spatial audio** | "Just pan left/right" | Uses HRTF convolution for true 3D; knows Ambisonics for VR head tracking |
43| **Footsteps** | "Use 10-20 samples" | Procedural synthesis: infinite variation, tiny memory, parameter-driven |
44| **Middleware** | "Just play sounds" | Uses RTPC for continuous params, Switches for materials, States for music |
45| **Adaptive music** | "Crossfade tracks" | Horizontal re-orchestration (layers) + vertical remixing (stems) |
46| **UI sounds** | "Any click sound works" | Designs for brand consistency, accessibility, haptic coordination |
47| **iOS audio** | "AVAudioPlayer works" | Knows AVAudioSession categories, interruption handling, route changes |
48| **Distance rolloff** | Linear attenuation | Inverse square with reference distance; logarithmic for realism |
49| **CPU budget** | "Audio is cheap" | Knows 5-10% budget; HRTF convolution is expensive (2ms/source) |
50
51## Common Anti-Patterns
52
53### Anti-Pattern: Sample-Based Footsteps at Scale
54**What it looks like**: 20 footstep samples × 6 surfaces × 3 intensities = 360 files (180MB)
55**Why it's wrong**: Memory bloat, repetition audible after 20 minutes of play
56**What to do instead**: Procedural synthesis - impact + texture layers, infinite variation from parameters
57**When samples OK**: Small games, very specific character sounds
58
59### Anti-Pattern: HRTF for Every Sound
60**What it looks like**: Full HRTF convolution on 50 simultaneous sources
61**Why it's wrong**: 50 × 2ms = 100ms CPU time; destroys frame budget
62**What to do instead**: HRTF for 3-5 important sources; Ambisonics for ambient bed; simple panning for distant/unimportant
63
64### Anti-Pattern: Ignoring Audio Sessions (Mobile)
65**What it looks like**: App audio stops when user gets a phone call, never resumes
66**Why it's wrong**: iOS/Android require explicit session management
67**What to do instead**: Implement `AVAudioSession` (iOS) or `AudioFocus` (Android); handle interruptions, route changes
68
69### Anti-Pattern: Hard-Coded Sounds
70**What it looks like**: `PlaySound("footstep_concrete_01.wav")`
71**Why it's wrong**: No variation, no parameter control, can't adapt to context
72**What to do instead**: Use middleware events with Switches/RTPCs; procedural generation for environmental sounds
73
74### Anti-Pattern: Loud UI Sounds
75**What it looks like**: Every button click at -3dB, same volume as gameplay audio
76**Why it's wrong**: UI sounds should be subtle, never fatiguing; violates platform guidelines
77**What to do instead**: UI sounds at -18 to -24dB; use short, high-frequency transients; respect system volume
78
79## Evolution Timeline
80
81### Pre-2010: Fixed Audio
82- Sample playback only
83- Basic stereo panning
84- Limited real-time processing
85
86### 2010-2015: Middleware Era
87- Wwise/FMOD become standard
88- RTPC and State systems mature
89- Basic HRTF support
90
91### 2016-2020: VR Audio Revolution
92- Ambisonics for VR head tracking
93- Spatial audio APIs (Resonance, Steam Audio)
94- Procedural audio gains traction
95
96### 2021-2024: AI & Mobile
97- ElevenLabs/AI sound effect generation
98- Apple Spatial Audio for AirPods
99- Procedural audio standard for AAA
100- Haptic-audio design becomes discipline
101
102### 2025+: Current Best Practices
103- AI-assisted sound design
104- Neural audio codecs
105- Real-time voice transformation
106- Personalized HRTF from photos
107
108## Core Concepts
109
110### Spatial Audio Approaches
111
112| Approach | CPU Cost | Quality | Use Case |
113|----------|----------|---------|----------|
114| **Stereo panning** | ~0.01ms | Basic | Distant sounds, many sources |
115| **HRTF convolution** | ~2ms/source | Excellent | Close/important 3D sounds |
116| **Ambisonics** | ~1ms total | Good | VR, many sources, head tracking |
117| **Binaural (simple)** | ~0.1ms/source | Decent | Budget/mobile spatial |
118
119**HRTF**: Convolves audio with measured ear impulse responses (512-1024 taps). Creates convincing 3D positioning including elevation.
120
121**Ambisonics**: Encodes sound field as spherical harmonics (W,X,Y,Z for 1st order). Rotation-invariant, efficient for many sources.
122
123```cpp
124// Key insight: encode once, rotate cheaply
125AmbisonicSignal encode(mono_input, direction) {
126 return {
127 mono * 0.707f, // W (omnidirectional)
128 mono * direction.x, // X (front-back)
129 mono * direction.y, // Y (left-right)
130 mono * direction.z // Z (up-down)
131 };
132}
133```
134
135### Procedural Footsteps
136
137**Why procedural beats samples:**
138- ✅ Infinite variation (no repetition)
139- ✅ Tiny memory (~50KB vs 5-10MB)
140- ✅ Parameter-driven (speed → impact force)
141- ✅ Surface-aware from physics materials
142
143**Core synthesis:**
1441. Impact burst (20ms noise + resonant tone)
1452. Surface texture (gravel = granular, grass = filtered noise)
1463. Debris (scattered micro-impacts)
1474. Surface EQ (metal = bright, grass = muffled)
148
149```cpp
150// Surface resonance frequencies (expert knowledge)
151float get_resonance(Surface s) {
152 switch(s) {
153 case Concrete: return 150.0f; // Low, dull
154 case Wood: return 250.0f; // Mid, warm
155 case Metal: return 500.0f; // High, ringing
156 case Gravel: return 300.0f; // Crunchy mid
157 default: return 200.0f;
158 }
159}
160```
161
162### Wwise/FMOD Integration
163
164**Key abstractions:**
165- **Events**: Trigger sounds (footstep, explosion, ambient loop)
166- **RTPC**: Continuous parameters (speed 0-100, health 0-1)
167- **Switches**: Discrete choices (surface type, weapon type)
168- **States**: Global context (music intensity, underwater)
169
170```cpp
171// Material-aware footsteps via Wwise
172void OnFootDown(FHitResult& hit) {
173 FString surface = DetectSurface(hit.PhysMaterial);
174 float speed = GetVelocity().Size();
175
176 SetSwitch("Surface", surface, this); // Concrete/Wood/Metal
177 SetRTPCValue("Impact_Force", speed/600.0f); // 0-1 normalized
178 PostEvent(FootstepEvent, this);
179}
180```
181
182### UI/UX Sound Design
183
184**Principles for app sounds:**
1851. **Subtle** - UI sounds at -18 to -24dB
1862. **Short** - 50-200ms for most interactions
1873. **Consistent** - Same family/timbre across app
1884. **Accessible** - Don't rely solely on audio for feedback
1895. **Haptic-paired** - iOS haptics should match audio characteristics
190
191**Sound types:**
192| Category | Examples | Duration | Character |
193|----------|----------|----------|-----------|
194| Tap feedback | Button, toggle | 30-80ms | Soft, high-frequency click |
195| Success | Save, send, complete | 150-300ms | Rising, positive tone |
196| Error | Invalid, failed | 200-400ms | Descending, minor tone |
197| Notification | Alert, reminder | 300-800ms | Distinctive, attention-getting |
198| Transition | Screen change, modal | 100-250ms | Whoosh, subtle movement |
199
200### iOS/Android Audio Sessions
201
202**iOS AVAudioSession categories:**
203- `.ambient` - Mixes with other audio, silenced by ringer
204- `.playback` - Interrupts other audio, ignores ringer
205- `.playAndRecord` - For voice apps
206- `.soloAmbient` - Default, silences other audio
207
208**Critical handlers:**
209- Interruption (phone call)
210- Route change (headphones unplugged)
211- Secondary audio (Siri)
212
213```swift
214// Proper iOS audio session setup
215func configureAudioSession() {
216 let session = AVAudioSession.sharedInstance()
217 try? session.setCategory(.playback, mode: .default, options: [.mixWithOthers])
218 try? session.setActive(true)
219
220 NotificationCenter.default.addObserver(
221 self,
222 selector: #selector(handleInterruption),
223 name: AVAudioSession.interruptionNotification,
224 object: nil
225 )
226}
227```
228
229## Performance Targets
230
231| Operation | CPU Time | Notes |
232|-----------|----------|-------|
233| HRTF convolution (512-tap) | ~2ms/source | Use FFT overlap-add |
234| Ambisonic encode | ~0.1ms/source | Very efficient |
235| Ambisonic decode (binaural) | ~1ms total | Supports many sources |
236| Procedural footstep | ~1-2ms | vs 500KB per sample |
237| Wind synthesis | ~0.5ms/frame | Real-time streaming |
238| Wwise event post | <0.1ms | Negligible |
239| iOS audio callback | 5-10ms budget | At 48kHz/512 samples |
240
241**Budget guideline**: Audio should use 5-10% of frame time.
242
243## Quick Reference
244
245### Spatial Audio Decision Tree
246- **VR with head tracking?** → Ambisonics
247- **Few important sources?** → Full HRTF
248- **Many background sources?** → Simple panning + distance rolloff
249- **Mobile with limited CPU?** → Binaural (simple) or panning
250
251### When to Use Procedural Audio
252- Environmental (wind, rain, fire) → Always procedural
253- Footsteps → Procedural for large games, samples for small
254- UI sounds → Generated once, then cached
255- Impacts/explosions → Hybrid (procedural + sample layers)
256
257### Platform Audio Sessions
258- **Game with music**: `.ambient` + `mixWithOthers`
259- **Meditation/focus app**: `.playback` (interrupt music)
260- **Voice chat**: `.playAndRecord`
261- **Video player**: `.playback`
262
263## Integrates With
264
265- **voice-audio-engineer** - Voice synthesis and TTS
266- **vr-avatar-engineer** - VR audio + avatar integration
267- **metal-shader-expert** - GPU audio processing
268- **native-app-designer** - App UI sound integration
269
270---
271
272**For detailed implementations**: See `/references/implementations.md`
273
274**Remember**: Great audio is invisible—players feel it, don't notice it. Focus on supporting the experience, not showing off. Procedural audio saves memory and eliminates repetition. Always respect CPU budgets and platform audio session requirements.