Forme d'onde d'un signal audio [Résolu]

hammasaidi 28 Messages postés lundi 1 février 2010Date d'inscription 21 avril 2010 Dernière intervention - 15 févr. 2010 à 19:38 - Dernière réponse : hammasaidi 28 Messages postés lundi 1 février 2010Date d'inscription 21 avril 2010 Dernière intervention
- 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
Afficher la suite 

7 réponses

Répondre au sujet
cs_jojolemariole 519 Messages postés mercredi 21 mars 2007Date d'inscription 19 décembre 2016 Dernière intervention - 16 févr. 2010 à 10:04
+3
Utile
Bonjour,

Essaie d'être plus explicite, personnellement je n'ai pas compris ton problème.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_jojolemariole
hammasaidi 28 Messages postés lundi 1 février 2010Date d'inscription 21 avril 2010 Dernière intervention - 16 févr. 2010 à 11:43
0
Utile
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
Commenter la réponse de hammasaidi
cs_jojolemariole 519 Messages postés mercredi 21 mars 2007Date d'inscription 19 décembre 2016 Dernière intervention - 18 févr. 2010 à 16:13
0
Utile
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!
Commenter la réponse de cs_jojolemariole
hammasaidi 28 Messages postés lundi 1 février 2010Date d'inscription 21 avril 2010 Dernière intervention - 18 févr. 2010 à 23:15
0
Utile
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
Commenter la réponse de hammasaidi
hammasaidi 28 Messages postés lundi 1 février 2010Date d'inscription 21 avril 2010 Dernière intervention - 19 févr. 2010 à 00:08
0
Utile
salut,
j'ai remplacé l'instruction suivant dans mon code mais encore ne fonctionne pas
while(num Bytes Read != -1 && !stop Required)
Commenter la réponse de hammasaidi
cs_jojolemariole 519 Messages postés mercredi 21 mars 2007Date d'inscription 19 décembre 2016 Dernière intervention - 19 févr. 2010 à 09:51
0
Utile
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.
Commenter la réponse de cs_jojolemariole
hammasaidi 28 Messages postés lundi 1 février 2010Date d'inscription 21 avril 2010 Dernière intervention - 20 févr. 2010 à 00:35
0
Utile
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
Commenter la réponse de hammasaidi

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.