Here's a simple script to fade in or fade out tracks. I use !sfx for all my sound effect / music needs but it doesn't have the ability to fade in / out a track so I wrote this script. Syntax: !fade [in|out] [trackname] Version 0.2.1 Planned Features: Ability to set level of volume to lower/raise by each tick (currently 10 seconds) Duration of each tick (currently 2 seconds) Script: /* Custom Fade In/Out Track Function / Command by Kastion the Scriptomancer Profile: <a href="https://app.roll20.net/users/3173313/kastion" rel="nofollow">https://app.roll20.net/users/3173313/kastion</a> Syntax: !fade in [track name] | !fade out [track name] */ function fadeOutTrack(trackname) { var song = findObjs({ _type: 'jukeboxtrack', title: trackname.trim(), })[0]; if (!song) { sendChat("fadeTrack", "/w gm Could not find track named '" + trackname + "' - please check the track name and try again.") return; } var trackID = song.get("_id"), level = song.get("volume"), prev_level = song.get("volume"), loops = song.get("loop"); var timer = setInterval(function(){ if (level >= 10) { level = level - 10; song.set({volume:level}); } else { song.set({softstop:true,loop:false}); clearTimeout(timer); setTimeout(function(){ song.set({volume:prev_level}); if (loops) song.set({loop:true}); }, 10000); } }, 2000 ); } function fadeInTrack(trackname) { var song = findObjs({ _type: 'jukeboxtrack', title: trackname.trim() })[0]; if (!song) { sendChat("fadeTrack", "/w gm Could not find track named '" + trackname + "'- please check the track name and try again.") return; } var trackID = song.get("_id"), level = 0, loops = song.get("loop"); var timer = setInterval(function(){ song.set({ 'playing' : true, 'softstop' : false, 'loop' : loops, 'volume' : level }); if (level < 100) { level = level + 10; song.set({volume:level}); } else { clearTimeout(timer); } }, 2000 ); } on('ready',()=>{ on('chat:message',(msg)=>{ if('api' !== msg.type ) { return; } if (!state.fade_pid) state.fade_pid = "API"; if (msg.playerid !== "API") state.fade_pid = msg.playerid; else msg.playerid = state.fade_pid; var cmdName = "!fade"; var msgTxt = msg.content; if (msg.type == "api" && msgTxt.indexOf(cmdName) !== -1 && playerIsGM(msg.playerid)) { let args = msg.content.split(/\s+/); switch( args.shift().toLowerCase()) { case '!fade': { switch (args[0].toLowerCase()) { case 'in': fadeInTrack(args[1]); break; case 'out': fadeOutTrack(args[1]); break; } } break; } } }); log("-=> Fade command loaded (!fade) <=-") }); I created this command specifically to work with the !delay script located here in the API section of the forums. If you have any issues or feature suggestions please feel free to post them in this thread.