top of page

【Reaper×UE5】RIGDOCKSの機能RADNODZでReaperを操作するアプリを作ってみた!【トラックリスト取得編】

2 日前
読了時間: 16分

目次


Reaperの情報を取得して表示する

前回の記事では、Unreal EngineからReaperへの接続と、簡単なAPIの実行を行いました。これでReaperを操作する準備が完了しました。


今回の記事からは、Reaperを操作するアプリの中身を作っていきます。

今回はその第一歩として、Reaperに配置されているトラックやメディアアイテムの一覧を取得し、Unreal Engine上の画面にアイテムとして表示するようにします。



事前準備

今回使う AZ_GetTrackListDetail は SILVER ランクの API です。前回はコメントアウトしていた RigdocksSilverPlugin を有効にします。


Source/ReaperController/ReaperController.Build.cs

PublicDependencyModuleNames.AddRange(new string[]
{
    "Core", "CoreUObject", "Engine", "InputCore",
    "UMG", "Slate", "SlateCore",          // UMG を C++ から触るのに必要

    "RadnodzClientPlugin",                // 接続クライアント(必須)
    "RigdocksBronzePlugin",               // BRONZE の API
    "RigdocksSilverPlugin",               // ← 今回追加:SILVER の API(トラック操作)
    // "RigdocksGoldPlugin",
});


UI の変更点(WBP_RadnodzDemo)

前回作成した画面は以下のようなものでした。



これを改造して今回の画面を作成します。



まずはメイン画面 WBP_RadnodzDemo のデザイナを変更します。完成形はこちらです。



前回からの主な変更点は次のとおりです。

#

変更内容

パーツ名

①

RenameButton を 接続ボタンに変更(ラベルも「接続」に)

ConnectButton / ConnectionLabel

②

トラック一覧を入れる Scroll Box を追加

TrackList

—

新しい名前の入力欄 NameTextBox は今回使わないので 削除

—

IpTextBox / PortTextBox / StatusText は前回のまま使います。


①接続ボタン(ConnectButton)

前回の RenameButton を ConnectButton にリネームし、子の Text Block を ConnectionLabel、表示文字を 接続 にしました。


前回と同じく、名前を付けたら詳細パネル上部の Is Variable にチェックを入れておきます。。



②トラックリスト(TrackList)

パレットで Scroll Box を検索し、キャンバスに配置します。名前は TrackList にして、こちらも Is Variable にチェックを入れます。


Scroll Box は「中に入れたものを縦に並べ、はみ出したらスクロールできる箱」です。トラックが多いプロジェクトでも、枠のサイズを超えた分はスクロールで見られます。


ここではまだ中身は空のままにしておきます。中身(トラック 1 行分のカード)は、ボタンを押したときにプログラムから追加します。


コンパイル → 保存 を押して、次に進みます。


トラック 1 行分のウィジェットを作る(WBP_TrackCard)

トラック一覧の 1 行分の見た目を、独立したウィジェットとして作ります。これを「テンプレート」として、トラックの数だけ生成して TrackList に並べます。


※WBP_RadnodzDemo の中に Text Block を直接並べる方法だと、トラックの本数が変わるたびに作り直しが必要です。1 行分を部品として切り出しておけば、見た目の調整は WBP_TrackCard だけ、並べる処理は数に関係なく同じ、と役割を分けられます。


①Widget Blueprint を作る

前回 WBP_RadnodzDemo を作ったのと同じ手順で作ります。


  1. コンテンツブラウザで右クリック → ユーザーインターフェース > ウィジェットブループリント

  2. 親クラスは User Widget

  3. 名前は WBP_TrackCard


②パーツを並べる

階層は次のように組みます。


#

パーツ名

種類

表示するもの

①

IndexText

Text Block

トラック番号

②

TrackNameText

Editable Text Box

トラック名

③

VolumeText

Text Block

ボリューム(dB)

ポイントは次のとおりです。


  • Horizontal Box は、前回使った Vertical Box の横向き版です。番号・名前・音量を横一列に並べます。

  • Size Box で各列の幅を固定しておくと、トラック名の長さが違っても列が揃います。

  • ①②③ の 3 つはプログラムから値を書き込むので、名前を正確に付けて Is Variable にチェックを入れてください。C++ で、この名前をそのまま使います。


③カードの見た目を整える

一番外側の CardBackground(Border)で、カードの背景を作ります。



② Padding を 8.0 にして、カードの内側に余白を作る

③ Brush の Draw As を Rounded Box にして、角を丸める


カードを並べたときの間隔や色はここで調整します。ここで変えた見た目は、生成されるすべての行に反映されます。 これがテンプレートにしておく利点です。


④トラック情報を受け取る変数を作る

WBP_TrackCard は「トラック 1 本分の情報」を受け取って表示します。その入れ物となる変数を作ります。


  1. 右上の グラフ タブに切り替えます。

  2. マイブループリントの 変数 の + で変数を追加し、名前を trackDetail にします。

  3. ① 変数の型 で Track Detail(構造体)を選びます。

  4. 詳細パネルで ② インスタンス編集可能 と ③ スポーン時に公開(Expose on Spawn) にチェックを入れます。



Track Detail は RADNODZ が用意している構造体で、AZ_GetTrackListDetail が返す トラック 1 本分の情報です。中身は次のとおりです。


メンバー

型

内容

Name

String

トラック名

Track

Media Track

トラック本体への参照(他の API に渡せる)

Volume

double

ボリューム(dB)

Index

Integer

トラック番号(0 始まり)

Depth

Integer

フォルダの階層の深さ


※スポーン時に公開がなぜ必要か:これにチェックを入れると、Create Widget ノードに Track Detail の入力ピンが生えます。「カードを作る瞬間に、表示するトラック情報を一緒に渡す」ことができるようになります。


⑤受け取った情報を表示する

Event PreConstruct から、trackDetail の中身を 3 つのパーツに書き込みます。



#

ノード

役割

①

Event PreConstruct

ウィジェットが組み立てられる直前に呼ばれる

②

Break Track Detail

構造体を各メンバーに分解する(trackDetail のピンからドラッグ → Break で追加)

③

SetText ×3

各パーツに値を書き込む

④

trackDetail 変数

4-4 で作った変数

Index は 0 始まりなので、+ 1(Integer の加算ノード)を挟んでから表示しています。REAPER の画面のトラック番号と揃えるためです。


※Event PreConstruct を使う理由:PreConstruct はデザイナ上でも実行されるため、trackDetail に初期値を入れておけばエディタ上で見た目を確認しながら調整できます。


コンパイル → 保存 を押します。これでテンプレートの完成です。


【Blueprint版】トラックリストを表示する

WBP_RadnodzDemo に戻り、グラフ タブで処理を組みます。全体は 5 つのブロックに分かれています。


ブロック

内容

メッセージ初期化

起動時に StatusText を空にする

接続ボタン押下

ボタンが押されたら「接続 → 取得」と「切断」を順番に実行

接続処理

前回とほぼ同じ

トラックリスト取得

今回のメイン。AZ_GetTrackListDetail → WBP_TrackCard を並べる

切断

接続中なら切断する

※前回 On Clicked (RenameButton) から組んだノードは、ボタンをリネームした時点で使えなくなっています。不要なノードは削除して、以下の手順で組み直してください。



①メッセージ初期化

デザイナでは StatusText に「メッセージ」と仮の文字を入れているので、画面が表示されたときに空にしておきます。



②接続ボタン押下

デザイナで ConnectButton を選び、詳細パネル最下部の OnClicked の + でイベントを追加します(前回と同じ手順です)。



Sequence は「繋いだ処理を上から順番に実行する」ノードです。Then 0 の処理が終わってから Then 1 が実行されます。


これで「接続して、一覧を取って、最後に必ず切断する」という流れになります。


※④ のマクロ「エラー表示」 は、失敗理由を StatusText に表示する処理をひとまとめにしたものです。接続失敗など何度も使うので、マイブループリントの マクロ の + でマクロにしておくと、グラフがすっきりします(C++ 版の DisplayError() に相当します)。



#

ノード

役割

①

Get Error

直前の API 呼び出しのエラー情報を取得

②

Break Rigdocks Error

エラーコード・メッセージ・詳細に分解

③

Append

文字列を連結する。B / D にはスペースを入れる

④

SetText

StatusText に表示


③接続処理

ここは前回とほぼ同じです。


#

内容

①

Client が Is Valid でなければ

②

Create Radnodz Client で作って Client 変数にセット

③

IpTextBox / PortTextBox の値で Connect

接続の結果で分岐します。



#

内容

①

Connect の戻り値で Branch

②

成功(True):StatusText に「接続に成功しました」を表示し、トラックリスト取得へ進む

③

失敗(False):マクロ「エラー表示」で失敗理由を表示


④トラックリスト取得

成功時の SetText から、トラックリスト取得の処理に繋ぎます。



① Clear Children(一覧を空にする)

TrackList をグラフにドラッグし、ピンから Clear Children を追加します。ボタンを 2 回押したときに、前回のカードが残ったまま追加されてしまうのを防ぎます。


② AZ_GetTrackListDetail(トラック情報をまとめて取得)

右クリック → AZ_GetTrackListDetail で検索して追加します(RADNODZ > SILVER > Track の下にあります)。

ピン

繋ぐもの

Client

Client 変数

Project

未接続のまま(= REAPER でいま開いているプロジェクト)

Return Value

Track Detail の配列

AZ_GetTrackListDetail は、プロジェクト内の全トラックの名前・ボリューム・番号などを、1 回の呼び出しでまとめて返してくれます。


※AZ_GetTrackListDetail を使う理由:

RADNODZ には AZ_GetTrackItemList(トラックの一覧を取得)や、トラックごとに名前・音量を取得する API もあります。ただしそれらを組み合わせると「トラック一覧を取得 → トラックごとに名前を取得 → 音量を取得 …」と、トラックの数 × 項目数だけ REAPER と通信することになります。 RADNODZ は 1 回の API 呼び出しが 1 回の通信なので、通信回数はそのまま待ち時間になります。一覧表示のように「全部の情報がほしい」場面では、まとめて返してくれる AZ_GetTrackListDetail を使うのが効率的です。


③ For Each Loop(配列を 1 つずつ処理)

Return Value のピンからドラッグ → For Each Loop を追加します。配列の要素(=トラック 1 本分)ごとに Loop Body が実行されます。



④ Create Widget(WBP_TrackCard を生成)

Loop Body から Create Widget を追加し、Class に WBP_TrackCard を選びます。すると、ノード名が Create WBP Track Card Widget に変わり、Track Detail の入力ピンが追加されます


For Each Loop の Array Element を、この Track Detail ピンに繋ぎます。


⑤ Add Child(一覧に追加)

生成したカードを TrackList に追加します。Add Child の Target に TrackList、Content に Create Widget の Return Value を繋ぎます。

これで「トラックの数だけテンプレートを複製し、それぞれにトラック情報を渡して、一覧に並べる」処理ができました。


⑤切断

Sequence の Then 1 から、接続中なら切断します。



コンパイル → 保存 を押したら、Blueprint 版は完成です。


【C++版】トラックリストを表示する

同じ処理を C++ で書きます。前回作った URadnodzDemoWidget を改修し、WBP_TrackCard 用の C++ クラス UTrackCardWidget を新しく作ります。


①TrackCardWidget クラスを作る

UE エディタの ツール > 新規 C++ クラス から、UserWidget を親にして TrackCardWidget という名前で作ります。



TrackCardWidget.h


#pragma once

#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "DataClass/FTrackDetail.h"         // FTrackDetail(SILVER)
#include "TrackCardWidget.generated.h"

class UTextBlock;
class UEditableTextBox;

UCLASS()
class REAPERCONTROLLER_API UTrackCardWidget : public UUserWidget
{
	GENERATED_BODY()

public:

	UFUNCTION(BlueprintCallable)
	void SetTrackDetail(FTrackDetail trackDetail);

	/** トラックのインデックス */
	UPROPERTY(BlueprintReadWrite, meta = (BindWidget))
	TObjectPtr<UTextBlock> IndexText;

	/** トラック名 */
	UPROPERTY(BlueprintReadWrite, meta = (BindWidget))
	TObjectPtr<UEditableTextBox> TrackNameText;

	/** 音量 */
	UPROPERTY(BlueprintReadWrite, meta = (BindWidget))
	TObjectPtr<UTextBlock> VolumeText;

	/** トラック詳細(保存用) */
	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn = true))
	FTrackDetail TrackDetail;

protected:
	virtual void NativePreConstruct() override;

private:

	// 表示内容更新
	void RefreshTexts();
};

#

ポイント

①

FTrackDetail を使うので DataClass/FTrackDetail.h をインクルード(SILVER のモジュールに入っています)

②

meta = (BindWidget) で、デザイナーで付けた 3 つのパーツ名と結びつける

③

TrackDetail に ExposeOnSpawn = true を付ける(Blueprintでの「スポーン時に公開 」と同じ意味)

TrackCardWidget.cpp

#include "TrackCardWidget.h"

#include "Components/TextBlock.h"
#include "Components/EditableTextBox.h"

void UTrackCardWidget::NativePreConstruct()
{
	Super::NativePreConstruct();

	RefreshTexts();
}

void UTrackCardWidget::SetTrackDetail(FTrackDetail trackDetail)
{
	TrackDetail = trackDetail;

	RefreshTexts();
}

void UTrackCardWidget::RefreshTexts()
{
	if (IndexText)
	{
		// Index は 0 始まりなので +1 して表示する
		IndexText->SetText(FText::FromString(FString::FromInt(TrackDetail.Index + 1)));
	}

	if (TrackNameText)
	{
		TrackNameText->SetText(FText::FromString(TrackDetail.Name));
	}

	if (VolumeText)
	{
		FNumberFormattingOptions Opts;
		Opts.SetMinimumFractionalDigits(0)   // 小数点以下 最低 0 桁
			.SetMaximumFractionalDigits(2);  // 小数点以下 最大 2 桁

		VolumeText->SetText(FText::AsNumber(TrackDetail.Volume, &Opts));
	}
}

Blueprint に組んだ処理と同じです。

  • NativePreConstruct() … Blueprint の Event PreConstruct に相当

  • SetTrackDetail() … 外から FTrackDetail を受け取って表示を更新する

  • ボリュームは FNumberFormattingOptions で小数点以下 2 桁までに揃えています(-3.8172… → -3.82)


②RadnodzDemoWidget.h の変更

class UButton;
class UEditableTextBox;
class UTextBlock;
class URadnodzClient;
class UScrollBox;                // ← 追加
class UTrackCardWidget;          // ← 追加

UCLASS()
class REAPERCONTROLLER_API URadnodzDemoWidget : public UUserWidget
{
	GENERATED_BODY()

protected:
    virtual void NativeConstruct() override;
    virtual void NativeDestruct() override;

    // ---- UMG のパーツと結びつける ----
    // ここの変数名は、Widget Blueprint 側のパーツ名と完全に一致させること
    UPROPERTY(BlueprintReadWrite, meta = (BindWidget))
    TObjectPtr<UEditableTextBox> IpTextBox;

    UPROPERTY(BlueprintReadWrite, meta = (BindWidget))
    TObjectPtr<UEditableTextBox> PortTextBox;

    UPROPERTY(BlueprintReadWrite, meta = (BindWidget))
    TObjectPtr<UButton> ConnectButton;          // ← RenameButton から変更

    UPROPERTY(BlueprintReadWrite, meta = (BindWidget))
    TObjectPtr<UTextBlock> StatusText;

    UPROPERTY(BlueprintReadWrite, meta = (BindWidget))
    TObjectPtr<UScrollBox> TrackList;           // ← ① 追加

    UPROPERTY(BlueprintReadWrite)
    TObjectPtr<URadnodzClient> Client;

    UPROPERTY(EditDefaultsOnly, Category = "UI|TrackCard")
    TSubclassOf<UTrackCardWidget> TrackCardClass;   // ← ② 追加

private:
    UFUNCTION()
    void OnConnectClicked();                    // ← OnRenameClicked から変更

    /** 未接続なら Connect する。成功したら true。失敗理由は StatusText に出す。 */
    bool EnsureConnected();

    void SetStatus(const FString& Message);

    // エラー情報からステータス表示
    void DisplayError();                        // ← ③ 追加

    // トラックリスト取得
    void GetTrackList();                        // ← ③ 追加
};

前回からの変更点は次のとおりです。

#

変更

内容

—

NameTextBox を削除、RenameButton → ConnectButton

BlueprintのUI 変更に合わせる

①

TrackList(UScrollBox)を追加

一覧を入れる箱

②

TrackCardClass を追加

生成するテンプレートのクラス

③

DisplayError() / GetTrackList() を追加

エラー表示と一覧取得

② の TrackCardClass が、C++ でテンプレートを扱うときのポイントです。


C++ のコードの中に WBP_TrackCard というアセット名を直接書くことはしません。代わりに「UTrackCardWidget を継承したクラスならどれでも入れられる」変数 TSubclassOf<UTrackCardWidget> を用意しておき、どのウィジェットを使うかはエディタ側で指定します。

こうしておくと、見た目違いのカード(WBP_TrackCard_Compact など)を作ったときも、C++ を書き換えずにエディタで差し替えるだけで済みます。EditDefaultsOnly は「クラスのデフォルト値としてエディタから設定できる」という指定です。


③RadnodzDemoWidget.cpp の変更

インクルード

#include "RadnodzDemoWidget.h"
#include "TrackCardWidget.h"                // ← 追加

#include "RadnodzClient.h"
#include "RigdocksError.h"                  // AZ_ErrorCode
#include "RigdocksSilver_Track.h"           // ← 追加:トラック操作(AZ_GetTrackListDetail)

#include "Components/Button.h"
#include "Components/EditableTextBox.h"
#include "Components/TextBlock.h"
#include "Components/ScrollBox.h"           // ← 追加

前回リネームに使っていた RigdocksBronze_MediaItem.h は、今回はメディアアイテムを操作しないので削除しました。


NativeConstruct

void URadnodzDemoWidget::NativeConstruct()
{
    Super::NativeConstruct();

    // メッセージ初期化
    StatusText->SetText(FText::GetEmpty());

    // ボタンが押されたら OnConnectClicked を呼ぶよう登録する
    if (ConnectButton)
    {
        ConnectButton->OnClicked.AddDynamic(this, &URadnodzDemoWidget::OnConnectClicked);
    }
}

DisplayError(エラー表示)

Blueprint 版のマクロ「エラー表示」に相当します。

void URadnodzDemoWidget::DisplayError()
{
    FRigdocksError error = Client->GetError();

    SetStatus(FString::Printf(TEXT("接続失敗 (%d): %s %s"), error.ErrorCode, *error.Message, *error.Details));
}

GetTrackList(トラックリスト取得)

今回のメインです。

// トラックリスト取得
void URadnodzDemoWidget::GetTrackList()
{
    // ① Designer で作った WBP_TrackCard を生成しないと、画面構成が無く何も表示されない
    if (!TrackCardClass)
    {
        SetStatus(TEXT("TrackCardClass が未設定です"));
        return;
    }

    // ② リスト全削除
    TrackList->ClearChildren();

    // ③ トラック情報をまとめて取得(第 2 引数 0 = いま開いているプロジェクト)
    TArray<FTrackDetail> TrackDetails = URigdocksSilver_Track::AZ_GetTrackListDetail(Client, 0);

    // ④ 成否判定
    if (Client->GetError().ErrorCode != static_cast<int>(AZ_ErrorCode::Success))
    {
        DisplayError();
        return;
    }

    // ⑤ トラックの数だけカードを生成して並べる
    for (const FTrackDetail& trackDetail : TrackDetails)
    {
        UTrackCardWidget* Card = CreateWidget<UTrackCardWidget>(this, TrackCardClass);

        Card->SetTrackDetail(trackDetail);

        TrackList->AddChild(Card);
    }

    SetStatus(FString::Printf(TEXT("トラックを %d 件取得しました"), TrackDetails.Num()));
}

#

処理

Blueprint 版

①

TrackCardClass が未設定なら中断

(Create Widget の Class 指定)

②

ClearChildren() で一覧を空に

Clear Children

③

AZ_GetTrackListDetail(Client, 0) で全トラックを取得

AZ_GetTrackListDetail

④

GetError() の ErrorCode で成否判定


⑤

CreateWidget → SetTrackDetail → AddChild

For Each Loop → Create Widget → Add Child

③ について:AZ_GetTrackListDetail も、他の AZ_*** と同じく static 関数で第 1 引数が client です。第 2 引数 project に 0(nullptr)を渡すと、「REAPER でいま開いているプロジェクト」が対象になります。Blueprint で Project ピンを未接続にしたのと同じ意味です。


⑤ について:CreateWidget<UTrackCardWidget>(this, TrackCardClass) で、TrackCardClass に指定されたウィジェット(= WBP_TrackCard)を生成します。ここで UTrackCardWidget::StaticClass() を渡してしまうと、デザイナで作った見た目を持たない空のウィジェットが生成されて何も表示されません。


OnConnectClicked(ボタン押下)

void URadnodzDemoWidget::OnConnectClicked()
{
    // ---- 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)))
    {
        DisplayError();
        return;
    }
    SetStatus(TEXT("接続に成功しました"));

    // ---- 3. トラックリスト表示 ----
    GetTrackList();

    // ---- 4. 切断 ----
    Client->Disconnect();
}

Blueprint 版の「接続ボタン押下 → 接続処理 → トラックリスト取得 → 切断」と同じ流れです。


④ビルドする

前回と同じく、UE エディタを閉じてから Visual Studio でビルドします(新しいクラスを追加したので、ライブコーディングではなく通常のビルドが確実です)。


Widget Blueprint の親クラスを差し替える

C++ クラスと Widget Blueprint を結びつけます。今回は 2 つのウィジェットの親クラスを差し替えます。


①WBP_TrackCard の親クラスを TrackCardWidget に

  1. WBP_TrackCard を開き、グラフ タブに切り替えます。

  2. ツールバーの ① クラス設定 をクリックします。

  3. 詳細パネルの ② 親クラス をクリックし、③ TrackCardWidget を選びます。

  1. コンパイル → 保存 を押します。

IndexText / TrackNameText / VolumeText の名前が C++ の BindWidget と一致していないと、ここでコンパイルエラーになります。


※Blueprint に組んだ trackDetail 変数と Event PreConstruct のノードは、C++ 側(TrackDetail / NativePreConstruct)と役割が重なるので削除してください。残しておくと、名前の重複でエラーになったり、同じ処理が二重に実行されたりします。


②WBP_RadnodzDemo の親クラスを RadnodzDemoWidget に

WBP_RadnodzDemo は前回の記事で親クラスを Radnodz Demo Widget に変更済みです。まだの場合は 7-1 と同じ手順で変更してください。


ここでもうひとつ大事な設定があります。TrackCardClass に、テンプレートとして使う WBP_TrackCard を指定します。

  1. WBP_RadnodzDemo を開き、グラフ タブに切り替えます。

  2. 右上の親クラスが ① Radnodz Demo Widget になっていることを確認します。

  3. ツールバーの ② クラスのデフォルト をクリックします。

  4. 詳細パネルの UI > Track Card にある ③ Track Card Class のドロップダウンを開き、④ WBP_TrackCard を選びます。

  5. コンパイル → 保存 を押します。



※Blueprint のノード群(接続ボタン押下・接続処理・トラックリスト取得・切断)は、C++ 版と二重に実行されてしまうので削除してください。


動かしてみる

  1. REAPER でトラックの入ったプロジェクトを開き、RADNODZ のサーバが Running になっていることを確認します。

  2. UE で ▶ プレイ します。

  3. IP(127.0.0.1)とポート(12345)を確認して、接続 ボタンを押します。


StatusText に「接続に成功しました」と表示され、その下に REAPER のトラックがカードになって並べば成功です。


トラックが枠に収まりきらない場合は、マウスホイールでスクロールできます。


REAPER 側でトラック名やボリュームを変えてからもう一度 接続 を押すと、一覧が最新の状態に作り直されます(Clear Children で古いカードを消してから追加しているためです)。

うまく表示されない場合のチェックポイント:

症状

確認すること

「接続失敗」と表示される

REAPER のサーバが Running か / IP・ポートが正しいか

「TrackCardClass が未設定です」と表示される

7-2 で Track Card Class に WBP_TrackCard を指定したか

「〇件取得しました」と出るのにカードが見えない

Track Card Class に TrackCardWidget(C++ クラス)を選んでいないか

カードは出るが中身が空(0 のまま)

WBP_TrackCard のパーツ名が IndexText / TrackNameText / VolumeText になっているか

AZ_GetTrackListDetail が見つからない / リンクエラー

Build.cs に RigdocksSilverPlugin を追加したか

ボタンを押すと処理が 2 回走る

Blueprint 側のノードを削除したか


まとめ

前回作った ReaperController を改修して、REAPER のトラック一覧を UE の画面に表示できるようにしました。

今回のポイントは次の 3 点です。

  1. AZ_GetTrackListDetail で一括取得 —— 名前・ボリューム・番号などを 1 回の通信でまとめて受け取れる。一覧表示のような場面ではこれが効率的

  2. 1 行分を別ウィジェット(WBP_TrackCard)にしてテンプレート化 —— 見た目の調整はテンプレートだけ、並べる処理はトラックの数に関係なく同じ

  3. C++ では TSubclassOf でテンプレートを指定 —— コードにアセット名を書かず、どのウィジェットを使うかはエディタの クラスのデフォルト で決める


API の呼び方そのものは前回とまったく同じです。Build.cs に使うランクのモジュールを足して、AZ_*** を client 付きで呼び、Get Error で成否を確認する。この形さえ押さえておけば、扱う対象がメディアアイテムからトラックに変わっても迷わず書けます。


今回作ったトラックリストは、さらに発展させることもできます。

発展

ヒント

UE からトラック名を書き換える

TrackNameText は Editable Text Box にしてあるので、確定時のイベントで FTrackDetail.Track を使ってトラック名を設定する API を呼ぶ

UE からボリュームを変える

AZ_SetTrackItemAddVolume などに FTrackDetail.Track を渡す

選択中のトラックだけ表示する

AZ_GetSelectedTrackListDetail に差し替える

フォルダ構造をインデントで表す

FTrackDetail.Depth の値に応じて WBP_TrackCard の左余白を変える

FTrackDetail の Track には REAPER のトラックそのものへの参照が入っているので、一覧から選んだトラックに対して別の API を呼ぶ、という使い方ができます。ぜひ試してみてください。


必須プラン


  • RIGDOCKS -RADNODZ 1.0.0-

  • RIGDOCKS -SILVER 2.0.0以降-


詳細ドキュメント

今回作成したプロジェクトは以下で配布しております。



LINK


Reaperが初めて/プランの加入を検討されている方
[REAPDOCK]Scriptのドキュメントは以下を参照
[APIDOCK]Scriptで利用しているAPIは以下の目次ページを参照



bottom of page