{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "jingles-sax-09",
  "type": "registry:block",
  "title": "Jingles Sax 09",
  "author": "Kenney <https://kenney.nl>",
  "description": "A brief and distinct saxophone jingle with a clear, upward inflection, ideal for a quick success cue or a positive micro-interaction.",
  "files": [
    {
      "path": "registry/soundcn/sounds/jingles-sax-09/jingles-sax-09.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const jinglesSax09Sound: SoundAsset = {\n  name: \"jingles-sax-09\",\n  dataUri: \"data:audio/mpeg;base64,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\",\n  duration: 0.373,\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.373,
    "format": "mp3",
    "sizeKb": 4,
    "license": "CC0",
    "tags": [
      "jingles",
      "sax",
      "09"
    ],
    "keywords": [
      "saxophone",
      "brass",
      "jazz",
      "brief",
      "distinct",
      "upward inflection",
      "quick success",
      "positive micro-interaction",
      "ui feedback",
      "notification",
      "subtle",
      "crisp",
      "light",
      "cheerful",
      "short",
      "confirmation",
      "jingle"
    ]
  },
  "categories": [
    "jingles"
  ]
}