JavaFXを使ってミュージックプレイヤーを作った際にイコライザを試したのでメモ
開発環境
- Java (1.8.0_40)
- JavaFX
音楽ファイルの読み込み
まずは音楽ファイルを読み込む。
サポートされているのはWAV, MP3, MP4。
File file = new File("FilePath");
Media media = new Media(file.toURI().toString());
MediaPlayer mediaPlayer = new MediaPlayer(media);
イコライザの設定
JavaFXのMediaPlayerではデフォルトでイコライザが実装されている。
MediaPlayer#getAudioEqualizerでMediaPlayerに関連付けられているAudioEqualizerを取得できる。
AudioEqualizer#getBandsで設定されているイコライザのリストを取得できる。
AudioEqualizer aq = mediaPlayer.getAudioEqualizer();
ObservableList<EqualizerBand> bands = aq.getBands();
このObervableListにはデフォルトで10のバンドセットが用意されている。
公式のAPIドキュメントより以下がデフォルトの設定。
それぞれのバンドセットに対するゲインはデフォルトで0dB。
| バンド・インデックス | 中心周波数(Hz) | 帯域幅(Hz) |
|---|---|---|
| 0 | 32 | 19 |
| 1 | 64 | 39 |
| 2 | 125 | 78 |
| 3 | 250 | 156 |
| 4 | 500 | 312 |
| 5 | 1000 | 625 |
| 6 | 2000 | 1250 |
| 7 | 4000 | 2500 |
| 8 | 8000 | 5000 |
| 9 | 16000 | 10000 |
例えば500Hz帯のゲインを10dBに設定したい場合は
bands.get(4).setGain(10);
このバンドセットはデフォルトなので、これに従う必要はない。
独自のバンドセットを定義することも可能。
例えば、3kHzを中心に1kHzの帯域幅で10dBのゲインを持つバンドセットのみを設定する場合
bands.removeAll(bands);
bands.add(new EqualizerBand(3000, 1000, 10));
一度ObservableListの中身を削除した後、新しいEqualizerBandを追加することで可能。
GUIとの連携
変更した値はリアルタイムに適応されるので、
FXMLでスライダーを設置して曲を再生しながらスライダーによる変更などもできる。
<Slider fx:id="slider32" max="12.0" min="-24.0" orientation="VERTICAL" />
設定できるゲインの値が-24dBから12dBまでなので、上記のようにスライダーを設置して
@FXML
private Slider slider32;
@Override
public void initialize(URL location, ResourceBundle resources) {
slider32.addEventFilter(MouseEvent.ANY, new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
if (event.getEventType() == MouseEvent.MOUSE_RELEASED || event.getEventType() == MouseEvent.MOUSE_DRAGGED) {
AudioEqualizer aq = mediaPlayer.getAudioEqualizer();
ObservableList<EqualizerBand> bands = aq.getBands();
bands.get(0).setGain(slider32.getValue());
}
}
});
}
スライダーでマウスイベントが発生したらスライダーの値をゲインに設定することで、
音楽プレイヤーのようにイコライザーの設定ができるようになる。