{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "impact-metal-003",
  "type": "registry:block",
  "title": "Impact Metal 003",
  "author": "Kenney <https://kenney.nl>",
  "description": "A deeper, more resonant metallic impact, suitable for a more significant button press, a sturdy object interaction, or a solid confirmation.",
  "files": [
    {
      "path": "registry/soundcn/sounds/impact-metal-003/impact-metal-003.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const impactMetal003Sound: SoundAsset = {\n  name: \"impact-metal-003\",\n  dataUri: \"data:audio/mpeg;base64,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AiVJ8MpVHYzmpvWrKoqkddFGGT3T33e3WIjTlCY1InwaeNJGRRA0oLueGiINREFGuHi+kNIKW/GO0BJd9bUeReAYoulpw3dTHZYAWv/7UsTwgo0JmwLO5GDBbCRgidwIGeK7kMCQCGAHUofqKPvVGFgj2SOKXRarVZlFERmpPAuUzCzUM/wBzPntrC7Gy3OzvI2a6tndrL/iWbc7UqswGV5rf/CSlbRmOUJQWXUKry26bmwt8+fiVN839l51RPL5+gEGp4QuAKBTBwBWHahcIhGWFCckpoVRIS0gYUU+G9zMXbllVq84Q+e2wq2IDhsPAAADRQLvcKqz4IFAuWH3oUyNy4WELdQ8SOZEDVPWpGuf1xUd6nb1JRnVpHgE//tSxOyDzGRy/i7kwEl0GmAB1IygopuC7mlnFBi9QUwFKit9tcQt6TqMywQ7DZ1cGEMdqqZHk2g7NTWB01wR1gzkjVk8Kprw1vDnDaXzW5qC8stTbarzILxoFBF8ZtDzJyVWLz8yXsclz1Wb6NA0FCtz8VkeX6djsvKRkoViaJUBxOnHbRbZIBuMSGi+nDBaFpzpl200iu8dtPSjKzNUH3B4y8cLSoqTQo+w09ZpLkuX16ZPSxifS4nTG7lb15MwnYj6m7Lxd8WmVWPAgvMLhID/+1LE6gMLQGz+LuDAQYgZYAnTDNmBQMAgOdFa7lz0UoqfCrl9SXWyzh5xFpTSTzKxLbQgt27d9PYYI0uIEngY8OLmhUpfEhMIsDqrxVjrDxQHmjDDbGqbio0CPrnUjWPdtDKS7nUXHDc8gTI2LHoAAIAAABCAj6HbNOZTDBBpULi9YBDYQBRmU0sXLiqVWLoyy4BlBP1aaQK4FxBbjJKaFBOFRB0hbAW9WtBZuboDyExHEJ8O9GvpqQPOMIURzD1HCPilVdBabtHGfHiSw4ieSP/7UsTqAwtUYPgvPSBBrzLgDdYMWS119NTM9BbnikXSRKiTNyibf92dNTM7ILJIrJBApGpIk4npnv/u7Jm6mZ0DRbux8vGJggfPF0yM1nj5eMf/+7////5w4bmixEi1CSocWIQqKYEQJEyYpAmPVSZoBARhQETAwKuESwmCoCBoSh3UFAaKgqWO+CpYOlX+DSw0W+Cqg6V+HVhot8NKPL+HZ1X2z34dnUxBTUUzLjEwMKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//tSxOSDiShO/i6wwoGFi9/KumAAqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr/+1LE7QAVFdkQ2baAATGJFMOSMACqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqg==\",\n  duration: 0.777,\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.777,
    "format": "mp3",
    "sizeKb": 7,
    "license": "CC0",
    "tags": [
      "impact",
      "metal",
      "003"
    ],
    "keywords": [
      "impact",
      "metal",
      "deep",
      "resonant",
      "significant",
      "button press",
      "sturdy",
      "object interaction",
      "solid",
      "confirmation",
      "feedback",
      "strong",
      "positive",
      "metallic",
      "distinct",
      "clear",
      "click",
      "acknowledge",
      "important",
      "durable"
    ]
  },
  "categories": [
    "impact"
  ]
}