Breaking Changes
- [#11] The Fade Duration module setting is gone. Each playlist's own Fade Duration field in the Playlists sidebar now controls how module music fades in and out.
- [#11] Tracks silenced by the old fade path still hold a volume of 0 in world data. Raise the volume slider on any track that plays silent after updating.
- [#13] The area and combat suppression toggles now share one world setting that covers every music context, including sections added by other modules. Previous suppression toggles are not carried over and start unsuppressed after updating.
- [#6] The module API moved from
game.vgmusictoglobalThis.VGMUSIC. Macros and modules that referencedgame.vgmusicneed updating.
New Features
- [#13] Module API additions:
registerSectionreturns a handle withunregisterandrefresh,unregisterSection,getRegisteredSectionsandrefreshSectionsare exposed onVGMUSIC, and avgmusic.suppressionChangedhook fires when the suppressed set changes. - [#6] A
vgmusic.trackChangedhook now fires on every connected client whenever the playing track changes. - [#6] Other modules can now register their own playlist sections, which appear in the music config alongside the built-in ones, and can temporarily suppress a music context without flipping the GM suppress settings.
- [#7] A new world setting picks which Calendaria slots the widget occupies. It only appears in the settings menu when Calendaria is active, and changing it requires a reload.
- [#7] Clicking the widget as a GM suppresses the current music context for everyone until clicked again. Any other user clicking it mutes module music for themselves only, and that mute persists across track changes.
- [#7] With Calendaria installed, a now-playing widget appears in its HUD. The icon turns green while a track is playing, red when silenced, and the tooltip names the current track.
- [#9] A Music Configuration entry was added to the scene navigation and scene sidebar context menus.
- [#9] Dropping a playlist anywhere on the music config window opens a prompt asking which section it belongs to, its starting track and its priority, with a description of each section shown as you select it.
Bug Fixes
- [#11] Saving a resume position no longer re-triggers a playback refresh, and a client's mute is now re-applied after audio unlocks and whenever the playing track's volume re-syncs.
- [#11] Track transitions no longer write volume changes into your playlist tracks, so an interrupted fade can no longer leave a track permanently silent.
- [#12] A section whose playlist has no playable track is now skipped instead of winning the sort and silencing every section below it.
- [#12] A track left playing by a previous session or a previous primary GM is now stopped before the next one starts.
- [#12] A user who muted the module before being made a GM is no longer left silent.
- [#12] Playback is re-evaluated when a user connects or disconnects, so music follows the new primary GM when that role moves.
- [#12] The now-playing state and
vgmusic.trackChangedhook now update when the context changes on the same track. - [#14] A scene's stored resume positions are no longer wiped when the scene is deactivated, and the flag write on that path no longer raises a permission error on every player client.
- [#14] Combat music now follows the active encounter on the current scene, so a stale encounter left in the tracker no longer shadows the running fight.
- [#14] In the area and generic silent-combat modes, section ordering now compares both sides of a pair, so the priority tiebreak is reachable again.
- [#14] The music config window now opens separately from Scene Config and Token Config instead of the second replacing the first.
- [#14] The suppression keybindings are restricted to GMs.
- [#15] A track name containing a double quote no longer breaks the Calendaria widget's label and tooltip.
- [#15] Every playlist row in the music config was labelled "Combat Music" regardless of the section it belonged to. Each row now names the section it belongs to.
- [#6] Music transitions are queued instead of overlapping, and playback no longer starts before the world is ready.
Changes
- The Music field in Scene Config now carries its own hint, "Configure the music that plays on this scene.", instead of repeating the world Default Music setting hint.
- Verified compatibility bumped to Foundry v14.366.
- [#10] No user-facing change. The module ships as a single bundled script built with rollup, and the release zip is published from the build output rather than the source tree.
- [#13] A priority of 0 is now treated as a real value instead of unset.
- [#13] Playlist sections registered by other modules are now validated on registration, and a section that throws while resolving its music is skipped. Rejections are written to the console.
- [#15] The Scene Config and Token Config music fields are now labelled "Music" instead of "Combat Music", since the dialog they open configures every registered section rather than combat alone.
- [#16] No user-facing change. Scripts were reorganized, hook registration moved out of the entry file, unused helpers deleted, and lint, format, stylelint and validate scripts added to the package manifest.
- [#17] The GM client that drives playback is now the primary GM chosen in ATLAS, instead of whichever active GM sorted first internally. Track changes, saved resume positions, the now-playing state and suppression requests all run on that GM.
- [#9] The Save and Reset buttons are gone. Every change is written as it is made, and a failed write reports an error notification.
- [#9] The music config window now lists every assigned playlist in a single table ordered by the priority that decides playback, replacing the separate box per section.
- [#9] The music config window now uses the module's own stylesheet and follows ATLAS theming instead of borrowing the dnd5e system's styling.
What's Changed
Full Changelog: release-1.3.0...release-1.4.0
Installation: To manually install this release, use the following manifest URL: https://github.com/Sayshal/vgmusic/releases/download/release-1.4.0/module.json