Skip to content

サンプルプラグイン

外部 API を使う独立した .aux2 のサンプルです。共有 MIDI から BPM・拍子・小節・ノート数などを取得してテキスト表示します。サンプルとそのビルド(xmake)は公開リポ midi-info-api に同梱されており、本体には submodule(external/midi-info-api)として取り込んでいます。

  • ソース: external/midi-info-api/samples/api-sample/MidiApiSample.cpp(この 1 ファイルのみ・コア非依存)
  • 依存: AviUtl2 SDK と 公開ヘッダ MidiInfoAPI.h(MIT・別リポ / submodule external/midi-info-api)だけ

ビルド

xmake と AviUtl2 SDK(filter2.h / plugin2.h)が必要です。SDK は AviUtl 作者の配布ページから入手できます。

展開先(filter2.h などがある場所)を AVU2_SDK_DIR に指定してビルドします。

bash
xmake build MidiInfoApiSample

ビルド後、AVU2_PLUGIN_DIR(既定 C:\ProgramData\aviutl2\Plugin)に MidiApiSample.aux2 がコピーされます。MidiInfoApiSample は既定ビルド対象外なので、明示的に指定したときだけビルドされます。

公開リポ midi-info-api 単体でも xmake build でサンプルをビルドできます(同じく AVU2_SDK_DIR が必要)。

使い方

  1. MidiInfoObject.aux2(本体)と MidiApiSample.aux2(サンプル)の両方をプラグインフォルダに入れて AviUtl2 を起動。
  2. タイムラインに MIDI Source を置いて .mid を読み込む(=共有 MIDI が確定)。
  3. MIDI API Sample(カテゴリ MIDI Info)を置くと、共有 MIDI の情報が表示されます。

API が見つからない場合は画面に「API not found」と出るので、連携の有無がすぐ分かります。

実装のポイント

API の取得(初回のみ解決してキャッシュ)

cpp
const MidiInfoAPI* get_api() {
    static const MidiInfoAPI* api = [] () -> const MidiInfoAPI* {
        HMODULE h = GetModuleHandleW(L"MidiInfoObject.aux2");
        if (!h) return nullptr;
        auto fn = reinterpret_cast<MidiInfo_GetAPI_Fn>(
            GetProcAddress(h, MIDIINFO_GETAPI_SYMBOL));
        return fn ? fn(MIDIINFO_API_VERSION) : nullptr;
    }();
    return api;
}

取得 → 表示 → 解放

cpp
double t = api->get_shared_time();                 // MIDI Source に同期
if (!(t == t)) t = video->object->time;            // NaN なら自分の時刻

MidiInfoAnalysis* an = api->acquire(nullptr);       // 共有 MIDI
if (api->is_ok(an)) {
    uint8_t num, den; api->signature_at(an, t, &num, &den);
    // bpm_at / bar_number_at / count_at / nps_at / total_notes ... を表示
}
api->release(an);                                   // 必ず解放

テキストは GDI でビットマップ化していますが、note_spans を使えば独自のピアノロールなどのビジュアライザも作れます。

自作プラグインへの組み込み

配布物としては MidiInfoAPI.h の 1 ファイルをコピーすれば十分です。リンク不要(GetProcAddress で実行時解決)。詳細は 概要・はじめかた関数リファレンス を参照してください。