gpt4 book ai didi

java - 在 Java 中访问 MidiDevice

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:10:48 26 4
gpt4 key购买 nike

我目前正在尝试将我的钢琴的 midiport 连接到我的电脑。我已经阅读了我能找到的所有内容,但不知何故我遗漏了一些东西,所以我希望这里有人可以帮助我。我已经尝试这样做了一个星期,但它变得非常令人沮丧。

public class MidiDeviceGetter {

public MidiDeviceGetter() {}

public static void listTransmitterDevices() throws MidiUnavailableException {
MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
for (int i = 0; i < infos.length; i++) {
MidiDevice device = MidiSystem.getMidiDevice(infos[i]);
if (device.getMaxTransmitters() != 0)
System.out.println(device.getDeviceInfo().getName().toString()
+ " has transmitters");
}
}

// should get me my USB MIDI Interface. There are two of them but only one
// has Transmitters so the if statement should get me the one i want
public static MidiDevice getInputDevice() throws MidiUnavailableException {
MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
for (int i = 0; i < infos.length; i++) {
MidiDevice device = MidiSystem.getMidiDevice(infos[i]);
if (device.getMaxTransmitters() != 0
&& device.getDeviceInfo().getName().contains("USB")) {
System.out.println(device.getDeviceInfo().getName().toString()
+ " was chosen");
return device;
}
}
return null;
}

public static void main(String[] args) throws MidiUnavailableException,
IOException {
MidiDevice inputDevice;

// MidiDeviceGetter.listTransmitterDevices();
inputDevice = MidiDeviceGetter.getInputDevice();

// just to make sure that i got the right one
System.out.println(inputDevice.getDeviceInfo().getName().toString());
System.out.println(inputDevice.getMaxTransmitters());

// opening the device
System.out.println("open inputDevice: "
+ inputDevice.getDeviceInfo().toString());
inputDevice.open();
System.out.println("connect Transmitter to Receiver");

// Creating a Dumpreceiver and setting up the Midi wiring
Receiver r = new DumpReceiver(System.out);
Transmitter t = inputDevice.getTransmitter();
t.setReceiver(r);

System.out.println("connected.");
System.out.println("running...");
System.in.read();
// at this point the console should print out at least something, as the
// send method of the receiver should be called when i hit a key on my
// keyboard
System.out.println("close inputDevice: "
+ inputDevice.getDeviceInfo().toString());
inputDevice.close();
System.out.println(("Received " + ((DumpReceiver) r).seCount
+ " sysex messages with a total of "
+ ((DumpReceiver) r).seByteCount + " bytes"));
System.out.println(("Received " + ((DumpReceiver) r).smCount
+ " short messages with a total of "
+ ((DumpReceiver) r).smByteCount + " bytes"));
System.out.println(("Received a total of "
+ (((DumpReceiver) r).smByteCount +
((DumpReceiver) r).seByteCount) + " bytes"));
}
}

好吧,这就是我到目前为止所得到的。我只是想让钢琴连接起来,这样我就可以从那里走得更远,但正如我所说,我无法让它工作。

为了测试,我使用了 DumpReceiver 类 http://www.jsresources.org/examples/DumpReceiver.java.html .

非常感谢任何帮助,谢谢。

P.S.:抱歉我的英语不好,我不是母语人士。

Edit1:根据评论:

我希望程序在我按下某个键时在控制台中打印一些东西System.in() 正在运行,因为在 Receiver 的 send(Midimessage, long) 方法中,最后一行是 Prinstream.print(midimsg)。我是对的,如果在 Receiver 所连接的 Transmitter 上播放 Note 时总是会调用 Receiver 接口(interface)类的 send 方法,不是吗?如果那行不通,我可以弄清楚,但是接收器的一些成员变量应该保存被击中的键数,但这些成员变量总是空的。所以我的主要问题是,发送方法从未被调用过。我希望我说清楚了我的主要问题是什么。

Edit2:如果您对整个“用 Java 进行 MIDI 编程”感兴趣,并且没有发现任何重大错误,请告诉我。我刚发现我也无法在 Steinbergs Cubase 中获得任何 Midisignals。也许这一次,问题不在屏幕前。

最佳答案

好吧,我明白了。我发布的代码完全正确并且有效。问题是,我的 usb midi 接口(interface)的 MIDI IN 插头属于我钢琴的 MIDI OUT 插头。我想我现在要用头撞墙几个小时了。

感谢阅读。

关于java - 在 Java 中访问 MidiDevice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9500354/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com