Получение миди-сообщений от Receiver в Java

Я пытаюсь использовать приемник, чтобы извлекать информацию о миди-событиях во время воспроизведения. Я хочу прослушать сыгранные ноты и синхронизировать их с каким-то событием. Я прочитал документацию и не знаю, как на самом деле использовать передатчик/приемник. Если кто-то может помочь указать мне правильное направление в том, как я могу получить 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);
        }
    }

person Ryan McCauley    schedule 14.08.2017    source источник
comment
Возможный дубликат Java Midi - Как получать заметки из миди во время воспроизведения   -  person CL.    schedule 14.08.2017
comment
Я прочитал этот ответ. Одна из ссылок говорит мне использовать передатчик/приемник, но не содержит никаких подробностей о его реализации или о том, как он работает. Другой дает исходный код, показывающий дамп приемника, но исходный код довольно продвинутый для меня, и у меня возникли проблемы с определением того, как на самом деле используется приемник.   -  person Ryan McCauley    schedule 14.08.2017
comment
Ваш собственный объект должен реализовывать интерфейс Receiver.   -  person CL.    schedule 14.08.2017
comment
Спасибо, мне удалось заставить его работать.   -  person Ryan McCauley    schedule 14.08.2017


Ответы (1)


Это было решение для прослушивания всех миди-сообщений.

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

    }
}
person Ryan McCauley    schedule 14.08.2017