2014/12/22(月) [n年前の日記]
#1 [dxruby] DXRubyとAyameとループBGMとイントロ
昔の2DゲームのBGMは、えてしてイントロとループ部分があったりするのだけど。DXRuby + Ayame では、ループ開始位置の指定ができないので、イントロ+ループの構成のBGMを流すことができなくて。
ふと、イントロの再生が終わった途端にループBGMの再生を開始したらそれっぽく聞こえないものかなーと気になってきたので試してみたり。
結論から言うとビミョー。音の隙間がドーンと入る時とそれほど入らない時があって。気になる時もあるし、気にならない時もあるし。とにかく不安定。メインループで ―― 1/60秒毎にチェックしてるせいだろうけど…。16.667ms って結構大きいな…。
ちなみに、Ayame には、Ayame#playing? (再生中かチェック)、Ayame#finished? (再生終了をチェック)、があるのだけど、それらを使うと隙間がドコーンと入ってしまって。おそらく、再生中 or 終了中のチェックは即座にできるわけじゃなくて、時間がかかってしまう模様。
テストに使ったソースは以下。Ruby 1.9.3 + DXRuby 1.4.1 + ayameruby003-mswin32-ruby19 で動作確認。
_bgmloop.rb
ogg と wav 等も入れたzipを置いときます。bgmloop.rb を実行して zキーを押せば、イントロ→ループBGMと流れるはず。ループBGM再生中に zキーを押せば、また最初からやり直し。
_bgmloop_20141222.zip
ふと、イントロの再生が終わった途端にループBGMの再生を開始したらそれっぽく聞こえないものかなーと気になってきたので試してみたり。
結論から言うとビミョー。音の隙間がドーンと入る時とそれほど入らない時があって。気になる時もあるし、気にならない時もあるし。とにかく不安定。メインループで ―― 1/60秒毎にチェックしてるせいだろうけど…。16.667ms って結構大きいな…。
ちなみに、Ayame には、Ayame#playing? (再生中かチェック)、Ayame#finished? (再生終了をチェック)、があるのだけど、それらを使うと隙間がドコーンと入ってしまって。おそらく、再生中 or 終了中のチェックは即座にできるわけじゃなくて、時間がかかってしまう模様。
テストに使ったソースは以下。Ruby 1.9.3 + DXRuby 1.4.1 + ayameruby003-mswin32-ruby19 で動作確認。
_bgmloop.rb
require 'dxruby' require_relative 'ayame' bgm_intro = Ayame.new('test58intro.ogg') bgm_loop = Ayame.new('test58loop.ogg') # bgm_intro = Ayame.new('test58intro.wav') # bgm_loop = Ayame.new('test58loop.wav') bgm_intro_time = 6.888 bgm_intro.predecode bgm_loop.predecode fnt = Font.new(14) bgm_step = 0 intro_time = 0 Window.loop do break if Input.keyPush?(K_ESCAPE) if bgm_step == 1 # イントロ再生中 ntm = Time.now.to_i + (Time.now.usec / 1000000.0) if ntm - intro_time > bgm_intro_time # イントロの曲の長さを超えた puts "loop start : #{ntm}" # loop BGM 再生開始 bgm_step = 2 bgm_loop.play(0, 0) end end if Input.keyPush?(K_Z) if bgm_step == 0 # BGMを再生していないので、イントロ再生開始 bgm_step = 1 bgm_intro.play(1, 0) # 再生時の時間を記録 ntm = Time.now.to_i + (Time.now.usec / 1000000.0) intro_time = ntm puts "intro start : #{intro_time}" elsif bgm_step == 2 # loop BGM 再生中なので停止する bgm_step = 0 bgm_loop.stop end end msg = [ "z : start intro", " intro playing", "z : stop loop bgm" ] Window.drawFont(8, 8, msg[bgm_step], fnt) Ayame.update end bgm_intro.dispose bgm_loop.dispose
ogg と wav 等も入れたzipを置いときます。bgmloop.rb を実行して zキーを押せば、イントロ→ループBGMと流れるはず。ループBGM再生中に zキーを押せば、また最初からやり直し。
_bgmloop_20141222.zip
[ ツッコむ ]
以上です。