2016-05-22 10 views
0

Я пишу приложение для управления устройствами запуска Novation (для тех, кто знаком). Пусковая панель устанавливает два MIDI-устройства: один для ввода (кнопки нажаты), и один для вывода (светодиоды управления).Как перехватить MIDI-сообщения?

Идея состоит в том, что после получения сообщения с панели запуска я хочу отправить последовательность других сообщений. Каков наилучший способ сделать это?

На данный момент я цепь передатчика устройства ввода, чтобы приемник выходного устройства, так что каждое сообщение, полученное непосредственно отправляется обратно в Launchpad:

Transmitter lpTransmitter = inputDevice.getTransmitter(); 
lpTransmitter.setReceiver(outputDevice.getReceiver()); 
+1

«после получения сообщения с пусковой панели отправьте последовательность других сообщений». Вы правильно описали, как это работает. в чем именно проблема?: –

+0

Ну, как я узнаю, что получил сообщение? Есть ли какой-нибудь прослушиватель событий? –

ответ

0

Мне удалось найти решение самостоятельно. То, что я сделал, это привязать устройства, используя мою собственную реализацию Transmitter и Receiver. Как я понимаю, сообщение midi выглядит следующим образом:

вход пусковой панели -> входной приемник приемника -> входной сигнал передатчика -> мой собственный приемник -> (мои вычисления) -> мой собственный передатчик -> выход приемник приемника -> выход передатчик Device -> выход для пусковой панели.

Теперь, медведь со мной, потому что я не знаю, если это правильный способ, чтобы это сделать, но мой код выглядит следующим образом:

// main 
// get launchpad devices, open them 

MyMidiDevice myDevice = new MyMidiDevice(); 

inputDevice.getTransmitter().setReceiver(myDevice); 
myDevice.setReceiver(outputDevice.getReceiver()); 

код класса MyMidiDevice:

public class MyMidiDevice implements Transmitter, Receiver 
{ 

    private Receiver receiver; 

    @Override 
    public Receiver getReceiver() 
    { 
     return this.receiver; 
    } 

    @Override 
    public void setReceiver(Receiver receiver) 
    { 
     this.receiver = receiver; 
    } 

    @Override 
    public void close() 
    { 
    } 

    @Override 
    public void send(MidiMessage message, long timeStamp) 
    { 
     System.out.println(message); // computations 
     this.getReceiver().send(message, timeStamp); 
    } 
} 
0

Пакет javax.sound.midi имеет интерфейс, который реализуется с помощью кода который хочет получать события. Он называется Receiver.

Позаботьтесь о open the device before getting the transmitter.

+0

Я знаю о приемнике, но как его использовать для получения сообщений? Создать собственный класс, который его реализует? Javadoc говорит мне, что я должен определить 'send()', но будет ли этот метод автоматически вызываться, если я свяжу передатчик? Простите невежество, я новичок в Java –