Installing a new MidiOut into Java?

307 Views Asked by At

I want to use one of the custom MIDI drivers on my system in Java, but when I try to set it via this code:

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

i is a MidiDevice.Info for the requested MidiDevice. This code throws an exception: (This code is around line 58 of MidiPlayer)

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

How can I install the device?

1

There are 1 best solutions below

1
On

I think the problem is MidiSystem.getTransmitter()... The default device/transmitter is unavailable. Try to create your desired MidiDevice and obtain a transmitter from it.

Edit: Here is a little example. Just create a CustomReceiver with the transmittername and receivername. You get the string from for example

Info info[] = MidiSystem.getMidiDeviceInfo();

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

Don't forget to close the CustomReceiver with 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);
}
}