如何在它到达我的 Java 接收器后访问 midi 信息

Posted

技术标签:

【中文标题】如何在它到达我的 Java 接收器后访问 midi 信息【英文标题】:How can I access midi Info after it arrives at my receiver in Java 【发布时间】:2016-10-05 01:15:19 【问题描述】:

我想做的是编写一个简单的程序,每当我按下外部 MIDI 控制器上的键时,内部接收器都会接受消息上的注释,并以某种方式允许它们打印为字节信息。我已经设置了一个接收器,该接收器设置为我的外部硬件 MIDI 控制器的发射器。我不确定在接收器到达那里后如何从接收器访问 MIDI 信息。在我对该主题所做的研究方面,我阅读了 oracles midi 并查看了 *** 上的各种示例。 Oracle 文章解释了接收器和发射器的连接以及如何将此信息发送到合成器,但没有涵盖如何在没有合成器或音序器的情况下从接收器本身访问 Midi 短消息。 *** 示例有相关信息,但我没有看到任何解释如何从接收器本身提取信息的内容。如果有人在哪里写一些示例代码,并写一个详细的解释,我认为这对像我这样的初学者来说将是一个很好的服务,因为它会展示如何在编写与 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() 中,而不调用该方法,每次我按下控制器上的一个键时,都会打印一条奇怪的消息,看起来像 a@787fd 和每次都改变。如果我使用 msg.getLength 我可以看到每次我按下一个键都会打印数字 3。考虑到短消息具有三个字节,即状态字节、音调字节和速度字节,这是有道理的。我仍然不知道如何让 java 打印实际字节。不过差不多了!

【问题讨论】:

让我困惑的一件事是为什么即使我没有在主方法中使用 r.send() 调用 Send 也会执行; 可能发生的事情是将发送器设置为我的接收器会调用方法发送。 好吧,我想通了!!!!我做了一个字节数组 bArray。然后在我设置 bArray = msg.getMessage 的方法中。现在我可以使用 bArray[1],bArray[2] 等打印我想要的数组的任何部分!这很棒,因为现在我可以开始使用这些信息来导致更复杂的事情发生!哈哈哈我做到了!!!!!!!是的!!!!!! Receiving com.sun.media.sound.FastShortMessage from MIDI Controller in Java, how to decode?的可能重复 【参考方案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)

【讨论】:

谢谢!!!!。没有考虑使用监听器。这对我有很大帮助!我投了你一票。它不会显示它,因为我是菜鸟,但无论如何谢谢。 所有最好的亚历克斯 @AlexC 你不能投票赞成答案,因为你没有足够的声誉。如果这回答了你的问题,你应该接受这个答案。 This is how to do it

以上是关于如何在它到达我的 Java 接收器后访问 midi 信息的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 中从 Receiver 获取 midi 消息

java midi 延迟

Java 从 MIDI 键盘获取输入

Java 从 MIDI 键盘获取输入

你如何在 java 中访问 MIDI IN 流中的数据?

如何访问 MIDI 文件中的最后一个事件?