SimulinkでカスタムGUI
Simulinkには、"Dashboard" というブロック群があって、これを置けば簡単にGUIを付けられるのはよく知られていると思います。
Dashboard
Dashboardを使ったGUIの例
SimulinkではDashboardを使う以外にも、ブロックをダブルクリックすると立ち上がるカスタムGUIコントロールパネルを作ることができます。
カスタムGUIの例
とても簡単にできるのですが、こちらはあまり見かけない気がするのでその解説をしたいと思います。
Simulinkブロック配置
今回は、MATLAB FunctionブロックにGUIを付けてみましょう。
まず、"From Multimedia File" 、"MATLAB Function" 、”Audio Device Writer” ブロックを置いて接続します。
Audio Toolbox がある方は、新規 -> Simulink モデル -> Basic Audio Player で間に "MATLAB Function" を挿入すればOKです。
次に、 "MATLAB Function" ブロック内ではGUIパラメータを直接読めないため、サブシステム化して引数として入力します。(もっと良いやり方があれば教えてください!)
一応、内部で行う処理が分かるような名前を付けておきます。
サブシステムの中身は以下のように、GUIで設定するパラメータをそれぞれ "Constant" ブロックを置いて入力します。
一旦マスクを作成するとダブルクリックしてもこれが開かずGUIが開きますので、その場合は
右クリック -> マスク -> マスク内を表示
とします。
MATLAB Function ブロック内の処理
今回はステレオ音声の左右定位を操作する、簡単な Panner を作ってみます。
"MATLAB Function" 内に以下のコードを書きます。
function y = fcn(u,Pan,PanMode,Mvol,Svol,BYPASS)
L_in = u(:,1); R_in = u(:,2);
M_in = (L_in + R_in) / 2;
S_in = (L_in - R_in) / 2;
M_in = M_in * Mvol; S_in = S_in * Svol;
L_in = M_in + S_in; R_in = M_in - S_in;
switch (PanMode)
case 1 % 'Mono'
L_out = M_in * 2 * cos(Pan * pi / 2);
R_out = M_in * 2 * sin(Pan * pi / 2);
case 2 % 'Stereo'
th = Pan * pi;
cos_coef = cos(th);
sin_coef = sin(th);
mag = abs(cos_coef) + abs(sin_coef);
if (mag <= 1); mag = 1; end
L_out = (L_in * cos_coef - R_in * sin_coef) / mag;
R_out = (L_in * sin_coef + R_in * cos_coef) / mag;
otherwise
L_out = L_in; R_out = R_in;
end
if BYPASS
y = u;
else
y = [L_out R_out];
end
一旦 M/S 処理をしてMvol/Svolを適用してからL/Rに戻し、”Mono” モードの時はモノラルを左右にパン、"Stereo" モードの時はステレオローテーションを掛けています。”Mono” モード時の Pan Law は-3dBです。詳しくは説明しませんが、Pan Law についてだけ簡単に。
Pan Law (Pan Method)
2chステレオでの音像定位は、LRの音量バランスで決めています。
Lに振り切ったのが L:R=100:0 とすると、L:R=100:100 とすればセンターに定位はしますがパワーの合計は+6dB上がってしまうので、人の耳にも音量が上がって聞こえます。
しかし、通常のモノラル変換(M=(L+R)/2)を使って L:R=50:50 とすると、合計パワーは-6dBとなって今度は小さく聞こえてしまいます。
合計パワーが同じ(二乗和=1)になるようにすると、定位移動させた場合の音量バランスが改善されます。この場合、センター定位させる場合は-3dBすれば良いことになります。(L:R=70.7:70.7)
この調整が Pan Law と言われるもので、上の場合は Pan Law = -3dB です。
ただ、この聞こえ方はセッティング等によっても変わるため、大抵のDAWでは、この Pan Law を0,-3,-4.5,-6dB辺りから選べるようになっています。
アナログ時代からの標準は-3dBです。二乗和=1にすればよいので、sin/cosで計算できて便利でもあります。
カスタムGUIの作成
やり方は簡単で、
ブロックを右クリック -> マスク -> マスクの作成
で作ります。
"パラメータとダイアログ" タブで、左のコントロールから、欲しいコンポーネントをマウスでドロップしていきます。"タブ" をドロップッすれば、タブを分けることもできます。
それぞれ、表示名(プロンプト)、変数名(名前)、デフォルト値(値)、最大値、最小値等を設定していきます。
popupメニュー等は、"タイプオプション" 横のペンアイコンをクリックして、要素を入れます。
"プレビュー" で確認ができます。
"レイアウト" -> "項目の場所" を "新しい行" にするとコンポーネントが縦に、"現在の行" にすると横に並びます。
一旦作った後は、
ブロックを右クリック -> マスク -> マスクの編集
で変更を行います。
スライダーやダイヤルは実行中即時反映されますが、チェックボックスやポップアップは ”適用” しないと反映されないようです。どこかに設定があるのかな?
それぞれのコンポーネントにコールバックを設定したり、初期設定ルーチンを走らせたり、作成済みのプラグイン(System Object を使用したVSTプラグイン用ソースなど)を読み込むことなどもできますので、ご興味のある方はお試しください!