見出し画像

SimulinkでカスタムGUI


Simulinkには、"Dashboard" というブロック群があって、これを置けば簡単にGUIを付けられるのはよく知られていると思います。

画像1

Dashboard

画像2

Dashboardを使ったGUIの例

SimulinkではDashboardを使う以外にも、ブロックをダブルクリックすると立ち上がるカスタムGUIコントロールパネルを作ることができます。

画像3

カスタムGUIの例

とても簡単にできるのですが、こちらはあまり見かけない気がするのでその解説をしたいと思います。

Simulinkブロック配置

今回は、MATLAB FunctionブロックにGUIを付けてみましょう。

まず、"From Multimedia File" 、"MATLAB Function" 、”Audio Device Writer” ブロックを置いて接続します。

Audio Toolbox がある方は、新規 -> Simulink モデル -> Basic Audio Player で間に "MATLAB Function" を挿入すればOKです。

画像4

次に、 "MATLAB Function" ブロック内ではGUIパラメータを直接読めないため、サブシステム化して引数として入力します。(もっと良いやり方があれば教えてください!)

画像5

画像6

一応、内部で行う処理が分かるような名前を付けておきます。

画像7

サブシステムの中身は以下のように、GUIで設定するパラメータをそれぞれ "Constant" ブロックを置いて入力します。

画像8

一旦マスクを作成するとダブルクリックしてもこれが開かず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の作成

やり方は簡単で、
 ブロックを右クリック -> マスク -> マスクの作成
で作ります。

"パラメータとダイアログ" タブで、左のコントロールから、欲しいコンポーネントをマウスでドロップしていきます。"タブ" をドロップッすれば、タブを分けることもできます。

画像9

それぞれ、表示名(プロンプト)、変数名(名前)、デフォルト値(値)、最大値、最小値等を設定していきます。

画像10

画像11

popupメニュー等は、"タイプオプション" 横のペンアイコンをクリックして、要素を入れます。

画像13

画像12

"プレビュー" で確認ができます。

画像16

画像14

画像15

"レイアウト" -> "項目の場所" を "新しい行" にするとコンポーネントが縦に、"現在の行" にすると横に並びます。 

画像17

一旦作った後は、
 ブロックを右クリック -> マスク -> マスクの編集
で変更を行います。

スライダーやダイヤルは実行中即時反映されますが、チェックボックスやポップアップは ”適用” しないと反映されないようです。どこかに設定があるのかな? 

それぞれのコンポーネントにコールバックを設定したり、初期設定ルーチンを走らせたり、作成済みのプラグイン(System Object を使用したVSTプラグイン用ソースなど)を読み込むことなどもできますので、ご興味のある方はお試しください!


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