Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java的新线程中播放.MIDI文件?_Java_Avaudioplayer_Midi_Javasound_Audio Player - Fatal编程技术网

如何在Java的新线程中播放.MIDI文件?

如何在Java的新线程中播放.MIDI文件?,java,avaudioplayer,midi,javasound,audio-player,Java,Avaudioplayer,Midi,Javasound,Audio Player,我正在用Java重新制作游戏的一部分,我需要知道如何播放MIDI声音文件。最好不涉及导入任何外部库。它还必须在一个新的线程中运行,这样我就可以在背景歌曲上叠加各个声音 感谢您的想法和时间。此代码同时播放两个MIDI曲目(第一个对话框关闭后,第二个序列立即开始)。没有显式创建线程,但我认为如果将它们包装在Thread对象中,其工作原理大致相同 import java.net.URL; import java.util.Locale; import javax.sound.midi.MidiDevi

我正在用Java重新制作游戏的一部分,我需要知道如何播放MIDI声音文件。最好不涉及导入任何外部库。它还必须在一个新的线程中运行,这样我就可以在背景歌曲上叠加各个声音


感谢您的想法和时间。

此代码同时播放两个MIDI曲目(第一个对话框关闭后,第二个序列立即开始)。没有显式创建线程,但我认为如果将它们包装在
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;
    }

}

谢谢你的回复。代码似乎运行良好,但是由于某些原因,没有声音产生。我正在Eclipse中运行它,我的声音正在工作并打开。有什么想法吗?您是否有任何软件(如WinAmp或Windows Media Player)可以成功播放这些MIDI文件?有。Winamp、Quicktime和Windows Media Player都可以播放该文件。我也无法使用,因此我修改了该程序,使其隐式打开内置的
Java声音合成器
或可选的USB-MIDI接口。