Java Midi Sequencer - воспроизведение заметок с указателем воспроизведения - PullRequest
0 голосов
/ 17 марта 2012

В настоящее время я реализовал функцию, которая позволяет пользователю воспроизводить сыгранные ноты.

Вот код:

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 ]

2 голосов
/ 17 марта 2012

Я хочу, чтобы можно было визуально показать пользователю .. или положение, в котором находится воспроизведение.

Используйте JProgressBar.Установите максимальную и текущую позицию в соответствии со значениями, полученными с помощью Sequencer методов getMicrosecondLength() & getMicrosecondPosition().

1 голос
/ 19 марта 2012

Вы можете получить большой контроль, если создадите «мета-события», которые вы можете использовать для составления графика своего прогресса, и имеете MetaEventListener, который уведомляет вас о вашем прогрессе. Это может быть так же просто, как «галочка» для каждого начала ноты.

Если вы выполняете запрос через getMicroSecondPosition или Length, время и точность обновления определяются опросом, который в некоторых случаях может быть сомнительным. Иногда это просто отлично. С MetaEventListener, само событие это триггер.

...