gpt4 book ai didi

Java 从 MIDI 键盘获取输入

转载 作者:搜寻专家 更新时间:2023-10-30 21:24:24 25 4
gpt4 key购买 nike

我用 java 设计了自己的合成器,现在我想将它与 midi 键盘连接。我下面的类(class)搜索所有具有发射器的 MIDI 设备。它成功地找到了我的 midi 键盘。我将我自己的接收器添加到每个设备的每个发射器,以便它应该接收所有可能的东西。通过阅读所有帮助文档和 java 文档,我知道 Transmitter 将 MidiEvents 发送到 Receiver,然后 Receiver 使用 send 方法处理它们。因此,我编写了自己的内部类来实现 Receiver,并使用 println 语句检查发送方法中是否检测到任何内容。然而,什么也没有被拾起。做这么简单的事情似乎没有什么帮助,我查看了每个帮助文件、javadoc 和论坛。我敢肯定,这一定是我以某种方式错过的非常明显的东西。

我的合成器不应与界面合成器混淆,它不是 MIDI 乐器。它使用合成算法并具有播放方法。基本上我只需要让 midi 键盘发送一个事件音符,这将调用回放方法。

import javax.sound.midi.*;
import java.util.ArrayList;
import java.util.List;
import java.io.*;
public class MidiHandler
{
//ArrayList of MidiDevices
private ArrayList<MidiDevice> devices = new ArrayList<MidiDevice>();

public MidiHandler()
{
MidiDevice device;
MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
for (int i = 0; i < infos.length; i++) {
try {
device = MidiSystem.getMidiDevice(infos[i]);
//does the device have any transmitters?
if (device.getTransmitters().size() > 0) {
//if it does, add it to the device list
System.out.println(infos[i] + ": " + device.getTransmitters().size());
devices.add(device);
}
} catch (MidiUnavailableException e) {}
}
//if any transmitting devices were found
if(devices.size()>0) {
//for each device
for(int i = 0; i<devices.size(); i++) {
try {
//get all transmitters
List<Transmitter> transmitters = devices.get(i).getTransmitters();
//and for each transmitter
for(int j = 0; j<transmitters.size();j++) {
//create a new receiver
transmitters.get(i).setReceiver(
//using my own MidiInputReceiver
new MidiInputReceiver(devices.get(i).getDeviceInfo().toString())
);
}
//open each device
devices.get(i).open();
//if code gets this far without throwing an exception
//print a success message
System.out.println(devices.get(i).getDeviceInfo()+" Was Opened");
} catch (MidiUnavailableException e) {}
}
}
}
//tried to write my own class. I thought the send method handles an MidiEvents sent to it
public class MidiInputReceiver implements Receiver {
public String name;
public MidiInputReceiver(String name) {
this.name = name;
}
public void send(MidiMessage msg, long timeStamp) {
System.out.println("midi received");
}
public void close() {}
}
}

注意:我已经看到了:Java MIDI - getting data from piano? .

还有这个:http://www.jsresources.org/examples/MidiInDump.html

Sequencer 界面对于我想要的东西来说看起来太复杂了。

最佳答案

我发现 MidiDevice getTransmitters() 似乎会返回当前已打开 发射器的列表,而不是可用 要打开的发射器列表。我相信打开新发射器的方法是通过 getTransmitter() 方法。我已经修改了您的代码来执行此操作:

import javax.sound.midi.*;
import java.util.ArrayList;
import java.util.List;
import java.io.*;
public class MidiHandler
{

public MidiHandler()
{
MidiDevice device;
MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
for (int i = 0; i < infos.length; i++) {
try {
device = MidiSystem.getMidiDevice(infos[i]);
//does the device have any transmitters?
//if it does, add it to the device list
System.out.println(infos[i]);

//get all transmitters
List<Transmitter> transmitters = 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(device.getDeviceInfo().toString())
);
}

Transmitter trans = device.getTransmitter();
trans.setReceiver(new MidiInputReceiver(device.getDeviceInfo().toString()));

//open each device
device.open();
//if code gets this far without throwing an exception
//print a success message
System.out.println(device.getDeviceInfo()+" Was Opened");


} catch (MidiUnavailableException e) {}
}


}
//tried to write my own class. I thought the send method handles an MidiEvents sent to it
public class MidiInputReceiver implements Receiver {
public String name;
public MidiInputReceiver(String name) {
this.name = name;
}
public void send(MidiMessage msg, long timeStamp) {
System.out.println("midi received");
}
public void close() {}
}
}

在我的硬件上(我插入了一个简单的 USB MIDI Controller ),代码在创建 MidiHandler 实例后正确打印出“midi received”。

希望这对您有所帮助!

关于Java 从 MIDI 键盘获取输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6937760/

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