{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "impact-plank-medium-001",
  "type": "registry:block",
  "title": "Impact Plank Medium 001",
  "author": "Kenney <https://kenney.nl>",
  "description": "This sound is a crisp, medium wooden impact, ideal for interactive UI elements that have a tactile, material feel, such as wooden buttons or menu selections.",
  "files": [
    {
      "path": "registry/soundcn/sounds/impact-plank-medium-001/impact-plank-medium-001.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const impactPlankMedium001Sound: SoundAsset = {\n  name: \"impact-plank-medium-001\",\n  dataUri: \"data:audio/mpeg;base64,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oOPwXc4OJ3ahUgxNqI1WdTyypVV0bQ+5mdyZ8rGVCyTe/C6fadtOYJprKCnsKQ3KXm59Nsz9D9D5nHJp09dykIpPyoJ8YkZrGGwGCv/7UsTrAwwonQgssQUJew8hRYYgcY69b1ysSegjRhJGSK9GyST03SPtmuqTGFQCQMJEZIqsaap+fdr/DNcifNiIzWyyGdMzvwvqqpGX/lD8zM3s27G8jbIm7xe/rYC5/717nmy/nCmDoQHNfs7HzKPh9aquCSRDsBQnBMbpIT15MTSJVtcHj0j4wDC9FJnwTI4mFJfNtyz9g00km7sOSrL/+zk/r+TtNNa847+pN/+007mdjj2UUIvN945cXH0yoUzvk/yVj8Kz1W15W+WjkuBT//tSxOkCCbhpDkeIZgF+ruGY8wy59EAA0k5GPmQgAgVi0bPs11u8DDDHA+ggRDNMkjSNZ05J7NIiJuC7yMbwzPzPb4ZnOAp+eckzP9mbuRZnnlbfMiKnKZ5naXDe9//v+Q2bmzGmYoNqCm05eGygEpzGAQAXaadlMymmjrWViwiGic9w4gRAKRUxkZPFYxMenu6j3SyYmLtmp1l1lbzS5dzH+GahhTbG4kKKsYC+BhOBDtsbBjZgIz4VLbhxdVI2tOrYdUKfcKVKnDlKl8Pb9mj/+1LE8AMMMXcKTCRliWktYYmTDLAqOS+0P//CiZhmlCEIJAGlmWel0maMtc2S0YdjGEyaVolxKN27IVlraxw7gba3YW++qy63LpR8KeK5B1GHDvmC0kbP2sf+sSrB6HwLn3f+siAmgJpUV//rFUuiwFTqfWoABpO7WBUEBG0EDBU11MGkhmAcUE0PxAKpREgvnpbJCVGYJ1x4cMozAWkEA5wcgWkgecomWkgecomViB9KJlSnFKsqUzJu2y4nYfE4nYfYadh9i6XD6gfSrfYusv/7UsTwAg0c0wIssMVJVKnhqYYMKNsi6QPKUmZSB5SkzJTPbEzJTMdSZkpmPsFSnD7B9Jw+w9IF0kZHIRGFkcJHIWRlkciSYtulY4BKI4M8foJF80JxVTmplDEuZo81fnmafWAEgUApEJmQkBRUCkQkgKAVgzQKmRcZ/Zx/+qMR8ej/9v+yTEFNRTMuMTAwqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//tSxO8Djdlc8g4wbYlalRvF5iE4qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr/+1LE6gOSMVT4TTDHiO0G3oT3sACqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqg==\",\n  duration: 0.779,\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.779,
    "format": "mp3",
    "sizeKb": 7,
    "license": "CC0",
    "tags": [
      "impact",
      "plank",
      "medium",
      "001"
    ],
    "keywords": [
      "impact",
      "plank",
      "medium",
      "crisp",
      "wooden",
      "tactile",
      "material",
      "wooden button",
      "menu select",
      "ui feedback",
      "game sfx",
      "short",
      "snap",
      "click",
      "confirm",
      "organic",
      "natural",
      "solid",
      "playful",
      "interface"
    ]
  },
  "categories": [
    "impact"
  ]
}