2021/08/13(金) [n年前の日記]
#1 [dxruby] DXRubyでoggを再生したいのだけど問題が
DXRubyでoggを再生したいのだけど問題が…。
◎ 少し解説。 :
DXRubyは、Windows上でRubyというプログラミング言語を使って2Dゲームを作れるライブラリ。DirectX9を利用しているので画面描画が高速で、更に他のゲーム制作ライブラリに比べると記述がシンプルで覚えやすいのが売り。
_Project DXRuby
ただ、DXRuby のサウンド関係はちょっと貧弱で、wav か MIDI しか鳴らせない。せめて ogg ぐらいは鳴らしたい…。
一応、他のライブラリを組み合わせることで、DXRuby で作ったゲームでも ogg を鳴らすことができる。
_ DXRubyのドキュメント で推奨されていたサウンド関係のライブラリは、以下の3つ。
という話を踏まえた上で。
先日 Ruby 2.6.8、2.7.4、3.0.2 をインストールしたついでに、DXRuby で ogg を鳴らせるか動作確認しようとしたところで問題が発生してしまった。
_Project DXRuby
ただ、DXRuby のサウンド関係はちょっと貧弱で、wav か MIDI しか鳴らせない。せめて ogg ぐらいは鳴らしたい…。
一応、他のライブラリを組み合わせることで、DXRuby で作ったゲームでも ogg を鳴らすことができる。
_ DXRubyのドキュメント で推奨されていたサウンド関係のライブラリは、以下の3つ。
- Ayame/Ruby : Ayame.dll + ayame.so で構成。Ayame.dll はフリーで使える。
- voxrb (vox.rb) : Vox.dll + Vox.rb で構成。Vox.dll はフリーで使えるが機能が少ない。
- bassrb (bass.rb) : bass.dll + Bass.rb で構成。bass.dll は機能豊富だが、商用利用はライセンス料がかかる。非商用で利用するなら料金はかからない。
という話を踏まえた上で。
先日 Ruby 2.6.8、2.7.4、3.0.2 をインストールしたついでに、DXRuby で ogg を鳴らせるか動作確認しようとしたところで問題が発生してしまった。
◎ Ayame/Rubyの問題。 :
Ayame/Ruby は以下から入手できる。
_Home - mirichi/dxruby-doc Wiki
しかし、Ruby 2.1、2.2、2.3 用のバイナリ(ayame.so)しかないので、今時の Ruby、3.0.x、2.7.x、2.6.x では動かないっぽい…。
_Home - mirichi/dxruby-doc Wiki
しかし、Ruby 2.1、2.2、2.3 用のバイナリ(ayame.so)しかないので、今時の Ruby、3.0.x、2.7.x、2.6.x では動かないっぽい…。
◎ voxrb、bassrbの問題。 :
voxrb、bassrb にも、問題点が2つあって。
voxrb、bassrb は、前述のドキュメントによると、以下から入手できると書いてあるのだけど。
このWikiページ、今現在は消滅している。つまり、voxrb も bassrb も、今では簡単には入手できない。これが一つ目の問題点。
ただ、一応、WebArchive で以前のページを見ることができた。
_DXRuby プロジェクトWiki - ファイル置き場 (WebArchive)
そこから辿って、今現在もファイル群が残っているディレクトリに到達できた。
_http://dxruby.osdn.jp/files/
voxrb.zip (2009/05/15), bassrb.zip (2009/06/14) が、目的のファイル。ということで、頑張ればなんとか入手できなくもない…。
これで ogg を鳴らせるかなと思いきや、さにあらず。
昔の Ruby (1.8, 1.9, 2.0) は .dll を利用する際に win32api というモジュールを利用することになっていて、voxrb も bassrb もソレを利用していて…。DXRubyの作者様のblogで、そのあたりの変化が分かりやすく解説されているけれど。
_DLとWin32APIとFiddle - mirichiの日記
この win32api、今時の Ruby では使用は非推奨になっていて、使おうとすると一々警告が出てくるらしい。更に、Ruby 3.0.x に至っては、とうとう削除されてしまったそうで…。
_【Ruby 3.0 Advent Calendar 2020】Win32APIが廃止された【11日目】 - ゲームリンクスの徒然なる日常
つまり、voxrb も bassrb も、win32api を使っているから、今時のRuby (3.0, 2.7, 2.6)では利用できない。これが二つ目の問題点。
てなわけで、DXRuby で ogg を鳴らしたいなと思っても、今時の Ruby を使おうとすると鳴らせない状況になっているっぽい。困った。wav と MIDI だけでどうにかすることを強要されてしまう…。
余談。Vox.dll, Vox.dllのソース, bass.dll は以下から入手できる。
_Voxの詳細情報 : Vector ソフトを探す!
_ウマイハナシ (Web Archive)
_Un4seen Developments - 2MIDI / BASS / MID2XM / MO3 / XM-EXE / XMPlay
voxrb、bassrb は、前述のドキュメントによると、以下から入手できると書いてあるのだけど。
http://dxruby.sourceforge.jp/cgi-bin/hiki.cgi
このWikiページ、今現在は消滅している。つまり、voxrb も bassrb も、今では簡単には入手できない。これが一つ目の問題点。
ただ、一応、WebArchive で以前のページを見ることができた。
_DXRuby プロジェクトWiki - ファイル置き場 (WebArchive)
そこから辿って、今現在もファイル群が残っているディレクトリに到達できた。
_http://dxruby.osdn.jp/files/
voxrb.zip (2009/05/15), bassrb.zip (2009/06/14) が、目的のファイル。ということで、頑張ればなんとか入手できなくもない…。
これで ogg を鳴らせるかなと思いきや、さにあらず。
昔の Ruby (1.8, 1.9, 2.0) は .dll を利用する際に win32api というモジュールを利用することになっていて、voxrb も bassrb もソレを利用していて…。DXRubyの作者様のblogで、そのあたりの変化が分かりやすく解説されているけれど。
_DLとWin32APIとFiddle - mirichiの日記
この win32api、今時の Ruby では使用は非推奨になっていて、使おうとすると一々警告が出てくるらしい。更に、Ruby 3.0.x に至っては、とうとう削除されてしまったそうで…。
_【Ruby 3.0 Advent Calendar 2020】Win32APIが廃止された【11日目】 - ゲームリンクスの徒然なる日常
つまり、voxrb も bassrb も、win32api を使っているから、今時のRuby (3.0, 2.7, 2.6)では利用できない。これが二つ目の問題点。
てなわけで、DXRuby で ogg を鳴らしたいなと思っても、今時の Ruby を使おうとすると鳴らせない状況になっているっぽい。困った。wav と MIDI だけでどうにかすることを強要されてしまう…。
余談。Vox.dll, Vox.dllのソース, bass.dll は以下から入手できる。
_Voxの詳細情報 : Vector ソフトを探す!
_ウマイハナシ (Web Archive)
_Un4seen Developments - 2MIDI / BASS / MID2XM / MO3 / XM-EXE / XMPlay
◎ 解決策をぼんやり考える。 :
どうしたら解決できるのだろう…。
選択肢その1。今時の Ruby を使うことを諦める。Ruby 2.3 とか、いっそ Ruby 1.8 とか 1.9 を使ってしまえばいい…。でも、せっかく Windows に Ruby をインストールするなら、今時のバージョンを使いたいよな…。たぶん。
選択肢その2。ayame.so を今時の Ruby でも動くようにビルドする。しかし、ayame.so のビルド方法が分からん…。今時の RubyInstaller は DevKit(MSYS2)が同梱されてるけど、それだけでビルドできるのか、それとも Visual C++ を入手しないといかんのか、それすら分からない…。
選択肢その3。voxrb や bassrb を今時のRubyの仕様に合わせて、つまりは fiddle とやらを使って動くように修正する。でも、fiddle とやらの使い方が分かってないと修正なんてできない…。それに、たしか Vox.dll はループ再生に関して不具合があった記憶が…。bass.dll はライセンス料が絡んでくるし…。 *1
選択肢その4。DXRubyを使うのを諦めて _gosu に移行する。だけど、gosu で ogg を扱うと、 _ループ再生で不具合があった 記憶が…。今もおかしいままなんだろうか。
選択肢その5。そもそも Ruby を捨てて、 _Lua言語で2Dゲーム制作ができるlove2d 等を使う。Rubyは、Ruby本体のバージョンアップが激しい上に、後方互換性を比較的無視して仕様変更がガンガン入るあたりがアレなわけで…。Rubyを捨ててしまえば色々と楽になる…。
他にも、ogg再生を諦めて wav と MIDI だけで頑張るとか。Ruby で ogg が再生できそうな別のライブラリを探すとか。策はあるのかもしれんけど…。
選択肢その1。今時の Ruby を使うことを諦める。Ruby 2.3 とか、いっそ Ruby 1.8 とか 1.9 を使ってしまえばいい…。でも、せっかく Windows に Ruby をインストールするなら、今時のバージョンを使いたいよな…。たぶん。
選択肢その2。ayame.so を今時の Ruby でも動くようにビルドする。しかし、ayame.so のビルド方法が分からん…。今時の RubyInstaller は DevKit(MSYS2)が同梱されてるけど、それだけでビルドできるのか、それとも Visual C++ を入手しないといかんのか、それすら分からない…。
選択肢その3。voxrb や bassrb を今時のRubyの仕様に合わせて、つまりは fiddle とやらを使って動くように修正する。でも、fiddle とやらの使い方が分かってないと修正なんてできない…。それに、たしか Vox.dll はループ再生に関して不具合があった記憶が…。bass.dll はライセンス料が絡んでくるし…。 *1
選択肢その4。DXRubyを使うのを諦めて _gosu に移行する。だけど、gosu で ogg を扱うと、 _ループ再生で不具合があった 記憶が…。今もおかしいままなんだろうか。
選択肢その5。そもそも Ruby を捨てて、 _Lua言語で2Dゲーム制作ができるlove2d 等を使う。Rubyは、Ruby本体のバージョンアップが激しい上に、後方互換性を比較的無視して仕様変更がガンガン入るあたりがアレなわけで…。Rubyを捨ててしまえば色々と楽になる…。
他にも、ogg再生を諦めて wav と MIDI だけで頑張るとか。Ruby で ogg が再生できそうな別のライブラリを探すとか。策はあるのかもしれんけど…。
◎ voxrbをfiddleで動くように修正してみた。 :
前述の選択肢その3に少しチャレンジしてみた。voxrb (Vox.rb) を、fiddle を使って動くように修正してみようかと。
一応、出来たかもしれない。ライセンスはオリジナル版に倣って Public Domain ってことで。
_Vox.rb (fiddle使用版)
fiddle が使えるのは Ruby 2.0以降という話を見かけたので、Ruby 1.8 や 1.9 上で動く場合は以前のオリジナル版そのままの処理になるようにしてみた。また、各種メッセージに日本語文字列が含まれていると、Rubyのバージョンによってはエラーを出して動かなかったりしたので、できるだけASCII文字列のみで置き換えてみた。
Vox.rb を利用するサンプルと ogg は以下。
_ogg_play_voxrb.rb
_loop_bgm.ogg
ruby ogg_play_voxrb.rb を実行すれば DXRuby のウインドウが開いて、z, x, c, vキーを叩けば音が鳴ったり、一時停止できたり、フェードアウトしたりする。
一応、関連ファイルを全部zipにまとめて置いときます。
_ogg_play_with_voxrb_20210818.zip
_ogg_play_with_voxrb_20210813.zip
動作確認環境は以下。
この調子で bassrb の修正にもチャレンジしてみようかなと思ったけど、さて…。
一応、出来たかもしれない。ライセンスはオリジナル版に倣って Public Domain ってことで。
_Vox.rb (fiddle使用版)
fiddle が使えるのは Ruby 2.0以降という話を見かけたので、Ruby 1.8 や 1.9 上で動く場合は以前のオリジナル版そのままの処理になるようにしてみた。また、各種メッセージに日本語文字列が含まれていると、Rubyのバージョンによってはエラーを出して動かなかったりしたので、できるだけASCII文字列のみで置き換えてみた。
Vox.rb を利用するサンプルと ogg は以下。
_ogg_play_voxrb.rb
_loop_bgm.ogg
ruby ogg_play_voxrb.rb を実行すれば DXRuby のウインドウが開いて、z, x, c, vキーを叩けば音が鳴ったり、一時停止できたり、フェードアウトしたりする。
一応、関連ファイルを全部zipにまとめて置いときます。
_ogg_play_with_voxrb_20210818.zip
動作確認環境は以下。
- Windows10 x64 21H1
- Ruby 1.8.7 p330 x86 (i386-mswin32) + DXRuby 1.0.9 x86
- Ruby 1.9.3 p551 x86 (i386-mingw32) + DXRuby 1.4.1 x86
- Ruby 2.3.3 p222 x86 (i386-mingw32) + DXRuby 1.4.6 x86
- Ruby 2.6.8 p205 x86 (i386-mingw32) + DXRuby 1.4.7 x86
- Ruby 2.7.4 p191 x86 (i386-mingw32) + DXRuby 1.4.7 x86
- Ruby 3.0.2 p107 x86 (i386-mingw32) + DXRuby 1.4.7 x86
この調子で bassrb の修正にもチャレンジしてみようかなと思ったけど、さて…。
◎ 2021/08/18追記。 :
Vox.rb の一部の記述でバグってたので修正。
*1: もっとも、base.dll の場合、非商用なら無料で使えるから、作った何かしらを無料で公開するなら問題無く利用できるだろうけど。
[ ツッコむ ]
以上です。