如何在Java Sound API中使用MIDI?

时间:2013-12-28 21:18:03

标签: java audio midi javasound

我尝试使用Java soundAPI实现一个简单的MIDI播放器。我是Java的新手,但不是MIDI编程。我有问题正确理解soundAPI。我想要做的是选择一个设备,打开它,向它发送短的MIDI消息,然后关闭它。当使用SoundAPI时,必须执行上述操作,并添加到那个必须抓住发射器和接收器,打开发射器并将消息发送到其接收器(是吗??)

我设法掌握了MIDI系统并列出了所有可用设备的属性,这对于初学者来说非常好。我可以打开设备,但在打开发射器时会抛出MidiUnavailableException异常。我已经总结了我必须在下面的函数send_simple_message中遵循的所有步骤。我有两个问题:

  • 我的推理是正确的吗?我现在还不想使用音序器,我现在尝试使用Delphi中的Windows API重新构建我习惯使用的MIDI的某种方式,即:打开设备,向其发送消息并在准备好时将其关闭
  • 如果是这样,为什么在我尝试打开变送器时会抛出异常?这种情况发生在我尝试打开的所有MIDI设备上

非常感谢任何帮助。

  public int send_simple_message (int device_no, int byte_1, int byte_2, int byte_3) throws InvalidMidiDataException
  {
     MidiDevice Current_Device; // Refers to MIDI device
     Transmitter Sender;        // its Transmitter
     Receiver Getter;           // the sender of the transmitter
     ShortMessage message;      // MIDI message to be sent to Receiver

     try 
     {  // Get requested device
        Current_Device = MidiSystem.getMidiDevice (Device_Info [device_no]);
        System.out.println ("Selected: " + Current_Device.getDeviceInfo ().getName ());

        Current_Device.open();
        System.out.println ("Opened: " + Current_Device.getDeviceInfo ().getName ());

        Sender = Current_Device.getTransmitter (); // <== throws exception
        System.out.println ("Transmitter: " + Sender.toString ());

        Getter = Sender.getReceiver ();
        message = new ShortMessage (byte_1, byte_2, byte_3);
        Getter.send (message, -1);

        Sender.close ();
        Current_Device.close ();
     } catch (MidiUnavailableException e)
     {
        System.err.println ("MIDI device is unavailable");
        return MIDI_OPEN_NOT_AVAILABLE;
     } // try..catch
     return MIDI_ACTION_OK;
  } // send_simple_message //

0 个答案:

没有答案