skills/sound-engineer/SKILL.md
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.
npx skillsauth add curiositech/windags-skills sound-engineerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
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.
IF (budget < $10k AND indie game):
└─ Use free FMOD (up to $500k revenue)
IF (AAA production OR need extensive audio design tools):
└─ Use Wwise
└─ IF (team has dedicated audio programmers):
└─ Full Wwise SDK integration
└─ ELSE (programmers need simple API):
└─ Use Wwise Unity/Unreal plugins
IF (mobile-only OR web deployment):
└─ Consider lightweight alternatives
└─ Check platform restrictions (iOS/WebGL)
Decision Matrix Based on Context:
Sources > 20 AND VR with head tracking:
└─ Use Ambisonics (encode once, rotate cheaply)
Sources < 10 AND close/important sounds:
└─ Use full HRTF convolution per source
Mobile OR CPU budget tight:
└─ IF (stereo headphones expected):
└─ Simple binaural panning
└─ ELSE:
└─ Standard stereo panning + distance rolloff
Background/ambient sounds:
└─ Always use simple panning (save CPU for foreground)
IF (music needs to match gameplay intensity):
└─ Horizontal Re-orchestration:
└─ Layer 1: Basic rhythm/bass
└─ Layer 2: Add melody
└─ Layer 3: Add harmony/counterpoint
└─ Layer 4: Full orchestration
IF (different moods needed per area):
└─ Vertical Stems:
└─ Peaceful stem (woodwinds, strings)
└─ Tense stem (brass, percussion)
└─ Combat stem (full orchestra)
└─ Crossfade based on game state
IF (seamless transitions critical):
└─ Use musical bars as transition boundaries
└─ Pre-calculate next transition point
└─ Never cut mid-phrase
Memory budget > 5MB AND < 50 total surfaces:
└─ Use sample library approach
Memory budget tight OR > 100 surface variations:
└─ Procedural synthesis:
└─ Impact component (filtered noise burst)
└─ Surface texture (material-specific)
└─ Debris scattering (micro-impacts)
Performance critical (mobile):
└─ Pre-generate variations at load time
└─ Cache 10-20 variants per surface type
Symptom: Frame drops when 20+ sounds play simultaneously Detection: CPU profiler shows >50% time in HRTF convolution Root Cause: Applying full HRTF to every sound source Fix: Use HRTF only for 3-5 important sources; simple panning for background Prevention: Set source importance hierarchy at design time
Symptom: 500MB+ audio assets for simple character movement Detection: 50+ footstep samples per character/surface combination Root Cause: Artist creating samples for every possible variation Fix: Implement procedural footstep synthesis with 4-5 base components Prevention: Establish memory budgets early; use procedural for high-variation content
Symptom: App audio stops working after phone call/notification Detection: Audio stops, never resumes; works fine on first launch Root Cause: No interruption handling for iOS/Android audio sessions Fix: Implement proper session management with interruption observers Prevention: Test with incoming calls, music apps, Siri activation
Symptom: Users disable sound after 10 minutes of interaction Detection: Every button click at same volume as gameplay audio Root Cause: UI sounds mixed at gameplay levels (-6dB instead of -20dB) Fix: Reduce UI sounds to -18 to -24dB; use subtle, brief tones Prevention: Follow platform audio guidelines; A/B test with real users
Symptom: Audio stutters, pops, or cuts out during intense scenes Detection: Audio callback exceeds allocated time budget (>10ms) Root Cause: Too many real-time effects, unoptimized convolution Fix: Use FFT-based convolution; limit concurrent DSP effects Prevention: Profile on lowest-spec target device; set hard limits
Scenario: VR game needs infinite footstep variation across 15 surface types, tight memory budget (50MB total audio)
Expert Decision Process:
Implementation:
void OnVRFootstep(Vector3 position, PhysicsMaterial surface, float velocity) {
// Surface-specific parameters (expert knowledge)
SurfaceParams params = GetSurfaceParams(surface);
// Procedural synthesis
float impact_force = Mathf.Clamp01(velocity / 3.0f); // 3m/s = max force
// Wwise integration
SetRTPCValue("Impact_Force", impact_force, player);
SetRTPCValue("Surface_Hardness", params.hardness, player);
SetSwitch("Surface_Type", params.type_name, player);
PostEvent("Play_Footstep_Procedural", player);
}
Novice vs Expert Trade-offs:
Scenario: Meditation app needs subtle notification sounds that respect music apps and phone calls
Expert Decision Process:
.ambient with .mixWithOthers (don't interrupt Spotify)Implementation:
class AppAudioManager {
func setupAudioSession() {
let session = AVAudioSession.sharedInstance()
try? session.setCategory(.ambient, mode: .default, options: [.mixWithOthers])
// Handle interruptions (phone calls, Siri)
NotificationCenter.default.addObserver(
self, selector: #selector(handleInterruption),
name: AVAudioSession.interruptionNotification, object: nil
)
}
@objc func handleInterruption(notification: Notification) {
guard let info = notification.userInfo,
let typeValue = info[AVAudioSessionInterruptionTypeKey] as? UInt,
let type = AVAudioSession.InterruptionType(rawValue: typeValue) else { return }
switch type {
case .began:
pauseAllAudio() // Phone call started
case .ended:
if let optionsValue = info[AVAudioSessionInterruptionOptionKey] as? UInt {
let options = AVAudioSession.InterruptionOptions(rawValue: optionsValue)
if options.contains(.shouldResume) {
resumeAudio() // Safe to resume
}
}
}
}
}
What Novice Misses: Assumes audio "just works"; ignores platform session requirements Expert Insight: Mobile audio requires explicit session management; test with real interruptions
Scenario: Action RPG needs music that scales with combat intensity (0 = exploration, 1 = boss fight)
Expert Decision Process:
Wwise Implementation:
Combat_Music_Container/
├── Layer_1_Rhythm (RTPC: Combat_Intensity > 0.0)
├── Layer_2_Melody (RTPC: Combat_Intensity > 0.3)
├── Layer_3_Harmony (RTPC: Combat_Intensity > 0.6)
└── Layer_4_Full_Orch (RTPC: Combat_Intensity > 0.8)
Code Integration:
void UpdateCombatMusic() {
float intensity = CalculateCombatIntensity(); // 0.0 = safe, 1.0 = boss fight
// Smooth the transitions (avoid jarring jumps)
float smoothed = Mathf.Lerp(current_intensity, intensity, Time.deltaTime * 2.0f);
current_intensity = smoothed;
// Only update on musical boundaries
if (IsOnMusicalBeat() && Mathf.Abs(smoothed - last_sent_intensity) > 0.1f) {
SetRTPCValue("Combat_Intensity", smoothed, music_player);
last_sent_intensity = smoothed;
}
}
Expert vs Novice:
Audio implementation is complete when ALL conditions are verified:
This skill should NOT be used for:
voice-audio-engineer skill insteadDelegation Rules:
tools
Building resilient distributed systems with circuit breakers, retries with full-jitter exponential backoff, retry budgets (per-request 3-attempt + per-client 10% ratio per Google SRE), deadline propagation, and the cascading-failure math (4 layers × 3 retries = 64x amplification). Grounded in Resilience4j, Microsoft Cloud Patterns, AWS Architecture Blog (Marc Brooker), and Google SRE Book.
testing
Designing HTTP cache headers that work correctly across browsers, CDNs, and shared proxies — `Cache-Control` directives per RFC 9111, `stale-while-revalidate` and `stale-if-error` per RFC 5861, the Vary header for varying responses, and surrogate keys for tag-based purging. Grounded in IETF RFCs and Cloudflare/Fastly docs.
development
Use when designing or fixing a Content Security Policy on a real site, choosing between nonce-based and hash-based CSP, adding strict-dynamic, debugging "Refused to execute inline script" errors, deploying CSP in report-only mode first, configuring report-to / report-uri, or auditing an existing policy for unsafe-inline / unsafe-eval / wildcards. Triggers: "CSP blocks legitimate inline script", strict-dynamic, nonce-{RANDOM}, sha256-{HASH}, object-src none, base-uri none, frame-ancestors, Trusted Types, X-Content-Security-Policy obsolete, report-only vs enforced. NOT for general HTTP security headers (HSTS, COOP/COEP), Trusted Types deep dive, CORS configuration, or building a WAF.
tools
Choosing and operating an HTTP API versioning strategy that doesn't break clients — Stripe's date-based pinned versions, the Deprecation/Sunset header pair (RFC 9745 + RFC 8594), URI vs header vs media-type approaches, and the version-transformer pattern. Grounded in Stripe's published architecture and IETF RFCs.