Problème de rapidité avec javax.sound.midi.Synthesizer
qhhu
Messages postés66Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 octobre 2009
-
14 févr. 2007 à 22:55
qhhu
Messages postés66Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 octobre 2009
-
27 mars 2007 à 20:00
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.
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013131 15 févr. 2007 à 06:52
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 !
qhhu
Messages postés66Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 octobre 2009 15 févr. 2007 à 20:09
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!
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();
}
}
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();
}
qhhu
Messages postés66Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 octobre 2009 15 févr. 2007 à 20:49
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?
qhhu
Messages postés66Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 octobre 2009 15 févr. 2007 à 22:01
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!
qhhu
Messages postés66Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 octobre 2009 27 mars 2007 à 20:00
J'ai cherché et cherché mais je crois qu'il n'y a rien...
Je vais essayer avec d'autres méthodes (le wav par exemple!)
Merci bien en tout cas vous m'avez bien aidé!!
A bientot