
マイケル
みなさんこんにちは!
マイケルです!

エレキベア
こんにちクマ~~

マイケル
突然ですが今日は何と、DTMプラグインの開発に挑戦してみました!
その名も・・・


マイケル
渡邉ディストーション
です!!

エレキベア
ええぇ・・・

マイケル
これはJUCEというフレームワークを使用して開発したもので、
2種類の歪みを搭載したシンプルなディストーションです!
下記のGitHubリポジトリにコードを格納していますので、よければこちらもご参照ください!
GitHub - juce-plugin-distortion

エレキベア
JUCE・・・聞いたことがある気がするクマ
C++で書けるのクマね

マイケル
今回初めて触ってみたけど、プラグイン開発に必要な機能があらかじめ揃ってたので
一度使い方を覚えたら低コストで作成できて便利だなと思いました!
早速みていきましょう!
JUCEフレームワークとは

マイケル
JUCEはオーディオアプリやプラグインを開発するためのフレームワークで、C++で記述することができます。
オーディオ機能やUIコンポーネントが充実していたり、VST3やAU形式などマルチプラットフォームで出力できる点が魅力です!


エレキベア
オーディオ開発版Unityみたいな感じクマね

マイケル
実装するにあたり、下記の公式チュートリアルと
JUCEJAPANシリーズの書籍を参考にさせていただきました!
こちらはKindleUnlimitdで読めるのでおすすめです!

JUCE JAPAN vol.1: JUCEではじめるVST/AUプラグイン制作...

エレキベア
日本語の情報が少ないクマから解説本があるのはありがたいクマね
ディストーションプラグインの開発

マイケル
それでは今回行った実装の内容について紹介します!
パラメータの実装

マイケル
まずはプラグイン内で使用するパラメータと関連する関数について定義します。
今回用意が必要なのは
・InputVolume:入力ボリューム値
・Gain:歪み量
・OutputVolume:出力ボリューム値
・Special:歪み切り替えフラグ
のパラメータになります。
▲パラメータと関数の定義

マイケル
実際のパラメータの値や表示名といった情報は
・getParameter
・getParameterName
といった関数をoverrideすることで定義します。
パラメータの初期化と各関数の実装は下記のようになりました。
▲パラメータ関連の処理

エレキベア
各パラメータに関する情報を設定するのクマね
UIの実装

マイケル
次に下記のようなUIを実装してみます。

▲今回作成するプラグインの見た目

マイケル
スライダー等の基本的なUIコンポーネントは用意されていますが、
背景画像は自分で用意しなければなりません。
今回は「渡邉」感を押し出した画像を用意しました!

▲渡邉感を押し出した画像

▲画像はProducer上で登録することで使用できるようになる

エレキベア
(これは渡邉感なのか・・・?)

マイケル
そして実際のUI実装は下記のようになりました。
似たようなコンポーネントは関数化しておくとコードがスッキリします。
▲UIコンポーネントの定義
▲UIの配置

エレキベア
コードベースでUIを構築できるのクマね
パラメータとUIの紐付け

マイケル
そして次は用意したパラメータとUIを紐付けます。
Editor -> Processor への値受け渡しは各Attachment変数とIDを紐づけるだけでよいのですが、Processor -> Editor への反映はタイマーにて監視する必要があります。
こちらの実装は下記のようになります。
▲Processorの実態をEditorに渡す
▲Processorの実態受け取りとAttachment変数の定義
UIとパラメータの紐付け

エレキベア
Editor側からProcessor側に依存する構成クマね
歪みの実装

マイケル
そしてメインとなる歪みの実装をしてみます。
波形に対する処理はProcessor側のprocessBlock関数に記述します。
通常の歪みはシンプルに波形をしきい値でクリッピングするという方法で実装してみました。

▲しきい値によるクリッピング
▲しきい値によるクリッピング(実装)

エレキベア
歪みは波形をクリッピングすることで歪ませることが出来るのクマね
短形波に近づけるようなイメージクマか・・・

マイケル
そしてSpecialフラグON時の歪みは下記のような独自の関数を用いてクリッピングしてみました。
-1~1の間を見ると緩やかに変化していることが分かります。
このように独自の関数を用いて歪ませる、といった処理もよく見られるようです。

▲独自関数によるクリッピング
▲独自関数によるクリッピング(実装)

エレキベア
音に正解がないのがまた難しいところクマね・・・

マイケル
なお、関数の確認には下記のようなサイトが役に立ちます!
可視化できるので、いろいろな式を確認するだけでも面白いですね!
パラメータ値の保存

マイケル
最後に、パラメータ値の保存/読込を行うには、getStateInformation関数に処理を記述します。
XML形式で保存しているようですが、この辺りは定型文として書いておけばいいかなと思います!
▲パラメータ値の保存

エレキベア
これでプラグイン作成の完了クマ〜〜〜
動作確認

マイケル
では改めて作ったプラグインをDAWソフト上で読み込んで確認してみましょう!

マイケル
しきい値でクリッピングしたのに加えて、独自関数でクリッピングした歪みはより強くハイゲイン風のサウンドになっていますね!
いい音とまではいかないですが、調整することでより自分の好みの音に近づけていけそうです!

エレキベア
うへ〜〜〜中々面白いクマね
おわりに

マイケル
というわけで今回はディストーションプラグインの開発に挑戦してみました!
どうだったかな??

エレキベア
プラグインの内部で行っている処理がイメージできて面白かったクマ〜〜〜

マイケル
今回の記事でサウンドプラグラミングに興味を持った方は、下記のような書籍もおすすめです!
自分もまだ読んでいる途中ですが、より詳しく音作りのプログラミングについて言及されています!

Pythonではじめる 音のプログラミング: コンピュータミュージックの信号処理

エレキベア
音の世界も奥が深いクマ・・・

マイケル
しかし改めて既存のプラグインを聞いてみると、その完成度に驚きますね・・・
だけど自作プラグインだと波形レベルで自分好みにいじれるし、何よりオリジナルだとかなり愛着が湧きました。

マイケル
その内、シンセサイザあたりにも挑戦してみたいなと思っています!
それでは今日はこの辺で!!
アデューー!!

エレキベア
クマ〜〜〜〜〜
【JUCE】DTMプラグインを作ってみる 〜ディストーション編〜【VST/AU】〜完〜