Audio sourcing checklist — p2-16
Generated: 2026-04-27 from public/games/age-of-dwarves/data/audio.json.
Total files needed: 57 SFX + 7 music = 64 files.
This is the concrete punch-list a fetch-capable agent (or human) works
through. For each row, the goal is to find a real OSS file that fits the
description, fetch its source page, capture the licence text VERBATIM,
and then add a row to public/games/age-of-dwarves/assets/audio/sources.csv.
Licence policy (enforced by tools/audio-licenses-render.py):
- Accept: CC0-1.0, CC-BY-3.0, CC-BY-4.0, Pixabay, Sonniss-GDC-YYYY,
Public-Domain.
- Reject: anything containing
-SA or -NC; anything off the
allowlist.
- CC-BY-* requires a non-empty
attribution (author + provider).
Search priority: Pixabay → Freesound CC0 → Freesound CC-BY → OpenGameArt CC0/CC-BY → Sonniss bundles.
Theme: dwarven, dark stone hall + forge + deep mountain. Keywords for
every search: hammer anvil forge stone cave torch armor gauntlet drum horn brass low chant.
SFX — Turn cycle (2)
| Output path |
Description |
Search hints |
audio/sfx/turn_started.ogg |
Short horn flourish |
"war horn fanfare short", "brass call 1s" |
audio/sfx/turn_ended.ogg |
Muted drumroll |
"low drum hit", "war drum thud" |
SFX — City (5)
| Output path |
Description |
Search hints |
audio/sfx/city_founded.ogg |
Stone-on-stone founding chime, bell tail |
"stone slab + bell", "foundation stone" |
audio/sfx/city/city_grew.ogg |
Gentle bell on population growth |
"soft chime bell" |
audio/sfx/city/city_starved.ogg |
Hollow wind on starvation |
"hollow wind drone short" |
audio/sfx/border_expanded.ogg |
Soft brass on border claim |
"brass swell short low" |
audio/sfx/wonder_built.ogg |
Reverberant choral swell |
"choir swell reverb majestic" |
SFX — Combat (3)
| Output path |
Description |
Search hints |
audio/sfx/combat/combat_started.ogg |
War-horn before first blow |
"war horn medieval long" |
audio/sfx/combat_hit.ogg |
Generic combat impact (categorical fallback) |
"blade clang short", "metal impact" |
audio/sfx/unit_killed.ogg |
Death thud + metal (categorical fallback) |
"armor fall metal", "death thud" |
SFX — Units / melee (8)
| Output path |
Description |
Search hints |
audio/sfx/units/melee/attack_01.ogg |
Sword/axe swing variant 1 |
"sword swing whoosh", "axe swing" |
audio/sfx/units/melee/attack_02.ogg |
Sword/axe swing variant 2 |
"sword swing whoosh", "axe swing" |
audio/sfx/units/melee/attack_03.ogg |
Sword/axe swing variant 3 |
"sword swing whoosh", "axe swing" |
audio/sfx/units/melee/hit_01.ogg |
Blade-on-shield variant 1 |
"sword shield clang" |
audio/sfx/units/melee/hit_02.ogg |
Blade-on-shield variant 2 |
"sword shield clang" |
audio/sfx/units/melee/hit_03.ogg |
Blade-on-shield variant 3 |
"sword shield clang" |
audio/sfx/units/melee/death_01.ogg |
Fall + clatter variant 1 |
"armor fall body" |
audio/sfx/units/melee/death_02.ogg |
Fall + clatter variant 2 |
"armor fall body" |
SFX — Units / ranged (5)
| Output path |
Description |
Search hints |
audio/sfx/units/ranged/fire_01.ogg |
Bowstring + arrow variant 1 |
"bow release arrow", "arrow shoot" |
audio/sfx/units/ranged/fire_02.ogg |
Bowstring + arrow variant 2 |
"bow release arrow", "arrow shoot" |
audio/sfx/units/ranged/hit_01.ogg |
Arrow thunk variant 1 |
"arrow impact wood", "arrow thunk" |
audio/sfx/units/ranged/hit_02.ogg |
Arrow thunk variant 2 |
"arrow impact wood", "arrow thunk" |
audio/sfx/units/ranged/death_01.ogg |
Ranged death |
"armor fall light" |
SFX — Units / siege (2)
| Output path |
Description |
Search hints |
audio/sfx/units/siege/bombard_01.ogg |
Deep concussive boom |
"cannon boom", "siege bombard low" |
audio/sfx/units/siege/bombard_02.ogg |
Deep concussive boom |
"cannon boom", "siege bombard low" |
SFX — Units / civilian (1)
| Output path |
Description |
Search hints |
audio/sfx/units/civilian/death.ogg |
Civilian death thud |
"body fall soft" |
SFX — Buildings (4)
| Output path |
Description |
Search hints |
audio/sfx/buildings/build_complete_civic.ogg |
Low ceremonial bell |
"bell low temple" |
audio/sfx/buildings/build_complete_prod.ogg |
Anvil ring |
"anvil hammer ring", "blacksmith anvil" |
audio/sfx/buildings/build_complete_mil.ogg |
Drum + horn |
"war drum + horn", "military fanfare" |
audio/sfx/buildings/build_complete_def.ogg |
Stone-slab thump |
"stone slab heavy", "wall thud" |
SFX — Research (3)
| Output path |
Description |
Search hints |
audio/sfx/tech_researched.ogg |
Bright scholarly chime |
"page turn + chime", "wisdom bell" |
audio/sfx/culture_researched.ogg |
Drum + chant on tradition complete |
"tribal drum chant", "shaman drum" |
audio/sfx/research_start.ogg |
Soft tap, deliberately quiet |
"soft pen scratch", "quiet tap" |
SFX — Era / golden age / victory (4)
| Output path |
Description |
Search hints |
audio/sfx/era_advanced.ogg |
Deep gong + ascending brass |
"gong + brass swell" |
audio/sfx/golden_age_swell.ogg |
Slow brass crescendo |
"brass crescendo slow majestic" |
audio/sfx/victory_fanfare.ogg |
Full brass fanfare ~10 s |
"victory brass fanfare" |
audio/sfx/unit_promoted.ogg |
Brass flourish |
"short brass flourish" |
SFX — Unit movement (1)
| Output path |
Description |
Search hints |
audio/sfx/unit_moved.ogg |
Soft boot-on-stone tick (throttled) |
"boot stone step", "footstep stone" |
SFX — Fauna (10)
| Output path |
Description |
Search hints |
audio/sfx/fauna/spawn.ogg |
Brush rustle on spawn |
"brush rustle leaves" |
audio/sfx/fauna/predator_spawn.ogg |
Wolf-tier spawn |
"wolf bush rustle low" |
audio/sfx/fauna/predator_attack_01.ogg |
Snarl + impact variant 1 |
"wolf snarl bite" |
audio/sfx/fauna/predator_attack_02.ogg |
Snarl + impact variant 2 |
"bear growl swipe" |
audio/sfx/fauna/predator_hurt_01.ogg |
Predator hurt 1 |
"wolf yelp" |
audio/sfx/fauna/predator_hurt_02.ogg |
Predator hurt 2 |
"bear yelp short" |
audio/sfx/fauna/predator_death.ogg |
Predator death |
"animal death cry short" |
audio/sfx/fauna/apex_roar.ogg |
Apex spawn (dire roar) |
"deep cave bear roar", "monster low roar" |
audio/sfx/fauna/apex_attack.ogg |
Apex attack |
"monster heavy hit" |
audio/sfx/fauna/apex_death.ogg |
Apex death |
"monster death low" |
audio/sfx/fauna/herbivore_call.ogg |
Distant deer / elk call |
"deer elk call distant" |
audio/sfx/fauna/herbivore_death.ogg |
Herbivore death |
"deer death short" |
SFX — Weather (5)
| Output path |
Description |
Search hints |
audio/sfx/weather/storm.ogg |
Distant thunder loop |
"distant thunder rumble" |
audio/sfx/weather/blizzard.ogg |
Wind + ice |
"blizzard wind howl" |
audio/sfx/weather/heat_wave.ogg |
Locust + sun-drone |
"cicada locust drone" |
audio/sfx/weather/drought.ogg |
Dry crackle |
"dry wind hot drone" |
audio/sfx/weather/tornado.ogg |
Heavy wind roar |
"tornado roar" |
audio/sfx/weather/hurricane.ogg |
Howling rain wall |
"hurricane wind rain" |
Music (7) — all ~3 min seamless loops except victory
| Output path |
Description |
Search hints |
audio/music/overworld_awakening.ogg |
Era 1-2: sparse horn drones + low drums |
"ambient drone tribal low loop" |
audio/music/overworld_craft.ogg |
Era 3-4: forge-rhythm percussion + strings |
"forge rhythm strings loop" |
audio/music/overworld_kingdoms.ogg |
Era 5-6: measured march + choir |
"medieval march choir loop" |
audio/music/overworld_industry.ogg |
Era 7-8: industrial pulse + low brass |
"industrial pulse brass loop" |
audio/music/overworld_ascension.ogg |
Era 9-10: orchestral peak + full choir |
"orchestral choir epic loop" |
audio/music/golden_age.ogg |
Active during golden age: slow brass crescendo, looping |
"majestic brass loop slow" |
audio/music/victory.ogg |
Post-game ~10 s, non-looping |
"victory choir brass cadence" |
Workflow per file
For each row in this checklist:
- Search the priority sites (Pixabay → Freesound CC0 → CC-BY → OpenGameArt → Sonniss).
- Open the source page. Read the licence panel.
- Verify it's on the allowlist and contains no
-SA / -NC.
- Note: source URL, exact licence string, author name (for CC-BY).
- Download the file. Edit:
- Trim silence at head/tail.
- Normalize peak to ~−3 dBFS (SFX) or ~−14 LUFS (music).
- Re-encode to Ogg Vorbis 44.1 kHz / 128 kbps stereo (mono OK for foley).
- For music: ensure seamless loop (audition the head→tail crossover).
- Drop into
public/games/age-of-dwarves/assets/audio/<path> matching
the row's output_path exactly.
- Append a row to
public/games/age-of-dwarves/assets/audio/sources.csv:
audio/sfx/units/melee/attack_01.ogg,https://freesound.org/people/Foo/sounds/123,CC-BY-4.0,Foo (Freesound),trim+normalize,2026-04-27
- Run:
python3 tools/audio-licenses-render.py # regenerate LICENSES.md
python3 tools/audio-validate.py # confirm manifest still validates
When all 64 rows are populated, run ./run validate and the live
audible smoke (boot the game, fire each EventBus signal kind once,
confirm audible playback).
Verification
The checklist is in sync with audio.json when:
python3 tools/audio-validate.py # exits 0
python3 tools/audio-licenses-render.py --check # exits 0
Both run clean today (with the expected 63-files-pending warning). Once
sourcing completes, ./run validate should produce zero warnings.