Visualiseur Audio avec JavaFX

RĂ©sultat

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;
}

Arborescence du projet

Commentaires