{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "impact-punch-heavy-002",
  "type": "registry:block",
  "title": "Impact Punch Heavy 002",
  "author": "Kenney <https://kenney.nl>",
  "description": "A short, brutal heavy punch sound, perfect for immediate feedback on game hits, critical UI warnings, or emphasizing a decisive, strong interaction.",
  "files": [
    {
      "path": "registry/soundcn/sounds/impact-punch-heavy-002/impact-punch-heavy-002.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const impactPunchHeavy002Sound: SoundAsset = {\n  name: \"impact-punch-heavy-002\",\n  dataUri: \"data:audio/mpeg;base64,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AwytfPou6GFBeq6fQd0MGO//+KCgsXgUFfjwKGhQSCm/l/QUFBgp+X/kFBWIKK//migoMFBX//wgoJBRV//+goMFBQVVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//tSxOgDC7E8/C7oYQkjLSDJswh4VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+1LE04PMZEsATODASAAANIAAAARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ==\",\n  duration: 0.457,\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.457,
    "format": "mp3",
    "sizeKb": 4,
    "license": "CC0",
    "tags": [
      "impact",
      "punch",
      "heavy",
      "002"
    ],
    "keywords": [
      "impact",
      "punch",
      "heavy",
      "short",
      "brutal",
      "game hit",
      "critical warning",
      "decisive interaction",
      "strong feedback",
      "ui error",
      "thud",
      "forceful",
      "abrupt",
      "combat",
      "damage",
      "alert",
      "solid",
      "aggressive",
      "fight",
      "collision"
    ]
  },
  "categories": [
    "impact"
  ]
}