HOME
ツクール
RGSS
テクニック
ゲーム紹介
制作中のゲーム
ダウンロード
掲示板
ブログ
EnDREss DREamERブログ
PCパーツ・ソフト通販(仮)
DIYチューンブログ
リンク
Win32API_SoundでBGS再生
コンセプト
既存のBGSの他にBGSを再生したい。
挿入位置
「▼ 素材」のすぐ下辺りに。
完成すると
waveファイルにてループ再生されます。
仕様:WAVEファイルのみ再生可能。音量・ピッチ変更不可。現在BGSのみ。
更新履歴
2/7:ファイルパス周り修正。 ========== 2013年 ============================================================ 6/4:戦闘終了時にBGSが停止してしまう現象を修正。 ========== 2010年 ============================================================ 10/22:暗号化併用で再生されないバグを修正。 9/23:暗号化併用でエラーを出すのを修正。 9/7:「Audio・Fontsファイル暗号化」に対応。 3/18:ExMap_AutoWeather改でマップ移動時にボリュームが大きくなるのを修正。
「
ダニエル・J・ベルガー
」氏の素材を使用しております。
#============================================================================== # ☆VX RGSS2 「Win32API_SoundでBGS再生」☆ # EnDlEss DREamER # URL:http://mitsu-evo.6.ql.bz/ # 製作者 mitsu-evo # Last:2013/2/7 # BGSフォルダ内の「WAVEファイル」をループ再生するスクリプト。 # この素材は「ダニエル・J・ベルガー」氏の素材を使用しております。 # URL:http://rubyforge.org/projects/win32utils/ # ▼ 素材より下に。 #============================================================================== $ed_rgss2 = {} if $ed_rgss2 == nil $ed_rgss2["ed_api_bgs"] = true =begin 2/7:ファイルパス周り修正。 DXライブラリで音再生のモジュールをGame_BGSにインクルードしている。 RubyでWin32APIを利用するにはWin32API拡張ライブラリを呼び出す。 Win32APIの内、利用するライブラリ(dllなど?)ごとにオブジェクトを生成する。 newメソッドでオブジェクトを生成するときは、「ライブラリ,関数,引数の型,戻り値の型」を指定する。 実行時は、newメソッドで作成したオブジェクトに合う引数を渡し、指定した型の戻り値を取得する。 使用方法 「イベントコマンド」のスクリプト内に 「ed_bgs_play("ファイル名(日本語不可)")」 と入れると指定のWAVEファイルをループで再生します。 RTPのOGG形式には対応しません。 「ed_bgs_stop」で停止します。 RGSS記述については $game_se_bgs.play_bgs("ファイル名") $game_se_bgs.stop でスクリプト内にて使用して下さい。 Game_SE_bgsクラスのInitializeメソッドのパスを変更すれば XPでも使えるかも知れません。 VX対応で、XPでは動作確認してません。 修正内容 ・ExMap_AutoWeather改でマップ移動時にボリュームが大きくなるのを修正。3/18 ・「Audio・Fontsファイル暗号化」に対応。9/7 ・暗号化併用でエラーを出すのを修正。9/23 ・暗号化併用で再生されないバグを修正。10/22 =end #require 'Win32API' module Win32 class SoundError < StandardError; end class Sound VERSION = '0.4.0' LOW_FREQUENCY = 37 # ビープ設定 HIGH_FREQUENCY = 32767 MAX_VOLUME = 0xFFFF # 最大音量 SYNC = 0x0000 # 同期(デフォルト)を再生 ASYNC = 0x0001 # 非同期再生 NODEFAULT = 0x0002 # 沈黙( !デフォルト)の場合、音が見つかりません MEMORY = 0x0004 # ファイルをメモリにpszSoundポイント LOOP = 0x0008 # 次のsndPlaySoundまでループサウンド NOSTOP = 0x0010 # 任意の現在のサウンドの再生を停止しないと NOWAIT = 8192 # 待っていない場合は、ドライバがビジー状態です ALIAS = 65536 # 名前は、レジストリの別名です ALIAS_ID = 1114112 # エイリアスを定義済みのIDです FILENAME = 131072 # 名前のファイルです RESOURCE = 262148 # 名リソースの名前や原子である PURGE = 0x0040 # パージ以外のタスクの静的イベント APPLICATION = 0x0080 # アプリケーションの特定の組合見える @@Beep = Win32API.new('kernel32', 'Beep', 'LL', 'I') @@PlaySound = Win32API.new('winmm', 'PlaySound', 'PPL', 'I') @@waveOutSetVolume = Win32API.new('winmm', 'waveOutSetVolume', 'PL', 'I') @@waveOutGetVolume = Win32API.new('winmm', 'waveOutGetVolume', 'IP', 'I') @@waveOutGetNumDevs = Win32API.new('winmm', 'waveOutGetNumDevs', 'V', 'I') @@waveInGetNumDevs = Win32API.new('winmm', 'waveInGetNumDevs', 'V', 'I') @@midiOutGetNumDevs = Win32API.new('winmm', 'midiOutGetNumDevs', 'V', 'I') @@midiInGetNumDevs = Win32API.new('winmm', 'midiInGetNumDevs', 'V', 'I') @@auxGetNumDevs = Win32API.new('winmm', 'auxGetNumDevs', 'V', 'I') @@mixerGetNumDevs = Win32API.new('winmm', 'mixerGetNumDevs', 'V', 'I') @@GetLastError = Win32API.new('kernel32', 'GetLastError', '', 'L') @@FormatMessage = Win32API.new('kernel32', 'FormatMessage', 'LPLLPLP', 'L') #-------------------------------------------------------------------------- #戻り値のすべての利用可能なサウンドデバイスの配列を、彼らの名前が含ま #は、デバイスとゼロ- ID番号のタイプをベースに。可能な戻り値 #WAVEOUT 、 WAVEIN 、 MIDIOUT 、 MIDIIN 、補助やミキサーされています。 #-------------------------------------------------------------------------- def self.devices devs = [] begin 0.upto(@@waveOutGetNumDevs.call){ |i| devs << "WAVEOUT#{i}" } 0.upto(@@waveInGetNumDevs.call){ |i| devs << "WAVEIN#{i}" } 0.upto(@@midiOutGetNumDevs.call){ |i| devs << "MIDIOUT#{i}" } 0.upto(@@midiInGetNumDevs.call){ |i| devs << "MIDIIN#{i}" } 0.upto(@@auxGetNumDevs.call){ |i| devs << "AUX#{i}" } 0.upto(@@mixerGetNumDevs.call){ |i| devs << "MIXER#{i}" } rescue Exception => err raise SoundError, get_last_error end devs end #-------------------------------------------------------------------------- # スピーカーには、単純なトーンを生成します。この関数は、同期のもので、 # その呼び出し元には、サウンドが終了するまで制御を返しません。 # # ヘルツの周波数( )で37と32767の間である必要があります。 # 時間をミリ秒単位でされています。 #-------------------------------------------------------------------------- def self.beep(frequency, duration) if frequency > HIGH_FREQUENCY || frequency < LOW_FREQUENCY raise SoundError, 'invalid frequency' end if 0 == @@Beep.call(frequency, duration) raise SoundError, get_last_error end self end #-------------------------------------------------------------------------- # 任意波形は現在サウンドが再生を停止します。 # パージの場合+ +をtrueにして* *音を停止されているすべての設定されている。 # デフォルトはfalseです。 #-------------------------------------------------------------------------- def self.stop(purge = false) if purge && purge != 0 flags = PURGE else flags = 0 end if 0 == @@PlaySound.call(0, 0, flags) raise SoundError, get_last_error end self end #-------------------------------------------------------------------------- # 指定されたサウンドを再生します。 # 波の音はサウンドファイルやシステムに、 # エイリアスフラグと組み合わせて使用することができます。 #-------------------------------------------------------------------------- =begin # Valid flags: # # Sound::ALIAS パラメータは、システムのサウンドには、レジストリまたはWIN.INIファイルでの イベントのエイリアスです。 そのような場合には、レジストリの名前が含まれ、それはシステムのデフォルトの サウンドNODEFAULT値にも指定されている場合を除き、 演じています。ファイル名で使用しないでください。 # # Sound::APPLICATION サウンドは、アプリケーション固有の関連付けを使って再生されます。 # # Sound::ASYNC 非同期の音は、関数が返すと、すぐに音を開始後に再生されます。 # # Sound::FILENAME サウンドパラメータは、 WAVファイルの名前です。エイリアスを使用しないでください。 # # Sound::LOOP 音を繰り返しSound.stopまで( )と呼ばれている。する必要があります また、ループサウンドを非同期フラグを指定してください。 # # Sound::MEMORY # メモリ内の波形の音をイメージする音をポイントします。 # # Sound::NODEFAULT # 音の場合、この関数を返すことなく暗黙のうちに発見することはできません デフォルトのサウンドを再生します。 # # Sound::NOSTOP 健全な場合は、現在、この関数はすぐに返す再生しているサウンドの再生には、 要求さfalseです。 # # Sound::NOWAIT 場合は、ドライバは、ビジー状態である、すぐにサウンドが再生せずに戻ります。 # # Sound::PURGE # 中止し、指定された音のすべてのインスタンスを再生します。 # # Sound::SYNC # 音は同期して機能を返しません演奏される音が終わるまで。 =end def self.play(sound, flags = 0) if 0 == @@PlaySound.call(sound, 0, flags) raise SoundError, get_last_error end self end #-------------------------------------------------------------------------- # 左と右チャネルの音量を設定します。 # right_channel場合は、ボリューム・チャネルの両方で設定されている省略されています。 # オプションは、配列の場合、両方のチャネルを同じ値に設定している # 想定されるよりも、 1つの整数を渡すことがあります。 #-------------------------------------------------------------------------- def self.set_wave_volume(left_channel, right_channel = nil) right_channel ||= left_channel lvolume = left_channel > MAX_VOLUME ? MAX_VOLUME : left_channel rvolume = right_channel > MAX_VOLUME ? MAX_VOLUME : right_channel volume = lvolume | rvolume << 16 if @@waveOutSetVolume.call(-1, volume) != 0 raise SoundError, get_last_error end self end #-------------------------------------------------------------------------- # 戻り値は、左チャネルと右チャネルは、それぞれのボリュームを含む2要素の配列です。 #-------------------------------------------------------------------------- def self.wave_volume volume = [0].pack('L') if @@waveOutGetVolume.call(-1, volume) != 0 raise SoundError, get_last_error end volume = volume.unpack('L').first [low_word(volume), high_word(volume)] end #-------------------------------------------------------------------------- # waveのボリュームを取得 #-------------------------------------------------------------------------- def self.get_wave_volume self.wave_volume end private def self.low_word(num) num & 0xFFFF end def self.high_word(num) num >> 16 end #-------------------------------------------------------------------------- # デフォルトでは、一部の良識の便利なメソッドFormatMessageラップ。 #-------------------------------------------------------------------------- def self.get_last_error(err_num = @@GetLastError.call) buf = 0.chr * 260 @@FormatMessage.call( 12288, 0, err_num, 0, buf, buf.length, 0 ) buf.split(0.chr).first.chomp end end end module ED #============================================================================== # ■ Command #------------------------------------------------------------------------------ # イベントコマンド「スクリプト」で呼び出されるコマンドです。 #============================================================================== module Command module_function #-------------------------------------------------------------------------- # ● 独自のBGS再生 #-------------------------------------------------------------------------- def ed_bgs_play(file_name,volume=100) $game_se_bgs.play_bgs(file_name,volume) end #-------------------------------------------------------------------------- # ● BGS停止 #-------------------------------------------------------------------------- def ed_bgs_stop(bg=true) $game_se_bgs.stop(bg) end end end module RPG class Map alias ed_api_sound_initialize initialize def initialize(width, height) ed_api_sound_initialize @ed_api_bgs = $game_se_bgs.play_bgs("") end attr_accessor :ed_api_bgs end end #============================================================================== # ■ Game_Temp #------------------------------------------------------------------------------ # セーブデータに含まれない、一時的なデータを扱うクラスです。このクラスのイン # スタンスは $game_temp で参照されます。 #============================================================================== class Game_Temp #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :ed_api_bgs # APIによるBGS (バトル時記憶用) #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias ed_api_sound_initialize initialize def initialize ed_api_sound_initialize @ed_api_bgs = nil end end #============================================================================== # ■ Game_SE_bgs #------------------------------------------------------------------------------ # SEでBGSを行うクラスです。 # SE再生でのループ再生に対応しています。 #============================================================================== class Game_SE_bgs include ED::DX_Wave_Sound if $ed_rgss2["ed_dx_sound_module"] attr_accessor :play_enable # 再生フラグ #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize @play_enable = false @sound = Win32::Sound # Win32APIのサウンドモジュール #@path = Dir.pwd # カレントディレクトリ取得 @bgm = "Audio/BGM/" # 各種音声ファイルの位置 @bgs = "Audio/BGS/" @me = "Audio/ME/" @se = "Audio/SE/" @@last = "" end #-------------------------------------------------------------------------- # ● BGSの演奏 file_name : 再生ファイル名 volume : ボリューム(純正と同じく設定可) #-------------------------------------------------------------------------- def play_bgs(file_name,volume=100) # ループ再生の仕組みは「@sound::ASYNC + @sound::LOOP」の計が9だから。 # @sound::APPLICATIONが128 self.stop if file_name != "" if $ed_rgss2["ed_ex_encryption"] == true @crypt_name = file_name begin current = Audio.crrent_pass(1) Audio.crypt(current,false,file_name) rescue end end @sound.play(@bgs + file_name, 128+9) self.bgs_volume(volume) @@last = file_name else self.stop end end #-------------------------------------------------------------------------- # ● 音声の停止(me_bgm = false) MEかBGMならtrue。SEかBGSならfalse #-------------------------------------------------------------------------- def stop(me_bgm = false) if $ed_rgss2["ed_ex_encryption"] == true current = Audio.crrent_pass(1) unless @crypt_name != nil or @crypt_name != "" Audio.crypt(current,true,@crypt_name) unless @crypt_name != nil or @crypt_name != "" end @sound.stop(me_bgm) if $ed_rgss2["ed_auto_weather"] == true $game_map.play_weather_bgs = false if $game_map != nil #@@last = "" @save_volume = nil end end #-------------------------------------------------------------------------- # ● ボリュームの設定 #-------------------------------------------------------------------------- def bgs_volume(volume = 100) @volume = @sound.get_wave_volume @save_volume = volume if @save_volume == nil if @save_volume == volume @sound.set_wave_volume(@volume[0],@volume[1]) return end for i in 0..1 @volume[i] = (@volume[i] * volume) / 100 end @sound.set_wave_volume(@volume[0],@volume[1]) @save_volume = volume end #-------------------------------------------------------------------------- # ● 最後に演奏した音声の再生 #-------------------------------------------------------------------------- def last play_bgs(@@last) unless @@last == nil or @@last == "" end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update end end #============================================================================== # ■ Game_Interpreter #------------------------------------------------------------------------------ # イベントコマンドを実行するインタプリタです。このクラスは Game_Map クラス、 # Game_Troop クラス、Game_Event クラスの内部で使用されます。 #============================================================================== class Game_Interpreter # イベントコマンド「スクリプト」にモジュール「Command」のメソッドを反映。 include ED::Command end #============================================================================== # ■ BGSクラスの強制作成 #============================================================================== $game_se_bgs = Game_SE_bgs.new if $game_se_bgs == nil #============================================================================== # ■ Scene_Map #------------------------------------------------------------------------------ # マップ画面の処理を行うクラスです。 #============================================================================== class Scene_Map < Scene_Base #-------------------------------------------------------------------------- # ● バトル画面への切り替え #-------------------------------------------------------------------------- alias ed_api_sound_call_battle call_battle def call_battle $game_temp.ed_api_bgs = $game_se_bgs.last $game_se_bgs.stop ed_api_sound_call_battle end end #============================================================================== # ■ Scene_Battle #------------------------------------------------------------------------------ # バトル画面の処理を行うクラスです。 #============================================================================== class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # ● 戦闘終了 # result : 結果 (0:勝利 1:逃走 2:敗北) #-------------------------------------------------------------------------- alias ed_api_sound_battle_end battle_end def battle_end(result) $game_se_bgs.play_bgs($game_temp.ed_api_bgs) unless $game_temp.ed_api_bgs == nil #$game_se_bgs.play_bgs($game_temp.ed_api_bgs) unless $BTEST ed_api_sound_battle_end(result) end end #============================================================================== # ■ Scene_Gameover #------------------------------------------------------------------------------ # ゲームオーバー画面の処理を行うクラスです。 #============================================================================== class Scene_Gameover < Scene_Base #-------------------------------------------------------------------------- # ● 開始処理 #-------------------------------------------------------------------------- alias ed_api_sound_start start def start $game_se_bgs.stop ed_api_sound_start end end
Copyright (C)
永遠の夢に向かって
. All Rights Reserved.
テンプレートのpondt
リサーチ