2012-02-29 36 views
6

Tôi hiện đang cố gắng kết nối midiport của đàn piano với máy tính của mình. Tôi đã đọc tất cả mọi thứ tôi có thể tìm thấy về điều đó, nhưng bằng cách nào đó tôi đang thiếu một cái gì đó, vì vậy tôi hy vọng một ai đó ở đây có thể giúp tôi. Tôi đang cố gắng làm điều này trong một tuần nay và nó thực sự bực dọc.Truy cập MidiDevice bằng 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")); 
    } 
} 

Vâng, đó là những gì tôi đã có cho đến nay. Tôi chỉ muốn có được piano kết nối để tôi có thể đi xa hơn từ đó, nhưng như tôi đã nói, tôi không thể làm cho nó hoạt động được.

Để thử nghiệm, tôi đã lấy lớp DumpReceiver từ http://www.jsresources.org/examples/DumpReceiver.java.html.

Tôi rất cảm kích mọi trợ giúp, cảm ơn.

P.S .: Và xin lỗi vì tiếng anh của tôi, tôi không phải là người bản xứ.

Edit1: Theo nhận xét:

Tôi hy vọng programm để in cái gì đó trong giao diện điều khiển khi tôi nhấn một phím trong khi System.in() đang chạy, bởi vì trong gửi của Receiver (Midimessage, dài) phương thức dòng cuối cùng là Prinstream.print (midimsg). Tôi đúng, nghĩ rằng phương thức gửi của lớp giao diện Người nhận luôn được gọi nếu một Ghi chú được phát trên Máy phát mà Người nhận được kết nối với, phải không? Nếu chỉ có điều đó sẽ không làm việc tôi có thể con số nó ra, nhưng cũng có một số membervariables của người nhận mà nên tiết kiệm số lượng các phím bị trúng, nhưng những membervariables luôn luôn null. Vì vậy, vấn đề chính của tôi ở đây là, phương thức gửi không bao giờ được gọi. Tôi hy vọng tôi đã làm rõ vấn đề chính của tôi là gì.

Chỉnh sửa2: Nếu bạn tham gia vào toàn bộ chương trình "midi programming in java" này và bạn không thấy bất kỳ sai lầm lớn nào, vui lòng cho tôi biết. Tôi chỉ phát hiện ra rằng tôi cũng không thể nhận được bất kỳ Midisignals nào trong Steinbergs Cubase. Có lẽ lần này, vấn đề không ở phía trước màn hình.

+0

* "tôi không thể làm cho nó hoạt động" * Có thể nó đang bị đình công, hoặc buồn ngủ, hoặc chỉ đơn giản là lười biếng. Đối với người đầu tiên, thương lượng. Đối với thứ hai, hãy cho nó một đêm ngon giấc và thử nó vào buổi sáng. Đối với lần thứ 3, hãy thử cách tiếp cận cà rốt và gậy. Đối với bất cứ điều gì khác, hãy thử mô tả 1) Những gì bạn mong đợi xảy ra 2) Điều gì thực sự xảy ra, và cho tiện ích 3) Tại sao bạn mong đợi (1) xảy ra. Ngoài ra, để được trợ giúp tốt hơn sớm hơn, hãy đăng một [SSCCE] (http://sscce.org/). –

Trả lời

7

Ok tôi đã tìm ra. Mã tôi đăng là totaly đúng và làm việc. Vấn đề là, MIDI IN Plug của giao diện midi usb của tôi thuộc về phích cắm MIDI OUT của cây đàn piano của tôi. Tôi đoán tôi sẽ đập đầu vào một bức tường trong vài giờ.

Cảm ơn bạn đã đọc.