Java 如何关闭midi设备?
如何在java中关闭midi设备?我已尝试重新初始化MidiHandler对象,但设备保持打开状态,直到程序终止。此外,如果在程序运行时拔下midi控制器的插头,即使在重新初始化后,它也不会在重新连接后发送备忘。我必须再次终止并重新启动程序,以使其正常工作。我对使用midi非常陌生,所以我可能从根本上误解了整个概念。以下是我到目前为止的情况:Java 如何关闭midi设备?,java,midi,javax.sound.midi,Java,Midi,Javax.sound.midi,如何在java中关闭midi设备?我已尝试重新初始化MidiHandler对象,但设备保持打开状态,直到程序终止。此外,如果在程序运行时拔下midi控制器的插头,即使在重新初始化后,它也不会在重新连接后发送备忘。我必须再次终止并重新启动程序,以使其正常工作。我对使用midi非常陌生,所以我可能从根本上误解了整个概念。以下是我到目前为止的情况: public class MidiHandler { MidiDevice device; MidiDevice.Info[] infos = MidiS
public class MidiHandler {
MidiDevice device;
MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
public MidiHandler() {
for (int i = 0; i < infos.length; i++) {
try {
this.device = MidiSystem.getMidiDevice(this.infos[i]);
// does the device have any transmitters?
// if it does, add it to the device list
System.out.println(this.infos[i]);
// get all transmitters
List<Transmitter> transmitters = this.device.getTransmitters();
// and for each transmitter
for (int j = 0; j < transmitters.size(); j++) {
// create a new receiver
transmitters.get(j).setReceiver(
// using my own MidiInputReceiver
new MidiInputReceiver(this.device.getDeviceInfo()
.toString()));
}
Transmitter trans = this.device.getTransmitter();
trans.setReceiver(new MidiInputReceiver(this.device.getDeviceInfo()
.toString()));
this.device.open();
} catch (MidiUnavailableException e) {
}
}
}
public void close() {
}
public String getInfos() {
String infos = "";
for(int i = 0; i < this.infos.length; i++) {
infos += "\n" + this.infos[i] + " ";
}
return infos;
}
// tried to write my own class. I thought the send method handles an
// MidiEvents sent to it
public class MidiInputReceiver implements Receiver {
Synthesizer synth;
MidiChannel[] mc;
Instrument[] instr;
int instrument;
int channel;
public MidiInputReceiver(String name) {
try
{
patcher p = new patcher();
this.instrument = p.getInstrument();
this.channel = p.getChannel();
this.synth = MidiSystem.getSynthesizer();
this.synth.open();
this.mc = synth.getChannels();
instr = synth.getDefaultSoundbank().getInstruments();
this.synth.loadInstrument(instr[1]);
mc[this.channel].programChange(0, this.instrument);
}
catch (MidiUnavailableException e)
{
e.printStackTrace();
System.exit(1);
}
}
public void send(MidiMessage msg, long timeStamp) {
/*
* Use to display midi message
*/
for(int i = 0; i < msg.getMessage().length; i++) {
System.out.print("[" + msg.getMessage()[i] + "] ");
}
System.out.println();
if (msg.getMessage()[0] == -112) {
mc[this.channel].noteOn(msg.getMessage()[1], msg.getMessage()[2]+1000);
}
if (msg.getMessage()[0] == -128) {
mc[this.channel].noteOff(msg.getMessage()[1], msg.getMessage()[2]+1000);
}
}
public void close() {
}
}
公共类MIDI处理程序{
MIDI设备;
MidiDevice.Info[]infos=MidiSystem.getMidiDeviceInfo();
公共middhandler(){
for(int i=0;i
主类只是实例化一个MidiHandler,除了上面的问题外,它工作得很好。您签出了吗
关闭连接
连接完成后,您可以通过为已获得的每个发射机和接收机调用close方法来释放其资源。发射机和接收机接口都有一个close方法。请注意,调用发射机.setReceiver不会关闭发射机的当前接收机。接收机保持打开状态,并且可以n仍然可以从连接到它的任何其他发射机接收消息
如果您也使用完这些设备,则可以通过调用MidiDevice.close()类似地使它们可用于其他应用程序。关闭设备会自动关闭其所有发射机和接收机
你可以打电话
显式关闭是通过调用close()完成的
但是MIDI设备扩展了可自动关闭的功能,因此,根据API,您必须关闭发射机或接收机
在:
关闭最后一个接收器或发射器后,设备将关闭。另一方面,直接在设备实例上调用getReceiver或getTransmitter不会隐式打开设备。关闭这些发射器和接收器不会隐式关闭设备
我已尝试调用此.device.close()在MidiHandler中,程序仍在传输和播放声音。关闭
MidiHandler
不会影响。在MidiHandler
中,您为设备设置了Tansmitter
s和Receiver
s。您必须关闭它们才能停止设备。此外,请注意,如果发送的订单较长,声音可能不会立即停止。