Forme d'onde d'un signal audio

Résolu
hammasaidi Messages postés 28 Date d'inscription lundi 1 février 2010 Statut Membre Dernière intervention 21 avril 2010 - 15 févr. 2010 à 19:38
hammasaidi Messages postés 28 Date d'inscription lundi 1 février 2010 Statut Membre Dernière intervention 21 avril 2010 - 20 févr. 2010 à 00:35
bonjours,
j'ai un lecteur audio avec swing java et je suis bloqué dans la représentation de la forme d'onde de signal(audio)
merci pour vos aides
A voir également:

7 réponses

cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
16 févr. 2010 à 10:04
Bonjour,

Essaie d'être plus explicite, personnellement je n'ai pas compris ton problème.
3
hammasaidi Messages postés 28 Date d'inscription lundi 1 février 2010 Statut Membre Dernière intervention 21 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;

public Framework() {
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
maxX = screenSize.width - 50;
maxY = screenSize.height - 50;
makeNewWindow();

}

public void makeNewWindow() {


JFrame frame = new MyFrame(this);
numWindows++;
System.out.println("Number of windows: " + numWindows);






if (lastLocation != null) {
//Move the window over and down 40 pixels.
lastLocation.translate(40, 40);
if ((lastLocation.x > maxX) || (lastLocation.y > maxY)) {
lastLocation.setLocation(0, 0);
}
frame.setLocation(lastLocation);
} else {
lastLocation = frame.getLocation();
}

System.out.println("Frame location: " + lastLocation);
frame.setVisible(true);

}

//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
0
cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
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...

Même principe :

__ tampon 1 __ WavPlayer
/
WavFileReader ___ tampon 2 __ SignalDisplayer
\
-- tampon 3 __ 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!
0
hammasaidi Messages postés 28 Date d'inscription lundi 1 février 2010 Statut Membre Dernière intervention 21 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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
hammasaidi Messages postés 28 Date d'inscription lundi 1 février 2010 Statut Membre Dernière intervention 21 avril 2010
19 févr. 2010 à 00:08
salut,
j'ai remplacé l'instruction suivant dans mon code mais encore ne fonctionne pas
while(num Bytes Read != -1 && !stop Required)
0
cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
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.
0
hammasaidi Messages postés 28 Date d'inscription lundi 1 février 2010 Statut Membre Dernière intervention 21 avril 2010
20 févr. 2010 à 00:35
salut,
un grand merci pour votre aide
mais j'ai pas encore résolu mon pb
es que tu peux me guidé avec un exemple?
merci pour votre aide
0