{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "jingles-pizzi-05",
  "type": "registry:block",
  "title": "Jingles Pizzi 05",
  "author": "Kenney <https://kenney.nl>",
  "description": "A concise and cheerful pizzicato jingle, offering positive feedback for simple interactions, such as enabling a toggle or making a successful menu selection.",
  "files": [
    {
      "path": "registry/soundcn/sounds/jingles-pizzi-05/jingles-pizzi-05.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const jinglesPizzi05Sound: SoundAsset = {\n  name: \"jingles-pizzi-05\",\n  dataUri: \"data:audio/mpeg;base64,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A8pkZRoubSXBPYyjQY48MaOk1aCQyJhv/gCIJFHtewtuId/lcDoPwwjOTCHdklOr1uAZsGxEieRrqLMgh/+bY5yYXWTgKoESThiZUjfTX//3//9FsASCpbMyFszk5bMzNo4y1BoQj+YBWYEIxs9zRm7PjpDIqtsILOyDQEsYBDzwP7CbMsdN3dqEw8w7KZEndSbHutIfaxFVI5WNEX7PXd/7//R91AiEqTBkWA5k4onSRgOYQzOKhrKLAiqkIQtOdU3GWZG1NxpQESIT//tSxIiDCRBdHk5oxwFAjKLFzTCwKLDrujELjN5WCJ6gjoYeZRtcHOCzREKBIGhweJSDOun6at6cx//d6vrT+pUAQwAADgSIwoZCrBx0dGK6Ma2KICGqzGJZo4Ux1B0kcszSieeAFAY0ifEMJZHUzn3QrIAiyhZKx3n2dqr3zU5HzwcfbPe2S///////+ogGBkLgoYNTcZOiMYtjOLRaRIl+CTgvouQ7ZN0IcGTM5JGPPSndDMvlEBxCqQ4OAgSeKE13N3NTW/lAFAPRR47TVFP/+1LEmgMKRH0ULmkFwUSKosnNILD//o///7aPr///saAMLBAwsBjL/OEr6FZmaAGwYEFDzD4eMAgGEA5ENTWQtSNw2t5QE1OtmvEKVeY3FggwoEFWxzwobDrHoFBo6RqR9Lvu///0AADAohhQiAQQBWEP+JxlSOGZg4bO0ewqFjggEAIsAiRQCiEuBCRIMTAHi0iFRzEQumATQA2CVHtUdUG4Tg5CSq21AeAJGIIFwX/wKOSw9AKOMGl2/qC9jnNxMxh//7m5fHubrL5v//+aHf/7UsSmAkmoZRTOaSWBNgxiRd0gsDclEUyUNPr//+ShcYuFxjAuGijC31///+aJqQN0kC+8vm8vm/////////+6ZfTVAAEgQAAAAN51PJJlVv/N49i2H/4ALmiW9x/wCWDekVYBmgGsAwS0fBooBsABcHxrXX4BrAcwFpQbMACS/+DdxwOSCwoZUfH/4Y2FmksH7CEouEa3/+KREokUFmigR2kNFaiyf//1jkigS8WRCUgRbFmjlEG///8fI5QzRNjlC5isTQyw5yiBC5jEsf////tSxLaACORHFDXHgAJgwiQnNtAA//jLEyeHKUxBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+1LEpIASeaEW2akAAAAANIOAAARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ==\",\n  duration: 0.536,\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.536,
    "format": "mp3",
    "sizeKb": 5,
    "license": "CC0",
    "tags": [
      "jingles",
      "pizzi",
      "05"
    ],
    "keywords": [
      "pizzicato",
      "plucked",
      "strings",
      "concise",
      "cheerful",
      "positive feedback",
      "simple interaction",
      "toggle",
      "menu selection",
      "success",
      "light",
      "playful",
      "ui sound",
      "button press",
      "confirmation",
      "notification",
      "pleasant",
      "subtle"
    ]
  },
  "categories": [
    "jingles"
  ]
}