begin process at 2012 02 11 14:25:14
  Trouver un code source :
 
dans
 
Accueil > Forum > 

JAVA / J2EE / J2ME

 > 

Multimédia

 > 

Audio

 > 

Problème de rapidité avec javax.sound.midi.Synthesizer


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Problème de rapidité avec javax.sound.midi.Synthesizer

mercredi 14 février 2007 à 22:55:24 | Problème de rapidité avec javax.sound.midi.Synthesizer

qhhu

Bonjour a tous!
mon problème vient de la: J'ai crée un mini-"simulateur" de batterie qui joue un son (de batterie^^) quant j'appuie sur une certaine touche. Jusque la ca va. Mais le prob c'est que quant j'appuie sur une touche, le son se déclenche, mais avec un temps de retard... et du coup , ca casse tout le rythme! N'y aurait-il pas un moyen de rendre tout ca un peu plus rapide?? J'utilise javax.sound.midi.Synthetizer.

Merci d'avance
jeudi 15 février 2007 à 06:52:39 | Re : Problème de rapidité avec javax.sound.midi.Synthesizer

DARKSIDIOUS

Membre Club Administrateur CodeS-SourceS

Bah si tu nous montre pas le code, ca va être dur de te dire ce qui peut être optimisé...

De même, utilise des outils de profiler afin de voir les parties de ton prog qui doivent être optimisée (celle où ton code passe le plus de temps).

Utilise-tu des threads ? Car sans threads, ton application doit attendre qu'une tâche soit finie avant d'en lancer une autre, ca peut venir de là si tu fait des traitements lourds avant de lancer ton son !

jeudi 15 février 2007 à 17:02:08 | Re : Problème de rapidité avec javax.sound.midi.Synthesizer

qhhu

lol! Oui pardon j'ai pas réfléchi...
Le voici:

import
javax.sound.midi.*;
import java.awt.event.*;
import javax.swing.*;
publicclass test extends JFrame{
    ShortMessage message;
    Synthesizer synth;
    Receiver receiver;
    int charleston = 174;
    int grossecaisse = 171;
    int caisseclaire = 166;
    public test(){
        super("MyAudioDrumms");
        setBounds(10,10,200,150);
        setDefaultCloseOperation(3);
        setFocusable(true);
        requestFocus();
        addKeyListener(new KeyAdapter(){
            public void keyPressed(KeyEvent evt){
                char c = evt.getKeyChar();
                switch(c){
                    case 'y':frappe(grossecaisse);break;
                    case 'x':frappe(caisseclaire);break;
                    case 'm':frappe(charleston);break;
                }
            }
        });
        try{
        message = new ShortMessage();
        synth = MidiSystem.getSynthesizer();
        synth.open();
        receiver  = synth.getReceiver();
        } catch(Exception e){}
        setVisible(true);
    }
    public void frappe(int instrument){
        try{
        int volume = 50;
        if(instrument == grossecaisse)
            volume = 100;
        synth.getChannels()[0].programChange(instrument);
        message.setMessage(ShortMessage.NOTE_ON, 0, 60, volume);
        receiver.send(message, -1);
        } catch(Exception e){}
    }
    public static void main(String[] args)throws Exception{
       
            new test();
       
       
    }
}

jeudi 15 février 2007 à 17:40:40 | Re : Problème de rapidité avec javax.sound.midi.Synthesizer

DARKSIDIOUS

Membre Club Administrateur CodeS-SourceS
Là je peux pas t'en dire plus, je ne connais pas la librairie, et je ne sais donc pas son niveau d'optimisation.


jeudi 15 février 2007 à 18:00:22 | Re : Problème de rapidité avec javax.sound.midi.Synthesizer

Twinuts

Membre Club Administrateur CodeS-SourceS
Salut,

déjà pour commencer détache le traitement de frappe dans un thread par ce que le Synthesizer est assez bouffe ressources


------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA
jeudi 15 février 2007 à 20:09:05 | Re : Problème de rapidité avec javax.sound.midi.Synthesizer

qhhu

Excuse-moi mais je vois pas bien comment tu veu faire ca...
Pour un Thread, il faut un Runnable avec une boucle while dedans...
Or je vois pas ou la trouver cette boucle...
En plus, la méthode run de Runnable ne prend pas de paramètres, alors comment lui dire sur quelle touche on a tappé...
Merci de vos réponses!
jeudi 15 février 2007 à 20:22:23 | Re : Problème de rapidité avec javax.sound.midi.Synthesizer

Twinuts

Membre Club Administrateur CodeS-SourceS
Salut,

je sais pas moi tu peux faire :

import javax.sound.midi.*;
import java.awt.event.*;
import javax.swing.*;

public class test extends JFrame{
    int charleston = 174;
    int grossecaisse = 171;
    int caisseclaire = 166;
    MyTimer timer = null;
    public test(){
        super("MyAudioDrumms");
        timer = new MyTimer();
        setBounds(10,10,200,150);
        setDefaultCloseOperation(3);
        setFocusable(true);
        requestFocus();
        addKeyListener(new KeyAdapter(){
            public void keyPressed(KeyEvent evt){
                char c = evt.getKeyChar();
                switch(c){
                    case 'y':timer.restart(grossecaisse);break;
                    case 'x':timer.restart(caisseclaire);break;
                    case 'm':timer.restart(charleston);break;
                }
            }
        });
        setVisible(true);
    }

    public static void main(String[] args)throws Exception{
            new test();
    }
}


class MyTimer implements ActionListener{
    private ShortMessage message = null;
    private Synthesizer synth = null;
    private Receiver receiver = null;
    private int instrument = 0;
    private javax.swing.Timer timer = null;

    public MyTimer(){
        timer = javax.swing.Timer(100, this);// je mets 100 pour le fun
        try{
                message = new ShortMessage();
                synth = MidiSystem.getSynthesizer();
                synth.open();
                receiver  = synth.getReceiver();
            } catch(Exception e){}
    }

    public void restart(int instrument){
        this.instrument = instrument;
        timer.restart();
    }

    public void actionPerformed(ActionListener e){
        if(e.getSource().equals(timer)){
            try{
                    synth.getChannels()[0].programChange(instrument);
                    message.setMessage(ShortMessage.NOTE_ON, 0, 60,
                     (instrument == grossecaisse) ? 100 : 50);
                    receiver.send(message, -1);
                } catch(Exception e){}
        }
    }
}



------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA
jeudi 15 février 2007 à 20:49:20 | Re : Problème de rapidité avec javax.sound.midi.Synthesizer

qhhu

Rebonjour
Avec ton code, la "note" se répète toute les 100 ms...
J'ai donc essayé de remplacer le Timer par un Thread... c'est un tt pti peu mieu, mais il reste encore un délai après l'appui...
Merci quant même.
Je pense que le problème vient plutôt du Synthesizer qui attend trop lontemps avant de jouer le son... Qu'en penses-tu?
jeudi 15 février 2007 à 20:56:49 | Re : Problème de rapidité avec javax.sound.midi.Synthesizer

Twinuts

Membre Club Administrateur CodeS-SourceS
Salut,

nan j'ai oublié

public void actionPerformed(ActionListener e){
        if(e.getSource().equals(timer)){
            try{
                    synth.getChannels()[0].programChange(instrument);
                    message.setMessage(ShortMessage.NOTE_ON, 0, 60,
                     (instrument == grossecaisse) ? 100 : 50);
                    receiver.send(message, -1);

             } catch(Exception e){}
            
timer.stop();
        }
    }


pour ce qui est du Synthesizer faut voir la taille du son, verifier également si le synté n'a ,pas un timeout pour closer les ressources, etc ...

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA
jeudi 15 février 2007 à 22:01:57 | Re : Problème de rapidité avec javax.sound.midi.Synthesizer

qhhu

Re
J'ai trouvé un truc :
getLatency()
Obtains the processing latency incurred by this synthesizer, expressed in microseconds. This latency measures the worst-case delay between the time a MIDI message is delivered to the synthesizer and the time that the synthesizer actually produces the corresponding result.

C'est ca mon problème... Il faudrait un moyen pour réduire cela...
Sinon pour ta méthode avec Timer, je ne peut jouer qu'un son à la fois... donc c'est pas encore ca... mais merci quant même!

1 2

Cette discussion est classée dans : problème, midi, javax, sound, rapidité


Répondre à ce message

Sujets en rapport avec ce message

Problème avec exécutable Visual J++ [ par aliena ] Hello !Je travaille avec Visual J++ (ne me dites pas que c pas le mieux, je le sais déjà !) et j'ai un léger souci quand je lance l'exécutable. En fai Stéganographie sur un fichier wav [ par aurelie_devplus ] Je dois réaliser une application qui encrypte un fichier .txt dans un fichier .wav. Je dois pouvoir placer le texte dans le fichier wav sans modifier jouer un son aavec un bpm precis [ par nien ] bonjour ..alors ouveau que je suis je m'attaque a de grd projet je veux realiser un sampleur...mais j'ai un probleme grace a la classe suivante je peu [Javax.sound] Pb avec le Mixer et la synchro [ par sylvainv18 ] Bonjour, Je bosse actuellement sur mon projet de fin d'année et j'ai besoin de lire plusieurs pistes wav simultanément. Je fais de difficiles recherc Problème dans le package de cryptage :javax.crypto [ par zhaira ] Salut à tous,je suis en train de compiler avec JBuilder 6 un code en java de cryptage et décryptage .ce code contient la classe javax.crypto.* mais le javax.sound.Clip [ par didoux95 ] Bonjour à tous ..J'utilise actuellement l'api javax.sound. j'aimerais savoir comment est ce que je peux faire pour savoir si une reference de Clip jou Problème JBUILDER [ par swiss_cheese10 ] Alors, j'vous explique mon problème...J'arrive tjs pas a faire fonctionner JBuilder... J'ai téléchargé la version Personnal sous le site de Borland, q problème commons.fileupload, portlet [ par juanquiX ] package org.apache.commons.fileupload.portlet; import javax.portlet.ActionRequest; ça fait une erreur, eclipse ne reconnait pas javax.portlet. quel j [Java Sound] Midi file [ par junior_reid44 ] Bonjour à tous, Je suis un petit newbie concernant java sound et je demande conseil à tous les développeurs qui ont déjà touché à java sound ... Je s


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,839 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales