FM音源プログラム (25) -- LCD 表示 (3)

実は LCD バッファはメインとサブの 2 組あって、切り換えて表示することができます。
サブ画面の方は、XG システム・エクスクルーシブの「ディスプレイ・レター・データ」*1で送られてきた ASCII 文字列を 3 秒間表示するのに使っています。
このエクスクルーシブは、曲名表示などのために MIDI データの始めのほうに挿入されることが多いです。
そのほかに、このサブ画面をデバッグ用にも使えるように、

  • void lcd_dbg_hex1(uint8_t pos, int8_t n)
  • void lcd_dbg_hex2(uint8_t pos, int16_t n)
  • void lcd_dbg_hex4(uint8_t pos, int16_t n)
  • void lcd_dbg_hex8(uint8_t pos, int32_t n)

という関数が定義してあります。
それぞれ、サブ画面の pos で指定される位置に n を 16 進数 1/2/4/8 桁で 3 秒間表示します。
もちろん、fs のレートで動作する部分では無理ですが、MIDI メッセージのデコード・解釈部などでのデバッグ情報表示のためには、この程度でも役に立ちます。
LCD 表示機能を付けたのは、かなりバグも取れて MIDI 音源として形になってきた段階だったので、もっと早い段階から LCD を付けていたら、もっとデバッグが容易になっていたのではないかと感じました。

実際の MIDI データによるデバッグ

MIDI デコード部分のデバッグには、テスト用の MIDI データを流してみる必要があります。
テスト用データを全部自前で用意するのは困難ですから、人様の作った MIDI データを利用させてもらうことにしました。
それは「MidRadio プレイヤー」(→こちら) を利用し、楽曲の連続自動再生機能を使ってFM音源プログラムに演奏させる方法です。
MidRadio プレイヤーには XG ソフトウェア音源が内蔵されていますが、それを使うのではなく、外部 MIDI 出力を選んで、MIDI データを出力させます。
楽曲の連続自動再生機能が実際にやっていることは、商品として販売している MIDI データの試聴用として用意されている 90 秒のデータを、ジャンル別にランダムに選んで、次々に再生することです。
次々に再生される曲をFM音源プログラムで演奏してみて、おかしな部分があったら、その曲の MIDI データの内容を検討し、どの部分でバグっているのかを突き止めます。
この演奏データはストリーム配信だけで、ダウンロードはできないので、外部 MIDI 信号として現れたものをハードウェア・シーケンサあるいはシーケンス・ソフトでキャプチャして、内容が見られるようにします。
実際に、この方法で、

  • システム・エクスクルーシブの処理が悪くて無限ループに陥って無音になるバグ
  • NRPN 番号が指定された時に RPN の指定を無効化していなかったためにピッチベンド・レンジが不正な値に設定されるバグ

などを見つけました。

*1:フォーマットは 「F0 43 10 4C 06 00 00 dd ... dd F7」 (dd ... dd の部分が表示データ)