{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "jingles-nes-04",
  "type": "registry:block",
  "title": "Jingles Nes 04",
  "author": "Kenney <https://kenney.nl>",
  "description": "A bright, distinct 8-bit jingle, signaling a clear positive event, like discovering a hidden item or unlocking a feature in a retro-styled app.",
  "files": [
    {
      "path": "registry/soundcn/sounds/jingles-nes-04/jingles-nes-04.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const jinglesNes04Sound: SoundAsset = {\n  name: \"jingles-nes-04\",\n  dataUri: \"data:audio/mpeg;base64,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\",\n  duration: 0.604,\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.604,
    "format": "mp3",
    "sizeKb": 5,
    "license": "CC0",
    "tags": [
      "jingles",
      "nes",
      "04"
    ],
    "keywords": [
      "jingle",
      "nes",
      "bright",
      "distinct",
      "8-bit",
      "clear",
      "positive",
      "discover",
      "hidden",
      "item",
      "unlock",
      "feature",
      "retro",
      "app",
      "ui",
      "notification",
      "alert",
      "ding",
      "chime",
      "pop",
      "playful",
      "feedback",
      "success",
      "pixel",
      "reveal"
    ]
  },
  "categories": [
    "jingles"
  ]
}