gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:43:39 27 4
gpt4 key购买 nike

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

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

我可以使用音序器播放 midi,但不知道如何获取其播放的音符,或者何时停止播放音符。

我已经研究了 ControllerEventListeners 和 MetaEventListeners,但仍然不知道如何执行此操作。

如有任何帮助,我们将不胜感激。

最佳答案

这就是你应该做的:

您必须实现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;
}
}

关于Java Midi - 如何在播放时从 midi 获取音符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26266411/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com