Skip to main content
ゲーム制作に役立つかもしれない
オーディオプラグイン開発
2025/06/27 株式会社COCOTONE 塩澤達矢
IGDA Japan SIG-Audio 2025 vol.3
発表者の紹介
氏名: 塩澤 達矢
- 株式会社COCOTONE 代表取締役
- JUCE enthusiast
- JUCEとC++で生活するCEO
- オーディオプラグイン開発者デビューは
2015年から
- JUCEのコミュニティ活動から発展して
オーディオプログラミングを事業として
行っている
発表者の紹介
職歴
- 自動車メーカー: 5年
- 知的財産部
- ゲームメーカー: 1年
- クライアントサイド
- ミドルウェア企業: 2年
- 2Dグラフィックス
- 個人事業主: 4年
- 会社代表: 2年
- オーディオプログラミング
会社紹介
会社名: 株式会社COCOTONE
- Web: https://www.cocotone.jp/
- 読みは「ココトーン」
- 提供サービス
- オーディオプラグイン開発受託
- オーディオアプリ開発受託
- 音楽・映像分野に関するソフトウェア
開発のコンサルティング
- JUCE導入サポート
本発表で目指すこと
- オーディオプラグインの概念から実装や課題について解説することで、
オーディオプラグイン開発の魅力を共有したい
- オーディオプラグインの作り方について情報共有をすることで、ゲーム制
作において役立つことがあると嬉しい
- ゲームサウンドデザイナーとサウンドに興味あるゲームプログラマーが
「実際にオーディオプラグインを開発しよう」と思うきっかけになると嬉しい
本発表の想定視聴者 -経験-
- DAWを使用してサウンド制作をした経験がある
- サウンドミドルウェアを使用した経験がある
- ゲームエンジンのサウンド機能を使用した経験がある
- その他、ソフトウェア上でサウンド制作をした経験がある
本発表の想定視聴者 -興味-
- 自身が持つノウハウやテクニックをプログラム化して既存のDAWに組み
込むことに興味があるサウンドエンジニア
- インストゥルメントプラグイン、エフェクトプラグインの制作に興味があるサ
ウンドデザイナー
- サウンド演出・実装をシステムレベルで制御することに興味があるサウン
ドデザイナー
- ゲームエンジンとDAWとの連携に興味があるサウンドデザイナー・プログ
ラマー
本発表で解説する技術的事項の範囲
- オーディオプラグインの仕組みや作り方を中心に解説します
- コンピュータシステム観点での話題が多いです
- プログラミング言語は主にC/C++を用います
- APIやSDKの解説も入門者向けの範囲に留めます
- 信号処理の数学的な話や音響規格の中身については解説しません
- デジタルフィルターの仕組み
- ラウドネス計測の仕組み
- 空間音響の仕組み
本発表における用語の整理
- DAW = Digital Audio Workstationの略称
- 音楽制作向けの統合制作環境
- オーディオファイルの読み込みと再生
- MIDIシーケンサによる演奏情報の再生と記録
- マルチトラック再生とミキサーコンソール
- オーディオプロセッシングとオートメーション
- リアルタイムプレビュー・編集・プレイバック
- 製品の例:
Cubase, Logic Pro, Pro Tools, Studio One, Live, FL Studio, etc.
本発表における用語の整理
- オーディオプラグイン
- 主にDAW向けに機能を追加するソフトウェアコンポーネント
- プラグイン形式の例:
- VST3, Audio Units, AAX, LV2, CLAP, etc.
- オーディオプラグインホスト
- オーディオプラグインを読み込み実行する環境
- プラグインホストの例:
- DAW(Cubase, Logic Pro, Pro Tools, Studio One, etc.)
- スタンドアロンホスト(MainStage, OBS Studio, VST Live)
本発表における用語の整理
- DAW拡張
- プログラミング要素はあるが、特定のDAW専用のもの
- DAW拡張の例:
- Reaper: Reascript
- Live: Max for Live
- Studio One: Macro
- Nuendo: Game Audio Connect
- 本発表では「DAW拡張」については解説しません
本発表における用語の整理
- ゲームエンジン
- ゲーム開発および実行基盤となるソフトウェアフレームワーク
- オーディオ機能を内蔵したゲームエンジンの例:
- Unity: 多様なプラットフォーム対応、Audio Mixer機能
- Unreal Engine: C++/Blueprint、統合オーディオシステム
- Godot: オープンソース、軽量、組込みオーディオサーバー
- GameMaker: 2Dゲーム向け、シンプルなオーディオAPI
本発表における用語の整理
- ゲーム用サウンドミドルウェア
- ゲーム開発におけるサウンド実装を効率化するためのツール
- サウンドオーサリング、サウンドプレイバック、イベント連携
- ゲーム用サウンドミドルウェアの例:
- CRI ADX2
- Wwise
- FMOD
本発表資料で表示する商標について
- VST は独国 Steinberg Media Technologies GmbH の登録商標です。VST is a trademark
of Steinberg Media Technologies GmbH.
- Cubase は独国 Steinberg Media Technologies GmbH の登録商標です。Cubase is a
trademark of Steinberg Media Technologies GmbH.
- Logic は米国 Apple Inc. の登録商標です。Logic Pro is a trademark of Apple Inc.
- Pro Tools は米国 Avid Technology, Inc. の登録商標です。Pro Tools is a trademark of
Avid Technology, Inc.
- Ableton および Live は独国 Ableton AG の登録商標です。Ableton and Live is a
trademark of Ableton AG.
- FL Studio はベルギー IMAGE LINE NV の登録商標です。FL Studio is a trademark of
IMAGE LINE NV.
本発表資料で表示する商標について
- Studio One は米国 PreSonus の登録商標です。Studio One is a trademark of PreSonus.
- Kontakt は独国 Native Instruments GmbH の登録商標です。Kontakt is a trademark of
Native Instruments GmbH.
- Ozone は米国 iZotope, Inc. の登録商標です。Ozone is a trademark of iZotope, Inc.
- Auto-Tune は米国 Antares Audio Technologies, LLC の登録商標です。Auto-Tune is a
trademark of Antares Audio Technologies, LLC.
- JUCE は英国 Raw Material Software Limited. の登録商標です。JUCE is a trademark of
Raw Material Software Limited.
- MATLAB は米国 The MathWorks, Inc. の登録商標です。MATLAB is a trademark of The
MathWorks, Inc.
- RNBO は米国 Cycling '74 の登録商標です。RNBO is a trademark of Cycling '74.
本発表資料で表示する商標について
- Unity は米国 Unity Technologies の登録商標です。Unity is a trademark of Unity
Technologies.
- Unreal Engine は米国 Epic Games, Inc. の登録商標です。Unreal Engine is a trademark
of Epic Games, Inc.
- Godot は米国 Software Freedom Conservancy, Inc. の登録商標です。Godot is a
trademark of Software Freedom Conservancy, Inc.
- GameMaker はポーランド YoYo Games Ltd. の登録商標です。GameMaker is a trademark
of YoYo Games Ltd.
本発表資料で表示する商標について
- Wwise はカナダ Audiokinetic Inc. の登録商標です。Wwise is a trademark of
Audiokinetic Inc.
- FMOD は豪国 Firelight Technologies Pty Ltd の登録商標です。FMOD is a trademark of
Firelight Technologies Pty Ltd.
- ADX は日本 株式会社CRIミドルウェア の登録商標です。ADX is a trademark of CRI
Middleware Co., Ltd.
時間の都合で話せないこと
- サウンドミドルウェア向けのプラグイン開発について
- 開発から動作確認までの工程が多い傾向にある
- オーサリングとゲームプレイの両方を介してメリットが分かる
- プラグインSDKの入手にライセンス許諾が必要な場合がある
- プラグインSDKの中身を開示することが難しい場合がある
目次
- 実例で見るオーディオプラグイン
- オーディオプラグインの仕組み
- オーディオプラグインの作り方 ※実演あり
- ゲームエンジン向けにオーディオプラグインを作る ※実演あり
- サウンド制作とゲーム制作の境界で
- オーディオプラグイン開発のここが楽しい
- オーディオプラグイン開発のここが苦しい
- オーディオプラグイン開発に役立つ学習リソース
実例で見るオーディオプラグイン
実際のオーディオプラグインを見てみよう
- DAWを立ち上げてオーディオプラグインを動かしてみる
- VST3インストゥルメント
- MIDIトラックの演奏情報から音声を生成する
- VST3エフェクト
- ミキサーコンソール内の音声を加工する
DAWとオーディオプラグイン
- オーディオプラグインとは、DAW等の音楽制作ソフトウェアに音源やエフェ
クトを外部から追加できるモジュール形式のソフトウェア
- プラグイン開発用のSDKが提供されている形式については、DAWベン
ダー以外のサードパーティが開発・販売できる
DAW
Steinberg - Cubase
Apple - Logic Pro
Avid - Pro Tools
Presonus - Studio One
Audio Plugin
iZotope - Ozone
Xfer - Serum
ANTARES - Auto-Tune
Native Instruments - KONTAKT
オーディオプラグイン市場
- オーディオプラグイン単体で販売されているものもある
- オーディオプラグイン市場が形成されている
- 販売経路
- 楽器・音響機器メーカー直販
- 楽器・音響機器販売店
- ネット販売
- SONICWIRE
- KVR Audio
- Plugin Boutique
オーディオプラグインを用途別に分類
- エフェクト系
- 入力音声を加工して出力音声を生成する
- コンプレッサー
- リバーブ
- フィルター・EQ
- ビットクラッシャー
- ディザリング
オーディオプラグインを用途別に分類
- インストゥルメント系
- イベント入力に基づいて出力音声を生成する
- シンセサイザー
- サンプラー
- 入力するイベント情報はMIDIデータの場合もあれば、プラグイン形式
独自のデータ規格の場合もある
オーディオプラグインを用途別に分類
- アナライザー系
- 音声情報を視覚情報等に変換する(音声の加工はしない)
- スペクトラムアナライザ
- リサージュメーター
- レベルメーター
オーディオプラグインを用途別に分類
- MIDIエフェクト系
- 入力MIDIイベントを加工して出力MIDIイベントを作る
- アルペジエーター
- クオンタイザー
- コードジェネレーター
- 厳密には『MIDIプラグイン』と呼ぶ
- VST3やAU等のプラグイン形式で作ることができる
- 音声情報からMIDI情報を生成する、ということも可能
オーディオプラグインの仕組み
オーディオプラグインの仕組みを理解する 3ステップ
- プラグインシステムについて
- オーディオプラグイン形式について
- 一般的なオーディオプラグインの仕様について
STEP1.
プラグインシステムについて
プラグインシステムについて
- 音楽ソフトウェアに限らず、プラグインシステムとは、基本的なアプリケー
ション(ホストアプリケーション)に追加機能を提供するための拡張メカニズ
ムである
- プラグインシステムを有することで、元のアプリケーション自体に変更を加
えることなく、システム全体の機能を拡張したり新しい機能を追加したりす
ることができる
プラグインシステムについて
- 主な特徴と利点
- モジュール性: 機能を独立したモジュールとして分離できる
- 拡張性: ホストアプリケーションの機能を後から拡張できる
- カスタマイズ性: ユーザーが必要な機能を選んで使用できる
- 保守性: ホストアプリケーションとプラグインを別々に保守・更新でき
る
- サードパーティ開発: ホストアプリケーション開発者以外もプラグイン
として追加機能を開発・提供できる
STEP2.
オーディオプラグイン形式について
DAWとオーディオプラグイン形式
- オーディオプラグイン形式は複数存在する
- DAWによって読み込み可能なオーディオプラグイン形式は異なる
- DAWとプラグインとで形式を合わせる必要がある
VST3版Ozone 11
VST3 Host
AU Host
AAX Host
Cubase
Logic Pro
Pro Tools
AU版Ozone 11
AAX版Ozone 11
DAWとオーディオプラグイン形式
- 複数のオーディオプラグイン形式を読み込み可能なDAWもある
- Studio One: VST3, AU
- Live: VST3, AU
- Reaper: VST3, AU, LV2, CLAP, and more.
VST3版Ozone 11
VST3 Host
AU Host
Studio One
AU版Ozone 11
オーディオプラグイン形式の確認方法
- 製品の仕様・システム要件に記載
されていることがあります
- 事例:iZotope Ozone 11
Ozone 11 - iZotope Japan
オーディオプラグイン形式の確認方法
オーディオプラグイン形式の紹介 : VST
- VST = Virtual Studio Technology
- 開発元: Steinberg
- 特徴:
- クロスプラットフォーム
- Windows, macOS, Linux
- 最も広く使われている
- 主なバージョン:
- VST3(現役), VST2(サポート終了)
オーディオプラグイン形式の紹介 : AU
- AU = Audio Units
- 開発元: Apple
- 特徴:
- macOS/iOS専用, CoreAudioフレームワークの一部
- Logic Pro, GarageBandなどのAppleエコシステム
オーディオプラグイン形式の紹介 : AAX
- AAX = Avid Audio eXtension
- 開発元: Avid
- 特徴:
- Pro Toolsで使用するための専用形式
- プロフェッショナルなオーディオ制作環境を担保
- 開発・リリースの過程で複数段階の承認プロセスがある
- Avid製のハードウェアで動作する AAX DSP Plugin も存在する
オーディオプラグイン形式の紹介 : LV2
- LV2 = LADSPA Version 2
- LADSPA = Linux Audio Developers Simple Plugin API
- 特徴:
- オープンソース、主にLinuxで普及
- Linuxベースのオーディオ制作環境
- Linuxに限らず、他のOSでも開発と動作が可能
オーディオプラグイン形式の紹介 : CLAP
- CLAP = CLever Audio Plugin
- 開発元: Bitwigとu-he
- 特徴:
- オープンソース (MITライセンス)
- MIDI 2.0 をサポート
- クロスプラットフォーム設計
STEP3.
一般的な
オーディオプラグインの仕様について
オーディオプラグイン API
- API = Application Programming Interface
- プラグイン開発時・ホスト開発時にAPIをプログラムに統合する
- ホストとプラグインがこのAPI(抽象クラスやインターフェースを含む)を互
いに知っていることで、ホストとプラグイン間の通信が可能になる
VST3 Plugin
VST3 Host
Cubase
VST3 API
APIを統合する APIを統合する
API経由で通信する
DAWがプラグインをロードするまで(概要)
- 動的ライブラリをロードする(OS固有のAPI)
- 動的ライブラリからプラグイン情報を取得する(プラグインAPI)
- プラグイン情報からインスタンスを作成する(プラグインAPI)
- インスタンスを初期化する(プラグインAPI)
- オーディオバスの設定(Mono, Stereo, Surround, etc.)
- イベントバスの設定(ノートイベント等)
- 各種機能の有効化(ホストとの連携等)
- インスタンスをオーディオ処理パイプラインに配置する(DAW)
- インストゥルメントラック or エフェクトラック(ミキサーコンソール)
- 信号処理に関する設定(動作サンプルレートやバッファサイズの設定)
- オーディオ処理の有効化と開始
DAWがプラグインをロードするまで(概要)
- プラグインインターフェース
- プラグインホストとプラグインとの間の「契約」を定義する
- プラグインローダー、プラグインスキャナー
- プラグインを検出し、読み込み、初期化する
- プラグインマネージャー
- ロードされたプラグインのライフサイクルを管理する
- プラグインホスト
- アプリケーションからプラグインAPIを呼ぶためのコンポーネント
インターフェース : プラグインファクトリー
- プラグインファクトリークラス・関数
- プラグインのインスタンス生成を管理・仲介するクラスまたは関数
- VST3: Steinberg::IPluginFactory
- AU: AudioComponentFactoryFunction
- ファクトリークラス・関数の設計を採用する理由:
- プラグインをロードする際の統一されたエントリーポイント
- 複数のインスタンスを独立して管理する
- 同じプラグインを複数トラックで使用するケースに対応する
インターフェース : オーディオレンダリング
- オーディオレンダリング
- プラグインに波形データを編集・生成を依頼して書き込んでもらう処理
- 引数に渡すもの
- オーディオバッファ(書き込み可能なメモリ領域)
- イベントデータ
- DAWの情報(再生位置、テンポ情報、他)
- プラグインAPIの関数
- VST3: ProcessAudio
- AU: Render
インターフェース : オーディオレンダリング
- リアルタイム・レンダリングを基本動作とする
- プラグインが編集できるオーディオデータは「ホストがプラグイン
APIを通じて逐次的
に提供したもの」に限られる
- 1度のレンダリング時にプラグインが編集できるオーディオ区間は短い
- 例: サンプルレート48kHz, バッファサイズ512samples = 約10.67msec
DAW AudioPlugin
インターフェース : オーディオレンダリング
- リアルタイム・レンダリングを前提とした信号処理の設計事項
- コンプレッサーやディレイ等、数ミリ~数秒の音声データに基づいて音声加工の挙
動を決定するエフェクトにおいては、以前のオーディオレンダリング処理内容を記憶
する仕組みをプラグインに実装をする必要がある
- 対義語: オフライン・レンダリング
- コンピューターが時間をかけてオーディオ信号を処理する手法
- 音声データを一度にまとめて(大きなバッファサイズで)処理できる
- DAWには、プラグインのリアルタイムレンダリング処理を流用してオフライン処理を
実行することができるものもある
インターフェース : プラグインパラメータ
- プラグインパラメータ
- 信号処理の挙動を制御するための数値データ
- Gain, Attack, Decay, Sustain, Release, Delay Time, etc…
- DAWのオートメーションから制御可能
インターフェース : 状態変数( State)
- 状態変数(State)のGet操作とSet操作
- プラグインのインスタンス毎に持つ状態変数(パラメータを含む)
- 信号処理のパラメータはプラグイン自身が保有する
- パラメータの値はDAWのプロジェクトに保存して永続化する
- DAWがプロジェクトを保存する時
- 各プラグインから状態変数を取得してプロジェクトに保存する
- DAWがプロジェクトを読み込む時
- プロジェクトから各プラグインの状態変数を適用する
デザインパターン : プロセッサとエディタの分離
- プロセッサとエディタの分離
- 多くのプラグイン形式で採用される設計パターン
- 信号処理部分(プロセッサ)とUI部分(エディタ)を分離する
- 信号処理はコンピュータ向け、UIはユーザー向けと考えてよい
Processor Editor
DAW
音声信号処理を実行 GUI描画を実行
ポインタ変数が異なる
󰳕
🖥
デザインパターン : プロセッサとエディタの分離
- 分離設計を採用する理由
- DAWがプラグインをヘッドレス(UI無し)で実行可能にする
- 信号処理とUIのスレッドを分離してリアルタイム動作を確保
- 処理部分とUI部分の独立した開発が可能
Processor Editor
DAW
オーディオスレッド
音声信号処理、音声再生
UIスレッド
マウス入力処理、GUI描画
ポインタ変数が異なる
󰳕
🖥
デザインパターン : プロセッサとエディタの分離
- 分離設計を前提としたデータフロー(プラグイン形式で異なる)
- プロセッサの状態変化はリスナーパターンでエディタへ通知
- 例えば、パラメータに変更が生じた場合、オーディオスレッド上でGUIの描画更新
は行わず、エディタからパラメータの値を監視するようにする
Processor Editor
DAW
󰳕
🖥 異なるスレッド間の通信
オーディオスレッド
音声信号処理、音声再生
UIスレッド
マウス入力処理、GUI描画
デザインパターン : プロセッサとエディタの分離
- 分離設計を前提としたライフサイクル
- プラグインをロードする操作をした直後
- 最初にプロセッサのインスタンスが作られる
Plugin Host
DAW Processor
デザインパターン : プロセッサとエディタの分離
- 分離設計を前提としたライフサイクル
- 以下の操作をすると、エディタのインスタンスが作られる
- ユーザーがエディタ表示操作をする
- DAWがエディタ表示をトリガーする
Plugin Host
DAW Processor
Editor
デザインパターン : プロセッサとエディタの分離
- 分離設計を前提としたライフサイクル
- 以下の操作をすると、エディタのインスタンスが破棄される
- ユーザーがエディタのウインドウを閉じる
- DAWがエディタのウインドウを閉じる
Plugin Host
DAW Processor
Editor
デザインパターン : プロセッサとエディタの分離
- 分離設計を前提としたライフサイクル
- 以下の操作をすると、プロセッサのインスタンスが破棄される
- ユーザーがプラグインをラックから削除する
- DAWのプロジェクトを閉じる
- DAWプログラム本体を終了する
Plugin Host
DAW Processor
デザインパターン : プロセッサとエディタの分離
- 分離設計を前提として避けるべき設計
- プロセッサからエディタのポインタ変数にアクセスするケース
- エディタが破棄された後にエディタのポインタ変数を触ろうとするとプ
ラグインがクラッシュする
- 動的ライブラリの仕組み上、DAWを巻き込んでクラッシュする
Plugin Host
DAW Processor
Editor
オーディオプラグインの作り方
オーディオプラグインの作り方を理解する 3ステップ
- オーディオプラグインSDKについて
- C++オーディオプラグイン開発フレームワークについて
- C/C++以外でオーディオプラグインを作る方法の紹介
STEP1.
オーディオプラグイン SDKについて
※実演あり
オーディオプラグイン SDK
- プラグインインターフェースはSDKで提供される
- ホストとプラグインが互いに共通の抽象クラスやインターフェースを知って
いることで、ホストとプラグイン間の通信が可能になる
- SDK無しでインターフェース情報からフルスクラッチで作る人も稀に居る
VST3 Plugin
VST3 Host
Cubase
VST3 SDK
VST3 API
オーディオプラグイン SDK一覧
プラグイン形式 SDKの名称 プログラミング言語 SDKの入手方法
VST3 VST3 SDK C++ Steinberg公式サイト
GitHub
AU AudioUnit SDK C++ Xcodeに同梱
GitHub
AAX AAX SDK C++ Avid開発者ポータル
LV2 LV2 C/C++ LV2公式サイト
GitHub, GitLab
CLAP clap, clap-helpers C/C++ GitHub
実演: VST3 SDKでVST3プラグインを作る
- VST3 SDKをSteinberg公式サイトからダウンロードする
- https://www.steinberg.net/ja/developers/
- SDKに同梱された VST3 Project Generator を使用してCMakeプロジェクトを作
成する
- IDE(Visual Studio, Xcode, CLion等)またはコマンドラインツール(cmake,
make, ninja等)でビルドする
- 出力されたVST3プラグイン(.vst3拡張子)をVST3用のディレクトリにインストール
する
- Windows: C:Program FilesCommon FilesVST3
- macOS: /Library/Audio/Plug-ins/VST3
SDKとライセンス
- 注意:ライセンスに関する最終的な判断は、法務担当者または知的財産権の
専門家にご相談ください
- 自作のオーディオプラグインを配布する際は、ライセンスが重要な考慮事項と
なります
- VST3, AAXなど一部のプラグイン形式では、別途ライセンス契約が必要
- 無料配布であってもライセンス条件は適用される
- 社内での利用に留まる場合はライセンスの制約が緩和されるが、「どこまでが
社内利用と言えるか?」は個々のケースを確認する
SDKとライセンス
- VST3 SDK: Proprietary Steinberg VST3 License or GPL v3
- Proprietary を選択する場合は、Agreement 文書に署名をして
Steinberg社に送付して申請する
- AudioUnit SDK: Apache-2.0
- ビルド時にCoreAudioフレームワークに依存する
- AAX SDK: 開発者登録をして入手したSDKにて確認してください
- LV2: ISC
- CLAP: MIT
STEP2.
C++オーディオプラグイン開発
フレームワークについて
※実演あり
- DAWがサポートするプラグイン形式を作成する必要がある
- 信号処理(数学的処理)のソースコードが同一であっても、SDKが異なる
ことに起因してプロジェクトや開発者が複数に分離することがある
VST3 SDK
オーディオプラグイン開発の課題
VST3 Plugin
VST3 Host
AU Host
AAX Host
Cubase
Logic Pro
Pro Tools
AU Plugin
AAX Plugin
AU SDK
AAX SDK
󰳕
󰳕
󰳕
フレームワークでプラグイン形式を抽象化する
- インターフェースを抽象化する階層(ラッパー)を提供
- プラグインの内部処理のソースコードを1つ実装するだけで、複数のプラグ
イン形式をビルドすることができる
VST3 Plugin
VST3 Host
AU Host
AAX Host
Cubase
Logic Pro
Pro Tools
AU Plugin
AAX Plugin
JUCE
iPlug2
DPF
etc…
󰳕
プラグインフレームワーク : JUCE
- JUCE
- オーディオアプリケーションとプラグイン開発に広く使われているC++フレーム
ワーク
- https://juce.com/
- クロスプラットフォーム:Windows, macOS, Linux, iOS, Android
- 対応プラグイン形式:VST3, AU, AAX, LV2, (CLAPは3rd partyによる)
- CMake, Projucerによるプロジェクト管理とIDE統合
- 独自のGUIシステムによるクロスプラットフォーム対応
- 有償ライセンスと無償ライセンスから選択可能
プラグインフレームワーク : iPlug2
- iPlug2
- C++オーディオプラグイン開発フレームワーク
- https://iplug2.github.io/
- クロスプラットフォーム:Windows, macOS, Linux, iOS, Web
- 対応プラグイン形式:VST2, VST3, AU, AAX, CLAP, WebAudio Module
(WAM)=WebAssembly
- 独自のGUIツールキットを提供(IGraphics)
- HTML/CSS、SwiftUIとの統合例を提供
- zlib風の自由度の高いライセンス
プラグインフレームワーク : DPF
- DPF = DISTRHO Plugin Framework
- C++ APIでカスタムUIを持つプラグイン開発を実現するフレームワーク
- https://github.com/DISTRHO/DPF
- オープンソースプラグイン形式に特化
- 対応プラグイン形式:LADSPA, DSSI, LV2, VST2, VST3, CLAP
- VST3対応は独自の互換インターフェースによるもの
- OpenGLベースのカスタムUI作成機能
- CMakeによるプロジェクト管理とIDE統合
- ISCライセンス
プラグインフレームワークを使う際の注意点
- 特定のプラグインSDK固有の機能が使えない場合がある
- 複数のプラグイン形式で共通する仕様を抽象化するもの
- 実現する機能が複数プラグイン形式の最大公約数となる
- ライセンスへの対応が複雑になる
- フレームワークにもライセンスが設定されている
- フレームワークには複数のライブラリが含まれるものがある
- フレームワーク本体のライセンス
- プラグインSDKのライセンス
- フレームワークに含まれるライブラリのライセンス
実演: JUCEでオーディオプラグインを作る
- JUCEパッケージをJUCE公式サイトからダウンロードする
- https://juce.com/get-juce/
- 開発環境毎のパッケージが用意されているため、DL時に注意する
- パッケージに同梱されたProjucerでIDE向けプロジェクトを作成する
- 初回起動時はJUCEライブラリのパスを設定する
- [Plug-In] > [Basic] テンプレートからプロジェクトを作成して保存する
- IDE(Visual Studio、Xcode、CLion等)でビルドする
- 出力されたVST3プラグイン(.vst3拡張子)をVST3用のディレクトリにインストール
する
実演: JUCEでオーディオプラグインを作る2
- 20行程度の追加実装で動くIIRフィルターのエフェクトプラグインを作る
- Projucerでプロジェクトを作成する
- PluginProcessorにIIRのDSPを2チャンネル設置する
- PluginProcessorにプラグインパラメータを2つ設置する
- GUIはJUCEが提供する汎用GUIで済ませる
- PluginProcessor クラスの実装コード
- constructor: 各クラスのインスタンスを作成
- prepareToPlay: 音声信号処理の準備処理
- processBlock: 定期的に呼ばれるオーディオコールバック
STEP3.
C/C++以外で
オーディオプラグインを作る方法
お気づきだろうか?
ここまで紹介した開発手法はC/C++言語でプログラミングするのが前提
C/C++言語は難しいという評判がある?(要出典)
※発表者はC++で生活している身であるが、気持ちは分かる
フーリエ変換、畳み込み、行列計算などの数値計算処理はプログラミング言語
に関わらず実装することが可能
ここからは、「C/C++言語じゃなかったら作れるのに…」という思いに応える開
発手法を紹介します
C/C++以外でオーディオプラグインを作る方法
- MATLAB
- 数値計算に特化した統合開発環境
- 企業の研究開発部門、大学の研究室や研究機関で使われている
- https://jp.mathworks.com/products/matlab.html
- Audio Toolbox で『VST プラグイン、AU プラグイン、スタンドアロン
の実行可能プラグインを MATLAB コードから直接生成できます。』
- https://jp.mathworks.com/products/audio.html
C/C++以外でオーディオプラグインを作る方法
- SynthEdit
- https://www.synthedit.com/
- ノーコード・ローコードでオーディオプラグイン開発ができる
- GUI上でノードを繋げてシンセサイザーを組む開発手法
- GUI開発もサポートする
- 2005年の初回リリースから20年の歴史がある老舗のツール
- VST黎明期の無料プラグインの多くがSynthEditで作られた
C/C++以外でオーディオプラグインを作る方法
- Native Instruments - Kontakt
- Kontaktライブラリを自作することができる
- 簡単で楽しい!KONTAKTライブラリを自作しよう!
- スクリプト言語:KSP
- NI KONTAKT KSP - DTMプログラミング言語探訪
- 自作ライブラリ専用のGUIを実装することも可能
- 独自ライブラリのサンプラーを作る用途ならこれで十分
- Kontaktプラットフォーム呼べる規模のマーケットがある
C/C++以外でオーディオプラグインを作る方法
- FAUST
- プログラミング言語Faust
- Faust Programming Language
- FaustコードからC++コードを出力できる
- JUCEエクスポートを経由してプラグインを作ることもできる
- Unity Native Audio Pluginエクスポートもある
- Webブラウザで動くIDEで体験できる
- Faust IDE
C/C++以外でオーディオプラグインを作る方法
- Max/RNBO
- Cycling ’74 Max
- 音楽・映像向けのグラフィカルな統合開発環境
- ノードベースのオーディオプログラミング
- https://cycling74.com/ja/products/max
- RNBOアドオンを追加すると、RNBOパッチからVST3, AUプラグイン
をエクスポートできる
- https://cycling74.com/ja/products/rnbo
C/C++以外でオーディオプラグインを作る方法
- Rust言語 + nih-plug
- nih-plug: オーディオプラグイン開発フレームワーク
- https://github.com/robbert-vdh/nih-plug
- Rustで書いたDSPコードをVST3, CLAPプラグインとして出力
- オーディオプラグインAPI(C++)をRust言語にバインディング
- Rust言語のFFI(Foreign Function Interface)機能を使用してC言
語から呼び出し可能な動的ライブラリを作成
C/C++以外でオーディオプラグインを作る方法
- JavaScript言語 + Elementary Audio
- Elementary Audio: DSP開発用JavaScriptライブラリ+実行環境
- https://www.elementary.audio/
- JavaScriptで音声信号処理(DSP)を記述できる
- 実行環境(Runtime)はC++で書かれており複数環境で動作する
- WebAudio
- OS Native: Windows, macOS, Linux
- 実行環境をJUCEに組み込んでプラグインを作るサンプルがある
- https://github.com/elemaudio/srvb
オーディオプラグイン FAQ
Q: 倍精度処理対応って何ですか?
A: 信号処理を倍精度浮動小数点数(64bit)で実行できるプラグインです
struct AudioBusBuffers
{
AudioBusBuffers () : numChannels (0), silenceFlags (0), channelBuffers64 (nullptr) {}
//------------------------------------------------------------------------
int32 numChannels; ///< number of audio channels in bus
uint64 silenceFlags; ///< Bitset of silence state per channel
union
{
Sample32** channelBuffers32; ///< sample buffers to process with 32-bit precision
Sample64** channelBuffers64; ///< sample buffers to process with 64-bit precision
};
//------------------------------------------------------------------------
};
Q: 倍精度処理対応って何ですか?
A: 信号処理を倍精度浮動小数点数(64bit)で実行できるプラグインです
class JUCE_API AudioProcessor : private AAXClientExtensions
{
// この関数の返り値がtrue の場合、このプラグインが倍精度処理に対応していることをホストに示す
// 対応している=APIが呼び出し可能であることを示すものであり、倍精度処理を有効にするかは
DAWの実装に依存する
virtual bool supportsDoublePrecisionProcessing() const;
// 単精度処理動作か倍精度処理動作かを確認する関数
ProcessingPrecision getProcessingPrecision() const noexcept { return processingPrecision; }
// 単精度処理動作か倍精度処理動作かを設定する関数
void setProcessingPrecision (ProcessingPrecision newPrecision) noexcept;
// 単精度(32bit)処理モードではこの関数が呼ばれる
virtual void processBlock (AudioBuffer<float>& buffer, MidiBuffer& midiMessages) = 0;
// 倍精度(64bit)処理モードではこの関数が呼ばれる
virtual void processBlock (AudioBuffer<double>& buffer, MidiBuffer& midiMessages);
}
Q: GUI無しのプラグインはどうやって操作する?
A: DAWが提供するGUIからプラグインパラメータを操作します
画像は左から Cubase, Studio One, Ableton Live
Q: サイドチェイン付きのプラグインを作りたい
A: 『オーディオバス』の仕組みを利用することで作ることができます
画像は、2つのバスを持つプラグインのルーティングの事例です
Audio Plugin
Input Bus A Input Bus B
Output Bus A
Mixer - Track X Mixer - Track Y
Mixer - Track X
Q: 入出力で複数のバスを持つプラグインを作りたい
A: 『オーディオバス』の仕組みを利用することで作ることができます
画像は、入力と出力に4つのバスを持つプラグインの事例です
例えば、プラグイン内ミキサーを実装することでパッチベイを作れます
Audio Plugin
Input Bus A Input Bus B
Output Bus A
Input Bus A Input Bus B
Output Bus C
Output Bus B Output Bus D
Q: 入出力で複数のバスを持つプラグインを作りたい
事例: plugdata VST3 は入力と出力それぞれ16個のバスを構成できる
Q: プロセス分離方式とは何ですか?
A. DAW本体のプロセスとプラグインのプロセスを分離した形式のプラグイン駆動
方式
プラグインがクラッシュしてもDAWは動作を続けることができる(サンドボック
スと呼ぶこともある)
- プロセス分離方式を採用しているDAW
- Logic Pro ARM64版
- AUHostingService = AUプラグインホストの実体
- Logic Pro と AUHostingService はプロセス間通信を行う
- Bitwig Studio
Q: オーディオプラグインの最近のトピック
- 信号処理に機械学習モデルを組み込む
- Neural Amp Modeler
- Neutone Morpho
- GUIをWeb技術スタックで実装する
- Output Arcade
- JUCE 8 Feature Overview: WebView UIs
- GPUを活用した音声信号処理の並列化
- GPU Audio SDK
ここまで、 DAW向けの話が中心
休憩
ここから、ゲーム制作向けの話も
ゲームエンジン向けの
オーディオプラグインを作るには
※実演あり
実演: Godot Engine用のプラグインを作った
- 既に作ったものを披露します
- Stereo Amplify
- LRチャンネル個別にゲインを調整する
- JUCE Reverb
- JUCEライブラリとリンクしてDSPライブラリを組み込んだ
- JUCE Instrument
- JUCEライブラリのMIDI音源ロジックを組み込んだサンプラー
実演のソースコード
- COx2/gdextension-audio-effect
- https://github.com/COx2/gdextension-audio-effect
Godot Engine用のプラグインの作り方
- godot-cpp
- https://github.com/godotengine/godot-cpp
- C++言語でGDExtensionを作成するためのライブラリ
- GDExtension
- Godot Engineで事前に定義されているインターフェースを継承して、新
規に拡張インターフェースを作成する
- Godot Engineに拡張インターフェースを登録して使用する