特集 一からの Timidi95

 


[前ページ] [次ページ]

【TimidiCP 共有メモリインターフェース】
 TimidiCP 共有メモリインターフェースは、TimidiCP で再生する MIDI ファイルから、をウェーブフォームデータ(PCMデータ)としてアプリケーションに渡します。アプリケーションとの遣り取りは、共有メモリを使用します。共有メモリインターフェースを使用する場合、TimidiCP コマンドラインパラメータにプロセスID文字列及び、プロセス識別文字列を指定します。

TimidiCP コマンドラインパラメータ
TimidiCP 再生 MIDI ファイル名 [,出力ファイル名] [,プロセスID文字列] [,プロセス識別文字列]

プロセスID文字列は、GetCurrentProcessId() 関数の戻り値の 10進文字列表記です。

プロセス識別文字列は、TimidiCP 起動毎に固有の文字列を指定します。通常MIDI ポートを区別するため、ポート番号 "0" "1" "2" や "A" "B" "C" 等を使用します。

以降、例中で使用される文字列として、TimidiCP.exe パスを"c:\Timidi95\TimidiCP.exe"、 MIDI ファイルパスを "c:\Test.mid" 、プロセスID文字列を "1234"、プロセス識別文字列を "0" として表記します。

アプリケーションは、共有メモリを操作する為に2つのイベントと1つの共有メモリを操作します。イベント、共有メモリの末尾にプロセス識別文字列を付加する事で、複数の TimidiCP 共有メモリインターフェースをコントロール出来ます。

イベント "TimidiCP_Open"
 共有メモリをアプリケーションから操作出来る事を通知
イベント "TimidiCP_Close"
 共有メモリはアプリケーションが操作し終えた事を通知
共有メモリ "TimidiCP_Memory"
 各種パラメータ、状態(ステータス)、PCM データ

アプリケーションから、TimidiCP 共有メモリインターフェースアクセス手順は
以下の通りです。

1. 共有メモリインターフェース開設イベントの作成
2. TimidiCP プロセス起動
3. TimidiCP 初期化通知処理
4. MIDI 再生 Open 時通知処理
5. MIDI 再生 Output時通知処理
6. MIDI 再生 Close 時通知処理

通知処理に対するアプリケーション処理は、"TimidiCP_Open" イベントを待機し、共有メモリアクセス、"TimidiCP_Close" イベントをシグナル化します。
"TimidiCP_Close" イベントをシグナル化しない場合、TimidiCP は停止状態となります。

共有メモリには、主に情報領域、ファイル名領域、PCM データ領域に分けられます。共有メモリアクセスには、SHARED_MEMORY 構造体を使用します。

typedef struct {
 union {
 struct {
   DWORD dwReturn ; // TimidiCP ステータス/コマンド
   DWORD dwOffset ; // PCM データ領域へのオフセット
   DWORD dwSize ; // PCM データのサイズ(BYTE 単位)
   DWORD dwRate ; // TimidiCP 再生レート(44100Hz 等)
   DWORD dwEncode ; // bit0 == 1 ステレオ bit1 == 1 16bitデータ
   DWORD dwFileCurSec ; // 再生秒数(切り捨て値)
   DWORD dwFileTotalSec ; // MIDI 再生時間(計算値)
   DWORD dwOffsetFileName ;// MIDI ファイル名へのオフセット
  } ;

  DWORD dwaParam[16] ;
 } ;

 CHAR caFileName[256] ; // MIDI ファイル名実データ
 CHAR caData[4410 * 2 * 2] ;// PCM データ(最大44100Hz 100ms)

} SHARED_MEMORY ;

dwReturn は、TimidiCP から制御を受け取った場合、TimidiCP のステータスを表します。アプリケーションから TimidiCP を制御する場合、dwReturn にコマンドを書き込みます。

TimidiCP のステータスは現在、2種類有ります。再生継続(0xffffffff(-1))と再生停止(0xfffffffe(-2))を返します。

アプリケーションから TimidiCP に渡すコマンドは、再生継続(0xffffffff(-1))と再生停止(0xfffffffe(-2))及び、シーク時間(秒)があります。TimidiCP の状態を変更しない場合、dwReturn にコマンドを書く必要は有りません。

ファイル名の取得は、((CHAR*)SHARED_MEMORY変数 + dwOffsetFileName) で示されるメモリ領域をアクセスします。ファイル名終端は'\0'で表される文字列で
す。

PCM データの取得は、((CHAR*)SHARED_MEMORY変数 + dwOffset) で示されるメモリ領域をアクセスします。dwSize には、PCM データ領域の BYTE 単位の大きさが入ります。

1. 共有メモリインターフェース開設イベントの作成
共有メモリインターフェース開設イベントは、"TimidiCP_Open" イベント名に、プロセス識別文字列を付加してイベントを作成します。

HANDLE hSharedOpen = CreateEvent(NULL, FALSE, FALSE,
                         "TimidiCP_Open" "0") ;

2. TimidiCP プロセス起動
TimidiCP プロセス起動には、ShellExecute 関数や、CreateProcess 関数を使用し TimidiCP.exe を起動します。TimidiCP.exe のコマンドラインには、再生する MIDI ファイル名、出力ファイル名("")、プロセスID文字列、プロセス識別文字列を指定します。

CHAR szCommandLine[_MAX_PATH] ;
wsprintf(szCommandLine, "c:\\Test.mid \"\" %d "
                  "0",GetCurrentProcessId()) ;
ShellExecute(NULL, "open", "c:\\Timidi95\\TimidiCP.exe",
             szCommandLine,"c:\\Timidi95", SW_SHOW) ;

3. TimidiCP 初期化通知処理
TimidiCP プロセス起動を待機し、共有メモリオープンします。オープンに成功した場合、シグナル化し TimidiCP に制御を返します。

WaitForSingleObject(hSharedOpen, INFINITE) ;
HANDLE hSharedClose = OpenEvent(EVENT_ALL_ACCESS, FALSE,
                        "TimidiCP_Close" "0") ;
HANDLE hSharedMemory = OpenFileMapping(FILE_MAP_ALL_ACCESS,
                     FALSE,"TimidiCP_Memory" "0") ;
SHARED_MEMORY* pSharedMemory =
         (SHARED_MEMORY*)MapViewOfFile(hSharedMemory,
         FILE_MAP_ALL_ACCESS, 0, 0, 0) ;
// 再生レートを変更する 44100 に変更する場合、以下の様に記述
// pSharedMemory->dwRate = 44100 ;
SetEvent(hSharedClose) ;

4. MIDI 再生 Open 時通知処理
TimidiCP から MIDI 再生 Open 処理が始まった事を受信します。

WaitForSingleObject(hSharedOpen, INFINITE) ;
//dwReturn には、再生継続(0xffffffff(-1)) を受け取る
// dwSize == 0 受信
SetEvent(hSharedClose) ;

5. MIDI 再生 Output時通知処理
PCM 出力データを受け取ります。

WaitForSingleObject(hSharedOpen, INFINITE) ;
//dwReturn には、再生継続(0xffffffff(-1)) を受け取る
// PCM データアクセスを行う
// dwSize != 0 受信
SetEvent(hSharedClose) ;

6. MIDI 再生 Close 時通知処理

WaitForSingleObject(hSharedOpen, INFINITE) ;
//dwReturn には、再生停止(0xfffffffe(-2)) を受け取る
// dwSize == 0 受信
SetEvent(hSharedClose) ;

MIDI 再生中に、MIDI 再生停止を行いたい場合、MIDI 再生 Output時通知処理で、dwReturn に、再生停止(0xfffffffe(-2)) を書き込みシグナル化します。TimidiCP は、dwReturn に再生停止(0xfffffffe(-2))を受け取ると、MIDI 再生Close 時通知処理に移ります。

MIDI 再生中に、指定秒数にシーク後 MIDI 再生停止を行いたい場合、MIDI 再生Output時通知処理で、dwReturn に、シーク秒数を書き込みシグナル化します。TimidiCP は、dwReturn にシーク秒数を受け取ると、再生位置をシーク秒数に移動後、MIDI 再生 Output時通知処理を行います。シーク秒数は、0から
dwFileTotalSec で表される再生秒数まで指定出来ます。再生秒数を超えた値を指定した場合、MIDI 再生 Close 時通知処理を行います。

MIDI 再生 Close 時通知処理後、別の MIDI ファイル再生を行う場合、
((CHAR*)SHARED_MEMORY変数 + dwOffsetFileName) で示されるメモリ領域にファイル名を格納し、dwReturn に再生継続(0xffffffff(-1))を書き込み、シグナル化します。TimidiCP は、MIDI 再生 Close 時通知処理後、dwReturn に再生継続(0xffffffff(-1))を受け取ると、MIDI 再生 Open 時通知処理を開始します。

MIDI 再生 Close 時通知処理後、dwReturn が、再生停止(0xfffffffe(-2))の場合、TimidiCP プロセスは終了処理を行います。また、MIDI 再生中でもプロセスID文字列で示されるプロセスIDのプロセスが存在しなくなった場合、TimidiCPは、終了処理を行います。

[前ページ] [次ページ]