audioTestbench で VST設定ファイルを適用 ~ MATLAB で VST 開発
まえがき
MATLABでVSTを作る場合、メインの信号処理部が完成した後は、基本的に audioTestbench を使ってデバッグすることになると思います。
また、VSTには(MATLABとは関係なく)GUIパラメータを保存する機能があります。
一旦VSTを作った後、再度ソーススクリプトに修正を加える場合等、調整済みのVSTパラメータを audioTestbench に適用できると便利です。
パラメータ数が少ない場合は手入力すれば良いのですが、私は100以上のパラメータを使ったりするので、間違いなく手入力するのはとても大変です。
audioTestbench でのGUIパラメータはスクリプトで変更することはできない、と思い込んでいたのですが、可能なことに最近やっと気付きました!
という訳で、今回はその方法についてです。
あまり必要とする人はいないと思いますが・・。
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)
<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
これができることに、もっと早く気付きたかった・・。(-。-;)
この記事が気に入ったらサポートをしてみませんか?