ho sbattere la testa su questo per tutto il giorno, leggere tutto quello che riesco a trovare, ha seguito la fonte JDK intorno, senza fortuna nel trovare i dettagli scabrosi su COME o DOVE sguardi java ottenere dati su un dispositivo midi e determina cosa è cosa.MIDI OUT trasmettitore non disponibili
Sto provando a catturare i messaggi midi attraverso la mia porta NI Audio 8 DJ MIDI IN
, ma, java non sta "vedendo" la porta MIDI IN, ma solo l'uscita, che ho usato con successo per inviare midi con. Ottengo anche gli stessi risultati con un dispositivo midi USB UNO M-Audio: MidiSystem.getMidiDeviceInfo()
solo "vede" la porta di uscita.
Ho verificato il funzionamento della porta MIDI IN con:
amidi -p hw:2,0 -d
e inviandolo alcuni segnali. Funziona bene.
getMaxTransmitters()
restituisce zero. MidiSystem.getMidiDeviceInfo()
mostra solo una voce per entrambi i dispositivi: Audio8DJ [hw:2,0]
o Interface [hw:2,0]
Il seguente codice funziona bene per un ricevitore e ritengo è solo i bit devo verificare che getTransmitter()
afferra la porta, poiché funziona solo per l'altro e tutto funziona bene, fino a ottenere un'eccezione MidiUnavailableException/Transmitter non disponibile.
Ho anche preso la trappola getMaxReceivers()
perché stavo solo cercando di vedere se il dispositivo offriva solo una voce e la risolveva, ma no.
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;
}
Quindi la cosa che mi sta facendo qui è questa: le liste alsa una sola voce nel amidi -l
e quando ho specificare che come porto per scaricare, funziona benissimo. Java ottiene la stessa immissione di testo e non riesce a riordinare il MIDI IN, assegnandogli la classe com.sun.media.sound.MidiOutDeviceProvider
, quindi mi chiedo come fa, o dove Java capisce cosa un dispositivo ha da offrire e perché non lo vede? porta di input che Alsa sta vedendo.
Sto codificando con eclissi Versione: 3.8.1 IDE con JDK1.6, su un SO linux mint,.
Sarò felice di fornire qualsiasi richiesta. Grazie per aver letto!
Solo un pensiero casuale ... hai provato a eseguirlo usando 'sudo'? (Ad esempio, 'sudo java your.class.name' sulla riga di comando.) Ho riscontrato problemi in cui è necessario essere root per manipolare alcuni dispositivi, quindi potrebbe valere la pena provare. –
Ci ho pensato, e sono aperto al suggerimento, ma, sono stato titubante a provare per due motivi che circondano la reazione istintiva che eseguire applicazioni complesse come root è pericoloso: 1) poiché può ottenere Porta MIDI OUT senza problemi, quindi preferirei scoprire quale file java sta accedendo e risolvere il problema. 2) non dovrebbe essere eseguito come root e se eseguirlo come root lo risolve, sono tornato allo stesso problema di capire quale file ha il problema di accesso. –
Grazie ancora per l'aiuto Mike, mi hai fatto andare nella giusta direzione. Si prega di vedere la mia risposta qui sotto. –