我已經設計了我自己的合成器在java中,我現在想要連接它與MIDI鍵盤。我的課程通過所有有變送器的MIDI設備進行搜索。它成功找到我的midi鍵盤。我爲每個設備添加自己的接收器到每個發射器,以便它可以接收所有可能的東西。從閱讀所有的幫助文檔和java文檔,我知道發送器將MidiEvent發送給接收器,然後使用發送方法處理它們。所以我編寫了自己的實現Receiver的內部類,並使用println語句來檢查send方法中是否檢測到任何東西。然而,沒有任何東西被拿起。似乎沒有什麼幫助做這樣一個簡單的事情,我已經看過每個幫助文件,javadoc和論壇。我敢肯定,這肯定是一件非常明顯的事情,我不知何故錯過了。爪哇從MIDI鍵盤獲取輸入
我的合成器不應該與界面合成器混淆,它不是一個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
接口音序看着方式複雜,我想也是。
非常感謝!這確實起作用,也不太複雜。 – Jonathan