【问题标题】:Java Midi Sequencer - Notes Playback With PlayheadJava Midi Sequencer - 使用播放头播放音符
【发布时间】:2012-03-17 14:42:11
【问题描述】:

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

代码如下:

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

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

问题是,如何为 sequencer 处理的每个 MidiEvent 进行方法调用?

【问题讨论】:

    标签: java swing sequence midi javasound


    【解决方案1】:

    我希望能够直观地向用户展示..或播放的位置。

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

    【讨论】:

      【解决方案2】:

      如果您创建“元事件”来记录您的进度,并拥有一个通知您进度的 MetaEventListener,您可以获得很大的控制权。它可以像每个音符开头的“记号”一样简单。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-11
        相关资源
        最近更新 更多