我目前已经实现了一项功能,允许用户播放他们播放的音符。
以下是代码:
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定序器进程调用方法?
答案 0 :(得分:2)
我希望能够直观地显示用户..或播放所在的位置。
使用JProgressBar
。根据从Sequencer
方法getMicrosecondLength()
&amp;获得的值设置最大和当前位置。 getMicrosecondPosition()
答案 1 :(得分:1)
如果您创建可用于绘制进度的“元事件”,并且有一个MetaEventListener可以通知您进度,则可以获得大量控制权。它可以像每个音符开头的“勾号”一样简单。
如果通过getMicroSecondPosition或Length查询,更新的时间和准确性是通过轮询确定的,在某些情况下这可能是可疑的。有时,它很好。使用MetaEventListener,事件本身就是触发器。