PIC AVR 工作室->TopPage->資料倉庫->シリアルMIDIモニタ
シリアルMIDIモニタ
はじめに
マイコンでMIDIの工作をしていると、そのテストの時にふと欲しくなるものがあります。そう、モニターです。 MIDIケーブル上を駆け巡るメッセージを眺めたり、逆にデータを送り込んだりするモノです。
え?別に欲しくない?いや、是非欲しくなってください。お好きなMIDI機器を繋いでその機器が出力するメッセージをダンプ表示したり、 逆にMIDI機器に任意のデータを送り出すプログラムを作ってみました。
概要
このあいだ作ったあのシリアルMIDI変換器を通してMIDI機器と接続し、 通信内容をハックするプログラムです。MIDI機器をもはやMIDI機器としてではなく「RS232C接続機器」とみなしてしまうわけです。
シリアルMIDIドライバを通さずに動作するので、いわゆる「シリアルMIDIドライバ」と「USB-シリアル変換器」 の相性問題に左右されずに使えます。
一応楽器と接続する前提なので、それっぽい機能を登載してます。鍵盤をクリックするとそれに見合う信号を出力できるとか、 モニター画面上に表示されるコードは、MIDIのメッセージにあわせて見やすく改行しているとか…。
今のところMIDI信号を受け取ってもPC登載のソフトウェアMIDIから音を出すことができません。 まぁ入力データをモニターしながら同時にスルー出力することなら一応できるので、 MIDIマスターから入力しつつ外部音源にスルー出力のモードに設定すれば、弾きながら音を聴くことは可能です。
vb2005で作成しました。実行にはマイクロソフトの.net 2.0以降のラインタイムがインストールされた環境が必要です。
プログラムダウンロード
VB2005用のプログラムです。右クリックで保存して使ってください。
3つのファイルが収録されてます。2つがソースプログラム。残りの1個が実行ファイルです。実行ファイルだけあれば動作させることは可能です。 もちろん、.net2.0以降のランタイムのインストールは必要です。VB2005でつくたったので。
なお、こんなアヤシいサイトからexeファイルをダウンロードしたくないゾという方の為にソースプログラムからビルドする方法を記しておきます。
まずVB2005を起動して、新規プロジェクトを開きます。プロジェクト名は適当にお好きな名前を。
ソリューションエクスプローラの「すべてのファイルを表示」ボタンでプロジェクト配下のファイル一覧を表示します。(①のところ)
ソリューションエクスプローラ画面の一覧からForm1.vbもしくはForm1.Designer.vbを右クリックして「コードを表示」を選択します。(②③のところ)
コードエリアのプログラムコード1文字残らずすべてを、ダウンロードしたソースに置き換えます。コピペしてください。(④のところ)
Form1.vbとForm1.Designer.vbの両方についてそれぞれコードを置き換えたら、ビルドがスルッと通るはずです。 フォームの背景画像やプログラムアイコンは適当にご用意ください。多分これで上手く行くと思いますが、自己責任で。
ちなみに、Form1.vbはいわゆるプログラム本体。Form1.Designer.vbはフォーム自体や貼り付けたコントロール類の各種定義になってます。
VBのプロジェクト一式ってもっと簡単に公開できるようになってるといいのになぁ。
ソースプログラムを眺めていただくとお分かりの通り、物凄く効率の悪いコードを書いてます。いや、むしろ頭の悪いコードだな。 特に鍵盤部分のところ。オブジェクトの配列など使わずに、鍵盤1個1個をそれぞれ1つのボタンに割り当ててます。 良い子は真似しちゃダメだよ。
使い方
プログラムを実行中のスクリーンショットです。
システムメッセージ
左下のテキストボックスです。このプログラムが使用者側に通知するシステムメッセージが表示されます。MIDIとは直接関係ありませんが、 どのCOMポートが接続可能だとか、現在どのCOMポートに接続しているかとか、切断した時にここに表示されます。
プログラムを起動すると、自動的に接続可能なCOMポートを検索し、この画面に表示します。 この例ではCOM1とCOM2が接続可能であることを意味してます。
COMポートの選択と接続/切断
右側のまんなか辺にあるリストボックスで、接続したいCOMポートを選択します。この例ではCOM2に接続していることを表してます。
目下COM1からCOM16から選べます。それ以上の選択肢を設けたい場合は、VBのデザイン画面等を適当に修正してください。
接続可能なCOMポートのどれかを選択して、その下の「connect」をクリックするとCOMポート経由でMIDIに接続。「disconnect」で切断です。
Message from MIDI
左側にある一番大きい白いボックスはMIDIから送られてきたデータをバイナリ値で表示するエリアです。 この例では、ヤマハのMIDIマスターキーボードを繋いで鍵盤を弾いた時にキーボードから送られてきたメッセージが表示されてます。
およそ1センテンス毎に改行して、若干見やすく表示します。1センテンスっていうのはMIDIの共通語ではなくて、 この説明の為に便宜的に使った言葉です。
例えば上から3行目。90-30-3Cというのは、MIDIのメッセージ表と見比べるとこの行は0x90すなわち0チャンネルのノートオンをするよ →音程は0x30すなわちオクターブ4のCの音を出すよ、→ベロシティーは0x3Cすなわち10進で60ですよ、ということが判ります。
ロジック的には、0x80以上のデータ(つまりボイスメッセージやシステムメッセージの1バイト目)の時は改行してから表示、 それ以外(つまりデータ部)の時は右に連ねて表示ということをしています。
例外はACTIVE SENCING(0xFE)とTIMING CLOCK(0xFF)。これらはMIDIマスターから常時送られてくるため、 改行せずに表示するとたいへんなことになっちゃいます。表示を圧縮するという意味で改行せず表示してます。
表示データの選択
上述の通り、ACTIVE SENCING(0xFE)とTIMING CLOCK(0xFF)はそのまま表示すると大量になってしまうため、 テキストボックスの上にあるチェックボックスをonにすることで非表示にできます。
鍵盤部分
右下の鍵盤は、1オクターブ分(+1個)の鍵盤を表しています。鍵盤押下でノートオン、離すとノートオフが出力されます。 その右側の数値を上下するとオクターブシフトが出来ます。オクターブシフトを使うことによって0~127の音程に対応しています。
その上のスライドバーでベロシティーを設定します。
画面上の鍵盤からは和音を入力できません。ノートオン、ノートオフやオクターブシフトなどまで含めて考えると、 出力データのシーケンス制御などがメンドウになりそうなので手抜きしました。
鍵盤以外のデータ送信
右上のテキストボックスにカンマで区切ったバイナリデータを入力してから「send」ボタンをクリックすると、 このバイト列をMIDIに連続して出力します。デフォルトではオクターブ5のCの音のノートオンとノートオフを意味するバイナリが埋め込まれてます。 自由に弄って出力できます。なお、0xFFを超える数値が混じっている場合は256の除余を出力します。
「reset MIDI」ボタンは、固定値で0xFFを出力します。リセット信号なのですが、対応していない機器が多いようです。 あまり使わないボタンだと思います。
入力データのスルー出力
右下の方の「through out inputed data」をチェックしておくと、MIDIから入力したデータをそのままMIDI出力にスルーします。 この場合、鍵盤や「send」ボタンは無効化されます。(データのシーケンス制御がメンドウになるので手抜きしました)
ログの保存
Message from MIDIのテキストボックスに表示されたMIDIメッセージをテキストファイルに保存します。
使用上のご注意
Message from MIDIへの追記処理速度
Message from MIDIのボックスは、VBの標準的なテキストボックスです。 ここにMIDIから入力したデータを次々と追記していく処理を行っていますが、その際にテキストボックスのAppendTextメソッドを使用しています。
このメソッドは、短い文字列をこまめにこまめに追記していくような使い方をすると、次第に処理速度が遅くなって追いつかなくなっていきます。
詳細には触れませんが、.netのメモリ管理に関するお話なので、なんともしようがありません。(多分アキレス腱だこりゃ)
いや、何とかしようと思えばなるのかもしれませんが、このプログラムの用途が用途なのでこのまま何もしないことにします。
ログサイズが数百Bから数KB程度までならなんとか使える速度だと思いますが、特にACTIVE SENCING(0xFE)とTIMING CLOCK(0xFF) の表示をオンにしておくと一定間隔で常時追記されるため、処理速度的にあっという間に厳しくなります。
ACTIVE SENCING(0xFE)とTIMING CLOCK(0xFF)は特に必要がなければ表示オフで使用しつつ、あまり長いログは取得しないようにしてください。
ログをクリアするような機能や、一定量以上はストックしない機能、もしくは画面じゃなくてファイルにログを吐き出すような機能、 そんなモノを付けたりするといいのかも知れないなぁ…
COMポートの自動検出について
COMポートの自動検出はプログラム起動の瞬間に処理されて、システムメッセージに表示されます。 なので、起動後にUSBシリアル変換ケーブルを挿してもシステムメッセージには反映されません。 反映はされませんが、後から挿してもCOMポートの選択は出来ます。(COMポート番号が判っているなら)
COM番号を調べるのがメンドウなら、一旦終了して再度起動すれば表示されます。
システムメッセージに表示されるのはあくまで使用可能なCOMポートです。MIDIが繋がっているポートではありません。 どのCOMポートにMIDIが繋がっているのかは各自調査ください。
ソフトウェアシンセの発声について
目下のところ、MIDI-inから入力された信号をPC内部のソフトウェアMIDI音源に繋いで発音することには対応してません。
なにしろ「シリアル接続機器(RS232C機器)」として接続しているので、単純にそのままMIDIにリダイレクトできないんです。 (技術不足ともいう)
まぁ、これ作った私のニーズにそういうのが無かったので載せなかったんですが、今後もし気が向いたら何とかします。
まとめ
ソースを適当にいじくりまわして、お好きなように改造して使っていただくのが一番良いんだろうなぁと思います。
用途に合わせて弄くって使ってください。