2

ピアノ ロール エディタでグラフィカル ノート (四角形) を上下に移動して、シーケンス内の既存の MIDI ノートのピッチを編集しようとしています。API とオンライン ドキュメントを読んでも、既存のメモを編集する方法が具体的にわかりません。私が知る限り、setMessage() メソッドを使用して既存の ShortMessage を上書きする必要があります。これが私が今持っているものです:

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

ノートをマウスでドラッグして JPanel から changePitch() を呼び出し、ピッチを調整する増分として +1 または –1 を送信しています。私が見つけられないのは、setMessage() 呼び出しの他の 4 つの空白パラメーターに入れる必要がある値です。論理的には、コマンド、チャネル、およびタイムスタンプの既存の値を保持したいのですが、これらの既存の値にアクセスして空白に入れるにはどうすればよいでしょうか? message.command や message[0] などを試しましたが、うまくいきません。また、ドキュメントでは、set Message の引数は (byte[] data, int length) として示されています。これらの引数の説明は非常に曖昧で、最初に ShortMessage を作成するために使用した引数とはまったく一致しません。助言がありますか?

4

1 に答える 1

2

にキャストするMidiMessageShortMessage、ピッチとベロシティを 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 コマンドを含む shortMessage か、速度が 0 の NOTE_ON コマンドのいずれかになります。

于 2012-11-20T03:20:48.137 に答える