2013-07-30 29 views
0

我想使用的自定義MIDI驅動力之一我在Java系統上,但是當我試圖通過這個代碼來設置它:在Java中安裝新的MidiOut?

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 

我怎樣才能安裝設備?

回答

0

我認爲問題是MidiSystem.getTransmitter() ...默認設備/發射器不可用。 嘗試創建您想要的MidiDevice並從中獲取發射器。

編輯:這是一個小例子。只需使用transmittername和receivername創建一個CustomReceiver即可。您可以從例如

Info info[] = MidiSystem.getMidiDeviceInfo();

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

得到字符串不要忘了與close()關閉CustomReceiver。

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); 
} 
} 
+0

我會告訴你,如果這有幫助,希望它會! –