2

我试图通过向上或向下移动钢琴卷帘编辑器中的图形音符(矩形)来按顺序编辑现有 MIDI 音符的音高。阅读 API 和在线文档,并没有非常具体地说明如何编辑现有笔记。据我所知,我需要使用 setMessage() 方法来覆盖现有的 ShortMessage。这是我现在得到的:

public void changePitch(int pitchUpOrDown) {
    MidiMessage message =  this.getMessage();
    message.setMessage(___?, ____?, ____? + pitchUpOrDown, ____?);
}

我通过鼠标拖动音符从 JPanel 调用 changePitch(),并且我发送 +1 或 –1 作为调整音高的增量。我找不到的是 setMessage() 调用的其他四个空白参数中需要输入的值。从逻辑上讲,我想保留命令、通道和时间戳的现有值,但是如何访问这些现有值以便将它们放在空白处?我尝试过诸如 message.command 或 message[0] 等,但它们不起作用。此外,在文档中,set Message 的参数显示为 (byte[] data, int length)。这些 args 的解释真的很模糊,而且它们肯定与我一开始用来创建 ShortMessage 的 args 不匹配。有什么建议么?

4

1 回答 1

2

MidiMessage向下投射ShortMessage,然后您可以获得数据1和数据2的音高和速度:

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 命令。

于 2012-11-20T03:20:48.137 回答