java - 编辑 MIDI 事件

标签 java midi javasound javax.sound.midi

我尝试通过上下移动钢琴卷帘编辑器中的图形音符(矩形)来编辑序列中现有 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/

相关文章:

java - Hibernate -> LazyInitializationException 与 n :m relation

JavaParser:从 FieldDeclaration 获取字段名称

java - @RestController 中的动态 @RequestParam

java - 列出 Applet 中的输入和输出音频设备

java - 使用 JLayer 改变音量

java - 如何开发视频应用程序的屏幕捕获

java - 将 key=value 的字符串解析为 Map

haskell - 使用响应式(Reactive)香蕉在 Haskell 中进行音频合成

一个文件中的 Midi 十六进制代码表示法不同

iphone - 音乐播放器只播放一首轨道