MIDI 2.0プレッシャーの送受信

MIDIチャンネルメッセージのプレッシャーには2種類あります。 一つはポリフォニックキープレッシャー、もう一つはチャンネルプレッシャーです。 電子楽器では鍵盤を叩いた後、鍵盤を押し込む強さで音色、音量を変更できるモノがあります。 チャンネルプレッシャーは基本的に全部の鍵盤に一つの情報を送信します。 ポリフォニックキープレッシャーは、鍵盤ごとに押し込んだ情報を送信します。 もっぱら、ポリフォニックキープレッシャーの方が指ごとに音色、音量を 変化させることができrので、より細やかな表現ができます。 どちらの情報を出力することができるのかは業電子楽器のハードウェアに寄っています。

MIDI 2.0プロトコルでは両者のメッセージとも、 MIDI1.0では7bitの精度であった プレッシャー値が 32ビット精度に拡張されています。 ポリフォニックキープレッシャーとチャンネルプレッシャーの違いは、 3バイト目にキーナンバーが入っているか、いないかです。

Raspberry Pi Zero 2WをMIDI 2.0デバイスに設定し、 Cubase 14 Pro(体験版)で録音します。 さらに、Cubase 14再生しZero 2Wで受信します。 これにより、32bitのプレッシャー値がUSB-MIDIで送受信でき、 さらに、Cubase 14できちんと録音することができることを確認します。

送信プログラム

送信プログラムの詳細はこちらの記事を参照してください。 次のプログラムではポリフォニックキープレッシャーを250msecごとに100回送信します。 初期値を0x12345678とし、1回ごとに0xFFFFインクリメントしています。

snd_ump_msg_midi2_t *m = (snd_ump_msg_midi2_t *)&event.ump;
m->hdr.type=SND_UMP_MSG_TYPE_MIDI2_CHANNEL_VOICE;
m->hdr.group=0;
m->hdr.channel=0;
m->hdr.status=SND_UMP_MSG_POLY_PRESSURE;
m->poly_pressure.data = 0x12345678;
            
for(int j=0; j<100; j++){
    m->poly_pressure.note =0x10+j,
    m->poly_pressure.data += 0xFFFF;
    snd_seq_ump_event_output(seq_handle,&event);
    snd_seq_drain_output(seq_handle);
    usleep(250000);
}

送信されるコントロールチェンジの値の末尾の20個を以下に記載します。

0x2855627
0x2865626
0x2875625
0x2885624
0x2895623
0x28a5622
0x28b5621
0x28c5620
0x28d561f
0x28e561e
0x28f561d
0x290561c
0x291561b
0x292561a
0x2935619
0x2945618
0x2955617
0x2965616
0x2975615
0x2985614
Cubase14での録音

Cubase 14の設定はこちらの記事を参照してください。ただし、編集操作MIDIの 高解像度表示形式を小数点以下3桁に設定しています。


録音したMIDIデータをリストエディタで見ると以下のように、 32bitのプレッシャー値が、メイン値という欄に小数点以下3桁で表示されています。



Cubase14での再生

上で録音したデータを再生し、Zero2Wで受信、aseqdumpで表示しています。 詳細はこちらの記事を参照してください。

> aseqdump -p 20:0 -u 2
Group  0, Poly pressure           0, note 96, value 0x12855627
Group  0, Poly pressure           0, note 97, value 0x12865626
Group  0, Poly pressure           0, note 98, value 0x12875625
Group  0, Poly pressure           0, note 99, value 0x12885624
Group  0, Poly pressure           0, note 100, value 0x12895623
Group  0, Poly pressure           0, note 101, value 0x128a5622
Group  0, Poly pressure           0, note 102, value 0x128b5621
Group  0, Poly pressure           0, note 103, value 0x128c5620
Group  0, Poly pressure           0, note 104, value 0x128d561f
Group  0, Poly pressure           0, note 105, value 0x128e561e
Group  0, Poly pressure           0, note 106, value 0x128f561d
Group  0, Poly pressure           0, note 107, value 0x1290561c
Group  0, Poly pressure           0, note 108, value 0x1291561b
Group  0, Poly pressure           0, note 109, value 0x1292561a
Group  0, Poly pressure           0, note 110, value 0x12935619
Group  0, Poly pressure           0, note 111, value 0x12945618
Group  0, Poly pressure           0, note 112, value 0x12955617
Group  0, Poly pressure           0, note 113, value 0x12965616
Group  0, Poly pressure           0, note 114, value 0x12975615
Group  0, Poly pressure           0, note 115, value 0x12985614

valueの項が送信したプレッシャー値と一致しています。Cubase 14はMIDI 2.0 はポリフォニックキープレッシャー メッセージのプレッシャー値を32ビットで録音・再生してくれていることがわかります。

MIDI2.0チャンネルプレッシャー

送信プログラムは以下の通りです。プログラムは、ポリフォニックキープレッシャと同じです。

snd_ump_msg_midi2_t *m = (snd_ump_msg_midi2_t *)&event.ump;
m->hdr.type=SND_UMP_MSG_TYPE_MIDI2_CHANNEL_VOICE;
m->hdr.group=0;
m->hdr.channel=0;
m->hdr.status=SND_UMP_MSG_CHANNEL_PRESSURE;
m->channel_pressure.data = 0x12345678;
                
for(int j=0; j<100; j++){
    m->poly_pressure.note =0x10+j,
    m->channel_pressure.data += 0xFFFF;
    snd_seq_ump_event_output(seq_handle,&event);
    snd_seq_drain_output(seq_handle);
    usleep(250000);
}

Cubase 14での受診結果は以下の通りです。ポリフォニックキープレッシャと同様、32bitプレッシャ値に対応しています。