아래는 rmxp.net의 squall님이 작성한 psf(PS게임에서 덤프한 내장음원 사운드파일) 재생 스크립트입니다(WinAMP dll 사용 스크립트는 http://www.rpgfantasy.de 의 Andread21님이 작성):
#==============================================================================
# ■ Audio
#------------------------------------------------------------------------------
# Credits for Winamp class and Winamp.dll to Andreas21 (C) 2004
#
# Credits to Squall for Audio module and Game_system functions.
# squall@loeher.zzn.com
#
#==============================================================================
module Audio
#==========================================================================
# ■ Winamp
#==========================================================================
class Winamp
#------------------------------------------------------------------------
# ● initialize
#------------------------------------------------------------------------
def initialize
in_dll = 'DLLin_psf.dll'
out_dll = 'DLLout_wave.dll'
winamp_dll = 'DLLWinamp.dll'
@ReadIni = Win32API.new('kernel32', 'GetPrivateProfileStringA', %w(p p p p l p), 'l')
@FindWindow = Win32API.new('user32', 'FindWindowA', %w(p p), 'l')
@Init_Winamp = Win32API.new(winamp_dll, 'Init_Winamp', %w(p p l), 'l')
@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_IsPlaying = Win32API.new(winamp_dll, 'Winamp_IsPlaying', '', 'l')
@Winamp_GetFileInfo = Win32API.new(winamp_dll, 'Winamp_GetFileInfo', %w(p l), 'p')
@Winamp_SetVolume = Win32API.new(winamp_dll, 'Winamp_SetVolume', 'l', '')
@Winamp_IsPaused = Win32API.new(winamp_dll, 'Winamp_IsPaused', '', 'l')
@Init_Winamp.call(in_dll, out_dll, setup)
end
def play(file)
return @Winamp_Play.call(file)
end
def pause
@Winamp_Pause.call()
end
def stop
return @Winamp_Stop.call()
end
def is_playing?
return @Winamp_IsPlaying.call()
end
def get_file_info(playfile, length_adr)
return @Winamp_GetFileInfo.call(playfile, length_adr)
end
def set_volume(volume)
@Winamp_SetVolume.call(volume)
end
def is_paused?
return @Winamp_IsPaused.call()
end
def setup
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
#--------------------------------------------------------------------------
# ● define constant
#--------------------------------------------------------------------------
WINAMP = Winamp.new
#--------------------------------------------------------------------------
# ● Audio.psf_play(filename, [volume])
#--------------------------------------------------------------------------
def self.psf_play(filename, volume = 255)
for extension in ['.psf', '.minipsf', '.psf2', '.minipsf2']
if FileTest.exist?(filename + extension)
filename = filename + extension
break
end
end
WINAMP.play(filename)
WINAMP.set_volume(volume)
end
#--------------------------------------------------------------------------
# ● Audio.psf_playing?
#--------------------------------------------------------------------------
def self.psf_playing?
if WINAMP.is_playing? == 0
return false
else
return true
end
end
#--------------------------------------------------------------------------
# ● Audio.psf_pause
#--------------------------------------------------------------------------
def self.psf_pause
WINAMP.pause
end
#--------------------------------------------------------------------------
# ● Audio.psf_paused?
#--------------------------------------------------------------------------
def self.psf_paused?
if WINAMP.is_paused? == 0
return false
else
return true
end
end
#--------------------------------------------------------------------------
# ● Audio.psf_stop
#--------------------------------------------------------------------------
def self.psf_stop
WINAMP.stop
end
end
#==============================================================================
# ■ Game_System
#------------------------------------------------------------------------------
# Changes added to the bgm_play and bgm_stop functions.
#==============================================================================
class Game_System
#--------------------------------------------------------------------------
# ● Play Back Ground Music
#--------------------------------------------------------------------------
def bgm_play(bgm)
@playing_bgm = bgm
if bgm != nil and bgm.name != ""
Audio.bgm_play("Audio/BGM/" + bgm.name, bgm.volume, bgm.pitch)
Audio.psf_play("Audio/BGM/" + bgm.name, bgm.volume)
else
Audio.bgm_stop
Audio.psf_stop
end
Graphics.frame_reset
end
#--------------------------------------------------------------------------
# ● Stop playing BGM
#--------------------------------------------------------------------------
def bgm_stop
Audio.bgm_stop
Audio.psf_stop
end
end
**사용법:
프로젝트 디렉토리 아래에 dll 디렉토리를 만들고 첨부한 winamp.dll과 WinAMP용 psf재생 플러그인인 Highly Experimental(http://www.neillcorlett.com/he/ ), WinAMP 출력플러그인인 out_wave.dll(WinAMP있는 분은 WinAMP 플러그인 디렉토리에서 바로 복사하세요)을 넣어주고 원하는 psf/psf2/minipsf/minipsf2를 프로젝트 아래 AudioBGM에 복사해 넣습니다(RMXP에서는 이들 파일의 import를 지원하지 않습니다).
여기서 입력플러그인을 다른 것으로 지정하고 불러올 파일의 확장자를 바꾸면 다른 형식의 음악파일 재생도 가능합니다.
그리고 플러그인 관련 설정은 WinAMP에서 한 뒤에 플러그인 디렉토리에 있는 plugin.ini나 플러그인별 ini등에서 내용을 복사해 dll 디렉토리에 역시 plugin.ini란 파일명으로 넣어주면 됩니다.(무한재생을 위해서 필요)
**주의:
- RMXP에서 지원하지 않는 파일형식을 스크립트를 통해 지원하도록 한 것이기 때문에 툴에서 가져오거나 미리듣기를 할 수 없습니다.(게임 중에서는 재생됩니다)
- minipsf, minigsf 확장자의 파일은 psflib, gsflib확장자의 파일이 함께 있어야 정상적으로 재생됩니다.
- 해당음악파일의 피치 조정은 불가능합니다.
- 플러그인에 따라서는 플러그인뿐만 아니라 그 플러그인이 사용하는 별도의 dll도 필요합니다.(가령 SPC재생 플러그인은 SNESAPU.dll을 요구)
- 이 스크립트를 정상적으로 작동시키려면 손상되지 않은 RGSS100J.dll이 필요합니다. 1.02에서는 정상적으로 실행될 수도 있고 안될수도 있습니다.(스크립트가 꼬이거나 하지 않으면 됩니다)
- 게임중 이벤트에 의해 배경음악이 느려지거나 반복에 문제가 생길 수 있습니다(특히 병렬처리되는 이벤트가 있을 때)
- 콘솔게임에서 덤프한 사운드파일의 경우 재생을 위해 음원 에뮬레이션 과정이 추가되기 때문에(맞나?) 일반적으로 사용하는 wav나 mp3등보다 CPU점유율이 더 높아집니다.(즉, 배경음악이 미디나 mp3일때는 음악이 끊기지 않더라도 psf나 spc등을 사용할 때는 음악이 끊기는 일이 생길 수 있습니다)
**psf파일은
http://www.zophar.net/psf/
http://oddigy.com/
http://www.tzone.org/~llin/psf/
http://www.caitsith2.com/psf/
등에서 구할 수 있습니다. 그리고
http://www.vorc.org
를 체크하면 그 외 콘솔게임 사운드파일 업데이트 소식을 볼 수 있습니다.
#==============================================================================
# ■ Audio
#------------------------------------------------------------------------------
# Credits for Winamp class and Winamp.dll to Andreas21 (C) 2004
#
# Credits to Squall for Audio module and Game_system functions.
# squall@loeher.zzn.com
#
#==============================================================================
module Audio
#==========================================================================
# ■ Winamp
#==========================================================================
class Winamp
#------------------------------------------------------------------------
# ● initialize
#------------------------------------------------------------------------
def initialize
in_dll = 'DLLin_psf.dll'
out_dll = 'DLLout_wave.dll'
winamp_dll = 'DLLWinamp.dll'
@ReadIni = Win32API.new('kernel32', 'GetPrivateProfileStringA', %w(p p p p l p), 'l')
@FindWindow = Win32API.new('user32', 'FindWindowA', %w(p p), 'l')
@Init_Winamp = Win32API.new(winamp_dll, 'Init_Winamp', %w(p p l), 'l')
@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_IsPlaying = Win32API.new(winamp_dll, 'Winamp_IsPlaying', '', 'l')
@Winamp_GetFileInfo = Win32API.new(winamp_dll, 'Winamp_GetFileInfo', %w(p l), 'p')
@Winamp_SetVolume = Win32API.new(winamp_dll, 'Winamp_SetVolume', 'l', '')
@Winamp_IsPaused = Win32API.new(winamp_dll, 'Winamp_IsPaused', '', 'l')
@Init_Winamp.call(in_dll, out_dll, setup)
end
def play(file)
return @Winamp_Play.call(file)
end
def pause
@Winamp_Pause.call()
end
def stop
return @Winamp_Stop.call()
end
def is_playing?
return @Winamp_IsPlaying.call()
end
def get_file_info(playfile, length_adr)
return @Winamp_GetFileInfo.call(playfile, length_adr)
end
def set_volume(volume)
@Winamp_SetVolume.call(volume)
end
def is_paused?
return @Winamp_IsPaused.call()
end
def setup
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
#--------------------------------------------------------------------------
# ● define constant
#--------------------------------------------------------------------------
WINAMP = Winamp.new
#--------------------------------------------------------------------------
# ● Audio.psf_play(filename, [volume])
#--------------------------------------------------------------------------
def self.psf_play(filename, volume = 255)
for extension in ['.psf', '.minipsf', '.psf2', '.minipsf2']
if FileTest.exist?(filename + extension)
filename = filename + extension
break
end
end
WINAMP.play(filename)
WINAMP.set_volume(volume)
end
#--------------------------------------------------------------------------
# ● Audio.psf_playing?
#--------------------------------------------------------------------------
def self.psf_playing?
if WINAMP.is_playing? == 0
return false
else
return true
end
end
#--------------------------------------------------------------------------
# ● Audio.psf_pause
#--------------------------------------------------------------------------
def self.psf_pause
WINAMP.pause
end
#--------------------------------------------------------------------------
# ● Audio.psf_paused?
#--------------------------------------------------------------------------
def self.psf_paused?
if WINAMP.is_paused? == 0
return false
else
return true
end
end
#--------------------------------------------------------------------------
# ● Audio.psf_stop
#--------------------------------------------------------------------------
def self.psf_stop
WINAMP.stop
end
end
#==============================================================================
# ■ Game_System
#------------------------------------------------------------------------------
# Changes added to the bgm_play and bgm_stop functions.
#==============================================================================
class Game_System
#--------------------------------------------------------------------------
# ● Play Back Ground Music
#--------------------------------------------------------------------------
def bgm_play(bgm)
@playing_bgm = bgm
if bgm != nil and bgm.name != ""
Audio.bgm_play("Audio/BGM/" + bgm.name, bgm.volume, bgm.pitch)
Audio.psf_play("Audio/BGM/" + bgm.name, bgm.volume)
else
Audio.bgm_stop
Audio.psf_stop
end
Graphics.frame_reset
end
#--------------------------------------------------------------------------
# ● Stop playing BGM
#--------------------------------------------------------------------------
def bgm_stop
Audio.bgm_stop
Audio.psf_stop
end
end
**사용법:
프로젝트 디렉토리 아래에 dll 디렉토리를 만들고 첨부한 winamp.dll과 WinAMP용 psf재생 플러그인인 Highly Experimental(http://www.neillcorlett.com/he/ ), WinAMP 출력플러그인인 out_wave.dll(WinAMP있는 분은 WinAMP 플러그인 디렉토리에서 바로 복사하세요)을 넣어주고 원하는 psf/psf2/minipsf/minipsf2를 프로젝트 아래 AudioBGM에 복사해 넣습니다(RMXP에서는 이들 파일의 import를 지원하지 않습니다).
여기서 입력플러그인을 다른 것으로 지정하고 불러올 파일의 확장자를 바꾸면 다른 형식의 음악파일 재생도 가능합니다.
그리고 플러그인 관련 설정은 WinAMP에서 한 뒤에 플러그인 디렉토리에 있는 plugin.ini나 플러그인별 ini등에서 내용을 복사해 dll 디렉토리에 역시 plugin.ini란 파일명으로 넣어주면 됩니다.(무한재생을 위해서 필요)
**주의:
- RMXP에서 지원하지 않는 파일형식을 스크립트를 통해 지원하도록 한 것이기 때문에 툴에서 가져오거나 미리듣기를 할 수 없습니다.(게임 중에서는 재생됩니다)
- minipsf, minigsf 확장자의 파일은 psflib, gsflib확장자의 파일이 함께 있어야 정상적으로 재생됩니다.
- 해당음악파일의 피치 조정은 불가능합니다.
- 플러그인에 따라서는 플러그인뿐만 아니라 그 플러그인이 사용하는 별도의 dll도 필요합니다.(가령 SPC재생 플러그인은 SNESAPU.dll을 요구)
- 이 스크립트를 정상적으로 작동시키려면 손상되지 않은 RGSS100J.dll이 필요합니다. 1.02에서는 정상적으로 실행될 수도 있고 안될수도 있습니다.(스크립트가 꼬이거나 하지 않으면 됩니다)
- 게임중 이벤트에 의해 배경음악이 느려지거나 반복에 문제가 생길 수 있습니다(특히 병렬처리되는 이벤트가 있을 때)
- 콘솔게임에서 덤프한 사운드파일의 경우 재생을 위해 음원 에뮬레이션 과정이 추가되기 때문에(맞나?) 일반적으로 사용하는 wav나 mp3등보다 CPU점유율이 더 높아집니다.(즉, 배경음악이 미디나 mp3일때는 음악이 끊기지 않더라도 psf나 spc등을 사용할 때는 음악이 끊기는 일이 생길 수 있습니다)
**psf파일은
http://www.zophar.net/psf/
http://oddigy.com/
http://www.tzone.org/~llin/psf/
http://www.caitsith2.com/psf/
등에서 구할 수 있습니다. 그리고
http://www.vorc.org
를 체크하면 그 외 콘솔게임 사운드파일 업데이트 소식을 볼 수 있습니다.