Preparing the audio files
Minecraft Bedrock accepts audio in two formats: Ogg Vorbis (.ogg) and uncompressed WAV (.wav). While WAV files work for short effects during testing, you should convert all final assets to .ogg to keep your pack size small and prevent memory issues on mobile devices.
For spatial 3D sounds—audio that gets quieter as the player walks away from the entity or block—your audio file must be exported with a single channel (mono). If you provide a stereo file, the game engine cannot calculate directional panning or distance attenuation, and the sound will play at full volume across the entire dimension or wherever the listener is standing.
Place your exported audio files inside the RP/sounds/ directory of your resource pack. Organising them into subfolders like RP/sounds/mob/goblin/ or RP/sounds/blocks/machine/ keeps your pack clean and matches the vanilla folder structure.
Registering the sound event
Before the game can play a file, it needs a short identifier known as a sound event. You define these in RP/sounds/sound_definitions.json. This file acts as a bridge between the physical file path on disk and the string identifier you use in commands, animations, and sound registries.
Notice that file paths inside this JSON never include the .ogg or .wav file extension. The engine automatically searches for a matching file at the specified path. You can also list multiple files in the sounds array; when the event triggers, the engine picks one at random, which prevents repetitive audio when a player breaks several blocks in a row.
| Field | What it does | Notes |
|---|---|---|
| category | Assigns the sound to a volume slider in the player's audio settings. | Common values include "neutral", "hostile", "block", "player", "ambient", and "music". |
| max_distance | Sets the radius in blocks at which the sound fades to silence. | Optional float. If omitted, the engine calculates falloff based on volume. |
| stream | Streams the audio from disk instead of loading it all into RAM. | Boolean inside the sound object. Set to true for long tracks or music; leave out for short effects. |
| weight | Adjusts how likely this specific file is chosen from the array. | Integer inside the sound object. Higher numbers play more frequently relative to siblings. |
{
"format_version": "1.14.0",
"sound_definitions": {
"mob.goblin.ambient": {
"category": "neutral",
"max_distance": 16.0,
"sounds": [
"sounds/mob/goblin/idle1",
{
"name": "sounds/mob/goblin/idle2",
"volume": 0.8,
"pitch": 1.0,
"load_on_low_memory": true
}
]
},
"dig.custom_machine": {
"category": "block",
"sounds": [
"sounds/blocks/machine_break1",
"sounds/blocks/machine_break2"
]
}
}
}Wiring sounds to a custom entity
There are two ways to make a custom entity play your registered sound event. For automatic lifecycle sounds—such as ambient noises, hurt cries, death sounds, and footsteps—you map them inside RP/sounds.json. This file sits in the root of your resource pack, not inside the RP/sounds/ subfolder.
Under the entity_sounds object, you add your custom entity's full identifier (including the namespace) and bind standard game events like ambient, hurt, death, or step to the sound event names you created in sound_definitions.json.
{
"entity_sounds": {
"entities": {
"my_pack:goblin": {
"volume": 1.0,
"pitch": [
0.8,
1.2
],
"events": {
"ambient": "mob.goblin.ambient",
"hurt": {
"sound": "mob.goblin.hurt",
"volume": 1.0,
"pitch": 1.0
},
"death": "mob.goblin.death",
"step": {
"sound": "mob.goblin.step",
"volume": 0.25
}
}
}
}
}
}Triggering entity sounds from animations
For attacks, spells, or custom actions that do not fit into the standard hurt or ambient slots, you wire the sound through the entity's client description and trigger it in an animation.
First, open your client entity file (in RP/entity/) and add a sound_effects block under description. This assigns a short local alias to your sound event. Once declared, you can trigger that alias at an exact keyframe timestamp inside an animation file, or state-change it inside an animation controller.
{
"format_version": "1.10.0",
"minecraft:client_entity": {
"description": {
"identifier": "my_pack:goblin",
"materials": {
"default": "entity_alphatest"
},
"textures": {
"default": "textures/entity/goblin"
},
"geometry": {
"default": "geometry.goblin"
},
"sound_effects": {
"laugh": "mob.goblin.ambient"
},
"animations": {
"attack_anim": "animation.goblin.attack"
},
" render_controllers": [
"controller.render.default"
]
}
}
}Wiring sounds to a custom block
Blocks use a two-tier system in RP/sounds.json. First, you define an interactive sound set under block_sounds, which groups the breaking, placing, hitting, and stepping audio under a single profile name. Next, you assign that profile name to your custom block inside RP/blocks.json.
In RP/sounds.json, add a block_sounds section alongside entity_sounds if you use both. Then open RP/blocks.json in the root of your resource pack and set the sound property of your custom block to match the profile name you just created.
{
"block_sounds": {
"custom_machine_sounds": {
"volume": 1.0,
"pitch": 1.0,
"events": {
"default": "dig.custom_machine",
"item.use.on": "dig.custom_machine",
"break": {
"sound": "dig.custom_machine",
"volume": 1.0,
"pitch": [
0.8,
1.0
]
},
"hit": "dig.custom_machine",
"place": "dig.custom_machine",
"step": {
"sound": "dig.custom_machine",
"volume": 0.4
}
}
}
}
}Assigning the block sound profile
With the sound set named custom_machine_sounds defined in RP/sounds.json, reference it in RP/blocks.json using your custom block's identifier. Whenever a player walks on, mines, or places my_pack:machine_block, the game will look up the custom_machine_sounds profile and play the dig.custom_machine sound event.
If you also want your custom block to play a sound on demand—for example, when a player interacts with it or on a repeating tick—you can pair the standard Script API world.playSound or dimension.playSound methods with a custom component in your behaviour pack, passing the string "dig.custom_machine" directly to the function.
{
"format_version": [
1,
1,
0
],
"my_pack:machine_block": {
"sound": "custom_machine_sounds"
}
}Which versions this applies to
Applies to all stable Minecraft Bedrock versions 1.14.0 and newer. No experimental toggles are required for custom sound definitions, entity sound mappings, or block sound profiles.
When it does not work
| What you see | Why | The fix |
|---|---|---|
| The sound plays across the entire world at full volume regardless of how far away the player is from the mob or block. | The .ogg or .wav file was exported in stereo (two audio channels). Bedrock's 3D audio engine only applies distance attenuation and directional panning to mono (single-channel) audio files. | Open your audio file in an editor like Audacity, mix the stereo tracks down to mono, and re-export the .ogg file. |
| Content Log shows '[Sound][error]-sound_definitions.json: Error loading sound definition' or the sound stays completely silent even when triggered with /playsound. | You either included the .ogg/.wav file extension in the path inside sound_definitions.json, or you placed sound_definitions.json in the root of the resource pack instead of inside RP/sounds/. | Ensure the file is at RP/sounds/sound_definitions.json and strip the file extensions from all paths in the sounds array (write "sounds/mob/goblin/idle1", not "sounds/mob/goblin/idle1.ogg"). |
| The sound works when tested with /playsound, but the custom block makes no sound when broken or walked on. | RP/sounds.json or RP/blocks.json was placed inside a subfolder instead of the root of the resource pack, or the sound key in blocks.json points to the sound event name instead of the block_sounds profile name. | Keep both sounds.json and blocks.json in the top-level RP/ directory, and verify that the "sound" field in blocks.json matches the key under "block_sounds" in sounds.json. |
Reference, straight from the game files
Read out of the game itself, so the ids match the version you are building for.
