Javaにおけるサウンドの設計 (音声発声の実現方法検討)
前回の設計にてSE発声は波形データ(.wav、もしくは.au)で、BGM発声はコマンドデータ(.midi)で実現する方針を決めました。
今回はこれらの再生方法について検討して行きたいと思います。
【SE発声の検討】
まず、SE発声の実現方法ですが、数ある発声方法の中でシンプル(と私は思っている)な方法にAudioClipクラスを使用するという方法があるので、これを検討してみます。
このクラスはAppletクラスのstaticメソッドnewAudioClipを用いれば、.wav(.au)ファイルを指定してAudioClipクラスを取得することができます。
そしてファイルですが、本設計では「音声ファイルはビットマップの時同様にJARファイルの中にある」ものとします。
newAduioClipの呼び出しにはURLオブジェクトを渡す必要があるので、2/2の「ビットマップファイルの読み込み」の時に説明したようにJARファイル内の.wavファイルのパスを取得して、これを渡します。
このクラスが取得できれば再生/停止は至極簡単で、それぞれメソッドのplay/stopにて実現できます。
【BGM発声の検討】
次にBGM発声の実現方法ですが、MIDIの発声にはSequenceクラスとSequencerクラスを用いて再生できます。前者のSequenceクラスはMIDIの情報を持つクラス、後者のSequencerクラスはSequenceクラスの情報を用いてMIDIを発声させる機能という担当となります。
これらクラスはMidiSystemクラスを用いて取得することができ、それぞれ
・Sequence → MidiSystem.getSequence
・Sequencer → MidiSystem.getSequencer
にて取得します。そして、発声にはSequencerクラスのメソッドsetSequenceを用いて引数にSequenceクラスを設定します。
(どれも"Sequence"という似た文字を用いるので、少し分り辛いですね)
そしてMIDI情報となる、Sequenceクラスを取得するMidiSystem.getSequenceメソッドの引数にはMIDIファイルとなるURL(やFile)があるので、これもSEの音声ファイル同様、JARファイル内の.midiファイルのパスを取得して、これを渡します。
このクラスが取得できれば再生/停止はSequencerクラスのstart/stopメソッドにて実現します。
Sequencerクラスは再生開始位置をミリ秒レベルで細かく設定でき、setMicrosecondPositionメソッドにて設定できます。
4/25の説明で「MIDIファイルのようなトラック先頭には無音を入れる(べき)仕様(これはMIDIモジュールの初期化を行うためとされています)のファイルであるが、先頭の無音をスキップ(できる場合はしたい)したいケース」という説明を行いましたが、この仕様をこのメソッドにて実現できます。
また、BGMのようなループする曲を実現する場合にはSequencerクラスのsetLoopCountメソッドにて実現できます。(これはJ2SE5.0から提供されたメソッドなので、現時点では比較的新しいメソッドです)
【まとめ】
まずはこのような感じですが、SE(.wav)/BGM(.midi)の発声方法を検討しました。
この設計をイメージにして表すと、

のような感じとなります。
次回は「ゲームプログラミング [共通]」カテゴリで設計したサウンドのフレームワークに合せて組み込んでみたいと思います。
今回はこれらの再生方法について検討して行きたいと思います。
【SE発声の検討】
まず、SE発声の実現方法ですが、数ある発声方法の中でシンプル(と私は思っている)な方法にAudioClipクラスを使用するという方法があるので、これを検討してみます。
このクラスはAppletクラスのstaticメソッドnewAudioClipを用いれば、.wav(.au)ファイルを指定してAudioClipクラスを取得することができます。
そしてファイルですが、本設計では「音声ファイルはビットマップの時同様にJARファイルの中にある」ものとします。
newAduioClipの呼び出しにはURLオブジェクトを渡す必要があるので、2/2の「ビットマップファイルの読み込み」の時に説明したようにJARファイル内の.wavファイルのパスを取得して、これを渡します。
このクラスが取得できれば再生/停止は至極簡単で、それぞれメソッドのplay/stopにて実現できます。
【BGM発声の検討】
次にBGM発声の実現方法ですが、MIDIの発声にはSequenceクラスとSequencerクラスを用いて再生できます。前者のSequenceクラスはMIDIの情報を持つクラス、後者のSequencerクラスはSequenceクラスの情報を用いてMIDIを発声させる機能という担当となります。
これらクラスはMidiSystemクラスを用いて取得することができ、それぞれ
・Sequence → MidiSystem.getSequence
・Sequencer → MidiSystem.getSequencer
にて取得します。そして、発声にはSequencerクラスのメソッドsetSequenceを用いて引数にSequenceクラスを設定します。
(どれも"Sequence"という似た文字を用いるので、少し分り辛いですね)
そしてMIDI情報となる、Sequenceクラスを取得するMidiSystem.getSequenceメソッドの引数にはMIDIファイルとなるURL(やFile)があるので、これもSEの音声ファイル同様、JARファイル内の.midiファイルのパスを取得して、これを渡します。
このクラスが取得できれば再生/停止はSequencerクラスのstart/stopメソッドにて実現します。
Sequencerクラスは再生開始位置をミリ秒レベルで細かく設定でき、setMicrosecondPositionメソッドにて設定できます。
4/25の説明で「MIDIファイルのようなトラック先頭には無音を入れる(べき)仕様(これはMIDIモジュールの初期化を行うためとされています)のファイルであるが、先頭の無音をスキップ(できる場合はしたい)したいケース」という説明を行いましたが、この仕様をこのメソッドにて実現できます。
また、BGMのようなループする曲を実現する場合にはSequencerクラスのsetLoopCountメソッドにて実現できます。(これはJ2SE5.0から提供されたメソッドなので、現時点では比較的新しいメソッドです)
【まとめ】
まずはこのような感じですが、SE(.wav)/BGM(.midi)の発声方法を検討しました。
この設計をイメージにして表すと、

のような感じとなります。
次回は「ゲームプログラミング [共通]」カテゴリで設計したサウンドのフレームワークに合せて組み込んでみたいと思います。
コメント
コメントの投稿
« 昔のゲームの想い出 [0051] 「ファイナライザー」 [コナミ] [1985] [アーケード] l Home l 昔のゲームの想い出 (番外編) [0001] »