Javaにおけるサウンドの設計 (SEとBGMの実装)
前回の設計にてJavaにおける音声発声の実現方式を検討しました。
今回は「ゲームプログラミング [共通]」カテゴリで設計したサウンドフレームワークに合せて組み込んで行きたいと思います。
まずはいつものようにサンプルソースを作成してみたので、これを元にJava上での実現方式について説明して行きたいと思います。
■サンプルソース (2008.05.17.zip)
jarファイルの実行はWindows上の場合は大抵ダブルクリックにて実行可能ですが、『この実行は自己責任』にてお願いいたします。
今回のサンプルソースでは、自機のショット音の発声と、BGMの発声を実現しています。
(Windows上での実行の場合はボリュームコントロールで、WAVEとシンセサイザがそれぞれSE,BGMとなっているので注意してください。また、OSのサービスをチューニングしている事により、MIDIが発声しないケースがあるので、これも注意してください。この場合はプログラムの初期化にてエラーになると思われます)
【データ構成図】

今回は設計図が大きくなりすぎたので、PDFでの掲載にしました。Adobe Readerがインストールされているコンピュータにて観覧できます。もしもAdobe Readerがインストールされていない場合は、多少縮小したイメージとして、こちらを用意しました。【縮小版設計図】
【共通音情報からJava特有の音情報を持つ】
共通のカテゴリのサウンドフレームワーク設計では、音情報は非常にプリミティブな物でしたが、今回具体的にJavaで実現するにあたり、SE用の情報とBGM用の情報を実装しました。これらは各々「SoundSEItem」「SoundBGMItem」クラスとして実装し、基底となる音情報(SoundItem)から派生した形で実現しています。
SoundSEItemにはAudioClipクラスを内包し、SounBGMItemにはSequenceクラスを内包しています。
【サウンドデバイスクラスの実装】
「Javaにおけるサウンドの設計 (音声発声の実現方法検討)」の設計にて、SEとBGMの発声実現方法を設計したので、これらを各々を「SoundDeviceSE」「SoundDeviceBGM」クラスとして実装しました。これらのクラスは再生に必要となる音情報(SoundSEItem, SoundBGMItemクラス)を引数として処理を行います。メソッドには各々play/pause/stopメソッドがあり再生/一時停止/停止を実現します。しかしながら、SEに関してはJavaのAudioClipクラスが一時停止を行う仕様を持たないため、処理の中身はNOP(No OPeration)としています。
(AudioClipを使用しない実現方法に変更した場合はこの中身の実装を行うだけで一時停止ができる設計になっています。これは共通フレームワーク処理設計としての概念です)
【音管理に音情報を追加する】
今回のサンプルソースでは、音情報は自機のショット音をSE(.wav)として1つ、BGM音をBGM(.midi)として音管理クラスに登録しています。
この実装はJavaにおけるフレームワークとして「SoundID」クラスを実装し、これにenum情報として「ShipMissile」と「BGM1」というIDを追加しました。また、音管理であるSoundManagerクラスの初期化メソッドであるinitialize内にて、これら音情報を登録しています。
もしも今後音情報を追加する場合には、
1.SoundIDクラスに音のIDを追加する。
2.SoundManager.initialize内にaddメソッドを用いて音情報を登録する。
といった事を行うと、ゲーム中に使用する音声を登録できます。
【発声させる】
登録された音情報は、タスク処理内等で発声させることができます。
サンプルソースでは、ゲームの初期化が行われた直後にBGMとしてSoundID.BGM1を、自機となるPlayerTaskクラスの実行処理であるexecuteメソッド内のショットを発射する際にSoundID.ShipMissileをSoundManager.playメソッドにてそれぞれ発声させています。
◇ ◇ ◇
非常に安易な設計にて、Javaのサウンドフレームワークを実現してみましたが、もしも高度な音声処理を行う場合には、音の情報としてSoundItemに情報を追加し、発声処理としてSoundDeviceSE並びにSoundDeviceBGMに高度な発声処理を実現すればゲーム全体の処理(フレームワーク)の流れは、変更がないままゲームを作成することができると思います。
とりあえずこれまでの設計にて、単純ではありますがJava上にてシューティング、アクション、RPG、パズル…等の2D型TVゲームにおけるリアルタイム演算、入力、描画、発声という設計を行うことができました。
◇ ◇ ◇
今後はゲームのジャンルを設定し、ゲームデザインを行い、絵を描き、音を作曲し、プログラミングをし…という流れとなるのですが、以前、本ブログで書いた
【2008/02/20】
>このカテゴリー「ゲームプログラミング [Java] 」では「何かゲームを作ってみる」
>という指針を決めて、ゲームを作って行く方向でその都度必要な設計を説明して
>いこうと思います。(現時点では何も決めていないのですが、XNAの設計の説明の
>最中に決めていこうかと思います…)
という内容が結局決まりませんでした。(^^ゞ
…というよりも、正確には「多少素案はあるのですが、独りで作っているSample Action Game 3Dに手がかかりすぎて、こちらに時間がかけられない…」という状況になっています。(このような自作自演をここまで独りよがりでやっているのも、ある意味凄いとは思っているのですが…(爆))
当初の希望としてはこのブログでJava(でなくてもいいのですが)のプログラマーの方と何人か知り合いでもできて、このブログを通じて(ソースも公開して)、「なんか作れたらいいかなぁ~」なんて思いましたが、「世の中そうも甘くない。」という事を切に実感しましたw
(これも良い経験と思うことにします)
ということで、とりあえずではありますが、現状での本カテゴリーは「何か思いついたらJavaってみる」程度に抑えておこうかと思います。
今回は「ゲームプログラミング [共通]」カテゴリで設計したサウンドフレームワークに合せて組み込んで行きたいと思います。
まずはいつものようにサンプルソースを作成してみたので、これを元にJava上での実現方式について説明して行きたいと思います。
■サンプルソース (2008.05.17.zip)
【実行画面】
jarファイルの実行はWindows上の場合は大抵ダブルクリックにて実行可能ですが、『この実行は自己責任』にてお願いいたします。
今回のサンプルソースでは、自機のショット音の発声と、BGMの発声を実現しています。
(Windows上での実行の場合はボリュームコントロールで、WAVEとシンセサイザがそれぞれSE,BGMとなっているので注意してください。また、OSのサービスをチューニングしている事により、MIDIが発声しないケースがあるので、これも注意してください。この場合はプログラムの初期化にてエラーになると思われます)
【データ構成図】

今回は設計図が大きくなりすぎたので、PDFでの掲載にしました。Adobe Readerがインストールされているコンピュータにて観覧できます。もしもAdobe Readerがインストールされていない場合は、多少縮小したイメージとして、こちらを用意しました。【縮小版設計図】
【共通音情報からJava特有の音情報を持つ】
共通のカテゴリのサウンドフレームワーク設計では、音情報は非常にプリミティブな物でしたが、今回具体的にJavaで実現するにあたり、SE用の情報とBGM用の情報を実装しました。これらは各々「SoundSEItem」「SoundBGMItem」クラスとして実装し、基底となる音情報(SoundItem)から派生した形で実現しています。
SoundSEItemにはAudioClipクラスを内包し、SounBGMItemにはSequenceクラスを内包しています。
【サウンドデバイスクラスの実装】
「Javaにおけるサウンドの設計 (音声発声の実現方法検討)」の設計にて、SEとBGMの発声実現方法を設計したので、これらを各々を「SoundDeviceSE」「SoundDeviceBGM」クラスとして実装しました。これらのクラスは再生に必要となる音情報(SoundSEItem, SoundBGMItemクラス)を引数として処理を行います。メソッドには各々play/pause/stopメソッドがあり再生/一時停止/停止を実現します。しかしながら、SEに関してはJavaのAudioClipクラスが一時停止を行う仕様を持たないため、処理の中身はNOP(No OPeration)としています。
(AudioClipを使用しない実現方法に変更した場合はこの中身の実装を行うだけで一時停止ができる設計になっています。これは共通フレームワーク処理設計としての概念です)
【音管理に音情報を追加する】
今回のサンプルソースでは、音情報は自機のショット音をSE(.wav)として1つ、BGM音をBGM(.midi)として音管理クラスに登録しています。
この実装はJavaにおけるフレームワークとして「SoundID」クラスを実装し、これにenum情報として「ShipMissile」と「BGM1」というIDを追加しました。また、音管理であるSoundManagerクラスの初期化メソッドであるinitialize内にて、これら音情報を登録しています。
もしも今後音情報を追加する場合には、
1.SoundIDクラスに音のIDを追加する。
2.SoundManager.initialize内にaddメソッドを用いて音情報を登録する。
といった事を行うと、ゲーム中に使用する音声を登録できます。
【発声させる】
登録された音情報は、タスク処理内等で発声させることができます。
サンプルソースでは、ゲームの初期化が行われた直後にBGMとしてSoundID.BGM1を、自機となるPlayerTaskクラスの実行処理であるexecuteメソッド内のショットを発射する際にSoundID.ShipMissileをSoundManager.playメソッドにてそれぞれ発声させています。
◇ ◇ ◇
非常に安易な設計にて、Javaのサウンドフレームワークを実現してみましたが、もしも高度な音声処理を行う場合には、音の情報としてSoundItemに情報を追加し、発声処理としてSoundDeviceSE並びにSoundDeviceBGMに高度な発声処理を実現すればゲーム全体の処理(フレームワーク)の流れは、変更がないままゲームを作成することができると思います。
とりあえずこれまでの設計にて、単純ではありますがJava上にてシューティング、アクション、RPG、パズル…等の2D型TVゲームにおけるリアルタイム演算、入力、描画、発声という設計を行うことができました。
◇ ◇ ◇
今後はゲームのジャンルを設定し、ゲームデザインを行い、絵を描き、音を作曲し、プログラミングをし…という流れとなるのですが、以前、本ブログで書いた
【2008/02/20】
>このカテゴリー「ゲームプログラミング [Java] 」では「何かゲームを作ってみる」
>という指針を決めて、ゲームを作って行く方向でその都度必要な設計を説明して
>いこうと思います。(現時点では何も決めていないのですが、XNAの設計の説明の
>最中に決めていこうかと思います…)
という内容が結局決まりませんでした。(^^ゞ
…というよりも、正確には「多少素案はあるのですが、独りで作っているSample Action Game 3Dに手がかかりすぎて、こちらに時間がかけられない…」という状況になっています。(このような自作自演をここまで独りよがりでやっているのも、ある意味凄いとは思っているのですが…(爆))
当初の希望としてはこのブログでJava(でなくてもいいのですが)のプログラマーの方と何人か知り合いでもできて、このブログを通じて(ソースも公開して)、「なんか作れたらいいかなぁ~」なんて思いましたが、「世の中そうも甘くない。」という事を切に実感しましたw
(これも良い経験と思うことにします)
ということで、とりあえずではありますが、現状での本カテゴリーは「何か思いついたらJavaってみる」程度に抑えておこうかと思います。
コメント
管理人のみ閲覧できます
このコメントは管理人のみ閲覧できます
本当に申し訳ございません…
本コメントを2011/09/04に確認しました。
私の不備で管理人のみ閲覧可能コメントの通知をOFFにしていたので、気がつかなかった次第です。
11ヶ月も過ぎてしまったので、今更の返信は意味が無いと思いますので、この場をお借りして、お詫び致します。
申し訳ございませんでした。
私の不備で管理人のみ閲覧可能コメントの通知をOFFにしていたので、気がつかなかった次第です。
11ヶ月も過ぎてしまったので、今更の返信は意味が無いと思いますので、この場をお借りして、お詫び致します。
申し訳ございませんでした。
コメントの投稿
« 昔のゲームの想い出 [0053] 「レグルス」 [セガ] [1983] [アーケード] l Home l 昔のゲームの想い出 [0052] 「リブルラブル」 [ナムコ] [1983] [アーケード] »