Java: внешнее оборудование MIDI Не воспроизводится файл MIDI должным образом - PullRequest
0 голосов
/ 18 марта 2019

Я придерживаюсь подхода, описанного в Как воспроизвести файл .MIDI в новом потоке в Java? , однако я не могу воспроизвести файл MIDI на моей PSR Yamaha. Он перечисляет его как MIDI-устройство, а входной порт - четвертый.

import javax.sound.midi.MidiSystem;
import javax.sound.midi.Sequence;
import javax.sound.midi.Sequencer;
import java.io.File;
import javax.sound.midi.MidiDevice;
import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.Receiver;
import uk.co.xfactorylibrarians.coremidi4j.CoreMidiDeviceProvider;

public class psrMidiPlayer {

    /**
     * Play a Midi file.
     */
    public static void playMidiFile(String fileName, int DEVICE_NUMBER) {
        try {
            for (Receiver receiver : MidiSystem.getSequencer().getReceivers()) {
                receiver.close();
            }
            System.out.println("Working MIDI Devices:");
            for (javax.sound.midi.MidiDevice.Info device : CoreMidiDeviceProvider.getMidiDeviceInfo()) {
                System.out.println("  " + device +"    "+ device.getVendor());
            }

            MidiDevice.Info[] MidiDeviceInfos = MidiSystem.getMidiDeviceInfo();
            //find the suitable device number here, based on some criteria
            MidiDevice MidiOutDevice = MidiSystem.getMidiDevice(MidiDeviceInfos[DEVICE_NUMBER]);


            if (!(MidiOutDevice.isOpen())) {
                try {
                    MidiOutDevice.open();
                } catch (MidiUnavailableException e) {
                   e.printStackTrace();
                }
            }

            Receiver MidiOutReceiver = MidiOutDevice.getReceiver();
            Sequencer MidiOutSequencer = MidiSystem.getSequencer();


            System.out.println( "getMaxReceivers() =" + MidiOutDevice.getMaxReceivers());
            System.out.println( "getMaxTransmitters() =" + MidiOutSequencer.getMaxTransmitters());

            //Add the new MIDI out device here.
            File myMidiFile = new File(fileName);
            MidiOutSequencer.getTransmitter().setReceiver(MidiOutReceiver);

            MidiOutSequencer.open();
            Sequence mySeq = MidiSystem.getSequence(myMidiFile);
            MidiOutSequencer.setSequence(mySeq);

            MidiOutSequencer.start();
            //MidiOutSequencer.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public static void main(String args[]) {
        int i = 3;
        playMidiFile("/pass2midifile/bahar-martik.mid", i);
    }

}

Внешний Synth использует стандартный драйвер USB-MIDI Yamaha, и все, что я слышу, это проигрывание одной ноты E3 на пианино, и когда я отслеживаю входящие миди-сообщения, они все находятся на первом канале и E3.

23:21:11.613    To Port 1   Note On 1   E3  127
23:21:11.613    To Port 1   Note On 1   E3  127
23:21:11.613    To Port 1   Note On 1   E3  127
23:21:11.613    To Port 1   Note On 1   E3  127
23:21:11.613    To Port 1   Note On 1   E3  127
23:21:11.613    To Port 1   Note On 1   E3  127
23:21:11.613    To Port 1   Note On 1   E3  127
23:21:11.613    To Port 1   Note On 1   E3  127
23:21:11.613    To Port 1   Note On 1   E3  127
23:21:11.613    To Port 1   Note On 1   E3  127
23:21:11.613    To Port 1   Note On 1   E3  127
23:21:11.613    To Port 1   Note On 1   E3  127
23:21:11.613    To Port 1   Note On 1   E3  127
23:21:11.613    To Port 1   Note On 1   E3  127
23:21:11.613    To Port 1   Note On 1   E3  127
23:21:11.613    To Port 1   Note On 1   E3  127
23:21:11.613    To Port 1   Note On 1   E3  127

В то же время мои динамики iMac воспроизводят песню без остановки, используя «Gervill», если я не ошибаюсь.

Вопрос1: Как я могу отказаться от синтезатора по умолчанию, чтобы он не воспроизводился одновременно с моим External MIDI HW? Это не работает?

for (Receiver receiver : MidiSystem.getSequencer().getReceivers()) {
            receiver.close();
        }

Вопрос 2: Как я могу заставить мой код воспроизводить все 16 каналов? Я предполагаю, что у меня есть неограниченное количество приемников и трамвайщиков на моем приемнике и секвенсоре:

getMaxReceivers() =-1
getMaxTransmitters() =-1

Вопрос 3: Позже мне нужен мой MIDI-файл для воспроизведения на определенном канале? Как это возможно, пожалуйста?

Вопрос 4: Если MIDI-файл записан на PSR External Synth, нужно ли мне заранее выполнять какие-либо настройки на моем внешнем синтезаторе, чтобы быть уверенным, что он воспроизводит те же инструменты и вносить изменения в программу?

Working MIDI Devices:
  CoreMIDI4J - IAC Driver    Apple Inc.
  CoreMIDI4J - PSR-A3000 Port 1    Yamaha Corporation
  CoreMIDI4J - IAC Driver    Apple Inc.
  CoreMIDI4J - PSR-A3000 Port 1    Yamaha Corporation
  CoreMIDI4J - PSR-A3000 Port 2    Yamaha Corporation
  Gervill    OpenJDK
  Real Time Sequencer    Oracle Corporation

Любая помощь будет принята с благодарностью.

CS

...