1

我正在使用 Java Sound API,并且我也知道如何使用音序器来编辑和执行曲目。我现在的问题是如何正确弹奏多个音符(不一定同时)?

我使用了一个音轨,添加了 MidiEvent NoteON 和 NoteOFF,然后启动了音序器来播放 Note。在第二次运行时,我从轨道中删除了之前的事件并将合成器设置为位置 0 以重新开始。这很好用。

问题是即使他们的音符关闭事件没有完全执行,以前的音符也会自然地被切断,因此音符不会像我想要的那样持续多久。

是通过将音符事件发送到不同的轨道来解决这个问题的正确方法还是有更好的方法?我遇到的问题是,从位置 0 开始音序器会导致之前的一些音符再次播放。

public void playSingleNote(int note, int velocity) throws InvalidMidiDataException, MidiUnavailableException {
        long tick = 0;
        sequencer.setTickPosition(0);// Start at beginning.
        // Clean track
        for (int i = 0; i < track.size(); i++) {
            track.remove(track.get(i));
        }

        ShortMessage msg = new ShortMessage(ShortMessage.NOTE_ON, 0, note, velocity);
        MidiEvent evt = new MidiEvent(msg, tick);
        track.add(evt);

        msg = new ShortMessage(ShortMessage.NOTE_OFF, 0, note, velocity);
        evt = new MidiEvent(msg, tick + 28);
        track.add(evt);

        sequencer.start();
    }
4

0 回答 0