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
[ ツッコむ ]
以上、1 日分です。