简体   繁体   English

使用Java从Receiver获取Midi消息

[英]Getting midi messages from Receiver in Java

I am trying to use a receiver so that I can extract midi event information as it is playing. 我正在尝试使用接收器,以便我可以提取正在播放的midi事件信息。 I want to listen for notes played and synchronise them was some event. 我想听演奏的音符并与之同步是一件大事。 I have read the documentation and I am not sure how to actually use the transmitter / receiver. 我已经阅读了文档,但不确定如何实际使用发送器/接收器。 If someone could help point me in the right direction on how I can grab midi events from the receiver I would be very grateful. 如果有人可以帮助我指出如何从接收方获取Midi事件的正确方向,我将不胜感激。

Edit: The possible duplicate offered below doesn't explain how the receiver actually works. 编辑:下面提供的可能重复内容并未说明接收器的实际工作方式。 It offers source code on the implementation but as a beginner the source code was too advanced for me to make sense of. 它提供了实现的源代码,但作为一个初学者,源代码对于我来说太高级了。

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);
        }
    }

This was the solution for listening to all midi messages. 这是收听所有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);
    }
}

This is the class the implements the receiver: 这是实现接收者的类:

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() {

    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM