見出し画像

audioTestbench で VST設定ファイルを適用 ~ MATLAB で VST 開発

まえがき

MATLABでVSTを作る場合、メインの信号処理部が完成した後は、基本的に audioTestbench を使ってデバッグすることになると思います。

audioTestbench


また、VSTには(MATLABとは関係なく)GUIパラメータを保存する機能があります。

VST のパラメータ Save/Load 機能


一旦VSTを作った後、再度ソーススクリプトに修正を加える場合等、調整済みのVSTパラメータを audioTestbench に適用できると便利です。

パラメータ数が少ない場合は手入力すれば良いのですが、私は100以上のパラメータを使ったりするので、間違いなく手入力するのはとても大変です。

audioTestbench でのGUIパラメータはスクリプトで変更することはできない、と思い込んでいたのですが、可能なことに最近やっと気付きました!


という訳で、今回はその方法についてです。

あまり必要とする人はいないと思いますが・・。


MATLABでのVST開発自体はこちらの記事をご参照ください。

MATLABでVSTプラグイン開発 [初級編]~数分?で作れるVST~LMSで無相関プラグイン

夏休みはVST! MATLABで楽々(?)VSTプラグイン開発


解説

問題点は、VSTをホストする場合と違ってシンプルです。

・GUI変数の並び順
-MATLAB上では "audioPluginInterface" で宣言した順番
-VSTで保存したパラメータファイルはアルファベット順(R2022a以降)

・選択肢の値
-MATLAB上では enum で宣言した通り
-パラメータファイルは0から始まる数値

この2点だけです。


audioPluginParameter('BYPASS', 'Mapping', {'enum','OFF','ON'}, 'Layout', [1 1]), ...
audioPluginParameter('PAN', 'Mapping',{'enum','HRTF','PAN'}, 'DisplayNameLocation','none','Style','Dropdown', 'Layout', [2 1]), ...
audioPluginParameter('Angle', 'Mapping',{'int', -180, 180},'Style','rotaryknob', 'Layout', [1 2]), ...
audioPluginParameter('Elevation', 'Mapping',{'int', -45, 90},'Style','rotaryknob', 'Layout', [1 3]), ...

audioPluginInterface の設定例(MATLAB)

VSTのGUI
<PARAM id="Angle" value="60.0"/>
<PARAM id="BYPASS" value="0.0"/>
<PARAM id="Elevation" value="30.0"/>
<PARAM id="PAN" value="1.0"/>

パラメータファイルの例


最後に載せてあるスクリプト前半のVSTパラメータファイル読み込み部分は、VSTをホストする場合のスクリプトと同じです。

(一応)バイナリファイルであるパラメータファイルから、何らかの形で変数名 "PARAM id"、値 "value" を読み込みます。

"value" は、VSTパラメータファイルでは全て数値で入っています。

後半は、VSTのMATLABソースコードからプロパティを読み込み、数値プロパティの場合はそのまま数値を、ComboBox(選択肢)の場合はプロパティの Enums フィールドを参照して代入します。

VSTソーススクリプトファイル名が HRTF_Panning.m の場合、

pm = HRTF_Panning;

とすると、pm.PluginInterface.Parameters にVSTの全GUIパラメータが得られます。

pm.PluginInterface.Parameters

ans =

フィールドをもつ struct:

   BYPASS: [1×1 struct]
      PAN: [1×1 struct]
    Angle: [1×1 struct]
Elevation: [1×1 struct]


例えば pm.PluginInterface.Parameters.PAN.Enums を参照すると、選択肢として何が設定されているかが見られます。

>> pm.PluginInterface.Parameters.PAN.Enums

ans =

  2×4 の char 配列

    'HRTF'
    'PAN '

したがって ComboBox の場合は、 (数値+1) をインデックスとしてこの配列の中身を代入すれば良いことになります。

スクリプト例

以下に、VSTソーススクリプトファイル名が HRTF_Panning.m の場合のコードを示します。

clear
% read VST parameter file
defaultDir = 'VSTpara\';
[FileName, PathName, ~] = uigetfile('*.*','Select VST parameters file',defaultDir);

if FileName ~= 0
    disp(FileName)
    inputFilename = [PathName FileName];
    fileID = fopen(inputFilename);
    paraset = fread(fileID);  % read as binary
    fclose(fileID);

    parasetStr = char(paraset');  % convert to 1 line string
    paras = split(parasetStr,["<PARAM id=","value=", "/>"]);  % split at "id", "value" and "/"
    paras([1 end],:) = [];  % delete other than "id" and "value"
    paras = paras(strlength(paras) > 0);  % delete blank lines
    paras = erase(paras,'"');  % delete "
    paras = strtrim(paras);  % delete unnecessary spaces

    parasTable = cell2table(reshape(paras,2,[]));  % convert to table
    parasTable.Properties.VariableNames = table2cell(parasTable(1,:));  % set properties name
    parasNameT = table2cell(parasTable(1,:));  % take properties
    parasName = string(parasNameT);  % convert to strings

    parasVal = str2double(parasTable{2,:});  % take values


    % get properties from the VST source script
    pm = HRTF_Panning;  % get properties

    % run audioTestBench
    audioTestBench(pm)

    % set parasVals to the audioTestBench
    for k = 1:numel(parasName)
        valName = parasName(k);
        comboFlag = ischar(pm.(valName));
        if comboFlag
            pm.(valName) = strtrim(pm.PluginInterface.Parameters.(valName).Enums(parasVal(k)+1,:));
        else
            pm.(valName) = parasVal(k);
        end
    end

end


これができることに、もっと早く気付きたかった・・。(-。-;)

この記事が気に入ったらサポートをしてみませんか?