Java从MIDI键盘获取输入 [英] Java getting input from MIDI keyboard

查看:166
本文介绍了Java从MIDI键盘获取输入的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在java中设计了自己的合成器,我现在想用midi键盘连接它。我的下面的课程搜索所有具有发射器的midi设备。它成功找到了我的midi键盘。我为每个设备添加了自己的接收器到每个发射器,以便它可以拾取所有可能的东西。通过阅读所有帮助文档和java文档,我知道发送器将MidiEvents发送到接收器,接收器然后使用send方法处理它们。所以我编写了自己的内部类,实现了Receiver,并且只使用了println语句来检查send方法中是否有任何检测到的内容。但是根本没有任何东西被拿走。做这么简单的事似乎没什么帮助,我看了每个帮助文件,javadoc和论坛。我确定它一定是非常明显的我已经错过了。



我的合成器不应该与Synthesizer接口混淆,它不是midi乐器。它使用合成算法并具有回放方法。基本上我只需要让midi键盘发送一个关于事件的注释,它将调用回放方法。

  import javax.sound。 MIDI *。 
import java.util.ArrayList;
import java.util.List;
import java.io. *;
公共类MidiHandler
{
// MidiDevices的ArrayList
private ArrayList< MidiDevice> devices = new ArrayList< MidiDevice>();

公共MidiHandler()
{
MidiDevice设备;
MidiDevice.Info [] infos = MidiSystem.getMidiDeviceInfo();
for(int i = 0; i< infos.length; i ++){
try {
device = MidiSystem.getMidiDevice(infos [i]);
//设备是否有任何发射器?
if(device.getTransmitters()。size()> 0){
//若是,请将其添加到设备列表
System.out.println(infos [i] +:+ device.getTransmitters()。size());
devices.add(device);
}
} catch(MidiUnavailableException e){}
}
//如果找到任何传输设备
if(devices.size()> 0){
//为每个设备
for(int i = 0; i< devices.size(); i ++){
try {
// get all tr​​ansmitterters
列表与LT;发射机> transmitters = devices.get(i).getTransmitters();
//和每个发送器
for(int j = 0; j< transmitters.size(); j ++){
//创建一个新的接收器
transmitters.get( i).setReceiver(
//使用我自己的MidiInputReceiver
新的MidiInputReceiver(devices.get(i).getDeviceInfo()。toString())
);
}
//打开每个设备
devices.get(i).open();
//如果代码得到这么远而不抛出异常
//打印成功消息
System.out.println(devices.get(i).getDeviceInfo()+已打开 );
} catch(MidiUnavailableException e){}
}
}
}
//试图写我自己的类。我以为send方法处理发送给它的MidiEvents
公共类MidiInputReceiver实现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 - 从钢琴获取数据?



并且: http://www.jsresources.org/examples/MidiInDump.html



接口音序器看起来很复杂,我想要什么还有。

解决方案

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

  import javax.sound.midi。*; 
import java.util.ArrayList;
import java.util.List;
import java.io. *;
公共类MidiHandler
{

公共MidiHandler()
{
MidiDevice设备;
MidiDevice.Info [] infos = MidiSystem.getMidiDeviceInfo();
for(int i = 0; i< infos.length; i ++){
try {
device = MidiSystem.getMidiDevice(infos [i]);
//设备是否有任何发射器?
//如果是,请将其添加到设备列表
System.out.println(infos [i]);

//获取所有发射器
列表<发射器> transmitters = device.getTransmitters();
//和每个发射机

for(int j = 0; j< transmitters.size(); j ++){
//创建一个新的接收器
transmitters.get(j).setReceiver(
//使用我自己的MidiInputReceiver
新的MidiInputReceiver(device.getDeviceInfo()。toString())
);
}

发送器trans = device.getTransmitter();
trans.setReceiver(new MidiInputReceiver(device.getDeviceInfo()。toString()));

//打开每个设备
device.open();
//如果代码得到这么远而不抛出异常
//打印成功消息
System.out.println(device.getDeviceInfo()+Opened);


} catch(MidiUnavailableException e){}
}


}
//试图编写自己的类。我以为send方法处理发送给它的MidiEvents
公共类MidiInputReceiver实现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控制器),代码在创建MidiHandler实例后正确打印出midi received。



<希望这有帮助!


I have designed my own synthesizer in java and I now want to connect it with a midi keyboard. My class below searches through all the midi devices that have transmitters. It successfully finds my midi keyboard. I add my own receivers to each transmitter for each device so that it should pick up everything possible. From reading all the help documents and java doc I know that a Transmitter sends MidiEvents to a Receiver which then handles them with the send method. So I wrote my own inner class implementing Receiver and just used a println statement to check if there was anything detected at all in the send method. However nothing is picked up at all. There seems to be very little help to do such a simple thing and I have looked at every help file, javadoc and forum. I'm sure it must be something really obvious I have somehow missed.

My synthesizer should not be confused with the interface Synthesizer and it is not a midi instrument. It uses a synthesis algorithm and has a playback method. Basically I just need to get the midi keyboard sending a note on event which will invoke the playback method.

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() {}
    }
}

NOTE: I have already seen this: Java MIDI - getting data from piano?.

and this: http://www.jsresources.org/examples/MidiInDump.html

interface Sequencer looked way to complicated for what I want also.

解决方案

I've found that the MidiDevice getTransmitters() appears to return the list of currently already-open transmitters, not transmitters that are available to be opened. I believe the way to open a new transmitter is via the getTransmitter() method. I've modified your code to do this:

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() {}
    }
}

On my hardware (I have a simple USB MIDI controller plugged in), the code correctly prints out "midi received" after an instance of MidiHandler is created.

Hope this helps!

这篇关于Java从MIDI键盘获取输入的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆