在 Java 中从 Receiver 获取 midi 消息
Posted
技术标签:
【中文标题】在 Java 中从 Receiver 获取 midi 消息【英文标题】:Getting midi messages from Receiver in Java 【发布时间】:2017-08-14 08:27:46 【问题描述】:我正在尝试使用接收器,以便在播放时提取 MIDI 事件信息。我想听播放的音符并同步它们是一些事件。我已阅读文档,但不确定如何实际使用发射器/接收器。如果有人可以帮助我指出如何从接收器获取 midi 事件的正确方向,我将不胜感激。
编辑:下面提供的可能副本并未解释接收器的实际工作方式。它提供了有关实现的源代码,但作为初学者,源代码对我来说太高级了,无法理解。
import javax.sound.midi.*;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
public class Main
public static Sequencer sequencer;
public static Sequence sequence;
public static Receiver synthRcvr;
public static Transmitter seqTrans;
public static void main(String[] args)
try
sequencer = MidiSystem.getSequencer();
sequence = MidiSystem.getSequence(new File("test.midi"));
seqTrans = sequencer.getTransmitter();
synthRcvr = sequencer.getReceiver();
seqTrans.setReceiver(synthRcvr);
sequencer.open();
sequencer.setSequence(sequence);
sequencer.start();
catch (IOException | MidiUnavailableException | InvalidMidiDataException e)
System.out.println(e);
【问题讨论】:
Java Midi - How to get notes from midi whilst it's playing的可能重复 我读了那个答案。其中一个链接告诉我使用发射器/接收器,但没有关于实现它或它如何工作的任何细节。另一个给出了显示接收器转储的源代码,但源代码对我来说非常先进,我在连接接收器的实际使用方式时遇到了麻烦。 你自己的对象必须实现Receiver
接口。
谢谢你,我设法让它工作了。
【参考方案1】:
这是收听所有 MIDI 消息的解决方案。
import javax.sound.midi.*;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
public class Main
public static Receiver synthRcvr = new CustomReceiver();
public static Transmitter seqTrans;
public static Synthesizer synth;
public static void main(String[] args)
try
sequencer = MidiSystem.getSequencer();
sequence = MidiSystem.getSequence(new File("test.midi"));
Sequencer sequencer = MidiSystem.getSequencer();
seqTrans = sequencer.getTransmitter();
seqTrans.setReceiver(synthRcvr);
sequencer.open();
sequencer.setSequence(sequence);
sequencer.start();
catch (IOException | MidiUnavailableException | InvalidMidiDataException e)
System.out.println(e);
这是实现接收器的类:
import javax.sound.midi.MidiMessage;
import javax.sound.midi.Receiver;
public class CustomReceiver implements Receiver
public CustomReceiver()
@Override
public void send(MidiMessage message, long timeStamp)
// Process midi messages here
@Override
public void close()
【讨论】:
以上是关于在 Java 中从 Receiver 获取 midi 消息的主要内容,如果未能解决你的问题,请参考以下文章