デグレファクトリー

未来の技術で高度なバグを埋め込むソフトウェア製作所

SPC_BPM.DLL は、SNES SPC700 Player に搭載されている BPM アナライザ (テンポ推測機能) を取り出した DLL です。

SNESAPU.DLL と組み合わせることで、BPM を推測し取得する機能を付加することができます。

※ v1.0.1 以降: デグレファクトリー提供の SNESAPU.DLL だけでなく、デバッグ機能を有効化した SNESAPU.DLL にも対応しています。 デバッグ機能を有効化するためには、公式ソースコードからビルドが必要です。

2024/01/18 更新 - v1.0.1

  1. SNESAPU.DLL を LoadLibrary 関数で開きます。 このときの DLL ハンドルを記憶しておきます。

    同様に、SPC_BPM.DLL を LoadLibrary 関数で開きます。

  2. Initialize 関数で、SPC_BPM.DLL を初期化します。

    このとき、前の手順で取得しておいた SNESAPU.DLL のハンドルを渡します。

  3. 演奏開始するとき (SNESAPU.DLL の ResetAPU または LoadSPCFile 関数を呼び出した後) に、Start 関数を呼び出します。

    BPM 推測機能が有効になり、SNESAPU.DLL からの割り込みを待機するモードになります。

  4. SNESAPU.DLL の EmuAPU 関数を呼び出して波形データを取得し、通常どおり演奏します。

    この間、SNESAPU.DLL から SPC_BPM.DLL へ向けて、演奏データの転送 (割り込み) が自動的に行われ、BPM 推測処理が実行されます。

  5. GetBPM 関数を呼び出して BPM を取得します。

    この関数を呼び出すたびに数値が変わりますので、画面描画のたびに繰り返し取得してください。

  6. 演奏を停止するとき、シーク実行直前、WAVE ファイル出力前などには、Stop 関数を呼び出して BPM 解析を停止します。

    この関数を呼び出さなくても実害はありませんが、不要な計算を行わなくなりますので、CPU 使用率を下げることができます。

    BPM 解析を再開するためには、再度 Start 関数を呼び出します。

  7. アプリケーション終了時に、SNESAPU.DLL を FreeLibrary 関数で閉じます。

    同様に、SPC_BPM.DLL を FreeLibrary 関数で閉じます。

BPM の解析結果を取得します。

s32 GetBPM(void* lpReserved);

引数

戻り値

関数が成功すると、BPM (60~200 の間) が返ります。

BPM がまだ確定していない場合は 0 が返ります。

関数が失敗すると、負の値が返ります。 これは失敗の原因を示すコード値です。

解説

この関数を呼び出す前に、Start 関数で BPM 解析が開始されている必要があります。

SNESAPU.DLL の EmuAPU 関数が呼び出された後に BPM 値が更新されますので、この関数を呼び出す前に EmuAPU 関数を呼び出してください。

演奏中の発音状態・タイミングなどを考慮してリアルタイムで推測しますので、BPM が確定するまで 2~6 秒分の波形データが生成されている必要があります。 発音数が極端に少ない場合は、さらに時間がかかることがあります。 また、途中でテンポが変わった場合も、反映されるまで同程度の遅延が発生します。

参照

Start

SPC_BPM.DLL の初期化を行い、SNESAPU.DLL との連携を行います。

s32 Initialize(u32 hSNESAPU);

引数

戻り値

関数が成功すると 0 が返ります。

すでに初期化されている場合は何も行われず、1 が返ります。

関数が失敗すると、負の値が返ります。 これは失敗の原因を示すコード値です。

解説

この関数は SNESAPU.DLL の SNESAPUCallback または SetDSPDbg 関数を暗黙的に使用します。 それらの関数が存在しない場合、この関数は失敗します。

すでに他の場所で SNESAPUCallback 関数による割り込みが行われている場合、関数呼び出しのチェーンを実施します。 したがって、SNESAPUCallback 関数を使用している場合は、その呼び出しの後でこの関数を使用してください。 SetDSPDbg 関数のチェーンは動作保証がありません。

参照

Start

BPM 解析の準備と初期化を行い、BPM 解析を開始します。

s32 Start(void* lpReserved);

引数

戻り値

関数が成功すると 0 が返ります。

関数が失敗すると、負の値が返ります。 これは失敗の原因を示すコード値です。

解説

この関数を呼び出す前に、Initialize 関数で初期化する必要があります。

すでに BPM 解析が開始されている状態でこの関数を呼び出すと、メモリのクリアを行い、最初から解析を行います。

SPC ファイルを SNESAPU.DLL に読み込んだ後 (SNESAPU.DLL の ResetAPU または LoadSPCFile 関数を呼び出した後) に、この関数を呼び出してください。 SNESAPU.DLL のリセット前にこの関数を呼び出すと、BPM の解析に失敗することがあります。

他の SPC ファイルに切り替えるために SNESAPU.DLL をリセットした場合、再度この関数を呼び出して、メモリのクリアを行ってください。 BPM 解析が不要になった場合は、Stop 関数を呼び出してください。

参照

GetBPM, Initialize, Stop

BPM 解析を停止します。

s32 Stop();

引数

ありません。

戻り値

関数が成功すると 0 が返ります。

関数が失敗すると、負の値が返ります。 これは失敗の原因を示すコード値です。

解説

この関数を呼び出す前に、Start 関数で BPM 解析が開始されている必要があります。

シーク実行時や、WAVE ファイル出力時など、BPM 値の取得が不要な場合に、この関数を呼び出してください。 この関数を呼び出さなくても実害はありませんが、不要な計算を行わなくなりますので、CPU 使用率を下げることができます。

BPM の解析を再開するには、Start 関数を呼び出してください。

参照

Start

各関数の失敗の原因を示すコード値は以下の通りです。

-1

BPM 解析が使用できない SNESAPU.DLL です。

SPC_BPM.DLL が初期化されていません。

-2

BPM 解析が開始されていません。