UMB is a fork of Sma5hMusic for adding music to Super Smash Bros. Ultimate. It keeps Sma5h's core mod-build pipeline, but replaces the JSON metadata format with a folder-based layout (series.toml + tracks.csv) that's easier to manipulate for batch song additions to the game.
Heads up. This tool is highly experimental and may not always work as expected.
- Always keep backups of your files before using them with this tool.
- Mods are not safe online.
- FFmpeg - For LUFS volume normalisation, use
appsettings.json → Sma5hMusic.LufsNormalization.FfmpegPathto point to local install- Just install via commandline
winget/choco/apt-install/pacman/brewfor easiest setup
- Just install via commandline
- pymusiclooper - For detecting loop points during standard audio ->
nus3audioconversion- Global install via
pip
- Global install via
- A partial dump of Smash Ultimate assets from
data.arc(identical to Sma5h) inResources/Game
Download the release for your OS from releases, note that the Linux/MacOS builds haven't been as extensively tested as the Windows build.
To import your existing Sma5h mods, place them in Mods/OldMods and run the convert action from the main menu.
To create a new mod just create a new folder in Mods/MusicMods.
Every action below is reachable interactively through the terminal menu or directly via UMB.CLI <action>.
- Build - validates the target mod and builds it to be used on your SD card
- Scaffold - creates
series.toml,tracks.csvfor every series. If song entries are missing, backfills using[default-track-data]table. Safe to re-run any time you drop new audio files in. - Nus3 Convert - converts standard audio (
.mp3/.flac/.wav/.ogg) for a series into.nus3audiowith detected loop points, results dumped intosongs-to-validate/subfolder for review. See Nus3 conversion & acceptance below. - Accept Nus3 (
accept-nus3) - promotes validated.nus3audiofiles fromsongs-to-validate/into the series folder proper, updatestracks.csvto point at the new filenames, and (optionally) deletes the source audio files. - Convert (
convert) - imports an old Sma5hMusic mod (metadata_mod.json+ audio underMods/OldMods/<name>/) into UMB's folder-based format. - Merge (
merge) - combines two or more UMB mods into a single output mod, preserving series toml metadata from the priority mod. - Extract Icons (
extract-icons) - pulls series icons out of an already-built Sma5h mod's BNTX files. - Cleanup (
cleanup) - removestracks.csvrows that point at deleted files, prunes dead filenames out of[[playlists]] songsarray. Safe to run any time. - Order Series (
order-series) - drag-and-drop reorder for the custom-series display order across a mod. Writesseries-order.tomlat mod root. - Order Tracks (
order-tracks) - drag-and-drop reorder for tracks within series.existing-seriesmods can interleave tracks with vanilla songs. - Config Volume (
config-volume) - preview tracks at their post-build loudness (after LUFS normalization) and override per-track gain. - Dump Stages (
dump-stages) - diagnostic. Loads vanilla state and prints every stage'sUiStageId/UiSeriesId/BgmSetId, then writesstages_dump.csv, for debug purposes.
Each series folder contains a series.toml and tracks.csv. For new modded series:
[series]
id = "the-finals"
name = "THE FINALS"
playlist-incidence = 100
series-playlist = "bgm_the-finals"
[[games]]
id = "the-finals"
name = "THE FINALS"
[[playlists]]
id = "bgm_the-finals"
incidence = 100
songs = "*"
[default-track-data]
game = "the-finals"
author = "Embark Studios"
copyright = "© 2023 Embark Studios"
record-type = "original"
volume = 1.0Fields:
[series].id/name- internal id and in-game label.playlist-incidence- default random-roll weight for the auto-generatedbgm_gametitle_<id>playlist. Per-[[playlists]]blocks can override with their ownincidence.series-playlist- optional extra playlist that receives every song. Scaffold setsbgm_<id>for new series.bgm_gametitle_<id>is created regardless.[[games]]- one block per "game". Custom series need at least one.idis referenced bytracks.csv'sgamecolumn.[[playlists]]- extra playlists for this series' songs.id- playlist identifier (existing stage playlist, or a new one UMB will create).incidence- random-roll weight for this block's songs.songs-"*"for all, or a TOML array of filenames. Stem-tolerant:"Destroyer"matchesDestroyer.nus3audio. Pre-build validation warns on no-match entries;Cleanupprunes them.
[default-track-data]- defaults applied to rowsScaffoldadds totracks.csv.
When the folder name matches a vanilla series, scaffolding writes a slightly different toml. Structure above still applies, plus:
[series]
id = "example_series" # matches the vanilla series id (without the ui_series_ prefix)
name = "Example Series" # the english label this series uses in vanilla
existing-series = true # tells UMB the series exists already - skip creating a SeriesEntry
playlist-incidence = 100
series-playlist = "bgmexample" # the vanilla stage playlist for this series (scaffold fills this in)
[[games]]
id = "example_game_one" # vanilla games for this series, plus any custom sub-games you want
name = "Example Game One"
[[games]]
id = "example_game_two"
name = "Example Game Two"When existing-series = true:
- No
SeriesEntryis emitted (vanilla one is reused). - Game-title entries are still emitted. Vanilla duplicates are deduped; custom sub-games get registered.
series-playlistpoints at the vanilla stage playlist, so your songs join the random rotation on every stage using it.- Optional
song_order.toml(written byOrder Tracks) interleaves your songs with vanilla in Sound Test / My Music.
Smash Ultimate plays audio from .nus3audio containers (Namco OPUS or IDSP) with embedded loop points. UMB uses a convert -> review -> accept flow to sanity-check loops before building.
Step 1 - Nus3 Convert. Drop source audio (.mp3/.flac/.wav/.ogg) into a series folder. Run nus3-convert, pick the series, set the minimum loop score (default 94.5%) and preview length. Optionally enable auto-convert to skip the per-song preview prompt and accept the top-ranked loop above threshold. UMB:
- Converts each source to temporary
.idsp/OPUS viaVGAudioCli. - Scans for the highest-scoring loop point (waveform autocorrelation).
- Wraps it in a
.nus3audiovianus3audio. - Writes results to
songs-to-validate/in the series folder, plus a preview clip.
Files below the loop-score threshold or already in songs-to-validate/ are skipped.
Step 2 - review. Listen to the preview clips. Delete any .nus3audio whose loop is wrong; keeping it means "good loop". Re-run nus3-convert with a stricter score to gate looser hits.
Step 3 - Accept Nus3. Run accept-nus3 on the same series. UMB:
- Moves surviving
.nus3audiofromsongs-to-validate/into the series folder. - Updates
tracks.csvso the row'sfilenamepoints at the new.nus3audio(matched by basename:My Song.mp3->My Song.nus3audio). - Optionally deletes the source audio files (prompts).
- Re-runs
Scaffoldso new rows get defaults.
After acceptance the series folder is ready for Build.
cd UMB.CLI
dotnet build
dotnet rundotnet publish UMB.CLI -c Release -r win-x64 --self-contained -p:PublishSingleFile=true -p:DebugType=embeddedUses AutoMapper 14.0.0 which has a known high-severity DoS vulnerability. AutoMapper 14 is the latest MIT-licensed version. UMB runs locally so the risk is not practical - but do not deploy as a service or expose to a network.
UMB is a fork of Sma5hMusic by Deinonychus71. Most of the heavy lifting was done there.
Music used in the test suite is from flowerhead's somewhatgood music collection, specifically the Karts and Lofi albums.
Tools and contributors:
- Research: soneek
- Original Sma5hMusic testing: Demonslayerx8, Segtendo
- Original Sma5hMusic icon: Segtendo
- prcEditor - https://github.com/BenHall-7/paracobNET - BenHall-7
- paramLabels - https://github.com/ultimate-research/param-labels - BenHall-7, jam1garner, Dr-HyperCake, Birdwards, ThatNintendoNerd, ScanMountGoat, Meshima, Blazingflare, TheSmartKid, jugeeya, Demonslayerx8
- msbtEditor - https://github.com/IcySon55/3DLandMSBTeditor - IcySon55, exelix11
- nus3audio - https://github.com/jam1garner/nus3audio-rs - jam1garner
- bgm-property - https://github.com/jam1garner/smash-bgm-property - jam1garner
- VGAudio - https://github.com/Thealexbarney/VGAudio - Thealexbarney, soneek, jam1garner, devlead, Raytwo, nnn1590
- vgmstream - https://github.com/vgmstream/vgmstream - bnnm, kode54, NicknineTheEagle, bxaimc, Thealexbarney; full contributor list at https://github.com/vgmstream/vgmstream/graphs/contributors
- CrossArc - https://github.com/Ploaj/ArcCross - Ploaj, ScanMountGoat, BenHall-7, shadowninja108, jam1garner, M-1-RLG
- ultimate_tex_cli - https://github.com/ScanMountGoat/ultimate_tex - ScanMountGoat (used to build series-icon BNTX files at build time)
- FFmpeg - https://ffmpeg.org/ - required at runtime for LUFS normalization and audio preview; not bundled