【Reaper×UE5】RIGDOCKSの新機能RADNODZでReaperを操作するアプリを作ってみた!【接続テスト編】
- 2 時間前
- 読了時間: 13分

目次
RADNODZとは
RIGDOCKSの新機能RADNODZはRIGDOCKSのAPIを別のアプリケーションからリモートで実行するための仕組みです。
RIGDOCKSでは例えば次のようなことができます。
RZDNODZを使用すると、これらの操作を行うアプリケーションをUnrealEngine5の強力なUI構築機能を使用して作成することができます。
事前準備
今回は「ReaperController」というプロジェクトを作成し、RADNODZのインストールまで行いました。


空のレベルを作成し、「Main」という名前で「Level」フォルダ内に保存します。
※レベル名、保存先名は任意です。


UnrealEngine5 の画面実装(Blueprint)
まず、RADNODZの機能を実行するための枠組みとなる画面を作成します。 UnrealEngineでは UI のことを Widget(ウィジェット) と呼び、UMG(Unreal Motion Graphics) という機能で作ります。
①Widget Blueprint を作る
コンテンツブラウザ(画面下部)の何もないところで右クリックします。
メニューから ユーザーインターフェース > ウィジェットブループリント を選びます。

「親クラスを選択」と聞かれたら ユーザーウィジェット をクリックします。

名前を入力する状態になるので、WBP_RadnodzDemo と入力して Enter を押します。
※ブループリント名は任意です。

②UMG デザイナの画面を把握する
WBP_RadnodzDemo をダブルクリックして開きます。
この画面はデザイナー画面で、画面のパーツ配置を行うことができます。

デザイナー画面の各要素
①パレット・・・置けるパーツの一覧。ここからドラッグして使う
②階層・・・置いたパーツの親子関係。名前の変更もここで
③キャンバス・・・実際の見た目
④詳細・・・選択したパーツの設定
③パーツを並べる
パレット上部の検索欄に CanvasPanel と入力し、出てきた CanvasPanel をキャンバスの中央あたりにドラッグ&ドロップします。これが土台となります。

パレットから次の要素を、階層パネルの CanvasPanel の上にドラッグして入れていきます。
パレットで検索する名前 | 役割 |
Editable Text Box | 接続先 IP の入力欄 |
Editable Text Box | ポートの入力欄 |
Editable Text Box | 新しい名前の入力欄 |
Button | 実行ボタン |
Text Block | 結果の表示、ラベル |

Button は「押せる四角」でしかなく、文字は入っていません。そのため子要素としてTextBlockを配置することでボタンに文字を表示することができます。

追加した要素に名前を付けます。これを行うことでBlueprintやC++から要素を参照し、値を取得したり変更したりすることができるようになります。
階層パネルでパーツをダブルクリックすると名前を変更できます。次のように付けてください。
パーツ | 付ける名前 |
1 つ目の Editable Text Box | IpTextBox |
2 つ目の Editable Text Box | PortTextBox |
3 つ目の Editable Text Box | NameTextBox |
Button | RenameButton |
Text Block | StatusText |

さらに、それぞれを選択した状態で、詳細パネルのいちばん上にある Is Variable(変数)のチェックボックスにチェックを入れます。

④画面をゲーム開始時に表示する
作った Widget は、置いただけでは画面に出ません。「ゲームが始まったら表示する」という指示が必要です。
これはレベルブループリントに書きます。
UMG エディタを閉じて、メインのエディタに戻ります。
ツールバーの ブループリント → レベルブループリントを開く をクリックします。
レベルブループリントを開く

黒いグリッドの画面(グラフ)が開きます。すでに Event BeginPlay というノードがあるはずです。無ければ、何もないところで右クリック → Event BeginPlay と検索して追加します。
Event BeginPlay は「ゲームが始まった瞬間に 1 回だけ実行される」という意味です。

次の 4 つのノードを繋ぎます。
Event BeginPlay
→ Create Widget (Class に WBP_RadnodzDemo を指定)
→ Add to Viewport (Target に Create Widget の Return Value を繋ぐ)
→ Set Input Mode UI Only (Player Controller に Get Player Controller を繋ぐ)
→ Set Show Mouse Cursor (Target に Get Player Controller / Show Mouse Cursor にチェック)

Set Input Mode UI Only と Set Show Mouse Cursor は、「ゲーム画面ではなく UI を操作するモードにして、マウスカーソルを表示する」という指示です。これが無いとボタンをクリックできません。
左上の コンパイル → 保存 を押します。

⑤動作確認
ツールバーの ▶ プレイ を押してください。3 つの入力欄とボタンが表示され、マウスで押せる状態になっていれば成功です(押してもまだ何も起きません)。


停止ボタンを押すか、Esc キーで終了できます。
うまく表示されない場合のチェックポイント
症状 | 確認すること |
何も表示されない | Create Widget の Class に WBP_RadnodzDemo が指定されているか |
表示されるがクリックできない | Set Input Mode UI Only と Set Show Mouse Cursor を繋いだか |
変更が反映されない | コンパイル を押したか |
UnrealEngine5のBlueprintでReaperに接続してみる
配置したパーツに機能を実装するには、デザイナー画面からグラフ画面に切り替えます。

①RADNODZ のノードを探してみる
ノードは RADNODZ|ランク|ジャンル|操作 という階層で整理されています。たとえばメディアアイテム名の設定は RADNODZ > BRONZE > MediaItem > Name の下にあります。

関数名がわかっているときは、AZ_SetMediaItemName のように関数名で直接検索するのがいちばん早いです。

※検索しても出てこないとき:検索欄の右上に
ある コンテキストに依存 のチェックを外してみてください。UE は「いま繋ごうとしている場所に合うノード」だけを絞り込んで表示するため、これが邪魔をすることがあります。

②クライアントを保持する変数を作る
REAPER との接続を担当するオブジェクトを、変数として持っておきます。
画面左の マイブループリント パネルで、変数 の右にある + ボタンをクリックします。
名前を Client にします。

詳細パネルの 変数の型 をクリックし、検索欄に Radnodz Client と入力します。
出てきた Radnodz Client の オブジェクト参照 を選びます。

※なぜ変数にするのか:接続は「押すたびに繋ぎ直す」より「一度繋いだら使い回す」ほうが速くて確実だからです。変数に入れておけば、次にボタンを押したときも同じ接続を使えます。
③ボタンのクリックイベントを作る
デザイナー タブに戻り、RenameButton を選択します。
詳細パネルをいちばん下までスクロールすると イベント という項目があるので、OnClicked の右にある + ボタンをクリックします。

自動的にグラフ画面に切り替わり、On Clicked (RenameButton) というノードが追加されます。これが「ボタンが押されたとき」の入口です。

④接続する
①クライアントを用意する
まだ作られていなければ作る、という分岐です。
マイブループリントの Client 変数をグラフにドラッグ → Get Client を選びます。

Get Client の青いピンからドラッグして離す → Is Valid と検索して追加します。Is Validはオブジェクトが有効かどうかを調べるノードです。

右クリック → Branch を追加し、Is Valid の結果を Condition に繋ぎます。BranchはConfitionに渡された値がTrueかFalseかで処理を分岐させるノードです。
Branch の False から → Create Radnodz Client を追加します。
その戻り値を、Client 変数を Ctrl キーを押しながらドラッグして作った Set Client に繋ぎます。

※変数のドラッグについて:マイブループリントから普通にドラッグすると Get(読み取り)、Ctrl を押しながらドラッグすると Set(書き込み)になります。
② 接続する
BranchのTrueの場合と、Falseの場合にClientにセットした後にConnectノードを追加
マイブループリントの IpTextBox をグラフにドラッグ(Get を選択)し、そのピンからドラッグ → Get Text を追加
Get Text の戻り値を Connect の ip ピンに繋ぐと、変換ノードが自動で挿入されます(Text → String)
ポートも同様に。こちらは To String のあと To Int を挟みます

③ 失敗したらエラーを表示する
Connectの結果をBranchに接続し、BranchのFalseから、Status Textのテキストを変更する処理に分岐させます。 Connectが失敗した場合はここで処理を終了するため、SetTextの先はなにも接続しません。

⑤メディアアイテムを取得して名前を変える
Branch の True からが本題です。 AZ_SetSelectedMediaNameを使用して選択しているアイテムの名前を変更します。
処理が終了したらDisconnectで切断します。

※client ピンは必須です。 RADNODZ の API ノードは、client ピンが未接続だとコンパイル時にエラーになります。 「なぜかコンパイルが通らない」ときは、まずこのピンを疑ってください。
⑥動かしてみる
コンパイル → 保存 を押します

REAPER 側でサーバが Running になっていることを確認します

UE で ▶ プレイ

IP・ポート・新しい名前を確認してボタンを押します

REAPER のメディアアイテム名がその場で変われば成功です。

UnrealEngine5 の画面実装(C++)
同じものを C++ でも作ってみます。実務では、処理を C++ に置いて、見た目だけ Blueprint で調整する構成がよく使われます。ノードが増えて絡まってきたときに、C++ のほうが見通しよく書けるためです。
C++のコードを書くため、VisualStudioのソリューションファイルを開きます。

①Build.cs に依存モジュールを追加する
UE では「どのモジュール(機能のかたまり)を使うか」を Build.cs というファイルに書きます。ここに書かないと、プラグインの機能を C++ から呼べません。
Visual Studio で Source/ReaperController/ReaperController.Build.cs を開き、次のようにします。
using UnrealBuildTool;
public class ReaperController : ModuleRules
{
public ReaperController(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[]
{
"Core", "CoreUObject", "Engine", "InputCore",
"UMG", "Slate", "SlateCore", // UMG を C++ から触るのに必要
"RadnodzClientPlugin", // 接続クライアント(必須)
"RigdocksBronzePlugin", // BRONZE の API
// "RigdocksSilverPlugin", // 必要になったら追加
// "RigdocksGoldPlugin",
});
PrivateDependencyModuleNames.AddRange(new string[] { });
}
}


RadnodzClientPlugin は常に必要です。あとは使うランクのモジュールだけ追加すれば OK です。
Build.cs を編集したら、Visual Studio のプロジェクトファイルを再生成してください。ReaperController.uproject を右クリック → Generate Visual Studio project files です。

②UserWidget を継承したクラスを作る
UE エディタのメニューから ツール > 新規 C++ クラス を選びます。
親クラスの一覧で すべてのクラス タブに切り替え、検索欄に UserWidget と入力します。
UserWidget を選んで 次へ。

名前を RadnodzDemoWidget にして クラスを作成。

Visual Studio にRadnodzDemoWidget.h と RadnodzDemoWidget.cpp が作られます。

③ヘッダを書く
RadnodzDemoWidget.h を次のように書き換えます。
#pragma once
#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "RadnodzDemoWidget.generated.h"
class UButton;
class UEditableTextBox;
class UTextBlock;
class URadnodzClient;
UCLASS()
class REAPERCONTROLLER_API URadnodzDemoWidget : public UUserWidget
{
GENERATED_BODY()
protected:
virtual void NativeConstruct() override;
virtual void NativeDestruct() override;
// ---- UMG のパーツと結びつける ----
// ここの変数名は、Widget Blueprint 側のパーツ名と完全に一致させること
UPROPERTY(meta = (BindWidget))
TObjectPtr<UEditableTextBox> IpTextBox;
UPROPERTY(meta = (BindWidget))
TObjectPtr<UEditableTextBox> PortTextBox;
UPROPERTY(meta = (BindWidget))
TObjectPtr<UEditableTextBox> NameTextBox;
UPROPERTY(meta = (BindWidget))
TObjectPtr<UButton> RenameButton;
UPROPERTY(meta = (BindWidget))
TObjectPtr<UTextBlock> StatusText;
private:
UFUNCTION()
void OnRenameClicked();
void SetStatus(const FString& Message);
UPROPERTY()
TObjectPtr<URadnodzClient> Client;
};
meta = (BindWidget) が今回のポイントです。 「Widget Blueprint 側にある同じ名前のパーツを、自動でこの変数に入れる」という指定です。4 で付けた名前(IpTextBox など)と一致していないと、Widget Blueprint 側でエラーになります。 ※REAPERCONTROLLER_APIの部分はプロジェクト名を大文字にしたものです。プロジェクト名を変えた方は、自動生成されたヘッダに書かれているものをそのまま使ってください。 ④実装(画面部分だけ)
RadnodzDemoWidget.cpp を次のようにします(接続処理は次章で足します)。
#include "RadnodzDemoWidget.h"
#include "Components/Button.h"
#include "Components/EditableTextBox.h"
#include "Components/TextBlock.h"
void URadnodzDemoWidget::NativeConstruct()
{
Super::NativeConstruct();
// ボタンが押されたら OnRenameClicked を呼ぶよう登録する
if (RenameButton)
{
RenameButton->OnClicked.AddDynamic(this, &URadnodzDemoWidget::OnRenameClicked);
}
}
void URadnodzDemoWidget::NativeDestruct()
{
Super::NativeDestruct();
}
void URadnodzDemoWidget::SetStatus(const FString& Message)
{
if (StatusText)
{
StatusText->SetText(FText::FromString(Message));
}
UE_LOG(LogTemp, Log, TEXT("[RADNODZ] %s"), *Message);
}
void URadnodzDemoWidget::OnRenameClicked()
{
SetStatus(TEXT("クリックされました"));
}
NativeConstruct() は「この Widget が画面に出るとき」に呼ばれます。Blueprint の Event Construct に相当します。
⑤ビルドする
UE エディタをいったん閉じてから、Visual Studio でビルドします(メニューの ビルド > ソリューションのビルド)。

ビルドが終わったら ReaperController.uproject を開き直します。
⑥Widget Blueprint の親クラスを差し替える
作った C++ クラスと、Blueprint作った画面を結びつけます。
WBP_RadnodzDemo を開きます。
RenameButtonのOnClickイベントから繋げていたノードを外します。

グラフを選択し、 タブ → ツールバーの クラス設定 をクリックします。

詳細パネルの 親クラス を Radnodz Demo Widget に変更します。

コンパイル → 保存 を押します。
このとき 「BindWidget の変数が見つからない」というエラーが出たら、名前が一致していません。 階層パネルのパーツ名と、ヘッダに書いた変数名を見比べてください。
プレイして、ボタンを押すと StatusText が「クリックされました」に変われば成功です。


UnrealEngine5 で Reaper に接続してみる(C++)
5 章で Blueprint に組んだ内容を、そのまま C++ に置き換えます。
①インクルードを足す
RadnodzDemoWidget.cpp の先頭に追加します。
#include "RadnodzClient.h" // URadnodzClient / FRigdocksError
#include "ReaperClasses.h" // UReaProject / UMediaItem
#include "RigdocksBronze_MediaItem.h" // URigdocksBronze_MediaItem
②接続してリネームする
OnRenameClicked() を次のように書き換えます。
void URadnodzDemoWidget::OnRenameClicked()
{
// ---- 1. クライアントを用意する(初回だけ生成し、以降は使い回す)----
if (!Client)
{
Client = URadnodzClient::CreateRadnodzClient();
}
// ---- 2. 接続する ----
const FString Ip = IpTextBox->GetText().ToString();
const FString Port = PortTextBox->GetText().ToString();
if (!Client->Connect(Ip, FCString::Atoi(*Port)))
{
const FRigdocksError Error = Client->GetError();
SetStatus(FString::Printf(TEXT("接続失敗 (%d): %s"), Error.ErrorCode, *Error.Message));
return;
}
// ---- 3. 名前を設定する ----
const FString NewName = NameTextBox->GetText().ToString();
URigdocksBronze_MediaItem::AZ_SetSelectedMediaName(Client, 0, 0, NewName);
// ---- 4. 成否を確認する ----
const FRigdocksError Error = Client->GetError();
if (Error.ErrorCode != 0)
{
SetStatus(FString::Printf(TEXT("リネーム失敗 (%d): %s"), Error.ErrorCode, *Error.Message));
return;
}
SetStatus(FString::Printf(TEXT("リネーム成功: %s"), *NewName));
}
③後片付け
Widget が閉じられるときに接続を切っておきます。
void URadnodzDemoWidget::NativeDestruct()
{
if (Client && Client->IsConnected())
{
Client->Disconnect();
}
Super::NativeDestruct();
}
④ビルドして確認
Visual Studio でビルドして確認します。

AI に作ってもらってみる(Claude Code)
ここまで手作業で作ってきましたが、同じものを Claude Code(ターミナルで動く AI コーディングエージェント)に作らせてみます。
①下準備:AI に前提を教える
いきなり「Reaper に繋ぐ画面を作って」と頼んでも、AI は RADNODZ を知りません。プロジェクトのルールを書いたファイルを置いておくのが重要です。
Claude Code の場合、プロジェクト直下の CLAUDE.md を毎回読み込みます。たとえばこんな内容を書いておきます。
# このプロジェクトについて
UE 5.8 のプロジェクト。RADNODZ プラグイン経由で REAPER を操作する。
## RADNODZ の使い方
- 接続クライアントは `URadnodzClient::CreateRadnodzClient()` で生成し、`Connect(ip, port)` で接続する
- API はすべて `AZ_` 始まりの static 関数。第 1 引数は必ず `client`
- 成否は呼び出し直後に `Client->GetError()` の `ErrorCode` で判定する(戻り値では判定できない)
- BRONZE を使うときは Build.cs に `RigdocksBronzePlugin` を追加する
## ビルド確認
コード変更後は必ず以下を実行し、`Result: Succeeded` を確認する:Build.bat RadnodzDemoEditor Win64 Development -Project="<プロジェクトパス>" -WaitMutex -NoHotReload
②依頼してみる
プロジェクトのフォルダでターミナルを開き、claude を起動して依頼します。
UE の Widget から REAPER に接続して、選択中の中から1つ目のメディアアイテムの名前を変更する画面を新しく作ってください。
- 画面名は RadnodzDemoFromAI
- 画面名のフォルダを作成して必要なファイルをその中に格納
- IP / ポート / 新しい名前を入力するテキストボックスと、実行ボタンを持つ
- エラーは StatusText に表示する
- 既存のプラグインのヘッダを読んで、実際にあるシグネチャで書くこと最後の一文がコツです。「既存のコードを読んでから書け」と明示すると、AI が API 名を想像で書く事故がかなり減ります。

③実際に作成された画面
実際に以下の画面が作成されました。
※レベルブループリントで、最初に表示する画面をRadnodzDemoFromAIに指定します

実際に値を入力してボタンを押すとアイテム名が変化します。

今回はClaude Codeで試しましたが、他のAI(Chat CPTやGeminiなど)でも同様に作成することができます。
まとめ
UE のプロジェクト作成から始めて、ボタンひとつで REAPER のメディアアイテムをリネームするところまで作りました。
RADNODZ でRIGDOCKSのAPIを使用する上で重要なのは以下の3点です。
URadnodzClient を作って Connect(ip, port)
API はすべて AZ_ 始まり、第 1 引数は client
成否は Get Error の Error Code で判定する
UE 側で覚えておきたいのは次の 3 点です。
パーツには名前を付けて Is Variable にチェック
変更したら コンパイル → 保存
C++ を書き換えたらエディタを閉じてビルド
必須プラン
RIGDOCKS -RADNODZ 1.0.0-
RIGDOCKS -BRONZE 3.0.0以降-
詳細ドキュメント
今回作成したプロジェクトは以下で配布しております。
LINK
Reaperが初めて/プランの加入を検討されている方
[REAPDOCK]Scriptのドキュメントは以下を参照
[APIDOCK]Scriptで利用しているAPIは以下の目次ページを参照








