2012-02-29 34 views
6

Actualmente estoy tratando de conectar el midiport de mi piano a mi computadora. He leído todo lo que pude encontrar al respecto, pero de alguna manera me falta algo, así que espero que alguien aquí pueda ayudarme. Intento hacer esto durante una semana y es realmente frustrante.Acceso a un dispositivo Midi en 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")); 
    } 
} 

Bueno, eso es lo que tengo hasta ahora. Solo quería conectar el piano para poder ir más allá, pero como dije, no puedo hacer que funcione.

Para probar tomé la clase DumpReceiver de http://www.jsresources.org/examples/DumpReceiver.java.html.

Agradecería cualquier ayuda, gracias.

P.S .: Y lo siento por mi inglés, no soy hablante nativo.

Edit1: De acuerdo con el comentario:

espero que el programm para imprimir algo en la consola cuando golpeo una tecla mientras System.in() está en marcha, ya que en envío del receptor (Midimessage, largo) método la última línea es Prinstream.print (midimsg). Tengo razón, pensando que el método de envío de la clase de interfaz del receptor siempre se invoca si se reproduce una nota en el transmisor al que está conectado el receptor, ¿no? Si solo eso no funcionara, podría resolverlo, pero también hay algunas variables miembro del receptor que deberían guardar el número de claves que se activaron, pero estas variables de miembro siempre son nulas. Entonces, mi principal problema aquí es que el método de envío nunca se llama. Espero haber aclarado cuál es mi problema principal.

Edit2: Si te gusta toda esta "programación midi en java", algo y no ves ningún error importante, entonces dímelo. Acabo de enterarme de que tampoco puedo conseguir ningún Midisignals en Steinbergs Cubase. Quizás esta vez, el problema no estaba en frente de la pantalla.

+0

* "No puedo hacer que funcione" * Tal vez esté en huelga, o adormecido, o simplemente perezoso. Para el primero, negociar. Por el segundo, déjale una buena noche de descanso y pruébalo por la mañana. Para el 3ro, pruebe el enfoque zanahoria y palo. Para cualquier otra cosa, intente describir 1) Lo que esperaba que sucediera 2) Lo que realmente sucedió, y para la utilidad 3) Por qué esperaba (1) que sucediera. Además, para una mejor ayuda antes, publique un [SSCCE] (http://sscce.org/). –

Respuesta

7

Ok, lo descubrí. El código que publiqué es totalmente correcto y funciona. El problema era que el conector MIDI IN de mi interfaz usb midi pertenece al enchufe MIDI OUT de mi piano. Creo que voy a golpear mi cabeza contra la pared ahora por unas horas.

Gracias por leer.

Cuestiones relacionadas