{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "impact-punch-medium-001",
  "type": "registry:block",
  "title": "Impact Punch Medium 001",
  "author": "Kenney <https://kenney.nl>",
  "description": "This sound provides a quick, solid medium punch, perfect for rapid-fire game hits, confirming quick interactions, or short, decisive UI feedback.",
  "files": [
    {
      "path": "registry/soundcn/sounds/impact-punch-medium-001/impact-punch-medium-001.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const impactPunchMedium001Sound: SoundAsset = {\n  name: \"impact-punch-medium-001\",\n  dataUri: \"data:audio/mpeg;base64,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tbTZR7j0dlKxnSGUKMOH7izyjkKtkhHkRBMPL4l1FEBmQ06GehKZWAKAxerqTMVq52/R7Nmpxs5Hedj/+1LEMwIJJBkCrmxAgSUVIJnAiXgNhnDKUOvO6VVf9m9ToO9d4+owdMBJY4IoE+YOIAvc84VCArOQo86xhCFDwpUAACAQQEDTphIMAJw44bAtxhQzhlZmF0JQXTNpMqIgsXJNVGqageI6r3nh4qLSxlbHVCqNTUm3kva2eQHNqlv9BZ06SBWVzywCBRJOWsekHqOyZKG0nP3VJMCg6SLxYJHhZLlJIkhCJAq4LIH6oDcSlWcJLqHsOqdcecumpockGY0ksOP2u2XkFQCQy3DjIP/7UsRHggh4FQVOZGABEgSgCc0kAMTAkHBpbHR8lRZ1oxVoGB5Y0pCWiR4c5JJ3pUdNAYk9+neFXIi5IGlf29R7HnYczyxKRCT9/ySDfsAwAwCpgBgChwG4CAcGgDFTLBMRaEXfoW8gaFDopDwraTEYnbI2KCHRQQoRAcI5BdPH+L7mjnXmjxhlVKi6cpT2M21WgkAKBoTK34fgH//9AJUACANbQDswMgtDBKAWMCACJAaYAoA6LTvKWx1uEjfduVNm/1caHoeKF0MPkVxOJoEc//tSxGEDB7Ac/G7hIBFLHF0B5Im4cMcWV2Ie75SiSmmGxqUXNfwe0HYsdNGljv//8b8G/+0ryMheIagYoTmLAv+y+PkAEkL/u/fYUxbErJgOoL9yUHIeC2nwuvpni+bjgEtJQYb5LqNDA0Jw5iKSRN/mhmmX3LB2lEkkB7f2dBjRaZmSRmXTElSd/03ugyF0TI3JI+XVl0w//TpqZBrJl1RsZGxikYoGLf/907UKC3Te6BkovHTJZqYmpkxkmZJ////+yF////0VmpwAS7A2gMz/+1LEdoAKILjsVeQAElhCIUM20AAmS0wuJ/E6cVMhyiZsvVaytQqr1VNVVdgICCQNHvKgqPBU6Ig4WfwaiUNiUNfLHix6Cv+DUj+jlj39Z0qdiL/BVUxBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7UsRhA8jQSOo88YAAAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV\",\n  duration: 0.402,\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.402,
    "format": "mp3",
    "sizeKb": 4,
    "license": "CC0",
    "tags": [
      "impact",
      "punch",
      "medium",
      "001"
    ],
    "keywords": [
      "impact",
      "punch",
      "medium",
      "quick",
      "solid",
      "rapid-fire",
      "game hit",
      "quick interaction",
      "decisive feedback",
      "ui",
      "thud",
      "short",
      "crisp",
      "combat",
      "positive",
      "action",
      "click",
      "tap",
      "confirm",
      "game sfx"
    ]
  },
  "categories": [
    "impact"
  ]
}