From summer
Generates long looping location ambience (forest, dungeon, spaceship) for Godot games. Wires as looping AudioStreamPlayer on Ambient bus.
How this skill is triggered — by the user, by Claude, or both
Slash command
/summer:ambient-bedaudio/ambient/****/*.tscn**/*.importThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
An ambient bed is the *air* of a place. Forest at dawn, dungeon corridor, spaceship hum, market street, ocean cave. It plays at low energy under everything else — never melodic, never drawing attention, but its absence is immediately felt. Players don't notice an ambient bed; they notice the silence when you forget one.
An ambient bed is the air of a place. Forest at dawn, dungeon corridor, spaceship hum, market street, ocean cave. It plays at low energy under everything else — never melodic, never drawing attention, but its absence is immediately felt. Players don't notice an ambient bed; they notice the silence when you forget one.
This is not music. Use summer_generate_audio({capability: 'sound_effects'}), not {capability: 'music'}. SFX renders textures; Music renders melody. You want texture.
Generated at 15–22 seconds (the SFX duration ceiling) and looped seamlessly with a Godot loop point and optional crossfade.
audio/sound-effect.audio/music-track.audio/voice-line.Read .summer/audio-bible.md
The bible's Ambient layer SFX class names the character — usually "continuous, low presence, no looping melody". Honor it. The mix rules sit ambient at the bus level the bible defined (typically Ambient bus around -12 dB).
Ask if it's not pinned by context:
Which location's ambience? Be specific — "forest at dawn with light wind and distant birds" beats "outdoors". The model needs the time of day, the weather, and 2–3 sound sources.
ElevenLabs SFX renders ambient textures well when the prompt names sources, not vibes.
Prompts that work:
forest at dawn, gentle wind through leaves, distant bird calls every 6 seconds,
soft creaking branches, no music, no human sound, 22s seamless loop
stone dungeon corridor, distant water drip, low rumble, faint draft, no music,
no creature sound, 22s seamless loop
spaceship corridor, low hum at 60Hz, occasional electronic chirp, ventilation
whoosh, no human voices, 22s seamless loop
medieval marketplace at noon, distant chatter, footsteps on stone, occasional
horse, distant blacksmith hammer, no recognisable words, 22s loop
ocean cave, slow waves entering, low rumble, water drip echoes, no seagulls,
22s seamless loop
night swamp, crickets, distant owl, slow water lapping, occasional frog,
22s seamless loop
abandoned office building, fluorescent hum, distant air conditioning, faint
paper rustle from a vent, no human sound, 22s loop
Prompts that DON'T work:
| Bad prompt | Failure mode |
|---|---|
forest ambience | No time / weather / sources. Returns generic forest with random energy spikes. |
creepy dungeon | Vibe word, not a description. Model adds horror stings you don't want. |
peaceful background music | Triggers musical interpretation. Use SFX-shaped prompts. |
loud bustling market | Energy too high for a bed; use as a one-shot SFX layer instead. |
forest with wolves howling | Wolf howl is an event, not a bed; promotes itself in the mix. |
A bed should be boring. Ask for sparse events.
every 6 seconds rather than often.occasional not frequent.distant not close.low not loud.If the user wants a busier bed (market, party), still prevent foreground events: no recognisable words, no individual loud sounds, general crowd murmur.
summer_generate_audio(
capability: "sound_effects",
prompt: "forest at dawn, gentle wind through leaves, distant bird calls every 6 seconds, soft creaking branches, no music, no human sound, 22s seamless loop",
durationSeconds: 22
)
// Result: { asset: { fileUrl, ... } }
// Then: summer_import_from_url(url: "<fileUrl>", path: "res://audio/ambient/forest_dawn.wav")
22s is the SFX ceiling. Always generate at the ceiling for ambient — longer cycle means less recognized repetition.
If the model returns a clip with a loud event near the start or end (a sudden bird right at 0:00), regenerate. That kills loop seamlessness.
This step is what makes the bed sound like a place rather than a 22-second sample.
In the Godot editor, select the .wav, open the Import dock:
| Setting | Value |
|---|---|
| Loop | On |
| Loop Mode | Forward |
| Loop Begin | 0 (or 0.5 if there's a fade-in artifact) |
The .import file:
[params]
loop = true
loop_offset = 0.0
loop_mode = 1
After changing, click Reimport.
ElevenLabs SFX returns are not gapless. Even with loop = true, you'll hear a tiny click on the loop point. Fix it with a two-player crossfade in code:
# scripts/audio/AmbientBed.gd
extends Node
@export var stream: AudioStream
@export var fade_seconds: float = 1.5
@export var bus: StringName = &"Ambient"
@export var volume_db: float = -12.0
var _a: AudioStreamPlayer
var _b: AudioStreamPlayer
var _active: AudioStreamPlayer
func _ready() -> void:
_a = _make_player()
_b = _make_player()
_active = _a
_active.play()
_schedule_next()
func _make_player() -> AudioStreamPlayer:
var p := AudioStreamPlayer.new()
p.stream = stream
p.bus = bus
p.volume_db = volume_db
add_child(p)
return p
func _schedule_next() -> void:
var len := stream.get_length()
var t := get_tree().create_timer(len - fade_seconds)
t.timeout.connect(_crossfade)
func _crossfade() -> void:
var next := _b if _active == _a else _a
next.volume_db = -60.0
next.play()
var tw := create_tween().set_parallel(true)
tw.tween_property(next, "volume_db", volume_db, fade_seconds)
tw.tween_property(_active, "volume_db", -60.0, fade_seconds)
tw.chain().tween_callback(func() -> void: _active.stop())
_active = next
_schedule_next()
This eliminates the click and adds variation through phase-overlap (the loop overlaps itself by fade_seconds so the bed never repeats identically).
AudioStreamPlayer on the Ambient busFor most beds, non-positional is correct (the player is in the place; the bed isn't an emitter):
summer_add_node(parentPath="/root/Game/Level", type="AudioStreamPlayer", name="AmbientBed")
summer_set_prop(path="/root/Game/Level/AmbientBed", property="stream", value="res://audio/ambient/forest_dawn.wav")
summer_set_prop(path="/root/Game/Level/AmbientBed", property="bus", value="Ambient")
summer_set_prop(path="/root/Game/Level/AmbientBed", property="volume_db", value=-12.0)
summer_set_prop(path="/root/Game/Level/AmbientBed", property="autoplay", value=true)
Or attach the script in step 7 to a Node, set its stream to the imported audio, and skip the AudioStreamPlayer node — the script provides its own.
For positional beds (ambience emitting from a fountain, a campfire, a vent) use AudioStreamPlayer3D with attenuation. The bible's 3D attenuation: inverse-square, 25m rule applies.
Real places have layered ambiences. A forest at dawn might be:
-12 dB-18 dBThis is more expensive (3 generations) but produces a bed that doesn't sound like a 22-second loop. Reserve for hub locations or extended scenes.
Forest dawn: forest at dawn, gentle wind, distant birds every 6s,
creaking branches, 22s loop
Forest night: forest at night, crickets, distant owl every 10s, soft
breeze, no music, 22s loop
Stone dungeon: stone dungeon, distant water drip every 4s, low rumble,
faint draft, no creatures, 22s loop
Cave: wet cave, water drip echoes, low air movement, distant
rumble, 22s loop
Spaceship: spaceship corridor, 60Hz hum, occasional electronic chirp,
ventilation whoosh, no voices, 22s loop
Marketplace: medieval marketplace at noon, distant chatter no recognisable
words, footsteps on stone, occasional horse, distant
blacksmith, 22s loop
Tavern: medieval tavern interior, low chatter, fireplace crackle,
distant lute, occasional mug clink, 22s loop
Ocean cave: ocean cave, slow waves, low rumble, water drip echoes,
no seagulls, 22s loop
Office: empty office at night, fluorescent hum, distant AC,
faint paper rustle, 22s loop
Snowy plain: snowy plain in wind, low howling wind, faint distant
branches, no music, no creatures, 22s loop
Underwater: underwater, low rumble, distant bubbles, soft mid hum,
no marine life, 22s loop
Boss arena: vast stone arena, low ominous drone, distant rumble,
occasional debris fall, no melody, 22s loop
summer_generate_audio({capability: 'music'}) for an ambient bed. Music model adds melody. You don't want melody.-10 dB on its bus. Beds belong under everything; default is -12 dB to -15 dB.sparse, quiet, low, distant to the prompt.no music, no melody, no chords.no voices, no recognisable words.AudioStreamPlayer3D with max_distance matching the campfire's reasonable hearing radius (4–8m typical).Print the SFX prompt and the import dock settings. User runs via the Summer dashboard and imports manually.
Bed
forest_dawn.wavwired toLevel/AmbientBed, looping with crossfade. Next:
- Generate the night counterpart for time-of-day transitions.
- Add a layered occasional bird-call SFX with a randomized Timer for depth.
- For multi-room transitions, gate beds with Area3D triggers and fade with the same crossfade pattern.
audio/audio-direction — defines the Ambient layer classaudio/sound-effect — short event SFX layered over the bedaudio/music-track — melodic music layered over the bedaudio/adaptive-music — state-driven crossfades use the same patternnpx claudepluginhub summerengine/summer-engine-agent --plugin summerGenerates short SFX one-shots (footsteps, weapon swings, UI clicks, hit impacts) and wires them as AudioStreamPlayer nodes that auto-free on finish. Use when needing a concrete sound effect prompt.
Implements Godot 4.3+ audio systems using GDScript/C#: buses, AudioStreamPlayer/2D/3D nodes, spatial audio, music management, SFX pooling, dynamic mixing.
Game audio systems, music, spatial audio, sound effects, and voice implementation. Build immersive audio experiences with professional middleware integration.