gpt4 book ai didi

java - 在 Java 中,MIDI 信息到达接收器后如何访问它

转载 作者:行者123 更新时间:2023-12-01 09:25:35 25 4
gpt4 key购买 nike

我想做的是编写一个简单的程序,每当我按下外部 MIDI Controller 上的按键时,内部接收器就会接受消息上的注释,并以某种方式允许它们作为字节信息打印。我已经设置了一个接收器,该接收器设置为我的外部硬件 MIDI Controller 的发射器。我不知道如何在接收器到达那里后访问它的 MIDI 信息。就我在该主题上所做的研究而言,我阅读了 oracle midi over view 并查看了 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 信息,以便我可以打印它。接收者接口(interface)只有两个方法,close和send,其中close关闭接收者,Send发送消息给接收者本身。希望我能找到某种方法来获取到达接收器的 midi 信息并将其存储在一个名为 midiInfo 的字节变量中,然后我可以打印它。

好吧,我在过去的一个小时里一直在研究 Java,而且我几乎已经弄清楚了。我认为我感到困惑的是当类的对象被实例化时,方法在类中的工作方式。例如,只需将 println(msg) 放入我创建的实现接收器的类的 Send() 方法中,而不调用该方法,每次我按下 Controller 上的一个键时,就会打印一条奇怪的消息,看起来像 a@787fd 和每次都会改变。如果我使用 msg.getLength 我可以看到每次按下一个键都会打印数字 3。考虑到短消息具有三个字节:状态字节、音调字节和速度字节,这是有道理的。我仍然不明白如何让 java 打印实际的字节。不过就快到了!

最佳答案

最简单的方法是使用 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)

关于java - 在 Java 中,MIDI 信息到达接收器后如何访问它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39864008/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com