{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "jingles-pizzi-09",
  "type": "registry:block",
  "title": "Jingles Pizzi 09",
  "author": "Kenney <https://kenney.nl>",
  "description": "A short and distinct pizzicato jingle with a simple, pleasant progression, ideal for confirming a selection or a successful minor action in a clean interface.",
  "files": [
    {
      "path": "registry/soundcn/sounds/jingles-pizzi-09/jingles-pizzi-09.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const jinglesPizzi09Sound: SoundAsset = {\n  name: \"jingles-pizzi-09\",\n  dataUri: \"data:audio/mpeg;base64,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P/++fNzBjxfUbGiZqfLhkiitklUf/////zc6kaf/tGAOWAMBoTJikUoYKiklgRComTIRRqoCpBgIBA0eEp0FQ0WBosDSwVgq4GpZ4lcyWPFc6o8o9EsNcRedV53kbaJb3Feo9UxBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+1LE0QIHkDshLT0m4P0KJB62UABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7UsTxABc12SVZuIABEAbax5IwAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV\",\n  duration: 0.569,\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.569,
    "format": "mp3",
    "sizeKb": 5,
    "license": "CC0",
    "tags": [
      "jingles",
      "pizzi",
      "09"
    ],
    "keywords": [
      "pizzicato",
      "plucked",
      "strings",
      "short",
      "distinct",
      "simple",
      "pleasant",
      "confirm selection",
      "minor action",
      "success",
      "clean ui",
      "positive",
      "feedback",
      "button press",
      "tap",
      "notification",
      "subtle",
      "crisp",
      "approval"
    ]
  },
  "categories": [
    "jingles"
  ]
}