Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java从MIDI键盘获取输入_Java_Input_Keyboard_Midi_Javasound - Fatal编程技术网

Java从MIDI键盘获取输入

Java从MIDI键盘获取输入,java,input,keyboard,midi,javasound,Java,Input,Keyboard,Midi,Javasound,我用java设计了自己的合成器,现在我想用midi键盘连接它。我下面的课程搜索所有带有发射机的midi设备。它成功地找到了我的midi键盘。我为每个设备的每个发射机添加了自己的接收机,以便它能够接收所有可能的信息。通过阅读所有的帮助文档和java文档,我知道发送器将MIDI事件发送给接收器,然后接收器使用send方法处理这些事件。因此,我编写了自己的内部类实现Receiver,并使用println语句检查send方法中是否检测到任何内容。然而,什么也没有捡到。做这么简单的事情似乎没有什么帮助,我

我用java设计了自己的合成器,现在我想用midi键盘连接它。我下面的课程搜索所有带有发射机的midi设备。它成功地找到了我的midi键盘。我为每个设备的每个发射机添加了自己的接收机,以便它能够接收所有可能的信息。通过阅读所有的帮助文档和java文档,我知道发送器将MIDI事件发送给接收器,然后接收器使用send方法处理这些事件。因此,我编写了自己的内部类实现Receiver,并使用println语句检查send方法中是否检测到任何内容。然而,什么也没有捡到。做这么简单的事情似乎没有什么帮助,我已经查看了每个帮助文件,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() {}
    }
}
导入javax.sound.midi.*;
导入java.util.ArrayList;
导入java.util.List;
导入java.io.*;
公共类MIDI处理程序
{
//MIDI设备的阵列列表
私有ArrayList设备=新建ArrayList();
公共middhandler()
{
MIDI设备;
MidiDevice.Info[]infos=MidiSystem.getMidiDeviceInfo();
for(int i=0;i0){
//如果有,请将其添加到设备列表中
System.out.println(infos[i]+“:“+device.getTransmitters().size());
设备。添加(设备);
}
}catch(MidiUnavailableException{}
}
//如果发现任何发射装置
如果(devices.size()>0){
//对于每个设备

对于(int i=0;i我发现MIDI设备getTransmitter()似乎返回当前已打开的发射机列表,而不是要打开的可用发射机列表。我相信打开新发射机的方法是通过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() {}
    }
}
导入javax.sound.midi.*;
导入java.util.ArrayList;
导入java.util.List;
导入java.io.*;
公共类MIDI处理程序
{
公共middhandler()
{
MIDI设备;
MidiDevice.Info[]infos=MidiSystem.getMidiDeviceInfo();
for(int i=0;i对于(int j=0;j我发现在调用setRecceiver()之前必须先打开设备,否则将使用上次运行应用程序时的任何垃圾MIDI数据调用接收方的send()方法

device.open();

Transmitter trans = device.getTransmitter();    
// set new receiver after opening so that the input buffer will be flushed
trans.setReceiver(new MidiInputReceiver(device.getDeviceInfo().toString()));  

非常感谢!这确实有效,而且代码也不太复杂。在添加接收器之前打开Device非常重要