今日は先日こちらで配布した、REAPER C++ Extensionのサンプルを例にポイントなどを書いておきます。
筆者はREAPERを使い始めてまずいきなりC++Extensionの作り方を調べる方向に行ってしまったのですが、どこから手を付けていいやらなにやらよくわからんやらで結構ハマりました。
■reaper_plugin_functions.h
このヘッダはどこからやってきたの?って感じですが、これはREAPER本体から書き出します。
メインメニューの[Actions > ActionList]から
・[developer] Write C++ API functions header
を実行すると、書き出し先を指定するダイアログが出るので、任意の場所に保存します。
この時に、[Write functions exported by 3rd party extensions]にチェックを入れると、3rdPartyの公開
してるAPIなんかもヘッダに書き出されます(当面は不要ですが)。
このあたりも自分でAPIを外部公開する方法があるのですがそれはどこかの機会にでも。

↑これを実行

↑このウィンドウでヘッダを保存
■reaper_plugin.h
これはSWSのソースから拝借しました。
どうも公式のExtensionSDKより新しいもののようなのですが、これがどこから出てきたのか出自がよくわからないです・・・。
とはいえこのヘッダはExtensionを作る上で極めて有用な情報源となります。
■ReaperApiImpl.cpp
reaper_plugin_functions.h内にあるREAPERAPI_LoadAPI()の実体を生成するためのファイルです。
自分でAPIを一つずつロードしていく実装はSWSなどでも行われていますが、この関数でAPIを呼び出す準備を大幅に簡略化できるので助かります。
■reaper_HelloAction.cpp
ここではDLLエントリポイントとActionのためのコールバック実装を行っています。
ほぼ全てにコメントをつけているので大丈夫かもしれませんが、ポイントは以下の通り。
・Pluginがロードされるとreaper_plugin_info_t* recがエントリポイントにやってくる
(Pluginアンロード時はまたエントリポイントが呼ばれますが、nullptrが来る)
・REAPERAPI_LoadAPI()を読んでAPIを使えるようにする
・plugin_register()でコールバックやActionなどを登録(名前の先頭にハイフン'-'を付けると登録解除)
・REAPERでActionを実行すると、hookcommand2で登録したコールバックが呼ばれる
(他にhookcommandという方もあるのですが、これは後々とりあげる予定です)
・ActionList右上にSection指定があるのですが、これらに個別にActionを登録可能で、
今回はSection毎に登録できる方法をとったサンプルにしています。

↑ActionListのSection
■reaper_HelloAction(64).dll
実は筆者が最初うまくいかずにハマってしまったのはこのDLL名でした。
REAPERは "reaper_" というプレフィックスがついたDLLしかプラグインとして認識しません。
SWSも reaper_sws.dll だし、reapackも reaper_reapack.dll でした。
自分は最初TestPlugin.dll とかそういう名前にしてた気がしますが、それだとDLLのエントリポイントに
一切呼び出しが入ってきません。
恐らく余計なDLLロードやチェックで起動が重くなるのを防いでいるのではないかと推測していますが、このDLL名には注意して下さい。
DLL名の落とし穴は実はまだ別にあったりして、自分はそこでもハマりました。
が、長くなってきたのでそれについてはまた別の機会にでも。
筆者はREAPERを使い始めてまずいきなりC++Extensionの作り方を調べる方向に行ってしまったのですが、どこから手を付けていいやらなにやらよくわからんやらで結構ハマりました。
■reaper_plugin_functions.h
このヘッダはどこからやってきたの?って感じですが、これはREAPER本体から書き出します。
メインメニューの[Actions > ActionList]から
・[developer] Write C++ API functions header
を実行すると、書き出し先を指定するダイアログが出るので、任意の場所に保存します。
この時に、[Write functions exported by 3rd party extensions]にチェックを入れると、3rdPartyの公開
してるAPIなんかもヘッダに書き出されます(当面は不要ですが)。
このあたりも自分でAPIを外部公開する方法があるのですがそれはどこかの機会にでも。

↑これを実行

↑このウィンドウでヘッダを保存
■reaper_plugin.h
これはSWSのソースから拝借しました。
どうも公式のExtensionSDKより新しいもののようなのですが、これがどこから出てきたのか出自がよくわからないです・・・。
とはいえこのヘッダはExtensionを作る上で極めて有用な情報源となります。
■ReaperApiImpl.cpp
reaper_plugin_functions.h内にあるREAPERAPI_LoadAPI()の実体を生成するためのファイルです。
自分でAPIを一つずつロードしていく実装はSWSなどでも行われていますが、この関数でAPIを呼び出す準備を大幅に簡略化できるので助かります。
■reaper_HelloAction.cpp
ここではDLLエントリポイントとActionのためのコールバック実装を行っています。
ほぼ全てにコメントをつけているので大丈夫かもしれませんが、ポイントは以下の通り。
・Pluginがロードされるとreaper_plugin_info_t* recがエントリポイントにやってくる
(Pluginアンロード時はまたエントリポイントが呼ばれますが、nullptrが来る)
・REAPERAPI_LoadAPI()を読んでAPIを使えるようにする
・plugin_register()でコールバックやActionなどを登録(名前の先頭にハイフン'-'を付けると登録解除)
・REAPERでActionを実行すると、hookcommand2で登録したコールバックが呼ばれる
(他にhookcommandという方もあるのですが、これは後々とりあげる予定です)
・ActionList右上にSection指定があるのですが、これらに個別にActionを登録可能で、
今回はSection毎に登録できる方法をとったサンプルにしています。

↑ActionListのSection
■reaper_HelloAction(64).dll
実は筆者が最初うまくいかずにハマってしまったのはこのDLL名でした。
REAPERは "reaper_" というプレフィックスがついたDLLしかプラグインとして認識しません。
SWSも reaper_sws.dll だし、reapackも reaper_reapack.dll でした。
自分は最初TestPlugin.dll とかそういう名前にしてた気がしますが、それだとDLLのエントリポイントに
一切呼び出しが入ってきません。
恐らく余計なDLLロードやチェックで起動が重くなるのを防いでいるのではないかと推測していますが、このDLL名には注意して下さい。
DLL名の落とし穴は実はまだ別にあったりして、自分はそこでもハマりました。
が、長くなってきたのでそれについてはまた別の機会にでも。
このブログにコメントするにはログインが必要です。
さんログアウト
この記事には許可ユーザしかコメントができません。