使用Java Sound API动态创建笔记。如何处理多个笔记?

时间:2019-02-17 15:25:07

标签: java midi javasound

我正在使用Java Sound API,并且我知道如何使用Sequencer来编辑和执行音轨。我现在的问题是如何正确地实时播放多个音符(不一定同时播放)?

我使用了一条音轨,添加了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();
    }

0 个答案:

没有答案