累计送礼: 0 个 累计收礼: 1 个 TA的每日心情 开心 2026-7-12 04:10
签到天数: 209 天
连续签到: 2 天
[LV.7]常住居民III
管理员
VIP
7
卡币
58883
OK点
16
推广点
0
同能卷
50
积分 68848
Extended Music Script 3.5
Introduction
This script allows you to play music formats like psf, spc, mod, it, etc in your game, just like mp3 or midi.
Features
New Features:
- Script compatible with RPG Maker VX Ace
I mostly rewrote the code that's indented. Everything else was written by either Mooshykris or Guillaume777 years ago.
Credit us if you want in your game. Please report any bugs you may encounter to zhek.pvm@gmail.com and I'll try to fix them.
Script allows you to play unusual formats ( .psf, .gym, .spc, it, mod, etc. ) if there is a winamp dll for it
Script works with multiple format/dlls and doesn't require a 'call script' ( just make it play like any BGM )
Script won't give error unless there is a music file requiring dll and dll is not there
How to Use
Make sure Winamp.dll, out_wave.dll and the music dlls are in a folder called 'DLL' in your game folder
If you use in_bass.dll you need to have bass.dll in your game folder.
Copy your music files to the BGM folder ( you can't import them via RPG VX/Ace )
If you use .minipsf don't forget to include the psflib !!
Just use an event to play the music like any regular BGM
The music files won't play in Sound Test, only in the real game
If you want loop music files you need to edit dlls in winamp and copy the configure files to the DLL folder
Script
Spoiler Code:
#============================================================================== # Extended Music Script Version 3.5 #------------------------------------------------------------------------------ # Edited by Zhek # May 28, 2012 # # New Features: # - Script compatible with RPG Maker VX Ace # # I mostly rewrote the code that's indented. Everything else was written by # either Mooshykris or Guillaume777 years ago. # Credit us if you want in your game. # Please report any bugs you may encounter to zhek.pvm@gmail.com and I'll try to # fix them. #------------------------------------------------------------------------------ # Edited by Mooshykris # March 6, 2007 #============================================================================== # Version 2.0 Features: # The Ability to play USF, MINIUSF, and all In_Cube Files #============================================================================== #Original Script: #------------------------------------------------------------------------------ #Audio formats extension script #------------------------------------------------------------------------------ # Guillaume777 # 3.1 # 2006/04/28 #============================================================================== # Version 3.0 : # -New support for in_bass dll ! You can now play those formats : # '.XM', '.IT', '.S3M', '.MOD', '.MTM', '.UMX', '.MO3' # -New support for fading ! # -Improved code, now script is really fast # # # Great improvement of Andreas21 'WimAmp plugins', by Guillaume777 ( 2005 ) # Script allows you to play unusual formats ( .psf, .gym, .spc, it, mod, etc. ) if there is a winamp dll for it # Script works with multiple format/dlls and doesn't require a 'call script' ( just make it play like any BGM ) # Script won't give error unless there is a music file requiring dll and dll is not there # Instructions # # Make sure Winamp.dll, out_wave.dll and the music dlls are in a folder called 'DLL' in your game folder # If you use in_bass.dll you need to have bass.dll in your game folder. # Copy your music files to the BGM folder ( you can't import them via RPG VX/Ace) # If you use .minipsf don't forget to include the psflib !! # Just use an event to play the music like any regular BGM # The music files won't play in Sound Test, only in the real game # If you want loop music files you need to edit dlls in winamp and copy the configure files to the DLL folder # # # Credits for Winamp class and Winamp.dll to Andreas21 (C) 2004 module G7_AFES_MOD BGM_DIRECTORY = 'Audio/BGM/' # directory of BGMs DLL_DIRECTORY = 'DLL/' #directory of dll OUT_DLL = 'out_wave.dll' #output dll, default = 'out_wave.dll' WIN_DLL = 'WinAmp.dll' #winamp dll, default = 'winamp.dll' BGM_EXT = ['.mp3', '.mid', '.ogg', '.wma', '.wave'] #normal extension PSF_EXT = ['.psf', '.minipsf', '.psf2', '.minipsf2'] GSF_EXT = ['.gsf', '.minigsf'] USF_EXT = ['.usf', '.miniusf'] CUBE_EXT = ['.hps', '.dsp'] SNES_EXT = ['.spc'] GEN_EXT = ['.gym', '.cym'] MOD_EXT = ['.XM', '.IT', '.S3M', '.MOD', '.MTM', '.UMX', '.MO3'] PSF_DLL = 'in_psf.dll' GSF_DLL = 'in_gsf.dll' USF_DLL = 'in_usf.dll' CUBE_DLL = 'in_cube.dll' SNES_DLL= 'in_snes.dll' GEN_DLL = 'in_ym.dll' MOD_DLL = 'in_bass.dll' end module RPG class AudioFile attr_accessor :file_extension #stores the extension of file attr_accessor :file_name #stores the real file name attr_accessor :file_dll #store dll required to play it end end module Audio @winamp = nil #stores audio player @winamp_volume = nil #stores volume value @winamp_playing_bgm = nil #stores music played by winamp @winamp_bgm_fading = nil #stores if bgm is currently fading or not @winamp_current_dll = nil # stores current dll used by winamp @fade_dec = nil #stores how much the volume decrease per frame while fading def Audio.winamp_bgm_fading return @winamp_bgm_fading end #============================================================================== # Create winamp system, play music file with winamp, set volume #============================================================================== def self.winamp_bgm_play(file_name, volume = 100.0, dll = nil) if @winamp_current_dll != dll then @winamp_current_dll = dll @winamp = WinAmp_Plugin_System.new(dll) #new winamp with new dll end volume = 255 #convert volume from rmxp to winamp if volume > 255.0 then volume = 255.0 end @winamp_playing_bgm = file_name @winamp.play(file_name) @winamp_volume = volume @winamp.setvolume(volume) end #end def #============================================================================== # Initiate the fading, calculates @fade_dec #============================================================================== def self.winamp_bgm_fade_init(frames) if @winamp_playing_bgm != nil then @fade_dec = @winamp_volume / frames @winamp_bgm_fading = true self.winamp_bgm_fade end end #============================================================================== # Fade volume by @fade_dec #============================================================================== def self.winamp_bgm_fade @winamp_volume += -@fade_dec @winamp.setvolume(@winamp_volume) #drop in volume for a fade if @winamp_volume <= 0 self.winamp_bgm_stop end end #============================================================================== # Stops playing music #============================================================================== def self.winamp_bgm_stop if @winamp_playing_bgm != nil then @winamp.setvolume(255) @winamp.stop #stop winamp end @winamp_bgm_fading = false @fade_dec = false @winamp_volume = nil @winamp_playing_bgm = nil end #============================================================================== # Uses Win32API and WinAmp.dll to add winamp functions #============================================================================== class WinAmp_Plugin_System #This part was done by Andreas21 def initialize(in_dll) # DLL Pfaht festlegen dll_directory = G7_AFES_MOD::DLL_DIRECTORY in_dll = dll_directory + in_dll out_dll = dll_directory + G7_AFES_MOD::OUT_DLL winamp_dll = dll_directory + G7_AFES_MOD::WIN_DLL # 2 API Funktionen die gebraucht werden für das Fenster Handel @ReadIni = Win32API.new 'kernel32', 'GetPrivateProfileStringA', %w(p p p p l p), 'l' @FindWindow = Win32API.new 'user32', 'FindWindowA', %w(p p), 'l' # Benötigte DLL Funktionen Laden @Init_Winamp = Win32API.new winamp_dll, 'Init_Winamp', %w(p p l), 'l' @Quit_Winamp = Win32API.new winamp_dll, 'Quit_Winamp', '', '' @Winamp_Play = Win32API.new winamp_dll, 'Winamp_Play', 'p', 'l' @Winamp_Pause = Win32API.new winamp_dll, 'Winamp_Pause', '', '' @Winamp_Stop = Win32API.new winamp_dll, 'Winamp_Stop', '', 'l' @Winamp_OnlyExtensions = Win32API.new winamp_dll, 'Winamp_OnlyExtensions', '', 'p' @Winamp_OutName = Win32API.new winamp_dll, 'Winamp_OutName', '', 'p' @Winamp_OutConfig = Win32API.new winamp_dll, 'Winamp_OutConfig', 'l', '' @Winamp_OutAbout = Win32API.new winamp_dll, 'Winamp_OutAbout', 'l', '' @Winamp_IsPlaying = Win32API.new winamp_dll, 'Winamp_IsPlaying', '', 'l' @Winamp_InName = Win32API.new winamp_dll, 'Winamp_InName', '', 'p' @Winamp_Extensions = Win32API.new winamp_dll, 'Winamp_Extensions', '', 'p' @Winamp_InConfig = Win32API.new winamp_dll, 'Winamp_InConfig', 'l', '' @Winamp_InAbout = Win32API.new winamp_dll, 'Winamp_InAbout', 'l', '' @Winamp_GetFileInfo = Win32API.new winamp_dll, 'Winamp_GetFileInfo', %w(p l), 'p' @Winamp_InfoBox = Win32API.new winamp_dll, 'Winamp_InfoBox', %w(p l), 'l' @Winamp_GetLength = Win32API.new winamp_dll, 'Winamp_GetLength', '', 'l' @Winamp_LengthStr = Win32API.new winamp_dll, 'Winamp_LengthStr', 'l', 'p' @Winamp_GetOutputTime = Win32API.new winamp_dll, 'Winamp_GetOutputTime', '', 'l' @Winamp_SetVolume = Win32API.new winamp_dll, 'Winamp_SetVolume', 'l', '' @Winamp_SetPan = Win32API.new winamp_dll, 'Winamp_SetPan', 'l', '' @Winamp_setoutputtime = Win32API.new winamp_dll, 'winamp_setoutputtime', 'l', '' @Winamp_IsPaused = Win32API.new winamp_dll, 'Winamp_IsPaused', '', 'l' # Winamp Plugin Systen Start @Init_Winamp.call(in_dll, out_dll, handel) end # Play the file. Return 0 if no error happend. def play(file) return @Winamp_Play.call(file) end # First call pause the sound and the second call unpause it. def pause @Winamp_Pause.call() end # Stop playing. def stop return @Winamp_Stop.call() end # Quit WinAmp def quit @Quit_Winamp.call() end # Return all the supported mediafiles. def onlyextensions return @Winamp_OnlyExtensions.call() end # Out_DLL Infos def outname return @Winamp_OutName.call() end # Open the config-dialog of the out-plugin. def outconfig @Winamp_OutConfig.call(handel) end # Open the about-dialog of the out-plugin def outabout @Winamp_OutAbout.call(handel) end # Return <>0 if a sound is playing, but doesn't work if in-plugin don't need the out-plugin def isplaying return @Winamp_IsPlaying.call() end # Return the name of the in-plugin. def inname return @Winamp_InName.call() end # Return the extentions and the type name of all supported mediafiles def extensions return @Winamp_Extensions.call() end # Open the config-dialog of the in-plugin. def inconfig @Winamp_InConfig.call(handel) end # Open the about-dialog of the in-plugin. def inabout @Winamp_InAbout.call(handel) end # return the title of a file and the length in ms. def getfileinfo(playfile,length_adr) return @Winamp_GetFileInfo.call(playfile,length_adr) end # Open the file-info-dialog of the in-plugin. Not supported of all pluggins (=the will do nothing) def infobox(playfile) return @Winamp_InfoBox.call(playfile,handel) end # Returns the length of the playing file in ms. def getlength return @Winamp_GetLength.call() end # Convert the length to a string. Format: "h:mm:ss". def lengthstr(length) return @Winamp_LengthStr.call(length) end # Return the current playing position. def getoutputtime return @Winamp_GetOutputTime.call() end # Set the volume (0 to 255) def setvolume(volume) @Winamp_SetVolume.call(volume) end # Set the pan (left=-127 to 127=right) def setpan(pan) @Winamp_SetPan.call(pan) end # Set the playing position position. Not supported of all in-plugins. Can be very slow. def setoutputtime(time) @Winamp_setoutputtime.call(time) end # Return <>0 if paused. def ispaused return @Winamp_IsPaused.call() end def handel game_name = 0.chr * 255 zeichen = @ReadIni.call('Game','Title','',game_name,255,'.\Game.ini') return @FindWindow.call('RGSS Player',game_name.slice!(0,zeichen)) end #end of init end #end of class end #end of module class RPG::BGM < RPG::AudioFile #-------------------------------------------------------------------------- # ? Play BGM either normally or by using winamp plugin #-------------------------------------------------------------------------- def play(pos = 0) if @name.empty? Audio.bgm_stop Audio.winamp_bgm_stop @@last = RPG::BGM.new else @@last = self.clone if @file_extension == nil then #stores extension of file @file_extension = self.get_file_extension(@name) end if @file_name == nil then #stores path and name of file @file_name = G7_AFES_MOD::BGM_DIRECTORY + @name + @file_extension end if @file_extension.empty? or G7_AFES_MOD::BGM_EXT.include?(@file_extension) #normal music file Audio.winamp_bgm_stop Audio.bgm_play( @file_name, @volume, @pitch, pos) else #if file required winamp plugin to play Audio.winamp_bgm_stop Audio.bgm_stop if @file_dll == nil then @file_dll = self.get_dll(@file_extension) # get dll required to play file end Audio.winamp_bgm_play(@file_name, @volume, @file_dll) #Play the new audio format end end Graphics.frame_reset end def self.fade(time) Audio.bgm_fade(time) Audio.winamp_bgm_fade_init(time * (60.0/1000.0)) #line added @@last = RPG::BGM.new end def self.stop Audio.bgm_stop Audio.winamp_bgm_stop #line added @@last = RPG::BGM.new end #-------------------------------------------------------------------------- # ? Returns correct extension of file #-------------------------------------------------------------------------- def get_file_extension(bgm_name) file_name= G7_AFES_MOD::BGM_DIRECTORY + bgm_name extensions = G7_AFES_MOD::BGM_EXT + G7_AFES_MOD::PSF_EXT + G7_AFES_MOD::GSF_EXT + G7_AFES_MOD::USF_EXT + G7_AFES_MOD::CUBE_EXT + G7_AFES_MOD::SNES_EXT + G7_AFES_MOD::GEN_EXT + G7_AFES_MOD::MOD_EXT file_extension = "" #nil by default for extension in extensions if FileTest.exist?(file_name + extension) #if it found extension file_extension = extension # remember extension break end end return file_extension end #-------------------------------------------------------------------------- # ? Returns dll required to play file with winamp system #-------------------------------------------------------------------------- def get_dll(file_extension) if G7_AFES_MOD::PSF_EXT.include?(file_extension) dll = G7_AFES_MOD::PSF_DLL elsif G7_AFES_MOD::GSF_EXT.include?(file_extension) dll = G7_AFES_MOD::GSF_DLL elsif G7_AFES_MOD::USF_EXT.include?(file_extension) dll = G7_AFES_MOD::USF_DLL elsif G7_AFES_MOD::CUBE_EXT.include?(file_extension) dll = G7_AFES_MOD::CUBE_DLL elsif G7_AFES_MOD::MOD_EXT.include?(file_extension) dll = G7_AFES_MOD::MOD_DLL elsif G7_AFES_MOD::SNES_EXT.include?(file_extension) dll = G7_AFES_MOD::SNES_DLL elsif G7_AFES_MOD::GEN_EXT.include?(file_extension) dll = G7_AFES_MOD::GEN_DLL else dll = nil end return dll end end #end class class Scene_Base #-------------------------------------------------------------------------- # ? Update the sound level if fading #-------------------------------------------------------------------------- alias g7_afes_scene_base_update update def update g7_afes_scene_base_update #update normally if Audio.winamp_bgm_fading Audio.winamp_bgm_fade #lower volume for the frame end end end 复制代码
FAQ
I'll be adding questions here as you guys ask them.
Credit and Thanks
- Zhek (me, VX Ace rewrite)
- Mooshykris (Improvements over original version)
- Guillaume777 (Original Script)
Author's Notes
This script has been tested with RPG Maker VX Ace. It might work in VX too, but I haven't tried it yet. Let me know if you use it successfully there!
Dlls needed to make this work are available to download
here . I have already included in_psf.dll which is needed to play PSX (.psf, .minipsf) music files. If you want to play other files such as SNES', you need to download in_spc.dll and so on.
本贴来自国际rpgmaker官方论坛作者:Zhek处,因国际论坛即将永久关站,为了存档多年珍贵资料,署名转载到本论坛存档,由于官方帖子为英文原帖,需要中文翻译请点击论坛顶部切换语言为中文就可以将帖子翻译成中文浏览,方便大家随时查看,原文地址:
https://forums.rpgmakerweb.com/threads/extended-music-script-3-5.2235/