Получение com.sun.media.sound.FastShortMessage от MIDI-контроллера в Java, как декодировать?

У меня есть настроенная java-программа, которая принимает MIDI-вход от контроллера и в идеале выполняет разные действия (не обязательно связанные с воспроизведением вывода синтезатора) в зависимости от того, какая MIDI-заметка отправляется.

Мой код в значительной степени основан на коде в этом вопросе SO: Java получает ввод с MIDI-клавиатуры, в частности, я использую весь класс MidiInputReceiver. Я модифицировал его, чтобы он выполнял System.out.println(msg), а также печатал «MIDI получено», и, похоже, он работает, поскольку каждый раз, когда я нажимаю клавишу на своем контроллере, он обнаруживает MIDI и печатает MIDI-сообщение. , но я не знаю, как декодировать вывод во что-то, что я могу расшифровать, если это вообще возможно.

Результат, который я получаю:

midi received
com.sun.media.sound.FastShortMessage@75b0e2c3
midi received
com.sun.media.sound.FastShortMessage@2ff7ac92
midi received
com.sun.media.sound.FastShortMessage@2d62bdd8
midi received
com.sun.media.sound.FastShortMessage@2d9dc72f

Я пытался использовать этот класс Java http://www.jsresources.org/examples/DumpReceiver.java.html для декодирования сообщения, но он декодирует только короткие сообщения, а не FastShortMessages, и я не могу найти в Интернете никакой документации о том, что такое FastShortMessage, не говоря уже о том, как преобразовать из FSM в СМ. У кого-нибудь есть идеи? Есть ли более простой способ, чем то, что я делаю?

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

Мне только что удалось решить свою проблему с помощью кода ниже.

public void send(MidiMessage msg, long timeStamp) {
    // Print to confirm signal arrival
    System.out.println("midi received");

    byte[] aMsg = msg.getMessage();
    // take the MidiMessage msg and store it in a byte array

    // msg.getLength() returns the length of the message in bytes
    for(int i=0;i<msg.getLength();i++){
        System.out.println(aMsg[i]);
        // aMsg[0] is something, velocity maybe? Not 100% sure.
        // aMsg[1] is the note value as an int. This is the important one.
        // aMsg[2] is pressed or not (0/100), it sends 100 when they key goes down,  
        // and 0 when the key is back up again. With a better keyboard it could maybe
        // send continuous values between then for how quickly it's pressed? 
        // I'm only using VMPK for testing on the go, so it's either 
        // clicked or not.
    }
    System.out.println();
}

Пример вывода для двух нажатых клавиш:

midi received 
-103
71
100

midi received
-119
71
0

midi received
-103
52
100

midi received
-119
52
0

Таким образом, aMsg[1] содержит номер Midi для каждой заметки, на которую можно сослаться где угодно в Интернете, я не могу опубликовать ссылку из-за rep.

Методы getMessage() и getLength() взяты из http://docs.oracle.com/javase/7/docs/api/javax/sound/midi/MidiMessage.html, я до сих пор не понял, что такое FastShortMessage, но это может быть просто оставшийся устаревший код или что-то в этом роде? Это материал com.sun, так что он должен быть довольно старым.

Отсюда я могу сделать оператор switch() в aMsg[1] с другим регистром, в зависимости от того, какая клавиша нажата, и это именно то, что я стремился сделать, что будет обратно совместимо с 1.6, поскольку это целое число.


person user24601    schedule 22.04.2014    source источник


Ответы (1)


FastShortMessage (косвенно) происходит от MidiMessage; просто обращаться с этим как один.

Когда у вас есть ShortMessage, вы должны использовать функции getCommand/getChannel/getData1/2, которые проще в использовании, чем временный массив байтов.

person CL.    schedule 22.04.2014