IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Multimédia Java Discussion :

lancer simultanément 4 pistes sons


Sujet :

Multimédia Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    76
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 76
    Par défaut lancer simultanément 4 pistes sons
    Bonjour,

    Je travaille sur une BD interactive dans le cadre de mon projet tutoré de secondes années d'IUT multimédia. Je débute en Java.

    Voici mon probléme. La dernière planche de ma BD doit "générer" une chanson en prenant en compte des paramétres affecté par le lecteur tout au long de l'hitoire. Pour générer cette chanson, le programme récupére 4 pistes audio (une guitare, une basse, une baterie et un piano). Je dois ensuite lancer ces 4 pistes pour ne former qu'une seule chanson. Seulement mon probléme est qu'il y a un léger décalage de quelques centiéme de seconde, et du coup ça rend vraiment pas beau.

    Voici le contenu de mon code (simplifié pour les tests):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    public Planche46(String nom, boolean test)
    	{
    		choixSample();
    		th1 = new Thread(this);
    		th1.start();
    	}
     
    	/** cette méthode récupére les données
            * necessaire aux calculs pour selectionner
            * les samples des musiciens
            */
    	public void ChoixSample()
    	{
                             //divers calculs remplissant ses variables
    		smpGuitare = "musiques"+File.separator+"guitare.mp3";
    		smpBasse = "musiques"+File.separator+"basse.mp3";
    		smpPiano = "musiques"+File.separator+"piano.mp3";
    		smpDrum = "musiques"+File.separator+"drum.mp3";
    	}
     
    	public void run()
    	{
    		guitare = new Chargementduson (smpGuitare);
    		basse = new Chargementduson (smpBasse);
    		piano = new Chargementduson (smpPiano);
    		drum = new Chargementduson (smpDrum);
    	}
    et le contenu de la classe Chargementduson:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
     
     Player lecteur;
     public Chargementduson(String son) // constructeur
     {
          File fichier = new File(son);
          try
          {
    	lecteur = Manager.createPlayer(fichier.toURL());
          }
          catch (MediaException me) 
          { System.out.println("Probleme de chargement"); } 
          catch (IOException e)
          { System.out.println("Lecture du fichier son impossible"); }	
     
          lecteur.start();
    }
    voilà, comment faire pour que les pistes sont soient lancées vraiment simultanément (je tiens à dire que les enregistrement sont bien calées à l'aide de logiciel de traitement du son)

    Merci de votre aide.

  2. #2
    Membre chevronné Avatar de broumbroum
    Profil pro
    Inscrit en
    Août 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 406
    Par défaut ActionListener, audio multi-tracks
    c'est simple, il faut essayer d'implémenter l'interface actionListener pour chaque piste audio. Ensuite la classe Main devra appeler les ActionListeners implémentés en synchro. Techniquement les pistes vont se lancer à qqs "ms" l'une après l'autre ou dans un second temps tu poses une condition en TIMESTAMP dans chaque interface.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    class Main {
      static HashSet<ActionListener e> listeners = new HashSet();
      static void addActionListener(ActionListener l) { 
          listeners.add(l);
      }
      static void removeActionListener(ActionListener l) {
          listeners.remove(l);
      }
     
      private class PisteSonore implements ActionListener, Runnable {
           long startTime; URL file; AudioClip au;
           public PisteSonore(String file, long startTime) {
                this.startTime = startTime;
                this.file = new URL(file);
           }
     
           private void load() {
                au = Applet.newAudioClip(new URL(getClass().getResource(file)));
           }
     
           public void run() {
                  au.play();
           }
           public void actionPerformed(ActionEvent e) {
                load();
                while(System.currentTimeMillis() < startTime) {
                      // wait
                }
                new Thread(this).start()
            }
      }
      public static void main(String[] args) {
           long start = System.currentTimeMillis() + 5000; // 5 sec. delay
           PisteSonore p0 = new PisteSonore("maPiste.aiff", start);
           PisteSonore p1 = new PisteSonore("maPiste1.aiff", start);
           PisteSonore p2 = new PisteSonore("maPiste2.aiff", start);
           PisteSonore p3 = new PisteSonore("maPiste3.aiff", start);
           addActionListener(p0); addActionListener(p1); addActionListener(p2);
           addActionListener(p3);
           for(Iterator i = listeners.iterator(); i.hasNext()) // compte-a-rebours
                ((PisteSonore)i.next()).actionPerformed(null);
      }
    }
    Voilà.

  3. #3
    Membre confirmé
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    76
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 76
    Par défaut
    Et ici le Timestamp me sert à initialisé le comte à rebours qui va faire démarer toutes les pistes en même temps? Ou est-ce que je dois calculé le retard que prennent les pistes et rééquilibrer les choses?

  4. #4
    Membre chevronné Avatar de broumbroum
    Profil pro
    Inscrit en
    Août 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 406
    Par défaut
    ben c'est ce que je te propose de tester... normalement le retard sera évité grâce au timestamp.

Discussions similaires

  1. [WD17] lancer la numérisation de son document
    Par fr832 dans le forum WinDev
    Réponses: 3
    Dernier message: 09/08/2012, 00h59
  2. Problème python lancer un .exe dans son service windows python
    Par leyer dans le forum Général Python
    Réponses: 1
    Dernier message: 02/04/2010, 04h07
  3. Réponses: 2
    Dernier message: 10/06/2009, 13h08
  4. Lancer .exe Et Recuperer Son Handle
    Par ykamenski dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 03/09/2006, 21h16
  5. [batch]comment lancer un excel avec son mot de passe?
    Par victor.ward dans le forum Windows
    Réponses: 1
    Dernier message: 05/12/2005, 10h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo