Equalizerクラスを使って音質の調整を行う


Android 2.3からはイコライザやリバーブなどエフェクトをかけることが可能になりました。

今回はイコライザに関して取り上げようと思います。

「MediaPlayerで音楽を再生する」でMediaPlayerの使い方を理解していれば、任意の音楽にイコライザをかけることは簡単です。MediaPlayerに追加されたメソッドとEqualizerクラスを用いることで実現できます。

SDKの中のサンプルにあるApiDemosでイコライザ(Equalizer)とビジュアライザ(Visualizer)を使われています。

このSDKのサンプルではシークバー(SeekBar)を操作して、複数の周波数に対して操作していますが、今回はその中から実際にイコライズを行う箇所をピックアップして説明します

それでは続きへどうぞ

MediaPlayerクラスのgetAudioSessionIdメソッド

1
public int getAudioSessionId ()

SDK2.3(API9)から追加されたメソッドです。getAudioSessionIdメソッドはその名の通り、オーディオセッションIDを取得するメソッドです。

このオーディオセッションIDは、イコライザなどのエフェクトのクラスを生成する際に用いることになります。

android.media.audiofxパッケージ

こちらはSDK2.3(API9)から追加されたパッケージです。以下にエフェクトをMediaPlayerやAudioTrackに利用可能なエフェクトのクラスを示します。

android.media.audiofxパッケージにはこれらのクラス以外にエフェクトの変更を受け取るリスナや、設定をするためのクラスがあります。詳細はAndroidDevelopersのドキュメントを参照してください。

android.media.audiofxパッケージ内のクラスの一部

クラス名 概要
BassBoost 低音増強
EnvironmentalReverb 詳細な設定ができるリバーブ。ゲーム向け。
Equalizer イコライザ(中心周波数が定められているのでグラフィックイコライザ)
PresetReverb 音楽再生向けに6つのプリセットが選択できるリバーブ
Virtualizer ビジュアライザ

Equalizerクラス

コンストラクタは以下の通りです。

1
public Equalizer (int priority, int audioSession)

それではEqualizerクラスの使い方を見て行きましょう。まずはインスタンスの生成と有効化です。

1
2
mEqualizer = new Equalizer(0, mMediaPlayer.getAudioSessionId());
mEqualizer.setEnabled(true);

コンストラクタの第1引数の優先度は通常は0を設定し、audioSessionは先ほどのgetAudioSessionIdメソッドでMediaPlayerのオーディオセッションIDを取得して指定します。

そして、setEnableメソッドでエフェクトを有効にします。

次に実際に調整する方法ですが、まずはシステムでどの中心周波数が調整可能なのかを確認します。(ApiDemosだとTextViewに中心周波数を表示&シークバーのonProgressChangedの処理を定義している)

getNumberOfBandsメソッドでいくつ調整を行うことのできる中心周波数がいくつあるかを取得することができます。

1
public short getNumberOfBands ()

調整する周波数の指定は直接周波数を指定(60Hzとか250Hzとか)するのではなく、0や2の様に指定します。
例えばgetNumberOfBandsメソッドの戻り値が5であれば、0から4までの数字で指定することになります

それぞれがどの周波数を表しているかはgetCenterFreqメソッドで確認できます。
単位はミリHzです。

1
public int getCenterFreq (short band)

1の周波数が何かを確認したければ下記の様に呼び出します。

1
mEqualizer.getCenterFreq(1);

そしてsetBandLevelメソッドでレベルを調整します。

1
public void setBandLevel (short band, short level)

ここでLevelに指定することができる値はgetBandLevelRangeメソッドで取得する値の範囲です。

1
public short[] getBandLevelRange ()

添字0が範囲の最小値で、添字1が最大値となります。

サンプルコード

上記で説明してきた内容を一纏めにしたサンプルコードです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mediaPlayer_ = MediaPlayer.create(this, R.raw.music);
equalizer_ = new Equalizer(0, mediaPlayer_.getAudioSessionId());
equalizer_.setEnabled(true);
// 調整を行うことのできる中心周波数の数を確認
short bands = equalizer_.getNumberOfBands();
Log.d("EqualizerSample", "NumberOfBands: " + bands);
 
// 設定出来るレベルの下限、上限を確認
short minEQLevel = equalizer_.getBandLevelRange()[0];
short maxEQLevel = equalizer_.getBandLevelRange()[1];
Log.d("EqualizerSample", "minEQLevel: " + String.valueOf(minEQLevel));
Log.d("EqualizerSample", "maxEQLevel: " + String.valueOf(maxEQLevel));
 
for (short i = 0; i < bands; i++) {
    // 中心周波数の表示
    Log.d("EqualizerSample", i + String.valueOf(equalizer_.getCenterFreq(i) / 1000) + "Hz");
 
    // レベルを真ん中に設定
    equalizer_.setBandLevel(i, (short)((minEQLevel + maxEQLevel) / 2));
}

実行させたときのログです。5つの周波数に対して調整することが可能であり、setBandLevelの第2引数に指定することができる範囲は-1500〜1500ということが分かります。

また、それぞれの中心周波数は60Hz、1230Hz、2910Hz、33600Hz、414000Hzということも分かります。

2 Comments