デグレファクトリー
未来の技術で高度なバグを埋め込むソフトウェア製作所
未来の技術で高度なバグを埋め込むソフトウェア製作所
SPC_BPM.DLL は、SNES SPC700 Player に搭載されている BPM アナライザ (テンポ推測機能) を取り出した DLL です。
SNESAPU.DLL と組み合わせることで、BPM を推測し取得する機能を付加することができます。
※ v1.0.1 以降: デグレファクトリー提供の SNESAPU.DLL だけでなく、デバッグ機能を有効化した SNESAPU.DLL にも対応しています。 デバッグ機能を有効化するためには、公式ソースコードからビルドが必要です。
SNESAPU.DLL の API バージョンは v2.x 系に対応しています。 v1.x 系や v3.x 系の API は仕様が異なるため、動作しません。
各関数の呼び出し規約は、すべて stdcall です。
各関数はスレッドセーフではありません。 同じ SNESAPU.DLL, SPC_BPM.DLL のインスタンスを複数スレッドから取り扱う場合は、クリティカルセクションなどを利用して、関数が同時に呼び出されないように実装してください。
この資料に記載されていない API については、動作保証はありません。 また、予告なく削除することがあります。
2024/01/18 更新 - v1.0.1
SNESAPU.DLL を LoadLibrary 関数で開きます。 このときの DLL ハンドルを記憶しておきます。
同様に、SPC_BPM.DLL を LoadLibrary 関数で開きます。
Initialize 関数で、SPC_BPM.DLL を初期化します。
このとき、前の手順で取得しておいた SNESAPU.DLL のハンドルを渡します。
演奏開始するとき (SNESAPU.DLL の ResetAPU または LoadSPCFile 関数を呼び出した後) に、Start 関数を呼び出します。
BPM 推測機能が有効になり、SNESAPU.DLL からの割り込みを待機するモードになります。
SNESAPU.DLL の EmuAPU 関数を呼び出して波形データを取得し、通常どおり演奏します。
この間、SNESAPU.DLL から SPC_BPM.DLL へ向けて、演奏データの転送 (割り込み) が自動的に行われ、BPM 推測処理が実行されます。
GetBPM 関数を呼び出して BPM を取得します。
この関数を呼び出すたびに数値が変わりますので、画面描画のたびに繰り返し取得してください。
演奏を停止するとき、シーク実行直前、WAVE ファイル出力前などには、Stop 関数を呼び出して BPM 解析を停止します。
この関数を呼び出さなくても実害はありませんが、不要な計算を行わなくなりますので、CPU 使用率を下げることができます。
BPM 解析を再開するためには、再度 Start 関数を呼び出します。
アプリケーション終了時に、SNESAPU.DLL を FreeLibrary 関数で閉じます。
同様に、SPC_BPM.DLL を FreeLibrary 関数で閉じます。
BPM の解析結果を取得します。
s32 GetBPM(void* lpReserved);
引数
[in] lpReserved
将来のために予約されています。 NULL を指定してください。
戻り値
関数が成功すると、BPM (60~200 の間) が返ります。
BPM がまだ確定していない場合は 0 が返ります。
関数が失敗すると、負の値が返ります。 これは失敗の原因を示すコード値です。
解説
この関数を呼び出す前に、Start 関数で BPM 解析が開始されている必要があります。
SNESAPU.DLL の EmuAPU 関数が呼び出された後に BPM 値が更新されますので、この関数を呼び出す前に EmuAPU 関数を呼び出してください。
演奏中の発音状態・タイミングなどを考慮してリアルタイムで推測しますので、BPM が確定するまで 2~6 秒分の波形データが生成されている必要があります。 発音数が極端に少ない場合は、さらに時間がかかることがあります。 また、途中でテンポが変わった場合も、反映されるまで同程度の遅延が発生します。
参照
SPC_BPM.DLL の初期化を行い、SNESAPU.DLL との連携を行います。
s32 Initialize(u32 hSNESAPU);
引数
[in] hSNESAPU
SNESAPU.DLL の DLL ハンドルを指定します。
戻り値
関数が成功すると 0 が返ります。
すでに初期化されている場合は何も行われず、1 が返ります。
関数が失敗すると、負の値が返ります。 これは失敗の原因を示すコード値です。
解説
この関数は SNESAPU.DLL の SNESAPUCallback または SetDSPDbg 関数を暗黙的に使用します。 それらの関数が存在しない場合、この関数は失敗します。
すでに他の場所で SNESAPUCallback 関数による割り込みが行われている場合、関数呼び出しのチェーンを実施します。 したがって、SNESAPUCallback 関数を使用している場合は、その呼び出しの後でこの関数を使用してください。 SetDSPDbg 関数のチェーンは動作保証がありません。
参照
BPM 解析の準備と初期化を行い、BPM 解析を開始します。
s32 Start(void* lpReserved);
引数
[in] lpReserved
将来のために予約されています。 NULL を指定してください。
戻り値
関数が成功すると 0 が返ります。
関数が失敗すると、負の値が返ります。 これは失敗の原因を示すコード値です。
解説
この関数を呼び出す前に、Initialize 関数で初期化する必要があります。
すでに BPM 解析が開始されている状態でこの関数を呼び出すと、メモリのクリアを行い、最初から解析を行います。
SPC ファイルを SNESAPU.DLL に読み込んだ後 (SNESAPU.DLL の ResetAPU または LoadSPCFile 関数を呼び出した後) に、この関数を呼び出してください。 SNESAPU.DLL のリセット前にこの関数を呼び出すと、BPM の解析に失敗することがあります。
他の SPC ファイルに切り替えるために SNESAPU.DLL をリセットした場合、再度この関数を呼び出して、メモリのクリアを行ってください。 BPM 解析が不要になった場合は、Stop 関数を呼び出してください。
参照
BPM 解析を停止します。
s32 Stop();
引数
ありません。
戻り値
関数が成功すると 0 が返ります。
関数が失敗すると、負の値が返ります。 これは失敗の原因を示すコード値です。
解説
この関数を呼び出す前に、Start 関数で BPM 解析が開始されている必要があります。
シーク実行時や、WAVE ファイル出力時など、BPM 値の取得が不要な場合に、この関数を呼び出してください。 この関数を呼び出さなくても実害はありませんが、不要な計算を行わなくなりますので、CPU 使用率を下げることができます。
BPM の解析を再開するには、Start 関数を呼び出してください。
参照
各関数の失敗の原因を示すコード値は以下の通りです。
-1 | BPM 解析が使用できない SNESAPU.DLL です。 SPC_BPM.DLL が初期化されていません。 |
---|---|
-2 | BPM 解析が開始されていません。 |
デバッグ機能を有効化した公式 SNESAPU.DLL に対応 (要ビルド)。
BPM が正しく推測できない不具合を修正。
影響するゲーム: RPG ツクール、RPG ツクール 2
初版。