{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "jingles-pizzi-11",
  "type": "registry:block",
  "title": "Jingles Pizzi 11",
  "author": "Kenney <https://kenney.nl>",
  "description": "A bright and cheerful pizzicato jingle with a clear, moderate tempo, perfect for successful form submissions, completed downloads, or positive system alerts.",
  "files": [
    {
      "path": "registry/soundcn/sounds/jingles-pizzi-11/jingles-pizzi-11.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const jinglesPizzi11Sound: SoundAsset = {\n  name: \"jingles-pizzi-11\",\n  dataUri: \"data:audio/mpeg;base64,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qqqqqqqqqqqqAABt//tSxOkCCshpFM7kRcF8jOIJzQi4SXa68Co6AaCUTjM1XVgoJBJ9gwCsqR8Yn3fZHIYMApI8MQwfaPKkf+VInRiGDEoY7/+tDBlMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+1LE7AMMYH8MD2ilwUKLIom8pHBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7UsS9g8b8Fx9GMGCgAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV\",\n  duration: 0.793,\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.793,
    "format": "mp3",
    "sizeKb": 7,
    "license": "CC0",
    "tags": [
      "jingles",
      "pizzi",
      "11"
    ],
    "keywords": [
      "pizzicato",
      "plucked",
      "strings",
      "bright",
      "cheerful",
      "clear",
      "moderate tempo",
      "form submission",
      "download complete",
      "positive alert",
      "success",
      "ui notification",
      "confirmation",
      "progress",
      "happy",
      "light",
      "app ui",
      "jingle"
    ]
  },
  "categories": [
    "jingles"
  ]
}