Skip to content

v0.18.0 — sound banks from portal-curated playlists - #16

Merged
this-fifo merged 2 commits into
masterfrom
feat/sfx-sound-banks
Jul 28, 2026
Merged

v0.18.0 — sound banks from portal-curated playlists#16
this-fifo merged 2 commits into
masterfrom
feat/sfx-sound-banks

Conversation

@this-fifo

Copy link
Copy Markdown
Member

createSoundBank can now take a playlist_id instead of seeds. Slots curated in the portal become pools, so the sounds a game plays can change without shipping code.

local bank = AudioScape:createSoundBank({ playlist_id = "sfx-1785256484251" })
bank:resolveAsync()

sound.SoundId = "rbxassetid://" .. bank:pick("footstep")

The design call

Slots are used exactly as curated — no similarity expansion at runtime. Whoever built the bank already decided what belongs in each slot, and quietly adding sounds they never listened to is the same mistake as swapping a game's gunshot unasked. Widening a slot is a decision made in the portal, where it can be heard first. bank.Pools[name].source reads "playlist" on this path.

Everything downstream is unchanged: pick still avoids immediate repeats, and reportUnavailable still drops a sound that fails to load.

Types

getPlaylist now understands playlists carrying sound effects — playlist.kind (music / sfx / mixed), playlist.slots, and a sounds list beside tracks. Kept separate rather than unioned into tracks so neither list needs a type test before use, which strict-mode Luau makes genuinely painful.

Sounds carry the same shape as sfxSearch results including sound_start_sec / sound_end_sec — trimming to sound_start_sec removes the leading silence that makes an impact feel late.

seeds is now optional. Pass seeds or playlist_id, not both.

Verification

  • 3 new unit blocks in soundBank.spec.luau — playlist pools, picking, and the failure paths (a 404 playlist, a music playlist with no slots, both rejected rather than resolving to an empty bank that picks nil at runtime). 21 specs pass.
  • 2 new Open Cloud stepsgetPlaylist (sfx) asserts slots account for every sound; createSoundBank (from playlist) asserts the resolved pools match the declared slots index for index. 27/27 green against the live API through a real Roblox engine.
  • stylua, selene, and luau-lsp analyze clean.

The server side is already deployed, so the smoke ran against the real endpoint rather than a staging shim.

createSoundBank now accepts a playlist_id instead of seeds. Slots become
pools, so the sounds a game plays can change without shipping code.

Slots are used exactly as curated — no similarity expansion. Whoever
built the bank already chose what belongs in each slot, and quietly
adding sounds they never listened to is the same mistake as
auto-refreshing their gunshot. Widening a slot is a decision made in the
portal, where it can be heard first.

Adds kind/sound_count/slots to PlaylistInfo and a sounds list to
PlaylistResult, kept separate from tracks so neither needs a type test
before use.

Verified end to end through Open Cloud against the live API: 27 steps
green, including a two-slot bank whose pools match the playlist's
declared slots exactly.
@this-fifo
this-fifo temporarily deployed to openCloud-smoke July 28, 2026 18:15 — with GitHub Actions Inactive
@this-fifo
this-fifo merged commit ca95fbf into master Jul 28, 2026
2 checks passed
@this-fifo
this-fifo deleted the feat/sfx-sound-banks branch July 28, 2026 18:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant