{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "pep-sound-4",
  "type": "registry:block",
  "title": "Pep Sound 4",
  "author": "Kenney <https://kenney.nl>",
  "description": "A light and ascending \"pep\" sound, ideal for indicating a small gain, level up, or positive progression.",
  "files": [
    {
      "path": "registry/soundcn/sounds/pep-sound-4/pep-sound-4.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const pepSound4Sound: SoundAsset = {\n  name: \"pep-sound-4\",\n  dataUri: \"data:audio/mpeg;base64,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ojt/////////1x4HwBIOiRAD2u//rsDAdtOR8QBWA9Sr0i9kte0k6cTtJMuErHUMbzskUGNRwFWDBgEfBrpumCSAJlOQY2ALQFFAyafhEA7SYi/wBwaPQoXQIu34IfJcRpefPul2fOf//hv////+egAA3JbWgkAALAEw//tSxAWACuRVRa7kx9GXl6qptiXaKGjBijjcQGwwDKBljjxZvIwthZSjoGTWFAVaBafIFCU2NT85ijNYN18170ApFoW4Fhh4VREMMQxaVEkAFEKUZs//if6P//1f////yoAtCJ2XRgt4FQcw0TM3tDJiVON/0v1amvpfqx+vgtIlY0xkZMMIjsG4Hz4mHBb+ywWQIYlxuCMfttSO9QRtQSJEyMVszRvgoguaCNLk+UGFYQdtj6D/+jBvl5kj/THlP/r/////lqFG7I47tdtIWSD/+1LEBQAKfRtxrCRNMUugLfWGCXZTqqZCVDfOs/7+xrs2y1ksCLAaFShYLE2qoULKaFC5JZrfIUSVvqVpjUM6ssyTI62mSbKX5h4Nr0X/im/1FfjfEP/4P6O/2f+gJ5C+byS//+2MuEhtKAKhT3WmyJ+Fpe/hNFQyVFcFCmM7PMurWnnWvtA+t2u5fqtKpmqsClR5ejq4Vs5BRlMUrJZG7EsUK9BX/L/1b9vhvr//r/+mICYiG3vcoYCwqPQUAJkmJmjgSpsj6055Zj001tSh+v/7UsQPgArRA0muLFZRdTBntd20eqt2BEl0ou+/6VrpP8z5xGXTzsug07TUV2w82uEhl8XKA3iV27/sqa//n6A9G//////YP/////jAACCRZdk2EAvEqAMCRNMPttP1YzCgpNNlC73HlIMLEmbXM6VQkZOxIytckc5blAD8J2l6hB3k4TGYCBhvL7KEbJR/+tJknofM/0vSzn/////60UP/////////65sqAAIRGu1bgQEDLgBQXNlFk7yASIUJxuo1948x2lYKQ2vlikRh19qu//tSxBOACiSzQ65lpZFNkCi13Kj6lKXSgF6BJARfnAvBathlY+iILhQ8uln/0TBR+v6v/84///5M9////+gJgAIIj77uwEBcyAkwBCQyAk4yxDgsqwJ/XClTCQbkX9jVLlKGakKI05jkBhUxmcw8WTXdS5c19AueRZnmtUEhcKE4ggI//nFDJb/yP//6/////1GaAAAI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\",\n  duration: 0.624,\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.624,
    "format": "mp3",
    "sizeKb": 5,
    "license": "CC0",
    "tags": [
      "pep",
      "sound",
      "4"
    ],
    "keywords": [
      "pep",
      "light",
      "ascending",
      "positive",
      "gain",
      "level up",
      "progression",
      "game ui",
      "reward",
      "encouragement",
      "subtle",
      "cheerful",
      "quick",
      "crisp",
      "collect",
      "perk",
      "achievement",
      "progress",
      "short"
    ]
  },
  "categories": [
    "pep"
  ]
}