【发布时间】: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