{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "footstep-grass-000",
  "type": "registry:block",
  "title": "Footstep Grass 000",
  "author": "Kenney <https://kenney.nl>",
  "description": "A rustling footstep sound on grass, useful for conveying outdoor movement, exploration, or navigation in a natural, open environment.",
  "files": [
    {
      "path": "registry/soundcn/sounds/footstep-grass-000/footstep-grass-000.ts",
      "content": "import type { SoundAsset } from \"@/lib/sound-types\";\n\nexport const footstepGrass000Sound: SoundAsset = {\n  name: \"footstep-grass-000\",\n  dataUri: \"data:audio/mpeg;base64,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\",\n  duration: 0.775,\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.775,
    "format": "mp3",
    "sizeKb": 7,
    "license": "CC0",
    "tags": [
      "footstep",
      "grass",
      "000"
    ],
    "keywords": [
      "footstep",
      "grass",
      "rustle",
      "outdoor",
      "natural",
      "movement",
      "exploration",
      "walk",
      "step",
      "soft",
      "organic",
      "nature",
      "progress",
      "navigation",
      "character",
      "environment",
      "short",
      "gentle",
      "serene",
      "stroll",
      "ambient"
    ]
  },
  "categories": [
    "footstep"
  ]
}