なぜかまた急に無性に Key の「 Air 」を ubuntu で遊びたくなり、やってみた件の続き。

xkanon と wine の2つの方法のうち、 xkanon ( xair ) を使った場合は音が鳴らないので、 wine を使う方法を選んだと前回書いたが、 wine と _inmm で実行した場合、小さなプチプチ音のノイズが乗るので、やっぱり xkanon を使えないかやってみた。

xkanon に実装済みの oss, alsa では正常動作しないので、ソースを眺めながらあれこれいじってみたが、よく分からなかった。そこで、 alsa を使うのはあきらめて、 GStreamer というライブラリを使って音を鳴らすことにして、コードを書き始めた。

GStreamer 用のサンプルコードを試しながら使い方を学習し、 wav ファイルの鳴らし方を理解したので xkanon のソースにコードを組み込み、何度か試して完成させた。 BGM は wav ファイルから鳴らせばよいので CD-DA の実装は行わず、 wav ファイルのみを再生するクラスを作成した。 gst_pipeline_new() でパイプラインを作成し、 filesrc, wavparse, volume, audioconvert, autoaudiosink のエレメントを作成しリンクした。再生中に音量を変化させる方法だけは分からなかったので、 fade out の動作は未実装だ。

今回の作業では GStreamer のもつ柔軟性が感じられた。様々な形式の音源の音をならせられるし、ファイルを読み込んで再生するだけでなく、ネットごしにストリーミング再生もできる。また、音だけでなく動画なども再生する能力を持っている。


なぜかまた急に無性に Key の「 Air 」を ubuntu で遊びたくなり、やってみた。

方法は2つあって、1つ目は JAGARL さんの xkanon ( xair ) を使う方法で、2つ目は wine を使う方法だ。

xkanon を使った場合、 ubuntu 18.04 LTS では音を鳴らすことができなかった。 xkanon は音を鳴らす方法を OSS, ALSA 等から選択できるように作られているのだが、まず OSS は古いものなので今の ubuntu では使用できないため、 ubuntu の kernel をカスタマイズして OSS を組み込んでみたが、 /dev/dsp がそもそも作られなかった。そこで osspd を使用してみたが、 /dev/dsp は作られたものの、音は一切鳴らなかった。そこで、 ubuntu が現在使用している ALSA を使うようにしてみたが、やはり音は鳴らずエラーが出て異常終了してしまう。 xkanon の場合は、音無しでならプレイできるという結果になった。ちなみに、 xkanon の作者の JAGARL さんは配布サイトを閉鎖したようで、現在は作者の配布サイトからソースをダウンロードしたり質問したりすることは出来ない。

そこで、次に wine を使う方法を試してみた。 BGM は CD-DA ではなく _inmm を使い wav ファイルを鳴らすように変更することにした。こちらも最初は音が一切鳴らなかったが、Install GStreamer on Ubuntu or Debian

を見ながら必要なプラグインパッケージなどを全てインストールしたところ、起動時の波の音(効果音)と本編中のセリフ音声は出るようになった。だが、BGMは鳴らず、下の様なエラーメッセージが出続けた。

0031:fixme:ntdll:EtwEventEnabled (deadbeef, 0x76021b48): stub

0047:fixme:gstreamer:event_src 0x7c104e00 (61441) stub

0047:err:gstreamer:unknown_type Could not find a filter for caps: "audio/x-wav"

0031:err:gstreamer:GST_Connect GStreamer failed to play stream

0048:err:gstreamer:watch_bus decodebin67484: GStreamer はプラグインを見つけることができません

0048:err:gstreamer:watch_bus gstdecodebin2.c(4640): gst_decode_bin_expose (): /GstBin:bin67484/GstDecodeBin:decodebin67484:

no suitable plugins found:

Missing decoder: WAV (audio/x-wav)

どうやら、 'audio/x-wav' というメディアタイプに対応する GStreamer のプラグインが見つからないというのだが、理由が分からない。効果音も wav ファイルなのだ。 _inmm 経由で音が再生されるのは BGM だけなので、 _inmm が再生出来ずにいるということしか分からない。

試行錯誤して、やっと解決した方法は、 _inmm.ini ファイルを標準形式ではなく拡張形式で記述し、 [Players] セクションに wav ファイルのプレイヤーを 'MCI = *.wav' という風に MCI を明示することで音がなるようになった。ちなみに、プレイヤーとしては MCI、DirectShow、Winamp、SCMPX、Lilith、Silent(再生しない)から選択できるそうだが、 DirectShow を選択してみたら鳴らなかった。標準形式では何故音が鳴らないかは分からない。


なぜか急に無性に Key の「 Air 」で遊びたくなり、PC版の初回限定版を取り寄せた。

PC版の「 Air 」は、音声無しなのだが、音声を鳴らしたかったので、音声化してくれるパッチを使った。いくつかのパッチが存在したが、DC(ドリームキャスト)版の音声データを用いるものは、DCのメディアがPCでは読み取れないため、DC版の「 Air 」に加え、DC本体とBBA(ブロードバンドアダプタ)が必要になってくるので断念し、PS2版の「 Air 」の音声データを用いるパッチを使った。

また、PC版の「 Air 」は、BGM再生が「月姫」同様に CD-DA なので、Windows10 ではループ再生出来ず止まってしまうので、 wave ファイルを再生するようにした。

古いゲームの話なので今頃遊ぶ人もあまりいないと思うが一応やり方を書いておく。

以下がその手順。

・PC版「 Air 」をインストールする。

・Key のサイトから、初回限定版に対するアップデータ airup_20010719.lzh をダウンロードし、アップデートする。

・ avg3217d.exe をどこかから見つけてきて、PC版「 Air 」のインストールフォルダにコピーする。

・artext_10.zip をダウンロードして中身の artext.exe を実行し、PCのドライブにPS2版「 Air 」のディスクを入れ、PS2版「 Air 」の音声データをPC版「 Air 」のインストールフォルダの下の DAT フォルダに wav ファイルに変換して保存させる。

・vpatchPS2_010b.zip をダウンロードして中身の voicepat_18.txt を voicepat.txt にリネームして、PC版「 Air 」のインストールフォルダの下の DAT フォルダにコピーする。

・vpatchPS2_010b.zip の中身の vairPS2_renamer.exe を実行し、「ミキサー無し版⇒ミキサー版」を選んで「AIRインストール先」を指定してリネームを実行する。

・vpatchPS2_010b.zip の中身の vpatchPS2.exe を実行し、「ミキサー版」を選んで「AIRインストール先」を指定してパッチを実行する。

・ _inmm238-installer.zip をダウンロードし、 _inmm238.exe を実行して inmm をインストールする。

・ _inmmcnf.exe を実行し、「パッチ」タブを選択すると、 inmm にプリインストールされているゲームの一覧から Key の Air を選んでBGMをwavから鳴らすためのパッチを当てることができるが、これでパッチを当てられるのはPC版「 Air 」インストール時に初めからインストールされる avg3217m.exe なので、音声を鳴らすために用意した avg3217d.exe にはパッチが当たらないためこの方法ではだめ。

・代わりに、 _inmmcnf.ini をテキストエディタで開き、’[AIR]’のブロックを検索し、そこの ‘File=AVG3217M.EXE’ を ‘ImportTablePatch=AVG3217D.EXE’ に変更して保存する。( ‘FIle=’だと AVG3217D.EXE の場合パッチ当てに失敗するため。)

・_inmmcnf.ini を編集したら、 _inmmcnf.exe を実行し、「パッチ」タブを選択し、 inmm にプリインストールされているゲームの一覧から Key の Air を選んでBGMをwavから鳴らすためのパッチを当てる。

以上の手順で、PC版の初回限定版「 Air 」を音声化しつつ、BGMもCD-DAからwav再生に変更できる。

ちなみに、 Windows10 64bit 版で「 Air 」で遊ぶ場合、 avg3217d.exe のプロパティの「互換性」タブを選び、「互換モードでこのプログラムを実行する」のチェックを入れ ‘Windows XP(Service Pack 2)’ を選択し、同時に、「管理者としてこのプログラムを実行する」にもチェックを入れておくと吉だと思われる。

あと素朴な疑問だが、PC版の「メモリアルエディション全年齢対象版」は Windows7 にも対応しているようだが、これもBGM再生は CD-DA なのだろうか?対応OSや発売が2010年であることを考えると、さすがにwav再生になっていないとまずい気がするのだが・・・。

[コメントの受付は終了しています ]
この記事のリンク元 | 1 |

キーワード: ゲーム Key Air CD-DA 音声化


月箱 2019-02-24 (日) 15:49:47+09:00

ソフトウェア

ゲットしてみた。

「月姫」と「歌月十夜」「幻視同盟」が遊べて、絵師の皆さんの壁紙もついてくる。

とりあえず起動してみたが、BGMの再生が太古の CD-DAだった(BGMを鳴らすためにCDに書き込まれている音楽トラックを直接再生する方式)。これだと Windows10 はおろか、もっと前のOSでもループ再生できず止まってしまう。OS側の仕様変更が原因と思うが、これをなおす方法はないので、ちょっと禁断の方法を使ってみた。

(1) nExtracterGUI を使い、「月姫」のアーカイブ arc.sar, nscript.dat の中身を展開する。

(2)展開した中身を例えば tukihime_ フォルダをつくり、そこに全部移動する。

(3) DecodeScenario_nscript.txt というテキストファイルがあるので、 00.txt にリネームする。

(4) cd2wav32 を使い、「月姫」のCDの音楽トラックに入っている曲から .wav ファイルを作る。

(5) .wav –> .ogg 変換ソフトウェアを使い (例えば freac-1.0.32-bin )、 .wav ファイルを .ogg ファイルに変換する。

(6) .ogg ファイルはトラックの順に 1.ogg ~ 10.ogg という名前にしておく。

(7) tukihime_/bgm というフォルダを作り、 .ogg ファイルを中に入れておく。

(8) 「月姫」のフォルダの中にある icon フォルダに入っている hollow.bmp を、 tukihime_/icon/ フォルダにコピーする。

(9) 「月姫」のフォルダの中にある jpgplgin.dll を、 tukihime_ フォルダにコピーする。

(10) NScripter最終版 をダウンロードして中身を展開し、「実行ファイル/DLL」フォルダに入っている nscr.exe, nsogg2.dll, nspng.dll を tukihime_ の中にコピーする。

(11)テキストエディタで 00.txt を開き、 play "*?" ( ? は 1 ~ 10 の数字 ) を全て、 bgm “bgm\?.ogg” に置換する。(例えば、 play “*1” と書かれているところは、 bgm “bgm\1.ogg” に変換する。)

(12)同様に playstop と書かれているところを全て、 stop に置換する。

これで、 nscr.exe を実行すると CD-DA ではなく .ogg ファイルの再生でBGMが鳴るので、ループ再生も問題なく出来るようになる。ただし、アーカイブの中身をごにょごにょする方法なので、展開した中身を絶対に他人に配ったり教えたりしてはいけない。あくまでも個人で楽しむにとどめて欲しい。良い子のみんなへの約束だぞ。

キーワード: ゲーム TYPE-MOON 月姫 CD-DA


公式サイトが閉鎖したため現在はダウンロード出来ない KAGEX3 だが、吉里吉里Zで使用できるようにする修正は思ったより簡単だった。

(1) kagex3/plugin/ に、吉里吉里Zソースからビルドした menu.dll, KAGParser.dll, win32dialog.dll をコピーする。

(2) kagex3/data/ に、吉里吉里Zから k2compat フォルダを中身ごとコピーする。

(3) kagex3/data/ , kagex3/template/ 以下にある全ての .tjs, .ks ファイルの文字コードを SHIFT-JIS から utf-8 に変更する。

(4) kagex3/data/startup.tjs を開き、先頭行に以下を挿入する。


@if (kirikiriz)
property _dummyProp { getter {} setter (v) {} }
with(Window) {
    &.innerSunken    = &_dummyProp;
    &.showScrollBars = &_dummyProp;
}
Plugins.link("plugin/menu.dll");
Plugins.link("plugin/KAGParser.dll");
Plugins.link("plugin/win32dialog.dll");

var base = "k2compat/"; Scripts.execStorage(base+"k2compat.tjs"); Krkr2CompatUtils.scriptBase = base; @endif

これだけだ。