O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

Extended Music Script 3.5 Toque sons nativos do PSX, PS2, SNES e etc!

Iniciado por K.A.O.S, 13/10/2013 às 21:56

Extended Music Script 3.5

Compativel com: RMVXA
Compatibilidade: boa
Facilidade de uso: fácil~médio
Lag gerado: desprezível

[box class=titlebg]
Funções:
[/box]
Este script permite que você toque musicas em formatos como PSF(Playstation), SPC(Supernintendo), MOD, IT e etc, como se fossem mp3 ou oggs.


  • O script permite que você toque formatos incomuns (.psf, .gym, .spc, it, mod, etc.) caso exista uma dll do winamp disponível.
  • O script funciona com diversos formatos/dlls e não requer que o usuário utilize a função 'chamar script' ( apenas coloque o formato para trocar, como se fosse uma BGM comum)
  • O script não lhe retornará erro a menos que exista uma música que precise de uma DLL que não se encontra na pasta.

Como usar:
1) Tenha certeza que o Winamp.dll, out_wave.dll e as dlls da música estão na pasta chamada 'DLL', dentro da pasta de seu projeto.
Ex. Se você for usar in_bass.dll, você precisará do bass.dll na pasta do seu jogo

2) Copie os arquivos de música para a pasta BGM(Você não pode importar eles pelo RMVXA)
Estes arquivos geralmente vem com uma biblioteca de sons, portanto será necessário copiar esta biblioteca junto com a música pra pasta BGM. Por exemplo, arquivos .minipsf utilizam bibliotecas .psflib, você precisará que ambas estejam dentro da pasta BGM!

3) Simplesmente coloque a música pra tocar, como se fosse uma BGM qualquer
A música não irá tocar no editor, apenas dentro do jogo!

Caso você precise que a música tenha um loop, você precisará do winamp pra abrir as configurações da música e editar os parametros. Você poderá alterar o volume, efeitos de fade in/out, duração e adicionar loop points. Feito isso, copie os arquivos de configuração dentro da pasta DLL.

[box class=titlebg]
Imagens
[/box]
Não é possível observar seu funcionamento por imagens.

[box class=titlebg]
Download e Script
[/box]

As DLLs necessárias p/ o funcionamento do script estão disponíveis pra download aqui. Já esta incluso o arquivo in_psf.dll que é responsável por tocar músicas de jogos do playstation(.psf, .minipsf). Se você quiser tocar músicas de outros consoles como SNES, você precisará baixar o arquivo in_spc.dll e assim por diante.

Download dos arquivos in_xxx.dll: Clique aqui
Download de músicas dos consoles no formato nativo: Clique aqui

Lembrando que p/ tocar formatos não configurados, você terá que fazer alterações no script de forma que permita que o mesmo identifique o novo formato. Isso pode ser facilmente feito observando como o script funciona.

#==============================================================================
# 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


[box class=titlebg]
Créditos e Avisos
[/box]
- Zhek(Adaptação do script p/ VXAce)
- Mooshykris (Melhorias da versão original)
- Guillaume777 (Desenvolvedor original do script)
Clique nas imagens p/ visualizar as aulas



Primeira coisa que pensei quando vi o título:


É um bom add-on para o RPG Maker, mas essas músicas ficam pesadas? Porque esse é um fator importante a ser considerado na hora de fazer um jogo.

De qualquer forma, valeu por postar o script!  :ok:

Viva a lenda!



 Quer saber a melhor parte? As músicas em si não passam de 2 kbs. E uma biblioteca com os sons geralmente fica em torno dos 10~15 mb. Isso significa que você pode ter + de 30 faixas de música e a pasta pesará no máximo 15 mb.  :wow:

Eu mesmo fiz o teste aqui... 5 bibliotecas do PSX e + de 120 músicas. Pasta pesando 42mb
Clique nas imagens p/ visualizar as aulas



Citação de: K.A.O.S online 13/10/2013 às 22:04
Quer saber a melhor parte? As músicas em si não passam de 2 kbs. E uma biblioteca com os sons geralmente fica em torno dos 10~15 mb. Isso significa que você pode ter + de 30 faixas de música e a pasta pesará no máximo 15 mb.  :wow:

Aí eu me acabo! Agora o script se mostra muito útil mesmo! Obrigado por postar!

Viva a lenda!



@K.A.O.S: Script fascinante,tem algum programa pra converter MP3 para esses formatos? + 1 Ouro!

@VincentVII: Eu ri kkk, ainda tenho meu PS1 e SNES, mas acho muito melhor jogar no emulador.

 Esses formatos são como se fossem midis sem os instrumentos... Apenas a sequencia. As libs carregam todos os sons necessário pro arquivo tocar então acho meio difícil você conseguir converter uma mp3 pra este formato... O que tu pode fazer é tentar refazer esta MP3 de forma que ela use estes sons da lib, mas ai eu não posso te ajudar... Sou leigo no assunto! xD

Uma curiosidade, neste mesmo site que mandei você pode baixar várias soundfont de diversos consoles... Sendo possível criar chiptunes facilmente das suas midis.

Se não souber o que é 'chiptune', ai vai um exemplo próximo:

Clique nas imagens p/ visualizar as aulas