{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "power-up-4",
  "type": "registry:block",
  "title": "Power Up 4",
  "author": "Kenney <https://kenney.nl>",
  "description": "A bright, short ascending melody, perfect for indicating a successful action, gaining an item, or a level up in a game.",
  "files": [
    {
      "path": "registry/soundcn/sounds/power-up-4/power-up-4.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const powerUp4Sound: SoundAsset = {\n  name: \"power-up-4\",\n  dataUri: \"data:audio/mpeg;base64,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\",\n  duration: 0.546,\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.546,
    "format": "mp3",
    "sizeKb": 5,
    "license": "CC0",
    "tags": [
      "power",
      "up",
      "4"
    ],
    "keywords": [
      "success",
      "gain",
      "achievement",
      "level up",
      "upgrade",
      "item acquired",
      "positive feedback",
      "reward",
      "magical",
      "sparkle",
      "short",
      "bright",
      "chime",
      "fanfare",
      "unlock",
      "quest complete",
      "progress",
      "powerup",
      "boost",
      "game ui"
    ]
  },
  "categories": [
    "power"
  ]
}