提问人:Jos 提问时间:3/2/2023 更新时间:3/2/2023 访问量:80
使用 Java 将 MIDI 音符发送到虚拟端口
Send MIDI note to virtual port with Java
问:
我想使用 Java 将 MIDI 音符发送到虚拟端口。要发送 MIDI 音符中间 C (60),我这样做:
public static void main(String[] main) throws MidiUnavailableException, InvalidMidiDataException, InterruptedException {
final MidiDevice.Info[] midiDeviceInfo = MidiSystem.getMidiDeviceInfo();
for (MidiDevice.Info info : midiDeviceInfo) {
System.out.println(info.getName());
}
MidiDevice.Info midiInfo = Arrays.stream(midiDeviceInfo)
.filter(midiDefInfo -> main[0].equalsIgnoreCase(midiDefInfo.getName()))
.findFirst().orElseThrow();
final MidiDevice midiDevice = MidiSystem.getMidiDevice(midiInfo);
midiDevice.open();
Receiver receiver = midiDevice.getReceiver();
final ShortMessage messageOn = new ShortMessage();
final ShortMessage messageOff = new ShortMessage();
messageOn.setMessage(ShortMessage.NOTE_ON, 1, 60, 112);
messageOff.setMessage(ShortMessage.NOTE_OFF, 1, 60, 0);
receiver.send(messageOn, -1);
Thread.sleep(1000L);
receiver.send(messageOff, -1);
}
使用MacOS的MIDI-studio,我创建了“MyVirtualPort”:
运行程序时,它会打印可用的设备:
Gervill
Real Time Sequencer
MyVirtualPort
MyVirtualPort
当我将“Gervill”作为参数传递时,我从扬声器中听到中间 C 1 秒钟。选择第二个“MyVirtualPort”时,会抛出 MIDI IN 不可用的异常。选择第一个“MyVirtualPort”时,程序运行良好,似乎发送了消息。但是,我在虚拟端口上没有看到任何活动。
我尝试使用 loopMidi (https://www.tobias-erichsen.de/software/loopmidi.html) 在 Windows 上运行该程序,但发生了同样的事情:程序运行良好并且似乎正确发送消息,但在虚拟设备上没有任何反应。将其设置为默认值也可以在 Windows 上成功播放中间 C。
我在这里错过了什么?我是MIDI的新手,所以这完全有可能是一件微不足道的事情。
答: 暂无答案
评论