2014-07-01 111 views
0

我希望能够独立发送多个MIDI信息。但问题是,我必须等到上一个注释结束。我是否必须为我所有的声音创建一个线程?假设我希望能够同时播放10个音符。那么我将不得不创建10个线程?发送多个MIDI信息

我派我的MIDI信息通过​​3210

public void playNote(int pitch, int length, int velocity) { 

    try { 

     msg.setMessage(ShortMessage.NOTE_ON, 0, pitch, velocity); 
     rcvr.send(msg, timeStamp); 

     Thread.sleep(length); 

     msg.setMessage(ShortMessage.NOTE_OFF, 0, pitch, 0); 
     rcvr.send(msg, timeStamp); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 
+0

“将MIDI信息同时发送给多个其他设备的设备可以通过多个发射机来实现,每个发射机都连接到不同设备的接收机” - http://docs.oracle.com/javase/tutorial/sound/概述 - MIDI.html –

回答

1

你不需要下一发送之前等待的说明。创建MIDI事件的FIFO:

public class MidiEvent 
    { 
    /**Number of time units to wait until this message should be sent. 
    */ 
    public int time_delta; 

    /**First status byte. 
    */ 
    public byte byte_0; 

    /**Second status byte. 
    */ 
    public byte byte_1; 

    /**Third status byte. 
    */ 
    public byte byte_2; 
    } 

然后将这些对象添加到队列中。玩家线程将在发送下一个事件之前睡眠time_delta单位。如果time_delta为零,则立即发送。当这个事件被发送时,下一个从FIFO中取出。

发送一串MIDI信息在一个循环中是“同时”的,因为发送者会发送足够快的音符。