PSS-A50のMIDIデータ解析
データ取得方法など
Raspberry Pi PicoとTinyUSBを使って受信したデータをシリアル出力しました。
PSS-A50のMIDIデータについては下記のMIDIリファレンスを参考にしています。
https://jp.yamaha.com/files/download/other_assets/6/1282286/pssa50_ja_mr_a0.pdf
送信データ取得
発音
鍵盤を押したときに送られるデータ(16進数)です。音はNo.001(グランドピアノ)ですが、ほかの音でも同じでした。
// ----- タッチレスポンスオフ ----- 90 30 50 // 押 90 30 00 // 離 // ----- タッチレスポンスオン(強打)----- 90 30 7f 90 30 00 // ----- タッチレスポンスオン(弱く) ----- 90 30 01 90 30 00
MIDIリファレンスによるとノートオフは送受信できず、代わりにベロシティが0になると記載されており、その通りになっています。 タッチレスポンスオフのときは0x50になっていました(0x7fではないのですね)。タッチレスポンスオンのときのベロシティは0x01~0x7fまで出ています。
音色切り替え
// ----- No.04 -> No.01 ----- b0 00 00 // MIDI_CC_BANK_SELECT_MSB b0 20 00 // MIDI_CC_BANK_SELECT_LSB c0 00 // MIDI_CV_PROGRAM_CHANGE b1 00 00 // MIDI_CC_BANK_SELECT_MSB b1 20 00 // MIDI_CC_BANK_SELECT_LSB c1 00 // MIDI_CV_PROGRAM_CHANGE b0 07 64 // MIDI_CC_CHANNEL_VOLUME_MSB b0 5b 08 // MIDI_CC_EFFECT1_DEPTH b1 07 64 // MIDI_CC_CHANNEL_VOLUME_MSB b1 5b 08 // MIDI_CC_EFFECT1_DEPTH // ----- No.32 -> No.33 ----- b0 00 00 // MIDI_CC_BANK_SELECT_MSB b0 20 00 // MIDI_CC_BANK_SELECT_LSB c0 54 // MIDI_CV_PROGRAM_CHANGE b1 00 00 b1 20 00 c1 54 b0 07 46 // MIDI_CC_CHANNEL_VOLUME_MSB b0 5b 0e // MIDI_CC_EFFECT1_DEPTH b1 07 46 b1 5b 0e
音色切り替えのときは、0chと1chに全く同じデータが送信されています。0chと1chはそれぞれ手弾き音(デフォルトの場合)とアルペジオ演奏(手弾き+1)です。面白いのが、バンクセレクトとプログラムチェンジ以外にエフェクトも送信されています。
この中から音色設定だけ抜き出すと下記のようになります(No.001 グランドピアノの例)。
// No.001 Grand Piano b0 00 00 // MIDI_CC_BANK_SELECT_MSB b0 20 00 // MIDI_CC_BANK_SELECT_LSB c0 00 // MIDI_CV_PROGRAM_CHANGE b0 07 64 // MIDI_CC_CHANNEL_VOLUME_MSB b0 5b 08 // MIDI_CC_EFFECT1_DEPTH
録音再生
// ----- 再生 ----- fa // MIDI_STATUS_SYSREAL_START b2 78 00 // MIDI_CM_ALL_SOUND_OFF b3 78 00 // MIDI_CM_ALL_SOUND_OFF b2 07 5a // MIDI_CC_CHANNEL_VOLUME_MSB 92 20 50 // MIDI_CV_NOTE_ON > note: 32, vel: 80 b3 07 48 // MIDI_CC_CHANNEL_VOLUME_MSB 93 39 56 // MIDI_CV_NOTE_ON > note: 57, vel: 86 93 24 65 // MIDI_CV_NOTE_ON > note: 36, vel: 101 93 2c 4a // MIDI_CV_NOTE_ON > note: 44, vel: 74 ...
再生開始時には 0xfa
が送信されています。その後、2chと3ch(それぞれ録音した手弾き音とアルペジオ演奏)の音が停止されています。再生開始前に各chにボリューム設定が送信されてからノートオンしています。
// ----- 停止 ----- fc // MIDI_STATUS_SYSREAL_STOP 82 22 00 // MIDI_CV_NOTE_OFF > note: 34, vel: 0 82 2e 00 // MIDI_CV_NOTE_OFF > note: 46, vel: 0 f0 7e 7f 09 01 f7 // MIDI_STATUS_SYSEX (GM SYSTEM ON) b2 00 00 // MIDI_CC_BANK_SELECT_MSB b2 20 00 // MIDI_CC_BANK_SELECT_LSB c2 21 // MIDI_CV_PROGRAM_CHANGE b2 5b 03 // MIDI_CC_EFFECT1_DEPTH b2 5d 14 // MIDI_CC_EFFECT3_DEPTH b2 01 00 // MIDI_CC_MODULATION_MSB b2 47 40 // MIDI_CC_SOUND_CONTROL2 b2 48 40 // MIDI_CC_SOUND_CONTROL3 b2 49 40 // MIDI_CC_SOUND_CONTROL4 b2 4a 40 // MIDI_CC_SOUND_CONTROL5 b2 05 19 // MIDI_CC_PORTAMENTO_TIME_MSB b2 41 00 // MIDI_CC_PORTAMENTO b2 65 00 // MIDI_CC_RPN_MSB b2 64 00 // MIDI_CC_RPN_LSB b2 06 02 // MIDI_CC_DATA_ENTRY_MSB (PITCH BEND SENSITIVITY) b2 65 7f // MIDI_CC_RPN_MSB (RPN NULL) b2 64 7f // MIDI_CC_RPN_LSB (RPN NULL) e2 00 40 // MIDI_CV_PITCH_WHEEL_CHANGE f0 43 10 4c 08 02 0c 40 f7 // MIDI_STATUS_SYSEX (VELOCITY SENSE DEPTH) f0 43 10 4c 08 02 0d 40 f7 // MIDI_STATUS_SYSEX (VELOCITY SENSE OFFSET) b3 00 7f // MIDI_CC_BANK_SELECT_MSB b3 20 00 // MIDI_CC_BANK_SELECT_LSB c3 00 // MIDI_CV_PROGRAM_CHANGE b3 5b 15 // MIDI_CC_EFFECT1_DEPTH b3 5d 00 // MIDI_CC_EFFECT3_DEPTH b3 01 00 // MIDI_CC_MODULATION_MSB b3 47 40 // MIDI_CC_SOUND_CONTROL2 b3 48 40 // MIDI_CC_SOUND_CONTROL3 b3 49 40 // MIDI_CC_SOUND_CONTROL4 b3 4a 40 // MIDI_CC_SOUND_CONTROL5 b3 05 19 // MIDI_CC_PORTAMENTO_TIME_MSB b3 41 00 // MIDI_CC_PORTAMENTO b3 65 00 // MIDI_CC_RPN_MSB b3 64 00 // MIDI_CC_RPN_LSB b3 06 02 // MIDI_CC_DATA_ENTRY_MSB b3 65 7f // MIDI_CC_RPN_MSB (RPN NULL) b3 64 7f // MIDI_CC_RPN_LSB (RPN NULL) e3 00 40 // MIDI_CV_PITCH_WHEEL_CHANGE f0 43 10 4c 08 03 0c 40 f7 // MIDI_STATUS_SYSEX f0 43 10 4c 08 03 0d 40 f7 // MIDI_STATUS_SYSEX b2 0b 7f // MIDI_CC_EXPRESSION_MSB
停止時にはいろいろ送られてきます。長いので3つに区切りました。
最初に停止( 0xfc
)が送信された後、ノートオフが送信され(MIDIリファレンスではノートオフ送受信不可になっていたのに...)、 f0 7e 7f 09 01 f7
でGMシステムオンが送信されています。GMシステムオンはMIDIリファレンスによると、
MIDIマスターチューニングを除くすべてのデータの設定値をデフォルトに戻します
とのことですので、リセットしているのでしょう。
残りの2つのブロックが2ch, 3chそれぞれの音色設定です。
その中に出てくるf0 43 10 4c 08 02 0c 40 f7
, f0 43 10 4c 08 02 0d 40 f7
はPSS-A50のMIDIリファレンスには記載がありません。f0 43 10 4c ... f7
は定型文のようなもの(参考)なので、残りの 08 02 0c 40
のところを見る必要があります。
XG PARAMETER CHANGE TABLE を確認するとどちらもベロシティに関する設定で、08 nn 0C
は VELOCITY SENSE DEPTH
、 08 nn 0D
は VELOCITY SENSE OFFSET
でした。値は 0x40でデフォルト値に戻しているようです。
- - - - -
この再生と停止の信号を見て、以前作成したRaspberry Pi Picoのサステインペダルを使うと再生音が初回だけおかしくなる理由がわかりました。作ったペダルはPSS-A50が送出したMIDIデータをそのまま送り返しているのですが、再生時は音色設定が行われないので2ch, 3chのデフォルトの音(No.001)で再生されます。停止すると、音色設定が行われるので2回目以降は正しい音で再生されます。なぜ再生時ではなく停止時に送っているのか不思議です。
また、再生後は必ず若干リバーブがかかったピアノ音源(No.001)になっていたのですが、その原因は5行目の f0 7e 7f 09 01 f7
(GMシステムオン) でした。これをPSS-A50が受信すると、音源がデフォルトのNo.001に変更されます。リバーブのかかった音になるのは、それがデフォルトの音だからだと思います。上で音色変更の際にバンクセレクトとプログラムチェンジ以外のデータが送信されていると記載しましたが、デフォルトの値から変更していたようです。
SUSTAIN
// オン b0 48 6e // MIDI_CC_SOUND_CONTROL3 b1 48 6e // MIDI_CC_SOUND_CONTROL3 // オフ b0 48 40 // MIDI_CC_SOUND_CONTROL3 b1 48 40 // MIDI_CC_SOUND_CONTROL3
サステインはコントロールチェンジのダンパーペダル bn 40 xx
ではなく、サウンドコントロール3(リリースタイム)で設定されていました。
いくつかの音色で試してみましたが、リリースタイムの設定は0x6e(ON), 0x40(OFF)に固定されているようでした。
PORTAMENTO
// オン b0 05 19 // MIDI_CC_PORTAMENTO_TIME_MSB b1 05 19 // MIDI_CC_PORTAMENTO_TIME_MSB b0 41 7f // MIDI_CC_PORTAMENTO b1 41 7f // MIDI_CC_PORTAMENTO // オフ b0 41 00 // MIDI_CC_PORTAMENTO b1 41 00 // MIDI_CC_PORTAMENTO
オンのときはポルタメントタイムを設定した後にポルタメントをオンしています。
サステインと同様にポルタメントタイムは音色によらず0x19固定のようです。
TUNING
f0 43 10 27 30 00 00 07 0f 00 f7
PSS-A50でチューニングすると上記のようなデータが送信されます。これはMIDIリファレンスの「MIDIマスターチューニング」に書いてある内容と同じでした。
MIDI OUT CHANNEL
// ch0 -> ch1(表示上は ch1 -> ch2) b0 7b 00 // MIDI_CM_ALL_NOTE_OFF b0 78 00 // MIDI_CM_ALL_SOUND_OFF b0 79 00 // MIDI_CM_RESET_ALL_CONTROLLER b1 7b 00 // 以下、chが異なるだけ b1 78 00 b1 79 00 b2 7b 00 b2 78 00 b2 79 00 b3 7b 00 b3 78 00 b3 79 00
ch1->ch2にすると、0xbn
のnの部分が+1変化しました。
PHRASE VOLUME
b2 07 36 // MIDI_CC_CHANNEL_VOLUME_MSB b3 07 2b // MIDI_CC_CHANNEL_VOLUME_MSB
録音した手引き音(デフォルト:2ch)とアルペジオ演奏(デフォルト:3ch)の音量設定が変更されています。2ch, 3chで設定される音量が違うようです。
常時送信されているもの
fe // アクティブセンシング f8 // MIDIクロック
ここまで記載したデータは上の2つを省いたものです。これらは常時送信されていました。
変化しないもの
下記はPSS-A50を操作してもデータは送信されませんでした。
- MASTER VOLUME
- CONTROL CHANGE
- PROGRAM CHANGE
- LOCAL CONTROL
- TRANSPOSE
- METRONOME
- TOUCH RESPONSE
- OCTAVE
ここまでで記載していないのはMOTION EFFECTですが、種類が多くて全部見るのは大変なので省きます。ちなみに動作としては、コントロールチェンジが連続で送られてきていました。
(おまけ)使用できる設定一覧
PSS-A50に送信できる値の一覧を作成しました(PSS-A50が送信するデータとは若干異なります)。内容はMIDIリファレンスそのままです。エクスクルーシブは録音再生でMIDIリファレンスに載っていないデータが送信されていたので、もしかするといろいろ設定できるのかもしれません。
// コントロールチェンジ(nはチャンネル番号) bn 01 xx // MIDI_CC_MODULATION (モジュレーション) bn 05 xx // MIDI_CC_PORTAMENTO_TIME (ポルタメントタイム) bn 07 xx // MIDI_CC_CHANNEL_VOLUME_MSB (チャンネルボリュームMSB) bn 0b xx // MIDI_CC_EXPRESSION_MSB (エクスプレッションMSB) bn 06 xx // MIDI_CC_DATA_ENTRY_MSB (データエントリーMSB) bn 26 xx // MIDI_CC_DATA_ENTRY_LSB (データエントリーLSB) bn 40 xx // MIDI_CC_DAMPER_PEDAL (サステイン) bn 41 xx // MIDI_CC_PORTAMENTO (ポルタメント) bn 47 xx // MIDI_CC_SOUND_CONTROL2 (ティンバー/ハーモニックインテンス) bn 48 xx // MIDI_CC_SOUND_CONTROL3 (リリースタイム) bn 49 xx // MIDI_CC_SOUND_CONTROL4 (アタックタイム) bn 4a xx // MIDI_CC_SOUND_CONTROL5 (ブライトネス) bn 5b xx // MIDI_CC_EFFECT1_DEPTH (リバーブ) bn 5d xx // MIDI_CC_EFFECT3_DEPTH (コーラス) bn 60 // MIDI_CC_DATA_INCREMENT bn 61 // MIDI_CC_DATA_DECREMENT bn 64 xx // MIDI_RPN_LSB bn 65 xx // MIDI_RPN_MSB // その他(nはチャンネル番号) bn 78 00 // MIDI_CM_ALL_SOUND_OFF (オールサウンドオフ) bn 7e xx // ↑と同じ bn 7f xx // ↑と同じ bn 79 00 // MIDI_CM_RESET_ALL_CONTROLLER (リセットオールコントロール) bn 7a xx // MIDI_CM_LOCAL_CONTROL (ローカルコントロール) bn 7b 00 // MIDI_CM_ALL_NOTE_OFF (オールノートオフ) bn 7c 00 // ↑と同じ bn 7d 00 // ↑と同じ cn xx // プログラムチェンジ fe // MIDI_ACTIVE_SENSING (アクティブセンシング) // エクスクルーシブ f0 7e 7f 09 01 f7 // GMシステムオン(デフォルトに戻す) f0 7f 7f 04 01 ll mm f7 // MIDIマスターボリューム(ll: 無視, mm: 値) f0 43 1n 27 30 00 00 mm ll cc f7 // MIDIマスターチューニング(mm, ll: マスターチューニング値, n, cc: 任意) f0 43 10 4c 08 nn 0c mm f7 // VELOCITY SENSE DEPTH(nn: チャンネル, mm: 値) f0 43 10 4c 08 nn 0d mm f7 // VELOCITY SENSE OFFSET(nn: チャンネル, mm: 値) etc...?
おわりに
以前作成したペダルでは、送信されたデータをそのまま送り返す処理のせいでおかしな挙動をしているのかと思っていましたが、そういうわけではなさそうだということがわかり一安心です。
思ったよりいろいろな値が設定できるので、音色を変えて遊ぶのも面白そうだと思いました。
参考リンク
PSS-A50 MIDIリファレンス
https://jp.yamaha.com/files/download/other_assets/6/1282286/pssa50_ja_mr_a0.pdf
XG PARAMETER CHANGE TABLE
https://jp.yamaha.com/files/download/other_assets/8/321748/xgparameterchangetable.pdf
XG音源のSysExエフェクトの読み方、書き方
https://qiita.com/natto21/items/569f9e6c5baa3359aa92
MIDIメッセージ一覧
https://www.g200kg.com/jp/docs/tech/midi.html
MIDIコントロールチェンジ一覧
https://www.g200kg.com/jp/docs/tech/controlchange.html
前回の記事(Picoを使ってPSS-A50にサステインペダルを付けてみた)
https://ym0268.hatenablog.com/entry/pico_midi_pedal