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.