VST3ホストを作ろう（１） 〜はじめに〜

[目次](https://qiita.com/hotwatermorning/items/5ab2a687a4cbc73a0f56)

## はじめに

　もしあなたがこれまでに DTM[^about_dtm] をやったことがあれば、そのときに DAW[^about_daw] やオーディオプラグイン[^about_audio_plugin]を利用したはずです。

　あなたがプログラマだったりプログラミングに興味があれば、そのときにこう思ったかもしれません。

「自分でもオーディオプラグインを作ってみたい」、あるいは、

「自分でも DAW を作ってみたい」

　この連載では、あなたが DAW を作るためのはじめの一歩になれるように、オーディオプラグインを利用して音を鳴らしたり加工できるホストアプリケーションの作り方を解説します。[^guide_to_audio_plugin_development]

[^guide_to_audio_plugin_development]: この連載ではプラグインの開発方法については詳しく取り上げません。 VST3 プラグインを作ってみたい場合は、「[C++でVST作り](http://vstcpp.wpblog.jp/)」というサイトがとても詳しくて分かりやすいので、そちらを参照してください。

　オーディオプラグインには VST2[^about_vst2], VST3[^about_vst3], AudioUnits[^about_audiounits], LV2[^about_lv2] などいくつかの異なる規格が存在します。この連載ではその中でも、VST3 規格をメインに解説を進めていきます。これは筆者が VST2 と VST3 規格に馴染みがあり、その中で VST2 規格は古く非推奨な規格になっているためです。[^deprecation_of_vst2]

[^about_dtm]: パソコンを利用して行う作曲

[^about_daw]: Digital Audio Workstation。楽曲制作ソフト

[^about_audio_plugin]: DAW 上に動的に読み込んで音を生成したり加工したりするソフトウェア。特に、音を生成するものをシンセサイザープラグインやインストゥルメントプラグインと呼び、音を加工するものをエフェクトプラグインや Fx プラグインと呼ぶ。（Fx は、 effects と発音が似ていることに由来します。 https://www.g200kg.com/jp/docs/dic/fx.html）

[^about_vst2]: ドイツの Steinberg 社が開発したオーディオプラグイン規格 VST の第二世代のバージョン。

[^about_vst3]: ドイツの Steinberg 社が開発したオーディオプラグイン規格 VST の第三世代のバージョン。

[^about_audiounits]: Apple 社が開発したオーディオプラグイン規格。 macOS 環境のみで利用可能。

[^about_lv2]: 主に Linux 環境で利用されるオーディオプラグイン規格。

[^deprecation_of_vst2]: https://japan.steinberg.net/jp/news_events/news_list/detail/article/vst-2-4747.html

　第一回の今回は VST3 やこの連載の概要について説明し、第二回はこの連載で使用するサンプルホストプロジェクトの紹介を行い、VST3 ホスト開発に関する具体的な解説は第三回以降で行っていきます。

## VST3 とは

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944/30ae97f4-2688-c0a8-f19a-3f67d464408d.jpeg" width="50%" alt="VSTLogoBlack.jpg"></img>

　作曲やオーディオの編集作業を行ったことがある人は VST3 という言葉を何度か目にしたことがあるかもしれません。

　VST3 はドイツの Steinberg 社[^link_to_steinberg]が開発したオーディオプラグイン規格です。そしてこの規格に従って作成されたプラグインを VST3 プラグインといいます。

[^link_to_steinberg]: https://japan.steinberg.net/jp/home.html

　VST3 プラグインは、ホストアプリケーション上で再生したオーディオデータや MIDI[^about_midi] データを受け取り、それにエフェクト処理をかけたり新たなオーディオ／MIDI データを合成したりして、ホストにそのデータを返します。この処理はプラグインごとに異なっていて、高品質なプラグインでは、本物のオーケストラのようなオーディオデータを合成するものや、ビンテージアンプのひずみかたを再現したエフェクト処理をかけられるものも存在します。

[^about_midi]: 「MIDI（ミディ、Musical Instrument Digital Interface）は、電子楽器の演奏データを機器間で転送・共有するための共通規格である」https://ja.wikipedia.org/wiki/MIDI

　主要な DAW は VST3 プラグインを読み込んで利用できるホストアプリケーションとして開発されているため、さまざまな VST3 プラグインを使用して高品質な楽曲を作成できるようになっています。

　同じように自分が開発するアプリケーションにも VST3 プラグインを読み込める機能を導入すれば、それらの DAW と同じように VST3 プラグインを利用できるようになります。

### VST2 との違い

　Steinberg 社は VST3 規格の前に VST2 というプラグイン規格を公開していました。この規格は比較的仕様がシンプルで開発が容易だったため、多くのプラグイン開発者／ホスト開発者が VST2 規格に対応したプラグインやホストアプリケーションを開発していました。

　しかし VST2 規格はあまり拡張性を考慮して設計されていなかったため、後発のオーディオプラグイン規格が提供している新しい機能や MIDI Polyphonic Expression (MPE) のような新しい技術をサポートできない問題がありました。

　これに対処するため、 Steinberg 社は VST2 から根本的に設計を刷新したオーディオプラグインの規格を作成し VST3 として発表しました。 VST3 では、 VST2 で実現できなかった次のような機能が導入されました。[^about_vst3_features]

 * オーディオバッファ中のデータが無音だと分かっているときには処理をスキップしてパフォーマンスを向上する機能。
 * プラグインの入出力チャンネルを動的に切り替える機能。
 * サンプル単位の精度でオートメーションデータを扱う機能。
 * etc...

[^about_vst3_features]: 詳しくは、 VST3 SDK の Introduction -> About VST3 のセクションを参照してください。

　このように VST2 から設計が刷新された VST3 ですが、一方で VST2 の頃と比べて設計が複雑になり、実装のハードルが上がりました。VST2 全盛期には個人開発者がフリーの VST2 プラグインを開発して公開している人が沢山いたのですが、 VST3 ではこのハードルの高さからか、 VST2 に比べて公開されているフリープラグインの数が少ないようです。ただ、VST2 はすでに非推奨の規格となったこと、また最近ではJUCEのようなフレームワークの台頭でこれまでより手軽にオーディオプラグイン開発ができるようになっていることなどから、 VST3 プラグインは今後さらに増えていくものと考えられます。

### VST3に対応したアプリケーションを開発するには

　VST3 プラグインを開発したり、 VST3 プラグインを読み込むホストアプリケーションを開発するには、 VST3 SDK という専用の SDK[^about_sdk] を使用します。

[^about_sdk]: SDK とはソフトウェア開発キット（Software Development Kit）の略で、特定のソフトウェアを作成するのに必要なライブラリ、ツール、ドキュメント一式をまとめたものを指す。

　VST3 SDK 自体は無料で利用できますが、VST3 SDK を利用して開発されたアプリケーションを公開する場合は、そのアプリケーションに GPLv3 か、 Proprietary Steinberg VST3 License を適用する必要があります。

　VST3 SDK の使い方やライセンスの詳細については、今後の連載で詳しく解説します。

## この連載で目指すものについて

　この連載では、 VST3 プラグインを読み込んでプラグインから音を生成したり、プラグインに音を渡して加工したりできるホストアプリケーションを読者が作成できるようになることを目指します。

　どのようなアプリケーションができるようになるかをイメージしやすくするために、最低限の機能を実装したサンプルホストを用意しました。このサンプルホストについては第二回で詳しく解説します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944/afe9b5eb-35fc-678a-d807-0d479988d807.png" alt="vst3samplehost_screenshot.png" width="80%"></img>

  * https://github.com/hotwatermorning/Vst3SampleHost

　一般的な DAW には、プロジェクト／トラック／ノート／オートメーションなどの複雑なデータ構造、オーディオファイル編集、バス[^about_bus]管理、ピアノロールなど多くの機能が搭載されていますが、この連載ではそれらには触れず、あくまでホストアプリケーションから VST3 プラグインを利用できるようになることが目標になります。

[^about_bus]: オーディオやMIDIイベントなどのデータの通り道

## 対象読者について

　この連載では、 VST3 プラグインを利用して MIDI データやオーディオデータを処理するホストアプリケーションの開発に興味がある読者を対象にしています。

　ホストアプリケーションではなく VST3 プラグインを開発している／したい読者にとっては、ホスト側の実装がどうなっているかを知ることで、開発しているプラグインのデバッグ作業やホストアプリケーションごとの挙動の違いを調査する際に、この連載の内容が役に立つかもれません。

　また、 AudioUnit や LV2 などの VST3 規格以外のオーディオプラグイン形式に興味がある人にとっても、参考として VST3 がどのような仕組みになっているかを知るために役立つでしょう。

## VST3 ホスト開発に必要になる知識

* C++
    * VST3 SDK のソースは C++ で書かれています。そのため VST3 SDK を利用するにあたり、基本的な C++ の文法（ポインタ／クラス／テンプレートなど）や C++ のエコシステム（コンパイラ／リンカ／IDE など）に関する知識がいくらか必要になります。
* Component Object Model (COM)[^about_microsoft_com]
    * COM はマイクロソフトが開発した、バイナリインターフェースの規格です。
    * VST3 規格では、設計のベース部分に COM を参考にした VST-MA という仕組みを採用しているため、 COM の知識があると理解しやすい部分があります。
    * ただし実際に VST-MA を利用する場合は、せいぜい COM を利用するプログラミングにおける作法を把握していれば十分なので、 COM 全体の知識は必須ではありません。この作法についても今後解説していきます。
* オーディオ／リアルタイムプログラミング
    * オーディオデータを扱うために、基本的なオーディオプログラミングの知識（サンプリングレート／バッファサイズ／チャンネルなど）が必要になります。
    * また、オーディオデバイスを通じてオーディオデータの入出力を行うために、リアルタイムオーディオ処理のためにマルチスレッドプログラミングの知識が必要になります。
    * 一方で、波形生成やエフェクト処理のためのデジタル信号処理（DSP）はほとんどプラグイン側に任せてしまえるため、その分野の知識はそこまで必要にはなりません。

[^about_microsoft_com]: https://ja.wikipedia.org/wiki/Component_Object_Model

　この連載では、複雑な C++ のコードが出てきたりオーディオ／リアルタイムプログラミングの知識が必要になった場面で適宜解説を行うつもりなので、それらにあまり詳しくない読者にも理解できるように努めます。

## 参照する VST3 SDK のバージョンについて

　この連載で使用する VST3 SDK のバージョンは、現在 (2019/09/19) 時点で最新の Version 3.6.13 を使用します。もし連載中にバージョンが更新された場合は必要に応じて記事を修正します。

## おわりに

　今回はこの連載の概要について解説しました。

　[次回](https://qiita.com/hotwatermorning/items/a9f14fb1b25d4cb4a4f0) は、VST3 プラグインを読み込む サンプルホストアプリケーションについて解説します。