{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "three-tone-2",
  "type": "registry:block",
  "title": "Three Tone 2",
  "author": "Kenney <https://kenney.nl>",
  "description": "A short, ascending three-tone chime, suitable for positive confirmations, task completions, or successful notifications.",
  "files": [
    {
      "path": "registry/soundcn/sounds/three-tone-2/three-tone-2.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const threeTone2Sound: SoundAsset = {\n  name: \"three-tone-2\",\n  dataUri: \"data:audio/mpeg;base64,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WRyNoKSNCbi1Cx/y//tSxFoACemFJ0UNVYFRIGb09gz62Klx8NR0uMlsTtpE8DQlHUU6yi0EDeZzmKOYBSrSIuepOtv4vpjLSq0ySQLgR7EORda988TrldYQc2eGb/92j/yAVABm9MVAEaSuG8EOhMTypzYG1tXhmU+bQERnTxFxVEUhOMEd3K/lyMgIvU39KHXY5brWbZTzzFq9l+qLR1T6HIRW/6Nz/92/fzP//+cMCEEEen0Eqmucf9yUoCeo0w6kO5JF1eoTR9n1DtCN/MCGGR8Fv7wKPEQdrUL/+1LEZgAKWIc/p7EH0UewpKT0KKBpeefRUDgxDaqnsyo90mrRGlfu620RPUsyIU37FW3/v/+v/5kaj//89HDwQcApJiYS9yIgDgP2JQRSNNBbVD/2XlRICh/WDfNdXmIjMqKDl1RdNFst+7KPlMumzU8DMzQTOZGhmFuMeFrokrrlSL/YCR/P////8lL//xCosAIkBKTrvklVcQBu5d0Cw/VpmbS+mXzt+vRCEOI5fyY6CtPx4Sj1GjuXZK60YGV8z4ZbFQdE1zJt2JvDmKZKlP/7UsRxgApphTGmrLZBSrBltNCXoCPyzGf15ARWN63////+mn/6crLAlBCWqGhogAcptTzM0HGdYni12d5mQ4CCfqBAQdEf0zGDiVKBSsW5vmGmtU7ulTVpZko979ke01DvRv2v/Ojpt/X/5z//Oej5//lPKDPqD0BoOWoECAQAAJxjzKWrM9l+6shn8aKpV/MjysVjearPsgdmdW/91MpZafo+pu3p9DCL/wiHoiQW8v/mQ39A86zRIWqR/9C5ZHhWAu84gC+KiywCQDWmmtVW//tSxHyACjmDL6YcUoFHMKSo8R14S2a2d87nTWOX5UcujlvqwYCFKVAJFYyt0Vk//MvW69Pzfmlf8zqgqpcrlb/LVv/lmcpSG//geHJkSYCoXD3ylKdBa0uQTMj/Mv+SisqcXTUuUURCNB8ZDxcououoXOpJwnVpJ2KioqKizYt///8V1ilMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+1LEiIDJvYcRApVXwSiw3kBxIvhVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7UsSag8W8pIxABTRgAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV\",\n  duration: 0.866,\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.866,
    "format": "mp3",
    "sizeKb": 7,
    "license": "CC0",
    "tags": [
      "three",
      "tone",
      "2"
    ],
    "keywords": [
      "three tone",
      "chime",
      "notification",
      "success",
      "positive",
      "complete",
      "ascending",
      "alert",
      "ding",
      "confirmation",
      "achievement",
      "short",
      "melodic",
      "progress",
      "ui",
      "feedback",
      "message",
      "reward",
      "subtle",
      "clear"
    ]
  },
  "categories": [
    "three"
  ]
}