TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

CQTでスペクトログラムを描く その7(マウスカーソル位置ハイライト)

自作スペクトログラム解析VST3プラグインにマウスカーソル位置にハイライトを表示する機能を追加した。


ハイライト表示

マウスカーソル位置の音階を判定して、その音階のラインに透明な白でハイライトを表示する。
また、ピアノロールの鍵盤を赤で表示する。

実装方法

VST3のコントローラクラスで、マウスイベント (`onMouseMoved`, `onMouseEntered`, `onMouseExited`) をオーバーライドして実装すればよい。

描画負荷

マウス移動のたびに描画要求を行うと、描画処理が終わらないうちに次の描画要求が発生して、描画キューがあふれて異常終了してしまう。

setDirty()は、controllerからは直接呼び出さず、UIスレッドでタイマーで呼び出すように対処した。

class MyEditor : public VSTGUI::VST3Editor {
public:
    using VST3Editor::VST3Editor;
    MyEditor(Steinberg::Vst::EditController* c, VSTGUI::UTF8StringPtr t, VSTGUI::UTF8StringPtr xml)
        : VST3Editor(c, t, xml)
    {
        setIdleRate(16); // ~60Hz
    }

    VSTGUI::CMessageResult notify(VSTGUI::CBaseObject* sender, const char* message) override
    {
        if (message == VSTGUI::CVSTGUITimer::kMsgTimer)
        {
            if (auto* f = getFrame())
            {
                if (auto* ctrl = dynamic_cast<VstPitchController*>(getController()))
                {
                    if (ctrl->consumeUIRedrawRequest())
                    {
                        if (!f->isDirty())
                            f->setDirty(true);
                    }
                }
            }
        }
        return VSTGUI::VST3Editor::notify(sender, message);
    }
};

まとめ

スペクトログラム解析VST3プラグインにハイライトを表示を実装した。

だいぶ実用的なツールになってきた。
完成したら、Gumroadで配布することを考えている。

次は、MIDI入力を実装したい。