TadaoYamaokaの開発日記

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

スペクトログラム解析VST3プラグイン

先日、実装したリアルタイムスペクトログラム解析VST3プラグインをPayhipで公開した。

payhip.com


Audio Spectrogram Monitor VST3 — Windows対応 リアルタイムCQTスペクトログラム(ピアノロール軸表示)

Audio Spectrogram Monitor は、トラックに挿入するだけで使えるシンプルかつゼロレイテンシースペクトログラムモニターです。 72分割/オクターブの定Q変換(CQT)ディスプレイに、鍵盤の白黒を模したピアノロール軸DAWと同期する小節/拍ガイドライン、オプションのピッチライン、さらにMIDIノートオーバーレイを備えています。耳コピ(採譜)や演奏練習、サウンドデザイン、ミックス分析に最適です。


特長

  • 音楽的なCQTグリッド(72分割/オクターブ) 半音ごとのグリッドとオクターブラベルを表示。範囲は C1 〜 B7 と、声や楽器の大部分をカバーします。
  • ピアノロール軸 & ホバー強調 左側に鍵盤を模した白黒キー領域を表示。マウスホバーで対象の半音帯域をハイライト。
  • ホスト同期ガイド DAWのテンポと拍子に同期した 拍(細線)/小節(太線)マーカーを描画。
  • MIDIノートオーバーレイ アクティブなMIDIノートをスペクトログラム上に重ねて表示。採譜やスケール練習のターゲット比較に便利。
  • オプションのピッチライン 「Pitch Line」オプションを有効にすると、検出したピッチを滑らかな線で表示。
  • 直感的なUI操作

    • Shift + ホイール: 時間方向のズーム
    • Ctrl + ホイール: ピッチ方向のズーム
    • ホイール: 周波数範囲のスクロール
    • Ctrl + 0: ズーム/スクロールをリセット
  • オーディオを変化させない ステレオ信号をそのまま通過させる、純粋なビジュアルモニター。
  • 約30fpsのスムーズな描画で、快適な動作と軽量なCPU負荷を両立。

同梱物

  • vst3_spectro.vst3.zip(Payhipの「ダウンロード」ファイル)
  • 解凍すると vst3_spectro.vst3 フォルダが含まれています。

動作環境

  • Windows 64bit専用Windows 10/11 推奨)
  • VST3対応DAW
  • 32bit浮動小数点を含む標準的なオーディオフォーマットを処理可能。

インストール(Windows

  1. vst3_spectro.vst3.zip をダウンロードして保存。
  2. 右クリック → 「すべて展開」を選択。
  3. vst3_spectro.vst3 フォルダが生成されます(フォルダのまま保持)。
  4. フォルダごと以下にコピーします: C:\Program Files\Common Files\VST3
  5. DAWを再起動し、必要ならプラグインを再スキャン。VST3一覧に vst3_spectro が表示されます(一部のDAWでは「Other」に分類されます)。

クイックスタート

  1. 対象のオーディオトラックにプラグインを挿入。
  2. DAWで再生を開始すると、ビート/小節ライン付きでスペクトログラムがリアルタイム表示されます。
  3. (オプション)Pitch Enable をONにして、検出されたピッチをラインで確認。
  4. (オプション)MIDIトラックをルーティングすると、ターゲットノートを重ねて表示できます(耳コピやスケール練習に便利)。

ヒント & メモ

  • スペクトログラムは音楽向けに調整された 定Q変換を採用。ピッチラインは、ボーカルや多くの楽器に適した範囲をカバーしています。
  • Windows専用プラグインです(macOSは非対応)。
  • オーディオは常に変更されずに通過します。EQやコンプなどの処理は一切行いません。

Payhip使ってみる

先日開発したVocal Pitch MonitorのVST3版をPayhipで公開した。

payhip.com

はじめGumroadで公開したがPayoutの設定がうまくいかなかったので、Payhipに変更した。

Payhipは、PayPalもしくはStripeと連携することができる。
PayPalのアカウントがあったので連携してみたら、簡単に連携できた。

PayPalから銀行に出金するには手続きが必要になるが、PayPalオライリーの書籍とか購入できるので出金できなくてもよい。
VST3プラグインは需要がほとんどないのでそんな心配は不要だと思うが。

まとめ

GPT-5を使って、以前に作っていたVSTプラグインをさくっとVST3プラグイン化したので、Payhipで公開してみた。

Payhipは、簡単にPayPalと連携できたので、個人で海外向けにソフトウェアを公開するには便利である。

国内向けには、昔からあるVectorや、BOOTHなども併用すると良いかもしれない。

スマホ版のVocal Pitch Monitorは、海外のユーザが多いので今回はPyhipを選択した。

CQTでスペクトログラムを描く その10(拡大縮小)

自作スペクトログラム解析VST3プラグインにマウスホイールによる拡大縮小とスクロール処理を実装した。

はじめ解析範囲をVSTのパラメータに使用としたが、マウスホイールの方が操作しやすいのでそちらで実装することにした。

操作

  • Ctrl + ホイール → 垂直方向のピッチ拡大・縮小
  • Shift + ホイール → 水平方向の時間拡大・縮小
  • 修飾キーなし → 垂直スクロール(表示位置の移動)

実装

解析範囲を動的に変更するのは処理が複雑になるため、表示範囲のみ変えることで対応した。

既存の描画処理にオフセットを加算して、縮尺の係数を掛けるだけで対応できた。

結果

拡大して、特定の音域にスクロールして、マウスでハイライトすることで、採譜が行いやすくなった。

まとめ

拡大縮小とスクロールを実装した。

これで、実装したい機能はほぼ実装できた。

Gumroadで配布しようと思っていたが、payoutの設定がうまくいかず別の手段を検討している。

CQTでスペクトログラムを描く その9(補間方法変更)

その6で、低域をバンク分割することで、時間分解能を上げつつ、最小音階をC1まで下げることができた。

その際に、低域のバンクでは、オクターブあたりのビン数が高域の半分になるため、本来のCQTのビンの間隔の半分の間隔でスペクトルカーネルを作成することで、高域とビン間隔が同じになるように補間を行った。

放物線補間の廃止

一方、高域ではその2で、放物線補間により、周波数軸での補間を行っている。

2通りの補間方法を採用する理由もないので、スペクトルカーネルの間隔で補間する方式に統一することにした。

バンク分割

これにより、

  • 高域では、オクターブ当たりのビン間隔=24、ビンを3グリッドに細分化
  • 低域では、オクターブ当たりのビン間隔=12、ビンを6グリッドに細分化

となり、オクターブ当たりの72グリッドに統一されることになる。

ついでに高域のバンクをさらに分割して、

  • オクターブ当たりのビン間隔=36、ビンを2グリッドに細分化

のバンクを追加する。

3つのバンクで、高域のバンクほど周波数分解能が高くなる。

結果

F2以下が低域バンクになっているため、ぼやけている。
これは、時間分解能とのトレードオフのため、補間を行っても本質的には改善しない。

時間分解能と周波数分解能のトレードオフをパラメータで設定できるようにすると良いかもしれない。

まとめ

放物線補間を廃止して、スペクトルカーネルを本来のビン間隔より狭くすることで補間を行うようにした。
また、高域のバンクを追加して、高域の周波数分解能を上げた。

ピッチ解析VSTプラグイン

リアルタイム音程解析 VSTプラグイン(vst_pitch)をVST3プラグイン化した。


VST3化

GitHub CopilotのGPT-5でサクッと変換するつもりが結構苦戦した。

いきなりすべてを変換させると何度試しても正しく動くものができなかった。

「一部は未実装でもよい」というフォールバックオプションを与えることで、音階を文字で表示するだけだが動くものができたので、それをベースに一つずつ機能を移植していくことで実装できた。

機能追加

以前のVST2のバージョンにはなかった

  • 拍の表示
  • 無音区間での停止

機能を追加した。

活用方法

ボーカルトラックとの比較

Demucs-Guiや、wavdiffで、ボーカルトラックと抽出して、スペクトログラム解析VST3プラグインで、解析した結果と比較することで、カラオケの練習などに使える。

採譜してMIDIにしておくと、MIDIノートを重ねて表示できるので、音程が合っているか可視化できる。


まとめ

以前に公開していたピッチ解析VSTプラグインをVST3プラグイン化した。

準備ができたらGumroadで配布する予定である。

追記

Payhipで公開した。

payhip.com

【公開】wavdiff — フル+インストからボーカルを抽出するコマンドラインツール

wavdiff — フル+インストからボーカルを抽出するコマンドラインツール

Windows 向けのコマンドラインツール 「wavdiff」 を GitHub で公開しました。

このツールは、フルトラック(ボーカル+インスト)とインストトラックを入力すると、その差分から ボーカルのみを抽出することができます。


機能紹介

できること

  • 16bit / 24bit PCM WAVE に対応
  • フル/インストの タイミングずれを自動補正
  • フルとインストの差分から ボーカルトラック(モノラル)を抽出

使い方

wavdiff <full.wav> <inst.wav> <out_dir>

出力ディレクトリには以下の 3 つのファイルが生成されます。

  • full.wav : フルトラック(必要に応じて無音パディング済み)
  • inst.wav : インストトラック(必要に応じて無音パディング済み)
  • vocal.wav: 抽出されたボーカル(モノラル)

技術的背景

相互相関によるタイミング補正

音楽のフルとインストは数秒程度ずれていることがあります。 wavdiff では冒頭 3 秒をスキップし、その後の 10 秒間を解析区間とし、FFT による 高速相互相関 を計算します。これにより、整数サンプル精度でラグを検出します。

FFT 相関ではテーパリング(三角窓効果)が生じるため、wavdiff では オーバーラップ長で正規化し、誤差を抑えています。また、極端に短いオーバーラップは無視することで頑健性を高めています。

無音パディング方式

ラグが検出されたら、位相を一致させるために 短い方のトラックのみに先頭無音を追加します。 たとえばインストが 200 サンプル早い場合は、インストの頭に 200 サンプル分の無音を追加し、フルに合わせます。 これにより余計な伸長はなく、両者の波形がきれいに重なります。

ボーカル抽出処理

フルとインストを完全に同期させた上でサンプル単位で減算。チャンネルが複数ある場合は平均してモノラル化し、vocal.wav として保存します。

  • 出力の vocal.wav入力と同じビット深度(16 or 24)を保持。
  • full.wavinst.wav元のフォーマットを保持しつつ無音で整列済みです。

リポジトリ

👉 GitHub: wavdiff


まとめ

wavdiff は「フルとインストを揃えて引き算するだけ」というシンプルなアプローチを採用しつつ、

  • FFT による高速相互相関
  • テーパリング補正
  • 短い方だけを無音パディングする整列

といった工夫を盛り込んだ実用的なツールです。

CQTでスペクトログラムを描く その8(MIDI入力)

自作スペクトログラム解析VST3プラグインMIDI入力機能を追加した。


MIDI入力

DAWMIDIトラック出力をこのプラグインに入力すると、MIDIノートをスペクトラムに重ねて表示できる。

採譜した楽譜が合っているかやピッチとのずれを視覚的に確認できる。

実装

拍の表示で追加したaddEventInputをそのまま使用して、Vst::Event::kNoteOnEventとVst::Event::kNoteOffEventで、MIDIノートのオン/オフを受信する。

受信したMIDIノートを、スペクトラムの音階に、半透明の青色で重ねて表示する。

まとめ

スペクトログラム解析VST3プラグインMIDI入力を実装した。

次は、解析範囲をパラメータで設定できるようにしたい。