Я ломал голову над этим весь день, читал все, что мог найти, следил за исходным кодом JDK, но мне не удалось узнать кровавые подробности о КАК или ГДЕ java ищет данные о миди-устройстве и определяет, что к чему.
Я пытаюсь захватить миди-сообщения через мой порт NI Audio 8 DJ MIDI IN
, но java не «видит» порт MIDI IN, а только выход, который я успешно использовал для отправки миди. Я также получаю те же результаты с миди-устройством M-Audio USB UNO: MidiSystem.getMidiDeviceInfo()
"видит" только выходной порт.
Я проверил работу порта MIDI IN с помощью:
amidi -p hw:2,0 -d
и посылает ему какие-то сигналы. Работает отлично.
getMaxTransmitters()
возвращает ноль. MidiSystem.getMidiDeviceInfo()
показывает только одну запись для обоих устройств: Audio8DJ [hw:2,0]
или Interface [hw:2,0]
Приведенный ниже код отлично работает для приемника, и я думаю, что это только те биты, которые мне нужны, чтобы убедиться, что getTransmitter()
захватывает порт, поскольку он просто работает для другого, и все работает нормально, вверх я получаю исключение MidiUnavailableException / Transmitter not available.
Я даже убрал ловушку getMaxReceivers()
, потому что просто пытался увидеть, предложило ли устройство только одну запись и отсортировало ее, но нет.
public static Transmitter getMidiIn () {
if (midiIn == null){
devices = MidiSystem.getMidiDeviceInfo();
for(MidiDevice.Info info: devices){
System.out.println("device class " + info.getClass());
MidiDevice device;
try{
device = MidiSystem.getMidiDevice(info);
if (info.toString().equals("Audio8DJ [hw:2,0]")){
if (device.getMaxTransmitters() != 0){
try{
device.open();
System.out.println("max transmitters:" + device.getMaxTransmitters());
midiIn = device.getTransmitter();
System.out.println("Found a transmitter: "+ midiIn);
break;
} catch (Exception e){
e.printStackTrace();
}
}
}
} catch (MidiUnavailableException e1){
e1.printStackTrace();
}
}
}
return midiIn;
}
Итак, вот что меня привело к следующему: alsa перечисляет только одну запись в amidi -l
, и когда я указываю ее в качестве порта для дампа, все работает нормально. Java получает ту же текстовую запись и не может отсортировать MIDI IN, присваивая ему класс com.sun.media.sound.MidiOutDeviceProvider
, поэтому я задаюсь вопросом, как и где Java выясняет, что может предложить устройство, и почему он не видит входной порт, который видит alsa.
Я кодирую с помощью eclipse Версия: 3.8.1 IDE с JDK1.6, на ОС Linux Mint, .
Я буду рад предоставить все, о чем просят. Спасибо за чтение!
sudo
? (т. е.sudo java your.class.name
в командной строке.) Я встречал проблемы, когда для управления некоторыми устройствами нужно иметь права root, так что, возможно, стоит попробовать. - person Mike Harris   schedule 06.01.2016