lecture midi et controle du volume

lecture midi et controle du volume - Java - Programmation

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.

Reply

Marsh Posté le 29-03-2004 à 22:19:50   

Reply

Marsh Posté le 29-03-2004 à 22:48:22    

il rentre dans ton if au moins ?

Reply

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 ?

Reply

Marsh Posté le 31-03-2004 à 12:26:54    

Hein c quoi ce bordel explique un peu.
tu programme toujour comme un porc.

Reply

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 ?

Reply

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é :(

Reply

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()
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed