2012-02-29 11 views
6

Attualmente sto provando a collegare il midiport del mio piano al mio computer. Ho letto tutto quello che ho potuto trovare su questo, ma in qualche modo mi manca qualcosa, quindi spero che qualcuno qui possa aiutarmi. Sto provando a farlo per una settimana e sta diventando davvero frustrante.Accesso a un dispositivo MidiDevice in Java

public class MidiDeviceGetter { 

    public MidiDeviceGetter() {} 

    public static void listTransmitterDevices() throws MidiUnavailableException { 
     MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo(); 
     for (int i = 0; i < infos.length; i++) { 
     MidiDevice device = MidiSystem.getMidiDevice(infos[i]); 
     if (device.getMaxTransmitters() != 0) 
      System.out.println(device.getDeviceInfo().getName().toString() 
        + " has transmitters"); 
     } 
    } 

    // should get me my USB MIDI Interface. There are two of them but only one 
    // has Transmitters so the if statement should get me the one i want 
    public static MidiDevice getInputDevice() throws MidiUnavailableException { 
     MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo(); 
     for (int i = 0; i < infos.length; i++) { 
     MidiDevice device = MidiSystem.getMidiDevice(infos[i]); 
     if (device.getMaxTransmitters() != 0 
       && device.getDeviceInfo().getName().contains("USB")) { 
      System.out.println(device.getDeviceInfo().getName().toString() 
        + " was chosen"); 
      return device; 
     } 
     } 
     return null; 
    } 

    public static void main(String[] args) throws MidiUnavailableException, 
     IOException { 
     MidiDevice inputDevice; 

     // MidiDeviceGetter.listTransmitterDevices(); 
     inputDevice = MidiDeviceGetter.getInputDevice(); 

     // just to make sure that i got the right one 
     System.out.println(inputDevice.getDeviceInfo().getName().toString()); 
     System.out.println(inputDevice.getMaxTransmitters()); 

     // opening the device 
     System.out.println("open inputDevice: " 
      + inputDevice.getDeviceInfo().toString()); 
     inputDevice.open(); 
     System.out.println("connect Transmitter to Receiver"); 

     // Creating a Dumpreceiver and setting up the Midi wiring 
     Receiver r = new DumpReceiver(System.out); 
     Transmitter t = inputDevice.getTransmitter(); 
     t.setReceiver(r); 

     System.out.println("connected."); 
     System.out.println("running..."); 
     System.in.read(); 
     // at this point the console should print out at least something, as the 
     // send method of the receiver should be called when i hit a key on my 
     // keyboard 
     System.out.println("close inputDevice: " 
      + inputDevice.getDeviceInfo().toString()); 
     inputDevice.close(); 
     System.out.println(("Received " + ((DumpReceiver) r).seCount 
      + " sysex messages with a total of " 
      + ((DumpReceiver) r).seByteCount + " bytes")); 
     System.out.println(("Received " + ((DumpReceiver) r).smCount 
      + " short messages with a total of " 
      + ((DumpReceiver) r).smByteCount + " bytes")); 
     System.out.println(("Received a total of " 
        + (((DumpReceiver) r).smByteCount + 
         ((DumpReceiver) r).seByteCount) + " bytes")); 
    } 
} 

Bene, questo è quello che ho ottenuto finora. Volevo solo collegare il pianoforte in modo da poter andare più lontano da lì, ma come ho detto, non riesco a farlo funzionare.

Per il test ho preso la classe DumpReceiver da http://www.jsresources.org/examples/DumpReceiver.java.html.

Apprezzerei molto qualsiasi aiuto, grazie.

P.S .: E scusa per il mio inglese, non sono madrelingua.

Edit1: accordo con il commento:

mi aspetto che il programma per stampare qualcosa nella console quando ho colpito un tasto mentre System.in() è in esecuzione, perché in invio del ricevitore (Midimessage, lungo) metodo l'ultima linea è Prinstream.print (midimsg). Ho ragione, penso che il metodo di invio della classe di interfaccia Receiver viene sempre chiamato se sul Trasmettitore è suonata una nota a cui è collegato il ricevitore, no? Se solo questo non funzionasse potrei capirlo, ma ci sono anche alcune membrane del ricevitore che dovrebbero salvare il numero di chiavi che sono state colpite, ma queste membrane sono sempre nulle. Quindi il mio problema principale qui è che il metodo send non viene mai chiamato. Spero di aver chiarito quale sia il mio problema principale.

Edit2: Se ci si trova in questa "programmazione midi in java" e non si riscontrano errori importanti, per favore dimmelo. Ho appena scoperto che non riesco nemmeno a ottenere Midisignals in Steinbergs Cubase. Forse questa volta, il problema non era davanti allo schermo.

+0

* "Non riesco a farlo funzionare" * Forse è in sciopero, o assonnato, o semplicemente pigro. Per il primo, negozia. Per il secondo, concediti una buona notte di riposo e provalo al mattino. Per il terzo, prova l'approccio carota e bastone. Per qualsiasi altra cosa, prova a descrivere 1) Cosa ti aspettavi che succedesse 2) Cosa è successo realmente, e per l'utilità 3) Perché ti aspettavi (1) che accada. Inoltre, per un aiuto migliore prima, pubblica un [SSCCE] (http://sscce.org/). –

risposta

7

Ok l'ho capito. Il codice che ho postato è totalmente giusto e funzionante. Il problema era che la presa MIDI IN della mia interfaccia usb midi appartiene alla presa MIDI OUT del mio piano. Suppongo che mi spaccherò la testa contro un muro ora per alcune ore.

Grazie per la lettura.

Problemi correlati