Java Midi – 如何在midi播放时从midi获取音符

我已经搜索了一段时间,但找不到我想做的答案。

我想播放midi文件,并在播放时在屏幕上显示音符。 当音符停止播放时,它应该从屏幕上消失。

我可以用音序器播放midi,但不知道如何播放音符,或者当它停止播放音符时。

我查看了ControllerEventListeners和MetaEventListeners,但仍然不知道如何做到这一点。

任何帮助,将不胜感激。

这是一个FAQ 。
将您自己的Receiver连接到音序器的Transmitter。

有关示例,请参阅MidiPlayer中的DumpReceiver 。

这就是你应该做的:

你必须实现Receiver然后

 sequencer = MidiSystem.getSequencer(); sequencer.open(); transmitter = sequencer.getTransmitter(); transmitter.setReceiver(this); 

之后,每次发生事件时都会触发下一个方法:

 @Override public void send(MidiMessage message, long timeStamp) { if(message instanceof ShortMessage) { ShortMessage sm = (ShortMessage) message; int channel = sm.getChannel(); if (sm.getCommand() == NOTE_ON) { int key = sm.getData1(); int velocity = sm.getData2(); Note note = new Note(key); System.out.println(note); } else if (sm.getCommand() == NOTE_OFF) { int key = sm.getData1(); int velocity = sm.getData2(); Note note = new Note(key); System.out.println(note); } else { System.out.println("Command:" + sm.getCommand()); } } } 

如果你愿意,你也可以使用这个类:

 public class Note { private static final String[] NOTE_NAMES = {"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"}; private String name; private int key; private int octave; public Note(int key) { this.key = key; this.octave = (key / 12)-1; int note = key % 12; this.name = NOTE_NAMES[note]; } @Override public boolean equals(Object obj) { return obj instanceof Note && this.key == ((Note) obj).key; } @Override public String toString() { return "Note -> " + this.name + this.octave + " key=" + this.key; } }