2014-07-01 84 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信息在一個循環中是「同時」的,因爲發送者會發送足夠快的音符。