2011-05-18 2 views
1

Je suis en train de refaire une partie d'un jeu en Java, et j'ai besoin de savoir comment jouer les fichiers son MIDI. De préférence, il ne s'agirait pas d'importer des bibliothèques externes. Il doit également être exécutable dans un nouveau thread, de sorte que je puisse empiler les sons individuels sur la chanson de fond.Comment lire un fichier .MIDI dans un nouveau thread en Java?

Merci pour vos idées et votre temps.

Répondre

2

Ce code joue deux pistes MIDI en même temps (la deuxième séquence démarre dès que la première boîte de dialogue est fermée). Aucun thread n'est explicitement créé, mais j'imagine que cela fonctionnerait de la même manière s'il était enveloppé dans un objet Thread.

import java.net.URL; 
import java.util.Locale; 
import javax.sound.midi.MidiDevice; 
import javax.sound.midi.MidiSystem; 
import javax.sound.midi.MidiUnavailableException; 
import javax.sound.midi.Receiver; 
import javax.sound.midi.Sequence; 
import javax.sound.midi.Sequencer; 
import javax.sound.midi.Transmitter; 
import javax.swing.JOptionPane; 
import org.apache.commons.lang.StringUtils; 

class PlayMidi { 

    public static boolean useExternalSynth = false; 

    public static void main(String[] args) throws Exception { 
     MidiDevice receivingDevice = getReceivingDevice(); 
     receivingDevice.open(); 

     URL url1 = new URL("http://pscode.org/media/EverLove.mid"); 

     Sequence sequence1 = MidiSystem.getSequence(url1); 
     Sequencer sequencer1 = MidiSystem.getSequencer(false); 
     Transmitter tx1 = sequencer1.getTransmitter(); 
     Receiver rx1 = receivingDevice.getReceiver(); 
     tx1.setReceiver(rx1); 

     sequencer1.open(); 
     sequencer1.setSequence(sequence1); 

     URL url2 = new URL("http://pscode.org/media/AftrMdnt.mid"); 

     Sequence sequence2 = MidiSystem.getSequence(url2); 
     Sequencer sequencer2 = MidiSystem.getSequencer(false); 
     Transmitter tx2 = sequencer2.getTransmitter(); 
     Receiver rx2 = receivingDevice.getReceiver(); 
     tx2.setReceiver(rx2); 

     sequencer2.open(); 
     sequencer2.setSequence(sequence2); 

     sequencer1.start(); 
     JOptionPane.showMessageDialog(null, "Everlasting Love"); 
     sequencer2.start(); 
     JOptionPane.showMessageDialog(null, "After Midnight"); 
    } 

    private static MidiDevice getReceivingDevice() 
     throws MidiUnavailableException { 
     for (MidiDevice.Info mdi: MidiSystem.getMidiDeviceInfo()) { 
      MidiDevice dev = MidiSystem.getMidiDevice(mdi); 
      if (dev.getMaxReceivers() != 0) { 
       String lcName = 
        StringUtils.defaultString(mdi.getName()) 
           .toLowerCase(Locale.ENGLISH); 
       if (lcName.contains(useExternalSynth? "usb": "java")) { 
        return dev; 
       } 
      } 
     } 
     return null; 
    } 

} 
+0

Merci pour la réponse. Le code semble bien fonctionner, cependant, pour une raison quelconque, aucun son n'est produit. Je l'exécute dans Eclipse, et mon son fonctionne et est monté. Des idées? – Feste

+0

Avez-vous * un * logiciel * quelconque (par exemple WinAmp ou Windows Media Player) capable de lire ces fichiers MIDI avec succès? –

+0

Oui. Winamp, Quicktime et Windows Media Player sont tous capables de lire le fichier. – Feste

Questions connexes