Как я могу получить доступ к миди-информации после того, как она поступит на мой ресивер в Java

Что я хочу сделать, так это написать простую программу, в которой всякий раз, когда я нажимаю клавиши на моем внешнем миди-контроллере, внутренний приемник принимает примечание к сообщениям и каким-то образом позволяет их печатать в виде байтовой информации. Я настроил ресивер, который настроен на передатчик моего внешнего аппаратного миди-контроллера. Я не уверен, как получить доступ к миди-информации из ресивера после того, как она туда поступила. Что касается исследования, которое я провел по этому вопросу, я читал оракулы midi и просматривал различные примеры на StackOverFlow. В статье Oracle объясняется, как подключить приемник и передатчик и как отправить эту информацию на синтезатор, но не рассказывается, как получить доступ к коротким сообщениям Midi с самого приемника без синтезатора или секвенсора. В примерах StackOverFlow есть соответствующая информация, но я не видел ничего, что объясняло бы, как получить информацию из самого получателя. Если бы кто-то написал пример кода и написал подробное объяснение, я думаю, это было бы отличной услугой для начинающих, таких как я, потому что это показало бы, как сделать первый шаг в написании кода, совместимого с midi, т.е. как получить midi-данные на Java, а затем первые шаги по их использованию. Вот пример кода того, что я уже пробовал.

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

Я подключил передатчик и приемник, но не знаю, что делать дальше, чтобы извлечь миди-информацию из приемника, чтобы распечатать ее. Интерфейс получателя имеет только два метода: close и send, где close закрывает получатель, а Send отправляет сообщение самому получателю. Надеюсь, я смогу найти какой-нибудь способ взять миди-информацию, поступающую на приемник, и сохранить ее в байтовой переменной с именем midiInfo, которую я затем смогу распечатать.

Хорошо, я возился с Java в течение последнего часа, и я почти понял это. Я думаю, что меня смущает то, как методы работают в классе, когда объект этого класса был создан. Например, просто поместив println(msg) в метод Send() из класса, который я создал, который реализует приемник, без вызова метода, каждый раз, когда я нажимаю клавишу на моем контроллере, печатается странное сообщение, которое выглядит как @787fd и меняется каждый раз. Если я использую msg.getLength, я вижу, что каждый раз, когда я нажимаю клавишу, печатается число 3. Это имеет смысл, учитывая, что короткое сообщение состоит из трех байтов: байт состояния, байт высоты тона и байт скорости. Чего я до сих пор не могу понять, так это того, как заставить java печатать фактические байты. Хотя почти там!


person AlexC    schedule 05.10.2016    source источник
comment
Одна вещь, которая меня смущает, это то, почему Send выполняется, хотя я не вызываю его в основном методе с помощью r.send() ;   -  person AlexC    schedule 05.10.2016
comment
Возможно, происходит то, что установка передатчика на мой приемник вызывает метод send.   -  person AlexC    schedule 05.10.2016
comment
Ладно я разобрался!!!! Я сделал байтовый массив bArray. Затем в методе я установил bArray = msg.getMessage. Теперь я могу распечатать любую часть массива, которую захочу, используя bArray[1],bArray[2] и т. д.! Это здорово, потому что теперь я могу начать использовать эту информацию, чтобы заставить происходить более сложные вещи!! ахаха я сделал это!!!!!! да!!!!!   -  person AlexC    schedule 05.10.2016
comment


Ответы (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)
person David Koelle    schedule 14.10.2016
comment
Спасибо!!!!. Не думал об использовании слушателей. Это мне очень поможет! Я проголосовал за тебя. Это не будет отображаться, потому что я нуб, но все равно спасибо. - person AlexC; 16.10.2016
comment
Всего наилучшего Алекс - person AlexC; 16.10.2016
comment
@AlexC Вы не можете голосовать за ответ, потому что у вас недостаточно репутации. Если это ответило на ваш вопрос, вы должны принять этот ответ. Вот как это сделать - person Programmer; 02.11.2016