【问题标题】:How to play a .MIDI file in a new thread in Java?如何在 Java 的新线程中播放 .MIDI 文件?
【发布时间】:2011-05-18 01:22:38
【问题描述】:

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

感谢您的想法和时间。

【问题讨论】:

    标签: java avaudioplayer midi javasound audio-player


    【解决方案1】:

    此代码同时播放两个 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 Sound Synthesizer 或可选的 USB-MIDI 接口。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多