0

我想在我的系统上使用 Java 中的自定义 MIDI 驱动程序之一,但是当我尝试通过以下代码设置它时:

MidiDevice midi_dev = MidiSystem.getMidiDevice(i);
midi_dev.open();
System.out.println(midi_dev.getReceivers());
MidiSystem.getTransmitter().setReceiver(midi_dev.getReceiver());

i是请求的 MidiDevice 的 MidiDevice.Info。此代码引发异常:(此代码在 MidiPlayer 的第 58 行左右)

javax.sound.midi.MidiUnavailableException
at javax.sound.midi.MidiSystem.getDefaultDeviceWrapper(Unknown Source)
at javax.sound.midi.MidiSystem.getTransmitter(Unknown Source)
at com.k.midishapes.midi.MidiPlayer$MidiPlayThread.<init>(MidiPlayer.java:58)
at com.k.midishapes.midi.MidiPlayer.start(MidiPlayer.java:20)
at com.k.midishapes.MidiMain.init(MidiMain.java:70)
at crashcourse.k.library.lwjgl.DisplayLayer.initDisplay(DisplayLayer.java:62)
at crashcourse.k.library.lwjgl.DisplayLayer.initDisplay(DisplayLayer.java:25)
at com.k.midishapes.MidiMain.main(MidiMain.java:26)
Caused by: java.lang.IllegalArgumentException: Requested device not installed
at javax.sound.midi.MidiSystem.getDefaultDevice(Unknown Source)
... 8 more

如何安装设备?

4

1 回答 1

0

我认为问题是MidiSystem.getTransmitter()......默认设备/发射器不可用。尝试创建所需的 MidiDevice 并从中获取发射器。

编辑:这是一个小例子。只需使用发送器名称和接收器名称创建一个 CustomReceiver。例如,您可以从中获取字符串

Info info[] = MidiSystem.getMidiDeviceInfo();

String firstDevice = info[0].getName();

不要忘记使用 关闭 CustomReceiver close()

import java.util.ArrayList;
import java.util.List;
import javax.sound.midi.MidiDevice;
import javax.sound.midi.MidiDevice.Info;
import javax.sound.midi.MidiMessage;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.Receiver;
import javax.sound.midi.Transmitter;

public class CustomReceiver implements Receiver{

private List<MidiMessage> m;
private MidiDevice receivedevice;
private MidiDevice transmitdevice;
private Receiver receiver;
private Transmitter transmitter;

public CustomReceiver(String transmittername, String receivername){
    transmitdevice = getMidiDevice(transmittername, false);
    receivedevice = getMidiDevice(receivername, true);
    m=new ArrayList<MidiMessage>();
    try{
        receivedevice.open();
        transmitdevice.open();
        this.receiver = receivedevice.getReceiver();
        this.transmitter = transmitdevice.getTransmitter();
        this.transmitter.setReceiver(this);
    }
    catch(MidiUnavailableException e){
                    close();
        e.printStackTrace();
    }
}

private MidiDevice getMidiDevice(String s, boolean getReceiver){
    Info[] infos = MidiSystem.getMidiDeviceInfo();
    for(int i=0; i<infos.length;i++){           
        if(infos[i].getName().equals(s)){
            try{
                MidiDevice d = MidiSystem.getMidiDevice(infos[i]);
                if(d.getMaxReceivers()!=0 && getReceiver){
                    System.out.println(infos[i].getName());
                    System.out.println(d.getMaxReceivers());
                    return d;
                }
                else if(d.getMaxTransmitters()!=0 && !getReceiver){
                    System.out.println(infos[i].getName());
                    System.out.println(d.getMaxTransmitters());
                    return d;
                }
            }
            catch(MidiUnavailableException e){
                e.printStackTrace();
            }
        }
    }
    return null;
}

public void close(){
    if(receiver!=null)
        receiver.close();
    if(transmitter!=null)
        transmitter.close();
    if(transmitdevice!=null)
        transmitdevice.close();
    if(receivedevice!=null)
        receivedevice.close();
}

public void send(MidiMessage msg, long timestamp){      
    //Messages are received here.

    //TODO

    //Send the message to the receiver
    //receiver.send(msg, timestamp);    
}

public void sendSingleMessage(MidiMessage msg, long timeStamp){
    receiver.send(msg, timeStamp);
}

public void sendAll(){
    for(MidiMessage mm: m)
        receiver.send(mm, -1);
}

public void add(MidiMessage msg){
    m.add(msg);
}

public void remove(MidiMessage msg){
    m.remove(msg);
}
}
于 2013-10-11T01:22:46.973 回答