java midi 解析_Java从MIDI键盘获取输入
我已經(jīng)用Java設(shè)計(jì)了自己的合成器,現(xiàn)在我想將其與Midi鍵盤連接。我在下面的課程搜索所有帶有發(fā)射器的Midi設(shè)備。它成功找到了我的Midi鍵盤。我將自己的接收器添加到每個(gè)設(shè)備的每個(gè)發(fā)送器中,以便它可以接收所有可能的信息。通過閱讀所有幫助文檔和Java文檔,我知道Transmitter將MidiEvents發(fā)送到Receiver,然后由Receiver處理send方法。因此,我編寫了自己的內(nèi)部類來實(shí)現(xiàn)Receiver,并僅使用了一個(gè)println語句來檢查send方法中是否檢測(cè)到任何東西。但是什么也沒撿到。做這種簡(jiǎn)單的事情似乎幾乎沒有幫助,我查看了每個(gè)幫助文件,javadoc和論壇。我敢肯定,這一定是我確實(shí)以某種方式錯(cuò)過的東西。
我的合成器不應(yīng)與界面合成器混淆,它也不是Midi樂器。它使用合成算法并具有回放方法。基本上,我只需要讓Midi鍵盤發(fā)送有關(guān)事件的便箋,便會(huì)調(diào)用播放方法。
import javax.sound.midi.*;
import java.util.ArrayList;
import java.util.List;
import java.io.*;
public class MidiHandler
{
//ArrayList of MidiDevices
private ArrayList devices = new ArrayList();
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
try {
//get all transmitters
List transmitters = devices.get(i).getTransmitters();
//and for each transmitter
for(int j = 0; 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() {}
}
}
注意:
我已經(jīng)看到了:Java MIDI-從鋼琴獲取數(shù)據(jù)嗎?
和這個(gè):http://www.jsresources.org/examples/MidiInDump.html
接口Sequencer看起來也很復(fù)雜,我也想要。
我發(fā)現(xiàn)MidiDevice getTransmitters()似乎返回當(dāng)前已經(jīng)打開的發(fā)送器列表,而不是返回可打開的發(fā)送器。 我相信,通過getTransmitter()方法可以打開一個(gè)新的發(fā)送器。 我已經(jīng)修改了您的代碼以執(zhí)行此操作:
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 transmitters = device.getTransmitters();
//and for each transmitter
for(int j = 0; 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() {}
}
}
在我的硬件上(我插入了一個(gè)簡(jiǎn)單的USB MIDI控制器),在創(chuàng)建MidiHandler實(shí)例之后,該代碼可以正確打印出" midi receive"。
希望這可以幫助!
非常感謝! 這確實(shí)可行,并且代碼也較少混淆。
我發(fā)現(xiàn)您必須在調(diào)用setRecceiver()之前打開設(shè)備,否則從上次運(yùn)行該應(yīng)用程序起,將使用任何垃圾MIDI數(shù)據(jù)調(diào)用接收方的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()));
在添加接收器之前打開deviced非常重要
總結(jié)
以上是生活随笔為你收集整理的java midi 解析_Java从MIDI键盘获取输入的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BZOJ 2957 楼房重建 (分块)
- 下一篇: java中如何getchar_是否有与g