THE PSP攻略+α ~SONYへの挑戦状~

PSP関連ブログ?いいえ、ただのゆとりブログです

スポンサーサイト 

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
[ --/--/-- --:-- ] スポンサー広告 | トラックバック(-) | コメント(-)

汎用型東方BGMプレイヤー 

/*つべこべ(笑)
技術が無いのを叩かれて、最初からそう言ってると肯定すれば今度はなぜか持ち上げて技術がないことを肯定したことを叩きだす。
奴らは一体何を考えているのか私には全く分かりま千円。
そもそも、別に後ろめたいことをやってるわけでも無いし、頼まれてやってることでもないので退路も自己防衛も糞もねーよwww
お前らの妄想の中で俺は一体誰と戦っているんだ。
どうせ以前に言い訳がどうのとか訳のわからんこと言ってた奴だろうけど。
私は自分自身の趣味でやってるだけなんです。あなたとは違うんです。
どうみても無理やり理由を作って叩きたいだけです。本当にあ(ry
最近のPGは格下のPGを叩いてストレスを発散するのが流行りなのか?
*/


さて、東方のBGMを抽出せずにそのまま再生するプレイヤーはいくつか存在するが、曲の情報は元からプログラム内に格納していたり、別途曲目ファイルを用意するものが主流で、汎用的に再生できるものが見つからなかった。(当社調べ)
私が使用しているTHxxBGMというソフトは、プログラム内に格納しているタイプなのでソフトを更新しなければ新作には対応できない。
しかも製品版にしか対応しないので、星蓮船の体験版の曲が聴けねーじゃねーかゴルァということで、自分で汎用型東方BGMプレイヤーを作ることに。

汎用的に再生できれば、新作が出てもわざわざ個別に対応する必要が無い。
しかし、曲情報ファイルはメインアーカイブの中に入ってるので、デコードツールが対応しないと使えません^^;
アーカイブの展開ルーチンがコロコロ変わるので、さすがにこれは汎用的に対応できない。
まあ、他のBGMプレイヤーも曲情報ファイルが抽出出来ないと対応できないはずなので、大した問題ではないと思うが。
曲情報ファイルのフォーマットは、ZWAV形式が採用された妖々夢から全く変わってません。
おそらく、これからも汎用的に使えるだろう。

曲情報ファイルのフォーマットはWAVEに使われる構造体の中身が記されてる感じで、情報の取得は簡単だったが、HSPでどうやって鳴らすのかが問題だ。
波形データをそのままミキサーに送るような高度(低レベル)なことが標準で出来る言語ではないので、Win32APIを漁って見る事に。
どうやらwaveOut~とかいう低級APIで出力できるようだ。
連続でバッファを送信すると順番に再生されて、交互に送ればダブルバッファ的なことができるので多分この関数で合ってるのかな。

まずは適当な波形を送って正常に再生されるかを試してみるのだが、構造体の再現が非常にめんどくさい。
HSPには構造体が無く、整数型変数はすべて符号付32bit扱いなので、構造体のサイズで確保したメモリにlpokeやwpokeでちまちま書き込んでいく必要がある。
変数のポインタを取得したり、ポインタから変数を作成したりすることはできるので、一応Win32APIを直接叩くのには支障が無い。

次に、ダブルバッファにするなら、再生が終了したのを確認して新しいバッファを送る必要があるのだが、コールバック関数かウィンドウメッセージを設定する必要がある。
HSPとは関数に互換性が無いので、ウィンドウメッセージを取得する方法を使用。
ちゃんとC以外の言語のことも考えてるのねゲイツ。
幸いHSPには、ウィンドウメッセージを取得してサブルーチンジャンプが出来るようになってるので実装は可能なのだが、awaitなどでスリープしてるときにいつでもジャンプするので、バッファを準備してるときに再度呼ばれて2重で登録しようとしてエラーになってしまうことがある。
HSPはウィンドウをつかんでる(ドラッグしてる)間はメインの処理が止まるので不安定になりたまに処理落ちが発生し、なぜかウィンドウメッセージのルーチンだけはその間も動き続けるので、バッファを補充する前に再生が終了してウィンドウメッセージが送られてしまう。
最初はよくわからず、このバグに悩まされていたがループ内のawaitを消すことで解決。
HSPを使ったことがある人には分かると思うが、タスクを占有して最悪ウィンドウがつかめなくなり、閉じるボタンもクリックできなくなってしまうことがあるので少々不安。

ループも実装し、なんとかそれっぽいプレイヤーが完成したがそのままだとちと音量が大きい。
waveOut系命令はそのままミキサーに送るので、音量を設定する関数はミキサーにも影響するのであまり使いたくない。
ということでPCMの波形フォーマットについて色々調べてみたが、波形データの値を小さくすればそのまま音量も小さくなる模様。
ここでまた厄介になるのが変数型。
東方で使われてるPCMは符号付の16bit整数型なので、符号付32bit整数型しか扱えないHSPには符号無し扱いになる。(意味が分からない人は、メモリ上での負数の表現の仕方を調べてね)
このままで計算すると負数の波形がえらいことに…
というわけで、符号有り32bit型整数型に変換しなければならない。
またもや最初はよくわからず、このバグに悩まされて(ry

ボリューム操作が完成!
したのだが、一度に送信するバッファのサイズが大きいので、反映に少し時間がかかる。
元が無圧縮データなので、すべてメモリに読み込めるわけもなく、かといって小刻みに読み込んだらHDDの負担になる(ような気がする)。
というわけで、HDDからの読み込みもバッファリングすることに…
[HDD]
↓大きいバッファの最後まで行ったら読み込み。
[大きいバッファ]
↓バッファ1とバッファ2を交互に使用。
[出力用の小さいバッファ1][出力用の小さいバッファ2]
という感じなのだが、大きいバッファが足りなくなった場合は残りを小さいバッファに全部取り込んで、
HDDから大きいバッファに読み込み、足りない分だけまた読み込む。というめんどくさい処理が必要になってくる。
更に、HDDから最後まで読み込んだ場合は、読み込める分だけ大きいバッファに取り込み、ループ点までシークして足りない分を大きいバッファに取り込む。という処理も必要なので、管理が非常にめんどくさい。

HSP処理速度的に、サウンド用バッファが小さすぎると音が細切れになってしまうので、バッファを多少大きくした結果、若干ラグがあるものの無事にボリューム操作が完成。

PCMの波形データを弄るのがちょっと楽しかったので、余ったスペースにビジュアライザみたいなのを作ってみた^^
無音からドラムとかで入る時の綺麗な波形がたまらんw
【新ジャンル】波形デレ【無理がある】

汎用型東方BGMプレイヤー0001

やっぱりHSPはこういうことに向いてないな。
PSP向けの東方BGMプレイヤーを作るつもりだったけど、その前にCで組まないといけないかなぁ…
C言語でどうやってWin32API呼ぶのかわからんwww
ソフトは公開所にありますん。

■動作確認済みゲーム
 ・東方妖々夢
 ・東方永夜抄
 ・東方風神録
 ・東方地霊殿
 ・東方星蓮船(WEB体験版)

■動作未確認で使えると思われるゲーム
 ・東方花映塚
 ・東方文花帖
 ・その他アーカイブ内に拡張子がfmtのファイルがあり、ZWAV形式のdatファイルがあるゲーム

■今後追加したい機能
 ・汎用的に曲名と説明を表示
 ・ゲーム別にパスを登録して、簡易切り替え機能
 ・連続再生
 ・プログラム(順番登録制)再生
 ・フェードアウト
 ・紅魔郷への個別対応
 ・緋想天への個別対応+α

■追加したいけどやり方がわからない機能(情報求む)
 ・サウンドエフェクト(残響とかリバーブとか)
 ・音域別のレベルメーター(?)の表示
 ・格好良いGUIとアイコン(絵を描く服が無い)
 ・ノートPCとかの手前に付いてる再生とか送りボタンによる操作
 ・無線を使ってPSPでストリーミング再生(PSP側でのUDP通信の方法が分からない)
 ・幻想郷とリンク

星蓮船が1面からBGMが本気すぎて、むしゃくしゃしてヤった。
公開はしているが後悔はしていない。

コミケとか遠いから誰か星蓮船買ってきてくれ。
[ 2009/08/09 03:50 ] 自作ソフト類 | TB(0) | CM(8)
No.820
2chのレスなんぞスルーすればいいのに…
開発者が顔真っ赤にして夏厨にマジレスなんてすごい痛いよ…
関わりたくないような発言しておきながら反応しているしね
[ 2009/08/09(日) 13:31 ] [ 編集 ]
No.821
相変わらず顔真っ赤って言葉が好きだなw
それ以外に何か言えんのか…
これが顔真っ赤でマジレスしてるように見える初見君は7年間ROMってね^^

もしかしてまた釣られた?
[ 2009/08/09(日) 14:29 ] [ 編集 ]
No.822
十中八九人が管理人の顔真っ赤だと思ってるぞ
もう少し冷静になるんだ
深呼吸だ
[ 2009/08/10(月) 20:53 ] [ 編集 ]
No.823
東方花映塚は問題なく再生できました。
東方文花帖はwavファイル名が文字化けしていて再生したら
フリーズしました。
WINXP PRO SP3です。
[ 2009/08/11(火) 22:35 ] [ 編集 ]
No.824
こちらで確認したところ、文花帖も問題なく再生できました。
推測ですが、抽出にbrightmoonを使っている場合、星蓮船体験版用のアルゴリズムを選択してる可能性があります。
他のツールを使っている場合も、星蓮船体験版用のツールの可能性があります。
[ 2009/08/12(水) 22:25 ] [ 編集 ]
No.825
このコメントは管理人のみ閲覧できます
[ 2009/08/13(木) 17:47 ] [ 編集 ]
No.829
DXライブラリを使用しているのかしていないのか。
PSPなのかPCなのか。
また、龍神録プログラミングの館は私が書いたものでは無いので良くわかりません。
そのままコピペすれば同じように動くはずなので、ソース無しに原因を特定することはエスパーじゃないとほぼ無理です。
症状からみると、最大弾数が少なすぎて発射できてないか、弾を消す部分に問題がありそうな気がしますが…
その"速くなる"、"遅くなる"と感じた理由も分かりません。

あと、記事の内容に関係の無い話題で発展性のあるものは掲示板に書いたほうが見やすいと思います。
私としては、コメント欄は記事の延長みたいなものなので、他の人が見やすいように記事の内容に対するコメントだけにしたいところです。
[ 2009/08/13(木) 22:52 ] [ 編集 ]
No.832
すいません。反省したいと思います。
ご迷惑をおかけして申し訳ございませんでした。
[ 2009/08/14(金) 07:34 ] [ 編集 ]
コメントの投稿













管理者にだけ表示を許可する
プロフィール

七次元

Author:七次元
永遠の18才
夢を追い求める学生
プログラミング初心者(笑)
愛用言語はHSP(スイーツ)
プログラマーを目指すものの「C言語?読むだけ^^」「C++?知らんがな。クラスって何?おいしいの?」
というゆとりっぷり。
Delphi入れたりVC++2008入れたり迷走中。
夢はコミケで何かやりたい。一般参加すらしたこと無いけど。
PSP-1000(CFW)持ち。PSP-4000マダー?
よく難波周辺のゲーセンに出没するらしい。
STGも格げーも初心者。
ろ、ロリコンちゃうわ!!!

連絡先:homepage_touroku[a]yahoo.co.jp
(メールはほとんど確認してません。掲示板に書き込むのが確実です)

関連リンク
そふとうぇあこうかいじょ
公開したファイルが置いてあります。

掲示板
連絡やら雑談やら適当にどうぞ。
カウンター



現在の閲覧者数:
ブロとも申請フォーム


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。