Java 向设备发送 MIDI 消息
Java send midi message to device
我有一个 APC40 MkII 连接到 raspberry pi。在 pi 上,我有 java 运行。使用 java.sound.midi 包,我可以与 APC 建立连接并毫无问题地接收它的 MIDI 消息。但经过大量研究后,我仍然不知道如何将 midi 消息发送到 APC。
这是我目前的代码:
package lightorgansandbox;
import javax.sound.midi.*;
import java.util.List;
public class MidiHandler {
public MidiHandler() {
MidiDevice device;
MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
for (MidiDevice.Info info : infos) {
System.out.println("Info: '" + info.toString() + "'");
try {
device = MidiSystem.getMidiDevice(info);
List<Transmitter> transmitters = device.getTransmitters();
for(int j = 0; j<transmitters.size();j++) {
transmitters.get(j).setReceiver(new MidiInputReceiver(device.getDeviceInfo().toString()));
}
Transmitter trans = device.getTransmitter();
trans.setReceiver(new MidiInputReceiver(device.getDeviceInfo().toString()));
device.open();
}catch (MidiUnavailableException e) {}
}
}
public class MidiInputReceiver implements Receiver {
public String name;
public MidiInputReceiver(String name) {
this.name = name;
}
public void send(MidiMessage msg, long timeStamp) {
if (msg instanceof ShortMessage) {
ShortMessage shortMessage = (ShortMessage) msg;
int channel = shortMessage.getChannel();
int pitch = shortMessage.getData1();
int vel = shortMessage.getData2();
System.out.println("Channel: " + channel);
System.out.println("Pitch: " + pitch);
System.out.println("vel: " + vel);
}
}
public void close() {}
}
}
这一切都按照我想要的方式工作。但是我可以在哪里将消息发送回设备?
只需将消息发送给设备的接收者即可。
来自 documentation:
Receiver rcvr = MidiSystem.getReceiver(); /* or device.getReceiver() */
ShortMessage myMsg = new ShortMessage();
myMsg.setMessage(ShortMessage.NOTE_ON, 0, 60, 93);
long timeStamp = -1;
rcvr.send(myMsg, timeStamp);
我有一个 APC40 MkII 连接到 raspberry pi。在 pi 上,我有 java 运行。使用 java.sound.midi 包,我可以与 APC 建立连接并毫无问题地接收它的 MIDI 消息。但经过大量研究后,我仍然不知道如何将 midi 消息发送到 APC。
这是我目前的代码:
package lightorgansandbox;
import javax.sound.midi.*;
import java.util.List;
public class MidiHandler {
public MidiHandler() {
MidiDevice device;
MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
for (MidiDevice.Info info : infos) {
System.out.println("Info: '" + info.toString() + "'");
try {
device = MidiSystem.getMidiDevice(info);
List<Transmitter> transmitters = device.getTransmitters();
for(int j = 0; j<transmitters.size();j++) {
transmitters.get(j).setReceiver(new MidiInputReceiver(device.getDeviceInfo().toString()));
}
Transmitter trans = device.getTransmitter();
trans.setReceiver(new MidiInputReceiver(device.getDeviceInfo().toString()));
device.open();
}catch (MidiUnavailableException e) {}
}
}
public class MidiInputReceiver implements Receiver {
public String name;
public MidiInputReceiver(String name) {
this.name = name;
}
public void send(MidiMessage msg, long timeStamp) {
if (msg instanceof ShortMessage) {
ShortMessage shortMessage = (ShortMessage) msg;
int channel = shortMessage.getChannel();
int pitch = shortMessage.getData1();
int vel = shortMessage.getData2();
System.out.println("Channel: " + channel);
System.out.println("Pitch: " + pitch);
System.out.println("vel: " + vel);
}
}
public void close() {}
}
}
这一切都按照我想要的方式工作。但是我可以在哪里将消息发送回设备?
只需将消息发送给设备的接收者即可。 来自 documentation:
Receiver rcvr = MidiSystem.getReceiver(); /* or device.getReceiver() */
ShortMessage myMsg = new ShortMessage();
myMsg.setMessage(ShortMessage.NOTE_ON, 0, 60, 93);
long timeStamp = -1;
rcvr.send(myMsg, timeStamp);