mieki256's diary



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つ。
  • 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 では動かないっぽい…。

voxrb、bassrbの問題。 :

voxrb、bassrb にも、問題点が2つあって。

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 が再生できそうな別のライブラリを探すとか。策はあるのかもしれんけど…。

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

動作確認環境は以下。
  • 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 の場合、非商用なら無料で使えるから、作った何かしらを無料で公開するなら問題無く利用できるだろうけど。

#2 [dxruby] DXRuby 64bit版が動かなくて悩んだ

DXRuby 1.4.7 から、64bit版も同梱されるようになったと知った。素晴らしい。

しかし、Windows10 x64 21H1上で DXRuby 1.4.7 の動作確認をしてみたら、Ruby のバージョンによっては、require "dxruby" をしただけでエラーが出て悩んでしまった。

調査結果。 :

以下の Ruby バージョンでは DXRuby 1.4.7 64bit版が動かない。require "dxruby" をしただけでエラーが出る。
  • Ruby 3.0.2 p107 x64 (2021-07-07) (rubyinstaller-devkit-3.0.2-1-x64.exe)
  • Ruby 2.7.4 p191 x64 (2021-07-07) (rubyinstaller-devkit-2.7.4-1-x64.exe)
  • Ruby 2.7.3 p183 x64 (2021-04-05) (rubyinstaller-devkit-2.7.3-1-x64.exe)

しかし、Ruby 64bit版上では必ず動かないというわけでもない。以下のRubyバージョンなら DXRuby が動く…。
  • Ruby 3.0.0 p0 x64 (2020-12-25) (rubyinstaller-devkit-3.0.0-1-x64.exe)
  • Ruby 2.7.2 p137 x64 (2020-10-01) (rubyinstaller-devkit-2.7.2-1-x64.exe)

また、最新の Ruby では必ず動かないというわけでもない。以下のように、32bit版なら、最新の Ruby でも DXRuby が動く…。
  • Ruby 3.0.2 p107 x86 (2021-07-07) (rubyinstaller-devkit-3.0.2-1-x86.exe)
  • Ruby 2.7.4 p191 x86 (2021-07-07) (rubyinstaller-devkit-2.7.4-1-x86.exe)

このことから推測できることは…。

  • DXRuby 32bit版 (x86版) なら、どのRubyのバージョンでも動く。たぶん。
  • DXRuby 64bit版 (x64版) は、動くRubyのバージョンが限られている。

おそらく、DXRuby 64bit版のバイナリがビルドされた時期に公開されていたバージョンの Ruby 64bit版を使えば、DXRuby 64bit版も動くのではないか、という気もする。

Ruby 64bit版は、Ruby 32bit版に比べて、拡張ライブラリのバイナリ互換性が低いということなのだろうか…?

余談。Ruby 64bit版にも対応してる gosu はどうしているのかなと gem install gosu をしてみたら、ビルドが始まった…。ということは、DevKitの導入が必須なのか…。バイナリだけを配布して動かすことを諦めている気配がする…。

動作確認時のエラーメッセージ等をメモ。 :

Ruby 3.0.2 p107 (2021-07-07) x64-mingw32 の場合。
> ruby -v
ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [x64-mingw32]

> gem install dxruby
Fetching dxruby-1.4.7.gem
Successfully installed dxruby-1.4.7
Parsing documentation for dxruby-1.4.7
Installing ri documentation for dxruby-1.4.7
Done installing documentation for dxruby after 0 seconds
1 gem installed

> irb
irb(main):001:0> require "dxruby"
<internal:C:/Ruby/Ruby30-x64/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:85:in `require': failed create window - CreateWindow (DXRuby::DXRubyError)
        from <internal:C:/Ruby/Ruby30-x64/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
        from C:/Ruby/Ruby30-x64/lib/ruby/gems/3.0.0/gems/dxruby-1.4.7/lib/dxruby.rb:3:in `<top (required)>'
        from <internal:C:/Ruby/Ruby30-x64/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:160:in `require'
        from <internal:C:/Ruby/Ruby30-x64/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:160:in `rescue in require'
        from <internal:C:/Ruby/Ruby30-x64/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:149:in `require'
        from (irb):1:in `<main>'
        from C:/Ruby/Ruby30-x64/lib/ruby/gems/3.0.0/gems/irb-1.3.5/exe/irb:11:in `<top (required)>'
        from C:/Ruby/Ruby30-x64/bin/irb.cmd:31:in `load'
        from C:/Ruby/Ruby30-x64/bin/irb.cmd:31:in `<main>'
<internal:C:/Ruby/Ruby30-x64/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:85:in `require': cannot load such file -- dxruby (LoadError)
        from <internal:C:/Ruby/Ruby30-x64/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
        from (irb):1:in `<main>'
        from C:/Ruby/Ruby30-x64/lib/ruby/gems/3.0.0/gems/irb-1.3.5/exe/irb:11:in `<top (required)>'
        from C:/Ruby/Ruby30-x64/bin/irb.cmd:31:in `load'
        from C:/Ruby/Ruby30-x64/bin/irb.cmd:31:in `<main>'

Ruby 2.7.4 p191 (2021-07-07) x64-mingw32 の場合。
> ruby -v
ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x64-mingw32]

> gem install dxruby
Fetching dxruby-1.4.7.gem
Successfully installed dxruby-1.4.7
Parsing documentation for dxruby-1.4.7
Installing ri documentation for dxruby-1.4.7
Done installing documentation for dxruby after 0 seconds
1 gem installed

> irb
irb(main):001:0> require "dxruby"
Traceback (most recent call last):
       10: from C:/Ruby/Ruby27-x64/bin/irb.cmd:31:in `<main>'
        9: from C:/Ruby/Ruby27-x64/bin/irb.cmd:31:in `load'
        8: from C:/Ruby/Ruby27-x64/lib/ruby/gems/2.7.0/gems/irb-1.2.6/exe/irb:11:in `<top (required)>'
        7: from (irb):1
        6: from C:/Ruby/Ruby27-x64/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:147:in `require'
        5: from C:/Ruby/Ruby27-x64/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:158:in `rescue in require'
        4: from C:/Ruby/Ruby27-x64/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:158:in `require'
        3: from C:/Ruby/Ruby27-x64/lib/ruby/gems/2.7.0/gems/dxruby-1.4.7/lib/dxruby.rb:3:in `<top (required)>'
        2: from C:/Ruby/Ruby27-x64/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:83:in `require'
        1: from C:/Ruby/Ruby27-x64/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:83:in `require'
DXRuby::DXRubyError (failed create window - CreateWindow)

Ruby 2.7.3 p183 (2021-04-05) x64-mingw32 の場合。
> ruby -v
ruby 2.7.3p183 (2021-04-05 revision 6847ee089d) [x64-mingw32]

> gem install dxruby
Fetching dxruby-1.4.7.gem
Successfully installed dxruby-1.4.7
Parsing documentation for dxruby-1.4.7
Installing ri documentation for dxruby-1.4.7
Done installing documentation for dxruby after 0 seconds
1 gem installed

> irb
irb(main):001:0> require "dxruby"
Traceback (most recent call last):
       10: from c:/Ruby/Ruby27-x64/bin/irb.cmd:31:in `<main>'
        9: from c:/Ruby/Ruby27-x64/bin/irb.cmd:31:in `load'
        8: from C:/Ruby/Ruby27-x64/lib/ruby/gems/2.7.0/gems/irb-1.2.6/exe/irb:11:in `<top (required)>'
        7: from (irb):1
        6: from C:/Ruby/Ruby27-x64/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:147:in `require'
        5: from C:/Ruby/Ruby27-x64/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:158:in `rescue in require'
        4: from C:/Ruby/Ruby27-x64/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:158:in `require'
        3: from C:/Ruby/Ruby27-x64/lib/ruby/gems/2.7.0/gems/dxruby-1.4.7/lib/dxruby.rb:3:in `<top (required)>'
        2: from C:/Ruby/Ruby27-x64/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:83:in `require'
        1: from C:/Ruby/Ruby27-x64/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:83:in `require'
DXRuby::DXRubyError (failed create window - CreateWindow)

Ruby 3.0.0 p0 (2020-12-25) x64-mingw32 の場合。これは動きそう。
> ruby -v
ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x64-mingw32]

> gem install dxruby
Fetching dxruby-1.4.7.gem
Successfully installed dxruby-1.4.7
Parsing documentation for dxruby-1.4.7
Installing ri documentation for dxruby-1.4.7
Done installing documentation for dxruby after 0 seconds
1 gem installed

> irb
irb(main):001:0> require "dxruby"
=> true

Ruby 2.7.2 p137 (2020-10-01) x64-mingw32 の場合。これも動きそう。
> ruby -v
ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x64-mingw32]

> gem install dxruby
Fetching dxruby-1.4.7.gem
Successfully installed dxruby-1.4.7
Parsing documentation for dxruby-1.4.7
Installing ri documentation for dxruby-1.4.7
Done installing documentation for dxruby after 0 seconds
1 gem installed

> irb
irb(main):001:0> require "dxruby"
=> true

Ruby 3.0.2 p107 (2021-07-07) i386-mingw32 の場合。
> ruby -v
ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [i386-mingw32]

> gem list | grep dxruby
dxruby (1.4.7)

> irb
irb(main):001:0> require "dxruby"
=> true

Ruby 2.7.4 p191 (2021-07-07) i386-mingw32 の場合。
> ruby -v
ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [i386-mingw32]

> gem list | grep dxruby
dxruby (1.4.7)

> irb
irb(main):001:0> require "dxruby"
=> true

#3 [ruby] RUBYOPTの扱いでちょっと悩んでしまった

Windows10 x64 21H1上で Ruby 1.8.7、2.3.3、2.6.8、3.0.2 をインストールしてあるのだけど、Ruby 1.8.7 を動かしたときにエラーが出ることに気が付いた。システム側の環境変数に RUBYOPT=-Eutf-8 という環境変数があることでエラーが出ているようで。

とりあえず件の環境変数を削除してみたのだけど、すると今度は Ruby 2.0以降でエラーが…。例えば irb がエラーを出して動かなかったりする…。

仕方ないので、RUBYOPT=-Eutf-8 を復活させた。Ruby 1.8.7 を利用する時は…。set RUBYOPT= で環境変数を削除してから利用するぐらいしか思いつかないな…。

以上、1 日分です。

過去ログ表示

Prev - 2021/08 - Next
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project