メトロノームとの連動について
Easy MIDI Music Player や Easy メトロンでは、メトロノームとの連動機能があり、Easy MIDI Music Player と任意のメトロノーム、また Easy メトロンから任意のプレーヤーと連動(同期)を行うことが出来ます。
連動の構造
データのやり取りは、ウィンドウメッセージを通じて行われます。以下のメッセージ名を文字列定数として、Win32API の RegisterWindowMessage 関数を使って登録し、返される値をメッセージ値として使用します。
- EMetronomeDetectMsg
- 概要
- メトロノームウィンドウであるかどうかをチェックします。プレーヤー側が送信します。
- 構文
- ret = SendMessage(hWndMetronome, msgDetect, (WPARAM)(int) nBufferLen, (LPARAM)(LPSTR) szBuffer);
- パラメータ
- nBufferLen: メトロノームのバージョンを受け取るバッファのサイズです。0 の場合はコピーされません。
szBuffer: メトロノームのバージョンを受け取るバッファのポインタです。nBufferLen が 0 以外の値で szBuffer が NULL の場合、戻り値の上位ワードはバッファに必要なサイズとなります。 - 戻り値 (LRESULT)
- メトロノームウィンドウである場合、メトロノームのバージョンが返ります。バージョンが「hi.lo」形式で表される場合、戻り値は MAKEWORD(lo, hi) となります。nBufferLen != 0 で szBuffer == NULL の場合、戻り値は MAKELONG(MAKEWORD(lo, hi), <文字列の長さ>) となります。
メトロノームウィンドウでない場合、既定のウィンドウプロシージャの処理と同様に 0 が返ります。 - 解説
- プレーヤー側がメトロノーム側に送る最初のメッセージで、メトロノーム側は必ず 1 以上の値を返します。プレーヤー側は、メトロノームの検索でこのメッセージを送信し、1 以上の値を返したウィンドウをメトロノームと判断して、そのウィンドウとやり取りを行います。
- EMetronomeSyncronizeMsg
- 概要
- メトロノームとプレーヤーの連動(同期)を開始します。プレーヤー側が送信します。
- 構文
- SendMessage(hWndMetronome, msgSyncronize, (WPARAM)(HWND) hWndPlayer, (LPARAM)(ATOM) atomAppTitle);
- パラメータ
- hWndPlayer: プレーヤー側のウィンドウのハンドルを指定します。
atomAppTitle: プレーヤー側のアプリケーションのタイトルを ATOM で指定します。この ATOM は GlobalAddAtom で追加されたものでなければなりません。また、この ATOM はプレーヤー側で解放する必要があります。アプリケーションのタイトルを送らない場合は、0 を指定してもかまいません。 - 戻り値 (LRESULT)
- 0 が返ります。
- 解説
- プレーヤー側はこのメッセージを使って連動(同期)を開始させます。このメッセージを送らずに以下のメッセージを送らないでください。
- EMetronomeTempoMsg
- 概要
- メトロノームにテンポの値を設定します。プレーヤー側が送信します。
- 構文
- SendMessage(hWndMetronome, msgTempo, 0, (LPARAM)(int) nTempo);
- パラメータ
- nTempo: 新しいテンポの値を指定します。
- 戻り値 (LRESULT)
- 0 が返ります。
- 解説
- プレーヤー側はメトロノームを動かす前にこのメッセージを送信してテンポを設定してください。そうでない場合、メトロノームの動作は未定義です。
- EMetronomeRhythmMsg
- 概要
- メトロノームに拍子の値を設定します。プレーヤー側が送信します。
- 構文
- SendMessage(hWndMetronome, msgTempo, (WPARAM)(short) nRhythm0, (LPARAM)(int) nRhythm1);
- パラメータ
- nRhythm0: 拍子の分母の値を指定します。値が 2、4、8 など、2 の累乗に当たる値でない場合、動作は未定義です。
nRhythm1: 拍子の分子の値を指定します。 - 戻り値 (LRESULT)
- 0 が返ります。
- 解説
- プレーヤー側はメトロノームを動かす前にこのメッセージを送信して拍子を設定してください。そうでない場合、メトロノームの動作は未定義です。
- EMetronomeTickMsg
- 概要
- 拍子が1つ進んだことをメトロノームに通知します。プレーヤー側が送信します。
- 構文
- SendMessage(hWndMetronome, msgTick, 0, (LPARAM)(int) nTickCount);
- パラメータ
- nTickCount: 現在小節の中で何拍目かを示す値を指定します。1以上の値を指定します。(1拍目なら「1」です。)
- 戻り値 (LRESULT)
- 0 が返ります。
- 解説
- プレーヤー側はメトロノームとのタイムラグを調整する目的でこのメッセージを送信します。メトロノーム側はこのメッセージを受け取ったら、針を有効な一番近い位置に設定する必要があります。
- EMetronomeStartMsg
- 概要
- プレーヤーが再生を始めたことをメトロノームに通知し、メトロノームを開始させます。
- 構文
- SendMessage(hWndMetronome, msgStart, 0, 0);
- パラメータ
- パラメータはありません。
- 戻り値 (LRESULT)
- 0 が返ります。
- 解説
- プレーヤー側はこのメッセージを送信してメトロノームを動かします。メトロノーム側はこのメッセージを受け取ったら、メトロノームを開始させます。
- EMetronomeStopMsg
- 概要
- プレーヤーが停止したことをメトロノームに通知し、メトロノームを停止させます。
- 構文
- SendMessage(hWndMetronome, msgStop, 0, 0);
- パラメータ
- パラメータはありません。
- 戻り値 (LRESULT)
- 0 が返ります。
- 解説
- プレーヤー側はこのメッセージを送信してメトロノームを停止します。メトロノーム側はこのメッセージを受け取ったら、メトロノームを停止させます。
このメッセージは連動を終了させるものではありません。
- EMetronomeSetFlagsMsg
- 概要
- プレーヤーがメトロノームに動作オプションを設定します。
- 構文
- SendMessage(hWndMetronome, msgSetFlags, (WPARAM)(WORD) wFlags, 0);
- パラメータ
- wFlags: メトロノームの動作オプションを設定します。0 または次の値を組み合わせます。
EMTRF_3RENFU (= 0x0001) 拍子の分母が 8 のとき、3拍を1かたまりと見てメトロノームを動かすよう設定します。これを設定しない場合は、2拍を1かたまりと見たメトロノームの動きとなります。 EMTRF_TICK_SOUND (= 0x0002) メトロノームの針の動きに合わせて音を鳴らすかどうか設定します。 - 戻り値 (LRESULT)
- 0 が返ります。
- 解説
- プレーヤー側は変更したいオプションがある場合は、このメッセージを使用して変更を行います。メトロノーム側はそれに対応しなければなりませんが、このメッセージが呼び出されるとは限らないので、既定の動作も実装しておく必要があります。
- EMetronomeGetFlagsMsg
- 概要
- プレーヤーがメトロノームの動作オプションを取得します。
- 構文
- ret = SendMessage(hWndMetronome, msgGetFlags, 0, 0);
- パラメータ
- パラメータはありません。
- 戻り値 (LRESULT)
- 動作オプションが返ります。0 または上記の値(EMetronomeSetFlagsMsg のパラメータと同じ)を組み合わせたものとなります。
- 解説
- プレーヤー側はオプションを変更する際、このメッセージを呼び出して現在のオプションを取得し、その値を OR や AND などを用いてオプションを変更するべきです。
- EMetronomeEndSyncronizeNotify
- 概要
- プレーヤーとメトロノームの連動を終了します。
- 構文
- SendMessage(hWndMetronome, msgEndSync, 0, 0);
- パラメータ
- パラメータはありません。
- 戻り値 (LRESULT)
- 戻り値はありません。
- 解説
- このメッセージはプレーヤーとメトロノームの連動を終了させるために使用されます。連動を終了するために、このメッセージはプレーヤーが送信してもメトロノームが送信しても構いません。
このメッセージを受け取ったら、連動相手側にこのメッセージを送り直す必要は有りません。
.NET で使用する方法
.NET では、メッセージを登録するメソッドが準備されていないので、DllImportAttributes (DllImport) を使用して RegisterWindowMessage を呼び出せるようにしてください。
メッセージを受信するには、System.Windows.Forms.Control クラスの WndProc メソッドをオーバーライドします。メッセージを送信するには、Win32API の SendMessage 関数を RegisterWindowMessage と同様に宣言して呼び出してください。