FMP7の制御を行うためのAPI及び、公開ワークについての資料です。
FMP7はDLLとして提供されないため、自作のアプリケーションから制御を行なう場合はSendMessageにて制御指令を送ります。
また、公開ワークも別プロセスとして動作しているためアプリケーション内のメモリ上ではなく、共有メモリを介してアクセスを行なう必要があります。
制御メッセージは、FMP7に対して制御を行う場合や、演奏中に変化しない情報の取得要求などを行う際に利用します。
公開ワークは、主に演奏に関するデータの取得を行う際に利用します。
制御メッセージ
FMP7へはWM_COPYDATAメッセージを利用してコマンドの送信を行います。
必要なパラメータ情報は「COPYDATASTRUCT」構造体に値を設定します。
基本的にはdwDataのLOWORDがファンクション番号となり、APIによってはHIWORDにサブパラメータをセットします。
文字列はすべてWCHARの扱いとなります。
必要なパラメータ情報は「COPYDATASTRUCT」構造体に値を設定します。
基本的にはdwDataのLOWORDがファンクション番号となり、APIによってはHIWORDにサブパラメータをセットします。
文字列はすべてWCHARの扱いとなります。
公開ワーク
公開ワークは共有メモリとして提供されます。
共有メモリの構造はfmp32_sharework.hを参考にして下さい。
共有メモリは読み込み専用としてアクセスを行ってください。
共有メモリの構造はfmp32_sharework.hを参考にして下さい。
共有メモリは読み込み専用としてアクセスを行ってください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
#include "fmp32_sharework.h" HANDLE hFileMap; HANDLE hMutex; FMP32::FUNC* hFMP7; int SizeGlobal, SizePart, SizeEx; BYTE *pWork; PFMP32_GLOBALWORK pGlobal; PFMP32_PARTWORK* pPart; PFMP32_EXWORK* pEx; void Init() { // 共有メモリサイズ取得 hFMP7 = GetFMP7Instance(); if(! hFMP7->GetWorkSize(&SizeGlobal, &SizePart, &SizeEx)) return; // 共有メモリハンドル取得 hFileMap = OpenFileMapping(FILE_MAP_READ, FALSE, FMP32_KEY_MAP); if(hFileMap == NULL) return; // 共有メモリmutex取得 hMutex = OpenMutex(SYNCHRONIZE, FALSE, FMP32_KEY_MUTEX); if(hMutex == NULL) return; // ワーク確保 pWork = new BYTE[SizeGlobal +(SizePart +SizeEx) *FMP32_MAX_PART]; if(pWork == NULL) return; pGlobal = (PFMP32_GLOBALWORK)pWork; pPart = (PFMP32_PARTWORK*) new PFMP32_PARTWORK[FMP32_MAX_PART]; pEx = (PFMP32_EXWORK*) new PFMP32_EXWORK[FMP32_MAX_PART]; // ワークアドレスマッピング for(int n = 0; n < FMP32_MAX_PART; n++) { pPart[n] = (PFMP32_PARTWORK)&pWork[SizeGlobal +SizePart*n]; pEx[n] = (PFMP32_EXWORK)&pWork[SizeGlobal +SizePart*FMP32_MAX_PART +SizeEx*n]; } } void Access() { // 同期待ち WaitForSingleObject(hMutex, INFINITE); BYTE* p = (BYTE*)MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, SizeGlobal +(SizePart +SizeEx)*FMP32_MAX_PART); // ワークアクセス // mutexのロックを行っているため、この状態を長時間維持しないこと。 // ロックをしている間はデータの更新が行われなくなる。 // また、mutexのロックを行わずにアクセスを行った場合は、データの整合性の保証はされない。 CopyMemory(pWork, p, SizeGlobal +(SizePart +SizeEx) *FMP32_MAX_PART); // マップ解放 UnmapViewOfFile(p); // mutex解放 ReleaseMutex(hMutex); // コピーしたワークに対して処理を実行 for(int n = 0; n < FMP32_MAX_PART; n++) { switch(pPart[n]->Mode) { case FMP32_MODE_FM: if(pPart[n]->State & FMP32_BIT_PLAY) { : } : break; case FMP32_MODE_SSG: : break; } } } void Term() { CloseHandle(hMutex); CloseHandle(hFileMap); delete [] pWork; delete [] pPart; delete [] pEx; } |
ブロードキャストメッセージ
FMP7の起動時及び終了時にはブロードキャストメッセージが送信されます。
公開ワークを参照する場合には、本メッセージを処理し、公開ワークアドレスの再取得などするようにして下さい。
公開ワークを参照する場合には、本メッセージを処理し、公開ワークアドレスの再取得などするようにして下さい。
1 2 3 4 5 6 7 |
#include "fmp32_api.h" UINT MessageBC; // ブロードキャストメッセージコード取得 if(0 == (MessageBC = RegisterWindowMessage(FMP32::MESSAGE::REGISTER_STRING))) return(FALSE); |
取得したメッセージは通常のメッセージハンドラ中で他のメッセージ同様に処理を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch(message) { : default: if(message == MessageBC) { switch(wParam) { case FMP32::MESSAGE::START_FMP: // FMP7起動時の処理(共有メモリ情報の再初期化など) ReInitWork(); : return(0); case FMP32::MESSAGE::END_FMP: // FMP7終了時の処理 : return(0); } } return(DefWindowProc(hWnd, message, wParam, lParam)); } return(0); } |
制御クラス
直接SendMessageにて送る手段の他に、C++からのアクセスインタフェースとしてFMP32クラスが提供されます。
クラスが利用可能な環境では、制御が簡略されます。
クラスが利用可能な環境では、制御が簡略されます。
1 2 3 4 5 6 7 8 9 10 11 |
#include "fmp32_api.h" // FMP7制御ライブラリ #pragma comment (lib, "FMP7_lib.lib") // ライブラリ初期化 FMP32::FUNC* hFMP7; hFMP7 = GetFMP7Instance(); // 曲読み込み hFMP7->MusicLoad("ファイル名"); |
fmp32_api.hにて定義されているのPUBLICメソッドの一覧を説明します。
FMP7の制御はなるべく本クラスを利用して行って下さい。
独自に実装を行った場合の動作の保証は出来ません。
演奏データ読み込み
指定されたファイルを読み込みます。演奏は開始されません。
書式
BOOL MusicLoad( LPWSTR filename );
パラメータ
- filename
ファイル名を指定します。
戻り値
正常に処理が終了した場合は0以外の値が返ります。
エラーの場合の詳細はGetLastError()にて取得します。
エラーの場合の詳細はGetLastError()にて取得します。
演奏データ読み込み演奏
指定されたファイルを読み込みます。演奏を開始します。
書式
BOOL MusicPlay( LPWSTR filename );
パラメータ
- filename
ファイル名を指定します。
戻り値
正常に処理が終了した場合は0以外の値が返ります。
エラーの場合の詳細はGetLastError()にて取得します。
エラーの場合の詳細はGetLastError()にて取得します。
演奏開始
演奏を開始します。既に演奏中の場合には、曲の最初から演奏が始まります。
書式
BOOL MusicPlay( void );
パラメータ
なし
戻り値
正常に処理が終了した場合は0以外の値が返ります。
エラーの場合の詳細はGetLastError()にて取得します。
エラーの場合の詳細はGetLastError()にて取得します。
演奏停止
演奏を停止します。
書式
BOOL MusicStop( void );
パラメータ
なし
戻り値
正常に処理が終了した場合は0以外の値が返ります。
エラーの場合の詳細はGetLastError()にて取得します。
エラーの場合の詳細はGetLastError()にて取得します。
演奏一時停止
演奏のポーズを行います。曲の演奏中以外では何も処理は行われません。
書式
BOOL MusicPause( void );
パラメータ
なし
戻り値
正常に処理が終了した場合は0以外の値が返ります。
エラーの場合の詳細はGetLastError()にて取得します。
エラーの場合の詳細はGetLastError()にて取得します。
フェードアウト
曲のフェードアウト後、演奏を停止します。
書式
BOOL MusicFadeOut( int speed );
パラメータ
- speed
フェードアウトスピードを1~255で指定します。
戻り値
正常に処理が終了した場合は0以外の値が返ります。
エラーの場合の詳細はGetLastError()にて取得します。
エラーの場合の詳細はGetLastError()にて取得します。
パートマスク指定(単独)
パートのマスクを指定します。1パート単位でマスクの指定を行います。
マスクデータは「1」でマスク指定「0」でマスク解除となります。
マスクデータは「1」でマスク指定「0」でマスク解除となります。
書式
BOOL SetMask( int part BOOL mask );
パラメータ
- part
パート番号を0~63で指定します。 - mask
マスクの有効・無効を指定します。
戻り値
正常に処理が終了した場合は0以外の値が返ります。
エラーの場合の詳細はGetLastError()にて取得します。
エラーの場合の詳細はGetLastError()にて取得します。
パートマスク指定(一括)
パートのマスクを指定します。マスクデータは「1」でマスク指定「0」でマスク解除となります。
パート番号65以降は現在では意味を持ちませんが、必ず指定が必要です。
パート番号65以降は現在では意味を持ちませんが、必ず指定が必要です。
書式
BOOL SetMask( BYTE* mask );
パラメータ
- mask
パート毎のマスクの指定が記述されたBYTE[128]の配列のポインタを指定します。
配列のサイズは必ず128必要です。
戻り値
正常に処理が終了した場合は0以外の値が返ります。
エラーの場合の詳細はGetLastError()にて取得します。
エラーの場合の詳細はGetLastError()にて取得します。
シーク位置指定
演奏中のシーク位置を演奏開始からのカウント数で指定します。
書式
BOOL SetSeek( DWORD count );
パラメータ
- count
演奏位置をカウント数で指定します。
戻り値
正常に処理が終了した場合は0以外の値が返ります。
エラーの場合の詳細はGetLastError()にて取得します。
エラーの場合の詳細はGetLastError()にて取得します。
バージョン取得
FMP7のバージョンを取得します。メジャーバージョンが同一の間は基本的に動作の互換性は保証されます。
書式
BOOL GetVersion( int* system, int* major, int* minor );
パラメータ
- system
システムバージョンが格納されるint型のポインタを指定します。NULLが指定された場合はパラメータは無視されます。
FMP7では「7」固定です。 - major
メジャーバージョンが格納されるint型のポインタを指定します。NULLが指定された場合はパラメータは無視されます。
0~99の数値で表され、数値が1つ上がるとワーク/APIなどに変更がされたことになります。 - minor
マイナーバージョンが格納されるint型のポインタを指定します。NULLが指定された場合はパラメータは無視されます。
キャラクタコード1byteで表されます。
内部的な変更があった場合に変化します。
戻り値
正常に処理が終了した場合は0以外の値が返ります。
エラーの場合の詳細はGetLastError()にて取得します。
エラーの場合の詳細はGetLastError()にて取得します。
ワークサイズ取得
FMP7の公開共有ワークのサイズを取得します。
書式
BOOL GetWorkSize( int* global, int* part, int* ex );
パラメータ
- global
グローバルワークのサイズが格納されるint型のポインタを指定します。NULLが指定された場合はパラメータは無視されます。
サイズはBYTEです。 - part
パートワークのサイズが格納されるint型のポインタを指定します。NULLが指定された場合はパラメータは無視されます。
サイズはBYTEです。1パート分のワークサイズとなり、全部で64パート並びます。 - ex
拡張情報ワークのサイズが格納されるint型のポインタを指定します。NULLが指定された場合はパラメータは無視されます。
サイズはBYTEです。
戻り値
正常に処理が終了した場合は0以外の値が返ります。
エラーの場合の詳細はGetLastError()にて取得します。
エラーの場合の詳細はGetLastError()にて取得します。
演奏ファイルパス取得
現在読み込まれている演奏ファイルのフルパスを取得します。
書式
int GetPlayFilename( LPWSTR filename, int maxlen );
パラメータ
- filename
フィル名を格納するWCHAR型バッファのポインタを指定します。バッファサイズが足らない場合はエラーとなり、filenameの値は不定となります。
NULLを指定することでfilenameのセットはされず、文字数だけを取得出来ます。 - maxlen
バッファの大きさを文字数で指定します。
戻り値
正常に処理が終了した場合は文字数が返ります。
エラーの場合は-1が返り、詳細はGetLastError()にて取得します。
エラーの場合は-1が返り、詳細はGetLastError()にて取得します。
曲タイトル取得
読み込まれているデータのタイトル名を取得します。
書式
int GetMusicTitle( LPWSTR title, int maxlen );
パラメータ
- title
タイトル名を格納するWCHAR型バッファのポインタを指定します。バッファサイズが足らない場合はエラーとなり、途中までの情報が返されます。
NULLを指定することでtitleのセットはされず、文字数だけを取得出来ます。 - maxlen
バッファの大きさを文字数で指定します。
戻り値
正常に処理が終了した場合は文字数が返ります。
エラーの場合は-1が返り、詳細はGetLastError()にて取得します。
エラーの場合は-1が返り、詳細はGetLastError()にて取得します。
曲製作者名取得
読み込まれているデータの製作者名を取得します。
書式
int GetMusicCreator( LPWSTR name, int maxlen );
パラメータ
- name
製作者名を格納するWCHAR型バッファのポインタを指定します。バッファサイズが足らない場合はエラーとなり、途中までの情報が返されます。
NULLを指定することでnameのセットはされず、文字数だけを取得出来ます。 - maxlen
バッファの大きさを文字数で指定します。
戻り値
正常に処理が終了した場合は文字数が返ります。
エラーの場合は-1が返り、詳細はGetLastError()にて取得します。
エラーの場合は-1が返り、詳細はGetLastError()にて取得します。
曲作曲者名取得
読み込まれているデータの作曲者名を取得します。
書式
int GetMusicComposer( LPWSTR name, int maxlen );
パラメータ
- name
作曲者名を格納するWCHAR型バッファのポインタを指定します。バッファサイズが足らない場合はエラーとなり、途中までの情報が返されます。
NULLを指定することでnameのセットはされず、文字数だけを取得出来ます。 - maxlen
バッファの大きさを文字数で指定します。
戻り値
正常に処理が終了した場合は文字数が返ります。
エラーの場合は-1が返り、詳細はGetLastError()にて取得します。
エラーの場合は-1が返り、詳細はGetLastError()にて取得します。
曲コメント取得
読み込まれているデータのコメントを取得します。
書式
int GetMusicComment( LPWSTR comment, int maxlen );
パラメータ
- comment
コメントを格納するWCHAR型バッファのポインタを指定します。バッファサイズが足らない場合はエラーとなり、途中までの情報が返されます。
NULLを指定することでcommentのセットはされず、文字数だけを取得出来ます。 - maxlen
バッファの大きさを文字数で指定します。
戻り値
正常に処理が終了した場合は文字数が返ります。
エラーの場合は-1が返り、詳細はGetLastError()にて取得します。
エラーの場合は-1が返り、詳細はGetLastError()にて取得します。
演奏データ拡張子リスト取得
受付可能なデータ拡張子のリストを返します。
addonドライバを含めたすべてのデータの情報が取得可能です。
addonドライバを含めたすべてのデータの情報が取得可能です。
書式
int GetExtList( LPWSTR text, int maxlen, BOOL filter );
パラメータ
- text
リストを格納するWCHAR型バッファのポインタを指定します。バッファサイズが足らない場合はエラーとなり、textの値は不定となります。
NULLを指定することでtextのセットはされず、文字数だけを取得出来ます。 - maxlen
バッファの大きさを文字数で指定します。 - filter
OPENFILENAME構造体で利用可能な形式に変換を行うかを指定します。
戻り値
正常に処理が終了した場合は文字数が返ります。
エラーの場合は-1が返り、詳細はGetLastError()にて取得します。
エラーの場合は-1が返り、詳細はGetLastError()にて取得します。
リスト構造
拡張子リストは以下のテキスト形式となります。
対応ドライバ名1|*.拡張子1(;*.拡張子2...) (,対応ドライバ名2|*.拡張子1(;*.拡張子2...) ...)
ただし、filterに「TRUE」が指定された場合は以下の形式となります。
対応ドライバ (*.拡張子1(/*.拡張子2...))*.拡張子1(;*.拡張子2...)¥0 : 対応ドライバ (*.拡張子1(/*.拡張子2...))*.拡張子1(;*.拡張子2...)¥0 ¥0
エラーコード取得
エラー発生時の内部エラーコードを返します。
書式
DWORD GetLastError( void );
パラメータ
なし
戻り値
最後に発生したエラーコードを返します。
エラーメッセージ取得
エラー発生時のコードに対する内部メッセージを返します。
書式
int GetErrorMessage( LPWSTR text, int maxlen );
パラメータ
- text
エラーメッセージを格納するWCHAR型バッファのポインタを指定します。バッファサイズが足らない場合はエラーとなり、途中までの情報が返されます。
NULLを指定することでtextのセットはされず、文字数だけを取得出来ます。 - maxlen
バッファの大きさを文字数で指定します。
戻り値
文字数が返ります。