図形・波形描画ビューの実装

図形・波形描画ビューの実装

VST GUIにおいて音声波形などを描画するビューための方法を説明します。
波形描画とも記載しましたが、基本的には図形を描くための方法となります。

なお、VST GUIの基本的な作成方法として下記をご理解いただいている前提で進めさせていただきます。
(下記のVST GUIクラスをベースに説明を進めさせていただきます。)

また、波形描画ビューの定期更新については、「VST GUIにおけるコントロールの定期更新」も参考にしてください。

CWaveDrawViewクラスの作成

まず、波形描画するためのクラスをCViewクラスを継承して作成します。

【guieditor.h】

【guieditor.cpp】

コンストラクタ

CWaveDrawViewのコンストラクタでは特に継承元のCViewクラスの引数にビューのサイズを渡しているだけで特に何もしていません。

draw()関数

draw()関数は、継承元のCViewクラスから継承した関数で描画が必要になったタイミングで呼び出されます。
描画が必要なタイミングとは、「ウィンドウが開いた」「ウィンドウが移動した」「setDirty(true)で明示的に描画指示があった」などのタイミングになります。

draw()関数ではまず、ビューの背景画像の有無を確認して背景画像を描画しています。この背景画像の描画はほぼ定型文のような形なので説明は省略します。

【guieditor.cpp】

次に、引数のCDrawContextクラスを使用して描画をします。CDrawContextクラスは文字や線・図形を描くためのクラスになります。
setFrameColor()関数・setLineStyle()関数・setLineWidth()関数で描画する波形の直線の色や見た目(スタイル)を設定し、drawLines()関数で直線を描画しています。

【guieditor.cpp】

CDrawContextクラスでは下記のような関数があります。詳細は割愛しますのでマニュアルなどでご確認ください。

関数 概要
図形描画 DrawLine()関数 直線を描画する関数です。
DrawLines()関数 複数の直線を描画する関数です。
DrawRect()関数 四角形を描画する関数です。
DrawPolygon()関数 多角形(ポリゴン)を描画する関数です。
DrawArc()関数 弧を描画する関数です。
DrawEllipse()関数 円・楕円を描画する関数です。
setFrameColor()関数 直線や図形の枠線の色を設定する関数です。
setFillColor()関数 図形の塗りつぶし色を設定する関数です。
文字列描画 drawString()関数 文字列を描画する関数です。
setFontColor()関数 文字列の色を設定する関数です。
setFont()関数 文字列のフォントを設定する関数です。

setWave()関数

setWave()関数は、CWaveDrawViewクラスの独自の関数で、音声波形データから描画に必要な直線リスト(配列)を作成する関数になります。
今回は波形を描画するクラスのためこのような関数を用意しました。

直線リスト(配列)はメンバー変数として定義したCDrawContext::LineList linesになります。
直線は始点座標(x,y)と終点座標(x,y)がペアとなったLinePair型の変数で、これを動的配列としたvectorを再定義したものがLineList型となります。

注意点として、直線に設定する座標はウィンドウの左上を座標(0,0)とした絶対座標となる点です。(ビューの左上座標ではありません。)

【guieditor.h】

VST GUIへの組み込み

CWaveDrawViewクラスが実装できれば、実際にVST GUIに組み込みます。

VST GUIクラスのopen()関数内でCWaveDrawViewクラスを作成・初期化し、登録します。

【guieditor.h】

【guieditor.cpp】

補足

ここまでで波形を描画するビューについては作成することができますが、実際のエフェクタやシンセサイザーなどでは、定期的に波形を更新する必要があるかと思います。

定期的な波形の更新は、VST GUIのnotify()関数で行うことができます。
notify()関数については、「VST GUIにおけるコントロールの定期更新」や「「ファイルを開く」ダイアログの実装」も参考にしてください。

まず、VST GUIクラスにnotfy()関数を定義します。(継承元のVSTGUIEditorクラスからのオーバーライドになります。)
【guieditor.h】

つづいて、notify()関数内で、メッセージがkMsgTimerであることを確認します。
そして、作成したCWaveDrawViewクラスに音声波形をsetWave()関数で設定し、setDirty()関数で描画更新指示を行います。

上記により、波形描画ビューを定期的に更新することができます。
音声波形の更新内容(音声処理クラスから音声波形を取得する方法)についてはいずれ記載する予定ですが、ここでは割愛いたします。

おわりに

以上で波形描画ビューが実装できます。

上記以外にもVST3についての情報があります。下記をご参照ください。

また、質問やご指摘はコメント欄や掲示板Twitterでいただけばとおもいます。

掲示板
■Twitterアカウント:@vstcpp   URL:https://twitter.com/vstcpp


コメントを残す