Audio formats and folder layout
Bedrock Edition reads Ogg Vorbis (.ogg) and uncompressed Waveform (.wav) files, though .ogg is strongly preferred in production packs because it keeps download sizes small and decodes reliably across mobile, console, and PC. Every audio file in your pack must live inside the RP/sounds/ directory, typically sorted into subfolders by feature, mob, or block type.
Before exporting your audio, check whether the sound is meant to be positional (3D) or global (2D). Positional sounds—like a mob groan, an explosion, or a block breaking—must be exported as mono (single-channel) audio so the game engine can pan and attenuate them based on where the player is looking. If you accidentally export a 3D sound in stereo, the engine plays it at flat volume everywhere in the world regardless of distance. Use stereo only for UI clicks, background music, and ambient loops that should not have a physical source in the world.
When referencing audio files in JSON later on, you always write the path relative to the root of the resource pack (starting with sounds/...) and leave off the .ogg or .wav file extension.
Registering events in sound_definitions.json
The file RP/sounds/sound_definitions.json is the master registry that maps your raw audio files to a dot-separated identifier, such as custom.goblin.ambient or block.ruby_ore.break. The rest of the game never talks to .ogg files directly; commands, animations, and entity components only ever call the sound event names you define here.
Each event contains a sounds array. If you list more than one file inside that array, the engine picks one at random each time the event fires, which is how vanilla footsteps and mob idle noises avoid sounding repetitive. Since format version 1.14.0, definitions sit inside a top-level sound_definitions object.
{
"format_version": "1.14.0",
"sound_definitions": {
"mob.goblin.say": {
"category": "neutral",
"max_distance": 16.0,
"min_distance": 2.0,
"sounds": [
"sounds/mob/goblin/say1",
"sounds/mob/goblin/say2",
{
"name": "sounds/mob/goblin/say3_rare",
"volume": 0.85,
"pitch": 1.1,
"weight": 1,
"stream": false,
"is3D": true
}
]
},
"custom.music.dungeon_theme": {
"category": "music",
"sounds": [
{
"name": "sounds/music/dungeon_loop",
"stream": true,
"volume": 0.5,
"is3D": false
}
]
}
}
}Sound definition properties
An entry inside the sounds array can be a simple string path if the defaults are fine, or an object when you need per-file tuning. Properties placed at the event level apply to the whole sound event, while properties inside an individual sound object affect only that variation.
| Field | What it does | Notes |
|---|---|---|
| category | Links the event to a volume slider in the player's audio settings. | Common values: neutral, hostile, player, block, weather, music, record, ui, ambient. |
| max_distance | Distance in blocks at which a 3D sound cuts off completely. | Set on the event. Defaults to 16.0 for most effects if omitted. |
| name | Path to the audio file from the resource pack root, without extension. | Required when defining a sound entry as an object instead of a string. |
| stream | Streams the audio from disk in chunks instead of loading it into RAM. | Keep false for short effects to prevent playback delay; set true for music and long loops. |
| volume | Base playback volume multiplier for this specific sound file. | 1.0 is default. In 3D sounds, values above 1.0 usually do not make it louder, just audible slightly further inside max_distance. |
| pitch | Playback speed and pitch multiplier. | 1.0 is normal speed. 0.5 is half speed (one octave lower); 2.0 is double speed. |
| weight | Integer probability weight when choosing among multiple files. | Only meaningful when all entries in the array use weights. Higher numbers play more often. |
| is3D | Controls whether the sound attenuates with distance and pans left/right. | Defaults to true for most categories except music and ui. Requires a mono audio file to work. |
| load_on_low_memory | Forces the sound to load even on memory-constrained devices. | Deprecated in newer versions; modern packs can leave this out. |
Wiring sounds to entities and blocks in sounds.json
Registering an event in sound_definitions.json makes it playable with /playsound, but the game still does not know which mob or block owns it automatically. A second file, RP/sounds.json (placed in the root of the resource pack, not inside the RP/sounds/ folder), binds standard gameplay actions—like taking damage, dying, stepping, or breaking a block—to your sound definition keys.
For entities, you add an entry under entities -> events mapped to your custom entity's identifier. For blocks, you define a reusable sound set under block_sounds and then assign that set name to your custom block inside RP/blocks.json (or via the block's components in modern versions).
{
"entity_sounds": {
"entities": {
"my_pack:goblin": {
"volume": 1.0,
"pitch": [0.8, 1.2],
"events": {
"ambient": "mob.goblin.say",
"hurt": "mob.goblin.hurt",
"death": "mob.goblin.death",
"step": {
"sound": "mob.goblin.step",
"volume": 0.35,
"pitch": 1.0
}
}
}
}
},
"block_sounds": {
"custom_crystal": {
" volume": 1.0,
"pitch": [0.9, 1.1],
"events": {
"break": "block.amethyst_block.break",
"hit": "block.amethyst_block.hit",
"place": "block.amethyst_block.place",
"step": "block.amethyst_block.step"
}
}
}
}Triggering sounds from animations and commands
For sounds timed to specific keyframes—such as a boss slamming the ground at 0.5 seconds into an attack animation—you bypass RP/sounds.json and attach the sound directly to the entity's client file and animation.
First, give the sound a short alias under the sound_effects object in your entity's RP/entity/*.entity.json description. Then reference that alias inside a resource pack animation timeline or an animation controller. You can also test any registered definition in-game immediately by running /playsound <event_name> @s ~ ~ ~ 1.0 1.0 from chat or a behaviour pack script.
{
"format_version": "1.10.0",
"minecraft:client_entity": {
"description": {
"identifier": "my_pack:goblin",
"sound_effects": {
"laugh": "mob.goblin.say"
}
}
}
}Which versions this applies to
Applies to all modern Bedrock versions (1.14.0 and newer for the current sound_definitions.json schema). No experimental toggles are required.
When it does not work
| What you see | Why | The fix |
|---|---|---|
| A 3D mob or block sound can be heard at full volume across the entire world regardless of how far away the player stands. | The .ogg or .wav file was exported in Stereo (2 channels) instead of Mono (1 channel). Bedrock's audio engine cannot pan or attenuate multi-channel audio in 3D space. | Re-export the audio file as a single-channel (Mono) .ogg file in your audio editor and reload the resource pack. |
| Running /playsound says the sound was played, and Content Log shows no JSON syntax errors, but the game is completely silent. | You included the .ogg or .wav extension in the file path inside sound_definitions.json, or the file is encoded with a codec Bedrock does not understand (such as an MP3 renamed to .ogg). | Remove the file extension from the "name" string (use "sounds/mob/goblin/say1", not "sounds/mob/goblin/say1.ogg") and verify the file was genuinely exported as Ogg Vorbis at 44100 Hz or 48000 Hz. |
| Long music tracks or ambient loops cut off abruptly, cause a brief game freeze when triggered, or fail to play on mobile devices. | The sound definition has "stream" left at its default (false), forcing the game to decompress the entire track into memory at once. | Convert the sound entry into an object inside the "sounds" array and set "stream": true. |
| Custom entity ambient, hurt, and death sounds never play automatically, even though they work with /playsound. | RP/sounds.json was placed inside the RP/sounds/ folder alongside sound_definitions.json instead of the root of the resource pack, or the entity key does not match the full namespace identifier. | Move sounds.json to the root of your resource pack (RP/sounds.json) and check that the key under "entities" matches your entity's identifier including its namespace. |
Reference, straight from the game files
Read out of the game itself, so the ids match the version you are building for.
