Wiki 9Minecraft Wiki 9Minecraft

Custom Block Sounds in Bedrock Resource Packs

Assign vanilla sound presets or build custom sound events for custom blocks using sounds.json and blocks.json.

5Sections
4Code examples
4Known errors

Custom blocks in Minecraft Bedrock Edition are completely silent or default to a generic stone click until you configure their audio in your resource pack. Unlike block geometry or collision, block sounds are not defined inside the behavior pack block file; they are controlled entirely on the client side through RP/blocks.json and RP/sounds.json. You reach for this system whether you just want a custom ore to sound like vanilla stone or need a machine block to play entirely new OGG audio files when stepped on or broken.

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 NameMaterial FeelTypical Vanilla Use
stoneHard, crisp rockStone, cobblestone, ores
woodHollow, creaky timberLogs, planks, crafting tables
gravelLoose, shifting crunchDirt, gravel, coarse dirt
grassSoft, fibrous rustleGrass blocks, leaves, hay bales
metalHigh-pitched clankIron blocks, anvils, chains
clothMuted, padded thudWool, carpets
glassSharp tap and shatterGlass blocks, panes, glowstone
sandDry, gritty slideSand, red sand, concrete powder
deepslateHeavy, resonant stoneDeepslate and its variants
copperHollow metallic ringCopper blocks, cut copper
amethyst_blockMusical, crystalline chimeAmethyst blocks and buds
RP/blocks.json
{
  "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 KeyWhen It TriggersNotes
breakThe block is completely mined or destroyedUsually played at full volume (1.0)
hitA player is actively mining or punching the blockUsually quieter (0.25 to 0.5) with lowered pitch
placeA player places the block into the worldOften shares the same sound event as break
item.use.onA tool or item modifies the block (like stripping or tilling)Fires when an item interaction succeeds on the block
power.on / power.offBlock state changes related to redstone or togglingUsed by vanilla doors, trapdoors, and switches
RP/sounds.json
{
  "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.

RP/sounds.json
{
  "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.

RP/sounds/sound_definitions.json
{
  "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 seeWhyThe 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.