Xkanon(1)

Xkanon を動かしてみます。

 Xkanon のソースがあるので、コンパイルして動かしてみます。

 オリジナルの Xkanon(xkanon-071209.tar.gz) はconfigure ができませんが、xkanon-gtk(xkanon-gtk2-090830.tar.gz) は configure ができました。

 オリジナルの ayusys.ja.po を xkanon-gtk のディレクトリへ ayusys_gtk2.ja.po という名前で UTF-8 にコード変換してコピーしておきます。Xkanon-gtk のディレクトリでコンパイルします。

$ ./configure
$ make -j4
$ sudo make install

 コンパイルは通ったので、ゲームデータを吸出し、CDDA を mp3 に変換します。また、このプログラムは mp3 の再生に mpg123 を使うようなので、以下のようにパッケージをインストールしました。

$ sudo apt-get install -y cdparanoia lame mpg123

 ゲーム CD をセットし、データを吸い出します。

$ sudo xkannon_install <CD をマウントしたパス>

 吸い出したディレクトリに移動して、音楽を mp3 で保存します。

$ cd /usr/local/share/xayusys_gtk2/xkanon
$ sudo -s
# mkdir bgm
# cd bgm
# cdparanoia -v -B
# for file in *.wav; do lame –preset insane ${file}; done
# rm -f track*.cdda.wav
# for file in *.mp3; do n=${file%.cdda.mp3}; n=${n##*k}; mv ${file} audio_${n}.mp3; done
# exit

 実行してみます。

$ xkanon –cddev none

一瞬だけ window が作成されましたが終了。

$ sudo xkanon –cddev none

 起動しました。が、しかし、音が出ない!テキストが表示されない!
さらに、そうでした。もともとの Kanon は音声なしでした!

oss を使っているようなので、alsa-oss を入れて動かしてみます。

$ sudo apt-get install -y alsa-oss
$ sudo aoss xkanon –cddev none

 audio のエラーはなくなりましたが、mixer がエラーになり、やはり音は出ません。

 root 権限でしか動かないのは、それはそうです、/usr/local/share/xayusys_gtk2/xkanon というディレクトリに書き込みの権限がないからです。xkanon ごとデータを自分のフォルダにコピーし、起動スクリプト xkanon のパスを修正しました。これで sudo をつける必要がなくなりました。

 テキストに関しては、ゲーム内のデータは shift-jis で、このプログラムは euc を使っているあたりが原因だと思います。
 よく見てみたらそうでもないようです。
 いろいろ試してやっと原因を見つけました。
 ゲームのテキストは、shift-jis ですが、内部で euc にコード変換しています。euc テキストにした後で、禁則処理等を行っています。
 その後で、gtk で文字の描画を行いますが、それには UTF-8 へのコード変換が必要になります。
 ところが、UTF-8 へ変換する際に、1 バイトしか渡していません。セリフの表示は 1 文字単位ですが、日本語 euc の場合 2 バイト渡す必要があります。
 ということで、1 バイト目の文字の最上位ビットが立っていたら、日本語とみなし、もう 1 バイト渡すようにプログラムを修正しました。
 これでテキストが表示されました。

 あとは音の問題ですが、難しそうです。

 xsystem35 のオリジナルのソースをコンパイルしてみました。それを OSS モードで動かしてみたら aoss で普通に音がなりました。
ということは、Xkanon でも OSS で音が鳴らせる筈です。もともと、Xkanon は xsystem35 の音部分を流用しています。
 Xkanon の OSS 部分と xsystem35 の OSS の部分を比べて、音がなるかどうか調べていくことにします。

 更に調べていくと、aoss を使って、効果音がなることがわかりました。つまり、wav ファイルは音がなるということです。CD の音は、mp3 に変換したので、処理が別になります。
 CD を wav にしたら BGM もなりました。
 どうやら mpg123 が裏ではストップしてしまうようです。古い mpg123 のソースを落としてきましたが、見つかったのは mpg123-0.59r-gpl.tar.gz (mpg123-0.59r.tar.gz はコンパイルできない) でした。
 README には 0.59f で確認したとあります。
 この mpg123 で試しましたが、フォーマットエラー (Cannot find RIFF file) で動きません。ソースを見ると、ファイルの先頭にシークしています。
 昔の mpg123 はシークできたのでしょうか?
 まあ、ファイルとパイプを同じコードで処理しているからそのせいもあるでしょう。
パイプからの読み込みをシークするとは。ちゃんと動いていたのでしょうか?

 本当にシークが必要かどうか確認する必要があります。
 更に調べていくと、シーク動作は再生終了時に、再度再生させるためにあるようです。
 mp3 の場合、ループは望めません。
 再生できないのは、ファイルサイズが取得できないためのようです。当然、mp3 から wave へ変換する時は、変換が終わるまでサイズは決まりません。
 そこでサイズが決まらなければ、暫定的に 1G にするように修正したところ、mp3 で BGM が再生されました。EOF のチェックは入っているので大丈夫でしょう。
 mp3 ではループできませんが、我慢します。
 また、古い mpg123 を使ったためか時々再生が途切れます。代わりに lame を使うように修正しました。
 なお、configer のオプションで指定できるようですが、指定しても mpg123 があると問答無用で mpg123 にされてしまいます。config.h を直接書き換えて対処しました。
 lame でデコードしたところ、音の途切れはなくなりました。
 効果音を mp3 にしても問題ないようです。

 Air のメディアも探して動かしてみました。当然、声無しだけど。オープニングが流れるまでやってみましたが、問題なさそうです。

 音に関しては、alsa でも音は出るようです。pcm device に default を指定すると、現在選択しているデバイスから音が出ました。ただし、ブツブツ音が入ります。
 aoss を使ったほうがスムーズに再生してくれます。

 カーネルモジュール無しで動くとは。
 aoss すごいです。

Xkanon

Posted by sirius