Audio spectrum JavaFX
package fr.ronanlefichant.audiospectrum;
import java.io.File;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.BarChart;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.chart.XYChart.Data;
import javafx.scene.layout.StackPane;
import javafx.scene.media.AudioSpectrumListener;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.stage.Stage;
/**
* JavaFX App
*/
public class App extends Application {
@Override
public void start(Stage stage) {
/* Fichier audio */
String audioFile = "fichier.mp3";
/* Media et MediaPlayer JavaFX */
Media media = new Media(new File(audioFile).toURI().toString());
MediaPlayer mediaPlayer = new MediaPlayer(media);
/* Lecture automatique au démarrage */
mediaPlayer.setAutoPlay(true);
/* Les deux axes X et Y */
CategoryAxis xAxis = new CategoryAxis();
NumberAxis yAxis = new NumberAxis();
/* Le diagramme à barres non animé */
BarChart<String, Number> barChart = new BarChart<>(xAxis, yAxis);
barChart.setAnimated(false);
/* Les deux séries de données du haut et du bas */
XYChart.Series<String, Number> topSeries = new XYChart.Series<>();
XYChart.Series<String, Number> bottomSeries = new XYChart.Series<>();
/* Ajoute les séries au diagramme à barres */
barChart.getData().add(topSeries);
barChart.getData().add(bottomSeries);
/* Listener des données audio */
mediaPlayer.setAudioSpectrumListener(new AudioSpectrumListener() {
@Override
public void spectrumDataUpdate(double timestamp, double duration, float[] magnitudes, float[] phases) {
/* Supprime les anciennes données */
topSeries.getData().clear();
bottomSeries.getData().clear();
/*
* Ajoute les magnitudes (taille 128) au diagramme -60 est la valeur minimale de
* la magnitude
*/
for (int i = 0; i < magnitudes.length; i++) {
/* Partie haute positive */
topSeries.getData().add(new Data<String, Number>(String.valueOf(i), magnitudes[i] + 60));
/* Partie basse négative */
bottomSeries.getData().add(new Data<String, Number>(String.valueOf(i), -(magnitudes[i] + 60)));
}
}
});
StackPane root = new StackPane(barChart);
Scene scene = new Scene(root, 640, 480);
/* Style CSS */
scene.getStylesheets().add("style.css");
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch();
}
}
Style CSS du diagramme
.root {
/* Couleur du fond de l'élément racine */
-fx-background-color: white;
}
.bar-chart {
/* Toutes les légendes et grilles du diagramme sont invisibles */
-fx-alternative-row-visible: false;
-fx-alternative-column-visible: false;
-fx-horizontal-grid-lines-visible: false;
-fx-vertical-grid-lines-visible: false;
-fx-horizontal-zero-line-visible: false;
-fx-vertical-zero-line-visible: false;
-fx-legend-visible: false;
}
.chart-plot-background {
/* Fond du diagramme transparent */
-fx-background-color: transparent;
}
.axis {
/* Axes invisibles */
-fx-border-color: transparent;
-fx-tick-mark-visible: false;
-fx-minor-tick-visible: false;
-fx-tick-labels-visible: false;
}
.default-color0.chart-bar {
/* Couleur des barres de la partie haute du diagramme */
-fx-bar-fill: red;
}
.default-color1.chart-bar {
/* Couleur des barres de la partie basse du diagramme */
-fx-bar-fill: orange;
}
Commentaires
Enregistrer un commentaire