2023/10/26(木) [n年前の日記]
#2 [hsp] mp3しかサポートしてないゲーム制作ライブラリはよろしくない
HSP の hsp3dish のドキュメントを眺めていたら、サウンド再生については「wav と mp3 のみ対応」と書いてあって、「いやー、それはよろしくないなあ…」と思ってしまった。
wav と ogg にしか対応してないというなら全然分かる。でも、mp3 は良くない。
もっとも、そのあたり調べてみたら…。
_HSP3備忘録
_oggファイルの読み込み - HSPTV!掲示板
_HSP3.7 新機能ハイライト
wav と ogg にしか対応してないというなら全然分かる。でも、mp3 は良くない。
もっとも、そのあたり調べてみたら…。
- そもそも HSP 界隈は ovplay.dll という .dll を利用して ogg再生するのが定番だった。
- hsp3dish も、HSP 3.7 からは hspogg.dll を使って ogg を利用できる旨がドキュメントに書いてある。
- そもそも hspogg.dll は結構昔から同梱されていた。不安定な部分があって、他のdllが使われることが多かったようではあるけど…。
_HSP3備忘録
_oggファイルの読み込み - HSPTV!掲示板
_HSP3.7 新機能ハイライト
◎ mp3は良くない :
せっかくだから、mp3が良くない理由もメモ。と言っても、mp3はギャップレス再生が難しいという、ただそれだけの話なのだけど。
mp3 って、元々は映像の音声部分を担当させるために作られた規格/音声フォーマットなので、映像のフレーム単位で時間情報が記録されているそうで。音声の長さがフレーム単位でキリのいい長さになってない場合、最初や最後にギャップ(無音部分)が入ってしまうので、ループ再生したり、再生終了と同時に別のmp3を再生したりすると、境目で「ブツッ」とノイズが入る。規格からしてそうなってるので仕方ない話なのだけど、ループしたり、曲が切り替わるたびに「ブツッ」とノイズが入ったら…ねえ…。かなり萎えますわな…。
だから、ゲーム制作ライブラリの類で「圧縮音声フォーマットはmp3のみ対応」なんて言われちゃうと困ってしまう。ギャップレス再生ができないファイル形式しか使えませんとかなんだソレ、どんな糞仕様だよ、という話に…。
その点、ogg なら、最初からちゃんと音声フォーマットとして規格が作られているので、サンプル数もちゃんと記録されてるし、再生処理がしっかり作ってあるならギャップレス再生だってできるわけで。
と言っても、Ruby + Gosu のようにoggすらちゃんとループ再生できない糞みたいなゲーム制作ライブラリも稀に存在するけれど…。アレは SDL が腐ってるんだろうか? まあ、Gosuの件は横に置いておくとして…。
そんなわけで、ogg はサポートしてるけど mp3 はサポートしてません、ということなら納得できるのだけど。逆はダメだよなと…。
mp3 って、元々は映像の音声部分を担当させるために作られた規格/音声フォーマットなので、映像のフレーム単位で時間情報が記録されているそうで。音声の長さがフレーム単位でキリのいい長さになってない場合、最初や最後にギャップ(無音部分)が入ってしまうので、ループ再生したり、再生終了と同時に別のmp3を再生したりすると、境目で「ブツッ」とノイズが入る。規格からしてそうなってるので仕方ない話なのだけど、ループしたり、曲が切り替わるたびに「ブツッ」とノイズが入ったら…ねえ…。かなり萎えますわな…。
だから、ゲーム制作ライブラリの類で「圧縮音声フォーマットはmp3のみ対応」なんて言われちゃうと困ってしまう。ギャップレス再生ができないファイル形式しか使えませんとかなんだソレ、どんな糞仕様だよ、という話に…。
その点、ogg なら、最初からちゃんと音声フォーマットとして規格が作られているので、サンプル数もちゃんと記録されてるし、再生処理がしっかり作ってあるならギャップレス再生だってできるわけで。
と言っても、Ruby + Gosu のようにoggすらちゃんとループ再生できない糞みたいなゲーム制作ライブラリも稀に存在するけれど…。アレは SDL が腐ってるんだろうか? まあ、Gosuの件は横に置いておくとして…。
そんなわけで、ogg はサポートしてるけど mp3 はサポートしてません、ということなら納得できるのだけど。逆はダメだよなと…。
◎ mp3でギャップレス再生できる事例 :
ちなみに、さすがにこれだけ mp3 が普及してしまうと、ギャップレス再生できないのはさすがにあかんやろ、ということで解決策も出てきて…。
mp3に変換するエンコーダ側で本来の音声の長さを mp3ファイルのどこかに独自情報として埋め込んでおいて、対応してるデコーダ側はその情報を読み取ってギャップレス再生させる、といったことも可能だそうで。mp3エンコーダとしてメジャーな LAME はそういう情報を埋め込んであると聞いた記憶が…。mp3をギャップレス再生できるソフトウェアは、そういった一手間を加えた実装になってるわけで。
もっとも、どのエンコーダが、どういう情報を、どこに記録してるのかが分からなければ、デコーダ側だって対応のしようがないし。
あるいは、エンコーダとデコーダが一体になってるアプリなら、「このアプリを使った時だけギャップレス再生ができます。他は知らんがな」となっちゃうし。 *1
だから、「mp3の再生に対応」と言われても、「それってどこまで対応してるの?」と不安になってしまう。そんなわけで、個人的には mp3 って嫌いなのでした。いやまあ、昔、mp3をループ再生させることになって苦労したからなのだけど…。
まあ、ループ再生できないならできないで、その旨最初からどこかに書いてあれば、それはそれでOKかなとも思うのですが。
例えば昔のPCエンジンのCD-ROMゲームはCD-DAでBGMを流したりしていたけれど、当時は奇麗に繋がるループ再生なんてできなかったから、曲の最初と最後が全然繋がってないBGMを作って済ませてた。状況さえ分かってれば、そのように逃げ道(?)はあるので…。できそうな感じで期待させておいて実はできないというパターンが一番困る…。できないなら「できない」と書いておいてほしい…。
mp3に変換するエンコーダ側で本来の音声の長さを mp3ファイルのどこかに独自情報として埋め込んでおいて、対応してるデコーダ側はその情報を読み取ってギャップレス再生させる、といったことも可能だそうで。mp3エンコーダとしてメジャーな LAME はそういう情報を埋め込んであると聞いた記憶が…。mp3をギャップレス再生できるソフトウェアは、そういった一手間を加えた実装になってるわけで。
もっとも、どのエンコーダが、どういう情報を、どこに記録してるのかが分からなければ、デコーダ側だって対応のしようがないし。
あるいは、エンコーダとデコーダが一体になってるアプリなら、「このアプリを使った時だけギャップレス再生ができます。他は知らんがな」となっちゃうし。 *1
だから、「mp3の再生に対応」と言われても、「それってどこまで対応してるの?」と不安になってしまう。そんなわけで、個人的には mp3 って嫌いなのでした。いやまあ、昔、mp3をループ再生させることになって苦労したからなのだけど…。
まあ、ループ再生できないならできないで、その旨最初からどこかに書いてあれば、それはそれでOKかなとも思うのですが。
例えば昔のPCエンジンのCD-ROMゲームはCD-DAでBGMを流したりしていたけれど、当時は奇麗に繋がるループ再生なんてできなかったから、曲の最初と最後が全然繋がってないBGMを作って済ませてた。状況さえ分かってれば、そのように逃げ道(?)はあるので…。できそうな感じで期待させておいて実はできないというパターンが一番困る…。できないなら「できない」と書いておいてほしい…。
*1: 昔の Adobe Flash がそんな感じの実装だった。LAME でエンコードしたmp3を再生させるとギャップレス再生できないけれど、Flash自身にwavを渡してmp3に変換、かつ .swf に内包して再生させると、ちゃんとギャップレス再生ができた。「このアプリで全部やる分には、ソレってできますよ。え? 他のソフトが変換したmp3? そんなもん知るか」みたいな。もっとも、後に LAME でエンコードしたmp3もギャップレス再生できるようになった記憶もあるけれど。アレは Flashプラグイン側が対応したのか、それとも LAME側が対応したのか、どっちなんだろう。
[ ツッコむ ]
以上です。