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