Script

PeloReaper Extensionの情報やダウンロードはこちらからどうぞ。
PeloReaper Extension for REAPER is here.
ReaperBanner01_w250 AudioSoftBanner01_w250

ReaScript入門(1): ReaScriptの初歩的なこと~Hello World

今回からREAPER上で動作させられるスクリプトやその動作環境などについて解説していきます。少しでもReaScript入門のハードルを下げていければと思っていますが、どうなることやら。


ReaScriptイントロダクション

ReaScriptとは

ReaScriptとはREAPER上で動かせるスクリプト(もしくはその実行環境のこと)を指します。厳密な解説は下記リンクの公式サイトに譲るとして、ひとまず「スクリプトを追加することでREAPERのActionを追加できる」のだと理解していれば十分かと思います。

ReaScriptからはREAPER本体やExtensionから提供されるAPIを呼び出したり、他の既存のActionを実行したりといったことが出来ます。APIはActionを作るためのプログラムの部品のようなもので、例えばTrackの個数を返してくれる関数など様々なものがあります。

では「これで何を実現できるか」というのは多岐にわたるのですが、例えば以下のようなものでしょうか。

  • 手間がかかる定型作業を1つのAction(スクリプト)で実行させるような自動化(Item編集やMIDI編集、FXのパラメータ設定等様々な作業に応用可能)
  • 既存のActionの動作では満足いかなかった場合に、自分専用にカスタムした動きのActionを作って作業オペレーションを最適化
  • カスタムGUIを作成して自分用のツールを作る
これらの他にもアイデア次第で自分のやりたい事を実現出来ると思います。

また、REAPER上で動作するスクリプトという意味では、オーディオFXやMIDI FXを作れるJSFX、動画などの画像処理を行うVideo Processorスクリプトなどもありますが、この記事の系列では扱いません。Video Processorについてはこの辺りで過去にいろいろ記事を書きましたので、そちらを見てもらうと良いかと思います。


ReaScript自作の必要性

ではどういった時にReaScriptを自作する必要があるのでしょうか?

REAPERを使い始めた初心者の方は、いきなりReaScriptを書く必要はありません。既に便利なActionやスクリプトが沢山ありますので、それを使って自分の作業環境を良くしていければ十分じゃないかと思います。

ReaScript自作に手を出す前に、試しに使ってみて把握しておくと良さそうなところをいくつかリストアップしておきますので参考にしてみて下さい(下に行くほど高度・面倒)。

  • デフォルトでREAPERに実装されている様々なActionを使ってみる。
  • SWSもインストールして、これに含まれるActionも使ってみる。
  • REAPER標準のCustom Action(複数のActionを並べて順番に実行できる、一般的なツールだとマクロ機能のようなもの)でActionを組み合わせて実行してみる。
  • ReaPackで有志の方が作成したスクリプトをダウンロードしていろいろ試してみる。
  • おまけとしてSWSのCycle Actionを試すのもアリですが、もうこのあたりからプログラミング色が強くなってきます(プログラミングに慣れてくればReaScriptで書いた方が楽かも)。

こういった既存の機能をいろいろと使っていくと、それらでは細かいところに手が届かないように感じたりする場面が出てきたりします。そう感じて更に自分に最適なActionが欲しくなってきたら、いよいよReaScriptを書く必要性が高まってきたと言えるでしょう。

とはいえReaScript自体に興味があるなら、もろもろすっ飛ばしていきなりスクリプトを作り始めてもいいと思います。上記の内容はあくまで参考までにということで。


ReaScript作成に使用できるプログラミング言語

ReaScriptを作成するのに使用できる言語はReaScript公式ページに記載されていますが、EEL2、Lua、Pythonから選ぶことが出来ます。Pythonはセットアップが必要なので、デフォルトの状態で使えるのはEEL2とLuaになります。

言語追加セットアップ解説
EEL2 不要 REAPERを含むCockosのツール専用の範囲ではあちこちで使われている言語。Video processorやJSFX等のオーディオ処理等にも用いられており、スクリプト実行パフォーマンスが良いとされています。REAPER内のみだけでスクリプトを組む前提なら、覚えておくといろいろなものを作れるようになるので便利な一方、REAPER以外ではほぼ使われていない言語なので、3つの言語のうち習得ハードルは最も高いと言えるでしょう。
Lua 不要 ReaScriptを書くのに最も標準的に使われている言語で、ネットにもLua言語解説の記事は多数存在するので習得が比較的容易です。REAPER以外のオーディオ関連ツールでもLuaの採用率は高い(例:Steinberg HALion、UVI Falcon、SurgeXT、Synthesizer V、Renoiseなど)ので、習得しておくとREAPER以外でも役に立つ可能性があります。何か特別な理由がなければLuaがオススメです。
Python 必要 上記2つの言語が割とコンパクトな規模のものなのに対して、様々なモジュールを用いて複雑な作業を割と容易に実現できるのがPythonの良いところ。言語自体の解説記事なども多く、習得が比較的容易。一見最強の選択肢に見えますが、いくつかデメリットも存在します。
  • REAPERでPythonを使うには追加のセットアップが必要。スクリプトを他人に配るなら、相手側にも同じPythonをインストールしたりする必要があったり、それに伴う面倒な環境依存問題に悩むことがあるかも。
  • 公式サイトにも書かれていますが、一部の機能がPythonではサポートされていなかったりします。
  • うろおぼえ的な記憶だと、Pythonスクリプト起動には若干時間がかかるので、スクリプトを高速に連打するようなことをやるとLuaと比べてかなり処理が遅くなることもあったような・・・(最近試してないので、既に改善されている可能性はあります)。

いろいろ書いてしまいましたが、ザックリまとめると

  • 一般的にはLuaがオススメ
  • 多少手間はあるけど複雑な事をサクッとやりたいならPythonも使う
あたりが落としどころでしょうか。

※今後の記事ではLuaを使用することを前提として解説を進めていきます。また、Lua言語自体の書き方や言語仕様等の説明も出来るだけ割愛させて頂くことにして、ReaScript固有の部分に的を絞って解説しますのでご了承下さい。


(おまけ)REAPER Extensionについて

REAPERのAPIは上記で紹介したスクリプト言語からだけでなく、C言語から呼び出す方法も用意されています。C言語で作成されたREAPERのプラグインは特別にREAPER Extensionと呼ばれています。こちらはLua等のテキストファイルを追加すればサクッとActionを追加出来るというような代物ではなく、作成のハードルは非常に高くなっています。

過去に当ブログでもREAPER Extensionの作り方についてこの辺りの記事で解説していますが、ゴリゴリのエンジニア向けの内容となります。本記事の読者向けには「まぁそんなものもあるのね」くらいに知っておいてもらえればOKです。


ReaScriptを作成してみる

ReaScript作成~実行方法

それでは簡単なReaScriptを作成して、実行してみましょう。

  1. REAPERメインメニューから [Actions > Show action list...] でAction Listを表示します。
  2. Action List下部にある [New action...] ボタンをクリックして [New ReaScript...] を選ぶと、スクリプトの保存場所を聞かれます。 ReaScript_HelloWorld_AddNewScript
  3. ファイルの種類は [Lua files (*.lua)] で、ファイル名は任意に指定します(ファイル名はそのままAction名になるのと、利便性の都合上日本語は用いずに半角英数のみのファイル名にしておくのがオススメです)。
    ここでは HelloReaperWorld.lua という名前にして保存します。
    ReaScript_HelloWorld_AddNewScriptFile
  4. 保存するとスクリプトを編集するテキストエディタが表示されますが、実はもうこの時点でスクリプト自体の作成(とそれに対応するActionの追加)は完了していて、Action Listに「Script: HelloReaperWorld.lua」というActionが並んでいると思います。もちろん、実行も可能です(スクリプトが空なので何も起きませんが)。
    ReaScript_HelloWorld_Action

Hello World:テキストを表示するプログラムの作成

では作成したスクリプトにエディタ上で以下のコードを追加して、Ctrl+Sで保存してみましょう。保存すると、同時にActionも実行されます。

reaper.ShowConsoleMsg("Hello REAPER World!!")

ReaScript_HelloWorld_Code_01

REAPERのコンソールウィンドウが開いて、「Hello REAPER World!!」と表示されたのではないでしょうか。
ReaScript_HelloWorld_Result

これでLuaによる初めての自作ReaScriptの完成です! あとはいつでもAction Listから呼び出すことが可能です。

プログラムの簡単な解説

  • REAPERのAPIは、Luaだと「reaper.API名(パラメータ)」のような形で呼び出せます。
  • 「ShowConsoleMsg」はREAPERのコンソールウィンドウにメッセージを表示するAPIで、パラメータとして "Hello REAPER World!!" という文字列をセットしています。

作成したスクリプトを後から修正したい場合

また、後からこのスクリプトを修正したい場合は、追加したスクリプトのActionをAction Listで選択して [Edit action...] ボタンで編集出来ます。

ReaScript_HelloWorld_EditScript


作成したスクリプトを削除したい場合

既に作成してあるスクリプトのActionを選択して、Action Listの [Delete] ボタンで削除できます。

ReaScript_HelloWorld_DeleteScript


既に作っておいたScriptを読み込んでActionにしたい場合

最初にスクリプトを作成する時と似ていますが、Action Listのボタンで [New action... > Load ReaScript...] からスクリプトのファイルをロードすればOKです。

ReaScript_LoadScriptFile



今回はここまで。前置きが長かった割に、スクリプトを作り始めたらあっという間だったのではないでしょうか。Actionをこんなにも簡単に追加出来ると分かると、夢が広がりますよね。


ReaScriptのLuaでDLLモジュールを使う

今回は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して公開された関数を呼ぶ

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" )

実行結果はこちら
LuaRequire_Result01

ということで、Cで作成したDLLをLuaで直接読み込んで実行することが出来ました。

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

このブログについて
ぺろりがREAPERで遊びたいというだけのブログかもしれない

必ずこちらをお読みください

twitter: @pelori

管理人用
  • ライブドアブログ