{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "jingles-pizzi-04",
  "type": "registry:block",
  "title": "Jingles Pizzi 04",
  "author": "Kenney <https://kenney.nl>",
  "description": "A very short and quick pizzicato jingle, delivering a bright, crisp affirmation, best for rapid feedback like button clicks or a brief correct entry.",
  "files": [
    {
      "path": "registry/soundcn/sounds/jingles-pizzi-04/jingles-pizzi-04.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const jinglesPizzi04Sound: SoundAsset = {\n  name: \"jingles-pizzi-04\",\n  dataUri: \"data:audio/mpeg;base64,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FckzQi91tW6nm6po6r0UK12lw0zdFFrVaP0yuybJGin+3S1c0s60z4DIxMral1qiggcmfQmzMtnqqT5ooZSl/////vQqAAAIDQaFQzDIIAAAAAMEcDiODHP8TPHjmwvr/kSiQ85f/wFlAiRiTuJoF2hb2Oomk+BwwTIJKGqjAyNiZ8A+gXQDkwsTAgj/+1LEngAM7GMOtdmAAjMfIoc7EABicLJie+RonUW4ToOYLPSUs4k/5QIsTpEyuRQm161/8ul40PF8uGRi+pXr/5saF86cRNT5cQM/q1f/1GxqbpmCZikaGiaBkj1/V///ufND//11TEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7UsSBgBMNnym5mQAAAAA0g4AABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV\",\n  duration: 0.564,\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.564,
    "format": "mp3",
    "sizeKb": 5,
    "license": "CC0",
    "tags": [
      "jingles",
      "pizzi",
      "04"
    ],
    "keywords": [
      "pizzicato",
      "plucked",
      "strings",
      "short",
      "quick",
      "bright",
      "crisp",
      "affirmation",
      "button click",
      "correct entry",
      "rapid feedback",
      "subtle",
      "light",
      "ui sound",
      "tap",
      "notification",
      "confirmation",
      "cheerful",
      "playful"
    ]
  },
  "categories": [
    "jingles"
  ]
}