XP 스크립트

아래는 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
를 체크하면 그 외 콘솔게임 사운드파일 업데이트 소식을 볼 수 있습니다.

Who's 백호

?

이상혁입니다.

http://elab.kr

Atachment
첨부 '1'

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
공지 스크립트 자료 게시물 작성시 주의사항 습작 2012.12.24 6159
1021 키입력 한글입력스크립트 16 file 아방스 2007.11.09 11824
1020 온라인 채팅 가능 온라인 스크립트 배포 107 file 아방스 2009.01.03 10680
1019 온라인 RPG 만들기 xp 온라인 스크립트 33 아방스 2007.11.09 9593
1018 맵/타일 [유니크급] RPG XP 게임을 3D화로 보자! Neo Mode7 script / 52 file 쉴더 2009.02.28 9443
1017 온라인 온라인 스크립트 Unis Net RMXP 공식 배포! 25 file 뮤바보 2011.12.25 9400
1016 온라인 광넷[ 광땡 온라인 + 넷플레이 ] 62 - 하늘 - 2009.08.02 9003
1015 전투 [액알]neo_a-rpg_module_1[1][1].2 스크립트 83 file 은빛바람 2009.10.03 8299
1014 이름입력 대화창에 얼굴, 이름 띄우기 37 킬라롯 2008.11.09 7497
1013 온라인 넷플레이1.7.0+abs5.5+한챗 49 쀍뛝쒧 2009.01.24 7286
1012 메뉴 메이플스토리처럼 메뉴를^^ 57 file 딸기님 2010.07.13 7142
1011 메시지 대화창에 얼굴 그래픽 띠우기 73 아방스 2007.11.09 7119
1010 스킬 ABP액알 v1.2 스킬추가, 버그수정판 36 file 백호 2009.02.22 6920
1009 전투 [신기술 체험] 강회된 횡스크롤 액알 13 file 백호 2009.02.22 6841
1008 메뉴 온라인메뉴처럼!! 메이플 메뉴처럼!! 변신~스크립트 33 WMN 2008.03.17 6819
1007 그래픽 화면을 부드럽게 해주는스크립트[ 아주 유용] 56 file - 하늘 - 2009.08.05 6561
1006 온라인 Mr.Metring NPE 1.0 [RPG XP 온라인 스크립트] 35 아방스 2009.01.07 6535
1005 이름입력 케릭터 위에 또는 NPC 위에 이름 뛰우기 [헬악이님 제공] 49 file 아방스 2007.11.09 6408
1004 액터 시트르산의 XP용 감정 말풍선 표시 스크립트 37 file 시트르산 2011.01.25 6110
1003 HUD 주인공,NPC이름 머리 나타내기 49 file 송긔 2010.11.28 6062
1002 전투 액알 스크립트 24 백호 2009.02.22 6014
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ... 52 Next
/ 52