0

自分のシステムで Java のカスタム MIDI ドライバーの 1 つを使用したいのですが、次のコードを使用して設定しようとすると、次のようになります。

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 に答える