{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "jingles-pizzi-16",
  "type": "registry:block",
  "title": "Jingles Pizzi 16",
  "author": "Kenney <https://kenney.nl>",
  "description": "A short, light, and airy pizzicato jingle with a quick, positive punctuation, ideal for brief successful inputs or subtle confirmations.",
  "files": [
    {
      "path": "registry/soundcn/sounds/jingles-pizzi-16/jingles-pizzi-16.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const jinglesPizzi16Sound: SoundAsset = {\n  name: \"jingles-pizzi-16\",\n  dataUri: \"data:audio/mpeg;base64,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\",\n  duration: 0.462,\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.462,
    "format": "mp3",
    "sizeKb": 4,
    "license": "CC0",
    "tags": [
      "jingles",
      "pizzi",
      "16"
    ],
    "keywords": [
      "pizzicato",
      "plucked",
      "strings",
      "short",
      "light",
      "airy",
      "quick",
      "positive punctuation",
      "brief input",
      "subtle confirmation",
      "success",
      "ui feedback",
      "tap",
      "click",
      "cheerful",
      "playful",
      "crisp",
      "notification"
    ]
  },
  "categories": [
    "jingles"
  ]
}