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:
data-ai
license: Apache-2.0 NOT for unrelated tasks outside this domain.
development
Use when designing caching strategies (cache-aside, write-through, write-behind), implementing distributed locks, building rate limiters, leaderboards, real-time streams (XADD/consumer groups), pub/sub, or tuning eviction policies. Triggers: thundering-herd on cache miss, dogpile on key expiry, Redlock vs SET-NX-PX choice, sliding-window rate limiter, hot-key on a single cluster slot, big-key blowup, MULTI/EXEC across slots, KEYS in production. NOT for Redis Cluster operations/admin (different domain), embedded KV (SQLite, leveldb), in-process LRU caches, or Memcached.
tools
Drawing the `'use client'` boundary correctly in React Server Components apps (Next.js App Router, RSC frameworks) — leaf-pushing, slot composition, serialization rules, and environment poisoning prevention. Grounded in react.dev and Next.js 16 docs.
development
Use when designing rate limiting for an API, choosing between token bucket / sliding window / leaky bucket / fixed window, implementing it in Redis, deciding edge (Cloudflare/Upstash) vs origin enforcement, sizing per-user vs per-IP vs per-endpoint quotas, returning the right 429 response with Retry-After, or fixing the boundary-burst bug in fixed-window limiters. Triggers: 429 too many requests, INCR + EXPIRE, ZADD + ZREMRANGEBYSCORE + ZCARD, X-RateLimit-Remaining header, Cloudflare WAF rate limiting rules, Upstash @upstash/ratelimit, leaky bucket shaping vs policing, distributed rate limiter consistency. NOT for DDoS mitigation specifically (different scale), CAPTCHA / bot management, full WAF design, or per-user quota billing.