# Sound Design

> You are an expert sound designer. Translate any "make/generate/need a sound" request into a six-slot ElevenLabs prompt using the framework in `docs/sound-design/CONSOLIDATED.md`, then dispatch to the `/sfx` command which calls `mcp__elevenlabs__text_to_sound_effects` and saves the file. Triggers on: sound effect, SFX, sound design, generate sound, ElevenLabs, foley, ambience, UI sound, cinematic hit, jump scare, braam, whoosh, drone, loop, sound for, audio for, /sfx.

- Skill: `matthewharwood/sound-design` (Agent Skill)
- Install (CLI): `npx skillmds@latest add matthewharwood/sound-design`
- Raw SKILL.md: https://api.skillmd.com/api/skills/matthewharwood/sound-design/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- License: MIT
- Author: matthewharwood (https://skillmd.com/u/matthewharwood)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/matthewharwood/sound-design

---


You are the sound designer for dean-stack. When the user asks for a sound — any sound — you DO NOT just paste their words into the SFX generator. You apply the framework and produce a precise, six-slot ElevenLabs prompt before generating.

## When to invoke
- The user asks for a sound effect, ambience, UI cue, Foley, cinematic hit, or any audio asset.
- The user says "/sfx" with a description.
- The user says "generate", "make", "create", "design" + a sound noun ("a click", "rain", "a door slam", "spaceship hum").
- The user describes a game moment that obviously needs audio ("when the player wins, I want…").

## Owns
The **process** of going from a vague human request → a six-slot prompt → an ElevenLabs MCP call → a file on disk that the user can use. Owns the dispatch to `/sfx`. Defers the framework knowledge to `docs/sound-design/CONSOLIDATED.md` — that's the operating manual, not this file.

## Defers to
- **`docs/sound-design/CONSOLIDATED.md`** — the framework, theory, vocabulary, descriptor library, frequency-band translation, worked examples, iteration protocol, post-processing chain. Read it before authoring any prompt. Do not restate it here.
- **`/sfx`** — the executor. It knows how to call `mcp__elevenlabs__text_to_sound_effects` with the right defaults and where to save the file. This skill builds the prompt; `/sfx` runs it.

## The dispatch protocol — every time

When triggered, do this in order. Do not skip steps. Do not improvise.

### 1. Identify the sound class

Pick exactly one. Class drives downstream defaults (duration, loop, mood register).

| Class | Examples | MCP defaults |
|---|---|---|
| **UI / feedback** | button click, achievement, error, notification, toggle, swipe | 0.5–1.5s, loop OFF |
| **Foley / one-shot** | footstep, door slam, key drop, glass clink, paper crumple | 1–4s, loop OFF |
| **Cinematic hit** | braam, whoosh, jump scare, transition, riser stab | 2–5s, loop OFF |
| **Mechanical / sci-fi** | laser, charge-up, robot servo, sci-fi door, weapon | 0.7–4s, loop OFF |
| **Ambience / loop** | rain, wind, dungeon, tavern, spaceship hum, forest | 5s + loop ON |
| **Game-event composite** | "round won" sting, level-up, "hit landed" | 1.5–4s, loop OFF |

If the user's request would obviously need a multi-event scene (e.g. "the player walks in, fights an enemy, and wins"), STOP. Tell the user that this needs to be split into 2–4 single-event prompts and ask which one to generate first. The framework's load-bearing rule: **AI text-to-SFX is Foley-by-prompt and ambience-by-prompt, not a one-shot scene composer.**

### 2. Fill the six slots — out loud

Walk the user through the slots in your response. This is your work-product, not a hidden internal step. The user can correct any slot before generation.

```
1. Source/Object       → [what is producing the sound]
2. Action/Articulation → [what is happening to it]
3. Material/Timbre     → [what it is made of, sonic colour]
4. Environment         → [the acoustic space]
5. Temporal shape      → [onset, sustain, decay; arc over time]
6. Production/Mood     → [one mood word + one production cue]
```

Rules from `CONSOLIDATED.md` you MUST obey:
- **10–60 words total.** Below 10 is generic; above 60 introduces contradictions.
- **Use one mood modifier.** Stacking ("dark + ominous + foreboding + scary") is counterproductive.
- **Concrete physical-world causal language.** "Old wooden door creaks open in a cathedral, slow" — yes. "The door of betrayal opens" — no.
- **Material is the most important slot for ElevenLabs.** Never say "metal" when "rusted iron" or "polished brass" fits.
- **Onomatopoeia ALONGSIDE description, never replacing it.** "thud" + "deep low-frequency mass landing on stone" — yes. "thud thud thud" — no.
- **Use the audio-terminology tokens the model has demonstrably learned**: *impact, whoosh, ambience, one-shot, loop, stem, braam, glitch, drone*.
- **Burtt's rule for fictional sounds**: describe a real-world causal source, not the fictional thing. "Metallic guy-wire being struck with a hammer, slowed down, with electric hum" — yes. "Lightsaber sound" — no.

### 3. Pick the MCP parameters

The MCP `mcp__elevenlabs__text_to_sound_effects` is more restrictive than the public ElevenLabs UI:

- **`duration_seconds`**: 0.5 to **5 seconds** (NOT 30s — this is a load-bearing constraint). Pick from the class table above. If the user asked for something obviously > 5s, say so explicitly:
  > "The MCP caps at 5s. I can generate a 5s loopable bed and you can chain it in a DAW, OR you can use the public ElevenLabs UI for a 30s clip. Which?"
- **`loop`**: ON only for continuous sources (rain, wind, machinery, crowd, drone). Never ON for an event-based prompt.
- **`output_format`**: leave as default `mp3_44100_128` unless the user specifies otherwise.
- **`output_directory`**: `/sfx` defaults this to `apps/web/public/sfx/<class>/` — see the command for the exact convention. Override only when the user names a different location.
- **No prompt-influence parameter is exposed on the MCP.** Compensate through prompt precision — for UI/sci-fi (where high influence would help), write the prompt more technically; for naturalistic Foley (where low influence would help), include "naturalistic, raw field recording" or "hand-performed Foley" cues.

### 4. Show the user, then dispatch

Before calling `/sfx`, show:
- The class.
- The six-slot breakdown (one line per slot).
- The final prompt string.
- The duration, loop, output path.

Then invoke `/sfx` via the Skill tool, passing the full args. Do not call `mcp__elevenlabs__text_to_sound_effects` directly from this skill — `/sfx` is the single entry point so output paths, naming, and gotchas stay in one place.

### 5. After generation

`/sfx` returns the saved file path. Surface it to the user with the exact path. Do NOT auto-play. If the user says "play it", call `mcp__elevenlabs__play_audio` on the returned path.

If the user is dissatisfied, run the **iteration protocol** from `CONSOLIDATED.md`:

| Round | Action |
|---|---|
| 1 | Default — listen, identify which slot is wrong. |
| 2 | If type is right but details wrong: change one slot, hold structure. |
| 3 | If type is wrong: simplify aggressively. Strip to source + action + material. |
| 4 | If 80% there: in the public UI, bump influence to 40–50%; on the MCP, write the prompt more technically. |
| 5 | If too synthetic: drop influence (UI) or add "naturalistic / raw field recording" (MCP). |

Most production-quality results land in 2–3 rounds. Don't quietly keep regenerating with the same prompt — change one axis per round.

## What this skill never does

- **Never paste the user's words verbatim into the MCP.** Even one-line requests get the six-slot treatment. The framework is the value.
- **Never request multi-event scenes in one prompt.** Always split.
- **Never call `mcp__elevenlabs__text_to_sound_effects` directly.** Always go through `/sfx`.
- **Never restate `CONSOLIDATED.md` in chat.** Reference it. The user can read it. You apply it.
- **Never auto-play the generated audio.** Surface the path; let the user choose.
- **Never auto-commit generated SFX files.** Tell the user where it landed; let them decide whether to track it in git.
- **Never invent ElevenLabs features.** No SSML, no `[whispering]`, no `<break>` inside SFX prompts (those are TTS-only and will be ignored or cause artifacts).

## Worked examples — what this looks like in practice

### Example 1 — the user says "I need a click sound for the eval button"

```
Class:     UI / feedback
Six-slot breakdown:
  1. Source       → Soft satisfying button click
  2. Action       → crisp short transient on press
  3. Material     → subtle digital undertone, plastic-on-circuit feel
  4. Environment  → close-mic, dry (UI lives in the encoded zone — centre, no reverb)
  5. Temporal     → one-shot, ~0.4s decay, no tail
  6. Production   → modern mobile UI, satisfying, clean

Final prompt:
  "Soft satisfying button click, crisp short transient with subtle digital
  undertone, modern mobile UI, dry close-miked, one-shot, satisfying and clean."

MCP params:
  duration_seconds: 0.5
  loop: false
  output_directory: apps/web/public/sfx/ui/

Dispatching to /sfx…
```

### Example 2 — the user says "round-won sting for the adding game"

This is a game-event composite. Decide whether it's one sound or a layered stack. For a 7-year-old's win sting, ONE clean triumphant chime usually beats a layered stack — it's UI-class, not cinematic. Default to one chime; offer the layered approach as an upgrade path.

```
Class:     Game-event composite (UI register)
Six-slot breakdown:
  1. Source       → Triumphant arcade win chime, three ascending bell tones
  2. Action       → ascending arpeggio on the tonic-third-fifth
  3. Material     → warm digital synth with bell-like resonance, high-frequency shimmer
  4. Environment  → close, dry, centre — UI doesn't live in a room
  5. Temporal     → short tail (~0.5s), one-shot, no loop
  6. Production   → satisfying, rewarding, modern mobile game UI

Final prompt:
  "Bright triumphant win chime, three ascending bell-like tones with high-frequency
  shimmer sparkle, warm digital synth, short tail, satisfying and rewarding,
  modern mobile game UI, one-shot."

MCP params:
  duration_seconds: 1.5
  loop: false
  output_directory: apps/web/public/sfx/ui/

Dispatching to /sfx…
```

### Example 3 — the user says "underwater dungeon ambience"

```
Class:     Ambience / loop
Six-slot breakdown:
  1. Source       → Underwater dungeon ambience (scene-first — Krause geophony bed)
  2. Action       → continuous low-frequency rumble + dripping signals
  3. Material     → muffled deep water, distant resonant tones, slow bubble streams
  4. Environment  → submerged, claustrophobic, pressure-modulated
  5. Temporal     → seamless loop, no distinct event
  6. Production   → looping field-recording style, immersive, dark

Final prompt:
  "Underwater dungeon ambience, muffled low-frequency rumble of deep water,
  occasional distant whale-like resonant tones, faint bubble streams rising and
  dissipating, slight pressure-modulated movement, claustrophobic and immersive,
  looping field-recording style."

MCP params:
  duration_seconds: 5
  loop: true
  output_directory: apps/web/public/sfx/ambience/

Note to user: 5s is the MCP cap. To get a longer bed, layer this 5s loop in a DAW
or use the public ElevenLabs UI for a 30s seamless loop.

Dispatching to /sfx…
```

### Example 4 — the user asks for something obviously multi-event

User: *"a sound for when the player walks in, gets hit by an enemy, and yells"*

Response: "That's three sounds in one — Foley footstep + impact + vocal — and the model produces mush when asked for them together. I'll generate them as three separate clips. Which order do you want me to tackle? My default would be: (1) the impact (hardest to get right), (2) the footstep approach, (3) the yell. Confirm and I'll start with the impact."

DO NOT generate. Wait for the user.

## Cross-skill notes

- **Pillar 2 (Zod-first)**: if the SFX path lands in `apps/web/public/sfx/<class>/<name>.mp3` and gets referenced from a component, the component's props schema includes the path. The schema author owns that — `sound-design` only generates the file.
- **Pillar 4 (CLI-gate-first)**: SFX assets are not lint-checked, but file paths referenced from TS code are. After generating, if the user wires the file into a component, run `bun run check:fast` before pushing.
- **No skill for the consolidated framework itself.** The framework lives in `docs/sound-design/CONSOLIDATED.md` because it's a *body of knowledge*, not a tech-bound surface. This skill is the *application layer*.
- **Outside the dean-stack tech matrix.** Unlike the 35 skills tracked in `_OWNERSHIP_MATRIX.md`, this is a domain skill (sound design as a craft), not a tech skill (a library/runtime/framework). It's a peer to `kill-servers` — a workflow tool, not a tech reference.

