{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "impact-punch-heavy-001",
  "type": "registry:block",
  "title": "Impact Punch Heavy 001",
  "author": "Kenney <https://kenney.nl>",
  "description": "This sound is a substantial, blunt heavy punch, well-suited for confirming critical failures, strong rejections in a UI, or a solid, damaging blow in a game.",
  "files": [
    {
      "path": "registry/soundcn/sounds/impact-punch-heavy-001/impact-punch-heavy-001.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const impactPunchHeavy001Sound: SoundAsset = {\n  name: \"impact-punch-heavy-001\",\n  dataUri: \"data:audio/mpeg;base64,SUQzBAAAAAAAIlRTU0UAAAAOAAADTGF2ZjYyLjMuMTAwAAAAAAAAAAAAAAD/+1DAAAAAAAAAAAAAAAAAAAAAAABJbmZvAAAADwAAABYAABLFABYWFhYhISEhISwsLCw3Nzc3N0JCQkJNTU1NTVhYWFhkZGRkZG9vb296enp6eoWFhYWQkJCQkJubm5ubpqamprKysrKyvb29vcjIyMjI09PT097e3t7e6enp6fT09PT0/////wAAAABMYXZjNjIuMTEAAAAAAAAAAAAAAAAkBG0AAAAAAAASxWXJuZcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//tQxAAACdBBKizgwMGDKCp2sDAGAQ9yzCUB0EJCuGsO4/kORsmTJkyZ6doQCAAgQIEELPJk0wfB8EAQBAEDP/dBAEAfB8HwfAgIAgCAIA+D4Pg+aBAMb//9YPg/+sHwfd/gAGTbWNtuOJNiY3Xd+nlTXH45KZHLqXO3FtWJWHDAQh66Lp4LOa5ES2qzMxmxsSqqqqkBRmZmaX/+7SNDzM7m4aSf3/Ln8htVVVWrYZm0ZmqqqqX5xmkk1VVCvb/7W2eVBVUiDmtnVnpqygYEFP/7UsQFgAswjVgZt4ABjZost7KABHKHNHDgFDV/A4mMCBaGHxoFU2gCCFvQGYtqGJe8ehfEQx2d1//xMzvJ7yQ7//0c2SslH83z9f/wZYFyjC7eXQHwWAMVb4VOATT/ohLevoAAN1jacltkpiOjfCJQJhA0zgoIojAt+Mv4+kUq08B18PgExKNOi5ISETd6pybhESoQxO3m5ub065WoJOLOeLu76quk/mnoy5rToXTHWbD/kRRzVmTohBkh0+5AquCaf/boICoACusABXK4AKi///tSxAUAC6ylXY0wZ6FuG+39hIz0k1YkmkJdpioCIeIwd1H4lEYSkZuhicYO0RFQcIjA/bvmCfaOXSc57jmZmUnbShWGgo8OWPXU9CDkyw9ZdJNBef5RHcVWoCInBqtmuYWu/9Wv01VAIFkQZCjm22u6Xw1Va8vbPQMntyAAVAoPxEtlSpQ2qSKdW0pG4JIRG9HJ5c7olMK5PXLdbUMcSOUsDXzzyMvk4x1CI+fH0+2ENoBUWP+md+xG7E0XmOoUI9XV1wA9IiS10rkphpMNsMb/+1LEBoAMHK9rjCRpcWgQqzGmDSw9MtzgZpCjQnEoVAq2niCCUD4Zgu2Q7Lx3Iowg3ShrCHJmgJGioFEB6VIRubxqRfM04VwcFAnUakg7CKjz9NJtNK6vrOpe633w2YeIA4SrNCNYshIBHlIAAquzJQC+aNpbpIbpdWLuo6RPcUhOHCcqrTpEbGJNKrvRnitzjEk9G0I8QZQo2f3FIcndAWPDhMqhQCELhVwRZdU8AlRould6joYtcbwN2OudV/Sz+pYBjaMABSRtSkpg30qqOP/7UsQHAAwkiVusmG8hcR+sPYSNJDpHqouM9z8RBxZ6XxCSzdDHwUiThRjwVNeSM4ZPrNU5dIkBA+zGsJnPKCdiglg9ihwlSADINAcsm0+RSaWkKuH1a/b41oYdgdsDBVSxghfsrmW3ARpcy5GTut916axX1RtOgONxjsjcObcBwLCsSAsCpOgbeZtR64A7ZggdlUJ0JGxgIB6DowzG3FSrxTM8j/aefo+IZjyVVM4evzk/mffL+6RBVQ93/4//3VSoR/0VAA0YACTTYFhJ+yiP//tSxAYAC9j/TY0wR+F2lSm1pgzsYFOJcsJZPClo9BzpJSj+viIKZMhrB8ODtc+sxdR912q2pWKMrcZ0LbO1yjNZgRmKZDcpkp1dlVpl+y97Mfm+5rFbKoVw2hWrArxQGQgtZ0NUpFgG/YAAEkomwYSSMCEC0/QUElSh0afHUdRKMTMPCrY2JYxTJjl3rhEGCsvXrgIccqFJSQVo/Yu0xEMzzkz/y9M/EIPCDS7zoHW9Sz7jWiNSARCYFbZxw8CGlewAKN1KAC3yARclkkAVUgP/+1LEBYALuUVPrQxR6W8grLzzCeagtGGGCzbMeSSHrcCQDGbcW5nUjPKYKGCPUCB18NpVEA1OZ4EhFoUckhDUkMHkVfptnQXkcIiIyv8Gq1rknZUaiq+VtrI7hdf/3Xe9lt5mjRmvpBEZ4VEM5JZHIHgRJBRYyeMxCj7Pg5W8nEJiRa5V2xqwQHJPSUVjwaN10KHkfExs2KySdXJVDFKIOa7NR6kuzqtUL/LepK/T/JsRpCAyuKjFCiNzI1DSQDAR0tk6De21bblsjbBmLkdZKf/7UsQGgEl4cWOnsGPxS5grtYYMvhahgESjU6IypKP560pOkipxc6w9Wvzoakn2hBb1wsNw0ZVIUQKAgDSAkYiAzBURQ0afgdw8S3Hf2R+n7/3uqDs31ibckXkTHKHt0a5LA+wjjwWD0mB0nRGDa1/D51ycPltsqsBi1sIyZqriS6pkksV1kLTNy8FHpHuk4VrMZM+WHcNuGkaWoIoYDJpOu27ZrsDNAC10AILbrgBYDRs/EhN/2rVRzRD8mNSSHpUhWEdbbaF8s5tFEBe7NeiX//tSxBUACjjBQa2wZaFJGCg9lgx8qxSwqE5c5Axlw0yGz/4h07mmiGCFGeUdxWC46iLW2zQeclKyzRZgTABKXdjAUnJZABz8KLIbqPgdaIaCUwqRCFUxB1CPoV6Ramg5XIphSmAQEbKJmcJrNvhkKRycoK+EX3/vNpPsP1ylRMMNQ80lUFYyZSsWJESSjW8A/QAC8Aw6Gc4yCUHAKWra5C5MpyBEgMgo2gCqB5tsERgrxUByzCMTidHNYikyhNtJZJ/iYh1/W7uRu1/K8zLXuvH/+1LEIQAKVMEtLqUHwT+YZWnElTg1b0v99ZrhKvOWEVwB9H//YCN4AaVaAAVTR8xLp6CMHsPkDMmz58ZlUyNpAG3iWA8NkgMFlIqtS1DGCI15QiolJXzOhxE1JUKNWPymFkqjDURXZdtZUwaMc8dR+QRq//6FAgCwAGOesbNWoCPxhQXhcCKPlynns2xbxKIN4ql9naI6hNUL1So5bvem3rzK7klCqToNHEk25YAwES3eIKJzwy0JkRfq3Ax9/9TA//7NK/2f2oQEqAGEKNHnIf/7UsQtggpQfx7OPGfBRJgj2dYU+Og44k6V7NBW9Jn72rlLmS0cjBSkXrgZ4nYYfjXYuXPQ4V3GkV4gUdJVRotd6GCqs21NO+2vXRIjCJL/q2IJor/+xmnV/W93R1IBAzwAYLiadclQBiLl6tGandFGNFt00DAQYWkFZeZdLHKILRdIjIkdJbRPD0rVP4zzamLbl4lJ59J6/37cRpEhXs/fkif/V53/2e/suABSiBCsdaIAWizbyiAl5tQnn9gaI0Kw/HwGQHTqGCCFyN16tt3v//tSxDmACZjBIM6ZBwGcGCV1thk5rZ1qFhg/PC2WTJaZIZ6CyJIiULBBi1VNGlPqqkkaYLGKSGkiJwGYfuVLPGwpKWNqIu6ocsiqqDE3P9aqq6z+f+ruQAMXek9kWDBwLWcul/qCBtlpuPvmuaX+JOPBIcjUcu8XqOhyhTRZaSAxgQsNhpOq9rFVkqvvv9qLFe+r1M/Rc2lCr/9AEuRoIImGnmB6QNAlocJuYUbaVp70+6CrAV6I8akUYoUp8FC5bSoMY+w7uX+WLXMc1CIolnr/+1LEPYIItIEaTiBnwQUPo+nCjPg3/euSXPo/6U6r+lcAVLXJECGjCRJO0A1KGH6KjJ1JH9T2bcfAZ5DOkzM10XRuK23C5B/qs/uq0f/d/0q1Il9K+n8yn0gAARXQimLmIeyDKajjyCqGr6IsfweQNC7vvo3MqZVjHRldHZT3JQhHNT7Lb2L6F/RU/fR/1qqsazFkX/YtG1VasAQRkasDWXSZXckYYPENG2axibf+PqEDmLmLcz31VlqlWq6l/b/f9G9php7/evzf6/KKfbKEu//7UsRYAAcUgyFOBKWBABBjZcCcsBWXUBfFIqu+LWNEuXXyjpdpCQHGPegDA+DiE4sPXsr00etbk2XGUasau0pvfOiXu8h2cHUQqUolSJFCE0wPmddKL6malD4qipdrxW2VLPtUulczZbQmL1sXYuoxrWjfYNA5k+Yef3VDKT0rCJDcr5bNAqEPLLOIWLqUhz2h0kdpdUtlKIRGsCk5IpW0gQW1L3Cj+Y9ypJADY5EgVqcODlipJCbeupeQIK0epA6azJQYLTV0tQJ7OfH9+ZkB//tSxHmCSRD7FC6M5UEjEGKhwIj4QVrHFT1h0w9sYpRd1DAE8mBouy9AqQoug7NDGzTMs4dXWtSy4s9wocZaOkPOZl6rhDuIYyIaWRRTBq+AbTVFLb9bdmEdWctxVl2UhKwidPsvcNWYAFYQMLztbeF4bMioqc0RF18rfb7HLShrNZ1CVOWom5Ms5qmW0RkWPxQi0AAGB46eBEm9UdL2o94yaqx55KdXhvXq5eO0Zm7kZprobCR7669R6nOn6SEmiLPXoA7Gz6Ev/RvUpMvSfS3/+1LEjoPJgD8SDmBggSoIogHDDFgNVvTi3MkOuTowKtzjo0Tna5EaM8EZlkshPvnOn6YNJlWUeiimOQYbUNnqc221TFkEWB2+5VwKpWUQIYSY6Ls7UpUNMhMXEjDzEiAFlFQ2cbGoLnEPGuEohkYQgtTLxIBUEhJcgYUIlgG9EUpac3ibSLChV4qiKKnvS7ikSCd7BVVRumWIU2rf3Z0Xj61k0EFFPue/OvtgfTm3JgAgIWWQTCfwNkAkOyFkDihJmxbbSJ5m02tBAXur2a18oP/7UsShAgjgQxROBGdBHhBimcEM+IAA0wf6W7Ovtrp7Fq+zm3b57va/1YY0mGHJ4wUma1ohG6gy5GwEiVKOFIlDDWJvi5D49qSL3PnGhVCSSk3pMDAwtJ1dBg0QDWTflBR6OKuHuFg8yvMMQng0SI2CZwUSTpSG1xEUjkgLA4HeyJBqJR1Ejx6IlND+fYLSUj/+3yhT7xs8/Pzj65P+2RKUJdThw3T/Y8jeVrvl+Ry9vPyL3KFT+8C/63ZThZA7lnaeI6mSO1f5IKFr1O46lRRM//tSxLeCCdRFEA4kYgEMgiKZtJgALd0QL+juOSqWtRC1utpDFWa/1WXKKPweGs88EQeQYvPvlmXIvatvdwXKWFmcrYV6Lah29pYnEg1f9MqjC6Mfy3+xzGiCUH+a2/LW/pf2CZob3Ju5tppbPlyVMHTjlQ0vku3RYTOjk0IDqEpOyVTqV4Spl1svO3HJMsy7c7GoPiMRC2yr70QP1rtr4hS36JMzBMRnfy83pWOTI2sVBoRBlEtBfSbmDHK46V3iOvu9j0f93/Wvey2Bd+nLQIX/+1LEzIAHBA8XLSUAAS8C4gG0hFCmWocDHDKAqgoynDxrDB4M86OKO5wpAhPHLcK7bSrO73bWnMyzaCaCj3gv7VNJTq5EizE3+LRJXMX7Sr3L/YZr+8d3+blN8v3Ov/Dv+f3ubmx+XrBMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqoAAWBokG0LXGsOVGn+dp/X9h0AgEiRmXmSJEiRIkaqq395okkcSJJVSl/swZVVVL/pdf/7UsTog0tlOwwOPGBJXIRhhaekAVVVv/pVmZmZj/43syqqr///VL/8u8Zm2Y/9mbYMuIKyC////+KxCjgob7oTQ34psporE2K3TEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//tSxO0ADA0ZCg2YYslWBCJZpgwRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+1LE1QPM3SL+TBhriAAANIAAAARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ==\",\n  duration: 0.536,\n  format: \"mp3\",\n  license: \"CC0\",\n  author: \"Kenney\",\n};\n",
      "type": "registry:lib"
    },
    {
      "path": "registry/soundcn/lib/sound-types.ts",
      "content": "export interface SoundAsset {\r\n  /** Unique identifier for the sound */\r\n  name: string;\r\n  /** Base64-encoded data URI (data:audio/mpeg;base64,...) */\r\n  dataUri: string;\r\n  /** Duration in seconds */\r\n  duration: number;\r\n  /** Audio format */\r\n  format: \"mp3\" | \"wav\" | \"ogg\";\r\n  /** License identifier */\r\n  license: \"CC0\" | \"OGA-BY\" | \"MIT\";\r\n  /** Original author/creator */\r\n  author: string;\r\n}\r\n\r\nexport interface UseSoundOptions {\r\n  /** Volume level from 0 to 1. Default: 1 */\r\n  volume?: number;\r\n  /** Playback speed multiplier. Default: 1 */\r\n  playbackRate?: number;\r\n  /** If true, calling play() stops current playback first. Default: false */\r\n  interrupt?: boolean;\r\n  /** If false, play() does nothing. Useful for user preferences. Default: true */\r\n  soundEnabled?: boolean;\r\n  /** Called when playback starts */\r\n  onPlay?: () => void;\r\n  /** Called when playback ends naturally */\r\n  onEnd?: () => void;\r\n  /** Called when pause() is called */\r\n  onPause?: () => void;\r\n  /** Called when stop() is called */\r\n  onStop?: () => void;\r\n}\r\n\r\nexport type PlayFunction = (overrides?: {\r\n  volume?: number;\r\n  playbackRate?: number;\r\n}) => void;\r\n\r\nexport interface SoundControls {\r\n  stop: () => void;\r\n  pause: () => void;\r\n  isPlaying: boolean;\r\n  duration: number | null;\r\n  sound: SoundAsset;\r\n}\r\n\r\nexport type UseSoundReturn = readonly [PlayFunction, SoundControls];\r\n",
      "type": "registry:lib"
    },
    {
      "path": "registry/soundcn/lib/sound-engine.ts",
      "content": "let audioContext: AudioContext | null = null;\nconst bufferCache = new Map<string, AudioBuffer>();\n\nexport function getAudioContext(): AudioContext {\n  if (!audioContext) {\n    audioContext = new AudioContext();\n  }\n  return audioContext;\n}\n\nexport async function decodeAudioData(dataUri: string): Promise<AudioBuffer> {\n  const cached = bufferCache.get(dataUri);\n  if (cached) return cached;\n\n  const ctx = getAudioContext();\n  const base64 = dataUri.split(\",\")[1];\n  const binaryString = atob(base64);\n  const bytes = new Uint8Array(binaryString.length);\n  for (let i = 0; i < binaryString.length; i++) {\n    bytes[i] = binaryString.charCodeAt(i);\n  }\n\n  const audioBuffer = await ctx.decodeAudioData(bytes.buffer.slice(0));\n  bufferCache.set(dataUri, audioBuffer);\n  return audioBuffer;\n}\n\nexport interface PlaySoundOptions {\n  volume?: number;\n  playbackRate?: number;\n  onEnd?: () => void;\n}\n\nexport interface SoundPlayback {\n  stop: () => void;\n}\n\nexport async function playSound(\n  dataUri: string,\n  options: PlaySoundOptions = {}\n): Promise<SoundPlayback> {\n  const { volume = 1, playbackRate = 1, onEnd } = options;\n  const ctx = getAudioContext();\n  if (ctx.state === \"suspended\") {\n    await ctx.resume();\n  }\n\n  const buffer = await decodeAudioData(dataUri);\n  const source = ctx.createBufferSource();\n  const gain = ctx.createGain();\n\n  source.buffer = buffer;\n  source.playbackRate.value = playbackRate;\n  gain.gain.value = volume;\n\n  source.connect(gain);\n  gain.connect(ctx.destination);\n\n  source.onended = () => {\n    onEnd?.();\n  };\n\n  source.start(0);\n\n  return {\n    stop: () => {\n      try {\n        source.stop();\n      } catch {\n        // No-op if already stopped.\n      }\n    },\n  };\n}\n",
      "type": "registry:lib"
    }
  ],
  "meta": {
    "duration": 0.536,
    "format": "mp3",
    "sizeKb": 5,
    "license": "CC0",
    "tags": [
      "impact",
      "punch",
      "heavy",
      "001"
    ],
    "keywords": [
      "impact",
      "punch",
      "heavy",
      "substantial",
      "blunt",
      "critical failure",
      "strong rejection",
      "damaging blow",
      "game sfx",
      "ui error",
      "thud",
      "forceful",
      "deep",
      "warning",
      "combat",
      "negative",
      "solid",
      "weighty",
      "fatal",
      "miss"
    ]
  },
  "categories": [
    "impact"
  ]
}