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());
}
}
});
}
スライダーでマウスイベントが発生したらスライダーの値をゲインに設定することで、
音楽プレイヤーのようにイコライザーの設定ができるようになる。