我尝试通过上下移动钢琴卷帘编辑器中的图形音符(矩形)来编辑序列中现有 MIDI 音符的音高。阅读 API 和在线文档,并没有非常具体地说明如何编辑现有笔记。据我所知,我需要使用 setMessage() 方法来覆盖现有的 ShortMessage。这是我现在所拥有的:
public void changePitch(int pitchUpOrDown) {
MidiMessage message = this.getMessage();
message.setMessage(___?, ____?, ____? + pitchUpOrDown, ____?);
}
我通过鼠标拖动音符从 JPanel 调用 changePitch(),并且发送 +1 或 –1 作为音调调整的增量。我找不到 setMessage() 调用的其他四个空白参数中需要输入的值。从逻辑上讲,我想保留命令、 channel 和时间戳的现有值,但如何访问这些现有值以便将它们放入空白中?我尝试过 message.command 或 message[0] 等,但它们不起作用。此外,在文档中,set Message 的参数显示为(byte[] data, int length)。这些参数的解释确实很模糊,而且它们肯定与我最初用来创建 ShortMessage 的参数不匹配。有什么建议吗?
最佳答案
将MidiMessage
向下转换为ShortMessage
,然后您可以获得音高和速度作为data1和data2:
if (message instanceof ShortMessage) {
ShortMessage shortMessage = (ShortMessage) message;
if(shortMessage.getCommand() == ShortMessage.NOTE_ON) {
int channel = shortMessage.getChannel();
int pitch = shortMessage.getData1();
int vel = shortMessage.getData2();
if(vel > 0) {
shortMessage.setMessage(ShortMessage.NOTE_ON, channel, pitch + pitchUpOrDown, vel);
}
}
}
您可能还需要更改下一条NOTE_OFF消息。这将是带有NOTE_OFF命令的短消息,或者是速度为0的NOTE_ON命令。
关于java - 编辑 MIDI 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13461690/