0

我希望能够独立发送多个 MIDI 消息。但问题是我必须等到上一个笔记结束。我必须为我所有的声音创建一个线程吗?假设我希望能够同时演奏 10 个音符。那么我必须创建10个线程?

我通过javax.sound.midi

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();
    }

}
4

1 回答 1

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 消息是“同时的”,因为发送者将足够快地发送音符。

于 2014-07-01T10:07:11.653 回答