Я придерживаюсь подхода, описанного в Как воспроизвести файл .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