hammasaidi
Messages postés28Date d'inscriptionlundi 1 février 2010StatutMembreDernière intervention21 avril 2010 16 févr. 2010 à 11:43
bonjour,
mon problème c'es de tracer la forme d'onde ou bien le spectre du signal ( amplitude fonction de temps )
le traçage se fait automatiquement en tant que le son existe dans le Player
/**
* @(#)Framework.java
*
*
* @author
* @version 1.00 2010/1/3
*/
import java.io.File;
import javax.swing.JLabel;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileFilter;
import javax.swing.event.MouseInputAdapter;
import javax.swing.event.*;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.*;
import javax.swing.SwingUtilities;
import javax.swing.filechooser.*;
import javax.swing.JSlider;
import javax.swing.JOptionPane;
import java.io.*;
import javax.sound.sampled.*;
import java.awt.*;
import java.awt.event.*;
/* Framework.java requires no other files. */
public class Framework extends WindowAdapter {
public int numWindows = 0;
private Point lastLocation = null;
private int maxX = 500;
private int maxY = 500;
//This method must be evoked from the event-dispatching thread.
public void quit(JFrame frame) {
if (quitConfirmed(frame)) {
System.out.println("Quitting.");
System.exit(0);
}
System.out.println("Quit operation not confirmed; staying alive.");
}
public void windowClosed(WindowEvent e) {
numWindows--;
System.out.println("Number of windows = " + numWindows);
if (numWindows
cs_jojolemariole
Messages postés519Date d'inscriptionmercredi 21 mars 2007StatutMembreDernière intervention19 décembre 201625 18 févr. 2010 à 16:13
Salut,
J'ai regardé rapidement ton petit logiciel. Dans l'ensemble, il ne me parait pas bien conçu.
La partie pour la lecture des samples wav est ok.
La méthode stop() sur les Threads est dépréciée, ce n'est pas pour rien. Evite de l'appeler (tu peux mettre une condition dans la boucle while de lecture, par exemple). Du genre : "while (numBytesRead != -1 && !stopRequired)".
---
Pour la partie conception, je te suggère fortement d'isoler deux objets importants dans le traitement du signal (sonore en particulier) : MODULE et BUFFER.
Dans un lecteur de fichier wav tout simple on peut distinguer 2 modules :
un lecteur de fichier wav : WavFileReader par exemple
une module de lecture des samples : WavPlayer par exemple
Ensuite, étudie le patron de conception producteur/consommateur. Dans ce cas, le producteur est le WavFileReader et le consommateur est le WavPlayer. Dans notre cas, le WavFileReader et le WavPlayer sont connectés par un tampon, dans lequel le WavPlayer lit et le WavFileReader écrit.
Suivant le même principe, tu peux faire un afficheur de signal ou de spectre : SignalDisplayer, SpectrumDisplayer...
Ensuite il faut savoir que la lecture de wav est synchronisée automatiquement, mais pas les autres modules de sortie que tu pourras ajouter, à toi de faire en sorte qu'ils soient synchronisés.
---
Sinon, si tu veux faire simple. Tu peux donner des instructions de dessin dans la méthode play :
---
int bufferSize = this.format.getFrameSize()
* Math.round(this.format.getSampleRate() / 10);
[...]
source.read(buffer, 0, buffer.length); -> le buffer contient 1/10s de son wav sous forme de bytes.
Il faut en extraire les samples (en général 2 bytes / sample / channel, mais ça dépend du format du fichier). Et les envoyer à ton canva pour tracer le signal.
Pour le spectre, c'est plus compliqué, il faut effectuer une transformation de Fourier rapide (FFT). Tu pourras trouver plusieurs algorithmes et implémentations en Java sur le net.
J'ai moi-même développé une maquette de lecteur wav / mp3 en Java donc je sais de quoi je parle. Bonne chance!
hammasaidi
Messages postés28Date d'inscriptionlundi 1 février 2010StatutMembreDernière intervention21 avril 2010 18 févr. 2010 à 23:15
bonjour,
merci pour les indications
mais es que vous pouvez m'aider pour visualisé le spectre ou le waveform du signal depuis mon code
merci d'avance pour votre aide
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_jojolemariole
Messages postés519Date d'inscriptionmercredi 21 mars 2007StatutMembreDernière intervention19 décembre 201625 19 févr. 2010 à 09:51
Salut,
Il faut que tu crées un attribut "stopRequired" (tu l'appelles comme tu veux) dans ton module de lecture. Tu l'initialises à false. Quand tu commences la lecture tu le passes à false, et quant tu cliques sur "Stop" tu le passes à true. De cette manière la boucle de lecture "while(...)" se terminera d'elle-même et il n'y a pas besoin de stopper le thread.
Sinon pour l'affichage du signal, qu'est-ce que tu ne sais pas faire? Je vois que tu sais déjà tracer des lignes, il faut juste convertir chaque sample en float. Tu peux faire simple et approximatif en considérant uniquement l'octet de poids fort de chaque sample (une valeur entre -128 et 127). C'est déjà assez précis. Ensuite tu rejoins chaque sample par une ligne et ça te fait une courbe.
Cet article t'expliques comment sont organisés les bytes du signal wav en fonction du format : http://fr.wikipedia.org/wiki/WAVEform_audio_format. Notamment si les son est sterero tu as 2 signaux distincts.