Noyemi 45 Posted February 17, 2015 Noyemi K's Dynamic Music SystemVersion: 1.0Author: Noyemi KDate: February 16, 2015Version History Version 1.0: Original ScriptPlanned Future Versions None (though perhaps it can be extended to include menu music too and have more user-friendly ways to add variations) Description This script allows you to switch between various versions of a BGM, dynamically. For example, you have a version of the track that's just a backbeat, a version with the bass and the backbeat, and a version with all of that plus the melody. It switches between them without restarting the track, just by using a Control Variable event. An easy, customizable naming convention allows you to get more descriptive, but the default uses numbers.I made this with adventure games and ABS RPGs in mind, but it could work with anything really. Features Switch between different variations on one BGM using a variable that you specify in the script Easy editing of variation names Works with auto-start BGM on maps Works only with OGG files or PCM (WAVs) Instructions Place this into its own script above main. You can look in the script for additional instructions. Script #--------------------------------------------------- # Noyemi K's Dynamic Music System #--------------------------------------------------- # Description: # A dynamic music system that switches tracks on-the-fly # without restarts. Useful for creating ambience that # builds throughout various situations in an area. #--------------------------------------------------- module DynamicMusicSystem #--------------------------------------------------- # Editable Region #--------------------------------------------------- # Specify the variable ID used to store the song variation variable. SONG_VARIATION_ID = 1 # Specify the variation extensions # "0", "1", "2", "3"], ["Normal", "Tense", "Puzzle"], etc. Can accomodate any # number of variations up to the variable limit. # ALSO: MAKE SURE YOUR FILENAMES CORRESPOND TO THIS ARRAY # For example, for variations on "Forest.ogg", you might want to use # "ForestNormal.ogg", "ForestCombat.ogg", or "ForestPuzzle.ogg" VARIATION_EXTENSIONS = ['', '1', '2', '3'] end #--------------------------------------------------- # Engine Region. DO NOT mess with anything beyond this point. #--------------------------------------------------- class MusicVariations def initialize super @extensions = DynamicMusicSystem::VARIATION_EXTENSIONS #msgbox(@extensions) #DEBUG end def cache_BGM @variationID = $game_variables[DynamicMusicSystem::SONG_VARIATION_ID] @songpos = Audio.bgm_pos if @variationID == 0 $bgm_name = ('Audio/BGM/' + RPG::BGM.last.name) end end def check_variations if @extensions[@variationID] == nil @play = @last else @play = $bgm_name + @extensions[@variationID] @last = @play end Audio.bgm_play(@play, 100, 100, @songpos) end end #--------------------------------------------------- # Starts the engine at the title #--------------------------------------------------- class Scene_Title #------------------------------------------------------------------------- # * Alias Main to initialize the data class upon startup #------------------------------------------------------------------------- alias start_dms start def start start_dms # Initialize $dms = MusicVariations.new end end class Game_Player alias update_dms update def update update_dms $dms.cache_BGM $dms.check_variations end end Credit Noyemi K. The script is free for commercial or non-commercial use. Just credit me and/or provide a link to my site. Support Let me know if there are any bugs or improvements and I will update the script to reflect that. Known Compatibility Issues There shouldn't be any compatibility issues, unless some other script uses $bgm_name as a global variable. Demo Check Here Author's Notes I got the idea for this script from Soul Reaver's sound design, and I wanted to make that possible and modular and easy to use for RMVXA developers! 1 Share this post Link to post Share on other sites
ToastyCheese 46 Posted February 18, 2015 Why has it taken someone so long to do this Share this post Link to post Share on other sites
efeberk 84 Posted February 18, 2015 Good idea It's useful for dynamic gaming. Share this post Link to post Share on other sites
Noyemi 45 Posted February 19, 2015 It might work in battles too, though if it needs more support in that area I'll see what I can do! Share this post Link to post Share on other sites
Tsukihime 1,489 Posted February 20, 2015 Is this similar to having an event that does this on loop? Play Bgm: track 1 wait 999 frames Play Bgm: track 2 wait 999 frames Play BGM: track 3 ... Or does it dynamically determine when would be a good place to change the music depending on the situation? Share this post Link to post Share on other sites
Noyemi 45 Posted February 20, 2015 Is this similar to having an event that does this on loop? Play Bgm: track 1 wait 999 frames Play Bgm: track 2 wait 999 frames Play BGM: track 3 ... Or does it dynamically determine when would be a good place to change the music depending on the situation? All it does is switch between tracks you supply it without starting from the beginning (which can't be done without scripting). It's controlled by a variable, so the dynamic determination aspect still needs some kind of input from the developer. It's more like If BGMX is playing cache pos when situation == 0 play BGMX from current pos when situation == 1 play BGMX_Puzzle from current pos when situation == 2 play BGMX_Tension from current pos ... The script automatically caches a base BGM and uses the name of that file to create a "BGM group" out of all files with a similar (configurable!) naming scheme. For instance: Your BGM folder has the area BGMs "Forest.ogg", "Factory.ogg", and "Desert.ogg". For each of these, the script makes it possible to have a more immersive experience provided you can supply variations of these. So for each of them, there's a "[Area name]_Combat", "[Area name]_Puzzle", "[Area_Name]_Tension", etc. You'd just need to make sure that the names of these variants of the area BGMs matches up to the array in the script, so you'd change VARIATION_EXTENSIONS = ['', '1', '2', '3'] to something more readable, like VARIATION_EXTENSIONS = ['', '_Puzzle', '_Tension', '_Combat'] All that's needed to switch between them and create the illusion of more instruments coming in or some fading out (to change the mood, like say from curious to tense) is a "change variable" event command. The script and your musician handles everything else. The demo shows a really simple form of this concept and you can crack it open and see that the music shifts between files when the variable changes. You still need some way to get the actual tracks (as this cannot generate music), but if you have them, this script will make it possible to do something like Soul Reaver, which was the whole point of it. Share this post Link to post Share on other sites
stegan 0 Posted July 10, 2022 (edited) I would really like to use this script but I always get this stupid error... what did I do wrong? Edited July 10, 2022 by stegan Share this post Link to post Share on other sites
roninator2 274 Posted July 11, 2022 (edited) 19 hours ago, stegan said: what did I do wrong You skipped the title screen. That section of code needs to be setup from the title screen method Perhaps after line 80 add $dms = MusicVariations.new if $dms.nil? You also put code to skip the title screen in the scenemanager section. Custom code should always go into a new slot. DO not ever modify the default scripts. It makes fixing problems much harder later. Edited July 11, 2022 by roninator2 1 Share this post Link to post Share on other sites
stegan 0 Posted July 11, 2022 Thank you for your answer! So I can't use the script? Because my game should start without the title screen right into the first map. Is this possible to overcome? Share this post Link to post Share on other sites