我想要做的是编写一个简单的程序,每当我按下外部midi控制器上的按键时,内部接收器接受消息上的注释,并以某种方式允许它们作为字节信息打印。我已经设置了一个接收器,它被设置到我的外部硬件midi控制器的发射器。我不知道如何在接收器到达后从接收器访问midi信息。就我在这个主题上所做的研究而言,我已经在视图中阅读了oracles midi,并在StackOverFlow上查看了各种示例。 Oracle文章解释了连接接收器和发送器以及如何将此信息发送到合成器,但没有介绍如何在没有合成器或音序器的情况下从接收器本身访问Midi短消息。 StackOverFlow示例有相关信息,但我还没有看到任何解释如何从接收器本身提取信息的内容。如果有人在哪里写一些示例代码,并写出详细的解释,我认为对于像我这样的初学者来说这将是一项很棒的服务,因为它将展示如何编写与midi兼容的代码的第一步即如何接收Java中的midi数据,然后是能够使用它的第一步。以下是我正在尝试的一些示例代码。
package receivemidiattempt;
import javax.sound.midi.*;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class ReceiveMidiAttempt {
public static void main(String[] args) {
// My internal receiver which I set up with my own MidiReceiver class which implements
// Receiver
Receiver r = new MidiReceiver ();
//My Transmitter
Transmitter trans = null;
try {
//Setting up transmitter with the external midi controller
trans= MidiSystem.getTransmitter();
}
catch(MidiUnavailableException e)
{
System.out.println("No Midi port Detected");
}
//contecting the transmitter to my internal receiver
trans.setReceiver(r);
}
}
我已经连接了发射器和接收器,但我不知道该怎么做才能从接收器中提取midi信息,以便我可以打印它。接收器接口只有两种方法,close和send,其中close关闭接收器,Send发送消息给接收器本身。希望我能找到一些方法来获取midi信息到达接收器并将其存储在一个名为midiInfo的字节变量中,然后我可以打印它。
好吧,我在过去的几个小时里乱搞了Java,而且我几乎把它搞清楚了。我认为我所困惑的是当实例化该类的对象时方法在类中的工作方式。例如,只需将println(msg)放在我实现接收器的类中的方法Send()中,而不调用方法,每次按下控制器上的一个键时,都会打印一条看起来像@ 787fd的奇怪消息。每次都在变化。如果我使用msg.getLength,我可以看到,每按一次键,就会打印出数字3。考虑到短消息有三个字节,状态字节,音调字节和速度字节,这是有意义的。我仍然无法弄清楚如何让java打印实际的字节。几乎就在那里!
答案 0 :(得分:1)
最简单的方法是使用JFugue:
// You'll need some try/catches around this block. This is traditional Java Midi code.
MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
MidiDevice device = MidiSystem.getMidiDevice(infos[0]); // You'll have to get the right device for your MIDI controller.
// Here comes the JFugue code
MusicTransmitterToParserListener m = new MusicTransmitterToParserListener(device);
m.addParserListener(new ParserListenerAdapter() {
@Override public void onNotePressed(Note note) {
System.out.println(note + " pressed");
}
@Override public void onNoteReleased(Note note) {
System.out.println(note + " released");
}
} );
// Choose either this option:
m.startListening();
...do stuff...
m.stopListening();
// Or choose this option:
m.listenForMillis(5000); // Listen for 5000 milliseconds (5 seconds)