Javaにおけるサウンドの設計 (Javaのサポートしているデータファイルについて)
前回挙げた共通のフレームワークのサンプルはJavaのソースではありましたが、実際の音声発声を行う部分の検討は行いませんでした。これは言語をニュートラルに考えた場合に発声の仕組みが異るためです。
今回は現時点のJavaがサポートしている音声発声サウンドライブラリを用いて実装を検討してみたいと思います。
まず、前回では音声にはSE並びにBGMがあることを説明しました。そして、これらの音声ファイルにはWAVE/MIDI/MP3等のデータフォーマットがあることも説明しました。
Javaがサポートしている音声ファイルのフォーマットは大きく分けて2つの系列があり、波形データ系とコマンドデータ系に分けられます。
以下に概要を説明たいと思います。ただし、これらのデータフォーマットについて詳細な説明を行うと、とても大変なので、ここでは少し大雑把な説明を行いたいと思います。
【波形データ系】
俗に言う「生音」「自然音」のデータを表し、例えば人の声やCDの音源がコレに当ります。音を波形(WAVE)データで示す事からこのように呼ばれたりします。
Windows系のOSでは「.wav」の音声ファイルがこの系列になり、Macintosh系のOSでは「AIFF」、Solaris系でX端末とかを使っている方ならば/dev/audioで「.au」と言ったところになります。
Javaではこれらを「.wav」「.au」「AIFF」のファイルフォーマットとしてサポートしています。
波形データ形式の特徴は、「自然界の音が記録できる」「データ量が多い(=ファイルサイズが大きい)」というようになっています。特に「データ量が多い」事から、場合によりプログラムが処理を行う際に(メモリの載せて)再生するデータを調整しなければならない、配布方法を検討する必要がでてきます。
【コマンドデータ系】
「楽器に対するコマンド」のデータを表します。これはデータファイルそのものには音の情報が入っているのではなく、例えば「ピアノの音を1秒間鳴らす」というような「コマンド」がファイル内に記述されています。このためファイル内に具体的な音のデータが格納されている訳ではないため、発声させるデバイス(これはゲームにおけるPC)の能力により音が変わります。つまりAさんのコンピュータとBさんのコンピュータで同じように再生しても、コンピュータのサウンド構成により聴こえる音が多少違うことになります。これは「自分のギターで弾いた音と他人のギターで弾いた音との比較」というような例えと一緒で、当然個体差があるので、同じ曲であっても若干違って聴こえてくる…というようなものです。
また、これらコマンドはピアノやギター等のおおよその楽器の使用を前提とされており、それら以外の楽器に対する発声をサポートしていません(例えば「オタマを使って窓を叩く音を1秒鳴らす」というようなコマンドは発行できません)。このため、音が限定されます。
Javaではこれらを「.midi(.mid)」「RMF(Rich Music Format)」のファイルフォーマットとしてサポートします。
前者のMIDIはデスクトップミュージックの世界ではデファクトスタンダードな地位を築いているので、どのOSからもMIDIとして再生することができます。
後者はインターネット上での再生に適しているそうなのですが、私はあまりこのフォーマットを知りません。(このフォーマットの存在がある…という程度)
コマンドデータ形式の特徴は「再生するコンピュータにより音質が変化する(例えば同じピアノでもコンピュータにより若干音が違って聴こえたりします)」「データ量が波形データに比べて圧倒的に小さい」というようになっています。またMIDIにおけるコマンドを理解していれば、コマンドを用いて再生速度(テンポ)、ボリューム等をプログラム上で「少ないオーバーヘッドで調節する事が可能」となります。
◇ ◇ ◇
このように2つの系列を持つフォーマットをJavaはサポートしているのですが、一般的にコマンドデータ系は生音を発するSEには向いていないとされており(一応MIDIにはレーザーの音やハンドクラップ等はありますが、バラエティには富んでいません)、SE発声には大抵波形データ系を用いる事になります。
BGM発声は波形データ系/コマンド系のどちらにも適していますが、曲の長いBGMになるとBGMのデータファイルのみで、CD 1枚相当のデータ量等になってしまいます。このため波形データを圧縮するフォーマットとして、MP3等のデータフォーマットがあるのですが、Javaの標準ライブラリではこのフォーマットをサポートしていません。MP3等の高圧縮音声データを再生する場合はフリーウェアのライブラリにて再生すると良いと思います(作者の方に許可を頂いて)。本設計ではJavaの標準ライブラリのみを使用した設計を検討したいと思うので、便利なフリーウェアのライブラリを用いた設計は行わない事にします。
【まとめ】
データフォーマットについて色々と述べましたが、JavaでサポートしているデータファイルやSE/BGMに適している分類を一覧すると以下のようになります。
◇ ◇ ◇
これらの事から、本ブログでの「Java上での設計」としては、「SEには波形データ系」を「BGMにはコマンドデータ系」を用いた設計を行って行こうと考えます。
次回よりこれらの発声の実装方法を検討して行こうと思います。
今回は現時点のJavaがサポートしている音声発声サウンドライブラリを用いて実装を検討してみたいと思います。
まず、前回では音声にはSE並びにBGMがあることを説明しました。そして、これらの音声ファイルにはWAVE/MIDI/MP3等のデータフォーマットがあることも説明しました。
Javaがサポートしている音声ファイルのフォーマットは大きく分けて2つの系列があり、波形データ系とコマンドデータ系に分けられます。
以下に概要を説明たいと思います。ただし、これらのデータフォーマットについて詳細な説明を行うと、とても大変なので、ここでは少し大雑把な説明を行いたいと思います。
【波形データ系】
俗に言う「生音」「自然音」のデータを表し、例えば人の声やCDの音源がコレに当ります。音を波形(WAVE)データで示す事からこのように呼ばれたりします。
Windows系のOSでは「.wav」の音声ファイルがこの系列になり、Macintosh系のOSでは「AIFF」、Solaris系でX端末とかを使っている方ならば/dev/audioで「.au」と言ったところになります。
Javaではこれらを「.wav」「.au」「AIFF」のファイルフォーマットとしてサポートしています。
波形データ形式の特徴は、「自然界の音が記録できる」「データ量が多い(=ファイルサイズが大きい)」というようになっています。特に「データ量が多い」事から、場合によりプログラムが処理を行う際に(メモリの載せて)再生するデータを調整しなければならない、配布方法を検討する必要がでてきます。
【コマンドデータ系】
「楽器に対するコマンド」のデータを表します。これはデータファイルそのものには音の情報が入っているのではなく、例えば「ピアノの音を1秒間鳴らす」というような「コマンド」がファイル内に記述されています。このためファイル内に具体的な音のデータが格納されている訳ではないため、発声させるデバイス(これはゲームにおけるPC)の能力により音が変わります。つまりAさんのコンピュータとBさんのコンピュータで同じように再生しても、コンピュータのサウンド構成により聴こえる音が多少違うことになります。これは「自分のギターで弾いた音と他人のギターで弾いた音との比較」というような例えと一緒で、当然個体差があるので、同じ曲であっても若干違って聴こえてくる…というようなものです。
また、これらコマンドはピアノやギター等のおおよその楽器の使用を前提とされており、それら以外の楽器に対する発声をサポートしていません(例えば「オタマを使って窓を叩く音を1秒鳴らす」というようなコマンドは発行できません)。このため、音が限定されます。
Javaではこれらを「.midi(.mid)」「RMF(Rich Music Format)」のファイルフォーマットとしてサポートします。
前者のMIDIはデスクトップミュージックの世界ではデファクトスタンダードな地位を築いているので、どのOSからもMIDIとして再生することができます。
後者はインターネット上での再生に適しているそうなのですが、私はあまりこのフォーマットを知りません。(このフォーマットの存在がある…という程度)
コマンドデータ形式の特徴は「再生するコンピュータにより音質が変化する(例えば同じピアノでもコンピュータにより若干音が違って聴こえたりします)」「データ量が波形データに比べて圧倒的に小さい」というようになっています。またMIDIにおけるコマンドを理解していれば、コマンドを用いて再生速度(テンポ)、ボリューム等をプログラム上で「少ないオーバーヘッドで調節する事が可能」となります。
◇ ◇ ◇
このように2つの系列を持つフォーマットをJavaはサポートしているのですが、一般的にコマンドデータ系は生音を発するSEには向いていないとされており(一応MIDIにはレーザーの音やハンドクラップ等はありますが、バラエティには富んでいません)、SE発声には大抵波形データ系を用いる事になります。
BGM発声は波形データ系/コマンド系のどちらにも適していますが、曲の長いBGMになるとBGMのデータファイルのみで、CD 1枚相当のデータ量等になってしまいます。このため波形データを圧縮するフォーマットとして、MP3等のデータフォーマットがあるのですが、Javaの標準ライブラリではこのフォーマットをサポートしていません。MP3等の高圧縮音声データを再生する場合はフリーウェアのライブラリにて再生すると良いと思います(作者の方に許可を頂いて)。本設計ではJavaの標準ライブラリのみを使用した設計を検討したいと思うので、便利なフリーウェアのライブラリを用いた設計は行わない事にします。
【まとめ】
データフォーマットについて色々と述べましたが、JavaでサポートしているデータファイルやSE/BGMに適している分類を一覧すると以下のようになります。
波形データ系 | コマンドデータ系 | |
ファイル拡張子 | .wav/.au | .midi(.mid) |
音の種別 | 自然音 | 楽器音 |
再生による音質の変化 | 基本的に変化無し | コンピュータにより変化する |
データサイズ | とてつもなく大きい | 小さい |
ボリューム等の プログラマブル 処理負荷 | とても大きい | 小さい |
SEとして | ○ 向いている | × 向いていない |
BGMとして | ○ 向いている (ただしデータサイズの 問題があるので△) | ○ 向いている |
◇ ◇ ◇
これらの事から、本ブログでの「Java上での設計」としては、「SEには波形データ系」を「BGMにはコマンドデータ系」を用いた設計を行って行こうと考えます。
次回よりこれらの発声の実装方法を検討して行こうと思います。
コメント
コメントの投稿