今回はReaScriptのluaでDLLモジュールをrequireする方法を試してみました。
DLLの作り方やluaからの呼び出しについてはググればすぐ出てくるので細かく説明しませんが、手順としては以下のような感じです。
1. REAPERのLuaが5.3系なので、Lua5.3.xのLibを落としてくる(staticリンク系がラク)
2. CでLuaに関数を公開するモジュールDLLの作成
3. REAPERの実行ファイル(reaper.exe)がある場所にモジュールDLLを置く
4. ReaScriptのLuaでそのモジュールをrequireして公開された関数を呼ぶ
ライブラリがバイナリでも配布されているのでそちらを利用するのがラクです。
static, dynamicいずれでも構いませんが、static版がラク。dynamicの場合はlua53.dllをreaper.exeと同じ場所に置く必要があるので注意。
以下のようなプログラムでDLLを作成すればOKです。
※念のため注意ですが、REAPERが64bitなら64bit版のDLLを作成して下さい。
DLLが作成できたら、REAPER本体(reaper.exe)と同じフォルダにDLLをコピーします。 (大抵は C:\Program Files\REAPER (x64) など)
実行結果はこちら

ということで、Cで作成したDLLをLuaで直接読み込んで実行することが出来ました。
REAPERの拡張ならExtensionを作る方法がありますが、ちょっとしたスクリプトの補助であれば、今回の方法も使える局面がありそうな気がします。
自分はlua初心者なので上記モジュールのソースやLuaサンプルもかなりテキトーですが、luaに精通している人であれば、何かもっといろいろ出来るのかもしれません。自分ももう少し勉強したいところですね。
DLLの作り方やluaからの呼び出しについてはググればすぐ出てくるので細かく説明しませんが、手順としては以下のような感じです。
1. REAPERのLuaが5.3系なので、Lua5.3.xのLibを落としてくる(staticリンク系がラク)
2. CでLuaに関数を公開するモジュールDLLの作成
3. REAPERの実行ファイル(reaper.exe)がある場所にモジュールDLLを置く
4. ReaScriptのLuaでそのモジュールをrequireして公開された関数を呼ぶ
LuaモジュールDLLの作成
まずはLua5.3.x系のLuaをダウンロードしましょう。(今回は5.3.4を使用しました)ライブラリがバイナリでも配布されているのでそちらを利用するのがラクです。
static, dynamicいずれでも構いませんが、static版がラク。dynamicの場合はlua53.dllをreaper.exeと同じ場所に置く必要があるので注意。
以下のようなプログラムでDLLを作成すればOKです。
※念のため注意ですが、REAPERが64bitなら64bit版のDLLを作成して下さい。
#include "lua.hpp" extern "C" { // exportする関数 static int MyCalc_Impl(lua_State *L) { // 最初のスタックから値を読みだす double d = lua_tonumber( L, 1 ); // 戻り値をスタックに積む lua_pushnumber( L, d / 2.0 ); lua_pushnumber( L, d * 2.0 ); return 2; // 戻り値の個数 } // テーブル登録用 static luaL_Reg moduleFuncs[] = { { "MyCalc", MyCalc_Impl }, { nullptr, nullptr } // end of table }; static const int numOfFuncs = (sizeof(moduleFuncs) / sizeof(moduleFuncs[0])) - 1; // EntryPoint __declspec(dllexport) int luaopen_MyLuaModule(lua_State *L) { // 以下luaL_register()の替わり lua_newtable( L ); luaL_setfuncs( L, moduleFuncs, 0 ); lua_pushvalue( L, -1 ); lua_setglobal( L, "MyLuaModule" ); return 1; } } // extern "C"
DLLが作成できたら、REAPER本体(reaper.exe)と同じフォルダにDLLをコピーします。 (大抵は C:\Program Files\REAPER (x64) など)
ReaScriptでモジュールを使用
作成したモジュールを呼び出すluaスクリプトを作成します。require("MyLuaModule") local num1, num2 = MyLuaModule.MyCalc( 1.5 ) reaper.ShowConsoleMsg( "Result:" .. num1 .. "," .. num2 .. "\n" )
実行結果はこちら

ということで、Cで作成したDLLをLuaで直接読み込んで実行することが出来ました。
REAPERの拡張ならExtensionを作る方法がありますが、ちょっとしたスクリプトの補助であれば、今回の方法も使える局面がありそうな気がします。
自分はlua初心者なので上記モジュールのソースやLuaサンプルもかなりテキトーですが、luaに精通している人であれば、何かもっといろいろ出来るのかもしれません。自分ももう少し勉強したいところですね。