How Bedrock Routes Block Audio
Bedrock Edition separates a block's physical properties from its audiovisual presentation through a multi-step lookup chain inside the resource pack. When a player interacts with a block—by walking on it, hitting it, breaking it, placing it, or landing on it—the game engine checks the block's identifier inside RP/blocks.json. That file acts as a manifest that links the block identifier to a named sound preset, such as 'stone', 'wood', or a custom string you invent.
Once the engine has that sound preset name, it looks inside RP/sounds.json under the block_sounds section. The block_sounds table maps each interaction type (break, hit, place, step, fall) to an abstract sound event identifier like dig.stone or step.cloth. Finally, RP/sounds/sound_definitions.json resolves that abstract sound event to actual .ogg audio files sitting in your resource pack's RP/sounds/ folder.
Because this entire chain lives in the resource pack, you never put sound definitions inside BP/blocks/my_block.json. If you only need your custom block to sound like an existing vanilla material, you only need to touch the very first file in the chain: RP/blocks.json.
Assigning Vanilla Sound Presets in blocks.json
The fastest way to give a custom block proper audio is to reuse one of the game's built-in block sound presets. Open or create blocks.json at the root of your resource pack. Inside this file, add a key matching your block's full identifier (including the namespace) and set its sound property to a vanilla preset name.
Note that if your custom block uses the minecraft:geometry and minecraft:material_instances components in the behavior pack, you do not need to declare textures in RP/blocks.json—only the sound property is required here.
| Preset Name | Material Feel | Typical Vanilla Use |
|---|---|---|
| stone | Hard, crisp rock | Stone, cobblestone, ores |
| wood | Hollow, creaky timber | Logs, planks, crafting tables |
| gravel | Loose, shifting crunch | Dirt, gravel, coarse dirt |
| grass | Soft, fibrous rustle | Grass blocks, leaves, hay bales |
| metal | High-pitched clank | Iron blocks, anvils, chains |
| cloth | Muted, padded thud | Wool, carpets |
| glass | Sharp tap and shatter | Glass blocks, panes, glowstone |
| sand | Dry, gritty slide | Sand, red sand, concrete powder |
| deepslate | Heavy, resonant stone | Deepslate and its variants |
| copper | Hollow metallic ring | Copper blocks, cut copper |
| amethyst_block | Musical, crystalline chime | Amethyst blocks and buds |
{
"format_version": [
1,
1,
0
],
"wiki:polished_slate": {
"sound": "deepslate"
},
"wiki:treated_planks": {
"sound": "wood"
}
}Creating a Custom Block Sound Set in sounds.json
When vanilla presets do not fit your block—for example, if you are making a squelching alien fungus or a hollow plastic crate—you must define your own preset name. First, set the sound property in RP/blocks.json to a unique name of your choice, such as custom_plastic. Next, create or edit RP/sounds.json at the root of your resource pack.
Inside RP/sounds.json, the block_sounds object holds all block audio presets. You create an entry matching the preset name you put in blocks.json and define the events that should fire when a player interacts with the block. Each event takes a sound event string (which you will define in the next step) and optional volume and pitch modifiers. Pitch and volume can be single floating-point numbers or two-number arrays that pick a random value between the minimum and maximum each time the sound plays.
| Event Key | When It Triggers | Notes |
|---|---|---|
| break | The block is completely mined or destroyed | Usually played at full volume (1.0) |
| hit | A player is actively mining or punching the block | Usually quieter (0.25 to 0.5) with lowered pitch |
| place | A player places the block into the world | Often shares the same sound event as break |
| item.use.on | A tool or item modifies the block (like stripping or tilling) | Fires when an item interaction succeeds on the block |
| power.on / power.off | Block state changes related to redstone or toggling | Used by vanilla doors, trapdoors, and switches |
{
"block_sounds": {
"custom_plastic": {
"volume": 1.0,
"pitch": [
0.9,
1.1
],
"events": {
"default": {
"sound": "block.custom_plastic.place"
},
"item.use.on": {
"sound": "block.custom_plastic.use",
"pitch": 0.8
},
"break": {
"sound": "block.custom_plastic.break",
"volume": 1.0,
"pitch": [
0.85,
1.0
]
},
"hit": {
"sound": "block.custom_plastic.hit",
"volume": 0.4,
"pitch": 0.5
},
"place": {
"sound": "block.custom_plastic.place",
"volume": 1.0,
"pitch": [
0.8,
1.0
]
},
"power.off": {
"sound": "block.custom_plastic.click",
"volume": 0.5,
"pitch": 0.5
},
"power.on": {
"sound": "block.custom_plastic.click",
"volume": 0.5,
"pitch": 0.6
}
}
}
}
}Wiring Footsteps and Landing Sounds
A quirk of Bedrock's audio engine is that walking on a block (step) and falling onto a block from a height (fall) are often handled through entity sound events rather than the block's own event list alone. While some vanilla presets define step and fall directly inside block_sounds, custom blocks reliably trigger footsteps when you also register your block preset under entity_sounds in RP/sounds.json.
Under entity_sounds, the defaults object and specific entity definitions check the block_sounds preset of whatever block the entity is currently standing on. By adding step and fall keys directly inside your block_sounds preset, you tell the game what default footstep sound that surface makes.
{
"block_sounds": {
"custom_plastic": {
"events": {
"break": {
"sound": "block.custom_plastic.break"
},
"hit": {
"sound": "block.custom_plastic.hit",
"volume": 0.35
},
"place": {
"sound": "block.custom_plastic.place"
},
"step": {
"sound": "block.custom_plastic.step",
"volume": 0.2,
"pitch": 1.0
},
"fall": {
"sound": "block.custom_plastic.step",
"volume": 0.5,
"pitch": 0.75
}
}
}
}
}Registering Audio Files in sound_definitions.json
The sound event strings you wrote in RP/sounds.json (such as block.custom_plastic.break) do not point to files yet. You must map those event names to actual .ogg audio files inside RP/sounds/sound_definitions.json. Place your audio files in a subfolder such as RP/sounds/blocks/plastic_break1.ogg. Bedrock requires Vorbis-encoded .ogg files (typically mono so 3D positional audio works properly in-game; stereo files will play at flat volume regardless of distance).
In sound_definitions.json, set the category to block so the player's 'Blocks' audio slider in the game settings controls the volume. Note that file paths in this file omit the .ogg file extension.
{
"format_version": "1.20.20",
"sound_definitions": {
"block.custom_plastic.break": {
"category": "block",
"sounds": [
"sounds/blocks/plastic_break1",
"sounds/blocks/plastic_break2"
]
},
"block.custom_plastic.place": {
"category": "block",
"sounds": [
"sounds/blocks/plastic_break1"
]
},
"block.custom_plastic.hit": {
"category": "block",
"sounds": [
"sounds/blocks/plastic_hit1",
"sounds/blocks/plastic_hit2"
]
},
"block.custom_plastic.step": {
"category": "block",
"sounds": [
{
"name": "sounds/blocks/plastic_step1",
"volume": 0.8
},
{
"name": "sounds/blocks/plastic_step2",
"volume": 0.8
}
]
}
}
}Which versions this applies to
Applies to all modern Bedrock Edition versions (1.16.100 through 1.21+). No experimental toggles are required for RP/blocks.json, RP/sounds.json, or RP/sounds/sound_definitions.json.
When it does not work
| What you see | Why | The fix |
|---|---|---|
| The custom block is completely silent when placed, hit, or broken, with no Content Log errors. | The block identifier in RP/blocks.json is missing its namespace (for example, writing "polished_slate" instead of "wiki:polished_slate"), or the sound preset name in RP/blocks.json does not exactly match the key inside block_sounds in RP/sounds.json. | Ensure the key in RP/blocks.json matches the identifier in your behavior pack block file character-for-character, including the namespace prefix. |
| Block sounds play globally across the entire world at full volume regardless of how far away the player is from the block. | The .ogg audio files were exported in Stereo (2 channels) instead of Mono (1 channel). Bedrock's 3D positional audio engine cannot spatialize stereo sound files. | Re-export your .ogg files as single-channel Mono audio in your audio editor (such as Audacity) and replace the files in RP/sounds/. |
| Content Log displays: [Sound] Sound definition 'block.custom_plastic.break' has a sound file that fails to load. | You included the .ogg extension in the file path inside sound_definitions.json, or the file is actually a renamed .mp3 or .wav file rather than a true Vorbis-encoded OGG file. | Remove '.ogg' from all paths in RP/sounds/sound_definitions.json and verify the audio files were properly converted to OGG Vorbis format. |
| Custom block textures disappear and turn into the purple-and-black update/missing texture block after adding RP/blocks.json. | If your behavior pack block is an older format block that relies on RP/blocks.json for its textures, adding an entry with only the "sound" key overwrote its texture definition. Conversely, if your block uses minecraft:material_instances in the behavior pack, adding a "textures" key inside RP/blocks.json can conflict with the component. | For modern blocks using minecraft:material_instances and minecraft:geometry, keep only the "sound" property inside the block's RP/blocks.json entry and define all textures in RP/textures/terrain_texture.json. |
Reference, straight from the game files
Read out of the game itself, so the ids match the version you are building for.
