lecture midi et controle du volume - Java - Programmation
Marsh Posté le 30-03-2004 à 18:00:05
Je comprend pas trop ta question, c'est pas tres claire... Tu voulais savoir si le if rentrait dans le try ?
Marsh Posté le 31-03-2004 à 12:26:54
Hein c quoi ce bordel explique un peu. 
tu programme toujour comme un porc.
Marsh Posté le 13-06-2005 à 09:07:44
j'ai le meme pb que toi 
Je pense que c'est dû à java 1.5 qui diiférencie le sequencer et le synthesizer. 
Je cherche... 
As-tu trouvé quelque chose ?
Marsh Posté le 13-06-2005 à 12:33:50
Euhh y'a un an je crois que java 1.5 n'était même pas encore sorti  
 
 
Si oui en tout cas je bossais avec 1.4.2. Je n'ai pas réussi à régler le problème, désolé 
Marsh Posté le 17-06-2005 à 20:40:46
J'ai trouvé la solution ! Dans la documentation deAndrew Davison : 
http://fivedots.coe.psu.ac.th/~ad/jg/ch05/ch5.pdf 
 
et dans son FadeMidi.java ( code source ) 
http://fivedots.coe.psu.ac.th/~ad/jg/ch05/index.html 
private void initSequencer() 
  /* Set up the MIDI sequencer, the sequencer's meta-event 
     listener, and its synthesizer. */ 
  { 
    try { 
      sequencer = obtainSequencer(); 
 
      if (sequencer == null) { 
        System.out.println("Cannot get a sequencer" ); 
        System.exit(0); 
      } 
 
      sequencer.open(); 
      sequencer.addMetaEventListener(this); 
 
      // maybe the sequencer is not the same as the synthesizer 
      // so link sequencer --> synth (this is required in J2SE 1.5) 
      if (!(sequencer instanceof Synthesizer)) { 
        System.out.println("Linking the MIDI sequencer and synthesizer" ); 
        synthesizer = MidiSystem.getSynthesizer(); 
        synthesizer.open();  // new 
        Receiver synthReceiver = synthesizer.getReceiver(); 
        Transmitter seqTransmitter = sequencer.getTransmitter(); 
        seqTransmitter.setReceiver(synthReceiver); 
      } 
      else 
        synthesizer = (Synthesizer) sequencer; 
    } 
    catch (MidiUnavailableException e){ 
      System.out.println("No sequencer available" ); 
      System.exit(0); 
    } 
  } // end of initSequencer() 
 
 
 private Sequencer obtainSequencer() 
  /* This method handles a bug in J2SE 1.5.0 which retrieves 
     the sequencer with getSequencer() but does not allow 
     its volume to be changed. */ 
  { 
    // return MidiSystem.getSequencer(); 
    // okay in J2SE 1.4.2, but not in J2SE 1.5.0 
 
    MidiDevice.Info[] mdi = MidiSystem.getMidiDeviceInfo(); 
    int seqPosn = -1; 
    for(int i=0; i < mdi.length; i++) { 
      System.out.println(mdi[i].getName()); 
      // if (mdi[i].getName().contains("Sequencer" )) { 
      if (mdi[i].getName().indexOf("Sequencer" ) != -1) { 
        seqPosn = i;    // found the Sequencer 
        System.out.println("  Found Sequencer" ); 
      } 
    } 
 
    try { 
      if (seqPosn != -1) 
        return (Sequencer) MidiSystem.getMidiDevice( mdi[seqPosn] ); 
      else 
        return null; 
    } 
    catch(MidiUnavailableException e) 
    { return null; } 
  }  // end of obtainSequencer() 
 
Marsh Posté le 29-03-2004 à 22:19:50
Bonjour,
Je réalise un petit jeu en java et je voudrais lui faire jouer un midi en fond sonore. Jusque là tout va bien, j'ai suivi ce qui est écrit dans
http://javaalmanac.com/egs/javax.sound.midi/Load.html.
Probleme : j'aimerai pouvoir modifier le volume sonore, car ca hurle. Toujours sur le meme site :
http://javaalmanac.com/egs/javax.s [...] olume.html
Mais là ca ne marche pas. D'apres leur exemple, j'ai mis gain à 0, 1, 0.5 et je ne percois aucune difference de volume sonore... M'y suis-je mal pris, ou bien y'a t'il autre chose à faire ?
Voici mon bout de code pour lire le fichier :
try {
Sequence sequence = MidiSystem.getSequence(new File("midi/dn3d.mid" ));
Sequencer sequencer = MidiSystem.getSequencer();
sequencer.open();
sequencer.setSequence(sequence);
sequencer.start();
} catch (Exception e) {}
// ok !
et celui censé modifier le volume :
if (sequencer instanceof Synthesizer) {
Synthesizer synthesizer = (Synthesizer)sequencer;
MidiChannel[] channels = synthesizer.getChannels();
double gain = 0.1D;
for (int i=0; i<channels.length; i++)
channels[i].controlChange(7, (int)(gain * 127.0));
}
Je l'ai mis à l'intérieur du try, et j'ai essayé un peu partout, avant open, avant setSequence, avant Start... ca ne fait rien.