Java Midi - Как получить ноты из миди во время игры
Я искал некоторое время и не могу найти ответ на то, что я хочу сделать.
Я хочу воспроизвести файл midi и отображать ноты на экране во время его воспроизведения. Когда нота перестает играть, она должна исчезнуть с экрана.
Я могу играть в миди с секвенсором, но понятия не имею, как заставить ноты играть, или когда он прекращает играть ноту.
Я изучал ControllerEventListeners и MetaEventListeners, но все еще не знаю, как это сделать.
Любая помощь будет оценена.
2 ответа
Вот что вы должны сделать:
Вы должны реализовать 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;
}
}
Это часто задаваемые вопросы.
Подключите свой собственный приемник к передатчику секвенсора.
См. DumpReceiver в MidiPlayer для примера.