Java Midi Sequencer - 使用播放头播放注释

时间:2012-03-17 14:42:11

标签: java swing sequence midi javasound

我目前已经实现了一项功能,允许用户播放他们播放的音符。

以下是代码:

public void playNotes() throws InvalidMidiDataException,
        MidiUnavailableException {

    ArrayList<KeyPress> keyPressList = keyPressListCollection.getKeyPressList();
    double bpm = keyPressListCollection.getMetronome().getBpm();
    double millisPerTick = (60000.0 / (bpm * 16.0));
    double ticksPerMilli = 1 / millisPerTick;

    if (keyPressListCollection.isPlaying()) {
        sequencer.stop();
        sequencer.close();
    }

    sequencer = MidiSystem.getSequencer();
    sequencer.open();
    Sequence sequence = new Sequence(Sequence.PPQ, 16);
    Track track = sequence.createTrack();

    for (int i = 0; i < keyPressList.size(); i++) {
        KeyPress keyPress = keyPressList.get(i);

        ShortMessage noteOnMsg = new ShortMessage();
        noteOnMsg.setMessage(ShortMessage.NOTE_ON, 0, keyPress.getKeyNumber(), keyPress.getVelocity());

        ShortMessage noteOffMsg = new ShortMessage();
        noteOffMsg.setMessage(ShortMessage.NOTE_OFF, 0, keyPress.getKeyNumber(), 0);

        track.add(new MidiEvent(noteOnMsg, (long) (keyPress.getStartTime() * ticksPerMilli)));
        track.add(new MidiEvent(noteOffMsg, (long) (keyPress.getEndTime() * ticksPerMilli)));

    }

    keyPressListCollection.setPlaying(true);
    sequencer.setSequence(sequence);
    sequencer.setTempoInBPM((float) bpm);
    sequencer.start();

这很好用,可以播放我的arraylist中的音符。 但是我希望能够直观地向用户显示正在播放的音符或播放的位置。

问题是,如何为每个MidiEvent定序器进程调用方法?

2 个答案:

答案 0 :(得分:2)

  

我希望能够直观地显示用户..或播放所在的位置。

使用JProgressBar。根据从Sequencer方法getMicrosecondLength()&amp;获得的值设置最大和当前位置。 getMicrosecondPosition()

答案 1 :(得分:1)

如果您创建可用于绘制进度的“元事件”,并且有一个MetaEventListener可以通知您进度,则可以获得大量控制权。它可以像每个音符开头的“勾号”一样简单。

如果通过getMicroSecondPosition或Length查询,更新的时间和准确性是通过轮询确定的,在某些情况下这可能是可疑的。有时,它很好。使用MetaEventListener,事件本身就是触发器。