{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "jingles-pizzi-10",
  "type": "registry:block",
  "title": "Jingles Pizzi 10",
  "author": "Kenney <https://kenney.nl>",
  "description": "A melodic pizzicato jingle with a warm and inviting feel, great for indicating a new message, a successful login, or a gentle positive notification.",
  "files": [
    {
      "path": "registry/soundcn/sounds/jingles-pizzi-10/jingles-pizzi-10.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const jinglesPizzi10Sound: SoundAsset = {\n  name: \"jingles-pizzi-10\",\n  dataUri: \"data:audio/mpeg;base64,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IAWnczk3g/4UKlyR//tSxLmCCYBpH03hZwGPESHF3Ki4xfJrSgTJnqLVILM6dlhqpWIw7LYi5I1nlnk0ii+JQVBYGgaflgaBoOdQKgqGvr+e//yX///1f61MQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+1LEv4ILEGkYzmFlQV0N4kXcoLBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7UsTFg8lYSRBNYMWAAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV\",\n  duration: 0.797,\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.797,
    "format": "mp3",
    "sizeKb": 7,
    "license": "CC0",
    "tags": [
      "jingles",
      "pizzi",
      "10"
    ],
    "keywords": [
      "pizzicato",
      "plucked",
      "strings",
      "melodic",
      "warm",
      "inviting",
      "new message",
      "successful login",
      "positive notification",
      "gentle",
      "subtle",
      "ui alert",
      "confirmation",
      "success",
      "pleasant",
      "app ui",
      "feedback",
      "jingle"
    ]
  },
  "categories": [
    "jingles"
  ]
}